diff --git a/public/admin.js b/public/admin.js index 3a1347d..b7bf7f6 100644 --- a/public/admin.js +++ b/public/admin.js @@ -235,26 +235,43 @@ async function openCourseDetail(id) { $('#cd-units').innerHTML = course.units .map( - (u) => `
No units yet — add one below.
`; + document.querySelectorAll('#cd-units .unit-toggle').forEach((hdr) => { + hdr.addEventListener('click', (e) => { + if (e.target.closest('button')) return; + const block = hdr.closest('.unit-block'); + block.classList.toggle('open'); + }); + }); + document.querySelectorAll('[data-del-unit]').forEach((btn) => btn.addEventListener('click', async () => { if (!confirm('Delete this unit and everything in it?')) return; diff --git a/public/app.js b/public/app.js index 58d18d3..12d704b 100644 --- a/public/app.js +++ b/public/app.js @@ -508,34 +508,82 @@ function printSpellingWorksheet(name, words) { // ---------- course detail ---------- +function activeUnitIndex(units) { + const today = new Date().toISOString().slice(0, 10); + const dated = units.map((u, i) => { + const dates = u.items.map((it) => it.due_date).filter(Boolean).sort(); + return { i, earliest: dates[0] || null, latest: dates[dates.length - 1] || null }; + }).filter((x) => x.earliest); + + if (dated.length) { + const spanning = dated.find((x) => x.earliest <= today && x.latest >= today); + if (spanning) return spanning.i; + const past = dated.filter((x) => x.latest < today).sort((a, b) => b.latest.localeCompare(a.latest)); + if (past.length) return past[0].i; + const future = dated.filter((x) => x.earliest > today).sort((a, b) => a.earliest.localeCompare(b.earliest)); + if (future.length) return future[0].i; + } + const fallback = units.findIndex((u) => u.items.some((it) => it.status === 'not_started' && !it.locked)); + return fallback >= 0 ? fallback : 0; +} + async function openCourse(courseId) { const course = await api(`/api/courses/${courseId}/detail?studentId=${currentStudent.id}`); $('#course-title').textContent = course.name; + const activeIdx = activeUnitIndex(course.units); $('#course-units').innerHTML = course.units - .map( - (u) => `