From ce7c343808ee75b9bd89574a619a82e1fe81afa2 Mon Sep 17 00:00:00 2001 From: Sabda Yagra Date: Tue, 13 Jan 2026 09:52:29 +0700 Subject: [PATCH] fix: taskTA from mabes to koorkurator --- .../task-ta/components/columns.tsx | 2 +- .../task-ta/components/task-ta-table.tsx | 981 +++++++++++++----- components/form/task-ta/task-ta-form.tsx | 259 +++-- 3 files changed, 925 insertions(+), 317 deletions(-) diff --git a/app/[locale]/(protected)/contributor/task-ta/components/columns.tsx b/app/[locale]/(protected)/contributor/task-ta/components/columns.tsx index 7141b761..8f8f9072 100644 --- a/app/[locale]/(protected)/contributor/task-ta/components/columns.tsx +++ b/app/[locale]/(protected)/contributor/task-ta/components/columns.tsx @@ -22,7 +22,7 @@ import withReactContent from "sweetalert2-react-content"; import Swal from "sweetalert2"; import { useTranslations } from "next-intl"; -const useTableColumns = (activeTab: "ta" | "daily" | "special") => { +const useTableColumns = (activeTab: "ta" | "daily" | "special" |"mabes-koor") => { const t = useTranslations("Table"); const columns: ColumnDef[] = [ { diff --git a/app/[locale]/(protected)/contributor/task-ta/components/task-ta-table.tsx b/app/[locale]/(protected)/contributor/task-ta/components/task-ta-table.tsx index 7c91b7cf..7964e26a 100644 --- a/app/[locale]/(protected)/contributor/task-ta/components/task-ta-table.tsx +++ b/app/[locale]/(protected)/contributor/task-ta/components/task-ta-table.tsx @@ -2,7 +2,6 @@ import * as React from "react"; import { - ColumnDef, ColumnFiltersState, PaginationState, SortingState, @@ -14,8 +13,8 @@ import { getSortedRowModel, useReactTable, } from "@tanstack/react-table"; -import { Button } from "@/components/ui/button"; +import { Button } from "@/components/ui/button"; import { Table, TableBody, @@ -24,46 +23,47 @@ import { TableHeader, TableRow, } from "@/components/ui/table"; -import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; -import { - ChevronDown, - ChevronLeft, - ChevronRight, - Eye, - MoreVertical, - Search, - SquarePen, - Trash2, - TrendingDown, - TrendingUp, -} from "lucide-react"; -import { cn } from "@/lib/utils"; import { DropdownMenu, DropdownMenuContent, - DropdownMenuItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { InputGroup, InputGroupText } from "@/components/ui/input-group"; -import { paginationBlog } from "@/service/blog/blog"; -import { ticketingPagination } from "@/service/ticketing/ticketing"; -import { Badge } from "@/components/ui/badge"; -import { useRouter, useSearchParams } from "next/navigation"; -import TablePagination from "@/components/table/table-pagination"; -import columns from "./columns"; -import { listTask, listTaskMabesForTa, listTaskTa } from "@/service/task"; import { Label } from "@/components/ui/label"; -import { format } from "date-fns"; -import { useTranslations } from "next-intl"; -import useTableColumns from "./columns"; +import TablePagination from "@/components/table/table-pagination"; -const TaskTaTable = () => { +import { Search, ChevronDown } from "lucide-react"; +import { format } from "date-fns"; +import { useRouter, useSearchParams } from "next/navigation"; +import { useTranslations } from "next-intl"; + +import { getCookiesDecrypt } from "@/lib/utils"; +import { listTask, listTaskTa } from "@/service/task"; + +import useTableColumns from "./columns"; // kamu sudah punya + +type ActiveTab = "ta" | "daily" | "special" | "mabes-koor"; + +const MABES_LEVEL_ID = 216; +const APPROVER_ROLE_ID = 3; + +export default function TaskTaTable() { const router = useRouter(); const searchParams = useSearchParams(); const t = useTranslations("AnalyticsDashboard"); + + // ✅ user identity from cookies + const userLevelId = Number(getCookiesDecrypt("ulie")); + const roleId = Number(getCookiesDecrypt("urie")); + const userId = Number(getCookiesDecrypt("uie")); + + const isMabesApprover = + userLevelId === MABES_LEVEL_ID && roleId === APPROVER_ROLE_ID; + + // table states const [dataTable, setDataTable] = React.useState([]); const [totalData, setTotalData] = React.useState(1); const [sorting, setSorting] = React.useState([]); @@ -73,24 +73,27 @@ const TaskTaTable = () => { const [columnVisibility, setColumnVisibility] = React.useState({}); const [rowSelection, setRowSelection] = React.useState({}); + const [showData, setShowData] = React.useState("10"); const [pagination, setPagination] = React.useState({ pageIndex: 0, pageSize: Number(showData), }); - const [activeTab, setActiveTab] = React.useState<"ta" | "daily" | "special">( - "ta" + + const [activeTab, setActiveTab] = React.useState( + isMabesApprover ? "mabes-koor" : "ta" ); const [statusFilter, setStatusFilter] = React.useState([]); const [dateFilter, setDateFilter] = React.useState(""); - const [endDate, setEndDate] = React.useState(""); const [filterByCode, setFilterByCode] = React.useState(""); + const [search, setSearch] = React.useState(""); + const [page, setPage] = React.useState(1); const [totalPage, setTotalPage] = React.useState(1); - const [limit, setLimit] = React.useState(10); - const [isSpecificAttention, setIsSpecificAttention] = React.useState(true); - const [search, setSearch] = React.useState(""); + + // ✅ columns based on tab const columns = useTableColumns(activeTab); + const table = useReactTable({ data: dataTable, columns, @@ -114,17 +117,15 @@ const TaskTaTable = () => { React.useEffect(() => { const pageFromUrl = searchParams?.get("page"); - if (pageFromUrl) { - setPage(Number(pageFromUrl)); - } + if (pageFromUrl) setPage(Number(pageFromUrl)); }, [searchParams]); React.useEffect(() => { fetchData(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ page, showData, - isSpecificAttention, search, dateFilter, filterByCode, @@ -138,7 +139,7 @@ const TaskTaTable = () => { : ""; try { - let res; + let res: any; if (activeTab === "ta") { res = await listTaskTa( @@ -150,7 +151,9 @@ const TaskTaTable = () => { "atensi-khusus", statusFilter ); - } else if (activeTab === "daily") { + } + + if (activeTab === "daily") { res = await listTaskTa( page - 1, search, @@ -160,7 +163,9 @@ const TaskTaTable = () => { "tugas-harian", statusFilter ); - } else if (activeTab === "special") { + } + + if (activeTab === "special") { res = await listTask( page - 1, search, @@ -172,19 +177,73 @@ const TaskTaTable = () => { ); } + // ✅ TAB BARU: khusus Mabes Approver + if (activeTab === "mabes-koor") { + // kalau bukan Mabes Approver, jangan fetch + if (!isMabesApprover) { + setDataTable([]); + setTotalData(0); + setTotalPage(0); + return; + } + + // NOTE: backend endpoint harus return tasks mabes -> koorkurator + res = await listTaskTa( + page - 1, + search, + showData, + filterByCode, + formattedStartDate, + "atensi-khusus", + statusFilter + ); + } + let contentData = res?.data?.data?.content || []; - // ⛔ Jika upload belum selesai → sembunyikan task baru + // ⛔ blok task baru kalau upload belum selesai (fitur kamu) const isUploadingTA = localStorage.getItem("TA_UPLOAD_IN_PROGRESS") === "true"; - if (isUploadingTA) { const now = new Date(); - // Filter task yg dibuat < 5 menit terakhir (belum selesai upload) contentData = contentData.filter((item: any) => { const created = new Date(item.createdAt); const diff = now.getTime() - created.getTime(); - return diff > 5 * 60 * 1000; // lebih dari 5 menit + return diff > 5 * 60 * 1000; + }); + } + + // ✅ OPTIONAL SAFETY FILTER (kalau backend belum 100% benar) + // sesuaikan field names sesuai response kamu + // if (activeTab === "mabes-koor") { + // contentData = contentData.filter((item: any) => { + // const createdByLevelName = + // item?.createdByLevelName || item?.createdByLevel?.name; + // const assignedToLevelName = + // item?.assignedToLevelName || item?.assignedToLevel?.name; + + // // minimal filter: + // return ( + // String(createdByLevelName || "") + // .toUpperCase() + // .includes("MABES") && + // String(assignedToLevelName || "") + // .toUpperCase() + // .includes("KOOR") + // ); + // }); + // } + if (activeTab === "mabes-koor") { + contentData = contentData.filter((item: any) => { + const createdByLevel = item?.createdBy?.userLevel?.name || ""; + + // KOOR KURATOR = user id 464 (sesuai create kamu) + const assignedUsers = String(item?.assignedToUsers || ""); + + return ( + /MABES/i.test(createdByLevel) && + assignedUsers.split(",").includes("464") + ); }); } @@ -193,153 +252,50 @@ const TaskTaTable = () => { }); setDataTable(contentData); - setTotalData(res?.data?.data?.totalElements); - setTotalPage(res?.data?.data?.totalPages); + setTotalData(res?.data?.data?.totalElements || 0); + setTotalPage(res?.data?.data?.totalPages || 0); } catch (error) { console.error("Error fetching tasks:", error); + setDataTable([]); + setTotalData(0); + setTotalPage(0); } } - // async function fetchData() { - // const formattedStartDate = dateFilter - // ? format(new Date(dateFilter), "yyyy-MM-dd") - // : ""; - - // try { - // let res; - - // if (activeTab === "ta") { - // res = await listTaskTa( - // page - 1, - // search, - // showData, - // filterByCode, - // formattedStartDate, - // "atensi-khusus", - // statusFilter - // ); - // } else if (activeTab === "daily") { - // res = await listTaskTa( - // page - 1, - // search, - // showData, - // filterByCode, - // formattedStartDate, - // "tugas-harian", - // statusFilter - // ); - // } else if (activeTab === "special") { - // res = await listTask( - // page - 1, - // search, - // showData, - // filterByCode, - // formattedStartDate, - // "atensi-khusus", - // statusFilter - // ); - // } - - // const data = res?.data?.data; - // const contentData = data?.content || []; - - // contentData.forEach((item: any, index: number) => { - // item.no = (page - 1) * Number(showData) + index + 1; - // }); - - // setDataTable(contentData); - // setTotalData(data?.totalElements); - // setTotalPage(data?.totalPages); - // } catch (error) { - // console.error("Error fetching tasks:", error); - // } - // } - - // async function fetchData() { - // const formattedStartDate = dateFilter - // ? format(new Date(dateFilter), "yyyy-MM-dd") - // : ""; - // try { - // const res = isSpecificAttention - // ? await listTaskTa( - // page - 1, - // search, - // showData, - // filterByCode, - // formattedStartDate, - // "atensi-khusus", - // statusFilter - // ) - // : await listTask( - // page - 1, - // search, - // showData, - // filterByCode, - // formattedStartDate, - // "atensi-khusus", - // statusFilter - // ); - - // const data = res?.data?.data; - // const contentData = data?.content; - - // // let contentDataFilter = res?.data?.data?.content || []; - - // // Filter berdasarkan status - // // contentDataFilter = contentDataFilter.filter((item: any) => { - // // const isSelesai = statusFilter.includes(1) ? item.isDone : true; - // // const isAktif = statusFilter.includes(2) ? item.isActive : true; - // // return isSelesai && isAktif; - // // }); - - // contentData.forEach((item: any, index: number) => { - // item.no = (page - 1) * Number(showData) + index + 1; - // }); - - // console.log("contentData : ", contentData); - - // setDataTable(contentData); - // setTotalData(data?.totalElements); - // setTotalPage(data?.totalPages); - // } catch (error) { - // console.error("Error fetching tasks:", error); - // } - // } - const handleSearch = (e: React.ChangeEvent) => { - setFilterByCode(e.target.value); - setSearch(e.target.value); - table.getColumn("judul")?.setFilterValue(e.target.value); + const value = e.target.value; + setFilterByCode(value); + setSearch(value); + table.getColumn("judul")?.setFilterValue(value); }; function handleStatusCheckboxChange(value: number) { setStatusFilter((prev) => - prev.includes(value) - ? prev.filter((status) => status !== value) - : [...prev, value] + prev.includes(value) ? prev.filter((s) => s !== value) : [...prev, value] ); } - // const handleSearchFilterByCode = (e: React.ChangeEvent) => { - // const value = e.target.value; - // console.log("code :", value); - // setFilterByCode(value); - // fetchData(); - // }; - return (
-
-
-
-
+
@@ -424,14 +344,14 @@ const TaskTaTable = () => {
-
+
@@ -461,6 +381,7 @@ const TaskTaTable = () => {
+ + {

Filter

+
{ className="max-w-sm" />
- {/*
- - -
*/} +
{ {t("done", { defaultValue: "Done" })}
+
{
- {/*
- ) => - table.getColumn("status")?.setFilterValue(event.target.value) - } - className="max-w-sm " - /> -
*/}
+ {table.getHeaderGroups().map((headerGroup) => ( @@ -555,6 +460,7 @@ const TaskTaTable = () => { ))} + {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( @@ -579,6 +485,7 @@ const TaskTaTable = () => { )}
+ { />
); -}; +} -export default TaskTaTable; +// "use client"; + +// import * as React from "react"; +// import { +// ColumnDef, +// ColumnFiltersState, +// PaginationState, +// SortingState, +// VisibilityState, +// flexRender, +// getCoreRowModel, +// getFilteredRowModel, +// getPaginationRowModel, +// getSortedRowModel, +// useReactTable, +// } from "@tanstack/react-table"; +// import { Button } from "@/components/ui/button"; + +// import { +// Table, +// TableBody, +// TableCell, +// TableHead, +// TableHeader, +// TableRow, +// } from "@/components/ui/table"; +// import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +// import { +// ChevronDown, +// ChevronLeft, +// ChevronRight, +// Eye, +// MoreVertical, +// Search, +// SquarePen, +// Trash2, +// TrendingDown, +// TrendingUp, +// } from "lucide-react"; +// import { cn } from "@/lib/utils"; +// import { +// DropdownMenu, +// DropdownMenuContent, +// DropdownMenuItem, +// DropdownMenuRadioGroup, +// DropdownMenuRadioItem, +// DropdownMenuTrigger, +// } from "@/components/ui/dropdown-menu"; +// import { Input } from "@/components/ui/input"; +// import { InputGroup, InputGroupText } from "@/components/ui/input-group"; +// import { paginationBlog } from "@/service/blog/blog"; +// import { ticketingPagination } from "@/service/ticketing/ticketing"; +// import { Badge } from "@/components/ui/badge"; +// import { useRouter, useSearchParams } from "next/navigation"; +// import TablePagination from "@/components/table/table-pagination"; +// import columns from "./columns"; +// import { listTask, listTaskMabesForTa, listTaskTa } from "@/service/task"; +// import { Label } from "@/components/ui/label"; +// import { format } from "date-fns"; +// import { useTranslations } from "next-intl"; +// import useTableColumns from "./columns"; + +// const TaskTaTable = () => { +// const router = useRouter(); +// const searchParams = useSearchParams(); +// const t = useTranslations("AnalyticsDashboard"); +// const [dataTable, setDataTable] = React.useState([]); +// const [totalData, setTotalData] = React.useState(1); +// const [sorting, setSorting] = React.useState([]); +// const [columnFilters, setColumnFilters] = React.useState( +// [] +// ); +// const [columnVisibility, setColumnVisibility] = +// React.useState({}); +// const [rowSelection, setRowSelection] = React.useState({}); +// const [showData, setShowData] = React.useState("10"); +// const [pagination, setPagination] = React.useState({ +// pageIndex: 0, +// pageSize: Number(showData), +// }); +// const [activeTab, setActiveTab] = React.useState<"ta" | "daily" | "special">( +// "ta" +// ); +// const [statusFilter, setStatusFilter] = React.useState([]); +// const [dateFilter, setDateFilter] = React.useState(""); +// const [endDate, setEndDate] = React.useState(""); +// const [filterByCode, setFilterByCode] = React.useState(""); +// const [page, setPage] = React.useState(1); +// const [totalPage, setTotalPage] = React.useState(1); +// const [limit, setLimit] = React.useState(10); +// const [isSpecificAttention, setIsSpecificAttention] = React.useState(true); +// const [search, setSearch] = React.useState(""); +// const columns = useTableColumns(activeTab); +// const table = useReactTable({ +// data: dataTable, +// columns, +// onSortingChange: setSorting, +// onColumnFiltersChange: setColumnFilters, +// getCoreRowModel: getCoreRowModel(), +// getPaginationRowModel: getPaginationRowModel(), +// getSortedRowModel: getSortedRowModel(), +// getFilteredRowModel: getFilteredRowModel(), +// onColumnVisibilityChange: setColumnVisibility, +// onRowSelectionChange: setRowSelection, +// onPaginationChange: setPagination, +// state: { +// sorting, +// columnFilters, +// columnVisibility, +// rowSelection, +// pagination, +// }, +// }); + +// React.useEffect(() => { +// const pageFromUrl = searchParams?.get("page"); +// if (pageFromUrl) { +// setPage(Number(pageFromUrl)); +// } +// }, [searchParams]); + +// React.useEffect(() => { +// fetchData(); +// }, [ +// page, +// showData, +// isSpecificAttention, +// search, +// dateFilter, +// filterByCode, +// statusFilter, +// activeTab, +// ]); + +// async function fetchData() { +// const formattedStartDate = dateFilter +// ? format(new Date(dateFilter), "yyyy-MM-dd") +// : ""; + +// try { +// let res; + +// if (activeTab === "ta") { +// res = await listTaskTa( +// page - 1, +// search, +// showData, +// filterByCode, +// formattedStartDate, +// "atensi-khusus", +// statusFilter +// ); +// } else if (activeTab === "daily") { +// res = await listTaskTa( +// page - 1, +// search, +// showData, +// filterByCode, +// formattedStartDate, +// "tugas-harian", +// statusFilter +// ); +// } else if (activeTab === "special") { +// res = await listTask( +// page - 1, +// search, +// showData, +// filterByCode, +// formattedStartDate, +// "atensi-khusus", +// statusFilter +// ); +// } + +// let contentData = res?.data?.data?.content || []; + +// // ⛔ Jika upload belum selesai → sembunyikan task baru +// const isUploadingTA = +// localStorage.getItem("TA_UPLOAD_IN_PROGRESS") === "true"; + +// if (isUploadingTA) { +// const now = new Date(); +// // Filter task yg dibuat < 5 menit terakhir (belum selesai upload) +// contentData = contentData.filter((item: any) => { +// const created = new Date(item.createdAt); +// const diff = now.getTime() - created.getTime(); +// return diff > 5 * 60 * 1000; // lebih dari 5 menit +// }); +// } + +// contentData.forEach((item: any, index: number) => { +// item.no = (page - 1) * Number(showData) + index + 1; +// }); + +// setDataTable(contentData); +// setTotalData(res?.data?.data?.totalElements); +// setTotalPage(res?.data?.data?.totalPages); +// } catch (error) { +// console.error("Error fetching tasks:", error); +// } +// } + +// // async function fetchData() { +// // const formattedStartDate = dateFilter +// // ? format(new Date(dateFilter), "yyyy-MM-dd") +// // : ""; + +// // try { +// // let res; + +// // if (activeTab === "ta") { +// // res = await listTaskTa( +// // page - 1, +// // search, +// // showData, +// // filterByCode, +// // formattedStartDate, +// // "atensi-khusus", +// // statusFilter +// // ); +// // } else if (activeTab === "daily") { +// // res = await listTaskTa( +// // page - 1, +// // search, +// // showData, +// // filterByCode, +// // formattedStartDate, +// // "tugas-harian", +// // statusFilter +// // ); +// // } else if (activeTab === "special") { +// // res = await listTask( +// // page - 1, +// // search, +// // showData, +// // filterByCode, +// // formattedStartDate, +// // "atensi-khusus", +// // statusFilter +// // ); +// // } + +// // const data = res?.data?.data; +// // const contentData = data?.content || []; + +// // contentData.forEach((item: any, index: number) => { +// // item.no = (page - 1) * Number(showData) + index + 1; +// // }); + +// // setDataTable(contentData); +// // setTotalData(data?.totalElements); +// // setTotalPage(data?.totalPages); +// // } catch (error) { +// // console.error("Error fetching tasks:", error); +// // } +// // } + +// // async function fetchData() { +// // const formattedStartDate = dateFilter +// // ? format(new Date(dateFilter), "yyyy-MM-dd") +// // : ""; +// // try { +// // const res = isSpecificAttention +// // ? await listTaskTa( +// // page - 1, +// // search, +// // showData, +// // filterByCode, +// // formattedStartDate, +// // "atensi-khusus", +// // statusFilter +// // ) +// // : await listTask( +// // page - 1, +// // search, +// // showData, +// // filterByCode, +// // formattedStartDate, +// // "atensi-khusus", +// // statusFilter +// // ); + +// // const data = res?.data?.data; +// // const contentData = data?.content; + +// // // let contentDataFilter = res?.data?.data?.content || []; + +// // // Filter berdasarkan status +// // // contentDataFilter = contentDataFilter.filter((item: any) => { +// // // const isSelesai = statusFilter.includes(1) ? item.isDone : true; +// // // const isAktif = statusFilter.includes(2) ? item.isActive : true; +// // // return isSelesai && isAktif; +// // // }); + +// // contentData.forEach((item: any, index: number) => { +// // item.no = (page - 1) * Number(showData) + index + 1; +// // }); + +// // console.log("contentData : ", contentData); + +// // setDataTable(contentData); +// // setTotalData(data?.totalElements); +// // setTotalPage(data?.totalPages); +// // } catch (error) { +// // console.error("Error fetching tasks:", error); +// // } +// // } + +// const handleSearch = (e: React.ChangeEvent) => { +// setFilterByCode(e.target.value); +// setSearch(e.target.value); +// table.getColumn("judul")?.setFilterValue(e.target.value); +// }; + +// function handleStatusCheckboxChange(value: number) { +// setStatusFilter((prev) => +// prev.includes(value) +// ? prev.filter((status) => status !== value) +// : [...prev, value] +// ); +// } + +// // const handleSearchFilterByCode = (e: React.ChangeEvent) => { +// // const value = e.target.value; +// // console.log("code :", value); +// // setFilterByCode(value); +// // fetchData(); +// // }; + +// return ( +//
+//
+//
+//
+//
+// +//
+//
+//
+//
+//
+//
+// +// +// +// +// +// +//
+ +//
+//
+//
+// +// +// +// +// +// +// +// 1 - 10 Data +// +// +// 1 - 50 Data +// +// +// 1 - 100 Data +// +// +// 1 - 250 Data +// +// +// +// +//
+// +// +// +// +// +//
+//

Filter

+//
+//
+// +// setDateFilter(e.target.value)} +// className="max-w-sm" +// /> +//
+// {/*
+// +// +//
*/} +// +//
+// handleStatusCheckboxChange(1)} +// /> +// +//
+//
+// handleStatusCheckboxChange(2)} +// /> +// +//
+//
+//
+//
+//
+// {/*
+// ) => +// table.getColumn("status")?.setFilterValue(event.target.value) +// } +// className="max-w-sm " +// /> +//
*/} +//
+// +// +// {table.getHeaderGroups().map((headerGroup) => ( +// +// {headerGroup.headers.map((header) => ( +// +// {header.isPlaceholder +// ? null +// : flexRender( +// header.column.columnDef.header, +// header.getContext() +// )} +// +// ))} +// +// ))} +// +// +// {table.getRowModel().rows?.length ? ( +// table.getRowModel().rows.map((row) => ( +// +// {row.getVisibleCells().map((cell) => ( +// +// {flexRender(cell.column.columnDef.cell, cell.getContext())} +// +// ))} +// +// )) +// ) : ( +// +// +// No results. +// +// +// )} +// +//
+// +//
+// ); +// }; + +// export default TaskTaTable; diff --git a/components/form/task-ta/task-ta-form.tsx b/components/form/task-ta/task-ta-form.tsx index b9840320..89a879a4 100644 --- a/components/form/task-ta/task-ta-form.tsx +++ b/components/form/task-ta/task-ta-form.tsx @@ -186,14 +186,15 @@ export default function FormTaskTa() { const roleId = Number(getCookiesDecrypt("urie")); const userId = Number(getCookiesDecrypt("uie")); - const MABES_LEVEL_ID = 216; - const APPROVER_ROLE_ID = 3; + const MABES_LEVEL_ID = 216; // userLevelId Mabes Polri + const APPROVER_ROLE_ID = 3; // roleId Approver const isMabes = userLevelId === MABES_LEVEL_ID; const isApprover = roleId === APPROVER_ROLE_ID; const isMabesApprover = userLevelId === MABES_LEVEL_ID && roleId === APPROVER_ROLE_ID; + const shouldHideExpert = isMabes && isApprover; useEffect(() => { async function fetchUserLevel() { @@ -378,63 +379,126 @@ export default function FormTaskTa() { // // }); // }; + // const save = async (data: TaskSchema) => { + // const cleanedLinks = links + // .map((link) => link.trim()) + // .filter((link) => link.startsWith("http")); + + // const requestData = { + // ...data, + // // assignedToUsers: handleExpertChange(), + // assignedToUsers: isMabesApprover ? "464" : handleExpertChange(), + // assignmentType: taskType, + // assignmentTypeId: type, + // expertCompetencies: Array.from(selectedCompetencies).join(","), + // attachmentUrl: cleanedLinks, + // }; + + // console.log("FINAL ASSIGNED TO:", { + // isMabesApprover, + // assignedToUsers: isMabesApprover + // ? String(roleId) + // : handleExpertChange(), + // }); + + // const response = await createTaskTa(requestData); + // const id = String(response?.data?.data.id); + + // // Set block table TA + // localStorage.setItem("TA_UPLOAD_IN_PROGRESS", "true"); + + // loading(); // SHOW SWAL LOADING + + // // Kumpulkan semua upload + // const allUploads: Promise[] = []; + + // imageFiles.forEach((item, idx) => + // allUploads.push(uploadResumableFile(idx, id, item, "1", "0")) + // ); + + // videoFiles.forEach((item, idx) => + // allUploads.push(uploadResumableFile(idx, id, item, "2", "0")) + // ); + + // textFiles.forEach((item, idx) => + // allUploads.push(uploadResumableFile(idx, id, item, "3", "0")) + // ); + + // audioFiles.forEach((item, idx) => + // allUploads.push(uploadResumableFile(idx, id, item, "4", "0")) + // ); + + // // Tunggu upload selesai + // await Promise.all(allUploads); + + // // Hapus flag + // localStorage.removeItem("TA_UPLOAD_IN_PROGRESS"); + + // // Close loading + redirect + // successSubmit("/in/contributor/task-ta"); + // }; + const save = async (data: TaskSchema) => { - const cleanedLinks = links - .map((link) => link.trim()) - .filter((link) => link.startsWith("http")); + try { + loading(); - const requestData = { - ...data, - assignedToUsers: handleExpertChange(), - // assignedToUsers: isMabesApprover ? "464" : handleExpertChange(), - assignmentType: taskType, - assignmentTypeId: type, - expertCompetencies: Array.from(selectedCompetencies).join(","), - attachmentUrl: cleanedLinks, - }; + const cleanedLinks = links + .map((link) => link.trim()) + .filter((link) => link.startsWith("http")); - console.log("FINAL ASSIGNED TO:", { - isMabesApprover, - assignedToUsers: isMabesApprover - ? String(roleId) - : handleExpertChange(), - }); + const requestData = { + ...data, + // assignedToUsers: isMabesApprover ? "464" : handleExpertChange(), + assignedToUsers: isMabesApprover + ? ["464", "8258"] + : handleExpertChange(), + assignmentType: taskType, + assignmentTypeId: type, + expertCompetencies: Array.from(selectedCompetencies).join(","), + attachmentUrl: cleanedLinks, + }; - const response = await createTaskTa(requestData); - const id = String(response?.data?.data.id); + const response = await createTaskTa(requestData); - // Set block table TA - localStorage.setItem("TA_UPLOAD_IN_PROGRESS", "true"); + if (!response?.data?.data?.id) { + throw new Error("Gagal membuat task"); + } - loading(); // SHOW SWAL LOADING + const assignmentId = String(response.data.data.id); - // Kumpulkan semua upload - const allUploads: Promise[] = []; + const uploads: Promise[] = []; - imageFiles.forEach((item, idx) => - allUploads.push(uploadResumableFile(idx, id, item, "1", "0")) - ); + imageFiles.forEach((file, i) => + uploads.push(uploadResumableFile(i, assignmentId, file, "1", "0")) + ); - videoFiles.forEach((item, idx) => - allUploads.push(uploadResumableFile(idx, id, item, "2", "0")) - ); + videoFiles.forEach((file, i) => + uploads.push(uploadResumableFile(i, assignmentId, file, "2", "0")) + ); - textFiles.forEach((item, idx) => - allUploads.push(uploadResumableFile(idx, id, item, "3", "0")) - ); + textFiles.forEach((file, i) => + uploads.push(uploadResumableFile(i, assignmentId, file, "3", "0")) + ); - audioFiles.forEach((item, idx) => - allUploads.push(uploadResumableFile(idx, id, item, "4", "0")) - ); + audioFiles.forEach((file, i) => + uploads.push(uploadResumableFile(i, assignmentId, file, "4", "0")) + ); - // Tunggu upload selesai - await Promise.all(allUploads); + await Promise.all(uploads); - // Hapus flag - localStorage.removeItem("TA_UPLOAD_IN_PROGRESS"); + successSubmit("/in/contributor/task-ta"); + } catch (err: any) { + console.error("SUBMIT ERROR:", err); - // Close loading + redirect - successSubmit("/in/contributor/task-ta"); + Swal.fire({ + icon: "error", + title: "Gagal", + text: + err?.response?.data?.message || + err?.message || + "Terjadi kesalahan, data tidak tersimpan", + }); + } }; const onSubmit = (data: TaskSchema) => { @@ -577,46 +641,91 @@ export default function FormTaskTa() { // upload.start(); // } + // function uploadResumableFile( + // idx: number, + // id: string, + // file: any, + // fileTypeId: string, + // duration: string + // ) { + // return new Promise(async (resolve, reject) => { + // const resCsrf = await getCsrfToken(); + // const csrfToken = resCsrf?.data?.token; + + // const upload = new Upload(file, { + // endpoint: `${process.env.NEXT_PUBLIC_API}/assignment-expert/file/upload`, + // headers: { "X-XSRF-TOKEN": csrfToken }, + // retryDelays: [0, 3000, 6000, 12000], + // chunkSize: 20000, + // metadata: { + // assignmentId: id, + // filename: file.name, + // contentType: file.type, + // fileTypeId, + // duration, + // }, + + // onBeforeRequest(req) { + // req.getUnderlyingObject().withCredentials = true; + // }, + + // onError(err) { + // console.error("Upload error:", err); + // reject(err); + // }, + + // onSuccess() { + // console.log("Upload selesai:", file.name); + // resolve(true); + // }, + // }); + + // upload.start(); + // }); + // } + function uploadResumableFile( idx: number, id: string, - file: any, + file: File, fileTypeId: string, duration: string ) { return new Promise(async (resolve, reject) => { - const resCsrf = await getCsrfToken(); - const csrfToken = resCsrf?.data?.token; + try { + const resCsrf = await getCsrfToken(); + const csrfToken = resCsrf?.data?.token; - const upload = new Upload(file, { - endpoint: `${process.env.NEXT_PUBLIC_API}/assignment-expert/file/upload`, - headers: { "X-XSRF-TOKEN": csrfToken }, - retryDelays: [0, 3000, 6000, 12000], - chunkSize: 20000, - metadata: { - assignmentId: id, - filename: file.name, - contentType: file.type, - fileTypeId, - duration, - }, + const upload = new Upload(file, { + endpoint: `${process.env.NEXT_PUBLIC_API}/assignment-expert/file/upload`, + headers: { "X-XSRF-TOKEN": csrfToken }, + retryDelays: [0, 3000, 6000], + chunkSize: 20000, + metadata: { + assignmentId: id, + filename: file.name, + contentType: file.type, + fileTypeId, + duration, + }, - onBeforeRequest(req) { - req.getUnderlyingObject().withCredentials = true; - }, + onBeforeRequest(req) { + req.getUnderlyingObject().withCredentials = true; + }, - onError(err) { - console.error("Upload error:", err); - reject(err); - }, + onError(error) { + reject(error); + }, - onSuccess() { - console.log("Upload selesai:", file.name); - resolve(true); - }, - }); + onSuccess() { + resolve(true); + }, + }); - upload.start(); + upload.start(); + } catch (err) { + reject(err); + } }); } @@ -988,7 +1097,9 @@ export default function FormTaskTa() { handleLinkChange(index, e.target.value)