diff --git a/src/components/ClearSubmissionsDialog.tsx b/src/components/ClearSubmissionsDialog.tsx index 354db5f..b9ffe18 100644 --- a/src/components/ClearSubmissionsDialog.tsx +++ b/src/components/ClearSubmissionsDialog.tsx @@ -75,3 +75,5 @@ export const ClearSubmissionsDialog: React.FC = ({ ) } + + diff --git a/src/components/DuplicateChainDialog.tsx b/src/components/DuplicateChainDialog.tsx index bd970df..ef6fb3c 100644 --- a/src/components/DuplicateChainDialog.tsx +++ b/src/components/DuplicateChainDialog.tsx @@ -104,3 +104,5 @@ export const DuplicateChainDialog: React.FC = ({ ) } + + diff --git a/stubs/api/index.js b/stubs/api/index.js index 19a5102..7b6626d 100644 --- a/stubs/api/index.js +++ b/stubs/api/index.js @@ -409,13 +409,32 @@ router.get('/challenge/stats/v2', (req, res) => { return; } - // Фильтруем данные по выбранной цепочке - const filteredChain = statsV2.chainsDetailed.find(c => c.chainId === chainId); + // Сначала проверяем наличие цепочки в chains.json + const chains = getChains(); + const chain = chains.find(c => c.id === chainId); - if (!filteredChain) { + if (!chain) { return respondError(res, 'Chain not found', 404); } + // Ищем данные цепочки в stats-v2.json + let filteredChain = statsV2.chainsDetailed.find(c => c.chainId === chainId); + + // Если цепочка не найдена в stats-v2.json, создаем пустую структуру на основе chains.json + if (!filteredChain) { + filteredChain = { + chainId: chain.id, + name: chain.name, + totalTasks: chain.tasks.length, + tasks: chain.tasks.map(t => ({ + taskId: t.id, + title: t.title, + description: t.description || '' + })), + participantProgress: [] + }; + } + // Фильтруем tasksTable - только задания из этой цепочки const chainTaskIds = new Set(filteredChain.tasks.map(t => t.taskId)); const filteredTasksTable = statsV2.tasksTable.filter(t => chainTaskIds.has(t.taskId));