"use client"; import * as React from "react"; import { 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 { DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Input } from "@/components/ui/input"; import { InputGroup, InputGroupText } from "@/components/ui/input-group"; import { Label } from "@/components/ui/label"; import TablePagination from "@/components/table/table-pagination"; 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([]); 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( isMabesApprover ? "mabes-koor" : "ta", ); const [statusFilter, setStatusFilter] = React.useState([]); const [dateFilter, setDateFilter] = 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 KOOR_KURATOR_USER_ID = "464"; const KOOR_KURATOR_USER_IDS = ["464", "8258"]; // ✅ columns based on tab 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(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [ page, showData, search, dateFilter, filterByCode, statusFilter, activeTab, ]); // const isKoorKurator = String(userId) === KOOR_KURATOR_USER_ID; const isKoorKurator = KOOR_KURATOR_USER_IDS.includes(String(userId)); async function fetchData() { const formattedStartDate = dateFilter ? format(new Date(dateFilter), "yyyy-MM-dd") : ""; try { let res: any; if (activeTab === "ta") { res = await listTaskTa( page - 1, search, showData, filterByCode, formattedStartDate, "atensi-khusus", statusFilter, ); } if (activeTab === "daily") { res = await listTaskTa( page - 1, search, showData, filterByCode, formattedStartDate, "tugas-harian", statusFilter, ); } if (activeTab === "special") { res = await listTask( page - 1, search, showData, filterByCode, formattedStartDate, "atensi-khusus", statusFilter, ); } // ✅ TAB BARU: khusus Mabes Approver if (activeTab === "mabes-koor") { // hanya blok kalau BUKAN Mabes Approver DAN BUKAN Koor Kurator if (!isMabesApprover && !isKoorKurator) { setDataTable([]); setTotalData(0); setTotalPage(0); return; } res = await listTaskTa( page - 1, search, showData, filterByCode, formattedStartDate, "atensi-khusus", statusFilter, ); } let contentData = res?.data?.data?.content || []; // 🚫 TAB TA: SEMBUNYIKAN TASK MABES → KOOR if (activeTab === "ta") { contentData = contentData.filter((item: any) => { const assignedUsers = String(item?.assignedToUsers || ""); // return !assignedUsers.split(",").includes(KOOR_KURATOR_USER_ID); return !assignedUsers .split(",") .some((id) => KOOR_KURATOR_USER_IDS.includes(id.trim())); }); } // ⛔ blok task baru kalau upload belum selesai (fitur kamu) const isUploadingTA = localStorage.getItem("TA_UPLOAD_IN_PROGRESS") === "true"; if (isUploadingTA) { const now = new Date(); contentData = contentData.filter((item: any) => { const created = new Date(item.createdAt); const diff = now.getTime() - created.getTime(); 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 || item?.createdByLevelName || ""; const assignedUsers = String(item?.assignedToUsers || ""); return ( /MABES/i.test(createdByLevel) && // assignedUsers.split(",").includes(KOOR_KURATOR_USER_ID) assignedUsers .split(",") .some((id) => KOOR_KURATOR_USER_IDS.includes(id.trim())) ); }); } contentData.forEach((item: any, index: number) => { item.no = (page - 1) * Number(showData) + index + 1; }); setDataTable(contentData); 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); } } const handleSearch = (e: React.ChangeEvent) => { 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((s) => s !== value) : [...prev, value], ); } 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.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. )}
); } // "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;