@sprinklrjs/spaceweb 14.13.2 → 14.14.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 (48) hide show
  1. package/a11y/accessibilityIsolation.d.ts +5 -0
  2. package/a11y/accessibilityIsolation.js +12 -0
  3. package/asyncSelect/hooks/useAsyncSelect.d.ts +54 -0
  4. package/asyncSelect/hooks/useGroupedAsyncSelect.d.ts +54 -0
  5. package/baseui/modal/modal.d.ts +4 -0
  6. package/baseui/modal/modal.js +24 -2
  7. package/baseui/select/default-props.d.ts +1 -0
  8. package/baseui/select/default-props.js +2 -0
  9. package/baseui/select/select-component.d.ts +4 -0
  10. package/baseui/select/select-component.js +14 -3
  11. package/baseui/select/stateful-select.d.ts +1 -0
  12. package/baseui/select/types.d.ts +5 -0
  13. package/esm/a11y/accessibilityIsolation.d.ts +5 -0
  14. package/esm/a11y/accessibilityIsolation.js +8 -0
  15. package/esm/asyncSelect/hooks/useAsyncSelect.d.ts +54 -0
  16. package/esm/asyncSelect/hooks/useGroupedAsyncSelect.d.ts +54 -0
  17. package/esm/baseui/modal/modal.d.ts +4 -0
  18. package/esm/baseui/modal/modal.js +24 -2
  19. package/esm/baseui/select/default-props.d.ts +1 -0
  20. package/esm/baseui/select/default-props.js +2 -0
  21. package/esm/baseui/select/select-component.d.ts +4 -0
  22. package/esm/baseui/select/select-component.js +12 -2
  23. package/esm/baseui/select/stateful-select.d.ts +1 -0
  24. package/esm/baseui/select/types.d.ts +5 -0
  25. package/esm/menu/menu-item.js +2 -2
  26. package/esm/select/index.d.ts +1 -1
  27. package/esm/select/index.js +1 -1
  28. package/esm/select/multi-value.d.ts +1 -0
  29. package/esm/select/multi-value.js +4 -3
  30. package/esm/select/selectMenuAdapter/CollapsibleSelectMenu.js +28 -7
  31. package/esm/select/selectMenuAdapter/SelectMenuItem.d.ts +1 -1
  32. package/esm/select/selectMenuAdapter/SelectMenuItem.js +13 -6
  33. package/esm/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.d.ts +22 -0
  34. package/esm/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.js +113 -0
  35. package/esm/select/types.d.ts +1 -0
  36. package/menu/menu-item.js +2 -2
  37. package/package.json +3 -2
  38. package/select/index.d.ts +1 -1
  39. package/select/index.js +2 -1
  40. package/select/multi-value.d.ts +1 -0
  41. package/select/multi-value.js +4 -3
  42. package/select/selectMenuAdapter/CollapsibleSelectMenu.js +27 -6
  43. package/select/selectMenuAdapter/SelectMenuItem.d.ts +1 -1
  44. package/select/selectMenuAdapter/SelectMenuItem.js +13 -6
  45. package/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.d.ts +22 -0
  46. package/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.js +117 -0
  47. package/select/types.d.ts +1 -0
  48. package/tsconfig.build.tsbuildinfo +1 -1
package/select/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getValueLabel = exports.getOptionLabel = exports.defaultFilterOptions = exports.OverridenPopover = exports.NestedSelect = exports.CollapsibleSelectMenu = exports.GroupedSelect = exports.GROUP_SELECT_ALL_ID = exports.SingleValue = exports.MobileSheet = exports.SelectMenuAdapter = exports.MultiValue = exports.SingleSelect = exports.MultiSelect = exports.StatefulSelect = exports.Select = exports.StyledOverlayContentContainer = exports.NoResults = exports.StyledValueContainer = exports.StyledSingleValue = exports.StyledSelectArrow = exports.StyledSearchIconContainer = exports.StyledPlaceholder = exports.StyledInputSizer = exports.StyledInputContainer = exports.StyledInput = exports.StyledIconsContainer = exports.StyledDropdownContainer = exports.StyledControlContainer = exports.StyledClearIcon = exports.StyledRoot = exports.UNGROUPED_ID = exports.CLEARABLE_KEY = exports.LOADING_KEY = exports.STATE_CHANGE_TYPE = exports.CLEAR_OPTION_ID = exports.SELECT_ALL_ID = exports.useSelectIds = exports.SelectIdsProvider = exports.SelectIdsContext = void 0;
6
+ exports.getValueAriaLabel = exports.getValueLabel = exports.getOptionLabel = exports.defaultFilterOptions = exports.OverridenPopover = exports.NestedSelect = exports.CollapsibleSelectMenu = exports.GroupedSelect = exports.GROUP_SELECT_ALL_ID = exports.SingleValue = exports.MobileSheet = exports.SelectMenuAdapter = exports.MultiValue = exports.SingleSelect = exports.MultiSelect = exports.StatefulSelect = exports.Select = exports.StyledOverlayContentContainer = exports.NoResults = exports.StyledValueContainer = exports.StyledSingleValue = exports.StyledSelectArrow = exports.StyledSearchIconContainer = exports.StyledPlaceholder = exports.StyledInputSizer = exports.StyledInputContainer = exports.StyledInput = exports.StyledIconsContainer = exports.StyledDropdownContainer = exports.StyledControlContainer = exports.StyledClearIcon = exports.StyledRoot = exports.UNGROUPED_ID = exports.CLEARABLE_KEY = exports.LOADING_KEY = exports.STATE_CHANGE_TYPE = exports.CLEAR_OPTION_ID = exports.SELECT_ALL_ID = exports.useSelectIds = exports.SelectIdsProvider = exports.SelectIdsContext = void 0;
7
7
  var SelectIdsContext_1 = require("./SelectIdsContext");
