index.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.cascaderProps = cascaderProps;
  7. exports.default = void 0;
  8. var _vue = require("vue");
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  11. var _vcCascader = _interopRequireWildcard(require("../vc-cascader"));
  12. var _RightOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/RightOutlined"));
  13. var _LoadingOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/LoadingOutlined"));
  14. var _LeftOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/LeftOutlined"));
  15. var _iconUtil = _interopRequireDefault(require("../select/utils/iconUtil"));
  16. var _type = require("../_util/type");
  17. var _omit = _interopRequireDefault(require("../_util/omit"));
  18. var _vueTypes = _interopRequireDefault(require("../_util/vue-types"));
  19. var _propsUtil = require("../_util/props-util");
  20. var _useConfigInject = _interopRequireDefault(require("../config-provider/hooks/useConfigInject"));
  21. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  22. var _devWarning = _interopRequireDefault(require("../vc-util/devWarning"));
  23. var _transition = require("../_util/transition");
  24. var _form = require("../form");
  25. var _statusUtils = require("../_util/statusUtils");
  26. var _FormItemContext = require("../form/FormItemContext");
  27. var _Compact = require("../space/Compact");
  28. var _style = _interopRequireDefault(require("../select/style"));
  29. var _style2 = _interopRequireDefault(require("./style"));
  30. var _DisabledContext = require("../config-provider/DisabledContext");
  31. function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
  32. function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
  33. var __rest = void 0 && (void 0).__rest || function (s, e) {
  34. var t = {};
  35. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
  36. if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  37. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
  38. }
  39. return t;
  40. };
  41. function highlightKeyword(str, lowerKeyword, prefixCls) {
  42. const cells = str.toLowerCase().split(lowerKeyword).reduce((list, cur, index) => index === 0 ? [cur] : [...list, lowerKeyword, cur], []);
  43. const fillCells = [];
  44. let start = 0;
  45. cells.forEach((cell, index) => {
  46. const end = start + cell.length;
  47. let originWorld = str.slice(start, end);
  48. start = end;
  49. if (index % 2 === 1) {
  50. const _originWorld = function () {
  51. return originWorld;
  52. }();
  53. originWorld = (0, _vue.createVNode)("span", {
  54. "class": `${prefixCls}-menu-item-keyword`,
  55. "key": "seperator"
  56. }, [originWorld]);
  57. }
  58. fillCells.push(originWorld);
  59. });
  60. return fillCells;
  61. }
  62. const defaultSearchRender = _ref => {
  63. let {
  64. inputValue,
  65. path,
  66. prefixCls,
  67. fieldNames
  68. } = _ref;
  69. const optionList = [];
  70. // We do lower here to save perf
  71. const lower = inputValue.toLowerCase();
  72. path.forEach((node, index) => {
  73. if (index !== 0) {
  74. optionList.push(' / ');
  75. }
  76. let label = node[fieldNames.label];
  77. const type = typeof label;
  78. if (type === 'string' || type === 'number') {
  79. label = highlightKeyword(String(label), lower, prefixCls);
  80. }
  81. optionList.push(label);
  82. });
  83. return optionList;
  84. };
  85. function cascaderProps() {
  86. return (0, _extends2.default)((0, _extends2.default)({}, (0, _omit.default)((0, _vcCascader.cascaderProps)(), ['customSlots', 'checkable', 'options'])), {
  87. multiple: {
  88. type: Boolean,
  89. default: undefined
  90. },
  91. size: String,
  92. bordered: {
  93. type: Boolean,
  94. default: undefined
  95. },
  96. placement: {
  97. type: String
  98. },
  99. suffixIcon: _vueTypes.default.any,
  100. status: String,
  101. options: Array,
  102. popupClassName: String,
  103. /** @deprecated Please use `popupClassName` instead */
  104. dropdownClassName: String,
  105. 'onUpdate:value': Function
  106. });
  107. }
  108. const Cascader = (0, _vue.defineComponent)({
  109. compatConfig: {
  110. MODE: 3
  111. },
  112. name: 'ACascader',
  113. inheritAttrs: false,
  114. props: (0, _propsUtil.initDefaultProps)(cascaderProps(), {
  115. bordered: true,
  116. choiceTransitionName: '',
  117. allowClear: true
  118. }),
  119. setup(props, _ref2) {
  120. let {
  121. attrs,
  122. expose,
  123. slots,
  124. emit
  125. } = _ref2;
  126. // ====================== Warning ======================
  127. if (process.env.NODE_ENV !== 'production') {
  128. (0, _devWarning.default)(!props.dropdownClassName, 'Cascader', '`dropdownClassName` is deprecated. Please use `popupClassName` instead.');
  129. }
  130. const formItemContext = (0, _form.useInjectFormItemContext)();
  131. const formItemInputContext = _FormItemContext.FormItemInputContext.useInject();
  132. const mergedStatus = (0, _vue.computed)(() => (0, _statusUtils.getMergedStatus)(formItemInputContext.status, props.status));
  133. const {
  134. prefixCls: cascaderPrefixCls,
  135. rootPrefixCls,
  136. getPrefixCls,
  137. direction,
  138. getPopupContainer,
  139. renderEmpty,
  140. size: contextSize,
  141. disabled
  142. } = (0, _useConfigInject.default)('cascader', props);
  143. const prefixCls = (0, _vue.computed)(() => getPrefixCls('select', props.prefixCls));
  144. const {
  145. compactSize,
  146. compactItemClassnames
  147. } = (0, _Compact.useCompactItemContext)(prefixCls, direction);
  148. const mergedSize = (0, _vue.computed)(() => compactSize.value || contextSize.value);
  149. const contextDisabled = (0, _DisabledContext.useInjectDisabled)();
  150. const mergedDisabled = (0, _vue.computed)(() => {
  151. var _a;
  152. return (_a = disabled.value) !== null && _a !== void 0 ? _a : contextDisabled.value;
  153. });
  154. const [wrapSelectSSR, hashId] = (0, _style.default)(prefixCls);
  155. const [wrapCascaderSSR] = (0, _style2.default)(cascaderPrefixCls);
  156. const isRtl = (0, _vue.computed)(() => direction.value === 'rtl');
  157. // =================== Warning =====================
  158. if (process.env.NODE_ENV !== 'production') {
  159. (0, _vue.watchEffect)(() => {
  160. (0, _devWarning.default)(!props.multiple || !props.displayRender || !slots.displayRender, 'Cascader', '`displayRender` not work on `multiple`. Please use `tagRender` instead.');
  161. });
  162. }
  163. // ==================== Search =====================
  164. const mergedShowSearch = (0, _vue.computed)(() => {
  165. if (!props.showSearch) {
  166. return props.showSearch;
  167. }
  168. let searchConfig = {
  169. render: defaultSearchRender
  170. };
  171. if (typeof props.showSearch === 'object') {
  172. searchConfig = (0, _extends2.default)((0, _extends2.default)({}, searchConfig), props.showSearch);
  173. }
  174. return searchConfig;
  175. });
  176. // =================== Dropdown ====================
  177. const mergedDropdownClassName = (0, _vue.computed)(() => (0, _classNames.default)(props.popupClassName || props.dropdownClassName, `${cascaderPrefixCls.value}-dropdown`, {
  178. [`${cascaderPrefixCls.value}-dropdown-rtl`]: isRtl.value
  179. }, hashId.value));
  180. const selectRef = (0, _vue.ref)();
  181. expose({
  182. focus() {
  183. var _a;
  184. (_a = selectRef.value) === null || _a === void 0 ? void 0 : _a.focus();
  185. },
  186. blur() {
  187. var _a;
  188. (_a = selectRef.value) === null || _a === void 0 ? void 0 : _a.blur();
  189. }
  190. });
  191. const handleChange = function () {
  192. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  193. args[_key] = arguments[_key];
  194. }
  195. emit('update:value', args[0]);
  196. emit('change', ...args);
  197. formItemContext.onFieldChange();
  198. };
  199. const handleBlur = function () {
  200. for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
  201. args[_key2] = arguments[_key2];
  202. }
  203. emit('blur', ...args);
  204. formItemContext.onFieldBlur();
  205. };
  206. const mergedShowArrow = (0, _vue.computed)(() => props.showArrow !== undefined ? props.showArrow : props.loading || !props.multiple);
  207. const placement = (0, _vue.computed)(() => {
  208. if (props.placement !== undefined) {
  209. return props.placement;
  210. }
  211. return direction.value === 'rtl' ? 'bottomRight' : 'bottomLeft';
  212. });
  213. return () => {
  214. var _a, _b;
  215. const {
  216. notFoundContent = (_a = slots.notFoundContent) === null || _a === void 0 ? void 0 : _a.call(slots),
  217. expandIcon = (_b = slots.expandIcon) === null || _b === void 0 ? void 0 : _b.call(slots),
  218. multiple,
  219. bordered,
  220. allowClear,
  221. choiceTransitionName,
  222. transitionName,
  223. id = formItemContext.id.value
  224. } = props,
  225. restProps = __rest(props, ["notFoundContent", "expandIcon", "multiple", "bordered", "allowClear", "choiceTransitionName", "transitionName", "id"]);
  226. // =================== No Found ====================
  227. const mergedNotFoundContent = notFoundContent || renderEmpty('Cascader');
  228. // ===================== Icon ======================
  229. let mergedExpandIcon = expandIcon;
  230. if (!expandIcon) {
  231. mergedExpandIcon = isRtl.value ? (0, _vue.createVNode)(_LeftOutlined.default, null, null) : (0, _vue.createVNode)(_RightOutlined.default, null, null);
  232. }
  233. const loadingIcon = (0, _vue.createVNode)("span", {
  234. "class": `${prefixCls.value}-menu-item-loading-icon`
  235. }, [(0, _vue.createVNode)(_LoadingOutlined.default, {
  236. "spin": true
  237. }, null)]);
  238. // ===================== Icons =====================
  239. const {
  240. suffixIcon,
  241. removeIcon,
  242. clearIcon
  243. } = (0, _iconUtil.default)((0, _extends2.default)((0, _extends2.default)({}, props), {
  244. hasFeedback: formItemInputContext.hasFeedback,
  245. feedbackIcon: formItemInputContext.feedbackIcon,
  246. multiple,
  247. prefixCls: prefixCls.value,
  248. showArrow: mergedShowArrow.value
  249. }), slots);
  250. return wrapCascaderSSR(wrapSelectSSR((0, _vue.createVNode)(_vcCascader.default, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, restProps), attrs), {}, {
  251. "id": id,
  252. "prefixCls": prefixCls.value,
  253. "class": [cascaderPrefixCls.value, {
  254. [`${prefixCls.value}-lg`]: mergedSize.value === 'large',
  255. [`${prefixCls.value}-sm`]: mergedSize.value === 'small',
  256. [`${prefixCls.value}-rtl`]: isRtl.value,
  257. [`${prefixCls.value}-borderless`]: !bordered,
  258. [`${prefixCls.value}-in-form-item`]: formItemInputContext.isFormItemInput
  259. }, (0, _statusUtils.getStatusClassNames)(prefixCls.value, mergedStatus.value, formItemInputContext.hasFeedback), compactItemClassnames.value, attrs.class, hashId.value],
  260. "disabled": mergedDisabled.value,
  261. "direction": direction.value,
  262. "placement": placement.value,
  263. "notFoundContent": mergedNotFoundContent,
  264. "allowClear": allowClear,
  265. "showSearch": mergedShowSearch.value,
  266. "expandIcon": mergedExpandIcon,
  267. "inputIcon": suffixIcon,
  268. "removeIcon": removeIcon,
  269. "clearIcon": clearIcon,
  270. "loadingIcon": loadingIcon,
  271. "checkable": !!multiple,
  272. "dropdownClassName": mergedDropdownClassName.value,
  273. "dropdownPrefixCls": cascaderPrefixCls.value,
  274. "choiceTransitionName": (0, _transition.getTransitionName)(rootPrefixCls.value, '', choiceTransitionName),
  275. "transitionName": (0, _transition.getTransitionName)(rootPrefixCls.value, (0, _transition.getTransitionDirection)(placement.value), transitionName),
  276. "getPopupContainer": getPopupContainer === null || getPopupContainer === void 0 ? void 0 : getPopupContainer.value,
  277. "customSlots": (0, _extends2.default)((0, _extends2.default)({}, slots), {
  278. checkable: () => (0, _vue.createVNode)("span", {
  279. "class": `${cascaderPrefixCls.value}-checkbox-inner`
  280. }, null)
  281. }),
  282. "tagRender": props.tagRender || slots.tagRender,
  283. "displayRender": props.displayRender || slots.displayRender,
  284. "maxTagPlaceholder": props.maxTagPlaceholder || slots.maxTagPlaceholder,
  285. "showArrow": formItemInputContext.hasFeedback || props.showArrow,
  286. "onChange": handleChange,
  287. "onBlur": handleBlur,
  288. "ref": selectRef
  289. }), slots)));
  290. };
  291. }
  292. });
  293. var _default = exports.default = (0, _type.withInstall)((0, _extends2.default)(Cascader, {
  294. SHOW_CHILD: _vcCascader.SHOW_CHILD,
  295. SHOW_PARENT: _vcCascader.SHOW_PARENT
  296. }));