diff --git a/frontend/components/task/TaskCard.vue b/frontend/components/task/TaskCard.vue index 0a5f57b..c8a92ef 100644 --- a/frontend/components/task/TaskCard.vue +++ b/frontend/components/task/TaskCard.vue @@ -40,6 +40,13 @@
+ + {{ task.status.label }} + (), { showProjectColor: false, + showStatusBadge: false, }) const emit = defineEmits<{ diff --git a/frontend/pages/my-tasks.vue b/frontend/pages/my-tasks.vue index ce36c08..d0bd9bb 100644 --- a/frontend/pages/my-tasks.vue +++ b/frontend/pages/my-tasks.vue @@ -7,6 +7,8 @@ import type { TaskTag } from '~/services/dto/task-tag' import type { TaskGroup } from '~/services/dto/task-group' import type { UserData } from '~/services/dto/user-data' import type { Project } from '~/services/dto/project' +import type { StatusCategory } from '~/services/dto/workflow' +import { STATUS_CATEGORY_LABEL } from '~/services/dto/workflow' import { useTaskService } from '~/services/tasks' import { useTaskStatusService } from '~/services/task-statuses' import { useTaskEffortService } from '~/services/task-efforts' @@ -112,13 +114,11 @@ const sortOptions = computed(() => [ { label: t('myTasks.sortScheduledStart'), value: SORT_SCHEDULED }, ]) -// Kanban helpers -const sortedStatuses = computed(() => - [...statuses.value].sort((a, b) => a.position - b.position) -) +// Kanban helpers (grouped by canonical status category) +const CATEGORIES: StatusCategory[] = ['todo', 'in_progress', 'blocked', 'review', 'done'] -function tasksByStatus(statusId: number): Task[] { - return tasks.value.filter(t => t.status?.id === statusId) +function tasksByCategory(category: StatusCategory): Task[] { + return tasks.value.filter(t => t.status?.category === category) } const backlogTasks = computed(() => @@ -205,44 +205,6 @@ watch(selectedProjectId, () => { selectedGroupId.value = null }, { flush: 'sync' }) -// Drag & drop -const dragOverStatusId = ref(null) -const dragCounter = ref(0) - -function onDragEnter(id: number) { - dragCounter.value++ - dragOverStatusId.value = id -} - -function onDragLeave() { - dragCounter.value-- - if (dragCounter.value === 0) { - dragOverStatusId.value = null - } -} - -function onDrop(event: DragEvent) { - dragCounter.value = 0 - dragOverStatusId.value = null - return Number(event.dataTransfer!.getData('text/plain')) -} - -async function onDropStatus(event: DragEvent, status: TaskStatus) { - const taskId = onDrop(event) - const task = tasks.value.find(t => t.id === taskId) - if (!task || task.status?.id === status.id) return - task.status = status - await taskService.update(taskId, { status: `/api/task_statuses/${status.id}` }) -} - -async function onDropBacklog(event: DragEvent) { - const taskId = onDrop(event) - const task = tasks.value.find(t => t.id === taskId) - if (!task || !task.status) return - task.status = null - await taskService.update(taskId, { status: null }) -} - // Modal function openTaskCreate() { selectedTask.value = null @@ -428,36 +390,29 @@ onMounted(async () => {
- +
-
- {{ status.label }} ({{ tasksByStatus(status.id).length }}) +
+ {{ STATUS_CATEGORY_LABEL[cat] }} ({{ tasksByCategory(cat).length }})

{{ $t('myTasks.noTasks') }} @@ -467,15 +422,8 @@ onMounted(async () => {

- -
+ +

{{ $t('myTasks.backlog') }} ({{ backlogTasks.length }})

{ :key="task.id" :task="task" show-project-color + show-status-badge @click="openTaskEdit(task)" />