8
8
  Object.defineProperty(exports, "SelectIdsContext", { enumerable: true, get: function () { return SelectIdsContext_1.SelectIdsContext; } });
9
9
  Object.defineProperty(exports, "SelectIdsProvider", { enumerable: true, get: function () { return SelectIdsContext_1.SelectIdsProvider; } });
@@ -64,3 +64,4 @@ Object.defineProperty(exports, "defaultFilterOptions", { enumerable: true, get:
64
64
  var select_component_1 = require("../baseui/select/select-component");
65
65
  Object.defineProperty(exports, "getOptionLabel", { enumerable: true, get: function () { return select_component_1.getOptionLabel; } });
66
66
  Object.defineProperty(exports, "getValueLabel", { enumerable: true, get: function () { return select_component_1.getValueLabel; } });
67
+ Object.defineProperty(exports, "getValueAriaLabel", { enumerable: true, get: function () { return select_component_1.getValueAriaLabel; } });
@@ -18,6 +18,7 @@ declare const MultiValue: React.ForwardRefExoticComponent<Omit<TagProps, "overri
18
18
  __groupSelectAll?: boolean | undefined;
19
19
  }>>;
20
20
  $valueKey: string;
21
+ ariaLabel?: string | undefined;
21
22
  value: Readonly<{
22
23
  [x: string]: any;
23
24
  id?: import("./types").Id | undefined;
@@ -13,7 +13,7 @@ var constants_1 = require("./constants");
13
13
  var useCombinedRef_1 = tslib_1.__importDefault(require("../hooks/useCombinedRef"));
14
14
  var MultiValue = React.forwardRef(function (props, ref) {
15
15
  var _a, _b, _c;
16
- var _d = props.overrides, overrides = _d === void 0 ? {} : _d, onActionClick = props.onActionClick, value = props.value, selectSize = props.selectSize, $disabled = props.$disabled, $valueByIdMap = props.$valueByIdMap, $valueKey = props.$valueKey, _$size = props.$size, _$isContainerFocused = props.$isContainerFocused, restProps = tslib_1.__rest(props, ["overrides", "onActionClick", "value", "selectSize", "$disabled", "$valueByIdMap", "$valueKey", "$size", "$isContainerFocused"]);
16
+ var _d = props.overrides, overrides = _d === void 0 ? {} : _d, onActionClick = props.onActionClick, value = props.value, selectSize = props.selectSize, $disabled = props.$disabled, $valueByIdMap = props.$valueByIdMap, $valueKey = props.$valueKey, _$size = props.$size, _$isContainerFocused = props.$isContainerFocused, ariaLabel = props.ariaLabel, children = props.children, restProps = tslib_1.__rest(props, ["overrides", "onActionClick", "value", "selectSize", "$disabled", "$valueByIdMap", "$valueKey", "$size", "$isContainerFocused", "ariaLabel", "children"]);
17
17
  var _e = tslib_1.__read((0, overrides_1.useOverrides)(overrides.Tag, tag_1.Tag), 2), TagComponent = _e[0], tagProps = _e[1];
18
18
  var theme = (0, style_1.useStyle)().theme;
19
19
  var tagRef = (0, react_1.useRef)();
@@ -51,6 +51,7 @@ var MultiValue = React.forwardRef(function (props, ref) {
51
51
  break;
52
52
  }
53
53
  var closeable = (_b = tagProps.closeable) !== null && _b !== void 0 ? _b : !disabled;
54
+ var resolvedAriaLabel = ariaLabel || (typeof children === 'string' ? children : undefined);
54
55
  var tagSpacingClasses;
55
56
  switch (selectSize) {
56
57
  case 'xxxs':
@@ -66,7 +67,7 @@ var MultiValue = React.forwardRef(function (props, ref) {
66
67
  tagSpacingClasses = 'mr-1 my-0.5';
67
68
  break;
68
69
  }
69
- return ((0, jsx_runtime_1.jsx)(TagComponent, tslib_1.__assign({ ref: combinedRef, variant: "light", intent: "default", "aria-label": typeof restProps.children === 'string' ? restProps.children : '', tabIndex: -1, onActionClick: onActionClickHandler, "$item": value, "$disabled": disabled, size: tagSize }, restProps, tagProps, { closeable: closeable, overrides: (0, overrides_1.mergeOverrides)({
70
+ return ((0, jsx_runtime_1.jsx)(TagComponent, tslib_1.__assign({ ref: combinedRef, variant: "light", intent: "default" }, (resolvedAriaLabel ? { 'aria-label': resolvedAriaLabel } : {}), { tabIndex: -1, onActionClick: onActionClickHandler, "$item": value, "$disabled": disabled, size: tagSize }, restProps, tagProps, { closeable: closeable, overrides: (0, overrides_1.mergeOverrides)({
70
71
  Root: {
71
72
  className: [
72
73
  'box-border max-w-[--sw-max-width]',
@@ -87,6 +88,6 @@ var MultiValue = React.forwardRef(function (props, ref) {
87
88
  },
88
89
  },
89
90
  Action: { props: { tabIndex: -1 } },
90
- }, tagProps.overrides) }, { children: isLoading ? ((0, jsx_runtime_1.jsx)(StyledTombstone_1.StyledTombstone, { "data-testid": "multi-value-tombstone", className: "w-20 h-4 rounded-8" })) : (props.children) })));
91
+ }, tagProps.overrides) }, { children: isLoading ? (0, jsx_runtime_1.jsx)(StyledTombstone_1.StyledTombstone, { "data-testid": "multi-value-tombstone", className: "w-20 h-4 rounded-8" }) : children })));
91
92
  });
92
93
  exports.default = MultiValue;
@@ -6,6 +6,7 @@ var jsx_runtime_1 = require("react/jsx-runtime");
6
6
  var isNumber_1 = tslib_1.__importDefault(require("lodash/isNumber"));
7
7
  var react_1 = require("react");
8
8
  var useGetExpandedGroup_1 = require("./hooks/useGetExpandedGroup");
9
+ var useRootSelectAllKeyboardNav_1 = require("./hooks/useRootSelectAllKeyboardNav");
9
10
  var box_1 = require("../../box");
10
11
  var menu_1 = require("../../menu");
11
12
  var typography_1 = require("../../typography");
@@ -49,6 +50,7 @@ var CollapsibleSelectMenu = function (_a) {
49
50
  var isFirstItemHighlighted = (0, react_1.useRef)(false);
50
51
  var isLastItemHighlighted = (0, react_1.useRef)(false);
51
52
  var menuRef = (0, react_1.useRef)(null);
53
+ var selectAllItem = shouldDisplaySelectAll ? groupedItems[constants_1.UNGROUPED_ID][0] : null;
52
54
  var ownerDocument = (0, DocumentProvider_1.useDocument)();
53
55
  var _l = (0, SelectIdsContext_1.useSelectIds)(), listboxId = _l.listboxId, menuDescriptionId = _l.menuDescriptionId;
54
56
  var selectedValuesSet = (0, react_1.useMemo)(function () {
@@ -75,6 +77,17 @@ var CollapsibleSelectMenu = function (_a) {
75
77
  var mergedOverrides = (0, react_1.useMemo)(function () { return (0, overrides_1.mergeOverrides)(overrides_2.selectMenuOverrides, overrides); }, [overrides]);
76
78
  var _m = tslib_1.__read((0, overrides_1.useOverrides)(mergedOverrides.Menu, menu_1.Menu), 2), MenuComponent = _m[0], menuProps = _m[1];
77
79
  var _o = tslib_1.__read((0, overrides_1.useOverrides)(mergedOverrides.NoResults, styled_component_1.NoResults), 2), NoResultsOverriden = _o[0], noResultsProps = _o[1];
80
+ var _p = (0, useRootSelectAllKeyboardNav_1.useRootSelectAllKeyboardNav)({
81
+ menuRef: menuRef,
82
+ selectAllItem: selectAllItem,
83
+ ownerDocument: ownerDocument,
84
+ expandedGroupId: expandedGroupId,
85
+ setExpandedGroupId: setExpandedGroupId,
86
+ groupConfig: groupConfig,
87
+ onItemSelect: onItemSelect,
88
+ inputElement: inputElement,
89
+ isFirstItemHighlighted: isFirstItemHighlighted,
90
+ }), selectAllItemRef = _p.selectAllItemRef, isRootSelectAllHighlighted = _p.isRootSelectAllHighlighted, leaveRootSelectAllHighlight = _p.leaveRootSelectAllHighlight;
78
91
  var menuItemOverrides = (0, react_1.useMemo)(function () { return ({
79
92
  MenuItem: mergedOverrides.MenuItem,
80
93
  ListItemText: mergedOverrides.ListItemText,
@@ -107,6 +120,9 @@ var CollapsibleSelectMenu = function (_a) {
107
120
  }, [expandedGroupId, groupedItems]);
108
121
  var handleOnHighlightedItemChange = function (item) {
109
122
  var _a;
123
+ if (item) {
124
+ leaveRootSelectAllHighlight();
125
+ }
110
126
  var nextHighlightableElement = (0, helpers_1.getNextItemIndexToHighlight)(item !== null && item !== void 0 ? item : null, menuRef.current, helpers_1.nextItem);
111
127
  var prevHighlightableElement = (0, helpers_1.getNextItemIndexToHighlight)(item !== null && item !== void 0 ? item : null, menuRef.current, helpers_1.prevItem);
112
128
  isFirstItemHighlighted.current = !!(item && (!item.previousSibling || item === prevHighlightableElement));
@@ -114,13 +130,18 @@ var CollapsibleSelectMenu = function (_a) {
114
130
  (_a = menuProps === null || menuProps === void 0 ? void 0 : menuProps.onHighlightedItemChange) === null || _a === void 0 ? void 0 : _a.call(menuProps, item);
115
131
  };
116
132
  var handleOnClick = (0, react_1.useCallback)(function (newGroupId) {
133
+ leaveRootSelectAllHighlight();
117
134
  setExpandedGroupId(function (prev) { return (prev === newGroupId ? undefined : newGroupId); });
118
135
  inputElement === null || inputElement === void 0 ? void 0 : inputElement.focus();
119
- }, [inputElement, setExpandedGroupId]);
120
- var selectAllItem = shouldDisplaySelectAll ? groupedItems[constants_1.UNGROUPED_ID][0] : null;
136
+ }, [inputElement, setExpandedGroupId, leaveRootSelectAllHighlight]);
121
137
  var clearAsOptionItem = !multi && clearAsOption ? groupedItems[constants_1.UNGROUPED_ID][0] : null;
122
138
  var locale = (0, locale_1.useLocale)().select;
123
- return ((0, jsx_runtime_1.jsxs)(box_1.Box, tslib_1.__assign({ className: "rounded-inherit" }, { children: [selectAllItem ? ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: selectAllItem, selected: globalSelectAllSelected, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": selectAllItem, button: true, "data-testid": "universal-select-all" }, baseuiMenuItemProps, { className: ['m-2', baseuiMenuItemProps === null || baseuiMenuItemProps === void 0 ? void 0 : baseuiMenuItemProps.className] }), "select-all-option")) : null, groupConfig.map(function (_group, index) {
139
+ var isMenuItemHighlighted = isRootSelectAllHighlighted ? false : undefined;
140
+ return ((0, jsx_runtime_1.jsxs)(box_1.Box, tslib_1.__assign({ className: "rounded-inherit" }, { children: [selectAllItem ? ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ ref: selectAllItemRef, overrides: menuItemOverrides, item: selectAllItem, selected: globalSelectAllSelected, highlighted: isRootSelectAllHighlighted, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": selectAllItem, "$as": "div", button: true, "data-testid": "universal-select-all" }, baseuiMenuItemProps, {
141
+ // Root Select All sits outside the options listbox, so it must be role="checkbox" (not role="option" )
142
+ // See SAP UI5 MultiComboBox Select All:
143
+ // https://ui5.sap.com/#/entity/sap.m.MultiComboBox/sample/sap.m.sample.MultiComboBoxSelectAll
144
+ role: "checkbox", className: ['m-2', baseuiMenuItemProps === null || baseuiMenuItemProps === void 0 ? void 0 : baseuiMenuItemProps.className] }), "select-all-option")) : null, groupConfig.map(function (_group, index) {
124
145
  var _a;
125
146
  var _b, _c;
126
147
  var groupId = _group.id, groupLabel = _group.label;
@@ -140,11 +161,11 @@ var CollapsibleSelectMenu = function (_a) {
140
161
  _a[constants_2.GROUP_SELECT_ALL_ID] = true,
141
162
  _a.selected = groupSelectAllSelected,
142
163
  _a);
143
- return ((0, jsx_runtime_1.jsxs)(Collapsible, tslib_1.__assign({ className: index === 0 && selectAllItem ? 'border-t-1 border-solid spr-border-primary' : '', group: group, expanded: disableWhenSelectAllChecked && globalSelectAllSelected ? false : groupId === expandedGroupId, disabled: disableWhenSelectAllChecked && globalSelectAllSelected, onClick: handleOnClick }, { children: [(0, jsx_runtime_1.jsx)(hidden_element_1.HiddenElement, tslib_1.__assign({ id: menuDescriptionId !== null && menuDescriptionId !== void 0 ? menuDescriptionId : '' }, { children: "".concat(groupLabel, " ").concat(locale.groupExpandedSuffix) })), (0, isEmpty_1.default)(itemsInGroup) ? ((0, jsx_runtime_1.jsx)(NoResultsOverriden, tslib_1.__assign({ "aria-live": "polite", "aria-atomic": true, msg: noResultsMsg, noResultsConfig: noResultsConfig, "aria-disabled": true, "$groupId": groupId }, noResultsProps))) : ((0, jsx_runtime_1.jsxs)(MenuComponent, tslib_1.__assign({ resetMenuHighlightOnMouseLeave: true, focusWhenNavigationEnabled: false, keyboardFocusRestoreTarget: inputElement, tabIndex: -1, selectOnTab: selectOnTab, getActionsElement: getActionsElement }, menuProps, { role: "listbox", id: listboxId, virtual: virtual, className: ['overflow-auto max-h-50 pt-0', menuProps === null || menuProps === void 0 ? void 0 : menuProps.className], onScroll: function (e) {
164
+ return ((0, jsx_runtime_1.jsxs)(Collapsible, tslib_1.__assign({ className: index === 0 && selectAllItem ? 'border-t-1 border-solid spr-border-primary' : '', group: group, expanded: disableWhenSelectAllChecked && globalSelectAllSelected ? false : groupId === expandedGroupId, disabled: disableWhenSelectAllChecked && globalSelectAllSelected, onClick: handleOnClick }, { children: [(0, jsx_runtime_1.jsx)(hidden_element_1.HiddenElement, tslib_1.__assign({ id: menuDescriptionId !== null && menuDescriptionId !== void 0 ? menuDescriptionId : '' }, { children: "".concat(groupLabel, " ").concat(locale.groupExpandedSuffix) })), (0, isEmpty_1.default)(itemsInGroup) ? ((0, jsx_runtime_1.jsx)(NoResultsOverriden, tslib_1.__assign({ "aria-live": "polite", "aria-atomic": true, msg: noResultsMsg, noResultsConfig: noResultsConfig, "aria-disabled": true, "$groupId": groupId }, noResultsProps))) : ((0, jsx_runtime_1.jsxs)(MenuComponent, tslib_1.__assign({ resetMenuHighlightOnMouseLeave: true, focusWhenNavigationEnabled: false, disableAutoHighlight: isRootSelectAllHighlighted, keyboardFocusRestoreTarget: inputElement, tabIndex: -1, selectOnTab: selectOnTab, getActionsElement: getActionsElement }, menuProps, { role: "listbox", id: listboxId, virtual: virtual, className: ['overflow-auto max-h-50 pt-0', menuProps === null || menuProps === void 0 ? void 0 : menuProps.className], onScroll: function (e) {
144
165
  $onPaginate === null || $onPaginate === void 0 ? void 0 : $onPaginate(e, groupId);
145
- }, onHighlightedItemChange: handleOnHighlightedItemChange, ref: menuRef }, { children: [shouldDisplayGroupSelectAll ? ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: groupSelectAllItem, "data-testid": "".concat(group.label, "-group-select-all"), selected: groupSelectAllSelected, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": groupSelectAllItem, button: true, disabled: group.count <= countDisabledOptions }, baseuiMenuItemProps), "select-all-option")) : null, clearAsOptionItem ? ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: clearAsOptionItem, selected: false, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": clearAsOptionItem, button: true }, baseuiMenuItemProps), "clear-option")) : null, itemsInGroup.map(function (item) {
166
+ }, onHighlightedItemChange: handleOnHighlightedItemChange, ref: menuRef }, { children: [shouldDisplayGroupSelectAll ? ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: groupSelectAllItem, "data-testid": "".concat(group.label, "-group-select-all"), selected: groupSelectAllSelected, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": groupSelectAllItem, button: true, disabled: group.count <= countDisabledOptions, highlighted: isMenuItemHighlighted }, baseuiMenuItemProps), "select-all-option")) : null, clearAsOptionItem ? ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: clearAsOptionItem, selected: false, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": clearAsOptionItem, button: true, highlighted: isMenuItemHighlighted }, baseuiMenuItemProps), "clear-option")) : null, itemsInGroup.map(function (item) {
146
167
  var selected = selectedValuesSet.has(item[valueKey]);
147
- return ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: item, selected: selected, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": item, button: true }, baseuiMenuItemProps), item.isCreatable ? 'creatable-option' : item[valueKey]));
168
+ return ((0, jsx_runtime_1.jsx)(SelectMenuItem_1.default, tslib_1.__assign({ overrides: menuItemOverrides, item: item, selected: selected, multi: multi, getItemLabel: getItemLabel, labelKey: labelKey, valueKey: valueKey, onItemSelect: onItemSelect, "$item": item, button: true, highlighted: isMenuItemHighlighted }, baseuiMenuItemProps), item.isCreatable ? 'creatable-option' : item[valueKey]));
148
169
  })] })))] }), groupId));
149
170
  })] })));
150
171
  };
@@ -3,7 +3,7 @@ import { type ListItemTextProps } from '../../list';
3
3
  import { type Override } from '../../overrides';
4
4
  import type { MenuItemProps } from '../../menu';
5
5
  import type { SelectProps } from '../types';
6
- declare const _default: React.MemoExoticComponent<React.ForwardRefExoticComponent<Pick<MenuItemProps, "selected"> & Pick<SelectProps, "labelKey" | "multi" | "valueKey"> & {
6
+ declare const _default: React.MemoExoticComponent<React.ForwardRefExoticComponent<Pick<MenuItemProps, "selected" | "role"> & Pick<SelectProps, "labelKey" | "multi" | "valueKey"> & {
7
7
  item: Record<string, any>;
8
8
  getItemLabel: (item: Record<string, any>) => React.ReactNode;
9
9
  onItemSelect: (item: Record<string, any>) => void;
@@ -18,10 +18,11 @@ var shouldHideSelectItemActions = function (item) {
18
18
  return Boolean(item[types_1.SELECT_ALL_ID] || item[constants_1.GROUP_SELECT_ALL_ID] || item[types_1.CLEAR_OPTION_ID] || item.isCreatable);
19
19
  };
20
20
  var SelectMenuItem = React.forwardRef(function (_a, ref) {
21
- var item = _a.item, valueKey = _a.valueKey, overrides = _a.overrides, labelKey = _a.labelKey, multi = _a.multi, selected = _a.selected, getItemLabel = _a.getItemLabel, onItemSelect = _a.onItemSelect, restProps = tslib_1.__rest(_a, ["item", "valueKey", "overrides", "labelKey", "multi", "selected", "getItemLabel", "onItemSelect"]);
22
- var _b = tslib_1.__read((0, overrides_1.useOverrides)(overrides === null || overrides === void 0 ? void 0 : overrides.MenuItem, menu_item_1.default), 2), MenuItemOverriden = _b[0], menuItemProps = _b[1];
23
- var _c = tslib_1.__read((0, overrides_1.useOverrides)(overrides === null || overrides === void 0 ? void 0 : overrides.Checkbox, checkbox_1.Checkbox), 2), CheckboxOverriden = _c[0], checkboxProps = _c[1];
24
- var _d = tslib_1.__read((0, overrides_1.useOverrides)(overrides === null || overrides === void 0 ? void 0 : overrides.ListItemText, list_1.ListItemText), 2), ListItemTextOverriden = _d[0], listItemTextProps = _d[1];
21
+ var item = _a.item, valueKey = _a.valueKey, overrides = _a.overrides, labelKey = _a.labelKey, multi = _a.multi, selected = _a.selected, getItemLabel = _a.getItemLabel, onItemSelect = _a.onItemSelect, _b = _a.role, role = _b === void 0 ? 'option' : _b, restProps = tslib_1.__rest(_a, ["item", "valueKey", "overrides", "labelKey", "multi", "selected", "getItemLabel", "onItemSelect", "role"]);
22
+ var isCheckboxRole = role === 'checkbox';
23
+ var _c = tslib_1.__read((0, overrides_1.useOverrides)(overrides === null || overrides === void 0 ? void 0 : overrides.MenuItem, menu_item_1.default), 2), MenuItemOverriden = _c[0], menuItemProps = _c[1];
24
+ var _d = tslib_1.__read((0, overrides_1.useOverrides)(overrides === null || overrides === void 0 ? void 0 : overrides.Checkbox, checkbox_1.Checkbox), 2), CheckboxOverriden = _d[0], checkboxProps = _d[1];
25
+ var _e = tslib_1.__read((0, overrides_1.useOverrides)(overrides === null || overrides === void 0 ? void 0 : overrides.ListItemText, list_1.ListItemText), 2), ListItemTextOverriden = _e[0], listItemTextProps = _e[1];
25
26
  var handleItemSelect = (0, react_1.useCallback)(function (event) { return onItemSelect({ item: item, event: event }); }, [item, onItemSelect]);
26
27
  var textOverrides = listItemTextProps === null || listItemTextProps === void 0 ? void 0 : listItemTextProps.overrides;
27
28
  var listItemTextOverrides = (0, react_1.useMemo)(function () {
@@ -34,14 +35,20 @@ var SelectMenuItem = React.forwardRef(function (_a, ref) {
34
35
  var id = (0, useUniqueId_1.default)();
35
36
  var checkboxPropsOverrides = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.overrides;
36
37
  var checkboxOverrides = (0, react_1.useMemo)(function () {
37
- return (0, overrides_1.mergeOverrides)({ Input: { props: { 'aria-labelledby': id, tabIndex: -1 } }, Label: { className: 'hidden' } }, checkboxPropsOverrides);
38
+ return (0, overrides_1.mergeOverrides)({
39
+ Input: {
40
+ props: { 'aria-labelledby': id, tabIndex: -1 },
41
+ className: 'invisible',
42
+ },
43
+ Label: { className: 'hidden' },
44
+ }, checkboxPropsOverrides);
38
45
  }, [id, checkboxPropsOverrides]);
39
46
  // Passes intent to override intent from useContextualFormProps,
40
47
  // see: https://prod-gitlab.sprinklr.com/sprinklr/frontend/spaceweb/-/issues/282
41
48
  var startEnhancer = (0, react_1.useMemo)(function () {
42
49
  return multi && ((0, jsx_runtime_1.jsx)(CheckboxOverriden, tslib_1.__assign({ checked: selected, size: "medium", disabled: item.disabled, intent: "default" }, checkboxProps, { overrides: checkboxOverrides })));
43
50
  }, [multi, CheckboxOverriden, selected, item.disabled, checkboxProps, checkboxOverrides]);
44
- var menuItemEl = ((0, jsx_runtime_1.jsx)(MenuItemOverriden, tslib_1.__assign({ role: "option", "aria-selected": selected,
51
+ var menuItemEl = ((0, jsx_runtime_1.jsx)(MenuItemOverriden, tslib_1.__assign({ role: role }, (isCheckboxRole ? { 'aria-checked': selected } : { 'aria-selected': selected }), {
45
52
  // for Multi Select variant do not show selected styles
46
53
  selected: multi ? false : selected, onClick: handleItemSelect, startEnhancer: startEnhancer, disabled: item.disabled, "$multi": multi, tabIndex: -1, "$item": item, "$valueKey": valueKey, "$labelKey": labelKey, ref: ref, id: id, tooltipContent: item.tooltipContent, hideInlineActions: shouldHideSelectItemActions(item) }, restProps, menuItemProps, { children: (0, jsx_runtime_1.jsx)(ListItemTextOverriden, tslib_1.__assign({ "$multi": multi, "$item": item, "$labelKey": labelKey }, listItemTextProps, { overrides: listItemTextOverrides }, { children: getItemLabel(item) })) })));
47
54
  return item.disabled && item.disabledTooltipConfig ? ((0, jsx_runtime_1.jsx)(tooltip_1.ActionableTooltip, tslib_1.__assign({}, item.disabledTooltipConfig, { children: menuItemEl }))) : (menuItemEl);
@@ -0,0 +1,22 @@
1
+ import type { Dispatch, MutableRefObject, RefObject, SetStateAction } from 'react';
2
+ import type { Item, OnItemSelectFn } from '../../../baseui/menu/types';
3
+ import type { MenuRef } from '../../../menu/types';
4
+ import type { GroupConfig } from '../types';
5
+ type UseRootSelectAllKeyboardNavParams = {
6
+ menuRef: RefObject<MenuRef>;
7
+ selectAllItem: Item | null;
8
+ ownerDocument: Document | undefined;
9
+ expandedGroupId: string | undefined;
10
+ setExpandedGroupId: Dispatch<SetStateAction<string | undefined>>;
11
+ groupConfig: GroupConfig;
12
+ onItemSelect?: OnItemSelectFn;
13
+ inputElement?: HTMLInputElement | null;
14
+ isFirstItemHighlighted: MutableRefObject<boolean>;
15
+ };
16
+ type UseRootSelectAllKeyboardNavReturn = {
17
+ selectAllItemRef: RefObject<HTMLElement | null>;
18
+ isRootSelectAllHighlighted: boolean;
19
+ leaveRootSelectAllHighlight: () => void;
20
+ };
21
+ export declare const useRootSelectAllKeyboardNav: ({ menuRef, selectAllItem, ownerDocument, expandedGroupId, setExpandedGroupId, groupConfig, onItemSelect, inputElement, isFirstItemHighlighted, }: UseRootSelectAllKeyboardNavParams) => UseRootSelectAllKeyboardNavReturn;
22
+ export {};
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useRootSelectAllKeyboardNav = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = require("react");
6
+ var helpers_1 = require("../../../menu/helpers");
7
+ var stopKeyboardEvent = function (event) {
8
+ event.preventDefault();
9
+ event.stopPropagation();
10
+ };
11
+ var isFirstHighlightableInMenu = function (menu, highlightedItem) {
12
+ return (0, helpers_1.getNextItemIndexToHighlight)(highlightedItem, menu, helpers_1.prevItem) === highlightedItem;
13
+ };
14
+ var isFirstMenuItemHighlighted = function (menu, isFirstItemHighlighted) {
15
+ var highlightedMenuItem = menu === null || menu === void 0 ? void 0 : menu.querySelector('[data-highlighted="true"]');
16
+ if (menu && highlightedMenuItem && (0, helpers_1.canHighlightItem)(highlightedMenuItem)) {
17
+ return isFirstHighlightableInMenu(menu, highlightedMenuItem);
18
+ }
19
+ return isFirstItemHighlighted.current;
20
+ };
21
+ var useRootSelectAllKeyboardNav = function (_a) {
22
+ var menuRef = _a.menuRef, selectAllItem = _a.selectAllItem, ownerDocument = _a.ownerDocument, expandedGroupId = _a.expandedGroupId, setExpandedGroupId = _a.setExpandedGroupId, groupConfig = _a.groupConfig, onItemSelect = _a.onItemSelect, inputElement = _a.inputElement, isFirstItemHighlighted = _a.isFirstItemHighlighted;
23
+ var selectAllItemRef = (0, react_1.useRef)(null);
24
+ var _b = tslib_1.__read((0, react_1.useState)(!!selectAllItem), 2), isRootSelectAllHighlighted = _b[0], setIsRootSelectAllHighlighted = _b[1];
25
+ var clearMenuHighlight = (0, react_1.useCallback)(function () {
26
+ var _a, _b;
27
+ var menu = menuRef.current;
28
+ if (!menu)
29
+ return;
30
+ (_a = menu.turnOffKeyboardNavigation) === null || _a === void 0 ? void 0 : _a.call(menu);
31
+ (_b = menu.setHighlightedItem) === null || _b === void 0 ? void 0 : _b.call(menu, null);
32
+ }, [menuRef]);
33
+ var highlightFirstMenuItem = (0, react_1.useCallback)(function () {
34
+ var _a, _b;
35
+ var menu = menuRef.current;
36
+ if (!menu)
37
+ return;
38
+ (_a = menu.turnOnKeyboardNavigation) === null || _a === void 0 ? void 0 : _a.call(menu);
39
+ var firstHighlightableItem = (0, helpers_1.getFirstHighlightableElement)(menu).firstHighlightableItem;
40
+ var itemToHighlight = firstHighlightableItem;
41
+ (_b = menu.setHighlightedItem) === null || _b === void 0 ? void 0 : _b.call(menu, itemToHighlight);
42
+ }, [menuRef]);
43
+ var highlightRootSelectAll = (0, react_1.useCallback)(function () {
44
+ clearMenuHighlight();
45
+ setIsRootSelectAllHighlighted(true);
46
+ }, [clearMenuHighlight]);
47
+ var leaveRootSelectAllHighlight = (0, react_1.useCallback)(function () {
48
+ var _a, _b;
49
+ setIsRootSelectAllHighlighted(false);
50
+ (_b = (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.turnOnKeyboardNavigation) === null || _b === void 0 ? void 0 : _b.call(_a);
51
+ }, [menuRef]);
52
+ (0, react_1.useEffect)(function () {
53
+ if (!selectAllItem || !ownerDocument)
54
+ return undefined;
55
+ var captureKeydownHandler = function (event) {
56
+ var _a;
57
+ if (isRootSelectAllHighlighted && event.key === 'ArrowDown' && !event.shiftKey) {
58
+ stopKeyboardEvent(event);
59
+ leaveRootSelectAllHighlight();
60
+ var firstGroupId = (_a = groupConfig[0]) === null || _a === void 0 ? void 0 : _a.id;
61
+ if (firstGroupId && expandedGroupId !== firstGroupId) {
62
+ setExpandedGroupId(firstGroupId);
63
+ }
64
+ highlightFirstMenuItem();
65
+ return;
66
+ }
67
+ var expandedGroupIndex = groupConfig.findIndex(function (group) { return group.id === expandedGroupId; });
68
+ if (event.key === 'ArrowUp' &&
69
+ !event.shiftKey &&
70
+ expandedGroupIndex === 0 &&
71
+ isFirstMenuItemHighlighted(menuRef.current, isFirstItemHighlighted)) {
72
+ stopKeyboardEvent(event);
73
+ highlightRootSelectAll();
74
+ return;
75
+ }
76
+ if (isRootSelectAllHighlighted && event.key === 'Enter' && event.keyCode !== 229) {
77
+ stopKeyboardEvent(event);
78
+ onItemSelect === null || onItemSelect === void 0 ? void 0 : onItemSelect({ item: selectAllItem, event: event });
79
+ }
80
+ };
81
+ ownerDocument.body.addEventListener('keydown', captureKeydownHandler, { capture: true });
82
+ return function () {
83
+ ownerDocument.body.removeEventListener('keydown', captureKeydownHandler, { capture: true });
84
+ };
85
+ }, [
86
+ menuRef,
87
+ ownerDocument,
88
+ selectAllItem,
89
+ expandedGroupId,
90
+ groupConfig,
91
+ isRootSelectAllHighlighted,
92
+ setExpandedGroupId,
93
+ onItemSelect,
94
+ highlightRootSelectAll,
95
+ highlightFirstMenuItem,
96
+ leaveRootSelectAllHighlight,
97
+ isFirstItemHighlighted,
98
+ ]);
99
+ (0, react_1.useEffect)(function () {
100
+ var _a;
101
+ var selectAllItemId = (_a = selectAllItemRef.current) === null || _a === void 0 ? void 0 : _a.id;
102
+ if (!isRootSelectAllHighlighted || !inputElement || !selectAllItemId)
103
+ return undefined;
104
+ inputElement.setAttribute('aria-activedescendant', selectAllItemId);
105
+ return function () {
106
+ if (inputElement.getAttribute('aria-activedescendant') === selectAllItemId) {
107
+ inputElement.removeAttribute('aria-activedescendant');
108
+ }
109
+ };
110
+ }, [isRootSelectAllHighlighted, inputElement]);
111
+ return {
112
+ selectAllItemRef: selectAllItemRef,
113
+ isRootSelectAllHighlighted: isRootSelectAllHighlighted,
114
+ leaveRootSelectAllHighlight: leaveRootSelectAllHighlight,
115
+ };
116
+ };
117
+ exports.useRootSelectAllKeyboardNav = useRootSelectAllKeyboardNav;
package/select/types.d.ts CHANGED
@@ -130,6 +130,7 @@ export type MultiValueProps = Omit<TagProps, 'overrides'> & SharedProps & {
130
130
  $isContainerFocused?: boolean;
131
131
  $valueByIdMap: Record<string, Option>;
132
132
  $valueKey: string;
133
+ ariaLabel?: string;
133
134
  value: Option;
134
135
  removeValue: RemoveValue;
135
136
  selectSize: Size;