@dmsi/wedgekit-react 0.0.215 → 0.0.217

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.
@@ -44,17 +44,18 @@ var Select = (_a) => {
44
44
  "displayValue",
45
45
  "value"
46
46
  ]);
47
+ var _a2;
47
48
  const inputRef = useRef(null);
48
49
  const inputContainerRef = useRef(null);
49
50
  const preventFocusOnInitialRender = useRef(true);
50
51
  const [show, setShow] = useState(false);
51
52
  useEffect(() => {
52
- var _a2;
53
+ var _a3;
53
54
  if (preventFocusOnInitialRender.current) {
54
55
  preventFocusOnInitialRender.current = false;
55
56
  return;
56
57
  }
57
- (_a2 = inputRef.current) == null ? void 0 : _a2.focus();
58
+ (_a3 = inputRef.current) == null ? void 0 : _a3.focus();
58
59
  }, [value]);
59
60
  return /* @__PURE__ */ jsxs(Fragment, { children: [
60
61
  /* @__PURE__ */ jsx(
@@ -97,11 +98,11 @@ var Select = (_a) => {
97
98
  removeRoundness,
98
99
  focus: show,
99
100
  onChange: (e) => {
100
- var _a2;
101
- return (_a2 = props.onChange) == null ? void 0 : _a2.call(props, e);
101
+ var _a3;
102
+ return (_a3 = props.onChange) == null ? void 0 : _a3.call(props, e);
102
103
  }
103
104
  }, props), {
104
- value: displayValue != null ? displayValue : value
105
+ value: (_a2 = displayValue != null ? displayValue : value) != null ? _a2 : props.onChange ? "" : void 0
105
106
  })
106
107
  ),
107
108
  renderMenu ? renderMenu({
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-ZFOANBWG.js";
16
16
  import {
17
17
  useMatchesMobile
18
- } from "./chunk-E6Y7ZHQX.js";
18
+ } from "./chunk-ZU2K7BD3.js";
19
19
  import {
20
20
  findDocumentRoot
21
21
  } from "./chunk-VXWSAIB5.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  useMenuPosition
3
- } from "./chunk-NIHZMIOL.js";
3
+ } from "./chunk-VP36B2MM.js";
4
4
  import {
5
5
  useMatchesMobile
6
- } from "./chunk-E6Y7ZHQX.js";
6
+ } from "./chunk-ZU2K7BD3.js";
7
7
  import {
8
8
  findDocumentRoot
9
9
  } from "./chunk-VXWSAIB5.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useMatchesMobile
3
- } from "./chunk-E6Y7ZHQX.js";
3
+ } from "./chunk-ZU2K7BD3.js";
4
4
  import {
5
5
  Label
6
6
  } from "./chunk-CJVTFYI4.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useMatchesMobile
3
- } from "./chunk-E6Y7ZHQX.js";
3
+ } from "./chunk-ZU2K7BD3.js";
4
4
  import {
5
5
  __spreadValues
6
6
  } from "./chunk-BBZEL7EG.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  Menu
3
- } from "./chunk-JITZWSPR.js";
3
+ } from "./chunk-NA3ODQCN.js";
4
4
  import {
5
5
  useSubMenuSystem
6
- } from "./chunk-NIHZMIOL.js";
6
+ } from "./chunk-VP36B2MM.js";
7
7
  import {
8
8
  MenuOption
9
- } from "./chunk-ERW3AMED.js";
9
+ } from "./chunk-QHHNFGEX.js";
10
10
  import {
11
11
  Search
12
12
  } from "./chunk-2WRRRPEB.js";
