@bsol-oss/react-datatable5 1.0.38 → 1.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts 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
- import { ReactNode } from 'react';
6
- import { TextProps, TooltipProps } from '@chakra-ui/react';
5
+ import React$1, { ReactNode } from 'react';
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,30 +93,73 @@ 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
 
95
- declare const DensityToggleButton: () => react_jsx_runtime.JSX.Element;
96
+ declare const DefaultTable: ({ totalText }: {
97
+ totalText?: string | undefined;
98
+ }) => react_jsx_runtime.JSX.Element;
96
99
 
97
- declare const EditFilterButton: () => react_jsx_runtime.JSX.Element;
100
+ interface DensityToggleButtonProps {
101
+ icon?: React$1.ReactElement;
102
+ text?: string;
103
+ }
104
+ declare const DensityToggleButton: ({ text, icon, }: DensityToggleButtonProps) => react_jsx_runtime.JSX.Element;
105
+
106
+ interface EditFilterButtonProps {
107
+ text?: string;
108
+ title?: string;
109
+ closeText?: string;
110
+ resetText?: string;
111
+ icon?: React.ReactElement;
112
+ }
113
+ declare const EditFilterButton: ({ text, title, closeText, resetText, icon, ...props }: EditFilterButtonProps) => react_jsx_runtime.JSX.Element;
98
114
 
99
- declare const EditOrderButton: () => react_jsx_runtime.JSX.Element;
115
+ interface EditOrderButtonProps {
116
+ title?: string;
117
+ icon?: React$1.ReactElement;
118
+ text?: string;
119
+ }
120
+ declare const EditOrderButton: ({ text, icon, title, }: EditOrderButtonProps) => react_jsx_runtime.JSX.Element;
100
121
 
101
- declare const EditSortingButton: () => react_jsx_runtime.JSX.Element;
122
+ interface EditSortingButtonProps {
123
+ title?: string;
124
+ icon?: React.ReactElement;
125
+ text?: string;
126
+ }
127
+ declare const EditSortingButton: ({ text, icon, title, }: EditSortingButtonProps) => react_jsx_runtime.JSX.Element;
102
128
 
103
- declare const EditViewButton: () => react_jsx_runtime.JSX.Element;
129
+ interface EditViewButtonProps {
130
+ text?: string;
131
+ icon?: React$1.ReactElement;
132
+ title?: string;
133
+ }
134
+ declare const EditViewButton: ({ text, icon, title, }: EditViewButtonProps) => react_jsx_runtime.JSX.Element;
104
135
 
105
- declare const GlobalFilter: () => react_jsx_runtime.JSX.Element;
136
+ declare const GlobalFilter: ({ icon }: {
137
+ icon?: react_icons_lib.IconType | undefined;
138
+ }) => react_jsx_runtime.JSX.Element;
106
139
 
107
140
  interface PageSizeControlProps {
108
141
  pageSizes?: number[];
109
142
  }
110
143
  declare const PageSizeControl: ({ pageSizes, }: PageSizeControlProps) => react_jsx_runtime.JSX.Element;
111
144
 
112
- declare const ResetFilteringButton: () => react_jsx_runtime.JSX.Element;
145
+ interface ResetFilteringButtonProps {
146
+ text?: string;
147
+ }
148
+ declare const ResetFilteringButton: ({ text, }: ResetFilteringButtonProps) => react_jsx_runtime.JSX.Element;
149
+
150
+ interface ResetSelectionButtonProps {
151
+ text?: string;
152
+ }
153
+ declare const ResetSelectionButton: ({ text, }: ResetSelectionButtonProps) => react_jsx_runtime.JSX.Element;
113
154
 
114
- declare const ResetSelectionButton: () => react_jsx_runtime.JSX.Element;
155
+ interface ResetSortingButtonProps {
156
+ text?: string;
157
+ }
158
+ declare const ResetSortingButton: ({ text, }: ResetSortingButtonProps) => react_jsx_runtime.JSX.Element;
115
159
 
116
- declare const ResetSortingButton: () => react_jsx_runtime.JSX.Element;
160
+ declare const RowCountText: () => react_jsx_runtime.JSX.Element;
117
161
 
118
- interface TableProps {
162
+ interface TableProps extends TableProps$1 {
119
163
  showLoading?: boolean;
120
164
  loadingComponent?: JSX.Element;
121
165
  children: ReactNode;
@@ -148,6 +192,11 @@ interface TableCardsProps {
148
192
  }
149
193
  declare const TableCards: ({}: TableCardsProps) => react_jsx_runtime.JSX.Element;
150
194
 
195
+ interface TableRendererProps<TData> {
196
+ render: (render: Table$1<TData>) => React$1.ReactElement;
197
+ }
198
+ declare const TableComponentRenderer: <TData>({ render, }: TableRendererProps<TData>) => React$1.ReactElement<any, string | React$1.JSXElementConstructor<any>>;
199
+
151
200
  declare const TableFilter: () => react_jsx_runtime.JSX.Element;
152
201
 
153
202
  interface TableFooterProps {
@@ -209,4 +258,4 @@ declare const useDataTable: () => {
209
258
  loading: boolean;
210
259
  };
211
260
 
212
- export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, GlobalFilter, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, type Result, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableFilter, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableOrderer, TablePagination, type TableProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
261
+ export { type DataResponse, DataTable, type DataTableProps, DataTableServer, type DataTableServerProps, DefaultTable, DensityToggleButton, type DensityToggleButtonProps, EditFilterButton, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, EditViewButton, type EditViewButtonProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, type PaginationProps, ResetFilteringButton, type ResetFilteringButtonProps, ResetSelectionButton, type ResetSelectionButtonProps, ResetSortingButton, type ResetSortingButtonProps, type Result, RowCountText, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableComponentRenderer, TableFilter, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableOrderer, TablePagination, type TableProps, type TableRendererProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, useDataFromUrl, type useDataFromUrlProps, type useDataFromUrlReturn, useDataTable };
package/dist/index.js CHANGED
@@ -6,11 +6,11 @@ var react = require('react');
6
6
  var matchSorterUtils = require('@tanstack/match-sorter-utils');
7
7
  var axios = require('axios');
8
8
  var react$1 = require('@chakra-ui/react');
9
- var ai = require('react-icons/ai');
10
9
  var md = require('react-icons/md');
11
- var icons = require('@chakra-ui/icons');
12
10
  var io = require('react-icons/io');
11
+ var icons = require('@chakra-ui/icons');
13
12
  var table = require('@chakra-ui/table');
13
+ var ai = require('react-icons/ai');
14
14
 
15
15
  const TableContext = react.createContext({
16
16
  table: {},
@@ -129,7 +129,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
129
129
  columnOrder,
130
130
  globalFilter,
131
131
  density: densityState,
132
- rowSelection
132
+ rowSelection,
133
133
  },
134
134
  onColumnOrderChange: (state) => {
135
135
  setColumnOrder(state);
@@ -166,7 +166,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
166
166
  },
167
167
  globalFilter: globalFilter,
168
168
  setGlobalFilter: setGlobalFilter,
169
- loading: false
169
+ loading: false,
170
170
  }, children: children }));
171
171
  };
172
172
 
@@ -297,23 +297,16 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
297
297
  }, children: children }));
298
298
  };
299
299
 
300
- const DensityToggleButton = () => {
301
- const { table } = react.useContext(TableContext);
302
- return (jsxRuntime.jsx(react$1.Tooltip, { label: "Toggle Density", children: jsxRuntime.jsx(react$1.IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: jsxRuntime.jsx(ai.AiOutlineColumnWidth, {}), onClick: (event) => {
303
- table.toggleDensity();
304
- } }) }));
300
+ const useDataTable = () => {
301
+ const { table, refreshData, globalFilter, setGlobalFilter, loading } = react.useContext(TableContext);
302
+ return { table, refreshData, globalFilter, setGlobalFilter, loading };
305
303
  };
