@spaced-out/ui-design-system 0.1.37-beta.1 → 0.1.37
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/CHANGELOG.md +13 -0
- package/lib/components/ButtonDropdown/SimpleButtonDropdown.js +75 -0
- package/lib/components/ButtonDropdown/SimpleButtonDropdown.js.flow +142 -0
- package/lib/components/ButtonDropdown/index.js +21 -12
- package/lib/components/ButtonDropdown/index.js.flow +2 -2
- package/lib/components/Dropdown/Dropdown.js +1 -1
- package/lib/components/Dropdown/Dropdown.js.flow +1 -1
- package/lib/components/Dropdown/SimpleDropdown.js +74 -0
- package/lib/components/Dropdown/SimpleDropdown.js.flow +134 -0
- package/lib/components/Dropdown/index.js +11 -0
- package/lib/components/Dropdown/index.js.flow +1 -0
- package/lib/components/FocusManager/FocusManager.js +7 -1
- package/lib/components/FocusManager/FocusManager.js.flow +7 -0
- package/lib/components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation.js +102 -0
- package/lib/components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation.js.flow +118 -0
- package/lib/components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation.module.css +7 -0
- package/lib/components/FocusManagerWithArrowKeyNavigation/index.js +16 -0
- package/lib/components/FocusManagerWithArrowKeyNavigation/index.js.flow +3 -0
- package/lib/components/InlineDropdown/SimpleInlineDropdown.js +75 -0
- package/lib/components/InlineDropdown/SimpleInlineDropdown.js.flow +139 -0
- package/lib/components/InlineDropdown/index.js +11 -0
- package/lib/components/InlineDropdown/index.js.flow +1 -0
- package/lib/components/Menu/Menu.js +2 -1
- package/lib/components/Menu/Menu.js.flow +12 -0
- package/lib/components/Menu/MenuOptionButton.js +9 -4
- package/lib/components/Menu/MenuOptionButton.js.flow +10 -2
- package/lib/components/OptionButton/SimpleOptionButton.js +74 -0
- package/lib/components/OptionButton/SimpleOptionButton.js.flow +139 -0
- package/lib/components/OptionButton/index.js +21 -6
- package/lib/components/OptionButton/index.js.flow +3 -2
- package/lib/components/RadioButton/RadioButton.js +2 -1
- package/lib/components/RadioButton/RadioButton.js.flow +1 -0
- package/lib/components/RadioButton/RadioButton.module.css +4 -0
- package/lib/components/Typeahead/SimpleTypeahead.js +76 -0
- package/lib/components/Typeahead/SimpleTypeahead.js.flow +134 -0
- package/lib/components/Typeahead/Typeahead.js +3 -4
- package/lib/components/Typeahead/Typeahead.js.flow +123 -117
- package/lib/components/Typeahead/index.js +21 -6
- package/lib/components/Typeahead/index.js.flow +2 -2
- package/lib/components/index.js +11 -0
- package/lib/components/index.js.flow +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [0.1.37](https://github.com/spaced-out/ui-design-system/compare/v0.1.37-beta.1...v0.1.37) (2023-07-18)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* focus manager with arrow keys navigation ([#126](https://github.com/spaced-out/ui-design-system/issues/126)) ([2c728f4](https://github.com/spaced-out/ui-design-system/commit/2c728f4c5e1ad10ed7ae1ca209a0038de6db0b9b))
|
|
11
|
+
* simple components for Dropdown, Typeahead and other Menu derivatives, option color fixes ([#123](https://github.com/spaced-out/ui-design-system/issues/123)) ([95c640e](https://github.com/spaced-out/ui-design-system/commit/95c640e34356e06d2a1be5e8d180dfb662d1045e))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
* ref-forwarding in Typeahead & handled cursor pointer on label in disabled case of radiobutton ([#124](https://github.com/spaced-out/ui-design-system/issues/124)) ([0d6af6e](https://github.com/spaced-out/ui-design-system/commit/0d6af6ea452c192827cbf0e504a7a3d6c23865ba))
|
|
17
|
+
|
|
5
18
|
### [0.1.37-beta.1](https://github.com/spaced-out/ui-design-system/compare/v0.1.37-beta.0...v0.1.37-beta.1) (2023-07-05)
|
|
6
19
|
|
|
7
20
|
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SimpleButtonDropdown = void 0;
|
|
7
|
+
var React = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _menu = require("../../utils/menu");
|
|
9
|
+
var _ButtonDropdown = require("./ButtonDropdown");
|
|
10
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
11
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
12
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
13
|
+
const SimpleButtonDropdownBase = (props, ref) => {
|
|
14
|
+
const {
|
|
15
|
+
size = 'medium',
|
|
16
|
+
classNames,
|
|
17
|
+
anchorPosition,
|
|
18
|
+
options,
|
|
19
|
+
optionsVariant,
|
|
20
|
+
allowSearch,
|
|
21
|
+
selectedKeys,
|
|
22
|
+
onOptionSelect,
|
|
23
|
+
onMenuOpen,
|
|
24
|
+
onMenuClose,
|
|
25
|
+
resolveLabel,
|
|
26
|
+
resolveSecondaryLabel,
|
|
27
|
+
children,
|
|
28
|
+
isFluid,
|
|
29
|
+
...buttonProps
|
|
30
|
+
} = props;
|
|
31
|
+
const [btnText, setBtnText] = React.useState('');
|
|
32
|
+
const [buttonDropdownSelectedKeys, setButtonDropdownSelectedKeys] = React.useState(selectedKeys);
|
|
33
|
+
React.useEffect(() => {
|
|
34
|
+
const newBtnText = (0, _menu.getButtonLabelFromSelectedKeys)(selectedKeys, children);
|
|
35
|
+
setButtonDropdownSelectedKeys(selectedKeys);
|
|
36
|
+
setBtnText(newBtnText);
|
|
37
|
+
}, [selectedKeys]);
|
|
38
|
+
const handleOptionChange = selectedOption => {
|
|
39
|
+
let newSelectedKeys = [];
|
|
40
|
+
if (optionsVariant === 'checkbox') {
|
|
41
|
+
newSelectedKeys = (0, _menu.getSelectedKeysFromSelectedOption)(selectedOption, buttonDropdownSelectedKeys);
|
|
42
|
+
} else {
|
|
43
|
+
newSelectedKeys = [selectedOption.key];
|
|
44
|
+
}
|
|
45
|
+
const newBtnText = (0, _menu.getButtonLabelFromSelectedKeys)(newSelectedKeys, children);
|
|
46
|
+
setButtonDropdownSelectedKeys(newSelectedKeys);
|
|
47
|
+
setBtnText(newBtnText);
|
|
48
|
+
setTimeout(() => {
|
|
49
|
+
onOptionSelect?.(selectedOption);
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
React.useImperativeHandle(ref, () => ({
|
|
53
|
+
selectedKeys: buttonDropdownSelectedKeys
|
|
54
|
+
}));
|
|
55
|
+
return /*#__PURE__*/React.createElement(_ButtonDropdown.ButtonDropdown, _extends({}, buttonProps, {
|
|
56
|
+
anchorPosition: anchorPosition,
|
|
57
|
+
classNames: classNames,
|
|
58
|
+
size: size,
|
|
59
|
+
onOptionSelect: handleOptionChange,
|
|
60
|
+
onMenuOpen: onMenuOpen,
|
|
61
|
+
onMenuClose: onMenuClose,
|
|
62
|
+
menu: {
|
|
63
|
+
isFluid,
|
|
64
|
+
options,
|
|
65
|
+
selectedKeys: buttonDropdownSelectedKeys,
|
|
66
|
+
optionsVariant,
|
|
67
|
+
allowSearch,
|
|
68
|
+
resolveLabel,
|
|
69
|
+
resolveSecondaryLabel,
|
|
70
|
+
size
|
|
71
|
+
}
|
|
72
|
+
}), optionsVariant === 'checkbox' ? btnText : children);
|
|
73
|
+
};
|
|
74
|
+
const SimpleButtonDropdown = /*#__PURE__*/React.forwardRef(SimpleButtonDropdownBase);
|
|
75
|
+
exports.SimpleButtonDropdown = SimpleButtonDropdown;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// @flow strict
|
|
2
|
+
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
getButtonLabelFromSelectedKeys,
|
|
7
|
+
getSelectedKeysFromSelectedOption,
|
|
8
|
+
} from '../../utils/menu';
|
|
9
|
+
import type {ButtonProps} from '../Button';
|
|
10
|
+
import type {MenuOption, MenuOptionsVariant} from '../Menu';
|
|
11
|
+
import type {BaseTooltipProps} from '../Tooltip';
|
|
12
|
+
|
|
13
|
+
import type {AnchorType} from './ButtonDropdown';
|
|
14
|
+
import {ButtonDropdown} from './ButtonDropdown';
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
type ClassNames = $ReadOnly<{
|
|
18
|
+
buttonWrapper?: string,
|
|
19
|
+
dropdownContainer?: string,
|
|
20
|
+
buttonIcon?: string,
|
|
21
|
+
}>;
|
|
22
|
+
|
|
23
|
+
export type SimpleButtonDropdownRef = {
|
|
24
|
+
selectedKeys?: Array<string>,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type SimpleButtonDropdownProps = {
|
|
28
|
+
// Input props
|
|
29
|
+
...ButtonProps,
|
|
30
|
+
|
|
31
|
+
classNames?: ClassNames,
|
|
32
|
+
anchorPosition?: AnchorType,
|
|
33
|
+
tooltip?: BaseTooltipProps,
|
|
34
|
+
|
|
35
|
+
// Menu props
|
|
36
|
+
options?: Array<MenuOption>,
|
|
37
|
+
|
|
38
|
+
optionsVariant?: MenuOptionsVariant,
|
|
39
|
+
allowSearch?: boolean,
|
|
40
|
+
selectedKeys?: Array<string>,
|
|
41
|
+
|
|
42
|
+
// events
|
|
43
|
+
onOptionSelect?: (option: MenuOption) => mixed,
|
|
44
|
+
onMenuOpen?: () => mixed,
|
|
45
|
+
onMenuClose?: () => mixed,
|
|
46
|
+
|
|
47
|
+
// Resolvers
|
|
48
|
+
resolveLabel?: (option: MenuOption) => string | React.Node,
|
|
49
|
+
resolveSecondaryLabel?: (option: MenuOption) => string | React.Node,
|
|
50
|
+
...
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const SimpleButtonDropdownBase = (props: SimpleButtonDropdownProps, ref) => {
|
|
54
|
+
const {
|
|
55
|
+
size = 'medium',
|
|
56
|
+
classNames,
|
|
57
|
+
anchorPosition,
|
|
58
|
+
options,
|
|
59
|
+
optionsVariant,
|
|
60
|
+
allowSearch,
|
|
61
|
+
selectedKeys,
|
|
62
|
+
onOptionSelect,
|
|
63
|
+
onMenuOpen,
|
|
64
|
+
onMenuClose,
|
|
65
|
+
resolveLabel,
|
|
66
|
+
resolveSecondaryLabel,
|
|
67
|
+
children,
|
|
68
|
+
isFluid,
|
|
69
|
+
...buttonProps
|
|
70
|
+
} = props;
|
|
71
|
+
|
|
72
|
+
const [btnText, setBtnText] = React.useState('');
|
|
73
|
+
const [buttonDropdownSelectedKeys, setButtonDropdownSelectedKeys] =
|
|
74
|
+
React.useState(selectedKeys);
|
|
75
|
+
|
|
76
|
+
React.useEffect(() => {
|
|
77
|
+
const newBtnText = getButtonLabelFromSelectedKeys(selectedKeys, children);
|
|
78
|
+
|
|
79
|
+
setButtonDropdownSelectedKeys(selectedKeys);
|
|
80
|
+
setBtnText(newBtnText);
|
|
81
|
+
}, [selectedKeys]);
|
|
82
|
+
|
|
83
|
+
const handleOptionChange = (selectedOption: MenuOption) => {
|
|
84
|
+
let newSelectedKeys = [];
|
|
85
|
+
|
|
86
|
+
if (optionsVariant === 'checkbox') {
|
|
87
|
+
newSelectedKeys = getSelectedKeysFromSelectedOption(
|
|
88
|
+
selectedOption,
|
|
89
|
+
buttonDropdownSelectedKeys,
|
|
90
|
+
);
|
|
91
|
+
} else {
|
|
92
|
+
newSelectedKeys = [selectedOption.key];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const newBtnText = getButtonLabelFromSelectedKeys(
|
|
96
|
+
newSelectedKeys,
|
|
97
|
+
children,
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
setButtonDropdownSelectedKeys(newSelectedKeys);
|
|
101
|
+
setBtnText(newBtnText);
|
|
102
|
+
|
|
103
|
+
setTimeout(() => {
|
|
104
|
+
onOptionSelect?.(selectedOption);
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
React.useImperativeHandle(ref, () => ({
|
|
109
|
+
selectedKeys: buttonDropdownSelectedKeys,
|
|
110
|
+
}));
|
|
111
|
+
|
|
112
|
+
return (
|
|
113
|
+
<ButtonDropdown
|
|
114
|
+
{...buttonProps}
|
|
115
|
+
anchorPosition={anchorPosition}
|
|
116
|
+
classNames={classNames}
|
|
117
|
+
size={size}
|
|
118
|
+
onOptionSelect={handleOptionChange}
|
|
119
|
+
onMenuOpen={onMenuOpen}
|
|
120
|
+
onMenuClose={onMenuClose}
|
|
121
|
+
menu={{
|
|
122
|
+
isFluid,
|
|
123
|
+
options,
|
|
124
|
+
selectedKeys: buttonDropdownSelectedKeys,
|
|
125
|
+
optionsVariant,
|
|
126
|
+
allowSearch,
|
|
127
|
+
resolveLabel,
|
|
128
|
+
resolveSecondaryLabel,
|
|
129
|
+
size,
|
|
130
|
+
}}
|
|
131
|
+
>
|
|
132
|
+
{optionsVariant === 'checkbox' ? btnText : children}
|
|
133
|
+
</ButtonDropdown>
|
|
134
|
+
);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
export const SimpleButtonDropdown: React.AbstractComponent<
|
|
138
|
+
SimpleButtonDropdownProps,
|
|
139
|
+
SimpleButtonDropdownRef,
|
|
140
|
+
> = React.forwardRef<SimpleButtonDropdownProps, SimpleButtonDropdownRef>(
|
|
141
|
+
SimpleButtonDropdownBase,
|
|
142
|
+
);
|
|
@@ -3,16 +3,25 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
var _ButtonDropdown = require("./ButtonDropdown");
|
|
7
|
+
Object.keys(_ButtonDropdown).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _ButtonDropdown[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _ButtonDropdown[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
11
16
|
});
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
var _SimpleButtonDropdown = require("./SimpleButtonDropdown");
|
|
18
|
+
Object.keys(_SimpleButtonDropdown).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _SimpleButtonDropdown[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _SimpleButtonDropdown[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -65,7 +65,7 @@ const Dropdown = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
|
65
65
|
placeholder: placeholder,
|
|
66
66
|
value: dropdownInputText,
|
|
67
67
|
classNames: {
|
|
68
|
-
box: _DropdownModule.default.inputBox
|
|
68
|
+
box: (0, _classify.classify)(_DropdownModule.default.inputBox, classNames?.box)
|
|
69
69
|
},
|
|
70
70
|
iconRightName: isOpen ? 'angle-up' : 'angle-down',
|
|
71
71
|
readOnly: true,
|
|
@@ -83,7 +83,7 @@ export const Dropdown: React$AbstractComponent<
|
|
|
83
83
|
size={size}
|
|
84
84
|
placeholder={placeholder}
|
|
85
85
|
value={dropdownInputText}
|
|
86
|
-
classNames={{box: css.inputBox}}
|
|
86
|
+
classNames={{box: classify(css.inputBox, classNames?.box)}}
|
|
87
87
|
iconRightName={isOpen ? 'angle-up' : 'angle-down'}
|
|
88
88
|
readOnly
|
|
89
89
|
onContainerClick={(e) => {
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SimpleDropdown = void 0;
|
|
7
|
+
var React = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _menu = require("../../utils/menu");
|
|
9
|
+
var _Dropdown = require("./Dropdown");
|
|
10
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
11
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
12
|
+
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
13
|
+
const SimpleDropdownBase = (props, ref) => {
|
|
14
|
+
const {
|
|
15
|
+
size = 'medium',
|
|
16
|
+
classNames,
|
|
17
|
+
placeholder = 'Select...',
|
|
18
|
+
options,
|
|
19
|
+
optionsVariant,
|
|
20
|
+
allowSearch,
|
|
21
|
+
selectedKeys,
|
|
22
|
+
onChange,
|
|
23
|
+
onMenuOpen,
|
|
24
|
+
onMenuClose,
|
|
25
|
+
resolveLabel,
|
|
26
|
+
resolveSecondaryLabel,
|
|
27
|
+
...inputProps
|
|
28
|
+
} = props;
|
|
29
|
+
const [dropdownInputText, setDropdownInputText] = React.useState('');
|
|
30
|
+
const [dropdownSelectedKeys, setDropdownSelectedKeys] = React.useState(selectedKeys);
|
|
31
|
+
React.useEffect(() => {
|
|
32
|
+
const newDropdownText = (0, _menu.getTextLabelFromSelectedKeys)(selectedKeys, options);
|
|
33
|
+
setDropdownSelectedKeys(selectedKeys);
|
|
34
|
+
setDropdownInputText(newDropdownText);
|
|
35
|
+
}, [selectedKeys]);
|
|
36
|
+
const handleOptionChange = selectedOption => {
|
|
37
|
+
let newSelectedKeys = [];
|
|
38
|
+
if (optionsVariant === 'checkbox') {
|
|
39
|
+
newSelectedKeys = (0, _menu.getSelectedKeysFromSelectedOption)(selectedOption, dropdownSelectedKeys);
|
|
40
|
+
} else {
|
|
41
|
+
newSelectedKeys = [selectedOption.key];
|
|
42
|
+
}
|
|
43
|
+
const newDropdownText = (0, _menu.getTextLabelFromSelectedKeys)(newSelectedKeys, options);
|
|
44
|
+
setDropdownSelectedKeys(newSelectedKeys);
|
|
45
|
+
setDropdownInputText(newDropdownText);
|
|
46
|
+
setTimeout(() => {
|
|
47
|
+
onChange?.(selectedOption);
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
React.useImperativeHandle(ref, () => ({
|
|
51
|
+
selectedKeys: dropdownSelectedKeys
|
|
52
|
+
}));
|
|
53
|
+
return /*#__PURE__*/React.createElement(_Dropdown.Dropdown, _extends({}, inputProps, {
|
|
54
|
+
classNames: classNames,
|
|
55
|
+
label: "Form Label",
|
|
56
|
+
size: size,
|
|
57
|
+
placeholder: placeholder,
|
|
58
|
+
onChange: handleOptionChange,
|
|
59
|
+
onMenuOpen: onMenuOpen,
|
|
60
|
+
onMenuClose: onMenuClose,
|
|
61
|
+
dropdownInputText: dropdownInputText,
|
|
62
|
+
menu: {
|
|
63
|
+
options,
|
|
64
|
+
selectedKeys: dropdownSelectedKeys,
|
|
65
|
+
optionsVariant,
|
|
66
|
+
allowSearch,
|
|
67
|
+
resolveLabel,
|
|
68
|
+
resolveSecondaryLabel,
|
|
69
|
+
size
|
|
70
|
+
}
|
|
71
|
+
}));
|
|
72
|
+
};
|
|
73
|
+
const SimpleDropdown = /*#__PURE__*/React.forwardRef(SimpleDropdownBase);
|
|
74
|
+
exports.SimpleDropdown = SimpleDropdown;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// @flow strict
|
|
2
|
+
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
getSelectedKeysFromSelectedOption,
|
|
7
|
+
getTextLabelFromSelectedKeys,
|
|
8
|
+
} from '../../utils/menu';
|
|
9
|
+
import type {InputProps} from '../Input';
|
|
10
|
+
import type {MenuOption, MenuOptionsVariant} from '../Menu';
|
|
11
|
+
|
|
12
|
+
import {Dropdown} from './Dropdown';
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
type ClassNames = $ReadOnly<{
|
|
16
|
+
wrapper?: string,
|
|
17
|
+
box?: string,
|
|
18
|
+
}>;
|
|
19
|
+
|
|
20
|
+
export type SimpleDropdownRef = {
|
|
21
|
+
selectedKeys?: Array<string>,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export type SimpleDropdownProps = {
|
|
25
|
+
// Input props
|
|
26
|
+
...InputProps,
|
|
27
|
+
|
|
28
|
+
classNames?: ClassNames,
|
|
29
|
+
|
|
30
|
+
// Menu props
|
|
31
|
+
options?: Array<MenuOption>,
|
|
32
|
+
|
|
33
|
+
optionsVariant?: MenuOptionsVariant,
|
|
34
|
+
allowSearch?: boolean,
|
|
35
|
+
selectedKeys?: Array<string>,
|
|
36
|
+
|
|
37
|
+
// events
|
|
38
|
+
onChange?: (option: MenuOption) => mixed,
|
|
39
|
+
onMenuOpen?: () => mixed,
|
|
40
|
+
onMenuClose?: () => mixed,
|
|
41
|
+
|
|
42
|
+
// Resolvers
|
|
43
|
+
resolveLabel?: (option: MenuOption) => string | React.Node,
|
|
44
|
+
resolveSecondaryLabel?: (option: MenuOption) => string | React.Node,
|
|
45
|
+
...
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const SimpleDropdownBase = (props: SimpleDropdownProps, ref) => {
|
|
49
|
+
const {
|
|
50
|
+
size = 'medium',
|
|
51
|
+
classNames,
|
|
52
|
+
placeholder = 'Select...',
|
|
53
|
+
options,
|
|
54
|
+
optionsVariant,
|
|
55
|
+
allowSearch,
|
|
56
|
+
selectedKeys,
|
|
57
|
+
onChange,
|
|
58
|
+
onMenuOpen,
|
|
59
|
+
onMenuClose,
|
|
60
|
+
resolveLabel,
|
|
61
|
+
resolveSecondaryLabel,
|
|
62
|
+
...inputProps
|
|
63
|
+
} = props;
|
|
64
|
+
|
|
65
|
+
const [dropdownInputText, setDropdownInputText] = React.useState('');
|
|
66
|
+
const [dropdownSelectedKeys, setDropdownSelectedKeys] =
|
|
67
|
+
React.useState(selectedKeys);
|
|
68
|
+
|
|
69
|
+
React.useEffect(() => {
|
|
70
|
+
const newDropdownText = getTextLabelFromSelectedKeys(selectedKeys, options);
|
|
71
|
+
|
|
72
|
+
setDropdownSelectedKeys(selectedKeys);
|
|
73
|
+
setDropdownInputText(newDropdownText);
|
|
74
|
+
}, [selectedKeys]);
|
|
75
|
+
|
|
76
|
+
const handleOptionChange = (selectedOption: MenuOption) => {
|
|
77
|
+
let newSelectedKeys = [];
|
|
78
|
+
|
|
79
|
+
if (optionsVariant === 'checkbox') {
|
|
80
|
+
newSelectedKeys = getSelectedKeysFromSelectedOption(
|
|
81
|
+
selectedOption,
|
|
82
|
+
dropdownSelectedKeys,
|
|
83
|
+
);
|
|
84
|
+
} else {
|
|
85
|
+
newSelectedKeys = [selectedOption.key];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const newDropdownText = getTextLabelFromSelectedKeys(
|
|
89
|
+
newSelectedKeys,
|
|
90
|
+
options,
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
setDropdownSelectedKeys(newSelectedKeys);
|
|
94
|
+
setDropdownInputText(newDropdownText);
|
|
95
|
+
|
|
96
|
+
setTimeout(() => {
|
|
97
|
+
onChange?.(selectedOption);
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
React.useImperativeHandle(ref, () => ({
|
|
102
|
+
selectedKeys: dropdownSelectedKeys,
|
|
103
|
+
}));
|
|
104
|
+
|
|
105
|
+
return (
|
|
106
|
+
<Dropdown
|
|
107
|
+
{...inputProps}
|
|
108
|
+
classNames={classNames}
|
|
109
|
+
label="Form Label"
|
|
110
|
+
size={size}
|
|
111
|
+
placeholder={placeholder}
|
|
112
|
+
onChange={handleOptionChange}
|
|
113
|
+
onMenuOpen={onMenuOpen}
|
|
114
|
+
onMenuClose={onMenuClose}
|
|
115
|
+
dropdownInputText={dropdownInputText}
|
|
116
|
+
menu={{
|
|
117
|
+
options,
|
|
118
|
+
selectedKeys: dropdownSelectedKeys,
|
|
119
|
+
optionsVariant,
|
|
120
|
+
allowSearch,
|
|
121
|
+
resolveLabel,
|
|
122
|
+
resolveSecondaryLabel,
|
|
123
|
+
size,
|
|
124
|
+
}}
|
|
125
|
+
/>
|
|
126
|
+
);
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export const SimpleDropdown: React.AbstractComponent<
|
|
130
|
+
SimpleDropdownProps,
|
|
131
|
+
SimpleDropdownRef,
|
|
132
|
+
> = React.forwardRef<SimpleDropdownProps, SimpleDropdownRef>(
|
|
133
|
+
SimpleDropdownBase,
|
|
134
|
+
);
|
|
@@ -13,4 +13,15 @@ Object.keys(_Dropdown).forEach(function (key) {
|
|
|
13
13
|
return _Dropdown[key];
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
|
+
});
|
|
17
|
+
var _SimpleDropdown = require("./SimpleDropdown");
|
|
18
|
+
Object.keys(_SimpleDropdown).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _SimpleDropdown[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _SimpleDropdown[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
16
27
|
});
|
|
@@ -23,11 +23,17 @@ const FocusManager = props => {
|
|
|
23
23
|
classNames,
|
|
24
24
|
children,
|
|
25
25
|
initialFocus = -1,
|
|
26
|
+
returnFocus = true,
|
|
27
|
+
modal = true,
|
|
28
|
+
guards = true,
|
|
26
29
|
...restFloatingFocusManagerProps
|
|
27
30
|
} = props;
|
|
28
31
|
return /*#__PURE__*/React.createElement(_react2.FloatingFocusManager, _extends({
|
|
29
32
|
context: context,
|
|
30
|
-
initialFocus: initialFocus
|
|
33
|
+
initialFocus: initialFocus,
|
|
34
|
+
modal: modal,
|
|
35
|
+
guards: guards,
|
|
36
|
+
returnFocus: returnFocus
|
|
31
37
|
}, restFloatingFocusManagerProps), /*#__PURE__*/React.createElement("div", {
|
|
32
38
|
ref: refs.setFloating,
|
|
33
39
|
"data-testid": "FocusManager",
|
|
@@ -21,6 +21,7 @@ export type FocusManagerProps = {
|
|
|
21
21
|
initialFocus?: number,
|
|
22
22
|
returnFocus?: boolean,
|
|
23
23
|
guards?: boolean,
|
|
24
|
+
modal?: boolean,
|
|
24
25
|
};
|
|
25
26
|
|
|
26
27
|
export const FocusManager = (props: FocusManagerProps): React.Node => {
|
|
@@ -29,6 +30,9 @@ export const FocusManager = (props: FocusManagerProps): React.Node => {
|
|
|
29
30
|
classNames,
|
|
30
31
|
children,
|
|
31
32
|
initialFocus = -1,
|
|
33
|
+
returnFocus = true,
|
|
34
|
+
modal = true,
|
|
35
|
+
guards = true,
|
|
32
36
|
...restFloatingFocusManagerProps
|
|
33
37
|
} = props;
|
|
34
38
|
|
|
@@ -36,6 +40,9 @@ export const FocusManager = (props: FocusManagerProps): React.Node => {
|
|
|
36
40
|
<FloatingFocusManager
|
|
37
41
|
context={context}
|
|
38
42
|
initialFocus={initialFocus}
|
|
43
|
+
modal={modal}
|
|
44
|
+
guards={guards}
|
|
45
|
+
returnFocus={returnFocus}
|
|
39
46
|
{...restFloatingFocusManagerProps}
|
|
40
47
|
>
|
|
41
48
|
<div
|