1 | "use strict";
|
2 |
|
3 | exports.__esModule = true;
|
4 | exports.default = void 0;
|
5 |
|
6 | var _propTypes = _interopRequireDefault(require("prop-types"));
|
7 |
|
8 | var _classnames = _interopRequireDefault(require("classnames"));
|
9 |
|
10 | var _react = _interopRequireWildcard(require("react"));
|
11 |
|
12 | var _uncontrollable = require("uncontrollable");
|
13 |
|
14 | var _List = _interopRequireWildcard(require("./List"));
|
15 |
|
16 | var _FocusListContext = require("./FocusListContext");
|
17 |
|
18 | var CustomPropTypes = _interopRequireWildcard(require("./PropTypes"));
|
19 |
|
20 | var _ = require("./_");
|
21 |
|
22 | var _Accessors = require("./Accessors");
|
23 |
|
24 | var _WidgetHelpers = require("./WidgetHelpers");
|
25 |
|
26 | var _useFocusManager = _interopRequireDefault(require("./useFocusManager"));
|
27 |
|
28 | var _Widget = require("./Widget");
|
29 |
|
30 | const _excluded = ["defaultValue", "value", "onChange", "textField", "dataKey", "data", "onKeyDown", "disabled", "readOnly", "onBlur", "onFocus", "multiple"];
|
31 |
|
32 | 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); }
|
33 |
|
34 | 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; }
|
35 |
|
36 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
37 |
|
38 | function _extends() { _extends = Object.assign || 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); }
|
39 |
|
40 | function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
41 |
|
42 | const propTypes = {
|
43 | data: _propTypes.default.array,
|
44 | dataKey: CustomPropTypes.accessor,
|
45 | textField: CustomPropTypes.accessor,
|
46 | onSelect: _propTypes.default.func,
|
47 | onMove: _propTypes.default.func,
|
48 | onHoverOption: _propTypes.default.func,
|
49 | optionComponent: _propTypes.default.elementType,
|
50 | renderItem: _propTypes.default.func,
|
51 | renderGroup: _propTypes.default.func,
|
52 | focusedItem: _propTypes.default.any,
|
53 | selectedItem: _propTypes.default.any,
|
54 | searchTerm: _propTypes.default.string,
|
55 |
|
56 | |
57 |
|
58 |
|
59 | disabled: CustomPropTypes.disabled.acceptsArray,
|
60 | messages: _propTypes.default.shape({
|
61 | emptyList: _propTypes.default.func.isRequired
|
62 | })
|
63 | };
|
64 |
|
65 | const Listbox = _react.default.forwardRef(function Listbox(_ref, _outerRef) {
|
66 | let {
|
67 | defaultValue,
|
68 | value: propsValue,
|
69 | onChange: propsOnChange,
|
70 | textField,
|
71 | dataKey,
|
72 | data,
|
73 | onKeyDown,
|
74 | disabled,
|
75 | readOnly,
|
76 | onBlur,
|
77 | onFocus,
|
78 | multiple
|
79 | } = _ref,
|
80 | props = _objectWithoutPropertiesLoose(_ref, _excluded);
|
81 |
|
82 | const [value, onChange] = (0, _uncontrollable.useUncontrolledProp)(propsValue, defaultValue, propsOnChange);
|
83 | const accessors = (0, _Accessors.useAccessors)(textField, dataKey);
|
84 | const dataItems = (0, _react.useMemo)(() => (0, _.makeArray)(value, multiple).map(item => accessors.findOrSelf(data, item)), [value, multiple, accessors, data]);
|
85 | const ref = (0, _react.useRef)(null);
|
86 | const lastItemRef = (0, _react.useRef)(dataItems[dataItems.length - 1]);
|
87 | const list = (0, _FocusListContext.useFocusList)({
|
88 | scope: ref,
|
89 | anchorItem: lastItemRef.current
|
90 | });
|
91 | const isDisabled = disabled === true;
|
92 |
|
93 | const handleChange = (dataItem, meta) => {
|
94 | if (isDisabled || readOnly) return;
|
95 | lastItemRef.current = meta.dataItem;
|
96 | onChange(dataItem, meta);
|
97 | };
|
98 |
|
99 | const handleSelect = (0, _List.useHandleSelect)(!!multiple, dataItems, handleChange);
|
100 | const [focusEvents, focused] = (0, _useFocusManager.default)(ref, {
|
101 | disabled: isDisabled,
|
102 | onBlur,
|
103 | onFocus
|
104 | }, {
|
105 | didHandle(focused) {
|
106 | if (!focused) {
|
107 | list.focus(undefined);
|
108 | } else {
|
109 | focus({
|
110 | preventScroll: true
|
111 | });
|
112 | }
|
113 | }
|
114 |
|
115 | });
|
116 |
|
117 | function focus(opts) {
|
118 | if (ref.current) ref.current.focus(opts);
|
119 | }
|
120 |
|
121 | const handleKeyDown = e => {
|
122 | if (isDisabled || readOnly) return;
|
123 | let {
|
124 | key,
|
125 | shiftKey
|
126 | } = e;
|
127 | (0, _WidgetHelpers.notify)(onKeyDown, [e]);
|
128 | if (e.defaultPrevented) return;
|
129 |
|
130 | if (key === 'End' && !shiftKey) {
|
131 | e.preventDefault();
|
132 | list.focus(list.last());
|
133 | } else if (key === 'Home' && !shiftKey) {
|
134 | e.preventDefault();
|
135 | list.focus(list.first());
|
136 | } else if (key === 'Enter' || key === ' ') {
|
137 | e.preventDefault();
|
138 | if (list.getFocused()) handleSelect(list.getFocused(), e);
|
139 | } else if (key === 'ArrowDown') {
|
140 | e.preventDefault();
|
141 | list.focus(list.next());
|
142 | } else if (key === 'ArrowUp') {
|
143 | e.preventDefault();
|
144 | list.focus(list.prev());
|
145 | }
|
146 | };
|
147 |
|
148 | const widgetProps = (0, _Widget.useWidgetProps)({
|
149 | focused,
|
150 | readOnly,
|
151 | disabled: isDisabled,
|
152 | className: (0, _classnames.default)(props.className, 'rw-listbox rw-widget-input rw-widget')
|
153 | });
|
154 | return _react.default.createElement(_FocusListContext.FocusListContext.Provider, {
|
155 | value: list.context
|
156 | }, _react.default.createElement(_List.default, _extends({}, props, widgetProps, {
|
157 | disabled: disabled,
|
158 | tabIndex: isDisabled ? -1 : 0,
|
159 | data: data,
|
160 | elementRef: ref,
|
161 | value: dataItems,
|
162 | multiple: multiple,
|
163 | accessors: accessors
|
164 | }, focusEvents, {
|
165 | onChange: handleChange,
|
166 | onKeyDown: handleKeyDown
|
167 | })));
|
168 | });
|
169 |
|
170 | Listbox.displayName = 'Listbox';
|
171 | Listbox.propTypes = propTypes;
|
172 | var _default = Listbox;
|
173 | exports.default = _default; |
\ | No newline at end of file |