306
304
 
307
- const ResetFilteringButton = () => {
308
- const { table } = react.useContext(TableContext);
305
+ const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
306
+ const { table } = useDataTable();
309
307
  return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
310
308
  table.resetColumnFilters();
311
- }, children: "Reset Filtering" }));
312
- };
313
-
314
- const useDataTable = () => {
315
- const { table, refreshData, globalFilter, setGlobalFilter, loading } = react.useContext(TableContext);
316
- return { table, refreshData, globalFilter, setGlobalFilter, loading };
309
+ }, children: text }));
317
310
  };
318
311
 
319
312
  const TableFilter = () => {
@@ -330,96 +323,9 @@ const TableFilter = () => {
330
323
  }) }));
331
324
  };
332
325
 
333
- const EditFilterButton = () => {
334
- return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Filter", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", variant: "ghost", icon: jsxRuntime.jsx(md.MdFilterAlt, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "1rem", children: [jsxRuntime.jsx(TableFilter, {}), jsxRuntime.jsx(ResetFilteringButton, {})] }) })] })] }));
335
- };
336
-
337
- const ColumnOrderChanger = ({ columns }) => {
338
- const [order, setOrder] = react.useState([]);
339
- const [originalOrder, setOriginalOrder] = react.useState([]);
340
- const { table } = useDataTable();
341
- const handleChangeOrder = (startIndex, endIndex) => {
342
- const newOrder = Array.from(order);
343
- const [removed] = newOrder.splice(startIndex, 1);
344
- newOrder.splice(endIndex, 0, removed);
345
- setOrder(newOrder);
346
- };
347
- react.useEffect(() => {
348
- setOrder(columns);
349
- }, [columns]);
350
- react.useEffect(() => {
351
- if (originalOrder.length > 0) {
352
- return;
353
- }
354
- if (columns.length <= 0) {
355
- return;
356
- }
357
- setOriginalOrder(columns);
358
- }, [columns]);
359
- 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: () => {
360
- const prevIndex = index - 1;
361
- if (prevIndex >= 0) {
362
- handleChangeOrder(index, prevIndex);
363
- }
364
- }, disabled: index === 0, "aria-label": "", children: jsxRuntime.jsx(md.MdArrowUpward, {}) }), table
365
- .getAllFlatColumns()
366
- .filter((column) => {
367
- return column.id === columnId;
368
- })
369
- .map((column) => {
370
- const displayName = column.columnDef.meta === undefined
371
- ? column.id
372
- : column.columnDef.meta.displayName;
373
- return jsxRuntime.jsx(jsxRuntime.Fragment, { children: displayName });
374
- }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => {
375
- const nextIndex = index + 1;
376
- if (nextIndex < order.length) {
377
- handleChangeOrder(index, nextIndex);
378
- }
379
- }, 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: () => {
380
- table.setColumnOrder(order);
381
- }, children: "Apply" }), jsxRuntime.jsx(react$1.Button, { onClick: () => {
382
- table.setColumnOrder(originalOrder);
383
- }, children: "Reset" })] })] }));
384
- };
385
- const TableOrderer = () => {
386
- const { table } = useDataTable();
387
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
388
- };
389
-
390
- const EditOrderButton = () => {
391
- return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Change Order", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", variant: "ghost", icon: jsxRuntime.jsx(md.MdOutlineMoveDown, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsx(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: jsxRuntime.jsx(TableOrderer, {}) }) })] })] }));
392
- };
393
-
394
- const ResetSortingButton = () => {
395
- const { table } = react.useContext(TableContext);
396
- return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
397
- table.resetSorting();
398
- }, children: "Reset Sorting" }));
399
- };
400
-
401
- const TableSorter = () => {
402
- const { table } = useDataTable();
403
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsx(jsxRuntime.Fragment, { children: headerGroup.headers.map((header) => {
404
- const displayName = header.column.columnDef.meta === undefined
405
- ? header.column.id
406
- : header.column.columnDef.meta.displayName;
407
- 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) => {
408
- header.column.toggleSorting();
409
- }, children: [header.column.getIsSorted() === false && (
410
- // <Text>To No sort</Text>
411
- jsxRuntime.jsx(icons.UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
412
- // <Text>To asc</Text>
413
- jsxRuntime.jsx(icons.ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
414
- // <Text>To desc</Text>
415
- jsxRuntime.jsx(icons.ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsxRuntime.jsx(react$1.Button, { onClick: (e) => {
416
- header.column.clearSorting();
417
- }, children: jsxRuntime.jsx(icons.CloseIcon, {}) }))] })) }));
418
- }) }))) }));
419
- };
420
-
421
- const EditSortingButton = () => {
422
- return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.Tooltip, { label: "Filter", children: jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "filter", variant: "ghost", icon: jsxRuntime.jsx(md.MdOutlineSort, {}) }) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(TableSorter, {}), jsxRuntime.jsx(ResetSortingButton, {})] }) })] })] }));
326
+ const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsxRuntime.jsx(md.MdFilterAlt, {}), ...props }) => {
327
+ const filterModal = react$1.useDisclosure();
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 }) })] })] })] }));
423
329
  };
424
330
 
425
331
  const TableViewer = () => {
@@ -432,37 +338,28 @@ const TableViewer = () => {
432
338
  }) }));
433
339
  };
434
340
 
435
- const EditViewButton = () => {
436
- return (jsxRuntime.jsxs(react$1.Popover, { placement: "auto", children: [jsxRuntime.jsx(react$1.PopoverTrigger, { children: jsxRuntime.jsx(react$1.IconButton, { "aria-label": "view", variant: "ghost", icon: jsxRuntime.jsx(io.IoMdEye, {}) }) }), jsxRuntime.jsxs(react$1.PopoverContent, { width: "auto", children: [jsxRuntime.jsx(react$1.PopoverArrow, {}), jsxRuntime.jsx(react$1.PopoverBody, { children: jsxRuntime.jsx(TableViewer, {}) })] })] }));
341
+ const EditViewButton = ({ text, icon = jsxRuntime.jsx(io.IoMdEye, {}), title = "Edit View", }) => {
342
+ const viewModel = react$1.useDisclosure();
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, {}) })] })] })] }));
437
344
  };
438
345
 
439
- const GlobalFilter = () => {
346
+ const GlobalFilter = ({ icon = md.MdSearch }) => {
440
347
  const { globalFilter, setGlobalFilter } = useDataTable();
441
- return (jsxRuntime.jsx(react$1.Input, { value: globalFilter, onChange: (e) => {
442
- setGlobalFilter(e.target.value);
443
- } }));
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
+ } })] }) }) }));
444
351
  };
445
352
 
446
353
  const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
447
- const { table } = react.useContext(TableContext);
354
+ const { table } = useDataTable();
448
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: () => {
449
356
  table.setPageSize(Number(pageSize));
450
357
  }, children: pageSize }))) })] }) }));
451
358
  };
452
359
 
453
- const ResetSelectionButton = () => {
360
+ const RowCountText = () => {
454
361
  const { table } = react.useContext(TableContext);
455
- return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
456
- table.resetRowSelection();
457
- }, children: "Reset Selection" }));
458
- };
459
-
460
- const Table = ({ children, showLoading = false, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), ...props }) => {
461
- const { table, loading } = useDataTable();
462
- if (showLoading) {
463
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [loading && loadingComponent, !loading && (jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "scroll", ...props, children: children }))] }));
464
- }
465
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "scroll", ...props, children: children }) }));
362
+ return jsxRuntime.jsx(react$1.Text, { children: table.getRowCount() });
466
363
  };
467
364
 
468
365
  const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
@@ -514,22 +411,6 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
514
411
  onChange: row.getToggleSelectedHandler() }) }))] }));
515
412
  };
516
413
 