@@ -76,42 +76,56 @@ var useMatchesMedia = (query) => {
76
76
  var useMatchesMobile = () => useMatchesMedia("(width < 48rem)");
77
77
 
78
78
  // src/hooks/useTableLayout.ts
79
- import { useState as useState2, useEffect as useEffect3, useCallback } from "react";
79
+ import {
80
+ useState as useState2,
81
+ useEffect as useEffect3,
82
+ useCallback,
83
+ useRef
84
+ } from "react";
80
85
  function useTableLayout(initialColumns, key) {
81
86
  const [columns, setColumns] = useState2(initialColumns);
82
87
  const [isReady, setIsReady] = useState2(false);
83
- const [layoutSignal, setLayoutSignal] = useState2(0);
88
+ const renderCountRef = useRef(0);
89
+ const handleSaveLayout = useCallback(
90
+ (setter, _internal) => {
91
+ if (!isReady && !_internal || !key) return;
92
+ setColumns((prevColumns) => {
93
+ const newColumns = typeof setter === "function" ? setter(prevColumns) : setter;
94
+ if (JSON.stringify(newColumns) === JSON.stringify(prevColumns) && !_internal)
95
+ return prevColumns;
96
+ localStorage.setItem(`${key}-tableLayout`, JSON.stringify(newColumns));
97
+ return newColumns;
98
+ });
99
+ },
100
+ [isReady, key]
101
+ );
84
102
  useEffect3(() => {
85
103
  if (!key) return setIsReady(true);
104
+ if (renderCountRef.current > 1) {
105
+ throw new Error(
106
+ `useTableLayout should only be called once per component render cycle.
107
+ ${renderCountRef.current} Renders detected.
108
+ Check dependency stability`
109
+ );
110
+ }
111
+ renderCountRef.current += 1;
86
112
  const savedLayout = localStorage.getItem(`${key}-tableLayout`);
87
113
  if (savedLayout) {
88
- setColumns(
114
+ handleSaveLayout(
89
115
  mergeObjectArrays(
90
116
  initialColumns,
91
117
  JSON.parse(savedLayout)
92
- )
118
+ ),
119
+ true
93
120
  );
94
121
  }
95
122
  if (!savedLayout) handleSaveLayout(initialColumns, true);
96
- setLayoutSignal((prev) => prev + 1);
97
123
  setIsReady(true);
98
- }, []);
99
- const handleSaveLayout = useCallback(
100
- (setter, _internal) => {
101
- if (!isReady && !_internal) return null;
102
- const newColumns = typeof setter === "function" ? setter(columns) : setter;
103
- if (JSON.stringify(newColumns) === JSON.stringify(columns) && !_internal)
104
- return null;
105
- if (key) {
106
- localStorage.setItem(`${key}-tableLayout`, JSON.stringify(newColumns));
107
- }
108
- setColumns(newColumns);
109
- setLayoutSignal((prev) => prev + 1);
110
- return newColumns;
111
- },
112
- [columns, isReady, key]
113
- );
114
- return { columns, setColumns: handleSaveLayout, layoutSignal, isReady };
124
+ return () => {
125
+ renderCountRef.current = 0;
126
+ };
127
+ }, [handleSaveLayout, initialColumns, key]);
128
+ return { columns, setColumns: handleSaveLayout, isReady };
115
129
  }
116
130
 
117
131
  export {
@@ -4,11 +4,11 @@ import {
4
4
  DataGridCell,
5
5
  DragAlongCell,
6
6
  DraggableCellHeader
7
- } from "../chunk-CZ55LUFC.js";
8
- import "../chunk-JITZWSPR.js";
9
- import "../chunk-NIHZMIOL.js";
10
- import "../chunk-ERW3AMED.js";
11
- import "../chunk-E6Y7ZHQX.js";
7
+ } from "../chunk-XOUEHNCC.js";
8
+ import "../chunk-NA3ODQCN.js";
9
+ import "../chunk-VP36B2MM.js";
10
+ import "../chunk-QHHNFGEX.js";
11
+ import "../chunk-ZU2K7BD3.js";
12
12
  import "../chunk-VXWSAIB5.js";
13
13
  import "../chunk-T3F37S6Z.js";
14
14
  import "../chunk-2WRRRPEB.js";
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import {
3
3
  Menu
4
- } from "../chunk-JITZWSPR.js";
5
- import "../chunk-NIHZMIOL.js";
6
- import "../chunk-E6Y7ZHQX.js";
4
+ } from "../chunk-NA3ODQCN.js";
5
+ import "../chunk-VP36B2MM.js";
6
+ import "../chunk-ZU2K7BD3.js";
7
7
  import "../chunk-VXWSAIB5.js";
8
8
  import "../chunk-T3F37S6Z.js";
9
9
  import "../chunk-5UH6QUFB.js";
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import {
3
3
  MenuOption
4
- } from "../chunk-ERW3AMED.js";
5
- import "../chunk-E6Y7ZHQX.js";
4
+ } from "../chunk-QHHNFGEX.js";
5
+ import "../chunk-ZU2K7BD3.js";
6
6
  import "../chunk-VXWSAIB5.js";
7
7
  import "../chunk-T3F37S6Z.js";
8
8
  import "../chunk-5UH6QUFB.js";
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  import {
3
3
  Modal
4
- } from "../chunk-UKSJPFN2.js";
4
+ } from "../chunk-A76MF7ZO.js";
5
5
  import "../chunk-4RJKB7LC.js";
6
6
  import "../chunk-47KTDBGA.js";
7
7
  import "../chunk-SYEJVSE4.js";
