Browse Source

Add project Status ref object and GlobalViewVariables middleware

pull/1/head
Nafies Luthfi 8 years ago
parent
commit
120b249e11
  1. 37
      app/Entities/Projects/Status.php
  2. 62
      app/Entities/ReferenceAbstract.php
  3. 11
      app/Http/Kernel.php
  4. 29
      app/Http/Middleware/GlobalViewVariables.php
  5. 82
      resources/lang/id/project.php
  6. 49
      resources/views/layouts/partials/sidebar.blade.php
  7. 28
      resources/views/pages/home.blade.php
  8. 14
      resources/views/view-components/sidebar-project-list-links.blade.php
  9. 37
      tests/Unit/References/ProjectStatusTest.php

37
app/Entities/Projects/Status.php

@ -0,0 +1,37 @@
<?php
namespace App\Entities\Projects;
use App\Entities\ReferenceAbstract;
class Status extends ReferenceAbstract
{
protected static $lists = [
1 => 'planned',
2 => 'progress',
3 => 'done',
4 => 'closed',
5 => 'canceled',
6 => 'on_hold',
];
public static function getNameById($singleId)
{
return trans('project.'.static::$lists[$singleId]);
}
public static function toArray()
{
$lists = [];
foreach (static::$lists as $key => $value) {
$lists[$key] = trans('project.'.$value);
}
return $lists;
}
public static function all()
{
return collect($this->toArray());
}
}

62
app/Entities/ReferenceAbstract.php

@ -0,0 +1,62 @@
<?php
namespace App\Entities;
use Illuminate\Support\Arr;
abstract class ReferenceAbstract
{
protected static $lists = [];
protected static $colors = [];
public static function get()
{
return collect(static::$lists);
}
public static function toArray()
{
return static::$lists;
}
public static function all()
{
return static::toArray();
}
public static function getById($singleId)
{
return static::$lists[$singleId];
}
public static function only(array $singleIds)
{
return Arr::only(static::$lists, $singleIds);
}
public static function except(array $singleIds)
{
return Arr::except(static::$lists, $singleIds);
}
public static function colors()
{
return static::$colors;
}
public static function getColorById($colorId)
{
return isset(static::$lists[$colorId]) ? static::$colors[$colorId] : null;
}
public static function colorsExcept(array $colorIds)
{
return Arr::except(static::$colors, $colorIds);
}
public static function colorsOnly(array $colorIds)
{
return Arr::only(static::$colors, $colorIds);
}
}

11
app/Http/Kernel.php

@ -17,6 +17,7 @@ class Kernel extends HttpKernel
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\App\Http\Middleware\GlobalViewVariables::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
@ -49,11 +50,11 @@ class Kernel extends HttpKernel
* @var array
*/
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
}

29
app/Http/Middleware/GlobalViewVariables.php

@ -0,0 +1,29 @@
<?php
namespace App\Http\Middleware;
use App\Entities\Projects\Project;
use Closure;
use DB;
class GlobalViewVariables
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$projectsCount = Project::select(DB::raw('status_id, count(id) as count'))
->groupBy('status_id')
->pluck('count', 'status_id')
->all();
view()->share('sidebarProjectStats', $projectsCount);
return $next($request);
}
}

82
resources/lang/id/project.php

