@vrobots/storybook 0.2.18 → 0.2.19
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/dist/package.json +1 -1
- package/dist/src/components/table/DataTable.js +10 -14
- package/dist/src/components/table/components/PageSizeSelector.js +1 -1
- package/dist/src/components/table/components/Pagination.js +2 -2
- package/dist/src/components/table/components/TableFilter.js +3 -3
- package/dist/src/components/table/components/TableFilterDatePicker.js +1 -1
- package/dist/src/components/table/components/TableFilterInput.js +1 -1
- package/package.json +1 -1
package/dist/package.json
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Card, Table } from "@chakra-ui/react";
|
|
3
|
-
import { useColorMode } from "../ui/color-mode";
|
|
4
3
|
import { flexRender, getCoreRowModel, useReactTable } from "@tanstack/react-table";
|
|
5
4
|
import { useEffect, useState } from "react";
|
|
6
5
|
import TableFilter from "./components/TableFilter";
|
|
7
6
|
import { Pagination } from "./components/Pagination";
|
|
8
|
-
const Pager = ({
|
|
7
|
+
const Pager = ({ pagesTotal, pageNumber, setPageNumber, pageSize, setPageSize }) => (_jsx(Box, { p: { base: 3, md: 4 }, borderTopWidth: '1px', borderBottomWidth: '1px', borderColor: 'neu.border', bg: { _light: 'whiteAlpha.500', _dark: 'whiteAlpha.50' }, children: _jsx(Pagination, { pagesTotal: pagesTotal, pageNumber: pageNumber, setPageNumber: setPageNumber, pageSize: pageSize, setPageSize: setPageSize, showPageSelector: true }) }));
|
|
9
8
|
const DataTable = ({ data: defaultData, total, pageNumber, pagesTotal, setPageNumber, setPageSize, pageSize, columns, filters = [], onRowClick, onFilterChange, }) => {
|
|
10
9
|
const [data, setData] = useState(() => [...defaultData]);
|
|
11
|
-
const { colorMode } = useColorMode();
|
|
12
10
|
const columnResizeMode = 'onChange';
|
|
13
11
|
const columnResizeDirection = 'ltr';
|
|
14
|
-
const isDarkMode = colorMode === 'dark';
|
|
15
|
-
const border = `1px solid ${isDarkMode ? '#333333' : '#E2E8F0'} !important`;
|
|
16
12
|
const table = useReactTable({
|
|
17
13
|
data,
|
|
18
14
|
columns,
|
|
@@ -20,22 +16,22 @@ const DataTable = ({ data: defaultData, total, pageNumber, pagesTotal, setPageNu
|
|
|
20
16
|
columnResizeDirection,
|
|
21
17
|
getCoreRowModel: getCoreRowModel(),
|
|
22
18
|
});
|
|
23
|
-
const pagerProps = {
|
|
19
|
+
const pagerProps = { pagesTotal, pageNumber, setPageNumber, pageSize, setPageSize };
|
|
24
20
|
useEffect(() => {
|
|
25
21
|
setData([...defaultData]);
|
|
26
22
|
}, [defaultData, setData]);
|
|
27
|
-
return (_jsx(Card.Root, { children: _jsxs(Card.Body, { p: 0, children: [_jsx(Pager, { ...pagerProps }), _jsx(Box, { overflow: 'auto', children: _jsxs(Table.Root, { width: '100%', children: [_jsx(Table.Header, { children: table.getHeaderGroups().map(headerGroup => (_jsx(Table.Row, { children: headerGroup.headers.map(header => (_jsxs(Table.ColumnHeader, {
|
|
23
|
+
return (_jsx(Card.Root, { layerStyle: 'neuRaised', overflow: 'hidden', children: _jsxs(Card.Body, { p: 0, children: [_jsx(Pager, { ...pagerProps }), _jsx(Box, { overflow: 'auto', bg: { _light: 'whiteAlpha.600', _dark: 'whiteAlpha.50' }, children: _jsxs(Table.Root, { width: '100%', size: 'sm', children: [_jsx(Table.Header, { children: table.getHeaderGroups().map(headerGroup => (_jsx(Table.Row, { children: headerGroup.headers.map(header => (_jsxs(Table.ColumnHeader, { borderColor: 'neu.border', borderBottomWidth: '1px', bg: { _light: 'rgba(255,255,255,0.8)', _dark: 'rgba(31,39,50,0.85)' }, color: 'neu.text', fontWeight: 'semibold', fontSize: 'xs', textTransform: 'uppercase', letterSpacing: '0.04em', children: [header.isPlaceholder
|
|
28
24
|
? null
|
|
29
|
-
: flexRender(header.column.columnDef.header, header.getContext()), filters.find((filter) => filter.id === header.id) && !!onFilterChange ? (_jsx(TableFilter, { filter: filters.find(filter => filter.id === header.id), onFilterChange: onFilterChange })) : null] }, header.id))) }, headerGroup.id))) }), _jsxs(Table.Body, { children: [total === 0 ? (_jsx(Table.Row, { children: _jsx(Table.Cell, { colSpan: columns.length, textAlign: 'center', children: "No records found" }) })) : null, table.getRowModel().rows.map((row, i) => {
|
|
25
|
+
: flexRender(header.column.columnDef.header, header.getContext()), filters.find((filter) => filter.id === header.id) && !!onFilterChange ? (_jsx(TableFilter, { filter: filters.find(filter => filter.id === header.id), onFilterChange: onFilterChange })) : null] }, header.id))) }, headerGroup.id))) }), _jsxs(Table.Body, { children: [total === 0 ? (_jsx(Table.Row, { children: _jsx(Table.Cell, { colSpan: columns.length, textAlign: 'center', color: 'neu.muted', py: 8, children: "No records found" }) })) : null, table.getRowModel().rows.map((row, i) => {
|
|
30
26
|
const isEven = i % 2 === 0;
|
|
31
|
-
const colorEven =
|
|
32
|
-
const colorOdd =
|
|
27
|
+
const colorEven = { _light: 'whiteAlpha.800', _dark: 'whiteAlpha.100' };
|
|
28
|
+
const colorOdd = { _light: 'whiteAlpha.600', _dark: 'whiteAlpha.50' };
|
|
33
29
|
const backgroundColor = isEven ? colorEven : colorOdd;
|
|
34
|
-
return (_jsx(Table.Row, { background: backgroundColor, _hover: !!onRowClick ? {
|
|
30
|
+
return (_jsx(Table.Row, { background: backgroundColor, transition: 'background-color 0.14s ease', _hover: !!onRowClick ? {
|
|
35
31
|
cursor: 'pointer',
|
|
36
|
-
backgroundColor: 'rgba(
|
|
37
|
-
} : void 0, onClick: () => onRowClick && onRowClick(row.original), children: row.getVisibleCells().map(cell => (_jsx(Table.Cell, {
|
|
38
|
-
})] }), _jsx(Table.Footer, { children: table.getFooterGroups().map(footerGroup => (_jsx(Table.Row, { children: footerGroup.headers.map(header => (_jsx(Table.ColumnHeader, {
|
|
32
|
+
backgroundColor: { _light: 'rgba(99, 179, 237, 0.22)', _dark: 'rgba(99, 179, 237, 0.28)' },
|
|
33
|
+
} : void 0, onClick: () => onRowClick && onRowClick(row.original), children: row.getVisibleCells().map(cell => (_jsx(Table.Cell, { borderColor: 'neu.border', borderBottomWidth: '1px', color: 'neu.text', children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id))) }, row.id));
|
|
34
|
+
})] }), _jsx(Table.Footer, { children: table.getFooterGroups().map(footerGroup => (_jsx(Table.Row, { children: footerGroup.headers.map(header => (_jsx(Table.ColumnHeader, { borderColor: 'neu.border', borderTopWidth: '1px', bg: { _light: 'whiteAlpha.700', _dark: 'whiteAlpha.100' }, children: header.isPlaceholder
|
|
39
35
|
? null
|
|
40
36
|
: flexRender(header.column.columnDef.header, header.getContext()) }, header.id))) }, footerGroup.id))) })] }) }), _jsx(Pager, { ...pagerProps })] }) }));
|
|
41
37
|
};
|
|
@@ -4,5 +4,5 @@ import * as React from 'react';
|
|
|
4
4
|
export const PageSizeSelector = ({ sizes, selectedPageSize, onSelect, }) => {
|
|
5
5
|
const idKey = React.useId();
|
|
6
6
|
const handleSetPageSize = (e) => onSelect(Number(e.target.value));
|
|
7
|
-
return (_jsxs(HStack, { gap: "3", align: "center", children: [_jsx(Text, { fontSize: "sm", fontWeight: "normal", children: "Showing" }), _jsxs(NativeSelect.Root, { size: 'sm', maxW: '75px', children: [_jsx(NativeSelect.Field, { id: `page-size-selector-${idKey}`, value: selectedPageSize, onChange: handleSetPageSize, cursor: 'pointer', children: sizes.map((size, key) => (_jsx("option", { value: size, children: size }, `options-${size}-${key}`))) }), _jsx(NativeSelect.Indicator, {})] })] }));
|
|
7
|
+
return (_jsxs(HStack, { gap: "3", align: "center", children: [_jsx(Text, { fontSize: "sm", fontWeight: "normal", color: 'neu.muted', children: "Showing" }), _jsxs(NativeSelect.Root, { size: 'sm', maxW: '75px', bg: { _light: 'whiteAlpha.900', _dark: 'whiteAlpha.100' }, borderColor: 'neu.border', children: [_jsx(NativeSelect.Field, { id: `page-size-selector-${idKey}`, value: selectedPageSize, onChange: handleSetPageSize, cursor: 'pointer', color: 'neu.text', children: sizes.map((size, key) => (_jsx("option", { value: size, children: size }, `options-${size}-${key}`))) }), _jsx(NativeSelect.Indicator, {})] })] }));
|
|
8
8
|
};
|
|
@@ -7,7 +7,7 @@ import { useBreakpoint } from '../../../hooks';
|
|
|
7
7
|
const PAGE_LIMIT_MOBILE = 2;
|
|
8
8
|
const PAGE_LIMIT = 4;
|
|
9
9
|
const makeNavButton = (onChange, pageNumber) => function PageButton(page) {
|
|
10
|
-
return (_jsx(Button, { "aria-label": `page-${page}`, onClick: () => onChange(page.toString()), variant: page === pageNumber ? 'solid' : '
|
|
10
|
+
return (_jsx(Button, { "aria-label": `page-${page}`, onClick: () => onChange(page.toString()), variant: page === pageNumber ? 'solid' : 'subtle', colorPalette: page === pageNumber ? 'blue' : undefined, size: 'sm', paddingLeft: '1px !important', paddingRight: '1px !important', marginRight: 1, borderWidth: '1px', borderColor: 'neu.border', children: page }, `nav-button-${page}`));
|
|
11
11
|
};
|
|
12
12
|
export const Pagination = ({ pagesTotal, pageNumber, pageSize, showPageSelector, setPageNumber, setPageSize }) => {
|
|
13
13
|
const [pageInput, setPageInput] = React.useState(pageNumber);
|
|
@@ -47,5 +47,5 @@ export const Pagination = ({ pagesTotal, pageNumber, pageSize, showPageSelector,
|
|
|
47
47
|
}, templateColumns: {
|
|
48
48
|
sm: `repeat(1, 1fr)`,
|
|
49
49
|
md: `repeat(2, 1fr)`,
|
|
50
|
-
}, children: [showPageSelector ? (_jsx(_Fragment, { children: _jsx(GridItem, { mb: 4, children: _jsxs(Flex, { children: [_jsx(PageSizeSelector, { sizes: PAGE_SIZES, selectedPageSize: pageSize, onSelect: setPageSize }), _jsxs(Text, { fontSize: 'sm', fontWeight: 'normal', ml: 4, mt: 1, children: ["page ", _jsx("strong", { children: pageNumber.toString() }), " of ", _jsx("strong", { children: pagesTotal.toString() })] })] }) }) })) : _jsx(GridItem, { colSpan: 1 }), _jsx(GridItem, { children: _jsx(Field.Root, { children: _jsxs(HStack, { justifyContent: 'right', children: [handlePages(pages, limit, pageNumber).map(makeNavButton(handleChangePageInput(false), pageNumber)), _jsx(Field.Label, { htmlFor: 'pagination', style: { fontSize: 10 }, mt: 2, ml: 4, children: "goto page:" }), _jsxs(NumberInput.Root, { value: String(pageInput), size: 'sm', max: pagesTotal, min: 1, onValueChange: (details) => handleChangePageInput(true)(details.value), children: [_jsx(NumberInput.Input, { id: 'pagination', style: { width: 90 } }), _jsxs(NumberInput.Control, { children: [_jsx(NumberInput.IncrementTrigger, {}), _jsx(NumberInput.DecrementTrigger, {})] })] })] }) }) })] }));
|
|
50
|
+
}, children: [showPageSelector ? (_jsx(_Fragment, { children: _jsx(GridItem, { mb: 4, children: _jsxs(Flex, { children: [_jsx(PageSizeSelector, { sizes: PAGE_SIZES, selectedPageSize: pageSize, onSelect: setPageSize }), _jsxs(Text, { fontSize: 'sm', fontWeight: 'normal', ml: 4, mt: 1, children: ["page ", _jsx("strong", { children: pageNumber.toString() }), " of ", _jsx("strong", { children: pagesTotal.toString() })] })] }) }) })) : _jsx(GridItem, { colSpan: 1 }), _jsx(GridItem, { children: _jsx(Field.Root, { children: _jsxs(HStack, { justifyContent: 'right', children: [handlePages(pages, limit, pageNumber).map(makeNavButton(handleChangePageInput(false), pageNumber)), _jsx(Field.Label, { htmlFor: 'pagination', style: { fontSize: 10 }, mt: 2, ml: 4, color: 'neu.muted', children: "goto page:" }), _jsxs(NumberInput.Root, { value: String(pageInput), size: 'sm', max: pagesTotal, min: 1, onValueChange: (details) => handleChangePageInput(true)(details.value), children: [_jsx(NumberInput.Input, { id: 'pagination', style: { width: 90 }, bg: { _light: 'whiteAlpha.900', _dark: 'whiteAlpha.100' }, borderColor: 'neu.border' }), _jsxs(NumberInput.Control, { children: [_jsx(NumberInput.IncrementTrigger, {}), _jsx(NumberInput.DecrementTrigger, {})] })] })] }) }) })] }));
|
|
51
51
|
};
|
|
@@ -17,12 +17,12 @@ export default function TableFilter({ filter, onFilterChange, }) {
|
|
|
17
17
|
const handleClearFilter = () => {
|
|
18
18
|
onFilterChange({ ...filter, value: undefined });
|
|
19
19
|
};
|
|
20
|
-
const ClearFilterButton = () => !!filter.value ? (_jsx(Tooltip, { content: `Clear filter`, positioning: { placement: 'bottom-end' }, showArrow: true, children: _jsx(IconButton, { "aria-label": `Clear filter ${filter.type}`, onClick: handleClearFilter, size: 'sm', variant: 'ghost', children: _jsx(FaX, {}) }) })) : null;
|
|
20
|
+
const ClearFilterButton = () => !!filter.value ? (_jsx(Tooltip, { content: `Clear filter`, positioning: { placement: 'bottom-end' }, showArrow: true, children: _jsx(IconButton, { "aria-label": `Clear filter ${filter.type}`, onClick: handleClearFilter, size: 'sm', variant: 'ghost', color: 'neu.muted', _hover: { color: 'neu.text', bg: { _light: 'blackAlpha.100', _dark: 'whiteAlpha.100' } }, children: _jsx(FaX, {}) }) })) : null;
|
|
21
21
|
if (filter.type === 'string' || filter.type === 'number') {
|
|
22
|
-
return (_jsxs(Field.Root, { children: [_jsx(InputGroup, { endElement: _jsx(ClearFilterButton, {}), children: _jsx(TableFilterInput, { value: filter.value?.toString() || '', onChange: handleChangeInput }) }), _jsx(Field.HelperText, { color: '
|
|
22
|
+
return (_jsxs(Field.Root, { children: [_jsx(InputGroup, { endElement: _jsx(ClearFilterButton, {}), children: _jsx(TableFilterInput, { value: filter.value?.toString() || '', onChange: handleChangeInput }) }), _jsx(Field.HelperText, { color: 'neu.muted', whiteSpace: 'nowrap', wordBreak: 'break-word', children: filter.helperText })] }));
|
|
23
23
|
}
|
|
24
24
|
if (filter.type === 'date') {
|
|
25
|
-
return (_jsxs(Field.Root, { children: [_jsx(InputGroup, { endElement: _jsx(ClearFilterButton, {}), children: _jsx(TableFilterDatePicker, { selected: filter.value, onChange: (date) => handleChangeDate(date) }) }), _jsx(Field.HelperText, { color: '
|
|
25
|
+
return (_jsxs(Field.Root, { children: [_jsx(InputGroup, { endElement: _jsx(ClearFilterButton, {}), children: _jsx(TableFilterDatePicker, { selected: filter.value, onChange: (date) => handleChangeDate(date) }) }), _jsx(Field.HelperText, { color: 'neu.muted', whiteSpace: 'nowrap', wordBreak: 'break-word', children: filter.helperText })] }));
|
|
26
26
|
}
|
|
27
27
|
return null;
|
|
28
28
|
}
|
|
@@ -6,5 +6,5 @@ export default function TableFilterDatePicker({ selected, onChange }) {
|
|
|
6
6
|
const val = e.target.value;
|
|
7
7
|
onChange(val ? new Date(val) : null);
|
|
8
8
|
};
|
|
9
|
-
return (_jsx(Input, { type: "date", value: value, onChange: handleChange, width: '100%', mt: 2, size: '
|
|
9
|
+
return (_jsx(Input, { type: "date", value: value, onChange: handleChange, width: '100%', mt: 2, size: 'sm', bg: { _light: 'whiteAlpha.900', _dark: 'whiteAlpha.100' }, borderColor: 'neu.border' }));
|
|
10
10
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Input } from "@chakra-ui/react";
|
|
3
3
|
export default function TableFilterInput(props) {
|
|
4
|
-
return (_jsx(Input, { width: '100%', mt: 2, ...props }));
|
|
4
|
+
return (_jsx(Input, { width: '100%', mt: 2, size: 'sm', bg: { _light: 'whiteAlpha.900', _dark: 'whiteAlpha.100' }, borderColor: 'neu.border', ...props }));
|
|
5
5
|
}
|