diff --git a/src/modules/admin/components/advertisements/ArchivedAdvertisementsTable.jsx b/src/modules/admin/components/advertisements/ArchivedAdvertisementsTable.jsx index 47838af..0704bc2 100644 --- a/src/modules/admin/components/advertisements/ArchivedAdvertisementsTable.jsx +++ b/src/modules/admin/components/advertisements/ArchivedAdvertisementsTable.jsx @@ -4,6 +4,7 @@ import { toast } from "sonner"; import api from "@/utils/api.util"; import { useAdvertisements } from "@/contexts/AdminAdvertisementContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -17,6 +18,7 @@ import { buildSelectionActions } from "../../config/advertisements/arc import { getTimestamp } from "@/utils/timestamp.util"; import { useDateFormat } from "@/hooks/useDateFormat"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchivedAdvertisementsTable() { const [restoreTarget, setRestoreTarget] = useState(null); @@ -33,6 +35,7 @@ export default function ArchivedAdvertisementsTable() { const navigate = useNavigate(); const { fmtDateTime } = useDateFormat(); + const { user: currentUser } = useAuth(); const { advertisements, attributes, pagination, setPagination, loading, @@ -54,6 +57,7 @@ export default function ArchivedAdvertisementsTable() { attributes, filename: `${getTimestamp()}_ArchivedAdvertisements`, sheetName: "Archived Advertisements", + generatedBy: formatGeneratedBy(currentUser), }; const rowActions = buildRowActions({ diff --git a/src/modules/admin/components/assets/ArchivedAssetsTable.jsx b/src/modules/admin/components/assets/ArchivedAssetsTable.jsx index 11cbdc2..f0862d2 100644 --- a/src/modules/admin/components/assets/ArchivedAssetsTable.jsx +++ b/src/modules/admin/components/assets/ArchivedAssetsTable.jsx @@ -2,6 +2,7 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useAssets } from "@/contexts/AdminAssetsContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -14,6 +15,7 @@ import { buildRowActions } from "../../config/assets/archive/row import { buildSelectionActions } from "../../config/assets/archive/selection.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchivedAssetsTable() { const [restoreTarget, setRestoreTarget] = useState(null); @@ -30,6 +32,8 @@ export default function ArchivedAssetsTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { assets, attributes, pagination, setPagination, loading, fetchArchivedAssets, restoreAsset, restoreAssets, fetchAssetFieldValues, @@ -49,6 +53,7 @@ export default function ArchivedAssetsTable() { attributes, filename: `${getTimestamp()}_ArchivedAssets`, sheetName: "Archived Assets", + generatedBy: formatGeneratedBy(currentUser), }; const rowActions = buildRowActions({ diff --git a/src/modules/admin/components/assets/AssetsTable.jsx b/src/modules/admin/components/assets/AssetsTable.jsx index 9f46c5d..aadd614 100644 --- a/src/modules/admin/components/assets/AssetsTable.jsx +++ b/src/modules/admin/components/assets/AssetsTable.jsx @@ -4,6 +4,7 @@ import { useMemo, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useAssets } from "@/contexts/AdminAssetsContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -15,6 +16,7 @@ import { buildSelectionActions } from "../../config/assets/selection.config"; import { buildRowActions } from "../../config/assets/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function AssetsTable() { const [archiveTarget, setArchiveTarget] = useState(null); @@ -29,6 +31,8 @@ export default function AssetsTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { assets, attributes, pagination, setPagination, loading, fetchAssets, archiveAsset, archiveAssets, fetchAssetFieldValues @@ -43,6 +47,7 @@ export default function AssetsTable() { attributes, filename: `${getTimestamp()}_Assets`, sheetName: "Assets", + generatedBy: formatGeneratedBy(currentUser), }; const resolveViewPath = (row) => { diff --git a/src/modules/admin/components/courses/ArchivedCourseTable.jsx b/src/modules/admin/components/courses/ArchivedCourseTable.jsx index 7c59999..a215eba 100644 --- a/src/modules/admin/components/courses/ArchivedCourseTable.jsx +++ b/src/modules/admin/components/courses/ArchivedCourseTable.jsx @@ -15,6 +15,7 @@ import { buildSelectionActions } from "../../config/courses/archive/selection.co import { buildRowActions } from "../../config/courses/archive/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchivedCoursesTable() { const [restoreTarget, setRestoreTarget] = useState(null); @@ -31,6 +32,8 @@ export default function ArchivedCoursesTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { courses, attributes, pagination, setPagination, loading, fetchArchivedCourses, restoreCourse, restoreCourses, @@ -46,6 +49,7 @@ export default function ArchivedCoursesTable() { attributes, filename: `${getTimestamp()}_ArchivedCourses`, sheetName: "Archived Courses", + generatedBy: formatGeneratedBy(currentUser), }; const rowActions = useMemo(() => buildRowActions({ diff --git a/src/modules/admin/components/courses/ArchivedLessonsTable.jsx b/src/modules/admin/components/courses/ArchivedLessonsTable.jsx index 912c28b..a490339 100644 --- a/src/modules/admin/components/courses/ArchivedLessonsTable.jsx +++ b/src/modules/admin/components/courses/ArchivedLessonsTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState, useEffect, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { useCourses } from "@/contexts/AdminCoursesContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -14,6 +15,7 @@ import { buildSelectionActions } from "../../config/courses/lessons/archive/sele import { buildRowActions } from "../../config/courses/lessons/archive/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchivedLessonsTable({ courseId, unitId }) { const [restoreTarget, setRestoreTarget] = useState(null); @@ -30,6 +32,8 @@ export default function ArchivedLessonsTable({ courseId, unitId }) { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { course, unit, lessons, attributes, pagination, setPagination, loading, fetchArchivedLessons, restoreLesson, restoreLessons, fetchLessonFieldValues, @@ -45,6 +49,7 @@ export default function ArchivedLessonsTable({ courseId, unitId }) { attributes, filename: `${getTimestamp()}_${course?.title}_${unit?.title}_Lessons`, sheetName: "Archived Lessons", + generatedBy: formatGeneratedBy(currentUser), }; const handleFetch = useCallback( diff --git a/src/modules/admin/components/courses/ArchivedUnitsTable.jsx b/src/modules/admin/components/courses/ArchivedUnitsTable.jsx index be20083..137c20c 100644 --- a/src/modules/admin/components/courses/ArchivedUnitsTable.jsx +++ b/src/modules/admin/components/courses/ArchivedUnitsTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { useCourses } from "@/contexts/AdminCoursesContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -14,6 +15,7 @@ import { buildSelectionActions } from "../../config/courses/units/archive/select import { buildRowActions } from "../../config/courses/units/archive/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchivedUnitsTable({ courseId }) { const [restoreTarget, setRestoreTarget] = useState(null); @@ -30,6 +32,8 @@ export default function ArchivedUnitsTable({ courseId }) { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { course, units, attributes, pagination, setPagination, loading, fetchArchivedUnits, restoreUnit, restoreUnits, fetchUnitFieldValues, @@ -45,6 +49,7 @@ export default function ArchivedUnitsTable({ courseId }) { attributes, filename: `${getTimestamp()}_${course?.title}_ArchivedUnits`, sheetName: "Archived Units", + generatedBy: formatGeneratedBy(currentUser), }; const handleFetch = useCallback( diff --git a/src/modules/admin/components/courses/CourseTable.jsx b/src/modules/admin/components/courses/CourseTable.jsx index be74133..1eb798f 100644 --- a/src/modules/admin/components/courses/CourseTable.jsx +++ b/src/modules/admin/components/courses/CourseTable.jsx @@ -15,6 +15,7 @@ import { buildSelectionActions } from "../../config/courses/selection.config"; import { buildRowActions } from "../../config/courses/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function CoursesTable() { const [archiveTarget, setArchiveTarget] = useState(null); @@ -29,6 +30,8 @@ export default function CoursesTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { courses, attributes, pagination, setPagination, loading, fetchCourses, reorderCourses, archiveCourse, archiveCourses, fetchCourseFieldValues } = useCourses(); const handleRefsReady = (refs) => { @@ -40,6 +43,7 @@ export default function CoursesTable() { attributes, filename: `${getTimestamp()}_Courses`, sheetName: "Courses", + generatedBy: formatGeneratedBy(currentUser), }; // Reorder — swaps this row with its neighbor in the currently displayed diff --git a/src/modules/admin/components/courses/LessonsTable.jsx b/src/modules/admin/components/courses/LessonsTable.jsx index 8dd159e..b1030c4 100644 --- a/src/modules/admin/components/courses/LessonsTable.jsx +++ b/src/modules/admin/components/courses/LessonsTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState, useEffect, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { useCourses } from "@/contexts/AdminCoursesContext"; +import { useAuth } from "@/contexts/AuthContext"; import api from "@/utils/api.util"; import DataTable from "@/components/generic/Table/DataTable"; @@ -16,6 +17,7 @@ import { buildSelectionActions } from "../../config/courses/lessons/selection.co import { buildRowActions } from "../../config/courses/lessons/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function LessonsTable({ courseId, unitId }) { const [archiveTarget, setArchiveTarget] = useState(null); @@ -31,6 +33,8 @@ export default function LessonsTable({ courseId, unitId }) { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { course, unit, lessons, attributes, pagination, setPagination, loading, fetchLessons, archiveLesson, archiveLessons, fetchLessonFieldValues @@ -45,6 +49,7 @@ export default function LessonsTable({ courseId, unitId }) { attributes, filename: `${getTimestamp()}_${course?.title}_${unit?.title}_Lessons`, sheetName: "Lessons", + generatedBy: formatGeneratedBy(currentUser), }; const handleFetch = useCallback( diff --git a/src/modules/admin/components/courses/UnitsTable.jsx b/src/modules/admin/components/courses/UnitsTable.jsx index 88ebf0d..be16201 100644 --- a/src/modules/admin/components/courses/UnitsTable.jsx +++ b/src/modules/admin/components/courses/UnitsTable.jsx @@ -17,6 +17,7 @@ import { buildSelectionActions } from "../../config/courses/units/selection.conf import { buildRowActions } from "../../config/courses/units/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function UnitsTable({ courseId, returnTo }) { const [archiveTarget, setArchiveTarget] = useState(null); @@ -32,6 +33,8 @@ export default function UnitsTable({ courseId, returnTo }) { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { course, units, attributes, pagination, setPagination, loading, fetchUnits, archiveUnit, archiveUnits, fetchUnitFieldValues @@ -46,6 +49,7 @@ export default function UnitsTable({ courseId, returnTo }) { attributes, filename: `${getTimestamp()}_${course?.title}_Units`, sheetName: "Units", + generatedBy: formatGeneratedBy(currentUser), }; const handleFetch = useCallback( diff --git a/src/modules/admin/components/library/ArchivedLessonLibraryTable.jsx b/src/modules/admin/components/library/ArchivedLessonLibraryTable.jsx index 74961b3..ac72a4f 100644 --- a/src/modules/admin/components/library/ArchivedLessonLibraryTable.jsx +++ b/src/modules/admin/components/library/ArchivedLessonLibraryTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { useLibrary } from "@/contexts/AdminLibraryContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -14,6 +15,7 @@ import { buildArchivedSelectionActions } from "../../config/library/lessons/sele import { buildArchivedRowActions } from "../../config/library/lessons/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchivedLessonLibraryTable() { const [restoreTarget, setRestoreTarget] = useState(null); @@ -30,6 +32,8 @@ export default function ArchivedLessonLibraryTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { lessons, attributes, pagination, setPagination, loading, fetchArchivedLessons, restoreLesson, restoreLessons, @@ -46,6 +50,7 @@ export default function ArchivedLessonLibraryTable() { attributes, filename: `${getTimestamp()}_ArchivedLessonLibrary`, sheetName: "Archived Lessons", + generatedBy: formatGeneratedBy(currentUser), }; const handleFetch = useCallback((params) => fetchArchivedLessons(params), [fetchArchivedLessons]); diff --git a/src/modules/admin/components/library/ArchivedUnitLibraryTable.jsx b/src/modules/admin/components/library/ArchivedUnitLibraryTable.jsx index e8f4329..5ce5ac9 100644 --- a/src/modules/admin/components/library/ArchivedUnitLibraryTable.jsx +++ b/src/modules/admin/components/library/ArchivedUnitLibraryTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { useLibrary } from "@/contexts/AdminLibraryContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -14,6 +15,7 @@ import { buildArchivedSelectionActions } from "../../config/library/units/select import { buildArchivedRowActions } from "../../config/library/units/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchivedUnitLibraryTable() { const [restoreTarget, setRestoreTarget] = useState(null); @@ -30,6 +32,8 @@ export default function ArchivedUnitLibraryTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { units, attributes, pagination, setPagination, loading, fetchArchivedUnits, restoreUnit, restoreUnits, @@ -46,6 +50,7 @@ export default function ArchivedUnitLibraryTable() { attributes, filename: `${getTimestamp()}_ArchivedUnitLibrary`, sheetName: "Archived Units", + generatedBy: formatGeneratedBy(currentUser), }; const handleFetch = useCallback((params) => fetchArchivedUnits(params), [fetchArchivedUnits]); diff --git a/src/modules/admin/components/library/LessonLibraryTable.jsx b/src/modules/admin/components/library/LessonLibraryTable.jsx index 290ca46..42a1ed9 100644 --- a/src/modules/admin/components/library/LessonLibraryTable.jsx +++ b/src/modules/admin/components/library/LessonLibraryTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { useLibrary } from "@/contexts/AdminLibraryContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -13,6 +14,7 @@ import { buildSelectionActions } from "../../config/library/lessons/selection.co import { buildRowActions } from "../../config/library/lessons/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function LessonLibraryTable() { const [archiveTarget, setArchiveTarget] = useState(null); @@ -27,6 +29,8 @@ export default function LessonLibraryTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { lessons, attributes, pagination, setPagination, loading, fetchLessons, archiveLesson, archiveLessons, @@ -42,6 +46,7 @@ export default function LessonLibraryTable() { attributes, filename: `${getTimestamp()}_LessonLibrary`, sheetName: "Lessons", + generatedBy: formatGeneratedBy(currentUser), }; const handleFetch = useCallback((params) => fetchLessons(params), [fetchLessons]); diff --git a/src/modules/admin/components/library/UnitLibraryTable.jsx b/src/modules/admin/components/library/UnitLibraryTable.jsx index 68cb0e7..a7c1418 100644 --- a/src/modules/admin/components/library/UnitLibraryTable.jsx +++ b/src/modules/admin/components/library/UnitLibraryTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { useLibrary } from "@/contexts/AdminLibraryContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -13,6 +14,7 @@ import { buildSelectionActions } from "../../config/library/units/selection.conf import { buildRowActions } from "../../config/library/units/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function UnitLibraryTable() { const [archiveTarget, setArchiveTarget] = useState(null); @@ -27,6 +29,8 @@ export default function UnitLibraryTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { units, attributes, pagination, setPagination, loading, fetchUnits, archiveUnit, archiveUnits, @@ -42,6 +46,7 @@ export default function UnitLibraryTable() { attributes, filename: `${getTimestamp()}_UnitLibrary`, sheetName: "Units", + generatedBy: formatGeneratedBy(currentUser), }; const handleFetch = useCallback((params) => fetchUnits(params), [fetchUnits]); diff --git a/src/modules/admin/components/notifications/ArchivedNotificationBroadcastsTable.jsx b/src/modules/admin/components/notifications/ArchivedNotificationBroadcastsTable.jsx index aee13ca..611589e 100644 --- a/src/modules/admin/components/notifications/ArchivedNotificationBroadcastsTable.jsx +++ b/src/modules/admin/components/notifications/ArchivedNotificationBroadcastsTable.jsx @@ -2,6 +2,7 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useNotificationBroadcasts } from "@/contexts/AdminNotificationBroadcastContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -14,6 +15,7 @@ import { buildRowActions } from "../../config/notifications/arch import { buildSelectionActions } from "../../config/notifications/archive/selection.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchivedNotificationBroadcastsTable() { const [restoreTarget, setRestoreTarget] = useState(null); @@ -30,6 +32,8 @@ export default function ArchivedNotificationBroadcastsTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { broadcasts, attributes, pagination, setPagination, loading, fetchArchivedBroadcasts, restoreBroadcast, restoreBroadcasts, @@ -49,6 +53,7 @@ export default function ArchivedNotificationBroadcastsTable() { attributes, filename: `${getTimestamp()}_ArchivedNotificationBroadcasts`, sheetName: "Archived Announcements", + generatedBy: formatGeneratedBy(currentUser), }; const rowActions = buildRowActions({ diff --git a/src/modules/admin/components/task/ArchiveTaskListTable.jsx b/src/modules/admin/components/task/ArchiveTaskListTable.jsx index 4e5007f..636a9eb 100644 --- a/src/modules/admin/components/task/ArchiveTaskListTable.jsx +++ b/src/modules/admin/components/task/ArchiveTaskListTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useAdminTask } from "@/contexts/AdminTaskContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -14,10 +15,13 @@ import { buildSelectionActions } from "@/modules/admin/config/task_list/archive/ import { buildRowActions } from "@/modules/admin/config/task_list/archive/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchiveTaskListTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { taskLists, attributes, pagination, loading, fetchArchivedTaskLists, @@ -73,6 +77,7 @@ export default function ArchiveTaskListTable() { attributes, filename: `${getTimestamp()}_ArchivedTaskLists`, sheetName: "Archived Task Lists", + generatedBy: formatGeneratedBy(currentUser), }; const rowActions = buildRowActions({ diff --git a/src/modules/admin/components/task/ArchiveTaskTable.jsx b/src/modules/admin/components/task/ArchiveTaskTable.jsx index ce5780d..b6af938 100644 --- a/src/modules/admin/components/task/ArchiveTaskTable.jsx +++ b/src/modules/admin/components/task/ArchiveTaskTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState, useCallback, useEffect } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { useAdminTask } from "@/contexts/AdminTaskContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -14,6 +15,7 @@ import { buildSelectionActions } from "@/modules/admin/config/task_list/task/arc import { buildRowActions } from "@/modules/admin/config/task_list/task/archive/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; import { Dialog, @@ -30,6 +32,8 @@ export default function ArchivedTaskTable() { const navigate = useNavigate(); const { taskListId } = useParams(); + const { user: currentUser } = useAuth(); + const { taskList, tasks, attributes, pagination, loading, fetchTaskList, fetchArchivedTasks, fetchTaskFieldValues, @@ -96,7 +100,8 @@ export default function ArchivedTaskTable() { attributes, filename: `${getTimestamp()}_ArchivedTasks`, sheetName: "Archived Tasks", - }), [tasks, attributes]); + generatedBy: formatGeneratedBy(currentUser), + }), [tasks, attributes, currentUser]); const rowActions = useMemo(() => buildRowActions({ navigate, diff --git a/src/modules/admin/components/task/TaskListTable.jsx b/src/modules/admin/components/task/TaskListTable.jsx index ffd9205..4a9a402 100644 --- a/src/modules/admin/components/task/TaskListTable.jsx +++ b/src/modules/admin/components/task/TaskListTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { useAdminTask } from "@/contexts/AdminTaskContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -14,10 +15,13 @@ import { buildSelectionActions } from "../../config/task_list/selection.config"; import { buildRowActions } from "../../config/task_list/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function TaskListTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { taskLists, attributes, pagination, loading, fetchTaskLists, fetchArchivedTaskLists, fetchTaskListFieldValues, @@ -77,7 +81,8 @@ export default function TaskListTable() { attributes, filename: `${getTimestamp()}_TaskLists`, sheetName: "Task Lists", - }), [taskLists, attributes]); + generatedBy: formatGeneratedBy(currentUser), + }), [taskLists, attributes, currentUser]); // ── Row actions ─────────────────────────────────────────────────────────── const rowActions = buildRowActions({ diff --git a/src/modules/admin/components/tiers/ArchivedTierPlansTable.jsx b/src/modules/admin/components/tiers/ArchivedTierPlansTable.jsx index 80d2a01..c77a5a7 100644 --- a/src/modules/admin/components/tiers/ArchivedTierPlansTable.jsx +++ b/src/modules/admin/components/tiers/ArchivedTierPlansTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { useTiers } from "@/contexts/AdminTiersContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -14,10 +15,13 @@ import { buildSelectionActions } from "../../config/tiers/plans/archive/selectio import { buildRowActions } from "../../config/tiers/plans/archive/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchivedTierPlansTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { plans, planAttributes, planPagination, setPlanPagination, loading, fetchPlans, restorePlan, bulkRestorePlans, @@ -48,7 +52,8 @@ export default function ArchivedTierPlansTable() { attributes: planAttributes, filename: `${getTimestamp()}_ArchivedTierPlans`, sheetName: "Archived Tier Plans", - }), [plans, planAttributes]); + generatedBy: formatGeneratedBy(currentUser), + }), [plans, planAttributes, currentUser]); const rowActions = buildRowActions({ navigate, diff --git a/src/modules/admin/components/tiers/PaymentsTable.jsx b/src/modules/admin/components/tiers/PaymentsTable.jsx index d0a31e5..fd11faf 100644 --- a/src/modules/admin/components/tiers/PaymentsTable.jsx +++ b/src/modules/admin/components/tiers/PaymentsTable.jsx @@ -1,6 +1,7 @@ import { useMemo, useRef, useCallback, useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useTiers } from "@/contexts/AdminTiersContext"; +import { useAuth } from "@/contexts/AuthContext"; import { useDateFormat } from "@/hooks/useDateFormat"; import api from "@/utils/api.util"; import DataTable from "@/components/generic/Table/DataTable"; @@ -10,6 +11,7 @@ import { buildToolbarActions } from "../../config/tiers/payments/toolbar.config" import { buildSelectionActions } from "../../config/tiers/payments/selection.config"; import { buildRowActions } from "../../config/tiers/payments/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function PaymentsTable({ planId = null }) { const tableRefsRef = useRef({ @@ -21,6 +23,7 @@ export default function PaymentsTable({ planId = null }) { const navigate = useNavigate(); const { fmtDateTime } = useDateFormat(); + const { user: currentUser } = useAuth(); const { payments, paymentAttributes, @@ -40,6 +43,7 @@ export default function PaymentsTable({ planId = null }) { attributes: paymentAttributes, filename: `${getTimestamp()}_Payments`, sheetName: "Payments", + generatedBy: formatGeneratedBy(currentUser), }; const rowActions = useMemo(() => buildRowActions({ diff --git a/src/modules/admin/components/tiers/TierPlansTable.jsx b/src/modules/admin/components/tiers/TierPlansTable.jsx index 074cb84..534afc6 100644 --- a/src/modules/admin/components/tiers/TierPlansTable.jsx +++ b/src/modules/admin/components/tiers/TierPlansTable.jsx @@ -3,6 +3,7 @@ import { useNavigate, Link } from "react-router-dom"; import { Layers } from "lucide-react"; import { useTiers } from "@/contexts/AdminTiersContext"; +import { useAuth } from "@/contexts/AuthContext"; import api from "@/utils/api.util"; import DataTable from "@/components/generic/Table/DataTable"; @@ -15,10 +16,13 @@ import { buildSelectionActions } from "../../config/tiers/plans/selection.config import { buildRowActions } from "../../config/tiers/plans/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function TierPlansTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { plans, planAttributes, planPagination, setPlanPagination, loading, fetchPlans, deletePlan, bulkDeletePlans, @@ -64,7 +68,8 @@ export default function TierPlansTable() { attributes: planAttributes, filename: `${getTimestamp()}_TierPlans`, sheetName: "Tier Plans", - }), [plans, planAttributes]); + generatedBy: formatGeneratedBy(currentUser), + }), [plans, planAttributes, currentUser]); const rowActions = buildRowActions({ navigate, diff --git a/src/modules/admin/components/user_groups/ArchiveGroupTable.jsx b/src/modules/admin/components/user_groups/ArchiveGroupTable.jsx index 4a731eb..17afe44 100644 --- a/src/modules/admin/components/user_groups/ArchiveGroupTable.jsx +++ b/src/modules/admin/components/user_groups/ArchiveGroupTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useUserGroups } from "@/contexts/AdminUserGroupContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; import { RestoreDialog } from "@/components/generic/Dialogs/RestoreDialog"; @@ -13,6 +14,7 @@ import { buildSelectionActions } from "../../config/user_groups/archive/selectio import { buildRowActions } from "../../config/user_groups/archive/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchiveGroupTable() { const [restoreTarget, setRestoreTarget] = useState(null); // single: row object @@ -21,6 +23,7 @@ export default function ArchiveGroupTable() { const [deleteIds, setDeleteIds] = useState(null); const tableRefsRef = useRef({ getFilters: () => [], getSort: () => [], resetSelection: () => {} }); const navigate = useNavigate(); + const { user: currentUser } = useAuth(); const { groups, @@ -41,6 +44,7 @@ export default function ArchiveGroupTable() { attributes, filename: `${getTimestamp()}_ArchivedUserGroups`, sheetName: "ArchivedUserGroups", + generatedBy: formatGeneratedBy(currentUser), }; const rowActions = buildRowActions({ diff --git a/src/modules/admin/components/user_groups/GroupTable.jsx b/src/modules/admin/components/user_groups/GroupTable.jsx index bb81da4..8f5e552 100644 --- a/src/modules/admin/components/user_groups/GroupTable.jsx +++ b/src/modules/admin/components/user_groups/GroupTable.jsx @@ -5,6 +5,7 @@ import { useNavigate } from "react-router-dom"; import { useUserGroups } from "@/contexts/AdminUserGroupContext"; import { useDashboard } from "@/contexts/AdminDashboardContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -20,6 +21,7 @@ import { buildRowActions } from "../../config/user_groups/rowActions.config"; import { GROUP_STAT_MAP } from "@/data/adminDashboard.data"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function GroupTable() { const [createOpen, setCreateOpen] = useState(false); @@ -36,6 +38,8 @@ export default function GroupTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { groups, attributes, pagination, setPagination, loading, fetchGroups, fetchGroupFieldValues, @@ -58,6 +62,7 @@ export default function GroupTable() { attributes, filename: `${getTimestamp()}_UserGroups`, sheetName: "UserGroups", + generatedBy: formatGeneratedBy(currentUser), }; const rowActions = buildRowActions({ diff --git a/src/modules/admin/components/users/ArchiveUserTable.jsx b/src/modules/admin/components/users/ArchiveUserTable.jsx index f3e1378..1420a53 100644 --- a/src/modules/admin/components/users/ArchiveUserTable.jsx +++ b/src/modules/admin/components/users/ArchiveUserTable.jsx @@ -2,6 +2,7 @@ import { useMemo, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; import { useUsers } from "@/contexts/AdminUserContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; import { RestoreDialog } from "@/components/generic/Dialogs/RestoreDialog"; @@ -13,6 +14,7 @@ import { buildSelectionActions } from "../../config/users/archive/selection.conf import { buildRowActions } from "../../config/users/archive/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function ArchiveGroupTable() { const [restoreTarget, setRestoreTarget] = useState(null); // single: row object @@ -21,6 +23,7 @@ export default function ArchiveGroupTable() { const [deleteIds, setDeleteIds] = useState(null); const tableRefsRef = useRef({ getFilters: () => [], getSort: () => [], resetSelection: () => { } }); const navigate = useNavigate(); + const { user: currentUser } = useAuth(); const { users, @@ -42,6 +45,7 @@ export default function ArchiveGroupTable() { attributes, filename: `${getTimestamp()}_ArchivedUserGroups`, sheetName: "ArchivedUserGroups", + generatedBy: formatGeneratedBy(currentUser), }; const rowActions = buildRowActions({ diff --git a/src/modules/admin/components/users/UserTable.jsx b/src/modules/admin/components/users/UserTable.jsx index 3f2a5d7..9460a1b 100644 --- a/src/modules/admin/components/users/UserTable.jsx +++ b/src/modules/admin/components/users/UserTable.jsx @@ -20,8 +20,8 @@ import { buildSelectionActions } from "../../config/users/selection.config"; import { buildRowActions } from "../../config/users/rowActions.config"; import { USER_STAT_MAP } from "@/data/adminDashboard.data"; -import { ROLE_CONFIG } from "@/data/profile.data"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function UsersTable() { const [archiveTarget, setArchiveTarget] = useState(null); @@ -59,17 +59,13 @@ export default function UsersTable() { tableRefsRef.current = refs; // ← just store directly, no override needed }; - const generatedBy = currentUser - ? `${currentUser.personal_info?.name?.full_name ?? currentUser.email} (${ROLE_CONFIG[currentUser.acc_type]?.label ?? currentUser.acc_type})` - : undefined; - const exportConfig = { allData: users, attributes, filename: `${getTimestamp()}_Users`, sheetName: "Users", title: "Users", - generatedBy, + generatedBy: formatGeneratedBy(currentUser), }; const rowActions = buildRowActions({ diff --git a/src/modules/admin/pages/task_list/task/Tasks.jsx b/src/modules/admin/pages/task_list/task/Tasks.jsx index 93e424d..0dfe1fc 100644 --- a/src/modules/admin/pages/task_list/task/Tasks.jsx +++ b/src/modules/admin/pages/task_list/task/Tasks.jsx @@ -2,6 +2,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { useAdminTask } from '@/contexts/AdminTaskContext'; +import { useAuth } from '@/contexts/AuthContext'; import DataTable from '@/components/generic/Table/DataTable'; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -31,11 +32,14 @@ import { buildToolbarActions } from '@/modules/admin/config/task_list/task/toolb import { buildSelectionActions } from '@/modules/admin/config/task_list/task/selection.config'; import { buildRowActions } from '@/modules/admin/config/task_list/task/rowActions.config'; import { getTimestamp } from '@/utils/timestamp.util'; +import { formatGeneratedBy } from '@/utils/generatedBy.util'; export default function Tasks() { const navigate = useNavigate(); const { taskListId } = useParams(); + const { user: currentUser } = useAuth(); + const { taskList, tasks, attributes, pagination, loading, fetchTaskList, fetchTasks, fetchArchivedTasks, @@ -94,7 +98,8 @@ export default function Tasks() { attributes, filename: `${getTimestamp()}_Tasks`, sheetName: "Tasks", - }), [tasks, attributes]); + generatedBy: formatGeneratedBy(currentUser), + }), [tasks, attributes, currentUser]); // ── Reorder — swaps this row with its neighbor in the currently displayed // (unfiltered/default-sorted) list, then persists the new order_index set. diff --git a/src/modules/admin/pages/task_list/task/ViewTask.jsx b/src/modules/admin/pages/task_list/task/ViewTask.jsx index ad0fc56..e2bb85f 100644 --- a/src/modules/admin/pages/task_list/task/ViewTask.jsx +++ b/src/modules/admin/pages/task_list/task/ViewTask.jsx @@ -2,6 +2,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; import { useAdminTask } from '@/contexts/AdminTaskContext'; +import { useAuth } from '@/contexts/AuthContext'; import { useDateFormat } from '@/hooks/useDateFormat'; import { Button } from '@/components/ui/button'; @@ -29,6 +30,7 @@ import { import { formatDate } from '@/utils/table.util'; import { getTimestamp } from '@/utils/timestamp.util'; +import { formatGeneratedBy } from '@/utils/generatedBy.util'; import { buildDataColumns, columnPinning } from '@/modules/admin/config/task_list/task_completion/columns.config'; import { buildToolbarActions } from '@/modules/admin/config/task_list/task_completion/toolbar.config'; @@ -179,6 +181,7 @@ export default function ViewTask() { bulkArchiveCompletions, bulkRestoreCompletions, } = useAdminTask(); const { fmtDateTime } = useDateFormat(); + const { user: currentUser } = useAuth(); const [activeTab, setActiveTab] = useState( searchParams.get('tab') === 'completions' ? 'completions' : 'overview' @@ -256,7 +259,8 @@ export default function ViewTask() { attributes: completionAttributes, filename: `${getTimestamp()}_Completions`, sheetName: 'Completions', - }), [completions, completionAttributes]); + generatedBy: formatGeneratedBy(currentUser), + }), [completions, completionAttributes, currentUser]); const rowActions = buildCompletionRowActions({ navigate, diff --git a/src/modules/admin/pages/user_groups/ViewGroup.jsx b/src/modules/admin/pages/user_groups/ViewGroup.jsx index 65e2679..64e09e9 100644 --- a/src/modules/admin/pages/user_groups/ViewGroup.jsx +++ b/src/modules/admin/pages/user_groups/ViewGroup.jsx @@ -31,6 +31,7 @@ import { cn } from "@/lib/utils"; import { useUserGroups } from "@/contexts/AdminUserGroupContext"; import { useUsers } from "@/contexts/AdminUserContext"; +import { useAuth } from "@/contexts/AuthContext"; import { useDateFormat } from "@/hooks/useDateFormat"; import { buildDataColumns, columnPinning } from "../../config/user_groups/view/columns.config"; @@ -39,6 +40,7 @@ import { buildSelectionActions } from "../../config/user_groups/view/selection.c import { buildRowActions } from "../../config/user_groups/view/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; // ─── Invite Link Dialog ─────────────────────────────────────────────────────── function InviteLinkDialog({ open, onOpenChange, group }) { @@ -288,6 +290,8 @@ export default function ViewGroup() { const [assignTarget, setAssignTarget] = useState(null); // single row const [assignIds, setAssignIds] = useState(null); // bulk ids[] + const { user: currentUser } = useAuth(); + const { group, groups, @@ -327,6 +331,7 @@ export default function ViewGroup() { attributes: memberAttrs, filename: `${getTimestamp()}_Group_${groupId}_Members`, sheetName: "Members", + generatedBy: formatGeneratedBy(currentUser), }; const rowActions = buildRowActions({ diff --git a/src/modules/staff/components/TaskListTable.jsx b/src/modules/staff/components/TaskListTable.jsx index d275596..054c65c 100644 --- a/src/modules/staff/components/TaskListTable.jsx +++ b/src/modules/staff/components/TaskListTable.jsx @@ -8,6 +8,7 @@ import { useMemo, useRef, useState, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { useStaffTasks } from "@/contexts/StaffTaskContext"; +import { useAuth } from "@/contexts/AuthContext"; import DataTable from "@/components/generic/Table/DataTable"; import { FilterSheet } from "@/components/generic/Sheet/FilterSheet"; @@ -20,10 +21,13 @@ import { buildSelectionActions } from "../config/task_list/selection.config"; import { buildRowActions } from "../config/task_list/rowActions.config"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; export default function TaskListTable() { const navigate = useNavigate(); + const { user: currentUser } = useAuth(); + const { taskLists, attributes, pagination, setPagination, loading, fetchTaskLists, fetchArchivedTaskLists, fetchTaskListFieldValues, @@ -83,7 +87,8 @@ export default function TaskListTable() { attributes, filename: `${getTimestamp()}_TaskLists`, sheetName: "Task Lists", - }), [taskLists, attributes]); + generatedBy: formatGeneratedBy(currentUser), + }), [taskLists, attributes, currentUser]); // ── Row actions ─────────────────────────────────────────────────────────── const rowActions = buildRowActions({ diff --git a/src/modules/staff/components/members/MembersTable.jsx b/src/modules/staff/components/members/MembersTable.jsx index 377dacb..ac44f92 100644 --- a/src/modules/staff/components/members/MembersTable.jsx +++ b/src/modules/staff/components/members/MembersTable.jsx @@ -1,6 +1,7 @@ import { useMemo, useRef, useState, useCallback } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { useStaffGroups } from "@/contexts/StaffGroupContext"; +import { useAuth } from "@/contexts/AuthContext"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; @@ -14,6 +15,7 @@ import { buildRowActions } from "../../config/members/rowActions.config"; import MemberDetailTabs from "../MemberDetailTabs"; import { getTimestamp } from "@/utils/timestamp.util"; +import { formatGeneratedBy } from "@/utils/generatedBy.util"; // ── Helpers ─────────────────────────────────────────────────────────────────── @@ -43,6 +45,8 @@ export default function MembersTable() { const navigate = useNavigate(); const { groupId } = useParams(); + const { user: currentUser } = useAuth(); + const { members, memberAttributes, @@ -82,7 +86,8 @@ export default function MembersTable() { attributes: memberAttributes, filename: `${getTimestamp()}_GroupMembers`, sheetName: "Members", - }), [members, memberAttributes]); + generatedBy: formatGeneratedBy(currentUser), + }), [members, memberAttributes, currentUser]); // ── Row actions ───────────────────────────────────────────────────────────── const rowActions = useMemo(() => buildRowActions({ diff --git a/src/utils/generatedBy.util.js b/src/utils/generatedBy.util.js new file mode 100644 index 0000000..c472b57 --- /dev/null +++ b/src/utils/generatedBy.util.js @@ -0,0 +1,14 @@ +// ─── utils/generatedBy.util.js ───────────────────────────────────────────── +import { ROLE_CONFIG } from "@/data/profile.data"; + +/** + * Formats the "Generated by" footer label for excel.util.js exports from an + * AuthContext user. Returns undefined (footer line omitted) if no user. + * + * @param {Object|null} user AuthContext `user` + * @returns {string|undefined} e.g. "Kenneth Obsequio (Administrator)" + */ +export function formatGeneratedBy(user) { + if (!user) return undefined; + return `${user.personal_info?.name?.full_name ?? user.email} (${ROLE_CONFIG[user.acc_type]?.label ?? user.acc_type})`; +}