@bsol-oss/react-datatable5 1.0.20 → 1.0.22
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/index.d.ts +3 -1
- package/dist/index.js +39 -12
- package/dist/index.mjs +43 -17
- package/dist/types/index.d.ts +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -82,6 +82,8 @@ interface PaginationProps {
|
|
|
82
82
|
}
|
|
83
83
|
declare const TablePagination: ({}: PaginationProps) => react_jsx_runtime.JSX.Element;
|
|
84
84
|
|
|
85
|
+
declare const TableSelector: () => react_jsx_runtime.JSX.Element;
|
|
86
|
+
|
|
85
87
|
declare const TableSorter: () => react_jsx_runtime.JSX.Element;
|
|
86
88
|
|
|
87
89
|
interface TextCellProps {
|
|
@@ -108,4 +110,4 @@ declare const useDataTable: () => {
|
|
|
108
110
|
refreshData: () => void;
|
|
109
111
|
};
|
|
110
112
|
|
|
111
|
-
export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, type Result, Table, TableBody, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableFilter, TableFooter, TableHeader, type TableHeaderProps, TableOrderer, TablePagination, type TableProps, TableSorter, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
|
|
113
|
+
export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, type Result, Table, TableBody, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableFilter, TableFooter, TableHeader, type TableHeaderProps, TableOrderer, TablePagination, type TableProps, TableSelector, TableSorter, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,7 @@ const TableContext = react.createContext({
|
|
|
16
16
|
});
|
|
17
17
|
|
|
18
18
|
const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, children, }) => {
|
|
19
|
+
const [columnOrder, setColumnOrder] = react.useState([]);
|
|
19
20
|
const table = reactTable.useReactTable({
|
|
20
21
|
data: data,
|
|
21
22
|
columns: columns,
|
|
@@ -28,11 +29,20 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
|
|
|
28
29
|
minSize: 10, //enforced during column resizing
|
|
29
30
|
maxSize: 10000, //enforced during column resizing
|
|
30
31
|
},
|
|
32
|
+
state: {
|
|
33
|
+
columnOrder,
|
|
34
|
+
},
|
|
35
|
+
onColumnOrderChange: (state) => {
|
|
36
|
+
setColumnOrder(state);
|
|
37
|
+
},
|
|
31
38
|
enableRowSelection: enableRowSelection,
|
|
32
39
|
enableMultiRowSelection: enableMultiRowSelection,
|
|
33
40
|
enableSubRowSelection: enableSubRowSelection,
|
|
34
41
|
columnResizeMode: "onChange",
|
|
35
42
|
});
|
|
43
|
+
react.useEffect(() => {
|
|
44
|
+
setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
|
|
45
|
+
}, []);
|
|
36
46
|
return (jsxRuntime.jsx(TableContext.Provider, { value: {
|
|
37
47
|
table: { ...table },
|
|
38
48
|
refreshData: () => {
|
|
@@ -166,7 +176,7 @@ const TableFilter = () => {
|
|
|
166
176
|
};
|
|
167
177
|
|
|
168
178
|
const EditFilterButton = () => {
|
|
169
|
-
return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Filter", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", icon: jsxRuntime.jsx(md.MdFilterAlt, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "1rem", children: [jsxRuntime.jsx(TableFilter, {}), jsxRuntime.jsx(ResetFilteringButton, {})] }) })] })] }));
|
|
179
|
+
return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Filter", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", variant: "ghost", icon: jsxRuntime.jsx(md.MdFilterAlt, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "1rem", children: [jsxRuntime.jsx(TableFilter, {}), jsxRuntime.jsx(ResetFilteringButton, {})] }) })] })] }));
|
|
170
180
|
};
|
|
171
181
|
|
|
172
182
|
const ColumnOrderChanger = ({ columns }) => {
|
|
@@ -213,7 +223,7 @@ const TableOrderer = () => {
|
|
|
213
223
|
};
|
|
214
224
|
|
|
215
225
|
const EditOrderButton = () => {
|
|
216
|
-
return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Change Order", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", icon: jsxRuntime.jsx(md.MdOutlineMoveDown, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsx(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: jsxRuntime.jsx(TableOrderer, {}) }) })] })] }));
|
|
226
|
+
return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Change Order", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", variant: "ghost", icon: jsxRuntime.jsx(md.MdOutlineMoveDown, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsx(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: jsxRuntime.jsx(TableOrderer, {}) }) })] })] }));
|
|
217
227
|
};
|
|
218
228
|
|
|
219
229
|
const ResetSortingButton = () => {
|
|
@@ -226,34 +236,36 @@ const ResetSortingButton = () => {
|
|
|
226
236
|
const TableSorter = () => {
|
|
227
237
|
const { table } = useDataTable();
|
|
228
238
|
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsx(jsxRuntime.Fragment, { children: headerGroup.headers.map((header) => {
|
|
229
|
-
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: header.column.getCanSort() && (jsxRuntime.jsxs(react$1.Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsxRuntime.jsx(react$1.Text, { children: header.column.id }), jsxRuntime.jsxs(react$1.Button, { onClick: (e) => {
|
|
239
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: header.column.getCanSort() && (jsxRuntime.jsxs(react$1.Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsxRuntime.jsx(react$1.Text, { children: header.column.id }), jsxRuntime.jsxs(react$1.Button, { variant: "ghost", onClick: (e) => {
|
|
230
240
|
header.column.toggleSorting();
|
|
231
|
-
}, children: [header.column.
|
|
241
|
+
}, children: [header.column.getIsSorted() === false && (
|
|
232
242
|
// <Text>To No sort</Text>
|
|
233
|
-
jsxRuntime.jsx(icons.
|
|
243
|
+
jsxRuntime.jsx(icons.UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
|
|
234
244
|
// <Text>To asc</Text>
|
|
235
|
-
jsxRuntime.jsx(icons.
|
|
245
|
+
jsxRuntime.jsx(icons.ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
|
|
236
246
|
// <Text>To desc</Text>
|
|
237
|
-
jsxRuntime.jsx(icons.
|
|
247
|
+
jsxRuntime.jsx(icons.ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsxRuntime.jsx(react$1.Button, { onClick: (e) => {
|
|
238
248
|
header.column.clearSorting();
|
|
239
249
|
}, children: jsxRuntime.jsx(icons.CloseIcon, {}) }))] })) }));
|
|
240
250
|
}) }))) }));
|
|
241
251
|
};
|
|
242
252
|
|
|
243
253
|
const EditSortingButton = () => {
|
|
244
|
-
return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Filter", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", icon: jsxRuntime.jsx(md.MdOutlineSort, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(TableSorter, {}), jsxRuntime.jsx(ResetSortingButton, {})] }) })] })] }));
|
|
254
|
+
return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Filter", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", variant: "ghost", icon: jsxRuntime.jsx(md.MdOutlineSort, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(TableSorter, {}), jsxRuntime.jsx(ResetSortingButton, {})] }) })] })] }));
|
|
245
255
|
};
|
|
246
256
|
|
|
247
257
|
const EditViewButton = () => {
|
|
248
258
|
const { table } = react.useContext(TableContext);
|
|
249
|
-
return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "view", icon: jsxRuntime.jsx(io.IoMdEye, {}) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsx(react$1.Flex, { flexFlow: "column", gap: "1rem", children: table.getAllLeafColumns().map((column) => {
|
|
259
|
+
return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "view", variant: "ghost", icon: jsxRuntime.jsx(io.IoMdEye, {}) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsx(react$1.Flex, { flexFlow: "column", gap: "1rem", children: table.getAllLeafColumns().map((column) => {
|
|
250
260
|
return (jsxRuntime.jsx(react$1.FormControl, { width: "auto", children: jsxRuntime.jsx(react$1.Checkbox, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler(), children: column.id }) }, crypto.randomUUID()));
|
|
251
261
|
}) }) })] })] }));
|
|
252
262
|
};
|
|
253
263
|
|
|
254
264
|
const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
|
|
255
265
|
const { table } = react.useContext(TableContext);
|
|
256
|
-
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(react$1.Menu, { children: [jsxRuntime.jsx(react$1.MenuButton, { as: react$1.Button, rightIcon: jsxRuntime.jsx(icons.ChevronDownIcon, {}), children: table.getState().pagination.pageSize }), jsxRuntime.jsx(react$1.MenuList, { children: pageSizes.map((pageSize) => (jsxRuntime.jsx(react$1.MenuItem, { onClick: () => {
|
|
266
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(react$1.Menu, { children: [jsxRuntime.jsx(react$1.MenuButton, { as: react$1.Button, variant: "ghost", rightIcon: jsxRuntime.jsx(icons.ChevronDownIcon, {}), children: table.getState().pagination.pageSize }), jsxRuntime.jsx(react$1.MenuList, { children: pageSizes.map((pageSize) => (jsxRuntime.jsx(react$1.MenuItem, { onClick: () => {
|
|
267
|
+
table.setPageSize(Number(pageSize));
|
|
268
|
+
}, children: pageSize }))) })] }) }));
|
|
257
269
|
};
|
|
258
270
|
|
|
259
271
|
const ResetSelectionButton = () => {
|
|
@@ -265,7 +277,7 @@ const ResetSelectionButton = () => {
|
|
|
265
277
|
|
|
266
278
|
const Table = ({ children }) => {
|
|
267
279
|
const { table } = useDataTable();
|
|
268
|
-
return (jsxRuntime.jsx(react$1.Container, { padding: '0rem', maxW: "100%", overflowX: "scroll", children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), variant: "
|
|
280
|
+
return (jsxRuntime.jsx(react$1.Container, { padding: '0rem', maxW: "100%", overflowX: "scroll", children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), variant: "unstyled", children: children }) }));
|
|
269
281
|
};
|
|
270
282
|
|
|
271
283
|
const TableBody = () => {
|
|
@@ -402,7 +414,21 @@ const TableHeader = ({ canResize }) => {
|
|
|
402
414
|
|
|
403
415
|
const TablePagination = ({}) => {
|
|
404
416
|
const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
|
|
405
|
-
return (jsxRuntime.jsxs(react$1.ButtonGroup, { isAttached: true, children: [jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdFirstPage, {}), onClick: () => firstPage(), isDisabled: !getCanPreviousPage(), "aria-label": "first-page" }), jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page" }), jsxRuntime.jsx(react$1.Button, { onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", children: jsxRuntime.jsx(md.MdArrowForward, {}) }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", children: jsxRuntime.jsx(md.MdLastPage, {}) })] }));
|
|
417
|
+
return (jsxRuntime.jsxs(react$1.ButtonGroup, { isAttached: true, children: [jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdFirstPage, {}), onClick: () => firstPage(), isDisabled: !getCanPreviousPage(), "aria-label": "first-page", variant: "ghost" }), jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page", variant: "ghost" }), jsxRuntime.jsx(react$1.Button, { variant: "ghost", onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", variant: "ghost", children: jsxRuntime.jsx(md.MdArrowForward, {}) }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", variant: "ghost", children: jsxRuntime.jsx(md.MdLastPage, {}) })] }));
|
|
418
|
+
};
|
|
419
|
+
|
|
420
|
+
const SelectAllRowsToggle = () => {
|
|
421
|
+
const { table } = react.useContext(TableContext);
|
|
422
|
+
return (jsxRuntime.jsx(react$1.Tooltip, { label: table.getIsAllRowsSelected() ? "Clear All" : "Select All", children: jsxRuntime.jsx(react$1.IconButton, { variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? "Clear All" : "Select All", icon: table.getIsAllRowsSelected() ? jsxRuntime.jsx(md.MdClear, {}) : jsxRuntime.jsx(md.MdOutlineChecklist, {}), onClick: (event) => {
|
|
423
|
+
table.getToggleAllRowsSelectedHandler()(event);
|
|
424
|
+
} }) }));
|
|
425
|
+
};
|
|
426
|
+
|
|
427
|
+
const TableSelector = () => {
|
|
428
|
+
const { table } = react.useContext(TableContext);
|
|
429
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [table.getSelectedRowModel().rows.length > 0 && (jsxRuntime.jsxs(react$1.Button, { onClick: () => { }, variant: "ghost", display: "flex", gap: "0.25rem", children: [jsxRuntime.jsx(react$1.Box, { fontSize: "sm", children: `${table.getSelectedRowModel().rows.length}` }), jsxRuntime.jsx(react$1.Icon, { as: io.IoMdCheckbox })] })), !table.getIsAllPageRowsSelected() && jsxRuntime.jsx(SelectAllRowsToggle, {}), table.getSelectedRowModel().rows.length > 0 && (jsxRuntime.jsx(react$1.IconButton, { variant: "ghost", icon: jsxRuntime.jsx(react$1.Icon, { as: md.MdClear }), onClick: () => {
|
|
430
|
+
table.resetRowSelection();
|
|
431
|
+
}, "aria-label": "reset selection" }))] }));
|
|
406
432
|
};
|
|
407
433
|
|
|
408
434
|
const TextCell = ({ label, children }) => {
|
|
@@ -431,6 +457,7 @@ exports.TableFooter = TableFooter;
|
|
|
431
457
|
exports.TableHeader = TableHeader;
|
|
432
458
|
exports.TableOrderer = TableOrderer;
|
|
433
459
|
exports.TablePagination = TablePagination;
|
|
460
|
+
exports.TableSelector = TableSelector;
|
|
434
461
|
exports.TableSorter = TableSorter;
|
|
435
462
|
exports.TextCell = TextCell;
|
|
436
463
|
exports.useDataFromUrl = useDataFromUrl;
|
package/dist/index.mjs
CHANGED
|
@@ -2,10 +2,10 @@ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
|
2
2
|
import { useReactTable, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getPaginationRowModel, flexRender } from '@tanstack/react-table';
|
|
3
3
|
import { createContext, useState, useEffect, useContext } from 'react';
|
|
4
4
|
import axios from 'axios';
|
|
5
|
-
import { Button, Box, Text, Input, Popover, Tooltip, PopoverTrigger, IconButton, PopoverContent, PopoverArrow, PopoverBody, Flex, FormControl, Checkbox, Menu, MenuButton, MenuList, MenuItem, Container, Table as Table$1, Grid, Card, CardBody, Tfoot, Tr as Tr$1, Th, Thead, Portal, ButtonGroup } from '@chakra-ui/react';
|
|
6
|
-
import { MdFilterAlt, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdPushPin, MdCancel, MdSort, MdFilterListAlt, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage } from 'react-icons/md';
|
|
7
|
-
import {
|
|
8
|
-
import { IoMdEye, IoMdClose } from 'react-icons/io';
|
|
5
|
+
import { Button, Box, Text, Input, Popover, Tooltip, PopoverTrigger, IconButton, PopoverContent, PopoverArrow, PopoverBody, Flex, FormControl, Checkbox, Menu, MenuButton, MenuList, MenuItem, Container, Table as Table$1, Grid, Card, CardBody, Tfoot, Tr as Tr$1, Th, Thead, Portal, ButtonGroup, Icon } from '@chakra-ui/react';
|
|
6
|
+
import { MdFilterAlt, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdPushPin, MdCancel, MdSort, MdFilterListAlt, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdClear, MdOutlineChecklist } from 'react-icons/md';
|
|
7
|
+
import { UpDownIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon } from '@chakra-ui/icons';
|
|
8
|
+
import { IoMdEye, IoMdClose, IoMdCheckbox } from 'react-icons/io';
|
|
9
9
|
import { Tbody, Tr, Td } from '@chakra-ui/table';
|
|
10
10
|
|
|
11
11
|
const TableContext = createContext({
|
|
@@ -14,6 +14,7 @@ const TableContext = createContext({
|
|
|
14
14
|
});
|
|
15
15
|
|
|
16
16
|
const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, children, }) => {
|
|
17
|
+
const [columnOrder, setColumnOrder] = useState([]);
|
|
17
18
|
const table = useReactTable({
|
|
18
19
|
data: data,
|
|
19
20
|
columns: columns,
|
|
@@ -26,11 +27,20 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
|
|
|
26
27
|
minSize: 10, //enforced during column resizing
|
|
27
28
|
maxSize: 10000, //enforced during column resizing
|
|
28
29
|
},
|
|
30
|
+
state: {
|
|
31
|
+
columnOrder,
|
|
32
|
+
},
|
|
33
|
+
onColumnOrderChange: (state) => {
|
|
34
|
+
setColumnOrder(state);
|
|
35
|
+
},
|
|
29
36
|
enableRowSelection: enableRowSelection,
|
|
30
37
|
enableMultiRowSelection: enableMultiRowSelection,
|
|
31
38
|
enableSubRowSelection: enableSubRowSelection,
|
|
32
39
|
columnResizeMode: "onChange",
|
|
33
40
|
});
|
|
41
|
+
useEffect(() => {
|
|
42
|
+
setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
|
|
43
|
+
}, []);
|
|
34
44
|
return (jsx(TableContext.Provider, { value: {
|
|
35
45
|
table: { ...table },
|
|
36
46
|
refreshData: () => {
|
|
@@ -164,7 +174,7 @@ const TableFilter = () => {
|
|
|
164
174
|
};
|
|
165
175
|
|
|
166
176
|
const EditFilterButton = () => {
|
|
167
|
-
return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Filter", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", icon: jsx(MdFilterAlt, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsxs(Flex, { flexFlow: "column", gap: "1rem", children: [jsx(TableFilter, {}), jsx(ResetFilteringButton, {})] }) })] })] }));
|
|
177
|
+
return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Filter", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", variant: "ghost", icon: jsx(MdFilterAlt, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsxs(Flex, { flexFlow: "column", gap: "1rem", children: [jsx(TableFilter, {}), jsx(ResetFilteringButton, {})] }) })] })] }));
|
|
168
178
|
};
|
|
169
179
|
|
|
170
180
|
const ColumnOrderChanger = ({ columns }) => {
|
|
@@ -211,7 +221,7 @@ const TableOrderer = () => {
|
|
|
211
221
|
};
|
|
212
222
|
|
|
213
223
|
const EditOrderButton = () => {
|
|
214
|
-
return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Change Order", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", icon: jsx(MdOutlineMoveDown, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(Flex, { flexFlow: "column", gap: "0.25rem", children: jsx(TableOrderer, {}) }) })] })] }));
|
|
224
|
+
return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Change Order", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", variant: "ghost", icon: jsx(MdOutlineMoveDown, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(Flex, { flexFlow: "column", gap: "0.25rem", children: jsx(TableOrderer, {}) }) })] })] }));
|
|
215
225
|
};
|
|
216
226
|
|
|
217
227
|
const ResetSortingButton = () => {
|
|
@@ -224,34 +234,36 @@ const ResetSortingButton = () => {
|
|
|
224
234
|
const TableSorter = () => {
|
|
225
235
|
const { table } = useDataTable();
|
|
226
236
|
return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
|
|
227
|
-
return (jsx(Fragment, { children: header.column.getCanSort() && (jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Text, { children: header.column.id }), jsxs(Button, { onClick: (e) => {
|
|
237
|
+
return (jsx(Fragment, { children: header.column.getCanSort() && (jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Text, { children: header.column.id }), jsxs(Button, { variant: "ghost", onClick: (e) => {
|
|
228
238
|
header.column.toggleSorting();
|
|
229
|
-
}, children: [header.column.
|
|
239
|
+
}, children: [header.column.getIsSorted() === false && (
|
|
230
240
|
// <Text>To No sort</Text>
|
|
231
|
-
jsx(
|
|
241
|
+
jsx(UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
|
|
232
242
|
// <Text>To asc</Text>
|
|
233
|
-
jsx(
|
|
243
|
+
jsx(ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
|
|
234
244
|
// <Text>To desc</Text>
|
|
235
|
-
jsx(
|
|
245
|
+
jsx(ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: (e) => {
|
|
236
246
|
header.column.clearSorting();
|
|
237
247
|
}, children: jsx(CloseIcon, {}) }))] })) }));
|
|
238
248
|
}) }))) }));
|
|
239
249
|
};
|
|
240
250
|
|
|
241
251
|
const EditSortingButton = () => {
|
|
242
|
-
return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Filter", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", icon: jsx(MdOutlineSort, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(TableSorter, {}), jsx(ResetSortingButton, {})] }) })] })] }));
|
|
252
|
+
return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Filter", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", variant: "ghost", icon: jsx(MdOutlineSort, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(TableSorter, {}), jsx(ResetSortingButton, {})] }) })] })] }));
|
|
243
253
|
};
|
|
244
254
|
|
|
245
255
|
const EditViewButton = () => {
|
|
246
256
|
const { table } = useContext(TableContext);
|
|
247
|
-
return (jsxs(Popover, { placement: "auto", children: [jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "view", icon: jsx(IoMdEye, {}) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(Flex, { flexFlow: "column", gap: "1rem", children: table.getAllLeafColumns().map((column) => {
|
|
257
|
+
return (jsxs(Popover, { placement: "auto", children: [jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "view", variant: "ghost", icon: jsx(IoMdEye, {}) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(Flex, { flexFlow: "column", gap: "1rem", children: table.getAllLeafColumns().map((column) => {
|
|
248
258
|
return (jsx(FormControl, { width: "auto", children: jsx(Checkbox, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler(), children: column.id }) }, crypto.randomUUID()));
|
|
249
259
|
}) }) })] })] }));
|
|
250
260
|
};
|
|
251
261
|
|
|
252
262
|
const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
|
|
253
263
|
const { table } = useContext(TableContext);
|
|
254
|
-
return (jsx(Fragment, { children: jsxs(Menu, { children: [jsx(MenuButton, { as: Button, rightIcon: jsx(ChevronDownIcon, {}), children: table.getState().pagination.pageSize }), jsx(MenuList, { children: pageSizes.map((pageSize) => (jsx(MenuItem, { onClick: () => {
|
|
264
|
+
return (jsx(Fragment, { children: jsxs(Menu, { children: [jsx(MenuButton, { as: Button, variant: "ghost", rightIcon: jsx(ChevronDownIcon, {}), children: table.getState().pagination.pageSize }), jsx(MenuList, { children: pageSizes.map((pageSize) => (jsx(MenuItem, { onClick: () => {
|
|
265
|
+
table.setPageSize(Number(pageSize));
|
|
266
|
+
}, children: pageSize }))) })] }) }));
|
|
255
267
|
};
|
|
256
268
|
|
|
257
269
|
const ResetSelectionButton = () => {
|
|
@@ -263,7 +275,7 @@ const ResetSelectionButton = () => {
|
|
|
263
275
|
|
|
264
276
|
const Table = ({ children }) => {
|
|
265
277
|
const { table } = useDataTable();
|
|
266
|
-
return (jsx(Container, { padding: '0rem', maxW: "100%", overflowX: "scroll", children: jsx(Table$1, { width: table.getCenterTotalSize(), variant: "
|
|
278
|
+
return (jsx(Container, { padding: '0rem', maxW: "100%", overflowX: "scroll", children: jsx(Table$1, { width: table.getCenterTotalSize(), variant: "unstyled", children: children }) }));
|
|
267
279
|
};
|
|
268
280
|
|
|
269
281
|
const TableBody = () => {
|
|
@@ -400,7 +412,21 @@ const TableHeader = ({ canResize }) => {
|
|
|
400
412
|
|
|
401
413
|
const TablePagination = ({}) => {
|
|
402
414
|
const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
|
|
403
|
-
return (jsxs(ButtonGroup, { isAttached: true, children: [jsx(IconButton, { icon: jsx(MdFirstPage, {}), onClick: () => firstPage(), isDisabled: !getCanPreviousPage(), "aria-label": "first-page" }), jsx(IconButton, { icon: jsx(MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page" }), jsx(Button, { onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsx(IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", children: jsx(MdArrowForward, {}) }), jsx(IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", children: jsx(MdLastPage, {}) })] }));
|
|
415
|
+
return (jsxs(ButtonGroup, { isAttached: true, children: [jsx(IconButton, { icon: jsx(MdFirstPage, {}), onClick: () => firstPage(), isDisabled: !getCanPreviousPage(), "aria-label": "first-page", variant: "ghost" }), jsx(IconButton, { icon: jsx(MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page", variant: "ghost" }), jsx(Button, { variant: "ghost", onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsx(IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", variant: "ghost", children: jsx(MdArrowForward, {}) }), jsx(IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", variant: "ghost", children: jsx(MdLastPage, {}) })] }));
|
|
416
|
+
};
|
|
417
|
+
|
|
418
|
+
const SelectAllRowsToggle = () => {
|
|
419
|
+
const { table } = useContext(TableContext);
|
|
420
|
+
return (jsx(Tooltip, { label: table.getIsAllRowsSelected() ? "Clear All" : "Select All", children: jsx(IconButton, { variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? "Clear All" : "Select All", icon: table.getIsAllRowsSelected() ? jsx(MdClear, {}) : jsx(MdOutlineChecklist, {}), onClick: (event) => {
|
|
421
|
+
table.getToggleAllRowsSelectedHandler()(event);
|
|
422
|
+
} }) }));
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
const TableSelector = () => {
|
|
426
|
+
const { table } = useContext(TableContext);
|
|
427
|
+
return (jsxs(Fragment, { children: [table.getSelectedRowModel().rows.length > 0 && (jsxs(Button, { onClick: () => { }, variant: "ghost", display: "flex", gap: "0.25rem", children: [jsx(Box, { fontSize: "sm", children: `${table.getSelectedRowModel().rows.length}` }), jsx(Icon, { as: IoMdCheckbox })] })), !table.getIsAllPageRowsSelected() && jsx(SelectAllRowsToggle, {}), table.getSelectedRowModel().rows.length > 0 && (jsx(IconButton, { variant: "ghost", icon: jsx(Icon, { as: MdClear }), onClick: () => {
|
|
428
|
+
table.resetRowSelection();
|
|
429
|
+
}, "aria-label": "reset selection" }))] }));
|
|
404
430
|
};
|
|
405
431
|
|
|
406
432
|
const TextCell = ({ label, children }) => {
|
|
@@ -410,4 +436,4 @@ const TextCell = ({ label, children }) => {
|
|
|
410
436
|
return (jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", noOfLines: [1, 2, 3], children: children }));
|
|
411
437
|
};
|
|
412
438
|
|
|
413
|
-
export { DataTable, DataTableServer, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, PageSizeControl, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, Table, TableBody, TableCardContainer, TableCards, TableFilter, TableFooter, TableHeader, TableOrderer, TablePagination, TableSorter, TextCell, useDataFromUrl, useDataTable };
|
|
439
|
+
export { DataTable, DataTableServer, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, PageSizeControl, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, Table, TableBody, TableCardContainer, TableCards, TableFilter, TableFooter, TableHeader, TableOrderer, TablePagination, TableSelector, TableSorter, TextCell, useDataFromUrl, useDataTable };
|
package/dist/types/index.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export * from "./components/TableFooter";
|
|
|
17
17
|
export * from "./components/TableHeader";
|
|
18
18
|
export * from "./components/TableOrderer";
|
|
19
19
|
export * from "./components/TablePagination";
|
|
20
|
+
export * from "./components/TableSelector";
|
|
20
21
|
export * from "./components/TableSorter";
|
|
21
22
|
export * from "./components/TextCell";
|
|
22
23
|
export * from "./components/useDataFromUrl";
|