"use strict";

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

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

var _propTypes = _interopRequireDefault(require("prop-types"));

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

var _configProvider = _interopRequireDefault(require("../config-provider"));

var _input = _interopRequireDefault(require("../input"));

var _select = _interopRequireDefault(require("../select"));

var _button = _interopRequireDefault(require("../button"));

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

var _util = require("../util");

var _zhCn = _interopRequireDefault(require("../locale/zh-cn"));

var _this2 = void 0;

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

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 _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }

function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }

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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

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 _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

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); }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

var Group = _input["default"].Group;
var AutoComplete = _select["default"].AutoComplete;
/**
 * Search
 * @description 输入框部分继承 Select.AutoComplete 的能力，可以直接用AutoComplete 的 api
 */

var Search =
/*#__PURE__*/
function (_React$Component) {
  _inherits(Search, _React$Component);

  function Search(props) {
    var _this;

    _classCallCheck(this, Search);

    _this = _possibleConstructorReturn(this, _getPrototypeOf(Search).call(this, props));

    _defineProperty(_assertThisInitialized(_this), "inputRef", _react["default"].createRef());

    _defineProperty(_assertThisInitialized(_this), "autoCompleteRef", _react["default"].createRef());

    _defineProperty(_assertThisInitialized(_this), "onChange", function (value) {
      var _this$props;

      if (!('value' in _this.props)) {
        _this.setState({
          value: value
        });
      }

      for (var _len = arguments.length, argv = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
        argv[_key - 1] = arguments[_key];
      }

      (_this$props = _this.props).onChange.apply(_this$props, [value].concat(argv));
    });

    _defineProperty(_assertThisInitialized(_this), "onSearch", function () {
      if (_this.props.disabled) {
        return;
      }

      _this.props.onSearch(_this.state.value, _this.state.filterValue);
    });

    _defineProperty(_assertThisInitialized(_this), "onFilterChange", function (filterValue) {
      if (!('filterValue' in _this.props)) {
        _this.setState({
          filterValue: filterValue
        });
      }

      _this.props.onFilterChange(filterValue);
    });

    _defineProperty(_assertThisInitialized(_this), "onKeyDown", function (e) {
      if (_this.props.disabled) {
        return;
      }

      if (e.keyCode !== _util.KEYCODE.ENTER) {
        return;
      }

      _this.onSearch();
    });

    _defineProperty(_assertThisInitialized(_this), "focus", function () {
      if (_this.props.disabled) {
        return;
      }

      _this.inputRef.current && _this.inputRef.current.focus();

      if (_this.autoCompleteRef.current && _this.autoCompleteRef.current.getInstance) {
        var ins = _this.autoCompleteRef.current.getInstance();

        ins && ins.focusInput && ins.focusInput();
      }

      _this.setState({
        searchFocus: true
      });
    });

    _defineProperty(_assertThisInitialized(_this), "onClickMask", function () {
      _this.focus();
    });

    _defineProperty(_assertThisInitialized(_this), "onInputFocus", function () {
      _this.setState({
        searchFocus: true
      });

      if (typeof _this.props.onFocus === 'function') {
        _this.props.onFocus();
      }
    });

    _defineProperty(_assertThisInitialized(_this), "onInputBlur", function () {
      _this.setState({
        searchFocus: false
      });

      if (typeof _this.props.onBlur === 'function') {
        _this.props.onBlur();
      }
    });

    _defineProperty(_assertThisInitialized(_this), "renderAddonAfter", function () {
      var _this$props2 = _this.props,
          prefix = _this$props2.prefix,
          type = _this$props2.type,
          addonAfter = _this$props2.addonAfter;

      if (type !== 'normal' || !addonAfter) {
        return null;
      }

      return _react["default"].createElement("span", {
        className: "".concat(prefix, "search-addon-after")
      }, addonAfter);
    });

    var _value = 'value' in props ? props.value : props.defaultValue;

    var _filterValue = 'filterValue' in props ? props.filterValue : props.defaultFilterValue;

    _this.state = {
      value: typeof _value === 'undefined' ? '' : _value,
      filterValue: _filterValue,
      searchFocus: props.autoFocus && !props.disabled ? true : -1 //  -1 or boolean

    };
    return _this;
  }

  _createClass(Search, [{
    key: "UNSAFE_componentWillReceiveProps",
    value: function UNSAFE_componentWillReceiveProps(nextProps) {
      var state = {};

      if ('value' in nextProps) {
        state.value = typeof nextProps.value === 'undefined' ? '' : nextProps.value;
      }

      if ('filterValue' in nextProps) {
        state.filterValue = typeof nextProps.filterValue === 'undefined' ? '' : nextProps.filterValue;
      }

      this.setState(state);
    }
  }, {
    key: "renderInputMask",
    value: function renderInputMask() {
      var _this$props3 = this.props,
          prefix = _this$props3.prefix,
          disabled = _this$props3.disabled,
          placeholder = _this$props3.placeholder;
      return _react["default"].createElement("div", {
        className: "".concat(prefix, "search-mask"),
        onClick: this.onClickMask
      }, _react["default"].createElement(_icon["default"], {
        type: "search",
        "aria-disabled": disabled
      }), _react["default"].createElement("span", {
        className: "".concat(prefix, "search-mask-text")
      }, placeholder));
    }
  }, {
    key: "renderInput",
    value: function renderInput() {
      var _this$props4 = this.props,
          hasClear = _this$props4.hasClear,
          disabled = _this$props4.disabled,
          placeholder = _this$props4.placeholder,
          autoFocus = _this$props4.autoFocus;
      return _react["default"].createElement(_input["default"], {
        ref: this.inputRef,
        autoFocus: autoFocus,
        hasClear: hasClear,
        disabled: disabled,
        placeholder: this.state.searchFocus === true ? placeholder : undefined,
        value: this.state.value,
        onChange: this.onChange,
        onFocus: this.onInputFocus,
        onBlur: this.onInputBlur
      });
    }
  }, {
    key: "renderSearchButton",
    value: function renderSearchButton() {
      var _classNames;

      var _this$props5 = this.props,
          buttonProps = _this$props5.buttonProps,
          disabled = _this$props5.disabled,
          locale = _this$props5.locale,
          hasIcon = _this$props5.hasIcon,
          prefix = _this$props5.prefix,
          searchText = _this$props5.searchText;
      var buttonCls = (0, _classnames["default"])((_classNames = {}, _defineProperty(_classNames, "".concat(prefix, "search-btn"), true), _defineProperty(_classNames, buttonProps.className, !!buttonProps.className), _classNames));
      return _react["default"].createElement(_button["default"], _extends({
        tabIndex: "0",
        "aria-disabled": disabled,
        "aria-label": locale.buttonText,
        className: buttonCls,
        disabled: disabled
      }, buttonProps, {
        onClick: this.onSearch,
        onKeyDown: this.onKeyDown
      }), hasIcon ? _react["default"].createElement(_icon["default"], {
        type: "search"
      }) : null, searchText ? _react["default"].createElement("span", {
        className: "".concat(prefix, "search-btn-text")
      }, searchText) : null);
    }
  }, {
    key: "renderSearchIcon",
    value: function renderSearchIcon() {
      var _classNames2;

      var _this$props6 = this.props,
          buttonProps = _this$props6.buttonProps,
          disabled = _this$props6.disabled,
          locale = _this$props6.locale,
          hasIcon = _this$props6.hasIcon,
          prefix = _this$props6.prefix;
      var iconCls = (0, _classnames["default"])((_classNames2 = {}, _defineProperty(_classNames2, "".concat(prefix, "search-icon"), true), _defineProperty(_classNames2, buttonProps.className, !!buttonProps.className), _classNames2));
      return hasIcon && _react["default"].createElement(_icon["default"], _extends({
        type: "search",
        tabIndex: "0",
        role: "button",
        "aria-disabled": disabled,
        "aria-label": locale.buttonText
      }, buttonProps, {
        className: iconCls,
        onClick: this.onSearch,
        onKeyDown: this.onKeyDown
      }));
    }
  }, {
    key: "render",
    value: function render() {
      var _classNames3;

      var _this$props7 = this.props,
          shape = _this$props7.shape,
          autoFocus = _this$props7.autoFocus,
          filter = _this$props7.filter,
          hasIcon = _this$props7.hasIcon,
          disabled = _this$props7.disabled,
          placeholder = _this$props7.placeholder,
          type = _this$props7.type,
          className = _this$props7.className,
          style = _this$props7.style,
          prefix = _this$props7.prefix,
          searchText = _this$props7.searchText,
          dataSource = _this$props7.dataSource,
          filterProps = _this$props7.filterProps,
          buttonProps = _this$props7.buttonProps,
          popupContent = _this$props7.popupContent,
          followTrigger = _this$props7.followTrigger,
          hasClear = _this$props7.hasClear,
          visible = _this$props7.visible,
          locale = _this$props7.locale,
          rtl = _this$props7.rtl,
          others = _objectWithoutProperties(_this$props7, ["shape", "autoFocus", "filter", "hasIcon", "disabled", "placeholder", "type", "className", "style", "prefix", "searchText", "dataSource", "filterProps", "buttonProps", "popupContent", "followTrigger", "hasClear", "visible", "locale", "rtl"]);

      var cls = (0, _classnames["default"])((_classNames3 = {}, _defineProperty(_classNames3, "".concat(prefix, "search"), true), _defineProperty(_classNames3, "".concat(prefix, "search-disabled"), disabled), _defineProperty(_classNames3, "".concat(prefix, "search-").concat(shape), true), _defineProperty(_classNames3, "".concat(prefix).concat(type), type), _defineProperty(_classNames3, "".concat(prefix, "medium"), true), _defineProperty(_classNames3, "".concat(prefix, "search-focus"), this.state.searchFocus === true), _defineProperty(_classNames3, className, !!className), _classNames3));
      var searchIcon = null;
      var searchBtn = null;
      var filterSelect = null;

      if (shape === 'simple') {
        searchIcon = this.renderSearchIcon();
      } else {
        searchBtn = this.renderSearchButton();
      }

      if (filter.length > 0) {
        filterSelect = _react["default"].createElement(_select["default"], _extends({}, filterProps, {
          followTrigger: followTrigger,
          hasBorder: false,
          dataSource: filter,
          disabled: disabled,
          value: this.state.filterValue,
          onChange: this.onFilterChange
        }));
      }

      var othersAttributes = _util.obj.pickOthers(Search.propTypes, others);

      if (visible !== undefined) {
        // 受控属性 visible 不能直接写在组件上
        othersAttributes.visible = Boolean(visible);
      }

      var dataAttr = _util.obj.pickAttrsWith(others, 'data-');

      var left = _react["default"].createElement(Group, {
        addonBefore: filterSelect,
        className: "".concat(prefix, "search-left"),
        addonBeforeClassName: "".concat(prefix, "search-left-addon"),
        addonAfter: this.renderAddonAfter()
      }, _react["default"].createElement(AutoComplete, _extends({
        "aria-label": locale.buttonText,
        showEmpty: false
      }, othersAttributes, {
        autoFocus: autoFocus,
        followTrigger: followTrigger,
        role: "searchbox",
        hasClear: hasClear,
        className: "".concat(prefix, "search-input"),
        placeholder: placeholder,
        dataSource: dataSource,
        innerBefore: searchIcon,
        onPressEnter: this.onSearch,
        value: this.state.value,
        onChange: this.onChange,
        onFocus: this.onInputFocus,
        onBlur: this.onInputBlur,
        popupContent: popupContent,
        disabled: disabled,
        ref: this.autoCompleteRef
      })));

      if (type === 'nav-search') {
        var _classNames4;

        var wrapCls = (0, _classnames["default"])((_classNames4 = {}, _defineProperty(_classNames4, "".concat(prefix, "search"), true), _defineProperty(_classNames4, "".concat(prefix).concat(type), type), _defineProperty(_classNames4, "".concat(prefix, "search-disabled"), disabled), _defineProperty(_classNames4, "".concat(prefix, "search-init"), this.state.searchFocus === -1), _defineProperty(_classNames4, "".concat(prefix, "search-focus"), this.state.searchFocus === true), _defineProperty(_classNames4, "".concat(prefix, "search-has-query"), !!this.state.value), _defineProperty(_classNames4, className, !!className), _classNames4));
        return _react["default"].createElement("span", _extends({
          className: wrapCls,
          style: style,
          dir: rtl ? 'rtl' : undefined
        }, dataAttr), this.renderInputMask(), this.renderInput());
      }

      return _react["default"].createElement("span", _extends({
        className: cls,
        style: style
      }, dataAttr, {
        dir: rtl ? 'rtl' : undefined
      }), searchBtn ? _react["default"].createElement(Group, {
        addonAfter: searchBtn
      }, left) : left);
    }
  }]);

  return Search;
}(_react["default"].Component);

