diff --git a/src/components/Table.tsx b/src/components/Table.tsx index cfd77df6..9f1ef6e5 100644 --- a/src/components/Table.tsx +++ b/src/components/Table.tsx @@ -48,6 +48,8 @@ export interface TableProps { sorting?: SortingState; setSorting?: OnChangeFn; manualSorting?: boolean; + rowSelection?: Record; + setRowSelection?: OnChangeFn>; } const DUMMY_SKELETON_DATA = [{}, {}, {}, {}, {}]; @@ -61,32 +63,34 @@ const emptyContentDefaultValue = ( ); const Table = ({ - data = [], - columns = [], - pageSize = 10, - totalItems, - page, - onPageChange, - isLoading = false, - fuzzySearchValue, - onFuzzySearchValueChange, - className = { - containerClassName: '', - tableWrapperClassName: '', - tableClassName: '', - tableHeaderClassName: '', - headerRowClassName: '', - headerColumnClassName: '', - tableBodyClassName: '', - bodyRowClassName: '', - bodyColumnClassName: '', - paginationClassName: '', - }, - emptyContent = emptyContentDefaultValue, - sorting, - setSorting, - manualSorting = false, -}: TableProps) => { + data = [], + columns = [], + pageSize = 10, + totalItems, + page, + onPageChange, + isLoading = false, + fuzzySearchValue, + onFuzzySearchValueChange, + className = { + containerClassName: '', + tableWrapperClassName: '', + tableClassName: '', + tableHeaderClassName: '', + headerRowClassName: '', + headerColumnClassName: '', + tableBodyClassName: '', + bodyRowClassName: '', + bodyColumnClassName: '', + paginationClassName: '', + }, + emptyContent = emptyContentDefaultValue, + sorting, + setSorting, + manualSorting = false, + rowSelection, + setRowSelection, + }: TableProps) => { const isServerSideTable = totalItems !== undefined && page !== undefined && @@ -137,6 +141,15 @@ const Table = ({ }; } + if (rowSelection && setRowSelection) { + tableOptions.onRowSelectionChange = setRowSelection; + tableOptions.state = { + ...tableOptions.state, + rowSelection, + }; + tableOptions.getRowId = (row) => (row as { id: string }).id; + } + const table = useReactTable(tableOptions); const { setPageSize } = table; @@ -175,72 +188,72 @@ const Table = ({
- {table.getHeaderGroups().map((headerGroup) => ( - - {headerGroup.headers.map((header) => ( - + {headerGroup.headers.map((header) => ( + - ))} - - ))} + {header.column.getCanSort() && ( +
+ + +
+ )} + + + ))} + + ))} - {table.getRowModel().rows.map((row) => ( - - {row.getVisibleCells().map((cell) => ( - + {row.getVisibleCells().map((cell) => ( + - ))} - - ))} + {isLoading &&
} + + ))} + + ))}
( +
+
+ {flexRender( + header.column.columnDef.header, + header.getContext() )} - > -
- {flexRender( - header.column.columnDef.header, - header.getContext() - )} - {header.column.getCanSort() && ( -
- - -
- )} -
-
- {!isLoading && - flexRender(cell.column.columnDef.cell, cell.getContext())} + {table.getRowModel().rows.map((row) => ( +
+ {!isLoading && + flexRender(cell.column.columnDef.cell, cell.getContext())} - {isLoading &&
} -
diff --git a/src/components/pages/production/recording/RecordingTable.tsx b/src/components/pages/production/recording/RecordingTable.tsx index b0f95460..744ee6d8 100644 --- a/src/components/pages/production/recording/RecordingTable.tsx +++ b/src/components/pages/production/recording/RecordingTable.tsx @@ -9,6 +9,7 @@ import Button from '@/components/Button'; import ConfirmationModal from '@/components/modal/ConfirmationModal'; import { OptionType } from '@/components/input/SelectInput'; import { ROWS_OPTIONS } from '@/config/constant'; +import CheckboxInput from '@/components/input/CheckboxInput'; import { TableToolbar } from '@/components/table/TableToolbar'; import { TableRowSizeSelector } from '@/components/table/TableRowSizeSelector'; import Table from '@/components/Table'; @@ -117,7 +118,7 @@ const RecordingTable = () => { const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [sorting, setSorting] = useState([]); - const [selectedRecordings, setSelectedRecordings] = useState([]); + const [rowSelection, setRowSelection] = useState>({}); const [, setSelectedRecording] = useState(undefined); const [isDeleteLoading, setIsDeleteLoading] = useState(false); const [isBulkApproveLoading, setIsBulkApproveLoading] = useState(false); @@ -160,28 +161,24 @@ const RecordingTable = () => { return filteredData.slice(start, start + pageSize); }, [page, pageSize, search]); + const selectedRowIds = Object.keys(rowSelection).map((item) => parseInt(item)); + const bulkApproveHandler = async () => { setIsBulkApproveLoading(true); - console.log( - 'Approved recordings:', - paginatedData.filter((_, idx) => selectedRecordings.includes(idx)) - ); + console.log('Approved recordings:', selectedRowIds); setTimeout(() => { setIsBulkApproveLoading(false); - setSelectedRecordings([]); + setRowSelection({}); bulkApproveModal.closeModal(); }, 1000); }; const bulkRejectHandler = async () => { setIsBulkRejectLoading(true); - console.log( - 'Rejected recordings:', - paginatedData.filter((_, idx) => selectedRecordings.includes(idx)) - ); + console.log('Rejected recordings:', selectedRowIds); setTimeout(() => { setIsBulkRejectLoading(false); - setSelectedRecordings([]); + setRowSelection({}); bulkRejectModal.closeModal(); }, 1000); }; @@ -217,7 +214,7 @@ const RecordingTable = () => { {/* Bulk action buttons */}
- {selectedRecordings.length > 0 && ( + {selectedRowIds.length > 0 && (
)} @@ -251,7 +248,7 @@ const RecordingTable = () => { { { columns={[ { id: 'select', - accessorKey: 'id', header: ({ table }) => ( - 0 && - table - .getRowModel() - .rows.every((row) => selectedRecordings.includes(row.index)) - } - onChange={(e) => { - if (e.target.checked) { - setSelectedRecordings( - table.getRowModel().rows.map((row) => row.index) - ); - } else { - setSelectedRecordings([]); - } - }} - /> +
+ +
), cell: ({ row }) => ( - { - if (e.target.checked) { - setSelectedRecordings([...selectedRecordings, row.index]); - } else { - setSelectedRecordings( - selectedRecordings.filter((i) => i !== row.index) - ); - } - }} - /> +
+ +
), }, { @@ -403,6 +383,8 @@ const RecordingTable = () => { isLoading={false} sorting={sorting} setSorting={setSorting} + rowSelection={rowSelection} + setRowSelection={setRowSelection} className={{ containerClassName: cn({ 'mb-20': paginatedData.length === 0,