hs-uix 1.6.5 → 2.0.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
@@ -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,47 +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
715
  const showToolbarCount = showRowCount && displayCount > 0 && !(showSelectionBar && selectable && selectedIds.size > 0);
661
- const hasToolbarContent = showSearch && searchFields.length > 0 || filters.length > 0 || activeChips.length > 0 && (showFilterBadges || showClearFiltersButton) || showToolbarCount;
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;
662
720
  const showRowActionsColumn = !!rowActions && !(hideRowActionsWhenSelectionActive && selectable && selectedIds.size > 0);
663
- const applySelection = (0, import_react.useCallback)((nextSet) => {
721
+ const applySelection = (0, import_react2.useCallback)((nextSet) => {
664
722
  if (externalSelectedIds == null) {
665
723
  setInternalSelectedIds(nextSet);
666
724
  }
667
725
  if (onSelectionChange) onSelectionChange([...nextSet]);
668
726
  }, [externalSelectedIds, onSelectionChange]);
669
- const pageRowIds = (0, import_react.useMemo)(() => {
727
+ const pageRowIds = (0, import_react2.useMemo)(() => {
670
728
  if (serverSide) {
671
729
  return data.map((row) => row[rowIdField]).filter((id) => id != null);
672
730
  }
673
731
  return displayRows.filter((r) => r.type === "data").map((r) => r.row[rowIdField]).filter((id) => id != null);
674
732
  }, [serverSide, data, displayRows, rowIdField]);
675
- const allRowIds = (0, import_react.useMemo)(
733
+ const allRowIds = (0, import_react2.useMemo)(
676
734
  () => datasetRows.map((row) => row[rowIdField]).filter((id) => id != null),
677
735
  [datasetRows, rowIdField]
678
736
  );
679
- const handleSelectRow = (0, import_react.useCallback)((rowId, checked) => {
737
+ const handleSelectRow = (0, import_react2.useCallback)((rowId, checked) => {
680
738
  const next = new Set(selectedIds);
681
739
  if (checked) next.add(rowId);
682
740
  else next.delete(rowId);
683
741
  applySelection(next);
684
742
  }, [selectedIds, applySelection]);
685
- const handleSelectAll = (0, import_react.useCallback)((checked) => {
743
+ const handleSelectAll = (0, import_react2.useCallback)((checked) => {
686
744
  const next = new Set(selectedIds);
687
745
  pageRowIds.forEach((id) => {
688
746
  if (checked) next.add(id);
@@ -690,10 +748,10 @@ var DataTable = ({
690
748
  });
691
749
  applySelection(next);
692
750
  }, [selectedIds, pageRowIds, applySelection]);
693
- const allVisibleSelected = (0, import_react.useMemo)(() => {
751
+ const allVisibleSelected = (0, import_react2.useMemo)(() => {
694
752
  return pageRowIds.length > 0 && pageRowIds.every((id) => selectedIds.has(id));
695
753
  }, [pageRowIds, selectedIds]);
696
- const handleSelectAllRows = (0, import_react.useCallback)(() => {
754
+ const handleSelectAllRows = (0, import_react2.useCallback)(() => {
697
755
  const idsToAdd = serverSide ? pageRowIds : allRowIds;
698
756
  const next = new Set(selectedIds);
699
757
  idsToAdd.forEach((id) => next.add(id));
@@ -706,13 +764,13 @@ var DataTable = ({
706
764
  });
707
765
  }
708
766
  }, [serverSide, pageRowIds, allRowIds, selectedIds, applySelection, onSelectAllRequest, totalCount, data.length]);
709
- const handleDeselectAll = (0, import_react.useCallback)(() => {
767
+ const handleDeselectAll = (0, import_react2.useCallback)(() => {
710
768
  applySelection(/* @__PURE__ */ new Set());
711
769
  }, [applySelection]);
712
- const [editingCell, setEditingCell] = (0, import_react.useState)(null);
713
- const [editValue, setEditValue] = (0, import_react.useState)(null);
714
- const [editError, setEditError] = (0, import_react.useState)(null);
715
- 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) => {
716
774
  setEditingCell({ rowId, field });
717
775
  setEditValue(currentValue);
718
776
  setEditError(null);
@@ -721,13 +779,13 @@ var DataTable = ({
721
779
  if (row) onEditStart(row, field, currentValue);
722
780
  }
723
781
  }, [onEditStart, data, rowIdField]);
724
- const commitEdit = (0, import_react.useCallback)((row, field, value, options = {}) => {
782
+ const commitEdit = (0, import_react2.useCallback)((row, field, value, options = {}) => {
725
783
  const { keepEditing = false } = options;
726
784
  const col = columns.find((c) => c.field === field);
727
785
  if (col == null ? void 0 : col.editValidate) {
728
- const result = col.editValidate(value, row);
729
- if (result !== true && result !== void 0 && result !== null) {
730
- setEditError(typeof result === "string" ? result : "Invalid value");
786
+ const err = editValidationError(col.editValidate(value, row));
787
+ if (err) {
788
+ setEditError(err);
731
789
  return false;
732
790
  }
733
791
  }
@@ -755,14 +813,7 @@ var DataTable = ({
755
813
  const extra = col.editProps || {};
756
814
  const validate = col.editValidate;
757
815
  const validationProps = validate && editError ? { error: true, validationMessage: editError } : {};
758
- const onInputValidate = validate ? (val) => {
759
- const result = validate(val, row);
760
- if (result !== true && result !== void 0 && result !== null) {
761
- setEditError(typeof result === "string" ? result : "Invalid value");
762
- } else {
763
- setEditError(null);
764
- }
765
- } : void 0;
816
+ const onInputValidate = validate ? (val) => setEditError(editValidationError(validate(val, row))) : void 0;
766
817
  const handleInput = (val) => {
767
818
  setEditValue(val);
768
819
  if (onInputValidate) onInputValidate(val);
@@ -780,42 +831,42 @@ var DataTable = ({
780
831
  };
781
832
  switch (type) {
782
833
  case "textarea":
783
- 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 });
784
835
  case "number":
785
- 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 });
786
837
  case "currency":
787
- 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 });
788
839
  case "stepper":
789
- 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 });
790
841
  case "select":
791
- 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) });
792
843
  case "multiselect":
793
- 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) });
794
845
  case "date":
795
- 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 });
796
847
  case "time":
797
- 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 });
798
849
  case "datetime":
799
- 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) => {
800
851
  const next = { ...editValue, date: val };
801
852
  handleInput(next);
802
853
  commitEdit(row, col.field, next, { keepEditing: true });
803
- }, 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) => {
804
855
  const next = { ...editValue, time: val };
805
856
  handleInput(next);
806
857
  commitEdit(row, col.field, next, { keepEditing: true });
807
858
  }, onBlur: maybeExitDatetimeEdit }));
808
859
  case "toggle":
809
- 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 });
810
861
  case "checkbox":