8
8
  import "../chunk-A5ROZWIH.js";
9
9
  import "../chunk-ZFOANBWG.js";
10
10
  import "../chunk-REOLWEZG.js";
11
- import "../chunk-E6Y7ZHQX.js";
11
+ import "../chunk-ZU2K7BD3.js";
12
12
  import "../chunk-VXWSAIB5.js";
13
13
  import "../chunk-T3F37S6Z.js";
14
14
  import "../chunk-5UH6QUFB.js";
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import {
3
3
  MenuOption
4
- } from "../chunk-ERW3AMED.js";
4
+ } from "../chunk-QHHNFGEX.js";
5
5
  import {
6
6
  useKeydown
7
- } from "../chunk-E6Y7ZHQX.js";
7
+ } from "../chunk-ZU2K7BD3.js";
8
8
  import "../chunk-VXWSAIB5.js";
9
9
  import "../chunk-T3F37S6Z.js";
10
10
  import "../chunk-5UH6QUFB.js";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Modal
4
- } from "../chunk-UKSJPFN2.js";
4
+ } from "../chunk-A76MF7ZO.js";
5
5
  import "../chunk-4RJKB7LC.js";
6
6
  import "../chunk-47KTDBGA.js";
7
7
  import "../chunk-SYEJVSE4.js";
@@ -13,7 +13,7 @@ import {
13
13
  import {
14
14
  Heading3
15
15
  } from "../chunk-REOLWEZG.js";
16
- import "../chunk-E6Y7ZHQX.js";
16
+ import "../chunk-ZU2K7BD3.js";
17
17
  import "../chunk-VXWSAIB5.js";
18
18
  import "../chunk-T3F37S6Z.js";
19
19
  import "../chunk-5UH6QUFB.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  useMatchesMobile
3
- } from "../chunk-E6Y7ZHQX.js";
3
+ } from "../chunk-ZU2K7BD3.js";
4
4
  import "../chunk-VXWSAIB5.js";
5
5
  import "../chunk-T3F37S6Z.js";
6
6
  import "../chunk-5UH6QUFB.js";
@@ -726,17 +726,18 @@ var Select = (_a) => {
726
726
  "displayValue",
727
727
  "value"
728
728
  ]);
729
+ var _a2;
729
730
  const inputRef = (0, import_react2.useRef)(null);
730
731
  const inputContainerRef = (0, import_react2.useRef)(null);
731
732
  const preventFocusOnInitialRender = (0, import_react2.useRef)(true);
732
733
  const [show, setShow] = (0, import_react2.useState)(false);
733
734
  (0, import_react2.useEffect)(() => {
734
- var _a2;
735
+ var _a3;
735
736
  if (preventFocusOnInitialRender.current) {
736
737
  preventFocusOnInitialRender.current = false;
737
738
  return;
738
739
  }
739
- (_a2 = inputRef.current) == null ? void 0 : _a2.focus();
740
+ (_a3 = inputRef.current) == null ? void 0 : _a3.focus();
740
741
  }, [value]);
741
742
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
742
743
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
@@ -779,11 +780,11 @@ var Select = (_a) => {
779
780
  removeRoundness,
780
781
  focus: show,
781
782
  onChange: (e) => {
782
- var _a2;
783
- return (_a2 = props.onChange) == null ? void 0 : _a2.call(props, e);
783
+ var _a3;
784
+ return (_a3 = props.onChange) == null ? void 0 : _a3.call(props, e);
784
785
  }
785
786
  }, props), {
786
- value: displayValue != null ? displayValue : value
787
+ value: (_a2 = displayValue != null ? displayValue : value) != null ? _a2 : props.onChange ? "" : void 0
787
788
  })
788
789
  ),
789
790
  renderMenu ? renderMenu({
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Select
4
- } from "../chunk-33W2KSCB.js";
4
+ } from "../chunk-2RUQFWER.js";
5
5
  import "../chunk-7W4I2NK3.js";
6
6
  import "../chunk-5UH6QUFB.js";
7
7
  import "../chunk-CJVTFYI4.js";
