- Updated SQL migration to insert default task statuses ('To Do', 'Doing', 'Done') upon project creation, improving task management.
- Enhanced socket commands to emit progress updates for subtasks, ensuring real-time synchronization of task progress.
- Refactored frontend components to handle progress calculations and updates more effectively, including improved logging for debugging.
- Removed deprecated members reports components to streamline the codebase and improve maintainability.
89 lines
2.8 KiB
TypeScript
89 lines
2.8 KiB
TypeScript
import { Socket } from "socket.io";
|
|
import db from "../../config/db";
|
|
import { SocketEvents } from "../events";
|
|
import { log_error } from "../util";
|
|
|
|
/**
|
|
* Socket handler to retrieve the number of subtasks for a given task
|
|
* Used to validate on the client side whether a task should show progress inputs
|
|
*/
|
|
export async function on_get_task_subtasks_count(io: any, socket: Socket, taskId: string) {
|
|
try {
|
|
if (!taskId) {
|
|
return;
|
|
}
|
|
|
|
// Get the count of subtasks for this task
|
|
const result = await db.query(
|
|
"SELECT COUNT(*) as subtask_count FROM tasks WHERE parent_task_id = $1 AND archived IS FALSE",
|
|
[taskId]
|
|
);
|
|
|
|
const subtaskCount = parseInt(result.rows[0]?.subtask_count || "0");
|
|
|
|
// Emit the subtask count back to the client
|
|
socket.emit(
|
|
"TASK_SUBTASKS_COUNT",
|
|
{
|
|
task_id: taskId,
|
|
subtask_count: subtaskCount,
|
|
has_subtasks: subtaskCount > 0
|
|
}
|
|
);
|
|
|
|
console.log(`Emitted subtask count for task ${taskId}: ${subtaskCount}`);
|
|
|
|
// If there are subtasks, also get their progress information
|
|
if (subtaskCount > 0) {
|
|
// Get all subtasks for this parent task with their progress information
|
|
const subtasksResult = await db.query(`
|
|
SELECT
|
|
t.id,
|
|
t.progress_value,
|
|
t.manual_progress,
|
|
t.weight,
|
|
CASE
|
|
WHEN t.manual_progress = TRUE THEN t.progress_value
|
|
ELSE COALESCE(
|
|
(SELECT (CASE WHEN tl.total_minutes > 0 THEN
|
|
(tl.total_minutes_spent / tl.total_minutes * 100)
|
|
ELSE 0 END)
|
|
FROM (
|
|
SELECT
|
|
t2.id,
|
|
t2.total_minutes,
|
|
COALESCE(SUM(twl.time_spent), 0) as total_minutes_spent
|
|
FROM tasks t2
|
|
LEFT JOIN task_work_log twl ON t2.id = twl.task_id
|
|
WHERE t2.id = t.id
|
|
GROUP BY t2.id, t2.total_minutes
|
|
) tl
|
|
), 0)
|
|
END as calculated_progress
|
|
FROM tasks t
|
|
WHERE t.parent_task_id = $1 AND t.archived IS FALSE
|
|
`, [taskId]);
|
|
|
|
// Emit progress updates for each subtask
|
|
for (const subtask of subtasksResult.rows) {
|
|
const progressValue = subtask.manual_progress ?
|
|
subtask.progress_value :
|
|
Math.floor(subtask.calculated_progress);
|
|
|
|
socket.emit(
|
|
SocketEvents.TASK_PROGRESS_UPDATED.toString(),
|
|
{
|
|
task_id: subtask.id,
|
|
progress_value: progressValue,
|
|
weight: subtask.weight
|
|
}
|
|
);
|
|
}
|
|
|
|
console.log(`Emitted progress updates for ${subtasksResult.rows.length} subtasks of task ${taskId}`);
|
|
}
|
|
|
|
} catch (error) {
|
|
log_error(`Error getting subtask count for task ${taskId}: ${error}`);
|
|
}
|
|
}
|