@procore/data-table 14.43.2 → 14.44.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/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Change Log
2
2
 
3
+ ## 14.44.0
4
+
5
+ ### Minor Changes
6
+
7
+ - dc8aaf4: Made data-table column menu accessible via keyboard using `⌥ Alt+↓`
8
+ - a9569f8: Focus BulkEditPanel after opening
9
+
10
+ ### Patch Changes
11
+
12
+ - c33f992: Improve accessibility in QuickFilters by adding descriptive `aria-label` to filter token remove button (includes filter name)
13
+
3
14
  ## 14.43.2
4
15
 
5
16
  ### Patch Changes
@@ -56619,6 +56619,7 @@ var GenericHeaderRenderer = (props) => {
56619
56619
  I18n
56620
56620
  );
56621
56621
  const headerCellRef = React80.useRef(null);
56622
+ const menuButtonRef = React80.useRef(null);
56622
56623
  const headerCheckboxSelection = colDef.headerCheckboxSelection;
56623
56624
  const headerCheckboxSelectionEnabled = typeof headerCheckboxSelection === "function" ? headerCheckboxSelection({
56624
56625
  api: props.api,
@@ -56985,6 +56986,51 @@ var GenericHeaderRenderer = (props) => {
56985
56986
  expansionVariant,
56986
56987
  onSSDR
56987
56988
  );
56989
+ React80__default.default.useEffect(() => {
56990
+ if (!props.enableMenu) return;
56991
+ const MENU_SYNTHETIC = "__menu_synthetic_keydown";
56992
+ const handler = (e) => {
56993
+ var _a2;
56994
+ const button = (_a2 = menuButtonRef.current) == null ? void 0 : _a2.querySelector("button");
56995
+ const isMenuOpen = (button == null ? void 0 : button.getAttribute("aria-expanded")) === "true";
56996
+ if (e[MENU_SYNTHETIC]) {
56997
+ return;
56998
+ }
56999
+ if (e.altKey && e.key === "ArrowDown" && !isMenuOpen) {
57000
+ e.preventDefault();
57001
+ e.stopPropagation();
57002
+ button == null ? void 0 : button.focus();
57003
+ button == null ? void 0 : button.click();
57004
+ return;
57005
+ }
57006
+ if (!isMenuOpen) return;
57007
+ switch (e.key) {
57008
+ case "ArrowDown":
57009
+ case "ArrowUp":
57010
+ case "Enter":
57011
+ case "Escape":
57012
+ e.stopPropagation();
57013
+ e.preventDefault();
57014
+ if (button) {
57015
+ const synthetic = new KeyboardEvent("keydown", {
57016
+ key: e.key,
57017
+ bubbles: true,
57018
+ cancelable: true
57019
+ });
57020
+ synthetic[MENU_SYNTHETIC] = true;
57021
+ button.dispatchEvent(synthetic);
57022
+ }
57023
+ break;
57024
+ case "Tab":
57025
+ case "ArrowLeft":
57026
+ case "ArrowRight":
57027
+ button == null ? void 0 : button.click();
57028
+ break;
57029
+ }
57030
+ };
57031
+ props.eGridHeader.addEventListener("keydown", handler, true);
57032
+ return () => props.eGridHeader.removeEventListener("keydown", handler, true);
57033
+ }, [props.eGridHeader, props.enableMenu]);
56988
57034
  return /* @__PURE__ */ React80__default.default.createElement(
56989
57035
  coreReact.Flex,
56990
57036
  {
@@ -57059,6 +57105,7 @@ var GenericHeaderRenderer = (props) => {
57059
57105
  props.enableMenu && /* @__PURE__ */ React80__default.default.createElement(
57060
57106
  coreReact.DropdownFlyout,
57061
57107
  {
57108
+ ref: menuButtonRef,
57062
57109
  className: "data-table-header-menu",
57063
57110
  size: "sm",
57064
57111
  options: orderMenuOptions(),
@@ -104213,6 +104260,11 @@ var BulkEditPanel = ({}) => {
104213
104260
  const { contextPanel, suppressBulkEditToasts } = useInternalTableContext();
104214
104261
  const I18n = coreReact.useI18nContext();
104215
104262
  const bulkEditRef = React80__default.default.useRef(null);
104263
+ const bodyRef = React80__default.default.useRef(null);
104264
+ React80.useEffect(() => {
104265
+ var _a;
104266
+ (_a = bodyRef.current) == null ? void 0 : _a.focus();
104267
+ }, []);
104216
104268
  return /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel, null, /* @__PURE__ */ React80__default.default.createElement(
104217
104269
  coreReact.Panel.Header,
104218
104270
  {
@@ -104223,7 +104275,7 @@ var BulkEditPanel = ({}) => {
104223
104275
  }
104224
104276
  },
104225
104277
  /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel.Title, null, I18n.t("dataTable.bulkActions.editValues"))
104226
- ), /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel.Body, null, /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel.Section, null, /* @__PURE__ */ React80__default.default.createElement(
104278
+ ), /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel.Body, { ref: bodyRef }, /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel.Section, null, /* @__PURE__ */ React80__default.default.createElement(
104227
104279
  BulkEdit,
104228
104280
  {
104229
104281
  ref: bulkEditRef,
@@ -105773,6 +105825,7 @@ var en_default = {
105773
105825
  moreFilters: "More Filters",
105774
105826
  clearAllFilters: "Clear All Filters",
105775
105827
  close: "Close",
105828
+ removeFilterToken: "Remove %{name}",
105776
105829
  locationFilter: {
105777
105830
  selectAll: "Select all",
105778
105831
  includeSublocations: "Include sublocations",
@@ -105810,6 +105863,7 @@ var en_default = {
105810
105863
  secondary: "Information loading, thanks for your patience."
105811
105864
  },
105812
105865
  menuOptions: {
105866
+ ariaMenuColumn: "Press Alt/Option+Down to open column menu.",
105813
105867
  sortMenuItem: {
105814
105868
  label: "Sort By This Column",
105815
105869
  sortAscItem: "Sort Column Ascending",
@@ -107510,6 +107564,7 @@ var pseudo_default = {
107510
107564
  moreFilters: "[\u1E3E\u1E3E\u1E3E\u01FF\u0159\u1E17 \xB7 \u0191\u012B\u0140\u0167\u1E17\u0159\u015F\u015F\u015F]",
107511
107565
  clearAllFilters: "[\u0187\u0187\u0187\u0187\u0140\u1E17\u0227\u0159 \xB7 \u0226\u0140\u0140 \xB7 \u0191\u012B\u0140\u0167\u1E17\u0159\u015F\u015F\u015F\u015F]",
107512
107566
  close: "[\u0187\u0140\u01FF\u015F\u1E17]",
107567
+ removeFilterToken: "[\u0158\u0158\u1E17\u1E3F\u01FF\u1E7D\u1E17 \xB7 \xB7 [NOTRANSLATE]%{name}[/NOTRANSLATE]]",
107513
107568
  locationFilter: {
107514
107569
  selectAll: "[\u015E\u015E\u1E17\u0140\u1E17\u0188\u0167 \xB7 \u0227\u0140\u0140\u0140]",
107515
107570
  includeSublocations: "[\u012A\u012A\u012A\u012A\u019E\u0188\u0140\u016D\u1E13\u1E17 \xB7 \u015F\u016D\u0180\u0140\u01FF\u0188\u0227\u0167\u012B\u01FF\u019E\u015F\u015F\u015F\u015F]",
@@ -107547,6 +107602,7 @@ var pseudo_default = {
107547
107602
  secondary: "[\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u019E\u0192\u01FF\u0159\u1E3F\u0227\u0167\u012B\u01FF\u019E \xB7 \u0140\u01FF\u0227\u1E13\u012B\u019E\u0260, \xB7 \u0167\u0127\u0227\u019E\u0137\u015F \xB7 \u0192\u01FF\u0159 \xB7 \u1E8F\u01FF\u016D\u0159 \xB7 \u01A5\u0227\u0167\u012B\u1E17\u019E\u0188\u1E17..........]"
107548
107603
  },
107549
107604
  menuOptions: {
107605
+ ariaMenuColumn: "[\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u0159\u1E17\u015F\u015F \xB7 \u0226\u0140\u0167/\u01FE\u01A5\u0167\u012B\u01FF\u019E+\u1E12\u01FF\u1E87\u019E \xB7 \u0167\u01FF \xB7 \u01FF\u01A5\u1E17\u019E \xB7 \u0188\u01FF\u0140\u016D\u1E3F\u019E \xB7 \u1E3F\u1E17\u019E\u016D.........]",
107550
107606
  sortMenuItem: {
107551
107607
  label: "[\u015E\u015E\u015E\u015E\u01FF\u0159\u0167 \xB7 \u0181\u1E8F \xB7 \u0166\u0127\u012B\u015F \xB7 \u0187\u01FF\u0140\u016D\u1E3F\u019E\u019E\u019E\u019E]",
107552
107608
  sortAscItem: "[\u015E\u015E\u015E\u015E\u015E\u01FF\u0159\u0167 \xB7 \u0187\u01FF\u0140\u016D\u1E3F\u019E \xB7 \u0226\u015F\u0188\u1E17\u019E\u1E13\u012B\u019E\u0260\u0260\u0260\u0260\u0260]",
@@ -110585,7 +110641,21 @@ var Table = (props) => {
110585
110641
  params.api
110586
110642
  );
110587
110643
  },
110588
- headerCheckboxSelectionFilteredOnly: true
110644
+ headerCheckboxSelectionFilteredOnly: true,
110645
+ // Needed to suppress ag-grid's default keyboard event handling for header menu keys when menu is open
110646
+ suppressHeaderKeyboardEvent({ event }) {
110647
+ var _a2;
110648
+ const headerCell = (_a2 = event.target) == null ? void 0 : _a2.closest(
110649
+ ".ag-header-cell"
110650
+ );
110651
+ const isMenuOpen = !!(headerCell == null ? void 0 : headerCell.querySelector(
110652
+ '[aria-expanded="true"]'
110653
+ ));
110654
+ if (isMenuOpen && ["ArrowDown", "ArrowUp", "Enter", "Escape"].includes(event.key)) {
110655
+ return true;
110656
+ }
110657
+ return false;
110658
+ }
110589
110659
  };
110590
110660
  },
110591
110661
  [
@@ -110768,6 +110838,9 @@ var Table = (props) => {
110768
110838
  suppressPropertyNamesCheck: true,
110769
110839
  suppressRowClickSelection: props.suppressRowClickSelection || tableRowSelectionEnabled,
110770
110840
  suppressPaginationPanel: true,
110841
+ localeText: {
110842
+ ariaMenuColumn: I18n.t("dataTable.menuOptions.ariaMenuColumn")
110843
+ },
110771
110844
  tabToNextCell: props.tabToNextCell,
110772
110845
  ...clientSideRowData,
110773
110846
  ...detailRowConfigProps,
@@ -112412,6 +112485,7 @@ var StyledFilterTokenWrapper = styled4__default.default.div`
112412
112485
  var ClientSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112413
112486
  const { tableRef, filterState, getColumnDefinition } = useInternalTableContext();
112414
112487
  const hasNoContent = useTableHasNoContent();
112488
+ const I18n = coreReact.useI18nContext();
112415
112489
  const { quickFilters, tokens } = React80__default.default.useMemo(() => {
112416
112490
  return filterState.allAvailableFilters.reduce(
112417
112491
  (acc, filter) => {
@@ -112483,9 +112557,13 @@ var ClientSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112483
112557
  if (!colDef) {
112484
112558
  return null;
112485
112559
  }
112486
- return /* @__PURE__ */ React80__default.default.createElement(StyledFilterTokenWrapper, { key: filter.field }, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken, null, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80__default.default.createElement(React80__default.default.Fragment, null, getFilterTokenText(colDef, filter.filterValues))), /* @__PURE__ */ React80__default.default.createElement(
112560
+ const tokenText = getFilterTokenText(colDef, filter.filterValues);
112561
+ return /* @__PURE__ */ React80__default.default.createElement(StyledFilterTokenWrapper, { key: filter.field }, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken, null, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80__default.default.createElement(React80__default.default.Fragment, null, tokenText)), /* @__PURE__ */ React80__default.default.createElement(
112487
112562
  coreReact.UNSAFE_FilterToken.Remove,
112488
112563
  {
112564
+ "aria-label": I18n.t("dataTable.filters.removeFilterToken", {
112565
+ name: tokenText
112566
+ }),
112489
112567
  onClick: () => {
112490
112568
  var _a;
112491
112569
  return (_a = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _a.removeFilter(filter.field);
@@ -112507,6 +112585,7 @@ var ServerSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112507
112585
  getColumnDefinition
112508
112586
  } = useInternalTableContext();
112509
112587
  const hasNoContent = useTableHasNoContent();
112588
+ const I18n = coreReact.useI18nContext();
112510
112589
  const { quickFilterNames, tokenNames } = React80__default.default.useMemo(() => {
112511
112590
  const appliedFilterNames = Object.keys(selectedFilters);
112512
112591
  const isActiveFilter = (filterName) => appliedFilterNames.includes(filterName);
@@ -112582,12 +112661,16 @@ var ServerSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112582
112661
  return null;
112583
112662
  }
112584
112663
  const filter = getListFilter(fieldName);
112585
- return /* @__PURE__ */ React80__default.default.createElement(StyledFilterTokenWrapper, { key: fieldName }, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken, null, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80__default.default.createElement(React80__default.default.Fragment, null, getFilterTokenText(
112664
+ const tokenText = getFilterTokenText(
112586
112665
  colDef,
112587
112666
  colDef.filterRenderer === DateFilterRenderer_default ? filter.value : filter.selected
112588
- ))), /* @__PURE__ */ React80__default.default.createElement(
112667
+ );
112668
+ return /* @__PURE__ */ React80__default.default.createElement(StyledFilterTokenWrapper, { key: fieldName }, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken, null, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80__default.default.createElement(React80__default.default.Fragment, null, tokenText)), /* @__PURE__ */ React80__default.default.createElement(
112589
112669
  coreReact.UNSAFE_FilterToken.Remove,
112590
112670
  {
112671
+ "aria-label": I18n.t("dataTable.filters.removeFilterToken", {
112672
+ name: tokenText
112673
+ }),
112591
112674
  "data-qa": "data-table-quick-filter-remove-token",
112592
112675
  onClick: () => onClearFilter(fieldName)
112593
112676
  }
@@ -56606,6 +56606,7 @@ var GenericHeaderRenderer = (props) => {
56606
56606
  I18n
56607
56607
  );
56608
56608
  const headerCellRef = useRef(null);
56609
+ const menuButtonRef = useRef(null);
56609
56610
  const headerCheckboxSelection = colDef.headerCheckboxSelection;
56610
56611
  const headerCheckboxSelectionEnabled = typeof headerCheckboxSelection === "function" ? headerCheckboxSelection({
56611
56612
  api: props.api,
@@ -56972,6 +56973,51 @@ var GenericHeaderRenderer = (props) => {
56972
56973
  expansionVariant,
56973
56974
  onSSDR
56974
56975
  );
56976
+ React80.useEffect(() => {
56977
+ if (!props.enableMenu) return;
56978
+ const MENU_SYNTHETIC = "__menu_synthetic_keydown";
56979
+ const handler = (e) => {
56980
+ var _a2;
56981
+ const button = (_a2 = menuButtonRef.current) == null ? void 0 : _a2.querySelector("button");
56982
+ const isMenuOpen = (button == null ? void 0 : button.getAttribute("aria-expanded")) === "true";
56983
+ if (e[MENU_SYNTHETIC]) {
56984
+ return;
56985
+ }
56986
+ if (e.altKey && e.key === "ArrowDown" && !isMenuOpen) {
56987
+ e.preventDefault();
56988
+ e.stopPropagation();
56989
+ button == null ? void 0 : button.focus();
56990
+ button == null ? void 0 : button.click();
56991
+ return;
56992
+ }
56993
+ if (!isMenuOpen) return;
56994
+ switch (e.key) {
56995
+ case "ArrowDown":
56996
+ case "ArrowUp":
56997
+ case "Enter":
56998
+ case "Escape":
56999
+ e.stopPropagation();
57000
+ e.preventDefault();
57001
+ if (button) {
57002
+ const synthetic = new KeyboardEvent("keydown", {
57003
+ key: e.key,
57004
+ bubbles: true,
57005
+ cancelable: true
57006
+ });
57007
+ synthetic[MENU_SYNTHETIC] = true;
57008
+ button.dispatchEvent(synthetic);
57009
+ }
57010
+ break;
57011
+ case "Tab":
57012
+ case "ArrowLeft":
57013
+ case "ArrowRight":
57014
+ button == null ? void 0 : button.click();
57015
+ break;
57016
+ }
57017
+ };
57018
+ props.eGridHeader.addEventListener("keydown", handler, true);
57019
+ return () => props.eGridHeader.removeEventListener("keydown", handler, true);
57020
+ }, [props.eGridHeader, props.enableMenu]);
56975
57021
  return /* @__PURE__ */ React80.createElement(
56976
57022
  Flex,
56977
57023
  {
@@ -57046,6 +57092,7 @@ var GenericHeaderRenderer = (props) => {
57046
57092
  props.enableMenu && /* @__PURE__ */ React80.createElement(
57047
57093
  DropdownFlyout,
57048
57094
  {
57095
+ ref: menuButtonRef,
57049
57096
  className: "data-table-header-menu",
57050
57097
  size: "sm",
57051
57098
  options: orderMenuOptions(),
@@ -104200,6 +104247,11 @@ var BulkEditPanel = ({}) => {
104200
104247
  const { contextPanel, suppressBulkEditToasts } = useInternalTableContext();
104201
104248
  const I18n = useI18nContext();
104202
104249
  const bulkEditRef = React80.useRef(null);
104250
+ const bodyRef = React80.useRef(null);
104251
+ useEffect(() => {
104252
+ var _a;
104253
+ (_a = bodyRef.current) == null ? void 0 : _a.focus();
104254
+ }, []);
104203
104255
  return /* @__PURE__ */ React80.createElement(Panel, null, /* @__PURE__ */ React80.createElement(
104204
104256
  Panel.Header,
104205
104257
  {
@@ -104210,7 +104262,7 @@ var BulkEditPanel = ({}) => {
104210
104262
  }
104211
104263
  },
104212
104264
  /* @__PURE__ */ React80.createElement(Panel.Title, null, I18n.t("dataTable.bulkActions.editValues"))
104213
- ), /* @__PURE__ */ React80.createElement(Panel.Body, null, /* @__PURE__ */ React80.createElement(Panel.Section, null, /* @__PURE__ */ React80.createElement(
104265
+ ), /* @__PURE__ */ React80.createElement(Panel.Body, { ref: bodyRef }, /* @__PURE__ */ React80.createElement(Panel.Section, null, /* @__PURE__ */ React80.createElement(
104214
104266
  BulkEdit,
104215
104267
  {
104216
104268
  ref: bulkEditRef,
@@ -105760,6 +105812,7 @@ var en_default = {
105760
105812
  moreFilters: "More Filters",
105761
105813
  clearAllFilters: "Clear All Filters",
105762
105814
  close: "Close",
105815
+ removeFilterToken: "Remove %{name}",
105763
105816
  locationFilter: {
105764
105817
  selectAll: "Select all",
105765
105818
  includeSublocations: "Include sublocations",
@@ -105797,6 +105850,7 @@ var en_default = {
105797
105850
  secondary: "Information loading, thanks for your patience."
105798
105851
  },
105799
105852
  menuOptions: {
105853
+ ariaMenuColumn: "Press Alt/Option+Down to open column menu.",
105800
105854
  sortMenuItem: {
105801
105855
  label: "Sort By This Column",
105802
105856
  sortAscItem: "Sort Column Ascending",
@@ -107497,6 +107551,7 @@ var pseudo_default = {
107497
107551
  moreFilters: "[\u1E3E\u1E3E\u1E3E\u01FF\u0159\u1E17 \xB7 \u0191\u012B\u0140\u0167\u1E17\u0159\u015F\u015F\u015F]",
107498
107552
  clearAllFilters: "[\u0187\u0187\u0187\u0187\u0140\u1E17\u0227\u0159 \xB7 \u0226\u0140\u0140 \xB7 \u0191\u012B\u0140\u0167\u1E17\u0159\u015F\u015F\u015F\u015F]",
107499
107553
  close: "[\u0187\u0140\u01FF\u015F\u1E17]",
107554
+ removeFilterToken: "[\u0158\u0158\u1E17\u1E3F\u01FF\u1E7D\u1E17 \xB7 \xB7 [NOTRANSLATE]%{name}[/NOTRANSLATE]]",
107500
107555
  locationFilter: {
107501
107556
  selectAll: "[\u015E\u015E\u1E17\u0140\u1E17\u0188\u0167 \xB7 \u0227\u0140\u0140\u0140]",
107502
107557
  includeSublocations: "[\u012A\u012A\u012A\u012A\u019E\u0188\u0140\u016D\u1E13\u1E17 \xB7 \u015F\u016D\u0180\u0140\u01FF\u0188\u0227\u0167\u012B\u01FF\u019E\u015F\u015F\u015F\u015F]",
@@ -107534,6 +107589,7 @@ var pseudo_default = {
107534
107589
  secondary: "[\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u019E\u0192\u01FF\u0159\u1E3F\u0227\u0167\u012B\u01FF\u019E \xB7 \u0140\u01FF\u0227\u1E13\u012B\u019E\u0260, \xB7 \u0167\u0127\u0227\u019E\u0137\u015F \xB7 \u0192\u01FF\u0159 \xB7 \u1E8F\u01FF\u016D\u0159 \xB7 \u01A5\u0227\u0167\u012B\u1E17\u019E\u0188\u1E17..........]"
107535
107590
  },
107536
107591
  menuOptions: {
107592
+ ariaMenuColumn: "[\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u0159\u1E17\u015F\u015F \xB7 \u0226\u0140\u0167/\u01FE\u01A5\u0167\u012B\u01FF\u019E+\u1E12\u01FF\u1E87\u019E \xB7 \u0167\u01FF \xB7 \u01FF\u01A5\u1E17\u019E \xB7 \u0188\u01FF\u0140\u016D\u1E3F\u019E \xB7 \u1E3F\u1E17\u019E\u016D.........]",
107537
107593
  sortMenuItem: {
107538
107594
  label: "[\u015E\u015E\u015E\u015E\u01FF\u0159\u0167 \xB7 \u0181\u1E8F \xB7 \u0166\u0127\u012B\u015F \xB7 \u0187\u01FF\u0140\u016D\u1E3F\u019E\u019E\u019E\u019E]",
107539
107595
  sortAscItem: "[\u015E\u015E\u015E\u015E\u015E\u01FF\u0159\u0167 \xB7 \u0187\u01FF\u0140\u016D\u1E3F\u019E \xB7 \u0226\u015F\u0188\u1E17\u019E\u1E13\u012B\u019E\u0260\u0260\u0260\u0260\u0260]",
@@ -110572,7 +110628,21 @@ var Table = (props) => {
110572
110628
  params.api
110573
110629
  );
110574
110630
  },
110575
- headerCheckboxSelectionFilteredOnly: true
110631
+ headerCheckboxSelectionFilteredOnly: true,
110632
+ // Needed to suppress ag-grid's default keyboard event handling for header menu keys when menu is open
110633
+ suppressHeaderKeyboardEvent({ event }) {
110634
+ var _a2;
110635
+ const headerCell = (_a2 = event.target) == null ? void 0 : _a2.closest(
110636
+ ".ag-header-cell"
110637
+ );
110638
+ const isMenuOpen = !!(headerCell == null ? void 0 : headerCell.querySelector(
110639
+ '[aria-expanded="true"]'
110640
+ ));
110641
+ if (isMenuOpen && ["ArrowDown", "ArrowUp", "Enter", "Escape"].includes(event.key)) {
110642
+ return true;
110643
+ }
110644
+ return false;
110645
+ }
110576
110646
  };
110577
110647
  },
110578
110648
  [
@@ -110755,6 +110825,9 @@ var Table = (props) => {
110755
110825
  suppressPropertyNamesCheck: true,
110756
110826
  suppressRowClickSelection: props.suppressRowClickSelection || tableRowSelectionEnabled,
110757
110827
  suppressPaginationPanel: true,
110828
+ localeText: {
110829
+ ariaMenuColumn: I18n.t("dataTable.menuOptions.ariaMenuColumn")
110830
+ },
110758
110831
  tabToNextCell: props.tabToNextCell,
110759
110832
  ...clientSideRowData,
110760
110833
  ...detailRowConfigProps,
@@ -112399,6 +112472,7 @@ var StyledFilterTokenWrapper = styled4.div`
112399
112472
  var ClientSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112400
112473
  const { tableRef, filterState, getColumnDefinition } = useInternalTableContext();
112401
112474
  const hasNoContent = useTableHasNoContent();
112475
+ const I18n = useI18nContext();
112402
112476
  const { quickFilters, tokens } = React80.useMemo(() => {
112403
112477
  return filterState.allAvailableFilters.reduce(
112404
112478
  (acc, filter) => {
@@ -112470,9 +112544,13 @@ var ClientSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112470
112544
  if (!colDef) {
112471
112545
  return null;
112472
112546
  }
112473
- return /* @__PURE__ */ React80.createElement(StyledFilterTokenWrapper, { key: filter.field }, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken, null, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80.createElement(React80.Fragment, null, getFilterTokenText(colDef, filter.filterValues))), /* @__PURE__ */ React80.createElement(
112547
+ const tokenText = getFilterTokenText(colDef, filter.filterValues);
112548
+ return /* @__PURE__ */ React80.createElement(StyledFilterTokenWrapper, { key: filter.field }, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken, null, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80.createElement(React80.Fragment, null, tokenText)), /* @__PURE__ */ React80.createElement(
112474
112549
  UNSAFE_FilterToken.Remove,
112475
112550
  {
112551
+ "aria-label": I18n.t("dataTable.filters.removeFilterToken", {
112552
+ name: tokenText
112553
+ }),
112476
112554
  onClick: () => {
112477
112555
  var _a;
112478
112556
  return (_a = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _a.removeFilter(filter.field);
@@ -112494,6 +112572,7 @@ var ServerSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112494
112572
  getColumnDefinition
112495
112573
  } = useInternalTableContext();
112496
112574
  const hasNoContent = useTableHasNoContent();
112575
+ const I18n = useI18nContext();
112497
112576
  const { quickFilterNames, tokenNames } = React80.useMemo(() => {
112498
112577
  const appliedFilterNames = Object.keys(selectedFilters);
112499
112578
  const isActiveFilter = (filterName) => appliedFilterNames.includes(filterName);
@@ -112569,12 +112648,16 @@ var ServerSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112569
112648
  return null;
112570
112649
  }
112571
112650
  const filter = getListFilter(fieldName);
112572
- return /* @__PURE__ */ React80.createElement(StyledFilterTokenWrapper, { key: fieldName }, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken, null, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80.createElement(React80.Fragment, null, getFilterTokenText(
112651
+ const tokenText = getFilterTokenText(
112573
112652
  colDef,
112574
112653
  colDef.filterRenderer === DateFilterRenderer_default ? filter.value : filter.selected
112575
- ))), /* @__PURE__ */ React80.createElement(
112654
+ );
112655
+ return /* @__PURE__ */ React80.createElement(StyledFilterTokenWrapper, { key: fieldName }, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken, null, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80.createElement(React80.Fragment, null, tokenText)), /* @__PURE__ */ React80.createElement(
112576
112656
  UNSAFE_FilterToken.Remove,
112577
112657
  {
112658
+ "aria-label": I18n.t("dataTable.filters.removeFilterToken", {
112659
+ name: tokenText
112660
+ }),
112578
112661
  "data-qa": "data-table-quick-filter-remove-token",
112579
112662
  onClick: () => onClearFilter(fieldName)
112580
112663
  }
@@ -56540,6 +56540,7 @@ var GenericHeaderRenderer = (props) => {
56540
56540
  I18n
56541
56541
  );
56542
56542
  const headerCellRef = React80.useRef(null);
56543
+ const menuButtonRef = React80.useRef(null);
56543
56544
  const headerCheckboxSelection = colDef.headerCheckboxSelection;
56544
56545
  const headerCheckboxSelectionEnabled = typeof headerCheckboxSelection === "function" ? headerCheckboxSelection({
56545
56546
  api: props.api,
@@ -56898,6 +56899,50 @@ var GenericHeaderRenderer = (props) => {
56898
56899
  expansionVariant,
56899
56900
  onSSDR
56900
56901
  );
56902
+ React80__default.default.useEffect(() => {
56903
+ if (!props.enableMenu) return;
56904
+ const MENU_SYNTHETIC = "__menu_synthetic_keydown";
56905
+ const handler = (e) => {
56906
+ const button = menuButtonRef.current?.querySelector("button");
56907
+ const isMenuOpen = button?.getAttribute("aria-expanded") === "true";
56908
+ if (e[MENU_SYNTHETIC]) {
56909
+ return;
56910
+ }
56911
+ if (e.altKey && e.key === "ArrowDown" && !isMenuOpen) {
56912
+ e.preventDefault();
56913
+ e.stopPropagation();
56914
+ button?.focus();
56915
+ button?.click();
56916
+ return;
56917
+ }
56918
+ if (!isMenuOpen) return;
56919
+ switch (e.key) {
56920
+ case "ArrowDown":
56921
+ case "ArrowUp":
56922
+ case "Enter":
56923
+ case "Escape":
56924
+ e.stopPropagation();
56925
+ e.preventDefault();
56926
+ if (button) {
56927
+ const synthetic = new KeyboardEvent("keydown", {
56928
+ key: e.key,
56929
+ bubbles: true,
56930
+ cancelable: true
56931
+ });
56932
+ synthetic[MENU_SYNTHETIC] = true;
56933
+ button.dispatchEvent(synthetic);
56934
+ }
56935
+ break;
56936
+ case "Tab":
56937
+ case "ArrowLeft":
56938
+ case "ArrowRight":
56939
+ button?.click();
56940
+ break;
56941
+ }
56942
+ };
56943
+ props.eGridHeader.addEventListener("keydown", handler, true);
56944
+ return () => props.eGridHeader.removeEventListener("keydown", handler, true);
56945
+ }, [props.eGridHeader, props.enableMenu]);
56901
56946
  return /* @__PURE__ */ React80__default.default.createElement(
56902
56947
  coreReact.Flex,
56903
56948
  {
@@ -56972,6 +57017,7 @@ var GenericHeaderRenderer = (props) => {
56972
57017
  props.enableMenu && /* @__PURE__ */ React80__default.default.createElement(
56973
57018
  coreReact.DropdownFlyout,
56974
57019
  {
57020
+ ref: menuButtonRef,
56975
57021
  className: "data-table-header-menu",
56976
57022
  size: "sm",
56977
57023
  options: orderMenuOptions(),
@@ -104091,6 +104137,10 @@ var BulkEditPanel = ({}) => {
104091
104137
  const { contextPanel, suppressBulkEditToasts } = useInternalTableContext();
104092
104138
  const I18n = coreReact.useI18nContext();
104093
104139
  const bulkEditRef = React80__default.default.useRef(null);
104140
+ const bodyRef = React80__default.default.useRef(null);
104141
+ React80.useEffect(() => {
104142
+ bodyRef.current?.focus();
104143
+ }, []);
104094
104144
  return /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel, null, /* @__PURE__ */ React80__default.default.createElement(
104095
104145
  coreReact.Panel.Header,
104096
104146
  {
@@ -104100,7 +104150,7 @@ var BulkEditPanel = ({}) => {
104100
104150
  }
104101
104151
  },
104102
104152
  /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel.Title, null, I18n.t("dataTable.bulkActions.editValues"))
104103
- ), /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel.Body, null, /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel.Section, null, /* @__PURE__ */ React80__default.default.createElement(
104153
+ ), /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel.Body, { ref: bodyRef }, /* @__PURE__ */ React80__default.default.createElement(coreReact.Panel.Section, null, /* @__PURE__ */ React80__default.default.createElement(
104104
104154
  BulkEdit,
104105
104155
  {
104106
104156
  ref: bulkEditRef,
@@ -105634,6 +105684,7 @@ var en_default = {
105634
105684
  moreFilters: "More Filters",
105635
105685
  clearAllFilters: "Clear All Filters",
105636
105686
  close: "Close",
105687
+ removeFilterToken: "Remove %{name}",
105637
105688
  locationFilter: {
105638
105689
  selectAll: "Select all",
105639
105690
  includeSublocations: "Include sublocations",
@@ -105671,6 +105722,7 @@ var en_default = {
105671
105722
  secondary: "Information loading, thanks for your patience."
105672
105723
  },
105673
105724
  menuOptions: {
105725
+ ariaMenuColumn: "Press Alt/Option+Down to open column menu.",
105674
105726
  sortMenuItem: {
105675
105727
  label: "Sort By This Column",
105676
105728
  sortAscItem: "Sort Column Ascending",
@@ -107371,6 +107423,7 @@ var pseudo_default = {
107371
107423
  moreFilters: "[\u1E3E\u1E3E\u1E3E\u01FF\u0159\u1E17 \xB7 \u0191\u012B\u0140\u0167\u1E17\u0159\u015F\u015F\u015F]",
107372
107424
  clearAllFilters: "[\u0187\u0187\u0187\u0187\u0140\u1E17\u0227\u0159 \xB7 \u0226\u0140\u0140 \xB7 \u0191\u012B\u0140\u0167\u1E17\u0159\u015F\u015F\u015F\u015F]",
107373
107425
  close: "[\u0187\u0140\u01FF\u015F\u1E17]",
107426
+ removeFilterToken: "[\u0158\u0158\u1E17\u1E3F\u01FF\u1E7D\u1E17 \xB7 \xB7 [NOTRANSLATE]%{name}[/NOTRANSLATE]]",
107374
107427
  locationFilter: {
107375
107428
  selectAll: "[\u015E\u015E\u1E17\u0140\u1E17\u0188\u0167 \xB7 \u0227\u0140\u0140\u0140]",
107376
107429
  includeSublocations: "[\u012A\u012A\u012A\u012A\u019E\u0188\u0140\u016D\u1E13\u1E17 \xB7 \u015F\u016D\u0180\u0140\u01FF\u0188\u0227\u0167\u012B\u01FF\u019E\u015F\u015F\u015F\u015F]",
@@ -107408,6 +107461,7 @@ var pseudo_default = {
107408
107461
  secondary: "[\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u019E\u0192\u01FF\u0159\u1E3F\u0227\u0167\u012B\u01FF\u019E \xB7 \u0140\u01FF\u0227\u1E13\u012B\u019E\u0260, \xB7 \u0167\u0127\u0227\u019E\u0137\u015F \xB7 \u0192\u01FF\u0159 \xB7 \u1E8F\u01FF\u016D\u0159 \xB7 \u01A5\u0227\u0167\u012B\u1E17\u019E\u0188\u1E17..........]"
107409
107462
  },
107410
107463
  menuOptions: {
107464
+ ariaMenuColumn: "[\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u0159\u1E17\u015F\u015F \xB7 \u0226\u0140\u0167/\u01FE\u01A5\u0167\u012B\u01FF\u019E+\u1E12\u01FF\u1E87\u019E \xB7 \u0167\u01FF \xB7 \u01FF\u01A5\u1E17\u019E \xB7 \u0188\u01FF\u0140\u016D\u1E3F\u019E \xB7 \u1E3F\u1E17\u019E\u016D.........]",
107411
107465
  sortMenuItem: {
107412
107466
  label: "[\u015E\u015E\u015E\u015E\u01FF\u0159\u0167 \xB7 \u0181\u1E8F \xB7 \u0166\u0127\u012B\u015F \xB7 \u0187\u01FF\u0140\u016D\u1E3F\u019E\u019E\u019E\u019E]",
107413
107467
  sortAscItem: "[\u015E\u015E\u015E\u015E\u015E\u01FF\u0159\u0167 \xB7 \u0187\u01FF\u0140\u016D\u1E3F\u019E \xB7 \u0226\u015F\u0188\u1E17\u019E\u1E13\u012B\u019E\u0260\u0260\u0260\u0260\u0260]",
@@ -110396,7 +110450,20 @@ var Table = (props) => {
110396
110450
  params.api
110397
110451
  );
110398
110452
  },
110399
- headerCheckboxSelectionFilteredOnly: true
110453
+ headerCheckboxSelectionFilteredOnly: true,
110454
+ // Needed to suppress ag-grid's default keyboard event handling for header menu keys when menu is open
110455
+ suppressHeaderKeyboardEvent({ event }) {
110456
+ const headerCell = event.target?.closest(
110457
+ ".ag-header-cell"
110458
+ );
110459
+ const isMenuOpen = !!headerCell?.querySelector(
110460
+ '[aria-expanded="true"]'
110461
+ );
110462
+ if (isMenuOpen && ["ArrowDown", "ArrowUp", "Enter", "Escape"].includes(event.key)) {
110463
+ return true;
110464
+ }
110465
+ return false;
110466
+ }
110400
110467
  };
110401
110468
  },
110402
110469
  [
@@ -110579,6 +110646,9 @@ var Table = (props) => {
110579
110646
  suppressPropertyNamesCheck: true,
110580
110647
  suppressRowClickSelection: props.suppressRowClickSelection || tableRowSelectionEnabled,
110581
110648
  suppressPaginationPanel: true,
110649
+ localeText: {
110650
+ ariaMenuColumn: I18n.t("dataTable.menuOptions.ariaMenuColumn")
110651
+ },
110582
110652
  tabToNextCell: props.tabToNextCell,
110583
110653
  ...clientSideRowData,
110584
110654
  ...detailRowConfigProps,
@@ -112196,6 +112266,7 @@ var StyledFilterTokenWrapper = styled4__default.default.div`
112196
112266
  var ClientSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112197
112267
  const { tableRef, filterState, getColumnDefinition } = useInternalTableContext();
112198
112268
  const hasNoContent = useTableHasNoContent();
112269
+ const I18n = coreReact.useI18nContext();
112199
112270
  const { quickFilters, tokens } = React80__default.default.useMemo(() => {
112200
112271
  return filterState.allAvailableFilters.reduce(
112201
112272
  (acc, filter) => {
@@ -112260,9 +112331,13 @@ var ClientSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112260
112331
  if (!colDef) {
112261
112332
  return null;
112262
112333
  }
112263
- return /* @__PURE__ */ React80__default.default.createElement(StyledFilterTokenWrapper, { key: filter.field }, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken, null, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80__default.default.createElement(React80__default.default.Fragment, null, getFilterTokenText(colDef, filter.filterValues))), /* @__PURE__ */ React80__default.default.createElement(
112334
+ const tokenText = getFilterTokenText(colDef, filter.filterValues);
112335
+ return /* @__PURE__ */ React80__default.default.createElement(StyledFilterTokenWrapper, { key: filter.field }, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken, null, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80__default.default.createElement(React80__default.default.Fragment, null, tokenText)), /* @__PURE__ */ React80__default.default.createElement(
112264
112336
  coreReact.UNSAFE_FilterToken.Remove,
112265
112337
  {
112338
+ "aria-label": I18n.t("dataTable.filters.removeFilterToken", {
112339
+ name: tokenText
112340
+ }),
112266
112341
  onClick: () => tableRef?.current?.removeFilter(filter.field)
112267
112342
  }
112268
112343
  )));
@@ -112281,6 +112356,7 @@ var ServerSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112281
112356
  getColumnDefinition
112282
112357
  } = useInternalTableContext();
112283
112358
  const hasNoContent = useTableHasNoContent();
112359
+ const I18n = coreReact.useI18nContext();
112284
112360
  const { quickFilterNames, tokenNames } = React80__default.default.useMemo(() => {
112285
112361
  const appliedFilterNames = Object.keys(selectedFilters);
112286
112362
  const isActiveFilter = (filterName) => appliedFilterNames.includes(filterName);
@@ -112355,12 +112431,16 @@ var ServerSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112355
112431
  return null;
112356
112432
  }
112357
112433
  const filter = getListFilter(fieldName);
112358
- return /* @__PURE__ */ React80__default.default.createElement(StyledFilterTokenWrapper, { key: fieldName }, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken, null, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80__default.default.createElement(React80__default.default.Fragment, null, getFilterTokenText(
112434
+ const tokenText = getFilterTokenText(
112359
112435
  colDef,
112360
112436
  colDef.filterRenderer === DateFilterRenderer_default ? filter.value : filter.selected
112361
- ))), /* @__PURE__ */ React80__default.default.createElement(
112437
+ );
112438
+ return /* @__PURE__ */ React80__default.default.createElement(StyledFilterTokenWrapper, { key: fieldName }, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken, null, /* @__PURE__ */ React80__default.default.createElement(coreReact.UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80__default.default.createElement(React80__default.default.Fragment, null, tokenText)), /* @__PURE__ */ React80__default.default.createElement(
112362
112439
  coreReact.UNSAFE_FilterToken.Remove,
112363
112440
  {
112441
+ "aria-label": I18n.t("dataTable.filters.removeFilterToken", {
112442
+ name: tokenText
112443
+ }),
112364
112444
  "data-qa": "data-table-quick-filter-remove-token",
112365
112445
  onClick: () => onClearFilter(fieldName)
112366
112446
  }
@@ -56527,6 +56527,7 @@ var GenericHeaderRenderer = (props) => {
56527
56527
  I18n
56528
56528
  );
56529
56529
  const headerCellRef = useRef(null);
56530
+ const menuButtonRef = useRef(null);
56530
56531
  const headerCheckboxSelection = colDef.headerCheckboxSelection;
56531
56532
  const headerCheckboxSelectionEnabled = typeof headerCheckboxSelection === "function" ? headerCheckboxSelection({
56532
56533
  api: props.api,
@@ -56885,6 +56886,50 @@ var GenericHeaderRenderer = (props) => {
56885
56886
  expansionVariant,
56886
56887
  onSSDR
56887
56888
  );
56889
+ React80.useEffect(() => {
56890
+ if (!props.enableMenu) return;
56891
+ const MENU_SYNTHETIC = "__menu_synthetic_keydown";
56892
+ const handler = (e) => {
56893
+ const button = menuButtonRef.current?.querySelector("button");
56894
+ const isMenuOpen = button?.getAttribute("aria-expanded") === "true";
56895
+ if (e[MENU_SYNTHETIC]) {
56896
+ return;
56897
+ }
56898
+ if (e.altKey && e.key === "ArrowDown" && !isMenuOpen) {
56899
+ e.preventDefault();
56900
+ e.stopPropagation();
56901
+ button?.focus();
56902
+ button?.click();
56903
+ return;
56904
+ }
56905
+ if (!isMenuOpen) return;
56906
+ switch (e.key) {
56907
+ case "ArrowDown":
56908
+ case "ArrowUp":
56909
+ case "Enter":
56910
+ case "Escape":
56911
+ e.stopPropagation();
56912
+ e.preventDefault();
56913
+ if (button) {
56914
+ const synthetic = new KeyboardEvent("keydown", {
56915
+ key: e.key,
56916
+ bubbles: true,
56917
+ cancelable: true
56918
+ });
56919
+ synthetic[MENU_SYNTHETIC] = true;
56920
+ button.dispatchEvent(synthetic);
56921
+ }
56922
+ break;
56923
+ case "Tab":
56924
+ case "ArrowLeft":
56925
+ case "ArrowRight":
56926
+ button?.click();
56927
+ break;
56928
+ }
56929
+ };
56930
+ props.eGridHeader.addEventListener("keydown", handler, true);
56931
+ return () => props.eGridHeader.removeEventListener("keydown", handler, true);
56932
+ }, [props.eGridHeader, props.enableMenu]);
56888
56933
  return /* @__PURE__ */ React80.createElement(
56889
56934
  Flex,
56890
56935
  {
@@ -56959,6 +57004,7 @@ var GenericHeaderRenderer = (props) => {
56959
57004
  props.enableMenu && /* @__PURE__ */ React80.createElement(
56960
57005
  DropdownFlyout,
56961
57006
  {
57007
+ ref: menuButtonRef,
56962
57008
  className: "data-table-header-menu",
56963
57009
  size: "sm",
56964
57010
  options: orderMenuOptions(),
@@ -104078,6 +104124,10 @@ var BulkEditPanel = ({}) => {
104078
104124
  const { contextPanel, suppressBulkEditToasts } = useInternalTableContext();
104079
104125
  const I18n = useI18nContext();
104080
104126
  const bulkEditRef = React80.useRef(null);
104127
+ const bodyRef = React80.useRef(null);
104128
+ useEffect(() => {
104129
+ bodyRef.current?.focus();
104130
+ }, []);
104081
104131
  return /* @__PURE__ */ React80.createElement(Panel, null, /* @__PURE__ */ React80.createElement(
104082
104132
  Panel.Header,
104083
104133
  {
@@ -104087,7 +104137,7 @@ var BulkEditPanel = ({}) => {
104087
104137
  }
104088
104138
  },
104089
104139
  /* @__PURE__ */ React80.createElement(Panel.Title, null, I18n.t("dataTable.bulkActions.editValues"))
104090
- ), /* @__PURE__ */ React80.createElement(Panel.Body, null, /* @__PURE__ */ React80.createElement(Panel.Section, null, /* @__PURE__ */ React80.createElement(
104140
+ ), /* @__PURE__ */ React80.createElement(Panel.Body, { ref: bodyRef }, /* @__PURE__ */ React80.createElement(Panel.Section, null, /* @__PURE__ */ React80.createElement(
104091
104141
  BulkEdit,
104092
104142
  {
104093
104143
  ref: bulkEditRef,
@@ -105621,6 +105671,7 @@ var en_default = {
105621
105671
  moreFilters: "More Filters",
105622
105672
  clearAllFilters: "Clear All Filters",
105623
105673
  close: "Close",
105674
+ removeFilterToken: "Remove %{name}",
105624
105675
  locationFilter: {
105625
105676
  selectAll: "Select all",
105626
105677
  includeSublocations: "Include sublocations",
@@ -105658,6 +105709,7 @@ var en_default = {
105658
105709
  secondary: "Information loading, thanks for your patience."
105659
105710
  },
105660
105711
  menuOptions: {
105712
+ ariaMenuColumn: "Press Alt/Option+Down to open column menu.",
105661
105713
  sortMenuItem: {
105662
105714
  label: "Sort By This Column",
105663
105715
  sortAscItem: "Sort Column Ascending",
@@ -107358,6 +107410,7 @@ var pseudo_default = {
107358
107410
  moreFilters: "[\u1E3E\u1E3E\u1E3E\u01FF\u0159\u1E17 \xB7 \u0191\u012B\u0140\u0167\u1E17\u0159\u015F\u015F\u015F]",
107359
107411
  clearAllFilters: "[\u0187\u0187\u0187\u0187\u0140\u1E17\u0227\u0159 \xB7 \u0226\u0140\u0140 \xB7 \u0191\u012B\u0140\u0167\u1E17\u0159\u015F\u015F\u015F\u015F]",
107360
107412
  close: "[\u0187\u0140\u01FF\u015F\u1E17]",
107413
+ removeFilterToken: "[\u0158\u0158\u1E17\u1E3F\u01FF\u1E7D\u1E17 \xB7 \xB7 [NOTRANSLATE]%{name}[/NOTRANSLATE]]",
107361
107414
  locationFilter: {
107362
107415
  selectAll: "[\u015E\u015E\u1E17\u0140\u1E17\u0188\u0167 \xB7 \u0227\u0140\u0140\u0140]",
107363
107416
  includeSublocations: "[\u012A\u012A\u012A\u012A\u019E\u0188\u0140\u016D\u1E13\u1E17 \xB7 \u015F\u016D\u0180\u0140\u01FF\u0188\u0227\u0167\u012B\u01FF\u019E\u015F\u015F\u015F\u015F]",
@@ -107395,6 +107448,7 @@ var pseudo_default = {
107395
107448
  secondary: "[\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u012A\u019E\u0192\u01FF\u0159\u1E3F\u0227\u0167\u012B\u01FF\u019E \xB7 \u0140\u01FF\u0227\u1E13\u012B\u019E\u0260, \xB7 \u0167\u0127\u0227\u019E\u0137\u015F \xB7 \u0192\u01FF\u0159 \xB7 \u1E8F\u01FF\u016D\u0159 \xB7 \u01A5\u0227\u0167\u012B\u1E17\u019E\u0188\u1E17..........]"
107396
107449
  },
107397
107450
  menuOptions: {
107451
+ ariaMenuColumn: "[\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u01A4\u0159\u1E17\u015F\u015F \xB7 \u0226\u0140\u0167/\u01FE\u01A5\u0167\u012B\u01FF\u019E+\u1E12\u01FF\u1E87\u019E \xB7 \u0167\u01FF \xB7 \u01FF\u01A5\u1E17\u019E \xB7 \u0188\u01FF\u0140\u016D\u1E3F\u019E \xB7 \u1E3F\u1E17\u019E\u016D.........]",
107398
107452
  sortMenuItem: {
107399
107453
  label: "[\u015E\u015E\u015E\u015E\u01FF\u0159\u0167 \xB7 \u0181\u1E8F \xB7 \u0166\u0127\u012B\u015F \xB7 \u0187\u01FF\u0140\u016D\u1E3F\u019E\u019E\u019E\u019E]",
107400
107454
  sortAscItem: "[\u015E\u015E\u015E\u015E\u015E\u01FF\u0159\u0167 \xB7 \u0187\u01FF\u0140\u016D\u1E3F\u019E \xB7 \u0226\u015F\u0188\u1E17\u019E\u1E13\u012B\u019E\u0260\u0260\u0260\u0260\u0260]",
@@ -110383,7 +110437,20 @@ var Table = (props) => {
110383
110437
  params.api
110384
110438
  );
110385
110439
  },
110386
- headerCheckboxSelectionFilteredOnly: true
110440
+ headerCheckboxSelectionFilteredOnly: true,
110441
+ // Needed to suppress ag-grid's default keyboard event handling for header menu keys when menu is open
110442
+ suppressHeaderKeyboardEvent({ event }) {
110443
+ const headerCell = event.target?.closest(
110444
+ ".ag-header-cell"
110445
+ );
110446
+ const isMenuOpen = !!headerCell?.querySelector(
110447
+ '[aria-expanded="true"]'
110448
+ );
110449
+ if (isMenuOpen && ["ArrowDown", "ArrowUp", "Enter", "Escape"].includes(event.key)) {
110450
+ return true;
110451
+ }
110452
+ return false;
110453
+ }
110387
110454
  };
110388
110455
  },
110389
110456
  [
@@ -110566,6 +110633,9 @@ var Table = (props) => {
110566
110633
  suppressPropertyNamesCheck: true,
110567
110634
  suppressRowClickSelection: props.suppressRowClickSelection || tableRowSelectionEnabled,
110568
110635
  suppressPaginationPanel: true,
110636
+ localeText: {
110637
+ ariaMenuColumn: I18n.t("dataTable.menuOptions.ariaMenuColumn")
110638
+ },
110569
110639
  tabToNextCell: props.tabToNextCell,
110570
110640
  ...clientSideRowData,
110571
110641
  ...detailRowConfigProps,
@@ -112183,6 +112253,7 @@ var StyledFilterTokenWrapper = styled4.div`
112183
112253
  var ClientSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112184
112254
  const { tableRef, filterState, getColumnDefinition } = useInternalTableContext();
112185
112255
  const hasNoContent = useTableHasNoContent();
112256
+ const I18n = useI18nContext();
112186
112257
  const { quickFilters, tokens } = React80.useMemo(() => {
112187
112258
  return filterState.allAvailableFilters.reduce(
112188
112259
  (acc, filter) => {
@@ -112247,9 +112318,13 @@ var ClientSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112247
112318
  if (!colDef) {
112248
112319
  return null;
112249
112320
  }
112250
- return /* @__PURE__ */ React80.createElement(StyledFilterTokenWrapper, { key: filter.field }, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken, null, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80.createElement(React80.Fragment, null, getFilterTokenText(colDef, filter.filterValues))), /* @__PURE__ */ React80.createElement(
112321
+ const tokenText = getFilterTokenText(colDef, filter.filterValues);
112322
+ return /* @__PURE__ */ React80.createElement(StyledFilterTokenWrapper, { key: filter.field }, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken, null, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80.createElement(React80.Fragment, null, tokenText)), /* @__PURE__ */ React80.createElement(
112251
112323
  UNSAFE_FilterToken.Remove,
112252
112324
  {
112325
+ "aria-label": I18n.t("dataTable.filters.removeFilterToken", {
112326
+ name: tokenText
112327
+ }),
112253
112328
  onClick: () => tableRef?.current?.removeFilter(filter.field)
112254
112329
  }
112255
112330
  )));
@@ -112268,6 +112343,7 @@ var ServerSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112268
112343
  getColumnDefinition
112269
112344
  } = useInternalTableContext();
112270
112345
  const hasNoContent = useTableHasNoContent();
112346
+ const I18n = useI18nContext();
112271
112347
  const { quickFilterNames, tokenNames } = React80.useMemo(() => {
112272
112348
  const appliedFilterNames = Object.keys(selectedFilters);
112273
112349
  const isActiveFilter = (filterName) => appliedFilterNames.includes(filterName);
@@ -112342,12 +112418,16 @@ var ServerSideQuickFilters = ({ overlayMatchesTriggerWidth }) => {
112342
112418
  return null;
112343
112419
  }
112344
112420
  const filter = getListFilter(fieldName);
112345
- return /* @__PURE__ */ React80.createElement(StyledFilterTokenWrapper, { key: fieldName }, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken, null, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80.createElement(React80.Fragment, null, getFilterTokenText(
112421
+ const tokenText = getFilterTokenText(
112346
112422
  colDef,
112347
112423
  colDef.filterRenderer === DateFilterRenderer_default ? filter.value : filter.selected
112348
- ))), /* @__PURE__ */ React80.createElement(
112424
+ );
112425
+ return /* @__PURE__ */ React80.createElement(StyledFilterTokenWrapper, { key: fieldName }, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken, null, /* @__PURE__ */ React80.createElement(UNSAFE_FilterToken.Label, null, /* @__PURE__ */ React80.createElement(React80.Fragment, null, tokenText)), /* @__PURE__ */ React80.createElement(
112349
112426
  UNSAFE_FilterToken.Remove,
112350
112427
  {
112428
+ "aria-label": I18n.t("dataTable.filters.removeFilterToken", {
112429
+ name: tokenText
112430
+ }),
112351
112431
  "data-qa": "data-table-quick-filter-remove-token",
112352
112432
  onClick: () => onClearFilter(fieldName)
112353
112433
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@procore/data-table",
3
- "version": "14.43.2",
3
+ "version": "14.44.0",
4
4
  "description": "Complex data grid built on top of ag-grid, with DST components and styles.",
5
5
  "author": "Procore Technologies",
6
6
  "homepage": "https://github.com/procore/core/tree/main/packages/data-table",
@@ -108,7 +108,7 @@
108
108
  "@procore/core-css": "10.17.0",
109
109
  "@procore/core-icons": "^12.15.0",
110
110
  "@procore/core-prettier": "10.2.0",
111
- "@procore/core-react": "^12.43.0",
111
+ "@procore/core-react": "^12.44.0",
112
112
  "@procore/eslint-config": "10.0.0",
113
113
  "@procore/globalization-toolkit": "3.1.0",
114
114
  "@procore/labs-financials-utils": "4.3.1",