@jobber/components 6.68.2 → 6.69.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/dist/Autocomplete/Autocomplete.types.d.ts +1 -1
- package/dist/Autocomplete/Menu/DefaultMenu.d.ts +3 -3
- package/dist/Autocomplete/Menu/MenuWrapper.d.ts +2 -3
- package/dist/Autocomplete/constants.d.ts +2 -0
- package/dist/Autocomplete/index.cjs +16 -26
- package/dist/Autocomplete/index.mjs +16 -26
- package/dist/Autocomplete/useRepositionMenu.d.ts +5 -18
- package/dist/Autocomplete-cjs.js +62 -46
- package/dist/Autocomplete-es.js +63 -47
- package/dist/Popover-es.js +1 -1
- package/dist/floating-ui.react-cjs.js +94 -0
- package/dist/floating-ui.react-es.js +94 -1
- package/dist/index.cjs +3 -3
- package/dist/index.mjs +3 -3
- package/dist/styles.css +1276 -1277
- package/package.json +2 -2
|
@@ -67,7 +67,7 @@ export interface MenuProps<GenericOption extends AnyOption = AnyOption, GenericO
|
|
|
67
67
|
/**
|
|
68
68
|
* Element that the menu is attached to when the menu opens.
|
|
69
69
|
*/
|
|
70
|
-
readonly attachTo:
|
|
70
|
+
readonly attachTo: HTMLDivElement | null;
|
|
71
71
|
/**
|
|
72
72
|
* Ref to the TextInput element.
|
|
73
73
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React
|
|
1
|
+
import React from "react";
|
|
2
2
|
import { AnyOption, Option } from "../Autocomplete.types";
|
|
3
3
|
export interface DefaultMenuProps {
|
|
4
4
|
readonly options: AnyOption[];
|
|
@@ -6,9 +6,9 @@ export interface DefaultMenuProps {
|
|
|
6
6
|
/**
|
|
7
7
|
* Element that it's attached to when the menu opens.
|
|
8
8
|
*/
|
|
9
|
-
readonly attachTo:
|
|
9
|
+
readonly attachTo: HTMLDivElement | null;
|
|
10
10
|
onOptionSelect(chosenOption?: Option): void;
|
|
11
|
-
readonly visible
|
|
11
|
+
readonly visible: boolean;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* Renders the default Menu for the Autocomplete component.
|
|
@@ -2,8 +2,7 @@ import React, { PropsWithChildren } from "react";
|
|
|
2
2
|
import { UseRepositionMenu } from "../useRepositionMenu";
|
|
3
3
|
export interface BaseAutocompleteMenuWrapperInternalProps {
|
|
4
4
|
readonly setMenuRef: UseRepositionMenu["setMenuRef"];
|
|
5
|
-
readonly
|
|
6
|
-
readonly attributes: UseRepositionMenu["attributes"];
|
|
5
|
+
readonly floatStyles: UseRepositionMenu["styles"];
|
|
7
6
|
readonly targetWidth: UseRepositionMenu["targetWidth"];
|
|
8
7
|
readonly visible?: boolean;
|
|
9
8
|
}
|
|
@@ -12,7 +11,7 @@ export interface BaseAutocompleteMenuWrapperInternalProps {
|
|
|
12
11
|
* @param attachTo - The element that the menu should be attached to.
|
|
13
12
|
*/
|
|
14
13
|
export declare function useAutocompleteMenu({ attachTo, }: {
|
|
15
|
-
attachTo:
|
|
14
|
+
attachTo: HTMLDivElement | null;
|
|
16
15
|
}): {
|
|
17
16
|
MenuWrapper: ({ children, visible, }: {
|
|
18
17
|
children?: React.ReactNode;
|
|
@@ -3,48 +3,38 @@
|
|
|
3
3
|
var Autocomplete = require('../Autocomplete-cjs.js');
|
|
4
4
|
require('../tslib.es6-cjs.js');
|
|
5
5
|
require('react');
|
|
6
|
-
require('../Modal/index.cjs');
|
|
7
|
-
require('react-dom');
|
|
8
6
|
require('classnames');
|
|
9
|
-
require('
|
|
10
|
-
require('../
|
|
11
|
-
require('../
|
|
12
|
-
require('
|
|
7
|
+
require('../useIsMounted-cjs.js');
|
|
8
|
+
require('../useSafeLayoutEffect-cjs.js');
|
|
9
|
+
require('../floating-ui.react-cjs.js');
|
|
10
|
+
require('react-dom');
|
|
13
11
|
require('../Heading-cjs.js');
|
|
14
12
|
require('../Typography-cjs.js');
|
|
15
|
-
require('../
|
|
16
|
-
require('react-router-dom');
|
|
13
|
+
require('../Text-cjs.js');
|
|
17
14
|
require('../Icon-cjs.js');
|
|
18
15
|
require('@jobber/design');
|
|
19
|
-
require('../
|
|
20
|
-
require('../noop-cjs.js');
|
|
21
|
-
require('../_commonjsHelpers-cjs.js');
|
|
22
|
-
require('../floating-ui.react-cjs.js');
|
|
23
|
-
require('../identity-cjs.js');
|
|
24
|
-
require('../isTypedArray-cjs.js');
|
|
25
|
-
require('../isObjectLike-cjs.js');
|
|
26
|
-
require('../AtlantisPortalContent-cjs.js');
|
|
27
|
-
require('../AtlantisThemeContext-cjs.js');
|
|
28
|
-
require('../_baseAssignValue-cjs.js');
|
|
29
|
-
require('../_baseFor-cjs.js');
|
|
30
|
-
require('../keysIn-cjs.js');
|
|
31
|
-
require('../_isIterateeCall-cjs.js');
|
|
32
|
-
require('../_setToString-cjs.js');
|
|
33
|
-
require('../useIsMounted-cjs.js');
|
|
34
|
-
require('../useSafeLayoutEffect-cjs.js');
|
|
35
|
-
require('react-popper');
|
|
36
|
-
require('../Text-cjs.js');
|
|
16
|
+
require('../useOnKeyDown-cjs.js');
|
|
37
17
|
require('../InputText/index.cjs');
|
|
38
18
|
require('../FormField-cjs.js');
|
|
19
|
+
require('framer-motion');
|
|
20
|
+
require('../Button-cjs.js');
|
|
21
|
+
require('react-router-dom');
|
|
39
22
|
require('../useFormFieldFocus-cjs.js');
|
|
40
23
|
require('../InputValidation-cjs.js');
|
|
41
24
|
require('../Spinner-cjs.js');
|
|
42
25
|
require('react-hook-form');
|
|
43
26
|
require('../omit-cjs.js');
|
|
27
|
+
require('../_commonjsHelpers-cjs.js');
|
|
44
28
|
require('../_baseGet-cjs.js');
|
|
29
|
+
require('../isTypedArray-cjs.js');
|
|
30
|
+
require('../isObjectLike-cjs.js');
|
|
31
|
+
require('../identity-cjs.js');
|
|
45
32
|
require('../_getTag-cjs.js');
|
|
46
33
|
require('../isSymbol-cjs.js');
|
|
34
|
+
require('../keysIn-cjs.js');
|
|
35
|
+
require('../_baseAssignValue-cjs.js');
|
|
47
36
|
require('../_baseFlatten-cjs.js');
|
|
37
|
+
require('../_setToString-cjs.js');
|
|
48
38
|
require('../useDebounce-cjs.js');
|
|
49
39
|
require('../debounce-cjs.js');
|
|
50
40
|
|
|
@@ -1,47 +1,37 @@
|
|
|
1
1
|
export { A as Autocomplete, d as BaseAutocompleteMenuWrapper, a as BaseMenuGroupOption, B as BaseMenuOption, K as KeyboardAction, M as MenuOption, g as getRequestedIndexChange, f as isOptionGroup, i as isOptionSelected, e as useAutocompleteMenu, b as useCustomKeyboardNavigation, u as useKeyboardNavigation, c as useRepositionMenu } from '../Autocomplete-es.js';
|
|
2
2
|
import '../tslib.es6-es.js';
|
|
3
3
|
import 'react';
|
|
4
|
-
import '../Modal/index.mjs';
|
|
5
|
-
import 'react-dom';
|
|
6
4
|
import 'classnames';
|
|
7
|
-
import '
|
|
8
|
-
import '../
|
|
9
|
-
import '../
|
|
10
|
-
import '
|
|
5
|
+
import '../useIsMounted-es.js';
|
|
6
|
+
import '../useSafeLayoutEffect-es.js';
|
|
7
|
+
import '../floating-ui.react-es.js';
|
|
8
|
+
import 'react-dom';
|
|
11
9
|
import '../Heading-es.js';
|
|
12
10
|
import '../Typography-es.js';
|
|
13
|
-
import '../
|
|
14
|
-
import 'react-router-dom';
|
|
11
|
+
import '../Text-es.js';
|
|
15
12
|
import '../Icon-es.js';
|
|
16
13
|
import '@jobber/design';
|
|
17
|
-
import '../
|
|
18
|
-
import '../noop-es.js';
|
|
19
|
-
import '../_commonjsHelpers-es.js';
|
|
20
|
-
import '../floating-ui.react-es.js';
|
|
21
|
-
import '../identity-es.js';
|
|
22
|
-
import '../isTypedArray-es.js';
|
|
23
|
-
import '../isObjectLike-es.js';
|
|
24
|
-
import '../AtlantisPortalContent-es.js';
|
|
25
|
-
import '../AtlantisThemeContext-es.js';
|
|
26
|
-
import '../_baseAssignValue-es.js';
|
|
27
|
-
import '../_baseFor-es.js';
|
|
28
|
-
import '../keysIn-es.js';
|
|
29
|
-
import '../_isIterateeCall-es.js';
|
|
30
|
-
import '../_setToString-es.js';
|
|
31
|
-
import '../useIsMounted-es.js';
|
|
32
|
-
import '../useSafeLayoutEffect-es.js';
|
|
33
|
-
import 'react-popper';
|
|
34
|
-
import '../Text-es.js';
|
|
14
|
+
import '../useOnKeyDown-es.js';
|
|
35
15
|
import '../InputText/index.mjs';
|
|
36
16
|
import '../FormField-es.js';
|
|
17
|
+
import 'framer-motion';
|
|
18
|
+
import '../Button-es.js';
|
|
19
|
+
import 'react-router-dom';
|
|
37
20
|
import '../useFormFieldFocus-es.js';
|
|
38
21
|
import '../InputValidation-es.js';
|
|
39
22
|
import '../Spinner-es.js';
|
|
40
23
|
import 'react-hook-form';
|
|
41
24
|
import '../omit-es.js';
|
|
25
|
+
import '../_commonjsHelpers-es.js';
|
|
42
26
|
import '../_baseGet-es.js';
|
|
27
|
+
import '../isTypedArray-es.js';
|
|
28
|
+
import '../isObjectLike-es.js';
|
|
29
|
+
import '../identity-es.js';
|
|
43
30
|
import '../_getTag-es.js';
|
|
44
31
|
import '../isSymbol-es.js';
|
|
32
|
+
import '../keysIn-es.js';
|
|
33
|
+
import '../_baseAssignValue-es.js';
|
|
45
34
|
import '../_baseFlatten-es.js';
|
|
35
|
+
import '../_setToString-es.js';
|
|
46
36
|
import '../useDebounce-es.js';
|
|
47
37
|
import '../debounce-es.js';
|
|
@@ -1,23 +1,10 @@
|
|
|
1
|
-
import { usePopper } from "react-popper";
|
|
2
1
|
import { MenuProps } from "./Autocomplete.types";
|
|
3
|
-
export interface UseRepositionMenu
|
|
2
|
+
export interface UseRepositionMenu {
|
|
4
3
|
readonly menuRef: HTMLElement | null;
|
|
5
4
|
readonly setMenuRef: (ref: HTMLElement | null) => void;
|
|
6
5
|
readonly targetWidth: number | undefined;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
menuRef: HTMLElement | null;
|
|
10
|
-
setMenuRef: import("react").Dispatch<import("react").SetStateAction<HTMLElement | null>>;
|
|
11
|
-
targetWidth: number | undefined;
|
|
12
|
-
styles: {
|
|
13
|
-
[key: string]: React.CSSProperties;
|
|
14
|
-
};
|
|
15
|
-
attributes: {
|
|
16
|
-
[key: string]: {
|
|
17
|
-
[key: string]: string;
|
|
18
|
-
} | undefined;
|
|
6
|
+
readonly styles: {
|
|
7
|
+
float: React.CSSProperties;
|
|
19
8
|
};
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
forceUpdate: import("@popperjs/core").Instance["forceUpdate"] | null;
|
|
23
|
-
};
|
|
9
|
+
}
|
|
10
|
+
export declare function useRepositionMenu(attachTo: MenuProps["attachTo"], visible: boolean, cssManagedVisibility: boolean): UseRepositionMenu;
|
package/dist/Autocomplete-cjs.js
CHANGED
|
@@ -2,12 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var tslib_es6 = require('./tslib.es6-cjs.js');
|
|
4
4
|
var React = require('react');
|
|
5
|
-
var Modal_index = require('./Modal/index.cjs');
|
|
6
5
|
var classnames = require('classnames');
|
|
7
6
|
var useIsMounted = require('./useIsMounted-cjs.js');
|
|
8
|
-
var
|
|
7
|
+
var floatingUi_react = require('./floating-ui.react-cjs.js');
|
|
9
8
|
var useSafeLayoutEffect = require('./useSafeLayoutEffect-cjs.js');
|
|
10
|
-
var reactPopper = require('react-popper');
|
|
11
9
|
var Heading = require('./Heading-cjs.js');
|
|
12
10
|
var Text = require('./Text-cjs.js');
|
|
13
11
|
var Icon = require('./Icon-cjs.js');
|
|
@@ -18,25 +16,61 @@ var FormField = require('./FormField-cjs.js');
|
|
|
18
16
|
|
|
19
17
|
var styles = {"autocomplete":"_7mObJiwfPh4-","options":"dL5JShAJlKM-","heading":"PWZL-94hH7k-","visible":"_2RzcnTdaPyc-","option":"y9zhi8Wr8QA-","active":"_3Xg49dtL1Q8-","separator":"LIeh390F3W8-","icon":"K2phy6IC3TY-","text":"a6-LbUm5WnY-","label":"tQNbuxcE9nU-","details":"qacStG9-XbE-","spinning":"P9cQDL4MZ-s-"};
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
19
|
+
const AUTOCOMPLETE_MAX_HEIGHT = 300;
|
|
20
|
+
const AUTCOMPLETE_MIN_HEIGHT = 100;
|
|
21
|
+
|
|
22
|
+
function useRepositionMenu(attachTo, visible, cssManagedVisibility) {
|
|
23
|
+
const { refs, floatingStyles, update } = floatingUi_react.useFloating(Object.assign({ placement: "bottom", middleware: [
|
|
24
|
+
floatingUi_react.offset(8),
|
|
25
|
+
floatingUi_react.flip({ fallbackPlacements: ["top"] }),
|
|
26
|
+
floatingUi_react.size({
|
|
27
|
+
apply({ availableHeight, elements }) {
|
|
28
|
+
// Limit the height for a true maximum
|
|
29
|
+
// However if we have less space than that, then reduce it to allow scrolling
|
|
30
|
+
const maxHeight = availableHeight > AUTOCOMPLETE_MAX_HEIGHT
|
|
31
|
+
? AUTOCOMPLETE_MAX_HEIGHT
|
|
32
|
+
: Math.max(AUTCOMPLETE_MIN_HEIGHT, availableHeight);
|
|
33
|
+
Object.assign(elements.floating.style, {
|
|
34
|
+
maxHeight: `${maxHeight}px`,
|
|
35
|
+
});
|
|
36
|
+
},
|
|
37
|
+
}),
|
|
38
|
+
], elements: {
|
|
39
|
+
reference: attachTo,
|
|
40
|
+
} }, (!cssManagedVisibility
|
|
41
|
+
? {
|
|
42
|
+
whileElementsMounted: floatingUi_react.autoUpdate,
|
|
43
|
+
}
|
|
44
|
+
: {})));
|
|
45
|
+
// While DefaultMenu leverages conditional rendering, CustomMenu is hidden with CSS
|
|
46
|
+
// We need to apply the correct update method to each case
|
|
30
47
|
useSafeLayoutEffect.useSafeLayoutEffect_1(() => {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
48
|
+
if (cssManagedVisibility && visible && attachTo && refs.floating.current) {
|
|
49
|
+
const cleanup = floatingUi_react.autoUpdate(attachTo, refs.floating.current, update);
|
|
50
|
+
return cleanup;
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}, [
|
|
54
|
+
cssManagedVisibility,
|
|
55
|
+
visible,
|
|
56
|
+
attachTo,
|
|
57
|
+
refs.floating.current,
|
|
58
|
+
update,
|
|
59
|
+
floatingUi_react.autoUpdate,
|
|
60
|
+
]);
|
|
61
|
+
const targetWidth = attachTo === null || attachTo === void 0 ? void 0 : attachTo.clientWidth;
|
|
62
|
+
return {
|
|
63
|
+
menuRef: refs.floating.current,
|
|
64
|
+
setMenuRef: refs.setFloating,
|
|
65
|
+
targetWidth,
|
|
66
|
+
styles: {
|
|
67
|
+
float: floatingStyles,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
36
70
|
}
|
|
37
71
|
|
|
38
|
-
function BaseAutocompleteMenuWrapperInternal({ setMenuRef,
|
|
39
|
-
return (React.createElement("div",
|
|
72
|
+
function BaseAutocompleteMenuWrapperInternal({ setMenuRef, floatStyles, targetWidth, visible, children, }) {
|
|
73
|
+
return (React.createElement("div", { className: classnames(styles.options, { [styles.visible]: visible }), ref: setMenuRef, style: Object.assign(Object.assign({}, floatStyles.float), { width: targetWidth }), "data-elevation": "elevated" }, children));
|
|
40
74
|
}
|
|
41
75
|
/**
|
|
42
76
|
* Provides a wrapper for the Autocomplete menu that handles positioning and visibility.
|
|
@@ -45,18 +79,18 @@ function BaseAutocompleteMenuWrapperInternal({ setMenuRef, popperStyles, attribu
|
|
|
45
79
|
function useAutocompleteMenu({ attachTo, }) {
|
|
46
80
|
const [menuRef, setMenuRef] = React.useState(null);
|
|
47
81
|
const AutocompleteMenuWrapper = React.useCallback(({ children, visible, }) => {
|
|
48
|
-
const
|
|
82
|
+
const menuFloatProps = useRepositionMenu(attachTo, visible, true);
|
|
49
83
|
React.useEffect(() => {
|
|
50
|
-
setMenuRef(
|
|
51
|
-
}, [
|
|
52
|
-
return (React.createElement(BaseAutocompleteMenuWrapper, {
|
|
84
|
+
setMenuRef(menuFloatProps.menuRef);
|
|
85
|
+
}, [menuFloatProps.menuRef]);
|
|
86
|
+
return (React.createElement(BaseAutocompleteMenuWrapper, { floatStyles: menuFloatProps.styles, setMenuRef: menuFloatProps.setMenuRef, targetWidth: menuFloatProps.targetWidth, visible: visible }, children));
|
|
53
87
|
}, [attachTo]);
|
|
54
88
|
return { MenuWrapper: AutocompleteMenuWrapper, menuRef };
|
|
55
89
|
}
|
|
56
90
|
function BaseAutocompleteMenuWrapper(props) {
|
|
57
91
|
const mounted = useIsMounted.useIsMounted_2();
|
|
58
92
|
const menu = React.createElement(BaseAutocompleteMenuWrapperInternal, Object.assign({}, props));
|
|
59
|
-
return mounted.current ?
|
|
93
|
+
return mounted.current ? React.createElement(floatingUi_react.FloatingPortal, null, menu) : menu;
|
|
60
94
|
}
|
|
61
95
|
|
|
62
96
|
function isOptionSelected(selectedOption, option) {
|
|
@@ -196,7 +230,7 @@ function getRequestedIndexChange({ event, options, direction, highlightedIndex,
|
|
|
196
230
|
* Renders the default Menu for the Autocomplete component.
|
|
197
231
|
*/
|
|
198
232
|
function DefaultMenu({ options, selectedOption, onOptionSelect, attachTo, visible, }) {
|
|
199
|
-
const { menuRef, setMenuRef, styles:
|
|
233
|
+
const { menuRef, setMenuRef, styles: floatStyles, targetWidth, } = useRepositionMenu(attachTo, visible, false);
|
|
200
234
|
const detectSeparatorCondition = (option) => option.description || option.details;
|
|
201
235
|
const addSeparators = options.some(detectSeparatorCondition);
|
|
202
236
|
const { highlightedIndex } = useKeyboardNavigation({
|
|
@@ -205,30 +239,12 @@ function DefaultMenu({ options, selectedOption, onOptionSelect, attachTo, visibl
|
|
|
205
239
|
visible,
|
|
206
240
|
menuRef,
|
|
207
241
|
});
|
|
208
|
-
return (React.createElement(BaseAutocompleteMenuWrapper, { setMenuRef,
|
|
242
|
+
return (React.createElement(BaseAutocompleteMenuWrapper, { setMenuRef, floatStyles, targetWidth, visible }, options === null || options === void 0 ? void 0 : options.map((option, index) => {
|
|
209
243
|
return (React.createElement(MenuOption, { key: index, option: option, isHighlighted: index === highlightedIndex, onOptionSelect: onOptionSelect, isSelected: isOptionSelected(selectedOption, option), addSeparators: addSeparators }));
|
|
210
244
|
})));
|
|
211
245
|
}
|
|
212
246
|
|
|
213
247
|
function Menu({ options, selectedOption, onOptionSelect, inputFocused, attachTo, inputRef, customRenderMenu, }) {
|
|
214
|
-
const { open: isWithinOpenModal } = Modal_index.useModalContext();
|
|
215
|
-
/**
|
|
216
|
-
* Experimental/temporary workaround for Autocompletes within Modals. This is only necessary
|
|
217
|
-
* when an Autocomplete uses `customRenderMenu` and is rendered within the composable version
|
|
218
|
-
* of Modal (aka Modal.Provider).
|
|
219
|
-
*
|
|
220
|
-
* If `customRenderMenu` contains clickable elements such as Buttons, the consumer must ALSO
|
|
221
|
-
* replace any `onClick` handlers with `onMouseDown` handlers on those Buttons.
|
|
222
|
-
*
|
|
223
|
-
* The check below prevents Autocomplete from rendering the `customRenderMenu` when it's not visible
|
|
224
|
-
* (when the input isn't focused). This prevents Modals (FloatingUI) from marking the Autocomplete's
|
|
225
|
-
* menu as data-floating-ui-inert and aria-hidden="true". As a result, this prevents the bug where clicking
|
|
226
|
-
* within its menu would cause FloatingUI to close the parent Modal because it determined the click was
|
|
227
|
-
* outside of the Modal.
|
|
228
|
-
*/
|
|
229
|
-
const specialModalWorkaround = isWithinOpenModal && customRenderMenu;
|
|
230
|
-
if (specialModalWorkaround && !inputFocused)
|
|
231
|
-
return null;
|
|
232
248
|
if (customRenderMenu) {
|
|
233
249
|
return (React.createElement(CustomMenu, { attachTo: attachTo, inputFocused: inputFocused, inputRef: inputRef, customRenderMenu: customRenderMenu, options: options, onOptionSelect: onOptionSelect, selectedOption: selectedOption }));
|
|
234
250
|
}
|
|
@@ -263,7 +279,7 @@ function AutocompleteInternal(_a, ref) {
|
|
|
263
279
|
const [options, setOptions] = React.useState(initialOptionsMemo);
|
|
264
280
|
const [inputFocused, setInputFocused] = React.useState(false);
|
|
265
281
|
const [inputText, setInputText] = React.useState((_b = value === null || value === void 0 ? void 0 : value.label) !== null && _b !== void 0 ? _b : "");
|
|
266
|
-
const autocompleteRef = React.
|
|
282
|
+
const [autocompleteRef, setAutocompleteRef] = React.useState(null);
|
|
267
283
|
const delayedSearch = useDebounce.useDebounce(updateSearch, debounceRate);
|
|
268
284
|
const inputRef = React.useRef(null);
|
|
269
285
|
React.useEffect(() => {
|
|
@@ -273,7 +289,7 @@ function AutocompleteInternal(_a, ref) {
|
|
|
273
289
|
var _a;
|
|
274
290
|
updateInput((_a = value === null || value === void 0 ? void 0 : value.label) !== null && _a !== void 0 ? _a : "");
|
|
275
291
|
}, [value]);
|
|
276
|
-
return (React.createElement("div", { className: styles.autocomplete, ref:
|
|
292
|
+
return (React.createElement("div", { className: styles.autocomplete, ref: setAutocompleteRef },
|
|
277
293
|
React.createElement(InputText_index.InputText, Object.assign({ ref: FormField.mergeRefs([ref, inputRef]), autocomplete: false, size: size, value: inputText, onChange: handleInputChange, placeholder: placeholder, onFocus: handleInputFocus, onBlur: handleInputBlur, validations: validations }, inputProps)),
|
|
278
294
|
React.createElement(Menu, { attachTo: autocompleteRef, inputRef: inputRef, inputFocused: inputFocused, options: options, customRenderMenu: customRenderMenu, selectedOption: value, onOptionSelect: handleMenuChange })));
|
|
279
295
|
function updateInput(newText) {
|
package/dist/Autocomplete-es.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { _ as __rest, a as __awaiter } from './tslib.es6-es.js';
|
|
2
|
-
import React__default, {
|
|
3
|
-
import { useModalContext } from './Modal/index.mjs';
|
|
2
|
+
import React__default, { useCallback, useEffect, useState, forwardRef, useMemo, useRef } from 'react';
|
|
4
3
|
import classnames from 'classnames';
|
|
5
4
|
import { u as useIsMounted_2 } from './useIsMounted-es.js';
|
|
6
|
-
import {
|
|
5
|
+
import { b as useFloating, o as offset, i as flip, p as size, d as autoUpdate, h as FloatingPortal } from './floating-ui.react-es.js';
|
|
7
6
|
import { u as useSafeLayoutEffect_1 } from './useSafeLayoutEffect-es.js';
|
|
8
|
-
import { usePopper } from 'react-popper';
|
|
9
7
|
import { H as Heading } from './Heading-es.js';
|
|
10
8
|
import { T as Text } from './Text-es.js';
|
|
11
9
|
import { I as Icon } from './Icon-es.js';
|
|
@@ -16,25 +14,61 @@ import { m as mergeRefs } from './FormField-es.js';
|
|
|
16
14
|
|
|
17
15
|
var styles = {"autocomplete":"_7mObJiwfPh4-","options":"dL5JShAJlKM-","heading":"PWZL-94hH7k-","visible":"_2RzcnTdaPyc-","option":"y9zhi8Wr8QA-","active":"_3Xg49dtL1Q8-","separator":"LIeh390F3W8-","icon":"K2phy6IC3TY-","text":"a6-LbUm5WnY-","label":"tQNbuxcE9nU-","details":"qacStG9-XbE-","spinning":"P9cQDL4MZ-s-"};
|
|
18
16
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
17
|
+
const AUTOCOMPLETE_MAX_HEIGHT = 300;
|
|
18
|
+
const AUTCOMPLETE_MIN_HEIGHT = 100;
|
|
19
|
+
|
|
20
|
+
function useRepositionMenu(attachTo, visible, cssManagedVisibility) {
|
|
21
|
+
const { refs, floatingStyles, update } = useFloating(Object.assign({ placement: "bottom", middleware: [
|
|
22
|
+
offset(8),
|
|
23
|
+
flip({ fallbackPlacements: ["top"] }),
|
|
24
|
+
size({
|
|
25
|
+
apply({ availableHeight, elements }) {
|
|
26
|
+
// Limit the height for a true maximum
|
|
27
|
+
// However if we have less space than that, then reduce it to allow scrolling
|
|
28
|
+
const maxHeight = availableHeight > AUTOCOMPLETE_MAX_HEIGHT
|
|
29
|
+
? AUTOCOMPLETE_MAX_HEIGHT
|
|
30
|
+
: Math.max(AUTCOMPLETE_MIN_HEIGHT, availableHeight);
|
|
31
|
+
Object.assign(elements.floating.style, {
|
|
32
|
+
maxHeight: `${maxHeight}px`,
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
}),
|
|
36
|
+
], elements: {
|
|
37
|
+
reference: attachTo,
|
|
38
|
+
} }, (!cssManagedVisibility
|
|
39
|
+
? {
|
|
40
|
+
whileElementsMounted: autoUpdate,
|
|
41
|
+
}
|
|
42
|
+
: {})));
|
|
43
|
+
// While DefaultMenu leverages conditional rendering, CustomMenu is hidden with CSS
|
|
44
|
+
// We need to apply the correct update method to each case
|
|
28
45
|
useSafeLayoutEffect_1(() => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
46
|
+
if (cssManagedVisibility && visible && attachTo && refs.floating.current) {
|
|
47
|
+
const cleanup = autoUpdate(attachTo, refs.floating.current, update);
|
|
48
|
+
return cleanup;
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}, [
|
|
52
|
+
cssManagedVisibility,
|
|
53
|
+
visible,
|
|
54
|
+
attachTo,
|
|
55
|
+
refs.floating.current,
|
|
56
|
+
update,
|
|
57
|
+
autoUpdate,
|
|
58
|
+
]);
|
|
59
|
+
const targetWidth = attachTo === null || attachTo === void 0 ? void 0 : attachTo.clientWidth;
|
|
60
|
+
return {
|
|
61
|
+
menuRef: refs.floating.current,
|
|
62
|
+
setMenuRef: refs.setFloating,
|
|
63
|
+
targetWidth,
|
|
64
|
+
styles: {
|
|
65
|
+
float: floatingStyles,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
34
68
|
}
|
|
35
69
|
|
|
36
|
-
function BaseAutocompleteMenuWrapperInternal({ setMenuRef,
|
|
37
|
-
return (React__default.createElement("div",
|
|
70
|
+
function BaseAutocompleteMenuWrapperInternal({ setMenuRef, floatStyles, targetWidth, visible, children, }) {
|
|
71
|
+
return (React__default.createElement("div", { className: classnames(styles.options, { [styles.visible]: visible }), ref: setMenuRef, style: Object.assign(Object.assign({}, floatStyles.float), { width: targetWidth }), "data-elevation": "elevated" }, children));
|
|
38
72
|
}
|
|
39
73
|
/**
|
|
40
74
|
* Provides a wrapper for the Autocomplete menu that handles positioning and visibility.
|
|
@@ -43,18 +77,18 @@ function BaseAutocompleteMenuWrapperInternal({ setMenuRef, popperStyles, attribu
|
|
|
43
77
|
function useAutocompleteMenu({ attachTo, }) {
|
|
44
78
|
const [menuRef, setMenuRef] = React__default.useState(null);
|
|
45
79
|
const AutocompleteMenuWrapper = useCallback(({ children, visible, }) => {
|
|
46
|
-
const
|
|
80
|
+
const menuFloatProps = useRepositionMenu(attachTo, visible, true);
|
|
47
81
|
useEffect(() => {
|
|
48
|
-
setMenuRef(
|
|
49
|
-
}, [
|
|
50
|
-
return (React__default.createElement(BaseAutocompleteMenuWrapper, {
|
|
82
|
+
setMenuRef(menuFloatProps.menuRef);
|
|
83
|
+
}, [menuFloatProps.menuRef]);
|
|
84
|
+
return (React__default.createElement(BaseAutocompleteMenuWrapper, { floatStyles: menuFloatProps.styles, setMenuRef: menuFloatProps.setMenuRef, targetWidth: menuFloatProps.targetWidth, visible: visible }, children));
|
|
51
85
|
}, [attachTo]);
|
|
52
86
|
return { MenuWrapper: AutocompleteMenuWrapper, menuRef };
|
|
53
87
|
}
|
|
54
88
|
function BaseAutocompleteMenuWrapper(props) {
|
|
55
89
|
const mounted = useIsMounted_2();
|
|
56
90
|
const menu = React__default.createElement(BaseAutocompleteMenuWrapperInternal, Object.assign({}, props));
|
|
57
|
-
return mounted.current ?
|
|
91
|
+
return mounted.current ? React__default.createElement(FloatingPortal, null, menu) : menu;
|
|
58
92
|
}
|
|
59
93
|
|
|
60
94
|
function isOptionSelected(selectedOption, option) {
|
|
@@ -194,7 +228,7 @@ function getRequestedIndexChange({ event, options, direction, highlightedIndex,
|
|
|
194
228
|
* Renders the default Menu for the Autocomplete component.
|
|
195
229
|
*/
|
|
196
230
|
function DefaultMenu({ options, selectedOption, onOptionSelect, attachTo, visible, }) {
|
|
197
|
-
const { menuRef, setMenuRef, styles:
|
|
231
|
+
const { menuRef, setMenuRef, styles: floatStyles, targetWidth, } = useRepositionMenu(attachTo, visible, false);
|
|
198
232
|
const detectSeparatorCondition = (option) => option.description || option.details;
|
|
199
233
|
const addSeparators = options.some(detectSeparatorCondition);
|
|
200
234
|
const { highlightedIndex } = useKeyboardNavigation({
|
|
@@ -203,30 +237,12 @@ function DefaultMenu({ options, selectedOption, onOptionSelect, attachTo, visibl
|
|
|
203
237
|
visible,
|
|
204
238
|
menuRef,
|
|
205
239
|
});
|
|
206
|
-
return (React__default.createElement(BaseAutocompleteMenuWrapper, { setMenuRef,
|
|
240
|
+
return (React__default.createElement(BaseAutocompleteMenuWrapper, { setMenuRef, floatStyles, targetWidth, visible }, options === null || options === void 0 ? void 0 : options.map((option, index) => {
|
|
207
241
|
return (React__default.createElement(MenuOption, { key: index, option: option, isHighlighted: index === highlightedIndex, onOptionSelect: onOptionSelect, isSelected: isOptionSelected(selectedOption, option), addSeparators: addSeparators }));
|
|
208
242
|
})));
|
|
209
243
|
}
|
|
210
244
|
|
|
211
245
|
function Menu({ options, selectedOption, onOptionSelect, inputFocused, attachTo, inputRef, customRenderMenu, }) {
|
|
212
|
-
const { open: isWithinOpenModal } = useModalContext();
|
|
213
|
-
/**
|
|
214
|
-
* Experimental/temporary workaround for Autocompletes within Modals. This is only necessary
|
|
215
|
-
* when an Autocomplete uses `customRenderMenu` and is rendered within the composable version
|
|
216
|
-
* of Modal (aka Modal.Provider).
|
|
217
|
-
*
|
|
218
|
-
* If `customRenderMenu` contains clickable elements such as Buttons, the consumer must ALSO
|
|
219
|
-
* replace any `onClick` handlers with `onMouseDown` handlers on those Buttons.
|
|
220
|
-
*
|
|
221
|
-
* The check below prevents Autocomplete from rendering the `customRenderMenu` when it's not visible
|
|
222
|
-
* (when the input isn't focused). This prevents Modals (FloatingUI) from marking the Autocomplete's
|
|
223
|
-
* menu as data-floating-ui-inert and aria-hidden="true". As a result, this prevents the bug where clicking
|
|
224
|
-
* within its menu would cause FloatingUI to close the parent Modal because it determined the click was
|
|
225
|
-
* outside of the Modal.
|
|
226
|
-
*/
|
|
227
|
-
const specialModalWorkaround = isWithinOpenModal && customRenderMenu;
|
|
228
|
-
if (specialModalWorkaround && !inputFocused)
|
|
229
|
-
return null;
|
|
230
246
|
if (customRenderMenu) {
|
|
231
247
|
return (React__default.createElement(CustomMenu, { attachTo: attachTo, inputFocused: inputFocused, inputRef: inputRef, customRenderMenu: customRenderMenu, options: options, onOptionSelect: onOptionSelect, selectedOption: selectedOption }));
|
|
232
248
|
}
|
|
@@ -261,7 +277,7 @@ function AutocompleteInternal(_a, ref) {
|
|
|
261
277
|
const [options, setOptions] = useState(initialOptionsMemo);
|
|
262
278
|
const [inputFocused, setInputFocused] = useState(false);
|
|
263
279
|
const [inputText, setInputText] = useState((_b = value === null || value === void 0 ? void 0 : value.label) !== null && _b !== void 0 ? _b : "");
|
|
264
|
-
const autocompleteRef =
|
|
280
|
+
const [autocompleteRef, setAutocompleteRef] = useState(null);
|
|
265
281
|
const delayedSearch = useDebounce(updateSearch, debounceRate);
|
|
266
282
|
const inputRef = useRef(null);
|
|
267
283
|
useEffect(() => {
|
|
@@ -271,7 +287,7 @@ function AutocompleteInternal(_a, ref) {
|
|
|
271
287
|
var _a;
|
|
272
288
|
updateInput((_a = value === null || value === void 0 ? void 0 : value.label) !== null && _a !== void 0 ? _a : "");
|
|
273
289
|
}, [value]);
|
|
274
|
-
return (React__default.createElement("div", { className: styles.autocomplete, ref:
|
|
290
|
+
return (React__default.createElement("div", { className: styles.autocomplete, ref: setAutocompleteRef },
|
|
275
291
|
React__default.createElement(InputText, Object.assign({ ref: mergeRefs([ref, inputRef]), autocomplete: false, size: size, value: inputText, onChange: handleInputChange, placeholder: placeholder, onFocus: handleInputFocus, onBlur: handleInputBlur, validations: validations }, inputProps)),
|
|
276
292
|
React__default.createElement(Menu, { attachTo: autocompleteRef, inputRef: inputRef, inputFocused: inputFocused, options: options, customRenderMenu: customRenderMenu, selectedOption: value, onOptionSelect: handleMenuChange })));
|
|
277
293
|
function updateInput(newText) {
|
package/dist/Popover-es.js
CHANGED
|
@@ -2,7 +2,7 @@ import { _ as __rest } from './tslib.es6-es.js';
|
|
|
2
2
|
import React__default, { useState, useMemo, createContext, useContext } from 'react';
|
|
3
3
|
import classnames from 'classnames';
|
|
4
4
|
import ReactDOM__default from 'react-dom';
|
|
5
|
-
import {
|
|
5
|
+
import { o as offset, s as shift, c as autoPlacement, i as flip, j as arrow, b as useFloating, d as autoUpdate } from './floating-ui.react-es.js';
|
|
6
6
|
import { u as useRefocusOnActivator_2 } from './useRefocusOnActivator-es.js';
|
|
7
7
|
import { A as AtlantisPortalContent } from './AtlantisPortalContent-es.js';
|
|
8
8
|
import { B as ButtonDismiss } from './ButtonDismiss-es.js';
|