517
- const TableCardContainer = ({ children, ...props }) => {
518
- return (jsxRuntime.jsx(react$1.Grid, { gridTemplateColumns: ["1fr", "1fr 1fr", "1fr 1fr 1fr"], gap: "0.5rem", ...props, children: children }));
519
- };
520
-
521
- const TableCards = ({}) => {
522
- const { table } = react.useContext(TableContext);
523
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getRowModel().rows.map((row) => {
524
- 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(),
525
- disabled: !row.getCanSelect(),
526
- // indeterminate: row.getIsSomeSelected(),
527
- onChange: row.getToggleSelectedHandler() }), row.getVisibleCells().map((cell) => {
528
- return (jsxRuntime.jsx(react$1.Box, { children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }));
529
- })] }) }, crypto.randomUUID()));
530
- }) }));
531
- };
532
-
533
414
  const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
534
415
  const table = useDataTable().table;
535
416
  const SELECTION_BOX_WIDTH = 20;
@@ -628,9 +509,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
628
509
  // styling resize and pinning end
629
510
  display: "grid", children: [jsxRuntime.jsxs(react$1.Menu, { children: [jsxRuntime.jsx(react$1.MenuButton, { as: react$1.Box, padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxRuntime.jsxs(react$1.Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
630
511
  ? null
631
- : reactTable.flexRender(header.column.columnDef.header, header.getContext()), jsxRuntime.jsx(react$1.Box, { children: header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [header.column.getIsSorted() === false && (
632
- // <UpDownIcon />
633
- jsxRuntime.jsx(jsxRuntime.Fragment, {})), header.column.getIsSorted() === "asc" && (jsxRuntime.jsx(icons.ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsxRuntime.jsx(icons.ChevronDownIcon, {}))] })) }), jsxRuntime.jsx(react$1.Box, { children: header.column.getIsFiltered() && jsxRuntime.jsx(md.MdFilterListAlt, {}) })] }) }), jsxRuntime.jsx(react$1.Portal, { children: jsxRuntime.jsxs(react$1.MenuList, { children: [!header.column.getIsPinned() && (jsxRuntime.jsx(react$1.MenuItem, { icon: jsxRuntime.jsx(md.MdPushPin, {}), onClick: () => {
512
+ : reactTable.flexRender(header.column.columnDef.header, header.getContext()), jsxRuntime.jsx(react$1.Box, { children: header.column.getCanSort() && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [header.column.getIsSorted() === false && (jsxRuntime.jsx(jsxRuntime.Fragment, {})), header.column.getIsSorted() === "asc" && (jsxRuntime.jsx(icons.ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsxRuntime.jsx(icons.ChevronDownIcon, {}))] })) }), jsxRuntime.jsx(react$1.Box, { children: header.column.getIsFiltered() && jsxRuntime.jsx(md.MdFilterListAlt, {}) })] }) }), jsxRuntime.jsx(react$1.Portal, { children: jsxRuntime.jsxs(react$1.MenuList, { children: [!header.column.getIsPinned() && (jsxRuntime.jsx(react$1.MenuItem, { icon: jsxRuntime.jsx(md.MdPushPin, {}), onClick: () => {
634
513
  header.column.pin("left");
635
514
  }, children: "Pin Column" })), header.column.getIsPinned() && (jsxRuntime.jsx(react$1.MenuItem, { icon: jsxRuntime.jsx(md.MdCancel, {}), onClick: () => {
636
515
  header.column.pin(false);
@@ -651,11 +530,154 @@ const TablePagination = ({}) => {
651
530
  return (jsxRuntime.jsxs(react$1.ButtonGroup, { isAttached: true, children: [jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdFirstPage, {}), onClick: () => firstPage(), isDisabled: !getCanPreviousPage(), "aria-label": "first-page", variant: "ghost" }), jsxRuntime.jsx(react$1.IconButton, { icon: jsxRuntime.jsx(md.MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page", variant: "ghost" }), jsxRuntime.jsx(react$1.Button, { variant: "ghost", onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", variant: "ghost", children: jsxRuntime.jsx(md.MdArrowForward, {}) }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", variant: "ghost", children: jsxRuntime.jsx(md.MdLastPage, {}) })] }));
652
531
  };
653
532
 
654
- const SelectAllRowsToggle = () => {
533
+ const Table = ({ children, showLoading = false, loadingComponent = jsxRuntime.jsx(jsxRuntime.Fragment, { children: "Loading..." }), ...props }) => {
534
+ const { table, loading } = useDataTable();
535
+ if (showLoading) {
536
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [loading && loadingComponent, !loading && (jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }))] }));
537
+ }
538
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react$1.Table, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
539
+ };
540
+
541
+ const DefaultTable = ({ totalText = "Total:" }) => {
542
+ return (jsxRuntime.jsxs(react$1.Grid, { templateRows: "auto 1fr auto", templateColumns: "1fr 1fr", children: [jsxRuntime.jsxs(react$1.Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsxRuntime.jsx(react$1.Box, { children: jsxRuntime.jsx(EditViewButton, { text: "View" }) }), jsxRuntime.jsxs(react$1.Flex, { gap: "1rem", justifySelf: "end", children: [jsxRuntime.jsx(GlobalFilter, {}), jsxRuntime.jsx(EditFilterButton, { text: "Advanced Filter" })] })] }), jsxRuntime.jsx(react$1.Flex, { overflow: "auto", gridColumn: "1 / span 2", justifyContent: "center", children: jsxRuntime.jsxs(Table, { variant: "striped", alignSelf: "center", children: [jsxRuntime.jsx(TableHeader, { canResize: true }), jsxRuntime.jsx(TableBody, {}), jsxRuntime.jsx(TableFooter, {})] }) }), jsxRuntime.jsxs(react$1.Flex, { gap: "1rem", alignItems: "center", children: [jsxRuntime.jsx(PageSizeControl, { pageSizes: [25, 50] }), jsxRuntime.jsxs(react$1.Flex, { children: [jsxRuntime.jsx(react$1.Text, { paddingRight: "0.5rem", children: totalText }), jsxRuntime.jsx(RowCountText, {})] })] }), jsxRuntime.jsx(react$1.Box, { justifySelf: "end", children: jsxRuntime.jsx(TablePagination, {}) })] }));
543
+ };
544
+
545
+ const DensityToggleButton = ({ text, icon = jsxRuntime.jsx(ai.AiOutlineColumnWidth, {}), }) => {
546
+ const { table } = useDataTable();
547
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: icon, onClick: () => {
548
+ table.toggleDensity();
549
+ } })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
550
+ table.toggleDensity();
551
+ }, children: text }))] }));
552
+ };
553
+
554
+ const ColumnOrderChanger = ({ columns }) => {
555
+ const [order, setOrder] = react.useState([]);
556
+ const [originalOrder, setOriginalOrder] = react.useState([]);
557
+ const { table } = useDataTable();
558
+ const handleChangeOrder = (startIndex, endIndex) => {
559
+ const newOrder = Array.from(order);
560
+ const [removed] = newOrder.splice(startIndex, 1);
561
+ newOrder.splice(endIndex, 0, removed);
562
+ setOrder(newOrder);
563
+ };
564
+ react.useEffect(() => {
565
+ setOrder(columns);
566
+ }, [columns]);
567
+ react.useEffect(() => {
568
+ if (originalOrder.length > 0) {
569
+ return;
570
+ }
571
+ if (columns.length <= 0) {
572
+ return;
573
+ }
574
+ setOriginalOrder(columns);
575
+ }, [columns]);
576
+ return (jsxRuntime.jsxs(react$1.Flex, { gap: "0.5rem", flexFlow: "column", children: [jsxRuntime.jsx(react$1.Flex, { gap: "0.5rem", flexFlow: "column", children: order.map((columnId, index) => (jsxRuntime.jsxs(react$1.Flex, { gap: "0.5rem", alignItems: "center", justifyContent: "space-between", children: [jsxRuntime.jsx(react$1.IconButton, { onClick: () => {
577
+ const prevIndex = index - 1;
578
+ if (prevIndex >= 0) {
579
+ handleChangeOrder(index, prevIndex);
580
+ }
581
+ }, disabled: index === 0, "aria-label": "", children: jsxRuntime.jsx(md.MdArrowUpward, {}) }), table
582
+ .getAllFlatColumns()
583
+ .filter((column) => {
584
+ return column.id === columnId;
585
+ })
586
+ .map((column) => {
587
+ const displayName = column.columnDef.meta === undefined
588
+ ? column.id
589
+ : column.columnDef.meta.displayName;
590
+ return jsxRuntime.jsx(jsxRuntime.Fragment, { children: displayName });
591
+ }), jsxRuntime.jsx(react$1.IconButton, { onClick: () => {
592
+ const nextIndex = index + 1;
593
+ if (nextIndex < order.length) {
594
+ handleChangeOrder(index, nextIndex);
595
+ }
596
+ }, disabled: index === order.length - 1, "aria-label": "", children: jsxRuntime.jsx(md.MdArrowDownward, {}) })] }, columnId))) }), jsxRuntime.jsxs(react$1.Flex, { gap: "0.25rem", children: [jsxRuntime.jsx(react$1.Button, { onClick: () => {
597
+ table.setColumnOrder(order);
598
+ }, children: "Apply" }), jsxRuntime.jsx(react$1.Button, { onClick: () => {
599
+ table.setColumnOrder(originalOrder);
600
+ }, children: "Reset" })] })] }));
601
+ };
602
+ const TableOrderer = () => {
603
+ const { table } = useDataTable();
604
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
605
+ };
606
+
607
+ const EditOrderButton = ({ text, icon = jsxRuntime.jsx(md.MdOutlineMoveDown, {}), title = "Change Order", }) => {
608
+ const orderModal = react$1.useDisclosure();
609
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: orderModal.onOpen, "aria-label": "change order" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: orderModal.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: orderModal.isOpen, onClose: orderModal.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { padding: "0 0 1rem 0", children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsx(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: jsxRuntime.jsx(TableOrderer, {}) }) })] })] })] }));
610
+ };
611
+
612
+ const ResetSortingButton = ({ text = "Reset Sorting", }) => {
613
+ const { table } = useDataTable();
614
+ return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
615
+ table.resetSorting();
616
+ }, children: text }));
617
+ };
618
+
619
+ const TableSorter = () => {
620
+ const { table } = useDataTable();
621
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsxRuntime.jsx(jsxRuntime.Fragment, { children: headerGroup.headers.map((header) => {
622
+ const displayName = header.column.columnDef.meta === undefined
623
+ ? header.column.id
624
+ : header.column.columnDef.meta.displayName;
625
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: header.column.getCanSort() && (jsxRuntime.jsxs(react$1.Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsxRuntime.jsx(react$1.Text, { children: displayName }), jsxRuntime.jsxs(react$1.Button, { variant: "ghost", onClick: (e) => {
626
+ header.column.toggleSorting();
627
+ }, children: [header.column.getIsSorted() === false && (
628
+ // <Text>To No sort</Text>
629
+ jsxRuntime.jsx(icons.UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
630
+ // <Text>To asc</Text>
631
+ jsxRuntime.jsx(icons.ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
632
+ // <Text>To desc</Text>
633
+ jsxRuntime.jsx(icons.ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsxRuntime.jsx(react$1.Button, { onClick: (e) => {
634
+ header.column.clearSorting();
635
+ }, children: jsxRuntime.jsx(icons.CloseIcon, {}) }))] })) }));
636
+ }) }))) }));
637
+ };
638
+
639
+ const EditSortingButton = ({ text, icon = jsxRuntime.jsx(md.MdOutlineSort, {}), title = "Edit Sorting", }) => {
640
+ const sortingModal = react$1.useDisclosure();
641
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!!text === false && (jsxRuntime.jsx(react$1.IconButton, { icon: icon, variant: "ghost", onClick: sortingModal.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: icon, variant: "ghost", onClick: sortingModal.onOpen, children: text })), jsxRuntime.jsxs(react$1.Modal, { isOpen: sortingModal.isOpen, onClose: sortingModal.onClose, size: ["full", "full", "md", "md"], children: [jsxRuntime.jsx(react$1.ModalOverlay, {}), jsxRuntime.jsxs(react$1.ModalContent, { padding: "0 0 1rem 0", children: [jsxRuntime.jsx(react$1.ModalHeader, { children: title }), jsxRuntime.jsx(react$1.ModalCloseButton, {}), jsxRuntime.jsx(react$1.ModalBody, { children: jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(TableSorter, {}), jsxRuntime.jsx(ResetSortingButton, {})] }) })] })] })] }));
642
+ };
643
+
644
+ const ResetSelectionButton = ({ text = "Reset Selection", }) => {
645
+ const { table } = useDataTable();
646
+ return (jsxRuntime.jsx(react$1.Button, { onClick: () => {
647
+ table.resetRowSelection();
648
+ }, children: text }));
649
+ };
650
+
651
+ const TableCardContainer = ({ children, ...props }) => {
652
+ return (jsxRuntime.jsx(react$1.Grid, { gridTemplateColumns: ["1fr", "1fr 1fr", "1fr 1fr 1fr"], gap: "0.5rem", ...props, children: children }));
653
+ };
654
+
655
+ const TableCards = ({}) => {
656
+ const { table } = react.useContext(TableContext);
657
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getRowModel().rows.map((row) => {
658
+ return (jsxRuntime.jsx(react$1.Card, { children: jsxRuntime.jsxs(react$1.CardBody, { display: "flex", flexFlow: "column", gap: "0.5rem", children: [jsxRuntime.jsx(react$1.Checkbox, { isChecked: row.getIsSelected(),
659
+ disabled: !row.getCanSelect(),
660
+ // indeterminate: row.getIsSomeSelected(),
661
+ onChange: row.getToggleSelectedHandler() }), row.getVisibleCells().map((cell) => {
662
+ return (jsxRuntime.jsx(react$1.Box, { children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }));
663
+ })] }) }, crypto.randomUUID()));
664
+ }) }));
665
+ };
666
+
667
+ const TableComponentRenderer = ({ render = () => {
668
+ throw Error("Not Implemented");
669
+ }, }) => {
670
+ const { table } = useDataTable();
671
+ return render(table);
672
+ };
673
+
674
+ const SelectAllRowsToggle = ({ selectAllIcon = jsxRuntime.jsx(md.MdOutlineChecklist, {}), clearAllIcon = jsxRuntime.jsx(md.MdClear, {}), selectAllText, clearAllText, }) => {
655
675
  const { table } = react.useContext(TableContext);
656
- return (jsxRuntime.jsx(react$1.Tooltip, { label: table.getIsAllRowsSelected() ? "Clear All" : "Select All", children: jsxRuntime.jsx(react$1.IconButton, { variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? "Clear All" : "Select All", icon: table.getIsAllRowsSelected() ? jsxRuntime.jsx(md.MdClear, {}) : jsxRuntime.jsx(md.MdOutlineChecklist, {}), onClick: (event) => {
657
- table.getToggleAllRowsSelectedHandler()(event);
658
- } }) }));
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) => {
677
+ table.getToggleAllRowsSelectedHandler()(event);
678
+ } })), !!selectAllText !== false && (jsxRuntime.jsx(react$1.Button, { leftIcon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", onClick: (event) => {
679
+ table.getToggleAllRowsSelectedHandler()(event);
680
+ }, children: table.getIsAllRowsSelected() ? clearAllText : selectAllText }))] }));
659
681
  };
