From 0f9b813a626e6e10aa9b0676199e9d94c4b8886d Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sun, 17 Mar 2019 23:29:25 +0800 Subject: [PATCH 1/4] New entry issue has open status by default --- app/Entities/Projects/Issue.php | 5 +++ app/Entities/Projects/IssueStatus.php | 39 ++++++++++++++++++++++ database/factories/IssueFactory.php | 1 + .../2019_03_03_210017_create_issues_table.php | 1 + resources/lang/de/issue.php | 3 ++ resources/lang/en/issue.php | 3 ++ resources/lang/id/issue.php | 3 ++ tests/Unit/Models/IssueTest.php | 8 +++++ 8 files changed, 63 insertions(+) create mode 100644 app/Entities/Projects/IssueStatus.php diff --git a/app/Entities/Projects/Issue.php b/app/Entities/Projects/Issue.php index 00ef0a6..8bc9ec4 100644 --- a/app/Entities/Projects/Issue.php +++ b/app/Entities/Projects/Issue.php @@ -24,4 +24,9 @@ class Issue extends Model { return $this->belongsTo(User::class); } + + public function getStatusAttribute() + { + return IssueStatus::getNameById($this->status_id); + } } diff --git a/app/Entities/Projects/IssueStatus.php b/app/Entities/Projects/IssueStatus.php new file mode 100644 index 0000000..159b60a --- /dev/null +++ b/app/Entities/Projects/IssueStatus.php @@ -0,0 +1,39 @@ + '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; + } +} diff --git a/database/factories/IssueFactory.php b/database/factories/IssueFactory.php index 859781d..5c43722 100644 --- a/database/factories/IssueFactory.php +++ b/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, ]; }); diff --git a/database/migrations/2019_03_03_210017_create_issues_table.php b/database/migrations/2019_03_03_210017_create_issues_table.php index 789511d..520a386 100644 --- a/database/migrations/2019_03_03_210017_create_issues_table.php +++ b/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(); }); } diff --git a/resources/lang/de/issue.php b/resources/lang/de/issue.php index de4bc36..4417898 100644 --- a/resources/lang/de/issue.php +++ b/resources/lang/de/issue.php @@ -40,4 +40,7 @@ return [ 'project' => 'Issue Project', 'pic' => 'Issue PIC', 'creator' => 'Issue Creator', + + // Statuses + 'open' => 'Open', ]; diff --git a/resources/lang/en/issue.php b/resources/lang/en/issue.php index de4bc36..4417898 100644 --- a/resources/lang/en/issue.php +++ b/resources/lang/en/issue.php @@ -40,4 +40,7 @@ return [ 'project' => 'Issue Project', 'pic' => 'Issue PIC', 'creator' => 'Issue Creator', + + // Statuses + 'open' => 'Open', ]; diff --git a/resources/lang/id/issue.php b/resources/lang/id/issue.php index 200859e..c9f914c 100644 --- a/resources/lang/id/issue.php +++ b/resources/lang/id/issue.php @@ -40,4 +40,7 @@ return [ 'project' => 'Project Issue', 'pic' => 'PIC Issue', 'creator' => 'Pembuat Issue', + + // Statuses + 'open' => 'Open', ]; diff --git a/tests/Unit/Models/IssueTest.php b/tests/Unit/Models/IssueTest.php index 0f73412..9f658cc 100644 --- a/tests/Unit/Models/IssueTest.php +++ b/tests/Unit/Models/IssueTest.php @@ -47,4 +47,12 @@ 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); + } } From 4110f39bc8b808ed0b1f8ac6201978c41a95e24b Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sun, 17 Mar 2019 23:42:23 +0800 Subject: [PATCH 2/4] Add status badge on issue index and detail page --- app/Entities/Projects/Issue.php | 5 +++++ resources/views/projects/issues.blade.php | 2 ++ resources/views/projects/issues/show.blade.php | 7 ++++++- tests/Unit/Models/IssueTest.php | 8 ++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/Entities/Projects/Issue.php b/app/Entities/Projects/Issue.php index 8bc9ec4..b8cf43d 100644 --- a/app/Entities/Projects/Issue.php +++ b/app/Entities/Projects/Issue.php @@ -29,4 +29,9 @@ class Issue extends Model { return IssueStatus::getNameById($this->status_id); } + + public function getStatusLabelAttribute() + { + return ''.$this->status.''; + } } diff --git a/resources/views/projects/issues.blade.php b/resources/views/projects/issues.blade.php index b05420d..2ad1db6 100755 --- a/resources/views/projects/issues.blade.php +++ b/resources/views/projects/issues.blade.php @@ -17,6 +17,7 @@ {{ __('app.table_no') }} {{ __('issue.title') }} + {{ __('app.status') }} {{ __('issue.pic') }} {{ __('issue.creator') }} {{ __('app.action') }} @@ -29,6 +30,7 @@ {{ $no }} {{ $issue->title }} + {!! $issue->status_label !!} {{ $issue->pic->name }} {{ $issue->creator->name }} diff --git a/resources/views/projects/issues/show.blade.php b/resources/views/projects/issues/show.blade.php index 191b16d..e7f756e 100755 --- a/resources/views/projects/issues/show.blade.php +++ b/resources/views/projects/issues/show.blade.php @@ -12,7 +12,12 @@
-

{{ __('issue.detail') }}

+
+

+
{!! $issue->status_label !!}
+ {{ __('issue.detail') }} +

