From 9b9dccc07ae1f588104cd0ff8f784c806ddc5f73 Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Tue, 4 Aug 2026 18:20:25 +0100 Subject: [PATCH] feat(dashboard): add last updated at course sort option (#823) Co-authored-by: Cursor Agent Co-authored-by: Rotimi Best --- apps/dashboard/src/lib/features/course/utils/constants.ts | 2 ++ apps/dashboard/src/lib/features/lms/pages/explore.svelte | 7 +++++++ apps/dashboard/src/lib/utils/translations/da.json | 1 + apps/dashboard/src/lib/utils/translations/de.json | 1 + apps/dashboard/src/lib/utils/translations/en.json | 1 + apps/dashboard/src/lib/utils/translations/es.json | 1 + apps/dashboard/src/lib/utils/translations/fr.json | 1 + apps/dashboard/src/lib/utils/translations/hi.json | 1 + apps/dashboard/src/lib/utils/translations/pl.json | 1 + apps/dashboard/src/lib/utils/translations/pt.json | 1 + apps/dashboard/src/lib/utils/translations/ru.json | 1 + apps/dashboard/src/lib/utils/translations/vi.json | 1 + .../src/routes/(app)/org/[slug]/courses/+page.svelte | 7 +++++++ 13 files changed, 26 insertions(+) diff --git a/apps/dashboard/src/lib/features/course/utils/constants.ts b/apps/dashboard/src/lib/features/course/utils/constants.ts index 6a1e6186..33a266ab 100644 --- a/apps/dashboard/src/lib/features/course/utils/constants.ts +++ b/apps/dashboard/src/lib/features/course/utils/constants.ts @@ -19,6 +19,7 @@ export const EXERCISE_TEMPLATE_TAGS = { /** Named sort keys for course lists (URL `sort`, localStorage, filter UI). */ export const CourseSortBy = { DateCreated: 'date_created', + LastUpdatedAt: 'last_updated_at', Published: 'published', Lessons: 'lessons' } as const; @@ -68,6 +69,7 @@ export function parseCourseSortOrder(value: string | null | undefined): CourseSo export const COURSE_SORT_OPTIONS = [ { value: CourseSortBy.DateCreated, label: 'courses.course_filter.date_created' }, + { value: CourseSortBy.LastUpdatedAt, label: 'courses.course_filter.last_updated_at' }, { value: CourseSortBy.Published, label: 'courses.course_filter.published' }, { value: CourseSortBy.Lessons, label: 'courses.course_filter.lessons' } ] as const; diff --git a/apps/dashboard/src/lib/features/lms/pages/explore.svelte b/apps/dashboard/src/lib/features/lms/pages/explore.svelte index dbbe09c8..1d05a1cd 100644 --- a/apps/dashboard/src/lib/features/lms/pages/explore.svelte +++ b/apps/dashboard/src/lib/features/lms/pages/explore.svelte @@ -39,6 +39,13 @@ return coursesFiltered.sort( (a, b) => new Date(a.createdAt ?? '').getTime() - new Date(b.createdAt ?? '').getTime() ); + } else if (sortKey === CourseSortBy.LastUpdatedAt) { + return coursesFiltered.sort((a, b) => { + const aUpdatedAt = new Date(a.updatedAt ?? a.createdAt ?? '').getTime(); + const bUpdatedAt = new Date(b.updatedAt ?? b.createdAt ?? '').getTime(); + + return bUpdatedAt - aUpdatedAt; + }); } else if (sortKey === CourseSortBy.Published) { return coursesFiltered.sort((a, b) => Number(b.isPublished) - Number(a.isPublished)); } else if (sortKey === CourseSortBy.Lessons) { diff --git a/apps/dashboard/src/lib/utils/translations/da.json b/apps/dashboard/src/lib/utils/translations/da.json index bf38273b..93c8bfa6 100644 --- a/apps/dashboard/src/lib/utils/translations/da.json +++ b/apps/dashboard/src/lib/utils/translations/da.json @@ -2613,6 +2613,7 @@ "most_lessons": "Lektioner: Flest først", "fewest_lessons": "Lektioner: Færrest først", "date_created": "Dato oprettet", + "last_updated_at": "Sidst opdateret", "published": "Udgivet", "lessons": "Lektioner" }, diff --git a/apps/dashboard/src/lib/utils/translations/de.json b/apps/dashboard/src/lib/utils/translations/de.json index e4301307..871c9d21 100644 --- a/apps/dashboard/src/lib/utils/translations/de.json +++ b/apps/dashboard/src/lib/utils/translations/de.json @@ -2613,6 +2613,7 @@ "most_lessons": "Lektionen: Meiste zuerst", "fewest_lessons": "Lektionen: Wenigste zuerst", "date_created": "Erstellungsdatum", + "last_updated_at": "Zuletzt aktualisiert", "published": "Veröffentlicht", "lessons": "Lektionen" }, diff --git a/apps/dashboard/src/lib/utils/translations/en.json b/apps/dashboard/src/lib/utils/translations/en.json index 178ce8c2..26e126ce 100644 --- a/apps/dashboard/src/lib/utils/translations/en.json +++ b/apps/dashboard/src/lib/utils/translations/en.json @@ -1861,6 +1861,7 @@ "most_lessons": "Lessons: Most first", "fewest_lessons": "Lessons: Fewest first", "date_created": "Date Created", + "last_updated_at": "Last Updated At", "published": "Published", "lessons": "Lessons" }, diff --git a/apps/dashboard/src/lib/utils/translations/es.json b/apps/dashboard/src/lib/utils/translations/es.json index 09a42a31..b567e83e 100644 --- a/apps/dashboard/src/lib/utils/translations/es.json +++ b/apps/dashboard/src/lib/utils/translations/es.json @@ -2613,6 +2613,7 @@ "most_lessons": "Lecciones: más primero", "fewest_lessons": "Lecciones: menos primero", "date_created": "Fecha de creación", + "last_updated_at": "Última actualización", "published": "Publicado", "lessons": "Lecciones" }, diff --git a/apps/dashboard/src/lib/utils/translations/fr.json b/apps/dashboard/src/lib/utils/translations/fr.json index 196b71d8..7755ee06 100644 --- a/apps/dashboard/src/lib/utils/translations/fr.json +++ b/apps/dashboard/src/lib/utils/translations/fr.json @@ -2613,6 +2613,7 @@ "most_lessons": "Leçons : plus d'abord", "fewest_lessons": "Leçons : moins d'abord", "date_created": "Date de création", + "last_updated_at": "Dernière mise à jour", "published": "Publié", "lessons": "Leçons" }, diff --git a/apps/dashboard/src/lib/utils/translations/hi.json b/apps/dashboard/src/lib/utils/translations/hi.json index dcb8466f..ebff8191 100644 --- a/apps/dashboard/src/lib/utils/translations/hi.json +++ b/apps/dashboard/src/lib/utils/translations/hi.json @@ -2613,6 +2613,7 @@ "most_lessons": "पाठ: सबसे अधिक पहले", "fewest_lessons": "पाठ: सबसे कम पहले", "date_created": "दिनांक निर्मित", + "last_updated_at": "अंतिम अपडेट", "published": "प्रकाशित", "lessons": "सबक" }, diff --git a/apps/dashboard/src/lib/utils/translations/pl.json b/apps/dashboard/src/lib/utils/translations/pl.json index 79214763..fd4ce200 100644 --- a/apps/dashboard/src/lib/utils/translations/pl.json +++ b/apps/dashboard/src/lib/utils/translations/pl.json @@ -2613,6 +2613,7 @@ "most_lessons": "Lekcje: od największej liczby", "fewest_lessons": "Lekcje: od najmniejszej liczby", "date_created": "Data utworzenia", + "last_updated_at": "Ostatnia aktualizacja", "published": "Opublikowano", "lessons": "Lekcje" }, diff --git a/apps/dashboard/src/lib/utils/translations/pt.json b/apps/dashboard/src/lib/utils/translations/pt.json index 10e776f3..de671ed0 100644 --- a/apps/dashboard/src/lib/utils/translations/pt.json +++ b/apps/dashboard/src/lib/utils/translations/pt.json @@ -2613,6 +2613,7 @@ "most_lessons": "Lições: mais primeiro", "fewest_lessons": "Lições: menos primeiro", "date_created": "Data de criação", + "last_updated_at": "Última atualização", "published": "Publicado", "lessons": "Lições" }, diff --git a/apps/dashboard/src/lib/utils/translations/ru.json b/apps/dashboard/src/lib/utils/translations/ru.json index 7b037ec5..20ca0622 100644 --- a/apps/dashboard/src/lib/utils/translations/ru.json +++ b/apps/dashboard/src/lib/utils/translations/ru.json @@ -2613,6 +2613,7 @@ "most_lessons": "Уроки: сначала больше", "fewest_lessons": "Уроки: сначала меньше", "date_created": "Дата создания", + "last_updated_at": "Последнее обновление", "published": "Опубликовано", "lessons": "Уроки" }, diff --git a/apps/dashboard/src/lib/utils/translations/vi.json b/apps/dashboard/src/lib/utils/translations/vi.json index 5617b438..f67b61eb 100644 --- a/apps/dashboard/src/lib/utils/translations/vi.json +++ b/apps/dashboard/src/lib/utils/translations/vi.json @@ -2613,6 +2613,7 @@ "most_lessons": "Bài học: Nhiều nhất trước", "fewest_lessons": "Bài học: Ít nhất trước", "date_created": "Ngày tạo", + "last_updated_at": "Cập nhật lần cuối", "published": "Đã xuất bản", "lessons": "Bài học" }, diff --git a/apps/dashboard/src/routes/(app)/org/[slug]/courses/+page.svelte b/apps/dashboard/src/routes/(app)/org/[slug]/courses/+page.svelte index e8b18b91..d01d5163 100644 --- a/apps/dashboard/src/routes/(app)/org/[slug]/courses/+page.svelte +++ b/apps/dashboard/src/routes/(app)/org/[slug]/courses/+page.svelte @@ -156,6 +156,13 @@ ? new Date(a.createdAt ?? '').getTime() - new Date(b.createdAt ?? '').getTime() : new Date(b.createdAt ?? '').getTime() - new Date(a.createdAt ?? '').getTime() ); + } else if (sortKey === CourseSortBy.LastUpdatedAt) { + return sortedCourses.sort((a, b) => { + const aUpdatedAt = new Date(a.updatedAt ?? a.createdAt ?? '').getTime(); + const bUpdatedAt = new Date(b.updatedAt ?? b.createdAt ?? '').getTime(); + + return selectedOrder === CourseSortOrder.Asc ? aUpdatedAt - bUpdatedAt : bUpdatedAt - aUpdatedAt; + }); } else if (sortKey === CourseSortBy.Published) { return sortedCourses.sort((a, b) => selectedOrder === CourseSortOrder.Asc