@@ -515,38 +515,47 @@ var import_react5 = require("react");
515
515
  function useTableLayout(initialColumns, key) {
516
516
  const [columns, setColumns] = (0, import_react5.useState)(initialColumns);
517
517
  const [isReady, setIsReady] = (0, import_react5.useState)(false);
518
- const [layoutSignal, setLayoutSignal] = (0, import_react5.useState)(0);
518
+ const renderCountRef = (0, import_react5.useRef)(0);
519
+ const handleSaveLayout = (0, import_react5.useCallback)(
520
+ (setter, _internal) => {
521
+ if (!isReady && !_internal || !key) return;
522
+ setColumns((prevColumns) => {
523
+ const newColumns = typeof setter === "function" ? setter(prevColumns) : setter;
524
+ if (JSON.stringify(newColumns) === JSON.stringify(prevColumns) && !_internal)
525
+ return prevColumns;
526
+ localStorage.setItem(`${key}-tableLayout`, JSON.stringify(newColumns));
527
+ return newColumns;
528
+ });
529
+ },
530
+ [isReady, key]
531
+ );
519
532
  (0, import_react5.useEffect)(() => {
520
533
  if (!key) return setIsReady(true);
534
+ if (renderCountRef.current > 1) {
535
+ throw new Error(
536
+ `useTableLayout should only be called once per component render cycle.
537
+ ${renderCountRef.current} Renders detected.
538
+ Check dependency stability`
539
+ );
540
+ }
541
+ renderCountRef.current += 1;
521
542
  const savedLayout = localStorage.getItem(`${key}-tableLayout`);
522
543
  if (savedLayout) {
523
- setColumns(
544
+ handleSaveLayout(
524
545
  mergeObjectArrays(
525
546
  initialColumns,
526
547
  JSON.parse(savedLayout)
527
- )
548
+ ),
549
+ true
528
550
  );
529
551
  }
530
552
  if (!savedLayout) handleSaveLayout(initialColumns, true);
531
- setLayoutSignal((prev) => prev + 1);
532
553
  setIsReady(true);
533
- }, []);
534
- const handleSaveLayout = (0, import_react5.useCallback)(
535
- (setter, _internal) => {
536
- if (!isReady && !_internal) return null;
537
- const newColumns = typeof setter === "function" ? setter(columns) : setter;
538
- if (JSON.stringify(newColumns) === JSON.stringify(columns) && !_internal)
539
- return null;
540
- if (key) {
541
- localStorage.setItem(`${key}-tableLayout`, JSON.stringify(newColumns));
542
- }
543
- setColumns(newColumns);
544
- setLayoutSignal((prev) => prev + 1);
545
- return newColumns;
546
- },
547
- [columns, isReady, key]
548
- );
549
- return { columns, setColumns: handleSaveLayout, layoutSignal, isReady };
554
+ return () => {
555
+ renderCountRef.current = 0;
556
+ };
557
+ }, [handleSaveLayout, initialColumns, key]);
558
+ return { columns, setColumns: handleSaveLayout, isReady };
550
559
  }
551
560
 
552
561
  // src/components/MenuOption.tsx
@@ -2865,11 +2874,7 @@ function DataGrid({
2865
2874
  const [localSorting, setLocalSorting] = (0, import_react16.useState)([]);
2866
2875
  const [localColumnFilters, setLocalColumnFilters] = (0, import_react16.useState)([]);
2867
2876
  const [localRowSelection, setLocalRowSelection] = (0, import_react16.useState)({});
2868
- const {
2869
- columns: tableColumns,
2870
- setColumns: setTableColumns,
2871
- layoutSignal
2872
- } = useTableLayout(columns, id != null ? id : testid);
2877
+ const { columns: tableColumns, setColumns: setTableColumns } = useTableLayout(columns, id != null ? id : testid);
2873
2878
  const [columnOrder, setColumnOrder] = (0, import_react16.useState)(
2874
2879
  tableColumns.map((c) => c.id)
2875
2880
  );
@@ -2881,10 +2886,23 @@ function DataGrid({
2881
2886
  })
2882
2887
  )
2883
2888
  );
2889
+ const resetColumnVisibility = (0, import_react16.useCallback)(
2890
+ (updateOrder) => {
2891
+ setColumnVisibility(
2892
+ Object.fromEntries(
2893
+ tableColumns.filter((column) => !!column.id).map((column) => {
2894
+ var _a2, _b2;
2895
+ return [column.id, (_b2 = (_a2 = column.meta) == null ? void 0 : _a2.visible) != null ? _b2 : true];
2896
+ })
2897
+ )
2898
+ );
2899
+ if (updateOrder) setColumnOrder(tableColumns.map((c) => c.id));
2900
+ },
2901
+ [tableColumns]
2902
+ );
2884
2903
  (0, import_react16.useEffect)(() => {
2885
- setColumnOrder(tableColumns.map((c) => c.id));
2886
- resetColumnVisibility();
2887
- }, [layoutSignal]);
2904
+ resetColumnVisibility(true);
2905
+ }, [resetColumnVisibility]);
2888
2906
  const sortingState = pagination ? externalSorting != null ? externalSorting : localSorting : localSorting;