@ -2,50 +2,58 @@
return [
// Labels
'project' => 'Project',
'projects' => 'Daftar Project',
'work_duration' => 'Durasi',
'cash_in_total' => 'Total Pemasukan',
'cash_out_total' => 'Total Pengeluaran',
'search' => 'Cari Project',
'found' => 'Project ditemukan',
'not_found' => 'Project tidak ditemukan',
'empty' => 'Belum ada Project',
'back_to_index' => 'Kembali ke daftar Project',
'project' => 'Project',
'projects' => 'Daftar Project',
'work_duration' => 'Durasi',
'cash_in_total' => 'Total Pemasukan',
'cash_out_total' => 'Total Pengeluaran',
'search' => 'Cari Project',
'found' => 'Project ditemukan',
'not_found' => 'Project tidak ditemukan',
'empty' => 'Belum ada Project',
'back_to_index' => 'Kembali ke daftar Project',
// Actions
'create' => 'Input Project Baru',
'created' => 'Input Project baru telah berhasil.',
'show' => 'Detail Project',
'edit' => 'Edit Project',
'update' => 'Update Project',
'updated' => 'Update data Project telah berhasil.',
'delete' => 'Hapus Project',
'deleted' => 'Hapus data Project telah berhasil.',
'undeleted' => 'Data Project gagal dihapus.',
'show_features' => 'Lihat Fitur',
'create' => 'Input Project Baru',
'created' => 'Input Project baru telah berhasil.',
'show' => 'Detail Project',
'edit' => 'Edit Project',
'update' => 'Update Project',
'updated' => 'Update data Project telah berhasil.',
'delete' => 'Hapus Project',
'deleted' => 'Hapus data Project telah berhasil.',
'undeleted' => 'Data Project gagal dihapus.',
'show_features' => 'Lihat Fitur',
'features_export_html' => 'Export HTML',
'features_export_excel' => 'Export Excel',
'features_export_progress_excel' => 'Export Progress',
// Attributes
'name' => 'Nama Project',
'description' => 'Deskripsi Project',
'start_date' => 'Tanggal Mulai',
'end_date' => 'Tanggal Selesai',
'proposal_date' => 'Tanggal Proposal',
'project_value' => 'Nilai Project',
'proposal_value' => 'Nilai Proposal',
'name' => 'Nama Project',
'description' => 'Deskripsi Project',
'start_date' => 'Tanggal Mulai',
'end_date' => 'Tanggal Selesai',
'proposal_date' => 'Tanggal Proposal',
'project_value' => 'Nilai Project',
'proposal_value' => 'Nilai Proposal',
// Relations
'files' => 'List Dokumen',
'features' => 'Daftar Item Pekerjaan',
'cost_proposal' => 'Pengajuan Biaya',
'invoices' => 'List Invoice',
'customer' => 'Customer',
'worker' => 'Pekerja',
'subscriptions' => 'Langganan',
'status' => 'Status Project',
'payments' => 'Pembayaran',
];
'files' => 'List Dokumen',
'features' => 'Daftar Item Pekerjaan',
'cost_proposal' => 'Pengajuan Biaya',
'invoices' => 'List Invoice',
'customer' => 'Customer',
'worker' => 'Pekerja',
'subscriptions' => 'Langganan',
'status' => 'Status Project',
'payments' => 'Pembayaran',
// Statuses
'planned' => 'Planned',
'progress' => 'Progress',
'done' => 'Done',
'closed' => 'Closed',
'canceled' => 'Canceled',
'on_hold' => 'On Hold',
];

49
resources/views/layouts/partials/sidebar.blade.php

