@sprinklrjs/spaceweb 14.13.1 → 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 (72) 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/list/list-item.d.ts +1 -1
  26. package/esm/list/list-item.js +11 -4
  27. package/esm/list/types.d.ts +2 -2
  28. package/esm/list/useListItemTooltip.d.ts +10 -0
  29. package/esm/list/useListItemTooltip.js +38 -0
  30. package/esm/locale/en_US.js +1 -0
  31. package/esm/menu/StatefulSubMenu.d.ts +1 -1
  32. package/esm/menu/SubMenu.d.ts +1 -1
  33. package/esm/menu/menu-item.d.ts +1 -1
  34. package/esm/menu/menu-item.js +2 -2
  35. package/esm/select/index.d.ts +1 -1
  36. package/esm/select/index.js +1 -1
  37. package/esm/select/locale.d.ts +1 -0
  38. package/esm/select/multi-value.d.ts +1 -0
  39. package/esm/select/multi-value.js +4 -3
  40. package/esm/select/selectMenuAdapter/CollapsibleSelectMenu.d.ts +1 -1
  41. package/esm/select/selectMenuAdapter/CollapsibleSelectMenu.js +28 -7
  42. package/esm/select/selectMenuAdapter/SelectMenuItem.d.ts +2 -2
  43. package/esm/select/selectMenuAdapter/SelectMenuItem.js +13 -6
  44. package/esm/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.d.ts +22 -0
  45. package/esm/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.js +113 -0
  46. package/esm/select/styled-component.js +16 -6
  47. package/esm/select/types.d.ts +1 -0
  48. package/list/list-item.d.ts +1 -1
  49. package/list/list-item.js +10 -3
  50. package/list/types.d.ts +2 -2
  51. package/list/useListItemTooltip.d.ts +10 -0
  52. package/list/useListItemTooltip.js +42 -0
  53. package/locale/en_US.js +1 -0
  54. package/menu/StatefulSubMenu.d.ts +1 -1
  55. package/menu/SubMenu.d.ts +1 -1
  56. package/menu/menu-item.d.ts +1 -1
  57. package/menu/menu-item.js +2 -2
  58. package/package.json +3 -2
  59. package/select/index.d.ts +1 -1
  60. package/select/index.js +2 -1
  61. package/select/locale.d.ts +1 -0
  62. package/select/multi-value.d.ts +1 -0
  63. package/select/multi-value.js +4 -3
  64. package/select/selectMenuAdapter/CollapsibleSelectMenu.d.ts +1 -1
  65. package/select/selectMenuAdapter/CollapsibleSelectMenu.js +27 -6
  66. package/select/selectMenuAdapter/SelectMenuItem.d.ts +2 -2
  67. package/select/selectMenuAdapter/SelectMenuItem.js +13 -6
  68. package/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.d.ts +22 -0
  69. package/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.js +117 -0
  70. package/select/styled-component.js +16 -6
  71. package/select/types.d.ts +1 -0
  72. package/tsconfig.build.tsbuildinfo +1 -1
