Add isActive field to challenge chains and update localization; implement functionality to toggle chain status in the UI, enhancing task management and user experience.

This commit is contained in:
2025-12-10 12:02:11 +03:00
parent 4e1b290f99
commit 173954f685
8 changed files with 109 additions and 10 deletions

View File

@@ -21,6 +21,7 @@
"updatedAt": "2024-11-05T11:00:00.000Z"
}
],
"isActive": true,
"createdAt": "2024-11-01T09:00:00.000Z",
"updatedAt": "2024-11-05T12:00:00.000Z"
},
@@ -38,6 +39,7 @@
"updatedAt": "2024-11-03T09:15:00.000Z"
}
],
"isActive": false,
"createdAt": "2024-11-03T08:00:00.000Z",
"updatedAt": "2024-11-03T09:30:00.000Z"
},
@@ -63,6 +65,7 @@
"updatedAt": "2024-11-04T14:20:00.000Z"
}
],
"isActive": true,
"createdAt": "2024-11-02T11:00:00.000Z",
"updatedAt": "2024-11-04T15:00:00.000Z"
}

View File

@@ -184,8 +184,15 @@ router.delete('/challenge/task/:id', (req, res) => {
// ============= CHAINS =============
// GET /api/challenge/chains
// GET /api/challenge/chains (user-facing list: only active chains)
router.get('/challenge/chains', (req, res) => {
const chains = getChains();
const activeChains = chains.filter(c => c.isActive !== false);
respond(res, activeChains);
});
// GET /api/challenge/chains/admin (admin list: all chains)
router.get('/challenge/chains/admin', (req, res) => {
const chains = getChains();
respond(res, chains);
});
@@ -204,17 +211,17 @@ router.get('/challenge/chain/:id', (req, res) => {
// POST /api/challenge/chain
router.post('/challenge/chain', (req, res) => {
const { name, tasks } = req.body;
const { name, taskIds, isActive } = req.body;
if (!name || !tasks || !Array.isArray(tasks)) {
return respondError(res, 'Name and tasks array are required');
if (!name || !taskIds || !Array.isArray(taskIds)) {
return respondError(res, 'Name and taskIds array are required');
}
const chains = getChains();
const allTasks = getTasks();
// Populate tasks
const populatedTasks = tasks.map(taskId => {
const populatedTasks = taskIds.map(taskId => {
const task = allTasks.find(t => t.id === taskId);
return task ? {
_id: task._id,
@@ -231,6 +238,7 @@ router.post('/challenge/chain', (req, res) => {
id: `chain_${Date.now()}`,
name,
tasks: populatedTasks,
isActive: isActive !== undefined ? !!isActive : true,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString()
};
@@ -253,14 +261,16 @@ router.put('/challenge/chain/:id', (req, res) => {
return respondError(res, 'Chain not found', 404);
}
const { name, tasks } = req.body;
const { name, taskIds, tasks, isActive } = req.body;
const chain = chains[chainIndex];
if (name) chain.name = name;
if (tasks && Array.isArray(tasks)) {
const effectiveTaskIds = Array.isArray(taskIds) ? taskIds : (Array.isArray(tasks) ? tasks : null);
if (effectiveTaskIds) {
const allTasks = getTasks();
const populatedTasks = tasks.map(taskId => {
const populatedTasks = effectiveTaskIds.map(taskId => {
const task = allTasks.find(t => t.id === taskId);
return task ? {
_id: task._id,
@@ -274,6 +284,10 @@ router.put('/challenge/chain/:id', (req, res) => {
chain.tasks = populatedTasks;
}
if (isActive !== undefined) {
chain.isActive = !!isActive;
}
chain.updatedAt = new Date().toISOString();