@economic/taco 1.38.2 → 1.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/components/Provider/Localization.d.ts +15 -1
  2. package/dist/components/Table2/Table2.d.ts +16 -1
  3. package/dist/components/Table2/components/column/Base.d.ts +2 -0
  4. package/dist/components/Table2/components/filters/components/ColumnFilter.d.ts +1 -0
  5. package/dist/components/Table2/components/filters/components/EmptyFilter.d.ts +13 -0
  6. package/dist/components/Table2/hooks/useTableShortcuts.d.ts +2 -0
  7. package/dist/components/Table2/types.d.ts +11 -3
  8. package/dist/esm/packages/taco/src/components/Drawer/components/Content.js +3 -3
  9. package/dist/esm/packages/taco/src/components/Drawer/components/Content.js.map +1 -1
  10. package/dist/esm/packages/taco/src/components/Provider/Localization.js +15 -1
  11. package/dist/esm/packages/taco/src/components/Provider/Localization.js.map +1 -1
  12. package/dist/esm/packages/taco/src/components/Shortcut/Shortcut.js +1 -1
  13. package/dist/esm/packages/taco/src/components/Shortcut/Shortcut.js.map +1 -1
  14. package/dist/esm/packages/taco/src/components/Table2/Table2.js +33 -13
  15. package/dist/esm/packages/taco/src/components/Table2/Table2.js.map +1 -1
  16. package/dist/esm/packages/taco/src/components/Table2/components/column/Base.js +3 -3
  17. package/dist/esm/packages/taco/src/components/Table2/components/column/Base.js.map +1 -1
  18. package/dist/esm/packages/taco/src/components/Table2/components/column/Footer.js +4 -2
  19. package/dist/esm/packages/taco/src/components/Table2/components/column/Footer.js.map +1 -1
  20. package/dist/esm/packages/taco/src/components/Table2/components/filters/FiltersButton.js +79 -24
  21. package/dist/esm/packages/taco/src/components/Table2/components/filters/FiltersButton.js.map +1 -1
  22. package/dist/esm/packages/taco/src/components/Table2/components/filters/components/ColumnFilter.js +14 -6
  23. package/dist/esm/packages/taco/src/components/Table2/components/filters/components/ColumnFilter.js.map +1 -1
  24. package/dist/esm/packages/taco/src/components/Table2/components/filters/components/EmptyFilter.js +63 -0
  25. package/dist/esm/packages/taco/src/components/Table2/components/filters/components/EmptyFilter.js.map +1 -0
  26. package/dist/esm/packages/taco/src/components/Table2/hooks/listeners/useRowSelectionListener.js +3 -2
  27. package/dist/esm/packages/taco/src/components/Table2/hooks/listeners/useRowSelectionListener.js.map +1 -1
  28. package/dist/esm/packages/taco/src/components/Table2/hooks/useColumnDefinitions.js +7 -2
  29. package/dist/esm/packages/taco/src/components/Table2/hooks/useColumnDefinitions.js.map +1 -1
  30. package/dist/esm/packages/taco/src/components/Table2/hooks/useTable.js +4 -1
  31. package/dist/esm/packages/taco/src/components/Table2/hooks/useTable.js.map +1 -1
  32. package/dist/esm/packages/taco/src/components/Table2/hooks/useTableShortcuts.js +46 -0
  33. package/dist/esm/packages/taco/src/components/Table2/hooks/useTableShortcuts.js.map +1 -0
  34. package/dist/esm/packages/taco/src/components/Table2/types.js.map +1 -1
  35. package/dist/esm/packages/taco/src/components/Table2/utilities/columns.js +4 -0
  36. package/dist/esm/packages/taco/src/components/Table2/utilities/columns.js.map +1 -1
  37. package/dist/esm/packages/taco/src/utils/keyboard.js +1 -1
  38. package/dist/esm/packages/taco/src/utils/keyboard.js.map +1 -1
  39. package/dist/taco.cjs.development.js +259 -57
  40. package/dist/taco.cjs.development.js.map +1 -1
  41. package/dist/taco.cjs.production.min.js +1 -1
  42. package/dist/taco.cjs.production.min.js.map +1 -1
  43. package/package.json +2 -3
  44. package/types.json +189 -29
