UNPKG

6.54 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4exports.default = void 0;
5
6var _propTypes = _interopRequireDefault(require("prop-types"));
7
8var _classnames = _interopRequireDefault(require("classnames"));
9
10var _react = _interopRequireWildcard(require("react"));
11
12var _uncontrollable = require("uncontrollable");
13
14var _List = _interopRequireWildcard(require("./List"));
15
16var _FocusListContext = require("./FocusListContext");
17
18var CustomPropTypes = _interopRequireWildcard(require("./PropTypes"));
19
20var _ = require("./_");
21
22var _Accessors = require("./Accessors");
23
24var _WidgetHelpers = require("./WidgetHelpers");
25
26var _useFocusManager = _interopRequireDefault(require("./useFocusManager"));
27
28var _Widget = require("./Widget");
29
30const _excluded = ["defaultValue", "value", "onChange", "textField", "dataKey", "data", "onKeyDown", "disabled", "readOnly", "onBlur", "onFocus", "multiple"];
31
32function _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
34function _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
36function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
37
38function _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
40function _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
42const 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 * @example false
58 */
59 disabled: CustomPropTypes.disabled.acceptsArray,
60 messages: _propTypes.default.shape({
61 emptyList: _propTypes.default.func.isRequired
62 })
63};
64
65const Listbox = /*#__PURE__*/_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 /*#__PURE__*/_react.default.createElement(_FocusListContext.FocusListContext.Provider, {
155 value: list.context
156 }, /*#__PURE__*/_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
170Listbox.displayName = 'Listbox';
171Listbox.propTypes = propTypes;
172var _default = Listbox;
173exports.default = _default;
\No newline at end of file