feat: implement 52-week annual curriculum system with admin management and automated topic progression

This commit is contained in:
RaymondVerhoef
2026-05-18 19:49:05 +02:00
parent 228d0d7a54
commit 08f5b1fe18
10 changed files with 945 additions and 16 deletions

View File

@@ -244,3 +244,67 @@ export async function setSetting(key, value) {
return pb.collection('settings').create({ key, value: String(value) });
}
}
// ── Curriculum ────────────────────────────────────────────────────────────────
export async function getCurriculum(year) {
try {
return await pb.collection('curriculum').getFullList({
filter: `year=${year}`,
sort: 'week_number',
});
} catch { return []; }
}
export async function getCurriculumWeek(year, weekNumber) {
try {
return await pb.collection('curriculum').getFirstListItem(
`year=${year} && week_number=${weekNumber}`
);
} catch { return null; }
}
export async function setCurriculumWeek(year, weekNumber, data) {
try {
const r = await pb.collection('curriculum').getFirstListItem(
`year=${year} && week_number=${weekNumber}`
);
return pb.collection('curriculum').update(r.id, data);
} catch {
return pb.collection('curriculum').create({
year,
week_number: weekNumber,
...data,
});
}
}
export async function deleteCurriculumWeek(year, weekNumber) {
try {
const r = await pb.collection('curriculum').getFirstListItem(
`year=${year} && week_number=${weekNumber}`
);
return pb.collection('curriculum').delete(r.id);
} catch { /* nothing to delete */ }
}
export async function bulkSetCurriculum(year, weeks) {
// Delete all existing entries for this year first
const existing = await getCurriculum(year);
await Promise.all(
existing.map(r => pb.collection('curriculum').delete(r.id, { requestKey: null }))
);
// Create all new entries
return Promise.all(
weeks.map(w => pb.collection('curriculum').create({
year,
week_number: w.week_number,
topic_id: w.topic_id || '',
theme: w.theme || '',
quarter: w.quarter || Math.ceil(w.week_number / 13),
is_review_week: w.is_review_week || false,
sort_order: w.sort_order ?? w.week_number,
}, { requestKey: null }))
);
}