UNPKG

3.1 kBJavaScriptView Raw
1import _extends from "@babel/runtime/helpers/extends";
2import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose";
3import React, { Fragment } from 'react';
4import PropTypes from 'prop-types';
5import Highlighter from './Highlighter';
6import Menu from './Menu';
7import MenuItem from './MenuItem';
8import { getOptionLabel, getOptionProperty } from '../utils';
9var propTypes = {
10 /**
11 * Provides the ability to specify a prefix before the user-entered text to
12 * indicate that the selection will be new. No-op unless `allowNew={true}`.
13 */
14 newSelectionPrefix: PropTypes.node,
15
16 /**
17 * Prompt displayed when large data sets are paginated.
18 */
19 paginationText: PropTypes.node,
20
21 /**
22 * Provides a hook for customized rendering of menu item contents.
23 */
24 renderMenuItemChildren: PropTypes.func
25};
26var defaultProps = {
27 newSelectionPrefix: 'New selection: ',
28 paginationText: 'Display additional results...',
29 renderMenuItemChildren: function renderMenuItemChildren(option, props, idx) {
30 return /*#__PURE__*/React.createElement(Highlighter, {
31 search: props.text
32 }, getOptionLabel(option, props.labelKey));
33 }
34};
35
36var TypeaheadMenu = function TypeaheadMenu(props) {
37 var labelKey = props.labelKey,
38 newSelectionPrefix = props.newSelectionPrefix,
39 options = props.options,
40 paginationText = props.paginationText,
41 renderMenuItemChildren = props.renderMenuItemChildren,
42 text = props.text,
43 menuProps = _objectWithoutPropertiesLoose(props, ["labelKey", "newSelectionPrefix", "options", "paginationText", "renderMenuItemChildren", "text"]);
44
45 var renderMenuItem = function renderMenuItem(option, position) {
46 var label = getOptionLabel(option, labelKey);
47 var menuItemProps = {
48 disabled: getOptionProperty(option, 'disabled'),
49 label: label,
50 option: option,
51 position: position
52 };
53
54 if (option.customOption) {
55 return /*#__PURE__*/React.createElement(MenuItem, _extends({}, menuItemProps, {
56 className: "rbt-menu-custom-option",
57 key: position,
58 label: label
59 }), newSelectionPrefix, /*#__PURE__*/React.createElement(Highlighter, {
60 search: text
61 }, label));
62 }
63
64 if (option.paginationOption) {
65 return /*#__PURE__*/React.createElement(Fragment, {
66 key: "pagination-item"
67 }, /*#__PURE__*/React.createElement(Menu.Divider, null), /*#__PURE__*/React.createElement(MenuItem, _extends({}, menuItemProps, {
68 className: "rbt-menu-pagination-option",
69 label: paginationText
70 }), paginationText));
71 }
72
73 return /*#__PURE__*/React.createElement(MenuItem, _extends({}, menuItemProps, {
74 key: position
75 }), renderMenuItemChildren(option, props, position));
76 };
77
78 return (
79 /*#__PURE__*/
80 // Explictly pass `text` so Flow doesn't complain...
81 React.createElement(Menu, _extends({}, menuProps, {
82 text: text
83 }), options.map(renderMenuItem))
84 );
85};
86
87TypeaheadMenu.propTypes = propTypes;
88TypeaheadMenu.defaultProps = defaultProps;
89export default TypeaheadMenu;
\No newline at end of file