811
- 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 });
812
863
  default:
813
- 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 });
814
865
  }
815
866
  };
816
867
  const resolvedEditMode = editMode || (columns.some((col) => col.editable) ? "discrete" : null);
817
868
  const useColumnRendering = selectable || !!resolvedEditMode || editingRowId != null || showRowActionsColumn || !renderRow;
818
- const autoWidths = (0, import_react.useMemo)(
869
+ const autoWidths = (0, import_react2.useMemo)(
819
870
  () => autoWidth ? computeAutoWidths(columns, data) : {},
820
871
  [columns, data, autoWidth]
821
872
  );
@@ -828,7 +879,7 @@ var DataTable = ({
828
879
  var _a;
829
880
  return col.cellWidth || col.width || ((_a = autoWidths[col.field]) == null ? void 0 : _a.cellWidth) || defaultWidth;
830
881
  };
831
- const [inlineErrors, setInlineErrors] = (0, import_react.useState)({});
882
+ const [inlineErrors, setInlineErrors] = (0, import_react2.useState)({});
832
883
  const renderInlineControl = (col, row) => {
833
884
  const type = col.editType || "text";
834
885
  const rowId = row[rowIdField];
@@ -838,9 +889,9 @@ var DataTable = ({
838
889
  const validate = col.editValidate;
839
890
  const fire = (val) => {
840
891
  if (validate) {
841
- const result = validate(val, row);
842
- if (result !== true && result !== void 0 && result !== null) {
843
- 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 }));
844
895
  return;
845
896
  }
846
897
  setInlineErrors((prev) => {
@@ -855,16 +906,13 @@ var DataTable = ({
855
906
  const cellError = inlineErrors[cellKey];
856
907
  const validationProps = cellError ? { error: true, validationMessage: cellError } : {};
857
908
  const onInputValidate = validate ? (val) => {
858
- const result = validate(val, row);
859
- if (result !== true && result !== void 0 && result !== null) {
860
- setInlineErrors((prev) => ({ ...prev, [cellKey]: typeof result === "string" ? result : "Invalid value" }));
861
- } else {
862
- setInlineErrors((prev) => {
863
- const next = { ...prev };
864
- delete next[cellKey];
865
- return next;
866
- });
867
- }
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
+ });
868
916
  } : void 0;
869
917
  const emitInput = (val) => {
870
918
  if (onInputValidate) onInputValidate(val);
@@ -872,33 +920,33 @@ var DataTable = ({
872
920
  };
873
921
  switch (type) {
874
922
  case "textarea":
875
- 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 });
876
924
  case "number":
877
- 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 });
878
926
  case "currency":
879
- 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 });
880
928
  case "stepper":
881
- 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 });
882
930
  case "select":
883
- 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) });
884
932
  case "multiselect":
