UNPKG

rc-select

Version:
62 lines (61 loc) 2.43 kB
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty"; import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2"; import * as React from 'react'; import { toArray } from "../utils/commonUtil"; import { injectPropsWithOption } from "../utils/valueUtil"; function includes(test, search) { return toArray(test).join('').toUpperCase().includes(search); } export default (function (options, fieldNames, searchValue, filterOption, optionFilterProp) { return React.useMemo(function () { if (!searchValue || filterOption === false) { return options; } var fieldOptions = fieldNames.options, fieldLabel = fieldNames.label, fieldValue = fieldNames.value; var filteredOptions = []; var customizeFilter = typeof filterOption === 'function'; var upperSearch = searchValue.toUpperCase(); var filterFunc = customizeFilter ? filterOption : function (_, option) { // Use provided `optionFilterProp` if (optionFilterProp) { return includes(option[optionFilterProp], upperSearch); } // Auto select `label` or `value` by option type if (option[fieldOptions]) { // hack `fieldLabel` since `OptionGroup` children is not `label` return includes(option[fieldLabel !== 'children' ? fieldLabel : 'label'], upperSearch); } return includes(option[fieldValue], upperSearch); }; var wrapOption = customizeFilter ? function (opt) { return injectPropsWithOption(opt); } : function (opt) { return opt; }; options.forEach(function (item) { // Group should check child options if (item[fieldOptions]) { // Check group first var matchGroup = filterFunc(searchValue, wrapOption(item)); if (matchGroup) { filteredOptions.push(item); } else { // Check option var subOptions = item[fieldOptions].filter(function (subItem) { return filterFunc(searchValue, wrapOption(subItem)); }); if (subOptions.length) { filteredOptions.push(_objectSpread(_objectSpread({}, item), {}, _defineProperty({}, fieldOptions, subOptions))); } } return; } if (filterFunc(searchValue, wrapOption(item))) { filteredOptions.push(item); } }); return filteredOptions; }, [options, filterOption, optionFilterProp, searchValue, fieldNames]); });