660
682
 
661
683
  const TableSelector = () => {
@@ -674,6 +696,7 @@ const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipP
674
696
 
675
697
  exports.DataTable = DataTable;
676
698
  exports.DataTableServer = DataTableServer;
699
+ exports.DefaultTable = DefaultTable;
677
700
  exports.DensityToggleButton = DensityToggleButton;
678
701
  exports.EditFilterButton = EditFilterButton;
679
702
  exports.EditOrderButton = EditOrderButton;
@@ -684,10 +707,12 @@ exports.PageSizeControl = PageSizeControl;
684
707
  exports.ResetFilteringButton = ResetFilteringButton;
685
708
  exports.ResetSelectionButton = ResetSelectionButton;
686
709
  exports.ResetSortingButton = ResetSortingButton;
710
+ exports.RowCountText = RowCountText;
687
711
  exports.Table = Table;
688
712
  exports.TableBody = TableBody;
689
713
  exports.TableCardContainer = TableCardContainer;
690
714
  exports.TableCards = TableCards;
715
+ exports.TableComponentRenderer = TableComponentRenderer;
691
716
  exports.TableFilter = TableFilter;
692
717
  exports.TableFooter = TableFooter;
693
718
  exports.TableHeader = TableHeader;
package/dist/index.mjs CHANGED
@@ -3,12 +3,12 @@ import { makeStateUpdater, functionalUpdate, useReactTable, getCoreRowModel, get
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 { Tooltip, IconButton, Button, Box, Text, Input, Popover, PopoverTrigger, PopoverContent, PopoverArrow, PopoverBody, Flex, Switch, Menu, MenuButton, MenuList, MenuItem, Table as Table$1, FormLabel, Checkbox, Grid, Card, CardBody, Tfoot, Tr as Tr$1, Th, Thead, Portal, ButtonGroup, Icon } from '@chakra-ui/react';
7
- import { AiOutlineColumnWidth } from 'react-icons/ai';
8
- import { MdFilterAlt, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdFilterListAlt, MdPushPin, MdCancel, MdSort, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdClear, MdOutlineChecklist } from 'react-icons/md';
9
- import { UpDownIcon, ChevronDownIcon, ChevronUpIcon, CloseIcon } from '@chakra-ui/icons';
6
+ import { Button, Box, Text, Input, useDisclosure, IconButton, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, Flex, ModalFooter, Switch, InputGroup, InputLeftElement, Icon, Menu, MenuButton, MenuList, MenuItem, FormLabel, Checkbox, Tfoot, Tr as Tr$1, Th, Thead, Portal, ButtonGroup, Table as Table$1, Grid, Card, CardBody, Tooltip } from '@chakra-ui/react';
7
+ import { MdFilterAlt, MdSearch, MdFilterListAlt, MdPushPin, MdCancel, MdSort, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdOutlineChecklist, MdClear } from 'react-icons/md';
10
8
  import { IoMdEye, IoMdClose, IoMdCheckbox } from 'react-icons/io';
9
+ import { ChevronDownIcon, ChevronUpIcon, UpDownIcon, CloseIcon } from '@chakra-ui/icons';
11
10
  import { Tbody, Tr, Td } from '@chakra-ui/table';
11
+ import { AiOutlineColumnWidth } from 'react-icons/ai';
12
12
 
13
13
  const TableContext = createContext({
14
14
  table: {},
@@ -127,7 +127,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
127
127
  columnOrder,
128
128
  globalFilter,
129
129
  density: densityState,
130
- rowSelection
130
+ rowSelection,
131
131
  },
132
132
  onColumnOrderChange: (state) => {
133
133
  setColumnOrder(state);
@@ -164,7 +164,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
164
164
  },
165
165
  globalFilter: globalFilter,
166
166
  setGlobalFilter: setGlobalFilter,
167
- loading: false
167
+ loading: false,
168
168
  }, children: children }));
