UNPKG

bonree-cascader

Version:

cascade select ui component for react

114 lines (87 loc) 3.9 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useSearchResult; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var React = _interopRequireWildcard(require("react")); var _util = require("../util"); var defaultFilter = function defaultFilter(search, options, _ref) { var label = _ref.label; return options.some(function (opt) { return String(opt[label]).toLowerCase().includes(search.toLowerCase()); }); }; var defaultRender = function defaultRender(inputValue, path, prefixCls, fieldNames) { return path.map(function (opt) { return opt[fieldNames.label]; }).join(' / '); }; function useSearchResult(resultConfig) { var searchConfig = resultConfig.searchConfig, flattenOptions = resultConfig.flattenOptions, fieldNames = resultConfig.fieldNames, changeOnSelect = resultConfig.changeOnSelect, searchValue = resultConfig.searchValue, prefixCls = resultConfig.prefixCls, treeCheckStrictly = resultConfig.treeCheckStrictly; // ============================== MISC ============================== var filterOption = searchConfig.filter || defaultFilter; var renderOption = searchConfig.render || defaultRender; // ============================= Filter ============================= // Do filter var filteredEntityList = React.useMemo(function () { if (!searchValue) { return []; } // Normalize list var normalizeList = flattenOptions.map(function (option) { var _restoreCompatibleVal = (0, _util.restoreCompatibleValue)(option, fieldNames), options = _restoreCompatibleVal.options; var originOptionList = options.map(function (opt) { return opt.node; }); return { option: option, originOptionList: originOptionList }; }); // Not keep parent node when !changeOnSelect if (!changeOnSelect && !treeCheckStrictly) { normalizeList = normalizeList.filter(function (_ref2) { var option = _ref2.option; return (0, _util.isLeaf)(option.data); }); } // Filter var filteredList = []; for (var i = 0; i < normalizeList.length; i += 1) { // Perf saving if enabled if (!searchConfig.sort && filteredList.length >= searchConfig.limit) { break; } // Do filter var optGrp = normalizeList[i]; if (filterOption(searchValue, optGrp.originOptionList, fieldNames)) { filteredList.push(optGrp); } } // Sort: When searchConfig.sort is enabled. We have to filter all the list if (searchConfig.sort) { filteredList.sort(function (a, b) { return searchConfig.sort(a.originOptionList, b.originOptionList, searchValue, fieldNames); }); } return filteredList; }, [flattenOptions, fieldNames, searchValue, filterOption, changeOnSelect, searchConfig]); // ======================== Generate Options ======================== // Wrap with connected label var options = React.useMemo(function () { return filteredEntityList.map(function (_ref3) { var option = _ref3.option, originOptionList = _ref3.originOptionList; var title = renderOption(searchValue, originOptionList, prefixCls, fieldNames); if (!option.data.node.title && (typeof option.data.node.label === 'string' || typeof option.data.node.label === 'number')) { option.data.node.title = String(option.data.node.label); } return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, option.data), {}, { title: title }); }); }, [searchValue, renderOption, filteredEntityList, fieldNames, prefixCls]); return options; }