@bsol-oss/react-datatable5 1.0.52 → 1.0.54
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,6 +1,6 @@
|
|
|
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, Table as Table$1 } from '@tanstack/react-table';
|
|
3
|
+
import { RowData, OnChangeFn, Updater, FilterFn, ColumnDef, RowSelectionState, ColumnFiltersState, SortingState, VisibilityState, Row, Table as Table$1 } from '@tanstack/react-table';
|
|
4
4
|
import { RankingInfo } from '@tanstack/match-sorter-utils';
|
|
5
5
|
import React$1, { ReactNode } from 'react';
|
|
6
6
|
import * as react_icons_lib from 'react-icons/lib';
|
|
@@ -55,8 +55,9 @@ interface DataTableProps<TData> {
|
|
|
55
55
|
};
|
|
56
56
|
sorting?: SortingState;
|
|
57
57
|
rowSelection?: RowSelectionState;
|
|
58
|
+
columnVisibility?: VisibilityState;
|
|
58
59
|
}
|
|
59
|
-
declare const DataTable: <TData>({ columns, data, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder: defaultColumnOrder, columnFilters: defaultColumnFilter, density, globalFilter: defaultGlobalFilter, pagination: defaultPagination, sorting: defaultSorting, rowSelection: defaultRowSelection, children, }: DataTableProps<TData>) => react_jsx_runtime.JSX.Element;
|
|
60
|
+
declare const DataTable: <TData>({ columns, data, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder: defaultColumnOrder, columnFilters: defaultColumnFilter, density, globalFilter: defaultGlobalFilter, pagination: defaultPagination, sorting: defaultSorting, rowSelection: defaultRowSelection, columnVisibility: defaultColumnVisibility, children, }: DataTableProps<TData>) => react_jsx_runtime.JSX.Element;
|
|
60
61
|
|
|
61
62
|
interface DataTableServerProps<TData> {
|
|
62
63
|
children: JSX.Element | JSX.Element[];
|
|
@@ -77,6 +78,7 @@ interface DataTableServerProps<TData> {
|
|
|
77
78
|
sorting?: SortingState;
|
|
78
79
|
rowSelection?: RowSelectionState;
|
|
79
80
|
loadingComponent?: JSX.Element;
|
|
81
|
+
columnVisibility?: VisibilityState;
|
|
80
82
|
}
|
|
81
83
|
interface Result<T> {
|
|
82
84
|
results: T[];
|
|
@@ -88,10 +90,10 @@ interface DataResponse<T> extends Result<T> {
|
|
|
88
90
|
}
|
|
89
91
|
declare module "@tanstack/react-table" {
|
|
90
92
|
interface ColumnMeta<TData extends RowData, TValue> {
|
|
91
|
-
displayName
|
|
93
|
+
displayName?: string;
|
|
92
94
|
}
|
|
93
95
|
}
|
|
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;
|
|
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;
|
|
95
97
|
|
|
96
98
|
interface DefaultTableProps {
|
|
97
99
|
totalText?: string;
|
|
@@ -203,6 +205,12 @@ interface TableRendererProps<TData> {
|
|
|
203
205
|
}
|
|
204
206
|
declare const TableComponent: <TData>({ render, }: TableRendererProps<TData>) => React$1.ReactElement<any, string | React$1.JSXElementConstructor<any>>;
|
|
205
207
|
|
|
208
|
+
declare module "@tanstack/react-table" {
|
|
209
|
+
interface ColumnMeta<TData extends RowData, TValue> {
|
|
210
|
+
filterVariant?: "text" | "range" | "select";
|
|
211
|
+
filterOptions?: string[];
|
|
212
|
+
}
|
|
213
|
+
}
|
|
206
214
|
declare const TableFilter: () => react_jsx_runtime.JSX.Element;
|
|
207
215
|
|
|
208
216
|
declare const TableFilterTags: () => react_jsx_runtime.JSX.Element;
|
package/dist/index.js
CHANGED
|
@@ -109,11 +109,12 @@ const fuzzyFilter = (row, columnId, value, addMeta) => {
|
|
|
109
109
|
const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder: defaultColumnOrder = [], columnFilters: defaultColumnFilter = [], density = "sm", globalFilter: defaultGlobalFilter = "", pagination: defaultPagination = {
|
|
110
110
|
pageIndex: 0, //initial page index
|
|
111
111
|
pageSize: 10, //default page size
|
|
112
|
-
}, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, children, }) => {
|
|
112
|
+
}, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, columnVisibility: defaultColumnVisibility = {}, children, }) => {
|
|
113
113
|
const [columnOrder, setColumnOrder] = react.useState(defaultColumnOrder);
|
|
114
114
|
const [globalFilter, setGlobalFilter] = react.useState(defaultGlobalFilter);
|
|
115
115
|
const [densityState, setDensity] = react.useState(density);
|
|
116
116
|
const [rowSelection, setRowSelection] = react.useState(defaultRowSelection);
|
|
117
|
+
const [columnVisibility, setColumnVisibility] = react.useState(defaultColumnVisibility);
|
|
117
118
|
const table = reactTable.useReactTable({
|
|
118
119
|
_features: [DensityFeature],
|
|
119
120
|
data: data,
|
|
@@ -132,6 +133,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
|
|
|
132
133
|
globalFilter,
|
|
133
134
|
density: densityState,
|
|
134
135
|
rowSelection,
|
|
136
|
+
columnVisibility,
|
|
135
137
|
},
|
|
136
138
|
onColumnOrderChange: (state) => {
|
|
137
139
|
setColumnOrder(state);
|
|
@@ -149,6 +151,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
|
|
|
149
151
|
// global filter end
|
|
150
152
|
onDensityChange: setDensity,
|
|
151
153
|
onRowSelectionChange: setRowSelection,
|
|
154
|
+
onColumnVisibilityChange: setColumnVisibility,
|
|
152
155
|
initialState: {
|
|
153
156
|
columnFilters: defaultColumnFilter,
|
|
154
157
|
sorting: defaultSorting,
|
|
@@ -204,7 +207,7 @@ const useDataFromUrl = ({ url, params = {}, defaultData, }) => {
|
|
|
204
207
|
const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder: defaultColumnOrder = [], columnFilters: defaultColumnFilter = [], density = "sm", globalFilter: defaultGlobalFilter = "", pagination: defaultPagination = {
|
|
205
208
|
pageIndex: 0, //initial page index
|
|
206
209
|
pageSize: 10, //default page size
|
|
207
|
-
}, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, children, }) => {
|
|
210
|
+
}, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, columnVisibility: defaultColumnVisibility = {}, children, }) => {
|
|
208
211
|
const [sorting, setSorting] = react.useState(defaultSorting);
|
|
209
212
|
const [columnFilters, setColumnFilters] = react.useState(defaultColumnFilter); // can set initial column filter state here
|
|
210
213
|
const [pagination, setPagination] = react.useState(defaultPagination);
|
|
@@ -212,6 +215,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
212
215
|
const [columnOrder, setColumnOrder] = react.useState(defaultColumnOrder);
|
|
213
216
|
const [globalFilter, setGlobalFilter] = react.useState(defaultGlobalFilter);
|
|
214
217
|
const [densityState, setDensity] = react.useState(density);
|
|
218
|
+
const [columnVisibility, setColumnVisibility] = react.useState(defaultColumnVisibility);
|
|
215
219
|
const { data, loading, hasError, refreshData } = useDataFromUrl({
|
|
216
220
|
url: url,
|
|
217
221
|
defaultData: {
|
|
@@ -256,6 +260,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
256
260
|
columnOrder,
|
|
257
261
|
globalFilter,
|
|
258
262
|
density: densityState,
|
|
263
|
+
columnVisibility,
|
|
259
264
|
},
|
|
260
265
|
defaultColumn: {
|
|
261
266
|
size: 150, //starting column size
|
|
@@ -271,7 +276,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
271
276
|
onGlobalFilterChange: (state) => {
|
|
272
277
|
setGlobalFilter(state);
|
|
273
278
|
},
|
|
274
|
-
rowCount: data.
|
|
279
|
+
rowCount: data.count,
|
|
275
280
|
// for tanstack-table ts bug start
|
|
276
281
|
filterFns: {
|
|
277
282
|
fuzzy: () => {
|
|
@@ -280,6 +285,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
280
285
|
},
|
|
281
286
|
// for tanstack-table ts bug end
|
|
282
287
|
onDensityChange: setDensity,
|
|
288
|
+
onColumnVisibilityChange: setColumnVisibility,
|
|
283
289
|
});
|
|
284
290
|
react.useEffect(() => {
|
|
285
291
|
refreshData();
|
|
@@ -311,17 +317,43 @@ const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
|
|
|
311
317
|
}, children: text }));
|
|
312
318
|
};
|
|
313
319
|
|
|
320
|
+
function Filter({ column }) {
|
|
321
|
+
const { filterVariant } = column.columnDef.meta ?? {};
|
|
322
|
+
const displayName = column.columnDef.meta?.displayName ?? column.id;
|
|
323
|
+
const filterOptions = column.columnDef.meta?.filterOptions ?? [];
|
|
324
|
+
if (column.columns.length > 0) {
|
|
325
|
+
return (jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(react$1.Text, { children: displayName }), column.columns.map((column) => {
|
|
326
|
+
return jsxRuntime.jsx(Filter, { column: column });
|
|
327
|
+
})] }));
|
|
328
|
+
}
|
|
329
|
+
if (filterVariant === "select") {
|
|
330
|
+
return (jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(react$1.Text, { children: displayName }), jsxRuntime.jsx(react$1.Select, { value: column.getFilterValue() ? String(column.getFilterValue()) : "", placeholder: "Select option", onChange: (e) => {
|
|
331
|
+
column.setFilterValue(e.target.value);
|
|
332
|
+
}, children: filterOptions.map((option) => {
|
|
333
|
+
return jsxRuntime.jsx("option", { value: option, children: option });
|
|
334
|
+
}) })] }));
|
|
335
|
+
}
|
|
336
|
+
if (filterVariant === "range") {
|
|
337
|
+
const filterValue = column.getFilterValue() ?? [
|
|
338
|
+
undefined,
|
|
339
|
+
undefined,
|
|
340
|
+
];
|
|
341
|
+
console.log(column.getFilterValue(), "sgr");
|
|
342
|
+
const [min, max] = filterValue;
|
|
343
|
+
return (jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(react$1.Text, { children: displayName }), jsxRuntime.jsxs(react$1.Flex, { gap: "0.25rem", children: [jsxRuntime.jsx(react$1.Input, { type: "number", placeholder: "min", value: min, onChange: (e) => {
|
|
344
|
+
column.setFilterValue([Number(e.target.value), max]);
|
|
345
|
+
} }), jsxRuntime.jsx(react$1.Input, { type: "number", placeholder: "max", value: max, onChange: (e) => {
|
|
346
|
+
column.setFilterValue([min, Number(e.target.value)]);
|
|
347
|
+
} })] })] }));
|
|
348
|
+
}
|
|
349
|
+
return (jsxRuntime.jsxs(react$1.Flex, { flexFlow: "column", gap: "0.25rem", children: [jsxRuntime.jsx(react$1.Text, { children: displayName }), jsxRuntime.jsx(react$1.Input, { value: column.getFilterValue() ? String(column.getFilterValue()) : "", onChange: (e) => {
|
|
350
|
+
column.setFilterValue(e.target.value);
|
|
351
|
+
} })] }));
|
|
352
|
+
}
|
|
314
353
|
const TableFilter = () => {
|
|
315
354
|
const { table } = useDataTable();
|
|
316
|
-
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.
|
|
317
|
-
|
|
318
|
-
? header.column.id
|
|
319
|
-
: header.column.columnDef.meta.displayName;
|
|
320
|
-
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: header.column.getCanFilter() && (jsxRuntime.jsxs(react$1.Box, { children: [jsxRuntime.jsx(react$1.Text, { children: displayName }), jsxRuntime.jsx(react$1.Input, { value: header.column.getFilterValue()
|
|
321
|
-
? String(header.column.getFilterValue())
|
|
322
|
-
: "", onChange: (e) => {
|
|
323
|
-
header.column.setFilterValue(e.target.value);
|
|
324
|
-
} })] })) }));
|
|
355
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: table.getAllColumns().map((column) => {
|
|
356
|
+
return jsxRuntime.jsx(Filter, { column: column });
|
|
325
357
|
}) }));
|
|
326
358
|
};
|
|
327
359
|
|
|
@@ -428,7 +460,7 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
|
|
|
428
460
|
}
|
|
429
461
|
: {}),
|
|
430
462
|
// styling resize and pinning end
|
|
431
|
-
display: "grid", children: [!isCheckBoxVisible(index, row) && (jsxRuntime.jsx(react$1.
|
|
463
|
+
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`, children: index + 1 })), 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(),
|
|
432
464
|
disabled: !row.getCanSelect(),
|
|
433
465
|
// indeterminate: row.getIsSomeSelected(),
|
|
434
466
|
onChange: row.getToggleSelectedHandler() }) }))] }));
|
|
@@ -477,7 +509,7 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }
|
|
|
477
509
|
// styling resize and pinning end
|
|
478
510
|
onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (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: table.getIsAllRowsSelected(),
|
|
479
511
|
// indeterminate: table.getIsSomeRowsSelected(),
|
|
480
|
-
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsxRuntime.jsx(react$1.
|
|
512
|
+
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (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` }))] }), footerGroup.headers.map((header) => (jsxRuntime.jsx(react$1.Th, { padding: "0", colSpan: header.colSpan,
|
|
481
513
|
// styling resize and pinning start
|
|
482
514
|
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, left: header.column.getIsPinned()
|
|
483
515
|
? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
@@ -524,7 +556,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
524
556
|
// styling resize and pinning end
|
|
525
557
|
padding: `${table.getDensityValue()}px`, onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (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: table.getIsAllRowsSelected(),
|
|
526
558
|
// indeterminate: table.getIsSomeRowsSelected(),
|
|
527
|
-
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsxRuntime.jsx(react$1.
|
|
559
|
+
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (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` }))] }), headerGroup.headers.map((header) => {
|
|
528
560
|
const resizeProps = {
|
|
529
561
|
onClick: () => header.column.resetSize(),
|
|
530
562
|
onMouseDown: header.getResizeHandler(),
|
|
@@ -543,7 +575,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
543
575
|
// styling resize and pinning end
|
|
544
576
|
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
|
|
545
577
|
? null
|
|
546
|
-
: 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 &&
|
|
578
|
+
: 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: () => {
|
|
547
579
|
header.column.pin("left");
|
|
548
580
|
}, children: "Pin Column" })), header.column.getIsPinned() && (jsxRuntime.jsx(react$1.MenuItem, { icon: jsxRuntime.jsx(md.MdCancel, {}), onClick: () => {
|
|
549
581
|
header.column.pin(false);
|
|
@@ -715,9 +747,9 @@ const TableSelector = () => {
|
|
|
715
747
|
|
|
716
748
|
const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipProps, ...props }) => {
|
|
717
749
|
if (label) {
|
|
718
|
-
return (jsxRuntime.jsx(react$1.
|
|
750
|
+
return (jsxRuntime.jsx(react$1.Flex, { alignItems: "center", height: "100%", padding: padding, children: jsxRuntime.jsx(react$1.Tooltip, { label: jsxRuntime.jsx(react$1.Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", noOfLines: [5], children: label }), placement: "auto", ...tooltipProps, children: jsxRuntime.jsx(react$1.Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }) }));
|
|
719
751
|
}
|
|
720
|
-
return (jsxRuntime.jsx(react$1.
|
|
752
|
+
return (jsxRuntime.jsx(react$1.Flex, { alignItems: "center", height: "100%", padding: padding, children: jsxRuntime.jsx(react$1.Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }));
|
|
721
753
|
};
|
|
722
754
|
|
|
723
755
|
exports.DataTable = DataTable;
|
package/dist/index.mjs
CHANGED
|
@@ -3,7 +3,7 @@ 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 { Button,
|
|
6
|
+
import { Button, Flex, Text, Select, Input, useDisclosure, IconButton, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, ModalFooter, Grid, Icon, Box, Switch, InputGroup, InputLeftElement, Menu, MenuButton, MenuList, MenuItem, Table as Table$1, FormLabel, Checkbox, Tag, Tfoot, Tr as Tr$1, Th, Thead, Portal, ButtonGroup, Card, CardBody, Tooltip } from '@chakra-ui/react';
|
|
7
7
|
import { MdFilterAlt, MdSearch, MdFilterListAlt, MdPushPin, MdCancel, MdSort, MdFirstPage, MdArrowBack, MdArrowForward, MdLastPage, MdOutlineViewColumn, MdArrowUpward, MdArrowDownward, MdOutlineMoveDown, MdOutlineSort, MdOutlineChecklist, MdClear } from 'react-icons/md';
|
|
8
8
|
import { IoMdEye, IoMdClose, IoMdCheckbox } from 'react-icons/io';
|
|
9
9
|
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
|
|
@@ -107,11 +107,12 @@ const fuzzyFilter = (row, columnId, value, addMeta) => {
|
|
|
107
107
|
const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder: defaultColumnOrder = [], columnFilters: defaultColumnFilter = [], density = "sm", globalFilter: defaultGlobalFilter = "", pagination: defaultPagination = {
|
|
108
108
|
pageIndex: 0, //initial page index
|
|
109
109
|
pageSize: 10, //default page size
|
|
110
|
-
}, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, children, }) => {
|
|
110
|
+
}, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, columnVisibility: defaultColumnVisibility = {}, children, }) => {
|
|
111
111
|
const [columnOrder, setColumnOrder] = useState(defaultColumnOrder);
|
|
112
112
|
const [globalFilter, setGlobalFilter] = useState(defaultGlobalFilter);
|
|
113
113
|
const [densityState, setDensity] = useState(density);
|
|
114
114
|
const [rowSelection, setRowSelection] = useState(defaultRowSelection);
|
|
115
|
+
const [columnVisibility, setColumnVisibility] = useState(defaultColumnVisibility);
|
|
115
116
|
const table = useReactTable({
|
|
116
117
|
_features: [DensityFeature],
|
|
117
118
|
data: data,
|
|
@@ -130,6 +131,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
|
|
|
130
131
|
globalFilter,
|
|
131
132
|
density: densityState,
|
|
132
133
|
rowSelection,
|
|
134
|
+
columnVisibility,
|
|
133
135
|
},
|
|
134
136
|
onColumnOrderChange: (state) => {
|
|
135
137
|
setColumnOrder(state);
|
|
@@ -147,6 +149,7 @@ const DataTable = ({ columns, data, enableRowSelection = true, enableMultiRowSel
|
|
|
147
149
|
// global filter end
|
|
148
150
|
onDensityChange: setDensity,
|
|
149
151
|
onRowSelectionChange: setRowSelection,
|
|
152
|
+
onColumnVisibilityChange: setColumnVisibility,
|
|
150
153
|
initialState: {
|
|
151
154
|
columnFilters: defaultColumnFilter,
|
|
152
155
|
sorting: defaultSorting,
|
|
@@ -202,7 +205,7 @@ const useDataFromUrl = ({ url, params = {}, defaultData, }) => {
|
|
|
202
205
|
const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, onRowSelect = () => { }, columnOrder: defaultColumnOrder = [], columnFilters: defaultColumnFilter = [], density = "sm", globalFilter: defaultGlobalFilter = "", pagination: defaultPagination = {
|
|
203
206
|
pageIndex: 0, //initial page index
|
|
204
207
|
pageSize: 10, //default page size
|
|
205
|
-
}, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, children, }) => {
|
|
208
|
+
}, sorting: defaultSorting = [], rowSelection: defaultRowSelection = {}, columnVisibility: defaultColumnVisibility = {}, children, }) => {
|
|
206
209
|
const [sorting, setSorting] = useState(defaultSorting);
|
|
207
210
|
const [columnFilters, setColumnFilters] = useState(defaultColumnFilter); // can set initial column filter state here
|
|
208
211
|
const [pagination, setPagination] = useState(defaultPagination);
|
|
@@ -210,6 +213,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
210
213
|
const [columnOrder, setColumnOrder] = useState(defaultColumnOrder);
|
|
211
214
|
const [globalFilter, setGlobalFilter] = useState(defaultGlobalFilter);
|
|
212
215
|
const [densityState, setDensity] = useState(density);
|
|
216
|
+
const [columnVisibility, setColumnVisibility] = useState(defaultColumnVisibility);
|
|
213
217
|
const { data, loading, hasError, refreshData } = useDataFromUrl({
|
|
214
218
|
url: url,
|
|
215
219
|
defaultData: {
|
|
@@ -254,6 +258,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
254
258
|
columnOrder,
|
|
255
259
|
globalFilter,
|
|
256
260
|
density: densityState,
|
|
261
|
+
columnVisibility,
|
|
257
262
|
},
|
|
258
263
|
defaultColumn: {
|
|
259
264
|
size: 150, //starting column size
|
|
@@ -269,7 +274,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
269
274
|
onGlobalFilterChange: (state) => {
|
|
270
275
|
setGlobalFilter(state);
|
|
271
276
|
},
|
|
272
|
-
rowCount: data.
|
|
277
|
+
rowCount: data.count,
|
|
273
278
|
// for tanstack-table ts bug start
|
|
274
279
|
filterFns: {
|
|
275
280
|
fuzzy: () => {
|
|
@@ -278,6 +283,7 @@ const DataTableServer = ({ columns, url, enableRowSelection = true, enableMultiR
|
|
|
278
283
|
},
|
|
279
284
|
// for tanstack-table ts bug end
|
|
280
285
|
onDensityChange: setDensity,
|
|
286
|
+
onColumnVisibilityChange: setColumnVisibility,
|
|
281
287
|
});
|
|
282
288
|
useEffect(() => {
|
|
283
289
|
refreshData();
|
|
@@ -309,17 +315,43 @@ const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
|
|
|
309
315
|
}, children: text }));
|
|
310
316
|
};
|
|
311
317
|
|
|
318
|
+
function Filter({ column }) {
|
|
319
|
+
const { filterVariant } = column.columnDef.meta ?? {};
|
|
320
|
+
const displayName = column.columnDef.meta?.displayName ?? column.id;
|
|
321
|
+
const filterOptions = column.columnDef.meta?.filterOptions ?? [];
|
|
322
|
+
if (column.columns.length > 0) {
|
|
323
|
+
return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), column.columns.map((column) => {
|
|
324
|
+
return jsx(Filter, { column: column });
|
|
325
|
+
})] }));
|
|
326
|
+
}
|
|
327
|
+
if (filterVariant === "select") {
|
|
328
|
+
return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(Select, { value: column.getFilterValue() ? String(column.getFilterValue()) : "", placeholder: "Select option", onChange: (e) => {
|
|
329
|
+
column.setFilterValue(e.target.value);
|
|
330
|
+
}, children: filterOptions.map((option) => {
|
|
331
|
+
return jsx("option", { value: option, children: option });
|
|
332
|
+
}) })] }));
|
|
333
|
+
}
|
|
334
|
+
if (filterVariant === "range") {
|
|
335
|
+
const filterValue = column.getFilterValue() ?? [
|
|
336
|
+
undefined,
|
|
337
|
+
undefined,
|
|
338
|
+
];
|
|
339
|
+
console.log(column.getFilterValue(), "sgr");
|
|
340
|
+
const [min, max] = filterValue;
|
|
341
|
+
return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsxs(Flex, { gap: "0.25rem", children: [jsx(Input, { type: "number", placeholder: "min", value: min, onChange: (e) => {
|
|
342
|
+
column.setFilterValue([Number(e.target.value), max]);
|
|
343
|
+
} }), jsx(Input, { type: "number", placeholder: "max", value: max, onChange: (e) => {
|
|
344
|
+
column.setFilterValue([min, Number(e.target.value)]);
|
|
345
|
+
} })] })] }));
|
|
346
|
+
}
|
|
347
|
+
return (jsxs(Flex, { flexFlow: "column", gap: "0.25rem", children: [jsx(Text, { children: displayName }), jsx(Input, { value: column.getFilterValue() ? String(column.getFilterValue()) : "", onChange: (e) => {
|
|
348
|
+
column.setFilterValue(e.target.value);
|
|
349
|
+
} })] }));
|
|
350
|
+
}
|
|
312
351
|
const TableFilter = () => {
|
|
313
352
|
const { table } = useDataTable();
|
|
314
|
-
return (jsx(Fragment, { children: table.
|
|
315
|
-
|
|
316
|
-
? header.column.id
|
|
317
|
-
: header.column.columnDef.meta.displayName;
|
|
318
|
-
return (jsx(Fragment, { children: header.column.getCanFilter() && (jsxs(Box, { children: [jsx(Text, { children: displayName }), jsx(Input, { value: header.column.getFilterValue()
|
|
319
|
-
? String(header.column.getFilterValue())
|
|
320
|
-
: "", onChange: (e) => {
|
|
321
|
-
header.column.setFilterValue(e.target.value);
|
|
322
|
-
} })] })) }));
|
|
353
|
+
return (jsx(Fragment, { children: table.getAllColumns().map((column) => {
|
|
354
|
+
return jsx(Filter, { column: column });
|
|
323
355
|
}) }));
|
|
324
356
|
};
|
|
325
357
|
|
|
@@ -426,7 +458,7 @@ const TableRowSelector = ({ index, row, hoveredRow, pinnedBgColor = { light: "gr
|
|
|
426
458
|
}
|
|
427
459
|
: {}),
|
|
428
460
|
// styling resize and pinning end
|
|
429
|
-
display: "grid", children: [!isCheckBoxVisible(index, row) && (jsx(
|
|
461
|
+
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`, children: index + 1 })), 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(),
|
|
430
462
|
disabled: !row.getCanSelect(),
|
|
431
463
|
// indeterminate: row.getIsSomeSelected(),
|
|
432
464
|
onChange: row.getToggleSelectedHandler() }) }))] }));
|
|
@@ -475,7 +507,7 @@ const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, }
|
|
|
475
507
|
// styling resize and pinning end
|
|
476
508
|
onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (jsx(FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: table.getIsAllRowsSelected(),
|
|
477
509
|
// indeterminate: table.getIsSomeRowsSelected(),
|
|
478
|
-
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsx(
|
|
510
|
+
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsx(Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] }), footerGroup.headers.map((header) => (jsx(Th, { padding: "0", colSpan: header.colSpan,
|
|
479
511
|
// styling resize and pinning start
|
|
480
512
|
maxWidth: `${header.getSize()}px`, width: `${header.getSize()}px`, left: header.column.getIsPinned()
|
|
481
513
|
? `${header.getStart("left") + SELECTION_BOX_WIDTH + table.getDensityValue() * 2}px`
|
|
@@ -522,7 +554,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
522
554
|
// styling resize and pinning end
|
|
523
555
|
padding: `${table.getDensityValue()}px`, onMouseEnter: () => handleRowHover(true), onMouseLeave: () => handleRowHover(false), display: "grid", children: [isCheckBoxVisible() && (jsx(FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Checkbox, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, isChecked: table.getIsAllRowsSelected(),
|
|
524
556
|
// indeterminate: table.getIsSomeRowsSelected(),
|
|
525
|
-
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsx(
|
|
557
|
+
onChange: table.getToggleAllRowsSelectedHandler() }) })), !isCheckBoxVisible() && (jsx(Box, { as: "span", margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }))] }), headerGroup.headers.map((header) => {
|
|
526
558
|
const resizeProps = {
|
|
527
559
|
onClick: () => header.column.resetSize(),
|
|
528
560
|
onMouseDown: header.getResizeHandler(),
|
|
@@ -541,7 +573,7 @@ const TableHeader = ({ canResize, pinnedBgColor = { light: "gray.50", dark: "gra
|
|
|
541
573
|
// styling resize and pinning end
|
|
542
574
|
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
|
|
543
575
|
? null
|
|
544
|
-
: flexRender(header.column.columnDef.header, header.getContext()), jsx(Box, { children: header.column.getCanSort() && (jsxs(Fragment, { children: [header.column.getIsSorted() === false &&
|
|
576
|
+
: 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: () => {
|
|
545
577
|
header.column.pin("left");
|
|
546
578
|
}, children: "Pin Column" })), header.column.getIsPinned() && (jsx(MenuItem, { icon: jsx(MdCancel, {}), onClick: () => {
|
|
547
579
|
header.column.pin(false);
|
|
@@ -713,9 +745,9 @@ const TableSelector = () => {
|
|
|
713
745
|
|
|
714
746
|
const TextCell = ({ label, noOfLines = [1], padding = "0rem", children, tooltipProps, ...props }) => {
|
|
715
747
|
if (label) {
|
|
716
|
-
return (jsx(
|
|
748
|
+
return (jsx(Flex, { alignItems: "center", height: "100%", padding: padding, children: jsx(Tooltip, { label: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", noOfLines: [5], children: label }), placement: "auto", ...tooltipProps, children: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }) }));
|
|
717
749
|
}
|
|
718
|
-
return (jsx(
|
|
750
|
+
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 }) }));
|
|
719
751
|
};
|
|
720
752
|
|
|
721
753
|
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 };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
import { ColumnDef, ColumnFiltersState, FilterFn, RowSelectionState, SortingState } from "@tanstack/react-table";
|
|
2
|
+
import { ColumnDef, ColumnFiltersState, FilterFn, RowSelectionState, SortingState, VisibilityState } from "@tanstack/react-table";
|
|
3
3
|
import { RankingInfo } from "@tanstack/match-sorter-utils";
|
|
4
4
|
import { DensityState } from "./DensityFeature";
|
|
5
5
|
declare module "@tanstack/react-table" {
|
|
@@ -28,5 +28,6 @@ export interface DataTableProps<TData> {
|
|
|
28
28
|
};
|
|
29
29
|
sorting?: SortingState;
|
|
30
30
|
rowSelection?: RowSelectionState;
|
|
31
|
+
columnVisibility?: VisibilityState;
|
|
31
32
|
}
|
|
32
|
-
export declare const DataTable: <TData>({ columns, data, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder: defaultColumnOrder, columnFilters: defaultColumnFilter, density, globalFilter: defaultGlobalFilter, pagination: defaultPagination, sorting: defaultSorting, rowSelection: defaultRowSelection, children, }: DataTableProps<TData>) => import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
export declare const DataTable: <TData>({ columns, data, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, onRowSelect, columnOrder: defaultColumnOrder, columnFilters: defaultColumnFilter, density, globalFilter: defaultGlobalFilter, pagination: defaultPagination, sorting: defaultSorting, rowSelection: defaultRowSelection, columnVisibility: defaultColumnVisibility, children, }: DataTableProps<TData>) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
import { ColumnDef, ColumnFiltersState, RowData, RowSelectionState, SortingState } from "@tanstack/react-table";
|
|
2
|
+
import { ColumnDef, ColumnFiltersState, RowData, RowSelectionState, SortingState, VisibilityState } from "@tanstack/react-table";
|
|
3
3
|
import { DensityState } from "./DensityFeature";
|
|
4
4
|
export interface DataTableServerProps<TData> {
|
|
5
5
|
children: JSX.Element | JSX.Element[];
|
|
@@ -20,6 +20,7 @@ export interface DataTableServerProps<TData> {
|
|
|
20
20
|
sorting?: SortingState;
|
|
21
21
|
rowSelection?: RowSelectionState;
|
|
22
22
|
loadingComponent?: JSX.Element;
|
|
23
|
+
columnVisibility?: VisibilityState;
|
|
23
24
|
}
|
|
24
25
|
export interface Result<T> {
|
|
25
26
|
results: T[];
|
|
@@ -31,7 +32,7 @@ export interface DataResponse<T> extends Result<T> {
|
|
|
31
32
|
}
|
|
32
33
|
declare module "@tanstack/react-table" {
|
|
33
34
|
interface ColumnMeta<TData extends RowData, TValue> {
|
|
34
|
-
displayName
|
|
35
|
+
displayName?: string;
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
|
-
export 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>) => import("react/jsx-runtime").JSX.Element;
|
|
38
|
+
export 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>) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1,8 @@
|
|
|
1
|
+
import { RowData } from "@tanstack/react-table";
|
|
2
|
+
declare module "@tanstack/react-table" {
|
|
3
|
+
interface ColumnMeta<TData extends RowData, TValue> {
|
|
4
|
+
filterVariant?: "text" | "range" | "select";
|
|
5
|
+
filterOptions?: string[];
|
|
6
|
+
}
|
|
7
|
+
}
|
|
1
8
|
export declare const TableFilter: () => import("react/jsx-runtime").JSX.Element;
|