From 01affdb0207e6c1dbea634b799fa4d29e761077d Mon Sep 17 00:00:00 2001 From: zhi Date: Mon, 16 Mar 2026 07:47:58 +0000 Subject: [PATCH] =?UTF-8?q?refactor:=20rename=20Issue=20=E2=86=92=20Task?= =?UTF-8?q?=20throughout=20frontend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename files: IssuesPage → TasksPage, IssueDetailPage → TaskDetailPage, CreateIssuePage → CreateTaskPage - Rename TypeScript interface: Issue → Task (keep backend field names) - Update routes: /issues → /tasks, /issues/new → /tasks/new, /issues/:id → /tasks/:id - Update CSS class names: issue-* → task-*, create-issue → create-task - Update UI text: 'Issues' → 'Tasks', 'Create Issue' → 'Create Task' - Keep 'issue' as a task subtype value in TASK_TYPES dropdown - Keep all backend API endpoint paths unchanged (/issues, /comments, etc.) - Rename local Task interface in MilestoneDetailPage to MilestoneTask to avoid conflict with the global Task type --- src/App.tsx | 12 ++--- src/index.css | 20 ++++---- ...CreateIssuePage.tsx => CreateTaskPage.tsx} | 16 +++---- src/pages/DashboardPage.tsx | 8 ++-- src/pages/MilestoneDetailPage.tsx | 34 ++++++------- src/pages/MonitorPage.tsx | 2 +- src/pages/NotificationsPage.tsx | 2 +- src/pages/ProjectDetailPage.tsx | 2 +- ...IssueDetailPage.tsx => TaskDetailPage.tsx} | 48 +++++++++---------- src/pages/{IssuesPage.tsx => TasksPage.tsx} | 40 ++++++++-------- src/types/index.ts | 4 +- 11 files changed, 94 insertions(+), 94 deletions(-) rename src/pages/{CreateIssuePage.tsx => CreateTaskPage.tsx} (89%) rename src/pages/{IssueDetailPage.tsx => TaskDetailPage.tsx} (59%) rename src/pages/{IssuesPage.tsx => TasksPage.tsx} (66%) diff --git a/src/App.tsx b/src/App.tsx index d1d5982..d6a5963 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,9 +5,9 @@ import Sidebar from '@/components/Sidebar' import LoginPage from '@/pages/LoginPage' import SetupWizardPage from '@/pages/SetupWizardPage' import DashboardPage from '@/pages/DashboardPage' -import IssuesPage from '@/pages/IssuesPage' -import IssueDetailPage from '@/pages/IssueDetailPage' -import CreateIssuePage from '@/pages/CreateIssuePage' +import TasksPage from '@/pages/TasksPage' +import TaskDetailPage from '@/pages/TaskDetailPage' +import CreateTaskPage from '@/pages/CreateTaskPage' import ProjectsPage from '@/pages/ProjectsPage' import ProjectDetailPage from '@/pages/ProjectDetailPage' import MilestonesPage from '@/pages/MilestonesPage' @@ -85,9 +85,9 @@ export default function App() {
} /> - } /> - } /> - } /> + } /> + } /> + } /> } /> } /> } /> diff --git a/src/index.css b/src/index.css index 3f807d4..ed5c725 100644 --- a/src/index.css +++ b/src/index.css @@ -63,7 +63,7 @@ thead th { text-align: left; padding: 10px 12px; border-bottom: 2px solid var(-- tbody td { padding: 10px 12px; border-bottom: 1px solid var(--border); } tr.clickable { cursor: pointer; } tr.clickable:hover { background: var(--bg-hover); } -.issue-title { font-weight: 500; max-width: 400px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.task-title { font-weight: 500; max-width: 400px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* Badges */ .badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: .75rem; font-weight: 600; text-transform: capitalize; color: #fff; background: var(--text-dim); } @@ -92,10 +92,10 @@ tr.clickable:hover { background: var(--bg-hover); } .pagination button { padding: 6px 14px; border: 1px solid var(--border); background: var(--bg-card); color: var(--text); border-radius: 6px; cursor: pointer; } .pagination button:disabled { opacity: .4; cursor: default; } -/* Issue detail */ -.issue-header { margin-bottom: 20px; } -.issue-header h2 { margin-bottom: 8px; } -.issue-meta { display: flex; gap: 8px; flex-wrap: wrap; } +/* Task detail */ +.task-header { margin-bottom: 20px; } +.task-header h2 { margin-bottom: 8px; } +.task-meta { display: flex; gap: 8px; flex-wrap: wrap; } .tags { color: var(--accent); font-size: .85rem; } .section { margin: 20px 0; } .section h3 { margin-bottom: 8px; color: var(--text-dim); font-size: .9rem; text-transform: uppercase; } @@ -113,11 +113,11 @@ dd { font-size: .9rem; } .comment-form textarea { width: 100%; min-height: 80px; padding: 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--text); resize: vertical; margin-bottom: 8px; } .comment-form button { padding: 8px 16px; background: var(--accent); color: #fff; border: none; border-radius: 6px; cursor: pointer; } -/* Create Issue form */ -.create-issue form { max-width: 600px; display: flex; flex-direction: column; gap: 14px; } -.create-issue label { display: flex; flex-direction: column; gap: 4px; font-size: .85rem; color: var(--text-dim); } -.create-issue input, .create-issue textarea, .create-issue select { padding: 8px 12px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--text); font-size: .95rem; } -.create-issue textarea { min-height: 100px; resize: vertical; } +/* Create Task form */ +.create-task form { max-width: 600px; display: flex; flex-direction: column; gap: 14px; } +.create-task label { display: flex; flex-direction: column; gap: 4px; font-size: .85rem; color: var(--text-dim); } +.create-task input, .create-task textarea, .create-task select { padding: 8px 12px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--text); font-size: .95rem; } +.create-task textarea { min-height: 100px; resize: vertical; } /* Project grid */ .project-grid, .milestone-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 16px; margin-top: 16px; } diff --git a/src/pages/CreateIssuePage.tsx b/src/pages/CreateTaskPage.tsx similarity index 89% rename from src/pages/CreateIssuePage.tsx rename to src/pages/CreateTaskPage.tsx index 160395f..66bf9e6 100644 --- a/src/pages/CreateIssuePage.tsx +++ b/src/pages/CreateTaskPage.tsx @@ -3,7 +3,7 @@ import { useNavigate } from 'react-router-dom' import api from '@/services/api' import type { Project } from '@/types' -const ISSUE_TYPES = [ +const TASK_TYPES = [ { value: 'story', label: 'Story', subtypes: ['feature', 'improvement', 'refactor'] }, { value: 'issue', label: 'Issue', subtypes: ['infrastructure', 'performance', 'regression', 'security', 'user_experience', 'defect'] }, { value: 'task', label: 'Task', subtypes: ['defect'] }, @@ -16,11 +16,11 @@ const ISSUE_TYPES = [ { value: 'resolution', label: 'Resolution', subtypes: [] }, ] -export default function CreateIssuePage() { +export default function CreateTaskPage() { const navigate = useNavigate() const [projects, setProjects] = useState([]) const [form, setForm] = useState({ - title: '', description: '', project_id: 0, issue_type: 'issue', + title: '', description: '', project_id: 0, issue_type: 'task', issue_subtype: '', priority: 'medium', tags: '', reporter_id: 1, }) @@ -31,7 +31,7 @@ export default function CreateIssuePage() { }) }, []) - const currentType = ISSUE_TYPES.find(t => t.value === form.issue_type) || ISSUE_TYPES[1] + const currentType = TASK_TYPES.find(t => t.value === form.issue_type) || TASK_TYPES[2] const subtypes = currentType.subtypes || [] const handleTypeChange = (newType: string) => { @@ -43,12 +43,12 @@ export default function CreateIssuePage() { const payload: any = { ...form, tags: form.tags || null } if (!form.issue_subtype) delete payload.issue_subtype await api.post('/issues', payload) - navigate('/issues') + navigate('/tasks') } return ( -
-

Create Issue

+
+

Create Task