Cascader.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  11. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  12. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  13. var _rcSelect = require("rc-select");
  14. var _useId = _interopRequireDefault(require("rc-select/lib/hooks/useId"));
  15. var _useEvent = _interopRequireDefault(require("rc-util/lib/hooks/useEvent"));
  16. var _useMergedState5 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
  17. var React = _interopRequireWildcard(require("react"));
  18. var _context = _interopRequireDefault(require("./context"));
  19. var _useDisplayValues = _interopRequireDefault(require("./hooks/useDisplayValues"));
  20. var _useMissingValues = _interopRequireDefault(require("./hooks/useMissingValues"));
  21. var _useOptions3 = _interopRequireDefault(require("./hooks/useOptions"));
  22. var _useSearchConfig3 = _interopRequireDefault(require("./hooks/useSearchConfig"));
  23. var _useSearchOptions = _interopRequireDefault(require("./hooks/useSearchOptions"));
  24. var _useSelect = _interopRequireDefault(require("./hooks/useSelect"));
  25. var _useValues3 = _interopRequireDefault(require("./hooks/useValues"));
  26. var _OptionList = _interopRequireDefault(require("./OptionList"));
  27. var _Panel = _interopRequireDefault(require("./Panel"));
  28. var _commonUtil = require("./utils/commonUtil");
  29. var _treeUtil = require("./utils/treeUtil");
  30. var _warningPropsUtil = _interopRequireWildcard(require("./utils/warningPropsUtil"));
  31. var _excluded = ["id", "prefixCls", "fieldNames", "defaultValue", "value", "changeOnSelect", "onChange", "displayRender", "checkable", "autoClearSearchValue", "searchValue", "onSearch", "showSearch", "expandTrigger", "options", "dropdownPrefixCls", "loadData", "popupVisible", "open", "popupClassName", "dropdownClassName", "dropdownMenuColumnStyle", "dropdownStyle", "popupPlacement", "placement", "onDropdownVisibleChange", "onPopupVisibleChange", "onOpenChange", "expandIcon", "loadingIcon", "children", "dropdownMatchSelectWidth", "showCheckedStrategy", "optionRender"];
  32. var Cascader = /*#__PURE__*/React.forwardRef(function (props, ref) {
  33. var id = props.id,
  34. _props$prefixCls = props.prefixCls,
  35. prefixCls = _props$prefixCls === void 0 ? 'rc-cascader' : _props$prefixCls,
  36. fieldNames = props.fieldNames,
  37. defaultValue = props.defaultValue,
  38. value = props.value,
  39. changeOnSelect = props.changeOnSelect,
  40. onChange = props.onChange,
  41. displayRender = props.displayRender,
  42. checkable = props.checkable,
  43. _props$autoClearSearc = props.autoClearSearchValue,
  44. autoClearSearchValue = _props$autoClearSearc === void 0 ? true : _props$autoClearSearc,
  45. searchValue = props.searchValue,
  46. onSearch = props.onSearch,
  47. showSearch = props.showSearch,
  48. expandTrigger = props.expandTrigger,
  49. options = props.options,
  50. dropdownPrefixCls = props.dropdownPrefixCls,
  51. loadData = props.loadData,
  52. popupVisible = props.popupVisible,
  53. open = props.open,
  54. popupClassName = props.popupClassName,
  55. dropdownClassName = props.dropdownClassName,
  56. dropdownMenuColumnStyle = props.dropdownMenuColumnStyle,
  57. customDropdownStyle = props.dropdownStyle,
  58. popupPlacement = props.popupPlacement,
  59. placement = props.placement,
  60. onDropdownVisibleChange = props.onDropdownVisibleChange,
  61. onPopupVisibleChange = props.onPopupVisibleChange,
  62. onOpenChange = props.onOpenChange,
  63. _props$expandIcon = props.expandIcon,
  64. expandIcon = _props$expandIcon === void 0 ? '>' : _props$expandIcon,
  65. loadingIcon = props.loadingIcon,
  66. children = props.children,
  67. _props$dropdownMatchS = props.dropdownMatchSelectWidth,
  68. dropdownMatchSelectWidth = _props$dropdownMatchS === void 0 ? false : _props$dropdownMatchS,
  69. _props$showCheckedStr = props.showCheckedStrategy,
  70. showCheckedStrategy = _props$showCheckedStr === void 0 ? _commonUtil.SHOW_PARENT : _props$showCheckedStr,
  71. optionRender = props.optionRender,
  72. restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
  73. var mergedId = (0, _useId.default)(id);
  74. var multiple = !!checkable;
  75. // =========================== Values ===========================
  76. var _useMergedState = (0, _useMergedState5.default)(defaultValue, {
  77. value: value,
  78. postState: _commonUtil.toRawValues
  79. }),
  80. _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
  81. rawValues = _useMergedState2[0],
  82. setRawValues = _useMergedState2[1];
  83. // ========================= FieldNames =========================
  84. var mergedFieldNames = React.useMemo(function () {
  85. return (0, _commonUtil.fillFieldNames)(fieldNames);
  86. }, /* eslint-disable react-hooks/exhaustive-deps */
  87. [JSON.stringify(fieldNames)]
  88. /* eslint-enable react-hooks/exhaustive-deps */);
  89. // =========================== Option ===========================
  90. var _useOptions = (0, _useOptions3.default)(mergedFieldNames, options),
  91. _useOptions2 = (0, _slicedToArray2.default)(_useOptions, 3),
  92. mergedOptions = _useOptions2[0],
  93. getPathKeyEntities = _useOptions2[1],
  94. getValueByKeyPath = _useOptions2[2];
  95. // =========================== Search ===========================
  96. var _useMergedState3 = (0, _useMergedState5.default)('', {
  97. value: searchValue,
  98. postState: function postState(search) {
  99. return search || '';
  100. }
  101. }),
  102. _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2),
  103. mergedSearchValue = _useMergedState4[0],
  104. setSearchValue = _useMergedState4[1];
  105. var onInternalSearch = function onInternalSearch(searchText, info) {
  106. setSearchValue(searchText);
  107. if (info.source !== 'blur' && onSearch) {
  108. onSearch(searchText);
  109. }
  110. };
  111. var _useSearchConfig = (0, _useSearchConfig3.default)(showSearch),
  112. _useSearchConfig2 = (0, _slicedToArray2.default)(_useSearchConfig, 2),
  113. mergedShowSearch = _useSearchConfig2[0],
  114. searchConfig = _useSearchConfig2[1];
  115. var searchOptions = (0, _useSearchOptions.default)(mergedSearchValue, mergedOptions, mergedFieldNames, dropdownPrefixCls || prefixCls, searchConfig, changeOnSelect || multiple);
  116. // =========================== Values ===========================
  117. var getMissingValues = (0, _useMissingValues.default)(mergedOptions, mergedFieldNames);
  118. // Fill `rawValues` with checked conduction values
  119. var _useValues = (0, _useValues3.default)(multiple, rawValues, getPathKeyEntities, getValueByKeyPath, getMissingValues),
  120. _useValues2 = (0, _slicedToArray2.default)(_useValues, 3),
  121. checkedValues = _useValues2[0],
  122. halfCheckedValues = _useValues2[1],
  123. missingCheckedValues = _useValues2[2];
  124. var deDuplicatedValues = React.useMemo(function () {
  125. var checkedKeys = (0, _commonUtil.toPathKeys)(checkedValues);
  126. var deduplicateKeys = (0, _treeUtil.formatStrategyValues)(checkedKeys, getPathKeyEntities, showCheckedStrategy);
  127. return [].concat((0, _toConsumableArray2.default)(missingCheckedValues), (0, _toConsumableArray2.default)(getValueByKeyPath(deduplicateKeys)));
  128. }, [checkedValues, getPathKeyEntities, getValueByKeyPath, missingCheckedValues, showCheckedStrategy]);
  129. var displayValues = (0, _useDisplayValues.default)(deDuplicatedValues, mergedOptions, mergedFieldNames, multiple, displayRender);
  130. // =========================== Change ===========================
  131. var triggerChange = (0, _useEvent.default)(function (nextValues) {
  132. setRawValues(nextValues);
  133. // Save perf if no need trigger event
  134. if (onChange) {
  135. var nextRawValues = (0, _commonUtil.toRawValues)(nextValues);
  136. var valueOptions = nextRawValues.map(function (valueCells) {
  137. return (0, _treeUtil.toPathOptions)(valueCells, mergedOptions, mergedFieldNames).map(function (valueOpt) {
  138. return valueOpt.option;
  139. });
  140. });
  141. var triggerValues = multiple ? nextRawValues : nextRawValues[0];
  142. var triggerOptions = multiple ? valueOptions : valueOptions[0];
  143. onChange(triggerValues, triggerOptions);
  144. }
  145. });
  146. // =========================== Select ===========================
  147. var handleSelection = (0, _useSelect.default)(multiple, triggerChange, checkedValues, halfCheckedValues, missingCheckedValues, getPathKeyEntities, getValueByKeyPath, showCheckedStrategy);
  148. var onInternalSelect = (0, _useEvent.default)(function (valuePath) {
  149. if (!multiple || autoClearSearchValue) {
  150. setSearchValue('');
  151. }
  152. handleSelection(valuePath);
  153. });
  154. // Display Value change logic
  155. var onDisplayValuesChange = function onDisplayValuesChange(_, info) {
  156. if (info.type === 'clear') {
  157. triggerChange([]);
  158. return;
  159. }
  160. // Cascader do not support `add` type. Only support `remove`
  161. var _ref = info.values[0],
  162. valueCells = _ref.valueCells;
  163. onInternalSelect(valueCells);
  164. };
  165. // ============================ Open ============================
  166. var mergedOpen = open !== undefined ? open : popupVisible;
  167. var mergedDropdownClassName = dropdownClassName || popupClassName;
  168. var mergedPlacement = placement || popupPlacement;
  169. var onInternalDropdownVisibleChange = function onInternalDropdownVisibleChange(nextVisible) {
  170. onOpenChange === null || onOpenChange === void 0 || onOpenChange(nextVisible);
  171. onDropdownVisibleChange === null || onDropdownVisibleChange === void 0 || onDropdownVisibleChange(nextVisible);
  172. onPopupVisibleChange === null || onPopupVisibleChange === void 0 || onPopupVisibleChange(nextVisible);
  173. };
  174. // ========================== Warning ===========================
  175. if (process.env.NODE_ENV !== 'production') {
  176. (0, _warningPropsUtil.default)(props);
  177. (0, _warningPropsUtil.warningNullOptions)(mergedOptions, mergedFieldNames);
  178. }
  179. // ========================== Context ===========================
  180. var cascaderContext = React.useMemo(function () {
  181. return {
  182. options: mergedOptions,
  183. fieldNames: mergedFieldNames,
  184. values: checkedValues,
  185. halfValues: halfCheckedValues,
  186. changeOnSelect: changeOnSelect,
  187. onSelect: onInternalSelect,
  188. checkable: checkable,
  189. searchOptions: searchOptions,
  190. dropdownPrefixCls: dropdownPrefixCls,
  191. loadData: loadData,
  192. expandTrigger: expandTrigger,
  193. expandIcon: expandIcon,
  194. loadingIcon: loadingIcon,
  195. dropdownMenuColumnStyle: dropdownMenuColumnStyle,
  196. optionRender: optionRender
  197. };
  198. }, [mergedOptions, mergedFieldNames, checkedValues, halfCheckedValues, changeOnSelect, onInternalSelect, checkable, searchOptions, dropdownPrefixCls, loadData, expandTrigger, expandIcon, loadingIcon, dropdownMenuColumnStyle, optionRender]);
  199. // ==============================================================
  200. // == Render ==
  201. // ==============================================================
  202. var emptyOptions = !(mergedSearchValue ? searchOptions : mergedOptions).length;
  203. var dropdownStyle =
  204. // Search to match width
  205. mergedSearchValue && searchConfig.matchInputWidth ||
  206. // Empty keep the width
  207. emptyOptions ? {} : {
  208. minWidth: 'auto'
  209. };
  210. return /*#__PURE__*/React.createElement(_context.default.Provider, {
  211. value: cascaderContext
  212. }, /*#__PURE__*/React.createElement(_rcSelect.BaseSelect, (0, _extends2.default)({}, restProps, {
  213. // MISC
  214. ref: ref,
  215. id: mergedId,
  216. prefixCls: prefixCls,
  217. autoClearSearchValue: autoClearSearchValue,
  218. dropdownMatchSelectWidth: dropdownMatchSelectWidth,
  219. dropdownStyle: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, dropdownStyle), customDropdownStyle)
  220. // Value
  221. ,
  222. displayValues: displayValues,
  223. onDisplayValuesChange: onDisplayValuesChange,
  224. mode: multiple ? 'multiple' : undefined
  225. // Search
  226. ,
  227. searchValue: mergedSearchValue,
  228. onSearch: onInternalSearch,
  229. showSearch: mergedShowSearch
  230. // Options
  231. ,
  232. OptionList: _OptionList.default,
  233. emptyOptions: emptyOptions
  234. // Open
  235. ,
  236. open: mergedOpen,
  237. dropdownClassName: mergedDropdownClassName,
  238. placement: mergedPlacement,
  239. onDropdownVisibleChange: onInternalDropdownVisibleChange
  240. // Children
  241. ,
  242. getRawInputElement: function getRawInputElement() {
  243. return children;
  244. }
  245. })));
  246. });
  247. if (process.env.NODE_ENV !== 'production') {
  248. Cascader.displayName = 'Cascader';
  249. }
  250. Cascader.SHOW_PARENT = _commonUtil.SHOW_PARENT;
  251. Cascader.SHOW_CHILD = _commonUtil.SHOW_CHILD;
  252. Cascader.Panel = _Panel.default;
  253. var _default = exports.default = Cascader;