169
169
  };
170
170
 
@@ -295,23 +295,16 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
295
295
  }, children: children }));
296
296
  };
297
297
 
298
- const DensityToggleButton = () => {
299
- const { table } = useContext(TableContext);
300
- return (jsx(Tooltip, { label: "Toggle Density", children: jsx(IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: jsx(AiOutlineColumnWidth, {}), onClick: (event) => {
301
- table.toggleDensity();
302
- } }) }));
298
+ const useDataTable = () => {
299
+ const { table, refreshData, globalFilter, setGlobalFilter, loading } = useContext(TableContext);
300
+ return { table, refreshData, globalFilter, setGlobalFilter, loading };
303
301
  };
304
302
 
305
- const ResetFilteringButton = () => {
306
- const { table } = useContext(TableContext);
303
+ const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
304
+ const { table } = useDataTable();
307
305
  return (jsx(Button, { onClick: () => {
308
306
  table.resetColumnFilters();
309
- }, children: "Reset Filtering" }));
310
- };
311
-
312
- const useDataTable = () => {
313
- const { table, refreshData, globalFilter, setGlobalFilter, loading } = useContext(TableContext);
314
- return { table, refreshData, globalFilter, setGlobalFilter, loading };
307
+ }, children: text }));
315
308
  };
316
309
 
317
310
  const TableFilter = () => {
@@ -328,96 +321,9 @@ const TableFilter = () => {
328
321
  }) }));
329
322
  };
330
323
 
331
- const EditFilterButton = () => {
332
- return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Filter", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", variant: "ghost", icon: jsx(MdFilterAlt, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsxs(Flex, { flexFlow: "column", gap: "1rem", children: [jsx(TableFilter, {}), jsx(ResetFilteringButton, {})] }) })] })] }));
333
- };
334
-
335
- const ColumnOrderChanger = ({ columns }) => {
336
- const [order, setOrder] = useState([]);
337
- const [originalOrder, setOriginalOrder] = useState([]);
338
- const { table } = useDataTable();
339
- const handleChangeOrder = (startIndex, endIndex) => {
340
- const newOrder = Array.from(order);
341
- const [removed] = newOrder.splice(startIndex, 1);
342
- newOrder.splice(endIndex, 0, removed);
343
- setOrder(newOrder);
344
- };
345
- useEffect(() => {
346
- setOrder(columns);
347
- }, [columns]);
348
- useEffect(() => {
349
- if (originalOrder.length > 0) {
350
- return;
351
- }
352
- if (columns.length <= 0) {
353
- return;
354
- }
355
- setOriginalOrder(columns);
356
- }, [columns]);
357
- 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: () => {
358
- const prevIndex = index - 1;
359
- if (prevIndex >= 0) {
360
- handleChangeOrder(index, prevIndex);
361
- }
362
- }, disabled: index === 0, "aria-label": "", children: jsx(MdArrowUpward, {}) }), table
363
- .getAllFlatColumns()
364
- .filter((column) => {
365
- return column.id === columnId;
366
- })
367
- .map((column) => {
368
- const displayName = column.columnDef.meta === undefined
369
- ? column.id
370
- : column.columnDef.meta.displayName;
371
- return jsx(Fragment, { children: displayName });
372
- }), jsx(IconButton, { onClick: () => {
373
- const nextIndex = index + 1;
374
- if (nextIndex < order.length) {
375
- handleChangeOrder(index, nextIndex);
376
- }
377
- }, disabled: index === order.length - 1, "aria-label": "", children: jsx(MdArrowDownward, {}) })] }, columnId))) }), jsxs(Flex, { gap: "0.25rem", children: [jsx(Button, { onClick: () => {
378
- table.setColumnOrder(order);
379
- }, children: "Apply" }), jsx(Button, { onClick: () => {
380
- table.setColumnOrder(originalOrder);
381
- }, children: "Reset" })] })] }));
382
- };
383
- const TableOrderer = () => {
384
- const { table } = useDataTable();
385
- return (jsx(Fragment, { children: jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
386
- };
387
-
388
- const EditOrderButton = () => {
389
- return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Change Order", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", variant: "ghost", icon: jsx(MdOutlineMoveDown, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(Flex, { flexFlow: "column", gap: "0.25rem", children: jsx(TableOrderer, {}) }) })] })] }));
390
- };
391
-
392
- const ResetSortingButton = () => {
393
- const { table } = useContext(TableContext);
394
- return (jsx(Button, { onClick: () => {
395
- table.resetSorting();
396
- }, children: "Reset Sorting" }));
397
- };
398
-
399
- const TableSorter = () => {
400
- const { table } = useDataTable();
401
- return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
402
- const displayName = header.column.columnDef.meta === undefined
403
- ? header.column.id
404
- : header.column.columnDef.meta.displayName;
405
- 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) => {
406
- header.column.toggleSorting();
407
- }, children: [header.column.getIsSorted() === false && (
408
- // <Text>To No sort</Text>
409
- jsx(UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
410
- // <Text>To asc</Text>
411
- jsx(ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
412
- // <Text>To desc</Text>
413
- jsx(ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: (e) => {
414
- header.column.clearSorting();
415
- }, children: jsx(CloseIcon, {}) }))] })) }));
416
- }) }))) }));
417
- };
418
-
419
- const EditSortingButton = () => {
420
- return (jsxs(Popover, { placement: "auto", children: [jsx(Tooltip, { label: "Filter", children: jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "filter", variant: "ghost", icon: jsx(MdOutlineSort, {}) }) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(TableSorter, {}), jsx(ResetSortingButton, {})] }) })] })] }));
324
+ const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsx(MdFilterAlt, {}), ...props }) => {
325
+ const filterModal = useDisclosure();
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 }) })] })] })] }));
421
327
  };
