@bsol-oss/react-datatable5 1.0.39 → 1.0.41
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 +21 -6
- package/dist/index.js +151 -132
- package/dist/index.mjs +152 -136
- package/dist/types/components/DefaultTable.d.ts +4 -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 +4 -0
- package/package.json +2 -2
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,11 @@ 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, showFilter }: {
|
|
97
|
+
totalText?: string | undefined;
|
|
98
|
+
showFilter?: boolean | undefined;
|
|
99
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
100
|
+
|
|
95
101
|
interface DensityToggleButtonProps {
|
|
96
102
|
icon?: React$1.ReactElement;
|
|
97
103
|
text?: string;
|
|
@@ -105,7 +111,7 @@ interface EditFilterButtonProps {
|
|
|
105
111
|
resetText?: string;
|
|
106
112
|
icon?: React.ReactElement;
|
|
107
113
|
}
|
|
108
|
-
declare const EditFilterButton: ({ text, title, closeText, resetText, icon, }: EditFilterButtonProps) => react_jsx_runtime.JSX.Element;
|
|
114
|
+
declare const EditFilterButton: ({ text, title, closeText, resetText, icon, ...props }: EditFilterButtonProps) => react_jsx_runtime.JSX.Element;
|
|
109
115
|
|
|
110
116
|
interface EditOrderButtonProps {
|
|
111
117
|
title?: string;
|
|
@@ -128,7 +134,9 @@ interface EditViewButtonProps {
|
|
|
128
134
|
}
|
|
129
135
|
declare const EditViewButton: ({ text, icon, title, }: EditViewButtonProps) => react_jsx_runtime.JSX.Element;
|
|
130
136
|
|
|
131
|
-
declare const GlobalFilter: (
|
|
137
|
+
declare const GlobalFilter: ({ icon }: {
|
|
138
|
+
icon?: react_icons_lib.IconType | undefined;
|
|
139
|
+
}) => react_jsx_runtime.JSX.Element;
|
|
132
140
|
|
|
133
141
|
interface PageSizeControlProps {
|
|
134
142
|
pageSizes?: number[];
|
|
@@ -150,7 +158,9 @@ interface ResetSortingButtonProps {
|
|
|
150
158
|
}
|
|
151
159
|
declare const ResetSortingButton: ({ text, }: ResetSortingButtonProps) => react_jsx_runtime.JSX.Element;
|
|
152
160
|
|
|
153
|
-
|
|
161
|
+
declare const RowCountText: () => react_jsx_runtime.JSX.Element;
|
|
162
|
+
|
|
163
|
+
interface TableProps extends TableProps$1 {
|
|
154
164
|
showLoading?: boolean;
|
|
155
165
|
loadingComponent?: JSX.Element;
|
|
156
166
|
children: ReactNode;
|
|
@@ -183,6 +193,11 @@ interface TableCardsProps {
|
|
|
183
193
|
}
|
|
184
194
|
declare const TableCards: ({}: TableCardsProps) => react_jsx_runtime.JSX.Element;
|
|
185
195
|
|
|
196
|
+
interface TableRendererProps<TData> {
|
|
197
|
+
render: (render: Table$1<TData>) => React$1.ReactElement;
|
|
198
|
+
}
|
|
199
|
+
declare const TableComponentRenderer: <TData>({ render, }: TableRendererProps<TData>) => React$1.ReactElement<any, string | React$1.JSXElementConstructor<any>>;
|
|
200
|
+
|
|
186
201
|
declare const TableFilter: () => react_jsx_runtime.JSX.Element;
|
|
187
202
|
|
|
188
203
|
interface TableFooterProps {
|
|
@@ -244,4 +259,4 @@ declare const useDataTable: () => {
|
|
|
244
259
|
loading: boolean;
|
|
245
260
|
};
|
|
246
261
|
|
|
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 };
|
|
262
|
+
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,25 +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 }));
|
|
362
|
+
return jsxRuntime.jsx(react$1.Text, { children: table.getRowCount() });
|
|
464
363
|
};
|
|
465
364
|
|
|
466
365
|
const Table = ({ children, showLoading = false, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), ...props }) => {
|
|
@@ -520,22 +419,6 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
|
|
|
520
419
|
onChange: row.getToggleSelectedHandler() }) }))] }));
|
|
521
420
|
};
|
|
522
421
|
|
|
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
422
|
const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
540
423
|
const table = useDataTable().table;
|
|
541
424
|
const SELECTION_BOX_WIDTH = 20;
|
|
@@ -655,6 +538,139 @@ const TablePagination = ({}) => {
|
|
|
655
538
|
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
539
|
};
|
|
657
540
|
|
|
541
|
+
const DefaultTable = ({ totalText = "Total:", showFilter = false }) => {
|
|
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", icon: jsxRuntime.jsx(md.MdOutlineViewColumn, {}) }) }), jsxRuntime.jsx(react$1.Flex, { gap: "1rem", justifySelf: "end", children: showFilter && (jsxRuntime.jsxs(jsxRuntime.Fragment, { 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, Table as Table$1, FormLabel, Checkbox, Tfoot, Tr as Tr$1, Th, Thead, Portal, ButtonGroup, Grid, Card, CardBody, Tooltip } from '@chakra-ui/react';
|
|
7
|
+
import { MdFilterAlt, MdSearch, MdFilterListAlt, MdPushPin, MdCancel, MdSort, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdOutlineViewColumn, 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,25 +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 }));
|
|
360
|
+
return jsx(Text, { children: table.getRowCount() });
|
|
462
361
|
};
|
|
463
362
|
|
|
464
363
|
const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
|
|
@@ -518,22 +417,6 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
|
|
|
518
417
|
onChange: row.getToggleSelectedHandler() }) }))] }));
|
|
519
418
|
};
|
|
520
419
|
|
|
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
420
|
const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
538
421
|
const table = useDataTable().table;
|
|
539
422
|
const SELECTION_BOX_WIDTH = 20;
|
|
@@ -653,6 +536,139 @@ const TablePagination = ({}) => {
|
|
|
653
536
|
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
537
|
};
|
|
655
538
|
|
|
539
|
+
const DefaultTable = ({ totalText = "Total:", showFilter = false }) => {
|
|
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", icon: jsx(MdOutlineViewColumn, {}) }) }), jsx(Flex, { gap: "1rem", justifySelf: "end", children: showFilter && (jsxs(Fragment, { 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";
|
|
@@ -22,6 +25,7 @@ export * from "./components/TablePagination";
|
|
|
22
25
|
export * from "./components/TableSelector";
|
|
23
26
|
export * from "./components/TableSorter";
|
|
24
27
|
export * from "./components/TableViewer";
|
|
28
|
+
export * from "./components/TableComponentRenderer";
|
|
25
29
|
export * from "./components/TextCell";
|
|
26
30
|
export * from "./components/useDataFromUrl";
|
|
27
31
|
export * from "./components/useDataTable";
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bsol-oss/react-datatable5",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.41",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"repository": "https://github.com/bsol-oss/react-datatable5.git",
|
|
9
|
-
"homepage": "https://github.com/bsol-oss/react-
|
|
9
|
+
"homepage": "https://github.com/bsol-oss/react-datatable5#react-datatable5",
|
|
10
10
|
"author": "screw123",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"keywords": [
|