hs-uix 1.6.4 → 1.7.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.
package/dist/datatable.js CHANGED
@@ -34,9 +34,22 @@ __export(datatable_exports, {
34
34
  module.exports = __toCommonJS(datatable_exports);
35
35
 
36
36
  // packages/datatable/src/DataTable.jsx
37
- var import_react = __toESM(require("react"));
37
+ var import_react2 = __toESM(require("react"));
38
+
39
+ // src/utils/query.js
38
40
  var import_fuse = __toESM(require("fuse.js"));
39
- var import_ui_extensions = require("@hubspot/ui-extensions");
41
+ var getEmptyFilterValue = (filter) => {
42
+ const type = filter.type || "select";
43
+ if (type === "multiselect") return [];
44
+ if (type === "dateRange") return { from: null, to: null };
45
+ return "";
46
+ };
47
+ var isFilterActive = (filter, value) => {
48
+ const type = filter.type || "select";
49
+ if (type === "multiselect") return Array.isArray(value) && value.length > 0;
50
+ if (type === "dateRange") return value && (value.from || value.to);
51
+ return !!value;
52
+ };
40
53
  var formatDateChip = (dateObj) => {
41
54
  if (!dateObj) return "";
42
55
  const { year, month, date } = dateObj;
@@ -50,6 +63,109 @@ var dateToTimestamp = (dateObj) => {
50
63
  if (!dateObj) return null;
51
64
  return new Date(dateObj.year, dateObj.month, dateObj.date).getTime();
52
65
  };
66
+ var toStableKey = (value) => {
67
+ try {
68
+ return JSON.stringify(value);
69
+ } catch (_error) {
70
+ return String(value);
71
+ }
72
+ };
73
+ var filterRows = (rows, filters, values) => {
74
+ let result = rows;
75
+ for (const filter of filters || []) {
76
+ const value = values[filter.name];
77
+ if (!isFilterActive(filter, value)) continue;
78
+ const type = filter.type || "select";
79
+ if (filter.filterFn) {
80
+ result = result.filter((row) => filter.filterFn(row, value));
81
+ } else if (type === "multiselect") {
82
+ result = result.filter((row) => value.includes(row[filter.name]));
83
+ } else if (type === "dateRange") {
84
+ const fromTs = dateToTimestamp(value.from);
85
+ const toTs = value.to ? dateToTimestamp(value.to) + 864e5 - 1 : null;
86
+ result = result.filter((row) => {
87
+ const rowTs = new Date(row[filter.name]).getTime();
88
+ if (Number.isNaN(rowTs)) return false;
89
+ if (fromTs && rowTs < fromTs) return false;
90
+ if (toTs && rowTs > toTs) return false;
91
+ return true;
92
+ });
93
+ } else {
94
+ result = result.filter((row) => row[filter.name] === value);
95
+ }
96
+ }
97
+ return result;
98
+ };
99
+ var searchRows = (rows, term, fields, opts = {}) => {
100
+ const { fuzzy = false, fuzzyOptions } = opts;
101
+ const t = String(term ?? "").toLowerCase();
102
+ if (!t || !fields || fields.length === 0) return rows;
103
+ if (fuzzy) {
104
+ const fuse = new import_fuse.default(rows, {
105
+ keys: fields,
106
+ threshold: 0.4,
107
+ distance: 100,
108
+ ignoreLocation: true,
109
+ ...fuzzyOptions
110
+ });
111
+ return fuse.search(t).map((r) => r.item);
112
+ }
113
+ return rows.filter(
114
+ (row) => fields.some((field) => {
115
+ const val = row[field];
116
+ return val && String(val).toLowerCase().includes(t);
117
+ })
118
+ );
119
+ };
120
+
121
+ // src/utils/interactionHooks.js
122
+ var import_react = require("react");
123
+ var import_ui_extensions = require("@hubspot/ui-extensions");
124
+ var useDebouncedDispatch = (value, debounceMs, dispatch) => {
125
+ const debounced = (0, import_ui_extensions.useDebounce)(value, debounceMs > 0 ? debounceMs : 300);
126
+ const pendingRef = (0, import_react.useRef)(null);
127
+ (0, import_react.useEffect)(() => {
128
+ if (debounceMs <= 0) return;
129
+ if (pendingRef.current == null) return;
130
+ if (debounced !== pendingRef.current) return;
131
+ const next = pendingRef.current;
132
+ pendingRef.current = null;
133
+ dispatch(next);
134
+ }, [debounceMs, debounced, dispatch]);
135
+ return (0, import_react.useCallback)(
136
+ (next) => {
137
+ if (debounceMs > 0) {
138
+ pendingRef.current = next;
139
+ } else {
140
+ pendingRef.current = null;
141
+ dispatch(next);
142
+ }
143
+ },
144
+ [debounceMs, dispatch]
145
+ );
146
+ };
147
+ var useSelectionReset = ({ resetKey, enabled, isControlled, clearSelection }) => {
148
+ const ref = (0, import_react.useRef)("");
149
+ (0, import_react.useEffect)(() => {
150
+ if (!enabled || isControlled) {
151
+ ref.current = resetKey;
152
+ return;
153
+ }
154
+ if (ref.current && ref.current !== resetKey) {
155
+ clearSelection();
156
+ }
157
+ ref.current = resetKey;
158
+ }, [resetKey, enabled, isControlled, clearSelection]);
159
+ };
160
+
161
+ // packages/datatable/src/editValidation.js
162
+ var editValidationError = (result) => {
163
+ if (result === true || result === void 0 || result === null) return null;
164
+ return typeof result === "string" ? result : "Invalid value";
165
+ };
166
+
167
+ // packages/datatable/src/DataTable.jsx
168
+ var import_ui_extensions2 = require("@hubspot/ui-extensions");
53
169
  var NARROW_EDIT_TYPES = /* @__PURE__ */ new Set(["checkbox", "toggle"]);
54
170
  var DATE_PATTERN = /^\d{4}[-/]\d{2}[-/]\d{2}/;
55
171
  var BOOL_VALUES = /* @__PURE__ */ new Set(["true", "false", "yes", "no", "0", "1"]);
@@ -75,13 +191,6 @@ var serializeSortState = (sortState) => {
75
191
  if (!activeField) return null;
76
192
  return { field: activeField, direction: sortState[activeField] };
77
193
  };
78
- var toStableKey = (value) => {
79
- try {
80
- return JSON.stringify(value);
81
- } catch (_error) {
82
- return String(value);
83
- }
84
- };
85
194
  var computeAutoWidths = (columns, data) => {
86
195
  if (!data || data.length === 0) return {};
87
196
  const sample = data.slice(0, 50);
@@ -133,12 +242,6 @@ var computeAutoWidths = (columns, data) => {
133
242
  });
134
243
  return results;
135
244
  };
136
- var getEmptyFilterValue = (filter) => {
137
- const type = filter.type || "select";
138
- if (type === "multiselect") return [];
139
- if (type === "dateRange") return { from: null, to: null };
140
- return "";
141
- };
142
245
  var BOOLEAN_SELECT_OPTIONS = [
143
246
  { label: "Yes", value: true },
144
247
  { label: "No", value: false }
@@ -149,12 +252,6 @@ var resolveEditOptions = (col, data) => {
149
252
  if (sample && typeof sample[col.field] === "boolean") return BOOLEAN_SELECT_OPTIONS;
150
253
  return [];
151
254
  };
152
- var isFilterActive = (filter, value) => {
153
- const type = filter.type || "select";
154
- if (type === "multiselect") return Array.isArray(value) && value.length > 0;
155
- if (type === "dateRange") return value && (value.from || value.to);
156
- return !!value;
157
- };
158
255
  var DataTable = ({
159
256
  // Data
160
257
  data,
@@ -173,8 +270,8 @@ var DataTable = ({
173
270
  filters = [],
174
271
  showFilterBadges = true,
175
272
  // show active filter chips/badges
176
- showClearFiltersButton = true,
177
- // show "Clear all" filters reset button
273
+ showClearFiltersButton,
274
+ // show "Clear all" reset button; defaults to showFilterBadges when omitted
178
275
  filterInlineLimit = 2,
179
276
  // number of filters shown inline before overflow
180
277
  // Pagination
@@ -187,7 +284,7 @@ var DataTable = ({
187
284
  // show First/Last page buttons (default: auto when pageCount > 5)
188
285
  // Row count
189
286
  title,
190
- // optional title shown above the table toolbar
287
+ // optional title shown as demibold text above the table toolbar
191
288
  showRowCount = true,
192
289
  // show "X records" / "X of Y records" text
193
290
  rowCountBold = false,
@@ -308,47 +405,46 @@ var DataTable = ({
308
405
  renderErrorState
309
406
  // ({ error, title, message }) => ReactNode
310
407
  }) => {
311
- const initialSortState = (0, import_react.useMemo)(() => {
408
+ const initialSortState = (0, import_react2.useMemo)(() => {
312
409
  return normalizeSortState(columns, defaultSort);
313
410
  }, [columns, defaultSort]);
314
- const [internalSearchTerm, setInternalSearchTerm] = (0, import_react.useState)(
411
+ const [internalSearchTerm, setInternalSearchTerm] = (0, import_react2.useState)(
315
412
  () => serverSide && searchValue != null ? searchValue : ""
316
413
  );
317
- const [internalFilterValues, setInternalFilterValues] = (0, import_react.useState)(() => {
414
+ const [internalFilterValues, setInternalFilterValues] = (0, import_react2.useState)(() => {
318
415
  const init = {};
319
416
  filters.forEach((f) => {
320
417
  init[f.name] = getEmptyFilterValue(f);
321
418
  });
322
419
  return init;
323
420
  });
324
- const [internalSortState, setInternalSortState] = (0, import_react.useState)(initialSortState);
325
- const [currentPage, setCurrentPage] = (0, import_react.useState)(1);
326
- const [showMoreFilters, setShowMoreFilters] = (0, import_react.useState)(false);
327
- const lastAppliedSearchRef = (0, import_react.useRef)(
421
+ const [internalSortState, setInternalSortState] = (0, import_react2.useState)(initialSortState);
422
+ const [currentPage, setCurrentPage] = (0, import_react2.useState)(1);
423
+ const [showMoreFilters, setShowMoreFilters] = (0, import_react2.useState)(false);
424
+ const lastAppliedSearchRef = (0, import_react2.useRef)(
328
425
  serverSide && searchValue != null ? searchValue : ""
329
426
  );
330
427
  const searchTerm = serverSide && searchValue != null ? searchValue : internalSearchTerm;
331
- (0, import_react.useEffect)(() => {
428
+ (0, import_react2.useEffect)(() => {
332
429
  if (!serverSide || searchValue == null) return;
333
430
  if (searchValue === lastAppliedSearchRef.current) return;
334
431
  lastAppliedSearchRef.current = searchValue;
335
432
  setInternalSearchTerm(searchValue);
336
433
  }, [serverSide, searchValue]);
337
434
  const filterValues = serverSide && externalFilterValues != null ? externalFilterValues : internalFilterValues;
338
- const externalSortState = (0, import_react.useMemo)(
435
+ const externalSortState = (0, import_react2.useMemo)(
339
436
  () => normalizeSortState(columns, externalSort),
340
437
  [columns, externalSort]
341
438
  );
342
439
  const sortState = serverSide && externalSort != null ? externalSortState : internalSortState;
343
440
  const activePage = serverSide && externalPage != null ? externalPage : currentPage;
344
- (0, import_react.useEffect)(() => {
441
+ (0, import_react2.useEffect)(() => {
345
442
  if (!serverSide) setCurrentPage(1);
346
443
  }, [internalSearchTerm, internalFilterValues, internalSortState, serverSide]);
347
- const debounceRef = (0, import_react.useRef)(null);
348
- const fireSearchCallback = (0, import_react.useCallback)((term) => {
444
+ const fireSearchCallback = (0, import_react2.useCallback)((term) => {
349
445
  if (serverSide && onSearchChange) onSearchChange(term);
350
446
  }, [serverSide, onSearchChange]);
351
- const fireParamsChange = (0, import_react.useCallback)((overrides) => {
447
+ const fireParamsChange = (0, import_react2.useCallback)((overrides) => {
352
448
  if (!onParamsChange) return;
353
449
  const nextSortState = overrides.sort != null ? normalizeSortState(columns, overrides.sort) : sortState;
354
450
  onParamsChange({
@@ -358,38 +454,35 @@ var DataTable = ({
358
454
  page: overrides.page != null ? overrides.page : activePage
359
455
  });
360
456
  }, [onParamsChange, columns, searchTerm, filterValues, sortState, activePage]);
361
- const resetPage = (0, import_react.useCallback)(() => {
457
+ const resetPage = (0, import_react2.useCallback)(() => {
362
458
  if (resetPageOnChange) {
363
459
  setCurrentPage(1);
364
460
  if (serverSide && onPageChange) onPageChange(1);
365
461
  }
366
462
  }, [resetPageOnChange, serverSide, onPageChange]);
367
- const handleSearchChange = (0, import_react.useCallback)((term) => {
463
+ const dispatchSearchChange = (0, import_react2.useCallback)((term) => {
464
+ lastAppliedSearchRef.current = term;
465
+ fireSearchCallback(term);
466
+ fireParamsChange({ search: term, page: resetPageOnChange ? 1 : void 0 });
467
+ }, [fireSearchCallback, fireParamsChange, resetPageOnChange]);
468
+ const dispatchSearchDebounced = useDebouncedDispatch(
469
+ internalSearchTerm,
470
+ searchDebounce,
471
+ dispatchSearchChange
472
+ );
473
+ const handleSearchChange = (0, import_react2.useCallback)((term) => {
368
474
  setInternalSearchTerm(term);
369
475
  resetPage();
370
- const dispatch = () => {
371
- lastAppliedSearchRef.current = term;
372
- fireSearchCallback(term);
373
- fireParamsChange({ search: term, page: resetPageOnChange ? 1 : void 0 });
374
- };
375
- if (searchDebounce > 0) {
376
- if (debounceRef.current) clearTimeout(debounceRef.current);
377
- debounceRef.current = setTimeout(dispatch, searchDebounce);
378
- } else {
379
- dispatch();
380
- }
381
- }, [searchDebounce, fireSearchCallback, fireParamsChange, resetPage, resetPageOnChange]);
382
- (0, import_react.useEffect)(() => () => {
383
- if (debounceRef.current) clearTimeout(debounceRef.current);
384
- }, []);
385
- const handleFilterChange = (0, import_react.useCallback)((name, value) => {
476
+ dispatchSearchDebounced(term);
477
+ }, [dispatchSearchDebounced, resetPage]);
478
+ const handleFilterChange = (0, import_react2.useCallback)((name, value) => {
386
479
  const next = { ...filterValues, [name]: value };
387
480
  setInternalFilterValues(next);
388
481
  if (serverSide && onFilterChange) onFilterChange(next);
389
482
  resetPage();
390
483
  fireParamsChange({ filters: next, page: resetPageOnChange ? 1 : void 0 });
391
484
  }, [filterValues, serverSide, onFilterChange, fireParamsChange, resetPage, resetPageOnChange]);
392
- const handleSortChange = (0, import_react.useCallback)((field) => {
485
+ const handleSortChange = (0, import_react2.useCallback)((field) => {
393
486
  const current = sortState[field] || "none";
394
487
  const nextDirection = current === "none" ? "ascending" : current === "ascending" ? "descending" : "none";
395
488
  const reset = {};
@@ -402,59 +495,23 @@ var DataTable = ({
402
495
  resetPage();
403
496
  fireParamsChange({ sort: next, page: resetPageOnChange ? 1 : void 0 });
404
497
  }, [sortState, columns, serverSide, onSortChange, fireParamsChange, resetPage, resetPageOnChange]);
405
- const handlePageChange = (0, import_react.useCallback)((page) => {
498
+ const handlePageChange = (0, import_react2.useCallback)((page) => {
406
499
  setCurrentPage(page);
407
500
  if (serverSide && onPageChange) onPageChange(page);
408
501
  fireParamsChange({ page });
409
502
  }, [serverSide, onPageChange, fireParamsChange]);
410
- const filteredData = (0, import_react.useMemo)(() => {
503
+ const filteredData = (0, import_react2.useMemo)(() => {
411
504
  if (serverSide) return data;
412
- let result = data;
413
- filters.forEach((filter) => {
414
- const value = filterValues[filter.name];
415
- if (!isFilterActive(filter, value)) return;
416
- const type = filter.type || "select";
417
- if (filter.filterFn) {
418
- result = result.filter((row) => filter.filterFn(row, value));
419
- } else if (type === "multiselect") {
420
- result = result.filter((row) => value.includes(row[filter.name]));
421
- } else if (type === "dateRange") {
422
- const fromTs = dateToTimestamp(value.from);
423
- const toTs = value.to ? dateToTimestamp(value.to) + 864e5 - 1 : null;
424
- result = result.filter((row) => {
425
- const rowTs = new Date(row[filter.name]).getTime();
426
- if (Number.isNaN(rowTs)) return false;
427
- if (fromTs && rowTs < fromTs) return false;
428
- if (toTs && rowTs > toTs) return false;
429
- return true;
430
- });
431
- } else {
432
- result = result.filter((row) => row[filter.name] === value);
433
- }
434
- });
505
+ let result = filterRows(data, filters, filterValues);
435
506
  if (searchTerm && searchFields.length > 0) {
436
- if (fuzzySearch) {
437
- const fuse = new import_fuse.default(result, {
438
- keys: searchFields,
439
- threshold: 0.4,
440
- distance: 100,
441
- ignoreLocation: true,
442
- ...fuzzyOptions
443
- });
444
- result = fuse.search(searchTerm).map((r) => r.item);
445
- } else {
446
- const term = searchTerm.toLowerCase();
447
- result = result.filter(
448
- (row) => searchFields.some((field) => {
449
- const val = row[field];
450
- return val && String(val).toLowerCase().includes(term);
451
- })
452
- );
453
- }
507
+ result = searchRows(result, searchTerm, searchFields, {
508
+ fuzzy: fuzzySearch,
509
+ fuzzyOptions
510
+ });
454
511
  }
455
512
  return result;
456
513
  }, [data, filterValues, searchTerm, filters, searchFields, serverSide, fuzzySearch, fuzzyOptions]);
457
- const sortedData = (0, import_react.useMemo)(() => {
514
+ const sortedData = (0, import_react2.useMemo)(() => {
458
515
  if (serverSide) return filteredData;
459
516
  const activeField = Object.keys(sortState).find((k) => sortState[k] !== "none");
460
517
  if (!activeField) return filteredData;
@@ -483,7 +540,7 @@ var DataTable = ({
483
540
  return 0;
484
541
  });
485
542
  }, [filteredData, sortState, serverSide, columns]);
486
- const groupedData = (0, import_react.useMemo)(() => {
543
+ const groupedData = (0, import_react2.useMemo)(() => {
487
544
  if (!groupBy) return null;
488
545
  const source = serverSide ? data : sortedData;
489
546
  const groups = {};
@@ -507,7 +564,7 @@ var DataTable = ({
507
564
  rows: groups[key]
508
565
  }));
509
566
  }, [sortedData, data, groupBy, serverSide]);
510
- const [expandedGroups, setExpandedGroups] = (0, import_react.useState)(() => {
567
+ const [expandedGroups, setExpandedGroups] = (0, import_react2.useState)(() => {
511
568
  if (!groupBy) return /* @__PURE__ */ new Set();
512
569
  const defaultExpanded = groupBy.defaultExpanded !== false;
513
570
  if (defaultExpanded && groupedData) {
@@ -515,7 +572,7 @@ var DataTable = ({
515
572
  }
516
573
  return /* @__PURE__ */ new Set();
517
574
  });
518
- (0, import_react.useEffect)(() => {
575
+ (0, import_react2.useEffect)(() => {
519
576
  if (!groupedData) return;
520
577
  const defaultExpanded = (groupBy == null ? void 0 : groupBy.defaultExpanded) !== false;
521
578
  if (defaultExpanded) {
@@ -526,7 +583,7 @@ var DataTable = ({
526
583
  });
527
584
  }
528
585
  }, [groupedData, groupBy]);
529
- const toggleGroup = (0, import_react.useCallback)((key) => {
586
+ const toggleGroup = (0, import_react2.useCallback)((key) => {
530
587
  setExpandedGroups((prev) => {
531
588
  const next = new Set(prev);
532
589
  if (next.has(key)) next.delete(key);
@@ -534,20 +591,20 @@ var DataTable = ({
534
591
  return next;
535
592
  });
536
593
  }, []);
537
- const datasetRows = (0, import_react.useMemo)(() => {
594
+ const datasetRows = (0, import_react2.useMemo)(() => {
538
595
  if (!groupedData) return serverSide ? data : sortedData;
539
596
  return groupedData.flatMap((group) => group.rows);
540
597
  }, [groupedData, sortedData, data, serverSide]);
541
598
  const totalItems = serverSide ? totalCount || data.length : datasetRows.length;
542
599
  const pageCount = Math.ceil(totalItems / pageSize);
543
- const paginatedRows = (0, import_react.useMemo)(() => {
600
+ const paginatedRows = (0, import_react2.useMemo)(() => {
544
601
  if (serverSide) return datasetRows;
545
602
  return datasetRows.slice(
546
603
  (activePage - 1) * pageSize,
547
604
  activePage * pageSize
548
605
  );
549
606
  }, [serverSide, datasetRows, activePage, pageSize]);
550
- const displayRows = (0, import_react.useMemo)(() => {
607
+ const displayRows = (0, import_react2.useMemo)(() => {
551
608
  if (!groupedData) return paginatedRows.map((row) => ({ type: "data", row }));
552
609
  const pageRows = new Set(paginatedRows);
553
610
  const rows = [];
@@ -562,7 +619,7 @@ var DataTable = ({
562
619
  return rows;
563
620
  }, [groupedData, paginatedRows, expandedGroups]);
564
621
  const footerData = serverSide ? data : filteredData;
565
- const activeChips = (0, import_react.useMemo)(() => {
622
+ const activeChips = (0, import_react2.useMemo)(() => {
566
623
  const chips = [];
567
624
  filters.forEach((filter) => {
568
625
  const value = filterValues[filter.name];
@@ -587,7 +644,7 @@ var DataTable = ({
587
644
  });
588
645
  return chips;
589
646
  }, [filterValues, filters]);
590
- const handleFilterRemove = (0, import_react.useCallback)((key) => {
647
+ const handleFilterRemove = (0, import_react2.useCallback)((key) => {
591
648
  if (key === "all") {
592
649
  const cleared = {};
593
650
  filters.forEach((f) => {
@@ -623,18 +680,19 @@ var DataTable = ({
623
680
  const resolvedDateFromLabel = (labels == null ? void 0 : labels.dateFrom) || "From";
624
681
  const resolvedDateToLabel = (labels == null ? void 0 : labels.dateTo) || "To";
625
682
  const resolvedLoadingLabel = (labels == null ? void 0 : labels.loading) || `Loading ${pluralLabel}...`;
683
+ const resolvedLoadingMessage = (labels == null ? void 0 : labels.loadingMessage) || "This should only take a moment.";
626
684
  const resolvedErrorTitle = (labels == null ? void 0 : labels.errorTitle) || "Something went wrong.";
627
685
  const resolvedErrorMessage = (labels == null ? void 0 : labels.errorMessage) || "An error occurred while loading data.";
628
686
  const resolvedRetryMessage = (labels == null ? void 0 : labels.retryMessage) || "Please try again.";
687
+ const resolvedShowClearFiltersButton = showClearFiltersButton ?? showFilterBadges;
629
688
  const recordCountLabel = rowCountText ? rowCountText(shownOnPageCount, displayCount) : displayCount === totalDataCount ? `${totalDataCount} ${countLabel(totalDataCount)}` : `${displayCount} of ${totalDataCount} ${countLabel(totalDataCount)}`;
630
- const [internalSelectedIds, setInternalSelectedIds] = (0, import_react.useState)(/* @__PURE__ */ new Set());
631
- const selectionResetRef = (0, import_react.useRef)("");
632
- (0, import_react.useEffect)(() => {
689
+ const [internalSelectedIds, setInternalSelectedIds] = (0, import_react2.useState)(/* @__PURE__ */ new Set());
690
+ (0, import_react2.useEffect)(() => {
633
691
  if (externalSelectedIds != null) {
634
692
  setInternalSelectedIds(new Set(externalSelectedIds));
635
693
  }
636
694
  }, [externalSelectedIds]);
637
- const selectionQueryKey = (0, import_react.useMemo)(() => {
695
+ const selectionQueryKey = (0, import_react2.useMemo)(() => {
638
696
  if (!resetSelectionOnQueryChange) return "";
639
697
  return toStableKey({
640
698
  search: searchTerm,
@@ -642,48 +700,47 @@ var DataTable = ({
642
700
  sort: serializeSortState(sortState)
643
701
  });
644
702
  }, [searchTerm, filterValues, sortState, resetSelectionOnQueryChange]);
645
- const combinedSelectionResetKey = (0, import_react.useMemo)(
703
+ const combinedSelectionResetKey = (0, import_react2.useMemo)(
646
704
  () => `${selectionQueryKey}::${selectionResetKey == null ? "" : toStableKey(selectionResetKey)}`,
647
705
  [selectionQueryKey, selectionResetKey]
648
706
  );
649
- (0, import_react.useEffect)(() => {
650
- if (!selectable || externalSelectedIds != null) {
651
- selectionResetRef.current = combinedSelectionResetKey;
652
- return;
653
- }
654
- if (selectionResetRef.current && selectionResetRef.current !== combinedSelectionResetKey) {
655
- setInternalSelectedIds(/* @__PURE__ */ new Set());
656
- }
657
- selectionResetRef.current = combinedSelectionResetKey;
658
- }, [combinedSelectionResetKey, selectable, externalSelectedIds]);
707
+ const clearSelection = (0, import_react2.useCallback)(() => setInternalSelectedIds(/* @__PURE__ */ new Set()), []);
708
+ useSelectionReset({
709
+ resetKey: combinedSelectionResetKey,
710
+ enabled: selectable,
711
+ isControlled: externalSelectedIds != null,
712
+ clearSelection
713
+ });
659
714
  const selectedIds = externalSelectedIds != null ? new Set(externalSelectedIds) : internalSelectedIds;
660
- const showToolbarCount = showRowCount && !title && displayCount > 0 && !(showSelectionBar && selectable && selectedIds.size > 0);
661
- const showTitleCount = showRowCount && !!title && displayCount > 0 && !(showSelectionBar && selectable && selectedIds.size > 0);
662
- const hasToolbarContent = showSearch && searchFields.length > 0 || filters.length > 0 || activeChips.length > 0 && (showFilterBadges || showClearFiltersButton) || showToolbarCount;
715
+ const showToolbarCount = showRowCount && displayCount > 0 && !(showSelectionBar && selectable && selectedIds.size > 0);
716
+ const hasToolbarLeft = showSearch && searchFields.length > 0 || filters.length > 0 || activeChips.length > 0 && (showFilterBadges || resolvedShowClearFiltersButton);
717
+ const countInTitleRow = !!title && showToolbarCount && !hasToolbarLeft;
718
+ const countInToolbar = showToolbarCount && !countInTitleRow;
719
+ const hasToolbarContent = hasToolbarLeft || countInToolbar;
663
720
  const showRowActionsColumn = !!rowActions && !(hideRowActionsWhenSelectionActive && selectable && selectedIds.size > 0);
664
- const applySelection = (0, import_react.useCallback)((nextSet) => {
721
+ const applySelection = (0, import_react2.useCallback)((nextSet) => {
665
722
  if (externalSelectedIds == null) {
666
723
  setInternalSelectedIds(nextSet);
667
724
  }
668
725
  if (onSelectionChange) onSelectionChange([...nextSet]);
669
726
  }, [externalSelectedIds, onSelectionChange]);
670
- const pageRowIds = (0, import_react.useMemo)(() => {
727
+ const pageRowIds = (0, import_react2.useMemo)(() => {
671
728
  if (serverSide) {
672
729
  return data.map((row) => row[rowIdField]).filter((id) => id != null);
673
730
  }
674
731
  return displayRows.filter((r) => r.type === "data").map((r) => r.row[rowIdField]).filter((id) => id != null);
675
732
  }, [serverSide, data, displayRows, rowIdField]);
676
- const allRowIds = (0, import_react.useMemo)(
733
+ const allRowIds = (0, import_react2.useMemo)(
677
734
  () => datasetRows.map((row) => row[rowIdField]).filter((id) => id != null),
678
735
  [datasetRows, rowIdField]
679
736
  );
680
- const handleSelectRow = (0, import_react.useCallback)((rowId, checked) => {
737
+ const handleSelectRow = (0, import_react2.useCallback)((rowId, checked) => {
681
738
  const next = new Set(selectedIds);
682
739
  if (checked) next.add(rowId);
683
740
  else next.delete(rowId);
684
741
  applySelection(next);
685
742
  }, [selectedIds, applySelection]);
686
- const handleSelectAll = (0, import_react.useCallback)((checked) => {
743
+ const handleSelectAll = (0, import_react2.useCallback)((checked) => {
687
744
  const next = new Set(selectedIds);
688
745
  pageRowIds.forEach((id) => {
689
746
  if (checked) next.add(id);
@@ -691,10 +748,10 @@ var DataTable = ({
691
748
  });
692
749
  applySelection(next);
693
750
  }, [selectedIds, pageRowIds, applySelection]);
694
- const allVisibleSelected = (0, import_react.useMemo)(() => {
751
+ const allVisibleSelected = (0, import_react2.useMemo)(() => {
695
752
  return pageRowIds.length > 0 && pageRowIds.every((id) => selectedIds.has(id));
696
753
  }, [pageRowIds, selectedIds]);
697
- const handleSelectAllRows = (0, import_react.useCallback)(() => {
754
+ const handleSelectAllRows = (0, import_react2.useCallback)(() => {
698
755
  const idsToAdd = serverSide ? pageRowIds : allRowIds;
699
756
  const next = new Set(selectedIds);
700
757
  idsToAdd.forEach((id) => next.add(id));
@@ -707,13 +764,13 @@ var DataTable = ({
707
764
  });
708
765
  }
709
766
  }, [serverSide, pageRowIds, allRowIds, selectedIds, applySelection, onSelectAllRequest, totalCount, data.length]);
710
- const handleDeselectAll = (0, import_react.useCallback)(() => {
767
+ const handleDeselectAll = (0, import_react2.useCallback)(() => {
711
768
  applySelection(/* @__PURE__ */ new Set());
712
769
  }, [applySelection]);
713
- const [editingCell, setEditingCell] = (0, import_react.useState)(null);
714
- const [editValue, setEditValue] = (0, import_react.useState)(null);
715
- const [editError, setEditError] = (0, import_react.useState)(null);
716
- const startEditing = (0, import_react.useCallback)((rowId, field, currentValue) => {
770
+ const [editingCell, setEditingCell] = (0, import_react2.useState)(null);
771
+ const [editValue, setEditValue] = (0, import_react2.useState)(null);
772
+ const [editError, setEditError] = (0, import_react2.useState)(null);
773
+ const startEditing = (0, import_react2.useCallback)((rowId, field, currentValue) => {
717
774
  setEditingCell({ rowId, field });
718
775
  setEditValue(currentValue);
719
776
  setEditError(null);
@@ -722,13 +779,13 @@ var DataTable = ({
722
779
  if (row) onEditStart(row, field, currentValue);
723
780
  }
724
781
  }, [onEditStart, data, rowIdField]);
725
- const commitEdit = (0, import_react.useCallback)((row, field, value, options = {}) => {
782
+ const commitEdit = (0, import_react2.useCallback)((row, field, value, options = {}) => {
726
783
  const { keepEditing = false } = options;
727
784
  const col = columns.find((c) => c.field === field);
728
785
  if (col == null ? void 0 : col.editValidate) {
729
- const result = col.editValidate(value, row);
730
- if (result !== true && result !== void 0 && result !== null) {
731
- setEditError(typeof result === "string" ? result : "Invalid value");
786
+ const err = editValidationError(col.editValidate(value, row));
787
+ if (err) {
788
+ setEditError(err);
732
789
  return false;
733
790
  }
734
791
  }
@@ -756,14 +813,7 @@ var DataTable = ({
756
813
  const extra = col.editProps || {};
757
814
  const validate = col.editValidate;
758
815
  const validationProps = validate && editError ? { error: true, validationMessage: editError } : {};
759
- const onInputValidate = validate ? (val) => {
760
- const result = validate(val, row);
761
- if (result !== true && result !== void 0 && result !== null) {
762
- setEditError(typeof result === "string" ? result : "Invalid value");
763
- } else {
764
- setEditError(null);
765
- }
766
- } : void 0;
816
+ const onInputValidate = validate ? (val) => setEditError(editValidationError(validate(val, row))) : void 0;
767
817
  const handleInput = (val) => {
768
818
  setEditValue(val);
769
819
  if (onInputValidate) onInputValidate(val);
@@ -781,42 +831,42 @@ var DataTable = ({
781
831
  };
782
832
  switch (type) {
783
833
  case "textarea":
784
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TextArea, { ...extra, name: fieldName, label: "", value: editValue ?? "", onChange: commit, onBlur: exitEdit, ...validationProps, onInput: handleInput });
834
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TextArea, { ...extra, name: fieldName, label: "", value: editValue ?? "", onChange: commit, onBlur: exitEdit, ...validationProps, onInput: handleInput });
785
835
  case "number":
786
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.NumberInput, { ...extra, name: fieldName, label: "", value: editValue, onChange: commit, onBlur: exitEdit, ...validationProps, onInput: handleInput });
836
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.NumberInput, { ...extra, name: fieldName, label: "", value: editValue, onChange: commit, onBlur: exitEdit, ...validationProps, onInput: handleInput });
787
837
  case "currency":
788
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.CurrencyInput, { currencyCode: "USD", ...extra, name: fieldName, label: "", value: editValue, onChange: commit, onBlur: exitEdit, ...validationProps, onInput: handleInput });
838
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.CurrencyInput, { currencyCode: "USD", ...extra, name: fieldName, label: "", value: editValue, onChange: commit, onBlur: exitEdit, ...validationProps, onInput: handleInput });
789
839
  case "stepper":
790
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.StepperInput, { ...extra, name: fieldName, label: "", value: editValue, onChange: commit, onBlur: exitEdit, ...validationProps, onInput: handleInput });
840
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.StepperInput, { ...extra, name: fieldName, label: "", value: editValue, onChange: commit, onBlur: exitEdit, ...validationProps, onInput: handleInput });
791
841
  case "select":
792
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Select, { variant: "transparent", ...extra, name: fieldName, label: "", value: editValue, onChange: commit, options: resolveEditOptions(col, data) });
842
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Select, { variant: "transparent", ...extra, name: fieldName, label: "", value: editValue, onChange: commit, options: resolveEditOptions(col, data) });
793
843
  case "multiselect":
794
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.MultiSelect, { ...extra, name: fieldName, label: "", value: editValue || [], onChange: commit, options: resolveEditOptions(col, data) });
844
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.MultiSelect, { ...extra, name: fieldName, label: "", value: editValue || [], onChange: commit, options: resolveEditOptions(col, data) });
795
845
  case "date":
796
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.DateInput, { ...extra, name: fieldName, label: "", value: editValue, onChange: commit });
846
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.DateInput, { ...extra, name: fieldName, label: "", value: editValue, onChange: commit });
797
847
  case "time":
798
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TimeInput, { ...extra, name: fieldName, label: "", value: editValue, onChange: commit });
848
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TimeInput, { ...extra, name: fieldName, label: "", value: editValue, onChange: commit });
799
849
  case "datetime":
800
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "xs", wrap: "nowrap" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.DateInput, { ...extra, name: `${fieldName}-date`, label: "", value: editValue == null ? void 0 : editValue.date, onChange: (val) => {
850
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", align: "center", gap: "xs", wrap: "nowrap" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.DateInput, { ...extra, name: `${fieldName}-date`, label: "", value: editValue == null ? void 0 : editValue.date, onChange: (val) => {
801
851
  const next = { ...editValue, date: val };
802
852
  handleInput(next);
803
853
  commitEdit(row, col.field, next, { keepEditing: true });
804
- }, onBlur: maybeExitDatetimeEdit }), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TimeInput, { ...extra.timeProps || {}, name: `${fieldName}-time`, label: "", value: editValue == null ? void 0 : editValue.time, onChange: (val) => {
854
+ }, onBlur: maybeExitDatetimeEdit }), /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TimeInput, { ...extra.timeProps || {}, name: `${fieldName}-time`, label: "", value: editValue == null ? void 0 : editValue.time, onChange: (val) => {
805
855
  const next = { ...editValue, time: val };
806
856
  handleInput(next);
807
857
  commitEdit(row, col.field, next, { keepEditing: true });
808
858
  }, onBlur: maybeExitDatetimeEdit }));
809
859
  case "toggle":
810
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Toggle, { ...extra, name: fieldName, label: "", checked: !!editValue, onChange: commit });
860
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Toggle, { ...extra, name: fieldName, label: "", checked: !!editValue, onChange: commit });
811
861
  case "checkbox":
812
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Checkbox, { ...extra, name: fieldName, checked: !!editValue, onChange: commit });
862
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Checkbox, { ...extra, name: fieldName, checked: !!editValue, onChange: commit });
813
863
  default:
814
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Input, { ...extra, name: fieldName, label: "", value: editValue ?? "", onChange: commit, onBlur: exitEdit, ...validationProps, onInput: handleInput });
864
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Input, { ...extra, name: fieldName, label: "", value: editValue ?? "", onChange: commit, onBlur: exitEdit, ...validationProps, onInput: handleInput });
815
865
  }
816
866
  };
817
867
  const resolvedEditMode = editMode || (columns.some((col) => col.editable) ? "discrete" : null);
818
868
  const useColumnRendering = selectable || !!resolvedEditMode || editingRowId != null || showRowActionsColumn || !renderRow;
819
- const autoWidths = (0, import_react.useMemo)(
869
+ const autoWidths = (0, import_react2.useMemo)(
820
870
  () => autoWidth ? computeAutoWidths(columns, data) : {},
821
871
  [columns, data, autoWidth]
822
872
  );
@@ -829,7 +879,7 @@ var DataTable = ({
829
879
  var _a;
830
880
  return col.cellWidth || col.width || ((_a = autoWidths[col.field]) == null ? void 0 : _a.cellWidth) || defaultWidth;
831
881
  };
832
- const [inlineErrors, setInlineErrors] = (0, import_react.useState)({});
882
+ const [inlineErrors, setInlineErrors] = (0, import_react2.useState)({});
833
883
  const renderInlineControl = (col, row) => {
834
884
  const type = col.editType || "text";
835
885
  const rowId = row[rowIdField];
@@ -839,9 +889,9 @@ var DataTable = ({
839
889
  const validate = col.editValidate;
840
890
  const fire = (val) => {
841
891
  if (validate) {
842
- const result = validate(val, row);
843
- if (result !== true && result !== void 0 && result !== null) {
844
- setInlineErrors((prev) => ({ ...prev, [cellKey]: typeof result === "string" ? result : "Invalid value" }));
892
+ const err = editValidationError(validate(val, row));
893
+ if (err) {
894
+ setInlineErrors((prev) => ({ ...prev, [cellKey]: err }));
845
895
  return;
846
896
  }
847
897
  setInlineErrors((prev) => {
@@ -856,16 +906,13 @@ var DataTable = ({
856
906
  const cellError = inlineErrors[cellKey];
857
907
  const validationProps = cellError ? { error: true, validationMessage: cellError } : {};
858
908
  const onInputValidate = validate ? (val) => {
859
- const result = validate(val, row);
860
- if (result !== true && result !== void 0 && result !== null) {
861
- setInlineErrors((prev) => ({ ...prev, [cellKey]: typeof result === "string" ? result : "Invalid value" }));
862
- } else {
863
- setInlineErrors((prev) => {
864
- const next = { ...prev };
865
- delete next[cellKey];
866
- return next;
867
- });
868
- }
909
+ const err = editValidationError(validate(val, row));
910
+ setInlineErrors((prev) => {
911
+ if (err) return { ...prev, [cellKey]: err };
912
+ const next = { ...prev };
913
+ delete next[cellKey];
914
+ return next;
915
+ });
869
916
  } : void 0;
870
917
  const emitInput = (val) => {
871
918
  if (onInputValidate) onInputValidate(val);
@@ -873,33 +920,33 @@ var DataTable = ({
873
920
  };
874
921
  switch (type) {
875
922
  case "textarea":
876
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TextArea, { ...extra, name: fieldName, label: "", value: value ?? "", onChange: fire, ...validationProps, onInput: emitInput });
923
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TextArea, { ...extra, name: fieldName, label: "", value: value ?? "", onChange: fire, ...validationProps, onInput: emitInput });
877
924
  case "number":
878
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.NumberInput, { ...extra, name: fieldName, label: "", value, onChange: fire, ...validationProps, onInput: emitInput });
925
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.NumberInput, { ...extra, name: fieldName, label: "", value, onChange: fire, ...validationProps, onInput: emitInput });
879
926
  case "currency":
880
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.CurrencyInput, { currencyCode: "USD", ...extra, name: fieldName, label: "", value, onChange: fire, ...validationProps, onInput: emitInput });
927
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.CurrencyInput, { currencyCode: "USD", ...extra, name: fieldName, label: "", value, onChange: fire, ...validationProps, onInput: emitInput });
881
928
  case "stepper":
882
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.StepperInput, { ...extra, name: fieldName, label: "", value, onChange: fire, ...validationProps, onInput: emitInput });
929
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.StepperInput, { ...extra, name: fieldName, label: "", value, onChange: fire, ...validationProps, onInput: emitInput });
883
930
  case "select":
884
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Select, { ...extra, name: fieldName, label: "", value, onChange: fire, options: resolveEditOptions(col, data) });
931
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Select, { ...extra, name: fieldName, label: "", value, onChange: fire, options: resolveEditOptions(col, data) });
885
932
  case "multiselect":
886
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.MultiSelect, { ...extra, name: fieldName, label: "", value: value || [], onChange: fire, options: resolveEditOptions(col, data) });
933
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.MultiSelect, { ...extra, name: fieldName, label: "", value: value || [], onChange: fire, options: resolveEditOptions(col, data) });
887
934
  case "date":
888
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.DateInput, { ...extra, name: fieldName, label: "", value, onChange: fire });
935
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.DateInput, { ...extra, name: fieldName, label: "", value, onChange: fire });
889
936
  case "time":
890
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TimeInput, { ...extra, name: fieldName, label: "", value, onChange: fire });
937
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TimeInput, { ...extra, name: fieldName, label: "", value, onChange: fire });
891
938
  case "datetime":
892
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "xs", wrap: "nowrap" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.DateInput, { ...extra, name: `${fieldName}-date`, label: "", value: value == null ? void 0 : value.date, onChange: (val) => {
939
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", align: "center", gap: "xs", wrap: "nowrap" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.DateInput, { ...extra, name: `${fieldName}-date`, label: "", value: value == null ? void 0 : value.date, onChange: (val) => {
893
940
  fire({ ...value, date: val });
894
- } }), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TimeInput, { ...extra.timeProps || {}, name: `${fieldName}-time`, label: "", value: value == null ? void 0 : value.time, onChange: (val) => {
941
+ } }), /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TimeInput, { ...extra.timeProps || {}, name: `${fieldName}-time`, label: "", value: value == null ? void 0 : value.time, onChange: (val) => {
895
942
  fire({ ...value, time: val });
896
943
  } }));
897
944
  case "toggle":
898
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Toggle, { ...extra, name: fieldName, label: "", checked: !!value, onChange: fire });
945
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Toggle, { ...extra, name: fieldName, label: "", checked: !!value, onChange: fire });
899
946
  case "checkbox":
900
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Checkbox, { ...extra, name: fieldName, checked: !!value, onChange: fire });
947
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Checkbox, { ...extra, name: fieldName, checked: !!value, onChange: fire });
901
948
  default:
902
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Input, { ...extra, name: fieldName, label: "", value: value ?? "", onChange: fire, ...validationProps, onInput: emitInput });
949
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Input, { ...extra, name: fieldName, label: "", value: value ?? "", onChange: fire, ...validationProps, onInput: emitInput });
903
950
  }
904
951
  };
905
952
  const renderCellContent = (row, col) => {
@@ -919,30 +966,30 @@ var DataTable = ({
919
966
  if (col.renderCell) {
920
967
  const content2 = col.renderCell(rawValue, row);
921
968
  if (col.editable) {
922
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Link, { variant: "dark", onClick: () => startEditing(rowId, col.field, rawValue) }, content2 || "--");
969
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Link, { variant: "dark", onClick: () => startEditing(rowId, col.field, rawValue) }, content2 || "--");
923
970
  }
924
971
  return content2;
925
972
  }
926
973
  if (col.editable) {
927
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { truncate: { tooltipText: rawStr } }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Link, { variant: "dark", onClick: () => startEditing(rowId, col.field, rawValue) }, rawStr || "--"));
974
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, { truncate: { tooltipText: rawStr } }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Link, { variant: "dark", onClick: () => startEditing(rowId, col.field, rawValue) }, rawStr || "--"));
928
975
  }
929
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { truncate: { tooltipText: rawStr } }, rawStr);
976
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, { truncate: { tooltipText: rawStr } }, rawStr);
930
977
  }
931
978
  const maxLen = typeof col.truncate === "number" ? col.truncate : col.truncate.maxLength || 100;
932
979
  if (rawStr.length > maxLen) {
933
980
  const truncatedStr = rawStr.slice(0, maxLen) + "\u2026";
934
981
  const content2 = col.renderCell ? col.renderCell(truncatedStr, row) : truncatedStr;
935
982
  if (col.editable) {
936
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Link, { variant: "dark", onClick: () => startEditing(rowId, col.field, rawValue) }, content2 || "--");
983
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Link, { variant: "dark", onClick: () => startEditing(rowId, col.field, rawValue) }, content2 || "--");
937
984
  }
938
- return col.renderCell ? content2 : /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { truncate: { tooltipText: rawStr } }, content2 || "--");
985
+ return col.renderCell ? content2 : /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, { truncate: { tooltipText: rawStr } }, content2 || "--");
939
986
  }
940
987
  }
941
988
  const content = col.renderCell ? col.renderCell(rawValue, row) : rawValue;
942
989
  const isEmpty = content == null || content === "";
943
990
  if (col.editable) {
944
- return /* @__PURE__ */ import_react.default.createElement(
945
- import_ui_extensions.Link,
991
+ return /* @__PURE__ */ import_react2.default.createElement(
992
+ import_ui_extensions2.Link,
946
993
  {
947
994
  variant: "dark",
948
995
  onClick: () => startEditing(rowId, col.field, rawValue)
@@ -955,8 +1002,8 @@ var DataTable = ({
955
1002
  const renderFilterControl = (filter) => {
956
1003
  const type = filter.type || "select";
957
1004
  if (type === "multiselect") {
958
- return /* @__PURE__ */ import_react.default.createElement(
959
- import_ui_extensions.MultiSelect,
1005
+ return /* @__PURE__ */ import_react2.default.createElement(
1006
+ import_ui_extensions2.MultiSelect,
960
1007
  {
961
1008
  key: filter.name,
962
1009
  name: `filter-${filter.name}`,
@@ -970,8 +1017,8 @@ var DataTable = ({
970
1017
  }
971
1018
  if (type === "dateRange") {
972
1019
  const rangeVal = filterValues[filter.name] || { from: null, to: null };
973
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { key: filter.name, direction: "row", align: "center", gap: "xs" }, /* @__PURE__ */ import_react.default.createElement(
974
- import_ui_extensions.DateInput,
1020
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { key: filter.name, direction: "row", align: "center", gap: "xs" }, /* @__PURE__ */ import_react2.default.createElement(
1021
+ import_ui_extensions2.DateInput,
975
1022
  {
976
1023
  name: `filter-${filter.name}-from`,
977
1024
  label: "",
@@ -980,8 +1027,8 @@ var DataTable = ({
980
1027
  value: rangeVal.from,
981
1028
  onChange: (val) => handleFilterChange(filter.name, { ...rangeVal, from: val })
982
1029
  }
983
- ), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Icon, { name: "dataSync", size: "sm" }), /* @__PURE__ */ import_react.default.createElement(
984
- import_ui_extensions.DateInput,
1030
+ ), /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Icon, { name: "dataSync", size: "sm" }), /* @__PURE__ */ import_react2.default.createElement(
1031
+ import_ui_extensions2.DateInput,
985
1032
  {
986
1033
  size: "sm",
987
1034
  name: `filter-${filter.name}-to`,
@@ -993,8 +1040,8 @@ var DataTable = ({
993
1040
  }
994
1041
  ));
995
1042
  }
996
- return /* @__PURE__ */ import_react.default.createElement(
997
- import_ui_extensions.Select,
1043
+ return /* @__PURE__ */ import_react2.default.createElement(
1044
+ import_ui_extensions2.Select,
998
1045
  {
999
1046
  key: filter.name,
1000
1047
  name: `filter-${filter.name}`,
@@ -1009,33 +1056,33 @@ var DataTable = ({
1009
1056
  }
1010
1057
  );
1011
1058
  };
1012
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "column", gap: "xs" }, title && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", justify: "between", gap: "sm" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Heading, null, title), showTitleCount && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { variant: "microcopy", format: rowCountBold ? { fontWeight: "bold" } : void 0 }, recordCountLabel)), hasToolbarContent && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { flex: 3 }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "column", gap: "sm" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "sm", wrap: "wrap" }, showSearch && searchFields.length > 0 && /* @__PURE__ */ import_react.default.createElement(
1013
- import_ui_extensions.SearchInput,
1059
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "column", gap: "xs" }, title && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", align: "center", justify: "between", gap: "sm" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, { format: { fontWeight: "demibold" } }, title), countInTitleRow && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, { variant: "microcopy", format: rowCountBold ? { fontWeight: "bold" } : void 0 }, recordCountLabel)), hasToolbarContent && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Box, { flex: 3 }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "column", gap: "sm" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", align: "center", gap: "sm", wrap: "wrap" }, showSearch && searchFields.length > 0 && /* @__PURE__ */ import_react2.default.createElement(
1060
+ import_ui_extensions2.SearchInput,
1014
1061
  {
1015
1062
  name: "datatable-search",
1016
1063
  placeholder: searchPlaceholder,
1017
1064
  value: internalSearchTerm,
1018
1065
  onChange: handleSearchChange
1019
1066
  }
1020
- ), filters.slice(0, filterInlineLimit).map(renderFilterControl), filters.length > filterInlineLimit && /* @__PURE__ */ import_react.default.createElement(
1021
- import_ui_extensions.Button,
1067
+ ), filters.slice(0, filterInlineLimit).map(renderFilterControl), filters.length > filterInlineLimit && /* @__PURE__ */ import_react2.default.createElement(
1068
+ import_ui_extensions2.Button,
1022
1069
  {
1023
1070
  variant: "transparent",
1024
1071
  size: "small",
1025
1072
  onClick: () => setShowMoreFilters((prev) => !prev)
1026
1073
  },
1027
- /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Icon, { name: "filter", size: "sm" }),
1074
+ /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Icon, { name: "filter", size: "sm" }),
1028
1075
  " ",
1029
1076
  resolvedFiltersButtonLabel
1030
- )), showMoreFilters && filters.length > filterInlineLimit && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "sm", wrap: "wrap" }, filters.slice(filterInlineLimit).map(renderFilterControl)), activeChips.length > 0 && (showFilterBadges || showClearFiltersButton) && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "sm", wrap: "wrap" }, showFilterBadges && activeChips.map((chip) => /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Tag, { key: chip.key, variant: "default", onDelete: () => handleFilterRemove(chip.key) }, chip.label)), showClearFiltersButton && /* @__PURE__ */ import_react.default.createElement(
1031
- import_ui_extensions.Button,
1077
+ )), showMoreFilters && filters.length > filterInlineLimit && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", align: "center", gap: "sm", wrap: "wrap" }, filters.slice(filterInlineLimit).map(renderFilterControl)), activeChips.length > 0 && (showFilterBadges || resolvedShowClearFiltersButton) && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", align: "center", gap: "sm", wrap: "wrap" }, showFilterBadges && activeChips.map((chip) => /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Tag, { key: chip.key, variant: "default", onDelete: () => handleFilterRemove(chip.key) }, chip.label)), resolvedShowClearFiltersButton && /* @__PURE__ */ import_react2.default.createElement(
1078
+ import_ui_extensions2.Button,
1032
1079
  {
1033
1080
  variant: "transparent",
1034
1081
  size: "extra-small",
1035
1082
  onClick: () => handleFilterRemove("all")
1036
1083
  },
1037
1084
  resolvedClearAllLabel
1038
- )))), showToolbarCount && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { flex: 1, alignSelf: "end" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", justify: "end" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { variant: "microcopy", format: rowCountBold ? { fontWeight: "bold" } : void 0 }, recordCountLabel)))), showSelectionBar && selectable && selectedIds.size > 0 && (renderSelectionBar ? renderSelectionBar({
1085
+ )))), countInToolbar && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Box, { flex: 1, alignSelf: "end" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", justify: "end" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, { variant: "microcopy", format: rowCountBold ? { fontWeight: "bold" } : void 0 }, recordCountLabel)))), showSelectionBar && selectable && selectedIds.size > 0 && (renderSelectionBar ? renderSelectionBar({
1039
1086
  selectedIds,
1040
1087
  selectedCount: selectedIds.size,
1041
1088
  displayCount,
@@ -1044,23 +1091,27 @@ var DataTable = ({
1044
1091
  onSelectAll: handleSelectAllRows,
1045
1092
  onDeselectAll: handleDeselectAll,
1046
1093
  selectionActions
1047
- }) : /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { flex: 3 }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "sm", wrap: "nowrap" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { inline: true, format: { fontWeight: "demibold" } }, typeof resolvedSelectedLabel === "function" ? resolvedSelectedLabel(selectedIds.size, countLabel(selectedIds.size)) : resolvedSelectedLabel), selectedIds.size < (serverSide ? totalCount || data.length : allRowIds.length) && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Button, { variant: "transparent", size: "extra-small", onClick: handleSelectAllRows }, typeof resolvedSelectAllLabel === "function" ? resolvedSelectAllLabel(displayCount, countLabel(displayCount)) : resolvedSelectAllLabel), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Button, { variant: "transparent", size: "extra-small", onClick: handleDeselectAll }, resolvedDeselectAllLabel), selectionActions.map((action, i) => /* @__PURE__ */ import_react.default.createElement(
1048
- import_ui_extensions.Button,
1094
+ }) : /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", gap: "sm" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Box, { flex: 3 }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", align: "center", gap: "sm", wrap: "nowrap" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, { inline: true, format: { fontWeight: "demibold" } }, typeof resolvedSelectedLabel === "function" ? resolvedSelectedLabel(selectedIds.size, countLabel(selectedIds.size)) : resolvedSelectedLabel), selectedIds.size < (serverSide ? totalCount || data.length : allRowIds.length) && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Button, { variant: "transparent", size: "extra-small", onClick: handleSelectAllRows }, typeof resolvedSelectAllLabel === "function" ? resolvedSelectAllLabel(displayCount, countLabel(displayCount)) : resolvedSelectAllLabel), /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Button, { variant: "transparent", size: "extra-small", onClick: handleDeselectAll }, resolvedDeselectAllLabel), selectionActions.map((action, i) => /* @__PURE__ */ import_react2.default.createElement(
1095
+ import_ui_extensions2.Button,
1049
1096
  {
1050
1097
  key: i,
1051
1098
  variant: action.variant || "transparent",
1052
1099
  size: "extra-small",
1053
1100
  onClick: () => action.onClick([...selectedIds])
1054
1101
  },
1055
- action.icon && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Icon, { name: action.icon, size: "sm" }),
1102
+ action.icon && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Icon, { name: action.icon, size: "sm" }),
1056
1103
  " ",
1057
1104
  action.label
1058
- )))), showRowCount && displayCount > 0 && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Box, { flex: 1, alignSelf: "center" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", justify: "end" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { variant: "microcopy", format: rowCountBold ? { fontWeight: "bold" } : void 0 }, recordCountLabel))))), loading ? renderLoadingState ? renderLoadingState({ label: resolvedLoadingLabel }) : /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.LoadingSpinner, { label: resolvedLoadingLabel, layout: "centered" }) : error ? renderErrorState ? renderErrorState({
1105
+ )))), showRowCount && displayCount > 0 && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Box, { flex: 1, alignSelf: "center" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", justify: "end" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, { variant: "microcopy", format: rowCountBold ? { fontWeight: "bold" } : void 0 }, recordCountLabel))))), loading ? renderLoadingState ? renderLoadingState({ label: resolvedLoadingLabel }) : (
1106
+ // Same EmptyState layout as the empty state, just the "building" image
1107
+ // + a loading message — so loading and empty match with no layout shift.
1108
+ /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Tile, null, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "column", align: "center", justify: "center" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.EmptyState, { title: resolvedLoadingLabel, imageName: "building", layout: "vertical" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, null, resolvedLoadingMessage))))
1109
+ ) : error ? renderErrorState ? renderErrorState({
1059
1110
  error,
1060
1111
  title: typeof error === "string" ? error : resolvedErrorTitle,
1061
1112
  message: typeof error === "string" ? resolvedRetryMessage : resolvedErrorMessage
1062
- }) : /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.ErrorState, { title: typeof error === "string" ? error : resolvedErrorTitle }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, null, typeof error === "string" ? resolvedRetryMessage : resolvedErrorMessage)) : displayRows.length === 0 ? renderEmptyState ? renderEmptyState({ title: resolvedEmptyTitle, message: resolvedEmptyMessage }) : /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "column", align: "center", justify: "center" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.EmptyState, { title: resolvedEmptyTitle, layout: "vertical" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, null, resolvedEmptyMessage))) : /* @__PURE__ */ import_react.default.createElement(
1063
- import_ui_extensions.Table,
1113
+ }) : /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.ErrorState, { title: typeof error === "string" ? error : resolvedErrorTitle }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, null, typeof error === "string" ? resolvedRetryMessage : resolvedErrorMessage)) : displayRows.length === 0 ? renderEmptyState ? renderEmptyState({ title: resolvedEmptyTitle, message: resolvedEmptyMessage }) : /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Tile, null, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "column", align: "center", justify: "center" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.EmptyState, { title: resolvedEmptyTitle, layout: "vertical" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, null, resolvedEmptyMessage)))) : /* @__PURE__ */ import_react2.default.createElement(
1114
+ import_ui_extensions2.Table,
1064
1115
  {
1065
1116
  bordered,
1066
1117
  flush,
@@ -1072,8 +1123,8 @@ var DataTable = ({
1072
1123
  showButtonLabels,
1073
1124
  ...maxVisiblePageButtons != null ? { maxVisiblePageButtons } : {}
1074
1125
  },
1075
- /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableHead, null, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableRow, null, selectable && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableHeader, { width: "min" }, /* @__PURE__ */ import_react.default.createElement(
1076
- import_ui_extensions.Checkbox,
1126
+ /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableHead, null, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableRow, null, selectable && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableHeader, { width: "min" }, /* @__PURE__ */ import_react2.default.createElement(
1127
+ import_ui_extensions2.Checkbox,
1077
1128
  {
1078
1129
  name: "datatable-select-all",
1079
1130
  "aria-label": "Select all rows",
@@ -1082,8 +1133,8 @@ var DataTable = ({
1082
1133
  }
1083
1134
  )), columns.map((col) => {
1084
1135
  const headerAlign = resolvedEditMode === "inline" && col.editable ? void 0 : col.align;
1085
- return /* @__PURE__ */ import_react.default.createElement(
1086
- import_ui_extensions.TableHeader,
1136
+ return /* @__PURE__ */ import_react2.default.createElement(
1137
+ import_ui_extensions2.TableHeader,
1087
1138
  {
1088
1139
  key: col.field,
1089
1140
  width: getHeaderWidth(col),
@@ -1091,22 +1142,22 @@ var DataTable = ({
1091
1142
  sortDirection: col.sortable ? sortState[col.field] || "none" : "never",
1092
1143
  onSortChange: col.sortable ? () => handleSortChange(col.field) : void 0
1093
1144
  },
1094
- col.description ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, col.label, "\xA0", /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Link, { inline: true, variant: "dark", overlay: /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Tooltip, null, col.description) }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Icon, { name: "info", screenReaderText: typeof col.description === "string" ? col.description : void 0 }))) : col.label
1145
+ col.description ? /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, col.label, "\xA0", /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Link, { inline: true, variant: "dark", overlay: /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Tooltip, null, col.description) }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Icon, { name: "info", screenReaderText: typeof col.description === "string" ? col.description : void 0 }))) : col.label
1095
1146
  );
1096
- }), showRowActionsColumn && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableHeader, { width: "min" }))),
1097
- /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableBody, null, displayRows.map(
1098
- (item, idx) => item.type === "group-header" ? /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableRow, { key: `group-${item.group.key}` }, selectable && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableCell, { width: "min" }), columns.map((col, colIdx) => {
1147
+ }), showRowActionsColumn && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableHeader, { width: "min" }))),
1148
+ /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableBody, null, displayRows.map(
1149
+ (item, idx) => item.type === "group-header" ? /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableRow, { key: `group-${item.group.key}` }, selectable && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableCell, { width: "min" }), columns.map((col, colIdx) => {
1099
1150
  var _a, _b, _c;
1100
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableCell, { key: col.field, width: getCellWidth(col), align: colIdx === 0 ? void 0 : col.align }, colIdx === 0 ? /* @__PURE__ */ import_react.default.createElement(
1101
- import_ui_extensions.Link,
1151
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableCell, { key: col.field, width: getCellWidth(col), align: colIdx === 0 ? void 0 : col.align }, colIdx === 0 ? /* @__PURE__ */ import_react2.default.createElement(
1152
+ import_ui_extensions2.Link,
1102
1153
  {
1103
1154
  variant: "dark",
1104
1155
  onClick: () => toggleGroup(item.group.key)
1105
1156
  },
1106
- /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "xs", wrap: "nowrap" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Icon, { name: expandedGroups.has(item.group.key) ? "downCarat" : "right" }), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Text, { format: { fontWeight: "demibold" } }, item.group.label))
1157
+ /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", align: "center", gap: "xs", wrap: "nowrap" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Icon, { name: expandedGroups.has(item.group.key) ? "downCarat" : "right" }), /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Text, { format: { fontWeight: "demibold" } }, item.group.label))
1107
1158
  ) : ((_a = groupBy.aggregations) == null ? void 0 : _a[col.field]) ? groupBy.aggregations[col.field](item.group.rows, item.group.key) : ((_c = (_b = groupBy.groupValues) == null ? void 0 : _b[item.group.key]) == null ? void 0 : _c[col.field]) ?? "");
1108
- }), showRowActionsColumn && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableCell, { width: "min" })) : useColumnRendering ? /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableRow, { key: item.row[rowIdField] ?? idx }, selectable && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableCell, { width: "min" }, /* @__PURE__ */ import_react.default.createElement(
1109
- import_ui_extensions.Checkbox,
1159
+ }), showRowActionsColumn && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableCell, { width: "min" })) : useColumnRendering ? /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableRow, { key: item.row[rowIdField] ?? idx }, selectable && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableCell, { width: "min" }, /* @__PURE__ */ import_react2.default.createElement(
1160
+ import_ui_extensions2.Checkbox,
1110
1161
  {
1111
1162
  name: `select-${item.row[rowIdField]}`,
1112
1163
  "aria-label": "Select row",
@@ -1119,28 +1170,28 @@ var DataTable = ({
1119
1170
  const isRowEditing = editingRowId != null && rowId === editingRowId && col.editable;
1120
1171
  const isShowingInput = isDiscreteEditing || isRowEditing || resolvedEditMode === "inline" && col.editable;
1121
1172
  const cellAlign = isShowingInput ? void 0 : col.align;
1122
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableCell, { key: col.field, width: isDiscreteEditing || isRowEditing ? "auto" : getCellWidth(col), align: cellAlign }, renderCellContent(item.row, col));
1123
- }), showRowActionsColumn && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableCell, { width: "min" }, /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { direction: "row", align: "center", gap: "xs", wrap: "nowrap" }, (() => {
1173
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableCell, { key: col.field, width: isDiscreteEditing || isRowEditing ? "auto" : getCellWidth(col), align: cellAlign }, renderCellContent(item.row, col));
1174
+ }), showRowActionsColumn && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableCell, { width: "min" }, /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Flex, { direction: "row", align: "center", gap: "xs", wrap: "nowrap" }, (() => {
1124
1175
  const resolvedRowActions = typeof rowActions === "function" ? rowActions(item.row) : rowActions;
1125
1176
  const actions = Array.isArray(resolvedRowActions) ? resolvedRowActions : [];
1126
- return actions.map((action, i) => /* @__PURE__ */ import_react.default.createElement(
1127
- import_ui_extensions.Button,
1177
+ return actions.map((action, i) => /* @__PURE__ */ import_react2.default.createElement(
1178
+ import_ui_extensions2.Button,
1128
1179
  {
1129
1180
  key: i,
1130
1181
  variant: action.variant || "transparent",
1131
1182
  size: "extra-small",
1132
1183
  onClick: () => action.onClick(item.row)
1133
1184
  },
1134
- action.icon && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Icon, { name: action.icon, size: "sm" }),
1185
+ action.icon && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.Icon, { name: action.icon, size: "sm" }),
1135
1186
  action.label && ` ${action.label}`
1136
1187
  ));
1137
1188
  })()))) : renderRow(item.row)
1138
1189
  )),
1139
- (footer || columns.some((col) => col.footer)) && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableFooter, null, typeof footer === "function" ? footer(footerData) : /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableRow, null, selectable && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableHeader, { width: "min" }), columns.map((col) => {
1190
+ (footer || columns.some((col) => col.footer)) && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableFooter, null, typeof footer === "function" ? footer(footerData) : /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableRow, null, selectable && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableHeader, { width: "min" }), columns.map((col) => {
1140
1191
  const footerDef = col.footer;
1141
1192
  const content = typeof footerDef === "function" ? footerDef(footerData) : footerDef || "";
1142
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableHeader, { key: col.field, align: col.align }, content);
1143
- }), showRowActionsColumn && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableHeader, { width: "min" })))
1193
+ return /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableHeader, { key: col.field, align: col.align }, content);
1194
+ }), showRowActionsColumn && /* @__PURE__ */ import_react2.default.createElement(import_ui_extensions2.TableHeader, { width: "min" })))
1144
1195
  ));
1145
1196
  };
1146
1197
  // Annotate the CommonJS export names for ESM import in node: