diff --git a/public/js/lessons.js b/public/js/lessons.js index 0733d54..d941d51 100644 --- a/public/js/lessons.js +++ b/public/js/lessons.js @@ -159,6 +159,7 @@ document.getElementById('searchInput').addEventListener('input', () => { }); let lessonLiveSource = null; +let lessonRefreshTimer = null; function connectLessonLive() { if (lessonLiveSource) { lessonLiveSource.close(); lessonLiveSource = null; } @@ -166,6 +167,13 @@ function connectLessonLive() { const t = sessionStorage.getItem('authToken'); if (!t) return; lessonLiveSource = new EventSource(`${API}/api/events?token=${encodeURIComponent(t)}`); + lessonLiveSource.addEventListener('lessons_changed', () => { + if (lessonRefreshTimer) return; + lessonRefreshTimer = setTimeout(() => { + lessonRefreshTimer = null; + loadLessons(); + }, 300); + }); lessonLiveSource.addEventListener('lesson_report_status', () => loadLessons()); lessonLiveSource.onerror = () => { if (lessonLiveSource) { lessonLiveSource.close(); lessonLiveSource = null; } diff --git a/server.js b/server.js index e0b74b4..6015f06 100644 --- a/server.js +++ b/server.js @@ -118,7 +118,10 @@ function invalidateSettings() { cacheDrop('setting:'); cacheDrop('share:payload: function invalidateStudents() { cacheDrop('students:'); } function invalidateGroups() { cacheDrop('groups:'); cacheDrop('students:'); cacheDrop('share:payload:'); } function invalidateEntries() { cacheDrop('entries:'); cacheDrop('students:'); cacheDrop('share:payload:'); } -function invalidateLessonReports() { cacheDrop('lessons:'); cacheDrop('stats:'); cacheDrop('dashboard:'); } +function invalidateLessonReports() { + cacheDrop('lessons:'); cacheDrop('stats:'); cacheDrop('dashboard:'); + broadcastLessonChanged(); +} function invalidateSessions() { cacheDrop('session:'); } function invalidateApiKeys() { cacheDrop('apikey:'); cacheDrop('rl:apikey'); }