Browse Source

Add job list tab on user detail page

Add jobs relation on user model
pull/6/head
Nafies Luthfi 8 years ago
parent
commit
162e7c4b1a
  1. 6
      app/Entities/Users/User.php
  2. 19
      app/Http/Controllers/Users/JobsController.php
  3. 3
      resources/lang/en/job.php
  4. 4
      resources/lang/en/user.php
  5. 4
      resources/lang/id/user.php
  6. 2
      resources/views/jobs/partials/job-show.blade.php
  7. 4
      resources/views/jobs/show.blade.php
  8. 53
      resources/views/users/jobs.blade.php
  9. 3
      resources/views/users/partials/nav-tabs.blade.php
  10. 1
      routes/web/users.php
  11. 12
      tests/Unit/Models/UserTest.php

6
app/Entities/Users/User.php

@ -2,6 +2,7 @@
namespace App\Entities\Users;
use App\Entities\Projects\Job;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
@ -124,4 +125,9 @@ class User extends Authenticatable
return $roleList;
}
public function jobs()
{
return $this->hasMany(Job::class, 'worker_id');
}
}

19
app/Http/Controllers/Users/JobsController.php

@ -0,0 +1,19 @@
<?php
namespace App\Http\Controllers\Users;
use App\Entities\Users\User;
use App\Http\Controllers\Controller;
class JobsController extends Controller
{
public function index(User $user)
{
$jobs = $user->jobs()
->latest()
->with(['tasks', 'project'])
->paginate();
return view('users.jobs', compact('user', 'jobs'));
}
}

3
resources/lang/en/job.php

@ -6,6 +6,7 @@ return [
'list' => 'Job List',
'additional' => 'Additional Job List',
'on_progress' => 'Job on Progress',
'detail' => 'Job Detail',
'search' => 'Ssearch Job',
'found' => 'Job found.',
'not_found' => 'Job not found.',
@ -18,7 +19,7 @@ return [
// Actions
'create' => 'Create new Job',
'created' => 'New Job has been created.',
'show' => 'Job Detail',
'show' => 'View Job Detail',
'edit' => 'Edit Job',
'update' => 'Update Job',
'updated' => 'Job data has been updated.',

4
resources/lang/en/user.php

@ -33,10 +33,12 @@ return [
'registered_at' => 'Registered at',
// Roles
'role' => 'Role',
'roles' => [
'admin' => 'Administrator',
'worker' => 'Worker',
],
// Relations
'jobs' => 'Job List',
];

4
resources/lang/id/user.php

@ -32,10 +32,12 @@ return [
'registered_at' => 'Terdaftar sejak',
// Roles
'role' => 'Role',
'roles' => [
'admin' => 'Administrator',
'worker' => 'Worker',
],
// Relations
'jobs' => 'Daftar Job',
];

2
resources/views/jobs/partials/job-show.blade.php

@ -1,5 +1,5 @@
<div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">{{ trans('job.show') }}</h3></div>
<div class="panel-heading"><h3 class="panel-title">{{ trans('job.detail') }}</h3></div>
<table class="table table-condensed">
<tbody>
<tr><th class="col-md-4">{{ trans('job.name') }}</th><td class="col-md-8">{{ $job->name }}</td></tr>

4
resources/views/jobs/show.blade.php

@ -1,6 +1,6 @@
@extends('layouts.app')
@section('title', trans('job.show') . ' | ' . $job->name . ' | ' . $job->project->name)
@section('title', trans('job.detail') . ' | ' . $job->name . ' | ' . $job->project->name)
@section('content')
@include('jobs.partials.breadcrumb')
@ -11,7 +11,7 @@
{!! link_to_route('jobs.edit', trans('job.edit'), [$job->id], ['class' => 'btn btn-warning']) !!}
{!! link_to_route('projects.jobs.index', trans('job.back_to_index'), [$job->project_id, '#' . $job->id], ['class' => 'btn btn-default']) !!}
</div>
{{ $job->name }} <small>{{ trans('job.show') }}</small>
{{ $job->name }} <small>{{ trans('job.detail') }}</small>
</h1>
<div class="row">
<div class="col-md-5">

53
resources/views/users/jobs.blade.php

@ -0,0 +1,53 @@
@extends('layouts.user')
@section('subtitle', trans('user.jobs'))
@section('content-user')
<div class="panel panel-default">
<table class="table table-condensed">
<thead>
<th>{{ trans('app.table_no') }}</th>
<th>{{ trans('project.name') }}</th>
<th>{{ trans('job.name') }}</th>
<th class="text-center">{{ trans('job.tasks_count') }}</th>
<th class="text-center">{{ trans('job.progress') }}</th>
<th class="text-right">{{ trans('job.price') }}</th>
<th class="text-center">{{ trans('app.action') }}</th>
</thead>
<tbody>
@forelse($jobs as $key => $job)
<tr>
<td>{{ $jobs->firstItem() + $key }}</td>
<td>{{ $job->project->nameLink() }}</td>
<td>
{{ link_to_route('jobs.show', $job->name, [$job], ['title' => trans('job.show')]) }}
@if ($job->tasks->isEmpty() == false)
<ul>
@foreach($job->tasks as $task)
<li style="cursor:pointer" title="{{ $task->progress }} %">
<i class="fa fa-battery-{{ ceil(4 * $task->progress/100) }}"></i>
{{ $task->name }}
</li>
@endforeach
</ul>
@endif
</td>
<td class="text-center">{{ $job->tasks_count = $job->tasks->count() }}</td>
<td class="text-center">{{ formatDecimal($job->progress = $job->progress) }} %</td>
<td class="text-right">{{ formatRp($job->price) }}</td>
<td class="text-center">
{!! html_link_to_route('jobs.show', '', [$job], [
'icon' => 'search',
'class' => 'btn btn-info btn-xs',
'title' => trans('job.show')
]) !!}
</td>
</tr>
@empty
<tr><td colspan="7">{{ trans('job.empty') }}</td></tr>
@endforelse
</tbody>
</table>
</div>
{{ $jobs->appends(Request::except('page'))->render() }}
@endsection

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

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

1
routes/web/users.php

@ -4,6 +4,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}/delete', ['as' => 'users.delete', 'uses' => 'UsersController@delete']);
Route::resource('users', 'UsersController');
});

12
tests/Unit/Models/UserTest.php

@ -2,7 +2,9 @@
namespace Tests\Unit\Models;
use App\Entities\Projects\Job;
use App\Entities\Users\User;
use Illuminate\Support\Collection;
use Tests\TestCase;
/**
@ -90,4 +92,14 @@ class UserTest extends TestCase
$this->assertEquals($roleList, $user->roleList());
}
/** @test */
public function a_user_has_many_jobs_relation()
{
$user = factory(User::class)->create();
$job = factory(Job::class)->create(['worker_id' => $user->id]);
$this->assertInstanceOf(Collection::class, $user->jobs);
$this->assertInstanceOf(Job::class, $user->jobs->first());
}
}
Loading…
Cancel
Save