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:
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user