UNPKG

@checksub_team/react-widgets

Version:
389 lines (317 loc) 14.7 kB
"use strict"; exports.__esModule = true; exports.default = void 0; var _classnames = _interopRequireDefault(require("classnames")); var PropTypes = _interopRequireWildcard(require("prop-types")); var _react = _interopRequireDefault(require("react")); var _reactLifecyclesCompat = require("react-lifecycles-compat"); var _uncontrollable = _interopRequireDefault(require("uncontrollable")); var _List = _interopRequireDefault(require("./List")); var _Popup = _interopRequireDefault(require("./Popup")); var _Input = _interopRequireDefault(require("./Input")); var _Select = _interopRequireDefault(require("./Select")); var _Widget = _interopRequireDefault(require("./Widget")); var _WidgetPicker = _interopRequireDefault(require("./WidgetPicker")); var _messages = require("./messages"); var _focusManager = _interopRequireDefault(require("./util/focusManager")); var _reduceToListState = _interopRequireDefault(require("./util/reduceToListState")); var CustomPropTypes = _interopRequireWildcard(require("./util/PropTypes")); var _getAccessors = _interopRequireDefault(require("./util/getAccessors")); var _scrollManager = _interopRequireDefault(require("./util/scrollManager")); var Props = _interopRequireWildcard(require("./util/Props")); var _interaction = require("./util/interaction"); var _widgetHelpers = require("./util/widgetHelpers"); var _AutocompleteListItem = _interopRequireDefault(require("./AutocompleteListItem")); var _class, _class2, _descriptor, _descriptor2, _class3, _temp; function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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); } function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and set to use loose mode. ' + 'To use proposal-class-properties in spec mode with decorators, wait for ' + 'the next major version of decorators in stage 2.'); } var propTypes = { //-- controlled props ----------- value: PropTypes.any, onChange: PropTypes.func, open: PropTypes.bool, onToggle: PropTypes.func, //------------------------------------ openWithoutData: PropTypes.bool, itemComponent: CustomPropTypes.elementType, selectComponent: CustomPropTypes.elementType, listComponent: CustomPropTypes.elementType, groupComponent: CustomPropTypes.elementType, groupBy: CustomPropTypes.accessor, data: PropTypes.array, valueField: CustomPropTypes.accessor, textField: CustomPropTypes.accessor, onKeyDown: PropTypes.func, onSelect: PropTypes.func, autoFocus: PropTypes.bool, disabled: CustomPropTypes.disabled.acceptsArray, readOnly: CustomPropTypes.disabled, busy: PropTypes.bool, delay: PropTypes.number, dropUp: PropTypes.bool, popupTransition: CustomPropTypes.elementType, placeholder: PropTypes.string, inputProps: PropTypes.object, listProps: PropTypes.object, isRtl: PropTypes.bool, messages: PropTypes.shape({ emptyList: CustomPropTypes.message, emptyFilter: CustomPropTypes.message }) }; var Autocomplete = (0, _reactLifecyclesCompat.polyfill)(_class = (_class2 = (_temp = _class3 = /*#__PURE__*/ function (_React$Component) { _inheritsLoose(Autocomplete, _React$Component); function Autocomplete(props, context) { var _this; _this = _React$Component.call(this, props, context) || this; _this.handleFocusChanged = function (focused) { if (!focused) _this.close(); }; _initializerDefineProperty(_this, "handleSelect", _descriptor, _assertThisInitialized(_assertThisInitialized(_this))); _this.handleInputChange = function (event) { _this.change(event.target.value, event); _this.open(); }; _initializerDefineProperty(_this, "handleKeyDown", _descriptor2, _assertThisInitialized(_assertThisInitialized(_this))); _this.attachListRef = function (ref) { _this.listRef = ref; }; _this.attachInputRef = function (ref) { _this.inputRef = ref; }; _this.canOpen = function () { return !!_this.props.value && (_this.props.openWithoutData || !!_this.props.data.length); }; _this.inputId = (0, _widgetHelpers.instanceId)(_assertThisInitialized(_assertThisInitialized(_this)), '_input'); _this.listId = (0, _widgetHelpers.instanceId)(_assertThisInitialized(_assertThisInitialized(_this)), '_listbox'); _this.activeId = (0, _widgetHelpers.instanceId)(_assertThisInitialized(_assertThisInitialized(_this)), '_listbox_active_option'); _this.handleScroll = (0, _scrollManager.default)(_assertThisInitialized(_assertThisInitialized(_this))); _this.focusManager = (0, _focusManager.default)(_assertThisInitialized(_assertThisInitialized(_this)), { didHandle: _this.handleFocusChanged }); _this.state = { open: false }; return _this; } Autocomplete.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) { var value = nextProps.value, data = nextProps.data, messages = nextProps.messages; var _prevState$focusedIte = prevState.focusedItem, focusedItem = _prevState$focusedIte === void 0 ? null : _prevState$focusedIte; var accessors = (0, _getAccessors.default)(nextProps); var index = accessors.indexOf(data, value); var list = (0, _reduceToListState.default)(data, prevState.list, { accessors: accessors, nextProps: nextProps }); return { data: data, list: list, accessors: accessors, messages: (0, _messages.getMessages)(messages), selectedItem: list.nextEnabled(data[index]), focusedItem: ~index ? list.nextEnabled(data[index]) : focusedItem }; }; var _proto = Autocomplete.prototype; _proto.renderList = function renderList(messages) { var activeId = this.activeId, inputId = this.inputId, listId = this.listId; var _this$props = this.props, open = _this$props.open, value = _this$props.value; var _this$state = this.state, selectedItem = _this$state.selectedItem, focusedItem = _this$state.focusedItem, accessors = _this$state.accessors, list = _this$state.list; var List = this.props.listComponent; return _react.default.createElement(List, _extends({}, list.props, { id: listId, activeId: activeId, ref: this.attachListRef, selectedItem: selectedItem, searchTerm: accessors.text(value) || '', focusedItem: open ? focusedItem : null, "aria-hidden": !open, "aria-labelledby": inputId, "aria-live": open && 'polite', onSelect: this.handleSelect, onMove: this.handleScroll, messages: messages })); }; _proto.render = function render() { var _this2 = this; var _this$props2 = this.props, className = _this$props2.className, popupTransition = _this$props2.popupTransition, data = _this$props2.data, value = _this$props2.value, busy = _this$props2.busy, dropUp = _this$props2.dropUp, open = _this$props2.open, autoFocus = _this$props2.autoFocus, placeholder = _this$props2.placeholder, inputProps = _this$props2.inputProps, SelectComponent = _this$props2.selectComponent; var _this$state2 = this.state, focused = _this$state2.focused, accessors = _this$state2.accessors, messages = _this$state2.messages; var disabled = this.props.disabled === true; var readOnly = this.props.readOnly === true; var elementProps = Props.pickElementProps(this); var shouldRenderPopup = (0, _widgetHelpers.isFirstFocusedRender)(this); var valueItem = accessors.findOrSelf(data, value); var actuallyOpen = open && this.canOpen(); return _react.default.createElement(_Widget.default, _extends({}, elementProps, { dropUp: dropUp, focused: focused, disabled: disabled, readOnly: readOnly, open: actuallyOpen, onBlur: this.focusManager.handleBlur, onFocus: this.focusManager.handleFocus, onKeyDown: this.handleKeyDown, className: (0, _classnames.default)(className, 'rw-autocomplete') }), _react.default.createElement(_WidgetPicker.default, null, _react.default.createElement(_Input.default, _extends({}, inputProps, { role: "combobox", id: this.inputId, autoFocus: autoFocus, nodeRef: this.attachInputRef, disabled: disabled === true, readOnly: readOnly === true, "aria-busy": !!busy, "aria-owns": this.listId, "aria-autocomplete": "list", "aria-activedescendant": open ? this.activeId : null, "aria-expanded": open, "aria-haspopup": true, placeholder: placeholder, value: accessors.text(valueItem), onChange: this.handleInputChange, onKeyDown: this.handleInputKeyDown })), _react.default.createElement(SelectComponent, { busy: busy, "aria-hidden": "true", role: "presentational", disabled: disabled || readOnly })), shouldRenderPopup && _react.default.createElement(_Popup.default, { dropUp: dropUp, open: actuallyOpen, transition: popupTransition, onEntering: function onEntering() { return _this2.listRef.forceUpdate(); } }, _react.default.createElement("div", null, this.renderList(messages)))); }; _proto.focus = function focus() { this.inputRef && this.inputRef.focus(); }; _proto.change = function change(nextValue, originalEvent) { var _this$props3 = this.props, onChange = _this$props3.onChange, lastValue = _this$props3.value; (0, _widgetHelpers.notify)(onChange, [nextValue, { lastValue: lastValue, originalEvent: originalEvent }]); }; _proto.open = function open() { if (!this.props.open) (0, _widgetHelpers.notify)(this.props.onToggle, true); }; _proto.close = function close() { var _this3 = this; this.setState({ focusedItem: null }, function () { (0, _widgetHelpers.notify)(_this3.props.onToggle, false); }); }; return Autocomplete; }(_react.default.Component), _class3.defaultProps = { data: [], open: false, openWithoutData: false, listComponent: _List.default, selectComponent: _Select.default, itemComponent: _AutocompleteListItem.default }, _temp), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "handleSelect", [_interaction.widgetEditable], { enumerable: true, initializer: function initializer() { var _this4 = this; return function (data, originalEvent) { _this4.close(); (0, _widgetHelpers.notify)(_this4.props.onSelect, [data, { originalEvent: originalEvent }]); _this4.change(data, originalEvent); _this4.focus(); }; } }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "handleKeyDown", [_interaction.widgetEditable], { enumerable: true, initializer: function initializer() { var _this5 = this; return function (e) { var key = e.key; var _this5$state = _this5.state, list = _this5$state.list, focusedItem = _this5$state.focusedItem; var isOpen = _this5.props.open; (0, _widgetHelpers.notify)(_this5.props.onKeyDown, [e]); if (e.defaultPrevented) return; if (!isOpen) { if (key === 'ArrowDown') _this5.open(); return; } if (key === 'End') { e.preventDefault(); _this5.setState({ focusedItem: list.last() }); } else if (key === 'Home') { e.preventDefault(); _this5.setState({ focusedItem: list.first() }); } else if (key === 'Escape') _this5.close();else if (key === 'Enter') { if (!focusedItem) { return void _this5.close(); } e.preventDefault(); _this5.handleSelect(focusedItem, e); _this5.change(focusedItem, false, e); } else if (key === 'ArrowDown') { e.preventDefault(); _this5.setState({ focusedItem: list.next(focusedItem) }); } else if (key === 'ArrowUp') { e.preventDefault(); _this5.setState({ focusedItem: list.prev(focusedItem) }); } }; } })), _class2)) || _class; Autocomplete.propTypes = propTypes; var _default = (0, _uncontrollable.default)(Autocomplete, { open: 'onToggle', value: 'onChange' }, ['focus']); exports.default = _default; module.exports = exports["default"];