422
328
 
423
329
  const TableViewer = () => {
@@ -430,37 +336,28 @@ const TableViewer = () => {
430
336
  }) }));
431
337
  };
432
338
 
433
- const EditViewButton = () => {
434
- return (jsxs(Popover, { placement: "auto", children: [jsx(PopoverTrigger, { children: jsx(IconButton, { "aria-label": "view", variant: "ghost", icon: jsx(IoMdEye, {}) }) }), jsxs(PopoverContent, { width: "auto", children: [jsx(PopoverArrow, {}), jsx(PopoverBody, { children: jsx(TableViewer, {}) })] })] }));
339
+ const EditViewButton = ({ text, icon = jsx(IoMdEye, {}), title = "Edit View", }) => {
340
+ const viewModel = useDisclosure();
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, {}) })] })] })] }));
435
342
  };
436
343
 
437
- const GlobalFilter = () => {
344
+ const GlobalFilter = ({ icon = MdSearch }) => {
438
345
  const { globalFilter, setGlobalFilter } = useDataTable();
439
- return (jsx(Input, { value: globalFilter, onChange: (e) => {
440
- setGlobalFilter(e.target.value);
441
- } }));
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
+ } })] }) }) }));
442
349
  };
443
350
 
444
351
  const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
445
- const { table } = useContext(TableContext);
352
+ const { table } = useDataTable();
446
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: () => {
447
354
  table.setPageSize(Number(pageSize));
448
355
  }, children: pageSize }))) })] }) }));
449
356
  };
450
357
 
451
- const ResetSelectionButton = () => {
358
+ const RowCountText = () => {
452
359
  const { table } = useContext(TableContext);
453
- return (jsx(Button, { onClick: () => {
454
- table.resetRowSelection();
455
- }, children: "Reset Selection" }));
456
- };
457
-
458
- const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
459
- const { table, loading } = useDataTable();
460
- if (showLoading) {
461
- return (jsxs(Fragment, { children: [loading && loadingComponent, !loading && (jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "scroll", ...props, children: children }))] }));
462
- }
463
- return (jsx(Fragment, { children: jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "scroll", ...props, children: children }) }));
360
+ return jsx(Text, { children: table.getRowCount() });
464
361
  };
465
362
 
466
363
  const TableBody = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
@@ -512,22 +409,6 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
512
409
  onChange: row.getToggleSelectedHandler() }) }))] }));
513
410
  };
514
411
 
