shineout
Version:
Shein 前端组件库
157 lines (132 loc) • 5.03 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose";
import _inheritsLoose from "@babel/runtime/helpers/inheritsLoose";
import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import React from 'react';
import { Component } from '../component';
import { getFilterTree } from '../utils/tree';
import { isArray } from '../utils/is';
var DefaultValue = {
data: [],
filterDelay: 300,
showHitDescendants: false
};
export default (function (Origin) {
var _class, _temp;
return _temp = _class =
/*#__PURE__*/
function (_Component) {
_inheritsLoose(Filter, _Component);
function Filter(props) {
var _this;
_this = _Component.call(this, props) || this;
_defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "resultCache", void 0);
_defineProperty(_assertThisInitialized(_assertThisInitialized(_this)), "timer", void 0);
_this.state = {
innerFilter: undefined,
innerData: undefined,
filterText: ''
};
_this.handleFilter = _this.handleFilter.bind(_assertThisInitialized(_assertThisInitialized(_this)));
_this.getResultByValues = _this.getResultByValues.bind(_assertThisInitialized(_assertThisInitialized(_this)));
_this.resultCache = new Map();
return _this;
}
var _proto = Filter.prototype;
_proto.getResultByValues = function getResultByValues() {
var _this2 = this;
var _this$props = this.props,
datum = _this$props.datum,
noCache = _this$props.noCache,
renderUnmatched = _this$props.renderUnmatched;
var value = datum.getValue() || [];
var vr = isArray(this.props.value) ? this.props.value : [this.props.value];
if (renderUnmatched) {
var emptyArr = [];
value = value.concat(emptyArr.concat(vr).filter(function (v) {
return v && value.indexOf(v) === -1;
}));
}
var result = [];
value.forEach(function (v) {
var res = noCache ? undefined : _this2.resultCache.get(v);
if (!res) {
res = datum.getDataById(v);
if (res && !noCache && !datum.isUnMatch(res)) _this2.resultCache.set(v, res);
}
if (res) {
result.push(res);
}
});
return result;
};
_proto.handleFilter = function handleFilter(text, from) {
var _this3 = this;
if (from === void 0) {
from = 'edit';
}
var _this$props2 = this.props,
filterDelay = _this$props2.filterDelay,
onFilter = _this$props2.onFilter; // not filter
if (!text) {
this.setState({
filterText: '',
innerFilter: undefined,
innerData: undefined
});
if (this.timer) clearTimeout(this.timer);
if (onFilter) onFilter(text, from);
return;
}
if (!onFilter) return;
this.setState({
filterText: text
});
if (this.timer) clearTimeout(this.timer);
this.timer = setTimeout(function () {
var fn = onFilter(text, from);
if (typeof fn === 'function') {
_this3.setState({
innerFilter: fn
});
}
}, filterDelay);
};
_proto.render = function render() {
var _this4 = this;
var _this$props3 = this.props,
_this$props3$data = _this$props3.data,
data = _this$props3$data === void 0 ? DefaultValue.data : _this$props3$data,
onFilter = _this$props3.onFilter,
expanded = _this$props3.expanded,
_this$props3$showHitD = _this$props3.showHitDescendants,
showHitDescendants = _this$props3$showHitD === void 0 ? DefaultValue.showHitDescendants : _this$props3$showHitD,
other = _objectWithoutPropertiesLoose(_this$props3, ["data", "onFilter", "expanded", "showHitDescendants"]);
var _this$state = this.state,
innerFilter = _this$state.innerFilter,
filterText = _this$state.filterText;
var filterFn = onFilter ? this.handleFilter : undefined;
var newData = data;
var newExpanded = expanded;
if (innerFilter) {
var filterExpandedKeys = [];
newData = getFilterTree(data, innerFilter, filterExpandedKeys, function (node) {
return _this4.props.datum.getKey(node);
}, other.childrenKey, showHitDescendants, undefined, {
advanced: other.onAdvancedFilter
});
newExpanded = filterExpandedKeys;
}
return React.createElement(Origin, _extends({}, other, {
filterText: filterText,
result: this.getResultByValues(),
data: newData,
rawData: data,
onFilter: filterFn,
expanded: newExpanded
}));
};
return Filter;
}(Component), _defineProperty(_class, "defaultProps", DefaultValue), _temp;
});