'use client'; import { useEffect, useState } from 'react'; import { useSearchParams } from 'next/navigation'; import useSWR from 'swr'; import { ColumnDef, SortingState } from '@tanstack/react-table'; import Table from '@/components/Table'; import Card from '@/components/Card'; import Badge from '@/components/Badge'; import { cn, formatNumber } from '@/lib/helper'; import { isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; import { ClosingApi } from '@/services/api/closing'; import { ClosingIncomingSapronakSummary } from '@/types/api/closing'; import SapronakClosingSkeleton from '@/components/pages/closing/skeleton/SapronakClosingSkeleton'; interface ClosingIncomingSapronaksSummaryTableProps { projectFlockId: number; } const ClosingIncomingSapronaksSummaryTable = ({ projectFlockId, }: ClosingIncomingSapronaksSummaryTableProps) => { const searchParams = useSearchParams(); const kandangId = searchParams.get('kandangId'); const { state: tableFilterState, updateFilter, setPage, setPageSize, toQueryString: getTableFilterQueryString, } = useTableFilter({ initial: { search: '', nameSort: '', }, paramMap: { page: 'page', pageSize: 'limit', nameSort: 'sort_name', }, }); const { data: incomingSapronakSummaries, isLoading: isLoadingIncomingSapronakSummaries, } = useSWR( `${ClosingApi.basePath}/${projectFlockId}/sapronak/summary${getTableFilterQueryString()}&type=incoming&kandang_id=${kandangId ? `${kandangId}` : ''}`, ClosingApi.getAllIncomingSapronakSummaryFetcher, { keepPreviousData: true, } ); const [sorting, setSorting] = useState([]); const [rowSelection, setRowSelection] = useState>({}); const incomingSapronaksColumns: ColumnDef[] = [ { header: 'No', cell: (props) => props.row.index + 1, }, { accessorKey: 'category', header: 'Kategori', cell: (props) => { const categories = props.row.original.category .split(' ') .filter((cat) => cat.trim()); const maxBadges = 4; const visibleCategories = categories.slice(0, maxBadges); const remainingCount = categories.length - maxBadges; return (
{visibleCategories.map((category, index) => ( {category.length > 12 ? `${category.slice(0, 12)}...` : category} ))} {remainingCount > 0 && ( +{remainingCount} )}
); }, }, { accessorKey: 'total_qty', header: 'Total Kuantitas', cell: (props) => `${formatNumber(props.row.original.total_qty)} ${props.row.original.uom.name}`, }, ]; // track sorting useEffect(() => { const isNameSorted = sorting.find((sortItem) => sortItem.id === 'name'); if (!isNameSorted) { updateFilter('nameSort', ''); } else { updateFilter('nameSort', isNameSorted.desc ? 'desc' : 'asc'); } }, [sorting, updateFilter]); return (
{isLoadingIncomingSapronakSummaries ? ( ) : isResponseSuccess(incomingSapronakSummaries) && incomingSapronakSummaries.data.length === 0 ? ( ) : ( data={ isResponseSuccess(incomingSapronakSummaries) ? incomingSapronakSummaries?.data : [] } columns={incomingSapronaksColumns} pageSize={tableFilterState.pageSize} onPageSizeChange={setPageSize} rowOptions={[10, 20, 50, 100]} page={ isResponseSuccess(incomingSapronakSummaries) ? incomingSapronakSummaries?.meta?.page : 0 } totalItems={ isResponseSuccess(incomingSapronakSummaries) ? incomingSapronakSummaries?.meta?.total_results : 0 } onPageChange={setPage} isLoading={isLoadingIncomingSapronakSummaries} sorting={sorting} setSorting={setSorting} rowSelection={rowSelection} setRowSelection={setRowSelection} className={{ containerClassName: 'w-full mb-5!', tableWrapperClassName: 'overflow-x-auto rounded-tr-none rounded-tl-none', tableClassName: 'w-full table-auto text-sm', headerRowClassName: 'border-b border-b-gray-200 bg-gray-50', headerColumnClassName: 'px-4 py-3 text-xs font-semibold text-gray-700 text-left border-b border-gray-200', bodyRowClassName: 'hover:bg-gray-50 transition-colors', bodyColumnClassName: 'px-4 py-3 text-xs text-gray-900 whitespace-nowrap', }} /> )}
); }; export default ClosingIncomingSapronaksSummaryTable;