UNPKG

10.8 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
5var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
7Object.defineProperty(exports, "__esModule", {
8 value: true
9});
10exports["default"] = void 0;
11
12var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
13
14var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
15
16var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
18var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
19
20var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
21
22var _classnames = _interopRequireDefault(require("classnames"));
23
24var _propTypes = _interopRequireDefault(require("prop-types"));
25
26var _react = _interopRequireWildcard(require("react"));
27
28var _useRootClose = _interopRequireDefault(require("react-overlays/useRootClose"));
29
30var _Typeahead = _interopRequireDefault(require("../core/Typeahead"));
31
32var _ClearButton = _interopRequireDefault(require("./ClearButton"));
33
34var _Loader = _interopRequireDefault(require("./Loader"));
35
36var _Overlay = _interopRequireDefault(require("./Overlay"));
37
38var _Token = _interopRequireDefault(require("./Token"));
39
40var _TypeaheadInputMulti = _interopRequireDefault(require("./TypeaheadInputMulti"));
41
42var _TypeaheadInputSingle = _interopRequireDefault(require("./TypeaheadInputSingle"));
43
44var _TypeaheadMenu = _interopRequireDefault(require("./TypeaheadMenu"));
45
46var _utils = require("../utils");
47
48var _propTypes2 = require("../propTypes");
49
50var propTypes = {
51 /**
52 * Displays a button to clear the input when there are selections.
53 */
54 clearButton: _propTypes["default"].bool,
55
56 /**
57 * Props to be applied directly to the input. `onBlur`, `onChange`,
58 * `onFocus`, and `onKeyDown` are ignored.
59 */
60 inputProps: (0, _propTypes2.checkPropType)(_propTypes["default"].object, _propTypes2.inputPropsType),
61
62 /**
63 * Bootstrap 4 only. Adds the `is-invalid` classname to the `form-control`.
64 */
65 isInvalid: _propTypes["default"].bool,
66
67 /**
68 * Indicate whether an asynchronous data fetch is happening.
69 */
70 isLoading: _propTypes["default"].bool,
71
72 /**
73 * Bootstrap 4 only. Adds the `is-valid` classname to the `form-control`.
74 */
75 isValid: _propTypes["default"].bool,
76
77 /**
78 * Callback for custom input rendering.
79 */
80 renderInput: _propTypes["default"].func,
81
82 /**
83 * Callback for custom menu rendering.
84 */
85 renderMenu: _propTypes["default"].func,
86
87 /**
88 * Callback for custom menu rendering.
89 */
90 renderToken: _propTypes["default"].func,
91
92 /**
93 * Specifies the size of the input.
94 */
95 size: _propTypes2.sizeType
96};
97var defaultProps = {
98 clearButton: false,
99 inputProps: {},
100 isInvalid: false,
101 isLoading: false,
102 isValid: false,
103 renderMenu: function renderMenu(results, menuProps, props) {
104 return /*#__PURE__*/_react["default"].createElement(_TypeaheadMenu["default"], (0, _extends2["default"])({}, menuProps, {
105 labelKey: props.labelKey,
106 options: results,
107 text: props.text
108 }));
109 },
110 renderToken: function renderToken(option, props, idx) {
111 return /*#__PURE__*/_react["default"].createElement(_Token["default"], {
112 disabled: props.disabled,
113 key: idx,
114 onRemove: props.onRemove,
115 option: option,
116 tabIndex: props.tabIndex
117 }, (0, _utils.getOptionLabel)(option, props.labelKey));
118 }
119};
120
121function getOverlayProps(props) {
122 return (0, _utils.pick)(props, ['align', 'dropup', 'flip', 'positionFixed']);
123}
124
125var RootClose = function RootClose(_ref) {
126 var children = _ref.children,
127 onRootClose = _ref.onRootClose,
128 props = (0, _objectWithoutPropertiesLoose2["default"])(_ref, ["children", "onRootClose"]);
129
130 var _useState = (0, _react.useState)(null),
131 rootElement = _useState[0],
132 attachRef = _useState[1];
133
134 (0, _useRootClose["default"])(rootElement, onRootClose, props);
135 return children(attachRef);
136};
137
138var TypeaheadComponent = /*#__PURE__*/function (_React$Component) {
139 (0, _inheritsLoose2["default"])(TypeaheadComponent, _React$Component);
140
141 function TypeaheadComponent() {
142 var _this;
143
144 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
145 args[_key] = arguments[_key];
146 }
147
148 _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;
149 (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_referenceElement", void 0);
150 (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "referenceElementRef", function (referenceElement) {
151 _this._referenceElement = referenceElement;
152 });
153 (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_renderInput", function (inputProps, props) {
154 var _this$props = _this.props,
155 isInvalid = _this$props.isInvalid,
156 isValid = _this$props.isValid,
157 multiple = _this$props.multiple,
158 renderInput = _this$props.renderInput,
159 renderToken = _this$props.renderToken,
160 size = _this$props.size;
161
162 if ((0, _utils.isFunction)(renderInput)) {
163 return renderInput(inputProps, props);
164 }
165
166 var commonProps = (0, _extends2["default"])({}, inputProps, {
167 isInvalid: isInvalid,
168 isValid: isValid,
169 size: size
170 });
171
172 if (!multiple) {
173 return /*#__PURE__*/_react["default"].createElement(_TypeaheadInputSingle["default"], commonProps);
174 }
175
176 var labelKey = props.labelKey,
177 onRemove = props.onRemove,
178 selected = props.selected;
179 return /*#__PURE__*/_react["default"].createElement(_TypeaheadInputMulti["default"], (0, _extends2["default"])({}, commonProps, {
180 selected: selected
181 }), selected.map(function (option, idx) {
182 return renderToken(option, (0, _extends2["default"])({}, commonProps, {
183 labelKey: labelKey,
184 onRemove: onRemove
185 }), idx);
186 }));
187 });
188 (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_renderMenu", function (results, menuProps, props) {
189 var _this$props2 = _this.props,
190 emptyLabel = _this$props2.emptyLabel,
191 id = _this$props2.id,
192 maxHeight = _this$props2.maxHeight,
193 newSelectionPrefix = _this$props2.newSelectionPrefix,
194 paginationText = _this$props2.paginationText,
195 renderMenu = _this$props2.renderMenu,
196 renderMenuItemChildren = _this$props2.renderMenuItemChildren;
197 return renderMenu(results, (0, _extends2["default"])({}, menuProps, {
198 emptyLabel: emptyLabel,
199 id: id,
200 maxHeight: maxHeight,
201 newSelectionPrefix: newSelectionPrefix,
202 paginationText: paginationText,
203 renderMenuItemChildren: renderMenuItemChildren
204 }), props);
205 });
206 (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "_renderAux", function (_ref2) {
207 var onClear = _ref2.onClear,
208 selected = _ref2.selected;
209 var _this$props3 = _this.props,
210 clearButton = _this$props3.clearButton,
211 disabled = _this$props3.disabled,
212 isLoading = _this$props3.isLoading,
213 size = _this$props3.size;
214 var content;
215
216 if (isLoading) {
217 content = /*#__PURE__*/_react["default"].createElement(_Loader["default"], null);
218 } else if (clearButton && !disabled && selected.length) {
219 content = /*#__PURE__*/_react["default"].createElement(_ClearButton["default"], {
220 onClick: onClear,
221 onFocus: function onFocus(e) {
222 // Prevent the main input from auto-focusing again.
223 e.stopPropagation();
224 },
225 onMouseDown: _utils.preventInputBlur,
226 size: size
227 });
228 }
229
230 return content ? /*#__PURE__*/_react["default"].createElement("div", {
231 className: (0, _classnames["default"])('rbt-aux', {
232 'rbt-aux-lg': (0, _utils.isSizeLarge)(size)
233 })
234 }, content) : null;
235 });
236 return _this;
237 }
238
239 var _proto = TypeaheadComponent.prototype;
240
241 _proto.render = function render() {
242 var _this2 = this;
243
244 var _this$props4 = this.props,
245 children = _this$props4.children,
246 className = _this$props4.className,
247 instanceRef = _this$props4.instanceRef,
248 open = _this$props4.open,
249 options = _this$props4.options,
250 style = _this$props4.style;
251 return /*#__PURE__*/_react["default"].createElement(_Typeahead["default"], (0, _extends2["default"])({}, this.props, {
252 options: options,
253 ref: instanceRef
254 }), function (_ref3) {
255 var getInputProps = _ref3.getInputProps,
256 props = (0, _objectWithoutPropertiesLoose2["default"])(_ref3, ["getInputProps"]);
257 var hideMenu = props.hideMenu,
258 isMenuShown = props.isMenuShown,
259 results = props.results;
260
261 var auxContent = _this2._renderAux(props);
262
263 return /*#__PURE__*/_react["default"].createElement(RootClose, {
264 disabled: open || !isMenuShown,
265 onRootClose: hideMenu
266 }, function (ref) {
267 return /*#__PURE__*/_react["default"].createElement("div", {
268 className: (0, _classnames["default"])('rbt', {
269 'has-aux': !!auxContent
270 }, className),
271 ref: ref,
272 style: (0, _extends2["default"])({}, style, {
273 outline: 'none',
274 position: 'relative'
275 }),
276 tabIndex: -1
277 }, _this2._renderInput((0, _extends2["default"])({}, getInputProps(_this2.props.inputProps), {
278 referenceElementRef: _this2.referenceElementRef
279 }), props), /*#__PURE__*/_react["default"].createElement(_Overlay["default"], (0, _extends2["default"])({}, getOverlayProps(_this2.props), {
280 isMenuShown: isMenuShown,
281 referenceElement: _this2._referenceElement
282 }), function (menuProps) {
283 return _this2._renderMenu(results, menuProps, props);
284 }), auxContent, (0, _utils.isFunction)(children) ? children(props) : children);
285 });
286 });
287 };
288
289 return TypeaheadComponent;
290}(_react["default"].Component);
291
292(0, _defineProperty2["default"])(TypeaheadComponent, "propTypes", propTypes);
293(0, _defineProperty2["default"])(TypeaheadComponent, "defaultProps", defaultProps);
294
295var _default = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
296 return /*#__PURE__*/_react["default"].createElement(TypeaheadComponent, (0, _extends2["default"])({}, props, {
297 instanceRef: ref
298 }));
299});
300
301exports["default"] = _default;
\No newline at end of file