diff --git a/app/Entities/Projects/Issue.php b/app/Entities/Projects/Issue.php index b8cf43d..17a31af 100644 --- a/app/Entities/Projects/Issue.php +++ b/app/Entities/Projects/Issue.php @@ -8,7 +8,9 @@ use Illuminate\Database\Eloquent\Model; class Issue extends Model { - protected $fillable = ['project_id', 'title', 'body', 'pic_id', 'creator_id']; + protected $fillable = [ + 'project_id', 'title', 'body', 'priority_id', 'pic_id', 'creator_id', + ]; public function project() { @@ -25,6 +27,18 @@ class Issue extends Model return $this->belongsTo(User::class); } + public function getPriorityAttribute() + { + return Priority::getNameById($this->priority_id); + } + + public function getPriorityLabelAttribute() + { + $classColor = Priority::getColorById($this->priority_id); + + return ''.$this->priority.''; + } + public function getStatusAttribute() { return IssueStatus::getNameById($this->status_id); diff --git a/app/Entities/Projects/Priority.php b/app/Entities/Projects/Priority.php new file mode 100644 index 0000000..da953f1 --- /dev/null +++ b/app/Entities/Projects/Priority.php @@ -0,0 +1,35 @@ + 'minor', + 2 => 'major', + 3 => 'critical', + ]; + + protected static $colors = [ + 1 => 'info', + 2 => 'warning', + 3 => 'danger', + ]; + + 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/app/Http/Controllers/Issues/OptionController.php b/app/Http/Controllers/Issues/OptionController.php index bad3511..a37a200 100644 --- a/app/Http/Controllers/Issues/OptionController.php +++ b/app/Http/Controllers/Issues/OptionController.php @@ -11,9 +11,11 @@ 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', + 'priority_id' => 'required|in:1,2,3', + 'status_id' => 'required|in:0,1,2,3,4', + 'pic_id' => 'nullable|exists:users,id', ]); + $issue->priority_id = $issueData['priority_id']; $issue->status_id = $issueData['status_id']; $issue->pic_id = $issueData['pic_id']; $issue->save(); diff --git a/app/Http/Controllers/Projects/IssueController.php b/app/Http/Controllers/Projects/IssueController.php index 86fb337..1a0c603 100644 --- a/app/Http/Controllers/Projects/IssueController.php +++ b/app/Http/Controllers/Projects/IssueController.php @@ -6,6 +6,7 @@ use App\Entities\Users\User; use Illuminate\Http\Request; use App\Entities\Projects\Issue; use App\Entities\Projects\Project; +use App\Entities\Projects\Priority; use App\Http\Controllers\Controller; use App\Entities\Projects\IssueStatus; @@ -15,29 +16,32 @@ class IssueController extends Controller { $issues = $project->issues()->with(['pic', 'creator'])->get(); - return view('projects.issues', compact('project', 'issues')); + return view('projects.issues.index', compact('project', 'issues')); } public function create(Project $project) { $users = User::pluck('name', 'id'); + $priorities = Priority::toArray(); - return view('projects.issues.create', compact('project', 'users')); + return view('projects.issues.create', compact('project', 'users', 'priorities')); } public function store(Request $request, Project $project) { $issueData = $request->validate([ - 'title' => 'required|max:60', - 'body' => 'required|max:255', - 'pic_id' => 'nullable|exists:users,id', + 'title' => 'required|max:60', + 'body' => 'required|max:255', + 'priority_id' => 'required|in:1,2,3', + 'pic_id' => 'nullable|exists:users,id', ]); Issue::create([ - 'project_id' => $project->id, - 'creator_id' => auth()->id(), - 'title' => $issueData['title'], - 'body' => $issueData['body'], - 'pic_id' => $issueData['pic_id'], + 'project_id' => $project->id, + 'creator_id' => auth()->id(), + 'title' => $issueData['title'], + 'body' => $issueData['body'], + 'priority_id' => $issueData['priority_id'], + 'pic_id' => $issueData['pic_id'], ]); flash(__('issue.created'), 'success'); @@ -46,10 +50,13 @@ class IssueController extends Controller public function show(Project $project, Issue $issue) { + $priorities = Priority::toArray(); $statuses = IssueStatus::toArray(); $users = User::pluck('name', 'id'); - return view('projects.issues.show', compact('project', 'issue', 'users', 'statuses')); + return view('projects.issues.show', compact( + 'project', 'issue', 'users', 'statuses', 'priorities' + )); } public function edit(Project $project, Issue $issue) diff --git a/database/factories/IssueFactory.php b/database/factories/IssueFactory.php index 5c43722..2941f50 100644 --- a/database/factories/IssueFactory.php +++ b/database/factories/IssueFactory.php @@ -7,14 +7,15 @@ use App\Entities\Projects\Project; $factory->define(Issue::class, function (Faker $faker) { return [ - 'project_id' => function () { + 'project_id' => function () { return factory(Project::class)->create()->id; }, - 'title' => $faker->words(3, true), - 'body' => $faker->sentences(3, true), - 'creator_id' => function () { + 'title' => $faker->words(3, true), + 'body' => $faker->sentences(3, true), + 'creator_id' => function () { return factory(User::class)->create()->id; }, - 'status_id' => 0, + 'status_id' => 0, + 'priority_id' => 1, ]; }); 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 520a386..ea55458 100644 --- a/database/migrations/2019_03_03_210017_create_issues_table.php +++ b/database/migrations/2019_03_03_210017_create_issues_table.php @@ -19,6 +19,7 @@ class CreateIssuesTable extends Migration $table->string('title', 60); $table->string('body'); $table->unsignedInteger('creator_id'); + $table->unsignedTinyInteger('priority_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 9def5f9..2d81052 100644 --- a/resources/lang/de/issue.php +++ b/resources/lang/de/issue.php @@ -41,6 +41,11 @@ return [ 'pic' => 'Issue PIC', 'creator' => 'Issue Creator', + // Priority + 'minor' => 'Minor', + 'major' => 'Major', + 'critical' => 'Critical', + // Statuses 'open' => 'Open', 'resolved' => 'Resolved', diff --git a/resources/lang/en/issue.php b/resources/lang/en/issue.php index 9def5f9..1be2737 100644 --- a/resources/lang/en/issue.php +++ b/resources/lang/en/issue.php @@ -41,6 +41,12 @@ return [ 'pic' => 'Issue PIC', 'creator' => 'Issue Creator', + // Priority + 'priority' => 'Priority', + 'minor' => 'Minor', + 'major' => 'Major', + 'critical' => 'Critical', + // Statuses 'open' => 'Open', 'resolved' => 'Resolved', diff --git a/resources/lang/id/issue.php b/resources/lang/id/issue.php index 8948b23..3946ac5 100644 --- a/resources/lang/id/issue.php +++ b/resources/lang/id/issue.php @@ -41,6 +41,11 @@ return [ 'pic' => 'PIC Issue', 'creator' => 'Pembuat Issue', + // Priority + 'minor' => 'Minor', + 'major' => 'Major', + 'critical' => 'Critical', + // Statuses 'open' => 'Open', 'resolved' => 'Selesai', diff --git a/resources/views/projects/issues/create.blade.php b/resources/views/projects/issues/create.blade.php index c7a7da7..1422715 100755 --- a/resources/views/projects/issues/create.blade.php +++ b/resources/views/projects/issues/create.blade.php @@ -18,6 +18,7 @@
{!! FormField::text('title', ['label' => __('issue.title')]) !!} {!! FormField::textarea('body', ['label' => __('issue.body')]) !!} + {!! FormField::radios('priority_id', $priorities, ['label' => __('issue.priority'), 'placeholder' => false]) !!} {!! FormField::select('pic_id', $users, ['label' => __('issue.pic')]) !!}
@@ -36,6 +38,7 @@

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

+ {!! FormField::radios('priority_id', $priorities, ['label' => __('issue.priority')]) !!} {!! FormField::radios('status_id', $statuses, ['label' => __('app.status')]) !!} {!! FormField::select('pic_id', $users, ['label' => __('issue.assign_pic'), 'placeholder' => __('issue.select_pic')]) !!}
diff --git a/tests/Feature/Projects/ProjectIssuesTest.php b/tests/Feature/Projects/ProjectIssuesTest.php index c85d1c4..9d27f9f 100644 --- a/tests/Feature/Projects/ProjectIssuesTest.php +++ b/tests/Feature/Projects/ProjectIssuesTest.php @@ -37,20 +37,22 @@ class ProjectIssuesTest extends TestCase $this->visitRoute('projects.issues.create', $project); $this->submitForm(__('issue.create'), [ - 'title' => 'First Issue.', - 'body' => 'First Issue description.', - 'pic_id' => $admin->id, + 'title' => 'First Issue.', + 'body' => 'First Issue description.', + 'priority_id' => 1, + 'pic_id' => $admin->id, ]); $this->seePageIs(route('projects.issues.index', $project)); $this->see(__('issue.created')); $this->seeInDatabase('issues', [ - 'project_id' => $project->id, - 'title' => 'First Issue.', - 'body' => 'First Issue description.', - 'pic_id' => $admin->id, - 'creator_id' => $admin->id, + 'project_id' => $project->id, + 'title' => 'First Issue.', + 'body' => 'First Issue description.', + 'priority_id' => 1, + 'pic_id' => $admin->id, + 'creator_id' => $admin->id, ]); } @@ -190,4 +192,28 @@ class ProjectIssuesTest extends TestCase 'status_id' => 2, // resolved ]); } + + /** @test */ + public function user_can_change_issue_priority() + { + $this->adminUserSigningIn(); + $worker = $this->createUser('worker'); + $issue = factory(Issue::class)->create(); + + $this->visitRoute('projects.issues.show', [$issue->project, $issue]); + $this->submitForm(__('issue.update'), [ + 'priority_id' => 2, // major + '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, + 'priority_id' => 2, // major + 'status_id' => 2, // resolved + ]); + } } diff --git a/tests/Unit/Models/IssueTest.php b/tests/Unit/Models/IssueTest.php index f0a6b4e..7877fdd 100644 --- a/tests/Unit/Models/IssueTest.php +++ b/tests/Unit/Models/IssueTest.php @@ -6,6 +6,7 @@ use Tests\TestCase; use App\Entities\Users\User; use App\Entities\Projects\Issue; use App\Entities\Projects\Project; +use App\Entities\Projects\Priority; use Illuminate\Foundation\Testing\RefreshDatabase; class IssueTest extends TestCase @@ -63,4 +64,21 @@ class IssueTest extends TestCase $this->assertEquals(''.$issue->status.'', $issue->status_label); } + + /** @test */ + public function an_issue_has_priority_attribute() + { + $issue = factory(Issue::class)->make(); + + $this->assertEquals(__('issue.minor'), $issue->priority); + } + + /** @test */ + public function an_issue_has_priority_label_attribute() + { + $issue = factory(Issue::class)->make(); + $colorClass = Priority::getColorById($issue->priority_id); + + $this->assertEquals(''.$issue->priority.'', $issue->priority_label); + } }