UNPKG

zarm-web

Version:
517 lines (429 loc) 18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _events = _interopRequireDefault(require("../utils/events")); var _createContext = require("../form/createContext"); var _Option = _interopRequireDefault(require("./Option")); var _dropdown = _interopRequireDefault(require("../dropdown")); var _menu = _interopRequireDefault(require("../menu")); var _tagInput = _interopRequireDefault(require("../tag-input")); var _LocaleReceiver = _interopRequireDefault(require("../locale-provider/LocaleReceiver")); var _SelectMultiple = _interopRequireDefault(require("./SelectMultiple")); var _utils = require("../utils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (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; } 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 _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } var EMPTY_STRING = ''; var EMPTY_STRING_VALUE = '$$EMPTY_STRING_VALUE'; /** * placeholder */ var Select = /*#__PURE__*/ function (_Component) { _inherits(Select, _Component); _createClass(Select, null, [{ key: "mapEmptyStringToEmptyValue", value: function mapEmptyStringToEmptyValue(values) { if (Array.isArray(values)) { return values.map(function (value) { if (value === EMPTY_STRING) { return EMPTY_STRING_VALUE; } return value; }); } if (values === EMPTY_STRING) { return EMPTY_STRING_VALUE; } return values; } }, { key: "getOptionMap", value: function getOptionMap(options) { if (!Array.isArray(options)) { options = [options]; } var optionData = []; var optionMap = {}; _react.default.Children.map(options, function (option) { if (option && _typeof(option) === 'object' && option.type) { var value = Select.mapEmptyStringToEmptyValue(option.props.value); if (option.props && value) { // handle optionMap optionMap[value] = option; // handle OptionData optionData.push({ key: option.key, props: option.props, value: value, children: option.props.children }); } } return optionMap; }); return [optionMap, optionData]; } }, { key: "mapEmptyValueToEmptyString", value: function mapEmptyValueToEmptyString(selected) { return selected.map(function (select) { if (select === EMPTY_STRING_VALUE) { return EMPTY_STRING; } return select; }); } }]); function Select(props) { var _this; _classCallCheck(this, Select); _this = _possibleConstructorReturn(this, _getPrototypeOf(Select).call(this, props)); _this.inputBox = void 0; _this.inputWithTags = void 0; _this.oldInputDivHeight = 0; _this.inputWithTagsRef = function (e) { _this.inputWithTags = e; }; _this.onDeleteTag = function (_e, _key, _value, index) { var selected = Select.mapEmptyValueToEmptyString(_this.state.value.slice()); selected.splice(index, 1); var selectedData = selected.map(function (select, selectIndex) { var vdom = _this.state.optionMap[select || EMPTY_STRING_VALUE]; var text = vdom ? vdom.props.children : ''; return { text: text, value: select, index: selectIndex }; }); _this.props.onChange(selected, selectedData); }; _this.onSearchValueChange = function (value) { var onSearchChange = _this.props.onSearchChange; // const textContent = (e.target as HTMLDivElement).textContent; _this.setState({ searchValue: value, dropdown: true }, function () { if (typeof onSearchChange === 'function') { onSearchChange(_this.state.searchValue); } }); }; var _value2 = props.value === undefined ? props.defaultValue : props.value; var state = { value: String(_value2), dropdown: false, searchValue: '', showPlacehoder: true, optionMap: {}, optionData: [] }; var children = _this.props.children; if (props.multiple) { if (!Array.isArray(_value2)) { state.value = [String(_value2)]; } else { state.value = _value2.map(function (val) { return String(val); }); } } else { state.value = String(_value2); } state.value = Select.mapEmptyStringToEmptyValue(state.value); var _Select$getOptionMap = Select.getOptionMap(children), _Select$getOptionMap2 = _slicedToArray(_Select$getOptionMap, 2), optionMap = _Select$getOptionMap2[0], optionData = _Select$getOptionMap2[1]; state.optionMap = optionMap; state.optionData = optionData; _this.state = state; return _this; } _createClass(Select, [{ key: "componentDidMount", value: function componentDidMount() { this.bindOuterHandlers(); } }, { key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { var _this$props = this.props, defaultValue = _this$props.defaultValue, children = _this$props.children; if ('value' in nextProps || nextProps.defaultValue !== defaultValue) { var value = nextProps.value === undefined ? nextProps.defaultValue : nextProps.value; if (nextProps.multiple) { if (!Array.isArray(value)) { value = [String(value)]; } else { value = value.map(function (val) { return String(val); }); } } else { value = String(value); } this.setState({ value: Select.mapEmptyStringToEmptyValue(value) }); } if (nextProps.children !== children) { var _Select$getOptionMap3 = Select.getOptionMap(nextProps.children), _Select$getOptionMap4 = _slicedToArray(_Select$getOptionMap3, 2), optionMap = _Select$getOptionMap4[0], optionData = _Select$getOptionMap4[1]; this.setState({ optionData: optionData, optionMap: optionMap }); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.unbindOuterHandlers(); } }, { key: "onOptionChange", value: function onOptionChange(_, props, index) { var _this2 = this; var _this$props2 = this.props, multiple = _this$props2.multiple, onChange = _this$props2.onChange; var handleFieldChange = this.context.handleFieldChange; var _this$state = this.state, optionMap = _this$state.optionMap, optionData = _this$state.optionData, stateValue = _this$state.value; if ('disabled' in props || props.isDisabled) { return; } if (props.search || props.isSearch) { this.setState({ searchValue: '' }); this.inputBox.textContent = ''; } if (!(0, _utils.isEmpty)(this.context)) { handleFieldChange(); } var value = String(props.value); if (multiple) { var _selected = Select.mapEmptyValueToEmptyString(stateValue.slice()); var position = _selected.indexOf(value); if (position === -1) { _selected.push(value); } else { _selected.splice(position, 1); } var selectedData = _selected.map(function (select) { var selectValue = select || EMPTY_STRING_VALUE; var vdom = optionMap[selectValue]; var text = vdom ? vdom.props.children : ''; var indexs = optionData.findIndex(function (elem) { return String(elem.value) === String(selectValue); }); return { text: text, value: select, indexs: indexs }; }); this.setState({ value: Select.mapEmptyStringToEmptyValue(_selected) }, function () { onChange(_selected, selectedData); }); return; } var selected = { index: index, value: value, text: Array.isArray(props.children) ? props.children.join() : props.children }; this.setState({ value: Select.mapEmptyStringToEmptyValue(value) }, function () { _this2.setDropdown(false, function () { return onChange(selected); }); }); } }, { key: "setDropdown", value: function setDropdown(isOpen, callback) { this.setState({ dropdown: isOpen, searchValue: '' }, function () { if (typeof callback === 'function') { callback(); } }); } }, { key: "bindOuterHandlers", value: function bindOuterHandlers() { var _this3 = this; _events.default.on(document, 'keyup', function (e) { return _this3.handleKeyup(e); }); } }, { key: "unbindOuterHandlers", value: function unbindOuterHandlers() { var _this4 = this; _events.default.off(document, 'keyup', function (e) { return _this4.handleKeyup(e); }); } }, { key: "handleKeyup", value: function handleKeyup(e) { var dropdown = this.state.dropdown; if (dropdown === true && e.keyCode === 27) { this.setDropdown(false); } } }, { key: "render", value: function render() { var _this5 = this; var _this$state2 = this.state, searchValue = _this$state2.searchValue, value = _this$state2.value, optionMap = _this$state2.optionMap, optionData = _this$state2.optionData, dropdown = _this$state2.dropdown; var _this$props3 = this.props, prefixCls = _this$props3.prefixCls, placeholder = _this$props3.placeholder, size = _this$props3.size, tagTheme = _this$props3.tagTheme, style = _this$props3.style, zIndex = _this$props3.zIndex, multiple = _this$props3.multiple, getPopupContainer = _this$props3.getPopupContainer, locale = _this$props3.locale, remoteSearch = _this$props3.remoteSearch; var disabled = 'disabled' in this.props; var radius = 'radius' in this.props; var search = 'search' in this.props; var placeholderText = placeholder || locale.placeholder; var valueText; if (multiple && Array.isArray(value)) { valueText = value.reduce(function (prev, item) { if (optionMap[item]) { prev.push({ key: item, value: optionMap[item].props.children }); } return prev; }, []); } else { var optionProps = optionMap[value]; if (optionProps) { var optionChildren = optionProps.props.children; Array.isArray(optionChildren) ? valueText = optionChildren.join() : valueText = optionChildren; } } var children = []; var filterCondition = function filterCondition(option, optionIndex) { if (search && searchValue) { return String(option.props.children).includes(searchValue); } // remoteSearch会走此处逻辑 return optionIndex > -1; }; optionData.filter(filterCondition).forEach(function (elem, index) { var checked = Array.isArray(value) ? value.indexOf(String(elem.value)) > -1 : String(elem.value) === value; children.push(_react.default.createElement(_Option.default, _extends({ key: elem.key || elem.value, showCheckIcon: checked }, elem.props, { checked: checked, onChange: function onChange(e) { _this5.onOptionChange(e, elem.props, index); } }), elem.children)); }); var menuStyle = { maxHeight: 250, overflow: 'auto' }; var menus = children && children.length > 0 ? _react.default.createElement(_menu.default, { size: size, style: menuStyle }, children) : _react.default.createElement("span", { className: "".concat(prefixCls, "--notfound") }, locale.noMatch); return _react.default.createElement(_dropdown.default, { triggerBoxStyle: style, disabled: disabled, visible: dropdown, isRadius: radius, overlay: menus, zIndex: zIndex, getPopupContainer: getPopupContainer, onVisibleChange: function onVisibleChange(visible) { if (visible === true) { _this5.setState({ dropdown: visible, searchValue: '' }); } else { _this5.setState({ dropdown: visible }); } } }, _react.default.createElement(_tagInput.default, { tagTheme: tagTheme, radius: radius, size: size, disabled: disabled, ref: this.inputWithTagsRef, style: style, searchValue: searchValue, search: search, remoteSearch: remoteSearch, active: dropdown, value: valueText, placeholder: placeholderText, onDeleteTag: this.onDeleteTag, onSearchChange: this.onSearchValueChange })); } }]); return Select; }(_react.Component); Select.contextType = _createContext.FormItemContext; Select.defaultProps = { prefixCls: 'za-select', radius: true, onSearchChange: function onSearchChange() {}, onChange: function onChange() {} }; Select.Option = _Option.default; Select.Multiple = _SelectMultiple.default; var _default = (0, _LocaleReceiver.default)('Select')(Select); exports.default = _default;