"use strict";

var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = exports.Select = exports.MORE_KEY = exports.DISABLED_FIELD = void 0;
exports.getItemKey = getItemKey;
exports.isSearchTextEmpty = isSearchTextEmpty;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));

var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));

var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));

var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));

var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));

var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));

var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));

var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));

var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));

var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));

var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));

var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));

var _tslib = require("tslib");

var _react = _interopRequireWildcard(require("react"));

var _debounce = _interopRequireDefault(require("lodash/debounce"));

var _isString = _interopRequireDefault(require("lodash/isString"));

var _isEqual = _interopRequireDefault(require("lodash/isEqual"));

var _isNil = _interopRequireDefault(require("lodash/isNil"));

var _isFunction = _interopRequireDefault(require("lodash/isFunction"));

var _isObject = _interopRequireDefault(require("lodash/isObject"));

var _noop = _interopRequireDefault(require("lodash/noop"));

var _defer = _interopRequireDefault(require("lodash/defer"));

var _isPlainObject = _interopRequireDefault(require("lodash/isPlainObject"));

var _mobxReact = require("mobx-react");

var _mobx = require("mobx");

var _classnames = _interopRequireDefault(require("classnames"));

var _menu = _interopRequireWildcard(require("../../../lib/rc-components/menu"));

var _tag = _interopRequireDefault(require("../../../lib/tag"));

var _KeyCode = _interopRequireDefault(require("../../../lib/_util/KeyCode"));

var _UnitConvertor = require("../../../lib/_util/UnitConvertor");

var _TriggerField2 = _interopRequireDefault(require("../trigger-field/TriggerField"));

var _autobind = _interopRequireDefault(require("../_util/autobind"));

var _Option = _interopRequireDefault(require("../option/Option"));

var _OptGroup = _interopRequireDefault(require("../option/OptGroup"));

var _enum = require("../data-set/enum");

var _DataSet = _interopRequireDefault(require("../data-set/DataSet"));

var _spin = _interopRequireDefault(require("../spin"));

var _EventManager = require("../_util/EventManager");

var _normalizeOptions = _interopRequireWildcard(require("../option/normalizeOptions"));

var _localeContext = require("../locale-context");

var _ObjectChainValue = _interopRequireDefault(require("../_util/ObjectChainValue"));

var _isEmpty2 = _interopRequireDefault(require("../_util/isEmpty"));

var _isSame = _interopRequireDefault(require("../_util/isSame"));

var _isSameLike = _interopRequireDefault(require("../_util/isSameLike"));

var _isIE = _interopRequireDefault(require("../_util/isIE"));

var _utils = require("../data-set/utils");

var _TextField = _interopRequireDefault(require("../text-field/TextField"));

var _icon = _interopRequireDefault(require("../icon"));

var _enum2 = require("../text-field/enum");

var _enum3 = require("../form/enum");

var _utils2 = require("../field/utils");

function updateActiveKey(menu, activeKey) {
  var store = menu.getStore();
  var menuId = menu.getEventKey();
  var state = store.getState();
  store.setState({
    activeKey: (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, state.activeKey), {}, (0, _defineProperty2["default"])({}, menuId, activeKey))
  });
}

function defaultSearchMatcher(_ref) {
  var record = _ref.record,
      text = _ref.text,
      textField = _ref.textField;

  if (record.get(textField) && (0, _isString["default"])(record.get(textField))) {
    return record.get(textField).indexOf(text) !== -1;
  }
}

function isSearchTextEmpty(text) {
  return (0, _mobx.isArrayLike)(text) ? !text.length : !text;
}

var DISABLED_FIELD = '__disabled';
exports.DISABLED_FIELD = DISABLED_FIELD;
var MORE_KEY = '__more__';
exports.MORE_KEY = MORE_KEY;

function defaultOnOption(_ref2) {
  var record = _ref2.record;
  return {
    disabled: record.get(DISABLED_FIELD)
  };
}

function getItemKey(record, text, value) {
  return "item-".concat(value || record.id, "-").concat(( /*#__PURE__*/(0, _react.isValidElement)(text) ? text.key : text) || record.id);
}

function getSimpleValue(value, valueField) {
  if ((0, _isPlainObject["default"])(value)) {
    return _ObjectChainValue["default"].get(value, valueField);
  }

  return value;
}

