@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: string;
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.filterCount,
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.getLeafHeaders().map((header) => {
317
- const displayName = header.column.columnDef.meta === undefined
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.FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsxRuntime.jsx(react$1.Box, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, children: jsxRuntime.jsx("span", { 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(),
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.FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsxRuntime.jsx(react$1.Box, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }) }))] }), footerGroup.headers.map((header) => (jsxRuntime.jsx(react$1.Th, { padding: "0", colSpan: header.colSpan,
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.FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsxRuntime.jsx(react$1.Box, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }) }))] }), headerGroup.headers.map((header) => {
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 && (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: () => {
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.Box, { 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 }) }) }));
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.Box, { padding: padding, children: jsxRuntime.jsx(react$1.Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }));
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, Box, Text, Input, useDisclosure, IconButton, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, Flex, ModalFooter, Grid, Icon, 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';
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.filterCount,
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.getLeafHeaders().map((header) => {
315
- const displayName = header.column.columnDef.meta === undefined
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(FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Box, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px`, children: jsx("span", { 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(),
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(FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Box, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }) }))] }), footerGroup.headers.map((header) => (jsx(Th, { padding: "0", colSpan: header.colSpan,
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(FormLabel, { margin: "0rem", display: "grid", justifyItems: "center", alignItems: "center", children: jsx(Box, { width: `${SELECTION_BOX_WIDTH}px`, height: `${SELECTION_BOX_WIDTH}px` }) }))] }), headerGroup.headers.map((header) => {
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 && (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: () => {
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(Box, { 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 }) }) }));
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(Box, { padding: padding, children: jsx(Text, { as: "span", overflow: "hidden", textOverflow: "ellipsis", wordBreak: "break-all", noOfLines: noOfLines, ...props, children: children }) }));
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: string;
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "1.0.52",
3
+ "version": "1.0.54",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",