@kaizen/components 1.78.2 → 1.78.3
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/dist/cjs/src/Filter/FilterMultiSelect/FilterMultiSelect.cjs +11 -4
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.cjs +1 -1
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.css.cjs +9 -0
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.cjs +1 -1
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/{MenuPopup.module.scss.cjs → MenuPopup.module.css.cjs} +1 -1
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/ResponsiveMenuPopup.cjs +91 -0
- package/dist/esm/src/Filter/FilterMultiSelect/FilterMultiSelect.mjs +12 -5
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.mjs +1 -1
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.css.mjs +7 -0
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.mjs +1 -1
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.module.css.mjs +4 -0
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/ResponsiveMenuPopup.mjs +85 -0
- package/dist/styles.css +8643 -8638
- package/dist/types/Filter/FilterMultiSelect/FilterMultiSelect.d.ts +7 -1
- package/dist/types/Filter/FilterMultiSelect/_docs/MockData.d.ts +1 -0
- package/dist/types/Filter/FilterMultiSelect/subcomponents/MenuPopup/ResponsiveMenuPopup.d.ts +22 -0
- package/dist/types/Filter/FilterMultiSelect/subcomponents/MenuPopup/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/Filter/FilterBar/subcomponents/FilterBarMultiSelect/FilterBarMultiSelect.spec.tsx +1 -0
- package/src/Filter/FilterMultiSelect/FilterMultiSelect.tsx +10 -4
- package/src/Filter/FilterMultiSelect/_docs/FilterMultiSelect.mdx +9 -1
- package/src/Filter/FilterMultiSelect/_docs/FilterMultiSelect.stories.tsx +79 -2
- package/src/Filter/FilterMultiSelect/_docs/MockData.ts +39 -0
- package/src/Filter/FilterMultiSelect/context/MenuTriggerProvider/MenuTriggerProvider.spec.tsx +2 -18
- package/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.css +20 -0
- package/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.tsx +1 -1
- package/src/Filter/FilterMultiSelect/subcomponents/ListBoxSection/ListBoxSection.module.scss +1 -0
- package/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.module.css +20 -0
- package/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.tsx +1 -1
- package/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/ResponsiveMenuPopup.tsx +115 -0
- package/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/index.ts +1 -0
- package/dist/cjs/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.scss.cjs +0 -9
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.scss.mjs +0 -7
- package/dist/esm/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.module.scss.mjs +0 -4
- package/src/Filter/FilterMultiSelect/subcomponents/ListBox/ListBox.module.scss +0 -23
- package/src/Filter/FilterMultiSelect/subcomponents/MenuPopup/MenuPopup.module.scss +0 -22
|
@@ -10,6 +10,7 @@ var LoadMoreButton = require('./subcomponents/LoadMoreButton/LoadMoreButton.cjs'
|
|
|
10
10
|
var MenuFooter = require('./subcomponents/MenuLayout/MenuFooter/MenuFooter.cjs');
|
|
11
11
|
var MenuLoadingSkeleton = require('./subcomponents/MenuLayout/MenuLoadingSkeleton/MenuLoadingSkeleton.cjs');
|
|
12
12
|
var MenuPopup = require('./subcomponents/MenuPopup/MenuPopup.cjs');
|
|
13
|
+
var ResponsiveMenuPopup = require('./subcomponents/MenuPopup/ResponsiveMenuPopup.cjs');
|
|
13
14
|
var MultiSelectOption = require('./subcomponents/MultiSelectOption/MultiSelectOption.cjs');
|
|
14
15
|
var NoResults = require('./subcomponents/NoResults/NoResults.cjs');
|
|
15
16
|
var SearchInput = require('./subcomponents/SearchInput/SearchInput.cjs');
|
|
@@ -27,6 +28,7 @@ var React__default = /*#__PURE__*/_interopDefault(React);
|
|
|
27
28
|
var FilterMultiSelect = function (_a) {
|
|
28
29
|
var trigger = _a.trigger,
|
|
29
30
|
children = _a.children,
|
|
31
|
+
customMenuPopup = _a.customMenuPopup,
|
|
30
32
|
isOpen = _a.isOpen,
|
|
31
33
|
defaultOpen = _a.defaultOpen,
|
|
32
34
|
onOpenChange = _a.onOpenChange,
|
|
@@ -41,17 +43,19 @@ var FilterMultiSelect = function (_a) {
|
|
|
41
43
|
selectionMode = _b === void 0 ? 'multiple' : _b,
|
|
42
44
|
onSearchInputChange = _a.onSearchInputChange,
|
|
43
45
|
triggerRef = _a.triggerRef,
|
|
44
|
-
className = _a.className
|
|
46
|
+
className = _a.className,
|
|
47
|
+
restProps = tslib.__rest(_a, ["trigger", "children", "customMenuPopup", "isOpen", "defaultOpen", "onOpenChange", "isLoading", "loadingSkeleton", "label", "items", "selectedKeys", "defaultSelectedKeys", "onSelectionChange", "selectionMode", "onSearchInputChange", "triggerRef", "className"]);
|
|
48
|
+
var MenuComponent = customMenuPopup !== null && customMenuPopup !== void 0 ? customMenuPopup : MenuPopup.MenuPopup;
|
|
45
49
|
var menuTriggerProps = {
|
|
46
50
|
isOpen: isOpen,
|
|
47
51
|
defaultOpen: defaultOpen,
|
|
48
52
|
onOpenChange: onOpenChange,
|
|
49
53
|
triggerRef: triggerRef
|
|
50
54
|
};
|
|
51
|
-
var menuPopupProps = {
|
|
55
|
+
var menuPopupProps = tslib.__assign({
|
|
52
56
|
isLoading: isLoading,
|
|
53
57
|
loadingSkeleton: loadingSkeleton
|
|
54
|
-
};
|
|
58
|
+
}, restProps);
|
|
55
59
|
var disabledKeys = new Set(items === null || items === void 0 ? void 0 : items.filter(function (item) {
|
|
56
60
|
return item.isDisabled === true;
|
|
57
61
|
}).map(function (disabledItem) {
|
|
@@ -69,7 +73,9 @@ var FilterMultiSelect = function (_a) {
|
|
|
69
73
|
};
|
|
70
74
|
return React__default.default.createElement(MenuTriggerProvider.MenuTriggerProvider, tslib.__assign({}, menuTriggerProps), React__default.default.createElement("div", {
|
|
71
75
|
className: className
|
|
72
|
-
}, React__default.default.createElement(MenuTriggerProvider.MenuTriggerConsumer, null, trigger), React__default.default.createElement(
|
|
76
|
+
}, React__default.default.createElement(MenuTriggerProvider.MenuTriggerConsumer, null, trigger), React__default.default.createElement(MenuComponent, tslib.__assign({
|
|
77
|
+
"aria-label": label
|
|
78
|
+
}, menuPopupProps), React__default.default.createElement(SelectionProvider.SelectionProvider, tslib.__assign({}, selectionProps), React__default.default.createElement(SelectionProvider.SelectionConsumer, null, children)))));
|
|
73
79
|
};
|
|
74
80
|
FilterMultiSelect.displayName = 'FilterMultiSelect';
|
|
75
81
|
FilterMultiSelect.TriggerButton = FilterTriggerButton.FilterTriggerButton;
|
|
@@ -85,4 +91,5 @@ FilterMultiSelect.MenuFooter = MenuFooter.MenuFooter; // For layout
|
|
|
85
91
|
FilterMultiSelect.MenuLoadingSkeleton = MenuLoadingSkeleton.MenuLoadingSkeleton; // Menu Loading Skeleton example
|
|
86
92
|
FilterMultiSelect.LoadMoreButton = LoadMoreButton.LoadMoreButton;
|
|
87
93
|
FilterMultiSelect.NoResults = NoResults.NoResults;
|
|
94
|
+
FilterMultiSelect.ResponsiveMenuPopup = ResponsiveMenuPopup.ResponsiveMenuPopup;
|
|
88
95
|
exports.FilterMultiSelect = FilterMultiSelect;
|
|
@@ -4,7 +4,7 @@ var tslib = require('tslib');
|
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var classnames = require('classnames');
|
|
6
6
|
var SelectionProvider = require('../../context/SelectionProvider/SelectionProvider.cjs');
|
|
7
|
-
var ListBox_module = require('./ListBox.module.
|
|
7
|
+
var ListBox_module = require('./ListBox.module.css.cjs');
|
|
8
8
|
function _interopDefault(e) {
|
|
9
9
|
return e && e.__esModule ? e : {
|
|
10
10
|
default: e
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var styles = {
|
|
4
|
+
"listBox": "ListBox-module_listBox__HBScm",
|
|
5
|
+
"overflown": "ListBox-module_overflown__PdKED",
|
|
6
|
+
"hidden": "ListBox-module_hidden__mO-oL",
|
|
7
|
+
"noResultsWrapper": "ListBox-module_noResultsWrapper__RnMj0"
|
|
8
|
+
};
|
|
9
|
+
module.exports = styles;
|
|
@@ -6,7 +6,7 @@ var focus = require('@react-aria/focus');
|
|
|
6
6
|
var overlays = require('@react-aria/overlays');
|
|
7
7
|
var MenuTriggerProvider = require('../../context/MenuTriggerProvider/MenuTriggerProvider.cjs');
|
|
8
8
|
require('../../context/SelectionProvider/SelectionProvider.cjs');
|
|
9
|
-
var MenuPopup_module = require('./MenuPopup.module.
|
|
9
|
+
var MenuPopup_module = require('./MenuPopup.module.css.cjs');
|
|
10
10
|
function _interopDefault(e) {
|
|
11
11
|
return e && e.__esModule ? e : {
|
|
12
12
|
default: e
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tslib = require('tslib');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var reactDom = require('@floating-ui/react-dom');
|
|
6
|
+
var classnames = require('classnames');
|
|
7
|
+
var reactFocusOn = require('react-focus-on');
|
|
8
|
+
var MenuTriggerProvider = require('../../context/MenuTriggerProvider/MenuTriggerProvider.cjs');
|
|
9
|
+
require('../../context/SelectionProvider/SelectionProvider.cjs');
|
|
10
|
+
var MenuPopup_module = require('./MenuPopup.module.css.cjs');
|
|
11
|
+
function _interopDefault(e) {
|
|
12
|
+
return e && e.__esModule ? e : {
|
|
13
|
+
default: e
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
17
|
+
var classnames__default = /*#__PURE__*/_interopDefault(classnames);
|
|
18
|
+
|
|
19
|
+
/** This is a popup primitive that can be used with the FilterMultiSelect when there are overflow issues with the original implementation. This uses the floating-ui */
|
|
20
|
+
var ResponsiveMenuPopup = function (_a) {
|
|
21
|
+
var children = _a.children,
|
|
22
|
+
_b = _a.floatingConfig,
|
|
23
|
+
floatingConfig = _b === void 0 ? {
|
|
24
|
+
placement: 'bottom-start',
|
|
25
|
+
strategy: 'absolute',
|
|
26
|
+
whileElementsMounted: reactDom.autoUpdate,
|
|
27
|
+
shouldFlip: true,
|
|
28
|
+
shouldResize: true
|
|
29
|
+
} : _b,
|
|
30
|
+
classNameOverride = _a.classNameOverride,
|
|
31
|
+
isLoading = _a.isLoading,
|
|
32
|
+
loadingSkeleton = _a.loadingSkeleton,
|
|
33
|
+
restProps = tslib.__rest(_a, ["children", "floatingConfig", "classNameOverride", "isLoading", "loadingSkeleton"]);
|
|
34
|
+
var _c = React.useState(null),
|
|
35
|
+
floatingElement = _c[0],
|
|
36
|
+
setFloatingElement = _c[1];
|
|
37
|
+
var _d = MenuTriggerProvider.useMenuTriggerContext(),
|
|
38
|
+
menuTriggerState = _d.menuTriggerState,
|
|
39
|
+
buttonRef = _d.buttonRef;
|
|
40
|
+
var referenceElement = buttonRef.current;
|
|
41
|
+
var _e = reactDom.useFloating(tslib.__assign({
|
|
42
|
+
elements: {
|
|
43
|
+
reference: referenceElement,
|
|
44
|
+
floating: floatingElement
|
|
45
|
+
},
|
|
46
|
+
middleware: [reactDom.offset(6), floatingConfig.shouldFlip && reactDom.autoPlacement({
|
|
47
|
+
allowedPlacements: ['bottom-start', 'top-start']
|
|
48
|
+
}), floatingConfig.shouldResize && reactDom.size({
|
|
49
|
+
apply: function (_a) {
|
|
50
|
+
var availableHeight = _a.availableHeight,
|
|
51
|
+
elements = _a.elements;
|
|
52
|
+
Object.assign(elements.floating.style, {
|
|
53
|
+
maxHeight: Math.max(250, Math.min(availableHeight - 12, 500)) + 'px'
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
})]
|
|
57
|
+
}, floatingConfig)),
|
|
58
|
+
floatingStyles = _e.floatingStyles,
|
|
59
|
+
update = _e.update;
|
|
60
|
+
var handleReturnFocus = function () {
|
|
61
|
+
requestAnimationFrame(function () {
|
|
62
|
+
var _a;
|
|
63
|
+
(_a = buttonRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
React.useEffect(function () {
|
|
67
|
+
var _a;
|
|
68
|
+
if (floatingElement && referenceElement) {
|
|
69
|
+
(_a = floatingElement.showPopover) === null || _a === void 0 ? void 0 : _a.call(floatingElement);
|
|
70
|
+
update();
|
|
71
|
+
}
|
|
72
|
+
}, [floatingElement, referenceElement, update]);
|
|
73
|
+
return menuTriggerState.isOpen ? React__default.default.createElement(reactFocusOn.FocusOn, {
|
|
74
|
+
enabled: menuTriggerState.isOpen,
|
|
75
|
+
scrollLock: true,
|
|
76
|
+
returnFocus: false,
|
|
77
|
+
onClickOutside: menuTriggerState.close,
|
|
78
|
+
onEscapeKey: menuTriggerState.close,
|
|
79
|
+
onDeactivation: handleReturnFocus
|
|
80
|
+
}, React__default.default.createElement("div", tslib.__assign({
|
|
81
|
+
ref: setFloatingElement,
|
|
82
|
+
style: floatingStyles,
|
|
83
|
+
className: classnames__default.default(MenuPopup_module.menuPopup, classNameOverride),
|
|
84
|
+
role: "dialog",
|
|
85
|
+
"aria-modal": "true",
|
|
86
|
+
// @ts-expect-error: popover is valid in supported browsers
|
|
87
|
+
popover: "manual"
|
|
88
|
+
}, restProps), isLoading && loadingSkeleton ? loadingSkeleton : children)) : React__default.default.createElement(React__default.default.Fragment, null);
|
|
89
|
+
};
|
|
90
|
+
ResponsiveMenuPopup.displayName = 'FilterMultiSelect.ResponsiveMenuPopup';
|
|
91
|
+
exports.ResponsiveMenuPopup = ResponsiveMenuPopup;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { __assign } from 'tslib';
|
|
1
|
+
import { __rest, __assign } from 'tslib';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { MenuTriggerProvider, MenuTriggerConsumer } from './context/MenuTriggerProvider/MenuTriggerProvider.mjs';
|
|
4
4
|
import { SelectionProvider, SelectionConsumer } from './context/SelectionProvider/SelectionProvider.mjs';
|
|
@@ -8,6 +8,7 @@ import { LoadMoreButton } from './subcomponents/LoadMoreButton/LoadMoreButton.mj
|
|
|
8
8
|
import { MenuFooter } from './subcomponents/MenuLayout/MenuFooter/MenuFooter.mjs';
|
|
9
9
|
import { MenuLoadingSkeleton } from './subcomponents/MenuLayout/MenuLoadingSkeleton/MenuLoadingSkeleton.mjs';
|
|
10
10
|
import { MenuPopup } from './subcomponents/MenuPopup/MenuPopup.mjs';
|
|
11
|
+
import { ResponsiveMenuPopup } from './subcomponents/MenuPopup/ResponsiveMenuPopup.mjs';
|
|
11
12
|
import { MultiSelectOption } from './subcomponents/MultiSelectOption/MultiSelectOption.mjs';
|
|
12
13
|
import { NoResults } from './subcomponents/NoResults/NoResults.mjs';
|
|
13
14
|
import { SearchInput } from './subcomponents/SearchInput/SearchInput.mjs';
|
|
@@ -20,6 +21,7 @@ const FilterMultiSelect = /*#__PURE__*/function () {
|
|
|
20
21
|
const FilterMultiSelect = function (_a) {
|
|
21
22
|
var trigger = _a.trigger,
|
|
22
23
|
children = _a.children,
|
|
24
|
+
customMenuPopup = _a.customMenuPopup,
|
|
23
25
|
isOpen = _a.isOpen,
|
|
24
26
|
defaultOpen = _a.defaultOpen,
|
|
25
27
|
onOpenChange = _a.onOpenChange,
|
|
@@ -34,17 +36,19 @@ const FilterMultiSelect = /*#__PURE__*/function () {
|
|
|
34
36
|
selectionMode = _b === void 0 ? 'multiple' : _b,
|
|
35
37
|
onSearchInputChange = _a.onSearchInputChange,
|
|
36
38
|
triggerRef = _a.triggerRef,
|
|
37
|
-
className = _a.className
|
|
39
|
+
className = _a.className,
|
|
40
|
+
restProps = __rest(_a, ["trigger", "children", "customMenuPopup", "isOpen", "defaultOpen", "onOpenChange", "isLoading", "loadingSkeleton", "label", "items", "selectedKeys", "defaultSelectedKeys", "onSelectionChange", "selectionMode", "onSearchInputChange", "triggerRef", "className"]);
|
|
41
|
+
var MenuComponent = customMenuPopup !== null && customMenuPopup !== void 0 ? customMenuPopup : MenuPopup;
|
|
38
42
|
var menuTriggerProps = {
|
|
39
43
|
isOpen: isOpen,
|
|
40
44
|
defaultOpen: defaultOpen,
|
|
41
45
|
onOpenChange: onOpenChange,
|
|
42
46
|
triggerRef: triggerRef
|
|
43
47
|
};
|
|
44
|
-
var menuPopupProps = {
|
|
48
|
+
var menuPopupProps = __assign({
|
|
45
49
|
isLoading: isLoading,
|
|
46
50
|
loadingSkeleton: loadingSkeleton
|
|
47
|
-
};
|
|
51
|
+
}, restProps);
|
|
48
52
|
var disabledKeys = new Set(items === null || items === void 0 ? void 0 : items.filter(function (item) {
|
|
49
53
|
return item.isDisabled === true;
|
|
50
54
|
}).map(function (disabledItem) {
|
|
@@ -62,7 +66,9 @@ const FilterMultiSelect = /*#__PURE__*/function () {
|
|
|
62
66
|
};
|
|
63
67
|
return /*#__PURE__*/React.createElement(MenuTriggerProvider, __assign({}, menuTriggerProps), /*#__PURE__*/React.createElement("div", {
|
|
64
68
|
className: className
|
|
65
|
-
}, /*#__PURE__*/React.createElement(MenuTriggerConsumer, null, trigger), /*#__PURE__*/React.createElement(
|
|
69
|
+
}, /*#__PURE__*/React.createElement(MenuTriggerConsumer, null, trigger), /*#__PURE__*/React.createElement(MenuComponent, __assign({
|
|
70
|
+
"aria-label": label
|
|
71
|
+
}, menuPopupProps), /*#__PURE__*/React.createElement(SelectionProvider, __assign({}, selectionProps), /*#__PURE__*/React.createElement(SelectionConsumer, null, children)))));
|
|
66
72
|
};
|
|
67
73
|
FilterMultiSelect.displayName = 'FilterMultiSelect';
|
|
68
74
|
FilterMultiSelect.TriggerButton = FilterTriggerButton;
|
|
@@ -79,6 +85,7 @@ const FilterMultiSelect = /*#__PURE__*/function () {
|
|
|
79
85
|
FilterMultiSelect.MenuLoadingSkeleton = MenuLoadingSkeleton;
|
|
80
86
|
FilterMultiSelect.LoadMoreButton = LoadMoreButton;
|
|
81
87
|
FilterMultiSelect.NoResults = NoResults;
|
|
88
|
+
FilterMultiSelect.ResponsiveMenuPopup = ResponsiveMenuPopup;
|
|
82
89
|
return FilterMultiSelect;
|
|
83
90
|
}();
|
|
84
91
|
export { FilterMultiSelect };
|
|
@@ -2,7 +2,7 @@ import { __assign, __spreadArray } from 'tslib';
|
|
|
2
2
|
import React, { useState, useEffect } from 'react';
|
|
3
3
|
import classnames from 'classnames';
|
|
4
4
|
import { useSelectionContext } from '../../context/SelectionProvider/SelectionProvider.mjs';
|
|
5
|
-
import styles from './ListBox.module.
|
|
5
|
+
import styles from './ListBox.module.css.mjs';
|
|
6
6
|
var getItemsFromKeys = function (items, keys) {
|
|
7
7
|
var itemKeys = Array.from(keys);
|
|
8
8
|
return itemKeys.reduce(function (acc, itemKey) {
|
|
@@ -4,7 +4,7 @@ import { FocusScope } from '@react-aria/focus';
|
|
|
4
4
|
import { useOverlay, DismissButton } from '@react-aria/overlays';
|
|
5
5
|
import { useMenuTriggerContext } from '../../context/MenuTriggerProvider/MenuTriggerProvider.mjs';
|
|
6
6
|
import '../../context/SelectionProvider/SelectionProvider.mjs';
|
|
7
|
-
import styles from './MenuPopup.module.
|
|
7
|
+
import styles from './MenuPopup.module.css.mjs';
|
|
8
8
|
const MenuPopup = /*#__PURE__*/function () {
|
|
9
9
|
const MenuPopup = function (_a) {
|
|
10
10
|
var isLoading = _a.isLoading,
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { __rest, __assign } from 'tslib';
|
|
2
|
+
import React, { useState, useEffect } from 'react';
|
|
3
|
+
import { useFloating, offset, autoPlacement, size, autoUpdate } from '@floating-ui/react-dom';
|
|
4
|
+
import classnames from 'classnames';
|
|
5
|
+
import { FocusOn } from 'react-focus-on';
|
|
6
|
+
import { useMenuTriggerContext } from '../../context/MenuTriggerProvider/MenuTriggerProvider.mjs';
|
|
7
|
+
import '../../context/SelectionProvider/SelectionProvider.mjs';
|
|
8
|
+
import styles from './MenuPopup.module.css.mjs';
|
|
9
|
+
|
|
10
|
+
/** This is a popup primitive that can be used with the FilterMultiSelect when there are overflow issues with the original implementation. This uses the floating-ui */
|
|
11
|
+
const ResponsiveMenuPopup = /*#__PURE__*/function () {
|
|
12
|
+
const ResponsiveMenuPopup = function (_a) {
|
|
13
|
+
var children = _a.children,
|
|
14
|
+
_b = _a.floatingConfig,
|
|
15
|
+
floatingConfig = _b === void 0 ? {
|
|
16
|
+
placement: 'bottom-start',
|
|
17
|
+
strategy: 'absolute',
|
|
18
|
+
whileElementsMounted: autoUpdate,
|
|
19
|
+
shouldFlip: true,
|
|
20
|
+
shouldResize: true
|
|
21
|
+
} : _b,
|
|
22
|
+
classNameOverride = _a.classNameOverride,
|
|
23
|
+
isLoading = _a.isLoading,
|
|
24
|
+
loadingSkeleton = _a.loadingSkeleton,
|
|
25
|
+
restProps = __rest(_a, ["children", "floatingConfig", "classNameOverride", "isLoading", "loadingSkeleton"]);
|
|
26
|
+
var _c = useState(null),
|
|
27
|
+
floatingElement = _c[0],
|
|
28
|
+
setFloatingElement = _c[1];
|
|
29
|
+
var _d = useMenuTriggerContext(),
|
|
30
|
+
menuTriggerState = _d.menuTriggerState,
|
|
31
|
+
buttonRef = _d.buttonRef;
|
|
32
|
+
var referenceElement = buttonRef.current;
|
|
33
|
+
var _e = useFloating(__assign({
|
|
34
|
+
elements: {
|
|
35
|
+
reference: referenceElement,
|
|
36
|
+
floating: floatingElement
|
|
37
|
+
},
|
|
38
|
+
middleware: [offset(6), floatingConfig.shouldFlip && autoPlacement({
|
|
39
|
+
allowedPlacements: ['bottom-start', 'top-start']
|
|
40
|
+
}), floatingConfig.shouldResize && size({
|
|
41
|
+
apply: function (_a) {
|
|
42
|
+
var availableHeight = _a.availableHeight,
|
|
43
|
+
elements = _a.elements;
|
|
44
|
+
Object.assign(elements.floating.style, {
|
|
45
|
+
maxHeight: Math.max(250, Math.min(availableHeight - 12, 500)) + 'px'
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
})]
|
|
49
|
+
}, floatingConfig)),
|
|
50
|
+
floatingStyles = _e.floatingStyles,
|
|
51
|
+
update = _e.update;
|
|
52
|
+
var handleReturnFocus = function () {
|
|
53
|
+
requestAnimationFrame(function () {
|
|
54
|
+
var _a;
|
|
55
|
+
(_a = buttonRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
useEffect(function () {
|
|
59
|
+
var _a;
|
|
60
|
+
if (floatingElement && referenceElement) {
|
|
61
|
+
(_a = floatingElement.showPopover) === null || _a === void 0 ? void 0 : _a.call(floatingElement);
|
|
62
|
+
update();
|
|
63
|
+
}
|
|
64
|
+
}, [floatingElement, referenceElement, update]);
|
|
65
|
+
return menuTriggerState.isOpen ? (/*#__PURE__*/React.createElement(FocusOn, {
|
|
66
|
+
enabled: menuTriggerState.isOpen,
|
|
67
|
+
scrollLock: true,
|
|
68
|
+
returnFocus: false,
|
|
69
|
+
onClickOutside: menuTriggerState.close,
|
|
70
|
+
onEscapeKey: menuTriggerState.close,
|
|
71
|
+
onDeactivation: handleReturnFocus
|
|
72
|
+
}, /*#__PURE__*/React.createElement("div", __assign({
|
|
73
|
+
ref: setFloatingElement,
|
|
74
|
+
style: floatingStyles,
|
|
75
|
+
className: classnames(styles.menuPopup, classNameOverride),
|
|
76
|
+
role: "dialog",
|
|
77
|
+
"aria-modal": "true",
|
|
78
|
+
// @ts-expect-error: popover is valid in supported browsers
|
|
79
|
+
popover: "manual"
|
|
80
|
+
}, restProps), isLoading && loadingSkeleton ? loadingSkeleton : children))) : (/*#__PURE__*/React.createElement(React.Fragment, null));
|
|
81
|
+
};
|
|
82
|
+
ResponsiveMenuPopup.displayName = 'FilterMultiSelect.ResponsiveMenuPopup';
|
|
83
|
+
return ResponsiveMenuPopup;
|
|
84
|
+
}();
|
|
85
|
+
export { ResponsiveMenuPopup };
|