_defineProperty(Search, "displayName", 'Search');

_defineProperty(Search, "propTypes", {
  /**
   * 样式前缀
   */
  prefix: _propTypes["default"].string,

  /**
   * 样式前缀
   */
  autoFocus: _propTypes["default"].bool,

  /**
   * 形状
   */
  shape: _propTypes["default"].oneOf(['normal', 'simple']),

  /**
   * 类型 shape=normal: primary/secondary; shape=simple: normal/dark/nav-search;
   */
  type: _propTypes["default"].oneOf(['primary', 'secondary', 'normal', 'dark', 'nav-search']),

  /**
   * 后缀，仅在type为normal时有效
   */
  addonAfter: _propTypes["default"].node,

  /**
   * 搜索框默认值
   */
  defaultValue: _propTypes["default"].string,

  /**
   * 搜索框数值
   */
  value: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),

  /**
   * 输入关键字时的回掉
   * @param {Object} value 输入值
   */
  onChange: _propTypes["default"].func,

  /**
   * 点击搜索按钮触发的回调
   * @param {Object} value 输入值
   */
  onSearch: _propTypes["default"].func,

  /**
   * 选择器默认值
   */
  defaultFilterValue: _propTypes["default"].string,

  /**
   * 选择器
   */
  filter: _propTypes["default"].array,

  /**
   * 选择器值
   */
  filterValue: _propTypes["default"].string,

  /**
   * 选择器发生变化时回调
   * @param {Object} filter value
   */
  onFilterChange: _propTypes["default"].func,

  /**
   * 搜索框下拉联想列表
   */
  dataSource: _propTypes["default"].array,

  /**
   * 默认提示
   */
  placeholder: _propTypes["default"].string,

  /**
   * button 的内容
   */
  searchText: _propTypes["default"].node,

  /**
   * 自定义样式
   */
  style: _propTypes["default"].object,

  /**
   * 样式名称
   */
  className: _propTypes["default"].string,

  /**
   * 选择器的props
   */
  filterProps: _propTypes["default"].object,

  /**
   * 按钮的额外属性
   */
  buttonProps: _propTypes["default"].object,

  /**
   * 自定义渲染的的下拉框
   */
  popupContent: _propTypes["default"].node,

  /**
   * 是否跟随滚动
   */
  followTrigger: _propTypes["default"].bool,

  /**
   * 自定义渲染的的下拉框
   */
  visible: _propTypes["default"].bool,

  /**
   * 是否显示清除按钮
   */
  hasClear: _propTypes["default"].bool,

  /**
   * 是否显示搜索按钮
   */
  hasIcon: _propTypes["default"].bool,

  /**
   * 是否禁用
   */
  disabled: _propTypes["default"].bool,
  locale: _propTypes["default"].object,
  rtl: _propTypes["default"].bool,
  onFocus: _propTypes["default"].func,
  onBlur: _propTypes["default"].func
});