var Select = /*#__PURE__*/function (_TriggerField) {
  (0, _inherits2["default"])(Select, _TriggerField);

  var _super = (0, _createSuper2["default"])(Select);

  function Select() {
    var _this;

    (0, _classCallCheck2["default"])(this, Select);
    _this = _super.apply(this, arguments);
    _this.doSearch = (0, _debounce["default"])(function (value) {
      if ((0, _isString["default"])(_this.searchMatcher)) {
        _this.searchRemote(value);
      }

      _this.handleSearch(value);
    }, 500);
    return _this;
  }

  (0, _createClass2["default"])(Select, [{
    key: "range",
    get: function get() {
      if (this.multiple && (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "range", this)) {
        return false;
      }

      return (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "range", this);
    }
  }, {
    key: "searchText",
    get: function get() {
      if (this.isSearchFieldInPopup()) {
        return this.$searchText;
      }

      return this.text;
    },
    set: function set(searchText) {
      this.$searchText = searchText;
    }
  }, {
    key: "searchMatcher",
    get: function get() {
      var _this$observableProps = this.observableProps.searchMatcher,
          searchMatcher = _this$observableProps === void 0 ? defaultSearchMatcher : _this$observableProps;
      return searchMatcher;
    }
  }, {
    key: "paramMatcher",
    get: function get() {
      var paramMatcher = this.observableProps.paramMatcher;
      return paramMatcher;
    }
  }, {
    key: "defaultValidationMessages",
    get: function get() {
      var label = this.getProp('label');
      return {
        valueMissing: (0, _localeContext.$l)('Select', label ? 'value_missing' : 'value_missing_no_label', {
          label: label
        })
      };
    }
  }, {
    key: "textField",
    get: function get() {
      return this.getProp('textField') || 'meaning';
    }
  }, {
    key: "valueField",
    get: function get() {
      return this.getProp('valueField') || 'value';
    }
  }, {
    key: "currentComboOption",
    get: function get() {
      var _this2 = this;

      var comboOptions = this.comboOptions;
      return comboOptions && comboOptions.filter(function (record) {
        return !_this2.isSelected(record);
      })[0];
    }
  }, {
    key: "filteredOptions",
    get: function get() {
      var optionsWithCombo = this.optionsWithCombo,
          optionsFilter = this.observableProps.optionsFilter;
      return this.searchData(optionsFilter ? optionsWithCombo.filter(optionsFilter) : optionsWithCombo);
    }
  }, {
    key: "optionsWithCombo",
    get: function get() {
      var comboOptions = this.comboOptions;
      return comboOptions ? [].concat((0, _toConsumableArray2["default"])(comboOptions.data), (0, _toConsumableArray2["default"])(this.cascadeOptions)) : this.cascadeOptions;
    }
  }, {
    key: "cascadeOptions",
    get: function get() {
      var record = this.record,
          field = this.field,
          options = this.options,
          searchMatcher = this.searchMatcher;
      var data = options.data;

      if (field && !(0, _isString["default"])(searchMatcher)) {
        var cascadeMap = field.get('cascadeMap', this.record);

        if (cascadeMap) {
          if (record) {
            var cascades = Object.keys(cascadeMap);
            return data.filter(function (item) {
              return cascades.every(function (cascade) {
                return (0, _isSameLike["default"])(record.get(cascadeMap[cascade]), item.get(cascade));
              });
            });
          }

          return [];
        }
      }

      return data;
    }
  }, {
    key: "searchable",
    get: function get() {
      var _this$observableProps2 = this.observableProps.searchable,
          searchable = _this$observableProps2 === void 0 ? this.getContextConfig('selectSearchable') : _this$observableProps2;
      return !!searchable;
    }
  }, {
    key: "reserveParam",
    get: function get() {
      var _this$observableProps3 = this.observableProps.reserveParam,
          reserveParam = _this$observableProps3 === void 0 ? this.getContextConfig('selectReserveParam') : _this$observableProps3;
      return reserveParam;
    }
  }, {
    key: "multiple",
    get: function get() {
      return !!this.getProp('multiple');
    }
  }, {
    key: "menuMultiple",
    get: function get() {
      return this.multiple;
    }
  }, {
    key: "options",
    get: function get() {
      var field = this.field,
          textField = this.textField,
          valueField = this.valueField,
          multiple = this.multiple,
          _this$observableProps4 = this.observableProps,
          children = _this$observableProps4.children,
          options = _this$observableProps4.options;
      return options || field && field.getOptions(this.record) || (0, _normalizeOptions["default"])({
        textField: textField,
        valueField: valueField,
        disabledField: DISABLED_FIELD,
        multiple: multiple,
        children: children,
        getConfig: this.getContextConfig
      });
    }
  }, {
    key: "primitive",
    get: function get() {
      return this.observableProps.primitiveValue !== false && this.getProp('type') !== _enum.FieldType.object;
    }
  }, {
    key: "saveMenu",
    value: function saveMenu(node) {
      this.menu = node;
    }
  }, {
    key: "getSearchFieldProps",
    value: function getSearchFieldProps() {
      var _this$props$searchFie = this.props.searchFieldProps,
          searchFieldProps = _this$props$searchFie === void 0 ? {} : _this$props$searchFie;
      return searchFieldProps;
    }
  }, {
    key: "isSearchFieldInPopup",
    value: function isSearchFieldInPopup() {
      var searchFieldInPopup = this.props.searchFieldInPopup;
      return searchFieldInPopup;
    }
  }, {
    key: "isEmpty",
    value: function isEmpty() {
      return (this.isEditableLike() || (0, _isEmpty2["default"])(this.text)) && (0, _utils2.isFieldValueEmpty)(this.getValue(), this.range, this.multiple, this.valueField, this.textField) && this.isRenderEmpty();
    }
  }, {
    key: "isEditable",
    value: function isEditable() {
      return (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "isEditable", this).call(this) && (this.searchable && !this.isSearchFieldInPopup() || !!this.observableProps.combo);
    }
  }, {
    key: "checkValue",
    value: function checkValue() {
      var _this3 = this;

      this.checkValueReaction = (0, _mobx.reaction)(function () {
        return _this3.cascadeOptions;
      }, function () {
        return _this3.processSelectedData();
      });
    }
  }, {
    key: "checkCombo",
    value: function checkCombo() {
      var _this4 = this;

      this.checkComboReaction = (0, _mobx.reaction)(function () {
        return _this4.getValue();
      }, function (value) {
        return _this4.generateComboOption(value);
      });
    }
  }, {
    key: "clearCheckValue",
    value: function clearCheckValue() {
      if (this.checkValueReaction) {
        this.checkValueReaction();
        delete this.checkValueReaction;
      }
    }
  }, {
    key: "clearCheckCombo",
    value: function clearCheckCombo() {
      if (this.checkComboReaction) {
        this.checkComboReaction();
        delete this.checkComboReaction;
      }
    }
  }, {
    key: "clearReaction",
    value: function clearReaction() {
      this.clearCheckValue();
      this.clearCheckCombo();
    }
  }, {
    key: "componentWillMount",
    value: function componentWillMount() {
      var _this$props = this.props,
          checkValueOnOptionsChange = _this$props.checkValueOnOptionsChange,
          combo = _this$props.combo;

      if (checkValueOnOptionsChange) {
        this.checkValue();
      }

      if (combo) {
        this.checkCombo();
        this.generateComboOption(this.getValue());
      }
    }
  }, {
    key: "componentWillUnmount",
    value: function componentWillUnmount() {
      (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "componentWillUnmount", this).call(this);
      this.doSearch.cancel();
      this.clearReaction();
    }
  }, {
    key: "componentWillReceiveProps",
    value: function componentWillReceiveProps(nextProps, nextContext) {
      (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "componentWillReceiveProps", this).call(this, nextProps, nextContext);
      var _this$props2 = this.props,
          checkValueOnOptionsChange = _this$props2.checkValueOnOptionsChange,
          combo = _this$props2.combo;

      if (checkValueOnOptionsChange && !nextProps.checkValueOnOptionsChange) {
        this.clearCheckValue();
      }

      if (!checkValueOnOptionsChange && nextProps.checkValueOnOptionsChange) {
        this.checkValue();
      }

      if (combo && !nextProps.combo) {
        this.removeComboOptions();
        this.clearCheckCombo();
      }

      if (!combo && nextProps.combo) {
        this.checkCombo();

        if ('value' in nextProps) {
          this.generateComboOption(nextProps.value);
        }
      }
    }
  }, {
    key: "componentDidUpdate",
    value: function componentDidUpdate() {
      this.forcePopupAlign();
    }
  }, {
    key: "getOmitPropsKeys",
    value: function getOmitPropsKeys() {
      return (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "getOmitPropsKeys", this).call(this).concat(['searchable', 'reserveParam', 'searchMatcher', 'searchFieldInPopup', 'searchFieldProps', 'paramMatcher', 'combo', 'commonItem', 'maxCommonTagPlaceholder', 'maxCommonTagCount', 'maxCommonTagTextLength', 'multiple', 'value', 'name', 'options', 'optionsFilter', 'dropdownMatchSelectWidth', 'dropdownMenuStyle', 'checkValueOnOptionsChange', 'primitiveValue', 'optionRenderer', 'notFoundContent', 'pagingOptionContent', 'onOption', 'noCache', 'reverse', 'selectAllButton', 'optionTooltip', 'defaultActiveFirstOption']);
    }
  }, {
    key: "getObservableProps",
    value: function getObservableProps(props, context) {
      return (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "getObservableProps", this).call(this, props, context)), {}, {
        children: props.children,
        options: props.options,
        combo: props.combo,
        commonItem: props.commonItem,
        primitiveValue: props.primitiveValue,
        searchMatcher: props.searchMatcher,
        paramMatcher: props.paramMatcher,
        searchable: props.searchable,
        reserveParam: props.reserveParam,
        dropdownMatchSelectWidth: props.dropdownMatchSelectWidth,
        defaultActiveFirstOption: props.defaultActiveFirstOption,
        selectReverse: props.reverse,
        optionsFilter: props.optionsFilter
      });
    }
  }, {
    key: "getMenuPrefixCls",
    value: function getMenuPrefixCls() {
      return "".concat(this.prefixCls, "-dropdown-menu");
    }
  }, {
    key: "renderMultipleHolder",
    value: function renderMultipleHolder() {
      var name = this.name,
          multiple = this.multiple;

      if (multiple) {
        return (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "renderMultipleHolder", this).call(this);
      }

      return /*#__PURE__*/_react["default"].createElement("input", {
        key: "value",
        type: "hidden",
        value: this.toValueString(this.getValue()) || '',
        name: name,
        onChange: _noop["default"]
      });
    }
  }, {
    key: "getNotFoundContent",
    value: function getNotFoundContent() {
      var notFoundContent = this.props.notFoundContent;

      if (notFoundContent !== undefined) {
        return notFoundContent;
      }

      return this.getContextConfig('renderEmpty')('Select');
    }
  }, {
    key: "getPagingOptionContent",
    value: function getPagingOptionContent() {
      var pagingOptionContent = this.props.pagingOptionContent;

      if (pagingOptionContent !== undefined) {
        return pagingOptionContent;
      }

      return this.getContextConfig('selectPagingOptionContent');
    }
  }, {
    key: "getOtherNextNode",
    value: function getOtherNextNode() {
      var _this5 = this;

      var commonItem = this.observableProps.commonItem;

      if (commonItem) {
        var options = this.options;

        if (!options) {
          return undefined;
        }

        var textField = this.textField,
            valueField = this.valueField,
            _this$props3 = this.props,
            maxCommonTagCount = _this$props3.maxCommonTagCount,
            maxCommonTagPlaceholder = _this$props3.maxCommonTagPlaceholder,
            maxCommonTagTextLength = _this$props3.maxCommonTagTextLength;
        var values = this.getValues();
        var valueLength = commonItem.length;
        var tags = commonItem.slice(0, maxCommonTagCount).map(function (item) {
          var text = item;
          var textRecord;
          options.map(function (record) {
            if (record.get(valueField) === item) {
              text = maxCommonTagTextLength && (0, _isString["default"])(record.get(textField)) && record.get(textField).length > maxCommonTagTextLength ? "".concat(record.get(textField).slice(0, maxCommonTagTextLength), "...") : record.get(textField);
              textRecord = record;
            }

            return null;
          });
          return /*#__PURE__*/_react["default"].createElement(_tag["default"], {
            key: item,
            className: values.includes(item) ? "".concat(_this5.prefixCls, "-common-item ").concat(_this5.prefixCls, "-common-item-selected") : "".concat(_this5.prefixCls, "-common-item"),
            // @ts-ignore
            onClick: function onClick() {
              return _this5.handleCommonItemClick(textRecord);
            }
          }, text);
        });

        if (maxCommonTagCount && valueLength > maxCommonTagCount) {
          var content = "+ ".concat(valueLength - Number(maxCommonTagCount), " ...");

          if (maxCommonTagPlaceholder) {
            var omittedValues = commonItem.slice(maxCommonTagCount, valueLength);
            content = typeof maxCommonTagPlaceholder === 'function' ? maxCommonTagPlaceholder(omittedValues) : maxCommonTagPlaceholder;
          }

          tags.push( /*#__PURE__*/_react["default"].createElement(_tag["default"], {
            className: "".concat(this.prefixCls, "-common-item"),
            key: "maxCommonTagPlaceholder"
          }, content));
        }

        return /*#__PURE__*/_react["default"].createElement("div", {
          className: "".concat(this.prefixCls, "-common-item-wrapper")
        }, /*#__PURE__*/_react["default"].createElement("span", {
          className: "".concat(this.prefixCls, "-common-item-label")
        }, (0, _localeContext.$l)('Select', 'common_item')), tags);
      }
    }
  }, {
    key: "getMenuItem",
    value: function getMenuItem(_ref3) {
      var record = _ref3.record,
          text = _ref3.text,
          value = _ref3.value;
      var options = this.options,
          optionRenderer = this.props.optionRenderer;
      return optionRenderer ? optionRenderer({
        dataSet: options,
        record: record,
        text: text,
        value: value
      }) : text;
    }
  }, {
    key: "getMenu",
    value: function getMenu() {
      var _this6 = this;

      var menuProps = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
      var options = this.options;

      if (!options) {
        return null;
      }

      var _this$context = this.context,
          getTooltip = _this$context.getTooltip,
          getTooltipTheme = _this$context.getTooltipTheme,
          getTooltipPlacement = _this$context.getTooltipPlacement;
      var menuDisabled = this.disabled,
          textField = this.textField,
          valueField = this.valueField,
          _this$props4 = this.props,
          dropdownMenuStyle = _this$props4.dropdownMenuStyle,
          onOption = _this$props4.onOption,
          _this$props4$optionTo = _this$props4.optionTooltip,
          optionTooltip = _this$props4$optionTo === void 0 ? getTooltip('select-option') : _this$props4$optionTo;
      var groups = options.getGroups();
      var optGroups = [];
      var selectedKeys = [];
      /**
       * fixed when ie the scroll width would cover the item width
       */

      var IeMenuStyle = !this.dropdownMatchSelectWidth && (0, _isIE["default"])() ? {
        padding: '.08rem'
      } : {};
      var IeItemStyle = !this.dropdownMatchSelectWidth && (0, _isIE["default"])() ? {
        overflow: 'visible'
      } : {};
      this.filteredOptions.forEach(function (record) {
        var previousGroup;
        groups.every(function (field) {
          var label = record.get(field);

          if (label !== undefined) {
            if (!previousGroup) {
              previousGroup = optGroups.find(function (item) {
                return item.props.title === label;
              });

              if (!previousGroup) {
                previousGroup = /*#__PURE__*/_react["default"].createElement(_menu.ItemGroup, {
                  key: "group-".concat(label),
                  title: label
                }, []);
                optGroups.push(previousGroup);
              }
            } else {
              var children = previousGroup.props.children;
              previousGroup = children.find(function (item) {
                return item.props.title === label;
              });

              if (!previousGroup) {
                previousGroup = /*#__PURE__*/_react["default"].createElement(_menu.ItemGroup, {
                  key: "group-".concat(label),
                  title: label
                }, []);
                children.push(previousGroup);
              }
            }

            return true;
          }

          return false;
        });
        var value = record.get(valueField);
        var text = record.get(textField);
        var optionProps = onOption({
          dataSet: options,
          record: record
        });
        var key = getItemKey(record, text, value);

        if (!('selectedKeys' in menuProps) && _this6.isSelected(record)) {
          selectedKeys.push(key);
        }

        var itemContent = _this6.getMenuItem({
          record: record,
          text: text,
          value: value
        });

        var recordValues = record.get(_normalizeOptions.OTHER_OPTION_PROPS) || {};
        var itemProps = (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, recordValues), {}, {
          style: (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, IeItemStyle), recordValues.style),
          key: key,
          value: record,
          disabled: menuDisabled,
          tooltip: optionTooltip,
          tooltipTheme: getTooltipTheme('select-option'),
          tooltipPlacement: getTooltipPlacement('select-option')
        });
        var mergedProps = optionProps ? (0, _objectSpread3["default"])((0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, optionProps), itemProps), {}, {
          className: (0, _classnames["default"])(optionProps.className, itemProps.className, (0, _defineProperty2["default"])({}, "".concat(_this6.prefixCls, "-current"), record.isCurrent)),
          style: (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, optionProps.style), itemProps.style),
          disabled: itemProps.disabled || optionProps.disabled
        }) : itemProps;

        var option = /*#__PURE__*/_react["default"].createElement(_menu.Item, (0, _extends2["default"])({}, mergedProps), (0, _mobx.toJS)(itemContent));

        if (previousGroup) {
          var children = previousGroup.props.children;
          children.push(option);
        } else {
          optGroups.push(option);
        }
      });

      if (!optGroups.length) {
        optGroups.push( /*#__PURE__*/_react["default"].createElement(_menu.Item, {
          key: "no_data",
          disabled: true,
          checkable: false
        }, this.loading ? ' ' : this.getNotFoundContent()));
      }

      var menuPrefix = this.getMenuPrefixCls();
      return /*#__PURE__*/_react["default"].createElement(_menu["default"], (0, _extends2["default"])({
        ref: this.saveMenu,
        disabled: menuDisabled,
        defaultActiveFirst: this.defaultActiveFirstOption,
        multiple: this.menuMultiple,
        selectedKeys: selectedKeys,
        prefixCls: menuPrefix,
        onClick: this.handleMenuClick,
        onMouseDown: _EventManager.preventDefault,
        style: (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, IeMenuStyle), dropdownMenuStyle),
        focusable: false
      }, menuProps), optGroups, options.paging && options.currentPage < options.totalPage && /*#__PURE__*/_react["default"].createElement(_menu.Item, {
        key: MORE_KEY,
        checkable: false,
        className: "".concat(menuPrefix, "-item-more")
      }, this.getPagingOptionContent()));
    }
    /**
     * 增加lov popupContent 回调参数 用于控制对应交互
     */

  }, {
    key: "getPopupProps",
    value: function getPopupProps() {
      var options = this.options,
          textField = this.textField,
          field = this.field,
          record = this.record,
          valueField = this.valueField;
      return (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "getPopupProps", this).call(this)), {}, {
        dataSet: options,
        textField: textField,
        valueField: valueField,
        field: field,
        record: record,
        content: this.getPopupContent()
      });
    }
  }, {
    key: "getPopupClassName",
    value: function getPopupClassName(defaultClassName) {
      var _classNames2;

      var multiple = this.multiple,
          prefixCls = this.prefixCls;
      return (0, _classnames["default"])(defaultClassName, (_classNames2 = {}, (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-popup-multiple"), multiple), (0, _defineProperty2["default"])(_classNames2, "".concat(prefixCls, "-popup-single"), !multiple), _classNames2));
    }
  }, {
    key: "dropdownMatchSelectWidth",
    get: function get() {
      var _this$observableProps5 = this.observableProps.dropdownMatchSelectWidth,
          dropdownMatchSelectWidth = _this$observableProps5 === void 0 ? this.getContextConfig('dropdownMatchSelectWidth') : _this$observableProps5;
      return dropdownMatchSelectWidth;
    }
  }, {
    key: "defaultActiveFirstOption",
    get: function get() {
      var _this$observableProps6 = this.observableProps.defaultActiveFirstOption,
          defaultActiveFirstOption = _this$observableProps6 === void 0 ? this.getContextConfig('defaultActiveFirstOption') : _this$observableProps6;
      return defaultActiveFirstOption;
    }
  }, {
    key: "selectReverse",
    get: function get() {
      var _this$observableProps7 = this.observableProps.selectReverse,
          selectReverse = _this$observableProps7 === void 0 ? this.getContextConfig('selectReverse') : _this$observableProps7;
      return selectReverse;
    }
  }, {
    key: "loading",
    get: function get() {
      return this.options.status === _enum.DataSetStatus.loading;
    }
  }, {
    key: "handlePopupSearch",
    value: function handlePopupSearch(value) {
      this.searchText = value;
      this.doSearch(value);
    }
  }, {
    key: "renderSearchFieldPrefix",
    value: function renderSearchFieldPrefix(_props) {
      return undefined;
    }
  }, {
    key: "renderSearchField",
    value: function renderSearchField(props) {
      var searchText = this.searchText,
          prefixCls = this.prefixCls;
      var searchFieldProps = this.getSearchFieldProps();
      var multiple = searchFieldProps.multiple,
          className = searchFieldProps.className;
      return /*#__PURE__*/_react["default"].createElement("div", {
        className: "".concat(prefixCls, "-search-bar")
      }, this.renderSearchFieldPrefix(props), /*#__PURE__*/_react["default"].createElement(_TextField["default"], (0, _extends2["default"])({
        value: searchText,
        onChange: this.handlePopupSearch,
        prefix: /*#__PURE__*/_react["default"].createElement(_icon["default"], {
          type: "search"
        }),
        valueChangeAction: multiple ? _enum2.ValueChangeAction.blur : _enum2.ValueChangeAction.input,
        labelLayout: _enum3.LabelLayout.none,
        border: false
      }, searchFieldProps, {
        className: (0, _classnames["default"])("".concat(prefixCls, "-search-field"), className)
      })));
    }
  }, {
    key: "renderSelectAll",
    value: function renderSelectAll() {
      var selectAllButton = this.props.selectAllButton;

      if (this.multiple && selectAllButton) {
        var builtInButtons = [{
          key: 'select_all',
          onClick: this.chooseAll,
          children: (0, _localeContext.$l)('Select', 'select_all')
        }];

        if (this.selectReverse) {
          builtInButtons.push({
            key: 'select_re',
            onClick: this.chooseRe,
            children: (0, _localeContext.$l)('Select', 'select_re')
          });
        }

        builtInButtons.push({
          key: 'unselect_all',
          onClick: this.unChooseAll,
          children: (0, _localeContext.$l)('Select', 'unselect_all')
        });
        var buttons = typeof selectAllButton === 'function' ? selectAllButton(builtInButtons) : builtInButtons;
        return /*#__PURE__*/_react["default"].createElement("div", {
          key: "check-all",
          className: "".concat(this.prefixCls, "-select-all-none")
        }, buttons.map(function (_ref4, index) {
          var key = _ref4.key,
              onClick = _ref4.onClick,
              children = _ref4.children;
          return /*#__PURE__*/_react["default"].createElement("span", {
            key: key || String(index),
            onClick: onClick
          }, children);
        }));
      }
    }
  }, {
    key: "getPopupContent",
    value: function getPopupContent() {
      var menu = /*#__PURE__*/_react["default"].createElement(_spin["default"], {
        key: "menu",
        spinning: this.loading
      }, this.getMenu());

      return [this.searchable && this.isSearchFieldInPopup() && this.renderSearchField(), this.renderSelectAll(), menu];
    }
  }, {
    key: "getPopupStyleFromAlign",
    value: function getPopupStyleFromAlign(target) {
      if (target) {
        var width = (0, _UnitConvertor.pxToRem)(target.getBoundingClientRect().width, true);

        if (width !== undefined) {
          var isFlat = this.props.isFlat;

          if (!isFlat && this.dropdownMatchSelectWidth) {
            return {
              width: width
            };
          }

          return {
            minWidth: width
          };
        }
      }
    }
  }, {
    key: "getDefaultAction",
    value: function getDefaultAction() {
      return this.getContextConfig('selectTrigger') || (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "getDefaultAction", this).call(this);
    }
  }, {
    key: "getTriggerIconFont",
    value: function getTriggerIconFont() {
      return this.searchable && !this.isSearchFieldInPopup() && this.isFocused && !this.readOnly ? 'search' : 'baseline-arrow_drop_down';
    }
  }, {
    key: "handleKeyDown",
    value: function handleKeyDown(e) {
      var menu = this.menu;
      /**
       * 修复ie出现点击backSpace的页面回到上一页问题
       */

      if ((0, _isIE["default"])()) {
        if (e.keyCode === _KeyCode["default"].BACKSPACE) {
          e.preventDefault();
        }
      }

      if (!this.disabled && !this.readOnly && menu) {
        if (this.popup && menu.onKeyDown(e)) {
          (0, _EventManager.stopEvent)(e);
        } else {
          switch (e.keyCode) {
            case _KeyCode["default"].RIGHT:
            case _KeyCode["default"].DOWN:
              this.handleKeyDownPrevNext(e, menu, 1);
              break;

            case _KeyCode["default"].LEFT:
            case _KeyCode["default"].UP:
              this.handleKeyDownPrevNext(e, menu, -1);
              break;

            case _KeyCode["default"].END:
            case _KeyCode["default"].PAGE_DOWN:
              this.handleKeyDownFirstLast(e, menu, 1);
              break;

            case _KeyCode["default"].HOME:
            case _KeyCode["default"].PAGE_UP:
              this.handleKeyDownFirstLast(e, menu, -1);
              break;
            // case KeyCode.ENTER:
            //   this.handleKeyDownEnter(e);
            //   break;

            case _KeyCode["default"].ESC:
              this.handleKeyDownEsc(e);
              break;

            case _KeyCode["default"].SPACE:
              this.handleKeyDownSpace(e);
              break;

            default:
          }
        }
      }

      (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "handleKeyDown", this).call(this, e);
    }
  }, {
    key: "isMultipleBlockDisabled",
    value: function isMultipleBlockDisabled(v) {
      var onOption = this.props.onOption;
      var findRecord = this.findByValue(v);
      var optionProps = findRecord ? onOption === defaultOnOption ? defaultOnOption({
        record: findRecord
      }) : onOption({
        dataSet: this.options,
        record: findRecord
      }) : undefined;
      var optionDisabled = optionProps && optionProps.disabled;
      return findRecord && findRecord.get(DISABLED_FIELD) === true || optionDisabled || this.disabled;
    }
  }, {
    key: "handleKeyDownFirstLast",
    value: function handleKeyDownFirstLast(e, menu, direction) {
      (0, _EventManager.stopEvent)(e); // TreeSelect event conflict

      if (!menu.tree) {
        var children = menu.getFlatInstanceArray();
        var activeItem = children[direction < 0 ? 0 : children.length - 1];

        if (activeItem) {
          if (!this.editable || this.popup) {
            updateActiveKey(menu, activeItem.props.eventKey);
          }

          if (!this.editable && !this.popup) {
            this.choose(activeItem.props.value);
          }
        }
      }
    }
  }, {
    key: "handleKeyDownPrevNext",
    value: function handleKeyDownPrevNext(e, menu, direction) {
      if (!this.multiple && !this.editable && !menu.tree) {
        var activeItem = menu.step(direction);

        if (activeItem) {
          updateActiveKey(menu, activeItem.props.eventKey);
          this.choose(activeItem.props.value);
        }

        e.preventDefault();
      } else if (e === _KeyCode["default"].DOWN) {
        this.expand();
        e.preventDefault();
      }
    } // handleKeyDownEnter(_e) {
    // }

  }, {
    key: "handleKeyDownEsc",
    value: function handleKeyDownEsc(e) {
      if (this.popup) {
        e.preventDefault();
        this.collapse();
      }
    }
  }, {
    key: "handleKeyDownSpace",
    value: function handleKeyDownSpace(e) {
      if (!this.editable) {
        e.preventDefault();

        if (!this.popup) {
          this.expand();
        }
      }
    }
  }, {
    key: "handleBlur",
    value: function handleBlur(e) {
      if (!e.isDefaultPrevented()) {
        (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "handleBlur", this).call(this, e);
        this.resetFilter();
      }
    }
  }, {
    key: "expand",
    value: function expand() {
      var filteredOptions = this.filteredOptions;

      if (filteredOptions && filteredOptions.length) {
        (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "expand", this).call(this);
      }
    }
  }, {
    key: "syncValueOnBlur",
    value: function syncValueOnBlur(text) {
      var _this7 = this;

      var value = this.getValue();

      if (text) {
        if (value !== text) {
          if (!(0, _isObject["default"])(value) || value[this.textField] !== text) {
            var comboOptions = this.comboOptions;
            var data = comboOptions ? comboOptions.data : [];
            this.options.ready().then(function () {
              var record = _this7.findByTextWithValue(text, data);

              if (record) {
                _this7.choose(record);
              }
            });
          }
        }
      } else if (!this.multiple || value && value.length === 0 || !value) {
        this.setValue(this.emptyValue);
      }
    }
  }, {
    key: "findByTextWithValue",
    value: function findByTextWithValue(text, data) {
      var textField = this.textField;
      var records = [].concat((0, _toConsumableArray2["default"])(data), (0, _toConsumableArray2["default"])(this.filteredOptions)).filter(function (record) {
        return (0, _isSameLike["default"])(record.get(textField), text);
      });

      if (records.length > 1) {
        var valueField = this.valueField,
            primitive = this.primitive;
        var value = this.getValue();

        if (value) {
          var found = records.find(function (record) {
            return (0, _isSameLike["default"])(record.get(valueField), primitive ? value : value[valueField]);
          });

          if (found) {
            return found;
          }
        }
      }

      return records[0];
    }
  }, {
    key: "findByText",
    value: function findByText(text) {
      var textField = this.textField;
      return this.optionsWithCombo.find(function (record) {
        return (0, _isSameLike["default"])(record.get(textField), text);
      });
    }
  }, {
    key: "findByValue",
    value: function findByValue(value) {
      var valueField = this.valueField;

      var autoType = this.getProp('type') === _enum.FieldType.auto;

      value = getSimpleValue(value, valueField);
      return this.optionsWithCombo.find(function (record) {
        return autoType ? (0, _isSameLike["default"])(record.get(valueField), value) : (0, _isSame["default"])(record.get(valueField), value);
      });
    }
  }, {
    key: "isSelected",
    value: function isSelected(record) {
      var valueField = this.valueField;

      var autoType = this.getProp('type') === _enum.FieldType.auto;

      return this.getValues().some(function (value) {
        var simpleValue = getSimpleValue(value, valueField);
        return autoType ? (0, _isSameLike["default"])(record.get(valueField), simpleValue) : (0, _isSame["default"])(record.get(valueField), simpleValue);
      });
    }
  }, {
    key: "generateComboOption",
    value: function generateComboOption(value, callback) {
      var _this8 = this;

      var currentComboOption = this.currentComboOption,
          textField = this.textField,
          valueField = this.valueField;

      if (value) {
        if ((0, _mobx.isArrayLike)(value)) {
          value.forEach(function (v) {
            return !(0, _isNil["default"])(v) && _this8.generateComboOption(v);
          });
        } else {
          if ((0, _mobx.isObservableObject)(value)) {
            value = (0, _mobx.get)(value, textField);
          } else if ((0, _isObject["default"])(value)) {
            value = value[textField];
          }

          var found = this.findByText(value) || this.findByValue(value);

          if (found) {
            var text = found.get(textField);

            if (text !== value && callback) {
              callback(text);
            }

            this.removeComboOption();
          } else if (currentComboOption) {
            currentComboOption.set(textField, value);
            currentComboOption.set(valueField, value);
          } else {
            this.createComboOption(value);
          }
        }
      } else {
        this.removeComboOption();
      }
    }
  }, {
    key: "createComboOption",
    value: function createComboOption(value) {
      var _this9 = this,
          _ref5;

      var textField = this.textField,
          valueField = this.valueField,
          menu = this.menu;
      var comboOptions = (0, _utils.getIf)(this, 'comboOptions', function () {
        return new _DataSet["default"](undefined, {
          getConfig: _this9.getContextConfig
        });
      });
      var initData = !this.primitive && (0, _mobx.isObservableObject)(value) ? value : (_ref5 = {}, (0, _defineProperty2["default"])(_ref5, textField, value), (0, _defineProperty2["default"])(_ref5, valueField, value), _ref5);
      var findOption = comboOptions.find(function (record) {
        return record.get(valueField) === value.trim();
      });
      if (findOption) return;
      var record = comboOptions.create(initData, 0);

      if (menu) {
        updateActiveKey(menu, getItemKey(record, initData[valueField], initData[valueField]));
      }
    }
  }, {
    key: "removeComboOptions",
    value: function removeComboOptions() {
      var _this10 = this;

      var comboOptions = this.comboOptions;

      if (comboOptions) {
        comboOptions.forEach(function (record) {
          return _this10.removeComboOption(record);
        });
      }
    }
  }, {
    key: "removeComboOption",
    value: function removeComboOption(record) {
      if (!record) {
        record = this.currentComboOption;
      }

      if (record && !this.isSelected(record)) {
        var comboOptions = this.comboOptions;

        if (comboOptions) {
          comboOptions.remove(record);
        }
      }
    }
  }, {
    key: "handlePopupAnimateAppear",
    value: function handlePopupAnimateAppear() {// noop
    }
  }, {
    key: "getValueKey",
    value: function getValueKey(v) {
      if ((0, _mobx.isArrayLike)(v)) {
        return v.map(this.getValueKey, this).join(',');
      }

      var autoType = this.getProp('type') === _enum.FieldType.auto;

      var value = getSimpleValue(v, this.valueField);
      return autoType && !(0, _isNil["default"])(value) ? value.toString() : value;
    }
  }, {
    key: "handlePopupAnimateEnd",
    value: function handlePopupAnimateEnd(_key, _exists) {// noop
    }
  }, {
    key: "handleMenuClick",
    value: function handleMenuClick(_ref6) {
      var key = _ref6.key,
          value = _ref6.item.props.value;

      if (key === MORE_KEY) {
        var searchMatcher = this.searchMatcher,
            searchText = this.searchText;
        this.options.queryMore(this.options.currentPage + 1, (0, _isString["default"])(searchMatcher) ? this.getSearchPara(searchMatcher, searchText) : undefined);
      } else if (this.multiple && this.isSelected(value)) {
        this.unChoose(value);
      } else {
        this.choose(value);
      }
    }
  }, {
    key: "handleCommonItemClick",
    value: function handleCommonItemClick(value) {
      if (this.multiple && this.isSelected(value)) {
        this.unChoose(value);
      } else {
        this.choose(value);
      }
    }
  }, {
    key: "handleOptionSelect",
    value: function handleOptionSelect(record) {
      this.prepareSetValue.apply(this, (0, _toConsumableArray2["default"])((0, _mobx.isArrayLike)(record) ? record.map(this.processRecordToObject, this) : [this.processRecordToObject(record)]));
    }
  }, {
    key: "handleOptionUnSelect",
    value: function handleOptionUnSelect(record) {
      var valueField = this.valueField;
      var newValues = (0, _mobx.isArrayLike)(record) ? record.map(function (r) {
        return r.get(valueField);
      }) : [record.get(valueField)];
      this.removeValues(newValues, -1);
    }
  }, {
    key: "multipleSearch",
    value: function multipleSearch(text) {
      if (this.multiple && this.searchable && !isSearchTextEmpty(text)) {
        this.setText(text);
      }
    }
  }, {
    key: "handleSearch",
    value: function handleSearch(_text) {// noop
    }
  }, {
    key: "setValue",
    value: function setValue(value, noVaidate) {
      if (this.reserveParam && this.multiple && this.searchable && !isSearchTextEmpty(this.searchText)) {
        (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "setValue", this).call(this, value, noVaidate, true);
      } else {
        (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "setValue", this).call(this, value, noVaidate);
      }
    }
  }, {
    key: "setText",
    value: function setText(text) {
      var isDifference = this.searchText !== text;
      (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "setText", this).call(this, text);

      if (this.searchable && !this.isSearchFieldInPopup() && isDifference) {
        this.doSearch(text);
      }
    }
  }, {
    key: "getSearchPara",
    value: function getSearchPara(searchMatcher, value) {
      var paramMatcher = this.paramMatcher;

      if ((0, _isString["default"])(paramMatcher)) {
        if ((0, _mobx.isArrayLike)(value)) {
          return (0, _defineProperty2["default"])({}, searchMatcher, value.map(function (v) {
            return "".concat(v || '').concat(paramMatcher);
          }));
        }

        return (0, _defineProperty2["default"])({}, searchMatcher, "".concat(value || '').concat(paramMatcher));
      }

      if ((0, _isFunction["default"])(paramMatcher)) {
        var record = this.record,
            textField = this.textField,
            valueField = this.valueField;
        var searchPara = paramMatcher({
          record: record,
          text: value,
          textField: textField,
          valueField: valueField,
          key: searchMatcher
        });

        if (searchPara) {
          if ((0, _isString["default"])(searchPara)) {
            return (0, _defineProperty2["default"])({}, searchMatcher, value);
          }

          return searchPara;
        }
      }

      return (0, _defineProperty2["default"])({}, searchMatcher, value);
    }
  }, {
    key: "searchRemote",
    value: function searchRemote(text) {
      var searchMatcher = this.searchMatcher;

      if ((0, _isString["default"])(searchMatcher)) {
        var searchPara = this.getSearchPara(searchMatcher, text);
        var field = this.field,
            record = this.record;
        var options = field && field.get('options', record) || this.observableProps.options;
        Object.keys(searchPara).forEach(function (key) {
          var value = searchPara[key];
          var lovPara = value === '' ? undefined : value;

          if (options) {
            options.query(undefined, (0, _defineProperty2["default"])({}, key, lovPara));
          } else if (field) {
            field.setLovPara(key, lovPara);
          }
        });
      }
    }
    /**
     * 该方法会被onChange和onCompositionend触发
     * @param e 改变事件
     */

  }, {
    key: "handleChange",
    value: function handleChange(e) {
      var _this11 = this;

      var target = e.target,
          value = e.target.value,
          type = e.type;
      var restricted = this.restrictInput(value);

      if (restricted !== value) {
        var selectionEnd = target.selectionEnd + restricted.length - value.length;
        target.value = restricted;
        target.setSelectionRange(selectionEnd, selectionEnd);
      }

      this.setText(restricted);

      if (this.observableProps.combo) {
        if (type !== 'compositionend') {
          this.generateComboOption(restricted, function (text) {
            return _this11.setText(text);
          });
        }
      }

      if (!this.popup) {
        this.expand();
      }
    }
  }, {
    key: "processRecordToObject",
    value: function processRecordToObject(record) {
      // 如果为原始值那么 restricted 失效
      return this.primitive ? this.restrictInput(record.get(this.valueField)) : record.toData();
    }
  }, {
    key: "processObjectValue",
    value: function processObjectValue(value, textField) {
      if (!(0, _isNil["default"])(value)) {
        if ((0, _isPlainObject["default"])(value)) {
          return _ObjectChainValue["default"].get(value, textField);
        }

        var found = this.findByValue(value);

        if (found) {
          return found.get(textField);
        }
      }
    }
  }, {
    key: "processLookupValue",
    value: function processLookupValue(value) {
      var field = this.field,
          textField = this.textField,
          primitive = this.primitive,
          record = this.record;

      if (primitive && field && field.getLookup(record)) {
        return (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "processValue", this).call(this, field.getText(value, undefined, record));
      }

      return (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "processValue", this).call(this, this.processObjectValue(value, textField));
    }
  }, {
    key: "processValue",
    value: function processValue(value) {
      var text = this.processLookupValue(value);

      if ((0, _isEmpty2["default"])(text)) {
        if ((0, _isPlainObject["default"])(value)) {
          return _ObjectChainValue["default"].get(value, this.valueField) || '';
        }

        return (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "processValue", this).call(this, value);
      }

      return text;
    }
  }, {
    key: "clear",
    value: function clear() {
      var _this12 = this;

      var values = this.getValues();
      var _this$props5 = this.props,
          _this$props5$maxTagCo = _this$props5.maxTagCount,
          maxTagCount = _this$props5$maxTagCo === void 0 ? this.getContextConfig('fieldMaxTagCount') : _this$props5$maxTagCo,
          _this$props5$onClear = _this$props5.onClear,
          onClear = _this$props5$onClear === void 0 ? _noop["default"] : _this$props5$onClear,
          _this$props5$onOption = _this$props5.onOption,
          onOption = _this$props5$onOption === void 0 ? _noop["default"] : _this$props5$onOption,
          options = this.options;
      this.setText(undefined);

      if (this.multiple) {
        var valuesDisabled = values.slice(0, maxTagCount).filter(function (v) {
          var recordItem = _this12.findByValue(v);

          var findRecord = _this12.findByValue(v);

          var optionProps = findRecord ? onOption({
            dataSet: options,
            record: findRecord
          }) : undefined;
          var optionDisabled = optionProps && optionProps.disabled;
          return recordItem && recordItem.get(DISABLED_FIELD) === true || optionDisabled;
        });
        var multipleValue = valuesDisabled.length > 0 ? valuesDisabled : this.emptyValue;
        this.setValue(multipleValue);
      } else {
        this.setValue(this.emptyValue);
      }

      this.rangeValue = this.isFocused ? [undefined, undefined] : undefined;
      onClear();
      this.removeComboOptions();
    } // 当触发清空操作时候会导致两次触发onchange可搜索不需要设置值

  }, {
    key: "setRangeTarget",
    value: function setRangeTarget(target) {
      var _this13 = this;

      if (this.text !== undefined) {
        if (!this.searchable || this.isSearchFieldInPopup()) {
          this.prepareSetValue(this.text);
        }

        this.setText();
      }

      (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "setRangeTarget", this).call(this, target);
      (0, _defer["default"])(function () {
        return _this13.isFocused && _this13.select();
      });
    }
  }, {
    key: "resetFilter",
    value: function resetFilter() {
      this.setText(undefined);
      this.removeComboOption();
      this.forcePopupAlign();
    }
  }, {
    key: "reset",
    value: function reset() {
      (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "reset", this).call(this);
      this.resetFilter();
    }
  }, {
    key: "unChoose",
    value: function unChoose(record) {
      if (record) {
        this.handleOptionUnSelect(record);
      }
    }
  }, {
    key: "choose",
    value: function choose(record) {
      if (!this.multiple) {
        this.collapse();
      }

      if (record) {
        this.handleOptionSelect(record);
      }
    }
  }, {
    key: "optionIsSelected",
    value: function optionIsSelected(record, values) {
      var valueField = this.valueField;
      var value = record.get(valueField);
      return values.some(function (v) {
        if ((0, _typeof2["default"])(v) === 'object') {
          return v[valueField] === value;
        }

        return v === value;
      });
    }
  }, {
    key: "chooseAll",
    value: function chooseAll() {
      var _this14 = this;

      var options = this.options,
          onOption = this.props.onOption;
      var values = this.getValues();
      var selectedOptions = this.filteredOptions.filter(function (record) {
        var optionProps = onOption({
          dataSet: options,
          record: record
        });
        var optionDisabled = optionProps && optionProps.disabled;
        return !optionDisabled && !_this14.optionIsSelected(record, values);
      });
      this.choose(selectedOptions);
    }
    /**
     * 反选
     */

  }, {
    key: "chooseRe",
    value: function chooseRe() {
      var _this15 = this;

      var options = this.options,
          onOption = this.props.onOption;
      var values = this.getValues();
      var selectedOptions = this.filteredOptions.filter(function (record) {
        var optionProps = onOption({
          dataSet: options,
          record: record
        });
        var optionDisabled = optionProps && optionProps.disabled;

        var optionIsSelect = _this15.optionIsSelected(record, values);

        return !optionDisabled && !optionIsSelect || optionDisabled && optionIsSelect;
      });
      this.setValue(selectedOptions.map(this.processRecordToObject, this));
    }
  }, {
    key: "unChooseAll",
    value: function unChooseAll() {
      this.clear();
    }
  }, {
    key: "handlePopupHiddenChange",
    value: function handlePopupHiddenChange(hidden) {
      var noCache = this.getProp('noCache');

      if (!hidden) {
        var field = this.field;

        if (field) {
          field.fetchLookup(noCache, this.record);
        }

        this.forcePopupAlign();
      }

      (0, _get2["default"])((0, _getPrototypeOf2["default"])(Select.prototype), "handlePopupHiddenChange", this).call(this, hidden);
    }
  }, {
    key: "processSelectedData",
    value: function () {
      var _processSelectedData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
        var _this16 = this;

        var comboOptions, values, field, filteredOptions, combo;
        return _regenerator["default"].wrap(function _callee$(_context) {
          while (1) {
            switch (_context.prev = _context.next) {
              case 0:
                comboOptions = this.comboOptions;

                if (comboOptions) {
                  comboOptions.removeAll();
                }

                values = this.getValues();
                field = this.field;

                if (!field) {
                  _context.next = 7;
                  break;
                }

                _context.next = 7;
                return field.ready();

              case 7:
                filteredOptions = this.filteredOptions, combo = this.observableProps.combo;
                (0, _mobx.runInAction)(function () {
                  var newValues = values.filter(function (value) {
                    var record = _this16.findByValue(value);

                    if (record) {
                      return true;
                    }

                    if (combo) {
                      _this16.createComboOption(value);

                      return true;
                    }

                    return false;
                  });

                  if (_this16.text && combo) {
                    _this16.generateComboOption(_this16.text);
                  }

                  if (field && field.get('cascadeMap', _this16.record) && filteredOptions.length && !(0, _isEqual["default"])(newValues, values)) {
                    _this16.setValue(_this16.multiple ? newValues : newValues[0]);
                  }
                });

              case 9:
              case "end":
                return _context.stop();
            }
          }
        }, _callee, this);
      }));

      function processSelectedData() {
        return _processSelectedData.apply(this, arguments);
      }

      return processSelectedData;
    }()
  }, {
    key: "searchData",
    value: function searchData(data) {
      var _this17 = this;

      var searchable = this.searchable,
          searchMatcher = this.searchMatcher,
          searchText = this.searchText;
      return searchable && typeof searchMatcher === 'function' && !isSearchTextEmpty(searchText) ? data.filter(function (r) {
        return _this17.matchRecordBySearch(r, searchText);
      }) : data;
    }
  }, {
    key: "matchRecordBySearch",
    value: function matchRecordBySearch(record, text) {
      var textField = this.textField,
          valueField = this.valueField,
          searchable = this.searchable,
          searchMatcher = this.searchMatcher;
      return !searchable || typeof searchMatcher !== 'function' || searchMatcher({
        record: record,
        text: text,
        textField: textField,
        valueField: valueField,
        value: record.get(valueField),
        props: record.get(_normalizeOptions.OTHER_OPTION_PROPS)
      });
    }
  }, {
    key: "renderLengthInfo",
    value: function renderLengthInfo(_maxLength) {
      return undefined;
    }
  }]);
  return Select;
}(_TriggerField2["default"]);

