@coveord/plasma-mantine 49.3.2 → 49.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +3 -3
- package/.turbo/turbo-test.log +29 -29
- package/dist/.tsbuildinfo +1 -1
- package/dist/cjs/__tests__/VitestSetup.js.map +1 -1
- package/dist/cjs/components/table/Table.js +47 -34
- package/dist/cjs/components/table/Table.js.map +1 -1
- package/dist/cjs/components/table/TableContext.js.map +1 -1
- package/dist/definitions/__tests__/VitestSetup.d.ts +7 -1
- package/dist/definitions/__tests__/VitestSetup.d.ts.map +1 -1
- package/dist/definitions/components/table/Table.d.ts.map +1 -1
- package/dist/definitions/components/table/TableContext.d.ts +5 -0
- package/dist/definitions/components/table/TableContext.d.ts.map +1 -1
- package/dist/definitions/components/table/useTable.d.ts +1 -0
- package/dist/definitions/components/table/useTable.d.ts.map +1 -1
- package/dist/esm/__tests__/VitestSetup.js.map +1 -1
- package/dist/esm/components/table/Table.js +48 -35
- package/dist/esm/components/table/Table.js.map +1 -1
- package/dist/esm/components/table/TableContext.js.map +1 -1
- package/package.json +3 -1
- package/src/__tests__/VitestSetup.ts +6 -1
- package/src/components/table/Table.tsx +40 -24
- package/src/components/table/TableContext.tsx +5 -0
- package/src/components/table/__tests__/Table.spec.tsx +62 -0
- package/src/components/table/__tests__/TableDateRangePicker.spec.tsx +1 -0
- package/src/components/table/__tests__/TableFilter.spec.tsx +8 -0
- package/src/components/table/__tests__/TablePerPage.spec.tsx +8 -2
- package/src/components/table/__tests__/TablePredicate.spec.tsx +7 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/table/Table.tsx"],"sourcesContent":["import {Box, Center, Collapse, createStyles, Loader, Skeleton, Table as MantineTable} from '@mantine/core';\nimport {useForm} from '@mantine/form';\nimport {useClickOutside, useDidUpdate} from '@mantine/hooks';\nimport {\n ColumnDef,\n defaultColumnSizing,\n flexRender,\n getCoreRowModel,\n Row,\n TableState,\n useReactTable,\n} from '@tanstack/react-table';\nimport {CoreOptions, InitialTableState, TableOptions} from '@tanstack/table-core';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport {Children, Fragment, ReactElement, ReactNode, useCallback, useEffect, useState} from 'react';\n\nimport {TableActions} from './TableActions';\nimport {TableAccordionColumn, TableCollapsibleColumn} from './TableCollapsibleColumn';\nimport {onTableChangeEvent, TableContext, TableFormType} from './TableContext';\nimport {TableDateRangePicker} from './TableDateRangePicker';\nimport {TableFilter} from './TableFilter';\nimport {TableFooter} from './TableFooter';\nimport {TableHeader} from './TableHeader';\nimport {TablePagination} from './TablePagination';\nimport {TablePerPage} from './TablePerPage';\nimport {TablePredicate} from './TablePredicate';\nimport {TableSelectableColumn} from './TableSelectableColumn';\nimport {Th} from './Th';\nimport {useRowSelection} from './useRowSelection';\n\ninterface TableStylesParams {\n hasHeader: boolean;\n multiRowSelectionEnabled: boolean;\n}\n\nconst useStyles = createStyles<string, TableStylesParams>((theme, {hasHeader, multiRowSelectionEnabled}) => {\n const rowBackgroundColor =\n theme.colorScheme === 'dark'\n ? theme.fn.rgba(theme.colors[theme.primaryColor][7], 0.2)\n : theme.colors[theme.primaryColor][0];\n return {\n table: {\n width: '100%',\n '& td:first-of-type, th:first-of-type > *': {\n paddingLeft: theme.spacing.xl,\n },\n '& tbody td': {\n verticalAlign: 'top',\n },\n },\n\n header: {\n position: 'sticky',\n top: hasHeader ? 69 : 0,\n backgroundColor: theme.colorScheme === 'dark' ? theme.black : theme.white,\n transition: 'box-shadow 150ms ease',\n zIndex: 12, // skeleton is 11\n\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n borderBottom: `1px solid ${theme.colors.gray[2]}`,\n },\n },\n\n rowSelected: {\n backgroundColor: multiRowSelectionEnabled ? undefined : rowBackgroundColor,\n },\n\n rowCollapsibleButtonCell: {\n textAlign: 'right',\n padding: `${theme.spacing.xs / 2}px ${theme.spacing.sm}px !important`,\n },\n\n row: {\n '&:hover': {\n backgroundColor: rowBackgroundColor,\n },\n },\n };\n});\n\nexport interface TableProps<T> {\n /**\n * Data to display in the table\n */\n data: T[];\n /**\n * Defines how each row is uniquely identified. It is highly recommended that you specify this prop to an ID that makes sense.\n */\n getRowId?: CoreOptions<T>['getRowId'];\n /**\n * Columns to display in the table.\n *\n * @see https://tanstack.com/table/v8/docs/guide/column-defs\n */\n columns: Array<ColumnDef<T>>;\n /**\n * Function called when the table mounts\n *\n * @param state the state of the table\n */\n onMount?: onTableChangeEvent;\n /**\n * Function called when the table should update\n *\n * @param state the state of the table\n */\n onChange?: onTableChangeEvent;\n /**\n * Function that generates the expandable content of a row\n * Return null for rows that don't need to be expandable\n *\n * @param datum the row for which the children should be generated.\n */\n getExpandChildren?: (datum: T) => ReactNode;\n /**\n * React children to show when the table has no rows to show. You can leverage useTable to get the state of the table\n */\n noDataChildren?: ReactNode;\n /**\n * Whether the table is loading or not\n *\n * @default false\n */\n loading?: boolean;\n /**\n * Childrens to display in the table. They need to be wrap in either `Table.Header` or `Table.Footer`\n *\n * @example\n * <Table ...>\n * <Table.Header>\n * <div>Hello</div>\n * </Table.Header>\n * </Table>\n */\n children?: ReactNode;\n\n /**\n * Initial state of the table\n */\n initialState?: InitialTableState & Partial<TableFormType>;\n /**\n * Action passed when user double clicks on a row\n */\n doubleClickAction?: (datum: T) => void;\n /**\n * Whether the user can select multiple rows in order to perform actions in bulk\n *\n * @default false\n */\n multiRowSelectionEnabled?: boolean;\n\n options?: Omit<\n Partial<TableOptions<T>>,\n | 'initialState'\n | 'data'\n | 'columns'\n | 'manualPagination'\n | 'enableMultiRowSelection'\n | 'getRowId'\n | 'getRowCanExpand'\n | 'enableRowSelection'\n >;\n}\n\ninterface TableType {\n <T>(props: TableProps<T>): ReactElement;\n Actions: typeof TableActions;\n Filter: typeof TableFilter;\n Footer: typeof TableFooter;\n Header: typeof TableHeader;\n Pagination: typeof TablePagination;\n PerPage: typeof TablePerPage;\n Predicate: typeof TablePredicate;\n DateRangePicker: typeof TableDateRangePicker;\n CollapsibleColumn: typeof TableCollapsibleColumn;\n AccordionColumn: typeof TableAccordionColumn;\n}\n\nexport const Table: TableType = <T,>({\n data,\n getRowId,\n noDataChildren,\n getExpandChildren,\n initialState = {},\n columns,\n onMount,\n onChange,\n children,\n loading = false,\n doubleClickAction,\n multiRowSelectionEnabled,\n options = {},\n}: TableProps<T>) => {\n const convertedChildren = Children.toArray(children) as ReactElement[];\n const header = convertedChildren.find((child) => child.type === TableHeader);\n const footer = convertedChildren.find((child) => child.type === TableFooter);\n\n const {predicates, dateRange, ...initialStateWithoutForm} = initialState;\n const form = useForm<TableFormType>({\n initialValues: {predicates: initialState?.predicates ?? {}, dateRange: initialState?.dateRange ?? [null, null]},\n });\n const {cx, classes} = useStyles({hasHeader: !!header, multiRowSelectionEnabled});\n\n const table = useReactTable({\n initialState: defaultsDeep(initialStateWithoutForm, {pagination: {pageSize: TablePerPage.DEFAULT_SIZE}}),\n data,\n columns: multiRowSelectionEnabled ? [TableSelectableColumn as ColumnDef<T>].concat(columns) : columns,\n getCoreRowModel: getCoreRowModel(),\n manualPagination: options?.getPaginationRowModel === undefined,\n enableMultiRowSelection: !!multiRowSelectionEnabled,\n getRowId,\n getRowCanExpand: (row: Row<T>) => !!getExpandChildren?.(row.original) ?? false,\n enableRowSelection: !loading,\n ...options,\n });\n const [state, setState] = useState<TableState>(table.initialState);\n table.setOptions((prev) => ({\n ...prev,\n state,\n onStateChange: setState,\n }));\n const {clearSelection, getSelectedRow, getSelectedRows} = useRowSelection(table);\n\n const triggerChange = () => onChange?.({...state, ...form.values});\n\n useEffect(() => {\n onMount?.({...state, ...form.values});\n }, []);\n\n useDidUpdate(() => {\n triggerChange();\n if (!multiRowSelectionEnabled) {\n clearSelection();\n }\n }, [state.globalFilter, state.sorting, state.pagination, form.values]);\n\n const clearFilters = useCallback(() => {\n form.setFieldValue('predicates', {});\n setState((prevState) => ({...prevState, globalFilter: ''}));\n }, []);\n\n const outsideClickRef = useClickOutside(() => {\n if (!multiRowSelectionEnabled) {\n clearSelection();\n }\n });\n\n if (!data) {\n return (\n <Center sx={{flexGrow: 1}}>\n <Loader />\n </Center>\n );\n }\n\n const rows = table.getRowModel().rows.map((row) => {\n const rowChildren = getExpandChildren?.(row.original) ?? null;\n\n return (\n <Fragment key={row.id}>\n <tr\n onClick={() => row.toggleSelected()}\n onDoubleClick={() => doubleClickAction?.(row.original)}\n className={cx(classes.row, {[classes.rowSelected]: row.getIsSelected()})}\n aria-selected={row.getIsSelected()}\n >\n {row.getVisibleCells().map((cell) => {\n const size = cell.column.getSize();\n const width = size !== defaultColumnSizing.size ? size : undefined;\n return (\n <td\n key={cell.id}\n style={{width}}\n className={cx({\n [classes.rowCollapsibleButtonCell]: cell.column.id === TableCollapsibleColumn.id,\n })}\n >\n <Skeleton visible={loading} sx={!loading ? {borderRadius: 0} : undefined}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Skeleton>\n </td>\n );\n })}\n </tr>\n {rowChildren ? (\n <tr>\n <td\n colSpan={columns.length + 1}\n style={{\n padding: 0,\n borderTop: row.getIsExpanded() ? undefined : 'none',\n borderBottom: row.getIsExpanded() ? undefined : 'none',\n }}\n >\n <Collapse in={row.getIsExpanded()}>\n <Box px=\"sm\" py=\"xs\">\n {rowChildren}\n </Box>\n </Collapse>\n </td>\n </tr>\n ) : null}\n </Fragment>\n );\n });\n\n return (\n <Box ref={outsideClickRef}>\n <TableContext.Provider\n value={{\n onChange: triggerChange,\n state,\n setState,\n clearFilters,\n getSelectedRow,\n getSelectedRows,\n clearSelection,\n form,\n containerRef: outsideClickRef,\n multiRowSelectionEnabled,\n getPageCount: table.getPageCount,\n }}\n >\n {header}\n <MantineTable className={classes.table} horizontalSpacing=\"sm\" verticalSpacing=\"xs\" pb=\"sm\">\n <thead className={classes.header}>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map((columnHeader) => (\n <Th key={columnHeader.id} header={columnHeader} />\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {rows.length ? (\n rows\n ) : (\n <tr>\n <td colSpan={columns.length}>{noDataChildren}</td>\n </tr>\n )}\n </tbody>\n </MantineTable>\n {footer}\n </TableContext.Provider>\n </Box>\n );\n};\n\nTable.Actions = TableActions;\nTable.Filter = TableFilter;\nTable.Footer = TableFooter;\nTable.Header = TableHeader;\nTable.Pagination = TablePagination;\nTable.Predicate = TablePredicate;\nTable.PerPage = TablePerPage;\nTable.Predicate = TablePredicate;\nTable.CollapsibleColumn = TableCollapsibleColumn;\nTable.AccordionColumn = TableAccordionColumn;\nTable.DateRangePicker = TableDateRangePicker;\n"],"names":["Box","Center","Collapse","createStyles","Loader","Skeleton","Table","MantineTable","useForm","useClickOutside","useDidUpdate","defaultColumnSizing","flexRender","getCoreRowModel","useReactTable","defaultsDeep","Children","Fragment","useCallback","useEffect","useState","TableActions","TableAccordionColumn","TableCollapsibleColumn","TableContext","TableDateRangePicker","TableFilter","TableFooter","TableHeader","TablePagination","TablePerPage","TablePredicate","TableSelectableColumn","Th","useRowSelection","useStyles","theme","hasHeader","multiRowSelectionEnabled","rowBackgroundColor","colorScheme","fn","rgba","colors","primaryColor","table","width","paddingLeft","spacing","xl","verticalAlign","header","position","top","backgroundColor","black","white","transition","zIndex","content","left","right","bottom","borderBottom","gray","rowSelected","undefined","rowCollapsibleButtonCell","textAlign","padding","xs","sm","row","data","getRowId","noDataChildren","getExpandChildren","initialState","columns","onMount","onChange","children","loading","doubleClickAction","options","convertedChildren","toArray","find","child","type","footer","predicates","dateRange","initialStateWithoutForm","form","initialValues","cx","classes","pagination","pageSize","DEFAULT_SIZE","concat","manualPagination","getPaginationRowModel","enableMultiRowSelection","getRowCanExpand","original","enableRowSelection","state","setState","setOptions","prev","onStateChange","clearSelection","getSelectedRow","getSelectedRows","triggerChange","values","globalFilter","sorting","clearFilters","setFieldValue","prevState","outsideClickRef","sx","flexGrow","rows","getRowModel","map","rowChildren","tr","onClick","toggleSelected","onDoubleClick","className","getIsSelected","aria-selected","getVisibleCells","cell","size","column","getSize","td","style","id","visible","borderRadius","columnDef","getContext","colSpan","length","borderTop","getIsExpanded","in","px","py","ref","Provider","value","containerRef","getPageCount","horizontalSpacing","verticalSpacing","pb","thead","getHeaderGroups","headerGroup","headers","columnHeader","tbody","Actions","Filter","Footer","Header","Pagination","Predicate","PerPage","CollapsibleColumn","AccordionColumn","DateRangePicker"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/table/Table.tsx"],"sourcesContent":["import {Box, Center, Collapse, createStyles, Loader, Skeleton, Table as MantineTable} from '@mantine/core';\nimport {useForm} from '@mantine/form';\nimport {useClickOutside, useDidUpdate} from '@mantine/hooks';\nimport {\n ColumnDef,\n defaultColumnSizing,\n flexRender,\n getCoreRowModel,\n Row,\n TableState,\n useReactTable,\n} from '@tanstack/react-table';\nimport {CoreOptions, InitialTableState, TableOptions} from '@tanstack/table-core';\nimport debounce from 'lodash.debounce';\nimport defaultsDeep from 'lodash.defaultsdeep';\nimport {Children, Fragment, ReactElement, ReactNode, useCallback, useEffect, useState} from 'react';\n\nimport {TableActions} from './TableActions';\nimport {TableAccordionColumn, TableCollapsibleColumn} from './TableCollapsibleColumn';\nimport {onTableChangeEvent, TableContext, TableFormType} from './TableContext';\nimport {TableDateRangePicker} from './TableDateRangePicker';\nimport {TableFilter} from './TableFilter';\nimport {TableFooter} from './TableFooter';\nimport {TableHeader} from './TableHeader';\nimport {TablePagination} from './TablePagination';\nimport {TablePerPage} from './TablePerPage';\nimport {TablePredicate} from './TablePredicate';\nimport {TableSelectableColumn} from './TableSelectableColumn';\nimport {Th} from './Th';\nimport {useRowSelection} from './useRowSelection';\n\ninterface TableStylesParams {\n hasHeader: boolean;\n multiRowSelectionEnabled: boolean;\n}\n\nconst useStyles = createStyles<string, TableStylesParams>((theme, {hasHeader, multiRowSelectionEnabled}) => {\n const rowBackgroundColor =\n theme.colorScheme === 'dark'\n ? theme.fn.rgba(theme.colors[theme.primaryColor][7], 0.2)\n : theme.colors[theme.primaryColor][0];\n return {\n table: {\n width: '100%',\n '& td:first-of-type, th:first-of-type > *': {\n paddingLeft: theme.spacing.xl,\n },\n '& tbody td': {\n verticalAlign: 'top',\n },\n },\n\n header: {\n position: 'sticky',\n top: hasHeader ? 69 : 0,\n backgroundColor: theme.colorScheme === 'dark' ? theme.black : theme.white,\n transition: 'box-shadow 150ms ease',\n zIndex: 12, // skeleton is 11\n\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n right: 0,\n bottom: 0,\n borderBottom: `1px solid ${theme.colors.gray[2]}`,\n },\n },\n\n rowSelected: {\n backgroundColor: multiRowSelectionEnabled ? undefined : rowBackgroundColor,\n },\n\n rowCollapsibleButtonCell: {\n textAlign: 'right',\n padding: `${theme.spacing.xs / 2}px ${theme.spacing.sm}px !important`,\n },\n\n row: {\n '&:hover': {\n backgroundColor: rowBackgroundColor,\n },\n },\n };\n});\n\nexport interface TableProps<T> {\n /**\n * Data to display in the table\n */\n data: T[];\n /**\n * Defines how each row is uniquely identified. It is highly recommended that you specify this prop to an ID that makes sense.\n */\n getRowId?: CoreOptions<T>['getRowId'];\n /**\n * Columns to display in the table.\n *\n * @see https://tanstack.com/table/v8/docs/guide/column-defs\n */\n columns: Array<ColumnDef<T>>;\n /**\n * Function called when the table mounts\n *\n * @param state the state of the table\n */\n onMount?: onTableChangeEvent;\n /**\n * Function called when the table should update\n *\n * @param state the state of the table\n */\n onChange?: onTableChangeEvent;\n /**\n * Function that generates the expandable content of a row\n * Return null for rows that don't need to be expandable\n *\n * @param datum the row for which the children should be generated.\n */\n getExpandChildren?: (datum: T) => ReactNode;\n /**\n * React children to show when the table has no rows to show. You can leverage useTable to get the state of the table\n */\n noDataChildren?: ReactNode;\n /**\n * Whether the table is loading or not\n *\n * @default false\n */\n loading?: boolean;\n /**\n * Childrens to display in the table. They need to be wrap in either `Table.Header` or `Table.Footer`\n *\n * @example\n * <Table ...>\n * <Table.Header>\n * <div>Hello</div>\n * </Table.Header>\n * </Table>\n */\n children?: ReactNode;\n\n /**\n * Initial state of the table\n */\n initialState?: InitialTableState & Partial<TableFormType>;\n /**\n * Action passed when user double clicks on a row\n */\n doubleClickAction?: (datum: T) => void;\n /**\n * Whether the user can select multiple rows in order to perform actions in bulk\n *\n * @default false\n */\n multiRowSelectionEnabled?: boolean;\n\n options?: Omit<\n Partial<TableOptions<T>>,\n | 'initialState'\n | 'data'\n | 'columns'\n | 'manualPagination'\n | 'enableMultiRowSelection'\n | 'getRowId'\n | 'getRowCanExpand'\n | 'enableRowSelection'\n >;\n}\n\ninterface TableType {\n <T>(props: TableProps<T>): ReactElement;\n Actions: typeof TableActions;\n Filter: typeof TableFilter;\n Footer: typeof TableFooter;\n Header: typeof TableHeader;\n Pagination: typeof TablePagination;\n PerPage: typeof TablePerPage;\n Predicate: typeof TablePredicate;\n DateRangePicker: typeof TableDateRangePicker;\n CollapsibleColumn: typeof TableCollapsibleColumn;\n AccordionColumn: typeof TableAccordionColumn;\n}\n\nexport const Table: TableType = <T,>({\n data,\n getRowId,\n noDataChildren,\n getExpandChildren,\n initialState = {},\n columns,\n onMount,\n onChange,\n children,\n loading = false,\n doubleClickAction,\n multiRowSelectionEnabled,\n options = {},\n}: TableProps<T>) => {\n const convertedChildren = Children.toArray(children) as ReactElement[];\n const header = convertedChildren.find((child) => child.type === TableHeader);\n const footer = convertedChildren.find((child) => child.type === TableFooter);\n\n const {predicates, dateRange, ...initialStateWithoutForm} = initialState;\n const form = useForm<TableFormType>({\n initialValues: {predicates: initialState?.predicates ?? {}, dateRange: initialState?.dateRange ?? [null, null]},\n });\n const {cx, classes} = useStyles({hasHeader: !!header, multiRowSelectionEnabled});\n\n const table = useReactTable({\n initialState: defaultsDeep(initialStateWithoutForm, {pagination: {pageSize: TablePerPage.DEFAULT_SIZE}}),\n data,\n columns: multiRowSelectionEnabled ? [TableSelectableColumn as ColumnDef<T>].concat(columns) : columns,\n getCoreRowModel: getCoreRowModel(),\n manualPagination: options?.getPaginationRowModel === undefined,\n enableMultiRowSelection: !!multiRowSelectionEnabled,\n getRowId,\n getRowCanExpand: (row: Row<T>) => !!getExpandChildren?.(row.original) ?? false,\n enableRowSelection: !loading,\n ...options,\n });\n const [state, setState] = useState<TableState>(table.initialState);\n table.setOptions((prev) => ({\n ...prev,\n state,\n onStateChange: setState,\n }));\n const {clearSelection, getSelectedRow, getSelectedRows} = useRowSelection(table);\n const isFiltered =\n !!state.globalFilter ||\n Object.keys(form.values?.predicates ?? {}).some((predicate) => !!form.values.predicates[predicate]) ||\n !!form.values.dateRange?.[0] ||\n !!form.values.dateRange?.[1];\n\n const triggerChange = debounce(() => onChange?.({...state, ...form.values}), 500);\n\n useEffect(() => {\n onMount?.({...state, ...form.values});\n return () => {\n triggerChange.cancel();\n };\n }, []);\n\n useDidUpdate(() => {\n triggerChange();\n if (!multiRowSelectionEnabled) {\n clearSelection();\n }\n }, [state.globalFilter, state.pagination, state.sorting, form.values]);\n\n const clearFilters = useCallback(() => {\n form.setFieldValue('predicates', initialState.predicates ?? {});\n setState((prevState) => ({...prevState, globalFilter: ''}));\n }, []);\n\n const outsideClickRef = useClickOutside(() => {\n if (!multiRowSelectionEnabled) {\n clearSelection();\n }\n });\n\n if (!data) {\n return (\n <Center sx={{flexGrow: 1}}>\n <Loader />\n </Center>\n );\n }\n\n const rows = table.getRowModel().rows.map((row) => {\n const rowChildren = getExpandChildren?.(row.original) ?? null;\n\n return (\n <Fragment key={row.id}>\n <tr\n onClick={() => row.toggleSelected()}\n onDoubleClick={() => doubleClickAction?.(row.original)}\n className={cx(classes.row, {[classes.rowSelected]: row.getIsSelected()})}\n aria-selected={row.getIsSelected()}\n >\n {row.getVisibleCells().map((cell) => {\n const size = cell.column.getSize();\n const width = size !== defaultColumnSizing.size ? size : undefined;\n return (\n <td\n key={cell.id}\n style={{width}}\n className={cx({\n [classes.rowCollapsibleButtonCell]: cell.column.id === TableCollapsibleColumn.id,\n })}\n >\n <Skeleton visible={loading} sx={!loading ? {borderRadius: 0} : undefined}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Skeleton>\n </td>\n );\n })}\n </tr>\n {rowChildren ? (\n <tr>\n <td\n colSpan={columns.length + 1}\n style={{\n padding: 0,\n borderTop: row.getIsExpanded() ? undefined : 'none',\n borderBottom: row.getIsExpanded() ? undefined : 'none',\n }}\n >\n <Collapse in={row.getIsExpanded()}>\n <Box px=\"sm\" py=\"xs\">\n {rowChildren}\n </Box>\n </Collapse>\n </td>\n </tr>\n ) : null}\n </Fragment>\n );\n });\n\n return (\n <Box ref={outsideClickRef}>\n <TableContext.Provider\n value={{\n onChange: triggerChange,\n state,\n isFiltered,\n setState,\n clearFilters,\n getSelectedRow,\n getSelectedRows,\n clearSelection,\n form,\n containerRef: outsideClickRef,\n multiRowSelectionEnabled,\n getPageCount: table.getPageCount,\n }}\n >\n {!rows.length && !isFiltered && !loading ? (\n noDataChildren\n ) : (\n <>\n {header}\n <MantineTable className={classes.table} horizontalSpacing=\"sm\" verticalSpacing=\"xs\" pb=\"sm\">\n <thead className={classes.header}>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map((columnHeader) => (\n <Th key={columnHeader.id} header={columnHeader} />\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {rows.length ? (\n rows\n ) : (\n <tr>\n <td colSpan={columns.length}>{noDataChildren}</td>\n </tr>\n )}\n </tbody>\n </MantineTable>\n {footer}\n </>\n )}\n </TableContext.Provider>\n </Box>\n );\n};\n\nTable.Actions = TableActions;\nTable.Filter = TableFilter;\nTable.Footer = TableFooter;\nTable.Header = TableHeader;\nTable.Pagination = TablePagination;\nTable.Predicate = TablePredicate;\nTable.PerPage = TablePerPage;\nTable.Predicate = TablePredicate;\nTable.CollapsibleColumn = TableCollapsibleColumn;\nTable.AccordionColumn = TableAccordionColumn;\nTable.DateRangePicker = TableDateRangePicker;\n"],"names":["Box","Center","Collapse","createStyles","Loader","Skeleton","Table","MantineTable","useForm","useClickOutside","useDidUpdate","defaultColumnSizing","flexRender","getCoreRowModel","useReactTable","debounce","defaultsDeep","Children","Fragment","useCallback","useEffect","useState","TableActions","TableAccordionColumn","TableCollapsibleColumn","TableContext","TableDateRangePicker","TableFilter","TableFooter","TableHeader","TablePagination","TablePerPage","TablePredicate","TableSelectableColumn","Th","useRowSelection","useStyles","theme","hasHeader","multiRowSelectionEnabled","rowBackgroundColor","colorScheme","fn","rgba","colors","primaryColor","table","width","paddingLeft","spacing","xl","verticalAlign","header","position","top","backgroundColor","black","white","transition","zIndex","content","left","right","bottom","borderBottom","gray","rowSelected","undefined","rowCollapsibleButtonCell","textAlign","padding","xs","sm","row","data","getRowId","noDataChildren","getExpandChildren","initialState","columns","onMount","onChange","children","loading","doubleClickAction","options","form","convertedChildren","toArray","find","child","type","footer","predicates","dateRange","initialStateWithoutForm","initialValues","cx","classes","pagination","pageSize","DEFAULT_SIZE","concat","manualPagination","getPaginationRowModel","enableMultiRowSelection","getRowCanExpand","original","enableRowSelection","state","setState","setOptions","prev","onStateChange","clearSelection","getSelectedRow","getSelectedRows","isFiltered","globalFilter","Object","keys","values","some","predicate","triggerChange","cancel","sorting","clearFilters","setFieldValue","prevState","outsideClickRef","sx","flexGrow","rows","getRowModel","map","rowChildren","tr","onClick","toggleSelected","onDoubleClick","className","getIsSelected","aria-selected","getVisibleCells","cell","size","column","getSize","td","style","id","visible","borderRadius","columnDef","getContext","colSpan","length","borderTop","getIsExpanded","in","px","py","ref","Provider","value","containerRef","getPageCount","horizontalSpacing","verticalSpacing","pb","thead","getHeaderGroups","headerGroup","headers","columnHeader","tbody","Actions","Filter","Footer","Header","Pagination","Predicate","PerPage","CollapsibleColumn","AccordionColumn","DateRangePicker"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/table/TableContext.tsx"],"sourcesContent":["import {DateRangePickerValue} from '@mantine/dates';\nimport {UseFormReturnType} from '@mantine/form';\nimport {TableState} from '@tanstack/react-table';\nimport {createContext, Dispatch, RefObject} from 'react';\n\nexport type onTableChangeEvent = (params: TableState & TableFormType) => void;\n\nexport type TableFormType = {\n /**\n * Object containing the table predicates and their selected values\n *\n * @example {type: \"LONG\", origin: \"system\"}\n */\n predicates: Record<string, string>;\n /**\n * Selected date range in the table\n *\n * @example [new Date(2022, 0, 1), new Date(2022, 0, 31)]\n */\n dateRange: DateRangePickerValue;\n};\n\ntype TableContextType = {\n /**\n * Function to call when the table needs an update\n */\n onChange: () => void;\n /**\n * Internal state of the table\n *\n * @see https://tanstack.com/table/v8/docs/api/core/table#state\n */\n state: TableState;\n /**\n * Function to update the table state\n */\n setState: Dispatch<(prevState: TableState) => TableState>;\n /**\n * Function that clears the filter and predicates\n */\n clearFilters: () => void;\n /**\n * Function that returns the selected row if any.\n */\n getSelectedRow: () => any | null;\n /**\n * Function that returns an array of the selected rows. Most useful when multi row selection is enabled.\n */\n getSelectedRows: () => any[];\n /**\n * Function that clear the selected row\n */\n clearSelection: () => void;\n /**\n * Form used to handle predicates and dateRange\n */\n form: UseFormReturnType<TableFormType>;\n /**\n * Table container ref\n */\n containerRef: RefObject<HTMLDivElement>;\n multiRowSelectionEnabled: boolean;\n\n /**\n * Function that returns the number of pages\n */\n getPageCount: () => number;\n};\n\nexport const TableContext = createContext<TableContextType | null>(null);\n"],"names":["createContext","TableContext"],"mappings":"AAGA,SAAQA,aAAa,QAA4B,QAAQ;
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/table/TableContext.tsx"],"sourcesContent":["import {DateRangePickerValue} from '@mantine/dates';\nimport {UseFormReturnType} from '@mantine/form';\nimport {TableState} from '@tanstack/react-table';\nimport {createContext, Dispatch, RefObject} from 'react';\n\nexport type onTableChangeEvent = (params: TableState & TableFormType) => void;\n\nexport type TableFormType = {\n /**\n * Object containing the table predicates and their selected values\n *\n * @example {type: \"LONG\", origin: \"system\"}\n */\n predicates: Record<string, string>;\n /**\n * Selected date range in the table\n *\n * @example [new Date(2022, 0, 1), new Date(2022, 0, 31)]\n */\n dateRange: DateRangePickerValue;\n};\n\ntype TableContextType = {\n /**\n * Function to call when the table needs an update\n */\n onChange: () => void;\n /**\n * Internal state of the table\n *\n * @see https://tanstack.com/table/v8/docs/api/core/table#state\n */\n state: TableState;\n /**\n * Function to update the table state\n */\n setState: Dispatch<(prevState: TableState) => TableState>;\n /**\n * Whether the table currently as any kind of filter applied.\n * Useful to determine if the noDataChildren is an empty state or just the result of a filter\n */\n isFiltered: boolean;\n /**\n * Function that clears the filter and predicates\n */\n clearFilters: () => void;\n /**\n * Function that returns the selected row if any.\n */\n getSelectedRow: () => any | null;\n /**\n * Function that returns an array of the selected rows. Most useful when multi row selection is enabled.\n */\n getSelectedRows: () => any[];\n /**\n * Function that clear the selected row\n */\n clearSelection: () => void;\n /**\n * Form used to handle predicates and dateRange\n */\n form: UseFormReturnType<TableFormType>;\n /**\n * Table container ref\n */\n containerRef: RefObject<HTMLDivElement>;\n multiRowSelectionEnabled: boolean;\n\n /**\n * Function that returns the number of pages\n */\n getPageCount: () => number;\n};\n\nexport const TableContext = createContext<TableContextType | null>(null);\n"],"names":["createContext","TableContext"],"mappings":"AAGA,SAAQA,aAAa,QAA4B,QAAQ;AAuEzD,OAAO,IAAMC,6BAAeD,cAAuC,IAAI,EAAE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coveord/plasma-mantine",
|
|
3
|
-
"version": "49.3.
|
|
3
|
+
"version": "49.3.4",
|
|
4
4
|
"description": "A Plasma flavoured Mantine theme",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"plasma",
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"@tanstack/react-table": "8.7.9",
|
|
21
21
|
"@tanstack/table-core": "8.7.9",
|
|
22
22
|
"dayjs": "1.11.3",
|
|
23
|
+
"lodash.debounce": "4.0.8",
|
|
23
24
|
"lodash.defaultsdeep": "4.6.1",
|
|
24
25
|
"monaco-editor": "0.34.0",
|
|
25
26
|
"react-beautiful-dnd": "13.1.1",
|
|
@@ -42,6 +43,7 @@
|
|
|
42
43
|
"@testing-library/react": "13.4.0",
|
|
43
44
|
"@testing-library/user-event": "14.4.3",
|
|
44
45
|
"@types/jest": "29.1.2",
|
|
46
|
+
"@types/lodash.debounce": "^4.0.7",
|
|
45
47
|
"@types/lodash.defaultsdeep": "4.6.7",
|
|
46
48
|
"@types/react": "18.0.21",
|
|
47
49
|
"@types/react-beautiful-dnd": "13.1.2",
|
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
import matchers from '@testing-library/jest-dom/matchers';
|
|
1
|
+
import matchers, {TestingLibraryMatchers} from '@testing-library/jest-dom/matchers';
|
|
2
2
|
import {cleanup} from '@testing-library/react';
|
|
3
|
+
declare global {
|
|
4
|
+
namespace Vi {
|
|
5
|
+
interface JestAssertion<T = any> extends jest.Matchers<void, T>, TestingLibraryMatchers<T, void> {}
|
|
6
|
+
}
|
|
7
|
+
}
|
|
3
8
|
expect.extend(matchers);
|
|
4
9
|
Object.defineProperty(window, 'matchMedia', {
|
|
5
10
|
writable: true,
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
useReactTable,
|
|
12
12
|
} from '@tanstack/react-table';
|
|
13
13
|
import {CoreOptions, InitialTableState, TableOptions} from '@tanstack/table-core';
|
|
14
|
+
import debounce from 'lodash.debounce';
|
|
14
15
|
import defaultsDeep from 'lodash.defaultsdeep';
|
|
15
16
|
import {Children, Fragment, ReactElement, ReactNode, useCallback, useEffect, useState} from 'react';
|
|
16
17
|
|
|
@@ -225,11 +226,19 @@ export const Table: TableType = <T,>({
|
|
|
225
226
|
onStateChange: setState,
|
|
226
227
|
}));
|
|
227
228
|
const {clearSelection, getSelectedRow, getSelectedRows} = useRowSelection(table);
|
|
229
|
+
const isFiltered =
|
|
230
|
+
!!state.globalFilter ||
|
|
231
|
+
Object.keys(form.values?.predicates ?? {}).some((predicate) => !!form.values.predicates[predicate]) ||
|
|
232
|
+
!!form.values.dateRange?.[0] ||
|
|
233
|
+
!!form.values.dateRange?.[1];
|
|
228
234
|
|
|
229
|
-
const triggerChange = () => onChange?.({...state, ...form.values});
|
|
235
|
+
const triggerChange = debounce(() => onChange?.({...state, ...form.values}), 500);
|
|
230
236
|
|
|
231
237
|
useEffect(() => {
|
|
232
238
|
onMount?.({...state, ...form.values});
|
|
239
|
+
return () => {
|
|
240
|
+
triggerChange.cancel();
|
|
241
|
+
};
|
|
233
242
|
}, []);
|
|
234
243
|
|
|
235
244
|
useDidUpdate(() => {
|
|
@@ -237,10 +246,10 @@ export const Table: TableType = <T,>({
|
|
|
237
246
|
if (!multiRowSelectionEnabled) {
|
|
238
247
|
clearSelection();
|
|
239
248
|
}
|
|
240
|
-
}, [state.globalFilter, state.
|
|
249
|
+
}, [state.globalFilter, state.pagination, state.sorting, form.values]);
|
|
241
250
|
|
|
242
251
|
const clearFilters = useCallback(() => {
|
|
243
|
-
form.setFieldValue('predicates', {});
|
|
252
|
+
form.setFieldValue('predicates', initialState.predicates ?? {});
|
|
244
253
|
setState((prevState) => ({...prevState, globalFilter: ''}));
|
|
245
254
|
}, []);
|
|
246
255
|
|
|
@@ -315,6 +324,7 @@ export const Table: TableType = <T,>({
|
|
|
315
324
|
value={{
|
|
316
325
|
onChange: triggerChange,
|
|
317
326
|
state,
|
|
327
|
+
isFiltered,
|
|
318
328
|
setState,
|
|
319
329
|
clearFilters,
|
|
320
330
|
getSelectedRow,
|
|
@@ -326,28 +336,34 @@ export const Table: TableType = <T,>({
|
|
|
326
336
|
getPageCount: table.getPageCount,
|
|
327
337
|
}}
|
|
328
338
|
>
|
|
329
|
-
{
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
339
|
+
{!rows.length && !isFiltered && !loading ? (
|
|
340
|
+
noDataChildren
|
|
341
|
+
) : (
|
|
342
|
+
<>
|
|
343
|
+
{header}
|
|
344
|
+
<MantineTable className={classes.table} horizontalSpacing="sm" verticalSpacing="xs" pb="sm">
|
|
345
|
+
<thead className={classes.header}>
|
|
346
|
+
{table.getHeaderGroups().map((headerGroup) => (
|
|
347
|
+
<tr key={headerGroup.id}>
|
|
348
|
+
{headerGroup.headers.map((columnHeader) => (
|
|
349
|
+
<Th key={columnHeader.id} header={columnHeader} />
|
|
350
|
+
))}
|
|
351
|
+
</tr>
|
|
336
352
|
))}
|
|
337
|
-
</
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
</
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
353
|
+
</thead>
|
|
354
|
+
<tbody>
|
|
355
|
+
{rows.length ? (
|
|
356
|
+
rows
|
|
357
|
+
) : (
|
|
358
|
+
<tr>
|
|
359
|
+
<td colSpan={columns.length}>{noDataChildren}</td>
|
|
360
|
+
</tr>
|
|
361
|
+
)}
|
|
362
|
+
</tbody>
|
|
363
|
+
</MantineTable>
|
|
364
|
+
{footer}
|
|
365
|
+
</>
|
|
366
|
+
)}
|
|
351
367
|
</TableContext.Provider>
|
|
352
368
|
</Box>
|
|
353
369
|
);
|
|
@@ -35,6 +35,11 @@ type TableContextType = {
|
|
|
35
35
|
* Function to update the table state
|
|
36
36
|
*/
|
|
37
37
|
setState: Dispatch<(prevState: TableState) => TableState>;
|
|
38
|
+
/**
|
|
39
|
+
* Whether the table currently as any kind of filter applied.
|
|
40
|
+
* Useful to determine if the noDataChildren is an empty state or just the result of a filter
|
|
41
|
+
*/
|
|
42
|
+
isFiltered: boolean;
|
|
38
43
|
/**
|
|
39
44
|
* Function that clears the filter and predicates
|
|
40
45
|
*/
|
|
@@ -3,6 +3,7 @@ import {render, screen, userEvent, waitFor, within} from '@test-utils';
|
|
|
3
3
|
import {FunctionComponent} from 'react';
|
|
4
4
|
|
|
5
5
|
import {Table} from '../Table';
|
|
6
|
+
import {useTable} from '../useTable';
|
|
6
7
|
|
|
7
8
|
type RowData = {firstName: string; lastName?: string};
|
|
8
9
|
|
|
@@ -68,6 +69,67 @@ describe('Table', () => {
|
|
|
68
69
|
expect(screen.getByRole('button', {name: 'Hello'})).toBeVisible();
|
|
69
70
|
});
|
|
70
71
|
|
|
72
|
+
it('hides the footer and header when the table is empty and not filtered', () => {
|
|
73
|
+
const NoData = () => <span data-testid="empty-state" />;
|
|
74
|
+
const customColumns: Array<ColumnDef<RowData>> = [
|
|
75
|
+
columnHelper.accessor('firstName', {
|
|
76
|
+
header: () => 'First Name',
|
|
77
|
+
cell: (info) => info.getValue().toUpperCase(),
|
|
78
|
+
enableSorting: false,
|
|
79
|
+
}),
|
|
80
|
+
columnHelper.accessor('lastName', {
|
|
81
|
+
header: () => 'Last Name',
|
|
82
|
+
cell: (info) => info.getValue().toUpperCase(),
|
|
83
|
+
enableSorting: false,
|
|
84
|
+
}),
|
|
85
|
+
];
|
|
86
|
+
render(
|
|
87
|
+
<Table data={[]} columns={customColumns} noDataChildren={<NoData />}>
|
|
88
|
+
<Table.Header data-testid="table-header">header</Table.Header>
|
|
89
|
+
<Table.Footer data-testid="table-footer">footer</Table.Footer>
|
|
90
|
+
</Table>
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
expect(screen.queryByTestId('table-header')).not.toBeInTheDocument();
|
|
94
|
+
expect(screen.queryByTestId('table-footer')).not.toBeInTheDocument();
|
|
95
|
+
expect(screen.getByTestId('empty-state')).toBeInTheDocument();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('does not hide the footer and header when the table is empty and filtered', () => {
|
|
99
|
+
const NoData = () => {
|
|
100
|
+
const {isFiltered} = useTable();
|
|
101
|
+
return isFiltered ? <span data-testid="filtered-empty-state" /> : <span data-testid="empty-state" />;
|
|
102
|
+
};
|
|
103
|
+
const customColumns: Array<ColumnDef<RowData>> = [
|
|
104
|
+
columnHelper.accessor('firstName', {
|
|
105
|
+
header: () => 'First Name',
|
|
106
|
+
cell: (info) => info.getValue().toUpperCase(),
|
|
107
|
+
enableSorting: false,
|
|
108
|
+
}),
|
|
109
|
+
columnHelper.accessor('lastName', {
|
|
110
|
+
header: () => 'Last Name',
|
|
111
|
+
cell: (info) => info.getValue().toUpperCase(),
|
|
112
|
+
enableSorting: false,
|
|
113
|
+
}),
|
|
114
|
+
];
|
|
115
|
+
render(
|
|
116
|
+
<Table
|
|
117
|
+
data={[]}
|
|
118
|
+
columns={customColumns}
|
|
119
|
+
noDataChildren={<NoData />}
|
|
120
|
+
initialState={{globalFilter: 'something'}}
|
|
121
|
+
>
|
|
122
|
+
<Table.Header data-testid="table-header">header</Table.Header>
|
|
123
|
+
<Table.Footer data-testid="table-footer">footer</Table.Footer>
|
|
124
|
+
</Table>
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
expect(screen.getByTestId('table-header')).toBeInTheDocument();
|
|
128
|
+
expect(screen.getByTestId('table-footer')).toBeInTheDocument();
|
|
129
|
+
expect(screen.getByTestId('filtered-empty-state')).toBeInTheDocument();
|
|
130
|
+
expect(screen.queryByTestId('empty-state')).not.toBeInTheDocument();
|
|
131
|
+
});
|
|
132
|
+
|
|
71
133
|
it('opens the collapsible rows when the user click on the toggle', async () => {
|
|
72
134
|
const user = userEvent.setup({delay: null});
|
|
73
135
|
const Fixture: FunctionComponent<{row: RowData}> = ({row}) => <div>Collapsible content: {row.lastName}</div>;
|
|
@@ -82,6 +82,7 @@ describe('Table.DateRangePicker', () => {
|
|
|
82
82
|
await user.click(screen.getByRole('option', {name: 'Preset'}));
|
|
83
83
|
|
|
84
84
|
await user.click(screen.getByRole('button', {name: 'Apply'}));
|
|
85
|
+
vi.advanceTimersByTime(500);
|
|
85
86
|
|
|
86
87
|
await waitFor(() => expect(screen.queryByText('Jan 08, 2022 - Jan 14, 2022')).toBeVisible());
|
|
87
88
|
expect(onChange).toHaveBeenCalledWith(
|
|
@@ -9,6 +9,12 @@ const columnHelper = createColumnHelper<RowData>();
|
|
|
9
9
|
const columns: Array<ColumnDef<RowData>> = [columnHelper.accessor('name', {enableSorting: false})];
|
|
10
10
|
|
|
11
11
|
describe('Table.Filter', () => {
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
vi.useFakeTimers();
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
vi.useRealTimers();
|
|
17
|
+
});
|
|
12
18
|
it('displays the placeholder', () => {
|
|
13
19
|
const onChange = vi.fn();
|
|
14
20
|
render(
|
|
@@ -34,6 +40,7 @@ describe('Table.Filter', () => {
|
|
|
34
40
|
);
|
|
35
41
|
|
|
36
42
|
await user.type(screen.getByRole('textbox'), 'vegetable');
|
|
43
|
+
vi.advanceTimersByTime(500);
|
|
37
44
|
|
|
38
45
|
expect(onChange).toHaveBeenCalledWith(expect.objectContaining({globalFilter: 'vegetable'}));
|
|
39
46
|
});
|
|
@@ -54,6 +61,7 @@ describe('Table.Filter', () => {
|
|
|
54
61
|
);
|
|
55
62
|
|
|
56
63
|
await user.type(screen.getByRole('textbox'), 'veg');
|
|
64
|
+
vi.advanceTimersByTime(500);
|
|
57
65
|
|
|
58
66
|
expect(onChange).toHaveBeenCalledWith(
|
|
59
67
|
expect.objectContaining({globalFilter: 'veg', pagination: {pageIndex: 0, pageSize: 50}})
|
|
@@ -9,6 +9,12 @@ const columnHelper = createColumnHelper<RowData>();
|
|
|
9
9
|
const columns: Array<ColumnDef<RowData>> = [columnHelper.accessor('name', {enableSorting: false})];
|
|
10
10
|
|
|
11
11
|
describe('Table.PerPage', () => {
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
vi.useFakeTimers();
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
vi.useRealTimers();
|
|
17
|
+
});
|
|
12
18
|
it('displays the label', () => {
|
|
13
19
|
render(
|
|
14
20
|
<Table data={[{name: 'fruit'}, {name: 'vegetable'}]} columns={columns}>
|
|
@@ -74,7 +80,7 @@ describe('Table.PerPage', () => {
|
|
|
74
80
|
);
|
|
75
81
|
|
|
76
82
|
await user.click(screen.queryByRole('radio', {name: '100'}));
|
|
77
|
-
|
|
83
|
+
vi.advanceTimersByTime(500);
|
|
78
84
|
expect(onChange).toHaveBeenCalledWith(
|
|
79
85
|
expect.objectContaining({pagination: expect.objectContaining({pageSize: 100})})
|
|
80
86
|
);
|
|
@@ -98,7 +104,7 @@ describe('Table.PerPage', () => {
|
|
|
98
104
|
);
|
|
99
105
|
|
|
100
106
|
await user.click(screen.queryByRole('radio', {name: '100'}));
|
|
101
|
-
|
|
107
|
+
vi.advanceTimersByTime(500);
|
|
102
108
|
expect(onChange).toHaveBeenCalledWith(
|
|
103
109
|
expect.objectContaining({pagination: expect.objectContaining({pageIndex: 0})})
|
|
104
110
|
);
|
|
@@ -9,6 +9,12 @@ const columnHelper = createColumnHelper<RowData>();
|
|
|
9
9
|
const columns: Array<ColumnDef<RowData>> = [columnHelper.accessor('name', {enableSorting: false})];
|
|
10
10
|
|
|
11
11
|
describe('Table.Predicate', () => {
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
vi.useFakeTimers();
|
|
14
|
+
});
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
vi.useRealTimers();
|
|
17
|
+
});
|
|
12
18
|
it('displays the intial value', async () => {
|
|
13
19
|
render(
|
|
14
20
|
<Table
|
|
@@ -115,6 +121,7 @@ describe('Table.Predicate', () => {
|
|
|
115
121
|
name: 'rank',
|
|
116
122
|
})
|
|
117
123
|
).toHaveValue('First');
|
|
124
|
+
vi.advanceTimersByTime(500);
|
|
118
125
|
|
|
119
126
|
expect(onChange).toHaveBeenCalledWith(expect.objectContaining({predicates: {rank: 'first'}}));
|
|
120
127
|
});
|