515
- const TableCardContainer = ({ children, ...props }) => {
516
- return (jsx(Grid, { gridTemplateColumns: ["1fr", "1fr 1fr", "1fr 1fr 1fr"], gap: "0.5rem", ...props, children: children }));
517
- };
518
-
519
- const TableCards = ({}) => {
520
- const { table } = useContext(TableContext);
521
- return (jsx(Fragment, { children: table.getRowModel().rows.map((row) => {
522
- return (jsx(Card, { children: jsxs(CardBody, { display: "flex", flexFlow: "column", gap: "0.5rem", children: [jsx(Checkbox, { isChecked: row.getIsSelected(),
523
- disabled: !row.getCanSelect(),
524
- // indeterminate: row.getIsSomeSelected(),
525
- onChange: row.getToggleSelectedHandler() }), row.getVisibleCells().map((cell) => {
526
- return (jsx(Box, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }));
527
- })] }) }, crypto.randomUUID()));
528
- }) }));
529
- };
530
-
531
412
  const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }) => {
532
413
  const table = useDataTable().table;
533
414
  const SELECTION_BOX_WIDTH = 20;
@@ -626,9 +507,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
626
507
  // styling resize and pinning end
627
508
  display: "grid", children: [jsxs(Menu, { children: [jsx(MenuButton, { as: Box, padding: `${table.getDensityValue()}px`, display: "flex", alignItems: "center", justifyContent: "start", borderRadius: "0rem", _hover: { backgroundColor: "gray.100" }, children: jsxs(Flex, { gap: "0.5rem", alignItems: "center", children: [header.isPlaceholder
628
509
  ? null
629
- : flexRender(header.column.columnDef.header, header.getContext()), jsx(Box, { children: header.column.getCanSort() && (jsxs(Fragment, { children: [header.column.getIsSorted() === false && (
630
- // <UpDownIcon />
631
- jsx(Fragment, {})), header.column.getIsSorted() === "asc" && (jsx(ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsx(ChevronDownIcon, {}))] })) }), jsx(Box, { children: header.column.getIsFiltered() && jsx(MdFilterListAlt, {}) })] }) }), jsx(Portal, { children: jsxs(MenuList, { children: [!header.column.getIsPinned() && (jsx(MenuItem, { icon: jsx(MdPushPin, {}), onClick: () => {
510
+ : flexRender(header.column.columnDef.header, header.getContext()), jsx(Box, { children: header.column.getCanSort() && (jsxs(Fragment, { children: [header.column.getIsSorted() === false && (jsx(Fragment, {})), header.column.getIsSorted() === "asc" && (jsx(ChevronUpIcon, {})), header.column.getIsSorted() === "desc" && (jsx(ChevronDownIcon, {}))] })) }), jsx(Box, { children: header.column.getIsFiltered() && jsx(MdFilterListAlt, {}) })] }) }), jsx(Portal, { children: jsxs(MenuList, { children: [!header.column.getIsPinned() && (jsx(MenuItem, { icon: jsx(MdPushPin, {}), onClick: () => {
632
511
  header.column.pin("left");
633
512
  }, children: "Pin Column" })), header.column.getIsPinned() && (jsx(MenuItem, { icon: jsx(MdCancel, {}), onClick: () => {
634
513
  header.column.pin(false);
@@ -649,11 +528,154 @@ const TablePagination = ({}) => {
649
528
  return (jsxs(ButtonGroup, { isAttached: true, children: [jsx(IconButton, { icon: jsx(MdFirstPage, {}), onClick: () => firstPage(), isDisabled: !getCanPreviousPage(), "aria-label": "first-page", variant: "ghost" }), jsx(IconButton, { icon: jsx(MdArrowBack, {}), onClick: () => previousPage(), isDisabled: !getCanPreviousPage(), "aria-label": "previous-page", variant: "ghost" }), jsx(Button, { variant: "ghost", onClick: () => { }, disabled: !getCanPreviousPage(), children: getState().pagination.pageIndex + 1 }), jsx(IconButton, { onClick: () => nextPage(), isDisabled: !getCanNextPage(), "aria-label": "next-page", variant: "ghost", children: jsx(MdArrowForward, {}) }), jsx(IconButton, { onClick: () => lastPage(), isDisabled: !getCanNextPage(), "aria-label": "last-page", variant: "ghost", children: jsx(MdLastPage, {}) })] }));
650
529
  };
651
530
 
652
- const SelectAllRowsToggle = () => {
531
+ const Table = ({ children, showLoading = false, loadingComponent = jsx(Fragment, { children: "Loading..." }), ...props }) => {
532
+ const { table, loading } = useDataTable();
533
+ if (showLoading) {
534
+ return (jsxs(Fragment, { children: [loading && loadingComponent, !loading && (jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }))] }));
535
+ }
536
+ return (jsx(Fragment, { children: jsx(Table$1, { width: table.getCenterTotalSize(), overflowX: "auto", ...props, children: children }) }));
537
+ };
538
+
539
+ const DefaultTable = ({ totalText = "Total:" }) => {
540
+ return (jsxs(Grid, { templateRows: "auto 1fr auto", templateColumns: "1fr 1fr", children: [jsxs(Flex, { justifyContent: "space-between", gridColumn: "1 / span 2", children: [jsx(Box, { children: jsx(EditViewButton, { text: "View" }) }), jsxs(Flex, { gap: "1rem", justifySelf: "end", children: [jsx(GlobalFilter, {}), jsx(EditFilterButton, { text: "Advanced Filter" })] })] }), jsx(Flex, { overflow: "auto", gridColumn: "1 / span 2", justifyContent: "center", children: jsxs(Table, { variant: "striped", alignSelf: "center", children: [jsx(TableHeader, { canResize: true }), jsx(TableBody, {}), jsx(TableFooter, {})] }) }), jsxs(Flex, { gap: "1rem", alignItems: "center", children: [jsx(PageSizeControl, { pageSizes: [25, 50] }), jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: totalText }), jsx(RowCountText, {})] })] }), jsx(Box, { justifySelf: "end", children: jsx(TablePagination, {}) })] }));
541
+ };
542
+
543
+ const DensityToggleButton = ({ text, icon = jsx(AiOutlineColumnWidth, {}), }) => {
544
+ const { table } = useDataTable();
545
+ return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { variant: "ghost", "aria-label": "Toggle Density", icon: icon, onClick: () => {
546
+ table.toggleDensity();
547
+ } })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", "aria-label": "Toggle Density", onClick: () => {
548
+ table.toggleDensity();
549
+ }, children: text }))] }));
550
+ };
551
+
552
+ const ColumnOrderChanger = ({ columns }) => {
553
+ const [order, setOrder] = useState([]);
554
+ const [originalOrder, setOriginalOrder] = useState([]);
555
+ const { table } = useDataTable();
556
+ const handleChangeOrder = (startIndex, endIndex) => {
557
+ const newOrder = Array.from(order);
558
+ const [removed] = newOrder.splice(startIndex, 1);
559
+ newOrder.splice(endIndex, 0, removed);
560
+ setOrder(newOrder);
561
+ };
562
+ useEffect(() => {
563
+ setOrder(columns);
564
+ }, [columns]);
565
+ useEffect(() => {
566
+ if (originalOrder.length > 0) {
567
+ return;
568
+ }
569
+ if (columns.length <= 0) {
570
+ return;
571
+ }
572
+ setOriginalOrder(columns);
573
+ }, [columns]);
574
+ return (jsxs(Flex, { gap: "0.5rem", flexFlow: "column", children: [jsx(Flex, { gap: "0.5rem", flexFlow: "column", children: order.map((columnId, index) => (jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifyContent: "space-between", children: [jsx(IconButton, { onClick: () => {
575
+ const prevIndex = index - 1;
576
+ if (prevIndex >= 0) {
577
+ handleChangeOrder(index, prevIndex);
578
+ }
579
+ }, disabled: index === 0, "aria-label": "", children: jsx(MdArrowUpward, {}) }), table
580
+ .getAllFlatColumns()
581
+ .filter((column) => {
582
+ return column.id === columnId;
583
+ })
584
+ .map((column) => {
585
+ const displayName = column.columnDef.meta === undefined
586
+ ? column.id
587
+ : column.columnDef.meta.displayName;
588
+ return jsx(Fragment, { children: displayName });
589
+ }), jsx(IconButton, { onClick: () => {
590
+ const nextIndex = index + 1;
591
+ if (nextIndex < order.length) {
592
+ handleChangeOrder(index, nextIndex);
593
+ }
594
+ }, disabled: index === order.length - 1, "aria-label": "", children: jsx(MdArrowDownward, {}) })] }, columnId))) }), jsxs(Flex, { gap: "0.25rem", children: [jsx(Button, { onClick: () => {
595
+ table.setColumnOrder(order);
596
+ }, children: "Apply" }), jsx(Button, { onClick: () => {
597
+ table.setColumnOrder(originalOrder);
598
+ }, children: "Reset" })] })] }));
599
+ };
600
+ const TableOrderer = () => {
601
+ const { table } = useDataTable();
602
+ return (jsx(Fragment, { children: jsx(ColumnOrderChanger, { columns: table.getState().columnOrder }) }));
603
+ };
604
+
605
+ const EditOrderButton = ({ text, icon = jsx(MdOutlineMoveDown, {}), title = "Change Order", }) => {
606
+ const orderModal = useDisclosure();
607
+ return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: orderModal.onOpen, "aria-label": "change order" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: orderModal.onOpen, children: text })), jsxs(Modal, { isOpen: orderModal.isOpen, onClose: orderModal.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { padding: "0 0 1rem 0", children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsx(Flex, { flexFlow: "column", gap: "0.25rem", children: jsx(TableOrderer, {}) }) })] })] })] }));
608
+ };
609
+
610
+ const ResetSortingButton = ({ text = "Reset Sorting", }) => {
611
+ const { table } = useDataTable();
612
+ return (jsx(Button, { onClick: () => {
613
+ table.resetSorting();
614
+ }, children: text }));
615
+ };
616
+
617
+ const TableSorter = () => {
618
+ const { table } = useDataTable();
619
+ return (jsx(Fragment, { children: table.getHeaderGroups().map((headerGroup) => (jsx(Fragment, { children: headerGroup.headers.map((header) => {
620
+ const displayName = header.column.columnDef.meta === undefined
621
+ ? header.column.id
622
+ : header.column.columnDef.meta.displayName;
623
+ return (jsx(Fragment, { children: header.column.getCanSort() && (jsxs(Flex, { alignItems: "center", gap: "0.5rem", padding: "0.5rem", children: [jsx(Text, { children: displayName }), jsxs(Button, { variant: "ghost", onClick: (e) => {
624
+ header.column.toggleSorting();
625
+ }, children: [header.column.getIsSorted() === false && (
626
+ // <Text>To No sort</Text>
627
+ jsx(UpDownIcon, {})), header.column.getIsSorted() === "asc" && (
628
+ // <Text>To asc</Text>
629
+ jsx(ChevronDownIcon, {})), header.column.getIsSorted() === "desc" && (
630
+ // <Text>To desc</Text>
631
+ jsx(ChevronUpIcon, {}))] }), header.column.getIsSorted() && (jsx(Button, { onClick: (e) => {
632
+ header.column.clearSorting();
633
+ }, children: jsx(CloseIcon, {}) }))] })) }));
634
+ }) }))) }));
635
+ };
636
+
637
+ const EditSortingButton = ({ text, icon = jsx(MdOutlineSort, {}), title = "Edit Sorting", }) => {
638
+ const sortingModal = useDisclosure();
639
+ return (jsxs(Fragment, { children: [!!text === false && (jsx(IconButton, { icon: icon, variant: "ghost", onClick: sortingModal.onOpen, "aria-label": "change sorting" })), !!text !== false && (jsx(Button, { leftIcon: icon, variant: "ghost", onClick: sortingModal.onOpen, children: text })), jsxs(Modal, { isOpen: sortingModal.isOpen, onClose: sortingModal.onClose, size: ["full", "full", "md", "md"], children: [jsx(ModalOverlay, {}), jsxs(ModalContent, { padding: "0 0 1rem 0", children: [jsx(ModalHeader, { children: title }), jsx(ModalCloseButton, {}), jsx(ModalBody, { children: jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(TableSorter, {}), jsx(ResetSortingButton, {})] }) })] })] })] }));
640
+ };
641
+
642
+ const ResetSelectionButton = ({ text = "Reset Selection", }) => {
643
+ const { table } = useDataTable();
644
+ return (jsx(Button, { onClick: () => {
645
+ table.resetRowSelection();
646
+ }, children: text }));
647
+ };
648
+
649
+ const TableCardContainer = ({ children, ...props }) => {
650
+ return (jsx(Grid, { gridTemplateColumns: ["1fr", "1fr 1fr", "1fr 1fr 1fr"], gap: "0.5rem", ...props, children: children }));
651
+ };
652
+
653
+ const TableCards = ({}) => {
654
+ const { table } = useContext(TableContext);
655
+ return (jsx(Fragment, { children: table.getRowModel().rows.map((row) => {
656
+ return (jsx(Card, { children: jsxs(CardBody, { display: "flex", flexFlow: "column", gap: "0.5rem", children: [jsx(Checkbox, { isChecked: row.getIsSelected(),
657
+ disabled: !row.getCanSelect(),
658
+ // indeterminate: row.getIsSomeSelected(),
659
+ onChange: row.getToggleSelectedHandler() }), row.getVisibleCells().map((cell) => {
660
+ return (jsx(Box, { children: flexRender(cell.column.columnDef.cell, cell.getContext()) }));
661
+ })] }) }, crypto.randomUUID()));
662
+ }) }));
663
+ };
664
+
665
+ const TableComponentRenderer = ({ render = () => {
666
+ throw Error("Not Implemented");
667
+ }, }) => {
668
+ const { table } = useDataTable();
669
+ return render(table);
670
+ };
671
+
672
+ const SelectAllRowsToggle = ({ selectAllIcon = jsx(MdOutlineChecklist, {}), clearAllIcon = jsx(MdClear, {}), selectAllText, clearAllText, }) => {
653
673
  const { table } = useContext(TableContext);
654
- return (jsx(Tooltip, { label: table.getIsAllRowsSelected() ? "Clear All" : "Select All", children: jsx(IconButton, { variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? "Clear All" : "Select All", icon: table.getIsAllRowsSelected() ? jsx(MdClear, {}) : jsx(MdOutlineChecklist, {}), onClick: (event) => {
655
- table.getToggleAllRowsSelectedHandler()(event);
656
- } }) }));
674
+ return (jsxs(Fragment, { children: [!!selectAllText === false && (jsx(IconButton, { icon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", "aria-label": table.getIsAllRowsSelected() ? clearAllText : selectAllText, onClick: (event) => {
675
+ table.getToggleAllRowsSelectedHandler()(event);
676
+ } })), !!selectAllText !== false && (jsx(Button, { leftIcon: table.getIsAllRowsSelected() ? clearAllIcon : selectAllIcon, variant: "ghost", onClick: (event) => {
677
+ table.getToggleAllRowsSelectedHandler()(event);
678
+ }, children: table.getIsAllRowsSelected() ? clearAllText : selectAllText }))] }));
657
679
  };