885
- 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) });
886
934
  case "date":
887
- 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 });
888
936
  case "time":
889
- 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 });
890
938
  case "datetime":
891
- 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) => {
892
940
  fire({ ...value, date: val });
893
- } }), /* @__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) => {
894
942
  fire({ ...value, time: val });
895
943
  } }));
896
944
  case "toggle":
897
- 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 });
898
946
  case "checkbox":
899
- 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 });
900
948
  default:
901
- 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 });
902
950
  }
903
951
  };
904
952
  const renderCellContent = (row, col) => {
@@ -918,30 +966,30 @@ var DataTable = ({
918
966
  if (col.renderCell) {
919
967
  const content2 = col.renderCell(rawValue, row);
920
968
  if (col.editable) {
921
- 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 || "--");
922
970
  }
923
971
  return content2;
924
972
  }
925
973
  if (col.editable) {
926
- 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 || "--"));
927
975
  }
928
- 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);
929
977
  }
930
978
  const maxLen = typeof col.truncate === "number" ? col.truncate : col.truncate.maxLength || 100;
931
979
  if (rawStr.length > maxLen) {
932
980
  const truncatedStr = rawStr.slice(0, maxLen) + "\u2026";
933
981
  const content2 = col.renderCell ? col.renderCell(truncatedStr, row) : truncatedStr;
934
982
  if (col.editable) {
935
- 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 || "--");
936
984
  }
937
- 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 || "--");
938
986
  }
939
987
  }
940
988
  const content = col.renderCell ? col.renderCell(rawValue, row) : rawValue;
941
989
  const isEmpty = content == null || content === "";
942
990
  if (col.editable) {
943
- return /* @__PURE__ */ import_react.default.createElement(
944
- import_ui_extensions.Link,
991
+ return /* @__PURE__ */ import_react2.default.createElement(
992
+ import_ui_extensions2.Link,
945
993
  {
946
994
  variant: "dark",
947
995
  onClick: () => startEditing(rowId, col.field, rawValue)
@@ -954,8 +1002,8 @@ var DataTable = ({
954
1002
  const renderFilterControl = (filter) => {
955
1003
  const type = filter.type || "select";
956
1004
  if (type === "multiselect") {
957
- return /* @__PURE__ */ import_react.default.createElement(
958
- import_ui_extensions.MultiSelect,
1005
+ return /* @__PURE__ */ import_react2.default.createElement(
1006
+ import_ui_extensions2.MultiSelect,
959
1007
  {
960
1008
  key: filter.name,
961
1009
  name: `filter-${filter.name}`,
@@ -969,8 +1017,8 @@ var DataTable = ({
969
1017
  }
970
1018
  if (type === "dateRange") {
971
1019
  const rangeVal = filterValues[filter.name] || { from: null, to: null };
972
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Flex, { key: filter.name, direction: "row", align: "center", gap: "xs" }, /* @__PURE__ */ import_react.default.createElement(
973
- 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,
974
1022
  {
975
1023
  name: `filter-${filter.name}-from`,
976
1024
  label: "",
@@ -979,8 +1027,8 @@ var DataTable = ({
979
1027
  value: rangeVal.from,
980
1028
  onChange: (val) => handleFilterChange(filter.name, { ...rangeVal, from: val })
981
1029
  }
982
- ), /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.Icon, { name: "dataSync", size: "sm" }), /* @__PURE__ */ import_react.default.createElement(
983
- 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,
984
1032
  {
985
1033
  size: "sm",
986
1034
  name: `filter-${filter.name}-to`,
@@ -992,8 +1040,8 @@ var DataTable = ({
992
1040
  }
993
1041
  ));
994
1042
  }
995
- return /* @__PURE__ */ import_react.default.createElement(
996
- import_ui_extensions.Select,
1043
+ return /* @__PURE__ */ import_react2.default.createElement(
1044
+ import_ui_extensions2.Select,
997
1045
  {
998
1046
  key: filter.name,
999
1047
  name: `filter-${filter.name}`,
@@ -1008,33 +1056,33 @@ var DataTable = ({
1008
1056
  }
1009
1057
  );
1010
1058
  };
1011
- 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.Text, { format: { fontWeight: "demibold" } }, title)), 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(
1012
- 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,
1013
1061
  {
1014
1062
  name: "datatable-search",
1015
1063
  placeholder: searchPlaceholder,
1016
1064
  value: internalSearchTerm,
1017
1065
  onChange: handleSearchChange
1018
1066
  }
1019
- ), filters.slice(0, filterInlineLimit).map(renderFilterControl), filters.length > filterInlineLimit && /* @__PURE__ */ import_react.default.createElement(
1020
- import_ui_extensions.Button,
1067
+ ), filters.slice(0, filterInlineLimit).map(renderFilterControl), filters.length > filterInlineLimit && /* @__PURE__ */ import_react2.default.createElement(
1068
+ import_ui_extensions2.Button,
1021
1069
  {
1022
1070
  variant: "transparent",
1023
1071
  size: "small",
1024
1072
  onClick: () => setShowMoreFilters((prev) => !prev)
1025
1073
  },
1026
- /* @__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" }),
1027
1075
  " ",
1028
1076
  resolvedFiltersButtonLabel
1029
- )), 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(
1030
- 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,
1031
1079
  {
1032
1080
  variant: "transparent",
1033
1081
  size: "extra-small",
1034
1082
  onClick: () => handleFilterRemove("all")
1035
1083
  },
1036
1084
  resolvedClearAllLabel
1037
- )))), 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({
1038
1086
  selectedIds,
1039
1087
  selectedCount: selectedIds.size,
1040
1088
  displayCount,
@@ -1043,23 +1091,27 @@ var DataTable = ({
1043
1091
  onSelectAll: handleSelectAllRows,
1044
1092
  onDeselectAll: handleDeselectAll,
1045
1093
  selectionActions
1046
- }) : /* @__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(
1047
- 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,
1048
1096
  {
1049
1097
  key: i,
1050
1098
  variant: action.variant || "transparent",
1051
1099
  size: "extra-small",
1052
1100
  onClick: () => action.onClick([...selectedIds])
1053
1101
  },
1054
- 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" }),
1055
1103
  " ",
1056
1104
  action.label
1057
- )))), 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({
1058
1110
  error,
1059
1111
  title: typeof error === "string" ? error : resolvedErrorTitle,
1060
1112
  message: typeof error === "string" ? resolvedRetryMessage : resolvedErrorMessage
1061
- }) : /* @__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(
1062
- 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,
1063
1115
  {
1064
1116
  bordered,
1065
1117
  flush,
@@ -1071,8 +1123,8 @@ var DataTable = ({
1071
1123
  showButtonLabels,
1072
1124
  ...maxVisiblePageButtons != null ? { maxVisiblePageButtons } : {}
1073
1125
  },
1074
- /* @__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(
1075
- 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,
1076
1128
  {
1077
1129
  name: "datatable-select-all",
1078
1130
  "aria-label": "Select all rows",
@@ -1081,8 +1133,8 @@ var DataTable = ({
1081
1133
  }
1082
1134
  )), columns.map((col) => {
1083
1135
  const headerAlign = resolvedEditMode === "inline" && col.editable ? void 0 : col.align;
1084
- return /* @__PURE__ */ import_react.default.createElement(
1085
- import_ui_extensions.TableHeader,
1136
+ return /* @__PURE__ */ import_react2.default.createElement(
1137
+ import_ui_extensions2.TableHeader,
1086
1138
  {
1087
1139
  key: col.field,
1088
1140
  width: getHeaderWidth(col),
@@ -1090,22 +1142,22 @@ var DataTable = ({
1090
1142
  sortDirection: col.sortable ? sortState[col.field] || "none" : "never",
1091
1143
  onSortChange: col.sortable ? () => handleSortChange(col.field) : void 0
1092
1144
  },
1093
- 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
1094
1146
  );
1095
- }), showRowActionsColumn && /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableHeader, { width: "min" }))),
1096
- /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableBody, null, displayRows.map(
1097
- (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) => {
1098
1150
  var _a, _b, _c;
1099
- 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(
1100
- 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,
1101
1153
  {
1102
1154
  variant: "dark",
1103
1155
  onClick: () => toggleGroup(item.group.key)
1104
1156
  },
1105
- /* @__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))
1106
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]) ?? "");
1107
- }), 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(
1108
- 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,
1109
1161
  {
1110
1162
  name: `select-${item.row[rowIdField]}`,
1111
1163
  "aria-label": "Select row",
@@ -1118,28 +1170,28 @@ var DataTable = ({
1118
1170
  const isRowEditing = editingRowId != null && rowId === editingRowId && col.editable;
1119
1171
  const isShowingInput = isDiscreteEditing || isRowEditing || resolvedEditMode === "inline" && col.editable;
1120
1172
  const cellAlign = isShowingInput ? void 0 : col.align;
1121
- 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));
1122
- }), 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" }, (() => {
1123
1175
  const resolvedRowActions = typeof rowActions === "function" ? rowActions(item.row) : rowActions;
1124
1176
  const actions = Array.isArray(resolvedRowActions) ? resolvedRowActions : [];
1125
- return actions.map((action, i) => /* @__PURE__ */ import_react.default.createElement(
1126
- import_ui_extensions.Button,
1177
+ return actions.map((action, i) => /* @__PURE__ */ import_react2.default.createElement(
1178
+ import_ui_extensions2.Button,
1127
1179
  {
1128
1180
  key: i,
1129
1181
  variant: action.variant || "transparent",
1130
1182
  size: "extra-small",
1131
1183
  onClick: () => action.onClick(item.row)
1132
1184
  },
1133
- 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" }),
1134
1186
  action.label && ` ${action.label}`
1135
1187
  ));
1136
1188
  })()))) : renderRow(item.row)
1137
1189
  )),
1138
- (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) => {
1139
1191
  const footerDef = col.footer;
1140
1192
  const content = typeof footerDef === "function" ? footerDef(footerData) : footerDef || "";
1141
- return /* @__PURE__ */ import_react.default.createElement(import_ui_extensions.TableHeader, { key: col.field, align: col.align }, content);
1142
- }), 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" })))
1143
1195
  ));
1144
1196
  };
1145
1197
  // Annotate the CommonJS export names for ESM import in node: