"use strict";

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

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

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

require("maycur-antd/lib/modal/style/css");

var _modal = _interopRequireDefault(require("maycur-antd/lib/modal"));

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

require("maycur-antd/lib/list/style/css");

var _list = _interopRequireDefault(require("maycur-antd/lib/list"));

require("maycur-antd/lib/alert/style/css");

var _alert = _interopRequireDefault(require("maycur-antd/lib/alert"));

require("maycur-antd/lib/tabs/style/css");

var _tabs = _interopRequireDefault(require("maycur-antd/lib/tabs"));

require("maycur-antd/lib/button/style/css");

var _button = _interopRequireDefault(require("maycur-antd/lib/button"));

require("maycur-antd/lib/checkbox/style/css");

var _checkbox = _interopRequireDefault(require("maycur-antd/lib/checkbox"));

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

require("maycur-antd/lib/message/style/css");

var _message2 = _interopRequireDefault(require("maycur-antd/lib/message"));

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

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

var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));

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

var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));

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

require("maycur-antd/lib/breadcrumb/style/css");

var _breadcrumb = _interopRequireDefault(require("maycur-antd/lib/breadcrumb"));

require("maycur-antd/lib/input/style/css");

var _input = _interopRequireDefault(require("maycur-antd/lib/input"));

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

var _reactDom = _interopRequireDefault(require("react-dom"));

var _lodash = _interopRequireDefault(require("lodash"));

var _RegionList = _interopRequireDefault(require("./RegionList/RegionList"));

var _utils = _interopRequireDefault(require("../utils/utils"));

var _index = _interopRequireDefault(require("../PureJs/index"));

var _mkTranslate = _interopRequireDefault(require("../utils/mkTranslate"));

function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }

function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && 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 ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }

function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }

var prefix = _utils.default.prefixCls; // import constants from 'utils/constants';
// const { LOCATION_PICKER } = constants;

var Search = _input.default.Search;
var BreadItem = _breadcrumb.default.Item;
var FETCH_CITIES_FOR = 'FETCH_CITIES_FOR';
var locationConvertor = _index.default.locationConvertor;

