@spaced-out/ui-design-system 0.1.37-beta.1 → 0.1.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/lib/components/ButtonDropdown/ButtonDropdown.js +2 -0
  3. package/lib/components/ButtonDropdown/ButtonDropdown.js.flow +2 -0
  4. package/lib/components/ButtonDropdown/SimpleButtonDropdown.js +75 -0
  5. package/lib/components/ButtonDropdown/SimpleButtonDropdown.js.flow +142 -0
  6. package/lib/components/ButtonDropdown/index.js +21 -12
  7. package/lib/components/ButtonDropdown/index.js.flow +2 -2
  8. package/lib/components/Dropdown/Dropdown.js +1 -1
  9. package/lib/components/Dropdown/Dropdown.js.flow +1 -1
  10. package/lib/components/Dropdown/SimpleDropdown.js +74 -0
  11. package/lib/components/Dropdown/SimpleDropdown.js.flow +134 -0
  12. package/lib/components/Dropdown/index.js +11 -0
  13. package/lib/components/Dropdown/index.js.flow +1 -0
  14. package/lib/components/FocusManager/FocusManager.js +7 -1
  15. package/lib/components/FocusManager/FocusManager.js.flow +7 -0
  16. package/lib/components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation.js +116 -0
  17. package/lib/components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation.js.flow +139 -0
  18. package/lib/components/FocusManagerWithArrowKeyNavigation/FocusManagerWithArrowKeyNavigation.module.css +7 -0
  19. package/lib/components/FocusManagerWithArrowKeyNavigation/index.js +16 -0
  20. package/lib/components/FocusManagerWithArrowKeyNavigation/index.js.flow +3 -0
  21. package/lib/components/InlineDropdown/SimpleInlineDropdown.js +75 -0
  22. package/lib/components/InlineDropdown/SimpleInlineDropdown.js.flow +139 -0
  23. package/lib/components/InlineDropdown/index.js +11 -0
  24. package/lib/components/InlineDropdown/index.js.flow +1 -0
  25. package/lib/components/Menu/Menu.js +2 -1
  26. package/lib/components/Menu/Menu.js.flow +12 -0
  27. package/lib/components/Menu/MenuOptionButton.js +9 -4
  28. package/lib/components/Menu/MenuOptionButton.js.flow +10 -2
  29. package/lib/components/OptionButton/SimpleOptionButton.js +74 -0
  30. package/lib/components/OptionButton/SimpleOptionButton.js.flow +139 -0
  31. package/lib/components/OptionButton/index.js +21 -6
  32. package/lib/components/OptionButton/index.js.flow +3 -2
  33. package/lib/components/RadioButton/RadioButton.js +2 -1
  34. package/lib/components/RadioButton/RadioButton.js.flow +1 -0
  35. package/lib/components/RadioButton/RadioButton.module.css +4 -0
  36. package/lib/components/Typeahead/SimpleTypeahead.js +76 -0
  37. package/lib/components/Typeahead/SimpleTypeahead.js.flow +134 -0
  38. package/lib/components/Typeahead/Typeahead.js +3 -4
  39. package/lib/components/Typeahead/Typeahead.js.flow +123 -117
  40. package/lib/components/Typeahead/index.js +21 -6
  41. package/lib/components/Typeahead/index.js.flow +2 -2
  42. package/lib/components/index.js +11 -0
  43. package/lib/components/index.js.flow +1 -0
  44. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,26 @@
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.38](https://github.com/spaced-out/ui-design-system/compare/v0.1.37...v0.1.38) (2023-07-19)
6
+
7
+
8
+ ### Bug Fixes
9
+
10
+ * focus manager with arrow key navigation enhancements ([#127](https://github.com/spaced-out/ui-design-system/issues/127)) ([ca183a0](https://github.com/spaced-out/ui-design-system/commit/ca183a04a6dc5c11cbe24267cf95471ef9f698e5))
11
+
12
+ ### [0.1.37](https://github.com/spaced-out/ui-design-system/compare/v0.1.37-beta.1...v0.1.37) (2023-07-18)
13
+
14
+
15
+ ### Features
16
+
17
+ * 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))
18
+ * 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))
19
+
20
+
21
+ ### Bug Fixes
22
+
23
+ * 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))
24
+
5
25
  ### [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
26
 
7
27
 
@@ -43,6 +43,7 @@ const ButtonDropdown = /*#__PURE__*/React.forwardRef((_ref, forwardRef) => {
43
43
  iconRightType = 'solid',
44
44
  isFluid,
45
45
  tooltip,
46
+ onClick,
46
47
  ...restButtonProps
47
48
  } = _ref;
48
49
  const menuBtnRef = React.useRef(null);
@@ -96,6 +97,7 @@ const ButtonDropdown = /*#__PURE__*/React.forwardRef((_ref, forwardRef) => {
96
97
  size: size,
97
98
  ref: refs.setReference,
98
99
  onClick: e => {
100
+ onClick?.(e);
99
101
  e.stopPropagation();
100
102
  onOpen();
101
103
  },
@@ -76,6 +76,7 @@ export const ButtonDropdown: React$AbstractComponent<
76
76
  iconRightType = 'solid',
77
77
  isFluid,
78
78
  tooltip,
79
+ onClick,
79
80
  ...restButtonProps
80
81
  }: ButtonDropdownProps,
81
82
  forwardRef,
@@ -138,6 +139,7 @@ export const ButtonDropdown: React$AbstractComponent<
138
139
  size={size}
139
140
  ref={refs.setReference}
140
141
  onClick={(e) => {
142
+ onClick?.(e);
141
143
  e.stopPropagation();
142
144
  onOpen();
143
145
  }}
@@ -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
- Object.defineProperty(exports, "ANCHOR_POSITION_TYPE", {
7
- enumerable: true,
8
- get: function () {
9
- return _ButtonDropdown.ANCHOR_POSITION_TYPE;
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
- Object.defineProperty(exports, "ButtonDropdown", {
13
- enumerable: true,
14
- get: function () {
15
- return _ButtonDropdown.ButtonDropdown;
16
- }
17
- });
18
- var _ButtonDropdown = require("./ButtonDropdown");
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
+ });
@@ -1,4 +1,4 @@
1
1
  // @flow strict
2
2
 
3
- export type {AnchorType, ButtonDropdownProps} from './ButtonDropdown';
4
- export {ANCHOR_POSITION_TYPE, ButtonDropdown} from './ButtonDropdown';
3
+ export * from './ButtonDropdown';
4
+ export * from './SimpleButtonDropdown';
@@ -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
  });
@@ -1,3 +1,4 @@
1
1
  // @flow strict
2
2
 
3
3
  export * from './Dropdown';
4
+ export * from './SimpleDropdown';
@@ -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