Browse Source

Merge branch 'project-issue-status' into project-issue

pull/37/head
Nafies Luthfi 7 years ago
parent
commit
6f1fc83731
  1. 10
      app/Entities/Projects/Issue.php
  2. 39
      app/Entities/Projects/IssueStatus.php
  3. 24
      app/Http/Controllers/Issues/OptionController.php
  4. 27
      app/Http/Controllers/Issues/PicController.php
  5. 4
      app/Http/Controllers/Projects/IssueController.php
  6. 1
      database/factories/IssueFactory.php
  7. 1
      database/migrations/2019_03_03_210017_create_issues_table.php
  8. 7
      resources/lang/de/issue.php
  9. 7
      resources/lang/en/issue.php
  10. 7
      resources/lang/id/issue.php
  11. 4
      resources/views/projects/issues.blade.php
  12. 10
      resources/views/projects/issues/show.blade.php
  13. 4
      routes/web/projects.php
  14. 26
      tests/Feature/Projects/ProjectIssuesTest.php
  15. 16
      tests/Unit/Models/IssueTest.php

10
app/Entities/Projects/Issue.php

@ -24,4 +24,14 @@ class Issue extends Model
{
return $this->belongsTo(User::class);
}
public function getStatusAttribute()
{
return IssueStatus::getNameById($this->status_id);
}
public function getStatusLabelAttribute()
{
return '<span class="badge">'.$this->status.'</span>';
}
}

39
app/Entities/Projects/IssueStatus.php

@ -0,0 +1,39 @@
<?php
namespace App\Entities\Projects;
use App\Entities\ReferenceAbstract;
class IssueStatus extends ReferenceAbstract
{
protected static $lists = [
0 => 'open',
1 => 'resolved',
2 => 'closed',
3 => 'on_hold',
4 => 'invalid',
];
protected static $colors = [
0 => 'yellow',
1 => 'green',
2 => 'primary',
3 => 'default',
4 => 'warning',
];
public static function getNameById($singleId)
{
return trans('issue.'.static::getById($singleId));
}
public static function toArray()
{
$lists = [];
foreach (static::$lists as $key => $value) {
$lists[$key] = trans('issue.'.$value);
}
return $lists;
}
}

24
app/Http/Controllers/Issues/OptionController.php

@ -0,0 +1,24 @@
<?php
namespace App\Http\Controllers\Issues;
use Illuminate\Http\Request;
use App\Entities\Projects\Issue;
use App\Http\Controllers\Controller;
class OptionController extends Controller
{
public function update(Request $request, Issue $issue)
{
$issueData = $request->validate([
'status_id' => 'required|in:0,1,2,3,4',
'pic_id' => 'nullable|exists:users,id',
]);
$issue->status_id = $issueData['status_id'];
$issue->pic_id = $issueData['pic_id'];
$issue->save();
flash(__('issue.updated'), 'success');
return back();
}
}

27
app/Http/Controllers/Issues/PicController.php

@ -1,27 +0,0 @@
<?php
namespace App\Http\Controllers\Issues;
use Illuminate\Http\Request;
use App\Entities\Projects\Issue;
use App\Http\Controllers\Controller;
class PicController extends Controller
{
public function update(Request $request, Issue $issue)
{
$picData = $request->validate([
'pic_id' => 'nullable|exists:users,id',
]);
$issue->pic_id = $picData['pic_id'];
$issue->save();
if ($issue->pic_id) {
flash(__('issue.pic_assigned'), 'success');
} else {
flash(__('issue.pic_removed'), 'warning');
}
return back();
}
}

4
app/Http/Controllers/Projects/IssueController.php

@ -7,6 +7,7 @@ use Illuminate\Http\Request;
use App\Entities\Projects\Issue;
use App\Entities\Projects\Project;
use App\Http\Controllers\Controller;
use App\Entities\Projects\IssueStatus;
class IssueController extends Controller
{
@ -45,9 +46,10 @@ class IssueController extends Controller
public function show(Project $project, Issue $issue)
{
$statuses = IssueStatus::toArray();
$users = User::pluck('name', 'id');
return view('projects.issues.show', compact('project', 'issue', 'users'));
return view('projects.issues.show', compact('project', 'issue', 'users', 'statuses'));
}
public function edit(Project $project, Issue $issue)

1
database/factories/IssueFactory.php

@ -15,5 +15,6 @@ $factory->define(Issue::class, function (Faker $faker) {
'creator_id' => function () {
return factory(User::class)->create()->id;
},
'status_id' => 0,
];
});

1
database/migrations/2019_03_03_210017_create_issues_table.php

@ -20,6 +20,7 @@ class CreateIssuesTable extends Migration
$table->string('body');
$table->unsignedInteger('creator_id');
$table->unsignedInteger('pic_id')->nullable();
$table->unsignedTinyInteger('status_id')->default(0);
$table->timestamps();
});
}

7
resources/lang/de/issue.php

@ -40,4 +40,11 @@ return [
'project' => 'Issue Project',
'pic' => 'Issue PIC',
'creator' => 'Issue Creator',
// Statuses
'open' => 'Open',
'resolved' => 'Resolved',
'closed' => 'Closed',
'on_hold' => 'On Hold',
'invalid' => 'Invalid',
];

7
resources/lang/en/issue.php