@ -6,6 +6,7 @@
</button>
</div>
</nav>
<div class="navbar-default sidebar hidden-print" role="navigation">
<div class="sidebar-nav navbar-collapse">
<a class="navbar-brand text-center" title="Home | {{ Option::get('app_tagline', 'Laravel app description') }}" href="{{ route('home') }}">
@ -18,57 +19,16 @@
<li>{!! html_link_to_route('users.agency.show', trans('nav_menu.agency'), [], ['icon' => 'user']) !!}</li>
<li>{!! html_link_to_route('features.index', trans('feature.on_progress'), [], ['icon' => 'tasks']) !!}</li>
<li>
<?php $projectsCount = App\Entities\Projects\Project::select(DB::raw('status_id, count(id) as count'))
->groupBy('status_id')
->pluck('count', 'status_id')
->all();?>
{!! html_link_to_route('projects.index', trans('project.projects') . ' <span class="fa arrow"></span>', [], ['icon' => 'table']) !!}
<ul class="nav nav-second-level">
@foreach(getProjectStatusesList() as $key => $status)
<li>
<a href="{{ route('projects.index', ['status' => $key]) }}">
{{ $status }}
<span class="badge pull-right">{{ array_key_exists($key, $projectsCount) ? $projectsCount[$key] : 0 }}</span>
</a>
</li>
@endforeach
</ul>
@include('view-components.sidebar-project-list-links')
</li>
@endcan
@can('see_reports')
<li>{!! html_link_to_route('reports.payments.yearly', 'Penghasilan', [], ['icon' => 'line-chart']) !!}</li>
<li>{!! html_link_to_route('reports.current-credits', 'Piutang', [], ['icon' => 'money']) !!}</li>
<li>{!! html_link_to_route('users.calendar', 'Calendar', [], ['icon' => 'calendar']) !!}</li>
{{--
<li>
{!! html_link_to_route('reports.payments.index', 'Laporan <span class="fa arrow"></span>', [], ['icon' => 'line-chart']) !!}
<ul class="nav nav-second-level">
<li>
{!! html_link_to_route('reports.payments.index', 'Pembayaran <span class="fa arrow"></span>') !!}
<ul class="nav nav-third-level">
<li>{!! link_to_route('reports.payments.yearly', 'Tahunan') !!}</li>
<li>{!! link_to_route('reports.payments.monthly', 'Bulanan') !!}</li>
<li>{!! link_to_route('reports.payments.daily', 'Harian') !!}</li>
</ul>
</li>
<li>{!! html_link_to_route('reports.current-credits', 'Piutang') !!}</li>
</ul>
</li>
--}}
@endcan
@can('manage_subscriptions')
<li>{!! html_link_to_route('subscriptions.index', trans('subscription.subscription'), [], ['icon' => 'retweet']) !!}</li>
@endcan
@can('manage_payments')
<li>{!! html_link_to_route('payments.index', trans('payment.payments'), [], ['icon' => 'money']) !!}</li>
@endcan
@can('manage', auth()->user()->agency)
<li>{!! html_link_to_route('customers.index', trans('customer.list'), [], ['icon' => 'users']) !!}</li>
@endcan
@can('manage_users')
<li>{!! html_link_to_route('users.index', trans('user.users'), [], ['icon' => 'users']) !!}</li>
@endcan
@can('manage_options')
<li>
<a href="{{ route('options.index') }}"><i class="fa fa-gears fa-fw"></i> Options <span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
@ -81,11 +41,10 @@
</ul>
</li>
@endcan
<li><a href="{{ route('auth.change-password') }}"><i class="fa fa-lock fa-fw"></i> {{ trans('auth.change_password') }}</a></li>
<li><a href="{{ route('auth.logout') }}"><i class="fa fa-sign-out fa-fw"></i> {{ trans('auth.logout') }}</a></li>
<li>{!! html_link_to_route('auth.change-password', trans('auth.change_password'), [], ['icon' => 'lock']) !!}</li>
<li>{!! html_link_to_route('auth.logout', trans('auth.logout'), [], ['icon' => 'sign-out']) !!}</li>
</ul>
</div>
<!-- /.sidebar-collapse -->
</div>
<!-- /.navbar-static-side -->

28
resources/views/pages/home.blade.php