@@ -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,113 @@
1
+ import { __read } from "tslib";
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { canHighlightItem, getFirstHighlightableElement, getNextItemIndexToHighlight, prevItem, } from '../../../menu/helpers';
4
+ var stopKeyboardEvent = function (event) {
5
+ event.preventDefault();
6
+ event.stopPropagation();
7
+ };
8
+ var isFirstHighlightableInMenu = function (menu, highlightedItem) {
9
+ return getNextItemIndexToHighlight(highlightedItem, menu, prevItem) === highlightedItem;
10
+ };
11
+ var isFirstMenuItemHighlighted = function (menu, isFirstItemHighlighted) {
12
+ var highlightedMenuItem = menu === null || menu === void 0 ? void 0 : menu.querySelector('[data-highlighted="true"]');
13
+ if (menu && highlightedMenuItem && canHighlightItem(highlightedMenuItem)) {
14
+ return isFirstHighlightableInMenu(menu, highlightedMenuItem);
15
+ }
16
+ return isFirstItemHighlighted.current;
17
+ };
18
+ export var useRootSelectAllKeyboardNav = function (_a) {
19
+ 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;
20
+ var selectAllItemRef = useRef(null);
21
+ var _b = __read(useState(!!selectAllItem), 2), isRootSelectAllHighlighted = _b[0], setIsRootSelectAllHighlighted = _b[1];
22
+ var clearMenuHighlight = useCallback(function () {
23
+ var _a, _b;
24
+ var menu = menuRef.current;
25
+ if (!menu)
26
+ return;
27
+ (_a = menu.turnOffKeyboardNavigation) === null || _a === void 0 ? void 0 : _a.call(menu);
28
+ (_b = menu.setHighlightedItem) === null || _b === void 0 ? void 0 : _b.call(menu, null);
29
+ }, [menuRef]);
30
+ var highlightFirstMenuItem = useCallback(function () {
31
+ var _a, _b;
32
+ var menu = menuRef.current;
33
+ if (!menu)
34
+ return;
35
+ (_a = menu.turnOnKeyboardNavigation) === null || _a === void 0 ? void 0 : _a.call(menu);
36
+ var firstHighlightableItem = getFirstHighlightableElement(menu).firstHighlightableItem;
37
+ var itemToHighlight = firstHighlightableItem;
38
+ (_b = menu.setHighlightedItem) === null || _b === void 0 ? void 0 : _b.call(menu, itemToHighlight);
39
+ }, [menuRef]);
40
+ var highlightRootSelectAll = useCallback(function () {
41
+ clearMenuHighlight();
42
+ setIsRootSelectAllHighlighted(true);
43
+ }, [clearMenuHighlight]);
44
+ var leaveRootSelectAllHighlight = useCallback(function () {
45
+ var _a, _b;
46
+ setIsRootSelectAllHighlighted(false);
47
+ (_b = (_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.turnOnKeyboardNavigation) === null || _b === void 0 ? void 0 : _b.call(_a);
48
+ }, [menuRef]);
49
+ useEffect(function () {
50
+ if (!selectAllItem || !ownerDocument)
51
+ return undefined;
52
+ var captureKeydownHandler = function (event) {
53
+ var _a;
54
+ if (isRootSelectAllHighlighted && event.key === 'ArrowDown' && !event.shiftKey) {
55
+ stopKeyboardEvent(event);
56
+ leaveRootSelectAllHighlight();
57
+ var firstGroupId = (_a = groupConfig[0]) === null || _a === void 0 ? void 0 : _a.id;
58
+ if (firstGroupId && expandedGroupId !== firstGroupId) {
59
+ setExpandedGroupId(firstGroupId);
60
+ }
61
+ highlightFirstMenuItem();
62
+ return;
63
+ }
64
+ var expandedGroupIndex = groupConfig.findIndex(function (group) { return group.id === expandedGroupId; });
65
+ if (event.key === 'ArrowUp' &&
66
+ !event.shiftKey &&
67
+ expandedGroupIndex === 0 &&
68
+ isFirstMenuItemHighlighted(menuRef.current, isFirstItemHighlighted)) {
69
+ stopKeyboardEvent(event);
70
+ highlightRootSelectAll();
71
+ return;
72
+ }
73
+ if (isRootSelectAllHighlighted && event.key === 'Enter' && event.keyCode !== 229) {
74
+ stopKeyboardEvent(event);
75
+ onItemSelect === null || onItemSelect === void 0 ? void 0 : onItemSelect({ item: selectAllItem, event: event });
76
+ }
77
+ };
78
+ ownerDocument.body.addEventListener('keydown', captureKeydownHandler, { capture: true });
79
+ return function () {
80
+ ownerDocument.body.removeEventListener('keydown', captureKeydownHandler, { capture: true });
81
+ };
82
+ }, [
83
+ menuRef,
84
+ ownerDocument,
85
+ selectAllItem,
86
+ expandedGroupId,
87
+ groupConfig,
88
+ isRootSelectAllHighlighted,
89
+ setExpandedGroupId,
90
+ onItemSelect,
91
+ highlightRootSelectAll,
92
+ highlightFirstMenuItem,
93
+ leaveRootSelectAllHighlight,
94
+ isFirstItemHighlighted,
95
+ ]);
96
+ useEffect(function () {
97
+ var _a;
98
+ var selectAllItemId = (_a = selectAllItemRef.current) === null || _a === void 0 ? void 0 : _a.id;
99
+ if (!isRootSelectAllHighlighted || !inputElement || !selectAllItemId)
100
+ return undefined;
101
+ inputElement.setAttribute('aria-activedescendant', selectAllItemId);
102
+ return function () {
103
+ if (inputElement.getAttribute('aria-activedescendant') === selectAllItemId) {
104
+ inputElement.removeAttribute('aria-activedescendant');
105
+ }
106
+ };
107
+ }, [isRootSelectAllHighlighted, inputElement]);
108
+ return {
109
+ selectAllItemRef: selectAllItemRef,
110
+ isRootSelectAllHighlighted: isRootSelectAllHighlighted,
111
+ leaveRootSelectAllHighlight: leaveRootSelectAllHighlight,
112
+ };
113
+ };
@@ -40,7 +40,7 @@ export var StyledInput = styled('input', 'bg-transparent border-none inline-bloc
40
40
  return ($disabled ? 'webkit-text-transparent' : '');
41
41
  });
