@toolbox-web/grid-react 0.6.0 → 0.8.0

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.
Files changed (105) hide show
  1. package/README.md +158 -2
  2. package/chunks/feature-registry-Y3KvnN54.js +26 -0
  3. package/chunks/multi-sort-Ae2VVdZb.js +3 -0
  4. package/features/clipboard.d.ts +18 -0
  5. package/features/clipboard.d.ts.map +1 -0
  6. package/features/clipboard.js +6 -0
  7. package/features/column-virtualization.d.ts +16 -0
  8. package/features/column-virtualization.d.ts.map +1 -0
  9. package/features/column-virtualization.js +6 -0
  10. package/features/context-menu.d.ts +16 -0
  11. package/features/context-menu.d.ts.map +1 -0
  12. package/features/context-menu.js +6 -0
  13. package/features/editing.d.ts +16 -0
  14. package/features/editing.d.ts.map +1 -0
  15. package/features/editing.js +3 -0
  16. package/features/export.d.ts +16 -0
  17. package/features/export.d.ts.map +1 -0
  18. package/features/export.js +6 -0
  19. package/features/filtering.d.ts +16 -0
  20. package/features/filtering.d.ts.map +1 -0
  21. package/features/filtering.js +6 -0
  22. package/features/grouping-columns.d.ts +16 -0
  23. package/features/grouping-columns.d.ts.map +1 -0
  24. package/features/grouping-columns.js +6 -0
  25. package/features/grouping-rows.d.ts +16 -0
  26. package/features/grouping-rows.d.ts.map +1 -0
  27. package/features/grouping-rows.js +6 -0
  28. package/features/index.d.ts +1 -0
  29. package/features/index.d.ts.map +1 -0
  30. package/features/index.js +22 -0
  31. package/features/master-detail.d.ts +18 -0
  32. package/features/master-detail.d.ts.map +1 -0
  33. package/features/master-detail.js +6 -0
  34. package/features/multi-sort.d.ts +22 -0
  35. package/features/multi-sort.d.ts.map +1 -0
  36. package/features/pinned-columns.d.ts +16 -0
  37. package/features/pinned-columns.d.ts.map +1 -0
  38. package/features/pinned-columns.js +6 -0
  39. package/features/pinned-rows.d.ts +16 -0
  40. package/features/pinned-rows.d.ts.map +1 -0
  41. package/features/pinned-rows.js +6 -0
  42. package/features/pivot.d.ts +16 -0
  43. package/features/pivot.d.ts.map +1 -0
  44. package/features/pivot.js +3 -0
  45. package/features/print.d.ts +16 -0
  46. package/features/print.d.ts.map +1 -0
  47. package/features/print.js +3 -0
  48. package/features/reorder.d.ts +16 -0
  49. package/features/reorder.d.ts.map +1 -0
  50. package/features/reorder.js +6 -0
  51. package/features/responsive.d.ts +16 -0
  52. package/features/responsive.d.ts.map +1 -0
  53. package/features/responsive.js +6 -0
  54. package/features/row-reorder.d.ts +16 -0
  55. package/features/row-reorder.d.ts.map +1 -0
  56. package/features/row-reorder.js +3 -0
  57. package/features/selection.d.ts +16 -0
  58. package/features/selection.d.ts.map +1 -0
  59. package/features/selection.js +3 -0
  60. package/features/server-side.d.ts +16 -0
  61. package/features/server-side.d.ts.map +1 -0
  62. package/features/server-side.js +3 -0
  63. package/features/sorting.d.ts +1 -0
  64. package/features/sorting.d.ts.map +1 -0
  65. package/features/sorting.js +1 -0
  66. package/features/tree.d.ts +16 -0
  67. package/features/tree.d.ts.map +1 -0
  68. package/features/tree.js +6 -0
  69. package/features/undo-redo.d.ts +18 -0
  70. package/features/undo-redo.d.ts.map +1 -0
  71. package/features/undo-redo.js +6 -0
  72. package/features/visibility.d.ts +16 -0
  73. package/features/visibility.d.ts.map +1 -0
  74. package/features/visibility.js +6 -0
  75. package/index.d.ts +6 -3
  76. package/index.d.ts.map +1 -1
  77. package/index.js +625 -430
  78. package/lib/column-shorthand.d.ts +59 -0
  79. package/lib/column-shorthand.d.ts.map +1 -0
  80. package/lib/context-types.d.ts +1 -1
  81. package/lib/data-grid.d.ts +118 -26
  82. package/lib/data-grid.d.ts.map +1 -1
  83. package/lib/event-props.d.ts +305 -0
  84. package/lib/event-props.d.ts.map +1 -0
  85. package/lib/feature-props.d.ts +329 -0
  86. package/lib/feature-props.d.ts.map +1 -0
  87. package/lib/feature-registry.d.ts +56 -0
  88. package/lib/feature-registry.d.ts.map +1 -0
  89. package/lib/grid-column.d.ts +1 -1
  90. package/lib/grid-detail-panel.d.ts +3 -0
  91. package/lib/grid-detail-panel.d.ts.map +1 -1
  92. package/lib/grid-responsive-card.d.ts +3 -0
  93. package/lib/grid-responsive-card.d.ts.map +1 -1
  94. package/lib/grid-type-registry.d.ts +1 -1
  95. package/lib/grid-type-registry.d.ts.map +1 -1
  96. package/lib/react-column-config.d.ts +1 -1
  97. package/lib/react-grid-adapter.d.ts +1 -1
  98. package/lib/react-grid-adapter.d.ts.map +1 -1
  99. package/lib/use-grid-event.d.ts +23 -19
  100. package/lib/use-grid-event.d.ts.map +1 -1
  101. package/lib/use-grid.d.ts +46 -2
  102. package/lib/use-grid.d.ts.map +1 -1
  103. package/lib/use-sync-plugins.d.ts +21 -0
  104. package/lib/use-sync-plugins.d.ts.map +1 -0
  105. package/package.json +11 -1