@@ -3684,7 +3684,7 @@ function createShortcutKeyDownHandler(key, handler) {
3684
3684
  if (typeof key === 'string') {
3685
3685
  condition = event.key.toLowerCase() === key.toLowerCase();
3686
3686
  } else {
3687
- if (key.meta && (isMacOs() ? !event.metaKey : !event.ctrlKey) || key.meta === false && key.meta && (isMacOs() ? event.metaKey : event.ctrlKey)) {
3687
+ if (key.meta && (isMacOs() ? !event.metaKey : !event.ctrlKey) || !key.meta && (isMacOs() ? event.metaKey : event.ctrlKey)) {
3688
3688
  return;
3689
3689
  }
3690
3690
  if (key.shift && !event.shiftKey || key.shift === false && event.shiftKey) {
@@ -4016,7 +4016,7 @@ const defaultLocalisationTexts = {
4016
4016
  filters: {
4017
4017
  button: 'Filters',
4018
4018
  buttons: {
4019
- addFilter: 'Add Filter',
4019
+ addNewFilter: 'Add new filter',
4020
4020
  clearFilters: 'Clear all filters'
4021
4021
  },
4022
4022
  comparators: {
@@ -4033,9 +4033,23 @@ const defaultLocalisationTexts = {
4033
4033
  isEmpty: 'Is empty',
4034
4034
  isNotEmpty: 'Is not empty'
4035
4035
  },
4036
+ conditions: {
4037
+ and: 'And',
4038
+ where: 'Where'
4039
+ },
4040
+ emptyFilter: {
4041
+ condition: 'Condition',
4042
+ value: 'Value'
4043
+ },
4036
4044
  tooltip: 'Apply filters',
4037
4045
  total: 'Viewing [CURRENT] of [TOTAL]'
4038
4046
  },
4047
+ footer: {
4048
+ summary: {
4049
+ records: 'Records:',
4050
+ selected: 'Records selected:'
4051
+ }
4052
+ },
4039
4053
  rowDensity: {
4040
4054
  tooltip: 'Row density',
4041
4055
  compact: 'compact',
@@ -6285,15 +6299,15 @@ const DrawerContent = /*#__PURE__*/React__default.forwardRef(function Content(pr
6285
6299
  ref: contentRef,
6286
6300
  "data-taco": "drawer",
6287
6301
  className: containerClassName
6288
- }, /*#__PURE__*/React__default.createElement("div", Object.assign({
6302
+ }, output, /*#__PURE__*/React__default.createElement("div", Object.assign({
6289
6303
  className: dragHandlerClassName
6290
6304
  }, dragHandleProps, {
6291
6305
  "data-testid": "resize-handler",
6292
6306
  ref: dragHandlerRef
6293
- })), output, showCloseButton ? /*#__PURE__*/React__default.createElement(Close$3, null, /*#__PURE__*/React__default.createElement(IconButton, {
6307
+ })), showCloseButton ? /*#__PURE__*/React__default.createElement(Close$3, null, /*#__PURE__*/React__default.createElement(IconButton, {
6294
6308
  appearance: "discrete",
6295
6309
  "aria-label": texts.drawer.close,
6296
- className: "absolute top-0 right-0 mt-4 mr-2",
6310
+ className: "absolute right-0 top-0 mr-2 mt-4",
6297
6311
  icon: "close"
6298
6312
  })) : null);
6299
6313
  const styleProp = {
@@ -7042,7 +7056,7 @@ const replaceWithShortform = key => {
7042
7056
  case ' ':
7043
7057
  return '␣';
7044
7058
  default:
7045
- return key;
7059
+ return String(key).toLocaleUpperCase();
7046
7060
  }
7047
7061
  };
7048
7062
  const getShortcutText = key => {
@@ -11593,6 +11607,7 @@ function createRowDraggableColumn(onRowDrag, texts) {
11593
11607
  className: "text-grey-darkest invisible w-[20px] cursor-grab active:cursor-grabbing group-hover/row:visible group-[[aria-grabbed]]/row:text-white"
11594
11608
  }));
11595
11609
  },
11610
+ footer: () => /*#__PURE__*/React__default.createElement("span", null),
11596
11611
  meta: {
11597
11612
  align: 'center',
11598
11613
  className: 'items-center !px-0',
@@ -11709,6 +11724,7 @@ function createRowSelectionColumn(enableMultipleRowSelection, lastSelectedRowInd
11709
11724
  id: COLUMN_ID_FOR_SELECTION,
11710
11725
  header,
11711
11726
  cell,
11727
+ footer: () => /*#__PURE__*/React__default.createElement("span", null),
11712
11728
  meta: {
11713
11729
  align: 'center',
11714
11730
  className: onRowDrag ? '!pl-0 !pr-3' : '!px-3',
@@ -11778,6 +11794,7 @@ function createRowExpansionColumn(expandedRowRenderer, texts) {
11778
11794
  row: row,
11779
11795
  texts: texts
11780
11796
  }),
11797
+ footer: () => /*#__PURE__*/React__default.createElement("span", null),
11781
11798
  meta: {
11782
11799
  align: 'center',
11783
11800
  className: 'items-center !p-0',
@@ -11856,6 +11873,7 @@ function createRowActionsColumn(rowActions, rowActionsLength, texts) {
11856
11873
  shouldPauseHoverState: !!((_table$options$meta2 = table.options.meta) !== null && _table$options$meta2 !== void 0 && _table$options$meta2.shouldPauseHoverState)
11857
11874
  });
11858
11875
  },
11876
+ footer: () => /*#__PURE__*/React__default.createElement("span", null),
11859
11877
  meta: {
11860
11878
  align: 'right',
11861
11879
  className: (row, table) => {
@@ -11950,6 +11968,7 @@ const ColumnBase = /*#__PURE__*/React__default.forwardRef(function Table2ColumnB
11950
11968
  var _column$columnDef$met;
11951
11969
  const {
11952
11970
  column,
11971
+ frozenColumnIds,
11953
11972
  scrolled,
11954
11973
  style,
11955
11974
  table,
@@ -11958,8 +11977,7 @@ const ColumnBase = /*#__PURE__*/React__default.forwardRef(function Table2ColumnB
11958
11977
  const isFrozenColumn = !!column.getIsPinned();
11959
11978
  const meta = table.options.meta;
11960
11979
  const left = meta.columnOffsets[column.id];
11961
- const columnFreezing = table.getLeftVisibleLeafColumns().map(c => c.id);
11962
- const className = cn('border-grey-300', getFrozenShadowClasses(column, columnFreezing, scrolled), getCellAlignmentClasses((_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.align), {
11980
+ const className = cn('border-grey-300', getCellAlignmentClasses((_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.align), getFrozenShadowClasses(column, frozenColumnIds, scrolled), {
11963
11981
  'cursor-pointer': !!attributes.onClick
11964
11982
  }, attributes.className);
11965
11983
  return /*#__PURE__*/React__default.createElement("div", Object.assign({}, attributes, {
@@ -13145,8 +13163,9 @@ const Footer$3 = function Footer(props) {
13145
13163
  ...columnProps
13146
13164
  } = props;
13147
13165
  const isFrozen = !!footer.column.getIsPinned();
13148
- const className = cn('group/header sticky bottom-0 bg-white border-t-2 relative', getCellSizingClasses('normal'), {
13149
- 'z-[1]': isFrozen
13166
+ const className = cn('group/header sticky bottom-0 bg-white border-t-2 relative z-[1] h-[calc(theme(spacing.10)+2px)]', getCellSizingClasses('normal'), {
13167
+ '!z-[2]': isFrozen,
13168
+ '!shadow-none': isInternalColumn(footer.id)
13150
13169
  }, props.className);
13151
13170
  return /*#__PURE__*/React__default.createElement(ColumnBase, Object.assign({}, columnProps, {
13152
13171
  // base props
@@ -13231,7 +13250,9 @@ function useColumnDefinitions(children, options, tableRef) {
13231
13250
  size: child.props.defaultWidth,
13232
13251
  // sorting
13233
13252
  enableSorting: !child.props.disableSorting,
13234
- sortingFn: getSortingFn(child.props.dataType, child.props.sortFn)
13253
+ sortingFn: getSortingFn(child.props.dataType, child.props.sortFn),
13254
+ sortDescFirst: false,
13255
+ sortUndefined: 1
13235
13256
  });
13236
13257
  }
13237
13258
  });
@@ -13261,9 +13282,12 @@ function useColumnDefinitions(children, options, tableRef) {
13261
13282
  }, [children]);
13262
13283
  }
13263
13284
  function getSortingFn(dataType, customFn) {
13264
- if (customFn) {
13285
+ if (typeof customFn === 'function') {
13265
13286
  return (rowA, rowB, columnId) => customFn(rowA.original, rowB.original, columnId);
13266
13287
  }
13288
+ if (customFn) {
13289
+ return customFn;
13290
+ }
13267
13291
  if (dataType && dataType !== 'boolean') {
13268
13292
  return dataType;
13269
13293
  }
@@ -13298,10 +13322,11 @@ const useRowSelectionListener = (table, onRowSelect) => {
13298
13322
  React__default.useEffect(() => {
13299
13323
  if (onRowSelect) {
13300
13324
  if (table.options.enableMultiRowSelection) {
13301
- onRowSelect(table.getSelectedRowModel().rows.map(row => row.original));
13325
+ const rows = table.getSelectedRowModel().rows.map(row => row.original);
13326
+ onRowSelect(rows, table.getIsAllRowsSelected());
13302
13327
  } else {
13303
13328
  var _table$getSelectedRow, _table$getSelectedRow2;
13304
- onRowSelect((_table$getSelectedRow = (_table$getSelectedRow2 = table.getSelectedRowModel().rows[0]) === null || _table$getSelectedRow2 === void 0 ? void 0 : _table$getSelectedRow2.original) !== null && _table$getSelectedRow !== void 0 ? _table$getSelectedRow : undefined);
13329
+ onRowSelect((_table$getSelectedRow = (_table$getSelectedRow2 = table.getSelectedRowModel().rows[0]) === null || _table$getSelectedRow2 === void 0 ? void 0 : _table$getSelectedRow2.original) !== null && _table$getSelectedRow !== void 0 ? _table$getSelectedRow : undefined, false);
13305
13330
  }
13306
13331
  }
13307
13332
  }, [table.getState().rowSelection]);
@@ -13380,9 +13405,50 @@ const useFilterStateListener = (table, onRowSelect) => {
13380
13405
  }, [table.getState().columnFilters, table.getState().globalFilter]);
13381
13406
  };
13382
13407
 
13408
+ function useTableShortcuts(shortcuts, activeRow) {
13409
+ React__default.useEffect(() => {
13410
+ const shortcutKeys = Object.keys(shortcuts !== null && shortcuts !== void 0 ? shortcuts : {});
13411
+ const globalHandlers = [];
13412
+ // convert the shortcut into the correct format to register it
13413
+ if (shortcuts && shortcutKeys.length) {
13414
+ shortcutKeys.forEach(key => {
13415
+ const handler = shortcuts[key];
13416
+ let keyDownHandler;
13417
+ let keyDownHandlerOptions;
13418
+ if (typeof handler === 'function') {
13419
+ keyDownHandler = handler;
13420
+ keyDownHandlerOptions = {
13421
+ key
13422
+ };
13423
+ } else {
13424
+ const handlerObject = handler;
13425
+ keyDownHandler = handlerObject.handler;
13426
+ keyDownHandlerOptions = {
13427
+ key,
13428
+ meta: handlerObject.meta,
13429
+ shift: handlerObject.shift
13430
+ };
13431
+ }
13432
+ globalHandlers.push(createShortcutKeyDownHandler(keyDownHandlerOptions, event => {
13433
+ event.preventDefault();
13434
+ keyDownHandler(activeRow);
13435
+ }));
13436
+ });
13437
+ }
13438
+ globalHandlers.forEach(handler => {
13439
+ document.addEventListener('keydown', handler);
13440
+ });
13441
+ return () => {
13442
+ globalHandlers.forEach(handler => {
13443
+ document.removeEventListener('keydown', handler);
13444
+ });
13445
+ };
13446
+ }, [shortcuts, activeRow]);
13447
+ }
13448
+
13383
13449
  const ACTIONS_ON_ROW_LENGTH = 4;
13384
13450
  function useTable$1(children, props, ref) {
13385
- var _settings$frozenColum, _settings$columnSizin, _settings$columnVisib, _settings$rowDensity;
13451
+ var _settings$frozenColum, _settings$columnSizin, _settings$columnVisib, _settings$rowDensity, _tableRows$activeRow$;
13386
13452
  const {
13387
13453
  actionsForRow = [],
13388
13454
  actionsForRowLength = ACTIONS_ON_ROW_LENGTH,
@@ -13409,6 +13475,7 @@ function useTable$1(children, props, ref) {
13409
13475
  onRowSelect,
13410
13476
  onSave,
13411
13477
  settings = {},
13478
+ shortcuts,
13412
13479
  // experimental
13413
13480
  _experimentalActionsForTable
13414
13481
  } = props;
@@ -13576,6 +13643,7 @@ function useTable$1(children, props, ref) {
13576
13643
  useFilterStateListener(table, onRowSelect);
13577
13644
  useRowSelectionListener(table, onRowSelect);
13578
13645
  useSettingsStateListener(table, onChangeSettings);
13646
+ useTableShortcuts(shortcuts, (_tableRows$activeRow$ = tableRows[activeRow.activeRowIndex]) === null || _tableRows$activeRow$ === void 0 ? void 0 : _tableRows$activeRow$.original);
13579
13647
  return {
13580
13648
  rows,
13581
13649
  table,
@@ -14262,18 +14330,22 @@ const InferredControl = ({
14262
14330
  };
14263
14331
 
14264
14332
  const ColumnFilter = props => {
14265
- var _column$columnDef$hea, _column$columnDef$met, _control;
14333
+ var _column$columnDef$hea, _column$columnDef$met;
14266
14334
  const {
14267
14335
  allColumns,
14268
14336
  column,
14269
14337
  index,
14270
- table
14338
+ table,
14339
+ onRemove
14271
14340
  } = props;
14272
14341
  const {
14273
14342
  comparator,
14274
14343
  value
14275
14344
  } = column.getFilterValue();
14276
14345
  const ariaLabel = String((_column$columnDef$hea = column.columnDef.header) !== null && _column$columnDef$hea !== void 0 ? _column$columnDef$hea : '');
14346
+ const {
14347
+ texts
14348
+ } = useLocalization();
14277
14349
  const ref = React__default.useRef(null);
14278
14350
  let control;
14279
14351
  const controlType = (_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.control;
@@ -14318,13 +14390,16 @@ const ColumnFilter = props => {
14318
14390
  }))
14319
14391
  });
14320
14392
  }
14321
- const handleRemove = () => column.setFilterValue(undefined);
14393
+ const handleRemove = () => {
14394
+ column.setFilterValue(undefined);
14395
+ onRemove === null || onRemove === void 0 ? void 0 : onRemove();
14396
+ };
14322
14397
  const comparators = guessComparatorsBasedOnControl(control, controlType);
14323
14398
  return /*#__PURE__*/React__default.createElement("div", {
14324
- className: "mb-2 flex gap-2"
14399
+ className: "flex gap-2"
14325
14400
  }, /*#__PURE__*/React__default.createElement("div", {
14326
14401
  className: "flex w-14 flex-shrink-0 items-center justify-end pr-2 text-right"
14327
- }, index === 0 ? 'Where' : 'And'), /*#__PURE__*/React__default.createElement(Column$2, {
14402
+ }, index === 0 ? texts.table2.filters.conditions.where : texts.table2.filters.conditions.and), /*#__PURE__*/React__default.createElement(Column$2, {
14328
14403
  className: "!w-32 flex-shrink-0",
14329
14404
  allColumns: allColumns,
14330
14405
  column: column,
@@ -14337,7 +14412,7 @@ const ColumnFilter = props => {
14337
14412
  validComparators: comparators
14338
14413
  }), comparator !== undefined ? /*#__PURE__*/React__default.createElement("div", {
14339
14414
  className: "flex flex-grow items-center"
14340
- }, (_control = control) !== null && _control !== void 0 ? _control : /*#__PURE__*/React__default.createElement(InferredControl, {
14415
+ }, /*#__PURE__*/React__default.createElement(InferredControl, {
14341
14416
  column: column,
14342
14417
  comparator: comparator,
14343
14418
  value: value
@@ -14370,6 +14445,61 @@ const guessComparatorsBasedOnControl = (instance, control) => {
14370
14445
  }
14371
14446
  };
14372
14447
 
14448
+ const EmptyFilter = props => {
14449
+ const {
14450
+ texts
14451
+ } = useLocalization();
14452
+ const {
14453
+ onChange,
14454
+ onRemove,
14455
+ allColumns,
14456
+ table,
14457
+ index,
14458
+ filteredColumns,
14459
+ emptyFilterCount
14460
+ } = props;
14461
+ const handleChange = value => {
14462
+ if (value) {
14463
+ onChange === null || onChange === void 0 ? void 0 : onChange(value);
14464
+ }
14465
+ };
14466
+ return /*#__PURE__*/React__default.createElement("div", {
14467
+ className: "flex gap-2"
14468
+ }, /*#__PURE__*/React__default.createElement("div", {
14469
+ className: "flex w-14 flex-shrink-0 items-center justify-end pr-2 text-right"
14470
+ }, filteredColumns.length > 0 || filteredColumns.length === 0 && index > 0 ? texts.table2.filters.conditions.and : texts.table2.filters.conditions.where), /*#__PURE__*/React__default.createElement(Select2, {
14471
+ className: "!w-32 flex-shrink-0",
14472
+ emptyValue: null,
14473
+ autoFocus: true,
14474
+ onChange: handleChange,
14475
+ value: null
14476
+ }, allColumns.map(c => /*#__PURE__*/React__default.createElement(Select2.Option, {
14477
+ key: c.id,
14478
+ value: c.id,
14479
+ disabled: !c.getCanFilter() || !!table.getState().columnFilters.find(f => f.id === c.id)
14480
+ }, String(c.columnDef.header)))), /*#__PURE__*/React__default.createElement(Select2, {
14481
+ className: "!w-32 flex-shrink-0",
14482
+ value: 1,
14483
+ autoFocus: true,
14484
+ disabled: true
14485
+ }, /*#__PURE__*/React__default.createElement(Select2.Option, {
14486
+ key: 'condition1',
14487
+ value: 1
14488
+ }, texts.table2.filters.emptyFilter.condition), /*#__PURE__*/React__default.createElement(Select2.Option, {
14489
+ key: 'condition2',
14490
+ value: 2
14491
+ }, "Condition2")), /*#__PURE__*/React__default.createElement(Input, {
14492
+ "aria-label": 'Value',
14493
+ className: "flex-grow items-center",
14494
+ disabled: true,
14495
+ value: texts.table2.filters.emptyFilter.value
14496
+ }), (emptyFilterCount > 1 || filteredColumns.length > 0) && /*#__PURE__*/React__default.createElement(IconButton, {
14497
+ appearance: "discrete",
14498
+ icon: "close",
14499
+ onClick: onRemove
14500
+ }));
14501
+ };
14502
+
14373
14503
  const FiltersButton = ({
14374
14504
  length,
14375
14505
  table
@@ -14378,7 +14508,10 @@ const FiltersButton = ({
14378
14508
  texts
14379
14509
  } = useLocalization();
14380
14510
  const ref = React__default.useRef(null);
14381
- const allColumns = table.getAllLeafColumns().filter(column => !isInternalColumn(column.id));
14511
+ const allColumns = table.getAllLeafColumns().filter(column => !isInternalColumn(column.id)).sort((a, b) => {
14512
+ var _a$columnDef, _b$columnDef;
14513
+ return (_a$columnDef = a.columnDef) === null || _a$columnDef === void 0 ? void 0 : _a$columnDef.header.localeCompare((_b$columnDef = b.columnDef) === null || _b$columnDef === void 0 ? void 0 : _b$columnDef.header);
14514
+ });
14382
14515
  const {
14383
14516
  shouldDisableTableActions
14384
14517
  } = table.options.meta;
@@ -14390,17 +14523,11 @@ const FiltersButton = ({
14390
14523
  }
14391
14524
  return columns;
14392
14525
  }, []);
14393
- const handleAdd = () => {
14394
- const firstFilterableColumn = allColumns.find(c => c.getCanFilter() && !columnFilters.find(f => f.id === c.id));
14395
- if (firstFilterableColumn) {
14396
- firstFilterableColumn.setFilterValue({
14397
- comparator: undefined,
14398
- value: undefined
14399
- });
14400
- }
14401
- };
14526
+ const [emptyFilterCount, setEmptyFilterCount] = React__default.useState(1);
14527
+ const handleAdd = () => setEmptyFilterCount(emptyFilterCount + 1);
14402
14528
  const handleReset = () => {
14403
14529
  table.resetColumnFilters();
14530
+ setEmptyFilterCount(1);
14404
14531
  };
14405
14532
  useGlobalKeyDown({
14406
14533
  key: 'f',
@@ -14411,37 +14538,94 @@ const FiltersButton = ({
14411
14538
  event.preventDefault();
14412
14539
  (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.click();
14413
14540
  });
14541
+ const handleEmptyFilterChange = columnId => {
14542
+ // create an actual filter on that column that the user selected
14543
+ const column = allColumns.find(c => c.getCanFilter() && c.id === columnId);
14544
+ if (column) {
14545
+ column.setFilterValue({
14546
+ comparator: undefined,
14547
+ value: undefined
14548
+ });
14549
+ }
14550
+ // hide the empty filter row because we now have a real filter
14551
+ setEmptyFilterCount(emptyFilterCount - 1);
14552
+ };
14553
+ const handleRemove = () => {
14554
+ if (filteredColumns.length === 1 && emptyFilterCount === 0) {
14555
+ setEmptyFilterCount(1);
14556
+ }
14557
+ };
14558
+ const handleRemoveEmptyFilter = () => {
14559
+ setEmptyFilterCount(emptyFilterCount - 1);
14560
+ };
14561
+ const handleOpenChange = () => {
14562
+ const emptyFilterCount = filteredColumns.length === 0 ? 1 : 0;
14563
+ setEmptyFilterCount(emptyFilterCount);
14564
+ };
14565
+ const filters = filteredColumns.length > 0 && filteredColumns.filter(column => {
14566
+ var _column$columnDef$met;
14567
+ const controlType = (_column$columnDef$met = column.columnDef.meta) === null || _column$columnDef$met === void 0 ? void 0 : _column$columnDef$met.control;
14568
+ const value = column.getFilterValue().value;
14569
+ const comparator = column.getFilterValue().comparator;
14570
+ if (Array.isArray(value)) {
14571
+ if (value.length > 0 && value.find(item => item !== undefined)) {
14572
+ return true;
14573
+ }
14574
+ } else if (value) {
14575
+ return true;
14576
+ } else if ([Table2FilterComparator.IsEmpty, Table2FilterComparator.IsNotEmpty].includes(comparator)) {
14577
+ if (!controlType) {
14578
+ return true;
14579
+ }
14580
+ }
14581
+ return false;
14582
+ });
14583
+ const filtersApplied = filters && filters.length;
14414
14584
  return /*#__PURE__*/React__default.createElement(Button$1, {
14415
14585
  "aria-label": texts.table2.filters.tooltip,
14416
- appearance: columnFilters.length ? 'primary' : 'default',
14586
+ appearance: filtersApplied ? 'primary' : 'default',
14417
14587
  className: cn({
14418
- '!wcag-blue-100': columnFilters.length
14588
+ '!wcag-blue-100': filtersApplied
14419
14589
  }),
14420
14590
  disabled: shouldDisableTableActions,
14421
- popover: popoverProps => /*#__PURE__*/React__default.createElement(Popover, Object.assign({}, popoverProps), /*#__PURE__*/React__default.createElement(Popover.Content, null, /*#__PURE__*/React__default.createElement("div", {
14591
+ popover: popoverProps => /*#__PURE__*/React__default.createElement(Popover, Object.assign({}, popoverProps, {
14592
+ onChange: handleOpenChange
14593
+ }), /*#__PURE__*/React__default.createElement(Popover.Content, null, /*#__PURE__*/React__default.createElement("div", {
14422
14594
  className: "flex w-[40rem] flex-col gap-4"
14595
+ }, /*#__PURE__*/React__default.createElement("div", {
14596
+ className: "flex h-8"
14423
14597
  }, /*#__PURE__*/React__default.createElement("div", {
14424
14598
  className: "flex w-full items-center gap-2"
14425
14599
  }, /*#__PURE__*/React__default.createElement("h4", {
14426
14600
  className: "mb-0 inline-flex"
14427
- }, "Filter"), /*#__PURE__*/React__default.createElement("p", {
14601
+ }, texts.table2.filters.button), /*#__PURE__*/React__default.createElement("p", {
14428
14602
  className: "text-grey-700 mb-0 mr-auto mt-px inline-flex"
14429
- }, texts.table2.filters.total.replace('[CURRENT]', String(table.getFilteredRowModel().rows.length)).replace('[TOTAL]', String(length)))), /*#__PURE__*/React__default.createElement("div", {
14603
+ }, texts.table2.filters.total.replace('[CURRENT]', String(table.getFilteredRowModel().rows.length)).replace('[TOTAL]', String(length)))), columnFilters.length || emptyFilterCount > 1 ? /*#__PURE__*/React__default.createElement(Button$1, {
14604
+ onClick: handleReset
14605
+ }, texts.table2.filters.buttons.clearFilters) : null), /*#__PURE__*/React__default.createElement("div", {
14430
14606
  className: "flex flex-col gap-2"
14431
14607
  }, filteredColumns.map((column, index) => /*#__PURE__*/React__default.createElement(ColumnFilter, {
14432
14608
  key: `${column.id}_${index}`,
14433
14609
  allColumns: allColumns,
14434
14610
  index: index,
14435
14611
  column: column,
14436
- table: table
14437
- }))), /*#__PURE__*/React__default.createElement(Group, {
14438
- className: "justify-between"
14612
+ table: table,
14613
+ onRemove: handleRemove
14614
+ })), [...Array(emptyFilterCount)].map((_, index) => /*#__PURE__*/React__default.createElement(EmptyFilter, {
14615
+ key: `emptyFilter_${index}`,
14616
+ index: index,
14617
+ allColumns: allColumns,
14618
+ table: table,
14619
+ onChange: value => handleEmptyFilterChange(value),
14620
+ emptyFilterCount: emptyFilterCount,
14621
+ filteredColumns: filteredColumns,
14622
+ onRemove: handleRemoveEmptyFilter
14623
+ })), /*#__PURE__*/React__default.createElement("div", {
14624
+ className: "justify-start"
14439
14625
  }, /*#__PURE__*/React__default.createElement(Button$1, {
14440
14626
  appearance: "discrete",
14441
14627
  onClick: handleAdd
14442
- }, "+ ", texts.table2.filters.buttons.addFilter), columnFilters.length ? /*#__PURE__*/React__default.createElement(Button$1, {
14443
- onClick: handleReset
14444
- }, texts.table2.filters.buttons.clearFilters) : null)))),
14628
+ }, "+ ", texts.table2.filters.buttons.addNewFilter)))))),
14445
14629
  ref: ref,
14446
14630
  tooltip: /*#__PURE__*/React__default.createElement(React__default.Fragment, null, texts.table2.filters.tooltip, /*#__PURE__*/React__default.createElement(Shortcut, {
14447
14631
  className: "ml-2",
@@ -14452,8 +14636,8 @@ const FiltersButton = ({
14452
14636
  }
14453
14637
  }))
14454
14638
  }, /*#__PURE__*/React__default.createElement(Icon, {
14455
- name: columnFilters.length ? 'filter-solid' : 'filter'
14456
- }), texts.table2.filters.button, " ", columnFilters.length ? `(${columnFilters.length})` : '');
14639
+ name: filtersApplied ? 'filter-solid' : 'filter'
14640
+ }), texts.table2.filters.button, " ", filtersApplied ? `(${filtersApplied})` : '');
14457
14641
  };
14458
14642
 
14459
14643
  const Search$2 = props => {
@@ -14619,7 +14803,8 @@ const BaseTable2 = /*#__PURE__*/React__default.forwardRef(function BaseTable2(pr
14619
14803
  resetFiltering: () => table.resetColumnFilters(),
14620
14804
  resetRowExpansion: () => table.resetExpanded(),
14621
14805
  resetRowSelection: () => table.resetRowSelection(),
14622
- resetSorting: () => table.resetSorting()
14806
+ resetSorting: () => table.resetSorting(),
14807
+ toggleEditing: () => meta.editMode.toggleEditing()
14623
14808
  };
14624
14809
  }
14625
14810
  }, [table, tableRef.current]);
@@ -14830,11 +15015,7 @@ const BaseTable2 = /*#__PURE__*/React__default.forwardRef(function BaseTable2(pr
14830
15015
  const enableSettingsButton = table.options.enableHiding || meta.enableColumnReordering;
14831
15016
  const hasInternalToolbar = enableSettingsButton || meta.editMode.enableEditMode || table.options.enableColumnFilters || meta.enableRowDensity || table.options.enableGlobalFilter;
14832
15017
  const hasToolbar = hasInternalToolbar || !!toolbarLeft || !toolbarRight;
14833
- const hasFooters = React__default.useMemo(() => {
14834
- const summaryIds = Object.keys(footers);
14835
- const visibleIds = Object.keys(columnVisibility).filter(c => !columnVisibility[c]);
14836
- return summaryIds.length && summaryIds.some(v => !visibleIds.includes(v));
14837
- }, [footers, columnVisibility]);
15018
+ const frozenColumnIds = table.getLeftVisibleLeafColumns().map(c => c.id);
14838
15019
  return /*#__PURE__*/React__default.createElement("div", {
14839
15020
  className: "-m-0.5 flex h-full w-[calc(100%_+_0.25rem)] flex-col gap-4 overflow-hidden p-0.5"
14840
15021
  }, hasToolbar ? /*#__PURE__*/React__default.createElement("div", {
@@ -14883,6 +15064,7 @@ const BaseTable2 = /*#__PURE__*/React__default.forwardRef(function BaseTable2(pr
14883
15064
  key: headerGroup.id,
14884
15065
  role: "row"
14885
15066
  }, headerGroup.headers.map((header, columnIndex) => /*#__PURE__*/React__default.createElement(Header$1, {
15067
+ frozenColumnIds: frozenColumnIds,
14886
15068
  key: header.id,
14887
15069
  header: header,
14888
15070
  index: columnIndex,
@@ -14912,6 +15094,7 @@ const BaseTable2 = /*#__PURE__*/React__default.forwardRef(function BaseTable2(pr
14912
15094
  table: table
14913
15095
  }, row.getVisibleCells().map((cell, columnIndex) => /*#__PURE__*/React__default.createElement(Cell, {
14914
15096
  cell: cell,
15097
+ frozenColumnIds: frozenColumnIds,
14915
15098
  key: `${cell.id}_${cell.getValue()}`,
14916
15099
  index: columnIndex,
14917
15100
  isLastRow: virtualRow.index === rows.length - 1,
@@ -14933,27 +15116,46 @@ const BaseTable2 = /*#__PURE__*/React__default.forwardRef(function BaseTable2(pr
14933
15116
  className: "col-span-full"
14934
15117
  }) : null) : /*#__PURE__*/React__default.createElement("div", {
14935
15118
  className: "col-span-full min-h-[theme(spacing.8)]"
14936
- }, EmptyState ? /*#__PURE__*/React__default.createElement(EmptyState, null) : null), hasFooters ? /*#__PURE__*/React__default.createElement("div", {
14937
- role: "rowgroup",
15119
+ }, EmptyState ? /*#__PURE__*/React__default.createElement(EmptyState, null) : null), /*#__PURE__*/React__default.createElement("div", {
14938
15120
  className: "contents",
14939
- "data-taco": "table2-footer"
14940
- }, table.getFooterGroups().map(footerGroup => /*#__PURE__*/React__default.createElement("div", {
14941
- key: footerGroup.id,
15121
+ "data-taco": "table2-footer",
15122
+ role: "rowgroup"
15123
+ }, /*#__PURE__*/React__default.createElement("div", {
14942
15124
  role: "row",
14943
15125
  className: "contents"
14944
- }, footerGroup.headers.map((footer, cellIndex) => /*#__PURE__*/React__default.createElement(Footer$3, {
15126
+ }, table.getFooterGroups().map(footerGroup => footerGroup.headers.map((footer, cellIndex) => /*#__PURE__*/React__default.createElement(Footer$3, {
14945
15127
  key: footer.id,
14946
15128
  footer: footer,
15129
+ frozenColumnIds: frozenColumnIds,
14947
15130
  index: cellIndex,
14948
15131
  scrolled: scrolled,
14949
15132
  table: table
14950
- }, footers[footer.id] ? footers[footer.id](rows.map(row => row.original[footer.id])) : null))))) : null), !!_experimentalActionsForTable && table.options.enableRowSelection && (table.getIsSomeRowsSelected() || table.getIsAllRowsSelected()) ? /*#__PURE__*/React__default.createElement(BatchActionsMenu, {
15133
+ }, footers[footer.id] ? footers[footer.id](rows.map(row => row.original[footer.id])) : null)))))), /*#__PURE__*/React__default.createElement(Summary, {
15134
+ length: length !== null && length !== void 0 ? length : rows.length,
15135
+ table: table
15136
+ }), !!_experimentalActionsForTable && table.options.enableRowSelection && (table.getIsSomeRowsSelected() || table.getIsAllRowsSelected()) ? /*#__PURE__*/React__default.createElement(BatchActionsMenu, {
14951
15137
  className: "fixed-center-x bottom-0 z-50 mb-4 print:hidden",
14952
15138
  actionsForTable: _experimentalActionsForTable,
14953
15139
  summary: _experimentalActionsForTableSummary,
14954
15140
  table: table
14955
15141
  }) : null);
14956
15142
  });
15143
+ const Summary = ({
15144
+ length,
15145
+ table
15146
+ }) => {
15147
+ const {
15148
+ texts
15149
+ } = useLocalization();
15150
+ const selectedLength = table.getIsAllRowsSelected() ? length : table.getSelectedRowModel().rows.length;
15151
+ const label = selectedLength > 0 ? texts.table2.footer.summary.selected : texts.table2.footer.summary.records;
15152
+ const total = selectedLength > 0 ? selectedLength : length;
15153
+ return /*#__PURE__*/React__default.createElement("div", {
15154
+ className: "z-10 -mt-4"
15155
+ }, /*#__PURE__*/React__default.createElement("div", {
15156
+ className: cn('-mt-10 ml-px h-7 w-fit rounded-bl bg-white !pr-2 shadow-[6px_0px_6px_theme(colors.white)]', getCellSizingClasses('normal'))
15157
+ }, label, "\u00A0", /*#__PURE__*/React__default.createElement("strong", null, total)));
15158
+ };
14957
15159
  const Table2 = /*#__PURE__*/React__default.forwardRef(function Table2(props, ref) {
14958
15160
  const key = React__default.useMemo(() => String('tableKey_' + String(props.children)), [props.children]);
14959
15161
  return /*#__PURE__*/React__default.createElement(BaseTable2, Object.assign({}, props, {