@bsol-oss/react-datatable5 1.0.60 → 1.0.61
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 +27 -4
- package/dist/index.js +108 -65
- package/dist/index.mjs +108 -69
- package/dist/types/components/DefaultTable.d.ts +3 -7
- package/dist/types/components/FilterOptions.d.ts +4 -0
- package/dist/types/components/TableControls.d.ts +13 -0
- package/dist/types/components/TableLoadingComponent.d.ts +5 -0
- package/dist/types/components/TableReloadButton.d.ts +4 -0
- package/dist/types/index.d.ts +4 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -95,15 +95,23 @@ declare module "@tanstack/react-table" {
|
|
|
95
95
|
}
|
|
96
96
|
declare const DataTableServer: <TData>({ columns, url, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder: defaultColumnOrder, columnFilters: defaultColumnFilter, density, globalFilter: defaultGlobalFilter, pagination: defaultPagination, sorting: defaultSorting, rowSelection: defaultRowSelection, columnVisibility: defaultColumnVisibility, children, }: DataTableServerProps<TData>) => react_jsx_runtime.JSX.Element;
|
|
97
97
|
|
|
98
|
-
interface
|
|
98
|
+
interface TableControlsProps {
|
|
99
99
|
totalText?: string;
|
|
100
100
|
showFilter?: boolean;
|
|
101
|
-
showFooter?: boolean;
|
|
102
101
|
fitTableWidth?: boolean;
|
|
103
102
|
fitTableHeight?: boolean;
|
|
104
103
|
isMobile?: boolean;
|
|
104
|
+
children?: JSX.Element;
|
|
105
|
+
showFilterName?: boolean;
|
|
106
|
+
showFilterTags?: boolean;
|
|
107
|
+
filterOptions?: string[];
|
|
108
|
+
}
|
|
109
|
+
declare const TableControls: ({ totalText, showFilter, fitTableWidth, fitTableHeight, isMobile, children, showFilterName, showFilterTags, filterOptions, }: TableControlsProps) => react_jsx_runtime.JSX.Element;
|
|
110
|
+
|
|
111
|
+
interface DefaultTableProps extends TableControlsProps {
|
|
112
|
+
showFooter?: boolean;
|
|
105
113
|
}
|
|
106
|
-
declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, }: DefaultTableProps) => react_jsx_runtime.JSX.Element;
|
|
114
|
+
declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, filterOptions, showFilterTags, showFilterName, }: DefaultTableProps) => react_jsx_runtime.JSX.Element;
|
|
107
115
|
|
|
108
116
|
interface DensityToggleButtonProps {
|
|
109
117
|
icon?: React$1.ReactElement;
|
|
@@ -141,6 +149,11 @@ interface EditViewButtonProps {
|
|
|
141
149
|
}
|
|
142
150
|
declare const EditViewButton: ({ text, icon, title, }: EditViewButtonProps) => react_jsx_runtime.JSX.Element;
|
|
143
151
|
|
|
152
|
+
interface FilterOptionsProps {
|
|
153
|
+
column: string;
|
|
154
|
+
}
|
|
155
|
+
declare const FilterOptions: ({ column }: FilterOptionsProps) => react_jsx_runtime.JSX.Element;
|
|
156
|
+
|
|
144
157
|
declare const GlobalFilter: ({ icon }: {
|
|
145
158
|
icon?: react_icons_lib.IconType | undefined;
|
|
146
159
|
}) => react_jsx_runtime.JSX.Element;
|
|
@@ -233,12 +246,22 @@ interface TableHeaderProps {
|
|
|
233
246
|
}
|
|
234
247
|
declare const TableHeader: ({ canResize, pinnedBgColor, }: TableHeaderProps) => react_jsx_runtime.JSX.Element;
|
|
235
248
|
|
|
249
|
+
interface TableLoadingComponentProps {
|
|
250
|
+
render: (loading: boolean) => JSX.Element;
|
|
251
|
+
}
|
|
252
|
+
declare const TableLoadingComponent: ({ render, }: TableLoadingComponentProps) => react_jsx_runtime.JSX.Element;
|
|
253
|
+
|
|
236
254
|
declare const TableOrderer: () => react_jsx_runtime.JSX.Element;
|
|
237
255
|
|
|
238
256
|
interface PaginationProps {
|
|
239
257
|
}
|
|
240
258
|
declare const TablePagination: ({}: PaginationProps) => react_jsx_runtime.JSX.Element;
|
|
241
259
|
|
|
260
|
+
interface ReloadButtonProps {
|
|
261
|
+
text?: string;
|
|
262
|
+
}
|
|
263
|
+
declare const ReloadButton: ({ text }: ReloadButtonProps) => react_jsx_runtime.JSX.Element;
|
|
264
|
+
|
|
242
265
|
declare const TableSelector: () => react_jsx_runtime.JSX.Element;
|
|
243
266
|
|
|
244
267
|
declare const TableSorter: () => react_jsx_runtime.JSX.Element;
|
|
@@ -277,4 +300,4 @@ declare const useDataTable: () => {
|
|
|
277
300
|
loading: boolean;
|
|
278
301
|
};
|
|
279
302
|
|
|
280
|
-
export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, DefaultTable, type DefaultTableProps, 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, TableComponent, TableFilter, TableFilterTags, 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 };
|
|
303
|
+
export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, DefaultTable, type DefaultTableProps, DensityToggleButton, type DensityToggleButtonProps, EditFilterButton, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, EditViewButton, type EditViewButtonProps, FilterOptions, type FilterOptionsProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, type PaginationProps, ReloadButton, type ReloadButtonProps, ResetFilteringButton, type ResetFilteringButtonProps, ResetSelectionButton, type ResetSelectionButtonProps, ResetSortingButton, type ResetSortingButtonProps, type Result, RowCountText, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableComponent, TableControls, type TableControlsProps, TableFilter, TableFilterTags, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableLoadingComponent, type TableLoadingComponentProps, 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,13 +6,14 @@ 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 table = require('@chakra-ui/table');
|
|
9
10
|
var md = require('react-icons/md');
|
|
10
11
|
var io = require('react-icons/io');
|
|
11
12
|
var reactBeautifulDnd = require('react-beautiful-dnd');
|
|
12
13
|
var fa = require('react-icons/fa');
|
|
13
14
|
var icons = require('@chakra-ui/icons');
|
|
14
|
-
var table = require('@chakra-ui/table');
|
|
15
15
|
var ai = require('react-icons/ai');
|
|
16
|
+
var io5 = require('react-icons/io5');
|
|
16
17
|
|
|
17
18
|
const TableContext = react.createContext({
|
|
18
19
|
table: {},
|
|
@@ -315,6 +316,63 @@ const useDataTable = () => {
|
|
|
315
316
|
return { table, refreshData, globalFilter, setGlobalFilter, loading };
|
|
316
317
|
};
|
|
317
318
|
|
|
319
|
+
const Table = ({ children, showLoading = false, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), ...props }) => {
|
|
320
|
+
const { table, loading } = useDataTable();
|
|
321
|
+
if (showLoading) {
|
|
322
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [loading && loadingComponent, !loading && (jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflow: "auto", ...props, children: children }))] }));
|
|
323
|
+
}
|
|
324
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
328
|
+
const { table: table$1 } = react.useContext(TableContext);
|
|
329
|
+
const SELECTION_BOX_WIDTH = 20;
|
|
330
|
+
const [hoveredRow, setHoveredRow] = react.useState(-1);
|
|
331
|
+
const handleRowHover = (index) => {
|
|
332
|
+
setHoveredRow(index);
|
|
333
|
+
};
|
|
334
|
+
return (jsxRuntime.jsx(table.Tbody, { children: table$1.getRowModel().rows.map((row, index) => {
|
|
335
|
+
return (jsxRuntime.jsxs(table.Tr, { display: "flex", _hover: { backgroundColor: "rgba(178,178,178,0.1)" }, zIndex: 1, onMouseEnter: () => handleRowHover(index), onMouseLeave: () => handleRowHover(-1), children: [jsxRuntime.jsx(TableRowSelector, { index: index, row: row, hoveredRow: hoveredRow }), row.getVisibleCells().map((cell) => {
|
|
336
|
+
return (jsxRuntime.jsx(table.Td, { padding: `${table$1.getDensityValue()}px`,
|
|
337
|
+
// styling resize and pinning start
|
|
338
|
+
maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`, left: cell.column.getIsPinned()
|
|
339
|
+
? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table$1.getDensityValue() * 2}px`
|
|
340
|
+
: undefined, backgroundColor: cell.column.getIsPinned() ? pinnedBgColor.light : undefined, position: cell.column.getIsPinned() ? "sticky" : "relative", zIndex: cell.column.getIsPinned() ? 1 : 0, _dark: {
|
|
341
|
+
backgroundColor: cell.column.getIsPinned()
|
|
342
|
+
? pinnedBgColor.dark
|
|
343
|
+
: undefined,
|
|
344
|
+
}, children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()));
|
|
345
|
+
})] }, crypto.randomUUID()));
|
|
346
|
+
}) }));
|
|
347
|
+
};
|
|
348
|
+
const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
349
|
+
const { table: table$1 } = react.useContext(TableContext);
|
|
350
|
+
const SELECTION_BOX_WIDTH = 20;
|
|
351
|
+
const isCheckBoxVisible = (current_index, current_row) => {
|
|
352
|
+
if (current_row.getIsSelected()) {
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
if (hoveredRow == current_index) {
|
|
356
|
+
return true;
|
|
357
|
+
}
|
|
358
|
+
return false;
|
|
359
|
+
};
|
|
360
|
+
return (jsxRuntime.jsxs(table.Td, { padding: `${table$1.getDensityValue()}px`, ...(table$1.getIsSomeColumnsPinned("left")
|
|
361
|
+
? {
|
|
362
|
+
left: `0px`,
|
|
363
|
+
backgroundColor: pinnedBgColor.light,
|
|
364
|
+
position: "sticky",
|
|
365
|
+
zIndex: 1,
|
|
366
|
+
_dark: { backgroundColor: pinnedBgColor.dark },
|
|
367
|
+
}
|
|
368
|
+
: {}),
|
|
369
|
+
// styling resize and pinning end
|
|
370
|
+
display: "grid", children: [!isCheckBoxVisible(index, row) && (jsxRuntime.jsx(react$1.Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` })), isCheckBoxVisible(index, row) && (jsxRuntime.jsx(react$1.FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsxRuntime.jsx(react$1.Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: row.getIsSelected(),
|
|
371
|
+
disabled: !row.getCanSelect(),
|
|
372
|
+
// indeterminate: row.getIsSomeSelected(),
|
|
373
|
+
onChange: row.getToggleSelectedHandler() }) }))] }));
|
|
374
|
+
};
|
|
375
|
+
|
|
318
376
|
const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
|
|
319
377
|
const { table } = useDataTable();
|
|
320
378
|
return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
|
|
@@ -416,63 +474,6 @@ const RowCountText = () => {
|
|
|
416
474
|
return jsxRuntime.jsx(react$1.Text, { children: table.getRowCount() });
|
|
417
475
|
};
|
|
418
476
|
|
|
419
|
-
const Table = ({ children, showLoading = false, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), ...props }) => {
|
|
420
|
-
const { table, loading } = useDataTable();
|
|
421
|
-
if (showLoading) {
|
|
422
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [loading && loadingComponent, !loading && (jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflow: "auto", ...props, children: children }))] }));
|
|
423
|
-
}
|
|
424
|
-
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
|
|
425
|
-
};
|
|
426
|
-
|
|
427
|
-
const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
428
|
-
const { table: table$1 } = react.useContext(TableContext);
|
|
429
|
-
const SELECTION_BOX_WIDTH = 20;
|
|
430
|
-
const [hoveredRow, setHoveredRow] = react.useState(-1);
|
|
431
|
-
const handleRowHover = (index) => {
|
|
432
|
-
setHoveredRow(index);
|
|
433
|
-
};
|
|
434
|
-
return (jsxRuntime.jsx(table.Tbody, { children: table$1.getRowModel().rows.map((row, index) => {
|
|
435
|
-
return (jsxRuntime.jsxs(table.Tr, { display: "flex", _hover: { backgroundColor: "rgba(178,178,178,0.1)" }, zIndex: 1, onMouseEnter: () => handleRowHover(index), onMouseLeave: () => handleRowHover(-1), children: [jsxRuntime.jsx(TableRowSelector, { index: index, row: row, hoveredRow: hoveredRow }), row.getVisibleCells().map((cell) => {
|
|
436
|
-
return (jsxRuntime.jsx(table.Td, { padding: `${table$1.getDensityValue()}px`,
|
|
437
|
-
// styling resize and pinning start
|
|
438
|
-
maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`, left: cell.column.getIsPinned()
|
|
439
|
-
? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table$1.getDensityValue() * 2}px`
|
|
440
|
-
: undefined, backgroundColor: cell.column.getIsPinned() ? pinnedBgColor.light : undefined, position: cell.column.getIsPinned() ? "sticky" : "relative", zIndex: cell.column.getIsPinned() ? 1 : 0, _dark: {
|
|
441
|
-
backgroundColor: cell.column.getIsPinned()
|
|
442
|
-
? pinnedBgColor.dark
|
|
443
|
-
: undefined,
|
|
444
|
-
}, children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()));
|
|
445
|
-
})] }, crypto.randomUUID()));
|
|
446
|
-
}) }));
|
|
447
|
-
};
|
|
448
|
-
const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
449
|
-
const { table: table$1 } = react.useContext(TableContext);
|
|
450
|
-
const SELECTION_BOX_WIDTH = 20;
|
|
451
|
-
const isCheckBoxVisible = (current_index, current_row) => {
|
|
452
|
-
if (current_row.getIsSelected()) {
|
|
453
|
-
return true;
|
|
454
|
-
}
|
|
455
|
-
if (hoveredRow == current_index) {
|
|
456
|
-
return true;
|
|
457
|
-
}
|
|
458
|
-
return false;
|
|
459
|
-
};
|
|
460
|
-
return (jsxRuntime.jsxs(table.Td, { padding: `${table$1.getDensityValue()}px`, ...(table$1.getIsSomeColumnsPinned("left")
|
|
461
|
-
? {
|
|
462
|
-
left: `0px`,
|
|
463
|
-
backgroundColor: pinnedBgColor.light,
|
|
464
|
-
position: "sticky",
|
|
465
|
-
zIndex: 1,
|
|
466
|
-
_dark: { backgroundColor: pinnedBgColor.dark },
|
|
467
|
-
}
|
|
468
|
-
: {}),
|
|
469
|
-
// styling resize and pinning end
|
|
470
|
-
display: "grid", children: [!isCheckBoxVisible(index, row) && (jsxRuntime.jsx(react$1.Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` })), isCheckBoxVisible(index, row) && (jsxRuntime.jsx(react$1.FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsxRuntime.jsx(react$1.Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: row.getIsSelected(),
|
|
471
|
-
disabled: !row.getCanSelect(),
|
|
472
|
-
// indeterminate: row.getIsSomeSelected(),
|
|
473
|
-
onChange: row.getToggleSelectedHandler() }) }))] }));
|
|
474
|
-
};
|
|
475
|
-
|
|
476
477
|
const TableFilterTags = () => {
|
|
477
478
|
const { table } = useDataTable();
|
|
478
479
|
return (jsxRuntime.jsx(react$1.Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }, index) => {
|
|
@@ -484,6 +485,37 @@ const TableFilterTags = () => {
|
|
|
484
485
|
}) }));
|
|
485
486
|
};
|
|
486
487
|
|
|
488
|
+
const TablePagination = ({}) => {
|
|
489
|
+
const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
|
|
490
|
+
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, {}) })] }));
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
const FilterOptions = ({ column }) => {
|
|
494
|
+
const { table } = useDataTable();
|
|
495
|
+
const tableColumn = table.getColumn(column);
|
|
496
|
+
const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
|
|
497
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: options.map((option) => {
|
|
498
|
+
const selected = table.getColumn(column)?.getFilterValue() === option;
|
|
499
|
+
return (jsxRuntime.jsxs(react$1.Button, { size: "sm", onClick: () => {
|
|
500
|
+
if (selected) {
|
|
501
|
+
table.setColumnFilters((state) => {
|
|
502
|
+
return state.filter((filter) => {
|
|
503
|
+
return filter.id !== column;
|
|
504
|
+
});
|
|
505
|
+
});
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
table.getColumn(column)?.setFilterValue(option);
|
|
509
|
+
}, variant: selected ? "solid" : "outline", display: 'flex', gap: '0.25rem', children: [option, selected && jsxRuntime.jsx(md.MdClose, {})] }, option));
|
|
510
|
+
}) }));
|
|
511
|
+
};
|
|
512
|
+
|
|
513
|
+
const TableControls = ({ totalText = "Total:", showFilter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsxRuntime.jsx(jsxRuntime.Fragment, {}), showFilterName = false, showFilterTags = false, filterOptions = [], }) => {
|
|
514
|
+
return (jsxRuntime.jsxs(react$1.Grid, { templateRows: "auto auto auto 1fr auto", templateColumns: "1fr 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", justifySelf: "center", alignSelf: "center", gap: "0.5rem", children: [jsxRuntime.jsxs(react$1.Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsxRuntime.jsx(react$1.Box, { children: jsxRuntime.jsx(EditViewButton, { text: isMobile ? undefined : "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: isMobile ? undefined : "Advanced Filter" })] })) })] }), jsxRuntime.jsx(react$1.Flex, { gridColumn: "1 / span 2", flexFlow: 'column', gap: '0.5rem', children: filterOptions.map((column) => {
|
|
515
|
+
return (jsxRuntime.jsxs(react$1.Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxRuntime.jsxs(react$1.Text, { children: [column, ":"] }), jsxRuntime.jsx(FilterOptions, { column: column })] }));
|
|
516
|
+
}) }), jsxRuntime.jsx(react$1.Flex, { gridColumn: "1 / span 2", children: showFilterTags && jsxRuntime.jsx(TableFilterTags, {}) }), jsxRuntime.jsx(react$1.Box, { overflow: "auto", gridColumn: "1 / span 2", width: "100%", height: "100%", children: children }), jsxRuntime.jsxs(react$1.Flex, { gap: "1rem", alignItems: "center", children: [jsxRuntime.jsx(PageSizeControl, {}), 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, {}) })] }));
|
|
517
|
+
};
|
|
518
|
+
|
|
487
519
|
const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
488
520
|
const table = useDataTable().table;
|
|
489
521
|
const SELECTION_BOX_WIDTH = 20;
|
|
@@ -598,13 +630,8 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
598
630
|
})] }, crypto.randomUUID()))) }));
|
|
599
631
|
};
|
|
600
632
|
|
|
601
|
-
const
|
|
602
|
-
|
|
603
|
-
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, {}) })] }));
|
|
604
|
-
};
|
|
605
|
-
|
|
606
|
-
const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, }) => {
|
|
607
|
-
return (jsxRuntime.jsxs(react$1.Grid, { templateRows: "auto auto 1fr auto", templateColumns: "1fr 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", justifySelf: "center", alignSelf: "center", gap: "0.5rem", children: [jsxRuntime.jsxs(react$1.Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsxRuntime.jsx(react$1.Box, { children: jsxRuntime.jsx(EditViewButton, { text: isMobile ? undefined : "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: isMobile ? undefined : "Advanced Filter" })] })) })] }), jsxRuntime.jsx(react$1.Flex, { gridColumn: "1 / span 2", children: jsxRuntime.jsx(TableFilterTags, {}) }), jsxRuntime.jsx(react$1.Box, { overflow: "auto", gridColumn: "1 / span 2", width: "100%", height: "100%", children: jsxRuntime.jsxs(Table, { variant: "striped", children: [jsxRuntime.jsx(TableHeader, { canResize: true }), jsxRuntime.jsx(TableBody, {}), showFooter && jsxRuntime.jsx(TableFooter, {})] }) }), jsxRuntime.jsxs(react$1.Flex, { gap: "1rem", alignItems: "center", children: [jsxRuntime.jsx(PageSizeControl, {}), 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, {}) })] }));
|
|
633
|
+
const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, filterOptions = [], showFilterTags = false, showFilterName = false, }) => {
|
|
634
|
+
return (jsxRuntime.jsx(TableControls, { totalText: totalText, showFilter: showFilter, fitTableWidth: fitTableWidth, fitTableHeight: fitTableHeight, isMobile: isMobile, filterOptions: filterOptions, showFilterName: showFilterName, showFilterTags: showFilterTags, children: jsxRuntime.jsxs(Table, { variant: "striped", children: [jsxRuntime.jsx(TableHeader, { canResize: true }), jsxRuntime.jsx(TableBody, {}), showFooter && jsxRuntime.jsx(TableFooter, {})] }) }));
|
|
608
635
|
};
|
|
609
636
|
|
|
610
637
|
const DensityToggleButton = ({ text, icon = jsxRuntime.jsx(ai.AiOutlineColumnWidth, {}), }) => {
|
|
@@ -736,6 +763,18 @@ const TableComponent = ({ render = () => {
|
|
|
736
763
|
return render(table);
|
|
737
764
|
};
|
|
738
765
|
|
|
766
|
+
const TableLoadingComponent = ({ render, }) => {
|
|
767
|
+
const { loading } = useDataTable();
|
|
768
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: render(loading) });
|
|
769
|
+
};
|
|
770
|
+
|
|
771
|
+
const ReloadButton = ({ text = "Reload" }) => {
|
|
772
|
+
const { refreshData } = useDataTable();
|
|
773
|
+
return (jsxRuntime.jsx(react$1.Button, { leftIcon: jsxRuntime.jsx(io5.IoReload, {}), onClick: () => {
|
|
774
|
+
refreshData();
|
|
775
|
+
}, children: text }));
|
|
776
|
+
};
|
|
777
|
+
|
|
739
778
|
const SelectAllRowsToggle = ({ selectAllIcon = jsxRuntime.jsx(md.MdOutlineChecklist, {}), clearAllIcon = jsxRuntime.jsx(md.MdClear, {}), selectAllText, clearAllText, }) => {
|
|
740
779
|
const { table } = react.useContext(TableContext);
|
|
741
780
|
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) => {
|
|
@@ -767,8 +806,10 @@ exports.EditFilterButton = EditFilterButton;
|
|
|
767
806
|
exports.EditOrderButton = EditOrderButton;
|
|
768
807
|
exports.EditSortingButton = EditSortingButton;
|
|
769
808
|
exports.EditViewButton = EditViewButton;
|
|
809
|
+
exports.FilterOptions = FilterOptions;
|
|
770
810
|
exports.GlobalFilter = GlobalFilter;
|
|
771
811
|
exports.PageSizeControl = PageSizeControl;
|
|
812
|
+
exports.ReloadButton = ReloadButton;
|
|
772
813
|
exports.ResetFilteringButton = ResetFilteringButton;
|
|
773
814
|
exports.ResetSelectionButton = ResetSelectionButton;
|
|
774
815
|
exports.ResetSortingButton = ResetSortingButton;
|
|
@@ -778,10 +819,12 @@ exports.TableBody = TableBody;
|
|
|
778
819
|
exports.TableCardContainer = TableCardContainer;
|
|
779
820
|
exports.TableCards = TableCards;
|
|
780
821
|
exports.TableComponent = TableComponent;
|
|
822
|
+
exports.TableControls = TableControls;
|
|
781
823
|
exports.TableFilter = TableFilter;
|
|
782
824
|
exports.TableFilterTags = TableFilterTags;
|
|
783
825
|
exports.TableFooter = TableFooter;
|
|
784
826
|
exports.TableHeader = TableHeader;
|
|
827
|
+
exports.TableLoadingComponent = TableLoadingComponent;
|
|
785
828
|
exports.TableOrderer = TableOrderer;
|
|
786
829
|
exports.TablePagination = TablePagination;
|
|
787
830
|
exports.TableSelector = TableSelector;
|
package/dist/index.mjs
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import { jsx,
|
|
1
|
+
import { jsx, jsxs, Fragment } 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 { Button, Flex, Text, Select, Input, useDisclosure, IconButton, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, ModalFooter, Grid, Icon,
|
|
7
|
-
import {
|
|
6
|
+
import { Table as Table$1, Box, FormLabel, Checkbox, Button, Flex, Text, Select, Input, useDisclosure, IconButton, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, ModalFooter, Grid, Icon, Switch, InputGroup, InputLeftElement, Menu, MenuButton, MenuList, MenuItem, Tag, ButtonGroup, Tfoot, Tr as Tr$1, Th, Thead, Portal, Card, CardBody, Tooltip } from '@chakra-ui/react';
|
|
7
|
+
import { Tbody, Tr, Td } from '@chakra-ui/table';
|
|
8
|
+
import { MdFilterAlt, MdSearch, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdClose, MdOutlineViewColumn, MdFilterListAlt, MdPushPin, MdCancel, MdSort, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdOutlineChecklist, MdClear } from 'react-icons/md';
|
|
8
9
|
import { IoMdEye, IoMdClose, IoMdCheckbox } from 'react-icons/io';
|
|
9
10
|
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
|
|
10
11
|
import { FaGripLinesVertical } from 'react-icons/fa';
|
|
11
12
|
import { ChevronDownIcon, CloseIcon, ChevronUpIcon, UpDownIcon } from '@chakra-ui/icons';
|
|
12
|
-
import { Tbody, Tr, Td } from '@chakra-ui/table';
|
|
13
13
|
import { AiOutlineColumnWidth } from 'react-icons/ai';
|
|
14
|
+
import { IoReload } from 'react-icons/io5';
|
|
14
15
|
|
|
15
16
|
const TableContext = createContext({
|
|
16
17
|
table: {},
|
|
@@ -313,6 +314,63 @@ const useDataTable = () => {
|
|
|
313
314
|
return { table, refreshData, globalFilter, setGlobalFilter, loading };
|
|
314
315
|
};
|
|
315
316
|
|
|
317
|
+
const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
|
|
318
|
+
const { table, loading } = useDataTable();
|
|
319
|
+
if (showLoading) {
|
|
320
|
+
return (jsxs(Fragment, { children: [loading && loadingComponent, !loading && (jsx(Table$1, { width: table.getCenterTotalSize(), overflow: "auto", ...props, children: children }))] }));
|
|
321
|
+
}
|
|
322
|
+
return (jsx(Fragment, { children: jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
326
|
+
const { table } = useContext(TableContext);
|
|
327
|
+
const SELECTION_BOX_WIDTH = 20;
|
|
328
|
+
const [hoveredRow, setHoveredRow] = useState(-1);
|
|
329
|
+
const handleRowHover = (index) => {
|
|
330
|
+
setHoveredRow(index);
|
|
331
|
+
};
|
|
332
|
+
return (jsx(Tbody, { children: table.getRowModel().rows.map((row, index) => {
|
|
333
|
+
return (jsxs(Tr, { display: "flex", _hover: { backgroundColor: "rgba(178,178,178,0.1)" }, zIndex: 1, onMouseEnter: () => handleRowHover(index), onMouseLeave: () => handleRowHover(-1), children: [jsx(TableRowSelector, { index: index, row: row, hoveredRow: hoveredRow }), row.getVisibleCells().map((cell) => {
|
|
334
|
+
return (jsx(Td, { padding: `${table.getDensityValue()}px`,
|
|
335
|
+
// styling resize and pinning start
|
|
336
|
+
maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`, left: cell.column.getIsPinned()
|
|
337
|
+
? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
338
|
+
: undefined, backgroundColor: cell.column.getIsPinned() ? pinnedBgColor.light : undefined, position: cell.column.getIsPinned() ? "sticky" : "relative", zIndex: cell.column.getIsPinned() ? 1 : 0, _dark: {
|
|
339
|
+
backgroundColor: cell.column.getIsPinned()
|
|
340
|
+
? pinnedBgColor.dark
|
|
341
|
+
: undefined,
|
|
342
|
+
}, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()));
|
|
343
|
+
})] }, crypto.randomUUID()));
|
|
344
|
+
}) }));
|
|
345
|
+
};
|
|
346
|
+
const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
347
|
+
const { table } = useContext(TableContext);
|
|
348
|
+
const SELECTION_BOX_WIDTH = 20;
|
|
349
|
+
const isCheckBoxVisible = (current_index, current_row) => {
|
|
350
|
+
if (current_row.getIsSelected()) {
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
if (hoveredRow == current_index) {
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
return false;
|
|
357
|
+
};
|
|
358
|
+
return (jsxs(Td, { padding: `${table.getDensityValue()}px`, ...(table.getIsSomeColumnsPinned("left")
|
|
359
|
+
? {
|
|
360
|
+
left: `0px`,
|
|
361
|
+
backgroundColor: pinnedBgColor.light,
|
|
362
|
+
position: "sticky",
|
|
363
|
+
zIndex: 1,
|
|
364
|
+
_dark: { backgroundColor: pinnedBgColor.dark },
|
|
365
|
+
}
|
|
366
|
+
: {}),
|
|
367
|
+
// styling resize and pinning end
|
|
368
|
+
display: "grid", children: [!isCheckBoxVisible(index, row) && (jsx(Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` })), isCheckBoxVisible(index, row) && (jsx(FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: row.getIsSelected(),
|
|
369
|
+
disabled: !row.getCanSelect(),
|
|
370
|
+
// indeterminate: row.getIsSomeSelected(),
|
|
371
|
+
onChange: row.getToggleSelectedHandler() }) }))] }));
|
|
372
|
+
};
|
|
373
|
+
|
|
316
374
|
const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
|
|
317
375
|
const { table } = useDataTable();
|
|
318
376
|
return (jsx(Button, { onClick: () => {
|
|
@@ -414,63 +472,6 @@ const RowCountText = () => {
|
|
|
414
472
|
return jsx(Text, { children: table.getRowCount() });
|
|
415
473
|
};
|
|
416
474
|
|
|
417
|
-
const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
|
|
418
|
-
const { table, loading } = useDataTable();
|
|
419
|
-
if (showLoading) {
|
|
420
|
-
return (jsxs(Fragment, { children: [loading && loadingComponent, !loading && (jsx(Table$1, { width: table.getCenterTotalSize(), overflow: "auto", ...props, children: children }))] }));
|
|
421
|
-
}
|
|
422
|
-
return (jsx(Fragment, { children: jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
|
|
423
|
-
};
|
|
424
|
-
|
|
425
|
-
const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
426
|
-
const { table } = useContext(TableContext);
|
|
427
|
-
const SELECTION_BOX_WIDTH = 20;
|
|
428
|
-
const [hoveredRow, setHoveredRow] = useState(-1);
|
|
429
|
-
const handleRowHover = (index) => {
|
|
430
|
-
setHoveredRow(index);
|
|
431
|
-
};
|
|
432
|
-
return (jsx(Tbody, { children: table.getRowModel().rows.map((row, index) => {
|
|
433
|
-
return (jsxs(Tr, { display: "flex", _hover: { backgroundColor: "rgba(178,178,178,0.1)" }, zIndex: 1, onMouseEnter: () => handleRowHover(index), onMouseLeave: () => handleRowHover(-1), children: [jsx(TableRowSelector, { index: index, row: row, hoveredRow: hoveredRow }), row.getVisibleCells().map((cell) => {
|
|
434
|
-
return (jsx(Td, { padding: `${table.getDensityValue()}px`,
|
|
435
|
-
// styling resize and pinning start
|
|
436
|
-
maxWidth: `${cell.column.getSize()}px`, width: `${cell.column.getSize()}px`, left: cell.column.getIsPinned()
|
|
437
|
-
? `${cell.column.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
438
|
-
: undefined, backgroundColor: cell.column.getIsPinned() ? pinnedBgColor.light : undefined, position: cell.column.getIsPinned() ? "sticky" : "relative", zIndex: cell.column.getIsPinned() ? 1 : 0, _dark: {
|
|
439
|
-
backgroundColor: cell.column.getIsPinned()
|
|
440
|
-
? pinnedBgColor.dark
|
|
441
|
-
: undefined,
|
|
442
|
-
}, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }, crypto.randomUUID()));
|
|
443
|
-
})] }, crypto.randomUUID()));
|
|
444
|
-
}) }));
|
|
445
|
-
};
|
|
446
|
-
const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
447
|
-
const { table } = useContext(TableContext);
|
|
448
|
-
const SELECTION_BOX_WIDTH = 20;
|
|
449
|
-
const isCheckBoxVisible = (current_index, current_row) => {
|
|
450
|
-
if (current_row.getIsSelected()) {
|
|
451
|
-
return true;
|
|
452
|
-
}
|
|
453
|
-
if (hoveredRow == current_index) {
|
|
454
|
-
return true;
|
|
455
|
-
}
|
|
456
|
-
return false;
|
|
457
|
-
};
|
|
458
|
-
return (jsxs(Td, { padding: `${table.getDensityValue()}px`, ...(table.getIsSomeColumnsPinned("left")
|
|
459
|
-
? {
|
|
460
|
-
left: `0px`,
|
|
461
|
-
backgroundColor: pinnedBgColor.light,
|
|
462
|
-
position: "sticky",
|
|
463
|
-
zIndex: 1,
|
|
464
|
-
_dark: { backgroundColor: pinnedBgColor.dark },
|
|
465
|
-
}
|
|
466
|
-
: {}),
|
|
467
|
-
// styling resize and pinning end
|
|
468
|
-
display: "grid", children: [!isCheckBoxVisible(index, row) && (jsx(Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` })), isCheckBoxVisible(index, row) && (jsx(FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: row.getIsSelected(),
|
|
469
|
-
disabled: !row.getCanSelect(),
|
|
470
|
-
// indeterminate: row.getIsSomeSelected(),
|
|
471
|
-
onChange: row.getToggleSelectedHandler() }) }))] }));
|
|
472
|
-
};
|
|
473
|
-
|
|
474
475
|
const TableFilterTags = () => {
|
|
475
476
|
const { table } = useDataTable();
|
|
476
477
|
return (jsx(Flex, { gap: "0.5rem", flexFlow: "wrap", children: table.getState().columnFilters.map(({ id, value }, index) => {
|
|
@@ -482,6 +483,37 @@ const TableFilterTags = () => {
|
|
|
482
483
|
}) }));
|
|
483
484
|
};
|
|
484
485
|
|
|
486
|
+
const TablePagination = ({}) => {
|
|
487
|
+
const { firstPage, getCanPreviousPage, previousPage, getState, nextPage, getCanNextPage, lastPage, } = useDataTable().table;
|
|
488
|
+
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, {}) })] }));
|
|
489
|
+
};
|
|
490
|
+
|
|
491
|
+
const FilterOptions = ({ column }) => {
|
|
492
|
+
const { table } = useDataTable();
|
|
493
|
+
const tableColumn = table.getColumn(column);
|
|
494
|
+
const options = tableColumn?.columnDef.meta?.filterOptions ?? [];
|
|
495
|
+
return (jsx(Fragment, { children: options.map((option) => {
|
|
496
|
+
const selected = table.getColumn(column)?.getFilterValue() === option;
|
|
497
|
+
return (jsxs(Button, { size: "sm", onClick: () => {
|
|
498
|
+
if (selected) {
|
|
499
|
+
table.setColumnFilters((state) => {
|
|
500
|
+
return state.filter((filter) => {
|
|
501
|
+
return filter.id !== column;
|
|
502
|
+
});
|
|
503
|
+
});
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
table.getColumn(column)?.setFilterValue(option);
|
|
507
|
+
}, variant: selected ? "solid" : "outline", display: 'flex', gap: '0.25rem', children: [option, selected && jsx(MdClose, {})] }, option));
|
|
508
|
+
}) }));
|
|
509
|
+
};
|
|
510
|
+
|
|
511
|
+
const TableControls = ({ totalText = "Total:", showFilter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsx(Fragment, {}), showFilterName = false, showFilterTags = false, filterOptions = [], }) => {
|
|
512
|
+
return (jsxs(Grid, { templateRows: "auto auto auto 1fr auto", templateColumns: "1fr 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", justifySelf: "center", alignSelf: "center", gap: "0.5rem", children: [jsxs(Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsx(Box, { children: jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsx(MdOutlineViewColumn, {}) }) }), jsx(Flex, { gap: "1rem", justifySelf: "end", children: showFilter && (jsxs(Fragment, { children: [jsx(GlobalFilter, {}), jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" })] })) })] }), jsx(Flex, { gridColumn: "1 / span 2", flexFlow: 'column', gap: '0.5rem', children: filterOptions.map((column) => {
|
|
513
|
+
return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [column, ":"] }), jsx(FilterOptions, { column: column })] }));
|
|
514
|
+
}) }), jsx(Flex, { gridColumn: "1 / span 2", children: showFilterTags && jsx(TableFilterTags, {}) }), jsx(Box, { overflow: "auto", gridColumn: "1 / span 2", width: "100%", height: "100%", children: children }), jsxs(Flex, { gap: "1rem", alignItems: "center", children: [jsx(PageSizeControl, {}), jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: totalText }), jsx(RowCountText, {})] })] }), jsx(Box, { justifySelf: "end", children: jsx(TablePagination, {}) })] }));
|
|
515
|
+
};
|
|
516
|
+
|
|
485
517
|
const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
|
|
486
518
|
const table = useDataTable().table;
|
|
487
519
|
const SELECTION_BOX_WIDTH = 20;
|
|
@@ -596,13 +628,8 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
596
628
|
})] }, crypto.randomUUID()))) }));
|
|
597
629
|
};
|
|
598
630
|
|
|
599
|
-
const
|
|
600
|
-
|
|
601
|
-
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, {}) })] }));
|
|
602
|
-
};
|
|
603
|
-
|
|
604
|
-
const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, }) => {
|
|
605
|
-
return (jsxs(Grid, { templateRows: "auto auto 1fr auto", templateColumns: "1fr 1fr", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", justifySelf: "center", alignSelf: "center", gap: "0.5rem", children: [jsxs(Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsx(Box, { children: jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsx(MdOutlineViewColumn, {}) }) }), jsx(Flex, { gap: "1rem", justifySelf: "end", children: showFilter && (jsxs(Fragment, { children: [jsx(GlobalFilter, {}), jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" })] })) })] }), jsx(Flex, { gridColumn: "1 / span 2", children: jsx(TableFilterTags, {}) }), jsx(Box, { overflow: "auto", gridColumn: "1 / span 2", width: "100%", height: "100%", children: jsxs(Table, { variant: "striped", children: [jsx(TableHeader, { canResize: true }), jsx(TableBody, {}), showFooter && jsx(TableFooter, {})] }) }), jsxs(Flex, { gap: "1rem", alignItems: "center", children: [jsx(PageSizeControl, {}), jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: totalText }), jsx(RowCountText, {})] })] }), jsx(Box, { justifySelf: "end", children: jsx(TablePagination, {}) })] }));
|
|
631
|
+
const DefaultTable = ({ totalText = "Total:", showFilter = false, showFooter = false, fitTableWidth = false, fitTableHeight = false, isMobile = false, filterOptions = [], showFilterTags = false, showFilterName = false, }) => {
|
|
632
|
+
return (jsx(TableControls, { totalText: totalText, showFilter: showFilter, fitTableWidth: fitTableWidth, fitTableHeight: fitTableHeight, isMobile: isMobile, filterOptions: filterOptions, showFilterName: showFilterName, showFilterTags: showFilterTags, children: jsxs(Table, { variant: "striped", children: [jsx(TableHeader, { canResize: true }), jsx(TableBody, {}), showFooter && jsx(TableFooter, {})] }) }));
|
|
606
633
|
};
|
|
607
634
|
|
|
608
635
|
const DensityToggleButton = ({ text, icon = jsx(AiOutlineColumnWidth, {}), }) => {
|
|
@@ -734,6 +761,18 @@ const TableComponent = ({ render = () => {
|
|
|
734
761
|
return render(table);
|
|
735
762
|
};
|
|
736
763
|
|
|
764
|
+
const TableLoadingComponent = ({ render, }) => {
|
|
765
|
+
const { loading } = useDataTable();
|
|
766
|
+
return jsx(Fragment, { children: render(loading) });
|
|
767
|
+
};
|
|
768
|
+
|
|
769
|
+
const ReloadButton = ({ text = "Reload" }) => {
|
|
770
|
+
const { refreshData } = useDataTable();
|
|
771
|
+
return (jsx(Button, { leftIcon: jsx(IoReload, {}), onClick: () => {
|
|
772
|
+
refreshData();
|
|
773
|
+
}, children: text }));
|
|
774
|
+
};
|
|
775
|
+
|
|
737
776
|
const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText, clearAllText, }) => {
|
|
738
777
|
const { table } = useContext(TableContext);
|
|
739
778
|
return (jsxs(Fragment, { children: [!!selectAllText === false && (jsx(IconButton, { icon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? clearAllText : selectAllText, onClick: (event) => {
|
|
@@ -757,4 +796,4 @@ const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipP
|
|
|
757
796
|
return (jsx(Flex, { alignItems: "center", height: "100%", padding: padding, children: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }));
|
|
758
797
|
};
|
|
759
798
|
|
|
760
|
-
export { DataTable, DataTableServer, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, GlobalFilter, PageSizeControl, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableFilter, TableFilterTags, TableFooter, TableHeader, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, useDataFromUrl, useDataTable };
|
|
799
|
+
export { DataTable, DataTableServer, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, FilterOptions, GlobalFilter, PageSizeControl, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, useDataFromUrl, useDataTable };
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
showFilter?: boolean;
|
|
1
|
+
import { TableControlsProps } from "./TableControls";
|
|
2
|
+
export interface DefaultTableProps extends TableControlsProps {
|
|
4
3
|
showFooter?: boolean;
|
|
5
|
-
fitTableWidth?: boolean;
|
|
6
|
-
fitTableHeight?: boolean;
|
|
7
|
-
isMobile?: boolean;
|
|
8
4
|
}
|
|
9
|
-
export declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, }: DefaultTableProps) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export declare const DefaultTable: ({ totalText, showFilter, showFooter, fitTableWidth, fitTableHeight, isMobile, filterOptions, showFilterTags, showFilterName, }: DefaultTableProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export interface TableControlsProps {
|
|
3
|
+
totalText?: string;
|
|
4
|
+
showFilter?: boolean;
|
|
5
|
+
fitTableWidth?: boolean;
|
|
6
|
+
fitTableHeight?: boolean;
|
|
7
|
+
isMobile?: boolean;
|
|
8
|
+
children?: JSX.Element;
|
|
9
|
+
showFilterName?: boolean;
|
|
10
|
+
showFilterTags?: boolean;
|
|
11
|
+
filterOptions?: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare const TableControls: ({ totalText, showFilter, fitTableWidth, fitTableHeight, isMobile, children, showFilterName, showFilterTags, filterOptions, }: TableControlsProps) => import("react/jsx-runtime").JSX.Element;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export * from "./components/EditFilterButton";
|
|
|
6
6
|
export * from "./components/EditOrderButton";
|
|
7
7
|
export * from "./components/EditSortingButton";
|
|
8
8
|
export * from "./components/EditViewButton";
|
|
9
|
+
export * from "./components/FilterOptions";
|
|
9
10
|
export * from "./components/GlobalFilter";
|
|
10
11
|
export * from "./components/PageSizeControl";
|
|
11
12
|
export * from "./components/ResetFilteringButton";
|
|
@@ -17,12 +18,15 @@ export * from "./components/TableBody";
|
|
|
17
18
|
export * from "./components/TableCardContainer";
|
|
18
19
|
export * from "./components/TableCards";
|
|
19
20
|
export * from "./components/TableComponent";
|
|
21
|
+
export * from "./components/TableControls";
|
|
20
22
|
export * from "./components/TableFilter";
|
|
21
23
|
export * from "./components/TableFilterTags";
|
|
22
24
|
export * from "./components/TableFooter";
|
|
23
25
|
export * from "./components/TableHeader";
|
|
26
|
+
export * from "./components/TableLoadingComponent";
|
|
24
27
|
export * from "./components/TableOrderer";
|
|
25
28
|
export * from "./components/TablePagination";
|
|
29
|
+
export * from "./components/TableReloadButton";
|
|
26
30
|
export * from "./components/TableSelector";
|
|
27
31
|
export * from "./components/TableSorter";
|
|
28
32
|
export * from "./components/TableViewer";
|