package/index.js CHANGED
@@ -1,205 +1,258 @@
1
- import { jsx as x } from "react/jsx-runtime";
2
- import { DataGridElement as J } from "@toolbox-web/grid";
3
- import { useRef as S, useCallback as E, useEffect as w, createContext as K, useContext as z, forwardRef as Q, useMemo as U, useImperativeHandle as X, useState as O } from "react";
4
- import { flushSync as v } from "react-dom";
5
- import { createRoot as b } from "react-dom/client";
6
- const L = /* @__PURE__ */ new WeakMap(), N = /* @__PURE__ */ new Map();
7
- function j(n) {
8
- const t = n.querySelector("tbw-grid-detail");
9
- if (t) {
10
- const r = L.get(t);
11
- if (r) return r;
12
- }
13
- const e = n.id || n.getAttribute("data-grid-id");
14
- if (e)
15
- return N.get(e);
1
+ import { jsx as I } from "react/jsx-runtime";
2
+ import { DataGridElement as ue } from "@toolbox-web/grid";
3
+ import { useRef as P, useCallback as h, useEffect as w, createContext as fe, useContext as Q, forwardRef as ge, useMemo as D, useImperativeHandle as pe, Children as me, isValidElement as ye, useState as ie } from "react";
4
+ import { flushSync as R } from "react-dom";
5
+ import { createRoot as S } from "react-dom/client";
6
+ import { c as he } from "./chunks/feature-registry-Y3KvnN54.js";
7
+ function we(r) {
8
+ return r.charAt(0).toUpperCase() + r.slice(1);
16
9
  }
17
- function me(n) {
18
- const { children: t, showExpandColumn: e = !0, animation: r = "slide" } = n, i = S(null), s = E(
19
- (c) => {
20
- if (i.current = c, !c) return;
21
- L.set(c, t);
22
- const d = c.closest("tbw-grid");
23
- if (d) {
24
- const u = d.id || d.getAttribute("data-grid-id");
25
- u && N.set(u, t);
26
- }
27
- },
28
- [t]
29
- );
30
- return w(() => () => {
31
- const c = i.current;
32
- if (c) {
33
- L.delete(c);
34
- const d = c.closest("tbw-grid");
35
- if (d) {
36
- const h = d.id || d.getAttribute("data-grid-id");
37
- h && N.delete(h);
38
- }
39
- const u = c.parentNode;
40
- u && u.contains(c);
41
- }
42
- }, []), /* @__PURE__ */ x(
43
- "tbw-grid-detail",
44
- {
45
- ref: s,
46
- showExpandColumn: e ? void 0 : "false",
47
- animation: r === !1 ? "false" : r
10
+ function se(r) {
11
+ return r.toLowerCase() === "id" ? "ID" : r.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[_-]/g, " ").split(" ").filter(Boolean).map(we).join(" ");
12
+ }
13
+ const ve = /* @__PURE__ */ new Set(["string", "number", "boolean", "date", "datetime", "currency"]);
14
+ function Ce(r) {
15
+ const t = r.lastIndexOf(":");
16
+ if (t > 0) {
17
+ const e = r.slice(t + 1).toLowerCase();
18
+ if (ve.has(e)) {
19
+ const n = r.slice(0, t);
20
+ return {
21
+ field: n,
22
+ header: se(n),
23
+ type: e
24
+ };
48
25
  }
49
- );
26
+ }
27
+ return {
28
+ field: r,
29
+ header: se(r)
30
+ };
31
+ }
32
+ function Re(r) {
33
+ return r.map((t) => typeof t == "string" ? Ce(t) : t);
50
34
  }
51
- const F = /* @__PURE__ */ new WeakMap(), H = /* @__PURE__ */ new Map();
52
- function $(n) {
53
- const t = n.querySelector("tbw-grid-responsive-card");
35
+ const z = {
36
+ onCellClick: "cell-click",
37
+ onRowClick: "row-click",
38
+ onCellActivate: "cell-activate",
39
+ onCellChange: "cell-change",
40
+ onCellCommit: "cell-commit",
41
+ onRowCommit: "row-commit",
42
+ onSortChange: "sort-change",
43
+ onFilterChange: "filter-change",
44
+ onColumnResize: "column-resize",
45
+ onColumnMove: "column-move",
46
+ onColumnVisibility: "column-visibility",
47
+ onColumnStateChange: "column-state-change",
48
+ onSelectionChange: "selection-change",
49
+ onRowMove: "row-move",
50
+ onGroupToggle: "group-toggle",
51
+ onTreeExpand: "tree-expand",
52
+ onDetailExpand: "detail-expand",
53
+ onResponsiveChange: "responsive-change",
54
+ onCopy: "copy",
55
+ onPaste: "paste",
56
+ onUndoRedo: "undo-redo",
57
+ onExportComplete: "export-complete",
58
+ onPrintStart: "print-start",
59
+ onPrintComplete: "print-complete"
60
+ }, W = /* @__PURE__ */ new WeakMap(), $ = /* @__PURE__ */ new Map();
61
+ function le(r) {
62
+ const t = r.querySelector("tbw-grid-responsive-card");
54
63
  if (t) {
55
- const r = F.get(t);
56
- if (r) return r;
64
+ const n = W.get(t);
65
+ if (n) return n;
57
66
  }
58
- const e = n.id || n.getAttribute("data-grid-id");
67
+ const e = r.id || r.getAttribute("data-grid-id");
59
68
  if (e)
60
- return H.get(e);
69
+ return $.get(e);
61
70
  }
62
- function ye(n) {
63
- const { children: t, cardRowHeight: e = "auto" } = n, r = S(null), i = E(
64
- (o) => {
65
- if (r.current = o, !o) return;
66
- F.set(o, t);
67
- const c = o.closest("tbw-grid");
68
- if (c) {
69
- const d = c.id || c.getAttribute("data-grid-id");
70
- d && H.set(d, t);
71
+ function be(r) {
72
+ const { children: t, cardRowHeight: e = "auto" } = r, n = P(null), o = h(
73
+ (i) => {
74
+ if (n.current = i, !i) return;
75
+ W.set(i, t);
76
+ const s = i.closest("tbw-grid");
77
+ if (s) {
78
+ const l = s.id || s.getAttribute("data-grid-id");
79
+ l && $.set(l, t);
71
80
  }
72
81
  },
73
82
  [t]
74
83
  );
75
84
  w(() => () => {
76
- const o = r.current;
77
- if (o) {
78
- F.delete(o);
79
- const c = o.closest("tbw-grid");
80
- if (c) {
81
- const d = c.id || c.getAttribute("data-grid-id");
82
- d && H.delete(d);
85
+ const i = n.current;
86
+ if (i) {
87
+ W.delete(i);
88
+ const s = i.closest("tbw-grid");
89
+ if (s) {
90
+ const l = s.id || s.getAttribute("data-grid-id");
91
+ l && $.delete(l);
83
92
  }
84
93
  }
85
94
  }, []);
86
- const s = e === "auto" ? "auto" : String(e);
87
- return /* @__PURE__ */ x("tbw-grid-responsive-card", { ref: i, cardRowHeight: s });
95
+ const a = e === "auto" ? "auto" : String(e);
96
+ return /* @__PURE__ */ I("tbw-grid-responsive-card", { ref: o, cardRowHeight: a });
88
97
  }
89
- const T = K(null), he = ({ defaults: n, children: t }) => /* @__PURE__ */ x(T.Provider, { value: n, children: t });
90
- function we() {
91
- return z(T);
98
+ be.displayName = "GridResponsiveCard";
99
+ const H = fe(null), Je = ({ defaults: r, children: t }) => /* @__PURE__ */ I(H.Provider, { value: r, children: t });
100
+ function Ue() {
101
+ return Q(H);
92
102
  }
93
- function Re(n) {
94
- return z(T)?.[n];
103
+ function Ke(r) {
104
+ return Q(H)?.[r];
95
105
  }
96
- const Y = T;
97
- function Z(n) {
106
+ const Ee = H;
107
+ function Se(r) {
98
108
  const t = /* @__PURE__ */ new WeakMap();
99
109
  return (e) => {
100
- const r = e.cellEl;
101
- if (r) {
102
- const o = t.get(r);
103
- if (o)
104
- return v(() => {
105
- o.root.render(n(e));
106
- }), o.container;
110
+ const n = e.cellEl;
111
+ if (n) {
112
+ const i = t.get(n);
113
+ if (i)
114
+ return R(() => {
115
+ i.root.render(r(e));
116
+ }), i.container;
107
117
  }
108
- const i = document.createElement("div");
109
- i.className = "react-cell-renderer", i.style.display = "contents";
110
- const s = b(i);
111
- return v(() => {
112
- s.render(n(e));
113
- }), r && t.set(r, { root: s, container: i }), i;
118
+ const o = document.createElement("div");
119
+ o.className = "react-cell-renderer", o.style.display = "contents";
120
+ const a = S(o);
121
+ return R(() => {
122
+ a.render(r(e));
123
+ }), n && t.set(n, { root: a, container: o }), o;
114
124
  };
115
125
  }
116
- function ee(n) {
126
+ function xe(r) {
117
127
  return (t) => {
118
128
  const e = document.createElement("div");
119
129
  e.className = "react-cell-editor", e.style.display = "contents";
120
- const r = b(e);
121
- return v(() => {
122
- r.render(n(t));
130
+ const n = S(e);
131
+ return R(() => {
132
+ n.render(r(t));
123
133
  }), e;
124
134
  };
125
135
  }
126
- function te(n) {
127
- if (!n) return;
128
- if (!n.columns) return n;
129
- const t = n.columns.map((e) => {
130
- const { renderer: r, editor: i, ...s } = e, o = { ...s };
131
- return r && (o.renderer = Z(r)), i && (o.editor = ee(i)), o;
136
+ function De(r) {
137
+ if (!r) return;
138
+ if (!r.columns) return r;
139
+ const t = r.columns.map((e) => {
140
+ const { renderer: n, editor: o, ...a } = e, i = { ...a };
141
+ return n && (i.renderer = Se(n)), o && (i.editor = xe(o)), i;
132
142
  });
133
143
  return {
134
- ...n,
144
+ ...r,
135
145
  columns: t
136
146
  };
137
147
  }
138
- const W = /* @__PURE__ */ new WeakMap(), q = /* @__PURE__ */ new Map();
139
- function re(n) {
140
- const t = W.get(n);
148
+ const J = /* @__PURE__ */ new WeakMap(), U = /* @__PURE__ */ new Map();
149
+ function Pe(r) {
150
+ const t = r.querySelector("tbw-grid-detail");
151
+ if (t) {
152
+ const n = J.get(t);
153
+ if (n) return n;
154
+ }
155
+ const e = r.id || r.getAttribute("data-grid-id");
156
+ if (e)
157
+ return U.get(e);
158
+ }
159
+ function Ge(r) {
160
+ const { children: t, showExpandColumn: e = !0, animation: n = "slide" } = r, o = P(null), a = h(
161
+ (s) => {
162
+ if (o.current = s, !s) return;
163
+ J.set(s, t);
164
+ const l = s.closest("tbw-grid");
165
+ if (l) {
166
+ const m = l.id || l.getAttribute("data-grid-id");
167
+ m && U.set(m, t);
168
+ }
169
+ },
170
+ [t]
171
+ );
172
+ return w(() => () => {
173
+ const s = o.current;
174
+ if (s) {
175
+ J.delete(s);
176
+ const l = s.closest("tbw-grid");
177
+ if (l) {
178
+ const v = l.id || l.getAttribute("data-grid-id");
179
+ v && U.delete(v);
180
+ }
181
+ const m = s.parentNode;
182
+ m && m.contains(s);
183
+ }
184
+ }, []), /* @__PURE__ */ I(
185
+ "tbw-grid-detail",
186
+ {
187
+ ref: a,
188
+ showExpandColumn: e ? void 0 : "false",
189
+ animation: n === !1 ? "false" : n
190
+ }
191
+ );
192
+ }
193
+ Ge.displayName = "GridDetailPanel";
194
+ const K = /* @__PURE__ */ new WeakMap(), Y = /* @__PURE__ */ new Map();
195
+ function Ae(r) {
196
+ const t = K.get(r);
141
197
  if (t) return t;
142
- const e = n.id;
198
+ const e = r.id;
143
199
  if (e)
144
- return q.get(e);
200
+ return Y.get(e);
145
201
  }
146
- function ve(n) {
147
- const { id: t, title: e, icon: r, tooltip: i, order: s = 100, children: o } = n, c = S(null), d = E(
148
- (u) => {
149
- c.current = u, u && (W.set(u, o), t && q.set(t, o));
202
+ function Ye(r) {
203
+ const { id: t, title: e, icon: n, tooltip: o, order: a = 100, children: i } = r, s = P(null), l = h(
204
+ (m) => {
205
+ s.current = m, m && (K.set(m, i), t && Y.set(t, i));
150
206
  },
151
- [o, t]
207
+ [i, t]
152
208
  );
153
209
  return w(() => () => {
154
- const u = c.current;
155
- u && (W.delete(u), t && q.delete(t));
156
- }, [t]), /* @__PURE__ */ x(
210
+ const m = s.current;
211
+ m && (K.delete(m), t && Y.delete(t));
212
+ }, [t]), /* @__PURE__ */ I(
157
213
  "tbw-grid-tool-panel",
158
214
  {
159
- ref: d,
215
+ ref: l,
160
216
  id: t,
161
217
  title: e,
162
- icon: r,
163
- tooltip: i,
164
- order: s?.toString()
218
+ icon: n,
219
+ tooltip: o,
220
+ order: a?.toString()
165
221
  }
166
222
  );
167
223
  }
168
- const G = /* @__PURE__ */ new WeakMap(), k = /* @__PURE__ */ new Map();
169
- function ne(n, t) {
170
- const e = n.getAttribute("field"), r = G.get(n) ?? {};
171
- if (r.renderer = t, G.set(n, r), e) {
172
- const i = k.get(e) ?? {};
173
- i.renderer = t, k.set(e, i);
224
+ const G = /* @__PURE__ */ new WeakMap(), N = /* @__PURE__ */ new Map();
225
+ function Ne(r, t) {
226
+ const e = r.getAttribute("field"), n = G.get(r) ?? {};
227
+ if (n.renderer = t, G.set(r, n), e) {
228
+ const o = N.get(e) ?? {};
229
+ o.renderer = t, N.set(e, o);
174
230
  }
175
231
  }
176
- function ie(n, t) {
177
- const e = n.getAttribute("field"), r = G.get(n) ?? {};
178
- if (r.editor = t, G.set(n, r), e) {
179
- const i = k.get(e) ?? {};
180
- i.editor = t, k.set(e, i);
232
+ function Ie(r, t) {
233
+ const e = r.getAttribute("field"), n = G.get(r) ?? {};
234
+ if (n.editor = t, G.set(r, n), e) {
235
+ const o = N.get(e) ?? {};
236
+ o.editor = t, N.set(e, o);
181
237
  }
182
238
  }
183
- function oe(n) {
184
- let t = G.get(n)?.renderer;
239
+ function Te(r) {
240
+ let t = G.get(r)?.renderer;
185
241
  if (!t) {
186
- const e = n.getAttribute("field");
187
- e && (t = k.get(e)?.renderer);
242
+ const e = r.getAttribute("field");
243
+ e && (t = N.get(e)?.renderer);
188
244
  }
189
245
  return t;
190
246
  }
191
- function se(n) {
192
- let t = G.get(n)?.editor;
247
+ function Ve(r) {
248
+ let t = G.get(r)?.editor;
193
249
  if (!t) {
194
- const e = n.getAttribute("field");
195
- e && (t = k.get(e)?.editor);
250
+ const e = r.getAttribute("field");
251
+ e && (t = N.get(e)?.editor);
196
252
  }
197
253
  return t;
198
254
  }
199
- function Ce() {
200
- return Array.from(k.keys());
201
- }
202
- class ce {
255
+ class ke {
203
256
  mountedViews = [];
204
257
  typeDefaults = null;
205
258
  /**
@@ -217,13 +270,13 @@ class ce {
217
270
  */
218
271
  canHandle(t) {
219
272
  const e = t.getAttribute("field");
220
- let r = G.get(t);
221
- if (!r && e) {
222
- const o = k.get(e);
223
- o && (o.renderer || o.editor) && (r = o, G.set(t, r));
273
+ let n = G.get(t);
274
+ if (!n && e) {
275
+ const i = N.get(e);
276
+ i && (i.renderer || i.editor) && (n = i, G.set(t, n));
224
277
  }
225
- const i = r?.renderer !== void 0, s = r?.editor !== void 0;
226
- return r !== void 0 && (i || s);
278
+ const o = n?.renderer !== void 0, a = n?.editor !== void 0;
279
+ return n !== void 0 && (o || a);
227
280
  }
228
281
  /**
229
282
  * Creates a view renderer function that renders a React component
@@ -237,31 +290,31 @@ class ce {
237
290
  * allowing the grid to use its default rendering.
238
291
  */
239
292
  createRenderer(t) {
240
- const e = oe(t);
293
+ const e = Te(t);
241
294
  if (!e)
242
295
  return;
243
- const r = /* @__PURE__ */ new WeakMap();
244
- return (i) => {
245
- const s = i.cellEl;
246
- if (s) {
247
- const d = r.get(s);
248
- if (d)
249
- return v(() => {
250
- d.root.render(e(i));
251
- }), d.container;
252
- const u = document.createElement("div");
253
- u.className = "react-cell-renderer", u.style.display = "contents";
254
- const h = b(u);
255
- return v(() => {
256
- h.render(e(i));
257
- }), r.set(s, { root: h, container: u, lastRowIndex: i.rowIndex ?? -1 }), this.mountedViews.push({ root: h, container: u }), u;
296
+ const n = /* @__PURE__ */ new WeakMap();
297
+ return (o) => {
298
+ const a = o.cellEl;
299
+ if (a) {
300
+ const l = n.get(a);
301
+ if (l)
302
+ return R(() => {
303
+ l.root.render(e(o));
304
+ }), l.container;
305
+ const m = document.createElement("div");
306
+ m.className = "react-cell-renderer", m.style.display = "contents";
307
+ const v = S(m);
308
+ return R(() => {
309
+ v.render(e(o));
310
+ }), n.set(a, { root: v, container: m, lastRowIndex: o.rowIndex ?? -1 }), this.mountedViews.push({ root: v, container: m }), m;
258
311
  }
259
- const o = document.createElement("div");
260
- o.className = "react-cell-renderer", o.style.display = "contents";
261
- const c = b(o);
262
- return v(() => {
263
- c.render(e(i));
264
- }), this.mountedViews.push({ root: c, container: o }), o;
312
+ const i = document.createElement("div");
313
+ i.className = "react-cell-renderer", i.style.display = "contents";
314
+ const s = S(i);
315
+ return R(() => {
316
+ s.render(e(o));
317
+ }), this.mountedViews.push({ root: s, container: i }), i;
265
318
  };
266
319
  }
267
320
  /**
@@ -269,14 +322,14 @@ class ce {
269
322
  * with commit/cancel callbacks passed as props.
270
323
  */
271
324
  createEditor(t) {
272
- const e = se(t);
273
- return e ? (r) => {
274
- const i = document.createElement("div");
275
- i.className = "react-cell-editor", i.style.display = "contents";
276
- const s = b(i);
277
- return v(() => {
278
- s.render(e(r));
279
- }), this.mountedViews.push({ root: s, container: i }), i;
325
+ const e = Ve(t);
326
+ return e ? (n) => {
327
+ const o = document.createElement("div");
328
+ o.className = "react-cell-editor", o.style.display = "contents";
329
+ const a = S(o);
330
+ return R(() => {
331
+ a.render(e(n));
332
+ }), this.mountedViews.push({ root: a, container: o }), o;
280
333
  } : () => document.createElement("div");
281
334
  }
282
335
  /**
@@ -284,15 +337,15 @@ class ce {
284
337
  * Renders React components for expandable detail rows.
285
338
  */
286
339
  createDetailRenderer(t) {
287
- const e = j(t);
340
+ const e = Pe(t);
288
341
  if (e)
289
- return (r, i) => {
290
- const s = document.createElement("div");
291
- s.className = "react-detail-panel";
292
- const o = { row: r, rowIndex: i }, c = b(s);
293
- return v(() => {
294
- c.render(e(o));
295
- }), this.mountedViews.push({ root: c, container: s }), s;
342
+ return (n, o) => {
343
+ const a = document.createElement("div");
344
+ a.className = "react-detail-panel";
345
+ const i = { row: n, rowIndex: o }, s = S(a);
346
+ return R(() => {
347
+ s.render(e(i));
348
+ }), this.mountedViews.push({ root: s, container: a }), a;
296
349
  };
297
350
  }
298
351
  /**
@@ -309,15 +362,15 @@ class ce {
309
362
  * Renders React components for card layout in responsive mode.
310
363
  */
311
364
  createResponsiveCardRenderer(t) {
312
- const e = $(t);
365
+ const e = le(t);
313
366
  if (e)
314
- return (r, i) => {
315
- const s = document.createElement("div");
316
- s.className = "react-responsive-card";
317
- const o = { row: r, index: i }, c = b(s);
318
- return v(() => {
319
- c.render(e(o));
320
- }), this.mountedViews.push({ root: c, container: s }), s;
367
+ return (n, o) => {
368
+ const a = document.createElement("div");
369
+ a.className = "react-responsive-card";
370
+ const i = { row: n, index: o }, s = S(a);
371
+ return R(() => {
372
+ s.render(e(i));
373
+ }), this.mountedViews.push({ root: s, container: a }), a;
321
374
  };
322
375
  }
323
376
  /**
@@ -325,25 +378,25 @@ class ce {
325
378
  * Renders React components into tool panel containers.
326
379
  */
327
380
  createToolPanelRenderer(t) {
328
- const e = re(t);
381
+ const e = Ae(t);
329
382
  if (!e)
330
383
  return;
331
- const r = t.closest("tbw-grid");
332
- return (i) => {
333
- const s = {
334
- grid: r ?? i
335
- }, o = b(i);
336
- return v(() => {
337
- o.render(e(s));
338
- }), this.mountedViews.push({ root: o, container: i }), () => {
339
- const c = this.mountedViews.findIndex((d) => d.container === i);
340
- if (c !== -1) {
341
- const { root: d } = this.mountedViews[c];
384
+ const n = t.closest("tbw-grid");
385
+ return (o) => {
386
+ const a = {
387
+ grid: n ?? o
388
+ }, i = S(o);
389
+ return R(() => {
390
+ i.render(e(a));
391
+ }), this.mountedViews.push({ root: i, container: o }), () => {
392
+ const s = this.mountedViews.findIndex((l) => l.container === o);
393
+ if (s !== -1) {
394
+ const { root: l } = this.mountedViews[s];
342
395
  try {
343
- d.unmount();
396
+ l.unmount();
344
397
  } catch {
345
398
  }
346
- this.mountedViews.splice(c, 1);
399
+ this.mountedViews.splice(s, 1);
347
400
  }
348
401
  };
349
402
  };
@@ -378,10 +431,10 @@ class ce {
378
431
  const e = this.typeDefaults[t];
379
432
  if (!e)
380
433
  return;
381
- const r = {
434
+ const n = {
382
435
  editorParams: e.editorParams
383
436
  };
384
- return e.renderer && (r.renderer = this.createTypeRenderer(e.renderer)), e.editor && (r.editor = this.createTypeEditor(e.editor)), r;
437
+ return e.renderer && (n.renderer = this.createTypeRenderer(e.renderer)), e.editor && (n.editor = this.createTypeEditor(e.editor)), n;
385
438
  }
386
439
  /**
387
440
  * Creates a renderer function from a React render function for type defaults.
@@ -389,12 +442,12 @@ class ce {
389
442
  */
390
443
  createTypeRenderer(t) {
391
444
  return (e) => {
392
- const r = document.createElement("span");
393
- r.style.display = "contents";
394
- const i = b(r);
395
- return this.mountedViews.push({ root: i, container: r }), v(() => {
396
- i.render(t(e));
397
- }), r;
445
+ const n = document.createElement("span");
446
+ n.style.display = "contents";
447
+ const o = S(n);
448
+ return this.mountedViews.push({ root: o, container: n }), R(() => {
449
+ o.render(t(e));
450
+ }), n;
398
451
  };
399
452
  }
400
453
  /**
@@ -403,12 +456,12 @@ class ce {
403
456
  */
404
457
  createTypeEditor(t) {
405
458
  return (e) => {
406
- const r = document.createElement("span");
407
- r.style.display = "contents";
408
- const i = b(r);
409
- return this.mountedViews.push({ root: i, container: r }), v(() => {
410
- i.render(t(e));
411
- }), r;
459
+ const n = document.createElement("span");
460
+ n.style.display = "contents";
461
+ const o = S(n);
462
+ return this.mountedViews.push({ root: o, container: n }), R(() => {
463
+ o.render(t(e));
464
+ }), n;
412
465
  };
413
466
  }
414
467
  /**
@@ -427,229 +480,323 @@ class ce {
427
480
  * Unmount a specific container (called when cell is recycled).
428
481
  */
429
482
  unmount(t) {
430
- const e = this.mountedViews.findIndex((r) => r.container === t);
483
+ const e = this.mountedViews.findIndex((n) => n.container === t);
431
484
  if (e !== -1) {
432
- const { root: r } = this.mountedViews[e];
485
+ const { root: n } = this.mountedViews[e];
433
486
  try {
434
- r.unmount();
487
+ n.unmount();
435
488
  } catch {
436
489
  }
437
490
  this.mountedViews.splice(e, 1);
438
491
  }
439
492
  }
440
493
  }
441
- let _ = !1, M = null;
442
- function B() {
443
- return _ || (M = new ce(), J.registerAdapter(M), _ = !0), M;
494
+ const Fe = {
495
+ undoRedo: ["editing"],
496
+ clipboard: ["selection"]
497
+ };
498
+ function Me(r) {
499
+ const t = new Set(r);
500
+ for (const e of r) {
501
+ const n = Fe[e];
502
+ if (n)
503
+ for (const o of n)
504
+ t.has(o) || console.warn(
505
+ `[DataGrid] Feature "${e}" requires "${o}" to be enabled. Add the "${o}" prop to your DataGrid.`
506
+ );
507
+ }
444
508
  }
445
- B();
446
- function de(n, t) {
447
- const e = n, r = e.getPluginByName?.("masterDetail");
448
- if (r && typeof r.refreshDetailRenderer == "function") {
449
- r.refreshDetailRenderer();
450
- return;
509
+ function Le(r) {
510
+ const t = [], e = [], n = { ...r };
511
+ n.multiSort !== void 0 ? delete n.sorting : n.sorting !== void 0 && (n.multiSort = n.sorting, delete n.sorting);
512
+ for (const [i, s] of Object.entries(n)) {
513
+ if (s === void 0 || s === !1) continue;
514
+ const l = i;
515
+ e.push(l);
451
516
  }
452
- const i = n.querySelector("tbw-grid-detail");
453
- !i || !j(n) || import("@toolbox-web/grid/all").then(({ MasterDetailPlugin: o }) => {
454
- const c = t.createDetailRenderer(n);
455
- if (!c) return;
456
- const d = i.getAttribute("animation");
457
- let u = "slide";
458
- d === "false" ? u = !1 : d === "fade" && (u = "fade");
459
- const h = i.getAttribute("showExpandColumn") !== "false", l = new o({
460
- detailRenderer: c,
461
- showExpandColumn: h,
462
- animation: u
463
- }), p = e.gridConfig || {}, D = p.plugins || [];
464
- e.gridConfig = {
465
- ...p,
466
- plugins: [...D, l]
467
- };
468
- }).catch(() => {
469
- });
517
+ Me(e);
518
+ const o = [
519
+ "selection",
520
+ "editing",
521
+ // Then everything else in the order they were specified
522
+ ...e.filter((i) => i !== "selection" && i !== "editing")
523
+ ], a = [...new Set(o)].filter((i) => e.includes(i));
524
+ for (const i of a) {
525
+ const s = r[i];
526
+ if (s === void 0 || s === !1) continue;
527
+ const l = he(i, s);
528
+ l && t.push(l);
529
+ }
530
+ return t;
470
531
  }
471
- function ae(n, t) {
472
- const e = n;
473
- if (!n.querySelector("tbw-grid-responsive-card") || !$(n)) return;
474
- const s = e.getPluginByName?.("responsive");
475
- if (s && typeof s.setCardRenderer == "function") {
476
- const o = t.createResponsiveCardRenderer(n);
477
- o && s.setCardRenderer(o);
478
- return;
532
+ let ce = !1, _ = null;
533
+ function Z() {
534
+ return ce || (_ = new ke(), ue.registerAdapter(_), ce = !0), _;
535
+ }
536
+ Z();
537
+ function Oe(r) {
538
+ const e = r.getPluginByName?.("masterDetail");
539
+ e && typeof e.refreshDetailRenderer == "function" && e.refreshDetailRenderer();
540
+ }
541
+ function Be(r, t) {
542
+ const e = r;
543
+ if (!r.querySelector("tbw-grid-responsive-card") || !le(r)) return;
544
+ const a = e.getPluginByName?.("responsive");
545
+ if (a && typeof a.setCardRenderer == "function") {
546
+ const i = t.createResponsiveCardRenderer(r);
547
+ i && a.setCardRenderer(i);
479
548
  }
480
- console.warn(
481
- `[tbw-grid-react] <GridResponsiveCard> found but ResponsivePlugin is not configured.
482
- Add ResponsivePlugin to your gridConfig.plugins array:
483
-
484
- import { ResponsivePlugin } from "@toolbox-web/grid/all";
485
- const config = {
486
- plugins: [new ResponsivePlugin({ breakpoint: 500 })],
487
- };`
488
- );
489
549
  }
490
- const be = Q(function(t, e) {
550
+ function je(r) {
551
+ const t = {};
552
+ return me.forEach(r, (e) => {
553
+ if (ye(e)) {
554
+ if (e.type && e.type.displayName === "GridDetailPanel") {
555
+ const n = e.props;
556
+ t.masterDetail = {
557
+ // Use props from the child component for configuration
558
+ showExpandColumn: n.showExpandColumn ?? !0,
559
+ animation: n.animation ?? "slide"
560
+ // detailRenderer will be wired up by refreshMasterDetailRenderer after mount
561
+ };
562
+ }
563
+ e.type && e.type.displayName === "GridResponsiveCard" && (t.responsive = !0);
564
+ }
565
+ }), t;
566
+ }
567
+ const Ze = ge(function(t, e) {
491
568
  const {
492
- rows: r,
493
- gridConfig: i,
494
- columns: s,
495
- fitMode: o,
496
- editOn: c,
497
- customStyles: d,
498
- className: u,
499
- style: h,
500
- children: l,
569
+ // Core props
570
+ rows: n,
571
+ gridConfig: o,
572
+ columns: a,
573
+ columnDefaults: i,
574
+ fitMode: s,
575
+ sortable: l,
576
+ filterable: m,
577
+ selectable: v,
578
+ editOn: x,
579
+ customStyles: b,
580
+ className: M,
581
+ style: T,
582
+ children: A,
583
+ // Plugin props
584
+ plugins: E,
585
+ // SSR mode
586
+ ssr: f,
587
+ // Legacy event handlers
501
588
  onRowsChange: p,
502
- onCellEdit: D,
503
- onRowClick: A,
504
- onColumnStateChange: P,
505
- onSortChange: I
506
- } = t, f = S(null), V = S(null), y = z(Y), C = U(() => te(i), [i]);
507
- return w(() => {
508
- B().setTypeDefaults(y);
509
- }, [y]), w(() => {
510
- f.current && (f.current.rows = r);
511
- }, [r]), w(() => {
512
- f.current && C && (f.current.gridConfig = C);
513
- }, [C]), w(() => {
514
- f.current && s && (f.current.columns = s);
589
+ // Feature props and event props are in ...rest
590
+ ...g
591
+ } = t, u = P(null), V = P(null), k = Q(Ee), X = [
592
+ "selection",
593
+ "editing",
594
+ "filtering",
595
+ "multiSort",
596
+ "sorting",
597
+ // deprecated alias for multiSort
598
+ "clipboard",
599
+ "contextMenu",
600
+ "reorder",
601
+ "rowReorder",
602
+ "visibility",
603
+ "undoRedo",
604
+ "tree",
605
+ "groupingRows",
606
+ "groupingColumns",
607
+ "pinnedColumns",
608
+ "pinnedRows",
609
+ "masterDetail",
610
+ "responsive",
611
+ "columnVirtualization",
612
+ "export",
613
+ "print",
614
+ "pivot",
615
+ "serverSide"
616
+ ], de = D(() => X.map((c) => {
617
+ const d = g[c];
618
+ return d !== void 0 ? `${c}:${JSON.stringify(d)}` : "";
619
+ }).filter(Boolean).join("|"), [g]), ee = D(() => {
620
+ const c = {};
621
+ for (const d of X)
622
+ d in g && g[d] !== void 0 && (c[d] = g[d]);
623
+ return c;
624
+ }, [de]), te = D(() => je(A), [A]), re = D(() => ({ ...te, ...ee }), [ee, te]), q = D(() => E || f ? [] : Le(re), [re, E, f]), L = D(() => {
625
+ if (E) {
626
+ const c = new Set(E.map((y) => y.name)), d = q.filter((y) => !c.has(y.name));
627
+ return [...E, ...d];
628
+ }
629
+ return q;
630
+ }, [E, q]), O = D(() => {
631
+ if (!a) return a;
632
+ const c = Re(a);
633
+ return i ? c.map((d) => ({
634
+ ...i,
635
+ ...d
636
+ // Individual column props override defaults
637
+ })) : c;
638
+ }, [a, i]), B = D(() => {
639
+ const c = De(o), d = {};
640
+ if (l !== void 0 && (d.sortable = l), m !== void 0 && (d.filterable = m), v !== void 0 && (d.selectable = v), L.length > 0 && c) {
641
+ const y = c.plugins || [], C = new Set(y.map((F) => F.name)), j = L.filter((F) => !C.has(F.name));
642
+ return {
643
+ ...c,
644
+ ...d,
645
+ plugins: [...y, ...j]
646
+ };
647
+ }
648
+ return L.length > 0 && !c ? { ...d, plugins: L } : Object.keys(d).length > 0 ? { ...c, ...d } : c;
649
+ }, [o, L, l, m, v]);
650
+ w(() => {
651
+ Z().setTypeDefaults(k);
652
+ }, [k]), w(() => {
653
+ u.current && (u.current.rows = n);
654
+ }, [n]), w(() => {
655
+ u.current && B && (u.current.gridConfig = B);
656
+ }, [B]), w(() => {
657
+ u.current && O && (u.current.columns = O);
658
+ }, [O]), w(() => {
659
+ u.current && s !== void 0 && (u.current.fitMode = s);
515
660
  }, [s]), w(() => {
516
- f.current && o !== void 0 && (f.current.fitMode = o);
517
- }, [o]), w(() => {
518
- f.current && c !== void 0 && (f.current.editOn = c);
519
- }, [c]), w(() => {
520
- const a = f.current;
521
- if (!a) return;
522
- const m = B();
523
- a.__frameworkAdapter = m, de(a, m), ae(a, m);
524
- let g = !1;
525
- const R = requestAnimationFrame(() => {
526
- g || (typeof a.refreshColumns == "function" && a.refreshColumns(), typeof a.refreshShellHeader == "function" && a.refreshShellHeader());
661
+ u.current && x !== void 0 && (u.current.editOn = x);
662
+ }, [x]), w(() => {
663
+ const c = u.current;
664
+ if (!c) return;
665
+ const d = Z();
666
+ c.__frameworkAdapter = d, Oe(c), Be(c, d);
667
+ let y = !1;
668
+ const C = requestAnimationFrame(() => {
669
+ y || (typeof c.refreshColumns == "function" && c.refreshColumns(), typeof c.refreshShellHeader == "function" && c.refreshShellHeader());
527
670
  });
528
671
  return () => {
529
- g = !0, cancelAnimationFrame(R);
672
+ y = !0, cancelAnimationFrame(C);
530
673
  };
531
674
  }, []), w(() => {
532
- if (!f.current || !d) return;
533
- const a = f.current, m = "react-custom-styles";
534
- let g = !0;
535
- return a.ready?.().then(() => {
536
- g && d && (a.registerStyles?.(m, d), V.current = m);
675
+ if (!u.current || !b) return;
676
+ const c = u.current, d = "react-custom-styles";
677
+ let y = !0;
678
+ return c.ready?.().then(() => {
679
+ y && b && (c.registerStyles?.(d, b), V.current = d);
537
680
  }), () => {
538
- g = !1, V.current && (a.unregisterStyles?.(V.current), V.current = null);
681
+ y = !1, V.current && (c.unregisterStyles?.(V.current), V.current = null);
539
682
  };
540
- }, [d]), w(() => {
541
- const a = f.current;
542
- if (!a) return;
543
- const m = [];
683
+ }, [b]), w(() => {
684
+ const c = u.current;
685
+ if (!c) return;
686
+ const d = [];
544
687
  if (p) {
545
- const g = ((R) => p(R.detail.rows));
546
- a.addEventListener("rows-change", g), m.push(["rows-change", g]);
547
- }
548
- if (D) {
549
- const g = ((R) => D(R));
550
- a.addEventListener("cell-edit", g), m.push(["cell-edit", g]);
551
- }
552
- if (A) {
553
- const g = ((R) => A(R));
554
- a.addEventListener("row-click", g), m.push(["row-click", g]);
555
- }
556
- if (P) {
557
- const g = ((R) => P(R));
558
- a.addEventListener("column-state-change", g), m.push(["column-state-change", g]);
559
- }
560
- if (I) {
561
- const g = ((R) => I(R));
562
- a.addEventListener("sort-change", g), m.push(["sort-change", g]);
688
+ const y = ((C) => p(C.detail.rows));
689
+ c.addEventListener("rows-change", y), d.push(["rows-change", y]);
563
690
  }
564
691
  return () => {
565
- m.forEach(([g, R]) => {
566
- a.removeEventListener(g, R);
692
+ d.forEach(([y, C]) => {
693
+ c.removeEventListener(y, C);
567
694
  });
568
695
  };
569
- }, [p, D, A, P, I]), X(
696
+ }, [p]);
697
+ const ne = D(() => Object.keys(z).filter((c) => typeof g[c] == "function").sort().join("|"), [g]), oe = P({});
698
+ for (const c of Object.keys(z))
699
+ oe.current[c] = g[c];
700
+ return w(() => {
701
+ const c = u.current;
702
+ if (!c) return;
703
+ const d = [];
704
+ for (const [y, C] of Object.entries(z))
705
+ if (ne.includes(y)) {
706
+ const j = ((F) => {
707
+ oe.current[y]?.(F.detail, F);
708
+ });
709
+ c.addEventListener(C, j), d.push([C, j]);
710
+ }
711
+ return () => {
712
+ d.forEach(([y, C]) => {
713
+ c.removeEventListener(y, C);
714
+ });
715
+ };
716
+ }, [ne]), pe(
570
717
  e,
571
718
  () => ({
572
719
  get element() {
573
- return f.current;
720
+ return u.current;
574
721
  },
575
722
  async getConfig() {
576
- return f.current?.getConfig?.() ?? {};
723
+ return u.current?.getConfig?.() ?? {};
577
724
  },
578
725
  async ready() {
579
- return f.current?.ready?.();
726
+ return u.current?.ready?.();
580
727
  },
581
728
  async forceLayout() {
582
- return f.current?.forceLayout?.();
729
+ return u.current?.forceLayout?.();
583
730
  },
584
- async toggleGroup(a) {
585
- return f.current?.toggleGroup?.(a);
731
+ async toggleGroup(c) {
732
+ return u.current?.toggleGroup?.(c);
586
733
  },
587
- registerStyles(a, m) {
588
- f.current?.registerStyles?.(a, m);
734
+ registerStyles(c, d) {
735
+ u.current?.registerStyles?.(c, d);
589
736
  },
590
- unregisterStyles(a) {
591
- f.current?.unregisterStyles?.(a);
737
+ unregisterStyles(c) {
738
+ u.current?.unregisterStyles?.(c);
592
739
  }
593
740
  }),
594
741
  []
595
- ), /* @__PURE__ */ x(
742
+ ), /* @__PURE__ */ I(
596
743
  "tbw-grid",
597
744
  {
598
- ref: (a) => {
599
- if (f.current = a, a) {
600
- const m = a;
601
- C && (m.gridConfig = C), r && (m.rows = r), s && (m.columns = s);
745
+ ref: (c) => {
746
+ if (u.current = c, c) {
747
+ const d = c;
748
+ B && (d.gridConfig = B), n && (d.rows = n), O && (d.columns = O);
602
749
  }
603
750
  },
604
- class: u,
605
- style: h,
606
- children: l
751
+ class: M,
752
+ style: T,
753
+ children: A
607
754
  }
608
755
  );
609
756
  });
610
- function Ee(n) {
757
+ function Qe(r) {
611
758
  const {
612
759
  field: t,
613
760
  header: e,
614
- type: r,
615
- editable: i,
616
- sortable: s,
617
- resizable: o,
618
- width: c,
619
- minWidth: d,
620
- hidden: u,
621
- lockVisible: h,
622
- children: l,
623
- editor: p,
624
- options: D,
625
- multi: A,
626
- format: P
627
- } = n, I = S(null), f = E(
628
- (C) => {
629
- I.current = C, C && (l && ne(C, l), p && ie(C, p));
761
+ type: n,
762
+ editable: o,
763
+ sortable: a,
764
+ resizable: i,
765
+ width: s,
766
+ minWidth: l,
767
+ hidden: m,
768
+ lockVisible: v,
769
+ children: x,
770
+ editor: b,
771
+ options: M,
772
+ multi: T,
773
+ format: A
774
+ } = r, E = P(null), f = h(
775
+ (u) => {
776
+ E.current = u, u && (x && Ne(u, x), b && Ie(u, b));
630
777
  },
631
- [l, p, t]
632
- ), V = typeof c == "number" ? `${c}px` : c, y = {
778
+ [x, b, t]
779
+ ), p = typeof s == "number" ? `${s}px` : s, g = {
633
780
  field: t,
634
781
  ref: f
635
782
  };
636
- return e !== void 0 && (y.header = e), r !== void 0 && (y.type = r), i !== void 0 && (y.editable = i), s !== void 0 && (y.sortable = s), o !== void 0 && (y.resizable = o), V !== void 0 && (y.width = V), d !== void 0 && (y["min-width"] = d), u !== void 0 && (y.hidden = u), h !== void 0 && (y["lock-visible"] = h), A !== void 0 && (y.multi = A), P && (y["data-has-format"] = "true"), D && (y["data-has-options"] = "true"), /* @__PURE__ */ x("tbw-grid-column", { ...y });
783
+ return e !== void 0 && (g.header = e), n !== void 0 && (g.type = n), o !== void 0 && (g.editable = o), a !== void 0 && (g.sortable = a), i !== void 0 && (g.resizable = i), p !== void 0 && (g.width = p), l !== void 0 && (g["min-width"] = l), m !== void 0 && (g.hidden = m), v !== void 0 && (g["lock-visible"] = v), T !== void 0 && (g.multi = T), A && (g["data-has-format"] = "true"), M && (g["data-has-options"] = "true"), /* @__PURE__ */ I("tbw-grid-column", { ...g });
637
784
  }
638
- function Ae({ children: n }) {
639
- return /* @__PURE__ */ x("tbw-grid-tool-buttons", { children: n });
785
+ function Xe({ children: r }) {
786
+ return /* @__PURE__ */ I("tbw-grid-tool-buttons", { children: r });
640
787
  }
641
- function De() {
642
- const n = S(null), [t, e] = O(!1), [r, i] = O(null);
788
+ function et() {
789
+ const r = P(null), [t, e] = ie(!1), [n, o] = ie(null);
643
790
  w(() => {
644
- const l = n.current;
645
- if (!l) return;
791
+ const f = r.current;
792
+ if (!f) return;
646
793
  let p = !0;
647
794
  return (async () => {
648
795
  try {
649
- if (await l.ready?.(), p) {
796
+ if (await f.ready?.(), p) {
650
797
  e(!0);
651
- const A = await l.getConfig?.();
652
- p && A && i(A);
798
+ const u = await f.getConfig?.();
799
+ p && u && o(u);
653
800
  }
654
801
  } catch {
655
802
  }
@@ -657,60 +804,108 @@ function De() {
657
804
  p = !1;
658
805
  };
659
806
  }, []);
660
- const s = E(async () => {
661
- const l = n.current;
662
- return l ? await l.getConfig?.() ?? null : null;
663
- }, []), o = E(async () => {
664
- const l = n.current;
665
- l && await l.forceLayout?.();
666
- }, []), c = E(async (l) => {
667
- const p = n.current;
668
- p && await p.toggleGroup?.(l);
669
- }, []), d = E((l, p) => {
670
- n.current?.registerStyles?.(l, p);
671
- }, []), u = E((l) => {
672
- n.current?.unregisterStyles?.(l);
673
- }, []), h = E(() => r?.columns ? r.columns.filter((l) => !l.hidden) : [], [r]);
807
+ const a = h(async () => {
808
+ const f = r.current;
809
+ return f ? await f.getConfig?.() ?? null : null;
810
+ }, []), i = h(async () => {
811
+ const f = r.current;
812
+ f && await f.forceLayout?.();
813
+ }, []), s = h(async (f) => {
814
+ const p = r.current;
815
+ p && await p.toggleGroup?.(f);
816
+ }, []), l = h((f, p) => {
817
+ r.current?.registerStyles?.(f, p);
818
+ }, []), m = h((f) => {
819
+ r.current?.unregisterStyles?.(f);
820
+ }, []), v = h(() => n?.columns ? n.columns.filter((f) => !f.hidden) : [], [n]), x = h(() => {
821
+ const f = r.current?.element, p = f?.getPluginByName?.("selection");
822
+ if (!p) {
823
+ console.warn("[useGrid] selectAll requires SelectionPlugin");
824
+ return;
825
+ }
826
+ if (p.config?.mode === "row") {
827
+ const g = f?.rows ?? [], u = new Set(g.map((V, k) => k));
828
+ p.selected = u, p.requestAfterRender?.();
829
+ }
830
+ }, []), b = h(() => {
831
+ const p = r.current?.element?.getPluginByName?.("selection");
832
+ p && p.clearSelection?.();
833
+ }, []), M = h(() => {
834
+ const p = r.current?.element?.getPluginByName?.("selection");
835
+ return p ? new Set(p.selected ?? []) : /* @__PURE__ */ new Set();
836
+ }, []), T = h(() => {
837
+ const f = r.current?.element, p = f?.getPluginByName?.("selection");
838
+ if (!p) return [];
839
+ const g = f?.rows ?? [], u = p.selected ?? /* @__PURE__ */ new Set();
840
+ return g.filter((V, k) => u.has(k));
841
+ }, []), A = h((f) => {
842
+ const g = r.current?.element?.getPluginByName?.("export");
843
+ if (!g) {
844
+ console.warn("[useGrid] exportToCsv requires ExportPlugin (use export prop)");
845
+ return;
846
+ }
847
+ g.exportCsv?.({ filename: f ?? "export.csv" });
848
+ }, []), E = h((f) => {
849
+ const g = r.current?.element?.getPluginByName?.("export");
850
+ if (!g) {
851
+ console.warn("[useGrid] exportToJson requires ExportPlugin (use export prop)");
852
+ return;
853
+ }
854
+ g.exportJson?.({ filename: f ?? "export.json" });
855
+ }, []);
674
856
  return {
675
- ref: n,
676
- element: n.current?.element ?? null,
857
+ ref: r,
858
+ element: r.current?.element ?? null,
677
859
  isReady: t,
678
- config: r,
679
- getConfig: s,
680
- forceLayout: o,
681
- toggleGroup: c,
682
- registerStyles: d,
683
- unregisterStyles: u,
684
- getVisibleColumns: h
860
+ config: n,
861
+ getConfig: a,
862
+ forceLayout: i,
863
+ toggleGroup: s,
864
+ registerStyles: l,
865
+ unregisterStyles: m,
866
+ getVisibleColumns: v,
867
+ // Selection methods
868
+ selectAll: x,
869
+ clearSelection: b,
870
+ getSelectedIndices: M,
871
+ getSelectedRows: T,
872
+ // Export methods
873
+ exportToCsv: A,
874
+ exportToJson: E
685
875
  };
686
876
  }
687
- function Se(n, t, e, r = []) {
688
- const i = S(e);
877
+ let ae = !1;
878
+ function tt(r, t, e, n = []) {
879
+ !ae && typeof window < "u" && (window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1" || window.location.hostname.includes(".local")) && (ae = !0, console.warn(
880
+ `[useGridEvent] Deprecated: Use event props directly on DataGrid instead.
881
+ Example: <DataGrid onSelectionChange={(e) => ...} />
882
+ See migration guide: https://toolbox-web.dev/grid-react/migration`
883
+ ));
884
+ const o = P(e);
689
885
  w(() => {
690
- i.current = e;
691
- }, [e, ...r]), w(() => {
692
- const s = n.current, o = s && "element" in s ? s.element : s;
693
- if (!o) return;
694
- const c = ((d) => {
695
- i.current(d);
886
+ o.current = e;
887
+ }, [e, ...n]), w(() => {
888
+ const a = r.current, i = a && "element" in a ? a.element : a;
889
+ if (!i) return;
890
+ const s = ((l) => {
891
+ o.current(l);
696
892
  });
697
- return o.addEventListener(t, c), () => {
698
- o.removeEventListener(t, c);
893
+ return i.addEventListener(t, s), () => {
894
+ i.removeEventListener(t, s);
699
895
  };
700
- }, [n, t]);
896
+ }, [r, t]);
701
897
  }
702
898
  export {
703
- be as DataGrid,
704
- Ee as GridColumn,
705
- me as GridDetailPanel,
706
- ye as GridResponsiveCard,
707
- Ae as GridToolButtons,
708
- ve as GridToolPanel,
709
- he as GridTypeProvider,
710
- ce as ReactGridAdapter,
711
- Ce as getRegisteredFields,
712
- De as useGrid,
713
- Se as useGridEvent,
714
- we as useGridTypeDefaults,
715
- Re as useTypeDefault
899
+ Ze as DataGrid,
900
+ Qe as GridColumn,
901
+ Ge as GridDetailPanel,
902
+ be as GridResponsiveCard,
903
+ Xe as GridToolButtons,
904
+ Ye as GridToolPanel,
905
+ Je as GridTypeProvider,
906
+ ke as ReactGridAdapter,
907
+ et as useGrid,
908
+ tt as useGridEvent,
909
+ Ue as useGridTypeDefaults,
910
+ Ke as useTypeDefault
716
911
  };