@economic/taco 1.38.2 → 1.40.0

Sign up to get free protection for your applications and to get access to all the features.
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, {