_defineProperty(Search, "defaultProps", {
  prefix: 'next-',
  shape: 'simple',
  type: 'normal',
  hasIcon: true,
  filter: [],
  locale: _zhCn["default"].Search,
  buttonProps: {},
  onChange: _util.func.noop,
  onSearch: _util.func.noop,
  onFilterChange: _util.func.noop,
  autoFocus: false,
  hasClear: true,
  disabled: false
});

var _default = _configProvider["default"].config(Search, {
  transfrom:
  /* istanbul ignore next */
  function transfrom(props, deprecated) {
    var _this2$props = _this2.props,
        onInputFocus = _this2$props.onInputFocus,
        overlayVisible = _this2$props.overlayVisible,
        combox = _this2$props.combox,
        others = _objectWithoutProperties(_this2$props, ["onInputFocus", "overlayVisible", "combox"]);

    var newprops = others;

    if (onInputFocus) {
      deprecated('onInputFocus', 'onFocus', 'Search');
      newprops.onFocus = onInputFocus;
    }

    if ('overlayVisible' in _this2.props) {
      deprecated('overlayVisible', 'visible', 'Search');
      newprops.visible = overlayVisible;
    }

    if (combox) {
      deprecated('combox', 'popupContent', 'Search');
      newprops.popupContent = combox;
    }

    return newprops;
  }
});

exports["default"] = _default;