2889
2907
  const setSortingState = pagination ? (updaterOrValue) => {
2890
2908
  const value = typeof updaterOrValue === "function" ? updaterOrValue(
@@ -2928,16 +2946,6 @@ function DataGrid({
2928
2946
  },
2929
2947
  [setTableColumns]
2930
2948
  );
2931
- const resetColumnVisibility = (0, import_react16.useCallback)(() => {
2932
- setColumnVisibility(
2933
- Object.fromEntries(
2934
- tableColumns.filter((column) => !!column.id).map((column) => {
2935
- var _a2, _b2;
2936
- return [column.id, (_b2 = (_a2 = column.meta) == null ? void 0 : _a2.visible) != null ? _b2 : true];
2937
- })
2938
- )
2939
- );
2940
- }, [tableColumns]);
2941
2949
  const table = (0, import_react_table3.useReactTable)({
2942
2950
  columns: tableColumns,
2943
2951
  data,
@@ -3410,17 +3418,18 @@ var Select = (_a) => {
3410
3418
  "displayValue",
3411
3419
  "value"
3412
3420
  ]);
3421
+ var _a2;
3413
3422
  const inputRef = (0, import_react17.useRef)(null);
3414
3423
  const inputContainerRef = (0, import_react17.useRef)(null);
3415
3424
  const preventFocusOnInitialRender = (0, import_react17.useRef)(true);
3416
3425
  const [show, setShow] = (0, import_react17.useState)(false);
3417
3426
  (0, import_react17.useEffect)(() => {
3418
- var _a2;
3427
+ var _a3;
3419
3428
  if (preventFocusOnInitialRender.current) {
3420
3429
  preventFocusOnInitialRender.current = false;
3421
3430
  return;
3422
3431
  }
3423
- (_a2 = inputRef.current) == null ? void 0 : _a2.focus();
3432
+ (_a3 = inputRef.current) == null ? void 0 : _a3.focus();
3424
3433
  }, [value]);
3425
3434
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
3426
3435
  /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
@@ -3463,11 +3472,11 @@ var Select = (_a) => {
3463
3472
  removeRoundness,
3464
3473
  focus: show,
3465
3474
  onChange: (e) => {
3466
- var _a2;
3467
- return (_a2 = props.onChange) == null ? void 0 : _a2.call(props, e);
3475
+ var _a3;
3476
+ return (_a3 = props.onChange) == null ? void 0 : _a3.call(props, e);
3468
3477
  }
3469
3478
  }, props), {
3470
- value: displayValue != null ? displayValue : value
3479
+ value: (_a2 = displayValue != null ? displayValue : value) != null ? _a2 : props.onChange ? "" : void 0
3471
3480
  })
3472
3481
  ),
3473
3482
  renderMenu ? renderMenu({
@@ -3,7 +3,7 @@ import {
3
3
  } from "../chunk-3WNXMCZV.js";
4
4
  import {
5
5
  Select
6
- } from "../chunk-33W2KSCB.js";
6
+ } from "../chunk-2RUQFWER.js";
7
7
  import {
8
8
  Checkbox
9
9
  } from "../chunk-E3UOI2D2.js";
@@ -12,18 +12,18 @@ import {
12
12
  DataGridCell,
13
13
  DragAlongCell,
14
14
  DraggableCellHeader
15
- } from "../chunk-CZ55LUFC.js";
15
+ } from "../chunk-XOUEHNCC.js";
16
16
  import {
17
17
  Menu
18
- } from "../chunk-JITZWSPR.js";
19
- import "../chunk-NIHZMIOL.js";
18
+ } from "../chunk-NA3ODQCN.js";
19
+ import "../chunk-VP36B2MM.js";
20
20
  import {
21
21
  MenuOption
22
- } from "../chunk-ERW3AMED.js";
22
+ } from "../chunk-QHHNFGEX.js";
23
23
  import {
24
24
  useInfiniteScroll,
25
25
  useTableLayout
26
- } from "../chunk-E6Y7ZHQX.js";
26
+ } from "../chunk-ZU2K7BD3.js";
27
27
  import "../chunk-VXWSAIB5.js";
28
28
  import "../chunk-T3F37S6Z.js";
