@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.
- package/a11y/accessibilityIsolation.d.ts +5 -0
- package/a11y/accessibilityIsolation.js +12 -0
- package/asyncSelect/hooks/useAsyncSelect.d.ts +54 -0
- package/asyncSelect/hooks/useGroupedAsyncSelect.d.ts +54 -0
- package/baseui/modal/modal.d.ts +4 -0
- package/baseui/modal/modal.js +24 -2
- package/baseui/select/default-props.d.ts +1 -0
- package/baseui/select/default-props.js +2 -0
- package/baseui/select/select-component.d.ts +4 -0
- package/baseui/select/select-component.js +14 -3
- package/baseui/select/stateful-select.d.ts +1 -0
- package/baseui/select/types.d.ts +5 -0
- package/esm/a11y/accessibilityIsolation.d.ts +5 -0
- package/esm/a11y/accessibilityIsolation.js +8 -0
- package/esm/asyncSelect/hooks/useAsyncSelect.d.ts +54 -0
- package/esm/asyncSelect/hooks/useGroupedAsyncSelect.d.ts +54 -0
- package/esm/baseui/modal/modal.d.ts +4 -0
- package/esm/baseui/modal/modal.js +24 -2
- package/esm/baseui/select/default-props.d.ts +1 -0
- package/esm/baseui/select/default-props.js +2 -0
- package/esm/baseui/select/select-component.d.ts +4 -0
- package/esm/baseui/select/select-component.js +12 -2
- package/esm/baseui/select/stateful-select.d.ts +1 -0
- package/esm/baseui/select/types.d.ts +5 -0
- package/esm/list/list-item.d.ts +1 -1
- package/esm/list/list-item.js +11 -4
- package/esm/list/types.d.ts +2 -2
- package/esm/list/useListItemTooltip.d.ts +10 -0
- package/esm/list/useListItemTooltip.js +38 -0
- package/esm/locale/en_US.js +1 -0
- package/esm/menu/StatefulSubMenu.d.ts +1 -1
- package/esm/menu/SubMenu.d.ts +1 -1
- package/esm/menu/menu-item.d.ts +1 -1
- package/esm/menu/menu-item.js +2 -2
- package/esm/select/index.d.ts +1 -1
- package/esm/select/index.js +1 -1
- package/esm/select/locale.d.ts +1 -0
- package/esm/select/multi-value.d.ts +1 -0
- package/esm/select/multi-value.js +4 -3
- package/esm/select/selectMenuAdapter/CollapsibleSelectMenu.d.ts +1 -1
- package/esm/select/selectMenuAdapter/CollapsibleSelectMenu.js +28 -7
- package/esm/select/selectMenuAdapter/SelectMenuItem.d.ts +2 -2
- package/esm/select/selectMenuAdapter/SelectMenuItem.js +13 -6
- package/esm/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.d.ts +22 -0
- package/esm/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.js +113 -0
- package/esm/select/styled-component.js +16 -6
- package/esm/select/types.d.ts +1 -0
- package/list/list-item.d.ts +1 -1
- package/list/list-item.js +10 -3
- package/list/types.d.ts +2 -2
- package/list/useListItemTooltip.d.ts +10 -0
- package/list/useListItemTooltip.js +42 -0
- package/locale/en_US.js +1 -0
- package/menu/StatefulSubMenu.d.ts +1 -1
- package/menu/SubMenu.d.ts +1 -1
- package/menu/menu-item.d.ts +1 -1
- package/menu/menu-item.js +2 -2
- package/package.json +3 -2
- package/select/index.d.ts +1 -1
- package/select/index.js +2 -1
- package/select/locale.d.ts +1 -0
- package/select/multi-value.d.ts +1 -0
- package/select/multi-value.js +4 -3
- package/select/selectMenuAdapter/CollapsibleSelectMenu.d.ts +1 -1
- package/select/selectMenuAdapter/CollapsibleSelectMenu.js +27 -6
- package/select/selectMenuAdapter/SelectMenuItem.d.ts +2 -2
- package/select/selectMenuAdapter/SelectMenuItem.js +13 -6
- package/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.d.ts +22 -0
- package/select/selectMenuAdapter/hooks/useRootSelectAllKeyboardNav.js +117 -0
- package/select/styled-component.js +16 -6
- package/select/types.d.ts +1 -0
- 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
|
-
|
|
53
|
-
|
|
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;
|
package/esm/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;
|
package/list/list-item.d.ts
CHANGED
|
@@ -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").
|
|
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.
|
|
52
|
-
var
|
|
53
|
-
|
|
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 {
|
|
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?:
|
|
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").
|
|
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").
|
|
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?: ({
|
package/menu/menu-item.d.ts
CHANGED
|
@@ -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").
|
|
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
|
|
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.
|
|
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.
|
|
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; } });
|
package/select/locale.d.ts
CHANGED
package/select/multi-value.d.ts
CHANGED
|
@@ -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;
|
package/select/multi-value.js
CHANGED
|
@@ -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",
|
|
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 ? (
|
|
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").
|
|
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
|
-
|
|
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").
|
|
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?: ({
|