@bsol-oss/react-datatable5 1.0.39 → 1.0.40
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 +20 -6
- package/dist/index.js +159 -140
- package/dist/index.mjs +160 -144
- package/dist/types/components/DefaultTable.d.ts +3 -0
- package/dist/types/components/EditFilterButton.d.ts +1 -1
- package/dist/types/components/GlobalFilter.d.ts +3 -1
- package/dist/types/components/RowCountText.d.ts +1 -0
- package/dist/types/components/Table.d.ts +2 -1
- package/dist/types/components/TableComponentRenderer.d.ts +6 -0
- package/dist/types/index.d.ts +3 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
|
-
import { RowData, OnChangeFn, Updater, FilterFn, ColumnDef, RowSelectionState, ColumnFiltersState, SortingState, Row } from '@tanstack/react-table';
|
|
3
|
+
import { RowData, OnChangeFn, Updater, FilterFn, ColumnDef, RowSelectionState, ColumnFiltersState, SortingState, Row, Table as Table$1 } from '@tanstack/react-table';
|
|
4
4
|
import { RankingInfo } from '@tanstack/match-sorter-utils';
|
|
5
5
|
import React$1, { ReactNode } from 'react';
|
|
6
|
-
import
|
|
6
|
+
import * as react_icons_lib from 'react-icons/lib';
|
|
7
|
+
import { TableProps as TableProps$1, TextProps, TooltipProps } from '@chakra-ui/react';
|
|
7
8
|
import * as _tanstack_table_core from '@tanstack/table-core';
|
|
8
9
|
|
|
9
10
|
type DensityState = "sm" | "md" | "lg";
|
|
@@ -92,6 +93,10 @@ declare module "@tanstack/react-table" {
|
|
|
92
93
|
}
|
|
93
94
|
declare const DataTableServer: <TData>({ columns, url, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder: defaultColumnOrder, columnFilters: defaultColumnFilter, density, globalFilter: defaultGlobalFilter, pagination: defaultPagination, sorting: defaultSorting, rowSelection: defaultRowSelection, children, }: DataTableServerProps<TData>) => react_jsx_runtime.JSX.Element;
|
|
94
95
|
|
|
96
|
+
declare const DefaultTable: ({ totalText }: {
|
|
97
|
+
totalText?: string | undefined;
|
|
98
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
99
|
+
|
|
95
100
|
interface DensityToggleButtonProps {
|
|
96
101
|
icon?: React$1.ReactElement;
|
|
97
102
|
text?: string;
|
|
@@ -105,7 +110,7 @@ interface EditFilterButtonProps {
|
|
|
105
110
|
resetText?: string;
|
|
106
111
|
icon?: React.ReactElement;
|
|
107
112
|
}
|
|
108
|
-
declare const EditFilterButton: ({ text, title, closeText, resetText, icon, }: EditFilterButtonProps) => react_jsx_runtime.JSX.Element;
|
|
113
|
+
declare const EditFilterButton: ({ text, title, closeText, resetText, icon, ...props }: EditFilterButtonProps) => react_jsx_runtime.JSX.Element;
|
|
109
114
|
|
|
110
115
|
interface EditOrderButtonProps {
|
|
111
116
|
title?: string;
|
|
@@ -128,7 +133,9 @@ interface EditViewButtonProps {
|
|
|
128
133
|
}
|
|
129
134
|
declare const EditViewButton: ({ text, icon, title, }: EditViewButtonProps) => react_jsx_runtime.JSX.Element;
|
|
130
135
|
|
|
131
|
-
declare const GlobalFilter: (
|
|
136
|
+
declare const GlobalFilter: ({ icon }: {
|
|
137
|
+
icon?: react_icons_lib.IconType | undefined;
|
|
138
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
132
139
|
|
|
133
140
|
interface PageSizeControlProps {
|
|
134
141
|
pageSizes?: number[];
|
|
@@ -150,7 +157,9 @@ interface ResetSortingButtonProps {
|
|
|
150
157
|
}
|
|
151
158
|
declare const ResetSortingButton: ({ text, }: ResetSortingButtonProps) => react_jsx_runtime.JSX.Element;
|
|
152
159
|
|
|
153
|
-
|
|
160
|
+
declare const RowCountText: () => react_jsx_runtime.JSX.Element;
|
|
161
|
+
|
|
162
|
+
interface TableProps extends TableProps$1 {
|
|
154
163
|
showLoading?: boolean;
|
|
155
164
|
loadingComponent?: JSX.Element;
|
|
156
165
|
children: ReactNode;
|
|
@@ -183,6 +192,11 @@ interface TableCardsProps {
|
|
|
183
192
|
}
|
|
184
193
|
declare const TableCards: ({}: TableCardsProps) => react_jsx_runtime.JSX.Element;
|
|
185
194
|
|
|
195
|
+
interface TableRendererProps<TData> {
|
|
196
|
+
render: (render: Table$1<TData>) => React$1.ReactElement;
|
|
197
|
+
}
|
|
198
|
+
declare const TableComponentRenderer: <TData>({ render, }: TableRendererProps<TData>) => React$1.ReactElement<any, string | React$1.JSXElementConstructor<any>>;
|
|
199
|
+
|
|
186
200
|
declare const TableFilter: () => react_jsx_runtime.JSX.Element;
|
|
187
201
|
|
|
188
202
|
interface TableFooterProps {
|
|
@@ -244,4 +258,4 @@ declare const useDataTable: () => {
|
|
|
244
258
|
loading: boolean;
|
|
245
259
|
};
|
|
246
260
|
|
|
247
|
-
export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, DensityToggleButton, type DensityToggleButtonProps, EditFilterButton, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, EditViewButton, type EditViewButtonProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, type ResetFilteringButtonProps, ResetSelectionButton, type ResetSelectionButtonProps, ResetSortingButton, type ResetSortingButtonProps, type Result, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableFilter, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableOrderer, TablePagination, type TableProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
|
|
261
|
+
export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, DefaultTable, DensityToggleButton, type DensityToggleButtonProps, EditFilterButton, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, EditViewButton, type EditViewButtonProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, type ResetFilteringButtonProps, ResetSelectionButton, type ResetSelectionButtonProps, ResetSortingButton, type ResetSortingButtonProps, type Result, RowCountText, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableComponentRenderer, TableFilter, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableOrderer, TablePagination, type TableProps, type TableRendererProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
|
package/dist/index.js
CHANGED
|
@@ -6,11 +6,11 @@ var react = require('react');
|
|
|
6
6
|
var matchSorterUtils = require('@tanstack/match-sorter-utils');
|
|
7
7
|
var axios = require('axios');
|
|
8
8
|
var react$1 = require('@chakra-ui/react');
|
|
9
|
-
var ai = require('react-icons/ai');
|
|
10
9
|
var md = require('react-icons/md');
|
|
11
|
-
var icons = require('@chakra-ui/icons');
|
|
12
10
|
var io = require('react-icons/io');
|
|
11
|
+
var icons = require('@chakra-ui/icons');
|
|
13
12
|
var table = require('@chakra-ui/table');
|
|
13
|
+
var ai = require('react-icons/ai');
|
|
14
14
|
|
|
15
15
|
const TableContext = react.createContext({
|
|
16
16
|
table: {},
|
|
@@ -297,27 +297,18 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
297
297
|
}, children: children }));
|
|
298
298
|
};
|
|
299
299
|
|
|
300
|
-
const
|
|
301
|
-
const { table } = react.useContext(TableContext);
|
|
302
|
-
return
|
|
303
|
-
table.toggleDensity();
|
|
304
|
-
} })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
|
|
305
|
-
table.toggleDensity();
|
|
306
|
-
}, children: text }))] }));
|
|
300
|
+
const useDataTable = () => {
|
|
301
|
+
const { table, refreshData, globalFilter, setGlobalFilter, loading } = react.useContext(TableContext);
|
|
302
|
+
return { table, refreshData, globalFilter, setGlobalFilter, loading };
|
|
307
303
|
};
|
|
308
304
|
|
|
309
305
|
const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
|
|
310
|
-
const { table } =
|
|
306
|
+
const { table } = useDataTable();
|
|
311
307
|
return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
312
308
|
table.resetColumnFilters();
|
|
313
309
|
}, children: text }));
|
|
314
310
|
};
|
|
315
311
|
|
|
316
|
-
const useDataTable = () => {
|
|
317
|
-
const { table, refreshData, globalFilter, setGlobalFilter, loading } = react.useContext(TableContext);
|
|
318
|
-
return { table, refreshData, globalFilter, setGlobalFilter, loading };
|
|
319
|
-
};
|
|
320
|
-
|
|
321
312
|
const TableFilter = () => {
|
|
322
313
|
const { table } = useDataTable();
|
|
323
314
|
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getLeafHeaders().map((header) => {
|
|
@@ -332,99 +323,9 @@ const TableFilter = () => {
|
|
|
332
323
|
}) }));
|
|
333
324
|
};
|
|
334
325
|
|
|
335
|
-
const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsxRuntime.jsx(md.MdFilterAlt, {}), }) => {
|
|
326
|
+
const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsxRuntime.jsx(md.MdFilterAlt, {}), ...props }) => {
|
|
336
327
|
const filterModal = react$1.useDisclosure();
|
|
337
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: filterModal.onOpen, "aria-label": "filter" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: filterModal.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: filterModal.isOpen, onClose: filterModal.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "1rem", children: [jsxRuntime.jsx(TableFilter, {}), jsxRuntime.jsx(ResetFilteringButton, { text: resetText })] }) }), jsxRuntime.jsx(react$1.ModalFooter, { children: jsxRuntime.jsx(react$1.Button, { onClick: filterModal.onClose, children: closeText }) })] })] })] }));
|
|
338
|
-
};
|
|
339
|
-
|
|
340
|
-
const ColumnOrderChanger = ({ columns }) => {
|
|
341
|
-
const [order, setOrder] = react.useState([]);
|
|
342
|
-
const [originalOrder, setOriginalOrder] = react.useState([]);
|
|
343
|
-
const { table } = useDataTable();
|
|
344
|
-
const handleChangeOrder = (startIndex, endIndex) => {
|
|
345
|
-
const newOrder = Array.from(order);
|
|
346
|
-
const [removed] = newOrder.splice(startIndex, 1);
|
|
347
|
-
newOrder.splice(endIndex, 0, removed);
|
|
348
|
-
setOrder(newOrder);
|
|
349
|
-
};
|
|
350
|
-
react.useEffect(() => {
|
|
351
|
-
setOrder(columns);
|
|
352
|
-
}, [columns]);
|
|
353
|
-
react.useEffect(() => {
|
|
354
|
-
if (originalOrder.length > 0) {
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
if (columns.length <= 0) {
|
|
358
|
-
return;
|
|
359
|
-
}
|
|
360
|
-
setOriginalOrder(columns);
|
|
361
|
-
}, [columns]);
|
|
362
|
-
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((columnId, index) => (jsxRuntime.jsxs(react$1.Flex, { gap: "0.5rem", alignItems: "center", justifyContent: "space-between", children: [jsxRuntime.jsx(react$1.IconButton, { onClick: () => {
|
|
363
|
-
const prevIndex = index - 1;
|
|
364
|
-
if (prevIndex >= 0) {
|
|
365
|
-
handleChangeOrder(index, prevIndex);
|
|
366
|
-
}
|
|
367
|
-
}, disabled: index === 0, "aria-label": "", children: jsxRuntime.jsx(md.MdArrowUpward, {}) }), table
|
|
368
|
-
.getAllFlatColumns()
|
|
369
|
-
.filter((column) => {
|
|
370
|
-
return column.id === columnId;
|
|
371
|
-
})
|
|
372
|
-
.map((column) => {
|
|
373
|
-
const displayName = column.columnDef.meta === undefined
|
|
374
|
-
? column.id
|
|
375
|
-
: column.columnDef.meta.displayName;
|
|
376
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: displayName });
|
|
377
|
-
}), jsxRuntime.jsx(react$1.IconButton, { onClick: () => {
|
|
378
|
-
const nextIndex = index + 1;
|
|
379
|
-
if (nextIndex < order.length) {
|
|
380
|
-
handleChangeOrder(index, nextIndex);
|
|
381
|
-
}
|
|
382
|
-
}, disabled: index === order.length - 1, "aria-label": "", children: jsxRuntime.jsx(md.MdArrowDownward, {}) })] }, columnId))) }), jsxRuntime.jsxs(react$1.Flex, { gap: "0.25rem", children: [jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
383
|
-
table.setColumnOrder(order);
|
|
384
|
-
}, children: "Apply" }), jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
385
|
-
table.setColumnOrder(originalOrder);
|
|
386
|
-
}, children: "Reset" })] })] }));
|
|
387
|
-
};
|
|
388
|
-
const TableOrderer = () => {
|
|
389
|
-
const { table } = useDataTable();
|
|
390
|
-
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
const EditOrderButton = ({ text, icon = jsxRuntime.jsx(md.MdOutlineMoveDown, {}), title = "Change Order", }) => {
|
|
394
|
-
const orderModal = react$1.useDisclosure();
|
|
395
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: orderModal.onOpen, "aria-label": "change order" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: orderModal.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: orderModal.isOpen, onClose: orderModal.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { padding: "0 0 1rem 0", children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsx(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: jsxRuntime.jsx(TableOrderer, {}) }) })] })] })] }));
|
|
396
|
-
};
|
|
397
|
-
|
|
398
|
-
const ResetSortingButton = ({ text = "Reset Sorting", }) => {
|
|
399
|
-
const { table } = react.useContext(TableContext);
|
|
400
|
-
return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
401
|
-
table.resetSorting();
|
|
402
|
-
}, children: text }));
|
|
403
|
-
};
|
|
404
|
-
|
|
405
|
-
const TableSorter = () => {
|
|
406
|
-
const { table } = useDataTable();
|
|
407
|
-
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsx(jsxRuntime.Fragment, { children: headerGroup.headers.map((header) => {
|
|
408
|
-
const displayName = header.column.columnDef.meta === undefined
|
|
409
|
-
? header.column.id
|
|
410
|
-
: header.column.columnDef.meta.displayName;
|
|
411
|
-
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: displayName }), jsxRuntime.jsxs(react$1.Button, { variant: "ghost", onClick: (e) => {
|
|
412
|
-
header.column.toggleSorting();
|
|
413
|
-
}, children: [header.column.getIsSorted() === false && (
|
|
414
|
-
// <Text>To No sort</Text>
|
|
415
|
-
jsxRuntime.jsx(icons.UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
|
|
416
|
-
// <Text>To asc</Text>
|
|
417
|
-
jsxRuntime.jsx(icons.ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
|
|
418
|
-
// <Text>To desc</Text>
|
|
419
|
-
jsxRuntime.jsx(icons.ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsxRuntime.jsx(react$1.Button, { onClick: (e) => {
|
|
420
|
-
header.column.clearSorting();
|
|
421
|
-
}, children: jsxRuntime.jsx(icons.CloseIcon, {}) }))] })) }));
|
|
422
|
-
}) }))) }));
|
|
423
|
-
};
|
|
424
|
-
|
|
425
|
-
const EditSortingButton = ({ text, icon = jsxRuntime.jsx(md.MdOutlineSort, {}), title = "Edit Sorting", }) => {
|
|
426
|
-
const sortingModal = react$1.useDisclosure();
|
|
427
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: sortingModal.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: sortingModal.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: sortingModal.isOpen, onClose: sortingModal.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { padding: "0 0 1rem 0", children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(TableSorter, {}), jsxRuntime.jsx(ResetSortingButton, {})] }) })] })] })] }));
|
|
328
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: filterModal.onOpen, "aria-label": "filter", ...props })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: filterModal.onOpen, ...props, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: filterModal.isOpen, onClose: filterModal.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "1rem", children: [jsxRuntime.jsx(TableFilter, {}), jsxRuntime.jsx(ResetFilteringButton, { text: resetText })] }) }), jsxRuntime.jsx(react$1.ModalFooter, { children: jsxRuntime.jsx(react$1.Button, { onClick: filterModal.onClose, children: closeText }) })] })] })] }));
|
|
428
329
|
};
|
|
429
330
|
|
|
430
331
|
const TableViewer = () => {
|
|
@@ -442,33 +343,23 @@ const EditViewButton = ({ text, icon = jsxRuntime.jsx(io.IoMdEye, {}), title = "
|
|
|
442
343
|
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: viewModel.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: viewModel.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: viewModel.isOpen, onClose: viewModel.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { padding: "0 0 1rem 0", children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsx(TableViewer, {}) })] })] })] }));
|
|
443
344
|
};
|
|
444
345
|
|
|
445
|
-
const GlobalFilter = () => {
|
|
346
|
+
const GlobalFilter = ({ icon = md.MdSearch }) => {
|
|
446
347
|
const { globalFilter, setGlobalFilter } = useDataTable();
|
|
447
|
-
return (jsxRuntime.jsx(react$1.Input, { value: globalFilter, onChange: (e) => {
|
|
448
|
-
|
|
449
|
-
|
|
348
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react$1.Box, { children: jsxRuntime.jsxs(react$1.InputGroup, { children: [jsxRuntime.jsx(react$1.InputLeftElement, { pointerEvents: "none", children: jsxRuntime.jsx(react$1.Icon, { as: icon, color: "gray.300" }) }), jsxRuntime.jsx(react$1.Input, { value: globalFilter, onChange: (e) => {
|
|
349
|
+
setGlobalFilter(e.target.value);
|
|
350
|
+
} })] }) }) }));
|
|
450
351
|
};
|
|
451
352
|
|
|
452
353
|
const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
|
|
453
|
-
const { table } =
|
|
354
|
+
const { table } = useDataTable();
|
|
454
355
|
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, {}), gap: "0.5rem", children: table.getState().pagination.pageSize }), jsxRuntime.jsx(react$1.MenuList, { children: pageSizes.map((pageSize) => (jsxRuntime.jsx(react$1.MenuItem, { onClick: () => {
|
|
455
356
|
table.setPageSize(Number(pageSize));
|
|
456
357
|
}, children: pageSize }))) })] }) }));
|
|
457
358
|
};
|
|
458
359
|
|
|
459
|
-
const
|
|
360
|
+
const RowCountText = () => {
|
|
460
361
|
const { table } = react.useContext(TableContext);
|
|
461
|
-
return
|
|
462
|
-
table.resetRowSelection();
|
|
463
|
-
}, children: text }));
|
|
464
|
-
};
|
|
465
|
-
|
|
466
|
-
const Table = ({ children, showLoading = false, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), ...props }) => {
|
|
467
|
-
const { table, loading } = useDataTable();
|
|
468
|
-
if (showLoading) {
|
|
469
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [loading && loadingComponent, !loading && (jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }))] }));
|
|
470
|
-
}
|
|
471
|
-
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
|
|
362
|
+
return jsxRuntime.jsx(react$1.Text, { children: table.getRowCount() });
|
|
472
363
|
};
|
|
473
364
|
|
|
474
365
|
const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
@@ -520,22 +411,6 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
|
|
|
520
411
|
onChange: row.getToggleSelectedHandler() }) }))] }));
|
|
521
412
|
};
|
|
522
413
|
|
|
523
|
-
const TableCardContainer = ({ children, ...props }) => {
|
|
524
|
-
return (jsxRuntime.jsx(react$1.Grid, { gridTemplateColumns: ["1fr", "1fr 1fr", "1fr 1fr 1fr"], gap: "0.5rem", ...props, children: children }));
|
|
525
|
-
};
|
|
526
|
-
|
|
527
|
-
const TableCards = ({}) => {
|
|
528
|
-
const { table } = react.useContext(TableContext);
|
|
529
|
-
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getRowModel().rows.map((row) => {
|
|
530
|
-
return (jsxRuntime.jsx(react$1.Card, { children: jsxRuntime.jsxs(react$1.CardBody, { display: "flex", flexFlow: "column", gap: "0.5rem", children: [jsxRuntime.jsx(react$1.Checkbox, { isChecked: row.getIsSelected(),
|
|
531
|
-
disabled: !row.getCanSelect(),
|
|
532
|
-
// indeterminate: row.getIsSomeSelected(),
|
|
533
|
-
onChange: row.getToggleSelectedHandler() }), row.getVisibleCells().map((cell) => {
|
|
534
|
-
return (jsxRuntime.jsx(react$1.Box, { children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }));
|
|
535
|
-
})] }) }, crypto.randomUUID()));
|
|
536
|
-
}) }));
|
|
537
|
-
};
|
|
538
|
-
|
|
539
414
|
const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
540
415
|
const table = useDataTable().table;
|
|
541
416
|
const SELECTION_BOX_WIDTH = 20;
|
|
@@ -655,6 +530,147 @@ const TablePagination = ({}) => {
|
|
|
655
530
|
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, {}) })] }));
|
|
656
531
|
};
|
|
657
532
|
|
|
533
|
+
const Table = ({ children, showLoading = false, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), ...props }) => {
|
|
534
|
+
const { table, loading } = useDataTable();
|
|
535
|
+
if (showLoading) {
|
|
536
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [loading && loadingComponent, !loading && (jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }))] }));
|
|
537
|
+
}
|
|
538
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
|
|
539
|
+
};
|
|
540
|
+
|
|
541
|
+
const DefaultTable = ({ totalText = "Total:" }) => {
|
|
542
|
+
return (jsxRuntime.jsxs(react$1.Grid, { templateRows: "auto 1fr auto", templateColumns: "1fr 1fr", children: [jsxRuntime.jsxs(react$1.Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsxRuntime.jsx(react$1.Box, { children: jsxRuntime.jsx(EditViewButton, { text: "View" }) }), jsxRuntime.jsxs(react$1.Flex, { gap: "1rem", justifySelf: "end", children: [jsxRuntime.jsx(GlobalFilter, {}), jsxRuntime.jsx(EditFilterButton, { text: "Advanced Filter" })] })] }), jsxRuntime.jsx(react$1.Flex, { overflow: "auto", gridColumn: "1 / span 2", justifyContent: "center", children: jsxRuntime.jsxs(Table, { variant: "striped", alignSelf: "center", children: [jsxRuntime.jsx(TableHeader, { canResize: true }), jsxRuntime.jsx(TableBody, {}), jsxRuntime.jsx(TableFooter, {})] }) }), jsxRuntime.jsxs(react$1.Flex, { gap: "1rem", alignItems: "center", children: [jsxRuntime.jsx(PageSizeControl, { pageSizes: [25, 50] }), jsxRuntime.jsxs(react$1.Flex, { children: [jsxRuntime.jsx(react$1.Text, { paddingRight: "0.5rem", children: totalText }), jsxRuntime.jsx(RowCountText, {})] })] }), jsxRuntime.jsx(react$1.Box, { justifySelf: "end", children: jsxRuntime.jsx(TablePagination, {}) })] }));
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
const DensityToggleButton = ({ text, icon = jsxRuntime.jsx(ai.AiOutlineColumnWidth, {}), }) => {
|
|
546
|
+
const { table } = useDataTable();
|
|
547
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: icon, onClick: () => {
|
|
548
|
+
table.toggleDensity();
|
|
549
|
+
} })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
|
|
550
|
+
table.toggleDensity();
|
|
551
|
+
}, children: text }))] }));
|
|
552
|
+
};
|
|
553
|
+
|
|
554
|
+
const ColumnOrderChanger = ({ columns }) => {
|
|
555
|
+
const [order, setOrder] = react.useState([]);
|
|
556
|
+
const [originalOrder, setOriginalOrder] = react.useState([]);
|
|
557
|
+
const { table } = useDataTable();
|
|
558
|
+
const handleChangeOrder = (startIndex, endIndex) => {
|
|
559
|
+
const newOrder = Array.from(order);
|
|
560
|
+
const [removed] = newOrder.splice(startIndex, 1);
|
|
561
|
+
newOrder.splice(endIndex, 0, removed);
|
|
562
|
+
setOrder(newOrder);
|
|
563
|
+
};
|
|
564
|
+
react.useEffect(() => {
|
|
565
|
+
setOrder(columns);
|
|
566
|
+
}, [columns]);
|
|
567
|
+
react.useEffect(() => {
|
|
568
|
+
if (originalOrder.length > 0) {
|
|
569
|
+
return;
|
|
570
|
+
}
|
|
571
|
+
if (columns.length <= 0) {
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
setOriginalOrder(columns);
|
|
575
|
+
}, [columns]);
|
|
576
|
+
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((columnId, index) => (jsxRuntime.jsxs(react$1.Flex, { gap: "0.5rem", alignItems: "center", justifyContent: "space-between", children: [jsxRuntime.jsx(react$1.IconButton, { onClick: () => {
|
|
577
|
+
const prevIndex = index - 1;
|
|
578
|
+
if (prevIndex >= 0) {
|
|
579
|
+
handleChangeOrder(index, prevIndex);
|
|
580
|
+
}
|
|
581
|
+
}, disabled: index === 0, "aria-label": "", children: jsxRuntime.jsx(md.MdArrowUpward, {}) }), table
|
|
582
|
+
.getAllFlatColumns()
|
|
583
|
+
.filter((column) => {
|
|
584
|
+
return column.id === columnId;
|
|
585
|
+
})
|
|
586
|
+
.map((column) => {
|
|
587
|
+
const displayName = column.columnDef.meta === undefined
|
|
588
|
+
? column.id
|
|
589
|
+
: column.columnDef.meta.displayName;
|
|
590
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: displayName });
|
|
591
|
+
}), jsxRuntime.jsx(react$1.IconButton, { onClick: () => {
|
|
592
|
+
const nextIndex = index + 1;
|
|
593
|
+
if (nextIndex < order.length) {
|
|
594
|
+
handleChangeOrder(index, nextIndex);
|
|
595
|
+
}
|
|
596
|
+
}, disabled: index === order.length - 1, "aria-label": "", children: jsxRuntime.jsx(md.MdArrowDownward, {}) })] }, columnId))) }), jsxRuntime.jsxs(react$1.Flex, { gap: "0.25rem", children: [jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
597
|
+
table.setColumnOrder(order);
|
|
598
|
+
}, children: "Apply" }), jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
599
|
+
table.setColumnOrder(originalOrder);
|
|
600
|
+
}, children: "Reset" })] })] }));
|
|
601
|
+
};
|
|
602
|
+
const TableOrderer = () => {
|
|
603
|
+
const { table } = useDataTable();
|
|
604
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
|
|
605
|
+
};
|
|
606
|
+
|
|
607
|
+
const EditOrderButton = ({ text, icon = jsxRuntime.jsx(md.MdOutlineMoveDown, {}), title = "Change Order", }) => {
|
|
608
|
+
const orderModal = react$1.useDisclosure();
|
|
609
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: orderModal.onOpen, "aria-label": "change order" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: orderModal.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: orderModal.isOpen, onClose: orderModal.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { padding: "0 0 1rem 0", children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsx(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: jsxRuntime.jsx(TableOrderer, {}) }) })] })] })] }));
|
|
610
|
+
};
|
|
611
|
+
|
|
612
|
+
const ResetSortingButton = ({ text = "Reset Sorting", }) => {
|
|
613
|
+
const { table } = useDataTable();
|
|
614
|
+
return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
615
|
+
table.resetSorting();
|
|
616
|
+
}, children: text }));
|
|
617
|
+
};
|
|
618
|
+
|
|
619
|
+
const TableSorter = () => {
|
|
620
|
+
const { table } = useDataTable();
|
|
621
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsx(jsxRuntime.Fragment, { children: headerGroup.headers.map((header) => {
|
|
622
|
+
const displayName = header.column.columnDef.meta === undefined
|
|
623
|
+
? header.column.id
|
|
624
|
+
: header.column.columnDef.meta.displayName;
|
|
625
|
+
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: displayName }), jsxRuntime.jsxs(react$1.Button, { variant: "ghost", onClick: (e) => {
|
|
626
|
+
header.column.toggleSorting();
|
|
627
|
+
}, children: [header.column.getIsSorted() === false && (
|
|
628
|
+
// <Text>To No sort</Text>
|
|
629
|
+
jsxRuntime.jsx(icons.UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
|
|
630
|
+
// <Text>To asc</Text>
|
|
631
|
+
jsxRuntime.jsx(icons.ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
|
|
632
|
+
// <Text>To desc</Text>
|
|
633
|
+
jsxRuntime.jsx(icons.ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsxRuntime.jsx(react$1.Button, { onClick: (e) => {
|
|
634
|
+
header.column.clearSorting();
|
|
635
|
+
}, children: jsxRuntime.jsx(icons.CloseIcon, {}) }))] })) }));
|
|
636
|
+
}) }))) }));
|
|
637
|
+
};
|
|
638
|
+
|
|
639
|
+
const EditSortingButton = ({ text, icon = jsxRuntime.jsx(md.MdOutlineSort, {}), title = "Edit Sorting", }) => {
|
|
640
|
+
const sortingModal = react$1.useDisclosure();
|
|
641
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: sortingModal.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: sortingModal.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: sortingModal.isOpen, onClose: sortingModal.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { padding: "0 0 1rem 0", children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(TableSorter, {}), jsxRuntime.jsx(ResetSortingButton, {})] }) })] })] })] }));
|
|
642
|
+
};
|
|
643
|
+
|
|
644
|
+
const ResetSelectionButton = ({ text = "Reset Selection", }) => {
|
|
645
|
+
const { table } = useDataTable();
|
|
646
|
+
return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
647
|
+
table.resetRowSelection();
|
|
648
|
+
}, children: text }));
|
|
649
|
+
};
|
|
650
|
+
|
|
651
|
+
const TableCardContainer = ({ children, ...props }) => {
|
|
652
|
+
return (jsxRuntime.jsx(react$1.Grid, { gridTemplateColumns: ["1fr", "1fr 1fr", "1fr 1fr 1fr"], gap: "0.5rem", ...props, children: children }));
|
|
653
|
+
};
|
|
654
|
+
|
|
655
|
+
const TableCards = ({}) => {
|
|
656
|
+
const { table } = react.useContext(TableContext);
|
|
657
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getRowModel().rows.map((row) => {
|
|
658
|
+
return (jsxRuntime.jsx(react$1.Card, { children: jsxRuntime.jsxs(react$1.CardBody, { display: "flex", flexFlow: "column", gap: "0.5rem", children: [jsxRuntime.jsx(react$1.Checkbox, { isChecked: row.getIsSelected(),
|
|
659
|
+
disabled: !row.getCanSelect(),
|
|
660
|
+
// indeterminate: row.getIsSomeSelected(),
|
|
661
|
+
onChange: row.getToggleSelectedHandler() }), row.getVisibleCells().map((cell) => {
|
|
662
|
+
return (jsxRuntime.jsx(react$1.Box, { children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }));
|
|
663
|
+
})] }) }, crypto.randomUUID()));
|
|
664
|
+
}) }));
|
|
665
|
+
};
|
|
666
|
+
|
|
667
|
+
const TableComponentRenderer = ({ render = () => {
|
|
668
|
+
throw Error("Not Implemented");
|
|
669
|
+
}, }) => {
|
|
670
|
+
const { table } = useDataTable();
|
|
671
|
+
return render(table);
|
|
672
|
+
};
|
|
673
|
+
|
|
658
674
|
const SelectAllRowsToggle = ({ selectAllIcon = jsxRuntime.jsx(md.MdOutlineChecklist, {}), clearAllIcon = jsxRuntime.jsx(md.MdClear, {}), selectAllText, clearAllText, }) => {
|
|
659
675
|
const { table } = react.useContext(TableContext);
|
|
660
676
|
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!selectAllText === false && (jsxRuntime.jsx(react$1.IconButton, { icon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? clearAllText : selectAllText, onClick: (event) => {
|
|
@@ -680,6 +696,7 @@ const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipP
|
|
|
680
696
|
|
|
681
697
|
exports.DataTable = DataTable;
|
|
682
698
|
exports.DataTableServer = DataTableServer;
|
|
699
|
+
exports.DefaultTable = DefaultTable;
|
|
683
700
|
exports.DensityToggleButton = DensityToggleButton;
|
|
684
701
|
exports.EditFilterButton = EditFilterButton;
|
|
685
702
|
exports.EditOrderButton = EditOrderButton;
|
|
@@ -690,10 +707,12 @@ exports.PageSizeControl = PageSizeControl;
|
|
|
690
707
|
exports.ResetFilteringButton = ResetFilteringButton;
|
|
691
708
|
exports.ResetSelectionButton = ResetSelectionButton;
|
|
692
709
|
exports.ResetSortingButton = ResetSortingButton;
|
|
710
|
+
exports.RowCountText = RowCountText;
|
|
693
711
|
exports.Table = Table;
|
|
694
712
|
exports.TableBody = TableBody;
|
|
695
713
|
exports.TableCardContainer = TableCardContainer;
|
|
696
714
|
exports.TableCards = TableCards;
|
|
715
|
+
exports.TableComponentRenderer = TableComponentRenderer;
|
|
697
716
|
exports.TableFilter = TableFilter;
|
|
698
717
|
exports.TableFooter = TableFooter;
|
|
699
718
|
exports.TableHeader = TableHeader;
|
package/dist/index.mjs
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { jsx,
|
|
1
|
+
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { makeStateUpdater, functionalUpdate, useReactTable, getCoreRowModel, getFilteredRowModel, getSortedRowModel, getPaginationRowModel, flexRender } from '@tanstack/react-table';
|
|
3
3
|
import { createContext, useState, useEffect, useContext } from 'react';
|
|
4
4
|
import { rankItem } from '@tanstack/match-sorter-utils';
|
|
5
5
|
import axios from 'axios';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { MdFilterAlt, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdFilterListAlt, MdPushPin, MdCancel, MdSort, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdOutlineChecklist, MdClear } from 'react-icons/md';
|
|
9
|
-
import { UpDownIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon } from '@chakra-ui/icons';
|
|
6
|
+
import { Button, Box, Text, Input, useDisclosure, IconButton, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, Flex, ModalFooter, Switch, InputGroup, InputLeftElement, Icon, Menu, MenuButton, MenuList, MenuItem, FormLabel, Checkbox, Tfoot, Tr as Tr$1, Th, Thead, Portal, ButtonGroup, Table as Table$1, Grid, Card, CardBody, Tooltip } from '@chakra-ui/react';
|
|
7
|
+
import { MdFilterAlt, MdSearch, MdFilterListAlt, MdPushPin, MdCancel, MdSort, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdOutlineChecklist, MdClear } from 'react-icons/md';
|
|
10
8
|
import { IoMdEye, IoMdClose, IoMdCheckbox } from 'react-icons/io';
|
|
9
|
+
import { ChevronDownIcon, ChevronUpIcon, UpDownIcon, CloseIcon } from '@chakra-ui/icons';
|
|
11
10
|
import { Tbody, Tr, Td } from '@chakra-ui/table';
|
|
11
|
+
import { AiOutlineColumnWidth } from 'react-icons/ai';
|
|
12
12
|
|
|
13
13
|
const TableContext = createContext({
|
|
14
14
|
table: {},
|
|
@@ -295,27 +295,18 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
295
295
|
}, children: children }));
|
|
296
296
|
};
|
|
297
297
|
|
|
298
|
-
const
|
|
299
|
-
const { table } = useContext(TableContext);
|
|
300
|
-
return
|
|
301
|
-
table.toggleDensity();
|
|
302
|
-
} })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
|
|
303
|
-
table.toggleDensity();
|
|
304
|
-
}, children: text }))] }));
|
|
298
|
+
const useDataTable = () => {
|
|
299
|
+
const { table, refreshData, globalFilter, setGlobalFilter, loading } = useContext(TableContext);
|
|
300
|
+
return { table, refreshData, globalFilter, setGlobalFilter, loading };
|
|
305
301
|
};
|
|
306
302
|
|
|
307
303
|
const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
|
|
308
|
-
const { table } =
|
|
304
|
+
const { table } = useDataTable();
|
|
309
305
|
return (jsx(Button, { onClick: () => {
|
|
310
306
|
table.resetColumnFilters();
|
|
311
307
|
}, children: text }));
|
|
312
308
|
};
|
|
313
309
|
|
|
314
|
-
const useDataTable = () => {
|
|
315
|
-
const { table, refreshData, globalFilter, setGlobalFilter, loading } = useContext(TableContext);
|
|
316
|
-
return { table, refreshData, globalFilter, setGlobalFilter, loading };
|
|
317
|
-
};
|
|
318
|
-
|
|
319
310
|
const TableFilter = () => {
|
|
320
311
|
const { table } = useDataTable();
|
|
321
312
|
return (jsx(Fragment, { children: table.getLeafHeaders().map((header) => {
|
|
@@ -330,99 +321,9 @@ const TableFilter = () => {
|
|
|
330
321
|
}) }));
|
|
331
322
|
};
|
|
332
323
|
|
|
333
|
-
const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsx(MdFilterAlt, {}), }) => {
|
|
324
|
+
const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsx(MdFilterAlt, {}), ...props }) => {
|
|
334
325
|
const filterModal = useDisclosure();
|
|
335
|
-
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: filterModal.onOpen, "aria-label": "filter" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: filterModal.onOpen, 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 }) })] })] })] }));
|
|
336
|
-
};
|
|
337
|
-
|
|
338
|
-
const ColumnOrderChanger = ({ columns }) => {
|
|
339
|
-
const [order, setOrder] = useState([]);
|
|
340
|
-
const [originalOrder, setOriginalOrder] = useState([]);
|
|
341
|
-
const { table } = useDataTable();
|
|
342
|
-
const handleChangeOrder = (startIndex, endIndex) => {
|
|
343
|
-
const newOrder = Array.from(order);
|
|
344
|
-
const [removed] = newOrder.splice(startIndex, 1);
|
|
345
|
-
newOrder.splice(endIndex, 0, removed);
|
|
346
|
-
setOrder(newOrder);
|
|
347
|
-
};
|
|
348
|
-
useEffect(() => {
|
|
349
|
-
setOrder(columns);
|
|
350
|
-
}, [columns]);
|
|
351
|
-
useEffect(() => {
|
|
352
|
-
if (originalOrder.length > 0) {
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
if (columns.length <= 0) {
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
setOriginalOrder(columns);
|
|
359
|
-
}, [columns]);
|
|
360
|
-
return (jsxs(Flex, { gap: "0.5rem", flexFlow: "column", children: [jsx(Flex, { gap: "0.5rem", flexFlow: "column", children: order.map((columnId, index) => (jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifyContent: "space-between", children: [jsx(IconButton, { onClick: () => {
|
|
361
|
-
const prevIndex = index - 1;
|
|
362
|
-
if (prevIndex >= 0) {
|
|
363
|
-
handleChangeOrder(index, prevIndex);
|
|
364
|
-
}
|
|
365
|
-
}, disabled: index === 0, "aria-label": "", children: jsx(MdArrowUpward, {}) }), table
|
|
366
|
-
.getAllFlatColumns()
|
|
367
|
-
.filter((column) => {
|
|
368
|
-
return column.id === columnId;
|
|
369
|
-
})
|
|
370
|
-
.map((column) => {
|
|
371
|
-
const displayName = column.columnDef.meta === undefined
|
|
372
|
-
? column.id
|
|
373
|
-
: column.columnDef.meta.displayName;
|
|
374
|
-
return jsx(Fragment, { children: displayName });
|
|
375
|
-
}), jsx(IconButton, { onClick: () => {
|
|
376
|
-
const nextIndex = index + 1;
|
|
377
|
-
if (nextIndex < order.length) {
|
|
378
|
-
handleChangeOrder(index, nextIndex);
|
|
379
|
-
}
|
|
380
|
-
}, disabled: index === order.length - 1, "aria-label": "", children: jsx(MdArrowDownward, {}) })] }, columnId))) }), jsxs(Flex, { gap: "0.25rem", children: [jsx(Button, { onClick: () => {
|
|
381
|
-
table.setColumnOrder(order);
|
|
382
|
-
}, children: "Apply" }), jsx(Button, { onClick: () => {
|
|
383
|
-
table.setColumnOrder(originalOrder);
|
|
384
|
-
}, children: "Reset" })] })] }));
|
|
385
|
-
};
|
|
386
|
-
const TableOrderer = () => {
|
|
387
|
-
const { table } = useDataTable();
|
|
388
|
-
return (jsx(Fragment, { children: jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
|
|
389
|
-
};
|
|
390
|
-
|
|
391
|
-
const EditOrderButton = ({ text, icon = jsx(MdOutlineMoveDown, {}), title = "Change Order", }) => {
|
|
392
|
-
const orderModal = useDisclosure();
|
|
393
|
-
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, {}) }) })] })] })] }));
|
|
394
|
-
};
|
|
395
|
-
|
|
396
|
-
const ResetSortingButton = ({ text = "Reset Sorting", }) => {
|
|
397
|
-
const { table } = useContext(TableContext);
|
|
398
|
-
return (jsx(Button, { onClick: () => {
|
|
399
|
-
table.resetSorting();
|
|
400
|
-
}, children: text }));
|
|
401
|
-
};
|
|
402
|
-
|
|
403
|
-
const TableSorter = () => {
|
|
404
|
-
const { table } = useDataTable();
|
|
405
|
-
return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
|
|
406
|
-
const displayName = header.column.columnDef.meta === undefined
|
|
407
|
-
? header.column.id
|
|
408
|
-
: header.column.columnDef.meta.displayName;
|
|
409
|
-
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) => {
|
|
410
|
-
header.column.toggleSorting();
|
|
411
|
-
}, children: [header.column.getIsSorted() === false && (
|
|
412
|
-
// <Text>To No sort</Text>
|
|
413
|
-
jsx(UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
|
|
414
|
-
// <Text>To asc</Text>
|
|
415
|
-
jsx(ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
|
|
416
|
-
// <Text>To desc</Text>
|
|
417
|
-
jsx(ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: (e) => {
|
|
418
|
-
header.column.clearSorting();
|
|
419
|
-
}, children: jsx(CloseIcon, {}) }))] })) }));
|
|
420
|
-
}) }))) }));
|
|
421
|
-
};
|
|
422
|
-
|
|
423
|
-
const EditSortingButton = ({ text, icon = jsx(MdOutlineSort, {}), title = "Edit Sorting", }) => {
|
|
424
|
-
const sortingModal = useDisclosure();
|
|
425
|
-
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, {})] }) })] })] })] }));
|
|
326
|
+
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 }) })] })] })] }));
|
|
426
327
|
};
|
|
427
328
|
|
|
428
329
|
const TableViewer = () => {
|
|
@@ -440,33 +341,23 @@ const EditViewButton = ({ text, icon = jsx(IoMdEye, {}), title = "Edit View", })
|
|
|
440
341
|
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, {}) })] })] })] }));
|
|
441
342
|
};
|
|
442
343
|
|
|
443
|
-
const GlobalFilter = () => {
|
|
344
|
+
const GlobalFilter = ({ icon = MdSearch }) => {
|
|
444
345
|
const { globalFilter, setGlobalFilter } = useDataTable();
|
|
445
|
-
return (jsx(Input, { value: globalFilter, onChange: (e) => {
|
|
446
|
-
|
|
447
|
-
|
|
346
|
+
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) => {
|
|
347
|
+
setGlobalFilter(e.target.value);
|
|
348
|
+
} })] }) }) }));
|
|
448
349
|
};
|
|
449
350
|
|
|
450
351
|
const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
|
|
451
|
-
const { table } =
|
|
352
|
+
const { table } = useDataTable();
|
|
452
353
|
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: () => {
|
|
453
354
|
table.setPageSize(Number(pageSize));
|
|
454
355
|
}, children: pageSize }))) })] }) }));
|
|
455
356
|
};
|
|
456
357
|
|
|
457
|
-
const
|
|
358
|
+
const RowCountText = () => {
|
|
458
359
|
const { table } = useContext(TableContext);
|
|
459
|
-
return
|
|
460
|
-
table.resetRowSelection();
|
|
461
|
-
}, children: text }));
|
|
462
|
-
};
|
|
463
|
-
|
|
464
|
-
const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
|
|
465
|
-
const { table, loading } = useDataTable();
|
|
466
|
-
if (showLoading) {
|
|
467
|
-
return (jsxs(Fragment, { children: [loading && loadingComponent, !loading && (jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }))] }));
|
|
468
|
-
}
|
|
469
|
-
return (jsx(Fragment, { children: jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
|
|
360
|
+
return jsx(Text, { children: table.getRowCount() });
|
|
470
361
|
};
|
|
471
362
|
|
|
472
363
|
const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
@@ -518,22 +409,6 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
|
|
|
518
409
|
onChange: row.getToggleSelectedHandler() }) }))] }));
|
|
519
410
|
};
|
|
520
411
|
|
|
521
|
-
const TableCardContainer = ({ children, ...props }) => {
|
|
522
|
-
return (jsx(Grid, { gridTemplateColumns: ["1fr", "1fr 1fr", "1fr 1fr 1fr"], gap: "0.5rem", ...props, children: children }));
|
|
523
|
-
};
|
|
524
|
-
|
|
525
|
-
const TableCards = ({}) => {
|
|
526
|
-
const { table } = useContext(TableContext);
|
|
527
|
-
return (jsx(Fragment, { children: table.getRowModel().rows.map((row) => {
|
|
528
|
-
return (jsx(Card, { children: jsxs(CardBody, { display: "flex", flexFlow: "column", gap: "0.5rem", children: [jsx(Checkbox, { isChecked: row.getIsSelected(),
|
|
529
|
-
disabled: !row.getCanSelect(),
|
|
530
|
-
// indeterminate: row.getIsSomeSelected(),
|
|
531
|
-
onChange: row.getToggleSelectedHandler() }), row.getVisibleCells().map((cell) => {
|
|
532
|
-
return (jsx(Box, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }));
|
|
533
|
-
})] }) }, crypto.randomUUID()));
|
|
534
|
-
}) }));
|
|
535
|
-
};
|
|
536
|
-
|
|
537
412
|
const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
538
413
|
const table = useDataTable().table;
|
|
539
414
|
const SELECTION_BOX_WIDTH = 20;
|
|
@@ -653,6 +528,147 @@ const TablePagination = ({}) => {
|
|
|
653
528
|
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, {}) })] }));
|
|
654
529
|
};
|
|
655
530
|
|
|
531
|
+
const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
|
|
532
|
+
const { table, loading } = useDataTable();
|
|
533
|
+
if (showLoading) {
|
|
534
|
+
return (jsxs(Fragment, { children: [loading && loadingComponent, !loading && (jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }))] }));
|
|
535
|
+
}
|
|
536
|
+
return (jsx(Fragment, { children: jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
|
|
537
|
+
};
|
|
538
|
+
|
|
539
|
+
const DefaultTable = ({ totalText = "Total:" }) => {
|
|
540
|
+
return (jsxs(Grid, { templateRows: "auto 1fr auto", templateColumns: "1fr 1fr", children: [jsxs(Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsx(Box, { children: jsx(EditViewButton, { text: "View" }) }), jsxs(Flex, { gap: "1rem", justifySelf: "end", children: [jsx(GlobalFilter, {}), jsx(EditFilterButton, { text: "Advanced Filter" })] })] }), jsx(Flex, { overflow: "auto", gridColumn: "1 / span 2", justifyContent: "center", children: jsxs(Table, { variant: "striped", alignSelf: "center", children: [jsx(TableHeader, { canResize: true }), jsx(TableBody, {}), jsx(TableFooter, {})] }) }), jsxs(Flex, { gap: "1rem", alignItems: "center", children: [jsx(PageSizeControl, { pageSizes: [25, 50] }), jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: totalText }), jsx(RowCountText, {})] })] }), jsx(Box, { justifySelf: "end", children: jsx(TablePagination, {}) })] }));
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
const DensityToggleButton = ({ text, icon = jsx(AiOutlineColumnWidth, {}), }) => {
|
|
544
|
+
const { table } = useDataTable();
|
|
545
|
+
return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: icon, onClick: () => {
|
|
546
|
+
table.toggleDensity();
|
|
547
|
+
} })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
|
|
548
|
+
table.toggleDensity();
|
|
549
|
+
}, children: text }))] }));
|
|
550
|
+
};
|
|
551
|
+
|
|
552
|
+
const ColumnOrderChanger = ({ columns }) => {
|
|
553
|
+
const [order, setOrder] = useState([]);
|
|
554
|
+
const [originalOrder, setOriginalOrder] = useState([]);
|
|
555
|
+
const { table } = useDataTable();
|
|
556
|
+
const handleChangeOrder = (startIndex, endIndex) => {
|
|
557
|
+
const newOrder = Array.from(order);
|
|
558
|
+
const [removed] = newOrder.splice(startIndex, 1);
|
|
559
|
+
newOrder.splice(endIndex, 0, removed);
|
|
560
|
+
setOrder(newOrder);
|
|
561
|
+
};
|
|
562
|
+
useEffect(() => {
|
|
563
|
+
setOrder(columns);
|
|
564
|
+
}, [columns]);
|
|
565
|
+
useEffect(() => {
|
|
566
|
+
if (originalOrder.length > 0) {
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
if (columns.length <= 0) {
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
setOriginalOrder(columns);
|
|
573
|
+
}, [columns]);
|
|
574
|
+
return (jsxs(Flex, { gap: "0.5rem", flexFlow: "column", children: [jsx(Flex, { gap: "0.5rem", flexFlow: "column", children: order.map((columnId, index) => (jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifyContent: "space-between", children: [jsx(IconButton, { onClick: () => {
|
|
575
|
+
const prevIndex = index - 1;
|
|
576
|
+
if (prevIndex >= 0) {
|
|
577
|
+
handleChangeOrder(index, prevIndex);
|
|
578
|
+
}
|
|
579
|
+
}, disabled: index === 0, "aria-label": "", children: jsx(MdArrowUpward, {}) }), table
|
|
580
|
+
.getAllFlatColumns()
|
|
581
|
+
.filter((column) => {
|
|
582
|
+
return column.id === columnId;
|
|
583
|
+
})
|
|
584
|
+
.map((column) => {
|
|
585
|
+
const displayName = column.columnDef.meta === undefined
|
|
586
|
+
? column.id
|
|
587
|
+
: column.columnDef.meta.displayName;
|
|
588
|
+
return jsx(Fragment, { children: displayName });
|
|
589
|
+
}), jsx(IconButton, { onClick: () => {
|
|
590
|
+
const nextIndex = index + 1;
|
|
591
|
+
if (nextIndex < order.length) {
|
|
592
|
+
handleChangeOrder(index, nextIndex);
|
|
593
|
+
}
|
|
594
|
+
}, disabled: index === order.length - 1, "aria-label": "", children: jsx(MdArrowDownward, {}) })] }, columnId))) }), jsxs(Flex, { gap: "0.25rem", children: [jsx(Button, { onClick: () => {
|
|
595
|
+
table.setColumnOrder(order);
|
|
596
|
+
}, children: "Apply" }), jsx(Button, { onClick: () => {
|
|
597
|
+
table.setColumnOrder(originalOrder);
|
|
598
|
+
}, children: "Reset" })] })] }));
|
|
599
|
+
};
|
|
600
|
+
const TableOrderer = () => {
|
|
601
|
+
const { table } = useDataTable();
|
|
602
|
+
return (jsx(Fragment, { children: jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
|
|
603
|
+
};
|
|
604
|
+
|
|
605
|
+
const EditOrderButton = ({ text, icon = jsx(MdOutlineMoveDown, {}), title = "Change Order", }) => {
|
|
606
|
+
const orderModal = useDisclosure();
|
|
607
|
+
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, {}) }) })] })] })] }));
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
const ResetSortingButton = ({ text = "Reset Sorting", }) => {
|
|
611
|
+
const { table } = useDataTable();
|
|
612
|
+
return (jsx(Button, { onClick: () => {
|
|
613
|
+
table.resetSorting();
|
|
614
|
+
}, children: text }));
|
|
615
|
+
};
|
|
616
|
+
|
|
617
|
+
const TableSorter = () => {
|
|
618
|
+
const { table } = useDataTable();
|
|
619
|
+
return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
|
|
620
|
+
const displayName = header.column.columnDef.meta === undefined
|
|
621
|
+
? header.column.id
|
|
622
|
+
: header.column.columnDef.meta.displayName;
|
|
623
|
+
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) => {
|
|
624
|
+
header.column.toggleSorting();
|
|
625
|
+
}, children: [header.column.getIsSorted() === false && (
|
|
626
|
+
// <Text>To No sort</Text>
|
|
627
|
+
jsx(UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
|
|
628
|
+
// <Text>To asc</Text>
|
|
629
|
+
jsx(ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
|
|
630
|
+
// <Text>To desc</Text>
|
|
631
|
+
jsx(ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: (e) => {
|
|
632
|
+
header.column.clearSorting();
|
|
633
|
+
}, children: jsx(CloseIcon, {}) }))] })) }));
|
|
634
|
+
}) }))) }));
|
|
635
|
+
};
|
|
636
|
+
|
|
637
|
+
const EditSortingButton = ({ text, icon = jsx(MdOutlineSort, {}), title = "Edit Sorting", }) => {
|
|
638
|
+
const sortingModal = useDisclosure();
|
|
639
|
+
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, {})] }) })] })] })] }));
|
|
640
|
+
};
|
|
641
|
+
|
|
642
|
+
const ResetSelectionButton = ({ text = "Reset Selection", }) => {
|
|
643
|
+
const { table } = useDataTable();
|
|
644
|
+
return (jsx(Button, { onClick: () => {
|
|
645
|
+
table.resetRowSelection();
|
|
646
|
+
}, children: text }));
|
|
647
|
+
};
|
|
648
|
+
|
|
649
|
+
const TableCardContainer = ({ children, ...props }) => {
|
|
650
|
+
return (jsx(Grid, { gridTemplateColumns: ["1fr", "1fr 1fr", "1fr 1fr 1fr"], gap: "0.5rem", ...props, children: children }));
|
|
651
|
+
};
|
|
652
|
+
|
|
653
|
+
const TableCards = ({}) => {
|
|
654
|
+
const { table } = useContext(TableContext);
|
|
655
|
+
return (jsx(Fragment, { children: table.getRowModel().rows.map((row) => {
|
|
656
|
+
return (jsx(Card, { children: jsxs(CardBody, { display: "flex", flexFlow: "column", gap: "0.5rem", children: [jsx(Checkbox, { isChecked: row.getIsSelected(),
|
|
657
|
+
disabled: !row.getCanSelect(),
|
|
658
|
+
// indeterminate: row.getIsSomeSelected(),
|
|
659
|
+
onChange: row.getToggleSelectedHandler() }), row.getVisibleCells().map((cell) => {
|
|
660
|
+
return (jsx(Box, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }));
|
|
661
|
+
})] }) }, crypto.randomUUID()));
|
|
662
|
+
}) }));
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
const TableComponentRenderer = ({ render = () => {
|
|
666
|
+
throw Error("Not Implemented");
|
|
667
|
+
}, }) => {
|
|
668
|
+
const { table } = useDataTable();
|
|
669
|
+
return render(table);
|
|
670
|
+
};
|
|
671
|
+
|
|
656
672
|
const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText, clearAllText, }) => {
|
|
657
673
|
const { table } = useContext(TableContext);
|
|
658
674
|
return (jsxs(Fragment, { children: [!!selectAllText === false && (jsx(IconButton, { icon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? clearAllText : selectAllText, onClick: (event) => {
|
|
@@ -676,4 +692,4 @@ const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipP
|
|
|
676
692
|
return (jsx(Box, { padding: padding, children: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }));
|
|
677
693
|
};
|
|
678
694
|
|
|
679
|
-
export { DataTable, DataTableServer, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, GlobalFilter, PageSizeControl, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, Table, TableBody, TableCardContainer, TableCards, TableFilter, TableFooter, TableHeader, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, useDataFromUrl, useDataTable };
|
|
695
|
+
export { DataTable, DataTableServer, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, GlobalFilter, PageSizeControl, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponentRenderer, TableFilter, TableFooter, TableHeader, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, useDataFromUrl, useDataTable };
|
|
@@ -6,4 +6,4 @@ export interface EditFilterButtonProps {
|
|
|
6
6
|
resetText?: string;
|
|
7
7
|
icon?: React.ReactElement;
|
|
8
8
|
}
|
|
9
|
-
export declare const EditFilterButton: ({ text, title, closeText, resetText, icon, }: EditFilterButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare const EditFilterButton: ({ text, title, closeText, resetText, icon, ...props }: EditFilterButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const RowCountText: () => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { TableProps as ChakraTableProps } from "@chakra-ui/react";
|
|
1
2
|
import { ReactNode } from "react";
|
|
2
|
-
export interface TableProps {
|
|
3
|
+
export interface TableProps extends ChakraTableProps {
|
|
3
4
|
showLoading?: boolean;
|
|
4
5
|
loadingComponent?: JSX.Element;
|
|
5
6
|
children: ReactNode;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Table } from "@tanstack/react-table";
|
|
2
|
+
import React from "react";
|
|
3
|
+
export interface TableRendererProps<TData> {
|
|
4
|
+
render: (render: Table<TData>) => React.ReactElement;
|
|
5
|
+
}
|
|
6
|
+
export declare const TableComponentRenderer: <TData>({ render, }: TableRendererProps<TData>) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from "./components/DataTable";
|
|
2
2
|
export * from "./components/DataTableServer";
|
|
3
|
+
export * from "./components/DefaultTable";
|
|
3
4
|
export * from "./components/DensityToggleButton";
|
|
4
5
|
export * from "./components/EditFilterButton";
|
|
5
6
|
export * from "./components/EditOrderButton";
|
|
@@ -10,10 +11,12 @@ export * from "./components/PageSizeControl";
|
|
|
10
11
|
export * from "./components/ResetFilteringButton";
|
|
11
12
|
export * from "./components/ResetSelectionButton";
|
|
12
13
|
export * from "./components/ResetSortingButton";
|
|
14
|
+
export * from "./components/RowCountText";
|
|
13
15
|
export * from "./components/Table";
|
|
14
16
|
export * from "./components/TableBody";
|
|
15
17
|
export * from "./components/TableCardContainer";
|
|
16
18
|
export * from "./components/TableCards";
|
|
19
|
+
export * from "./components/TableComponentRenderer";
|
|
17
20
|
export * from "./components/TableFilter";
|
|
18
21
|
export * from "./components/TableFooter";
|
|
19
22
|
export * from "./components/TableHeader";
|