From 0c5c78a45d3b3652c7044c36d945953709fbcd14 Mon Sep 17 00:00:00 2001 From: zhi Date: Mon, 16 Mar 2026 13:22:19 +0000 Subject: [PATCH] fix: align task pages with backend task api --- src/pages/CreateTaskPage.tsx | 56 +++++++++++++++++++++++---------- src/pages/DashboardPage.tsx | 8 ++--- src/pages/MonitorPage.tsx | 14 ++++----- src/pages/NotificationsPage.tsx | 2 +- src/pages/TaskDetailPage.tsx | 14 ++++----- src/pages/TasksPage.tsx | 6 ++-- src/types/index.ts | 16 +++++----- 7 files changed, 70 insertions(+), 46 deletions(-) diff --git a/src/pages/CreateTaskPage.tsx b/src/pages/CreateTaskPage.tsx index 66bf9e6..c074dd4 100644 --- a/src/pages/CreateTaskPage.tsx +++ b/src/pages/CreateTaskPage.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import api from '@/services/api' -import type { Project } from '@/types' +import type { Project, Milestone } from '@/types' const TASK_TYPES = [ { value: 'story', label: 'Story', subtypes: ['feature', 'improvement', 'refactor'] }, @@ -11,38 +11,56 @@ const TASK_TYPES = [ { value: 'maintenance', label: 'Maintenance', subtypes: ['deploy', 'release'] }, { value: 'research', label: 'Research', subtypes: [] }, { value: 'review', label: 'Review', subtypes: ['code_review', 'decision_review', 'function_review'] }, - { value: 'support', label: 'Support', subtypes: ['access', 'information'] }, - { value: 'meeting', label: 'Meeting', subtypes: ['conference', 'handover', 'recap'] }, { value: 'resolution', label: 'Resolution', subtypes: [] }, ] export default function CreateTaskPage() { const navigate = useNavigate() const [projects, setProjects] = useState([]) + const [milestones, setMilestones] = useState([]) const [form, setForm] = useState({ - title: '', description: '', project_id: 0, issue_type: 'task', - issue_subtype: '', priority: 'medium', tags: '', reporter_id: 1, + title: '', description: '', project_id: 0, milestone_id: 0, task_type: 'task', + task_subtype: '', priority: 'medium', tags: '', reporter_id: 1, }) useEffect(() => { api.get('/projects').then(({ data }) => { setProjects(data) - if (data.length) setForm((f) => ({ ...f, project_id: data[0].id })) + if (data.length) { + setForm((f) => ({ ...f, project_id: data[0].id })) + // Load milestones for the first project + api.get(`/milestones?project_id=${data[0].id}`).then(({ data: ms }) => { + setMilestones(ms) + if (ms.length) setForm((f) => ({ ...f, milestone_id: ms[0].id })) + }) + } }) }, []) - const currentType = TASK_TYPES.find(t => t.value === form.issue_type) || TASK_TYPES[2] + const handleProjectChange = (projectId: number) => { + setForm(f => ({ ...f, project_id: projectId, milestone_id: 0 })) + api.get(`/milestones?project_id=${projectId}`).then(({ data: ms }) => { + setMilestones(ms) + if (ms.length) setForm((f) => ({ ...f, milestone_id: ms[0].id })) + }) + } + + const currentType = TASK_TYPES.find(t => t.value === form.task_type) || TASK_TYPES[2] const subtypes = currentType.subtypes || [] const handleTypeChange = (newType: string) => { - setForm(f => ({ ...f, issue_type: newType, issue_subtype: '' })) + setForm(f => ({ ...f, task_type: newType, task_subtype: '' })) } const submit = async (e: React.FormEvent) => { e.preventDefault() + if (!form.milestone_id) { + alert('Please select a milestone') + return + } const payload: any = { ...form, tags: form.tags || null } - if (!form.issue_subtype) delete payload.issue_subtype - await api.post('/issues', payload) + if (!form.task_subtype) delete payload.task_subtype + await api.post('/tasks', payload) navigate('/tasks') } @@ -50,21 +68,27 @@ export default function CreateTaskPage() {

Create Task

- -