@bsol-oss/react-datatable5 1.0.63 → 2.0.0
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 +145 -101
- package/dist/index.js +257 -271
- package/dist/index.mjs +192 -206
- package/dist/types/components/Controls/SelectAllRowsToggle.d.ts +4 -4
- package/dist/types/components/DataTable/DataTable.d.ts +18 -13
- package/dist/types/components/DataTable/DataTableContext.d.ts +4 -3
- package/dist/types/components/DataTable/DataTableServer.d.ts +18 -14
- package/dist/types/components/DataTable/useDataTable.d.ts +33 -7
- package/dist/types/components/DataTable/useDataTableContext.d.ts +8 -0
- package/dist/types/index.d.ts +41 -7
- package/package.json +1 -1
- package/dist/types/components/DataTable.d.ts +0 -33
- package/dist/types/components/DataTableContext.d.ts +0 -10
- package/dist/types/components/DataTableServer.d.ts +0 -38
- package/dist/types/components/DefaultTable.d.ts +0 -5
- package/dist/types/components/DensityFeature.d.ts +0 -23
- package/dist/types/components/DensityToggle.d.ts +0 -1
- package/dist/types/components/DensityToggleButton.d.ts +0 -6
- package/dist/types/components/EditFilterButton.d.ts +0 -9
- package/dist/types/components/EditOrderButton.d.ts +0 -7
- package/dist/types/components/EditSortingButton.d.ts +0 -7
- package/dist/types/components/EditViewButton.d.ts +0 -7
- package/dist/types/components/FilterOptions.d.ts +0 -4
- package/dist/types/components/GlobalFilter.d.ts +0 -3
- package/dist/types/components/PageSizeControl.d.ts +0 -4
- package/dist/types/components/ResetFilteringButton.d.ts +0 -4
- package/dist/types/components/ResetSelectionButton.d.ts +0 -4
- package/dist/types/components/ResetSortingButton.d.ts +0 -4
- package/dist/types/components/RowCountText.d.ts +0 -1
- package/dist/types/components/SelectAllRowsToggle.d.ts +0 -8
- package/dist/types/components/Table.d.ts +0 -8
- package/dist/types/components/TableBody.d.ts +0 -17
- package/dist/types/components/TableCardContainer.d.ts +0 -6
- package/dist/types/components/TableCards.d.ts +0 -4
- package/dist/types/components/TableComponent.d.ts +0 -6
- package/dist/types/components/TableComponentRenderer.d.ts +0 -6
- package/dist/types/components/TableControls.d.ts +0 -13
- package/dist/types/components/TableFilter.d.ts +0 -8
- package/dist/types/components/TableFilterTags.d.ts +0 -1
- package/dist/types/components/TableFooter.d.ts +0 -7
- package/dist/types/components/TableHeader.d.ts +0 -8
- package/dist/types/components/TableLoadingComponent.d.ts +0 -5
- package/dist/types/components/TableOrderer.d.ts +0 -1
- package/dist/types/components/TablePagination.d.ts +0 -3
- package/dist/types/components/TableReloadButton.d.ts +0 -4
- package/dist/types/components/TableSelector.d.ts +0 -1
- package/dist/types/components/TableSorter.d.ts +0 -1
- package/dist/types/components/TableViewer.d.ts +0 -1
- package/dist/types/components/TextCell.d.ts +0 -10
- package/dist/types/components/useDataFromUrl.d.ts +0 -14
- package/dist/types/components/useDataTable.d.ts +0 -7
package/dist/index.mjs
CHANGED
|
@@ -1,27 +1,117 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { IconButton, Button, useDisclosure, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, Flex, ModalFooter, Text, Menu, MenuButton, MenuList, MenuItem, Box, FormLabel, Checkbox, Grid, Spinner, Tooltip, Icon, Tfoot, Tr as Tr$1, Th, Thead, Portal, Table as Table$1, Card, CardBody, VStack, FormControl, Input, RangeSlider, RangeSliderTrack, RangeSliderFilledTrack, RangeSliderThumb, WrapItem, Tag, TagLabel, TagCloseButton, Select, ButtonGroup, Switch, InputGroup, InputLeftElement } from '@chakra-ui/react';
|
|
3
|
+
import { AiOutlineColumnWidth } from 'react-icons/ai';
|
|
4
|
+
import { MdFilterAlt, MdOutlineMoveDown, MdOutlineSort, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdClear, MdArrowUpward, MdArrowDownward, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdOutlineChecklist, MdClose, MdSearch } from 'react-icons/md';
|
|
5
|
+
import { UpDownIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon } from '@chakra-ui/icons';
|
|
6
|
+
import { createContext, useContext, useEffect, useState } from 'react';
|
|
7
|
+
import { IoMdEye, IoMdCheckbox } from 'react-icons/io';
|
|
2
8
|
import { makeStateUpdater, functionalUpdate, useReactTable, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getPaginationRowModel, flexRender } from '@tanstack/react-table';
|
|
3
|
-
import { createContext, useState, useEffect, useContext } from 'react';
|
|
4
9
|
import { rankItem } from '@tanstack/match-sorter-utils';
|
|
5
10
|
import axios from 'axios';
|
|
6
|
-
import { Box, FormLabel, Checkbox, Grid, Flex, Text, Tfoot, Tr as Tr$1, Th, Menu, MenuButton, Thead, Portal, MenuList, MenuItem, IconButton, Button, useDisclosure, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, ModalFooter, InputGroup, InputLeftElement, Icon, Input, Table as Table$1, Card, CardBody, VStack, FormControl, RangeSlider, RangeSliderTrack, RangeSliderFilledTrack, RangeSliderThumb, WrapItem, Tag, TagLabel, TagCloseButton, Select, ButtonGroup, Switch, Tooltip } from '@chakra-ui/react';
|
|
7
11
|
import { Tbody, Tr, Td } from '@chakra-ui/table';
|
|
8
|
-
import {
|
|
9
|
-
import { ChevronUpIcon, ChevronDownIcon, UpDownIcon, CloseIcon } from '@chakra-ui/icons';
|
|
12
|
+
import { BsExclamationCircleFill } from 'react-icons/bs';
|
|
10
13
|
import { GrAscend, GrDescend } from 'react-icons/gr';
|
|
11
|
-
import { AiOutlineColumnWidth } from 'react-icons/ai';
|
|
12
|
-
import { IoMdEye, IoMdCheckbox } from 'react-icons/io';
|
|
13
14
|
import { IoReload } from 'react-icons/io5';
|
|
14
15
|
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
|
|
15
16
|
import { FaGripLinesVertical } from 'react-icons/fa';
|
|
16
17
|
|
|
18
|
+
const DensityToggleButton = ({ text, icon = jsx(AiOutlineColumnWidth, {}), }) => {
|
|
19
|
+
const { table } = useDataTableContext();
|
|
20
|
+
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: icon, onClick: () => {
|
|
21
|
+
table.toggleDensity();
|
|
22
|
+
} })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
|
|
23
|
+
table.toggleDensity();
|
|
24
|
+
}, children: text }))] }));
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsx(MdFilterAlt, {}), ...props }) => {
|
|
28
|
+
const filterModal = useDisclosure();
|
|
29
|
+
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: filterModal.onOpen, "aria-label": "filter", ...props })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: filterModal.onOpen, ...props, children: text })), jsxs(Modal, { isOpen: filterModal.isOpen, onClose: filterModal.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsxs(Flex, { flexFlow: "column", gap: "1rem", children: [jsx(TableFilter, {}), jsx(ResetFilteringButton, { text: resetText })] }) }), jsx(ModalFooter, { children: jsx(Button, { onClick: filterModal.onClose, children: closeText }) })] })] })] }));
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const EditOrderButton = ({ text, icon = jsx(MdOutlineMoveDown, {}), title = "Change Order", }) => {
|
|
33
|
+
const orderModal = useDisclosure();
|
|
34
|
+
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: orderModal.onOpen, "aria-label": "change order" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: orderModal.onOpen, children: text })), jsxs(Modal, { isOpen: orderModal.isOpen, onClose: orderModal.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { padding: "0 0 1rem 0", children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsx(Flex, { flexFlow: "column", gap: "0.25rem", children: jsx(TableOrderer, {}) }) })] })] })] }));
|
|
35
|
+
};
|
|
36
|
+
|
|
17
37
|
const TableContext = createContext({
|
|
18
38
|
table: {},
|
|
19
39
|
refreshData: () => { },
|
|
20
|
-
globalFilter: "",
|
|
40
|
+
globalFilter: { globalFilter: "" },
|
|
21
41
|
setGlobalFilter: () => { },
|
|
22
42
|
loading: false,
|
|
43
|
+
hasError: false,
|
|
23
44
|
});
|
|
24
45
|
|
|
46
|
+
const useDataTableContext = () => {
|
|
47
|
+
const { table, refreshData, globalFilter, setGlobalFilter, loading, hasError, } = useContext(TableContext);
|
|
48
|
+
return {
|
|
49
|
+
table,
|
|
50
|
+
refreshData,
|
|
51
|
+
globalFilter,
|
|
52
|
+
setGlobalFilter,
|
|
53
|
+
loading,
|
|
54
|
+
hasError,
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const TableSorter = () => {
|
|
59
|
+
const { table } = useDataTableContext();
|
|
60
|
+
return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
|
|
61
|
+
const displayName = header.column.columnDef.meta === undefined
|
|
62
|
+
? header.column.id
|
|
63
|
+
: header.column.columnDef.meta.displayName;
|
|
64
|
+
return (jsx(Fragment, { children: header.column.getCanSort() && (jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Text, { children: displayName }), jsxs(Button, { variant: "ghost", onClick: () => {
|
|
65
|
+
header.column.toggleSorting();
|
|
66
|
+
}, children: [header.column.getIsSorted() === false && jsx(UpDownIcon, {}), header.column.getIsSorted() === "asc" && (jsx(ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (jsx(ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: () => {
|
|
67
|
+
header.column.clearSorting();
|
|
68
|
+
}, children: jsx(CloseIcon, {}) }))] })) }));
|
|
69
|
+
}) }))) }));
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const EditSortingButton = ({ text, icon = jsx(MdOutlineSort, {}), title = "Edit Sorting", }) => {
|
|
73
|
+
const sortingModal = useDisclosure();
|
|
74
|
+
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: sortingModal.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: sortingModal.onOpen, children: text })), jsxs(Modal, { isOpen: sortingModal.isOpen, onClose: sortingModal.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { padding: "0 0 1rem 0", children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(TableSorter, {}), jsx(ResetSortingButton, {})] }) })] })] })] }));
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const EditViewButton = ({ text, icon = jsx(IoMdEye, {}), title = "Edit View", }) => {
|
|
78
|
+
const viewModel = useDisclosure();
|
|
79
|
+
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: viewModel.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: viewModel.onOpen, children: text })), jsxs(Modal, { isOpen: viewModel.isOpen, onClose: viewModel.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { padding: "0 0 1rem 0", children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsx(TableViewer, {}) })] })] })] }));
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
|
|
83
|
+
const { table } = useDataTableContext();
|
|
84
|
+
return (jsx(Fragment, { children: jsxs(Menu, { children: [jsx(MenuButton, { as: Button, variant: "ghost", rightIcon: jsx(ChevronDownIcon, {}), gap: "0.5rem", children: table.getState().pagination.pageSize }), jsx(MenuList, { children: pageSizes.map((pageSize) => (jsx(MenuItem, { onClick: () => {
|
|
85
|
+
table.setPageSize(Number(pageSize));
|
|
86
|
+
}, children: pageSize }, crypto.randomUUID()))) })] }) }));
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
|
|
90
|
+
const { table } = useDataTableContext();
|
|
91
|
+
return (jsx(Button, { onClick: () => {
|
|
92
|
+
table.resetColumnFilters();
|
|
93
|
+
}, children: text }));
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const ResetSelectionButton = ({ text = "Reset Selection", }) => {
|
|
97
|
+
const { table } = useDataTableContext();
|
|
98
|
+
return (jsx(Button, { onClick: () => {
|
|
99
|
+
table.resetRowSelection();
|
|
100
|
+
}, children: text }));
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const ResetSortingButton = ({ text = "Reset Sorting", }) => {
|
|
104
|
+
const { table } = useDataTableContext();
|
|
105
|
+
return (jsx(Button, { onClick: () => {
|
|
106
|
+
table.resetSorting();
|
|
107
|
+
}, children: text }));
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const RowCountText = () => {
|
|
111
|
+
const { table } = useDataTableContext();
|
|
112
|
+
return jsx(Text, { children: table.getRowCount() });
|
|
113
|
+
};
|
|
114
|
+
|
|
25
115
|
// Reference: https://tanstack.com/table/latest/docs/framework/react/examples/custom-features
|
|
26
116
|
// TypeScript setup for our new feature with all of the same type-safety as stock TanStack Table features
|
|
27
117
|
// end of TS setup!
|
|
@@ -106,15 +196,7 @@ const fuzzyFilter = (row, columnId, value, addMeta) => {
|
|
|
106
196
|
// Return if the item should be filtered in/out
|
|
107
197
|
return itemRank.passed;
|
|
108
198
|
};
|
|
109
|
-
const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder
|
|
110
|
-
pageIndex: 0, //initial page index
|
|
111
|
-
pageSize: 10, //default page size
|
|
112
|
-
}, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, columnVisibility: defaultColumnVisibility = {}, children, }) => {
|
|
113
|
-
const [columnOrder, setColumnOrder] = useState(defaultColumnOrder);
|
|
114
|
-
const [globalFilter, setGlobalFilter] = useState(defaultGlobalFilter);
|
|
115
|
-
const [densityState, setDensity] = useState(density);
|
|
116
|
-
const [rowSelection, setRowSelection] = useState(defaultRowSelection);
|
|
117
|
-
const [columnVisibility, setColumnVisibility] = useState(defaultColumnVisibility);
|
|
199
|
+
const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }) => {
|
|
118
200
|
const table = useReactTable({
|
|
119
201
|
_features: [DensityFeature],
|
|
120
202
|
data: data,
|
|
@@ -128,16 +210,6 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
|
|
|
128
210
|
minSize: 10, //enforced during column resizing
|
|
129
211
|
maxSize: 10000, //enforced during column resizing
|
|
130
212
|
},
|
|
131
|
-
state: {
|
|
132
|
-
columnOrder,
|
|
133
|
-
globalFilter,
|
|
134
|
-
density: densityState,
|
|
135
|
-
rowSelection,
|
|
136
|
-
columnVisibility,
|
|
137
|
-
},
|
|
138
|
-
onColumnOrderChange: (state) => {
|
|
139
|
-
setColumnOrder(state);
|
|
140
|
-
},
|
|
141
213
|
enableRowSelection: enableRowSelection,
|
|
142
214
|
enableMultiRowSelection: enableMultiRowSelection,
|
|
143
215
|
enableSubRowSelection: enableSubRowSelection,
|
|
@@ -146,17 +218,29 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
|
|
|
146
218
|
filterFns: {
|
|
147
219
|
fuzzy: fuzzyFilter,
|
|
148
220
|
},
|
|
149
|
-
onGlobalFilterChange: setGlobalFilter,
|
|
150
221
|
globalFilterFn: "fuzzy",
|
|
151
|
-
|
|
152
|
-
|
|
222
|
+
state: {
|
|
223
|
+
pagination,
|
|
224
|
+
sorting,
|
|
225
|
+
columnFilters,
|
|
226
|
+
rowSelection,
|
|
227
|
+
columnOrder,
|
|
228
|
+
globalFilter,
|
|
229
|
+
density,
|
|
230
|
+
columnVisibility,
|
|
231
|
+
},
|
|
232
|
+
onPaginationChange: setPagination,
|
|
233
|
+
onSortingChange: setSorting,
|
|
234
|
+
onColumnFiltersChange: setColumnFilters,
|
|
153
235
|
onRowSelectionChange: setRowSelection,
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
236
|
+
onColumnOrderChange: (state) => {
|
|
237
|
+
setColumnOrder(state);
|
|
238
|
+
},
|
|
239
|
+
onGlobalFilterChange: (state) => {
|
|
240
|
+
setGlobalFilter(state);
|
|
159
241
|
},
|
|
242
|
+
onDensityChange: setDensity,
|
|
243
|
+
onColumnVisibilityChange: setColumnVisibility,
|
|
160
244
|
});
|
|
161
245
|
useEffect(() => {
|
|
162
246
|
setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
|
|
@@ -172,6 +256,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
|
|
|
172
256
|
globalFilter: globalFilter,
|
|
173
257
|
setGlobalFilter: setGlobalFilter,
|
|
174
258
|
loading: false,
|
|
259
|
+
hasError: false,
|
|
175
260
|
}, children: children }));
|
|
176
261
|
};
|
|
177
262
|
|
|
@@ -184,6 +269,7 @@ const useDataFromUrl = ({ url, params = {}, disableFirstFetch = false, onFetchSu
|
|
|
184
269
|
};
|
|
185
270
|
const getData = async () => {
|
|
186
271
|
try {
|
|
272
|
+
setHasError(false);
|
|
187
273
|
setLoading(true);
|
|
188
274
|
const { data } = await axios.get(url, { params: params });
|
|
189
275
|
console.debug("get DataFromUrl success", data);
|
|
@@ -208,18 +294,7 @@ const useDataFromUrl = ({ url, params = {}, disableFirstFetch = false, onFetchSu
|
|
|
208
294
|
return { data, loading, hasError, refreshData };
|
|
209
295
|
};
|
|
210
296
|
|
|
211
|
-
const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder
|
|
212
|
-
pageIndex: 0, //initial page index
|
|
213
|
-
pageSize: 10, //default page size
|
|
214
|
-
}, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, columnVisibility: defaultColumnVisibility = {}, children, }) => {
|
|
215
|
-
const [sorting, setSorting] = useState(defaultSorting);
|
|
216
|
-
const [columnFilters, setColumnFilters] = useState(defaultColumnFilter); // can set initial column filter state here
|
|
217
|
-
const [pagination, setPagination] = useState(defaultPagination);
|
|
218
|
-
const [rowSelection, setRowSelection] = useState(defaultRowSelection);
|
|
219
|
-
const [columnOrder, setColumnOrder] = useState(defaultColumnOrder);
|
|
220
|
-
const [globalFilter, setGlobalFilter] = useState(defaultGlobalFilter);
|
|
221
|
-
const [densityState, setDensity] = useState(density);
|
|
222
|
-
const [columnVisibility, setColumnVisibility] = useState(defaultColumnVisibility);
|
|
297
|
+
const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }) => {
|
|
223
298
|
const { data, loading, hasError, refreshData } = useDataFromUrl({
|
|
224
299
|
url: url,
|
|
225
300
|
defaultData: {
|
|
@@ -241,7 +316,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
241
316
|
obj[filter.id] = filter.value;
|
|
242
317
|
return { ...accumulator, ...obj };
|
|
243
318
|
}, {})),
|
|
244
|
-
searching: globalFilter,
|
|
319
|
+
searching: globalFilter.globalFilter,
|
|
245
320
|
},
|
|
246
321
|
disableFirstFetch: true,
|
|
247
322
|
});
|
|
@@ -252,11 +327,15 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
252
327
|
getCoreRowModel: getCoreRowModel(),
|
|
253
328
|
manualPagination: true,
|
|
254
329
|
manualSorting: true,
|
|
255
|
-
onPaginationChange: setPagination,
|
|
256
|
-
onSortingChange: setSorting,
|
|
257
|
-
onColumnFiltersChange: setColumnFilters,
|
|
258
330
|
columnResizeMode: "onChange",
|
|
259
|
-
|
|
331
|
+
defaultColumn: {
|
|
332
|
+
size: 150, //starting column size
|
|
333
|
+
minSize: 10, //enforced during column resizing
|
|
334
|
+
maxSize: 10000, //enforced during column resizing
|
|
335
|
+
},
|
|
336
|
+
enableRowSelection: enableRowSelection,
|
|
337
|
+
enableMultiRowSelection: enableMultiRowSelection,
|
|
338
|
+
enableSubRowSelection: enableSubRowSelection,
|
|
260
339
|
state: {
|
|
261
340
|
pagination,
|
|
262
341
|
sorting,
|
|
@@ -264,23 +343,21 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
264
343
|
rowSelection,
|
|
265
344
|
columnOrder,
|
|
266
345
|
globalFilter,
|
|
267
|
-
density
|
|
346
|
+
density,
|
|
268
347
|
columnVisibility,
|
|
269
348
|
},
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
},
|
|
275
|
-
enableRowSelection: enableRowSelection,
|
|
276
|
-
enableMultiRowSelection: enableMultiRowSelection,
|
|
277
|
-
enableSubRowSelection: enableSubRowSelection,
|
|
349
|
+
onPaginationChange: setPagination,
|
|
350
|
+
onSortingChange: setSorting,
|
|
351
|
+
onColumnFiltersChange: setColumnFilters,
|
|
352
|
+
onRowSelectionChange: setRowSelection,
|
|
278
353
|
onColumnOrderChange: (state) => {
|
|
279
354
|
setColumnOrder(state);
|
|
280
355
|
},
|
|
281
356
|
onGlobalFilterChange: (state) => {
|
|
282
357
|
setGlobalFilter(state);
|
|
283
358
|
},
|
|
359
|
+
onDensityChange: setDensity,
|
|
360
|
+
onColumnVisibilityChange: setColumnVisibility,
|
|
284
361
|
rowCount: data.count,
|
|
285
362
|
// for tanstack-table ts bug start
|
|
286
363
|
filterFns: {
|
|
@@ -289,12 +366,10 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
289
366
|
},
|
|
290
367
|
},
|
|
291
368
|
// for tanstack-table ts bug end
|
|
292
|
-
onDensityChange: setDensity,
|
|
293
|
-
onColumnVisibilityChange: setColumnVisibility,
|
|
294
369
|
});
|
|
295
370
|
useEffect(() => {
|
|
296
371
|
refreshData();
|
|
297
|
-
}, [pagination, sorting, columnFilters, globalFilter]);
|
|
372
|
+
}, [pagination, sorting, columnFilters, globalFilter, url]);
|
|
298
373
|
useEffect(() => {
|
|
299
374
|
setColumnOrder(table.getAllLeafColumns().map((column) => column.id));
|
|
300
375
|
}, []);
|
|
@@ -307,6 +382,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
307
382
|
globalFilter,
|
|
308
383
|
setGlobalFilter,
|
|
309
384
|
loading: loading,
|
|
385
|
+
hasError: hasError,
|
|
310
386
|
}, children: children }));
|
|
311
387
|
};
|
|
312
388
|
|
|
@@ -360,18 +436,14 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
|
|
|
360
436
|
};
|
|
361
437
|
|
|
362
438
|
const TableControls = ({ totalText = "Total:", showFilter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsx(Fragment, {}), showFilterName = false, showFilterTags = false, filterOptions = [], }) => {
|
|
363
|
-
|
|
439
|
+
const { loading, hasError } = useDataTableContext();
|
|
440
|
+
return (jsxs(Grid, { templateRows: "auto auto auto 1fr auto", templateColumns: "1fr 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", justifySelf: "center", alignSelf: "center", gap: "0.5rem", children: [jsxs(Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsx(Box, { children: jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "1rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { label: "An error occurred while fetching data", children: jsx(Box, { children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) }) })), showFilter && (jsxs(Fragment, { children: [jsx(GlobalFilter, {}), jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" })] }))] })] }), jsx(Flex, { gridColumn: "1 / span 2", flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
|
|
364
441
|
return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [column, ":"] }), jsx(FilterOptions, { column: column })] }));
|
|
365
442
|
}) }), jsx(Flex, { gridColumn: "1 / span 2", children: showFilterTags && jsx(TableFilterTags, {}) }), jsx(Box, { overflow: "auto", gridColumn: "1 / span 2", width: "100%", height: "100%", children: children }), jsxs(Flex, { gap: "1rem", alignItems: "center", children: [jsx(PageSizeControl, {}), jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: totalText }), jsx(RowCountText, {})] })] }), jsx(Box, { justifySelf: "end", children: jsx(TablePagination, {}) })] }));
|
|
366
443
|
};
|
|
367
444
|
|
|
368
|
-
const useDataTable = () => {
|
|
369
|
-
const { table, refreshData, globalFilter, setGlobalFilter, loading } = useContext(TableContext);
|
|
370
|
-
return { table, refreshData, globalFilter, setGlobalFilter, loading };
|
|
371
|
-
};
|
|
372
|
-
|
|
373
445
|
const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
374
|
-
const table =
|
|
446
|
+
const table = useDataTableContext().table;
|
|
375
447
|
const SELECTION_BOX_WIDTH = 20;
|
|
376
448
|
const [hoveredCheckBox, setHoveredCheckBox] = useState(false);
|
|
377
449
|
const handleRowHover = (isHovered) => {
|
|
@@ -420,7 +492,7 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }
|
|
|
420
492
|
};
|
|
421
493
|
|
|
422
494
|
const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
423
|
-
const { table } =
|
|
495
|
+
const { table } = useDataTableContext();
|
|
424
496
|
const SELECTION_BOX_WIDTH = 20;
|
|
425
497
|
const [hoveredCheckBox, setHoveredCheckBox] = useState(false);
|
|
426
498
|
const handleRowHover = (isHovered) => {
|
|
@@ -504,117 +576,8 @@ const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = f
|
|
|
504
576
|
return (jsx(TableControls, { totalText: totalText, showFilter: showFilter, fitTableWidth: fitTableWidth, fitTableHeight: fitTableHeight, isMobile: isMobile, filterOptions: filterOptions, showFilterName: showFilterName, showFilterTags: showFilterTags, children: jsxs(Table, { variant: "striped", children: [jsx(TableHeader, { canResize: true }), jsx(TableBody, {}), showFooter && jsx(TableFooter, {})] }) }));
|
|
505
577
|
};
|
|
506
578
|
|
|
507
|
-
const DensityToggleButton = ({ text, icon = jsx(AiOutlineColumnWidth, {}), }) => {
|
|
508
|
-
const { table } = useDataTable();
|
|
509
|
-
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: icon, onClick: () => {
|
|
510
|
-
table.toggleDensity();
|
|
511
|
-
} })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
|
|
512
|
-
table.toggleDensity();
|
|
513
|
-
}, children: text }))] }));
|
|
514
|
-
};
|
|
515
|
-
|
|
516
|
-
const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsx(MdFilterAlt, {}), ...props }) => {
|
|
517
|
-
const filterModal = useDisclosure();
|
|
518
|
-
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: filterModal.onOpen, "aria-label": "filter", ...props })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: filterModal.onOpen, ...props, children: text })), jsxs(Modal, { isOpen: filterModal.isOpen, onClose: filterModal.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsxs(Flex, { flexFlow: "column", gap: "1rem", children: [jsx(TableFilter, {}), jsx(ResetFilteringButton, { text: resetText })] }) }), jsx(ModalFooter, { children: jsx(Button, { onClick: filterModal.onClose, children: closeText }) })] })] })] }));
|
|
519
|
-
};
|
|
520
|
-
|
|
521
|
-
const EditOrderButton = ({ text, icon = jsx(MdOutlineMoveDown, {}), title = "Change Order", }) => {
|
|
522
|
-
const orderModal = useDisclosure();
|
|
523
|
-
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: orderModal.onOpen, "aria-label": "change order" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: orderModal.onOpen, children: text })), jsxs(Modal, { isOpen: orderModal.isOpen, onClose: orderModal.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { padding: "0 0 1rem 0", children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsx(Flex, { flexFlow: "column", gap: "0.25rem", children: jsx(TableOrderer, {}) }) })] })] })] }));
|
|
524
|
-
};
|
|
525
|
-
|
|
526
|
-
const TableSorter = () => {
|
|
527
|
-
const { table } = useDataTable();
|
|
528
|
-
return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
|
|
529
|
-
const displayName = header.column.columnDef.meta === undefined
|
|
530
|
-
? header.column.id
|
|
531
|
-
: header.column.columnDef.meta.displayName;
|
|
532
|
-
return (jsx(Fragment, { children: header.column.getCanSort() && (jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Text, { children: displayName }), jsxs(Button, { variant: "ghost", onClick: (e) => {
|
|
533
|
-
header.column.toggleSorting();
|
|
534
|
-
}, children: [header.column.getIsSorted() === false && (
|
|
535
|
-
// <Text>To No sort</Text>
|
|
536
|
-
jsx(UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
|
|
537
|
-
// <Text>To asc</Text>
|
|
538
|
-
jsx(ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
|
|
539
|
-
// <Text>To desc</Text>
|
|
540
|
-
jsx(ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: (e) => {
|
|
541
|
-
header.column.clearSorting();
|
|
542
|
-
}, children: jsx(CloseIcon, {}) }))] })) }));
|
|
543
|
-
}) }))) }));
|
|
544
|
-
};
|
|
545
|
-
|
|
546
|
-
const EditSortingButton = ({ text, icon = jsx(MdOutlineSort, {}), title = "Edit Sorting", }) => {
|
|
547
|
-
const sortingModal = useDisclosure();
|
|
548
|
-
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: sortingModal.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: sortingModal.onOpen, children: text })), jsxs(Modal, { isOpen: sortingModal.isOpen, onClose: sortingModal.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { padding: "0 0 1rem 0", children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(TableSorter, {}), jsx(ResetSortingButton, {})] }) })] })] })] }));
|
|
549
|
-
};
|
|
550
|
-
|
|
551
|
-
const EditViewButton = ({ text, icon = jsx(IoMdEye, {}), title = "Edit View", }) => {
|
|
552
|
-
const viewModel = useDisclosure();
|
|
553
|
-
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: viewModel.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: viewModel.onOpen, children: text })), jsxs(Modal, { isOpen: viewModel.isOpen, onClose: viewModel.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { padding: "0 0 1rem 0", children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsx(TableViewer, {}) })] })] })] }));
|
|
554
|
-
};
|
|
555
|
-
|
|
556
|
-
const FilterOptions = ({ column }) => {
|
|
557
|
-
const { table } = useDataTable();
|
|
558
|
-
const tableColumn = table.getColumn(column);
|
|
559
|
-
const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
|
|
560
|
-
return (jsx(Fragment, { children: options.map((option) => {
|
|
561
|
-
const selected = table.getColumn(column)?.getFilterValue() === option;
|
|
562
|
-
return (jsxs(Button, { size: "sm", onClick: () => {
|
|
563
|
-
if (selected) {
|
|
564
|
-
table.setColumnFilters((state) => {
|
|
565
|
-
return state.filter((filter) => {
|
|
566
|
-
return filter.id !== column;
|
|
567
|
-
});
|
|
568
|
-
});
|
|
569
|
-
return;
|
|
570
|
-
}
|
|
571
|
-
table.getColumn(column)?.setFilterValue(option);
|
|
572
|
-
}, variant: selected ? "solid" : "outline", display: "flex", gap: "0.25rem", children: [option, selected && jsx(MdClose, {})] }, option));
|
|
573
|
-
}) }));
|
|
574
|
-
};
|
|
575
|
-
|
|
576
|
-
const GlobalFilter = ({ icon = MdSearch }) => {
|
|
577
|
-
const { globalFilter, setGlobalFilter } = useDataTable();
|
|
578
|
-
return (jsx(Fragment, { children: jsx(Box, { children: jsxs(InputGroup, { children: [jsx(InputLeftElement, { pointerEvents: "none", children: jsx(Icon, { as: icon, color: "gray.300" }) }), jsx(Input, { value: globalFilter, onChange: (e) => {
|
|
579
|
-
setGlobalFilter(e.target.value);
|
|
580
|
-
} })] }) }) }));
|
|
581
|
-
};
|
|
582
|
-
|
|
583
|
-
const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
|
|
584
|
-
const { table } = useDataTable();
|
|
585
|
-
return (jsx(Fragment, { children: jsxs(Menu, { children: [jsx(MenuButton, { as: Button, variant: "ghost", rightIcon: jsx(ChevronDownIcon, {}), gap: "0.5rem", children: table.getState().pagination.pageSize }), jsx(MenuList, { children: pageSizes.map((pageSize) => (jsx(MenuItem, { onClick: () => {
|
|
586
|
-
table.setPageSize(Number(pageSize));
|
|
587
|
-
}, children: pageSize }, crypto.randomUUID()))) })] }) }));
|
|
588
|
-
};
|
|
589
|
-
|
|
590
|
-
const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
|
|
591
|
-
const { table } = useDataTable();
|
|
592
|
-
return (jsx(Button, { onClick: () => {
|
|
593
|
-
table.resetColumnFilters();
|
|
594
|
-
}, children: text }));
|
|
595
|
-
};
|
|
596
|
-
|
|
597
|
-
const ResetSelectionButton = ({ text = "Reset Selection", }) => {
|
|
598
|
-
const { table } = useDataTable();
|
|
599
|
-
return (jsx(Button, { onClick: () => {
|
|
600
|
-
table.resetRowSelection();
|
|
601
|
-
}, children: text }));
|
|
602
|
-
};
|
|
603
|
-
|
|
604
|
-
const ResetSortingButton = ({ text = "Reset Sorting", }) => {
|
|
605
|
-
const { table } = useDataTable();
|
|
606
|
-
return (jsx(Button, { onClick: () => {
|
|
607
|
-
table.resetSorting();
|
|
608
|
-
}, children: text }));
|
|
609
|
-
};
|
|
610
|
-
|
|
611
|
-
const RowCountText = () => {
|
|
612
|
-
const { table } = useDataTable();
|
|
613
|
-
return jsx(Text, { children: table.getRowCount() });
|
|
614
|
-
};
|
|
615
|
-
|
|
616
579
|
const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
|
|
617
|
-
const { table, loading } =
|
|
580
|
+
const { table, loading } = useDataTableContext();
|
|
618
581
|
if (showLoading) {
|
|
619
582
|
return (jsxs(Fragment, { children: [loading && loadingComponent, !loading && (jsx(Table$1, { width: table.getCenterTotalSize(), overflow: "auto", ...props, children: children }))] }));
|
|
620
583
|
}
|
|
@@ -640,7 +603,7 @@ const TableCards = ({ isSelectable = false }) => {
|
|
|
640
603
|
const TableComponent = ({ render = () => {
|
|
641
604
|
throw Error("Not Implemented");
|
|
642
605
|
}, }) => {
|
|
643
|
-
const { table } =
|
|
606
|
+
const { table } = useDataTableContext();
|
|
644
607
|
return render(table);
|
|
645
608
|
};
|
|
646
609
|
|
|
@@ -744,32 +707,32 @@ function Filter({ column }) {
|
|
|
744
707
|
} })] }, column.id));
|
|
745
708
|
}
|
|
746
709
|
const TableFilter = () => {
|
|
747
|
-
const { table } =
|
|
710
|
+
const { table } = useDataTableContext();
|
|
748
711
|
return (jsx(Fragment, { children: table.getAllColumns().map((column) => {
|
|
749
712
|
return jsx(Filter, { column: column }, column.id);
|
|
750
713
|
}) }));
|
|
751
714
|
};
|
|
752
715
|
|
|
753
716
|
const TableFilterTags = () => {
|
|
754
|
-
const { table } =
|
|
755
|
-
return (jsx(Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }
|
|
717
|
+
const { table } = useDataTableContext();
|
|
718
|
+
return (jsx(Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }) => {
|
|
756
719
|
return (jsxs(Tag, { display: "flex", gap: "0.5rem", alignItems: "center", children: [jsx(Text, { children: `${id}: ${value}` }), jsx(IconButton, { size: "xs", variant: "ghost", icon: jsx(CloseIcon, {}), onClick: () => {
|
|
757
|
-
table.setColumnFilters(table.getState().columnFilters.filter((
|
|
758
|
-
return
|
|
720
|
+
table.setColumnFilters(table.getState().columnFilters.filter((filter) => {
|
|
721
|
+
return filter.value != value;
|
|
759
722
|
}));
|
|
760
723
|
}, "aria-label": "remove filter" })] }, `${id}-${value}`));
|
|
761
724
|
}) }));
|
|
762
725
|
};
|
|
763
726
|
|
|
764
727
|
const TableLoadingComponent = ({ render, }) => {
|
|
765
|
-
const { loading } =
|
|
728
|
+
const { loading } = useDataTableContext();
|
|
766
729
|
return jsx(Fragment, { children: render(loading) });
|
|
767
730
|
};
|
|
768
731
|
|
|
769
732
|
const ColumnOrderChanger = ({ columns }) => {
|
|
770
733
|
const [order, setOrder] = useState([]);
|
|
771
734
|
const [originalOrder, setOriginalOrder] = useState([]);
|
|
772
|
-
const { table } =
|
|
735
|
+
const { table } = useDataTableContext();
|
|
773
736
|
const handleChangeOrder = (startIndex, endIndex) => {
|
|
774
737
|
const newOrder = Array.from(order);
|
|
775
738
|
const [removed] = newOrder.splice(startIndex, 1);
|
|
@@ -815,24 +778,24 @@ const ColumnOrderChanger = ({ columns }) => {
|
|
|
815
778
|
}, children: "Reset" })] })] }));
|
|
816
779
|
};
|
|
817
780
|
const TableOrderer = () => {
|
|
818
|
-
const { table } =
|
|
781
|
+
const { table } = useDataTableContext();
|
|
819
782
|
return (jsx(Fragment, { children: jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
|
|
820
783
|
};
|
|
821
784
|
|
|
822
785
|
const TablePagination = ({}) => {
|
|
823
|
-
const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } =
|
|
786
|
+
const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTableContext().table;
|
|
824
787
|
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, {}) })] }));
|
|
825
788
|
};
|
|
826
789
|
|
|
827
790
|
const ReloadButton = ({ text = "Reload" }) => {
|
|
828
|
-
const { refreshData } =
|
|
791
|
+
const { refreshData } = useDataTableContext();
|
|
829
792
|
return (jsx(Button, { leftIcon: jsx(IoReload, {}), onClick: () => {
|
|
830
793
|
refreshData();
|
|
831
794
|
}, children: text }));
|
|
832
795
|
};
|
|
833
796
|
|
|
834
|
-
const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText, clearAllText, }) => {
|
|
835
|
-
const { table } =
|
|
797
|
+
const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText = "", clearAllText = "", }) => {
|
|
798
|
+
const { table } = useDataTableContext();
|
|
836
799
|
return (jsxs(Fragment, { children: [!!selectAllText === false && (jsx(IconButton, { icon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? clearAllText : selectAllText, onClick: (event) => {
|
|
837
800
|
table.getToggleAllRowsSelectedHandler()(event);
|
|
838
801
|
} })), !!selectAllText !== false && (jsx(Button, { leftIcon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", onClick: (event) => {
|
|
@@ -848,11 +811,9 @@ const TableSelector = () => {
|
|
|
848
811
|
};
|
|
849
812
|
|
|
850
813
|
const TableViewer = () => {
|
|
851
|
-
const { table } =
|
|
814
|
+
const { table } = useDataTableContext();
|
|
852
815
|
const columns = table.getAllLeafColumns();
|
|
853
|
-
const [columnOrder, setColumnOrder] = useState(columns.map(
|
|
854
|
-
return column.id;
|
|
855
|
-
}));
|
|
816
|
+
const [columnOrder, setColumnOrder] = useState(columns.map(column => column.id));
|
|
856
817
|
const handleDragEnd = (result) => {
|
|
857
818
|
if (!result.destination)
|
|
858
819
|
return;
|
|
@@ -862,12 +823,10 @@ const TableViewer = () => {
|
|
|
862
823
|
setColumnOrder(newColumnOrder);
|
|
863
824
|
table.setColumnOrder(newColumnOrder);
|
|
864
825
|
};
|
|
865
|
-
return (jsx(
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
return (jsx(Draggable, { draggableId: column.id, index: i, children: (provided) => (jsxs(Grid, { ref: provided.innerRef, ...provided.draggableProps, templateColumns: "auto 1fr", gap: "0.5rem", alignItems: "center", children: [jsx(Flex, { ...provided.dragHandleProps, alignItems: "center", padding: "auto 0 auto 0", children: jsx(Icon, { as: FaGripLinesVertical, color: "gray.400" }) }), jsxs(Flex, { justifyContent: "space-between", alignItems: "center", children: [jsxs(Box, { children: [" ", displayName] }), jsx(Switch, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() })] })] }, column.id)) }, column.id));
|
|
870
|
-
}), provided.placeholder] })) }) }) }));
|
|
826
|
+
return (jsx(DragDropContext, { onDragEnd: handleDragEnd, children: jsx(Droppable, { droppableId: "columns", children: (provided) => (jsxs(Flex, { flexFlow: "column", gap: "0.5rem", ref: provided.innerRef, ...provided.droppableProps, children: [columns.map((column, index) => {
|
|
827
|
+
const displayName = column.columnDef.meta?.displayName || column.id;
|
|
828
|
+
return (jsx(Draggable, { draggableId: column.id, index: index, children: (provided) => (jsxs(Grid, { ref: provided.innerRef, ...provided.draggableProps, templateColumns: "auto 1fr", gap: "0.5rem", alignItems: "center", children: [jsx(Flex, { ...provided.dragHandleProps, alignItems: "center", padding: "0", children: jsx(Icon, { as: FaGripLinesVertical, color: "gray.400" }) }), jsxs(Flex, { justifyContent: "space-between", alignItems: "center", children: [jsx(Box, { children: displayName }), jsx(Switch, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler() })] })] })) }, column.id));
|
|
829
|
+
}), provided.placeholder] })) }) }));
|
|
871
830
|
};
|
|
872
831
|
|
|
873
832
|
const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipProps, ...props }) => {
|
|
@@ -877,4 +836,31 @@ const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipP
|
|
|
877
836
|
return (jsx(Flex, { alignItems: "center", height: "100%", padding: padding, children: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }));
|
|
878
837
|
};
|
|
879
838
|
|
|
880
|
-
|
|
839
|
+
const FilterOptions = ({ column }) => {
|
|
840
|
+
const { table } = useDataTableContext();
|
|
841
|
+
const tableColumn = table.getColumn(column);
|
|
842
|
+
const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
|
|
843
|
+
return (jsx(Fragment, { children: options.map((option) => {
|
|
844
|
+
const selected = table.getColumn(column)?.getFilterValue() === option;
|
|
845
|
+
return (jsxs(Button, { size: "sm", onClick: () => {
|
|
846
|
+
if (selected) {
|
|
847
|
+
table.setColumnFilters((state) => {
|
|
848
|
+
return state.filter((filter) => {
|
|
849
|
+
return filter.id !== column;
|
|
850
|
+
});
|
|
851
|
+
});
|
|
852
|
+
return;
|
|
853
|
+
}
|
|
854
|
+
table.getColumn(column)?.setFilterValue(option);
|
|
855
|
+
}, variant: selected ? "solid" : "outline", display: "flex", gap: "0.25rem", children: [option, selected && jsx(MdClose, {})] }, option));
|
|
856
|
+
}) }));
|
|
857
|
+
};
|
|
858
|
+
|
|
859
|
+
const GlobalFilter = ({ icon = MdSearch }) => {
|
|
860
|
+
const { table } = useDataTableContext();
|
|
861
|
+
return (jsx(Fragment, { children: jsx(Box, { children: jsxs(InputGroup, { children: [jsx(InputLeftElement, { pointerEvents: "none", children: jsx(Icon, { as: icon, color: "gray.300" }) }), jsx(Input, { value: table.getState().globalFilter.globalFilter, onChange: (e) => {
|
|
862
|
+
table.setGlobalFilter(e.target.value);
|
|
863
|
+
} })] }) }) }));
|
|
864
|
+
};
|
|
865
|
+
|
|
866
|
+
export { DataTable, DataTableServer, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, FilterOptions, GlobalFilter, PageSizeControl, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, useDataFromUrl, useDataTableContext };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
export interface SelectAllRowsToggleProps {
|
|
3
|
-
selectAllIcon
|
|
4
|
-
clearAllIcon
|
|
5
|
-
selectAllText
|
|
6
|
-
clearAllText
|
|
3
|
+
selectAllIcon?: React.ReactElement;
|
|
4
|
+
clearAllIcon?: React.ReactElement;
|
|
5
|
+
selectAllText?: string;
|
|
6
|
+
clearAllText?: string;
|
|
7
7
|
}
|
|
8
8
|
export declare const SelectAllRowsToggle: ({ selectAllIcon, clearAllIcon, selectAllText, clearAllText, }: SelectAllRowsToggleProps) => import("react/jsx-runtime").JSX.Element;
|