From 7e10f5b2b0ed07e39b09e6d8f2ffc0dd675ab785 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Tue, 2 Aug 2022 06:39:58 +0100 Subject: [PATCH 01/16] Checklist item & task updates --- .../2020_10_27_102330_create_tasks_table.php | 6 ++- ...0_27_102337_create_structure_for_tasks.php | 2 + ...3122_create_task_checklist_items_table.php | 26 +++++++++++ ...5_create_structure_for_checklist_items.php | 23 ++++++++++ ...7_19_134101_create_task_comments_table.php | 31 +++++++++++++ ...237_create_structure_for_task_comments.php | 12 +++++ routes/api.php | 21 +++------ routes/app/checklistItems.php | 20 +++++++++ routes/app/comments.php | 16 +++++++ routes/app/tasks.php | 37 ++++++++++++++++ routes/checklistItems.php | 20 +++++++++ routes/comments.php | 17 +++++++ src/AppServiceProvider.php | 3 ++ src/AuthServiceProvider.php | 3 ++ src/EnumServiceProvider.php | 2 + src/Enums/Statuses.php | 12 +++++ src/Forms/Builders/ChecklistItem.php | 33 ++++++++++++++ src/Forms/Builders/Task.php | 4 +- src/Forms/Templates/checklistItem.json | 39 ++++++++++++++++ src/Forms/Templates/task.json | 41 ++++++++++++++--- .../Controllers/ChecklistItems/Create.php | 14 ++++++ .../Controllers/ChecklistItems/Destroy.php | 20 +++++++++ src/Http/Controllers/ChecklistItems/Edit.php | 15 +++++++ .../Controllers/ChecklistItems/Options.php | 15 +++++++ src/Http/Controllers/ChecklistItems/Store.php | 22 ++++++++++ .../Controllers/ChecklistItems/Update.php | 18 ++++++++ src/Http/Controllers/Comments/Destroy.php | 21 +++++++++ src/Http/Controllers/Comments/Index.php | 23 ++++++++++ src/Http/Controllers/Comments/Store.php | 22 ++++++++++ src/Http/Controllers/Comments/Update.php | 26 +++++++++++ src/Http/Controllers/Tasks/Options.php | 15 +++++++ src/Http/Controllers/Tasks/Show.php | 21 +++++++++ src/Http/Requests/ValidateChecklistItem.php | 24 ++++++++++ src/Http/Requests/ValidateComment.php | 28 ++++++++++++ src/Http/Requests/ValidateCommentFetch.php | 17 +++++++ src/Http/Requests/ValidateTask.php | 5 ++- src/Http/Resources/ChecklistItems.php | 23 ++++++++++ src/Http/Resources/Comment.php | 33 ++++++++++++++ src/Http/Resources/Task.php | 29 +++++++++--- src/Models/ChecklistItem.php | 33 ++++++++++++++ src/Models/Comment.php | 22 ++++++++++ src/Models/Task.php | 40 ++++++++++++++--- src/Observers/ChecklistItem.php | 27 ++++++++++++ src/Policies/Comment.php | 44 +++++++++++++++++++ src/Tables/Builders/Task.php | 6 ++- src/Tables/Templates/tasks.json | 10 +++-- src/Upgrades/Permissions.php | 16 +++++++ src/Upgrades/Statuses.php | 42 ++++++++++++++++++ 48 files changed, 954 insertions(+), 45 deletions(-) create mode 100644 database/migrations/2022_06_29_133122_create_task_checklist_items_table.php create mode 100644 database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php create mode 100644 database/migrations/2022_07_19_134101_create_task_comments_table.php create mode 100644 database/migrations/2022_07_19_141237_create_structure_for_task_comments.php create mode 100644 routes/app/checklistItems.php create mode 100644 routes/app/comments.php create mode 100644 routes/app/tasks.php create mode 100644 routes/checklistItems.php create mode 100644 routes/comments.php create mode 100644 src/Enums/Statuses.php create mode 100644 src/Forms/Builders/ChecklistItem.php create mode 100644 src/Forms/Templates/checklistItem.json create mode 100644 src/Http/Controllers/ChecklistItems/Create.php create mode 100644 src/Http/Controllers/ChecklistItems/Destroy.php create mode 100644 src/Http/Controllers/ChecklistItems/Edit.php create mode 100644 src/Http/Controllers/ChecklistItems/Options.php create mode 100644 src/Http/Controllers/ChecklistItems/Store.php create mode 100644 src/Http/Controllers/ChecklistItems/Update.php create mode 100644 src/Http/Controllers/Comments/Destroy.php create mode 100644 src/Http/Controllers/Comments/Index.php create mode 100644 src/Http/Controllers/Comments/Store.php create mode 100644 src/Http/Controllers/Comments/Update.php create mode 100644 src/Http/Controllers/Tasks/Options.php create mode 100644 src/Http/Controllers/Tasks/Show.php create mode 100644 src/Http/Requests/ValidateChecklistItem.php create mode 100644 src/Http/Requests/ValidateComment.php create mode 100644 src/Http/Requests/ValidateCommentFetch.php create mode 100644 src/Http/Resources/ChecklistItems.php create mode 100644 src/Http/Resources/Comment.php create mode 100644 src/Models/ChecklistItem.php create mode 100644 src/Models/Comment.php create mode 100644 src/Observers/ChecklistItem.php create mode 100644 src/Policies/Comment.php create mode 100644 src/Upgrades/Permissions.php create mode 100644 src/Upgrades/Statuses.php diff --git a/database/migrations/2020_10_27_102330_create_tasks_table.php b/database/migrations/2020_10_27_102330_create_tasks_table.php index 075a2e8..7e04d23 100644 --- a/database/migrations/2020_10_27_102330_create_tasks_table.php +++ b/database/migrations/2020_10_27_102330_create_tasks_table.php @@ -16,9 +16,11 @@ public function up() $table->tinyInteger('flag')->nullable()->index(); - $table->boolean('completed')->index(); - $table->dateTime('reminder')->nullable(); + $table->smallInteger('status'); + $table->dateTime('from')->nullable(); + $table->dateTime('to')->nullable(); + $table->boolean('muted')->default(0); $table->unsignedInteger('allocated_to')->nullable()->index(); $table->foreign('allocated_to')->references('id')->on('users'); diff --git a/database/migrations/2020_10_27_102337_create_structure_for_tasks.php b/database/migrations/2020_10_27_102337_create_structure_for_tasks.php index 9c90464..f14651f 100644 --- a/database/migrations/2020_10_27_102337_create_structure_for_tasks.php +++ b/database/migrations/2020_10_27_102337_create_structure_for_tasks.php @@ -16,6 +16,8 @@ ['name' => 'tasks.exportExcel', 'description' => 'Export excel for tasks', 'is_default' => false], ['name' => 'tasks.count', 'description' => 'Get number of pending tasks', 'is_default' => false], ['name' => 'tasks.users', 'description' => 'Get user options for task allocation', 'is_default' => false], + ['name' => 'tasks.show', 'description' => 'Display task information', 'is_default' => true], + ['name' => 'tasks.options', 'description' => 'Get tasks options for select', 'is_default' => false] ]; protected array $menu = [ diff --git a/database/migrations/2022_06_29_133122_create_task_checklist_items_table.php b/database/migrations/2022_06_29_133122_create_task_checklist_items_table.php new file mode 100644 index 0000000..2528b8f --- /dev/null +++ b/database/migrations/2022_06_29_133122_create_task_checklist_items_table.php @@ -0,0 +1,26 @@ +id(); + $table->unsignedBigInteger('task_id'); + $table->foreign('task_id')->references('id')->on('tasks'); + $table->string('name'); + $table->unsignedInteger('order_index')->nullable(); + $table->boolean('is_completed'); + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('task_checklist_items'); + } +}; diff --git a/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php b/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php new file mode 100644 index 0000000..3c4ada7 --- /dev/null +++ b/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php @@ -0,0 +1,23 @@ + 'tasks.checklistItems.index', 'description' => 'Show index for task checklist items', 'is_default' => false], + + ['name' => 'tasks.checklistItems.create', 'description' => 'Create task checklist item', 'is_default' => false], + ['name' => 'tasks.checklistItems.store', 'description' => 'Store a new task checklist item', 'is_default' => false], + ['name' => 'tasks.checklistItems.edit', 'description' => 'Edit task checklist item', 'is_default' => false], + ['name' => 'tasks.checklistItems.update', 'description' => 'Update task checklist item', 'is_default' => false], + ['name' => 'tasks.checklistItems.destroy', 'description' => 'Delete task checklist item', 'is_default' => false], + + ['name' => 'tasks.checklistItems.options', 'description' => 'Get task checklist item options for select', 'is_default' => false], + ]; + + protected array $menu = []; + + protected ?string $parentMenu = null; +} + diff --git a/database/migrations/2022_07_19_134101_create_task_comments_table.php b/database/migrations/2022_07_19_134101_create_task_comments_table.php new file mode 100644 index 0000000..021cb09 --- /dev/null +++ b/database/migrations/2022_07_19_134101_create_task_comments_table.php @@ -0,0 +1,31 @@ +id(); + $table->unsignedBigInteger('task_id'); + $table->foreign('task_id')->references('id')->on('tasks'); + $table->text('body'); + + $table->unsignedInteger('created_by')->nullable()->index(); + $table->foreign('created_by')->references('id')->on('users'); + + $table->unsignedInteger('updated_by')->nullable()->index(); + $table->foreign('updated_by')->references('id')->on('users'); + + $table->timestamps(); + }); + } + + public function down() + { + Schema::dropIfExists('task_comments'); + } +}; diff --git a/database/migrations/2022_07_19_141237_create_structure_for_task_comments.php b/database/migrations/2022_07_19_141237_create_structure_for_task_comments.php new file mode 100644 index 0000000..4c2b03a --- /dev/null +++ b/database/migrations/2022_07_19_141237_create_structure_for_task_comments.php @@ -0,0 +1,12 @@ + 'tasks.comments.index', 'description' => 'List task comments for commentable', 'is_default' => true], + ['name' => 'tasks.comments.store', 'description' => 'Create task comment', 'is_default' => true], + ['name' => 'tasks.comments.update', 'description' => 'Update task edited comment', 'is_default' => true], + ['name' => 'tasks.comments.destroy', 'description' => 'Delete task comment', 'is_default' => true], + ]; +}; diff --git a/routes/api.php b/routes/api.php index 3c6f7c2..0e2a908 100644 --- a/routes/api.php +++ b/routes/api.php @@ -5,6 +5,8 @@ use LaravelEnso\Tasks\Http\Controllers\Tasks\Create; use LaravelEnso\Tasks\Http\Controllers\Tasks\Destroy; use LaravelEnso\Tasks\Http\Controllers\Tasks\Edit; +use LaravelEnso\Tasks\Http\Controllers\Tasks\Show; +use LaravelEnso\Tasks\Http\Controllers\Tasks\Options; use LaravelEnso\Tasks\Http\Controllers\Tasks\ExportExcel; use LaravelEnso\Tasks\Http\Controllers\Tasks\Index; use LaravelEnso\Tasks\Http\Controllers\Tasks\InitTable; @@ -17,20 +19,7 @@ ->prefix('api/tasks') ->as('tasks.') ->group(function () { - Route::get('create', Create::class)->name('create'); - Route::post('', Store::class)->name('store'); - Route::get('{task}/edit', Edit::class)->name('edit'); - - Route::patch('{task}', Update::class)->name('update'); - - Route::delete('{task}', Destroy::class)->name('destroy'); - - Route::get('initTable', InitTable::class)->name('initTable'); - Route::get('tableData', TableData::class)->name('tableData'); - Route::get('exportExcel', ExportExcel::class)->name('exportExcel'); - - Route::get('count', Count::class)->name('count'); - Route::get('', Index::class)->name('index'); - - Route::get('users', Users::class)->name('users'); + require __DIR__ . '/app/comments.php'; + require __DIR__ . '/app/tasks.php'; + require __DIR__ . '/app/checklistItems.php'; }); diff --git a/routes/app/checklistItems.php b/routes/app/checklistItems.php new file mode 100644 index 0000000..c500ba1 --- /dev/null +++ b/routes/app/checklistItems.php @@ -0,0 +1,20 @@ +as('checklistItems.') + ->group(function () { + Route::get('create', Create::class)->name('create'); + Route::post('', Store::class)->name('store'); + Route::get('{checklistItem}/edit', Edit::class)->name('edit'); + Route::patch('{checklistItem}', Update::class)->name('update'); + Route::delete('{checklistItem}', Destroy::class)->name('destroy'); + Route::get('options', Options::class)->name('options'); + }); diff --git a/routes/app/comments.php b/routes/app/comments.php new file mode 100644 index 0000000..18b73f6 --- /dev/null +++ b/routes/app/comments.php @@ -0,0 +1,16 @@ +as('comments.') + ->group(function () { + Route::get('', Index::class)->name('index'); + Route::post('', Store::class)->name('store'); + Route::patch('{comment}', Update::class)->name('update'); + Route::delete('{comment}', Destroy::class)->name('destroy'); + }); diff --git a/routes/app/tasks.php b/routes/app/tasks.php new file mode 100644 index 0000000..f914549 --- /dev/null +++ b/routes/app/tasks.php @@ -0,0 +1,37 @@ +name('create'); +Route::post('', Store::class)->name('store'); +Route::get('{task}/edit', Edit::class)->name('edit'); + +Route::patch('{task}', Update::class)->name('update'); + +Route::delete('{task}', Destroy::class)->name('destroy'); + +Route::get('initTable', InitTable::class)->name('initTable'); +Route::get('tableData', TableData::class)->name('tableData'); +Route::get('exportExcel', ExportExcel::class)->name('exportExcel'); + +Route::get('count', Count::class)->name('count'); +Route::get('', Index::class)->name('index'); + +Route::get('users', Users::class)->name('users'); + +Route::get('options', Options::class)->name('options'); +Route::get('{task}', Show::class)->name('show'); + diff --git a/routes/checklistItems.php b/routes/checklistItems.php new file mode 100644 index 0000000..c500ba1 --- /dev/null +++ b/routes/checklistItems.php @@ -0,0 +1,20 @@ +as('checklistItems.') + ->group(function () { + Route::get('create', Create::class)->name('create'); + Route::post('', Store::class)->name('store'); + Route::get('{checklistItem}/edit', Edit::class)->name('edit'); + Route::patch('{checklistItem}', Update::class)->name('update'); + Route::delete('{checklistItem}', Destroy::class)->name('destroy'); + Route::get('options', Options::class)->name('options'); + }); diff --git a/routes/comments.php b/routes/comments.php new file mode 100644 index 0000000..152934a --- /dev/null +++ b/routes/comments.php @@ -0,0 +1,17 @@ +as('comments.') + ->group(function () { + Route::get('', Index::class)->name('index'); + Route::post('', Store::class)->name('store'); + Route::patch('{comment}', Update::class)->name('update'); + Route::delete('{comment}', Destroy::class)->name('destroy'); + + }); diff --git a/src/AppServiceProvider.php b/src/AppServiceProvider.php index 5372ad4..76ab546 100644 --- a/src/AppServiceProvider.php +++ b/src/AppServiceProvider.php @@ -7,7 +7,9 @@ use LaravelEnso\DynamicMethods\Services\Methods; use LaravelEnso\Tasks\Commands\SendTaskReminders; use LaravelEnso\Tasks\DynamicRelations\Tasks; +use LaravelEnso\Tasks\Models\ChecklistItem; use LaravelEnso\Tasks\Models\Task as Model; +use LaravelEnso\Tasks\Observers\ChecklistItem as ChecklistItemObserver; use LaravelEnso\Tasks\Observers\Task as Observer; use LaravelEnso\Users\Models\User; @@ -20,6 +22,7 @@ public function boot() ->command() ->relations() ->observers(); + ChecklistItem::observe(ChecklistItemObserver::class); } private function load(): self diff --git a/src/AuthServiceProvider.php b/src/AuthServiceProvider.php index ec6d91f..5464e98 100644 --- a/src/AuthServiceProvider.php +++ b/src/AuthServiceProvider.php @@ -3,13 +3,16 @@ namespace LaravelEnso\Tasks; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; +use LaravelEnso\Tasks\Models\Comment; use LaravelEnso\Tasks\Models\Task; use LaravelEnso\Tasks\Policies\Task as Policy; +use LaravelEnso\Tasks\Policies\Comment as CommentPolicy; class AuthServiceProvider extends ServiceProvider { protected $policies = [ Task::class => Policy::class, + Comment::class => CommentPolicy::class, ]; public function boot() diff --git a/src/EnumServiceProvider.php b/src/EnumServiceProvider.php index b644633..61a833a 100644 --- a/src/EnumServiceProvider.php +++ b/src/EnumServiceProvider.php @@ -4,10 +4,12 @@ use LaravelEnso\Enums\EnumServiceProvider as ServiceProvider; use LaravelEnso\Tasks\Enums\Flags; +use LaravelEnso\Tasks\Enums\Statuses; class EnumServiceProvider extends ServiceProvider { public $register = [ 'flags' => Flags::class, + 'statuses' => Statuses::class, ]; } diff --git a/src/Enums/Statuses.php b/src/Enums/Statuses.php new file mode 100644 index 0000000..85f3e31 --- /dev/null +++ b/src/Enums/Statuses.php @@ -0,0 +1,12 @@ +form = new Form($this->templatePath()); + } + + public function create() + { + return $this->form->create(); + } + + public function edit(Model $checklist) + { + return $this->form->edit($checklist); + } + + protected function templatePath(): string + { + return self::TemplatePath; + } +} diff --git a/src/Forms/Builders/Task.php b/src/Forms/Builders/Task.php index 3fed158..61f27e7 100644 --- a/src/Forms/Builders/Task.php +++ b/src/Forms/Builders/Task.php @@ -4,6 +4,7 @@ use Illuminate\Support\Facades\Auth; use LaravelEnso\Forms\Services\Form; +use LaravelEnso\Tasks\Enums\Statuses; use LaravelEnso\Tasks\Models\Task as Model; class Task @@ -21,8 +22,9 @@ public function __construct() public function create() { - return $this->form->hide('completed') + return $this->form->hide('status') ->value('allocated_to', Auth::id()) + ->value('status', Statuses::New) ->create(); } diff --git a/src/Forms/Templates/checklistItem.json b/src/Forms/Templates/checklistItem.json new file mode 100644 index 0000000..0567161 --- /dev/null +++ b/src/Forms/Templates/checklistItem.json @@ -0,0 +1,39 @@ +{ + "routePrefix": "tasks.checklistItems", + "sections": [{ + "columns": "custom", + "fields": [ + { + "column": 4, + "label": "Name", + "name": "name", + "value": "", + "meta": { + "type": "input", + "content": "text" + } + }, + { + "column": 3, + "label": "Completed", + "name": "is_completed", + "value": false, + "meta": { + "type": "input", + "content": "checkbox" + } + }, + { + "column": 3, + "label": "Task", + "name": "task_id", + "value": null, + "meta": { + "type": "select", + "options": [], + "source": "tasks.options" + } + } + ] + }] +} diff --git a/src/Forms/Templates/task.json b/src/Forms/Templates/task.json index f0f91a4..5045209 100644 --- a/src/Forms/Templates/task.json +++ b/src/Forms/Templates/task.json @@ -26,7 +26,7 @@ ] }, { - "columns": 3, + "columns": 2, "fields": [ { "label": "Allocated To", @@ -50,12 +50,39 @@ } }, { - "label": "Completed", - "name": "completed", - "value": false, + "label": "Status", + "name": "status", + "value": null, "meta": { - "type": "input", - "content": "checkbox" + "type": "select", + "options": "LaravelEnso\\Tasks\\Enums\\Statuses" + } + } + ] + }, + { + "columns": 2, + "fields": [ + { + "label": "From", + "name": "from", + "value": "", + "meta": { + "type": "datepicker", + "altFormat": "m-d-Y H:i", + "format": "Y-m-d H:i:s", + "time": true + } + }, + { + "label": "To", + "name": "to", + "value": "", + "meta": { + "type": "datepicker", + "altFormat": "m-d-Y H:i", + "format": "Y-m-d H:i:s", + "time": true } } ] @@ -74,4 +101,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/src/Http/Controllers/ChecklistItems/Create.php b/src/Http/Controllers/ChecklistItems/Create.php new file mode 100644 index 0000000..69f6c52 --- /dev/null +++ b/src/Http/Controllers/ChecklistItems/Create.php @@ -0,0 +1,14 @@ + $form->create()]; + } +} diff --git a/src/Http/Controllers/ChecklistItems/Destroy.php b/src/Http/Controllers/ChecklistItems/Destroy.php new file mode 100644 index 0000000..dff0701 --- /dev/null +++ b/src/Http/Controllers/ChecklistItems/Destroy.php @@ -0,0 +1,20 @@ +delete(); + + return [ + 'message' => __('The checklist item was successfully deleted'), + 'redirect' => 'checklists.index', + ]; + } +} diff --git a/src/Http/Controllers/ChecklistItems/Edit.php b/src/Http/Controllers/ChecklistItems/Edit.php new file mode 100644 index 0000000..ba79f49 --- /dev/null +++ b/src/Http/Controllers/ChecklistItems/Edit.php @@ -0,0 +1,15 @@ + $form->edit($checklistItem)]; + } +} diff --git a/src/Http/Controllers/ChecklistItems/Options.php b/src/Http/Controllers/ChecklistItems/Options.php new file mode 100644 index 0000000..b538b34 --- /dev/null +++ b/src/Http/Controllers/ChecklistItems/Options.php @@ -0,0 +1,15 @@ +fill($request->validated())->save(); + + return [ + 'message' => __('The checklist item was successfully created'), + 'redirect' => 'taskChecklistItems.edit', + 'param' => ['checklist' => $checklistItem->id], + ]; + } +} diff --git a/src/Http/Controllers/ChecklistItems/Update.php b/src/Http/Controllers/ChecklistItems/Update.php new file mode 100644 index 0000000..20bd2ca --- /dev/null +++ b/src/Http/Controllers/ChecklistItems/Update.php @@ -0,0 +1,18 @@ +update($request->validated()); + + return ['message' => __('The checklist item was successfully updated')]; + } +} diff --git a/src/Http/Controllers/Comments/Destroy.php b/src/Http/Controllers/Comments/Destroy.php new file mode 100644 index 0000000..a0852fe --- /dev/null +++ b/src/Http/Controllers/Comments/Destroy.php @@ -0,0 +1,21 @@ +authorize('destroy', $comment); + + $comment->delete(); + + return ['count' => $comment->count()]; + } +} diff --git a/src/Http/Controllers/Comments/Index.php b/src/Http/Controllers/Comments/Index.php new file mode 100644 index 0000000..5f8513f --- /dev/null +++ b/src/Http/Controllers/Comments/Index.php @@ -0,0 +1,23 @@ +task_id)->latest() + ->with('createdBy.person', 'createdBy.avatar', 'updatedBy') + ->get(); + + return Resource::collection($comments)->additional([ + 'humanReadableDates' => Config::get('enso.comments.humanReadableDates'), + ]); + } +} diff --git a/src/Http/Controllers/Comments/Store.php b/src/Http/Controllers/Comments/Store.php new file mode 100644 index 0000000..6c6e0b8 --- /dev/null +++ b/src/Http/Controllers/Comments/Store.php @@ -0,0 +1,22 @@ +fill($request->validatedExcept( 'path')); + + tap($comment)->save(); + + return new Resource($comment->load([ + 'createdBy.person', 'createdBy.avatar' + ])); + } +} diff --git a/src/Http/Controllers/Comments/Update.php b/src/Http/Controllers/Comments/Update.php new file mode 100644 index 0000000..f33c508 --- /dev/null +++ b/src/Http/Controllers/Comments/Update.php @@ -0,0 +1,26 @@ +authorize('update', $comment); + + tap($comment)->update($request->only('body')); + + return new Resource($comment->load([ + 'createdBy.person', 'createdBy.avatar', 'updatedBy', + ])); + } +} diff --git a/src/Http/Controllers/Tasks/Options.php b/src/Http/Controllers/Tasks/Options.php new file mode 100644 index 0000000..5ae950a --- /dev/null +++ b/src/Http/Controllers/Tasks/Options.php @@ -0,0 +1,15 @@ +authorize('handle', $task); + + return ['task' => new Resource($task->load(['checklistItem', 'allocatedTo', 'activity:id,name', + 'allocatedTo.avatar', 'allocatedTo.person','createdBy','createdBy.person']))]; + } +} diff --git a/src/Http/Requests/ValidateChecklistItem.php b/src/Http/Requests/ValidateChecklistItem.php new file mode 100644 index 0000000..d7b16b3 --- /dev/null +++ b/src/Http/Requests/ValidateChecklistItem.php @@ -0,0 +1,24 @@ + ['required', 'string', $this->unique('name'), 'max:255'], + 'task_id' => ['required', 'exists:tasks,id'], + 'is_completed' => 'required|boolean' + ]; + } + + protected function unique(string $attribute) + { + return Rule::unique('task_checklist_items', $attribute) + ->ignore($this->route('checklistItem')?->id); + } +} diff --git a/src/Http/Requests/ValidateComment.php b/src/Http/Requests/ValidateComment.php new file mode 100644 index 0000000..5612842 --- /dev/null +++ b/src/Http/Requests/ValidateComment.php @@ -0,0 +1,28 @@ + "{$this->requiredOrFilled()}|exists:tasks,id", + 'body' => "{$this->requiredOrFilled()}|required", + 'path' => "{$this->requiredOrFilled()}", + ]; + } + + private function requiredOrFilled() + { + return $this->method() === 'POST' + ? 'required' + : 'filled'; + } + +} diff --git a/src/Http/Requests/ValidateCommentFetch.php b/src/Http/Requests/ValidateCommentFetch.php new file mode 100644 index 0000000..1a4d4bb --- /dev/null +++ b/src/Http/Requests/ValidateCommentFetch.php @@ -0,0 +1,17 @@ + "required" + ]; + } + +} diff --git a/src/Http/Requests/ValidateTask.php b/src/Http/Requests/ValidateTask.php index bd9054c..d9b89fc 100644 --- a/src/Http/Requests/ValidateTask.php +++ b/src/Http/Requests/ValidateTask.php @@ -21,8 +21,11 @@ public function rules() 'description' => 'filled', 'flag' => 'nullable|in:'.Flags::keys()->implode(','), 'reminder' => 'nullable|date', + 'from' => 'nullable|date', + 'to' => 'nullable|date', + 'muted' => 'nullable|boolean', 'allocated_to' => "{$this->requiredOrFilled()}|exists:users,id", - 'completed' => "{$this->requiredOrFilled()}|boolean", + 'status' => "{$this->requiredOrFilled()}", ]; } diff --git a/src/Http/Resources/ChecklistItems.php b/src/Http/Resources/ChecklistItems.php new file mode 100644 index 0000000..f6528bd --- /dev/null +++ b/src/Http/Resources/ChecklistItems.php @@ -0,0 +1,23 @@ + $this->id, + 'name' => $this->name, + 'description' => $this->description, + 'taskId' => $this->task_id, + 'isCompleted' => $this->is_completed, + 'orderIndex' => $this->order_index, + 'createdAt' => Carbon::parse($this->order_index)->format('d-m-Y H:i') + ]; + } +} diff --git a/src/Http/Resources/Comment.php b/src/Http/Resources/Comment.php new file mode 100644 index 0000000..5e3ffb9 --- /dev/null +++ b/src/Http/Resources/Comment.php @@ -0,0 +1,33 @@ + $this->id, + 'body' => $this->body, + 'owner' => new User($this->whenLoaded('createdBy')), + 'isEditable' => $this->isEditable($request), + 'isDeletable' => $this->isDeletable($request), + 'createdAt' => $this->created_at->toDatetimeString(), + 'updatedAt' => $this->updated_at->toDatetimeString(), + ]; + } + + public function isEditable($request) + { + return $request->user()->can('update', $this->resource); + } + + public function isDeletable($request) + { + return $request->user()->can('destroy', $this->resource); + } +} diff --git a/src/Http/Resources/Task.php b/src/Http/Resources/Task.php index 36e556a..b4f4ab0 100644 --- a/src/Http/Resources/Task.php +++ b/src/Http/Resources/Task.php @@ -2,19 +2,38 @@ namespace LaravelEnso\Tasks\Http\Resources; +use LaravelEnso\Tasks\Http\Resources\ChecklistItems; +use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; +use LaravelEnso\Users\Http\Resources\User; class Task extends JsonResource { public function toArray($request) { return [ - 'id' => $this->id, - 'name' => $this->name, + 'id' => $this->id, + 'name' => $this->name, 'description' => $this->description, - 'flag' => $this->flag, - 'overdue' => $this->overdue(), - 'reminder' => $this->reminder, + 'reminder' => Carbon::parse($this->reminder)->format('d-m-Y H:i'), + 'from' => $this->from ? Carbon::parse($this->from)->format('d M Y') : null, + 'to' => Carbon::parse($this->to)->format('d M Y'), + 'muted' => $this->muted, + 'status' => $this->status, + 'flag' => $this->flag, + 'overdue' => $this->overdue(), + 'remindedAt' => $this->reminded_at, + 'allocatedTo' => new User($this->whenLoaded('allocatedTo')), + 'createdBy' => new User($this->whenLoaded('createdBy')), + 'taskChecklistItems' => ChecklistItems::collection($this->whenLoaded('checklistItem')), + 'completedTaskChecklistItems' => $this->completedTaskChecklistItems(), + 'createdAt' => Carbon::parse($this->created_at)->format('d-m-Y H:i'), + 'updatedAt' => Carbon::parse($this->updated_at)->diffForHumans(), ]; } + + public function completedTaskChecklistItems() + { + return "{$this->checklistItem()->completed()->count()}/{$this->checklistItem->count()}"; + } } diff --git a/src/Models/ChecklistItem.php b/src/Models/ChecklistItem.php new file mode 100644 index 0000000..e4e2dfb --- /dev/null +++ b/src/Models/ChecklistItem.php @@ -0,0 +1,33 @@ + 'boolean']; + + + public function task() + { + return $this->belongsTo(Task::class); + } + + public function scopeCompleted($query) + { + return $query->whereIsCompleted(true); + } + + public function scopePending($query) + { + return $query->whereIsCompleted(false); + } +} diff --git a/src/Models/Comment.php b/src/Models/Comment.php new file mode 100644 index 0000000..61ac08b --- /dev/null +++ b/src/Models/Comment.php @@ -0,0 +1,22 @@ + 'boolean']; + protected $casts = []; public function allocatedTo(): Relation { @@ -47,19 +48,19 @@ public function scopeVisible($query) $user = Auth::user(); $superiorUser = $user->isAdmin() || $user->isSupervisor(); - return $query->when(!$superiorUser, fn ($query) => $query - ->where(fn ($query) => $query->whereCreatedBy($user->id) + return $query->when(!$superiorUser, fn($query) => $query + ->where(fn($query) => $query->whereCreatedBy($user->id) ->orWhere('allocated_to', $user->id))); } public function scopePending($query) { - return $query->whereCompleted(false); + return $query->whereStatus(Statuses::Progress); } public function scopeCompleted($query) { - return $query->whereCompleted(true); + return $query->whereStatus(Statuses::Finished); } public function setReminderAttribute($dateTime) @@ -81,7 +82,32 @@ public function remind() public function overdue(): bool { - return !$this->completed + return $this->status != Statuses::Finished && $this->reminder?->lessThan(Carbon::now()); } + + public function checklistItem() + { + return $this->hasMany(ChecklistItem::class); + } + + public function comments() + { + return $this->hasMany(Comment::class); + } + + public function updateStatus() + { + $completedChecklist = $this->checklistItem()->completed()->count(); + + $count = $this->checklistItem()->count(); + + $status = match ($completedChecklist) { + $count => Statuses::Finished, + 0 => Statuses::New, + default => Statuses::Progress, + }; + + $this->update(['status' => $status]); + } } diff --git a/src/Observers/ChecklistItem.php b/src/Observers/ChecklistItem.php new file mode 100644 index 0000000..a2ea0a4 --- /dev/null +++ b/src/Observers/ChecklistItem.php @@ -0,0 +1,27 @@ +task->updateStatus(); + } + + public function updated(Model $checklist) + { + if ($checklist->isDirty('is_completed')) { + $checklist->task->updateStatus(); + } + } + + public function deleted(Model $checklist) + { + $checklist->task->updateStatus(); + } + + +} diff --git a/src/Policies/Comment.php b/src/Policies/Comment.php new file mode 100644 index 0000000..b465906 --- /dev/null +++ b/src/Policies/Comment.php @@ -0,0 +1,44 @@ +isAdmin() || $user->isSupervisor()) { + return true; + } + } + + public function update(User $user, Model $comment) + { + return $this->ownsComment($user, $comment) + && $this->isRecent($comment); + } + + public function destroy(User $user, Model $comment) + { + return $this->ownsComment($user, $comment) + && $this->isRecent($comment); + } + + private function ownsComment(User $user, Model $comment) + { + return $user->id === (int)$comment->created_by; + } + + private function isRecent(Model $comment) + { + return $comment->created_at->diffInSeconds(Carbon::now()) + < Config::get('enso.comments.editableTimeLimit'); + } +} diff --git a/src/Tables/Builders/Task.php b/src/Tables/Builders/Task.php index 4c61c90..b193dac 100644 --- a/src/Tables/Builders/Task.php +++ b/src/Tables/Builders/Task.php @@ -10,6 +10,7 @@ use LaravelEnso\Tables\Contracts\ConditionalActions; use LaravelEnso\Tables\Contracts\CustomFilter; use LaravelEnso\Tables\Contracts\Table; +use LaravelEnso\Tasks\Enums\Statuses; use LaravelEnso\Tasks\Models\Task as Model; class Task implements Table, AuthenticatesOnExport, CustomFilter, ConditionalActions @@ -19,13 +20,14 @@ class Task implements Table, AuthenticatesOnExport, CustomFilter, ConditionalAct public function query(): Builder { $now = Carbon::now(); - $overdue = "completed = true and reminder >= '{$now}'"; + $finished = Statuses::Finished; + $overdue = "status = '$finished' and reminder >= '{$now}'"; return Model::visible() ->with('createdBy.avatar', 'createdBy.person') ->with('allocatedTo.avatar', 'allocatedTo.person') ->selectRaw(" - tasks.id, tasks.name, tasks.description, tasks.flag, tasks.completed, + tasks.id, tasks.name, tasks.description, tasks.flag, tasks.status, tasks.allocated_to, tasks.reminder, tasks.reminder as rawReminder, created_by, created_at, {$overdue} as overdue "); diff --git a/src/Tables/Templates/tasks.json b/src/Tables/Templates/tasks.json index a0ee75f..a8398b6 100644 --- a/src/Tables/Templates/tasks.json +++ b/src/Tables/Templates/tasks.json @@ -6,6 +6,7 @@ "excel", "create", "edit", + "show", "destroy" ], "strip": ["allocated_to", "created_by"], @@ -46,13 +47,14 @@ "notExportable" ] }, { - "label": "Completed", - "name": "completed", - "data": "tasks.completed", + "label": "Status", + "name": "status", + "data": "tasks.status", "meta": [ "sortable", "slot" - ] + ], + "enum": "LaravelEnso\\Tasks\\Enums\\Statuses" }, { "label": "Created At", "name": "created_at", diff --git a/src/Upgrades/Permissions.php b/src/Upgrades/Permissions.php new file mode 100644 index 0000000..e0138c4 --- /dev/null +++ b/src/Upgrades/Permissions.php @@ -0,0 +1,16 @@ + 'tasks.show', 'description' => 'Display task information', 'is_default' => true], + ['name' => 'tasks.options', 'description' => 'Get tasks options for select', 'is_default' => false] + ]; +} diff --git a/src/Upgrades/Statuses.php b/src/Upgrades/Statuses.php new file mode 100644 index 0000000..7c85352 --- /dev/null +++ b/src/Upgrades/Statuses.php @@ -0,0 +1,42 @@ +smallInteger('status')->nullable()->after('reminder'); + }); + } + + public function migrateData(): void + { + Task::whereCompleted(false) + ->update(['status' => StatusesEnum::New]); + Task::whereCompleted(true) + ->update(['status' => StatusesEnum::Finished]); + } + + public function migratePostDataMigration(): void + { + Schema::table('tasks', function ($table) { + $table->smallInteger('status')->nullable('false')->change(); + $table->dropColumn('completed'); + }); + } +} From 83e14d8f1280b1547b54399bbdba62f896fd60ac Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Tue, 2 Aug 2022 07:10:06 +0100 Subject: [PATCH 02/16] Alter table to tinyinteger --- .../migrations/2020_10_27_102330_create_tasks_table.php | 2 +- src/Upgrades/Statuses.php | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/database/migrations/2020_10_27_102330_create_tasks_table.php b/database/migrations/2020_10_27_102330_create_tasks_table.php index 7e04d23..c759f3a 100644 --- a/database/migrations/2020_10_27_102330_create_tasks_table.php +++ b/database/migrations/2020_10_27_102330_create_tasks_table.php @@ -17,7 +17,7 @@ public function up() $table->tinyInteger('flag')->nullable()->index(); $table->dateTime('reminder')->nullable(); - $table->smallInteger('status'); + $table->tinyInteger('status'); $table->dateTime('from')->nullable(); $table->dateTime('to')->nullable(); $table->boolean('muted')->default(0); diff --git a/src/Upgrades/Statuses.php b/src/Upgrades/Statuses.php index 7c85352..8498e77 100644 --- a/src/Upgrades/Statuses.php +++ b/src/Upgrades/Statuses.php @@ -2,6 +2,7 @@ namespace LaravelEnso\Tasks\Upgrades; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; use LaravelEnso\Tasks\Enums\Statuses as StatusesEnum; use LaravelEnso\Upgrade\Contracts\MigratesTable; @@ -20,7 +21,7 @@ public function isMigrated(): bool public function migrateTable(): void { Schema::table('tasks', function ($table) { - $table->smallInteger('status')->nullable()->after('reminder'); + $table->tinyInteger('status')->nullable()->after('reminder'); }); } @@ -35,8 +36,11 @@ public function migrateData(): void public function migratePostDataMigration(): void { Schema::table('tasks', function ($table) { - $table->smallInteger('status')->nullable('false')->change(); $table->dropColumn('completed'); }); + + if (DB::getDriverName() === 'mysql') { + DB::statement('ALTER TABLE `tasks` CHANGE status status TINYINT(3) NOT NULL'); + } } } From 2a177c820713cbef19689613d35d94d14f966579 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Tue, 2 Aug 2022 09:24:24 +0100 Subject: [PATCH 03/16] Upgrades | Files to add task columns (from, to, muted) --- src/Upgrades/From.php | 23 +++++++++++++++++++++++ src/Upgrades/Muted.php | 23 +++++++++++++++++++++++ src/Upgrades/To.php | 23 +++++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 src/Upgrades/From.php create mode 100644 src/Upgrades/Muted.php create mode 100644 src/Upgrades/To.php diff --git a/src/Upgrades/From.php b/src/Upgrades/From.php new file mode 100644 index 0000000..998724f --- /dev/null +++ b/src/Upgrades/From.php @@ -0,0 +1,23 @@ +dateTime('from')->nullable()->after('reminder'); + }); + } + +} diff --git a/src/Upgrades/Muted.php b/src/Upgrades/Muted.php new file mode 100644 index 0000000..d424cb8 --- /dev/null +++ b/src/Upgrades/Muted.php @@ -0,0 +1,23 @@ +dateTime('muted')->nullable()->after('reminder'); + }); + } + +} diff --git a/src/Upgrades/To.php b/src/Upgrades/To.php new file mode 100644 index 0000000..ac1d71b --- /dev/null +++ b/src/Upgrades/To.php @@ -0,0 +1,23 @@ +dateTime('to')->nullable()->after('reminder'); + }); + } + +} From 8cdb2f6e25d4645e00e4aa22650b570390efbfe4 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Tue, 2 Aug 2022 09:32:49 +0100 Subject: [PATCH 04/16] Changes --- database/migrations/2020_10_27_102330_create_tasks_table.php | 1 + 1 file changed, 1 insertion(+) diff --git a/database/migrations/2020_10_27_102330_create_tasks_table.php b/database/migrations/2020_10_27_102330_create_tasks_table.php index c759f3a..d64208f 100644 --- a/database/migrations/2020_10_27_102330_create_tasks_table.php +++ b/database/migrations/2020_10_27_102330_create_tasks_table.php @@ -16,6 +16,7 @@ public function up() $table->tinyInteger('flag')->nullable()->index(); + $table->boolean('completed')->index(); $table->dateTime('reminder')->nullable(); $table->tinyInteger('status'); $table->dateTime('from')->nullable(); From 9959b3176c6cd24470b3ce95e353ca9411506928 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Tue, 2 Aug 2022 09:35:51 +0100 Subject: [PATCH 05/16] Changes. --- routes/checklistItems.php | 20 -------------------- routes/comments.php | 17 ----------------- 2 files changed, 37 deletions(-) delete mode 100644 routes/checklistItems.php delete mode 100644 routes/comments.php diff --git a/routes/checklistItems.php b/routes/checklistItems.php deleted file mode 100644 index c500ba1..0000000 --- a/routes/checklistItems.php +++ /dev/null @@ -1,20 +0,0 @@ -as('checklistItems.') - ->group(function () { - Route::get('create', Create::class)->name('create'); - Route::post('', Store::class)->name('store'); - Route::get('{checklistItem}/edit', Edit::class)->name('edit'); - Route::patch('{checklistItem}', Update::class)->name('update'); - Route::delete('{checklistItem}', Destroy::class)->name('destroy'); - Route::get('options', Options::class)->name('options'); - }); diff --git a/routes/comments.php b/routes/comments.php deleted file mode 100644 index 152934a..0000000 --- a/routes/comments.php +++ /dev/null @@ -1,17 +0,0 @@ -as('comments.') - ->group(function () { - Route::get('', Index::class)->name('index'); - Route::post('', Store::class)->name('store'); - Route::patch('{comment}', Update::class)->name('update'); - Route::delete('{comment}', Destroy::class)->name('destroy'); - - }); From a8433cf8030d22792f4d8cb38cb342e2efe268a1 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Tue, 2 Aug 2022 09:40:29 +0100 Subject: [PATCH 06/16] Route fix. --- src/Http/Controllers/ChecklistItems/Store.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Controllers/ChecklistItems/Store.php b/src/Http/Controllers/ChecklistItems/Store.php index 628cc07..78d029c 100644 --- a/src/Http/Controllers/ChecklistItems/Store.php +++ b/src/Http/Controllers/ChecklistItems/Store.php @@ -15,7 +15,7 @@ public function __invoke(ValidateChecklistItem $request, ChecklistItem $checklis return [ 'message' => __('The checklist item was successfully created'), - 'redirect' => 'taskChecklistItems.edit', + 'redirect' => 'tasks.checklistItems.edit', 'param' => ['checklist' => $checklistItem->id], ]; } From f9872de3d076d9256098be929149474b218c9346 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Tue, 2 Aug 2022 09:44:56 +0100 Subject: [PATCH 07/16] Change. --- src/Http/Controllers/Tasks/Show.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Controllers/Tasks/Show.php b/src/Http/Controllers/Tasks/Show.php index 5d68099..9f077e9 100644 --- a/src/Http/Controllers/Tasks/Show.php +++ b/src/Http/Controllers/Tasks/Show.php @@ -15,7 +15,7 @@ public function __invoke(Task $task) { $this->authorize('handle', $task); - return ['task' => new Resource($task->load(['checklistItem', 'allocatedTo', 'activity:id,name', + return ['task' => new Resource($task->load(['checklistItem', 'allocatedTo', 'allocatedTo.avatar', 'allocatedTo.person','createdBy','createdBy.person']))]; } } From a8b1381f99777f2c95c6f825856d882e1fd5be56 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Wed, 3 Aug 2022 02:41:16 +0100 Subject: [PATCH 08/16] Update checklist items files. --- src/Forms/Builders/ChecklistItem.php | 33 ---------------------- src/Forms/Templates/checklistItem.json | 39 -------------------------- 2 files changed, 72 deletions(-) delete mode 100644 src/Forms/Builders/ChecklistItem.php delete mode 100644 src/Forms/Templates/checklistItem.json diff --git a/src/Forms/Builders/ChecklistItem.php b/src/Forms/Builders/ChecklistItem.php deleted file mode 100644 index 61cdee1..0000000 --- a/src/Forms/Builders/ChecklistItem.php +++ /dev/null @@ -1,33 +0,0 @@ -form = new Form($this->templatePath()); - } - - public function create() - { - return $this->form->create(); - } - - public function edit(Model $checklist) - { - return $this->form->edit($checklist); - } - - protected function templatePath(): string - { - return self::TemplatePath; - } -} diff --git a/src/Forms/Templates/checklistItem.json b/src/Forms/Templates/checklistItem.json deleted file mode 100644 index 0567161..0000000 --- a/src/Forms/Templates/checklistItem.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "routePrefix": "tasks.checklistItems", - "sections": [{ - "columns": "custom", - "fields": [ - { - "column": 4, - "label": "Name", - "name": "name", - "value": "", - "meta": { - "type": "input", - "content": "text" - } - }, - { - "column": 3, - "label": "Completed", - "name": "is_completed", - "value": false, - "meta": { - "type": "input", - "content": "checkbox" - } - }, - { - "column": 3, - "label": "Task", - "name": "task_id", - "value": null, - "meta": { - "type": "select", - "options": [], - "source": "tasks.options" - } - } - ] - }] -} From e51af082f14f0a059af63d4ca7cddccd4c838084 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Wed, 3 Aug 2022 02:56:51 +0100 Subject: [PATCH 09/16] Update checklist items relationship name --- src/Http/Controllers/Tasks/Show.php | 2 +- src/Http/Resources/Task.php | 4 ++-- src/Models/Task.php | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Http/Controllers/Tasks/Show.php b/src/Http/Controllers/Tasks/Show.php index 9f077e9..a093240 100644 --- a/src/Http/Controllers/Tasks/Show.php +++ b/src/Http/Controllers/Tasks/Show.php @@ -15,7 +15,7 @@ public function __invoke(Task $task) { $this->authorize('handle', $task); - return ['task' => new Resource($task->load(['checklistItem', 'allocatedTo', + return ['task' => new Resource($task->load(['checklistItems', 'allocatedTo', 'allocatedTo.avatar', 'allocatedTo.person','createdBy','createdBy.person']))]; } } diff --git a/src/Http/Resources/Task.php b/src/Http/Resources/Task.php index b4f4ab0..5aac1d7 100644 --- a/src/Http/Resources/Task.php +++ b/src/Http/Resources/Task.php @@ -25,7 +25,7 @@ public function toArray($request) 'remindedAt' => $this->reminded_at, 'allocatedTo' => new User($this->whenLoaded('allocatedTo')), 'createdBy' => new User($this->whenLoaded('createdBy')), - 'taskChecklistItems' => ChecklistItems::collection($this->whenLoaded('checklistItem')), + 'taskChecklistItems' => ChecklistItems::collection($this->whenLoaded('checklistItems')), 'completedTaskChecklistItems' => $this->completedTaskChecklistItems(), 'createdAt' => Carbon::parse($this->created_at)->format('d-m-Y H:i'), 'updatedAt' => Carbon::parse($this->updated_at)->diffForHumans(), @@ -34,6 +34,6 @@ public function toArray($request) public function completedTaskChecklistItems() { - return "{$this->checklistItem()->completed()->count()}/{$this->checklistItem->count()}"; + return "{$this->checklistItems()->completed()->count()}/{$this->checklistItems->count()}"; } } diff --git a/src/Models/Task.php b/src/Models/Task.php index 1303bab..7532ee1 100644 --- a/src/Models/Task.php +++ b/src/Models/Task.php @@ -86,7 +86,7 @@ public function overdue(): bool && $this->reminder?->lessThan(Carbon::now()); } - public function checklistItem() + public function checklistItems() { return $this->hasMany(ChecklistItem::class); } @@ -98,9 +98,9 @@ public function comments() public function updateStatus() { - $completedChecklist = $this->checklistItem()->completed()->count(); + $completedChecklist = $this->checklistItems()->completed()->count(); - $count = $this->checklistItem()->count(); + $count = $this->checklistItems()->count(); $status = match ($completedChecklist) { $count => Statuses::Finished, From a26b49c88c632dc754de62ee977465058357596a Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Fri, 5 Aug 2022 13:59:14 +0100 Subject: [PATCH 10/16] Remove permissions. --- .../2022_06_29_133125_create_structure_for_checklist_items.php | 2 -- src/Http/Resources/ChecklistItems.php | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php b/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php index 3c4ada7..62a5cca 100644 --- a/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php +++ b/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php @@ -7,9 +7,7 @@ class CreateStructureForChecklistItems extends Migration protected array $permissions = [ ['name' => 'tasks.checklistItems.index', 'description' => 'Show index for task checklist items', 'is_default' => false], - ['name' => 'tasks.checklistItems.create', 'description' => 'Create task checklist item', 'is_default' => false], ['name' => 'tasks.checklistItems.store', 'description' => 'Store a new task checklist item', 'is_default' => false], - ['name' => 'tasks.checklistItems.edit', 'description' => 'Edit task checklist item', 'is_default' => false], ['name' => 'tasks.checklistItems.update', 'description' => 'Update task checklist item', 'is_default' => false], ['name' => 'tasks.checklistItems.destroy', 'description' => 'Delete task checklist item', 'is_default' => false], diff --git a/src/Http/Resources/ChecklistItems.php b/src/Http/Resources/ChecklistItems.php index f6528bd..c3bce87 100644 --- a/src/Http/Resources/ChecklistItems.php +++ b/src/Http/Resources/ChecklistItems.php @@ -17,7 +17,7 @@ public function toArray($request) 'taskId' => $this->task_id, 'isCompleted' => $this->is_completed, 'orderIndex' => $this->order_index, - 'createdAt' => Carbon::parse($this->order_index)->format('d-m-Y H:i') + 'createdAt' => Carbon::parse($this->created_at)->format('d-m-Y H:i') ]; } } From 924a63f0e947e3ca9d0ca0fc7a37b1d615484bc2 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Thu, 11 Aug 2022 06:46:26 +0100 Subject: [PATCH 11/16] Fix failing CI/CD test --- .../2020_10_27_102330_create_tasks_table.php | 4 +-- ...0_27_102337_create_structure_for_tasks.php | 5 ++- ...3122_create_task_checklist_items_table.php | 5 +-- ...5_create_structure_for_checklist_items.php | 3 +- ...7_19_134101_create_task_comments_table.php | 3 +- routes/api.php | 19 ++--------- routes/app/checklistItems.php | 2 +- routes/app/comments.php | 2 +- routes/app/tasks.php | 5 ++- src/AuthServiceProvider.php | 4 +-- src/EnumServiceProvider.php | 2 +- src/Enums/Statuses.php | 11 ++++++- .../Controllers/ChecklistItems/Create.php | 2 +- .../Controllers/ChecklistItems/Destroy.php | 6 ++-- src/Http/Controllers/ChecklistItems/Edit.php | 2 +- .../Controllers/ChecklistItems/Options.php | 3 +- src/Http/Controllers/ChecklistItems/Store.php | 8 ++--- .../Controllers/ChecklistItems/Update.php | 4 +-- src/Http/Controllers/Comments/Index.php | 4 +-- src/Http/Controllers/Comments/Store.php | 6 ++-- src/Http/Controllers/Comments/Update.php | 5 ++- src/Http/Controllers/Tasks/Options.php | 3 +- src/Http/Controllers/Tasks/Show.php | 2 +- src/Http/Requests/ValidateChecklistItem.php | 4 +-- src/Http/Requests/ValidateComment.php | 7 ++-- src/Http/Requests/ValidateCommentFetch.php | 4 +-- src/Http/Requests/ValidateTask.php | 8 ++--- src/Http/Resources/ChecklistItems.php | 11 +++---- src/Http/Resources/Comment.php | 13 ++++---- src/Http/Resources/Task.php | 33 +++++++++---------- src/Models/Comment.php | 8 ++--- src/Models/Task.php | 14 ++++---- src/Observers/ChecklistItem.php | 2 -- src/Policies/Comment.php | 6 ++-- src/Upgrades/From.php | 1 - src/Upgrades/Muted.php | 1 - src/Upgrades/Permissions.php | 2 +- src/Upgrades/Statuses.php | 4 +-- src/Upgrades/To.php | 1 - 39 files changed, 104 insertions(+), 125 deletions(-) diff --git a/database/migrations/2020_10_27_102330_create_tasks_table.php b/database/migrations/2020_10_27_102330_create_tasks_table.php index d64208f..c557785 100644 --- a/database/migrations/2020_10_27_102330_create_tasks_table.php +++ b/database/migrations/2020_10_27_102330_create_tasks_table.php @@ -4,8 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { public function up() { Schema::create('tasks', function (Blueprint $table) { @@ -16,7 +15,6 @@ public function up() $table->tinyInteger('flag')->nullable()->index(); - $table->boolean('completed')->index(); $table->dateTime('reminder')->nullable(); $table->tinyInteger('status'); $table->dateTime('from')->nullable(); diff --git a/database/migrations/2020_10_27_102337_create_structure_for_tasks.php b/database/migrations/2020_10_27_102337_create_structure_for_tasks.php index f14651f..69e59d8 100644 --- a/database/migrations/2020_10_27_102337_create_structure_for_tasks.php +++ b/database/migrations/2020_10_27_102337_create_structure_for_tasks.php @@ -2,8 +2,7 @@ use LaravelEnso\Migrator\Database\Migration; -return new class extends Migration -{ +return new class extends Migration { protected array $permissions = [ ['name' => 'tasks.index', 'description' => 'Show index for tasks', 'is_default' => false], ['name' => 'tasks.create', 'description' => 'Create task', 'is_default' => false], @@ -17,7 +16,7 @@ ['name' => 'tasks.count', 'description' => 'Get number of pending tasks', 'is_default' => false], ['name' => 'tasks.users', 'description' => 'Get user options for task allocation', 'is_default' => false], ['name' => 'tasks.show', 'description' => 'Display task information', 'is_default' => true], - ['name' => 'tasks.options', 'description' => 'Get tasks options for select', 'is_default' => false] + ['name' => 'tasks.options', 'description' => 'Get tasks options for select', 'is_default' => false], ]; protected array $menu = [ diff --git a/database/migrations/2022_06_29_133122_create_task_checklist_items_table.php b/database/migrations/2022_06_29_133122_create_task_checklist_items_table.php index 2528b8f..aa4e1dc 100644 --- a/database/migrations/2022_06_29_133122_create_task_checklist_items_table.php +++ b/database/migrations/2022_06_29_133122_create_task_checklist_items_table.php @@ -4,14 +4,15 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { public function up() { Schema::create('task_checklist_items', function (Blueprint $table) { $table->id(); + $table->unsignedBigInteger('task_id'); $table->foreign('task_id')->references('id')->on('tasks'); + $table->string('name'); $table->unsignedInteger('order_index')->nullable(); $table->boolean('is_completed'); diff --git a/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php b/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php index 62a5cca..6705b32 100644 --- a/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php +++ b/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php @@ -10,7 +10,8 @@ class CreateStructureForChecklistItems extends Migration ['name' => 'tasks.checklistItems.store', 'description' => 'Store a new task checklist item', 'is_default' => false], ['name' => 'tasks.checklistItems.update', 'description' => 'Update task checklist item', 'is_default' => false], ['name' => 'tasks.checklistItems.destroy', 'description' => 'Delete task checklist item', 'is_default' => false], - + + ['name' => 'tasks.checklistItems.options', 'description' => 'Get task checklist item options for select', 'is_default' => false], ]; diff --git a/database/migrations/2022_07_19_134101_create_task_comments_table.php b/database/migrations/2022_07_19_134101_create_task_comments_table.php index 021cb09..b8783d7 100644 --- a/database/migrations/2022_07_19_134101_create_task_comments_table.php +++ b/database/migrations/2022_07_19_134101_create_task_comments_table.php @@ -4,8 +4,7 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration -{ +return new class extends Migration { public function up() { Schema::create('task_comments', function (Blueprint $table) { diff --git a/routes/api.php b/routes/api.php index 0e2a908..db39f26 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,25 +1,12 @@ prefix('api/tasks') ->as('tasks.') ->group(function () { - require __DIR__ . '/app/comments.php'; - require __DIR__ . '/app/tasks.php'; - require __DIR__ . '/app/checklistItems.php'; + require __DIR__.'/app/comments.php'; + require __DIR__.'/app/tasks.php'; + require __DIR__.'/app/checklistItems.php'; }); diff --git a/routes/app/checklistItems.php b/routes/app/checklistItems.php index c500ba1..1d94a35 100644 --- a/routes/app/checklistItems.php +++ b/routes/app/checklistItems.php @@ -1,12 +1,12 @@ as('checklistItems.') diff --git a/routes/app/comments.php b/routes/app/comments.php index 18b73f6..cc20b1e 100644 --- a/routes/app/comments.php +++ b/routes/app/comments.php @@ -1,10 +1,10 @@ as('comments.') diff --git a/routes/app/tasks.php b/routes/app/tasks.php index f914549..4bc84ff 100644 --- a/routes/app/tasks.php +++ b/routes/app/tasks.php @@ -5,11 +5,11 @@ use LaravelEnso\Tasks\Http\Controllers\Tasks\Create; use LaravelEnso\Tasks\Http\Controllers\Tasks\Destroy; use LaravelEnso\Tasks\Http\Controllers\Tasks\Edit; -use LaravelEnso\Tasks\Http\Controllers\Tasks\Show; -use LaravelEnso\Tasks\Http\Controllers\Tasks\Options; use LaravelEnso\Tasks\Http\Controllers\Tasks\ExportExcel; use LaravelEnso\Tasks\Http\Controllers\Tasks\Index; use LaravelEnso\Tasks\Http\Controllers\Tasks\InitTable; +use LaravelEnso\Tasks\Http\Controllers\Tasks\Options; +use LaravelEnso\Tasks\Http\Controllers\Tasks\Show; use LaravelEnso\Tasks\Http\Controllers\Tasks\Store; use LaravelEnso\Tasks\Http\Controllers\Tasks\TableData; use LaravelEnso\Tasks\Http\Controllers\Tasks\Update; @@ -34,4 +34,3 @@ Route::get('options', Options::class)->name('options'); Route::get('{task}', Show::class)->name('show'); - diff --git a/src/AuthServiceProvider.php b/src/AuthServiceProvider.php index 5464e98..86cf086 100644 --- a/src/AuthServiceProvider.php +++ b/src/AuthServiceProvider.php @@ -5,13 +5,13 @@ use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use LaravelEnso\Tasks\Models\Comment; use LaravelEnso\Tasks\Models\Task; -use LaravelEnso\Tasks\Policies\Task as Policy; use LaravelEnso\Tasks\Policies\Comment as CommentPolicy; +use LaravelEnso\Tasks\Policies\Task as Policy; class AuthServiceProvider extends ServiceProvider { protected $policies = [ - Task::class => Policy::class, + Task::class => Policy::class, Comment::class => CommentPolicy::class, ]; diff --git a/src/EnumServiceProvider.php b/src/EnumServiceProvider.php index 61a833a..aa7498f 100644 --- a/src/EnumServiceProvider.php +++ b/src/EnumServiceProvider.php @@ -9,7 +9,7 @@ class EnumServiceProvider extends ServiceProvider { public $register = [ - 'flags' => Flags::class, + 'flags' => Flags::class, 'statuses' => Statuses::class, ]; } diff --git a/src/Enums/Statuses.php b/src/Enums/Statuses.php index 85f3e31..e139292 100644 --- a/src/Enums/Statuses.php +++ b/src/Enums/Statuses.php @@ -7,6 +7,15 @@ class Statuses extends Enum { public const New = 1; - public const Progress = 2; + public const InProgress = 2; public const Finished = 3; + + public static function data(): array + { + return [ + self::New => 'New', + self::InProgress => 'In Progress', + self::Finished => 'Finished' + ]; + } } diff --git a/src/Http/Controllers/ChecklistItems/Create.php b/src/Http/Controllers/ChecklistItems/Create.php index 69f6c52..493eaf3 100644 --- a/src/Http/Controllers/ChecklistItems/Create.php +++ b/src/Http/Controllers/ChecklistItems/Create.php @@ -2,8 +2,8 @@ namespace LaravelEnso\Tasks\Http\Controllers\ChecklistItems; -use LaravelEnso\Tasks\Forms\Builders\ChecklistItem; use Illuminate\Routing\Controller; +use LaravelEnso\Tasks\Forms\Builders\ChecklistItem; class Create extends Controller { diff --git a/src/Http/Controllers/ChecklistItems/Destroy.php b/src/Http/Controllers/ChecklistItems/Destroy.php index dff0701..6110106 100644 --- a/src/Http/Controllers/ChecklistItems/Destroy.php +++ b/src/Http/Controllers/ChecklistItems/Destroy.php @@ -2,9 +2,9 @@ namespace LaravelEnso\Tasks\Http\Controllers\ChecklistItems; -use LaravelEnso\Tasks\Models\ChecklistItem; -use Illuminate\Routing\Controller; use function __; +use Illuminate\Routing\Controller; +use LaravelEnso\Tasks\Models\ChecklistItem; class Destroy extends Controller { @@ -13,7 +13,7 @@ public function __invoke(ChecklistItem $checklistItem) $checklistItem->delete(); return [ - 'message' => __('The checklist item was successfully deleted'), + 'message' => __('The checklist item was successfully deleted'), 'redirect' => 'checklists.index', ]; } diff --git a/src/Http/Controllers/ChecklistItems/Edit.php b/src/Http/Controllers/ChecklistItems/Edit.php index ba79f49..7225f20 100644 --- a/src/Http/Controllers/ChecklistItems/Edit.php +++ b/src/Http/Controllers/ChecklistItems/Edit.php @@ -2,9 +2,9 @@ namespace LaravelEnso\Tasks\Http\Controllers\ChecklistItems; +use Illuminate\Routing\Controller; use LaravelEnso\Tasks\Forms\Builders\ChecklistItem as Form; use LaravelEnso\Tasks\Models\ChecklistItem; -use Illuminate\Routing\Controller; class Edit extends Controller { diff --git a/src/Http/Controllers/ChecklistItems/Options.php b/src/Http/Controllers/ChecklistItems/Options.php index b538b34..fa25605 100644 --- a/src/Http/Controllers/ChecklistItems/Options.php +++ b/src/Http/Controllers/ChecklistItems/Options.php @@ -2,14 +2,13 @@ namespace LaravelEnso\Tasks\Http\Controllers\ChecklistItems; -use LaravelEnso\Tasks\Models\ChecklistItem; use Illuminate\Routing\Controller; use LaravelEnso\Select\Traits\OptionsBuilder; +use LaravelEnso\Tasks\Models\ChecklistItem; class Options extends Controller { use OptionsBuilder; protected string $model = ChecklistItem::class; - } diff --git a/src/Http/Controllers/ChecklistItems/Store.php b/src/Http/Controllers/ChecklistItems/Store.php index 78d029c..61ddc88 100644 --- a/src/Http/Controllers/ChecklistItems/Store.php +++ b/src/Http/Controllers/ChecklistItems/Store.php @@ -2,10 +2,10 @@ namespace LaravelEnso\Tasks\Http\Controllers\ChecklistItems; +use function __; +use Illuminate\Routing\Controller; use LaravelEnso\Tasks\Http\Requests\ValidateChecklistItem; use LaravelEnso\Tasks\Models\ChecklistItem; -use Illuminate\Routing\Controller; -use function __; class Store extends Controller { @@ -14,9 +14,9 @@ public function __invoke(ValidateChecklistItem $request, ChecklistItem $checklis $checklistItem->fill($request->validated())->save(); return [ - 'message' => __('The checklist item was successfully created'), + 'message' => __('The checklist item was successfully created'), 'redirect' => 'tasks.checklistItems.edit', - 'param' => ['checklist' => $checklistItem->id], + 'param' => ['checklist' => $checklistItem->id], ]; } } diff --git a/src/Http/Controllers/ChecklistItems/Update.php b/src/Http/Controllers/ChecklistItems/Update.php index 20bd2ca..232a3a6 100644 --- a/src/Http/Controllers/ChecklistItems/Update.php +++ b/src/Http/Controllers/ChecklistItems/Update.php @@ -2,10 +2,10 @@ namespace LaravelEnso\Tasks\Http\Controllers\ChecklistItems; +use function __; +use Illuminate\Routing\Controller; use LaravelEnso\Tasks\Http\Requests\ValidateChecklistItem; use LaravelEnso\Tasks\Models\ChecklistItem; -use Illuminate\Routing\Controller; -use function __; class Update extends Controller { diff --git a/src/Http/Controllers/Comments/Index.php b/src/Http/Controllers/Comments/Index.php index 5f8513f..65b03a4 100644 --- a/src/Http/Controllers/Comments/Index.php +++ b/src/Http/Controllers/Comments/Index.php @@ -2,11 +2,11 @@ namespace LaravelEnso\Tasks\Http\Controllers\Comments; +use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Config; use LaravelEnso\Tasks\Http\Requests\ValidateCommentFetch; use LaravelEnso\Tasks\Http\Resources\Comment as Resource; use LaravelEnso\Tasks\Models\Comment; -use Illuminate\Routing\Controller; -use Illuminate\Support\Facades\Config; class Index extends Controller { diff --git a/src/Http/Controllers/Comments/Store.php b/src/Http/Controllers/Comments/Store.php index 6c6e0b8..1d9abb1 100644 --- a/src/Http/Controllers/Comments/Store.php +++ b/src/Http/Controllers/Comments/Store.php @@ -2,21 +2,21 @@ namespace LaravelEnso\Tasks\Http\Controllers\Comments; +use Illuminate\Routing\Controller; use LaravelEnso\Tasks\Http\Requests\ValidateComment; use LaravelEnso\Tasks\Http\Resources\Comment as Resource; use LaravelEnso\Tasks\Models\Comment; -use Illuminate\Routing\Controller; class Store extends Controller { public function __invoke(ValidateComment $request, Comment $comment) { - $comment->fill($request->validatedExcept( 'path')); + $comment->fill($request->validatedExcept('path')); tap($comment)->save(); return new Resource($comment->load([ - 'createdBy.person', 'createdBy.avatar' + 'createdBy.person', 'createdBy.avatar', ])); } } diff --git a/src/Http/Controllers/Comments/Update.php b/src/Http/Controllers/Comments/Update.php index f33c508..bd78d7d 100644 --- a/src/Http/Controllers/Comments/Update.php +++ b/src/Http/Controllers/Comments/Update.php @@ -2,13 +2,12 @@ namespace LaravelEnso\Tasks\Http\Controllers\Comments; -use LaravelEnso\Tasks\Http\Requests\ValidateComment; -use LaravelEnso\Tasks\Http\Resources\Comment as Resource; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Routing\Controller; +use LaravelEnso\Tasks\Http\Requests\ValidateComment; +use LaravelEnso\Tasks\Http\Resources\Comment as Resource; use LaravelEnso\Tasks\Models\Comment; - class Update extends Controller { use AuthorizesRequests; diff --git a/src/Http/Controllers/Tasks/Options.php b/src/Http/Controllers/Tasks/Options.php index 5ae950a..3f8c6f4 100644 --- a/src/Http/Controllers/Tasks/Options.php +++ b/src/Http/Controllers/Tasks/Options.php @@ -2,14 +2,13 @@ namespace LaravelEnso\Tasks\Http\Controllers\Tasks; -use LaravelEnso\Tasks\Models\Task; use Illuminate\Routing\Controller; use LaravelEnso\Select\Traits\OptionsBuilder; +use LaravelEnso\Tasks\Models\Task; class Options extends Controller { use OptionsBuilder; protected string $model = Task::class; - } diff --git a/src/Http/Controllers/Tasks/Show.php b/src/Http/Controllers/Tasks/Show.php index a093240..f97c210 100644 --- a/src/Http/Controllers/Tasks/Show.php +++ b/src/Http/Controllers/Tasks/Show.php @@ -16,6 +16,6 @@ public function __invoke(Task $task) $this->authorize('handle', $task); return ['task' => new Resource($task->load(['checklistItems', 'allocatedTo', - 'allocatedTo.avatar', 'allocatedTo.person','createdBy','createdBy.person']))]; + 'allocatedTo.avatar', 'allocatedTo.person', 'createdBy', 'createdBy.person', ]))]; } } diff --git a/src/Http/Requests/ValidateChecklistItem.php b/src/Http/Requests/ValidateChecklistItem.php index d7b16b3..bf5d921 100644 --- a/src/Http/Requests/ValidateChecklistItem.php +++ b/src/Http/Requests/ValidateChecklistItem.php @@ -10,8 +10,8 @@ class ValidateChecklistItem extends FormRequest public function rules() { return [ - 'name' => ['required', 'string', $this->unique('name'), 'max:255'], - 'task_id' => ['required', 'exists:tasks,id'], + 'name' => ['required', 'string', $this->unique('name'), 'max:255'], + 'task_id' => ['required', 'exists:tasks,id'], 'is_completed' => 'required|boolean' ]; } diff --git a/src/Http/Requests/ValidateComment.php b/src/Http/Requests/ValidateComment.php index 5612842..8ae710f 100644 --- a/src/Http/Requests/ValidateComment.php +++ b/src/Http/Requests/ValidateComment.php @@ -12,9 +12,9 @@ class ValidateComment extends FormRequest public function rules() { return [ - 'task_id' => "{$this->requiredOrFilled()}|exists:tasks,id", - 'body' => "{$this->requiredOrFilled()}|required", - 'path' => "{$this->requiredOrFilled()}", + 'task_id' => "{$this->requiredOrFilled()}|exists:tasks,id", + 'body' => "{$this->requiredOrFilled()}|required", + 'path' => "{$this->requiredOrFilled()}", ]; } @@ -24,5 +24,4 @@ private function requiredOrFilled() ? 'required' : 'filled'; } - } diff --git a/src/Http/Requests/ValidateCommentFetch.php b/src/Http/Requests/ValidateCommentFetch.php index 1a4d4bb..2d49d24 100644 --- a/src/Http/Requests/ValidateCommentFetch.php +++ b/src/Http/Requests/ValidateCommentFetch.php @@ -6,12 +6,10 @@ class ValidateCommentFetch extends FormRequest { - public function rules() { return [ - 'task_id' => "required" + 'task_id' => "required", ]; } - } diff --git a/src/Http/Requests/ValidateTask.php b/src/Http/Requests/ValidateTask.php index d9b89fc..3d0cff4 100644 --- a/src/Http/Requests/ValidateTask.php +++ b/src/Http/Requests/ValidateTask.php @@ -21,11 +21,11 @@ public function rules() 'description' => 'filled', 'flag' => 'nullable|in:'.Flags::keys()->implode(','), 'reminder' => 'nullable|date', - 'from' => 'nullable|date', - 'to' => 'nullable|date', - 'muted' => 'nullable|boolean', + 'from' => 'nullable|date', + 'to' => 'nullable|date', + 'muted' => 'nullable|boolean', 'allocated_to' => "{$this->requiredOrFilled()}|exists:users,id", - 'status' => "{$this->requiredOrFilled()}", + 'status' => "{$this->requiredOrFilled()}", ]; } diff --git a/src/Http/Resources/ChecklistItems.php b/src/Http/Resources/ChecklistItems.php index c3bce87..f79fed6 100644 --- a/src/Http/Resources/ChecklistItems.php +++ b/src/Http/Resources/ChecklistItems.php @@ -7,17 +7,16 @@ class ChecklistItems extends JsonResource { - public function toArray($request) { return [ - 'id' => $this->id, - 'name' => $this->name, + 'id' => $this->id, + 'name' => $this->name, 'description' => $this->description, - 'taskId' => $this->task_id, + 'taskId' => $this->task_id, 'isCompleted' => $this->is_completed, - 'orderIndex' => $this->order_index, - 'createdAt' => Carbon::parse($this->created_at)->format('d-m-Y H:i') + 'orderIndex' => $this->order_index, + 'createdAt' => Carbon::parse($this->created_at)->format('d-m-Y H:i') ]; } } diff --git a/src/Http/Resources/Comment.php b/src/Http/Resources/Comment.php index 5e3ffb9..9b3fdae 100644 --- a/src/Http/Resources/Comment.php +++ b/src/Http/Resources/Comment.php @@ -3,7 +3,6 @@ namespace LaravelEnso\Tasks\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; -use LaravelEnso\Comments\Http\Resources\TaggedUser; use LaravelEnso\Users\Http\Resources\User; class Comment extends JsonResource @@ -11,13 +10,13 @@ class Comment extends JsonResource public function toArray($request) { return [ - 'id' => $this->id, - 'body' => $this->body, - 'owner' => new User($this->whenLoaded('createdBy')), - 'isEditable' => $this->isEditable($request), + 'id' => $this->id, + 'body' => $this->body, + 'owner' => new User($this->whenLoaded('createdBy')), + 'isEditable' => $this->isEditable($request), 'isDeletable' => $this->isDeletable($request), - 'createdAt' => $this->created_at->toDatetimeString(), - 'updatedAt' => $this->updated_at->toDatetimeString(), + 'createdAt' => $this->created_at->toDatetimeString(), + 'updatedAt' => $this->updated_at->toDatetimeString(), ]; } diff --git a/src/Http/Resources/Task.php b/src/Http/Resources/Task.php index 5aac1d7..96dbea8 100644 --- a/src/Http/Resources/Task.php +++ b/src/Http/Resources/Task.php @@ -2,7 +2,6 @@ namespace LaravelEnso\Tasks\Http\Resources; -use LaravelEnso\Tasks\Http\Resources\ChecklistItems; use Carbon\Carbon; use Illuminate\Http\Resources\Json\JsonResource; use LaravelEnso\Users\Http\Resources\User; @@ -12,23 +11,23 @@ class Task extends JsonResource public function toArray($request) { return [ - 'id' => $this->id, - 'name' => $this->name, - 'description' => $this->description, - 'reminder' => Carbon::parse($this->reminder)->format('d-m-Y H:i'), - 'from' => $this->from ? Carbon::parse($this->from)->format('d M Y') : null, - 'to' => Carbon::parse($this->to)->format('d M Y'), - 'muted' => $this->muted, - 'status' => $this->status, - 'flag' => $this->flag, - 'overdue' => $this->overdue(), - 'remindedAt' => $this->reminded_at, - 'allocatedTo' => new User($this->whenLoaded('allocatedTo')), - 'createdBy' => new User($this->whenLoaded('createdBy')), - 'taskChecklistItems' => ChecklistItems::collection($this->whenLoaded('checklistItems')), + 'id' => $this->id, + 'name' => $this->name, + 'description' => $this->description, + 'reminder' => Carbon::parse($this->reminder)->format('d-m-Y H:i'), + 'from' => $this->from ? Carbon::parse($this->from)->format('d M Y') : null, + 'to' => Carbon::parse($this->to)->format('d M Y'), + 'muted' => $this->muted, + 'status' => $this->status, + 'flag' => $this->flag, + 'overdue' => $this->overdue(), + 'remindedAt' => $this->reminded_at, + 'allocatedTo' => new User($this->whenLoaded('allocatedTo')), + 'createdBy' => new User($this->whenLoaded('createdBy')), + 'taskChecklistItems' => ChecklistItems::collection($this->whenLoaded('checklistItems')), 'completedTaskChecklistItems' => $this->completedTaskChecklistItems(), - 'createdAt' => Carbon::parse($this->created_at)->format('d-m-Y H:i'), - 'updatedAt' => Carbon::parse($this->updated_at)->diffForHumans(), + 'createdAt' => Carbon::parse($this->created_at)->format('d-m-Y H:i'), + 'updatedAt' => Carbon::parse($this->updated_at)->diffForHumans(), ]; } diff --git a/src/Models/Comment.php b/src/Models/Comment.php index 61ac08b..e8e5e74 100644 --- a/src/Models/Comment.php +++ b/src/Models/Comment.php @@ -4,16 +4,16 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -use Illuminate\Support\Collection; -use LaravelEnso\Comments\Notifications\CommentTagNotification; use LaravelEnso\Helpers\Traits\UpdatesOnTouch; use LaravelEnso\TrackWho\Traits\CreatedBy; use LaravelEnso\TrackWho\Traits\UpdatedBy; -use LaravelEnso\Users\Models\User; class Comment extends Model { - use CreatedBy, HasFactory, UpdatedBy, UpdatesOnTouch; + use CreatedBy; + use HasFactory; + use UpdatedBy; + use UpdatesOnTouch; protected $guarded = ['id']; diff --git a/src/Models/Task.php b/src/Models/Task.php index 7532ee1..2aaa98f 100644 --- a/src/Models/Task.php +++ b/src/Models/Task.php @@ -23,7 +23,7 @@ class Task extends Model protected $guarded = ['id']; - protected $dates = ['reminder', 'reminded_at','from','to']; + protected $dates = ['reminder', 'reminded_at', 'from', 'to']; protected $casts = []; @@ -48,14 +48,14 @@ public function scopeVisible($query) $user = Auth::user(); $superiorUser = $user->isAdmin() || $user->isSupervisor(); - return $query->when(!$superiorUser, fn($query) => $query - ->where(fn($query) => $query->whereCreatedBy($user->id) + return $query->when(!$superiorUser, fn ($query) => $query + ->where(fn ($query) => $query->whereCreatedBy($user->id) ->orWhere('allocated_to', $user->id))); } public function scopePending($query) { - return $query->whereStatus(Statuses::Progress); + return $query->whereStatus(Statuses::InProgress); } public function scopeCompleted($query) @@ -103,9 +103,9 @@ public function updateStatus() $count = $this->checklistItems()->count(); $status = match ($completedChecklist) { - $count => Statuses::Finished, - 0 => Statuses::New, - default => Statuses::Progress, + $count => Statuses::Finished, + 0 => Statuses::New, + default => Statuses::InProgress, }; $this->update(['status' => $status]); diff --git a/src/Observers/ChecklistItem.php b/src/Observers/ChecklistItem.php index a2ea0a4..96a7d91 100644 --- a/src/Observers/ChecklistItem.php +++ b/src/Observers/ChecklistItem.php @@ -22,6 +22,4 @@ public function deleted(Model $checklist) { $checklist->task->updateStatus(); } - - } diff --git a/src/Policies/Comment.php b/src/Policies/Comment.php index b465906..9d956d0 100644 --- a/src/Policies/Comment.php +++ b/src/Policies/Comment.php @@ -2,11 +2,11 @@ namespace LaravelEnso\Tasks\Policies; -use LaravelEnso\Tasks\Models\Comment as Model; -use LaravelEnso\Users\Models\User; use Carbon\Carbon; use Illuminate\Auth\Access\HandlesAuthorization; use Illuminate\Support\Facades\Config; +use LaravelEnso\Tasks\Models\Comment as Model; +use LaravelEnso\Users\Models\User; class Comment { @@ -33,7 +33,7 @@ public function destroy(User $user, Model $comment) private function ownsComment(User $user, Model $comment) { - return $user->id === (int)$comment->created_by; + return $user->id === (int) $comment->created_by; } private function isRecent(Model $comment) diff --git a/src/Upgrades/From.php b/src/Upgrades/From.php index 998724f..0a0db39 100644 --- a/src/Upgrades/From.php +++ b/src/Upgrades/From.php @@ -19,5 +19,4 @@ public function migrateTable(): void $table->dateTime('from')->nullable()->after('reminder'); }); } - } diff --git a/src/Upgrades/Muted.php b/src/Upgrades/Muted.php index d424cb8..cf9325a 100644 --- a/src/Upgrades/Muted.php +++ b/src/Upgrades/Muted.php @@ -19,5 +19,4 @@ public function migrateTable(): void $table->dateTime('muted')->nullable()->after('reminder'); }); } - } diff --git a/src/Upgrades/Permissions.php b/src/Upgrades/Permissions.php index e0138c4..2bea999 100644 --- a/src/Upgrades/Permissions.php +++ b/src/Upgrades/Permissions.php @@ -11,6 +11,6 @@ class Permissions implements MigratesStructure protected array $permissions = [ ['name' => 'tasks.show', 'description' => 'Display task information', 'is_default' => true], - ['name' => 'tasks.options', 'description' => 'Get tasks options for select', 'is_default' => false] + ['name' => 'tasks.options', 'description' => 'Get tasks options for select', 'is_default' => false], ]; } diff --git a/src/Upgrades/Statuses.php b/src/Upgrades/Statuses.php index 8498e77..00dcca5 100644 --- a/src/Upgrades/Statuses.php +++ b/src/Upgrades/Statuses.php @@ -5,11 +5,11 @@ use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; use LaravelEnso\Tasks\Enums\Statuses as StatusesEnum; -use LaravelEnso\Upgrade\Contracts\MigratesTable; +use LaravelEnso\Tasks\Models\Task; use LaravelEnso\Upgrade\Contracts\MigratesData; use LaravelEnso\Upgrade\Contracts\MigratesPostDataMigration; +use LaravelEnso\Upgrade\Contracts\MigratesTable; use LaravelEnso\Upgrade\Helpers\Table; -use LaravelEnso\Tasks\Models\Task; class Statuses implements MigratesTable, MigratesPostDataMigration, MigratesData { diff --git a/src/Upgrades/To.php b/src/Upgrades/To.php index ac1d71b..08a228b 100644 --- a/src/Upgrades/To.php +++ b/src/Upgrades/To.php @@ -19,5 +19,4 @@ public function migrateTable(): void $table->dateTime('to')->nullable()->after('reminder'); }); } - } From 802d47c7c56f8d7fd2ee8f87f13eccf2b78d39bd Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Thu, 11 Aug 2022 06:53:42 +0100 Subject: [PATCH 12/16] Fix failing CI/CD test --- ...9_133125_create_structure_for_checklist_items.php | 2 -- routes/app/checklistItems.php | 12 ++++++------ src/Enums/Statuses.php | 4 ++-- src/Http/Controllers/Tasks/Show.php | 2 +- src/Http/Requests/ValidateChecklistItem.php | 2 +- src/Http/Requests/ValidateComment.php | 2 +- src/Http/Requests/ValidateCommentFetch.php | 2 +- src/Http/Resources/ChecklistItems.php | 2 +- src/Models/ChecklistItem.php | 2 +- src/Models/Comment.php | 1 - 10 files changed, 14 insertions(+), 17 deletions(-) diff --git a/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php b/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php index 6705b32..a70f0f4 100644 --- a/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php +++ b/database/migrations/2022_06_29_133125_create_structure_for_checklist_items.php @@ -11,7 +11,6 @@ class CreateStructureForChecklistItems extends Migration ['name' => 'tasks.checklistItems.update', 'description' => 'Update task checklist item', 'is_default' => false], ['name' => 'tasks.checklistItems.destroy', 'description' => 'Delete task checklist item', 'is_default' => false], - ['name' => 'tasks.checklistItems.options', 'description' => 'Get task checklist item options for select', 'is_default' => false], ]; @@ -19,4 +18,3 @@ class CreateStructureForChecklistItems extends Migration protected ?string $parentMenu = null; } - diff --git a/routes/app/checklistItems.php b/routes/app/checklistItems.php index 1d94a35..0c2bf47 100644 --- a/routes/app/checklistItems.php +++ b/routes/app/checklistItems.php @@ -11,10 +11,10 @@ Route::prefix('checklistItems') ->as('checklistItems.') ->group(function () { - Route::get('create', Create::class)->name('create'); - Route::post('', Store::class)->name('store'); - Route::get('{checklistItem}/edit', Edit::class)->name('edit'); - Route::patch('{checklistItem}', Update::class)->name('update'); - Route::delete('{checklistItem}', Destroy::class)->name('destroy'); - Route::get('options', Options::class)->name('options'); + Route::get('create', Create::class)->name('create'); + Route::post('', Store::class)->name('store'); + Route::get('{checklistItem}/edit', Edit::class)->name('edit'); + Route::patch('{checklistItem}', Update::class)->name('update'); + Route::delete('{checklistItem}', Destroy::class)->name('destroy'); + Route::get('options', Options::class)->name('options'); }); diff --git a/src/Enums/Statuses.php b/src/Enums/Statuses.php index e139292..7d847fa 100644 --- a/src/Enums/Statuses.php +++ b/src/Enums/Statuses.php @@ -13,9 +13,9 @@ class Statuses extends Enum public static function data(): array { return [ - self::New => 'New', + self::New => 'New', self::InProgress => 'In Progress', - self::Finished => 'Finished' + self::Finished => 'Finished', ]; } } diff --git a/src/Http/Controllers/Tasks/Show.php b/src/Http/Controllers/Tasks/Show.php index f97c210..63aea75 100644 --- a/src/Http/Controllers/Tasks/Show.php +++ b/src/Http/Controllers/Tasks/Show.php @@ -2,10 +2,10 @@ namespace LaravelEnso\Tasks\Http\Controllers\Tasks; -use LaravelEnso\Tasks\Models\Task; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Routing\Controller; use LaravelEnso\Tasks\Http\Resources\Task as Resource; +use LaravelEnso\Tasks\Models\Task; class Show extends Controller { diff --git a/src/Http/Requests/ValidateChecklistItem.php b/src/Http/Requests/ValidateChecklistItem.php index bf5d921..6fc600e 100644 --- a/src/Http/Requests/ValidateChecklistItem.php +++ b/src/Http/Requests/ValidateChecklistItem.php @@ -12,7 +12,7 @@ public function rules() return [ 'name' => ['required', 'string', $this->unique('name'), 'max:255'], 'task_id' => ['required', 'exists:tasks,id'], - 'is_completed' => 'required|boolean' + 'is_completed' => 'required|boolean', ]; } diff --git a/src/Http/Requests/ValidateComment.php b/src/Http/Requests/ValidateComment.php index 8ae710f..61db1af 100644 --- a/src/Http/Requests/ValidateComment.php +++ b/src/Http/Requests/ValidateComment.php @@ -15,7 +15,7 @@ public function rules() 'task_id' => "{$this->requiredOrFilled()}|exists:tasks,id", 'body' => "{$this->requiredOrFilled()}|required", 'path' => "{$this->requiredOrFilled()}", - ]; + ]; } private function requiredOrFilled() diff --git a/src/Http/Requests/ValidateCommentFetch.php b/src/Http/Requests/ValidateCommentFetch.php index 2d49d24..d52e620 100644 --- a/src/Http/Requests/ValidateCommentFetch.php +++ b/src/Http/Requests/ValidateCommentFetch.php @@ -10,6 +10,6 @@ public function rules() { return [ 'task_id' => "required", - ]; + ]; } } diff --git a/src/Http/Resources/ChecklistItems.php b/src/Http/Resources/ChecklistItems.php index f79fed6..0d44e3c 100644 --- a/src/Http/Resources/ChecklistItems.php +++ b/src/Http/Resources/ChecklistItems.php @@ -16,7 +16,7 @@ public function toArray($request) 'taskId' => $this->task_id, 'isCompleted' => $this->is_completed, 'orderIndex' => $this->order_index, - 'createdAt' => Carbon::parse($this->created_at)->format('d-m-Y H:i') + 'createdAt' => Carbon::parse($this->created_at)->format('d-m-Y H:i'), ]; } } diff --git a/src/Models/ChecklistItem.php b/src/Models/ChecklistItem.php index e4e2dfb..627012e 100644 --- a/src/Models/ChecklistItem.php +++ b/src/Models/ChecklistItem.php @@ -7,7 +7,7 @@ class ChecklistItem extends Model { - use TableCache; + use TableCache; protected $table = 'task_checklist_items'; diff --git a/src/Models/Comment.php b/src/Models/Comment.php index e8e5e74..dddb4b3 100644 --- a/src/Models/Comment.php +++ b/src/Models/Comment.php @@ -18,5 +18,4 @@ class Comment extends Model protected $guarded = ['id']; protected $table = 'task_comments'; - } From 96ebf504e6314136f37cdf5a06d4cdcabb2a1f6d Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Thu, 11 Aug 2022 06:57:00 +0100 Subject: [PATCH 13/16] Fixed failing CI/CD test --- src/Http/Requests/ValidateComment.php | 4 ++-- src/Http/Requests/ValidateCommentFetch.php | 2 +- src/Models/ChecklistItem.php | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Http/Requests/ValidateComment.php b/src/Http/Requests/ValidateComment.php index 61db1af..a4edc0d 100644 --- a/src/Http/Requests/ValidateComment.php +++ b/src/Http/Requests/ValidateComment.php @@ -13,8 +13,8 @@ public function rules() { return [ 'task_id' => "{$this->requiredOrFilled()}|exists:tasks,id", - 'body' => "{$this->requiredOrFilled()}|required", - 'path' => "{$this->requiredOrFilled()}", + 'body' => "{$this->requiredOrFilled()}|required", + 'path' => "{$this->requiredOrFilled()}", ]; } diff --git a/src/Http/Requests/ValidateCommentFetch.php b/src/Http/Requests/ValidateCommentFetch.php index d52e620..9c06f0a 100644 --- a/src/Http/Requests/ValidateCommentFetch.php +++ b/src/Http/Requests/ValidateCommentFetch.php @@ -9,7 +9,7 @@ class ValidateCommentFetch extends FormRequest public function rules() { return [ - 'task_id' => "required", + 'task_id' => 'required', ]; } } diff --git a/src/Models/ChecklistItem.php b/src/Models/ChecklistItem.php index 627012e..62a02f9 100644 --- a/src/Models/ChecklistItem.php +++ b/src/Models/ChecklistItem.php @@ -15,7 +15,6 @@ class ChecklistItem extends Model protected $casts = ['is_completed' => 'boolean']; - public function task() { return $this->belongsTo(Task::class); From 1e965737a89c8e17f6dd1c8af8640ac538ef94af Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Thu, 11 Aug 2022 08:23:46 +0100 Subject: [PATCH 14/16] Chnages --- src/Models/Task.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Models/Task.php b/src/Models/Task.php index 2aaa98f..5e5199e 100644 --- a/src/Models/Task.php +++ b/src/Models/Task.php @@ -98,12 +98,12 @@ public function comments() public function updateStatus() { - $completedChecklist = $this->checklistItems()->completed()->count(); + $completedItems = $this->checklistItems()->completed()->count(); - $count = $this->checklistItems()->count(); + $totalItems = $this->checklistItems()->count(); - $status = match ($completedChecklist) { - $count => Statuses::Finished, + $status = match ($completedItems) { + $totalItems => Statuses::Finished, 0 => Statuses::New, default => Statuses::InProgress, }; From d61a3dd618e4136cea4957f9965aca02e1eb2237 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Thu, 11 Aug 2022 08:24:46 +0100 Subject: [PATCH 15/16] Chnages --- src/Models/Task.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Models/Task.php b/src/Models/Task.php index 5e5199e..c958b50 100644 --- a/src/Models/Task.php +++ b/src/Models/Task.php @@ -104,8 +104,8 @@ public function updateStatus() $status = match ($completedItems) { $totalItems => Statuses::Finished, - 0 => Statuses::New, - default => Statuses::InProgress, + 0 => Statuses::New, + default => Statuses::InProgress, }; $this->update(['status' => $status]); From 326eb76513b88e08149fd4fd6e435211f51681f9 Mon Sep 17 00:00:00 2001 From: Abdullahi Abdul Kabir Date: Thu, 11 Aug 2022 09:00:45 +0100 Subject: [PATCH 16/16] Chnages --- database/migrations/2020_10_27_102330_create_tasks_table.php | 3 ++- .../2020_10_27_102337_create_structure_for_tasks.php | 3 ++- .../2022_06_29_133122_create_task_checklist_items_table.php | 3 ++- .../2022_07_19_134101_create_task_comments_table.php | 3 ++- .../2022_07_19_141237_create_structure_for_task_comments.php | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/database/migrations/2020_10_27_102330_create_tasks_table.php b/database/migrations/2020_10_27_102330_create_tasks_table.php index c557785..c759f3a 100644 --- a/database/migrations/2020_10_27_102330_create_tasks_table.php +++ b/database/migrations/2020_10_27_102330_create_tasks_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up() { Schema::create('tasks', function (Blueprint $table) { diff --git a/database/migrations/2020_10_27_102337_create_structure_for_tasks.php b/database/migrations/2020_10_27_102337_create_structure_for_tasks.php index 69e59d8..70f4b9d 100644 --- a/database/migrations/2020_10_27_102337_create_structure_for_tasks.php +++ b/database/migrations/2020_10_27_102337_create_structure_for_tasks.php @@ -2,7 +2,8 @@ use LaravelEnso\Migrator\Database\Migration; -return new class extends Migration { +return new class extends Migration +{ protected array $permissions = [ ['name' => 'tasks.index', 'description' => 'Show index for tasks', 'is_default' => false], ['name' => 'tasks.create', 'description' => 'Create task', 'is_default' => false], diff --git a/database/migrations/2022_06_29_133122_create_task_checklist_items_table.php b/database/migrations/2022_06_29_133122_create_task_checklist_items_table.php index aa4e1dc..cb8cd59 100644 --- a/database/migrations/2022_06_29_133122_create_task_checklist_items_table.php +++ b/database/migrations/2022_06_29_133122_create_task_checklist_items_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up() { Schema::create('task_checklist_items', function (Blueprint $table) { diff --git a/database/migrations/2022_07_19_134101_create_task_comments_table.php b/database/migrations/2022_07_19_134101_create_task_comments_table.php index b8783d7..021cb09 100644 --- a/database/migrations/2022_07_19_134101_create_task_comments_table.php +++ b/database/migrations/2022_07_19_134101_create_task_comments_table.php @@ -4,7 +4,8 @@ use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -return new class extends Migration { +return new class extends Migration +{ public function up() { Schema::create('task_comments', function (Blueprint $table) { diff --git a/database/migrations/2022_07_19_141237_create_structure_for_task_comments.php b/database/migrations/2022_07_19_141237_create_structure_for_task_comments.php index 4c2b03a..b76603d 100644 --- a/database/migrations/2022_07_19_141237_create_structure_for_task_comments.php +++ b/database/migrations/2022_07_19_141237_create_structure_for_task_comments.php @@ -2,7 +2,8 @@ use LaravelEnso\Migrator\Database\Migration; -return new class extends Migration { +return new class extends Migration +{ protected array $permissions = [ ['name' => 'tasks.comments.index', 'description' => 'List task comments for commentable', 'is_default' => true], ['name' => 'tasks.comments.store', 'description' => 'Create task comment', 'is_default' => true],