import { useMemo, useState } from "react"; import { useReactTable, getCoreRowModel, getPaginationRowModel, getSortedRowModel, getFilteredRowModel, flexRender, createColumnHelper, SortingState, } from "@tanstack/react-table"; import Button from "@/components/actions/Button"; import Card from "@/components/data_display/Card/Card"; import { useDevices } from "@/features/devices/api/devices"; import { DeviceDataTable } from "@/features/devices/types"; import Loading from "@/components/feedback/Loading"; import Alert from "@/components/feedback/Alert"; import { Pencil } from "lucide-react"; import dayjs from "dayjs"; import id from "dayjs/locale/id"; import Dropdown from "@/components/actions/Dropdown/Dropdown"; dayjs.locale(id); export default function DevicePage() { const { data: devices, isLoading, isError, error } = useDevices(); // State untuk sorting dan filtering const [sorting, setSorting] = useState([]); const [globalFilter, setGlobalFilter] = useState(""); const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10, // Default 10 data per halaman }); const columnHelper = createColumnHelper(); const columns = useMemo( () => [ columnHelper.display({ id: "actions", header: "", cell: ({ row }) => ( Edit ), size: 10, }), columnHelper.accessor("device_code", { header: "Device Code", cell: (info) => info.getValue(), size: 120, }), columnHelper.accessor("device_type", { header: "Device Type", cell: (info) => info.getValue(), size: 100, }), columnHelper.accessor("longitude", { header: "Longitude", cell: (info) => info.getValue().toFixed(4), size: 100, }), columnHelper.accessor("latitude", { header: "Latitude", cell: (info) => info.getValue().toFixed(4), size: 100, }), columnHelper.accessor("address", { header: "Address", cell: (info) => info.getValue(), size: 200, }), columnHelper.accessor("port_amount", { header: "Total Ports", cell: (info) => info.getValue(), size: 100, }), columnHelper.accessor("total_used_port", { header: "Used Ports", cell: (info) => info.getValue(), size: 100, }), columnHelper.accessor("status", { header: "Status", cell: (info) => ( {info.getValue()} ), size: 100, }), columnHelper.accessor("created_at", { header: "Created At", cell: (info) => dayjs(info.getValue()).format("DD MMMM YYYY, HH:mm"), size: 150, }), ], [] ); const table = useReactTable({ data: devices || [], columns, state: { sorting, globalFilter, pagination, }, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), }); return (

Devices

{isError && ( } > {error?.message || "Failed to load devices"} )}
{/* Search Input */} setGlobalFilter(e.target.value)} className="input input-bordered w-full max-w-xs" /> {/* Page Size Dropdown */}
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( ))} ))} {isLoading ? ( ) : null} {table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( ))} ))}
{header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )}
{flexRender( cell.column.columnDef.cell, cell.getContext() )}
{/* Pagination */}
Page{" "} {table.getState().pagination.pageIndex + 1} of{" "} {table.getPageCount()}
); }