@ -40,4 +40,11 @@ return [
'project' => 'Issue Project',
'pic' => 'Issue PIC',
'creator' => 'Issue Creator',
// Statuses
'open' => 'Open',
'resolved' => 'Resolved',
'closed' => 'Closed',
'on_hold' => 'On Hold',
'invalid' => 'Invalid',
];

7
resources/lang/id/issue.php

@ -40,4 +40,11 @@ return [
'project' => 'Project Issue',
'pic' => 'PIC Issue',
'creator' => 'Pembuat Issue',
// Statuses
'open' => 'Open',
'resolved' => 'Selesai',
'closed' => 'Ditutup',
'on_hold' => 'Ditunda',
'invalid' => 'Tidak Valid',
];

4
resources/views/projects/issues.blade.php

@ -17,6 +17,7 @@
<thead>
<th>{{ __('app.table_no') }}</th>
<th>{{ __('issue.title') }}</th>
<th>{{ __('app.status') }}</th>
<th>{{ __('issue.pic') }}</th>
<th>{{ __('issue.creator') }}</th>
<th class="text-center">{{ __('app.action') }}</th>
@ -29,6 +30,7 @@
<tr id="{{ $issue->id }}">
<td>{{ $no }}</td>
<td>{{ $issue->title }}</td>
<td>{!! $issue->status_label !!}</td>
<td>{{ $issue->pic->name }}</td>
<td>{{ $issue->creator->name }}</td>
<td class="text-center">
@ -41,7 +43,7 @@
</td>
</tr>
@empty
<tr><td colspan="5">{{ __('issue.empty') }}</td></tr>
<tr><td colspan="6">{{ __('issue.empty') }}</td></tr>
@endforelse
</tbody>
</table>

10
resources/views/projects/issues/show.blade.php

@ -12,7 +12,12 @@
<div class="row">
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">{{ __('issue.detail') }}</h3></div>
<div class="panel-heading">
<h3 class="panel-title">
<div class="pull-right">{!! $issue->status_label !!}</div>
{{ __('issue.detail') }}
</h3>
</div>
<table class="table table-condensed">
<tbody>
<tr><th class="col-md-4">{{ __('issue.title') }}</th><td class="col-md-8">{{ $issue->title }}</td></tr>
@ -27,10 +32,11 @@
</div>
</div>
<div class="col-md-6">
{{ Form::model($issue, ['route' => ['issues.pic.update', $issue], 'method' => 'patch']) }}
{{ Form::model($issue, ['route' => ['issues.options.update', $issue], 'method' => 'patch']) }}
<div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">{{ __('app.action') }}</h3></div>
<div class="panel-body">
{!! FormField::radios('status_id', $statuses, ['label' => __('app.status')]) !!}
{!! FormField::select('pic_id', $users, ['label' => __('issue.assign_pic'), 'placeholder' => __('issue.select_pic')]) !!}
</div>
<div class="panel-footer">

4
routes/web/projects.php

@ -102,6 +102,6 @@ Route::group(['middleware' => ['auth']], function () {
});
/**
* Issue PIC Routes
* Issue Options Routes
*/
Route::patch('issues/{issue}/assign_pic', 'Issues\PicController@update')->name('issues.pic.update');
Route::patch('issues/{issue}/options', 'Issues\OptionController@update')->name('issues.options.update');

26
tests/Feature/Projects/ProjectIssuesTest.php

@ -141,7 +141,7 @@ class ProjectIssuesTest extends TestCase
'pic_id' => $worker->id,
]);
$this->seeRouteIs('projects.issues.show', [$issue->project, $issue]);
$this->seeText(__('issue.pic_assigned'));
$this->seeText(__('issue.updated'));
$this->seeInDatabase('issues', [
'id' => $issue->id,
@ -161,11 +161,33 @@ class ProjectIssuesTest extends TestCase
'pic_id' => null,
]);
$this->seeRouteIs('projects.issues.show', [$issue->project, $issue]);
$this->seeText(__('issue.pic_removed'));
$this->seeText(__('issue.updated'));
$this->seeInDatabase('issues', [
'id' => $issue->id,
'pic_id' => null,
]);
}
/** @test */
public function user_can_change_issue_status()
{
$this->adminUserSigningIn();
$worker = $this->createUser('worker');
$issue = factory(Issue::class)->create();
$this->visitRoute('projects.issues.show', [$issue->project, $issue]);
$this->submitForm(__('issue.update'), [
'status_id' => 2, // resolved
'pic_id' => $worker->id,
]);
$this->seeRouteIs('projects.issues.show', [$issue->project, $issue]);
$this->seeText(__('issue.updated'));
$this->seeInDatabase('issues', [
'id' => $issue->id,
'pic_id' => $worker->id,
'status_id' => 2, // resolved
]);
}
}

16
tests/Unit/Models/IssueTest.php

@ -47,4 +47,20 @@ class IssueTest extends TestCase
$this->assertInstanceOf(User::class, $issue->creator);
$this->assertEquals($issue->creator_id, $issue->creator->id);
}
/** @test */
public function an_issue_has_status_attribute()
{
$issue = factory(Issue::class)->make();
$this->assertEquals(__('issue.open'), $issue->status);
}
/** @test */
public function an_issue_has_status_label_attribute()
{
$issue = factory(Issue::class)->make();
$this->assertEquals('<span class="badge">'.$issue->status.'</span>', $issue->status_label);
}
}
Loading…
Cancel
Save