exports.Select = Select;
Select.displayName = 'Select';
Select.defaultProps = (0, _objectSpread3["default"])((0, _objectSpread3["default"])({}, _TriggerField2["default"].defaultProps), {}, {
  suffixCls: 'select',
  combo: false,
  checkValueOnOptionsChange: true,
  onOption: defaultOnOption,
  selectAllButton: true
});
Select.Option = _Option["default"];
Select.OptGroup = _OptGroup["default"];
Select.__PRO_SELECT = true;
(0, _tslib.__decorate)([_mobx.observable], Select.prototype, "comboOptions", void 0);
(0, _tslib.__decorate)([_mobx.observable], Select.prototype, "$searchText", void 0);
(0, _tslib.__decorate)([_mobx.computed], Select.prototype, "filteredOptions", null);
(0, _tslib.__decorate)([_mobx.computed], Select.prototype, "optionsWithCombo", null);
(0, _tslib.__decorate)([_mobx.computed], Select.prototype, "cascadeOptions", null);
(0, _tslib.__decorate)([_mobx.computed], Select.prototype, "options", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "saveMenu", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "getMenu", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "getPopupProps", null);
(0, _tslib.__decorate)([_autobind["default"], _mobx.action], Select.prototype, "handlePopupSearch", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "renderSearchField", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "getPopupStyleFromAlign", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "handleKeyDown", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "isMultipleBlockDisabled", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "handleBlur", null);
(0, _tslib.__decorate)([_mobx.action], Select.prototype, "createComboOption", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "getValueKey", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "handlePopupAnimateEnd", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "handleMenuClick", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "handleCommonItemClick", null);
(0, _tslib.__decorate)([_mobx.action], Select.prototype, "setValue", null);
(0, _tslib.__decorate)([_mobx.action], Select.prototype, "setText", null);
(0, _tslib.__decorate)([_autobind["default"], _mobx.action], Select.prototype, "handleChange", null);
(0, _tslib.__decorate)([_mobx.action], Select.prototype, "clear", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "reset", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "chooseAll", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "chooseRe", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "unChooseAll", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "handlePopupHiddenChange", null);
(0, _tslib.__decorate)([_autobind["default"]], Select.prototype, "matchRecordBySearch", null);

var ObserverSelect = /*#__PURE__*/function (_Select) {
  (0, _inherits2["default"])(ObserverSelect, _Select);

  var _super2 = (0, _createSuper2["default"])(ObserverSelect);

  function ObserverSelect() {
    (0, _classCallCheck2["default"])(this, ObserverSelect);
    return _super2.apply(this, arguments);
  }

  return (0, _createClass2["default"])(ObserverSelect);
}(Select);

ObserverSelect.defaultProps = Select.defaultProps;
ObserverSelect.Option = _Option["default"];
ObserverSelect.OptGroup = _OptGroup["default"];
ObserverSelect.__PRO_SELECT = true;
ObserverSelect = (0, _tslib.__decorate)([_mobxReact.observer], ObserverSelect);
var _default = ObserverSelect;
exports["default"] = _default;
//# sourceMappingURL=Select.js.map
