diff --git a/src/contexts/AdminTaskContext.jsx b/src/contexts/AdminTaskContext.jsx index 0c8de41..ae4ec6d 100644 --- a/src/contexts/AdminTaskContext.jsx +++ b/src/contexts/AdminTaskContext.jsx @@ -369,6 +369,28 @@ export function AdminTaskProvider({ children }) { [request] ); + // ─── GET TASK LIST FIELD VALUES ─────────────────────────────────────────────── + const fetchTaskListFieldValues = useCallback( + (field) => + request(async () => { + const res = await api.get(`${BASE}/field-values`, { params: { field } }); + return res.data?.data ?? []; + }), + [request] + ); + + // ─── GET TASK FIELD VALUES ──────────────────────────────────────────────────── + const fetchTaskFieldValues = useCallback( + (taskListId, field) => + request(async () => { + const res = await api.get(`${BASE}/${taskListId}/tasks/field-values`, { + params: { field }, + }); + return res.data?.data ?? []; + }), + [request] + ); + // ───────────────────────────────────────────────────────────────────────── return ( diff --git a/src/modules/admin/components/task/ArchiveTaskTable.jsx b/src/modules/admin/components/task/ArchiveTaskTable.jsx index 9d5d476..22d3ea6 100644 --- a/src/modules/admin/components/task/ArchiveTaskTable.jsx +++ b/src/modules/admin/components/task/ArchiveTaskTable.jsx @@ -14,12 +14,23 @@ import { buildRowActions } from "@/modules/admin/config/task_list/task/archive/r import { getTimestamp } from "@/utils/timestamp.util"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from '@/components/ui/dialog'; +import { formatDate } from "@/utils/table.util"; +import { ListTodo, Users } from "lucide-react"; +import { Skeleton } from "@/components/ui/skeleton"; +import { Badge } from "@/components/ui/badge"; + export default function ArchivedTaskTable() { const navigate = useNavigate(); const { taskListId } = useParams(); const { - tasks, attributes, pagination, loading, + taskList, tasks, attributes, pagination, loading, fetchArchivedTasks, restoreTask, bulkRestoreTasks, @@ -27,11 +38,12 @@ export default function ArchivedTaskTable() { const [restoreTarget, setRestoreTarget] = useState(null); const [restoreIds, setRestoreIds] = useState(null); + const [showGroupsDialog, setShowGroupsDialog] = useState(false); const tableRefsRef = useRef({ getFilters: () => [], getSort: () => [], - resetSelection: () => {}, + resetSelection: () => { }, tableInstance: null, }); @@ -91,8 +103,77 @@ export default function ArchivedTaskTable() { [attributes, rowActions] ); + const assignedGroups = taskList?.groups ?? []; + const totalTasks = pagination?.totalRecords ?? 0; + const hasOverflow = assignedGroups.length > 1; + const formattedCreated = taskList?.createdAt ? formatDate(taskList.createdAt) : '—'; + const formattedUpdated = taskList?.updatedAt ? formatDate(taskList.updatedAt) : '—'; + return ( <> + + {/* ── Detail card ───────────────────────────────────────────────── */} +
+
+
+ {taskList + ?

{taskList.name}

+ : + } + {taskList + ?

{taskList.description ?? '—'}

+ : + } +
+
+ +
+
+ Tasks + + + {taskList ? totalTasks : } + +
+ +
+ Groups + {taskList ? ( + taskList.group_count > 0 ? ( +
+ + {taskList.group_count} + {hasOverflow && ( + + )} +
+ ) : 0 + ) : } +
+ +
+ Created + + {taskList ? formattedCreated : } + +
+ +
+ Last Updated + + {taskList ? formattedUpdated : } + +
+
+
+ + + + + + + + + Assigned Groups + + {assignedGroups.length} + + + +
+ {assignedGroups.map((g) => ( + + + {g.name} + + ))} +
+
+
); } \ No newline at end of file diff --git a/src/modules/admin/components/task/TaskListTable.jsx b/src/modules/admin/components/task/TaskListTable.jsx index ce8d05e..03847a8 100644 --- a/src/modules/admin/components/task/TaskListTable.jsx +++ b/src/modules/admin/components/task/TaskListTable.jsx @@ -20,7 +20,7 @@ export default function TaskListTable() { const { taskLists, attributes, pagination, loading, - fetchTaskLists, fetchArchivedTaskLists, + fetchTaskLists, fetchArchivedTaskLists, fetchTaskListFieldValues, archiveTaskList, restoreTaskList, bulkArchiveTaskLists, bulkRestoreTaskLists, } = useAdminTask(); @@ -124,7 +124,7 @@ export default function TaskListTable() { pagination={pagination} loading={loading} onFetch={fetchTaskLists} - onFetchFilterData={() => []} + onFetchFilterData={fetchTaskListFieldValues} onRefsReady={handleRefsReady} renderFilterSheet={({ open, onOpenChange, column, attr, data, loading }) => ( , - onClick: (row) => navigate(`/admin/taskList/${row.task_list_id}/view`), - }, + // { + // key: "view", + // label: "View", + // icon: , + // onClick: (row) => navigate(`/admin/taskList/${row.task_list_id}/view`), + // }, { key: "restore", label: "Restore", diff --git a/src/modules/admin/config/task_list/task/archive/toolbar.config.jsx b/src/modules/admin/config/task_list/task/archive/toolbar.config.jsx index a6c7b9b..a85b670 100644 --- a/src/modules/admin/config/task_list/task/archive/toolbar.config.jsx +++ b/src/modules/admin/config/task_list/task/archive/toolbar.config.jsx @@ -5,7 +5,7 @@ import { exportTableToExcel } from "@/utils/excel.util"; /** * @param {Object} deps * @param {Function} deps.fetchTasks - * @param {string} deps.taskListId + * @param {string} deps.taskId * @param {Object} deps.pagination * @param {Object} deps.exportConfig * @param {Function} deps.navigate @@ -17,7 +17,7 @@ import { exportTableToExcel } from "@/utils/excel.util"; */ export function buildToolbarActions({ fetchTasks, - taskListId, + taskId, pagination, exportConfig, navigate, diff --git a/src/modules/admin/pages/task_list/CreateTaskList.jsx b/src/modules/admin/pages/task_list/CreateTaskList.jsx index 2af96bc..0a2a159 100644 --- a/src/modules/admin/pages/task_list/CreateTaskList.jsx +++ b/src/modules/admin/pages/task_list/CreateTaskList.jsx @@ -9,6 +9,7 @@ import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { ArrowLeft } from 'lucide-react'; export default function CreateTaskList() { const navigate = useNavigate(); @@ -43,76 +44,84 @@ export default function CreateTaskList() { }; return ( -
- - - Create Task List - - -
+
+
+
+ +
+

Create Task List

+

View course information.

+
+
+ + + - {/* Name */} -
- - setForm({ ...form, name: e.target.value })} - placeholder="e.g. Onboarding Tasks" - /> - {errors.name && ( -

{errors.name}

- )} -
+ {/* Name */} +
+ + setForm({ ...form, name: e.target.value })} + placeholder="e.g. Onboarding Tasks" + /> + {errors.name && ( +

{errors.name}

+ )} +
- {/* Description */} -
- -