UNPKG

shineout

Version:

Shein 前端组件库

275 lines (228 loc) 8.72 kB
import _objectSpread from "@babel/runtime/helpers/objectSpread"; 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 { getKey } from '../utils/uid'; import { getFilterTree } from '../utils/tree'; import { IS_NOT_MATCHED_VALUE } from './Result'; export default (function (Origin) { var _class, _temp; return _temp = _class = /*#__PURE__*/ function (_React$Component) { _inheritsLoose(Filter, _React$Component); function Filter(props) { var _this; _this = _React$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: '', text: '' }; _this.handleCreate = _this.handleCreate.bind(_assertThisInitialized(_assertThisInitialized(_this))); _this.handleFilter = _this.handleFilter.bind(_assertThisInitialized(_assertThisInitialized(_this))); // this.getResultByValues = this.getResultByValues.bind(this) _this.getCachedResult = _this.getCachedResult.bind(_assertThisInitialized(_assertThisInitialized(_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[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 = _objectWithoutPropertiesLoose(_this$props5, ["treeData", "expanded", "showHitDescendants", "onAdvancedFilter"]); var innerFilter = this.state.innerFilter; var filterExpandedKeys = expanded; var newData = treeData; if (innerFilter) { filterExpandedKeys = []; newData = getFilterTree(treeData, innerFilter, filterExpandedKeys, function (node) { return 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 = _objectWithoutPropertiesLoose(_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 = getKey(innerData, other.keygen, innerData); if (!newData.find(function (d) { return 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 = _objectWithoutPropertiesLoose(_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 = _objectSpread({}, 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.createElement(Origin, props); }; return Filter; }(React.Component), _defineProperty(_class, "defaultProps", { data: [], filterDelay: 300, showHitDescendants: false }), _temp; });