koval-ui
Version:
React components collection with minimalistic design. Supports theming, layout, and input validation.
1 lines • 34.4 kB
Source Map (JSON)
{"version":3,"file":"DataTable.cjs","sources":["../../../../src/lib/DataTable/DataTable.tsx"],"sourcesContent":["import type {ReactNode} from 'react';\nimport {forwardRef, Fragment, useCallback, useMemo, useRef} from 'react';\nimport classNames from 'classnames';\nimport type {\n ColumnPinningState,\n PaginationState,\n SortingState,\n ColumnFiltersState,\n RowSelectionState,\n ColumnDef,\n} from '@tanstack/react-table';\nimport {\n flexRender,\n getCoreRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n getFilteredRowModel,\n} from '@tanstack/react-table';\nimport {useLocalTheme} from 'css-vars-hook';\n\nimport {useResizeObserver} from '@/internal/hooks/useResizeObserverNew.ts';\nimport {useInternalRef} from '@/internal/hooks/useInternalRef.ts';\nimport type {DataAttributes, LibraryProps} from '@/internal/LibraryAPI';\nimport {useBrowserLocale} from '@/internal/locale';\nimport type {Locale} from '@/internal/locale';\nimport {I, Table, Button} from '@/lib';\nimport {useInternalId} from '@/internal/hooks/useInternalId.ts';\nimport {IconFilterOff} from '@/internal/Icons';\n\nimport {useColumnFilters} from './tableFeatures/useColumnFilters.ts';\nimport classes from './DataTable.module.css';\nimport type {EditState, TableData, TableRow, Column} from './types.ts';\nimport {ProcessingModes, RenderModes} from './types.ts';\n// import {columns} from './columns.tsx';\nimport {useColumnPinning} from './tableFeatures/useColumnPinning.ts';\nimport {TableCell} from './TableCell.tsx';\nimport {useVirtualRows} from './tableFeatures/useVirtualRows.ts';\nimport {useTableData} from './tableFeatures/useTableData.ts';\nimport {Pagination} from './Pagination.tsx';\nimport {usePagination} from './tableFeatures/usePagination.ts';\nimport {useSorting} from './tableFeatures/useSorting.ts';\nimport type {FilterConfig} from './dialogs/FilterDialog.tsx';\nimport {FilterDialog} from './dialogs/FilterDialog.tsx';\nimport {useRowSelection} from './tableFeatures/useRowSelection.ts';\nimport {useTableHeight} from './tableFeatures/useTableHeight.ts';\nimport {DeleteDialog} from './dialogs/DeleteDialog.tsx';\nimport {EditDialog} from './dialogs/EditDialog.tsx';\nimport {SelectableActions} from './SelectableActions.tsx';\nimport {useEdit} from './tableFeatures/useEdit.ts';\nimport {useTableColumns} from './tableFeatures/useTableColumns.tsx';\nimport {isInDateRange, isInPercentRange} from './filterFns.ts';\n\nexport type Props = DataAttributes &\n LibraryProps & {\n children?: ReactNode;\n /**\n * Provide table columns configuration\n * @see Column\n */\n columns: Column[];\n /**\n * Provide data for the table\n * @see TableData\n */\n tableData: TableData;\n /**\n * Provide a callback to capture table data changes\n * @see EditState\n */\n onEdit?: (editState: EditState) => void;\n /**\n * Control column pinning state externally\n * @see ColumnPinningState\n */\n columnPinning?: ColumnPinningState;\n /**\n * Control pagination state externally\n * @see PaginationState\n */\n pagination?: PaginationState;\n /**\n * Provide a callback to capture pagination changes\n * @see PaginationState\n */\n onPaginationChange?: (paginationState: PaginationState) => void;\n /**\n * Manage column filters externally\n * @see ColumnFiltersState\n */\n columnFilters?: ColumnFiltersState;\n /**\n * Provide a callback to capture column filters changes\n * @see ColumnFiltersState\n */\n onFiltersChange?: (filterState: ColumnFiltersState) => void;\n /**\n * Manage row selection externally\n * @see RowSelectionState\n */\n rowSelection?: RowSelectionState;\n /**\n * Provide a callback to capture row selection changes\n * @see RowSelectionState\n */\n onRowSelect?: (selectionState: RowSelectionState) => void;\n /**\n * Control table data sorting externally\n * @see SortingState\n */\n sorting?: SortingState;\n /**\n * Provide a callback to capture table data sorting changes\n * @see SortingState\n */\n onSortingChange?: (sortingState: SortingState) => void;\n /**\n * Configure how table data is processed inside or outside the component\n * @see ProcessingModes\n */\n processingMode?: keyof typeof ProcessingModes;\n /**\n * Select which type of table to render\n * @see RenderModes\n */\n renderMode?: keyof typeof RenderModes;\n /**\n * Set a controlled page count number for pagination. Required for renderMode=\"paginated-controlled\"\n * @see https://morewings.github.io/koval-ui/?path=/story/components-datatable--paginated-controlled&args=tableData:rows100\n */\n pageCount?: number;\n /**\n * Provide a string with a BCP 47 language tag or an Intl.Locale instance,\n * or an array of such locale identifiers.\n * Used to format dates, numbers, and units.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat#locales\n * @see Locale\n */\n locale?: Locale;\n /**\n * Enable column selection\n */\n selectable?: boolean;\n /**\n * Set a height constrain to the data table. 'full' sets to 100% of viewport height\n */\n tableHeight?: number | 'full';\n /**\n * Set a caption text to render below the table\n */\n caption?: string;\n };\n\nconst CELL_HEIGHT = 42;\n\nconst OVERSCAN = 6;\n\nconst defaultPages = {\n pageIndex: 0,\n pageSize: 10,\n};\n\nconst defaultSorting: SortingState = [];\n\nconst defaultFilters: ColumnFiltersState = [];\n\nconst defaultSelection: RowSelectionState = {};\n\nexport const DataTable = forwardRef<HTMLTableElement, Props>(\n (\n {\n children,\n className,\n tableData: tableDataProp = [],\n columnPinning: columnPinningProp,\n renderMode = RenderModes.virtual,\n pagination: paginationProp = defaultPages,\n onPaginationChange = () => {},\n onSortingChange = () => {},\n onFiltersChange = () => {},\n onRowSelect = () => {},\n onEdit = () => {},\n rowSelection: rowSelectionProp = defaultSelection,\n pageCount,\n sorting: sortingProp = defaultSorting,\n processingMode = ProcessingModes.internal,\n columnFilters: columnFiltersProp = defaultFilters,\n locale: localeProp,\n selectable = false,\n tableHeight: tableHeightProp = 'full',\n caption,\n columns: columnsProp = [],\n id: idProp,\n ...nativeProps\n },\n ref\n ) => {\n const id = useInternalId(idProp);\n\n const {tableData, setTableData} = useTableData(tableDataProp);\n\n const tableRef = useInternalRef(ref);\n\n const wrapperRef = useRef(null);\n\n const tableRect = useResizeObserver(tableRef);\n\n const tableHeight = tableRect?.height;\n\n const {LocalRoot} = useLocalTheme();\n\n const maxHeight = useTableHeight({tableHeightProp});\n\n const theme = useMemo(\n () => ({\n ...(tableHeight && {'table-height': tableHeight}),\n 'cell-height': CELL_HEIGHT,\n 'max-height': maxHeight,\n }),\n [maxHeight, tableHeight]\n );\n\n const {columnPinning, setColumnPinning} = useColumnPinning({\n columnPinningProp,\n hasSelectableColumn: selectable,\n });\n\n const {pagination, setPagination, currentPage, setCurrentPage, setPageSize} = usePagination(\n {tableData, paginationProp, onPaginationChange}\n );\n\n const {sorting, setSorting} = useSorting({sortingProp, onSortingChange});\n\n const {columnFilters, setColumnFilters} = useColumnFilters({\n columnFiltersProp,\n onFiltersChange,\n });\n\n const browserLocale = useBrowserLocale();\n\n const {rowSelection, setRowSelection, clearSelection} = useRowSelection({\n rowSelectionProp,\n onRowSelect,\n processingMode,\n });\n\n const {columns, editableColumns} = useTableColumns({\n columnsProp,\n selectable,\n });\n\n const table = useReactTable({\n meta: {\n locale: localeProp || browserLocale,\n editModalId: `edit-modal-${id}`,\n filterModalId: `filter-modal-${id}`,\n deleteModalId: `delete-modal-${id}`,\n },\n data: tableData,\n columns: columns as ColumnDef<TableRow>[],\n getCoreRowModel: getCoreRowModel(),\n onColumnPinningChange: setColumnPinning,\n getPaginationRowModel:\n renderMode === RenderModes.paginated ? getPaginationRowModel() : undefined,\n onPaginationChange: renderMode === RenderModes.paginated ? setPagination : undefined,\n state: {\n pagination: renderMode === RenderModes.paginated ? pagination : undefined,\n columnPinning,\n sorting,\n columnFilters,\n rowSelection,\n },\n manualPagination: processingMode === ProcessingModes.external,\n pageCount: processingMode === ProcessingModes.external ? pageCount : undefined,\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: setSorting,\n // Disabled until proper implementation\n enableMultiSort: false,\n manualSorting: processingMode === ProcessingModes.external,\n getFilteredRowModel: getFilteredRowModel(),\n onColumnFiltersChange: setColumnFilters,\n manualFiltering: processingMode === ProcessingModes.external,\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n filterFns: {\n isInDateRange,\n isInPercentRange,\n },\n });\n\n const {rows} = table.getRowModel();\n\n const {before, after, virtualRows} = useVirtualRows({\n rowsCount: rows.length,\n scrollRef: wrapperRef,\n overscan: OVERSCAN,\n cellHeight: CELL_HEIGHT,\n });\n\n const handleSetFilter = useCallback(\n ({filter, column}: FilterConfig) => {\n table.getColumn(column!)?.setFilterValue(filter);\n },\n [table]\n );\n\n const handleResetFilters = useCallback(() => {\n table.resetColumnFilters();\n }, [table]);\n\n const {handleEdit, handleDelete, handleDeleteRequest, handleEditRequest} = useEdit({\n rowSelection,\n onEdit,\n clearSelection,\n setTableData,\n table,\n tableData,\n processingMode,\n });\n\n const captionId = `caption-${id}`;\n\n return (\n <Fragment>\n <FilterDialog\n tableContext={table}\n id={table.options.meta?.filterModalId as string}\n onApplyFiler={handleSetFilter}\n columnFilters={columnFilters}\n />\n <EditDialog\n id={table.options.meta?.editModalId as string}\n selectionAmount={Object.keys(rowSelection).length}\n columnsConfig={editableColumns}\n onEdit={handleEdit}\n />\n <DeleteDialog\n id={table.options.meta?.deleteModalId as string}\n selectionAmount={Object.keys(rowSelection).length}\n onDeleteConfirmation={handleDelete}\n />\n <LocalRoot theme={theme} className={classes.heightContainer}>\n {selectable && (\n <SelectableActions\n selectedRows={Object.keys(rowSelection).length}\n totalRows={table.getPreFilteredRowModel().rows.length}\n onDeleteRequest={handleDeleteRequest}\n onEditRequest={handleEditRequest}\n onClear={clearSelection}\n />\n )}\n <Table\n aria-describedby={caption && captionId}\n wrapperRef={wrapperRef}\n wrapperClassName={classNames(classes.tableWrapper, {\n // Needed to apply calculated height to the table to show small tables properly\n [classes.paginated]: renderMode === RenderModes.paginated,\n [classes.selectable]: selectable,\n [classes.hasCaption]: Boolean(caption),\n })}\n {...nativeProps}\n id={id}\n className={classNames(classes.dataTable, className)}\n ref={tableRef}>\n <thead className={classes.tableHeader}>\n {table.getHeaderGroups().map(headerGroup => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map((header, i, array) => {\n const fixLeft = i > 0 ? i + 1 : 0;\n const fixRight =\n i === array.length ? 0 : array.length - (i + 1);\n return (\n <TableCell\n as=\"th\"\n key={header.id}\n leftMargin={\n header.column.getStart('left') + fixLeft\n }\n rightMargin={\n header.column.getAfter('right') + fixRight\n }\n isPinned={header.column.getIsPinned()}>\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext()\n )}\n </TableCell>\n );\n })}\n </tr>\n ))}\n </thead>\n {renderMode === RenderModes.virtual && (\n <tbody>\n <Fragment>\n {before > 0 && (\n <tr>\n <td colSpan={columns.length} style={{height: before}} />\n </tr>\n )}\n {virtualRows.map(virtualRow => {\n const row = rows[virtualRow.index];\n return (\n <tr\n key={row.id}\n style={{\n height: `${virtualRow.size}px`,\n }}>\n {row.getVisibleCells().map((cell, i, array) => {\n const fixLeft = i > 0 ? i + 1 : 0;\n const fixRight =\n i === array.length\n ? 0\n : array.length - (i + 1);\n return (\n <TableCell\n isHighlighted={Boolean(\n cell.column.getIsSorted()\n )}\n as=\"td\"\n key={cell.id}\n leftMargin={\n cell.column.getStart('left') +\n fixLeft\n }\n rightMargin={\n cell.column.getAfter('right') +\n fixRight\n }\n isPinned={cell.column.getIsPinned()}>\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </TableCell>\n );\n })}\n </tr>\n );\n })}\n {after > 0 && (\n <tr>\n <td colSpan={columns.length} style={{height: after}} />\n </tr>\n )}\n </Fragment>\n </tbody>\n )}\n {renderMode === RenderModes.paginated && (\n <tbody>\n {rows.map(row => (\n <tr key={row.id}>\n {row.getVisibleCells().map((cell, i, array) => {\n const fixLeft = i > 0 ? i + 1 : 0;\n const fixRight =\n i === array.length ? 0 : array.length - (i + 1);\n return (\n <TableCell\n isHighlighted={Boolean(\n cell.column.getIsSorted()\n )}\n as=\"td\"\n key={cell.id}\n leftMargin={\n cell.column.getStart('left') + fixLeft\n }\n rightMargin={\n cell.column.getAfter('right') + fixRight\n }\n isPinned={cell.column.getIsPinned()}>\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext()\n )}\n </TableCell>\n );\n })}\n </tr>\n ))}\n </tbody>\n )}\n {rows.length === 0 && (\n <tbody>\n <tr className={classes.noDataRow}>\n <td\n className={classes.noDataCell}\n colSpan={table.getAllColumns().length}>\n <div className={classes.noDataWarning}>\n <span>No data to render.</span>\n {columnFilters.length > 0 && (\n <Button\n onClick={handleResetFilters}\n prefix={IconFilterOff}\n size=\"small\"\n variant=\"link\">\n Reset all filters\n </Button>\n )}\n </div>\n </td>\n </tr>\n </tbody>\n )}\n <tfoot className={classes.tableFooter}>\n {table.getFooterGroups().map(footerGroup => (\n <tr key={footerGroup.id}>\n {footerGroup.headers.map((header, i, array) => {\n const fixLeft = i > 0 ? i + 1 : 0;\n const fixRight =\n i === array.length ? 0 : array.length - (i + 1);\n return (\n <TableCell\n as=\"th\"\n key={header.id}\n leftMargin={\n header.column.getStart('left') + fixLeft\n }\n rightMargin={\n header.column.getAfter('right') + fixRight\n }\n isPinned={header.column.getIsPinned()}>\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.footer,\n header.getContext()\n )}\n </TableCell>\n );\n })}\n </tr>\n ))}\n </tfoot>\n </Table>\n {renderMode === RenderModes.paginated && (\n <Pagination\n rowsCount={tableData.length}\n onPageSizeChange={setPageSize}\n currentPage={currentPage}\n pagesAmount={table.getPageCount()}\n pageSize={pagination.pageSize}\n setCurrentPage={setCurrentPage}\n />\n )}\n {caption && (\n <div id={captionId} className={classes.tableCaption}>\n <I>{caption}</I>\n </div>\n )}\n </LocalRoot>\n </Fragment>\n );\n }\n);\n\nDataTable.displayName = 'DataTable';\n"],"names":["CELL_HEIGHT","OVERSCAN","defaultPages","defaultSorting","defaultFilters","defaultSelection","DataTable","forwardRef","children","className","tableDataProp","columnPinningProp","renderMode","RenderModes","paginationProp","onPaginationChange","onSortingChange","onFiltersChange","onRowSelect","onEdit","rowSelectionProp","pageCount","sortingProp","processingMode","ProcessingModes","columnFiltersProp","localeProp","selectable","tableHeightProp","caption","columnsProp","idProp","nativeProps","ref","id","useInternalId","tableData","setTableData","useTableData","tableRef","useInternalRef","wrapperRef","useRef","tableRect","useResizeObserver","tableHeight","LocalRoot","useLocalTheme","maxHeight","useTableHeight","theme","useMemo","columnPinning","setColumnPinning","useColumnPinning","pagination","setPagination","currentPage","setCurrentPage","setPageSize","usePagination","sorting","setSorting","useSorting","columnFilters","setColumnFilters","useColumnFilters","browserLocale","useBrowserLocale","rowSelection","setRowSelection","clearSelection","useRowSelection","columns","editableColumns","useTableColumns","table","useReactTable","getCoreRowModel","getPaginationRowModel","getSortedRowModel","getFilteredRowModel","isInDateRange","isInPercentRange","rows","before","after","virtualRows","useVirtualRows","handleSetFilter","useCallback","filter","column","_a","handleResetFilters","handleEdit","handleDelete","handleDeleteRequest","handleEditRequest","useEdit","captionId","Fragment","jsx","FilterDialog","EditDialog","_b","DeleteDialog","_c","jsxs","classes","SelectableActions","Table","classNames","headerGroup","header","i","array","fixLeft","fixRight","TableCell","flexRender","virtualRow","row","cell","Button","IconFilterOff","footerGroup","Pagination","I"],"mappings":"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"}