29
29
  import {
@@ -680,11 +680,7 @@ function DataGrid({
680
680
  const [localSorting, setLocalSorting] = useState3([]);
681
681
  const [localColumnFilters, setLocalColumnFilters] = useState3([]);
682
682
  const [localRowSelection, setLocalRowSelection] = useState3({});
683
- const {
684
- columns: tableColumns,
685
- setColumns: setTableColumns,
686
- layoutSignal
687
- } = useTableLayout(columns, id != null ? id : testid);
683
+ const { columns: tableColumns, setColumns: setTableColumns } = useTableLayout(columns, id != null ? id : testid);
688
684
  const [columnOrder, setColumnOrder] = useState3(
689
685
  tableColumns.map((c) => c.id)
690
686
  );
@@ -696,10 +692,23 @@ function DataGrid({
696
692
  })
697
693
  )
698
694
  );
695
+ const resetColumnVisibility = useCallback(
696
+ (updateOrder) => {
697
+ setColumnVisibility(
698
+ Object.fromEntries(
699
+ tableColumns.filter((column) => !!column.id).map((column) => {
700
+ var _a2, _b2;
701
+ return [column.id, (_b2 = (_a2 = column.meta) == null ? void 0 : _a2.visible) != null ? _b2 : true];
702
+ })
703
+ )
704
+ );
705
+ if (updateOrder) setColumnOrder(tableColumns.map((c) => c.id));
706
+ },
707
+ [tableColumns]
708
+ );
699
709
  useEffect(() => {
700
- setColumnOrder(tableColumns.map((c) => c.id));
701
- resetColumnVisibility();
702
- }, [layoutSignal]);
710
+ resetColumnVisibility(true);
711
+ }, [resetColumnVisibility]);
703
712
  const sortingState = pagination ? externalSorting != null ? externalSorting : localSorting : localSorting;
704
713
  const setSortingState = pagination ? (updaterOrValue) => {
705
714
  const value = typeof updaterOrValue === "function" ? updaterOrValue(
@@ -743,16 +752,6 @@ function DataGrid({
743
752
  },
744
753
  [setTableColumns]
745
754
  );
746
- const resetColumnVisibility = useCallback(() => {
747
- setColumnVisibility(
748
- Object.fromEntries(
749
- tableColumns.filter((column) => !!column.id).map((column) => {
750
- var _a2, _b2;
751
- return [column.id, (_b2 = (_a2 = column.meta) == null ? void 0 : _a2.visible) != null ? _b2 : true];
752
- })
753
- )
754
- );
755
- }, [tableColumns]);
756
755
  const table = useReactTable({
757
756
  columns: tableColumns,
758
757
  data,
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  useMenuPosition,
4
4
  useSubMenuSystem
5
- } from "../chunk-NIHZMIOL.js";
6
- import "../chunk-E6Y7ZHQX.js";
5
+ } from "../chunk-VP36B2MM.js";
6
+ import "../chunk-ZU2K7BD3.js";
7
7
  import "../chunk-VXWSAIB5.js";
8
8
  import "../chunk-T3F37S6Z.js";
9
9
  import "../chunk-5UH6QUFB.js";
@@ -129,38 +129,47 @@ var import_react4 = require("react");
129
129
  function useTableLayout(initialColumns, key) {
130
130
  const [columns, setColumns] = (0, import_react4.useState)(initialColumns);
131
131
  const [isReady, setIsReady] = (0, import_react4.useState)(false);
132
- const [layoutSignal, setLayoutSignal] = (0, import_react4.useState)(0);
132
+ const renderCountRef = (0, import_react4.useRef)(0);
133
+ const handleSaveLayout = (0, import_react4.useCallback)(
134
+ (setter, _internal) => {
135
+ if (!isReady && !_internal || !key) return;
136
+ setColumns((prevColumns) => {
137
+ const newColumns = typeof setter === "function" ? setter(prevColumns) : setter;
138
+ if (JSON.stringify(newColumns) === JSON.stringify(prevColumns) && !_internal)
139
+ return prevColumns;
140
+ localStorage.setItem(`${key}-tableLayout`, JSON.stringify(newColumns));
141
+ return newColumns;
142
+ });
143
+ },
144
+ [isReady, key]
145
+ );
133
146
  (0, import_react4.useEffect)(() => {
134
147
  if (!key) return setIsReady(true);
148
+ if (renderCountRef.current > 1) {
149
+ throw new Error(
150
+ `useTableLayout should only be called once per component render cycle.
151
+ ${renderCountRef.current} Renders detected.
152
+ Check dependency stability`
153
+ );
154
+ }
155
+ renderCountRef.current += 1;
135
156
  const savedLayout = localStorage.getItem(`${key}-tableLayout`);
136
157
  if (savedLayout) {
137
- setColumns(
158
+ handleSaveLayout(
138
159
  mergeObjectArrays(
139
160
  initialColumns,
140
161
  JSON.parse(savedLayout)
141
- )
162
+ ),
163
+ true
142
164
  );
143
165
  }
144
166
  if (!savedLayout) handleSaveLayout(initialColumns, true);
145
- setLayoutSignal((prev) => prev + 1);
146
167
  setIsReady(true);
147
- }, []);
148
- const handleSaveLayout = (0, import_react4.useCallback)(
149
- (setter, _internal) => {
150
- if (!isReady && !_internal) return null;
151
- const newColumns = typeof setter === "function" ? setter(columns) : setter;
152
- if (JSON.stringify(newColumns) === JSON.stringify(columns) && !_internal)
153
- return null;
154
- if (key) {
155
- localStorage.setItem(`${key}-tableLayout`, JSON.stringify(newColumns));
156
- }
157
- setColumns(newColumns);
158
- setLayoutSignal((prev) => prev + 1);
159
- return newColumns;
160
- },
161
- [columns, isReady, key]
162
- );
163
- return { columns, setColumns: handleSaveLayout, layoutSignal, isReady };
168
+ return () => {
169
+ renderCountRef.current = 0;
170
+ };
171
+ }, [handleSaveLayout, initialColumns, key]);
172
+ return { columns, setColumns: handleSaveLayout, isReady };
164
173
  }
