This commit is contained in:
rgrgogu
2026-05-20 13:25:03 +08:00
parent 2b1955608d
commit 95242709b0
71 changed files with 5535 additions and 1035 deletions
@@ -17,6 +17,7 @@ import { getTimestamp } from "@/utils/timestamp.util";
export default function CoursesTable() {
const [archiveTarget, setArchiveTarget] = useState(null);
const [archiveIds, setArchiveIds] = useState(null);
const tableRefsRef = useRef({
getFilters: () => [],
@@ -26,9 +27,8 @@ export default function CoursesTable() {
});
const navigate = useNavigate();
const { user } = useAuth();
const { courses, attributes, pagination, setPagination, loading, fetchCourses, deleteCourse, } = useCourses();
const { courses, attributes, pagination, setPagination, loading, fetchCourses, archiveCourse, archiveCourses, fetchCourseFieldValues } = useCourses();
const handleRefsReady = (refs) => {
tableRefsRef.current = refs;
@@ -42,7 +42,9 @@ export default function CoursesTable() {
};
const rowActions = useMemo(() => buildRowActions({
onView: (row) => navigate(`/admin/courses/${row.course_id}`),
onAssessment: (row) => navigate(`/admin/courses/${row.course_id}/assessment`),
onViewUnits: (row) => navigate(`/admin/courses/${row.course_id}/units`),
onView: (row) => navigate(`/admin/courses/${row.course_id}/view`),
onEdit: (row) => navigate(`/admin/courses/${row.course_id}/edit`),
onArchive: (row) => setArchiveTarget(row),
}), []);
@@ -60,16 +62,18 @@ export default function CoursesTable() {
const selectionActions = buildSelectionActions({
exportConfig,
onArchive: (row) => setArchiveTarget(row),
onArchiveMany: (ids) => setArchiveIds(ids),
getTableInstance: () => tableRefsRef.current.tableInstance,
});
const columns = useMemo(
() => buildDataColumns(attributes, rowActions),
[attributes, rowActions]
[attributes]
);
const handleArchiveSuccess = () => {
setArchiveTarget(null);
setArchiveIds(null);
tableRefsRef.current.resetSelection?.();
fetchCourses({ page: 1, limit: pagination?.limit ?? 10 });
};
@@ -85,7 +89,7 @@ export default function CoursesTable() {
setPagination={setPagination}
loading={loading}
onFetch={fetchCourses}
onFetchFilterData={() => []}
onFetchFilterData={fetchCourseFieldValues}
onRefsReady={handleRefsReady}
renderFilterSheet={({ open, onOpenChange, column, attr, data, loading }) => (
<FilterSheet
@@ -104,13 +108,25 @@ export default function CoursesTable() {
emptyMessage="No courses found."
/>
{/* ── Single archive ── */}
<ArchiveDialog
open={!!archiveTarget}
onOpenChange={(v) => !v && setArchiveTarget(null)}
entity={archiveTarget}
entityLabel="Course"
getName={(c) => c?.title}
onArchive={(c) => deleteCourse(c?.course_id)}
onArchive={(c) => archiveCourse(c?.course_id)}
loading={loading}
onSuccess={handleArchiveSuccess}
/>
{/* ── Bulk archive ── */}
<ArchiveDialog
open={!!archiveIds}
onOpenChange={(v) => !v && setArchiveIds(null)}
ids={archiveIds ?? []}
entityLabel="Course"
onArchive={(ids) => archiveCourses(ids)}
loading={loading}
onSuccess={handleArchiveSuccess}
/>