feat: implement 'not_started' task status with validation and UI updates
This commit is contained in:
@@ -49,6 +49,14 @@ async function updateProjectTaskStatusHandler(req, { params }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const allowedStatuses = ['not_started', 'pending', 'in_progress', 'completed', 'cancelled'];
|
||||||
|
if (!allowedStatuses.includes(status)) {
|
||||||
|
return NextResponse.json(
|
||||||
|
{ error: "Invalid status. Must be one of: " + allowedStatuses.join(', ') },
|
||||||
|
{ status: 400 }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
updateProjectTaskStatus(id, status, req.user?.id || null);
|
updateProjectTaskStatus(id, status, req.user?.id || null);
|
||||||
return NextResponse.json({ success: true });
|
return NextResponse.json({ success: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -135,9 +135,10 @@ export default function ProjectTasksList() {
|
|||||||
groups.completed.push(taskWithStatus);
|
groups.completed.push(taskWithStatus);
|
||||||
} else if (task.status === "in_progress") {
|
} else if (task.status === "in_progress") {
|
||||||
groups.in_progress.push(taskWithStatus);
|
groups.in_progress.push(taskWithStatus);
|
||||||
} else {
|
} else if (task.status === "pending") {
|
||||||
groups.pending.push(taskWithStatus);
|
groups.pending.push(taskWithStatus);
|
||||||
}
|
}
|
||||||
|
// not_started tasks are not displayed in the UI
|
||||||
});
|
});
|
||||||
|
|
||||||
// Sort pending tasks by date_added (newest first)
|
// Sort pending tasks by date_added (newest first)
|
||||||
|
|||||||
@@ -25,6 +25,10 @@ export default function TaskStatusDropdown({
|
|||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const statusConfig = {
|
const statusConfig = {
|
||||||
|
not_started: {
|
||||||
|
label: t("taskStatus.not_started"),
|
||||||
|
variant: "secondary",
|
||||||
|
},
|
||||||
pending: {
|
pending: {
|
||||||
label: t("taskStatus.pending"),
|
label: t("taskStatus.pending"),
|
||||||
variant: "warning",
|
variant: "warning",
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ const translations = {
|
|||||||
|
|
||||||
// Task statuses
|
// Task statuses
|
||||||
taskStatus: {
|
taskStatus: {
|
||||||
|
not_started: "Nie rozpoczęte",
|
||||||
pending: "Oczekujące",
|
pending: "Oczekujące",
|
||||||
in_progress: "W trakcie",
|
in_progress: "W trakcie",
|
||||||
completed: "Ukończone",
|
completed: "Ukończone",
|
||||||
@@ -699,6 +700,7 @@ const translations = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
taskStatus: {
|
taskStatus: {
|
||||||
|
not_started: "Not Started",
|
||||||
pending: "Pending",
|
pending: "Pending",
|
||||||
in_progress: "In Progress",
|
in_progress: "In Progress",
|
||||||
completed: "Completed",
|
completed: "Completed",
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ export default function initializeDatabase() {
|
|||||||
task_template_id INTEGER,
|
task_template_id INTEGER,
|
||||||
custom_task_name TEXT,
|
custom_task_name TEXT,
|
||||||
custom_max_wait_days INTEGER DEFAULT 0,
|
custom_max_wait_days INTEGER DEFAULT 0,
|
||||||
status TEXT NOT NULL DEFAULT 'pending',
|
status TEXT NOT NULL DEFAULT 'not_started' CHECK(status IN ('not_started', 'pending', 'in_progress', 'completed', 'cancelled')),
|
||||||
date_added TEXT DEFAULT CURRENT_TIMESTAMP,
|
date_added TEXT DEFAULT CURRENT_TIMESTAMP,
|
||||||
priority TEXT DEFAULT 'normal',
|
priority TEXT DEFAULT 'normal',
|
||||||
FOREIGN KEY (project_id) REFERENCES projects(project_id),
|
FOREIGN KEY (project_id) REFERENCES projects(project_id),
|
||||||
@@ -279,6 +279,18 @@ export default function initializeDatabase() {
|
|||||||
// Column already exists, ignore error
|
// Column already exists, ignore error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Migration: Update task status system - add 'not_started' status
|
||||||
|
try {
|
||||||
|
// First, update all existing 'pending' tasks to 'not_started'
|
||||||
|
db.exec(`
|
||||||
|
UPDATE project_tasks SET status = 'not_started' WHERE status = 'pending';
|
||||||
|
`);
|
||||||
|
// Note: CHECK constraint will be applied when recreating the table in future migrations
|
||||||
|
// For now, we'll rely on application-level validation
|
||||||
|
} catch (e) {
|
||||||
|
// Migration already done, ignore error
|
||||||
|
}
|
||||||
|
|
||||||
// Create indexes for notes user tracking
|
// Create indexes for notes user tracking
|
||||||
try {
|
try {
|
||||||
db.exec(`
|
db.exec(`
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ export function createProjectTask(data) {
|
|||||||
result = stmt.run(
|
result = stmt.run(
|
||||||
data.project_id,
|
data.project_id,
|
||||||
data.task_template_id,
|
data.task_template_id,
|
||||||
data.status || "pending",
|
data.status || "not_started",
|
||||||
data.priority || "normal",
|
data.priority || "normal",
|
||||||
data.created_by || null,
|
data.created_by || null,
|
||||||
data.assigned_to || null
|
data.assigned_to || null
|
||||||
@@ -114,7 +114,7 @@ export function createProjectTask(data) {
|
|||||||
data.custom_task_name,
|
data.custom_task_name,
|
||||||
data.custom_max_wait_days || 0,
|
data.custom_max_wait_days || 0,
|
||||||
data.custom_description || "",
|
data.custom_description || "",
|
||||||
data.status || "pending",
|
data.status || "not_started",
|
||||||
data.priority || "normal",
|
data.priority || "normal",
|
||||||
data.created_by || null,
|
data.created_by || null,
|
||||||
data.assigned_to || null
|
data.assigned_to || null
|
||||||
|
|||||||
Reference in New Issue
Block a user