165
174
  // Annotate the CommonJS export names for ESM import in node:
166
175
  0 && (module.exports = {
@@ -4,7 +4,7 @@ import {
4
4
  useMatchesMedia,
5
5
  useMatchesMobile,
6
6
  useTableLayout
7
- } from "../chunk-E6Y7ZHQX.js";
7
+ } from "../chunk-ZU2K7BD3.js";
8
8
  import "../chunk-VXWSAIB5.js";
9
9
  import "../chunk-T3F37S6Z.js";
10
10
  import "../chunk-5UH6QUFB.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dmsi/wedgekit-react",
3
3
  "private": false,
4
- "version": "0.0.215",
4
+ "version": "0.0.217",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "build": "tsup",
@@ -88,11 +88,8 @@ export function DataGrid<T extends Record<string, unknown>>({
88
88
  const [localRowSelection, setLocalRowSelection] = useState<
89
89
  Record<string, boolean>
90
90
  >({});
91
- const {
92
- columns: tableColumns,
93
- setColumns: setTableColumns,
94
- layoutSignal,
95
- } = useTableLayout<T>(columns, id ?? testid);
91
+ const { columns: tableColumns, setColumns: setTableColumns } =
92
+ useTableLayout<T>(columns, id ?? testid);
96
93
  const [columnOrder, setColumnOrder] = useState<string[]>(
97
94
  tableColumns.map((c) => c.id!),
98
95
  );
@@ -107,10 +104,23 @@ export function DataGrid<T extends Record<string, unknown>>({
107
104
  ),
108
105
  );
109
106
 
107
+ const resetColumnVisibility = useCallback(
108
+ (updateOrder?: boolean) => {
109
+ setColumnVisibility(
110
+ Object.fromEntries(
111
+ tableColumns
112
+ .filter((column) => !!column.id)
113
+ .map((column) => [column.id, column.meta?.visible ?? true]),
114
+ ),
115
+ );
116
+ if (updateOrder) setColumnOrder(tableColumns.map((c) => c.id!));
117
+ },
118
+ [tableColumns],
119
+ );
120
+
110
121
  useEffect(() => {
111
- setColumnOrder(tableColumns.map((c) => c.id!));
112
- resetColumnVisibility();
113
- }, [layoutSignal]);
122
+ resetColumnVisibility(true);
123
+ }, [resetColumnVisibility]);
114
124
 
115
125
  const sortingState = pagination
116
126
  ? (externalSorting ?? localSorting)
@@ -202,16 +212,6 @@ export function DataGrid<T extends Record<string, unknown>>({
202
212
  [setTableColumns],
203
213
  );
204
214
 
205
- const resetColumnVisibility = useCallback(() => {
206
- setColumnVisibility(
207
- Object.fromEntries(
208
- tableColumns
209
- .filter((column) => !!column.id)
210
- .map((column) => [column.id, column.meta?.visible ?? true]),
211
- ),
212
- );
213
- }, [tableColumns]);
214
-
215
215
  const table = useReactTable<T>({
216
216
  columns: tableColumns,
217
217
  data,
@@ -95,7 +95,7 @@ export const Select = ({
95
95
  focus={show}
96
96
  onChange={(e) => props.onChange?.(e)}
97
97
  {...props}
98
- value={displayValue ?? value}
98
+ value={displayValue ?? value ?? (props.onChange ? "" : undefined)}
99
99
  />
100
100
 
101
101
  {renderMenu
@@ -2,11 +2,16 @@
2
2
 
3
3
  import { mergeObjectArrays } from "../utils";
4
4
  import { ColumnDef } from "@dmsi/wedgekit-react/components";
5
- import { useState, useEffect, SetStateAction, useCallback } from "react";
5
+ import {
6
+ useState,
7
+ useEffect,
8
+ SetStateAction,
9
+ useCallback,
10
+ useRef,
11
+ } from "react";
6
12
  export type PersistedTableLayout<T> = {
7
13
  columns: ColumnDef<T>[];
8
- setColumns: (setter: SetStateAction<ColumnDef<T>[]>) => ColumnDef<T>[] | null;
9
- layoutSignal: number;
14
+ setColumns: (setter: SetStateAction<ColumnDef<T>[]>) => void;
10
15
  isReady: boolean;
11
16
  };
12
17
 
@@ -22,47 +27,58 @@ export function useTableLayout<T>(
22
27
  initialColumns: Array<ColumnDef<T>>,
23
28
  key?: string,
24
29
  ): PersistedTableLayout<T> {
30
+ // Use useMemo to ensure initialColumns is stable
25
31
  const [columns, setColumns] = useState<ColumnDef<T>[]>(initialColumns);
26
32
  const [isReady, setIsReady] = useState(false);
27
- const [layoutSignal, setLayoutSignal] = useState(0);
33
+ const renderCountRef = useRef(0);
34
+
35
+ const handleSaveLayout = useCallback(
36
+ (setter: React.SetStateAction<ColumnDef<T>[]>, _internal?: boolean) => {
37
+ if ((!isReady && !_internal) || !key) return;
38
+ // get value from passed setter
39
+ setColumns((prevColumns) => {
40
+ const newColumns =
41
+ typeof setter === "function" ? setter(prevColumns) : setter;
42
+ if (
43
+ JSON.stringify(newColumns) === JSON.stringify(prevColumns) &&
44
+ !_internal
45
+ )
46
+ return prevColumns;
47
+ localStorage.setItem(`${key}-tableLayout`, JSON.stringify(newColumns));
48
+ return newColumns;
49
+ });
50
+ },
51
+ [isReady, key],
52
+ );
28
53
 
29
54
  useEffect(() => {
30
55
  if (!key) return setIsReady(true);
56
+ if (renderCountRef.current > 1) {
57
+ throw new Error(
58
+ `useTableLayout should only be called once per component render cycle.
59
+ ${renderCountRef.current} Renders detected.
60
+ Check dependency stability`,
61
+ );
62
+ }
63
+ renderCountRef.current += 1;
31
64
  const savedLayout = localStorage.getItem(`${key}-tableLayout`);
32
65
  if (savedLayout) {
33
- setColumns(
66
+ handleSaveLayout(
34
67
  mergeObjectArrays<ColumnDef<T>>(
35
68
  initialColumns,
36
69
  JSON.parse(savedLayout),
37
70
  ),
71
+ true,
38
72
  );
39
73
  }
40
74
  if (!savedLayout) handleSaveLayout(initialColumns, true);
41
- setLayoutSignal((prev) => prev + 1);
42
75
  setIsReady(true);
43
76
 
77
+ return () => {
78
+ renderCountRef.current = 0;
79
+ };
44
80
  // Load the layout from local storage on init
45
- // eslint-disable-next-line react-hooks/exhaustive-deps
46
- }, []);
47
-
48
- const handleSaveLayout = useCallback(
49
- (setter: React.SetStateAction<ColumnDef<T>[]>, _internal?: boolean) => {
50
- if (!isReady && !_internal) return null;
51
- // get value from passed setter
52
- const newColumns =
53
- typeof setter === "function" ? setter(columns) : setter;
54
- if (JSON.stringify(newColumns) === JSON.stringify(columns) && !_internal)
55
- return null;
56
- if (key) {
57
- localStorage.setItem(`${key}-tableLayout`, JSON.stringify(newColumns));
58
- }
59
- setColumns(newColumns);
60
- setLayoutSignal((prev) => prev + 1);
61
-
62
- return newColumns;
63
- },
64
- [columns, isReady, key],
65
- );
81
+ }, [handleSaveLayout, initialColumns, key]);
66
82
 
67
- return { columns, setColumns: handleSaveLayout, layoutSignal, isReady };
83
+ return { columns, setColumns: handleSaveLayout, isReady };
68
84
  }