shineout
Version:
Shein 前端组件库
285 lines (233 loc) • 9.38 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _uid = require("../utils/uid");
var _tree = require("../utils/tree");
var _Result = require("./Result");
var _default = function _default(Origin) {
var _class, _temp;
return _temp = _class =
/*#__PURE__*/
function (_React$Component) {
(0, _inheritsLoose2.default)(Filter, _React$Component);
function Filter(props) {
var _this;
_this = _React$Component.call(this, props) || this;
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "resultCache", void 0);
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "timer", void 0);
_this.state = {
innerFilter: undefined,
innerData: undefined,
filterText: '',
text: ''
};
_this.handleCreate = _this.handleCreate.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.handleFilter = _this.handleFilter.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this))); // this.getResultByValues = this.getResultByValues.bind(this)
_this.getCachedResult = _this.getCachedResult.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
_this.resultCache = new Map();
return _this;
}
var _proto = Filter.prototype;
_proto.componentDidUpdate = function componentDidUpdate(prevProps) {
var _this$props = this.props,
datum = _this$props.datum,
multiple = _this$props.multiple;
if (prevProps.multiple !== multiple) {
datum.limit = multiple ? 0 : 1;
}
};
_proto.getTreeResult = function getTreeResult(value, prediction) {
var _this$props2 = this.props,
treeData = _this$props2.treeData,
_this$props2$children = _this$props2.childrenKey,
childrenKey = _this$props2$children === void 0 ? 'children' : _this$props2$children;
var finded;
var treeNode = function treeNode(children) {
if (finded) return false;
if (!children || children.length === 0) return false;
for (var i = 0; i < children.length; i++) {
var d = children[i];
if (prediction(value, d)) finded = d; // @ts-ignore
treeNode(d[childrenKey]);
}
return false;
};
treeNode(treeData);
return finded;
};
_proto.getResult = function getResult(value) {
var _this$props3 = this.props,
data = _this$props3.data,
treeData = _this$props3.treeData,
datum = _this$props3.datum,
onCreate = _this$props3.onCreate;
var prediction = datum.prediction || function (v, d) {
return v === datum.format(d);
};
if (treeData) return this.getTreeResult(value, prediction);
for (var i = 0, count = data.length; i < count; i++) {
var d = data[i];
if (prediction(value, d)) return d;
}
if (onCreate) return this.handleCreate(value);
return undefined;
};
_proto.getCachedResult = function getCachedResult(value) {
var noCache = this.props.noCache;
var res = noCache ? undefined : this.resultCache.get(value);
if (!res) {
var _res;
res = this.getResult(value);
if (res !== undefined && !noCache) this.resultCache.set(value, res);else if (res === undefined) res = (_res = {}, _res[_Result.IS_NOT_MATCHED_VALUE] = true, _res.value = value, _res);
}
return res;
} // getResultByValues() {
// const { datum } = this.props
// const { values = [] }: { values: Value[] } = datum
// const result: (Item | ResultValue<Value>)[] = []
// values.forEach(v => {
// const res = this.getCachedResult(v)
// if (res !== undefined) {
// result.push(res)
// }
// })
//
// return result
// }
;
_proto.handleFilter = function handleFilter(text, from) {
var _this2 = this;
if (from === void 0) {
from = 'edit';
}
var _this$props4 = this.props,
filterDelay = _this$props4.filterDelay,
onFilter = _this$props4.onFilter,
onCreate = _this$props4.onCreate;
this.setState({
text: text
}); // not filter
if (!text) {
this.setState({
filterText: '',
innerFilter: undefined,
innerData: undefined
});
if (this.timer) clearTimeout(this.timer);
if (onFilter) onFilter(text, from);
return;
}
if (onCreate) {
var innerData = this.handleCreate(text);
this.setState({
innerData: innerData
});
}
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') {
_this2.setState({
innerFilter: fn
});
}
}, filterDelay);
};
_proto.handleCreate = function handleCreate(text) {
var onCreate = this.props.onCreate;
var createFn = typeof onCreate === 'boolean' ? function (t) {
return t;
} : onCreate;
return createFn(text);
};
_proto.filterTreeData = function filterTreeData() {
var _this$props5 = this.props,
treeData = _this$props5.treeData,
expanded = _this$props5.expanded,
showHitDescendants = _this$props5.showHitDescendants,
onAdvancedFilter = _this$props5.onAdvancedFilter,
other = (0, _objectWithoutPropertiesLoose2.default)(_this$props5, ["treeData", "expanded", "showHitDescendants", "onAdvancedFilter"]);
var innerFilter = this.state.innerFilter;
var filterExpandedKeys = expanded;
var newData = treeData;
if (innerFilter) {
filterExpandedKeys = [];
newData = (0, _tree.getFilterTree)(treeData, innerFilter, filterExpandedKeys, function (node) {
return (0, _uid.getKey)(node, other.keygen);
}, other.childrenKey, showHitDescendants, undefined, {
advanced: !!onAdvancedFilter
});
}
return {
treeData: newData,
expanded: filterExpandedKeys,
rawData: treeData
};
};
_proto.filterData = function filterData() {
var _this$props6 = this.props,
data = _this$props6.data,
hideCreateOption = _this$props6.hideCreateOption,
other = (0, _objectWithoutPropertiesLoose2.default)(_this$props6, ["data", "hideCreateOption"]);
var _this$state = this.state,
innerFilter = _this$state.innerFilter,
innerData = _this$state.innerData;
var newData = data;
if (innerFilter) newData = data.filter(function (d) {
return innerFilter(d);
});
if (innerData && !hideCreateOption) {
var newKey = (0, _uid.getKey)(innerData, other.keygen, innerData);
if (!newData.find(function (d) {
return (0, _uid.getKey)(d, other.keygen, d) === newKey;
})) {
newData = [innerData].concat(newData);
}
}
return {
data: newData
};
};
_proto.render = function render() {
var _this$props7 = this.props,
treeData = _this$props7.treeData,
onFilter = _this$props7.onFilter,
onCreate = _this$props7.onCreate,
other = (0, _objectWithoutPropertiesLoose2.default)(_this$props7, ["treeData", "onFilter", "onCreate"]);
var _this$state2 = this.state,
filterText = _this$state2.filterText,
innerData = _this$state2.innerData,
text = _this$state2.text;
var filterFn = onFilter || onCreate ? this.handleFilter : undefined;
var dataGenerator = treeData ? this.filterTreeData : this.filterData;
var props = (0, _objectSpread2.default)({}, other, {
filterText: filterText,
inputText: text,
// result: this.getResultByValues(),
getResultByValue: this.getCachedResult,
inputable: !!onCreate,
onCreate: onCreate ? this.handleCreate : undefined,
onFilter: filterFn,
innerData: innerData
}, dataGenerator.call(this));
return _react.default.createElement(Origin, props);
};
return Filter;
}(_react.default.Component), (0, _defineProperty2.default)(_class, "defaultProps", {
data: [],
filterDelay: 300,
showHitDescendants: false
}), _temp;
};
exports.default = _default;