42
42
  var StyledOverlayContentContainer = styled('div', 'overflow-auto rounded-inherit w-[--sw-width]');
43
- var getCommaSeparatedValues = function (value, limitTags, labelKey, locale) {
43
+ var getCommaSeparatedValues = function (value, limitTags, labelKey, locale, multi) {
44
44
  if (limitTags === void 0) { limitTags = Number(Infinity); }
45
45
  var _limitTags = limitTags < 0 ? Number(Infinity) : limitTags;
46
46
  var commaSeparatedValues = value === null || value === void 0 ? void 0 : value.slice(0, _limitTags).map(function (val) { return val[labelKey]; });
@@ -49,16 +49,26 @@ var getCommaSeparatedValues = function (value, limitTags, labelKey, locale) {
49
49
  commaSeparatedValues.push("".concat("+".concat(extraTagNumber, " ").concat(extraTagNumber === 1 ? locale.select.item : locale.select.items)));
50
50
  }
51
51
  var _commaSeparatedValues = commaSeparatedValues === null || commaSeparatedValues === void 0 ? void 0 : commaSeparatedValues.join(',');
52
- return value && value.length > 0
53
- ? "".concat(getInterpolatedString(locale.select.selectedValuesPrefix, { values: _commaSeparatedValues }), ".")
54
- : '';
52
+ if (!(value === null || value === void 0 ? void 0 : value.length)) {
53
+ return '';
54
+ }
55
+ if (multi) {
56
+ var count = value.length;
57
+ var countLabel = count === 1 ? locale.select.item : locale.select.items;
58
+ return "".concat(getInterpolatedString(locale.select.selectedMultiValuesPrefix, {
59
+ count: String(count),
60
+ countLabel: countLabel,
61
+ values: _commaSeparatedValues,
62
+ }), ".");
63
+ }
64
+ return "".concat(getInterpolatedString(locale.select.selectedValuesPrefix, { values: _commaSeparatedValues }), ".");
55
65
  };
56
66
  var InputContainer = function (_a) {
57
67
  var _b;
58
68
  var size = _a.size, $value = _a.$value, $labelKey = _a.$labelKey, placeholder = _a.placeholder, $limitTags = _a.$limitTags, props = __rest(_a, ["size", "$value", "$labelKey", "placeholder", "$limitTags"]);
59
69
  var locale = useLocale();
60
70
  var listboxId = useSelectIds().listboxId;
61
- var commaSeparatedValues = getCommaSeparatedValues($value, $limitTags, $labelKey, locale);
71
+ var commaSeparatedValues = getCommaSeparatedValues($value, $limitTags, $labelKey, locale, props.$multi);
62
72
  var baseAriaDescribedBy = (_b = props['aria-describedby']) !== null && _b !== void 0 ? _b : '';
63
73
  var selectedValuesId = useUniqueId();
64
74
  var ariaDescribedBy = commaSeparatedValues ? "".concat(selectedValuesId, " ").concat(baseAriaDescribedBy) : baseAriaDescribedBy;
@@ -77,7 +87,7 @@ var Input = forwardRef(function (_a, ref) {
77
87
  var placeholder = _a.placeholder, $value = _a.$value, $labelKey = _a.$labelKey, _c = _a.$limitTags, $limitTags = _c === void 0 ? Number(Infinity) : _c, props = __rest(_a, ["placeholder", "$value", "$labelKey", "$limitTags"]);
78
88
  var locale = useLocale();
79
89
  var _d = useSelectIds(), listboxId = _d.listboxId, inputId = _d.inputId;
80
- var commaSeparatedValues = getCommaSeparatedValues($value, $limitTags, $labelKey, locale);
90
+ var commaSeparatedValues = getCommaSeparatedValues($value, $limitTags, $labelKey, locale, props.$multi);
81
91
  var baseAriaDescribedBy = (_b = props['aria-describedby']) !== null && _b !== void 0 ? _b : '';
82
92
  var selectedValuesId = useUniqueId();
83
93
  var ariaDescribedBy = commaSeparatedValues ? "".concat(selectedValuesId, " ").concat(baseAriaDescribedBy) : baseAriaDescribedBy;
@@ -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;
@@ -22,6 +22,6 @@ declare const _default: React.MemoExoticComponent<React.ForwardRefExoticComponen
22
22
  } | undefined;
23
23
  selected?: boolean | undefined;
24
24
  startEnhancer?: Enhancer<ListItemSharedProps>;
25
- tooltipContent?: React.ReactNode | import("../baseui/popover").StatefulContentRenderProp;
25
+ tooltipContent?: React.ReactNode | import("../baseui/popover").ContentRenderProp;
26
26
  } & React.RefAttributes<HTMLElement>>>;
27
27
  export default _default;
package/list/list-item.js CHANGED
@@ -10,6 +10,7 @@ var overrides_1 = require("../overrides");
10
10
  var styled_component_1 = require("./styled-component");
11
11
  var useFocusVisible_1 = require("../hooks/useFocusVisible");
12
12
  var tooltip_1 = require("../tooltip");
13
+ var useListItemTooltip_1 = tslib_1.__importStar(require("./useListItemTooltip"));
13
14
  var ListItem = React.forwardRef(function (_a, ref) {
14
15
  var startEnhancer = _a.startEnhancer, children = _a.children, className = _a.className, style = _a.style, _b = _a.alignItems, alignItems = _b === void 0 ? 'center' : _b, _c = _a.disabled, disabled = _c === void 0 ? false : _c, endEnhancer = _a.endEnhancer, _d = _a.selected, selected = _d === void 0 ? false : _d, _e = _a.highlighted, highlighted = _e === void 0 ? false : _e, _f = _a.autoFocus, autoFocus = _f === void 0 ? false : _f, _g = _a.button, button = _g === void 0 ? false : _g, _h = _a.overrides, overrides = _h === void 0 ? {} : _h, _j = _a.tabIndex, tabIndex = _j === void 0 ? button ? 0 : undefined : _j, _k = _a.$as, $as = _k === void 0 ? 'li' : _k, onClick = _a.onClick, onKeyDown = _a.onKeyDown, onFocus = _a.onFocus, onBlur = _a.onBlur, _l = _a.tooltipContent, tooltipContent = _l === void 0 ? '' : _l, restProps = tslib_1.__rest(_a, ["startEnhancer", "children", "className", "style", "alignItems", "disabled", "endEnhancer", "selected", "highlighted", "autoFocus", "button", "overrides", "tabIndex", "$as", "onClick", "onKeyDown", "onFocus", "onBlur", "tooltipContent"]);
15
16
  var ownRef = (0, react_1.useRef)(null);
@@ -48,9 +49,15 @@ var ListItem = React.forwardRef(function (_a, ref) {
48
49
  var renderEnhancer = function (enhancer) {
49
50
  return typeof enhancer === 'function' ? enhancer(sharedProps) : enhancer;
50
51
  };
51
- var _r = tslib_1.__read((0, overrides_1.useOverrides)(overrides === null || overrides === void 0 ? void 0 : overrides.StatefulTooltip, tooltip_1.StatefulTooltip), 2), StatefulTooltip = _r[0], statefulTooltipProps = _r[1];
52
- var listEl = ((0, jsx_runtime_1.jsxs)(Root, tslib_1.__assign({ "data-spaceweb": "list-item", role: "listitem", ref: combinedRef, tabIndex: tabIndex, "aria-disabled": disabled, "$as": $as, onClick: disabled ? noop_1.default : onClick, onKeyDown: handleKeyDown, "data-highlighted": highlighted }, sharedProps, restProps, rootProps, useFocusVisibleProps, { style: [style, rootProps === null || rootProps === void 0 ? void 0 : rootProps.style], className: [className, rootProps === null || rootProps === void 0 ? void 0 : rootProps.className] }, { children: [startEnhancer && ((0, jsx_runtime_1.jsx)(StartEnhancer, tslib_1.__assign({}, sharedProps, startEnhancerProps, { children: renderEnhancer(startEnhancer) }))), (0, jsx_runtime_1.jsx)(ChildContainer, tslib_1.__assign({}, sharedProps, childContainerProps, { children: children })), endEnhancer && ((0, jsx_runtime_1.jsx)(EndEnhancer, tslib_1.__assign({}, sharedProps, endEnhancerProps, { children: renderEnhancer(endEnhancer) })))] })));
53
- return tooltipContent ? ((0, jsx_runtime_1.jsx)(StatefulTooltip, tslib_1.__assign({ placement: "bottom", content: tooltipContent, viewportAsBoundary: true }, statefulTooltipProps, { children: listEl }))) : (listEl);
52
+ var _r = tslib_1.__read((0, overrides_1.useOverrides)(overrides === null || overrides === void 0 ? void 0 : overrides.StatefulTooltip, tooltip_1.Tooltip), 2), Tooltip = _r[0], tooltipProps = _r[1];
53
+ var tooltipControlProps = (0, useListItemTooltip_1.default)({
54
+ highlighted: highlighted,
55
+ tooltipHandlers: (0, useListItemTooltip_1.getListItemTooltipHandlers)(tooltipProps),
56
+ });
57
+ var listEl = (
58
+ // eslint-disable-next-line jsx-a11y/role-supports-aria-props -- aria-disabled required for disabled button list items
59
+ (0, jsx_runtime_1.jsxs)(Root, tslib_1.__assign({ "data-spaceweb": "list-item", role: "listitem", ref: combinedRef, tabIndex: tabIndex, "$as": $as, "aria-disabled": disabled, onClick: disabled ? noop_1.default : onClick, onKeyDown: handleKeyDown, "data-highlighted": highlighted }, sharedProps, restProps, rootProps, useFocusVisibleProps, { style: [style, rootProps === null || rootProps === void 0 ? void 0 : rootProps.style], className: [className, rootProps === null || rootProps === void 0 ? void 0 : rootProps.className] }, { children: [startEnhancer && ((0, jsx_runtime_1.jsx)(StartEnhancer, tslib_1.__assign({}, sharedProps, startEnhancerProps, { children: renderEnhancer(startEnhancer) }))), (0, jsx_runtime_1.jsx)(ChildContainer, tslib_1.__assign({}, sharedProps, childContainerProps, { children: children })), endEnhancer && ((0, jsx_runtime_1.jsx)(EndEnhancer, tslib_1.__assign({}, sharedProps, endEnhancerProps, { children: renderEnhancer(endEnhancer) })))] })));
60
+ return tooltipContent ? ((0, jsx_runtime_1.jsx)(Tooltip, tslib_1.__assign({ placement: "bottom", showArrow: true, content: tooltipContent, viewportAsBoundary: true }, tooltipProps, tooltipControlProps, { children: listEl }))) : (listEl);
54
61
  });
55
62
  ListItem.displayName = 'ListItem';
56
63
  ListItem.__standard = 'Component';
package/list/types.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { KeyboardEvent, MouseEvent, ReactNode } from 'react';
2
2
  import type { Override } from '../overrides/types';
3
3
  import type { SpacewebComponentProps } from '../types';
4
- import type { StatefulTooltipProps } from '../tooltip';
4
+ import type { TooltipProps } from '../tooltip/types';
5
5
  export type AlignItems = 'start' | 'center';
6
6
  export type Enhancer<SharedProps> = ReactNode | ((props: SharedProps) => ReactNode);
7
7
  export type ListItemSharedProps = {
@@ -31,7 +31,7 @@ export type ListItemProps = SpacewebComponentProps & {
31
31
  };
32
32
  selected?: boolean;
33
33
  startEnhancer?: Enhancer<ListItemSharedProps>;
34
- tooltipContent?: StatefulTooltipProps['content'];
34
+ tooltipContent?: TooltipProps['content'];
35
35
  };
36
36
  export type ListProps = SpacewebComponentProps & {
37
37
  children?: ReactNode;
@@ -0,0 +1,10 @@
1
+ import type { TooltipProps } from '../tooltip/types';
2
+ export type ListItemTooltipHandlerProps = Pick<TooltipProps, 'onMouseEnter' | 'onMouseLeave' | 'onFocus' | 'onBlur'>;
3
+ export declare const getListItemTooltipHandlers: (tooltipProps: Record<string, unknown>) => Partial<ListItemTooltipHandlerProps>;
4
+ type ListItemTooltipControlProps = Required<Pick<TooltipProps, 'isOpen'>> & ListItemTooltipHandlerProps;
5
+ type Params = {
6
+ highlighted: boolean;
7
+ tooltipHandlers?: Partial<ListItemTooltipHandlerProps>;
8
+ };
9
+ declare const useListItemTooltip: ({ highlighted, tooltipHandlers }: Params) => ListItemTooltipControlProps;
10
+ export default useListItemTooltip;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getListItemTooltipHandlers = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = require("react");
6
+ var useCombinedHandler_1 = tslib_1.__importDefault(require("../hooks/useCombinedHandler"));
7
+ var focusVisible_1 = require("../baseui/utils/focusVisible");
8
+ var MenuContext_1 = require("../menu/MenuContext");
9
+ var getListItemTooltipHandlers = function (tooltipProps) {
10
+ return ({
11
+ onMouseEnter: tooltipProps.onMouseEnter,
12
+ onMouseLeave: tooltipProps.onMouseLeave,
13
+ onFocus: tooltipProps.onFocus,
14
+ onBlur: tooltipProps.onBlur,
15
+ });
16
+ };
17
+ exports.getListItemTooltipHandlers = getListItemTooltipHandlers;
18
+ var useListItemTooltip = function (_a) {
19
+ var highlighted = _a.highlighted, _b = _a.tooltipHandlers, tooltipHandlers = _b === void 0 ? {} : _b;
20
+ var listItemFocusVisible = (0, MenuContext_1.useMenuContext)().listItemFocusVisible;
21
+ var _c = tslib_1.__read((0, react_1.useState)(false), 2), hoverOpen = _c[0], setHoverOpen = _c[1];
22
+ var onMouseEnter = tooltipHandlers.onMouseEnter, onMouseLeave = tooltipHandlers.onMouseLeave, onFocus = tooltipHandlers.onFocus, onBlur = tooltipHandlers.onBlur;
23
+ var openHoverTooltip = (0, react_1.useCallback)(function () { return setHoverOpen(true); }, []);
24
+ var closeHoverTooltip = (0, react_1.useCallback)(function () { return setHoverOpen(false); }, []);
25
+ var openOnFocusVisible = (0, react_1.useCallback)(function (event) {
26
+ if ((0, focusVisible_1.isFocusVisible)(event)) {
27
+ setHoverOpen(true);
28
+ }
29
+ }, []);
30
+ var onMouseEnterHandler = (0, useCombinedHandler_1.default)(openHoverTooltip, onMouseEnter);
31
+ var onMouseLeaveHandler = (0, useCombinedHandler_1.default)(closeHoverTooltip, onMouseLeave);
32
+ var onBlurHandler = (0, useCombinedHandler_1.default)(closeHoverTooltip, onBlur);
33
+ var onFocusHandler = (0, useCombinedHandler_1.default)(onFocus, openOnFocusVisible);
34
+ return {
35
+ isOpen: hoverOpen || (highlighted && listItemFocusVisible),
36
+ onMouseEnter: onMouseEnterHandler,
37
+ onMouseLeave: onMouseLeaveHandler,
38
+ onFocus: onFocusHandler,
39
+ onBlur: onBlurHandler,
40
+ };
41
+ };
42
+ exports.default = useListItemTooltip;
package/locale/en_US.js CHANGED
@@ -26,6 +26,7 @@ exports.DEFAULT_LOCALE = {
26
26
  selectPlaceholder: 'Select...',
27
27
  clearOptionLabel: 'Unassign',
28
28
  selectedValuesPrefix: 'Selected ${values}',
29
+ selectedMultiValuesPrefix: 'Selected ${count} ${countLabel} ${values}',
29
30
  item: 'item',
30
31
  items: 'items',
31
32
  multiValueNavigationDescription: 'Use Left and Right arrow keys to navigate between selected values. Enter BackSpace to remove currently focused value',
@@ -81,7 +81,7 @@ declare const StatefulSubMenu: import("react").ForwardRefExoticComponent<Omit<Me
81
81
  } | undefined;
82
82
  selected?: boolean | undefined;
83
83
  startEnhancer?: import("../list/types").Enhancer<import("../list").ListItemSharedProps>;
84
- tooltipContent?: ReactNode | import("../baseui/popover").StatefulContentRenderProp;
84
+ tooltipContent?: ReactNode | import("../baseui/popover").ContentRenderProp;
85
85
  } & Record<string, any>> | undefined;
86
86
  Popover?: Override<Omit<import("../baseui/popover").PopoverProps, "children" | "overrides" | "placement" | "triggerType"> & {
87
87
  overrides?: ({
package/menu/SubMenu.d.ts CHANGED
@@ -82,7 +82,7 @@ declare const SubMenu: import("react").ForwardRefExoticComponent<Omit<MenuProps,
82
82
  } | undefined;
83
83
  selected?: boolean | undefined;
84
84
  startEnhancer?: import("../list/types").Enhancer<import("../list").ListItemSharedProps>;
85
- tooltipContent?: ReactNode | import("../baseui/popover").StatefulContentRenderProp;
85
+ tooltipContent?: ReactNode | import("../baseui/popover").ContentRenderProp;
86
86
  } & Record<string, any>> | undefined;
87
87
  Popover?: Override<Omit<import("../baseui/popover").PopoverProps, "children" | "overrides" | "placement" | "triggerType"> & {
88
88
  overrides?: ({
@@ -30,7 +30,7 @@ declare const _default: React.MemoExoticComponent<React.ForwardRefExoticComponen
30
30
  } | undefined;
31
31
  selected?: boolean | undefined;
32
32
  startEnhancer?: import("../list/types").Enhancer<ListItemSharedProps>;
33
- tooltipContent?: React.ReactNode | import("../baseui/popover").StatefulContentRenderProp;
33
+ tooltipContent?: React.ReactNode | import("../baseui/popover").ContentRenderProp;
34
34
  } & Record<string, any>> | undefined;
35
35
  Popover?: import("../overrides").Override<Omit<import("../baseui/popover").PopoverProps, "children" | "overrides" | "placement" | "triggerType"> & {
36
36
  overrides?: ({
package/menu/menu-item.js CHANGED
@@ -89,7 +89,7 @@ function MenuActionContainer(_a) {
89
89
  }
90
90
  function buildListItemAriaProps(itemRole, selected, ChildMenu) {
91
91
  var props = {};
92
- if (selected !== undefined) {
92
+ if (selected !== undefined && itemRole !== 'checkbox') {
93
93
  props['aria-selected'] = Boolean(selected);
94
94
  }
95
95
  if (ChildMenu) {
@@ -142,7 +142,7 @@ var MenuItem = React.forwardRef(function MenuItem(_a, ref) {
142
142
  var _a, _b;
143
143
  setMenuContainerRef((_b = (_a = ownRef.current) === null || _a === void 0 ? void 0 : _a.parentElement) !== null && _b !== void 0 ? _b : null);
144
144
  }, [setMenuContainerRef]);
145
- var isItemHighlighted = highlighted || (highlightedItem !== null && highlightedItem === ownRef.current);
145
+ var isItemHighlighted = highlighted !== null && highlighted !== void 0 ? highlighted : (highlightedItem !== null && highlightedItem === ownRef.current);
146
146
  var resolvedItemActions = (0, react_1.useMemo)(function () { return resolveMenuActions(getActionsElement, $item); }, [getActionsElement, $item]);
147
147
  var shouldRenderActions = ((_b = resolvedItemActions === null || resolvedItemActions === void 0 ? void 0 : resolvedItemActions.length) !== null && _b !== void 0 ? _b : 0) > 0 && !ChildMenu && !hideInlineActions;
148
148
  var resolvedEndEnhancer = useResolvedMenuEndEnhancer(resolvedItemActions, shouldRenderActions, endEnhancer, ChildMenu);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sprinklrjs/spaceweb",
3
- "version": "14.13.1",
3
+ "version": "14.14.0",
4
4
  "description": "Components for SpaceWeb",
5
5
  "main": "index.js",
6
6
  "module": "./esm/index.js",
@@ -35,6 +35,7 @@
35
35
  "@types/styletron-engine-atomic": "^1.1.0",
36
36
  "@types/styletron-react": "^5.0.2",
37
37
  "any-date-parser": "2.2.3",
38
+ "aria-hidden": "^1.2.6",
38
39
  "body-scroll-lock": "3.1.5",
39
40
  "card-validator": "^6.2.0",
40
41
  "class-variance-authority": "^0.7.0",
@@ -100,7 +101,7 @@
100
101
  "ts-node": "^10.4.0"
101
102
  },
102
103
  "peerDependencies": {
103
- "@sprinklrjs/spaceweb-themes": "14.13.1",
104
+ "@sprinklrjs/spaceweb-themes": "14.14.0",
104
105
  "react": ">=17.0.2 <19.0.0",
105
106
  "react-dom": ">=17.0.2 <19.0.0"
106
107
  }
package/select/index.d.ts CHANGED
@@ -19,4 +19,4 @@ export { CollapsibleSelectMenu } from './selectMenuAdapter/CollapsibleSelectMenu
19
19
  export { NestedSelect } from './nested-select';
20
20
  export { OverridenPopover } from './mobileSelect/overrides';
21
21
  export { filterOptions as defaultFilterOptions } from './utils/default-filter-options';
22
- export { getOptionLabel, getValueLabel } from '../baseui/select/select-component';
22
+ export { getOptionLabel, getValueLabel, getValueAriaLabel } from '../baseui/select/select-component';
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; } });
@@ -5,6 +5,7 @@ export type SelectLocale = {
5
5
  selectPlaceholder: string;
6
6
  clearOptionLabel: string;
7
7
  selectedValuesPrefix: string;
8
+ selectedMultiValuesPrefix: string;
8
9
  item: string;
9
10
  items: string;
10
11
  collapsibleMenuDescription: string;
@@ -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;
@@ -67,7 +67,7 @@ export declare const CollapsibleSelectMenu: ({ overrides, value, items: groupedI
67
67
  } | undefined;
68
68
  selected?: boolean | undefined;
69
69
  startEnhancer?: import("../../list/types").Enhancer<import("../../list").ListItemSharedProps>;
70
- tooltipContent?: ReactNode | import("../../baseui/popover").StatefulContentRenderProp;
70
+ tooltipContent?: ReactNode | import("../../baseui/popover").ContentRenderProp;
71
71
  } & Record<string, any>> | undefined;
72
72
  Popover?: import("../../overrides").Override<Omit<import("../../baseui/popover").PopoverProps, "children" | "overrides" | "placement" | "triggerType"> & {
73
73
  overrides?: ({
@@ -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;
@@ -38,7 +38,7 @@ declare const _default: React.MemoExoticComponent<React.ForwardRefExoticComponen
38
38
  } | undefined;
39
39
  selected?: boolean | undefined;
40
40
  startEnhancer?: import("../../list/types").Enhancer<import("../../list").ListItemSharedProps>;
41
- tooltipContent?: React.ReactNode | import("../../baseui/popover").StatefulContentRenderProp;
41
+ tooltipContent?: React.ReactNode | import("../../baseui/popover").ContentRenderProp;
42
42
  } & Record<string, any>> | undefined;
43
43
  Popover?: Override<Omit<import("../../baseui/popover").PopoverProps, "children" | "overrides" | "placement" | "triggerType"> & {
44
44
  overrides?: ({