From cf8fa95f99ed38b72421a47edcb703a719c7f856 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Tue, 4 Aug 2026 15:35:20 +0800 Subject: [PATCH] fix: keep comprehensive training last in task allocation --- src/views/teacherEnd/task/index.vue | 11 ++++++++++- tests/task-publication.static.test.cjs | 2 ++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/views/teacherEnd/task/index.vue b/src/views/teacherEnd/task/index.vue index 7cbeafe..3cbcccf 100644 --- a/src/views/teacherEnd/task/index.vue +++ b/src/views/teacherEnd/task/index.vue @@ -79,6 +79,15 @@ function syncTableSelection(taskKeys, requestGeneration) { }); } +function sortTasksWithComprehensiveLast(taskList) { + return [...taskList].sort((left, right) => { + const leftIsComprehensive = left?.taskKey === comprehensiveTaskKey; + const rightIsComprehensive = right?.taskKey === comprehensiveTaskKey; + if (leftIsComprehensive === rightIsComprehensive) return 0; + return leftIsComprehensive ? 1 : -1; + }); +} + async function loadTasks(requestGeneration) { if (!classId.value) { tasks.value = []; @@ -88,7 +97,7 @@ async function loadTasks(requestGeneration) { tasks.value = []; const res = await listClassTrainingTasks(classId.value, { enabledOnly: false }); if (!isActiveLoad(requestedClassId, requestGeneration)) return false; - tasks.value = res.data || []; + tasks.value = sortTasksWithComprehensiveLast(res.data || []); return true; } diff --git a/tests/task-publication.static.test.cjs b/tests/task-publication.static.test.cjs index 524cd99..8b147ae 100644 --- a/tests/task-publication.static.test.cjs +++ b/tests/task-publication.static.test.cjs @@ -12,6 +12,8 @@ assert(taskPage.includes('import { listClassTrainingTasks } from "@/api/training assert(taskPage.includes("listClassTrainingTasks"), "task allocation must load training tasks for the selected teaching class"); assert(taskPage.includes("await listClassTrainingTasks(classId.value, { enabledOnly: false })"), "class task loading must request disabled and enabled tasks"); assert(/tasks\.value = \[\];\s+const res = await listClassTrainingTasks/.test(taskPage), "class task loading must clear prior class rows before requesting the selected class"); +assert(taskPage.includes("function sortTasksWithComprehensiveLast(taskList)"), "task allocation must normalize task order after loading"); +assert(taskPage.includes("tasks.value = sortTasksWithComprehensiveLast(res.data || []);"), "task allocation must render comprehensive training after every other task"); assert((taskPage.match(/const requestedClassId = classId\.value;/g) || []).length >= 2, "task and publication loading must capture the requested class"); assert((taskPage.match(/if \(!isActiveLoad\(requestedClassId, requestGeneration\)\) return/g) || []).length >= 2, "stale class requests must not update task rows or publication selection"); assert(taskPage.includes("let activeLoadGeneration = 0;"), "overlapping class loads must use a shared generation");