diff --git a/src/components/generic/Breadcrumb/AppBreadcrumb.jsx b/src/components/generic/Breadcrumb/AppBreadcrumb.jsx index eeb8507..34b626d 100644 --- a/src/components/generic/Breadcrumb/AppBreadcrumb.jsx +++ b/src/components/generic/Breadcrumb/AppBreadcrumb.jsx @@ -66,16 +66,14 @@ const AppBreadcrumb = ({ items = [] }) => { {isLast ? ( - // Current page — no interaction - + {item.icon} - {item.label} + {item.label} ) : ( - // Clickable link
{ if (item.onClick) { item.onClick(e, navigate); @@ -86,7 +84,7 @@ const AppBreadcrumb = ({ items = [] }) => { }} > {item.icon} - {item.label} + {item.label}
)} diff --git a/src/contexts/AdminCoursesContext.jsx b/src/contexts/AdminCoursesContext.jsx index 18c0a75..94a677f 100644 --- a/src/contexts/AdminCoursesContext.jsx +++ b/src/contexts/AdminCoursesContext.jsx @@ -572,10 +572,10 @@ export function CoursesProvider({ children }) { [request], ); - const deleteLesson = useCallback( - (courseId, unitId, lessonId, deletedBy) => + const archiveLesson = useCallback( + (courseId, unitId, lessonId) => request(async () => { - const { data } = await api.delete(`${BASE}/${courseId}/units/${unitId}/lessons/${lessonId}`, { data: { deletedBy } }); + const { data } = await api.delete(`${BASE}/${courseId}/units/${unitId}/lessons/${lessonId}`); setLessons((prev) => prev.filter((l) => l.lesson_id !== lessonId)); setLesson((prev) => (prev?.lesson_id === lessonId ? null : prev)); toast.success("Lesson archived."); @@ -584,10 +584,10 @@ export function CoursesProvider({ children }) { [request], ); - const bulkArchiveLessons = useCallback( - (courseId, unitId, ids, deletedBy) => + const archiveLessons = useCallback( + (courseId, unitId, { ids }) => request(async () => { - const { data } = await api.delete(`${BASE}/${courseId}/units/${unitId}/lessons/bulk`, { data: { ids, deletedBy } }); + const { data } = await api.delete(`${BASE}/${courseId}/units/${unitId}/lessons/bulk`, { data: { ids } }); setLessons((prev) => prev.filter((l) => !ids.includes(l.lesson_id))); toast.success("Lessons archived."); return data; @@ -615,9 +615,9 @@ export function CoursesProvider({ children }) { ); const restoreLesson = useCallback( - (courseId, unitId, lessonId, restoredBy) => + (courseId, unitId, lessonId) => request(async () => { - const { data } = await api.patch(`${BASE}/${courseId}/units/${unitId}/lessons/${lessonId}/restore`, { restoredBy }); + const { data } = await api.patch(`${BASE}/${courseId}/units/${unitId}/lessons/${lessonId}/restore`); const result = data?.data?.data ?? null; if (result) { setLessons((prev) => prev.filter((l) => l.lesson_id !== lessonId)); @@ -628,10 +628,10 @@ export function CoursesProvider({ children }) { [request], ); - const bulkRestoreLessons = useCallback( - (courseId, unitId, ids, restoredBy) => + const restoreLessons = useCallback( + (courseId, unitId, { ids }) => request(async () => { - const { data } = await api.patch(`${BASE}/${courseId}/units/${unitId}/lessons/restore/bulk`, { ids, restoredBy }); + const { data } = await api.patch(`${BASE}/${courseId}/units/${unitId}/lessons/restore/bulk`, { ids }); setLessons((prev) => prev.filter((l) => !ids.includes(l.lesson_id))); toast.success("Lessons restored."); return data; @@ -963,14 +963,14 @@ export function CoursesProvider({ children }) { fetchLesson, createLesson, updateLesson, - deleteLesson, - bulkArchiveLessons, + archiveLesson, + archiveLessons, // ── lesson archives & restore ────────────────────────────────────────── fetchArchivedLessons, fetchArchivedLesson, restoreLesson, - bulkRestoreLessons, + restoreLessons, // ── lesson page ──────────────────────────────────────────────────────── fetchLessonPage, diff --git a/src/modules/admin/components/courses/ArchivedLessonsTable.jsx b/src/modules/admin/components/courses/ArchivedLessonsTable.jsx index e69de29..b27cb5e 100644 --- a/src/modules/admin/components/courses/ArchivedLessonsTable.jsx +++ b/src/modules/admin/components/courses/ArchivedLessonsTable.jsx @@ -0,0 +1,141 @@ +import { useMemo, useRef, useState, useEffect, useCallback } from "react"; +import { useNavigate } from "react-router-dom"; + +import { useCourses } from "@/contexts/AdminCoursesContext"; + +import DataTable from "@/components/generic/Table/DataTable"; +import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; +import { RestoreDialog } from "@/components/generic/Dialogs/RestoreDialog"; + +import { buildDataColumns, columnPinning } from "../../config/courses/lessons/archive/columns.config"; +import { buildToolbarActions } from "../../config/courses/lessons/archive/toolbar.config"; +import { buildSelectionActions } from "../../config/courses/lessons/archive/selection.config"; +import { buildRowActions } from "../../config/courses/lessons/archive/rowActions.config"; + +import { getTimestamp } from "@/utils/timestamp.util"; + +export default function ArchivedLessonsTable({ courseId, unitId }) { + const [restoreTarget, setRestoreTarget] = useState(null); + const [restoreIds, setRestoreIds] = useState(null); + + const tableRefsRef = useRef({ + getFilters: () => [], + getSort: () => [], + resetSelection: () => { }, + setFilters: () => { }, + }); + + const navigate = useNavigate(); + + const { + course, unit, lessons, attributes, pagination, setPagination, loading, + fetchArchivedLessons, restoreLesson, restoreLessons, fetchLessonFieldValues + } = useCourses(); + + const handleRefsReady = (refs) => { + tableRefsRef.current = refs; + }; + + const exportConfig = { + allData: lessons, + attributes, + filename: `${getTimestamp()}_${course?.title}_${unit?.title}_Lessons`, + sheetName: "Archived Lessons", + }; + + const handleFetch = useCallback( + (params) => fetchArchivedLessons(courseId, unitId, params), + [courseId, unitId] + ); + + const rowActions = useMemo(() => buildRowActions({ + navigate, + onRestore: (row) => setRestoreTarget(row), + }), [courseId, unitId]); + + const toolbarActions = buildToolbarActions({ + fetchArchivedLessons: (params) => fetchArchivedLessons(courseId, unitId, params), + pagination, + exportConfig, + navigate, + courseId, + unitId, + getFilters: () => tableRefsRef.current.getFilters(), + getSort: () => tableRefsRef.current.getSort(), + getTableInstance: () => tableRefsRef.current.tableInstance, + }); + + const selectionActions = buildSelectionActions({ + exportConfig, + restoreLesson: (row) => setRestoreTarget(row), // single + restoreLessons: (ids) => setRestoreIds(ids), // bulk + getTableInstance: () => tableRefsRef.current.tableInstance, + }); + + const columns = useMemo( + () => buildDataColumns(attributes, rowActions), + [attributes, rowActions] + ); + + const handleRestoreSuccess = () => { + setRestoreTarget(null); + setRestoreIds(null); + tableRefsRef.current.resetSelection?.(); + fetchArchivedLessons(courseId, unitId, { page: 1, limit: pagination?.limit ?? 10 }); + }; + + return ( + <> + fetchLessonFieldValues(courseId, unitId, field)} + onRefsReady={handleRefsReady} + renderFilterSheet={({ open, onOpenChange, column, attr, data, loading }) => ( + + )} + columnPinning={columnPinning} + toolbarActions={toolbarActions} + selectionActions={selectionActions} + recordLabel="lesson" + emptyMessage="No lessons found." + /> + + {/* Single restore */} + !v && setRestoreTarget(null)} + entity={restoreTarget} + entityLabel="Lesson" + getName={(c) => c?.title} + onRestore={(c) => restoreLesson(courseId, unitId, c?.lesson_id)} + loading={loading} + onSuccess={handleRestoreSuccess} + /> + + {/* Bulk restore */} + !v && setRestoreIds(null)} + ids={restoreIds ?? []} + entityLabel="Lesson" + onRestore={(ids) => restoreLessons(courseId, unitId, ids)} + loading={loading} + onSuccess={handleRestoreSuccess} + /> + + ); +} diff --git a/src/modules/admin/components/courses/ArchivedUnitsTable.jsx b/src/modules/admin/components/courses/ArchivedUnitsTable.jsx index 1a66446..bc81f43 100644 --- a/src/modules/admin/components/courses/ArchivedUnitsTable.jsx +++ b/src/modules/admin/components/courses/ArchivedUnitsTable.jsx @@ -53,7 +53,7 @@ export default function ArchivedUnitsTable({ courseId }) { }), [courseId]); const toolbarActions = buildToolbarActions({ - fetchUnits: (params) => fetchArchivedUnits(courseId, params), + fetchArchivedUnits: (params) => fetchArchivedUnits(courseId, params), pagination, exportConfig, navigate, @@ -70,7 +70,6 @@ export default function ArchivedUnitsTable({ courseId }) { getTableInstance: () => tableRefsRef.current.tableInstance, }); - const columns = useMemo( () => buildDataColumns(attributes, rowActions), [attributes] diff --git a/src/modules/admin/components/courses/LessonsTable.jsx b/src/modules/admin/components/courses/LessonsTable.jsx index 700c143..3aec87c 100644 --- a/src/modules/admin/components/courses/LessonsTable.jsx +++ b/src/modules/admin/components/courses/LessonsTable.jsx @@ -9,12 +9,14 @@ import { ArchiveDialog } from "@/components/generic/Dialogs/ArchiveDialog"; import { buildDataColumns, columnPinning } from "../../config/courses/lessons/columns.config"; import { buildToolbarActions } from "../../config/courses/lessons/toolbar.config"; +import { buildSelectionActions } from "../../config/courses/lessons/selection.config"; import { buildRowActions } from "../../config/courses/lessons/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; export default function LessonsTable({ courseId, unitId }) { const [archiveTarget, setArchiveTarget] = useState(null); + const [archiveIds, setArchiveIds] = useState(null); const tableRefsRef = useRef({ getFilters: () => [], @@ -26,8 +28,8 @@ export default function LessonsTable({ courseId, unitId }) { const navigate = useNavigate(); const { - lessons, attributes, pagination, setPagination, loading, - fetchLessons, deleteLesson, + course, unit, lessons, attributes, pagination, setPagination, loading, + fetchLessons, archiveLesson, archiveLessons, fetchLessonFieldValues } = useCourses(); const handleRefsReady = (refs) => { @@ -37,7 +39,7 @@ export default function LessonsTable({ courseId, unitId }) { const exportConfig = { allData: lessons, attributes, - filename: `${getTimestamp()}_Lessons`, + filename: `${getTimestamp()}_${course?.title}_${unit?.title}_Lessons`, sheetName: "Lessons", }; @@ -66,6 +68,13 @@ export default function LessonsTable({ courseId, unitId }) { getTableInstance: () => tableRefsRef.current.tableInstance, }); + const selectionActions = buildSelectionActions({ + exportConfig, + onArchive: (row) => setArchiveTarget(row), + onArchiveMany: (ids) => setArchiveIds(ids), + getTableInstance: () => tableRefsRef.current.tableInstance, + }); + const columns = useMemo( () => buildDataColumns(attributes, rowActions), [attributes, rowActions] @@ -73,6 +82,7 @@ export default function LessonsTable({ courseId, unitId }) { const handleArchiveSuccess = () => { setArchiveTarget(null); + setArchiveIds(null); tableRefsRef.current.resetSelection?.(); fetchLessons(courseId, unitId, { page: 1, limit: pagination?.limit ?? 10 }); }; @@ -88,7 +98,7 @@ export default function LessonsTable({ courseId, unitId }) { setPagination={setPagination} loading={loading} onFetch={handleFetch} - onFetchFilterData={() => []} + onFetchFilterData={(field) => fetchLessonFieldValues(courseId, unitId, field)} onRefsReady={handleRefsReady} renderFilterSheet={({ open, onOpenChange, column, attr, data, loading }) => ( + {/* ── Single archive ── */} !v && setArchiveTarget(null)} entity={archiveTarget} entityLabel="Lesson" - getName={(l) => l?.title} - onArchive={(l) => deleteLesson(courseId, unitId, l?.lesson_id)} + getName={(c) => c?.title} + onArchive={(c) => archiveLesson(courseId, unitId, c?.lesson_id)} + loading={loading} + onSuccess={handleArchiveSuccess} + /> + + {/* ── Bulk archive ── */} + !v && setArchiveIds(null)} + ids={archiveIds ?? []} + entityLabel="Lesson" + onArchive={(ids) => archiveLessons(courseId, unitId, ids)} loading={loading} onSuccess={handleArchiveSuccess} /> diff --git a/src/modules/admin/components/courses/UnitsTable.jsx b/src/modules/admin/components/courses/UnitsTable.jsx index bd9ccaf..c58e786 100644 --- a/src/modules/admin/components/courses/UnitsTable.jsx +++ b/src/modules/admin/components/courses/UnitsTable.jsx @@ -29,7 +29,7 @@ export default function UnitsTable({ courseId }) { const navigate = useNavigate(); const { - units, attributes, pagination, setPagination, loading, + course, units, attributes, pagination, setPagination, loading, fetchUnits, archiveUnit, archiveUnits, fetchUnitFieldValues } = useCourses(); @@ -40,7 +40,7 @@ export default function UnitsTable({ courseId }) { const exportConfig = { allData: units, attributes, - filename: `${getTimestamp()}_Units`, + filename: `${getTimestamp()}_${course?.title}_Units`, sheetName: "Units", }; diff --git a/src/modules/admin/config/courses/lessons/archive/rowActions.config.jsx b/src/modules/admin/config/courses/lessons/archive/rowActions.config.jsx index e2952b6..9d44130 100644 --- a/src/modules/admin/config/courses/lessons/archive/rowActions.config.jsx +++ b/src/modules/admin/config/courses/lessons/archive/rowActions.config.jsx @@ -1,41 +1,20 @@ -import { Eye, Pencil, Archive, SquarePlus, SquareChartGantt } from "lucide-react"; +// modules/admin/config/assets/rowActions.config.jsx +import { RotateCcw } from "lucide-react"; -export function buildRowActions({ onCreatePage, onViewPage, onView, onEdit, onArchive }) { - return [ - { - key: "view", - label: "View Lesson", - icon: , - onClick: (row) => onView(row), - }, - { - key: "edit", - label: "Edit Lesson", - icon: , - onClick: (row) => onEdit(row), - }, - { - key: "edit", - label: "View Content", - icon: , - className: "text-sky-700 hover:text-sky-600", - onClick: (row) => onViewPage(row), - separator: true, - }, - { - key: "edit", - label: "Modify Content", - icon: , - className: "text-sky-700 hover:text-sky-600", - onClick: (row) => onCreatePage(row), - }, - { - key: "archive", - label: "Archive", - icon: , - className: "text-destructive", - onClick: (row) => onArchive(row), - separator: true - }, - ] -} +/** + * @param {Object} deps + * @param {Function} deps.onView (row) → void — navigate to view page + * @param {Function} deps.onEdit (row) → void — navigate to edit page + * @param {Function} deps.onArchive (row) → void — open archive dialog + */ +export function buildRowActions({ onRestore }) { + return [ + { + key: "restore", + label: "Restore", + className: "text-emerald-600 focus:text-emerald-600", + icon: , + onClick: (row) => onRestore(row), + }, + ]; +} \ No newline at end of file diff --git a/src/modules/admin/config/courses/lessons/archive/selection.config.jsx b/src/modules/admin/config/courses/lessons/archive/selection.config.jsx index 6cc4c31..841b1df 100644 --- a/src/modules/admin/config/courses/lessons/archive/selection.config.jsx +++ b/src/modules/admin/config/courses/lessons/archive/selection.config.jsx @@ -1,7 +1,8 @@ -import { Download, Archive } from "lucide-react"; +// config/assets/archive/selection.config.jsx +import { Download, ArchiveRestore } from "lucide-react"; import { exportTableToExcel } from "@/utils/excel.util"; -export function buildSelectionActions({ exportConfig, onArchive, onArchiveMany, getTableInstance }) { +export function buildSelectionActions({ exportConfig, restoreLesson, restoreLessons, getTableInstance }) { return [ { key: "export-selected", @@ -15,16 +16,16 @@ export function buildSelectionActions({ exportConfig, onArchive, onArchiveMany, }), }, { - key: "archive-selected", - label: "Archive", - icon: , - className: "text-destructive border-destructive/40 hover:bg-destructive/10 hover:text-destructive", + key: "restore-selected", + label: "Restore", + icon: , + className: "text-emerald-600 border-emerald-600/40 hover:bg-emerald-600/10 hover:text-emerald-700", onClick: (rows) => { - const ids = rows.map((r) => r.asset_id); + const ids = rows.map((r) => r.lesson_id); ids.length === 1 - ? onArchive(rows[0]) - : onArchiveMany(ids); + ? restoreLesson(rows[0]) + : restoreLessons(ids); }, }, ]; -} +} \ No newline at end of file diff --git a/src/modules/admin/config/courses/lessons/archive/toolbar.config.jsx b/src/modules/admin/config/courses/lessons/archive/toolbar.config.jsx index 369d195..1ed4935 100644 --- a/src/modules/admin/config/courses/lessons/archive/toolbar.config.jsx +++ b/src/modules/admin/config/courses/lessons/archive/toolbar.config.jsx @@ -1,15 +1,11 @@ -// config/courses/lessons/toolbar.config.jsx - import { Plus, RefreshCw, Download, Archive } from "lucide-react"; import { exportTableToExcel } from "@/utils/excel.util"; export function buildToolbarActions({ - fetchLessons, + fetchArchivedLessons, pagination, exportConfig, navigate, - courseId, - unitId, getFilters, getSort, getTableInstance, @@ -21,7 +17,7 @@ export function buildToolbarActions({ label: "Refresh", icon: , variant: "outline", - onClick: () => fetchLessons({ + onClick: () => fetchArchivedLessons({ page: 1, limit: pagination?.limit ?? 10, filters: getFilters(), @@ -39,24 +35,5 @@ export function buildToolbarActions({ tableInstance: getTableInstance(), }), }, - { - key: "create", - type: "button", - label: "New Lesson", - icon: , - variant: "default", - onClick: () => navigate( - `/admin/courses/${courseId}/units/${unitId}/lessons/add` - ), - }, - { - key: "archived-lessons", - type: "button", - icon: , - label: "Archived Lessons", - variant: "secondary", - className: "border border-border", - onClick: () => navigate("/admin/lessons/archived"), - }, ]; } diff --git a/src/modules/admin/config/courses/lessons/selection.config.jsx b/src/modules/admin/config/courses/lessons/selection.config.jsx index 6cc4c31..b82b721 100644 --- a/src/modules/admin/config/courses/lessons/selection.config.jsx +++ b/src/modules/admin/config/courses/lessons/selection.config.jsx @@ -20,7 +20,7 @@ export function buildSelectionActions({ exportConfig, onArchive, onArchiveMany, icon: , className: "text-destructive border-destructive/40 hover:bg-destructive/10 hover:text-destructive", onClick: (rows) => { - const ids = rows.map((r) => r.asset_id); + const ids = rows.map((r) => r.lesson_id); ids.length === 1 ? onArchive(rows[0]) : onArchiveMany(ids); diff --git a/src/modules/admin/config/courses/lessons/toolbar.config.jsx b/src/modules/admin/config/courses/lessons/toolbar.config.jsx index 369d195..d9c02c4 100644 --- a/src/modules/admin/config/courses/lessons/toolbar.config.jsx +++ b/src/modules/admin/config/courses/lessons/toolbar.config.jsx @@ -56,7 +56,7 @@ export function buildToolbarActions({ label: "Archived Lessons", variant: "secondary", className: "border border-border", - onClick: () => navigate("/admin/lessons/archived"), + onClick: () => navigate(`/admin/courses/${courseId}/units/${unitId}/lessons/archived`), }, ]; } diff --git a/src/modules/admin/config/courses/units/archive/toolbar.config.jsx b/src/modules/admin/config/courses/units/archive/toolbar.config.jsx index 2f9c594..8214d57 100644 --- a/src/modules/admin/config/courses/units/archive/toolbar.config.jsx +++ b/src/modules/admin/config/courses/units/archive/toolbar.config.jsx @@ -2,7 +2,7 @@ import { Plus, RefreshCw, Download, Archive } from "lucide-react"; import { exportTableToExcel } from "@/utils/excel.util"; export function buildToolbarActions({ - fetchArchivedCourses, + fetchArchivedUnits, pagination, exportConfig, navigate, @@ -17,7 +17,7 @@ export function buildToolbarActions({ label: "Refresh", icon: , variant: "outline", - onClick: () => fetchArchivedCourses({ + onClick: () => fetchArchivedUnits({ page: 1, limit: pagination?.limit ?? 10, filters: getFilters(), diff --git a/src/modules/admin/pages/courses/lessons/ArchivedLessonsList.jsx b/src/modules/admin/pages/courses/lessons/ArchivedLessonsList.jsx new file mode 100644 index 0000000..82169b0 --- /dev/null +++ b/src/modules/admin/pages/courses/lessons/ArchivedLessonsList.jsx @@ -0,0 +1,58 @@ +import { useEffect, useState } from "react"; +import { useNavigate, useParams } from "react-router-dom"; +import { ArrowLeft, House } from "lucide-react"; + +import { useCourses } from "@/contexts/AdminCoursesContext"; +import AppBreadcrumb from "@/components/generic/Breadcrumb/AppBreadcrumb"; +import { Button } from "@/components/ui/button"; +import { Spinner } from "@/components/ui/spinner"; +import ArchivedLessonsTable from "../../../components/courses/ArchivedLessonsTable"; + +export default function ArchivedLessonsList() { + const navigate = useNavigate(); + const { courseId, unitId } = useParams(); + const { fetchCourse, fetchUnit, course, unit, loading } = useCourses(); + const [initializing, setInitializing] = useState(true); + + useEffect(() => { + (async () => { + await fetchCourse(courseId) + await fetchUnit(courseId, unitId); + setInitializing(false); + })(); + }, [courseId, unitId]); + + const items = [ + { label: "Home", icon: , to: "/admin" }, + { label: "Courses", to: "/admin/courses" }, + { label: course?.title, to: `/admin/courses/${courseId}/units` }, + { label: unit?.title ?? "...", to: `/admin/courses/${courseId}/units/${unitId}/lessons` }, + { label: "Archived" } + ]; + + // Replace the loading check + if (initializing) { + return ( +
+ +
+ ); + } + + return ( +
+
+
+ +
+ +
+ + {/* ── Lessons ── */} + + +
+
+
+ ); +} diff --git a/src/modules/admin/pages/courses/lessons/LessonsList.jsx b/src/modules/admin/pages/courses/lessons/LessonsList.jsx index d64c6a1..a3f0ccf 100644 --- a/src/modules/admin/pages/courses/lessons/LessonsList.jsx +++ b/src/modules/admin/pages/courses/lessons/LessonsList.jsx @@ -48,13 +48,45 @@ export default function LessonsList() {
{/* ── Unit header ── */} -
-
-
+
+ {/* Title + Status */} +
+
UNIT
+

{unit?.title}

- {unit?.description && ( -

{unit.description}

- )} + + {!unit?.deletedBy ? "Active" : "Inactive"} + +
+ {unit?.description && ( +

{unit.description}

+ )} +
+ + {/* Stats row */} +
+
+

Lessons

+

{unit?.lessons?.length}

+
+
+

Order

+

{unit?.order_index}

+
+
+

Created

+

+ {unit?.createdAt ? new Date(unit.createdAt).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) : '—'} +

+
+
+

Last Updated

+

+ {unit?.updatedAt ? new Date(unit.updatedAt).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) : '—'} +

diff --git a/src/modules/admin/pages/courses/units/ArchivedUnitsList.jsx b/src/modules/admin/pages/courses/units/ArchivedUnitsList.jsx index 6bec44a..f1848cd 100644 --- a/src/modules/admin/pages/courses/units/ArchivedUnitsList.jsx +++ b/src/modules/admin/pages/courses/units/ArchivedUnitsList.jsx @@ -24,7 +24,7 @@ export default function ArchivedUnitsList() { const items = [ { label: "Home", icon: , to: "/admin" }, { label: "Courses", to: "/admin/courses" }, - { label: course?.title ?? "...", to: `/admin/courses/${course?.course_id ?? course?.course_id}/units` }, + { label: course?.title ?? "...", to: `/admin/courses/${courseId}/units` }, { label: "Archived" } ]; diff --git a/src/modules/admin/pages/courses/units/UnitsList.jsx b/src/modules/admin/pages/courses/units/UnitsList.jsx index 3a8c401..b91b5f4 100644 --- a/src/modules/admin/pages/courses/units/UnitsList.jsx +++ b/src/modules/admin/pages/courses/units/UnitsList.jsx @@ -49,6 +49,7 @@ export default function UnitsList() {
{/* Title + Status */}
+
COURSE

{course?.title}

, children: [ @@ -149,6 +151,7 @@ export const AdminRoutes = { element: , children: [ { index: true, element: }, + { path: 'archived', element: }, { path: 'add', element: }, { path: ':lessonId/view', element: }, { path: ':lessonId/edit', element: },