@bsol-oss/react-datatable5 1.0.19 → 1.0.21
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/README.md +6 -0
- package/dist/index.d.ts +21 -13
- package/dist/index.js +80 -8
- package/dist/index.mjs +80 -12
- package/dist/types/components/ResetSelectionButton.d.ts +1 -1
- package/dist/types/index.d.ts +7 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -64,3 +64,9 @@ npm install @tanstack/react-table @chakra-ui/react @bsol-oss/react-datatable5
|
|
|
64
64
|
<TablePagination />
|
|
65
65
|
</DataTableServer>
|
|
66
66
|
```
|
|
67
|
+
|
|
68
|
+
Example Url generated by the DataTableServer
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
GET http://localhost:8333/api/v1/gpt/chat/history/all?pagination={"offset":0,"rows":10}&sorting={"field":"session_id","sort":"asc"}&where={"last_user_message":"vdsdf"}
|
|
72
|
+
```
|
package/dist/index.d.ts
CHANGED
|
@@ -32,12 +32,14 @@ interface DataResponse<T> extends Result<T> {
|
|
|
32
32
|
}
|
|
33
33
|
declare const DataTableServer: <TData>({ columns, url, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, children, }: DataTableServerProps<TData>) => react_jsx_runtime.JSX.Element;
|
|
34
34
|
|
|
35
|
-
declare const EditViewButton: () => react_jsx_runtime.JSX.Element;
|
|
36
|
-
|
|
37
35
|
declare const EditFilterButton: () => react_jsx_runtime.JSX.Element;
|
|
38
36
|
|
|
37
|
+
declare const EditOrderButton: () => react_jsx_runtime.JSX.Element;
|
|
38
|
+
|
|
39
39
|
declare const EditSortingButton: () => react_jsx_runtime.JSX.Element;
|
|
40
40
|
|
|
41
|
+
declare const EditViewButton: () => react_jsx_runtime.JSX.Element;
|
|
42
|
+
|
|
41
43
|
interface PageSizeControlProps {
|
|
42
44
|
pageSizes?: number[];
|
|
43
45
|
}
|
|
@@ -45,6 +47,8 @@ declare const PageSizeControl: ({ pageSizes, }: PageSizeControlProps) => react_j
|
|
|
45
47
|
|
|
46
48
|
declare const ResetFilteringButton: () => react_jsx_runtime.JSX.Element;
|
|
47
49
|
|
|
50
|
+
declare const ResetSelectionButton: () => react_jsx_runtime.JSX.Element;
|
|
51
|
+
|
|
48
52
|
declare const ResetSortingButton: () => react_jsx_runtime.JSX.Element;
|
|
49
53
|
|
|
50
54
|
interface TableProps {
|
|
@@ -72,8 +76,22 @@ interface TableHeaderProps {
|
|
|
72
76
|
}
|
|
73
77
|
declare const TableHeader: ({ canResize }: TableHeaderProps) => react_jsx_runtime.JSX.Element;
|
|
74
78
|
|
|
79
|
+
declare const TableOrderer: () => react_jsx_runtime.JSX.Element;
|
|
80
|
+
|
|
81
|
+
interface PaginationProps {
|
|
82
|
+
}
|
|
83
|
+
declare const TablePagination: ({}: PaginationProps) => react_jsx_runtime.JSX.Element;
|
|
84
|
+
|
|
85
|
+
declare const TableSelector: () => react_jsx_runtime.JSX.Element;
|
|
86
|
+
|
|
75
87
|
declare const TableSorter: () => react_jsx_runtime.JSX.Element;
|
|
76
88
|
|
|
89
|
+
interface TextCellProps {
|
|
90
|
+
label?: string;
|
|
91
|
+
children: string | number | JSX.Element | JSX.Element[];
|
|
92
|
+
}
|
|
93
|
+
declare const TextCell: ({ label, children }: TextCellProps) => react_jsx_runtime.JSX.Element;
|
|
94
|
+
|
|
77
95
|
interface useDataFromUrlReturn<T> {
|
|
78
96
|
data: T;
|
|
79
97
|
loading: boolean;
|
|
@@ -92,14 +110,4 @@ declare const useDataTable: () => {
|
|
|
92
110
|
refreshData: () => void;
|
|
93
111
|
};
|
|
94
112
|
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
declare const TablePagination: ({}: PaginationProps) => react_jsx_runtime.JSX.Element;
|
|
98
|
-
|
|
99
|
-
interface TextCellProps {
|
|
100
|
-
label?: string;
|
|
101
|
-
children: string | number | JSX.Element | JSX.Element[];
|
|
102
|
-
}
|
|
103
|
-
declare const TextCell: ({ label, children }: TextCellProps) => react_jsx_runtime.JSX.Element;
|
|
104
|
-
|
|
105
|
-
export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, EditFilterButton, EditSortingButton, EditViewButton, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, ResetSortingButton, type Result, Table, TableBody, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableFilter, TableFooter, TableHeader, type TableHeaderProps, 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
|
@@ -5,9 +5,9 @@ var reactTable = require('@tanstack/react-table');
|
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var axios = require('axios');
|
|
7
7
|
var react$1 = require('@chakra-ui/react');
|
|
8
|
-
var io = require('react-icons/io');
|
|
9
8
|
var md = require('react-icons/md');
|
|
10
9
|
var icons = require('@chakra-ui/icons');
|
|
10
|
+
var io = require('react-icons/io');
|
|
11
11
|
var table = require('@chakra-ui/table');
|
|
12
12
|
|
|
13
13
|
const TableContext = react.createContext({
|
|
@@ -142,13 +142,6 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
142
142
|
return (jsxRuntime.jsx(TableContext.Provider, { value: { table: { ...table }, refreshData: refreshData }, children: children }));
|
|
143
143
|
};
|
|
144
144
|
|
|
145
|
-
const EditViewButton = () => {
|
|
146
|
-
const { table } = react.useContext(TableContext);
|
|
147
|
-
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) => {
|
|
148
|
-
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()));
|
|
149
|
-
}) }) })] })] }));
|
|
150
|
-
};
|
|
151
|
-
|
|
152
145
|
const ResetFilteringButton = () => {
|
|
153
146
|
const { table } = react.useContext(TableContext);
|
|
154
147
|
return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
@@ -176,6 +169,53 @@ const EditFilterButton = () => {
|
|
|
176
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, {})] }) })] })] }));
|
|
177
170
|
};
|
|
178
171
|
|
|
172
|
+
const ColumnOrderChanger = ({ columns }) => {
|
|
173
|
+
const [order, setOrder] = react.useState([]);
|
|
174
|
+
const [originalOrder, setOriginalOrder] = react.useState([]);
|
|
175
|
+
const { table } = useDataTable();
|
|
176
|
+
const handleChangeOrder = (startIndex, endIndex) => {
|
|
177
|
+
const newOrder = Array.from(order);
|
|
178
|
+
const [removed] = newOrder.splice(startIndex, 1);
|
|
179
|
+
newOrder.splice(endIndex, 0, removed);
|
|
180
|
+
setOrder(newOrder);
|
|
181
|
+
};
|
|
182
|
+
react.useEffect(() => {
|
|
183
|
+
setOrder(columns);
|
|
184
|
+
}, [columns]);
|
|
185
|
+
react.useEffect(() => {
|
|
186
|
+
if (originalOrder.length > 0) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (columns.length <= 0) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
setOriginalOrder(columns);
|
|
193
|
+
}, [columns]);
|
|
194
|
+
return (jsxRuntime.jsxs(react$1.Flex, { gap: "0.5rem", flexFlow: "column", children: [jsxRuntime.jsx(react$1.Flex, { gap: "0.5rem", flexFlow: "column", children: order.map((column, index) => (jsxRuntime.jsxs(react$1.Flex, { gap: "0.25rem", alignItems: "center", justifyContent: "center", children: [jsxRuntime.jsx(react$1.IconButton, { onClick: () => {
|
|
195
|
+
const prevIndex = index - 1;
|
|
196
|
+
if (prevIndex >= 0) {
|
|
197
|
+
handleChangeOrder(index, prevIndex);
|
|
198
|
+
}
|
|
199
|
+
}, disabled: index === 0, "aria-label": "", children: jsxRuntime.jsx(md.MdArrowUpward, {}) }), column, jsxRuntime.jsx(react$1.IconButton, { onClick: () => {
|
|
200
|
+
const nextIndex = index + 1;
|
|
201
|
+
if (nextIndex < order.length) {
|
|
202
|
+
handleChangeOrder(index, nextIndex);
|
|
203
|
+
}
|
|
204
|
+
}, disabled: index === order.length - 1, "aria-label": "", children: jsxRuntime.jsx(md.MdArrowDownward, {}) })] }, column))) }), jsxRuntime.jsxs(react$1.Box, { children: [jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
205
|
+
table.setColumnOrder(order);
|
|
206
|
+
}, children: "Apply" }), jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
207
|
+
table.setColumnOrder(originalOrder);
|
|
208
|
+
}, children: "Reset" })] })] }));
|
|
209
|
+
};
|
|
210
|
+
const TableOrderer = () => {
|
|
211
|
+
const { table } = useDataTable();
|
|
212
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
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, {}) }) })] })] }));
|
|
217
|
+
};
|
|
218
|
+
|
|
179
219
|
const ResetSortingButton = () => {
|
|
180
220
|
const { table } = react.useContext(TableContext);
|
|
181
221
|
return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
@@ -204,11 +244,25 @@ const EditSortingButton = () => {
|
|
|
204
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, {})] }) })] })] }));
|
|
205
245
|
};
|
|
206
246
|
|
|
247
|
+
const EditViewButton = () => {
|
|
248
|
+
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) => {
|
|
250
|
+
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
|
+
}) }) })] })] }));
|
|
252
|
+
};
|
|
253
|
+
|
|
207
254
|
const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
|
|
208
255
|
const { table } = react.useContext(TableContext);
|
|
209
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: () => { table.setPageSize(Number(pageSize)); }, children: pageSize }))) })] }) }));
|
|
210
257
|
};
|
|
211
258
|
|
|
259
|
+
const ResetSelectionButton = () => {
|
|
260
|
+
const { table } = react.useContext(TableContext);
|
|
261
|
+
return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
262
|
+
table.resetRowSelection();
|
|
263
|
+
}, children: "Reset Selection" }));
|
|
264
|
+
};
|
|
265
|
+
|
|
212
266
|
const Table = ({ children }) => {
|
|
213
267
|
const { table } = useDataTable();
|
|
214
268
|
return (jsxRuntime.jsx(react$1.Container, { padding: '0rem', maxW: "100%", overflowX: "scroll", children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), variant: "simple", children: children }) }));
|
|
@@ -351,6 +405,20 @@ const TablePagination = ({}) => {
|
|
|
351
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, {}) })] }));
|
|
352
406
|
};
|
|
353
407
|
|
|
408
|
+
const SelectAllRowsToggle = () => {
|
|
409
|
+
const { table } = react.useContext(TableContext);
|
|
410
|
+
return (jsxRuntime.jsx(react$1.Tooltip, { label: table.getIsAllRowsSelected() ? "Clear All" : "Select All", children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": table.getIsAllRowsSelected() ? "Clear All" : "Select All", icon: table.getIsAllRowsSelected() ? jsxRuntime.jsx(md.MdClear, {}) : jsxRuntime.jsx(md.MdOutlineChecklist, {}), onClick: (event) => {
|
|
411
|
+
table.getToggleAllRowsSelectedHandler()(event);
|
|
412
|
+
} }) }));
|
|
413
|
+
};
|
|
414
|
+
|
|
415
|
+
const TableSelector = () => {
|
|
416
|
+
const { table } = react.useContext(TableContext);
|
|
417
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [table.getSelectedRowModel().rows.length > 0 && (jsxRuntime.jsxs(react$1.Button, { onClick: () => { }, 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, { icon: jsxRuntime.jsx(react$1.Icon, { as: md.MdClear }), onClick: () => {
|
|
418
|
+
table.resetRowSelection();
|
|
419
|
+
}, "aria-label": "reset selection" }))] }));
|
|
420
|
+
};
|
|
421
|
+
|
|
354
422
|
const TextCell = ({ label, children }) => {
|
|
355
423
|
if (label) {
|
|
356
424
|
return (jsxRuntime.jsx(react$1.Tooltip, { label: jsxRuntime.jsx(react$1.Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", noOfLines: [5], children: label }), placement: "auto", children: jsxRuntime.jsx(react$1.Text, { as: "span", textOverflow: "ellipsis", noOfLines: [1, 2, 3], children: children }) }));
|
|
@@ -361,10 +429,12 @@ const TextCell = ({ label, children }) => {
|
|
|
361
429
|
exports.DataTable = DataTable;
|
|
362
430
|
exports.DataTableServer = DataTableServer;
|
|
363
431
|
exports.EditFilterButton = EditFilterButton;
|
|
432
|
+
exports.EditOrderButton = EditOrderButton;
|
|
364
433
|
exports.EditSortingButton = EditSortingButton;
|
|
365
434
|
exports.EditViewButton = EditViewButton;
|
|
366
435
|
exports.PageSizeControl = PageSizeControl;
|
|
367
436
|
exports.ResetFilteringButton = ResetFilteringButton;
|
|
437
|
+
exports.ResetSelectionButton = ResetSelectionButton;
|
|
368
438
|
exports.ResetSortingButton = ResetSortingButton;
|
|
369
439
|
exports.Table = Table;
|
|
370
440
|
exports.TableBody = TableBody;
|
|
@@ -373,7 +443,9 @@ exports.TableCards = TableCards;
|
|
|
373
443
|
exports.TableFilter = TableFilter;
|
|
374
444
|
exports.TableFooter = TableFooter;
|
|
375
445
|
exports.TableHeader = TableHeader;
|
|
446
|
+
exports.TableOrderer = TableOrderer;
|
|
376
447
|
exports.TablePagination = TablePagination;
|
|
448
|
+
exports.TableSelector = TableSelector;
|
|
377
449
|
exports.TableSorter = TableSorter;
|
|
378
450
|
exports.TextCell = TextCell;
|
|
379
451
|
exports.useDataFromUrl = useDataFromUrl;
|
package/dist/index.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { jsx,
|
|
1
|
+
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 {
|
|
6
|
-
import {
|
|
7
|
-
import { MdFilterAlt, MdOutlineSort, MdPushPin, MdCancel, MdSort, MdFilterListAlt, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage } from 'react-icons/md';
|
|
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';
|
|
8
7
|
import { ChevronUpIcon, UpDownIcon, ChevronDownIcon, 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({
|
|
@@ -140,13 +140,6 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
140
140
|
return (jsx(TableContext.Provider, { value: { table: { ...table }, refreshData: refreshData }, children: children }));
|
|
141
141
|
};
|
|
142
142
|
|
|
143
|
-
const EditViewButton = () => {
|
|
144
|
-
const { table } = useContext(TableContext);
|
|
145
|
-
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) => {
|
|
146
|
-
return (jsx(FormControl, { width: "auto", children: jsx(Checkbox, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler(), children: column.id }) }, crypto.randomUUID()));
|
|
147
|
-
}) }) })] })] }));
|
|
148
|
-
};
|
|
149
|
-
|
|
150
143
|
const ResetFilteringButton = () => {
|
|
151
144
|
const { table } = useContext(TableContext);
|
|
152
145
|
return (jsx(Button, { onClick: () => {
|
|
@@ -174,6 +167,53 @@ const EditFilterButton = () => {
|
|
|
174
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, {})] }) })] })] }));
|
|
175
168
|
};
|
|
176
169
|
|
|
170
|
+
const ColumnOrderChanger = ({ columns }) => {
|
|
171
|
+
const [order, setOrder] = useState([]);
|
|
172
|
+
const [originalOrder, setOriginalOrder] = useState([]);
|
|
173
|
+
const { table } = useDataTable();
|
|
174
|
+
const handleChangeOrder = (startIndex, endIndex) => {
|
|
175
|
+
const newOrder = Array.from(order);
|
|
176
|
+
const [removed] = newOrder.splice(startIndex, 1);
|
|
177
|
+
newOrder.splice(endIndex, 0, removed);
|
|
178
|
+
setOrder(newOrder);
|
|
179
|
+
};
|
|
180
|
+
useEffect(() => {
|
|
181
|
+
setOrder(columns);
|
|
182
|
+
}, [columns]);
|
|
183
|
+
useEffect(() => {
|
|
184
|
+
if (originalOrder.length > 0) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (columns.length <= 0) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
setOriginalOrder(columns);
|
|
191
|
+
}, [columns]);
|
|
192
|
+
return (jsxs(Flex, { gap: "0.5rem", flexFlow: "column", children: [jsx(Flex, { gap: "0.5rem", flexFlow: "column", children: order.map((column, index) => (jsxs(Flex, { gap: "0.25rem", alignItems: "center", justifyContent: "center", children: [jsx(IconButton, { onClick: () => {
|
|
193
|
+
const prevIndex = index - 1;
|
|
194
|
+
if (prevIndex >= 0) {
|
|
195
|
+
handleChangeOrder(index, prevIndex);
|
|
196
|
+
}
|
|
197
|
+
}, disabled: index === 0, "aria-label": "", children: jsx(MdArrowUpward, {}) }), column, jsx(IconButton, { onClick: () => {
|
|
198
|
+
const nextIndex = index + 1;
|
|
199
|
+
if (nextIndex < order.length) {
|
|
200
|
+
handleChangeOrder(index, nextIndex);
|
|
201
|
+
}
|
|
202
|
+
}, disabled: index === order.length - 1, "aria-label": "", children: jsx(MdArrowDownward, {}) })] }, column))) }), jsxs(Box, { children: [jsx(Button, { onClick: () => {
|
|
203
|
+
table.setColumnOrder(order);
|
|
204
|
+
}, children: "Apply" }), jsx(Button, { onClick: () => {
|
|
205
|
+
table.setColumnOrder(originalOrder);
|
|
206
|
+
}, children: "Reset" })] })] }));
|
|
207
|
+
};
|
|
208
|
+
const TableOrderer = () => {
|
|
209
|
+
const { table } = useDataTable();
|
|
210
|
+
return (jsx(Fragment, { children: jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
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, {}) }) })] })] }));
|
|
215
|
+
};
|
|
216
|
+
|
|
177
217
|
const ResetSortingButton = () => {
|
|
178
218
|
const { table } = useContext(TableContext);
|
|
179
219
|
return (jsx(Button, { onClick: () => {
|
|
@@ -202,11 +242,25 @@ const EditSortingButton = () => {
|
|
|
202
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, {})] }) })] })] }));
|
|
203
243
|
};
|
|
204
244
|
|
|
245
|
+
const EditViewButton = () => {
|
|
246
|
+
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) => {
|
|
248
|
+
return (jsx(FormControl, { width: "auto", children: jsx(Checkbox, { isChecked: column.getIsVisible(), onChange: column.getToggleVisibilityHandler(), children: column.id }) }, crypto.randomUUID()));
|
|
249
|
+
}) }) })] })] }));
|
|
250
|
+
};
|
|
251
|
+
|
|
205
252
|
const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
|
|
206
253
|
const { table } = useContext(TableContext);
|
|
207
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: () => { table.setPageSize(Number(pageSize)); }, children: pageSize }))) })] }) }));
|
|
208
255
|
};
|
|
209
256
|
|
|
257
|
+
const ResetSelectionButton = () => {
|
|
258
|
+
const { table } = useContext(TableContext);
|
|
259
|
+
return (jsx(Button, { onClick: () => {
|
|
260
|
+
table.resetRowSelection();
|
|
261
|
+
}, children: "Reset Selection" }));
|
|
262
|
+
};
|
|
263
|
+
|
|
210
264
|
const Table = ({ children }) => {
|
|
211
265
|
const { table } = useDataTable();
|
|
212
266
|
return (jsx(Container, { padding: '0rem', maxW: "100%", overflowX: "scroll", children: jsx(Table$1, { width: table.getCenterTotalSize(), variant: "simple", children: children }) }));
|
|
@@ -349,6 +403,20 @@ const TablePagination = ({}) => {
|
|
|
349
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, {}) })] }));
|
|
350
404
|
};
|
|
351
405
|
|
|
406
|
+
const SelectAllRowsToggle = () => {
|
|
407
|
+
const { table } = useContext(TableContext);
|
|
408
|
+
return (jsx(Tooltip, { label: table.getIsAllRowsSelected() ? "Clear All" : "Select All", children: jsx(IconButton, { "aria-label": table.getIsAllRowsSelected() ? "Clear All" : "Select All", icon: table.getIsAllRowsSelected() ? jsx(MdClear, {}) : jsx(MdOutlineChecklist, {}), onClick: (event) => {
|
|
409
|
+
table.getToggleAllRowsSelectedHandler()(event);
|
|
410
|
+
} }) }));
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
const TableSelector = () => {
|
|
414
|
+
const { table } = useContext(TableContext);
|
|
415
|
+
return (jsxs(Fragment, { children: [table.getSelectedRowModel().rows.length > 0 && (jsxs(Button, { onClick: () => { }, 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, { icon: jsx(Icon, { as: MdClear }), onClick: () => {
|
|
416
|
+
table.resetRowSelection();
|
|
417
|
+
}, "aria-label": "reset selection" }))] }));
|
|
418
|
+
};
|
|
419
|
+
|
|
352
420
|
const TextCell = ({ label, children }) => {
|
|
353
421
|
if (label) {
|
|
354
422
|
return (jsx(Tooltip, { label: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", noOfLines: [5], children: label }), placement: "auto", children: jsx(Text, { as: "span", textOverflow: "ellipsis", noOfLines: [1, 2, 3], children: children }) }));
|
|
@@ -356,4 +424,4 @@ const TextCell = ({ label, children }) => {
|
|
|
356
424
|
return (jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", noOfLines: [1, 2, 3], children: children }));
|
|
357
425
|
};
|
|
358
426
|
|
|
359
|
-
export { DataTable, DataTableServer, EditFilterButton, EditSortingButton, EditViewButton, PageSizeControl, ResetFilteringButton, ResetSortingButton, Table, TableBody, TableCardContainer, TableCards, TableFilter, TableFooter, TableHeader, TablePagination, TableSorter, TextCell, useDataFromUrl, useDataTable };
|
|
427
|
+
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 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const ResetSelectionButton: () => import("react/jsx-runtime").JSX.Element;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
export * from "./components/DataTable";
|
|
2
2
|
export * from "./components/DataTableServer";
|
|
3
|
-
export * from "./components/EditViewButton";
|
|
4
3
|
export * from "./components/EditFilterButton";
|
|
4
|
+
export * from "./components/EditOrderButton";
|
|
5
5
|
export * from "./components/EditSortingButton";
|
|
6
|
+
export * from "./components/EditViewButton";
|
|
6
7
|
export * from "./components/PageSizeControl";
|
|
7
8
|
export * from "./components/ResetFilteringButton";
|
|
9
|
+
export * from "./components/ResetSelectionButton";
|
|
8
10
|
export * from "./components/ResetSortingButton";
|
|
9
11
|
export * from "./components/Table";
|
|
10
12
|
export * from "./components/TableBody";
|
|
@@ -13,8 +15,10 @@ export * from "./components/TableCards";
|
|
|
13
15
|
export * from "./components/TableFilter";
|
|
14
16
|
export * from "./components/TableFooter";
|
|
15
17
|
export * from "./components/TableHeader";
|
|
18
|
+
export * from "./components/TableOrderer";
|
|
19
|
+
export * from "./components/TablePagination";
|
|
20
|
+
export * from "./components/TableSelector";
|
|
16
21
|
export * from "./components/TableSorter";
|
|
22
|
+
export * from "./components/TextCell";
|
|
17
23
|
export * from "./components/useDataFromUrl";
|
|
18
24
|
export * from "./components/useDataTable";
|
|
19
|
-
export * from "./components/TablePagination";
|
|
20
|
-
export * from "./components/TextCell";
|