+
diff --git a/tests/Unit/Models/IssueTest.php b/tests/Unit/Models/IssueTest.php index 9f658cc..f0a6b4e 100644 --- a/tests/Unit/Models/IssueTest.php +++ b/tests/Unit/Models/IssueTest.php @@ -55,4 +55,12 @@ class IssueTest extends TestCase $this->assertEquals(__('issue.open'), $issue->status); } + + /** @test */ + public function an_issue_has_status_label_attribute() + { + $issue = factory(Issue::class)->make(); + + $this->assertEquals(''.$issue->status.'', $issue->status_label); + } } From bf52f5b3af7107d461cac1077fb4fd42c2c0f649 Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sun, 17 Mar 2019 23:51:44 +0800 Subject: [PATCH 3/4] User can change issue status --- app/Http/Controllers/Issues/PicController.php | 4 +++- app/Http/Controllers/Projects/IssueController.php | 4 +++- resources/lang/de/issue.php | 6 +++++- resources/lang/en/issue.php | 6 +++++- resources/lang/id/issue.php | 6 +++++- resources/views/projects/issues/show.blade.php | 1 + tests/Feature/Projects/ProjectIssuesTest.php | 22 ++++++++++++++++++++++ 7 files changed, 44 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Issues/PicController.php b/app/Http/Controllers/Issues/PicController.php index 8a5c63f..3fc2bec 100644 --- a/app/Http/Controllers/Issues/PicController.php +++ b/app/Http/Controllers/Issues/PicController.php @@ -11,8 +11,10 @@ class PicController extends Controller public function update(Request $request, Issue $issue) { $picData = $request->validate([ - 'pic_id' => 'nullable|exists:users,id', + 'status_id' => 'required|in:0,1,2,3,4', + 'pic_id' => 'nullable|exists:users,id', ]); + $issue->status_id = $picData['status_id']; $issue->pic_id = $picData['pic_id']; $issue->save(); diff --git a/app/Http/Controllers/Projects/IssueController.php b/app/Http/Controllers/Projects/IssueController.php index 1dddc69..86fb337 100644 --- a/app/Http/Controllers/Projects/IssueController.php +++ b/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) diff --git a/resources/lang/de/issue.php b/resources/lang/de/issue.php index 4417898..9def5f9 100644 --- a/resources/lang/de/issue.php +++ b/resources/lang/de/issue.php @@ -42,5 +42,9 @@ return [ 'creator' => 'Issue Creator', // Statuses - 'open' => 'Open', + 'open' => 'Open', + 'resolved' => 'Resolved', + 'closed' => 'Closed', + 'on_hold' => 'On Hold', + 'invalid' => 'Invalid', ]; diff --git a/resources/lang/en/issue.php b/resources/lang/en/issue.php index 4417898..9def5f9 100644 --- a/resources/lang/en/issue.php +++ b/resources/lang/en/issue.php @@ -42,5 +42,9 @@ return [ 'creator' => 'Issue Creator', // Statuses - 'open' => 'Open', + 'open' => 'Open', + 'resolved' => 'Resolved', + 'closed' => 'Closed', + 'on_hold' => 'On Hold', + 'invalid' => 'Invalid', ]; diff --git a/resources/lang/id/issue.php b/resources/lang/id/issue.php index c9f914c..8948b23 100644 --- a/resources/lang/id/issue.php +++ b/resources/lang/id/issue.php @@ -42,5 +42,9 @@ return [ 'creator' => 'Pembuat Issue', // Statuses - 'open' => 'Open', + 'open' => 'Open', + 'resolved' => 'Selesai', + 'closed' => 'Ditutup', + 'on_hold' => 'Ditunda', + 'invalid' => 'Tidak Valid', ]; diff --git a/resources/views/projects/issues/show.blade.php b/resources/views/projects/issues/show.blade.php index e7f756e..84f9589 100755 --- a/resources/views/projects/issues/show.blade.php +++ b/resources/views/projects/issues/show.blade.php @@ -36,6 +36,7 @@

{{ __('app.action') }}

+ {!! FormField::radios('status_id', $statuses, ['label' => __('app.status')]) !!} {!! FormField::select('pic_id', $users, ['label' => __('issue.assign_pic'), 'placeholder' => __('issue.select_pic')]) !!}
+ @endforelse
{{ __('issue.title') }}{{ $issue->title }}
{{ __('issue.empty') }}
{{ __('issue.empty') }}
diff --git a/resources/views/projects/issues/show.blade.php b/resources/views/projects/issues/show.blade.php index 84f9589..70bf183 100755 --- a/resources/views/projects/issues/show.blade.php +++ b/resources/views/projects/issues/show.blade.php @@ -32,7 +32,7 @@
- {{ Form::model($issue, ['route' => ['issues.pic.update', $issue], 'method' => 'patch']) }} + {{ Form::model($issue, ['route' => ['issues.options.update', $issue], 'method' => 'patch']) }}

{{ __('app.action') }}

diff --git a/routes/web/projects.php b/routes/web/projects.php index a04aab7..45d403f 100644 --- a/routes/web/projects.php +++ b/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'); diff --git a/tests/Feature/Projects/ProjectIssuesTest.php b/tests/Feature/Projects/ProjectIssuesTest.php index c23631b..c85d1c4 100644 --- a/tests/Feature/Projects/ProjectIssuesTest.php +++ b/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,7 +161,7 @@ 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, @@ -182,7 +182,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,