@pdg/react-table 1.0.20 → 1.0.22

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.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- import*as React from'react';import React__default,{useRef,useEffect,cloneElement,useState,isValidElement,createRef,PureComponent,useLayoutEffect,createContext,useContext,useMemo,useCallback,useId}from'react';import {styled,TableRow,lighten,TableCell,Box,Tooltip,Stack,Pagination,Paper,Table as Table$1,TableHead,TableBody,Icon,TableFooter,Grid,Button,Popper,Grow,ClickAwayListener}from'@mui/material';import {findDOMNode}from'react-dom';import {useSortable,sortableKeyboardCoordinates,arrayMove,SortableContext,verticalListSortingStrategy}from'@dnd-kit/sortable';import dayjs from'dayjs';import {useSensors,useSensor,MouseSensor,TouchSensor,KeyboardSensor,DndContext,closestCenter}from'@dnd-kit/core';import {Search,SearchGroup,FormHidden}from'@pdg/react-form';/******************************************************************************
1
+ import*as React from'react';import React__default,{useRef,useEffect,cloneElement,useState,isValidElement,createRef,PureComponent,useLayoutEffect,createContext,useContext,useMemo,useCallback,useId}from'react';import {styled,TableRow,lighten,TableCell,Box,Checkbox,Tooltip,Stack,Pagination,Paper,Table as Table$1,TableHead,TableBody,Icon,TableFooter,Grid,Button,Popper,Grow,ClickAwayListener}from'@mui/material';import {findDOMNode}from'react-dom';import {useSortable,sortableKeyboardCoordinates,arrayMove,SortableContext,verticalListSortingStrategy}from'@dnd-kit/sortable';import dayjs from'dayjs';import {useSensors,useSensor,MouseSensor,TouchSensor,KeyboardSensor,DndContext,closestCenter}from'@dnd-kit/core';import {Search,SearchGroup,FormHidden}from'@pdg/react-form';/******************************************************************************
2
2
  Copyright (c) Microsoft Corporation.
3
3
 
4
4
  Permission to use, copy, modify, and/or distribute this software for any
@@ -8339,8 +8339,14 @@ var equal = function (v1, v2) {
8339
8339
  }var TableContextDefaultValue = {
8340
8340
  menuOpen: false,
8341
8341
  openMenuId: undefined,
8342
- // eslint-disable-next-line
8342
+ /* eslint-disable */
8343
8343
  setMenuOpen: function () { },