@ -1,3 +1,5 @@
@inject('projectStatuses', 'App\Entities\Projects\Status')
@extends('layouts.dashboard')
@section('title', trans('nav_menu.dashboard'))
@ -10,8 +12,8 @@
'class' => 'default',
'icon' => 'paperclip',
'number' => array_key_exists(1, $projectsCount) ? $projectsCount[1] : 0,
'text' => getProjectStatusesList(1),
'linkRoute' => route('projects.index',['status' => 1]),
'text' => $projectStatuses::getNameById(1),
'linkRoute' => route('projects.index', ['status' => 1]),
])
</div>
<div class="col-lg-3 col-md-6">
@ -19,8 +21,8 @@
'class' => 'yellow',
'icon' => 'tasks',
'number' => array_key_exists(2, $projectsCount) ? $projectsCount[2] : 0,
'text' => getProjectStatusesList(2),
'linkRoute' => route('projects.index',['status' => 2]),
'text' => $projectStatuses::getNameById(2),
'linkRoute' => route('projects.index', ['status' => 2]),
])
</div>
<div class="col-lg-3 col-md-6">
@ -28,8 +30,8 @@
'class' => 'primary',
'icon' => 'thumbs-o-up',
'number' => array_key_exists(3, $projectsCount) ? $projectsCount[3] : 0,
'text' => getProjectStatusesList(3),
'linkRoute' => route('projects.index',['status' => 3]),
'text' => $projectStatuses::getNameById(3),
'linkRoute' => route('projects.index', ['status' => 3]),
])
</div>
<div class="col-lg-3 col-md-6">
@ -37,17 +39,17 @@
'class' => 'green',
'icon' => 'money',
'number' => array_key_exists(4, $projectsCount) ? $projectsCount[4] : 0,
'text' => getProjectStatusesList(4),
'linkRoute' => route('projects.index',['status' => 4]),
'text' => $projectStatuses::getNameById(4),
'linkRoute' => route('projects.index', ['status' => 4]),
])
</div>
<div class="col-lg-3 col-md-6 col-lg-offset-3">
@include('view-components.dashboard-panel', [
'class' => 'danger',
'icon' => 'fa-smile-o',
'icon' => 'frown-o',
'number' => array_key_exists(5, $projectsCount) ? $projectsCount[5] : 0,
'text' => getProjectStatusesList(5),
'linkRoute' => route('projects.index',['status' => 5]),
'text' => $projectStatuses::getNameById(5),
'linkRoute' => route('projects.index', ['status' => 5]),
])
</div>
<div class="col-lg-3 col-md-6">
@ -55,8 +57,8 @@
'class' => 'warning',
'icon' => 'hand-paper-o',
'number' => array_key_exists(6, $projectsCount) ? $projectsCount[6] : 0,
'text' => getProjectStatusesList(6),
'linkRoute' => route('projects.index',['status' => 6]),
'text' => $projectStatuses::getNameById(6),
'linkRoute' => route('projects.index', ['status' => 6]),
])
</div>
</div>

14
resources/views/view-components/sidebar-project-list-links.blade.php

@ -0,0 +1,14 @@
@inject('projectStatuses', 'App\Entities\Projects\Status')
<ul class="nav nav-second-level">
@foreach($projectStatuses::get() as $statusId => $status)
<?php
$projectCount = array_key_exists($statusId, $sidebarProjectStats) ? $sidebarProjectStats[$statusId] : 0;
$status .= '<span class="badge pull-right">'.$projectCount.'</span>';
?>
<li>{!! html_link_to_route('projects.index', $status, ['status' => $statusId]) !!}</li>
@endforeach
</ul>

37
tests/Unit/References/ProjectStatusTest.php

@ -0,0 +1,37 @@
<?php
namespace Tests\Unit\Reference;
use App\Entities\Projects\Status;
use Tests\TestCase;
class ProjectStatusTest extends TestCase
{
/** @test */
public function retrieve_project_status_list()
{
$projectStatus = new Status;
$this->assertEquals([
1 => trans('project.planned'),
2 => trans('project.progress'),
3 => trans('project.done'),
4 => trans('project.closed'),
5 => trans('project.canceled'),
6 => trans('project.on_hold'),
], $projectStatus->toArray());
}
/** @test */
public function retrieve_project_status_by_id()
{
$projectStatus = new Status;
$this->assertEquals(trans('project.planned'), $projectStatus->getNameById(1));
$this->assertEquals(trans('project.progress'), $projectStatus->getNameById(2));
$this->assertEquals(trans('project.done'), $projectStatus->getNameById(3));
$this->assertEquals(trans('project.closed'), $projectStatus->getNameById(4));
$this->assertEquals(trans('project.canceled'), $projectStatus->getNameById(5));
$this->assertEquals(trans('project.on_hold'), $projectStatus->getNameById(6));
}
}
Loading…
Cancel
Save