var RegionSelection = /*#__PURE__*/function (_Component) {
  (0, _inherits2.default)(RegionSelection, _Component);

  var _super = _createSuper(RegionSelection);

  function RegionSelection(props) {
    var _this;

    (0, _classCallCheck2.default)(this, RegionSelection);
    _this = _super.call(this, props);

    _this.preCheck = function (result) {
      var maxSelectLength = _this.props.maxSelectLength;
      var added = result.added,
          removed = result.removed;
      var selectList = _this.state.selectList,
          valid = true;
      selectList = _lodash.default.differenceWith(selectList, removed, _lodash.default.isEqual);
      selectList = _lodash.default.unionWith(selectList, added, _lodash.default.isEqual);

      if (maxSelectLength > 0 && selectList.length >= maxSelectLength) {
        _message2.default.warning('超出限制，最多只能选择' + maxSelectLength + '项');

        valid = false;
      }

      return valid;
    };

    _this.onTabsChange = function (activeKey) {
      _this.setState(function (prev) {
        return {
          activeKey: activeKey,
          sourceList: prev.originalData[activeKey],
          breads: [{
            name: activeKey === 'domestic' ? _this.t('china') : _this.t('abroad'),
            code: activeKey,
            children: prev.originalData[activeKey]
          }]
        };
      });
    };

    _this.state = {
      sourceList: [],
      searchList: [],
      breads: [{
        name: '中国',
        code: 'domestic'
      }],
      selectList: props.selectList || [],
      allSelected: false,
      searchKeyword: null,
      activeKey: 'domestic'
    };
    _this.t = _mkTranslate.default.getLocalNs('MK_RegionSelection', (0, _assertThisInitialized2.default)(_this));
    _this.onSearch = _this.onSearch.bind((0, _assertThisInitialized2.default)(_this));
    _this.clearSearch = _this.clearSearch.bind((0, _assertThisInitialized2.default)(_this));
    _this.closeSelf = _this.closeSelf.bind((0, _assertThisInitialized2.default)(_this));
    _this.unSelectItem = _this.unSelectItem.bind((0, _assertThisInitialized2.default)(_this));
    _this.clearAll = _this.clearAll.bind((0, _assertThisInitialized2.default)(_this));
    _this.onOutput = _this.onOutput.bind((0, _assertThisInitialized2.default)(_this));
    _this.fetchSourceList = _this.fetchSourceList.bind((0, _assertThisInitialized2.default)(_this));
    _this.fetchSearchList = _this.fetchSearchList.bind((0, _assertThisInitialized2.default)(_this));
    _this.onDrillDown = _this.onDrillDown.bind((0, _assertThisInitialized2.default)(_this));
    _this.goToBread = _this.goToBread.bind((0, _assertThisInitialized2.default)(_this));
    _this.onOk = _this.onOk.bind((0, _assertThisInitialized2.default)(_this));
    _this.scrollBottom = _this.scrollBottom.bind((0, _assertThisInitialized2.default)(_this));
    return _this;
  }

  (0, _createClass2.default)(RegionSelection, [{
    key: "onSearch",
    value: function onSearch(value) {
      value = _lodash.default.trim(value);
      this.setState({
        searchKeyword: value
      });

      if (value) {
        this.fetchSearchList(value);
      } else {
        this.setState({
          searchList: []
        });
      }
    }
  }, {
    key: "clearSearch",
    value: function clearSearch() {
      if (this.searchRef) {
        var dom = _reactDom.default.findDOMNode(this.searchRef);

        var input = dom.getElementsByTagName('input')[0];
        input.value = '';
      }

      this.setState({
        searchKeyword: null,
        searchList: []
      });
    }
  }, {
    key: "goToBread",
    value: function goToBread(bread) {
      var breads = this.state.breads;
      breads = _lodash.default.dropRightWhile(breads, function (item) {
        return item.code !== bread.code;
      });
      this.setState({
        breads: breads,
        sourceList: bread.children
      });
    }
  }, {
    key: "unSelectItem",
    value: function unSelectItem(item) {
      var selectList = this.state.selectList;

      var idx = _lodash.default.findIndex(selectList, {
        code: item.code
      });

      if (idx !== -1) {
        selectList.splice(idx, 1);
      }

      this.setState({
        selectList: selectList
      });
    }
  }, {
    key: "clearAll",
    value: function clearAll() {
      this.setState({
        selectList: []
      });
    }
  }, {
    key: "closeSelf",
    value: function closeSelf() {
      var onCancel = this.props.onCancel;

      if (typeof onCancel === 'function') {
        onCancel();
      }
    }
  }, {
    key: "onOutput",
    value: function onOutput(result) {
      var _this2 = this;

      var added = result.added,
          removed = result.removed;
      var selectList = this.state.selectList;
      selectList = _lodash.default.differenceWith(selectList, removed, _utils.default.bizEquals);
      selectList = _lodash.default.unionWith(selectList, added, _utils.default.bizEquals);
      selectList.forEach(function (item) {
        return item.includeChildPlace = _this2.state.includeChildPlace;
      });
      this.setState({
        selectList: selectList
      });
      setTimeout(this.scrollBottom);
    }
  }, {
    key: "onDrillDown",
    value: function onDrillDown(item) {
      var breads = this.state.breads;
      breads.push(item);
      this.setState({
        breads: breads,
        sourceList: item.children
      });
    }
  }, {
    key: "onOk",
    value: function onOk() {
      var selectList = this.state.selectList;
      var promise = this.props.promise;

      if (promise && typeof promise.resolve === 'function') {
        promise.resolve(selectList);
      }
    }
  }, {
    key: "componentDidMount",
    value: function componentDidMount() {
      var _this$state = this.state,
          breads = _this$state.breads,
          selectList = _this$state.selectList;
      breads[0].name = this.t('china');
      var last = _lodash.default.last(breads) || {};
      this.fetchSourceList(last.code);
      var includeChildPlace;

      if (_lodash.default.isEmpty(selectList)) {
        includeChildPlace = false;
      } else {
        includeChildPlace = selectList[0] && selectList[0].includeChildPlace;
      }

      this.setState({
        includeChildPlace: includeChildPlace
      });
    }
  }, {
    key: "fetchSourceList",
    value: function fetchSourceList(code) {
      var _this3 = this;

      var _this$props = this.props,
          cities = _this$props.cities,
          type = _this$props.type,
          fetchCitiesFor = _this$props.fetchCitiesFor;

      if (!cities) {
        fetchCitiesFor && fetchCitiesFor(type || 'expense', {
          pageId: FETCH_CITIES_FOR
        }).then(function (data) {
          if (data) {
            var breads = _this3.state.breads;
            var placeData = locationConvertor.formatAddressData(data, 'expense');
            var domestic = placeData && placeData[0] && placeData[0].children;
            var abroad = placeData && placeData[1] && placeData[1].children;
            breads[0].children = domestic;

            _this3.setState({
              sourceList: domestic,
              breads: breads,
              originalData: {
                domestic: domestic,
                abroad: abroad
              }
            });
          }
        });
      }
    }
  }, {
    key: "fetchSearchList",
    value: function fetchSearchList(keyword) {
      var originalData = this.state.originalData;
      var searchList = [];

      _lodash.default.forIn(originalData, function (data) {
        _lodash.default.each(data, function (sl) {
          recvHandleCities(sl);
        });
      });

      function recvHandleCities(arr) {
        var fuzzy = _lodash.default.toLower(arr.fuzzy);

        if (fuzzy && fuzzy.indexOf(_lodash.default.toLower(keyword)) > -1) {
          searchList.push(arr);
        }

        _lodash.default.map(arr.children, function (item) {
          if (item) {
            recvHandleCities(item);
          }
        });
      }

      this.setState({
        searchList: searchList
      });
    }
  }, {
    key: "scrollBottom",
    value: function scrollBottom() {
      if (this.selectListRef) {
        var dom = _reactDom.default.findDOMNode(this.selectListRef);

        dom.scrollTop = dom.scrollHeight;
      }
    }
  }, {
    key: "render",
    value: function render() {
      var _this4 = this;

      var _this$state2 = this.state,
          sourceList = _this$state2.sourceList,
          searchList = _this$state2.searchList,
          selectList = _this$state2.selectList,
          breads = _this$state2.breads,
          searchKeyword = _this$state2.searchKeyword,
          activeKey = _this$state2.activeKey,
          includeChildPlace = _this$state2.includeChildPlace;
      var _this$props2 = this.props,
          scope = _this$props2.scope,
          maxSelectLength = _this$props2.maxSelectLength,
          sourceListLoading = _this$props2.sourceListLoading,
          searchListLoading = _this$props2.searchListLoading,
          hideBottomCheck = _this$props2.hideBottomCheck;

      var footer = /*#__PURE__*/_react.default.createElement("div", {
        className: "footer-wrapper"
      }, /*#__PURE__*/_react.default.createElement("div", {
        className: "include"
      }, !hideBottomCheck && /*#__PURE__*/_react.default.createElement(_checkbox.default, {
        checked: includeChildPlace,
        onChange: function onChange(e) {
          _this4.setState({
            includeChildPlace: e.target.checked,
            selectList: _lodash.default.map(selectList, function (item) {
              return _objectSpread(_objectSpread({}, item), {}, {
                includeChildPlace: e.target.checked
              });
            })
          });
        }
      }, "\u542B\u4E0B\u7EA7\u5730\u533A")), /*#__PURE__*/_react.default.createElement("div", {
        className: "btns-wrap"
      }, /*#__PURE__*/_react.default.createElement(_button.default, {
        type: "info",
        size: "large",
        onClick: this.closeSelf
      }, this.t("cancel")), /*#__PURE__*/_react.default.createElement(_button.default, {
        type: "primary",
        size: "large",
        onClick: this.onOk
      }, this.t("confirm"))));

      var title = this.t('selectArea');
      return /*#__PURE__*/_react.default.createElement(_modal.default, (0, _extends2.default)({
        title: title
      }, this.props, {
        // onOk={this.onOk}
        destroyOnClose: true,
        maskClosable: false,
        keyboard: false,
        className: "".concat(prefix, "-region-select"),
        visible: true,
        footer: footer,
        cancelButtonProps: {
          type: 'info',
          size: 'large'
        }
      }), /*#__PURE__*/_react.default.createElement("div", {
        className: "content"
      }, /*#__PURE__*/_react.default.createElement("div", {
        className: "left"
      }, /*#__PURE__*/_react.default.createElement("div", {
        className: "search-box"
      }, /*#__PURE__*/_react.default.createElement(Search, {
        placeholder: this.t("enterInput"),
        ref: function ref(_ref) {
          _this4.searchRef = _ref;
        },
        onSearch: this.onSearch
      }), searchKeyword ? /*#__PURE__*/_react.default.createElement("span", {
        className: 'fm fm-cross',
        onClick: this.clearSearch
      }) : null), searchKeyword ? /*#__PURE__*/_react.default.createElement("div", {
        className: "search-list"
      }, /*#__PURE__*/_react.default.createElement(_RegionList.default, {
        loading: searchListLoading,
        onPreCheck: this.preCheck,
        scope: scope,
        canDrillDown: false,
        sourceList: searchList,
        selectList: selectList,
        onOutput: this.onOutput
      })) : /*#__PURE__*/_react.default.createElement("div", {
        className: "source-list"
      }, /*#__PURE__*/_react.default.createElement(_tabs.default, {
        activeKey: activeKey,
        onChange: this.onTabsChange
      }, /*#__PURE__*/_react.default.createElement(_tabs.default.TabPane, {
        key: "domestic",
        tab: this.t('domestic')
      }), /*#__PURE__*/_react.default.createElement(_tabs.default.TabPane, {
        key: "abroad",
        tab: this.t('international')
      })), /*#__PURE__*/_react.default.createElement(_breadcrumb.default, null, breads.map(function (bread, idx) {
        return /*#__PURE__*/_react.default.createElement(BreadItem, {
          key: bread.code
        }, idx !== breads.length - 1 ?
        /*#__PURE__*/
        // eslint-disable-next-line jsx-a11y/anchor-is-valid
        _react.default.createElement("a", {
          href: "javascript:void(0)",
          onClick: function onClick() {
            _this4.goToBread(bread);
          }
        }, bread.name) : /*#__PURE__*/_react.default.createElement("span", null, bread.name));
      })), /*#__PURE__*/_react.default.createElement(_RegionList.default, {
        loading: sourceListLoading,
        onPreCheck: this.preCheck,
        scope: scope,
        sourceList: sourceList,
        selectList: selectList,
        onOutput: this.onOutput,
        onDrillDown: this.onDrillDown
      }))), /*#__PURE__*/_react.default.createElement("div", {
        className: "right"
      }, /*#__PURE__*/_react.default.createElement("div", {
        className: "status-bar"
      }, /*#__PURE__*/_react.default.createElement("span", {
        className: "bar-label"
      }, this.t('selected')), /*#__PURE__*/_react.default.createElement("span", {
        className: "dep-count"
      }, this.t('area'), /*#__PURE__*/_react.default.createElement("span", {
        className: "strong"
      }, selectList.length)), /*#__PURE__*/_react.default.createElement("span", {
        className: "clear-all"
      }, /*#__PURE__*/_react.default.createElement("span", {
        className: "btn",
        onClick: this.clearAll
      }, this.t('clear')))), maxSelectLength > 0 ? /*#__PURE__*/_react.default.createElement(_alert.default, {
        message: /*#__PURE__*/_react.default.createElement("span", null, "\u6700\u591A\u53EA\u80FD\u9009\u62E9", /*#__PURE__*/_react.default.createElement("span", {
          className: 'strong'
        }, maxSelectLength), "\u9879"),
        type: "warning"
      }) : null, /*#__PURE__*/_react.default.createElement(_list.default, {
        size: "small",
        dataSource: selectList,
        ref: function ref(_ref2) {
          _this4.selectListRef = _ref2;
        },
        renderItem: function renderItem(item) {
          return /*#__PURE__*/_react.default.createElement(_list.default.Item, {
            key: item.code
          }, /*#__PURE__*/_react.default.createElement("span", {
            className: "item-name"
          }, item.name), /*#__PURE__*/_react.default.createElement("span", {
            className: "fm fm-trash",
            onClick: function onClick(e) {
              e.stopPropagation();

              _this4.unSelectItem(item);
            }
          }));
        }
      }))));
    }
  }]);
  return RegionSelection;
}(_react.Component); // function stateMapProp({ app }) {
//     return {
//         sourceListLoading: app.loading[LOCATION_PICKER.SOURCE_LIST],
//         searchListLoading: app.loading[LOCATION_PICKER.SEARCH_LIST]
//     }
// }
// export default connect(stateMapProp)(LocationSelectionModal);


var _default = RegionSelection;
exports.default = _default;