Browse Source

Add project list tab on user detail page

Add user belongs to many projects with unique pivot query relation
pull/6/head
Nafies Luthfi 8 years ago
parent
commit
a4863856bd
  1. 7
      app/Entities/Users/User.php
  2. 5
      app/Http/Controllers/Users/JobsController.php
  3. 30
      app/Http/Controllers/Users/ProjectsController.php
  4. 3
      resources/lang/en/user.php
  5. 3
      resources/lang/id/user.php
  6. 2
      resources/views/layouts/user.blade.php
  7. 3
      resources/views/users/partials/nav-tabs.blade.php
  8. 50
      resources/views/users/projects.blade.php
  9. 1
      routes/web/users.php
  10. 25
      tests/Unit/Models/UserTest.php

7
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');
}
}

5
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 <nafiesl@gmail.com>
*/
class JobsController extends Controller
{
public function index(User $user)

30
app/Http/Controllers/Users/ProjectsController.php

@ -0,0 +1,30 @@
<?php
namespace App\Http\Controllers\Users;
use App\Entities\Users\User;
use App\Http\Controllers\Controller;
/**
* User Projects Controller.
*
* @author Nafies Luthfi <nafiesl@gmail.com>
*/
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'));
}
}

3
resources/lang/en/user.php

@ -40,5 +40,6 @@ return [
],
// Relations
'jobs' => 'Job List',
'jobs' => 'Job List',
'projects' => 'Project List',
];

3
resources/lang/id/user.php

@ -39,5 +39,6 @@ return [
],
// Relations
'jobs' => 'Daftar Job',
'jobs' => 'Daftar Job',
'projects' => 'Daftar Project',
];

2
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')

3
resources/views/users/partials/nav-tabs.blade.php

@ -6,5 +6,8 @@
<li class="{{ Request::segment(3) == 'jobs' ? 'active' : '' }}">
{!! link_to_route('users.jobs', trans('user.jobs').' ('.$user->jobs()->count().')', [$user]) !!}
</li>
<li class="{{ Request::segment(3) == 'projects' ? 'active' : '' }}">
{!! link_to_route('users.projects', trans('user.projects').' ('.$user->projects->count().')', [$user]) !!}
</li>
</ul>
<br>

50
resources/views/users/projects.blade.php

@ -0,0 +1,50 @@
@extends('layouts.user')
@section('subtitle', trans('user.projects'))
@section('content-user')
<div class="well well-sm text-right">
{!! 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() !!}
</div>
<div class="table-responsive">
<table class="table table-condensed table-hover">
<thead>
<th>{{ trans('app.table_no') }}</th>
<th>{{ trans('project.name') }}</th>
<th class="text-center">{{ trans('project.start_date') }}</th>
<th class="text-center">{{ trans('project.work_duration') }}</th>
<th class="text-right">{{ trans('project.project_value') }}</th>
<th class="text-center">{{ trans('app.status') }}</th>
<th>{{ trans('project.customer') }}</th>
<th>{{ trans('app.action') }}</th>
</thead>
<tbody>
@forelse($projects as $key => $project)
<tr>
<td>{{ $projects->firstItem() + $key }}</td>
<td>{{ $project->nameLink() }}</td>
<td class="text-center">{{ $project->start_date }}</td>
<td class="text-right">{{ $project->present()->workDuration }}</td>
<td class="text-right">{{ formatRp($project->project_value) }}</td>
<td class="text-center">{{ $project->present()->status }}</td>
<td>{{ $project->customer->name }}</td>
<td>
{!! 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')]) !!}
</td>
</tr>
@empty
<tr>
<td colspan="9">{{ trans('project.not_found') }}</td>
</tr>
@endforelse
</tbody>
</table>
</div>
{{ $projects->appends(Request::except('page'))->render() }}
@endsection

1
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');
});

25
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);
}
}
Loading…
Cancel
Save