useSearchOptions.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = exports.SEARCH_MARK = void 0;
  8. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  9. var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  11. var React = _interopRequireWildcard(require("react"));
  12. var SEARCH_MARK = exports.SEARCH_MARK = '__rc_cascader_search_mark__';
  13. var defaultFilter = function defaultFilter(search, options, _ref) {
  14. var _ref$label = _ref.label,
  15. label = _ref$label === void 0 ? '' : _ref$label;
  16. return options.some(function (opt) {
  17. return String(opt[label]).toLowerCase().includes(search.toLowerCase());
  18. });
  19. };
  20. var defaultRender = function defaultRender(inputValue, path, prefixCls, fieldNames) {
  21. return path.map(function (opt) {
  22. return opt[fieldNames.label];
  23. }).join(' / ');
  24. };
  25. var useSearchOptions = function useSearchOptions(search, options, fieldNames, prefixCls, config, enableHalfPath) {
  26. var _config$filter = config.filter,
  27. filter = _config$filter === void 0 ? defaultFilter : _config$filter,
  28. _config$render = config.render,
  29. render = _config$render === void 0 ? defaultRender : _config$render,
  30. _config$limit = config.limit,
  31. limit = _config$limit === void 0 ? 50 : _config$limit,
  32. sort = config.sort;
  33. return React.useMemo(function () {
  34. var filteredOptions = [];
  35. if (!search) {
  36. return [];
  37. }
  38. function dig(list, pathOptions) {
  39. var parentDisabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  40. list.forEach(function (option) {
  41. // Perf saving when `sort` is disabled and `limit` is provided
  42. if (!sort && limit !== false && limit > 0 && filteredOptions.length >= limit) {
  43. return;
  44. }
  45. var connectedPathOptions = [].concat((0, _toConsumableArray2.default)(pathOptions), [option]);
  46. var children = option[fieldNames.children];
  47. var mergedDisabled = parentDisabled || option.disabled;
  48. // If current option is filterable
  49. if (
  50. // If is leaf option
  51. !children || children.length === 0 ||
  52. // If is changeOnSelect or multiple
  53. enableHalfPath) {
  54. if (filter(search, connectedPathOptions, {
  55. label: fieldNames.label
  56. })) {
  57. var _objectSpread2;
  58. filteredOptions.push((0, _objectSpread3.default)((0, _objectSpread3.default)({}, option), {}, (_objectSpread2 = {
  59. disabled: mergedDisabled
  60. }, (0, _defineProperty2.default)(_objectSpread2, fieldNames.label, render(search, connectedPathOptions, prefixCls, fieldNames)), (0, _defineProperty2.default)(_objectSpread2, SEARCH_MARK, connectedPathOptions), (0, _defineProperty2.default)(_objectSpread2, fieldNames.children, undefined), _objectSpread2)));
  61. }
  62. }
  63. if (children) {
  64. dig(option[fieldNames.children], connectedPathOptions, mergedDisabled);
  65. }
  66. });
  67. }
  68. dig(options, []);
  69. // Do sort
  70. if (sort) {
  71. filteredOptions.sort(function (a, b) {
  72. return sort(a[SEARCH_MARK], b[SEARCH_MARK], search, fieldNames);
  73. });
  74. }
  75. return limit !== false && limit > 0 ? filteredOptions.slice(0, limit) : filteredOptions;
  76. }, [search, options, fieldNames, prefixCls, render, enableHalfPath, filter, sort, limit]);
  77. };
  78. var _default = exports.default = useSearchOptions;