8344
+ setItemColumnChecked: function () { },
8345
+ setItemColumnCheckDisabled: function () { },
8346
+ setItemColumnCommands: function () { },
8347
+ setHeadColumnChecked: function () { },
8348
+ setHeadColumnCommands: function () { },
8349
+ /* eslint-enable */
8344
8350
  };var TableContext = createContext(TableContextDefaultValue);function useTableState() {
8345
8351
  var value = useContext(TableContext);
8346
8352
  if (value === undefined) {
@@ -8453,7 +8459,11 @@ var TableCommonCell = function (_a) {
8453
8459
  }, [column, index, initSx, item, type]);
8454
8460
  // Event Handler ---------------------------------------------------------------------------------------------------
8455
8461
  var handleClick = useCallback(function (e) {
8456
- if (!menuOpen) {
8462
+ if (!menuOpen &&
8463
+ column.type !== 'check' &&
8464
+ column.type !== 'button' &&
8465
+ column.type !== 'buttons' &&
8466
+ column.type !== 'img') {
8457
8467
  e.stopPropagation();
8458
8468
  if (type === 'body') {
8459
8469
  if (item != null && index != null) {
@@ -8474,8 +8484,43 @@ var TableCommonCell = function (_a) {
8474
8484
  var templateObject_1$1;var StyledButtonsBox = styled(Box)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n"], ["\n display: flex;\n flex-wrap: wrap;\n gap: 5px;\n"])));
8475
8485
  var TableBodyCell = function (_a) {
8476
8486
  // Use ---------------------------------------------------------------------------------------------------------------
8477
- var item = _a.item, index = _a.index, column = _a.column, defaultAlign = _a.defaultAlign, defaultEllipsis = _a.defaultEllipsis, onClick = _a.onClick;
8478
- var menuOpen = useTableState().menuOpen;
8487
+ var item = _a.item, index = _a.index, column = _a.column, defaultAlign = _a.defaultAlign, defaultEllipsis = _a.defaultEllipsis, onClick = _a.onClick, onCheckChange = _a.onCheckChange;
8488
+ var _b = useTableState(), menuOpen = _b.menuOpen, setItemColumnChecked = _b.setItemColumnChecked, setItemColumnCheckDisabled = _b.setItemColumnCheckDisabled, setItemColumnCommands = _b.setItemColumnCommands;
8489
+ // State -------------------------------------------------------------------------------------------------------------
8490
+ var _c = useState(false), checked = _c[0], setChecked = _c[1];
8491
+ var _d = useState(false), checkDisabled = _d[0], setCheckDisabled = _d[1];
8492
+ // Effect ------------------------------------------------------------------------------------------------------------
8493
+ useEffect(function () {
8494
+ if (column.type === 'check') {
8495
+ setChecked(column.onInitChecked ? column.onInitChecked(item) : false);
8496
+ setCheckDisabled(column.onCheckDisabled ? column.onCheckDisabled(item) : false);
8497
+ }
8498
+ setItemColumnCommands(item, column, {
8499
+ setChecked: function (checked) {
8500
+ if (column.type === 'check') {
8501
+ setChecked(checked);
8502
+ }
8503
+ },
8504
+ setCheckDisabled: function (disabled) {
8505
+ if (column.type === 'check') {
8506
+ setCheckDisabled(disabled);
8507
+ }
8508
+ },
8509
+ });
8510
+ }, [column, item, setItemColumnCommands]);
8511
+ useEffect(function () {
8512
+ if (column.type === 'check') {
8513
+ setItemColumnChecked(item, column, checked);
8514
+ column.onCheckChange && column.onCheckChange(item, checked);
8515
+ }
8516
+ // eslint-disable-next-line react-hooks/exhaustive-deps
8517
+ }, [checked]);
8518
+ useEffect(function () {
8519
+ if (column.type === 'check') {
8520
+ setItemColumnCheckDisabled(item, column, checkDisabled);
8521
+ }
8522
+ // eslint-disable-next-line react-hooks/exhaustive-deps
8523
+ }, [checkDisabled]);
8479
8524
  // Memo --------------------------------------------------------------------------------------------------------------
8480
8525
  var buttonsBoxJustifyContent = useMemo(function () {
8481
8526
  switch (getTableColumnAlign(column, defaultAlign)) {
@@ -8487,20 +8532,19 @@ var TableBodyCell = function (_a) {
8487
8532
  return 'start';
8488
8533
  }
8489
8534
  }, [column, defaultAlign]);
8490
- // State -----------------------------------------------------------------------------------------------------------
8491
- var _b = useState(), data = _b[0], setData = _b[1];
8492
- // Effect ----------------------------------------------------------------------------------------------------------
8493
- useEffect(function () {
8535
+ var data = useMemo(function () {
8494
8536
  var _a, _b;
8495
8537
  var data;
8496
- if (column.onRender) {
8497
- data = column.onRender(item, index);
8498
- }
8499
- else if (column.name) {
8500
- data = item[column.name];
8501
- }
8502
- else {
8503
- data = undefined;
8538
+ if (column.type !== 'check') {
8539
+ if (column.onRender) {
8540
+ data = column.onRender(item, index);
8541
+ }
8542
+ else if (column.name) {
8543
+ data = item[column.name];
8544
+ }
8545
+ else {
8546
+ data = undefined;
8547
+ }
8504
8548
  }
8505
8549
  switch (column.type) {
8506
8550
  case 'number':
@@ -8508,6 +8552,13 @@ var TableBodyCell = function (_a) {
8508
8552
  data = numberWithThousandSeparator(data);
8509
8553
  }
8510
8554
  break;
8555
+ case 'check':
8556
+ data = (React__default.createElement(Box, { className: 'TableBoxyCell-check-box', onClick: menuOpen ? undefined : function (e) { return e.stopPropagation(); } },
8557
+ React__default.createElement(Checkbox, { checked: checked, disabled: checkDisabled, onChange: function (e, newChecked) {
8558
+ setChecked(newChecked);
8559
+ onCheckChange && onCheckChange(item, column, newChecked);
8560
+ } })));
8561
+ break;
8511
8562
  case 'button':
8512
8563
  data = (React__default.createElement(Box, { className: 'TableBoxyCell-button-box', onClick: menuOpen ? undefined : function (e) { return e.stopPropagation(); } }, data));
8513
8564
  break;
@@ -8550,8 +8601,8 @@ var TableBodyCell = function (_a) {
8550
8601
  }
8551
8602
  break;
8552
8603
  }
8553
- setData(data);
8554
- }, [item, column, index, buttonsBoxJustifyContent, menuOpen]);
8604
+ return data;
8605
+ }, [column, item, index, menuOpen, checked, checkDisabled, buttonsBoxJustifyContent, onCheckChange]);
8555
8606
  // Event Handler ---------------------------------------------------------------------------------------------------
8556
8607
  var handleClick = useCallback(function (item, index) {
8557
8608
  if (column.onClick) {
@@ -8579,9 +8630,9 @@ var templateObject_1;var StyledBodyRow = styled(TableRow)(function (_a) {
8579
8630
  var TableBodyRow = function (_a) {
8580
8631
  var className = _a.className, style = _a.style,
8581
8632
  //--------------------------------------------------------------------------------------------------------------------
8582
- id = _a.id, index = _a.index, defaultAlign = _a.defaultAlign, defaultEllipsis = _a.defaultEllipsis, sortable = _a.sortable, columns = _a.columns, item = _a.item, onClick = _a.onClick,
8633
+ id = _a.id, index = _a.index, defaultAlign = _a.defaultAlign, defaultEllipsis = _a.defaultEllipsis, sortable = _a.sortable, columns = _a.columns, item = _a.item, onClick = _a.onClick, onCheckChange = _a.onCheckChange,
8583
8634
  // -------------------------------------------------------------------------------------------------------------------
8584
- props = __rest$1(_a, ["className", "style", "id", "index", "defaultAlign", "defaultEllipsis", "sortable", "columns", "item", "onClick"]);
8635
+ props = __rest$1(_a, ["className", "style", "id", "index", "defaultAlign", "defaultEllipsis", "sortable", "columns", "item", "onClick", "onCheckChange"]);
8585
8636
  var _b = useSortable({ id: id }), attributes = _b.attributes, listeners = _b.listeners, setNodeRef = _b.setNodeRef, transform = _b.transform, transition = _b.transition;
8586
8637
  var finalStyle = useMemo(function () {
8587
8638
  return sortable
@@ -8591,20 +8642,49 @@ var TableBodyRow = function (_a) {
8591
8642
  return sortable
8592
8643
  ? __assign$1(__assign$1({ ref: setNodeRef }, attributes), listeners) : {};
8593
8644
  }, [attributes, listeners, setNodeRef, sortable]);
8594
- return (React__default.createElement(StyledBodyRow, __assign$1({ className: classNames('TableBodyRow', className), style: finalStyle }, props, sortableProps), columns.map(function (column, columnIdx) { return (React__default.createElement(TableBodyCell, { key: columnIdx, index: index, item: item, defaultAlign: defaultAlign, defaultEllipsis: defaultEllipsis, column: column, onClick: onClick })); })));
8645
+ return (React__default.createElement(StyledBodyRow, __assign$1({ className: classNames('TableBodyRow', className), style: finalStyle }, props, sortableProps), columns.map(function (column, columnIdx) { return (React__default.createElement(TableBodyCell, { key: columnIdx, index: index, item: item, defaultAlign: defaultAlign, defaultEllipsis: defaultEllipsis, column: column, onClick: onClick, onCheckChange: onCheckChange })); })));
8595
8646
  };
8596
8647
  TableBodyRow.displayName = 'TableBodyRow';
8597
8648
  TableBodyRow.defaultProps = TableBodyRowDefaultProps;var TableHeadCell = function (_a) {
8598
- var column = _a.column, defaultAlign = _a.defaultAlign;
8649
+ // Use ---------------------------------------------------------------------------------------------------------------
8650
+ var column = _a.column, defaultAlign = _a.defaultAlign, onCheckChange = _a.onCheckChange;
8651
+ var _b = useTableState(), setHeadColumnChecked = _b.setHeadColumnChecked, setHeadColumnCommands = _b.setHeadColumnCommands;
8652
+ // State -------------------------------------------------------------------------------------------------------------
8653
+ var _c = useState(false), checked = _c[0], setChecked = _c[1];
8654
+ // Effect ------------------------------------------------------------------------------------------------------------
8655
+ useEffect(function () {
8656
+ if (column.type === 'check') {
8657
+ setHeadColumnChecked(column, checked);
8658
+ }
8659
+ }, [column, checked, setHeadColumnChecked]);
8660
+ useEffect(function () {
8661
+ setHeadColumnCommands(column, {
8662
+ setChecked: function (checked) {
8663
+ if (column.type === 'check') {
8664
+ setChecked(checked);
8665
+ }
8666
+ },
8667
+ });
8668
+ }, [setHeadColumnCommands, column]);
8669
+ // Memo --------------------------------------------------------------------------------------------------------------
8599
8670
  var data = useMemo(function () {
8600
8671
  var _a, _b;
8601
- if ((_a = column.head) === null || _a === void 0 ? void 0 : _a.onRender) {
8602
- return (_b = column.head) === null || _b === void 0 ? void 0 : _b.onRender();
8672
+ if (column.type === 'check') {
8673
+ return (React__default.createElement(Checkbox, { checked: checked, onChange: function (e, newChecked) {
8674
+ setChecked(newChecked);
8675
+ onCheckChange && onCheckChange(column, newChecked);
8676
+ } }));
8603
8677
  }
8604
8678
  else {
8605
- return column.label;
8679
+ if ((_a = column.head) === null || _a === void 0 ? void 0 : _a.onRender) {
8680
+ return (_b = column.head) === null || _b === void 0 ? void 0 : _b.onRender();
8681
+ }
8682
+ else {
8683
+ return column.label;
8684
+ }
8606
8685
  }
8607
- }, [column]);
8686
+ }, [checked, column, onCheckChange]);
8687
+ // Render ------------------------------------------------------------------------------------------------------------
8608
8688
  return (React__default.createElement(TableCommonCell, { type: 'head', className: 'TableHeadCell', column: column, defaultAlign: defaultAlign }, data));
8609
8689
  };var TableFooterCell = function (_a) {
8610
8690
  var column = _a.column, defaultAlign = _a.defaultAlign;
@@ -8716,14 +8796,76 @@ TableBodyRow.defaultProps = TableBodyRowDefaultProps;var TableHeadCell = functio
8716
8796
  styleInject(css_248z);var TableContextProvider = function (_a) {
8717
8797
  var children = _a.children, value = _a.value;
8718
8798
  return React__default.createElement(TableContext.Provider, { value: value }, children);
8719
- };function columnFilter(v) {
8799
+ };// Unique ID creation requires a high quality random # generator. In the browser we therefore
8800
+ // require the crypto API and do not support built-in fallback to lower quality random number
8801
+ // generators (like Math.random()).
8802
+ let getRandomValues;
8803
+ const rnds8 = new Uint8Array(16);
8804
+ function rng() {
8805
+ // lazy load so that environments that need to polyfill have a chance to do so
8806
+ if (!getRandomValues) {
8807
+ // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation.
8808
+ getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
8809
+
8810
+ if (!getRandomValues) {
8811
+ throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');
8812
+ }
8813
+ }
8814
+
8815
+ return getRandomValues(rnds8);
8816
+ }/**
8817
+ * Convert array of 16 byte values to UUID string format of the form:
8818
+ * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
8819
+ */
8820
+
8821
+ const byteToHex = [];
8822
+
8823
+ for (let i = 0; i < 256; ++i) {
8824
+ byteToHex.push((i + 0x100).toString(16).slice(1));
8825
+ }
8826
+
8827
+ function unsafeStringify(arr, offset = 0) {
8828
+ // Note: Be careful editing this code! It's been tuned for performance
8829
+ // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
8830
+ return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
8831
+ }const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
8832
+ var native = {
8833
+ randomUUID
8834
+ };function v4(options, buf, offset) {
8835
+ if (native.randomUUID && !buf && !options) {
8836
+ return native.randomUUID();
8837
+ }
8838
+
8839
+ options = options || {};
8840
+ const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
8841
+
8842
+ rnds[6] = rnds[6] & 0x0f | 0x40;
8843
+ rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
8844
+
8845
+ if (buf) {
8846
+ offset = offset || 0;
8847
+
8848
+ for (let i = 0; i < 16; ++i) {
8849
+ buf[offset + i] = rnds[i];
8850
+ }
8851
+
8852
+ return buf;
8853
+ }
8854
+
8855
+ return unsafeStringify(rnds);
8856
+ }function columnFilter(v) {
8720
8857
  return v !== undefined && v !== null && v !== false;
8721
8858
  }
8722
8859
  var Table = React__default.forwardRef(function (_a, ref) {
8723
- // sortable --------------------------------------------------------------------------------------------------------
8724
- var initColumns = _a.columns, initItems = _a.items, initPaging = _a.paging, pagingAlign = _a.pagingAlign, defaultAlign = _a.defaultAlign, defaultEllipsis = _a.defaultEllipsis, stickyHeader = _a.stickyHeader, height = _a.height, minHeight = _a.minHeight, maxHeight = _a.maxHeight, fullHeight = _a.fullHeight, showOddColor = _a.showOddColor, showEvenColor = _a.showEvenColor, cellPadding = _a.cellPadding, footer = _a.footer, noData = _a.noData, pagination = _a.pagination, sortable = _a.sortable, onClick = _a.onClick, onGetBodyRowSx = _a.onGetBodyRowSx, onPageChange = _a.onPageChange, onSortChange = _a.onSortChange,
8860
+ // Ref ---------------------------------------------------------------------------------------------------------------
8861
+ var initColumns = _a.columns, initItems = _a.items, initPaging = _a.paging, pagingAlign = _a.pagingAlign, defaultAlign = _a.defaultAlign, defaultEllipsis = _a.defaultEllipsis, stickyHeader = _a.stickyHeader, height = _a.height, minHeight = _a.minHeight, maxHeight = _a.maxHeight, fullHeight = _a.fullHeight, showOddColor = _a.showOddColor, showEvenColor = _a.showEvenColor, cellPadding = _a.cellPadding, footer = _a.footer, noData = _a.noData, pagination = _a.pagination, sortable = _a.sortable, onClick = _a.onClick, onGetBodyRowSx = _a.onGetBodyRowSx, onPageChange = _a.onPageChange, onSortChange = _a.onSortChange, onCheckChange = _a.onCheckChange,
8725
8862
  // ---------------------------------------------------------------------------------------------------------------
8726
8863
  className = _a.className, initStyle = _a.style, sx = _a.sx;
8864
+ var localHeaderDataRef = useRef({});
8865
+ var localBodyDataRef = useRef({});
8866
+ var updateHeadCheckTimer = useRef();
8867
+ var fireOnCheckChangeTimer = useRef({});
8868
+ // sortable --------------------------------------------------------------------------------------------------------
8727
8869
  var sensors = useSensors(useSensor(MouseSensor, {
8728
8870
  // Require the mouse to move by 10 pixels before activating
8729
8871
  activationConstraint: {
@@ -8790,17 +8932,132 @@ var Table = React__default.forwardRef(function (_a, ref) {
8790
8932
  var makeSortableItems = useCallback(function (items) {
8791
8933
  return items === null || items === void 0 ? void 0 : items.map(function (_a, index) {
8792
8934
  var id = _a.id, item = __rest$1(_a, ["id"]);
8793
- return __assign$1({ id: id == null ? index : id }, item);
8935
+ return __assign$1({ id: id == null ? "".concat(v4(), "_").concat(index) : id }, item);
8936
+ });
8937
+ }, []);
8938
+ var updateHeadCheck = useCallback(function (column) {
8939
+ if (updateHeadCheckTimer.current) {
8940
+ clearTimeout(updateHeadCheckTimer.current);
8941
+ updateHeadCheckTimer.current = undefined;
8942
+ }
8943
+ var headColumnData = localHeaderDataRef.current[column.id];
8944
+ if (headColumnData) {
8945
+ updateHeadCheckTimer.current = setTimeout(function () {
8946
+ var _a;
8947
+ updateHeadCheckTimer.current = undefined;
8948
+ var allChecked = !Object.keys(localBodyDataRef.current).find(function (key) {
8949
+ var columnData = localBodyDataRef.current[key].columns[column.id];
8950
+ if (columnData) {
8951
+ if (!columnData.checkDisabled) {
8952
+ return !columnData.checked;
8953
+ }
8954
+ }
8955
+ });
8956
+ (_a = headColumnData.commands) === null || _a === void 0 ? void 0 : _a.setChecked(allChecked);
8957
+ }, 100);
8958
+ }
8959
+ }, []);
8960
+ var getCheckedItems = useCallback(function (columnId) {
8961
+ var checkedItems = [];
8962
+ Object.keys(localBodyDataRef.current).forEach(function (key) {
8963
+ var itemData = localBodyDataRef.current[key];
8964
+ var columnData = itemData.columns[columnId];
8965
+ if (columnData) {
8966
+ if (columnData.checked) {
8967
+ checkedItems.push(itemData.item);
8968
+ }
8969
+ }
8970
+ });
8971
+ return checkedItems;
8972
+ }, []);
8973
+ var stopHeadCheckTimer = useCallback(function () {
8974
+ if (updateHeadCheckTimer.current) {
8975
+ clearTimeout(updateHeadCheckTimer.current);
8976
+ updateHeadCheckTimer.current = undefined;
8977
+ }
8978
+ }, []);
8979
+ var clearFireOnCheckChangeTimer = useCallback(function () {
8980
+ Object.keys(fireOnCheckChangeTimer.current).forEach(function (key) {
8981
+ if (fireOnCheckChangeTimer.current[key]) {
8982
+ clearTimeout(fireOnCheckChangeTimer.current[key]);
8983
+ }
8794
8984
  });
8985
+ fireOnCheckChangeTimer.current = {};
8795
8986
  }, []);
8987
+ var fireOnCheckChange = useCallback(function (columnId) {
8988
+ if (fireOnCheckChangeTimer.current[columnId]) {
8989
+ clearTimeout(fireOnCheckChangeTimer.current[columnId]);
8990
+ fireOnCheckChangeTimer.current[columnId] = undefined;
8991
+ }
8992
+ if (onCheckChange) {
8993
+ fireOnCheckChangeTimer.current[columnId] = setTimeout(function () {
8994
+ fireOnCheckChangeTimer.current[columnId] = undefined;
8995
+ onCheckChange && onCheckChange(columnId, getCheckedItems(columnId));
8996
+ }, 100);
8997
+ }
8998
+ }, [getCheckedItems, onCheckChange]);
8796
8999
  // Effect ----------------------------------------------------------------------------------------------------------
8797
9000
  useEffect(function () {
9001
+ return function () {
9002
+ stopHeadCheckTimer();
9003
+ clearFireOnCheckChangeTimer();
9004
+ };
9005
+ // eslint-disable-next-line react-hooks/exhaustive-deps
9006
+ }, []);
9007
+ useEffect(function () {
9008
+ stopHeadCheckTimer();
9009
+ clearFireOnCheckChangeTimer();
8798
9010
  setSortableItems(makeSortableItems(items));
8799
9011
  // eslint-disable-next-line react-hooks/exhaustive-deps
8800
9012
  }, [items]);
8801
9013
  useEffect(function () {
9014
+ stopHeadCheckTimer();
9015
+ clearFireOnCheckChangeTimer();
8802
9016
  setFinalColumns(columns === null || columns === void 0 ? void 0 : columns.filter(columnFilter));
9017
+ // eslint-disable-next-line react-hooks/exhaustive-deps
8803
9018
  }, [columns]);
9019
+ useLayoutEffect(function () {
9020
+ clearFireOnCheckChangeTimer();
9021
+ if (sortableItems) {
9022
+ localBodyDataRef.current = sortableItems.reduce(function (res, item) {
9023
+ res[item.id] = {
9024
+ item: item,
9025
+ columns: {},
9026
+ };
9027
+ if (finalColumns) {
9028
+ finalColumns.forEach(function (c) {
9029
+ var _a;
9030
+ var columnId = c.id;
9031
+ if ((_a = localBodyDataRef.current[item.id]) === null || _a === void 0 ? void 0 : _a.columns[columnId]) {
9032
+ res[item.id].columns[columnId] = localBodyDataRef.current[item.id].columns[columnId];
9033
+ }
9034
+ else {
9035
+ res[item.id].columns[columnId] = {
9036
+ column: c,
9037
+ checked: false,
9038
+ checkDisabled: false,
9039
+ };
9040
+ }
9041
+ });
9042
+ }
9043
+ return res;
9044
+ }, {});
9045
+ }
9046
+ else {
9047
+ localBodyDataRef.current = {};
9048
+ }
9049
+ }, [sortableItems, finalColumns, clearFireOnCheckChangeTimer]);
9050
+ useLayoutEffect(function () {
9051
+ if (finalColumns) {
9052
+ localHeaderDataRef.current = finalColumns.reduce(function (res, c) {
9053
+ res[c.id] = { column: c, checked: false };
9054
+ return res;
9055
+ }, {});
9056
+ }
9057
+ else {
9058
+ localHeaderDataRef.current = {};
9059
+ }
9060
+ }, [finalColumns]);
8804
9061
  // Commands --------------------------------------------------------------------------------------------------------
8805
9062
  useLayoutEffect(function () {
8806
9063
  if (ref) {
@@ -8824,6 +9081,7 @@ var Table = React__default.forwardRef(function (_a, ref) {
8824
9081
  resetSort: function () {
8825
9082
  setSortableItems(makeSortableItems(lastItems_1));
8826
9083
  },
9084
+ getCheckedItems: getCheckedItems,
8827
9085
  };
8828
9086
  if (typeof ref === 'function') {
8829
9087
  ref(commands);
@@ -8832,7 +9090,7 @@ var Table = React__default.forwardRef(function (_a, ref) {
8832
9090
  ref.current = commands;
8833
9091
  }
8834
9092
  }
8835
- }, [ref, columns, items, paging, makeSortableItems, setColumns, setItems, setPaging]);
9093
+ }, [ref, columns, items, paging, makeSortableItems, setColumns, setItems, setPaging, getCheckedItems]);
8836
9094
  // Event Handler ---------------------------------------------------------------------------------------------------
8837
9095
  var handleDragEnd = useCallback(function (event) {
8838
9096
  var active = event.active, over = event.over;
@@ -8865,6 +9123,87 @@ var Table = React__default.forwardRef(function (_a, ref) {
8865
9123
  });
8866
9124
  }
8867
9125
  }, [onSortChange]);
9126
+ var handleHeadCheckChange = useCallback(function (column, checked) {
9127
+ Object.keys(localBodyDataRef.current).forEach(function (key) {
9128
+ var _a;
9129
+ var data = localBodyDataRef.current[key].columns[column.id];
9130
+ if (data) {
9131
+ if (!data.checkDisabled) {
9132
+ (_a = data.commands) === null || _a === void 0 ? void 0 : _a.setChecked(checked);
9133
+ }
9134
+ }
9135
+ });
9136
+ }, []);
9137
+ var handleBodyCheckChange = useCallback(function (item, column) {
9138
+ updateHeadCheck(column);
9139
+ }, [updateHeadCheck]);
9140
+ // TableContext Function ---------------------------------------------------------------------------------------------
9141
+ var TableContextSetMenuOpen = useCallback(function (newMenuOpen, newOpenMenuId) {
9142
+ if (newMenuOpen) {
9143
+ setMenuOpen(newMenuOpen);
9144
+ setOpenMenuId(newOpenMenuId);
9145
+ }
9146
+ else {
9147
+ if (openMenuId === newOpenMenuId) {
9148
+ setMenuOpen(false);
9149
+ setOpenMenuId(undefined);
9150
+ }
9151
+ }
9152
+ }, [openMenuId]);
9153
+ var TableContextSetItemColumnChecked = useCallback(function (item, column, checked) {
9154
+ var _a;
9155
+ var data = (_a = localBodyDataRef.current[item.id]) === null || _a === void 0 ? void 0 : _a.columns[column.id];
9156
+ if (data) {
9157
+ data.checked = checked;
9158
+ fireOnCheckChange(column.id);
9159
+ }
9160
+ }, [fireOnCheckChange]);
9161
+ var TableContextSetItemColumnCheckDisabled = useCallback(function (item, column, disabled) {
9162
+ var _a;
9163
+ var data = (_a = localBodyDataRef.current[item.id]) === null || _a === void 0 ? void 0 : _a.columns[column.id];
9164
+ if (data) {
9165
+ data.checkDisabled = disabled;
9166
+ }
9167
+ }, []);
9168
+ var TableContextSetItemColumnCommands = useCallback(function (item, column, commands) {
9169
+ var _a;
9170
+ var data = (_a = localBodyDataRef.current[item.id]) === null || _a === void 0 ? void 0 : _a.columns[column.id];
9171
+ if (data) {
9172
+ data.commands = commands;
9173
+ }
9174
+ }, []);
9175
+ var TableContextSetHeadColumnChecked = useCallback(function (column, checked) {
9176
+ var data = localHeaderDataRef.current[column.id];
9177
+ if (data) {
9178
+ data.checked = checked;
9179
+ }
9180
+ }, []);
9181
+ var TableContextSetHeadColumnCommands = useCallback(function (column, commands) {
9182
+ var data = localHeaderDataRef.current[column.id];
9183
+ if (data) {
9184
+ data.commands = commands;
9185
+ }
9186
+ }, []);
9187
+ // Memo --------------------------------------------------------------------------------------------------------------
9188
+ var tableContextValue = useMemo(function () { return ({
9189
+ menuOpen: menuOpen,
9190
+ openMenuId: openMenuId,
9191
+ setMenuOpen: TableContextSetMenuOpen,
9192
+ setItemColumnChecked: TableContextSetItemColumnChecked,
9193
+ setItemColumnCheckDisabled: TableContextSetItemColumnCheckDisabled,
9194
+ setItemColumnCommands: TableContextSetItemColumnCommands,
9195
+ setHeadColumnChecked: TableContextSetHeadColumnChecked,
9196
+ setHeadColumnCommands: TableContextSetHeadColumnCommands,
9197
+ }); }, [
9198
+ TableContextSetHeadColumnChecked,
9199
+ TableContextSetHeadColumnCommands,
9200
+ TableContextSetItemColumnCheckDisabled,
9201
+ TableContextSetItemColumnChecked,
9202
+ TableContextSetItemColumnCommands,
9203
+ TableContextSetMenuOpen,
9204
+ menuOpen,
9205
+ openMenuId,
9206
+ ]);
8868
9207
  // Memo --------------------------------------------------------------------------------------------------------------
8869
9208
  var isNoData = useMemo(function () { return !!sortableItems && sortableItems.length <= 0; }, [sortableItems]);
8870
9209
  var finalPagingHeight = useMemo(function () { return (paging && paging.total > 0 ? pagingHeight || 0 : 0); }, [paging, pagingHeight]);
@@ -8905,29 +9244,14 @@ var Table = React__default.forwardRef(function (_a, ref) {
8905
9244
  return style;
8906
9245
  }, [fullHeight]);
8907
9246
  // Render ----------------------------------------------------------------------------------------------------------
8908
- return finalColumns ? (React__default.createElement(TableContextProvider, { value: {
8909
- menuOpen: menuOpen,
8910
- openMenuId: openMenuId,
8911
- setMenuOpen: function (newMenuOpen, newOpenMenuId) {
8912
- if (newMenuOpen) {
8913
- setMenuOpen(newMenuOpen);
8914
- setOpenMenuId(newOpenMenuId);
8915
- }
8916
- else {
8917
- if (openMenuId === newOpenMenuId) {
8918
- setMenuOpen(false);
8919
- setOpenMenuId(undefined);
8920
- }
8921
- }
8922
- },
8923
- } },
9247
+ return finalColumns ? (React__default.createElement(TableContextProvider, { value: tableContextValue },
8924
9248
  React__default.createElement(Paper, { ref: fullHeight ? containerHeightDetector : undefined, className: classNames('Table', className), variant: 'outlined', style: style, sx: sx },
8925
9249
  React__default.createElement(SimpleBar, { style: simpleBarStyle },
8926
9250
  React__default.createElement(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd },
8927
9251
  React__default.createElement(Table$1, { stickyHeader: !isNoData && stickyHeader, sx: tableSx, style: tableStyle },
8928
9252
  React__default.createElement(TableHead, null,
8929
- React__default.createElement(TableRow, null, finalColumns.map(function (column, idx) { return (React__default.createElement(TableHeadCell, { key: idx, column: column, defaultAlign: defaultAlign })); }))),
8930
- React__default.createElement(TableBody, null, sortableItems ? (sortableItems.length > 0 ? (React__default.createElement(SortableContext, { items: sortableItems, strategy: verticalListSortingStrategy }, sortableItems.map(function (item, idx) { return (React__default.createElement(TableBodyRow, { key: item.id, className: classNames(!!showOddColor && 'odd-color', !!showEvenColor && 'even-color'), hover: true, sx: onGetBodyRowSx ? onGetBodyRowSx(item, idx) : undefined, id: item.id, index: idx, defaultAlign: defaultAlign, defaultEllipsis: defaultEllipsis, sortable: sortable, columns: finalColumns, item: item, onClick: onClick })); }))) : (React__default.createElement(StyledBodyRow$1, null,
9253
+ React__default.createElement(TableRow, null, finalColumns.map(function (column, idx) { return (React__default.createElement(TableHeadCell, { key: idx, column: column, defaultAlign: defaultAlign, onCheckChange: handleHeadCheckChange })); }))),
9254
+ React__default.createElement(TableBody, null, sortableItems ? (sortableItems.length > 0 ? (React__default.createElement(SortableContext, { items: sortableItems, strategy: verticalListSortingStrategy }, sortableItems.map(function (item, idx) { return (React__default.createElement(TableBodyRow, { key: item.id, className: classNames(!!showOddColor && 'odd-color', !!showEvenColor && 'even-color'), hover: true, sx: onGetBodyRowSx ? onGetBodyRowSx(item, idx) : undefined, id: item.id, index: idx, defaultAlign: defaultAlign, defaultEllipsis: defaultEllipsis, sortable: sortable, columns: finalColumns, item: item, onClick: onClick, onCheckChange: handleBodyCheckChange })); }))) : (React__default.createElement(StyledBodyRow$1, null,
8931
9255
  React__default.createElement(TableCell, { colSpan: finalColumns.length, style: { flex: 1 } }, noData ? (noData) : (React__default.createElement(StyledNoDataDiv, null,
8932
9256
  React__default.createElement("div", null,
8933
9257
  React__default.createElement(Icon, null, "error")),
@@ -9350,9 +9674,9 @@ TableButton.defaultProps = TableButtonDefaultProps;var TableMenuButtonDefaultPro
9350
9674
  id: menuId,
9351
9675
  'aria-labelledby': buttonId,
9352
9676
  onKeyDown: handleListKeyDown,
9353
- // onClick: handleClose,
9677
+ onClick: handleClose,
9354
9678
  });
9355
- }, [buttonId, handleListKeyDown, menuId, menuList, open]);
9679
+ }, [buttonId, handleClose, handleListKeyDown, menuId, menuList, open]);
9356
9680
  // Render ----------------------------------------------------------------------------------------------------------
9357
9681
  return (React__default.createElement("span", null,
9358
9682
  React__default.createElement(Button, __assign$1({ ref: function (r) {