658
680
 
659
681
  const TableSelector = () => {
@@ -670,4 +692,4 @@ const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipP
670
692
  return (jsx(Box, { padding: padding, children: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }));
671
693
  };
672
694
 
673
- 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 };
@@ -0,0 +1,3 @@
1
+ export declare const DefaultTable: ({ totalText }: {
2
+ totalText?: string | undefined;
3
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,6 @@
1
- export declare const DensityToggleButton: () => import("react/jsx-runtime").JSX.Element;
1
+ import React from "react";
2
+ export interface DensityToggleButtonProps {
3
+ icon?: React.ReactElement;
4
+ text?: string;
5
+ }
6
+ export declare const DensityToggleButton: ({ text, icon, }: DensityToggleButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,9 @@
1
- export declare const EditFilterButton: () => import("react/jsx-runtime").JSX.Element;
1
+ /// <reference types="react" />
2
+ export interface EditFilterButtonProps {
3
+ text?: string;
4
+ title?: string;
5
+ closeText?: string;
6
+ resetText?: string;
7
+ icon?: React.ReactElement;
8
+ }
9
+ export declare const EditFilterButton: ({ text, title, closeText, resetText, icon, ...props }: EditFilterButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,7 @@
1
- export declare const EditOrderButton: () => import("react/jsx-runtime").JSX.Element;
1
+ import React from "react";
2
+ export interface EditOrderButtonProps {
3
+ title?: string;
4
+ icon?: React.ReactElement;
5
+ text?: string;
6
+ }
7
+ export declare const EditOrderButton: ({ text, icon, title, }: EditOrderButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,7 @@
1
- export declare const EditSortingButton: () => import("react/jsx-runtime").JSX.Element;
1
+ /// <reference types="react" />
2
+ export interface EditSortingButtonProps {
3
+ title?: string;
4
+ icon?: React.ReactElement;
5
+ text?: string;
6
+ }
7
+ export declare const EditSortingButton: ({ text, icon, title, }: EditSortingButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,7 @@
1
- export declare const EditViewButton: () => import("react/jsx-runtime").JSX.Element;
1
+ import React from "react";
2
+ export interface EditViewButtonProps {
3
+ text?: string;
4
+ icon?: React.ReactElement;
5
+ title?: string;
6
+ }
7
+ export declare const EditViewButton: ({ text, icon, title, }: EditViewButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,3 @@
1
- export declare const GlobalFilter: () => import("react/jsx-runtime").JSX.Element;
1
+ export declare const GlobalFilter: ({ icon }: {
2
+ icon?: import("react-icons/lib").IconType | undefined;
3
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,4 @@
1
- export declare const ResetFilteringButton: () => import("react/jsx-runtime").JSX.Element;
1
+ export interface ResetFilteringButtonProps {
2
+ text?: string;
3
+ }
4
+ export declare const ResetFilteringButton: ({ text, }: ResetFilteringButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,4 @@
1
- export declare const ResetSelectionButton: () => import("react/jsx-runtime").JSX.Element;
1
+ export interface ResetSelectionButtonProps {
2
+ text?: string;
3
+ }
4
+ export declare const ResetSelectionButton: ({ text, }: ResetSelectionButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,4 @@
1
- export declare const ResetSortingButton: () => import("react/jsx-runtime").JSX.Element;
1
+ export interface ResetSortingButtonProps {
2
+ text?: string;
3
+ }
4
+ export declare const ResetSortingButton: ({ text, }: ResetSortingButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare const RowCountText: () => import("react/jsx-runtime").JSX.Element;
@@ -1 +1,8 @@
1
- export declare const SelectAllRowsToggle: () => import("react/jsx-runtime").JSX.Element;
1
+ import React from "react";
2
+ export interface SelectAllRowsToggleProps {
3
+ selectAllIcon: React.ReactElement;
4
+ clearAllIcon: React.ReactElement;
5
+ selectAllText: string;
6
+ clearAllText: string;
7
+ }
8
+ export declare const SelectAllRowsToggle: ({ selectAllIcon, clearAllIcon, selectAllText, clearAllText, }: SelectAllRowsToggleProps) => 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>>;
@@ -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";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "1.0.38",
3
+ "version": "1.0.40",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",