From de78d3387e05c4c520b4a99128e44178510a1fe7 Mon Sep 17 00:00:00 2001 From: Mateo Date: Sat, 11 Jul 2026 16:40:46 +0200 Subject: [PATCH] feat: add column settings management and type categorization, fix dates issues in front & regroup discussion and activity in tabs --- .../Settings/ColumnSettingsController.php | 27 ++ app/Http/Controllers/TaskController.php | 1 + app/Http/Requests/ColumnStoreRequest.php | 1 + app/Http/Requests/ColumnUpdateRequest.php | 1 + app/Http/Resources/ColumnResource.php | 1 + app/Http/Resources/TaskResource.php | 5 + app/Models/Column.php | 1 + app/Services/ColumnService.php | 1 + ...07_06_225000_add_type_to_columns_table.php | 28 ++ database/seeders/DatabaseSeeder.php | 9 +- resources/js/components/tasks/KanbanBoard.vue | 6 +- .../js/components/tasks/KanbanColumn.vue | 87 ++++--- .../tasks/TaskActivityDiscussionPanel.vue | 239 +++++++++++------- .../tasks/TaskCommentThreadItem.vue | 2 +- .../js/components/tasks/TaskEditDialog.vue | 30 ++- resources/js/components/tasks/TaskItem.vue | 94 ++++--- resources/js/composables/useDateFormatter.ts | 4 +- resources/js/layouts/settings/Layout.vue | 4 + resources/js/pages/Tasks.vue | 4 +- resources/js/pages/settings/Columns.vue | 145 +++++++++++ resources/js/types/index.d.ts | 6 + routes/settings.php | 4 + tests/Feature/Settings/ColumnSettingsTest.php | 59 +++++ 23 files changed, 576 insertions(+), 183 deletions(-) create mode 100644 app/Http/Controllers/Settings/ColumnSettingsController.php create mode 100644 database/migrations/2026_07_06_225000_add_type_to_columns_table.php create mode 100644 resources/js/pages/settings/Columns.vue create mode 100644 tests/Feature/Settings/ColumnSettingsTest.php diff --git a/app/Http/Controllers/Settings/ColumnSettingsController.php b/app/Http/Controllers/Settings/ColumnSettingsController.php new file mode 100644 index 0000000..66d823a --- /dev/null +++ b/app/Http/Controllers/Settings/ColumnSettingsController.php @@ -0,0 +1,27 @@ +where('team_id', $request->user()->team_id) + ->orderBy('order') + ->get(); + + return Inertia::render('settings/Columns', [ + 'columns' => $columns, + ]); + } +} diff --git a/app/Http/Controllers/TaskController.php b/app/Http/Controllers/TaskController.php index 69fc825..9089b44 100644 --- a/app/Http/Controllers/TaskController.php +++ b/app/Http/Controllers/TaskController.php @@ -73,6 +73,7 @@ public function show(Request $request, Task $task): JsonResponse $this->authorize('view', $task); $task->load([ + 'column:id,name,type', 'creator:id,name', 'assignee:id,name', 'tags:id,name,color', diff --git a/app/Http/Requests/ColumnStoreRequest.php b/app/Http/Requests/ColumnStoreRequest.php index 7d12356..61de742 100644 --- a/app/Http/Requests/ColumnStoreRequest.php +++ b/app/Http/Requests/ColumnStoreRequest.php @@ -15,6 +15,7 @@ public function rules(): array { return [ 'name' => ['required', 'string', 'max:255'], + 'type' => ['nullable', 'string', 'in:todo,in_progress,done'], ]; } } diff --git a/app/Http/Requests/ColumnUpdateRequest.php b/app/Http/Requests/ColumnUpdateRequest.php index 3ad07ed..16e403e 100644 --- a/app/Http/Requests/ColumnUpdateRequest.php +++ b/app/Http/Requests/ColumnUpdateRequest.php @@ -15,6 +15,7 @@ public function rules(): array { return [ 'name' => ['required', 'string', 'max:255'], + 'type' => ['sometimes', 'required', 'string', 'in:todo,in_progress,done'], ]; } } diff --git a/app/Http/Resources/ColumnResource.php b/app/Http/Resources/ColumnResource.php index cb41942..768f357 100644 --- a/app/Http/Resources/ColumnResource.php +++ b/app/Http/Resources/ColumnResource.php @@ -35,6 +35,7 @@ public function toArray(Request $request): array 'id' => $this->id, 'team_id' => $this->team_id, 'name' => $this->name, + 'type' => $this->type, 'order' => $this->order, 'tasks' => $tasksData, 'pagination' => $pagination, diff --git a/app/Http/Resources/TaskResource.php b/app/Http/Resources/TaskResource.php index 710638f..8ebfd45 100644 --- a/app/Http/Resources/TaskResource.php +++ b/app/Http/Resources/TaskResource.php @@ -160,6 +160,11 @@ public function toArray(Request $request): array 'id' => $this->assignee->id, 'name' => $this->assignee->name, ]), + 'column' => $this->whenLoaded('column', fn() => [ + 'id' => $this->column->id, + 'name' => $this->column->name, + 'type' => $this->column->type, + ]), 'comments' => $this->whenLoaded( 'comments', fn() => $this->comments diff --git a/app/Models/Column.php b/app/Models/Column.php index ca75ef3..ad50f3a 100644 --- a/app/Models/Column.php +++ b/app/Models/Column.php @@ -16,6 +16,7 @@ class Column extends Model protected $fillable = [ 'team_id', 'name', + 'type', 'order', ]; diff --git a/app/Services/ColumnService.php b/app/Services/ColumnService.php index 1e6a08f..611fdbd 100644 --- a/app/Services/ColumnService.php +++ b/app/Services/ColumnService.php @@ -19,6 +19,7 @@ public function createColumn(array $data, User $user): Column return Column::create([ 'name' => $data['name'], + 'type' => $data['type'] ?? 'todo', 'team_id' => $user->team_id, 'order' => $order, ]); diff --git a/database/migrations/2026_07_06_225000_add_type_to_columns_table.php b/database/migrations/2026_07_06_225000_add_type_to_columns_table.php new file mode 100644 index 0000000..0e3d5ed --- /dev/null +++ b/database/migrations/2026_07_06_225000_add_type_to_columns_table.php @@ -0,0 +1,28 @@ +enum('type', ['todo', 'in_progress', 'done'])->default('todo')->after('name'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('columns', function (Blueprint $table) { + $table->dropColumn('type'); + }); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 11b64fe..ebd6ede 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -37,19 +37,22 @@ public function run(): void $todoColumn = Column::create([ 'team_id' => $team->id, 'name' => 'To Do', - 'order' => 1 + 'order' => 1, + 'type' => 'todo' ]); $progressColumn = Column::create([ 'team_id' => $team->id, 'name' => 'In Progress', - 'order' => 2 + 'order' => 2, + 'type' => 'in_progress' ]); $doneColumn = Column::create([ 'team_id' => $team->id, 'name' => 'Done', - 'order' => 3 + 'order' => 3, + 'type' => 'done' ]); $teamUsers = User::where('team_id', $team->id)->pluck('id'); diff --git a/resources/js/components/tasks/KanbanBoard.vue b/resources/js/components/tasks/KanbanBoard.vue index 3bf1595..945af88 100644 --- a/resources/js/components/tasks/KanbanBoard.vue +++ b/resources/js/components/tasks/KanbanBoard.vue @@ -71,12 +71,12 @@ const onColumnDragChange = (event: {