diff --git a/app/Entities/Users/User.php b/app/Entities/Users/User.php index 2e9c1f6..dadcbe0 100644 --- a/app/Entities/Users/User.php +++ b/app/Entities/Users/User.php @@ -130,4 +130,11 @@ class User extends Authenticatable { return $this->hasMany(Job::class, 'worker_id'); } + + public function projects() + { + return $this->belongsToMany('App\Entities\Projects\Project', 'jobs', 'worker_id') + ->groupBy('worker_id') + ->groupBy('project_id'); + } } diff --git a/app/Http/Controllers/Users/JobsController.php b/app/Http/Controllers/Users/JobsController.php index 8a9f493..e99d05c 100644 --- a/app/Http/Controllers/Users/JobsController.php +++ b/app/Http/Controllers/Users/JobsController.php @@ -5,6 +5,11 @@ namespace App\Http\Controllers\Users; use App\Entities\Users\User; use App\Http\Controllers\Controller; +/** + * User Jobs Controller. + * + * @author Nafies Luthfi + */ class JobsController extends Controller { public function index(User $user) diff --git a/app/Http/Controllers/Users/ProjectsController.php b/app/Http/Controllers/Users/ProjectsController.php new file mode 100644 index 0000000..8cb9bc5 --- /dev/null +++ b/app/Http/Controllers/Users/ProjectsController.php @@ -0,0 +1,30 @@ + + */ +class ProjectsController extends Controller +{ + public function index(User $user) + { + $projects = $user->projects() + ->where(function ($query) { + $query->where('projects.name', 'like', '%'.request('q').'%'); + if (request('status')) { + $query->where('status_id', request('status')); + } + }) + ->latest() + ->with(['customer']) + ->paginate(); + + return view('users.projects', compact('user', 'projects')); + } +} diff --git a/resources/lang/en/user.php b/resources/lang/en/user.php index b504531..6906f46 100644 --- a/resources/lang/en/user.php +++ b/resources/lang/en/user.php @@ -40,5 +40,6 @@ return [ ], // Relations - 'jobs' => 'Job List', + 'jobs' => 'Job List', + 'projects' => 'Project List', ]; diff --git a/resources/lang/id/user.php b/resources/lang/id/user.php index 6565244..fd1d549 100644 --- a/resources/lang/id/user.php +++ b/resources/lang/id/user.php @@ -39,5 +39,6 @@ return [ ], // Relations - 'jobs' => 'Daftar Job', + 'jobs' => 'Daftar Job', + 'projects' => 'Daftar Project', ]; diff --git a/resources/views/layouts/user.blade.php b/resources/views/layouts/user.blade.php index e9a08c2..1c56675 100755 --- a/resources/views/layouts/user.blade.php +++ b/resources/views/layouts/user.blade.php @@ -1,7 +1,7 @@ @extends('layouts.app') @section('title') -{{ $user->name }} - @yield('subtitle', trans('user.profile')) +@yield('subtitle', trans('user.profile')) | {{ $user->name }} @endsection @section('content') diff --git a/resources/views/users/partials/nav-tabs.blade.php b/resources/views/users/partials/nav-tabs.blade.php index 9ac236b..2534688 100644 --- a/resources/views/users/partials/nav-tabs.blade.php +++ b/resources/views/users/partials/nav-tabs.blade.php @@ -6,5 +6,8 @@
  • {!! link_to_route('users.jobs', trans('user.jobs').' ('.$user->jobs()->count().')', [$user]) !!}
  • +
  • + {!! link_to_route('users.projects', trans('user.projects').' ('.$user->projects->count().')', [$user]) !!} +

  • diff --git a/resources/views/users/projects.blade.php b/resources/views/users/projects.blade.php new file mode 100755 index 0000000..36d0d99 --- /dev/null +++ b/resources/views/users/projects.blade.php @@ -0,0 +1,50 @@ +@extends('layouts.user') + +@section('subtitle', trans('user.projects')) + +@section('content-user') +
    + {!! Form::open(['method' => 'get', 'class' => 'form-inline']) !!} + {!! FormField::select('status', ProjectStatus::toArray(), ['value' => Request::get('status'), 'placeholder' => trans('project.all')]) !!} + {!! Form::text('q', Request::get('q'), ['class' => 'form-control index-search-field', 'placeholder' => trans('project.search'), 'style' => 'width:100%;max-width:350px']) !!} + {!! Form::submit(trans('project.search'), ['class' => 'btn btn-info btn-sm']) !!} + {!! link_to_route('users.projects', trans('app.reset'), [$user], ['class' => 'btn btn-default btn-sm']) !!} + {!! Form::close() !!} +
    +
    + + + + + + + + + + + + + @forelse($projects as $key => $project) + + + + + + + + + + + @empty + + + + @endforelse + +
    {{ trans('app.table_no') }}{{ trans('project.name') }}{{ trans('project.start_date') }}{{ trans('project.work_duration') }}{{ trans('project.project_value') }}{{ trans('app.status') }}{{ trans('project.customer') }}{{ trans('app.action') }}
    {{ $projects->firstItem() + $key }}{{ $project->nameLink() }}{{ $project->start_date }}{{ $project->present()->workDuration }}{{ formatRp($project->project_value) }}{{ $project->present()->status }}{{ $project->customer->name }} + {!! html_link_to_route('projects.show', '', [$project->id], ['icon' => 'search', 'class' => 'btn btn-info btn-xs', 'title' => trans('app.show')]) !!} + {!! html_link_to_route('projects.edit', '', [$project->id], ['icon' => 'edit', 'class' => 'btn btn-warning btn-xs', 'title' => trans('app.edit')]) !!} +
    {{ trans('project.not_found') }}
    +
    +{{ $projects->appends(Request::except('page'))->render() }} +@endsection diff --git a/routes/web/users.php b/routes/web/users.php index 831d370..d50dc8e 100644 --- a/routes/web/users.php +++ b/routes/web/users.php @@ -5,6 +5,7 @@ Route::group(['middleware' => ['web', 'role:admin'], 'namespace' => 'Users'], fu * Users Routes */ Route::get('users/{user}/jobs', ['as' => 'users.jobs', 'uses' => 'JobsController@index']); + Route::get('users/{user}/projects', ['as' => 'users.projects', 'uses' => 'ProjectsController@index']); Route::get('users/{user}/delete', ['as' => 'users.delete', 'uses' => 'UsersController@delete']); Route::resource('users', 'UsersController'); }); diff --git a/tests/Unit/Models/UserTest.php b/tests/Unit/Models/UserTest.php index cec503a..efa91a5 100644 --- a/tests/Unit/Models/UserTest.php +++ b/tests/Unit/Models/UserTest.php @@ -3,6 +3,7 @@ namespace Tests\Unit\Models; use App\Entities\Projects\Job; +use App\Entities\Projects\Project; use App\Entities\Users\User; use Illuminate\Support\Collection; use Tests\TestCase; @@ -102,4 +103,28 @@ class UserTest extends TestCase $this->assertInstanceOf(Collection::class, $user->jobs); $this->assertInstanceOf(Job::class, $user->jobs->first()); } + + /** @test */ + public function a_user_belongs_many_projects() + { + $user = factory(User::class)->create(); + $project = factory(Project::class)->create(); + $job = factory(Job::class)->create(['worker_id' => $user->id, 'project_id' => $project->id]); + + $this->assertInstanceOf(Collection::class, $user->projects); + $this->assertInstanceOf(Project::class, $user->projects->first()); + } + + /** @test */ + public function user_project_relation_has_has_unique_project_list() + { + $user = factory(User::class)->create(); + $project = factory(Project::class)->create(); + $job = factory(Job::class)->create(['worker_id' => $user->id, 'project_id' => $project->id]); + $job = factory(Job::class)->create(['worker_id' => $user->id, 'project_id' => $project->id]); + + $this->assertInstanceOf(Collection::class, $user->projects); + $this->assertInstanceOf(Project::class, $user->projects->first()); + $this->assertCount(1, $user->projects); + } }