vxe-pc-ui 4.14.39 → 4.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/dist/all.esm.js +1722 -728
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/cascader/src/cascader.js +1157 -172
  5. package/es/cascader/src/util.js +7 -0
  6. package/es/cascader/style.css +197 -21
  7. package/es/cascader/style.min.css +1 -1
  8. package/es/input/src/input.js +2 -2
  9. package/es/language/ar-EG.js +7 -0
  10. package/es/language/de-DE.js +7 -0
  11. package/es/language/en-US.js +7 -0
  12. package/es/language/es-ES.js +7 -0
  13. package/es/language/fr-FR.js +7 -0
  14. package/es/language/hu-HU.js +7 -0
  15. package/es/language/hy-AM.js +7 -0
  16. package/es/language/id-ID.js +7 -0
  17. package/es/language/it-IT.js +7 -0
  18. package/es/language/ja-JP.js +7 -0
  19. package/es/language/ko-KR.js +7 -0
  20. package/es/language/ms-MY.js +7 -0
  21. package/es/language/nb-NO.js +7 -0
  22. package/es/language/pt-BR.js +7 -0
  23. package/es/language/ru-RU.js +7 -0
  24. package/es/language/th-TH.js +7 -0
  25. package/es/language/ug-CN.js +7 -0
  26. package/es/language/uk-UA.js +7 -0
  27. package/es/language/uz-UZ.js +7 -0
  28. package/es/language/vi-VN.js +7 -0
  29. package/es/language/zh-CHT.js +7 -0
  30. package/es/language/zh-CN.js +7 -0
  31. package/es/list/style.css +2 -1
  32. package/es/list/style.min.css +1 -1
  33. package/es/number-input/src/number-input.js +7 -7
  34. package/es/number-input/src/util.js +2 -2
  35. package/es/split/style.css +1 -1
  36. package/es/split/style.min.css +1 -1
  37. package/es/splitter/style.css +1 -1
  38. package/es/splitter/style.min.css +1 -1
  39. package/es/style.css +1 -1
  40. package/es/style.min.css +1 -1
  41. package/es/tree/src/tree.js +23 -21
  42. package/es/tree-select/src/tree-select.js +20 -16
  43. package/es/tree-select/style.css +1 -8
  44. package/es/tree-select/style.min.css +1 -1
  45. package/es/ui/index.js +10 -4
  46. package/es/ui/src/dom.js +2 -2
  47. package/es/ui/src/log.js +1 -1
  48. package/es/vxe-cascader/style.css +197 -21
  49. package/es/vxe-cascader/style.min.css +1 -1
  50. package/es/vxe-list/style.css +2 -1
  51. package/es/vxe-list/style.min.css +1 -1
  52. package/es/vxe-split/style.css +1 -1
  53. package/es/vxe-split/style.min.css +1 -1
  54. package/es/vxe-splitter/style.css +1 -1
  55. package/es/vxe-splitter/style.min.css +1 -1
  56. package/es/vxe-tree-select/style.css +1 -8
  57. package/es/vxe-tree-select/style.min.css +1 -1
  58. package/lib/cascader/src/cascader.js +1322 -173
  59. package/lib/cascader/src/cascader.min.js +1 -1
  60. package/lib/cascader/src/util.js +15 -0
  61. package/lib/cascader/src/util.min.js +1 -0
  62. package/lib/cascader/style/style.css +197 -21
  63. package/lib/cascader/style/style.min.css +1 -1
  64. package/lib/index.umd.js +2159 -972
  65. package/lib/index.umd.min.js +1 -1
  66. package/lib/input/src/input.js +2 -2
  67. package/lib/input/src/input.min.js +1 -1
  68. package/lib/language/ar-EG.js +7 -0
  69. package/lib/language/ar-EG.min.js +1 -1
  70. package/lib/language/ar-EG.umd.js +7 -0
  71. package/lib/language/de-DE.js +7 -0
  72. package/lib/language/de-DE.min.js +1 -1
  73. package/lib/language/de-DE.umd.js +7 -0
  74. package/lib/language/en-US.js +7 -0
  75. package/lib/language/en-US.min.js +1 -1
  76. package/lib/language/en-US.umd.js +7 -0
  77. package/lib/language/es-ES.js +7 -0
  78. package/lib/language/es-ES.min.js +1 -1
  79. package/lib/language/es-ES.umd.js +7 -0
  80. package/lib/language/fr-FR.js +7 -0
  81. package/lib/language/fr-FR.min.js +1 -1
  82. package/lib/language/fr-FR.umd.js +7 -0
  83. package/lib/language/hu-HU.js +7 -0
  84. package/lib/language/hu-HU.min.js +1 -1
  85. package/lib/language/hu-HU.umd.js +7 -0
  86. package/lib/language/hy-AM.js +7 -0
  87. package/lib/language/hy-AM.min.js +1 -1
  88. package/lib/language/hy-AM.umd.js +7 -0
  89. package/lib/language/id-ID.js +7 -0
  90. package/lib/language/id-ID.min.js +1 -1
  91. package/lib/language/id-ID.umd.js +7 -0
  92. package/lib/language/it-IT.js +7 -0
  93. package/lib/language/it-IT.min.js +1 -1
  94. package/lib/language/it-IT.umd.js +7 -0
  95. package/lib/language/ja-JP.js +7 -0
  96. package/lib/language/ja-JP.min.js +1 -1
  97. package/lib/language/ja-JP.umd.js +7 -0
  98. package/lib/language/ko-KR.js +7 -0
  99. package/lib/language/ko-KR.min.js +1 -1
  100. package/lib/language/ko-KR.umd.js +7 -0
  101. package/lib/language/ms-MY.js +7 -0
  102. package/lib/language/ms-MY.min.js +1 -1
  103. package/lib/language/ms-MY.umd.js +7 -0
  104. package/lib/language/nb-NO.js +7 -0
  105. package/lib/language/nb-NO.min.js +1 -1
  106. package/lib/language/nb-NO.umd.js +7 -0
  107. package/lib/language/pt-BR.js +7 -0
  108. package/lib/language/pt-BR.min.js +1 -1
  109. package/lib/language/pt-BR.umd.js +7 -0
  110. package/lib/language/ru-RU.js +7 -0
  111. package/lib/language/ru-RU.min.js +1 -1
  112. package/lib/language/ru-RU.umd.js +7 -0
  113. package/lib/language/th-TH.js +7 -0
  114. package/lib/language/th-TH.min.js +1 -1
  115. package/lib/language/th-TH.umd.js +7 -0
  116. package/lib/language/ug-CN.js +7 -0
  117. package/lib/language/ug-CN.min.js +1 -1
  118. package/lib/language/ug-CN.umd.js +7 -0
  119. package/lib/language/uk-UA.js +7 -0
  120. package/lib/language/uk-UA.min.js +1 -1
  121. package/lib/language/uk-UA.umd.js +7 -0
  122. package/lib/language/uz-UZ.js +7 -0
  123. package/lib/language/uz-UZ.min.js +1 -1
  124. package/lib/language/uz-UZ.umd.js +7 -0
  125. package/lib/language/vi-VN.js +7 -0
  126. package/lib/language/vi-VN.min.js +1 -1
  127. package/lib/language/vi-VN.umd.js +7 -0
  128. package/lib/language/zh-CHT.js +7 -0
  129. package/lib/language/zh-CHT.min.js +1 -1
  130. package/lib/language/zh-CHT.umd.js +7 -0
  131. package/lib/language/zh-CN.js +7 -0
  132. package/lib/language/zh-CN.min.js +1 -1
  133. package/lib/language/zh-CN.umd.js +7 -0
  134. package/lib/list/style/style.css +2 -1
  135. package/lib/list/style/style.min.css +1 -1
  136. package/lib/number-input/src/number-input.js +7 -4
  137. package/lib/number-input/src/number-input.min.js +1 -1
  138. package/lib/number-input/src/util.js +2 -2
  139. package/lib/number-input/src/util.min.js +1 -1
  140. package/lib/split/style/style.css +1 -1
  141. package/lib/split/style/style.min.css +1 -1
  142. package/lib/splitter/style/style.css +1 -1
  143. package/lib/splitter/style/style.min.css +1 -1
  144. package/lib/style.css +1 -1
  145. package/lib/style.min.css +1 -1
  146. package/lib/tree/src/tree.js +23 -21
  147. package/lib/tree/src/tree.min.js +1 -1
  148. package/lib/tree-select/src/tree-select.js +22 -17
  149. package/lib/tree-select/src/tree-select.min.js +1 -1
  150. package/lib/tree-select/style/style.css +1 -8
  151. package/lib/tree-select/style/style.min.css +1 -1
  152. package/lib/ui/index.js +10 -4
  153. package/lib/ui/index.min.js +1 -1
  154. package/lib/ui/src/dom.js +5 -3
  155. package/lib/ui/src/dom.min.js +1 -1
  156. package/lib/ui/src/log.js +1 -1
  157. package/lib/ui/src/log.min.js +1 -1
  158. package/lib/vxe-cascader/style/style.css +197 -21
  159. package/lib/vxe-cascader/style/style.min.css +1 -1
  160. package/lib/vxe-list/style/style.css +2 -1
  161. package/lib/vxe-list/style/style.min.css +1 -1
  162. package/lib/vxe-split/style/style.css +1 -1
  163. package/lib/vxe-split/style/style.min.css +1 -1
  164. package/lib/vxe-splitter/style/style.css +1 -1
  165. package/lib/vxe-splitter/style/style.min.css +1 -1
  166. package/lib/vxe-tree-select/style/style.css +1 -8
  167. package/lib/vxe-tree-select/style/style.min.css +1 -1
  168. package/package.json +1 -1
  169. package/packages/cascader/src/cascader.ts +1193 -182
  170. package/packages/cascader/src/util.ts +9 -0
  171. package/packages/input/src/input.ts +2 -2
  172. package/packages/language/ar-EG.ts +7 -0
  173. package/packages/language/de-DE.ts +7 -0
  174. package/packages/language/en-US.ts +7 -0
  175. package/packages/language/es-ES.ts +7 -0
  176. package/packages/language/fr-FR.ts +7 -0
  177. package/packages/language/hu-HU.ts +7 -0
  178. package/packages/language/hy-AM.ts +7 -0
  179. package/packages/language/id-ID.ts +7 -0
  180. package/packages/language/it-IT.ts +7 -0
  181. package/packages/language/ja-JP.ts +7 -0
  182. package/packages/language/ko-KR.ts +7 -0
  183. package/packages/language/ms-MY.ts +7 -0
  184. package/packages/language/nb-NO.ts +7 -0
  185. package/packages/language/pt-BR.ts +7 -0
  186. package/packages/language/ru-RU.ts +7 -0
  187. package/packages/language/th-TH.ts +7 -0
  188. package/packages/language/ug-CN.ts +7 -0
  189. package/packages/language/uk-UA.ts +7 -0
  190. package/packages/language/uz-UZ.ts +7 -0
  191. package/packages/language/vi-VN.ts +7 -0
  192. package/packages/language/zh-CHT.ts +7 -0
  193. package/packages/language/zh-CN.ts +7 -0
  194. package/packages/number-input/src/number-input.ts +7 -7
  195. package/packages/number-input/src/util.ts +2 -2
  196. package/packages/tree/src/tree.ts +23 -22
  197. package/packages/tree-select/src/tree-select.ts +21 -16
  198. package/packages/ui/index.ts +10 -3
  199. package/packages/ui/src/dom.ts +3 -2
  200. package/styles/components/cascader.scss +116 -21
  201. package/styles/components/list.scss +2 -1
  202. package/styles/components/splitter.scss +3 -1
  203. package/styles/components/tree-select.scss +1 -8
  204. package/styles/helpers/placement.scss +2 -2
  205. package/styles/theme/base.scss +7 -0
  206. package/styles/theme/dark.scss +9 -0
  207. package/styles/theme/light.scss +9 -0
  208. package/styles/variable.scss +8 -0
  209. package/types/components/cascader.d.ts +167 -57
  210. package/types/ui/global-icon.d.ts +5 -0
  211. /package/es/icon/{iconfont.1781503194392.ttf → iconfont.1781659237913.ttf} +0 -0
  212. /package/es/icon/{iconfont.1781503194392.woff → iconfont.1781659237913.woff} +0 -0
  213. /package/es/icon/{iconfont.1781503194392.woff2 → iconfont.1781659237913.woff2} +0 -0
  214. /package/es/{iconfont.1781503194392.ttf → iconfont.1781659237913.ttf} +0 -0
  215. /package/es/{iconfont.1781503194392.woff → iconfont.1781659237913.woff} +0 -0
  216. /package/es/{iconfont.1781503194392.woff2 → iconfont.1781659237913.woff2} +0 -0
  217. /package/lib/icon/style/{iconfont.1781503194392.ttf → iconfont.1781659237913.ttf} +0 -0
  218. /package/lib/icon/style/{iconfont.1781503194392.woff → iconfont.1781659237913.woff} +0 -0
  219. /package/lib/icon/style/{iconfont.1781503194392.woff2 → iconfont.1781659237913.woff2} +0 -0
  220. /package/lib/{iconfont.1781503194392.ttf → iconfont.1781659237913.ttf} +0 -0
  221. /package/lib/{iconfont.1781503194392.woff → iconfont.1781659237913.woff} +0 -0
  222. /package/lib/{iconfont.1781503194392.woff2 → iconfont.1781659237913.woff2} +0 -0
@@ -9,20 +9,55 @@ var _comp = require("../../ui/src/comp");
9
9
  var _ui = require("../../ui");
10
10
  var _dom = require("../../ui/src/dom");
11
11
  var _utils = require("../../ui/src/utils");
12
- var _util = require("../../tree/src/util");
12
+ var _util = require("./util");
13
13
  var _log = require("../../ui/src/log");
14
14
  var _xeUtils = _interopRequireDefault(require("xe-utils"));
15
+ var _list = _interopRequireDefault(require("../../list/src/list"));
15
16
  var _input = _interopRequireDefault(require("../../input/src/input"));
16
17
  var _button = _interopRequireDefault(require("../../button/src/button"));
17
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
- function getOptUniqueId() {
19
+ /**
20
+ * 生成节点的唯一主键
21
+ */
22
+ function getNodeUniqueId() {
19
23
  return _xeUtils.default.uniqueId('node_');
20
24
  }
25
+ function createReactData() {
26
+ return {
27
+ initialized: false,
28
+ searchValue: '',
29
+ searchLoading: false,
30
+ currentCunkList: [],
31
+ currentItems: [],
32
+ currentNode: null,
33
+ panelIndex: 0,
34
+ panelStyle: {},
35
+ panelPlacement: null,
36
+ triggerFocusPanel: false,
37
+ visiblePanel: false,
38
+ isAniVisible: false,
39
+ isActivated: false,
40
+ selectRadioKey: null,
41
+ treeList: [],
42
+ updateExpandedFlag: 1,
43
+ updateCheckboxFlag: 1,
44
+ fullOptFlag: 1,
45
+ lazyOptFlag: 1
46
+ };
47
+ }
21
48
  function createInternalData() {
22
49
  return {
23
50
  // hpTimeout: undefined,
24
- fullOptionList: [],
25
- fullNodeMaps: {}
51
+ afterTreeList: [],
52
+ treeFullData: [],
53
+ afterVisibleList: [],
54
+ nodeMaps: {},
55
+ fullNodeMaps: {},
56
+ lazyNodeMaps: {},
57
+ indeterminateRowMaps: {},
58
+ selectCheckboxMaps: {},
59
+ treeExpandedMaps: {},
60
+ treeExpandLazyLoadedMaps: {}
26
61
  };
27
62
  }
28
63
  var _default = exports.default = (0, _comp.defineVxeComponent)({
@@ -45,25 +80,41 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
45
80
  },
46
81
  filterable: Boolean,
47
82
  filterConfig: Object,
83
+ showFullLabel: {
84
+ type: Boolean,
85
+ default: (0, _ui.getConfig)().cascader.showFullLabel
86
+ },
87
+ separator: {
88
+ type: String,
89
+ default: (0, _ui.getConfig)().cascader.separator
90
+ },
48
91
  multiple: Boolean,
49
92
  className: [String, Function],
50
93
  prefixIcon: String,
51
- placement: String,
52
- transform: Boolean,
53
94
  lazyOptions: Array,
54
95
  options: Array,
55
96
  optionProps: Object,
56
- zIndex: Number,
57
97
  size: {
58
98
  type: String,
59
99
  default: () => (0, _ui.getConfig)().cascader.size || (0, _ui.getConfig)().size
60
100
  },
101
+ treeConfig: Object,
102
+ radioConfig: Object,
103
+ checkboxConfig: Object,
61
104
  remote: Boolean,
62
105
  remoteConfig: Function,
63
106
  popupConfig: Object,
64
- autoClose: {
107
+ checkedClosable: {
108
+ type: Boolean,
109
+ default: () => (0, _ui.getConfig)().cascader.checkedClosable
110
+ },
111
+ clearClosable: {
112
+ type: Boolean,
113
+ default: () => (0, _ui.getConfig)().cascader.clearClosable
114
+ },
115
+ showCloseButton: {
65
116
  type: Boolean,
66
- default: () => (0, _ui.getConfig)().cascader.autoClose
117
+ default: () => (0, _ui.getConfig)().cascader.showCloseButton
67
118
  },
68
119
  showTotalButton: {
69
120
  type: Boolean,
@@ -76,18 +127,9 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
76
127
  showClearButton: {
77
128
  type: Boolean,
78
129
  default: () => (0, _ui.getConfig)().cascader.showClearButton
79
- },
80
- transfer: {
81
- type: Boolean,
82
- default: null
83
- },
84
- /**
85
- * 已废弃,被 remote-config.queryMethod 替换
86
- * @deprecated
87
- */
88
- remoteMethod: Function
130
+ }
89
131
  },
90
- emits: ['update:modelValue', 'change', 'all-change', 'clear', 'blur', 'focus', 'click', 'node-click'],
132
+ emits: ['update:modelValue', 'change', 'all-change', 'clear', 'blur', 'focus', 'click', 'node-click', 'node-expand', 'current-change', 'radio-change', 'checkbox-change', 'load-success', 'load-error', 'visible-change'],
91
133
  setup(props, context) {
92
134
  const {
93
135
  emit,
@@ -105,21 +147,9 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
105
147
  const refElem = (0, _vue.ref)();
106
148
  const refInput = (0, _vue.ref)();
107
149
  const refInpSearch = (0, _vue.ref)();
108
- const refTreeWrapper = (0, _vue.ref)();
150
+ const refChunkWrapper = (0, _vue.ref)();
109
151
  const refOptionPanel = (0, _vue.ref)();
110
- const refTree = (0, _vue.ref)();
111
- const reactData = (0, _vue.reactive)({
112
- initialized: false,
113
- searchValue: '',
114
- searchLoading: false,
115
- panelIndex: 0,
116
- panelStyle: {},
117
- panelPlacement: null,
118
- triggerFocusPanel: false,
119
- visiblePanel: false,
120
- isAniVisible: false,
121
- isActivated: false
122
- });
152
+ const reactData = (0, _vue.reactive)(createReactData());
123
153
  const internalData = createInternalData();
124
154
  const refMaps = {
125
155
  refElem
@@ -149,19 +179,26 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
149
179
  return disabled;
150
180
  });
151
181
  const computeBtnTransfer = (0, _vue.computed)(() => {
182
+ const popupOpts = computePopupOpts.value;
152
183
  const {
153
184
  transfer
154
- } = props;
155
- if (transfer === null) {
156
- const globalTransfer = (0, _ui.getConfig)().select.transfer;
157
- if (_xeUtils.default.isBoolean(globalTransfer)) {
158
- return globalTransfer;
159
- }
160
- if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
161
- return true;
162
- }
185
+ } = popupOpts;
186
+ if (_xeUtils.default.isBoolean(transfer)) {
187
+ return transfer;
188
+ }
189
+ if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
190
+ return true;
163
191
  }
164
- return transfer;
192
+ return false;
193
+ });
194
+ const computeTreeOpts = (0, _vue.computed)(() => {
195
+ return Object.assign({}, (0, _ui.getConfig)().cascader.treeConfig, props.treeConfig);
196
+ });
197
+ const computeRadioOpts = (0, _vue.computed)(() => {
198
+ return Object.assign({}, (0, _ui.getConfig)().cascader.radioConfig, props.radioConfig);
199
+ });
200
+ const computeCheckboxOpts = (0, _vue.computed)(() => {
201
+ return Object.assign({}, (0, _ui.getConfig)().cascader.checkboxConfig, props.checkboxConfig);
165
202
  });
166
203
  const computePopupOpts = (0, _vue.computed)(() => {
167
204
  return Object.assign({}, (0, _ui.getConfig)().cascader.popupConfig, props.popupConfig);
@@ -169,10 +206,6 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
169
206
  const computePropsOpts = (0, _vue.computed)(() => {
170
207
  return props.optionProps || {};
171
208
  });
172
- const computeNodeKeyField = (0, _vue.computed)(() => {
173
- const valueField = computeValueField.value;
174
- return valueField;
175
- });
176
209
  const computeLabelField = (0, _vue.computed)(() => {
177
210
  const propsOpts = computePropsOpts.value;
178
211
  return propsOpts.label || 'label';
@@ -181,54 +214,91 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
181
214
  const propsOpts = computePropsOpts.value;
182
215
  return propsOpts.value || 'value';
183
216
  });
217
+ const computeKeyField = (0, _vue.computed)(() => {
218
+ const treeOpts = computeTreeOpts.value;
219
+ return treeOpts.keyField || 'id';
220
+ });
221
+ const computeParentField = (0, _vue.computed)(() => {
222
+ const treeOpts = computeTreeOpts.value;
223
+ return treeOpts.parentField || 'parentId';
224
+ });
184
225
  const computeChildrenField = (0, _vue.computed)(() => {
185
- const propsOpts = computePropsOpts.value;
186
- return propsOpts.children || 'children';
226
+ const treeOpts = computeTreeOpts.value;
227
+ return treeOpts.childrenField || 'children';
228
+ });
229
+ const computeMapChildrenField = (0, _vue.computed)(() => {
230
+ const treeOpts = computeTreeOpts.value;
231
+ return treeOpts.mapChildrenField || 'mapChildren';
232
+ });
233
+ const computeHasChildField = (0, _vue.computed)(() => {
234
+ const treeOpts = computeTreeOpts.value;
235
+ return treeOpts.hasChildField || 'hasChild';
187
236
  });
188
237
  const computeRemoteOpts = (0, _vue.computed)(() => {
189
238
  return Object.assign({}, (0, _ui.getConfig)().cascader.remoteConfig, props.remoteConfig);
190
239
  });
240
+ const computeSelectVals = (0, _vue.computed)(() => {
241
+ const {
242
+ modelValue
243
+ } = props;
244
+ return _xeUtils.default.eqNull(modelValue) ? [] : _xeUtils.default.isArray(modelValue) ? modelValue : [modelValue];
245
+ });
191
246
  const computeSelectLabel = (0, _vue.computed)(() => {
192
247
  const {
193
- modelValue,
194
- lazyOptions
248
+ showFullLabel
195
249
  } = props;
196
250
  const {
197
- fullNodeMaps
251
+ fullOptFlag,
252
+ lazyOptFlag
253
+ } = reactData;
254
+ const {
255
+ fullNodeMaps,
256
+ lazyNodeMaps
198
257
  } = internalData;
199
- const valueField = computeValueField.value;
200
258
  const labelField = computeLabelField.value;
201
- const selectVals = _xeUtils.default.eqNull(modelValue) ? [] : _xeUtils.default.isArray(modelValue) ? modelValue : [modelValue];
259
+ const selectVals = computeSelectVals.value;
202
260
  return selectVals.map(val => {
203
261
  const cacheItem = fullNodeMaps[val];
204
- if (cacheItem) {
205
- return cacheItem.item[labelField];
262
+ if (fullOptFlag && cacheItem) {
263
+ return showFullLabel ? cacheItem.fullLabel : cacheItem.item[labelField];
206
264
  }
207
- if (lazyOptions) {
208
- const lazyItem = lazyOptions.find(item => item[valueField] === val);
209
- if (lazyItem) {
210
- return lazyItem[labelField];
265
+ if (lazyOptFlag) {
266
+ const lazyCacheItem = lazyNodeMaps[val];
267
+ if (lazyCacheItem) {
268
+ return showFullLabel ? lazyCacheItem.fullLabel : lazyCacheItem.item[labelField];
211
269
  }
212
270
  }
213
271
  return val;
214
272
  }).join(', ');
215
273
  });
216
274
  const computePopupWrapperStyle = (0, _vue.computed)(() => {
275
+ const {
276
+ currentCunkList,
277
+ panelStyle
278
+ } = reactData;
217
279
  const popupOpts = computePopupOpts.value;
218
280
  const {
219
281
  height,
220
- width
282
+ nodeWidth,
283
+ nodeHeight
221
284
  } = popupOpts;
222
- const stys = {};
223
- if (width) {
224
- stys.width = (0, _dom.toCssUnit)(width);
225
- }
285
+ const stys = Object.assign(Object.assign({}, panelStyle), {
286
+ '--vxe-ui-cascader-chunk-size': currentCunkList.length
287
+ });
226
288
  if (height) {
227
- stys.height = (0, _dom.toCssUnit)(height);
228
- stys.maxHeight = (0, _dom.toCssUnit)(height);
289
+ stys['--vxe-ui-cascader-chunk-height'] = (0, _dom.toCssUnit)(height);
290
+ }
291
+ if (nodeWidth) {
292
+ stys['--vxe-ui-cascader-node-width'] = (0, _dom.toCssUnit)(nodeWidth);
293
+ }
294
+ if (nodeHeight) {
295
+ stys['--vxe-ui-cascader-node-height'] = (0, _dom.toCssUnit)(nodeHeight);
229
296
  }
230
297
  return stys;
231
298
  });
299
+ const computeFilterOpts = (0, _vue.computed)(() => {
300
+ return Object.assign({}, (0, _ui.getConfig)().cascader.filterConfig, props.filterConfig);
301
+ });
232
302
  const computeMaps = {};
233
303
  const $xeCascader = {
234
304
  xID,
@@ -250,60 +320,386 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
250
320
  const cascaderMethods = {
251
321
  dispatchEvent
252
322
  };
253
- const getNodeid = option => {
254
- const nodeKeyField = computeNodeKeyField.value;
255
- const nodeid = option[nodeKeyField];
256
- return nodeid ? encodeURIComponent(nodeid) : '';
323
+ const getNodeId = node => {
324
+ if (!node) {
325
+ return '';
326
+ }
327
+ const valueField = computeValueField.value;
328
+ const nodeKey = node[valueField];
329
+ return (0, _util.enNodeValue)(nodeKey);
257
330
  };
258
- const cacheDataMap = () => {
331
+ const isCheckedByCheckboxNodeId = nodeid => {
259
332
  const {
260
- transform,
261
- options
262
- } = props;
263
- const nodeKeyField = computeNodeKeyField.value;
333
+ updateCheckboxFlag
334
+ } = reactData;
335
+ const {
336
+ selectCheckboxMaps
337
+ } = internalData;
338
+ return !!(updateCheckboxFlag && selectCheckboxMaps[nodeid]);
339
+ };
340
+ const handleCheckedCheckboxNode = (nodeList, checked) => {
341
+ const {
342
+ selectCheckboxMaps
343
+ } = internalData;
344
+ const mapChildrenField = computeMapChildrenField.value;
264
345
  const childrenField = computeChildrenField.value;
346
+ const checkboxOpts = computeCheckboxOpts.value;
347
+ const {
348
+ checkStrictly
349
+ } = checkboxOpts;
350
+ const treeOpts = computeTreeOpts.value;
351
+ const {
352
+ transform
353
+ } = treeOpts;
354
+ const handleSelect = node => {
355
+ const nodeid = getNodeId(node);
356
+ if (checked) {
357
+ if (!selectCheckboxMaps[nodeid]) {
358
+ selectCheckboxMaps[nodeid] = node;
359
+ }
360
+ } else {
361
+ if (selectCheckboxMaps[nodeid]) {
362
+ delete selectCheckboxMaps[nodeid];
363
+ }
364
+ }
365
+ };
366
+ if (checkStrictly) {
367
+ nodeList.forEach(handleSelect);
368
+ } else {
369
+ _xeUtils.default.eachTree(nodeList, handleSelect, {
370
+ children: transform ? mapChildrenField : childrenField
371
+ });
372
+ }
373
+ reactData.updateCheckboxFlag++;
374
+ updateCheckboxStatus();
375
+ };
376
+ const createNode = records => {
265
377
  const valueField = computeValueField.value;
266
- const nodeMaps = {};
267
- const keyMaps = {};
268
- const handleOptNode = (item, index, items, path, parent, nodes) => {
269
- let nodeid = getNodeid(item);
378
+ return Promise.resolve(records.map(obj => {
379
+ const item = Object.assign({}, obj);
380
+ let nodeid = getNodeId(item);
270
381
  if (!nodeid) {
271
- nodeid = getOptUniqueId();
272
- }
273
- if (keyMaps[nodeid]) {
274
- (0, _log.errLog)('vxe.error.repeatKey', [`[tree-select] ${nodeKeyField}`, nodeid]);
382
+ nodeid = getNodeUniqueId();
383
+ _xeUtils.default.set(item, valueField, nodeid);
275
384
  }
276
- keyMaps[nodeid] = true;
277
- const value = item[valueField];
278
- if (nodeMaps[value]) {
279
- (0, _log.errLog)('vxe.error.repeatKey', [`[tree-select] ${valueField}`, value]);
385
+ return item;
386
+ }));
387
+ };
388
+ const cacheNodeMap = () => {
389
+ const {
390
+ separator
391
+ } = props;
392
+ const {
393
+ treeFullData
394
+ } = internalData;
395
+ const valueField = computeValueField.value;
396
+ const labelField = computeLabelField.value;
397
+ const childrenField = computeChildrenField.value;
398
+ const keyMaps = {};
399
+ const fullMaps = {};
400
+ _xeUtils.default.eachTree(treeFullData, (item, index, items, path, parenItem, nodes) => {
401
+ let nodeid = getNodeId(item);
402
+ if (!nodeid) {
403
+ nodeid = getNodeUniqueId();
404
+ item[valueField] = nodeid;
280
405
  }
281
- nodeMaps[value] = {
406
+ const nodeVal = item[valueField];
407
+ const itemRest = {
282
408
  item,
283
409
  index,
410
+ $index: -1,
411
+ _index: -1,
284
412
  items,
285
- parent,
286
- nodes
413
+ parent: parenItem,
414
+ nodes,
415
+ level: nodes.length - 1,
416
+ treeIndex: index,
417
+ lineCount: 0,
418
+ treeLoaded: false,
419
+ fullLabel: nodes.map(item => item[labelField]).join(separator || ' / ')
287
420
  };
288
- };
289
- if (options) {
421
+ keyMaps[nodeid] = itemRest;
422
+ fullMaps[nodeVal] = itemRest;
423
+ }, {
424
+ children: childrenField
425
+ });
426
+ internalData.nodeMaps = keyMaps;
427
+ internalData.fullNodeMaps = fullMaps;
428
+ reactData.fullOptFlag++;
429
+ };
430
+ const updateAfterDataIndex = () => {
431
+ const {
432
+ separator
433
+ } = props;
434
+ const {
435
+ afterTreeList,
436
+ nodeMaps
437
+ } = internalData;
438
+ const labelField = computeLabelField.value;
439
+ const childrenField = computeChildrenField.value;
440
+ const mapChildrenField = computeMapChildrenField.value;
441
+ const treeOpts = computeTreeOpts.value;
442
+ const {
443
+ transform
444
+ } = treeOpts;
445
+ let vtIndex = 0;
446
+ _xeUtils.default.eachTree(afterTreeList, (item, index, items, path, parenItem, nodes) => {
447
+ const nodeid = getNodeId(item);
448
+ const nodeItem = nodeMaps[nodeid];
449
+ if (nodeItem) {
450
+ nodeItem.items = items;
451
+ nodeItem.treeIndex = index;
452
+ nodeItem._index = vtIndex;
453
+ } else {
454
+ const rest = {
455
+ item,
456
+ index,
457
+ $index: -1,
458
+ _index: vtIndex,
459
+ items,
460
+ parent: parenItem,
461
+ nodes,
462
+ level: nodes.length - 1,
463
+ treeIndex: index,
464
+ lineCount: 0,
465
+ treeLoaded: false,
466
+ fullLabel: nodes.map(item => item[labelField]).join(separator || ' / ')
467
+ };
468
+ nodeMaps[nodeid] = rest;
469
+ }
470
+ vtIndex++;
471
+ }, {
472
+ children: transform ? mapChildrenField : childrenField
473
+ });
474
+ };
475
+ const updateAfterFullData = () => {
476
+ const {
477
+ searchValue
478
+ } = reactData;
479
+ const {
480
+ treeFullData,
481
+ lastFilterValue
482
+ } = internalData;
483
+ const labelField = computeLabelField.value;
484
+ const childrenField = computeChildrenField.value;
485
+ const mapChildrenField = computeMapChildrenField.value;
486
+ const treeOpts = computeTreeOpts.value;
487
+ const {
488
+ transform
489
+ } = treeOpts;
490
+ const filterOpts = computeFilterOpts.value;
491
+ const {
492
+ beforeFilterMethod,
493
+ filterMethod,
494
+ afterFilterMethod
495
+ } = filterOpts;
496
+ let fullList = treeFullData;
497
+ let treeList = fullList;
498
+ let filterStr = '';
499
+ if (searchValue) {
500
+ filterStr = `${searchValue}`;
501
+ const handleSearch = filterMethod ? item => {
502
+ return filterMethod({
503
+ $cascader: $xeCascader,
504
+ node: item,
505
+ filterValue: filterStr
506
+ });
507
+ } : item => {
508
+ return String(item[labelField]).toLowerCase().indexOf(filterStr.toLowerCase()) > -1;
509
+ };
510
+ const bafParams = {
511
+ $cascader: $xeCascader,
512
+ filterValue: filterStr
513
+ };
514
+ if (beforeFilterMethod) {
515
+ beforeFilterMethod(bafParams);
516
+ }
290
517
  if (transform) {
291
- options.forEach((item, index, items) => {
292
- handleOptNode(item, index, items, [], null, []);
518
+ treeList = _xeUtils.default.searchTree(treeFullData, handleSearch, {
519
+ original: true,
520
+ isEvery: true,
521
+ children: childrenField,
522
+ mapChildren: mapChildrenField
293
523
  });
524
+ fullList = treeList;
294
525
  } else {
295
- _xeUtils.default.eachTree(options, handleOptNode, {
296
- children: childrenField
526
+ fullList = treeFullData.filter(handleSearch);
527
+ }
528
+ internalData.lastFilterValue = filterStr;
529
+ (0, _vue.nextTick)(() => {
530
+ if (afterFilterMethod) {
531
+ afterFilterMethod(bafParams);
532
+ }
533
+ });
534
+ } else {
535
+ if (transform) {
536
+ treeList = _xeUtils.default.searchTree(treeFullData, () => true, {
537
+ original: true,
538
+ isEvery: true,
539
+ children: childrenField,
540
+ mapChildren: mapChildrenField
541
+ });
542
+ fullList = treeList;
543
+ if (lastFilterValue) {
544
+ const bafParams = {
545
+ $cascader: $xeCascader,
546
+ filterValue: filterStr
547
+ };
548
+ if (beforeFilterMethod) {
549
+ beforeFilterMethod(bafParams);
550
+ }
551
+ // 取消筛选时自动收起
552
+ (0, _vue.nextTick)(() => {
553
+ if (afterFilterMethod) {
554
+ afterFilterMethod(bafParams);
555
+ }
556
+ });
557
+ }
558
+ }
559
+ internalData.lastFilterValue = '';
560
+ }
561
+ internalData.afterVisibleList = fullList;
562
+ internalData.afterTreeList = treeList;
563
+ updateAfterDataIndex();
564
+ };
565
+ /**
566
+ * 如果为虚拟树、则将树结构拍平
567
+ */
568
+ const handleTreeToList = () => {
569
+ const {
570
+ afterTreeList,
571
+ treeExpandedMaps
572
+ } = internalData;
573
+ const mapChildrenField = computeMapChildrenField.value;
574
+ const treeOpts = computeTreeOpts.value;
575
+ const {
576
+ transform
577
+ } = treeOpts;
578
+ const expandMaps = {};
579
+ if (transform) {
580
+ const fullData = [];
581
+ _xeUtils.default.eachTree(afterTreeList, (item, index, items, path, parentRow) => {
582
+ const nodeid = getNodeId(item);
583
+ const parentNodeid = getNodeId(parentRow);
584
+ if (!parentRow || expandMaps[parentNodeid] && treeExpandedMaps[parentNodeid]) {
585
+ expandMaps[nodeid] = 1;
586
+ fullData.push(item);
587
+ }
588
+ }, {
589
+ children: mapChildrenField
590
+ });
591
+ internalData.afterVisibleList = fullData;
592
+ return fullData;
593
+ }
594
+ return internalData.afterVisibleList;
595
+ };
596
+ const handleData = force => {
597
+ const {
598
+ nodeMaps
599
+ } = internalData;
600
+ let fullList = internalData.afterVisibleList;
601
+ if (force) {
602
+ // 更新数据,处理筛选和排序
603
+ updateAfterFullData();
604
+ // 如果为虚拟树,将树结构拍平
605
+ fullList = handleTreeToList();
606
+ }
607
+ const treeList = fullList.slice(0);
608
+ treeList.forEach((item, $index) => {
609
+ const nodeid = getNodeId(item);
610
+ const itemRest = nodeMaps[nodeid];
611
+ if (itemRest) {
612
+ itemRest.$index = $index;
613
+ }
614
+ });
615
+ reactData.treeList = treeList;
616
+ };
617
+ const triggerSearchEvent = _xeUtils.default.debounce(() => handleData(true), 350, {
618
+ trailing: true
619
+ });
620
+ const loadData = list => {
621
+ const treeOpts = computeTreeOpts.value;
622
+ const keyField = computeKeyField.value;
623
+ const parentField = computeParentField.value;
624
+ const childrenField = computeChildrenField.value;
625
+ const {
626
+ rootParentValue,
627
+ rootValues
628
+ } = treeOpts;
629
+ const {
630
+ transform
631
+ } = treeOpts;
632
+ const fullData = transform ? _xeUtils.default.toArrayTree(list, {
633
+ key: keyField,
634
+ parentKey: parentField,
635
+ mapChildren: childrenField,
636
+ rootParentValue,
637
+ rootValues
638
+ }) : list ? list.slice(0) : [];
639
+ internalData.treeFullData = fullData;
640
+ cacheNodeMap();
641
+ handleData(true);
642
+ handleCurrentItems();
643
+ updateCurrentChunk();
644
+ return (0, _vue.nextTick)();
645
+ };
646
+ const updateCurrentChunk = () => {
647
+ const {
648
+ currentItems
649
+ } = reactData;
650
+ const {
651
+ treeFullData
652
+ } = internalData;
653
+ const childrenField = computeChildrenField.value;
654
+ const currentCunkList = [treeFullData];
655
+ if (currentItems.length) {
656
+ let chunkIndex = 0;
657
+ let stNodeid = currentItems[chunkIndex];
658
+ let optList = treeFullData;
659
+ while (stNodeid && optList && optList.length) {
660
+ stNodeid = currentItems[chunkIndex++];
661
+ const currOption = optList.find(item => stNodeid === getNodeId(item));
662
+ optList = currOption ? currOption[childrenField] : [];
663
+ if (!optList || !optList.length) {
664
+ break;
665
+ }
666
+ currentCunkList.push(optList);
667
+ }
668
+ }
669
+ reactData.currentCunkList = currentCunkList;
670
+ };
671
+ const handleCurrentItems = () => {
672
+ const {
673
+ treeFullData
674
+ } = internalData;
675
+ const selectVals = computeSelectVals.value;
676
+ const childrenField = computeChildrenField.value;
677
+ const stItems = [];
678
+ const expandedMaps = {};
679
+ if (selectVals.length) {
680
+ const lastVal = _xeUtils.default.last(selectVals);
681
+ const stRest = _xeUtils.default.findTree(treeFullData, item => lastVal === getNodeId(item), {
682
+ children: childrenField
683
+ });
684
+ if (stRest) {
685
+ const {
686
+ nodes
687
+ } = stRest;
688
+ nodes.forEach(item => {
689
+ const nodeid = getNodeId(item);
690
+ expandedMaps[nodeid] = true;
691
+ stItems.push(nodeid);
297
692
  });
298
693
  }
299
694
  }
300
- internalData.fullOptionList = options || [];
301
- internalData.fullNodeMaps = nodeMaps;
695
+ internalData.treeExpandedMaps = expandedMaps;
696
+ reactData.currentItems = stItems;
302
697
  };
303
698
  const updateZindex = () => {
699
+ const popupOpts = computePopupOpts.value;
304
700
  const {
305
701
  zIndex
306
- } = props;
702
+ } = popupOpts;
307
703
  if (zIndex) {
308
704
  reactData.panelIndex = zIndex;
309
705
  } else if (reactData.panelIndex < (0, _utils.getLastZIndex)()) {
@@ -311,9 +707,6 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
311
707
  }
312
708
  };
313
709
  const updatePlacement = () => {
314
- const {
315
- placement
316
- } = props;
317
710
  const {
318
711
  panelIndex
319
712
  } = reactData;
@@ -323,9 +716,10 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
323
716
  const popupOpts = computePopupOpts.value;
324
717
  const handleStyle = () => {
325
718
  const ppObj = (0, _dom.updatePanelPlacement)(targetElem, panelElem, {
326
- placement: popupOpts.placement || placement,
719
+ placement: popupOpts.placement,
327
720
  defaultPlacement: popupOpts.defaultPlacement,
328
- teleportTo: btnTransfer
721
+ teleportTo: btnTransfer,
722
+ isMinWidth: false
329
723
  });
330
724
  const panelStyle = Object.assign(ppObj.style, {
331
725
  zIndex: panelIndex
@@ -336,14 +730,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
336
730
  handleStyle();
337
731
  return (0, _vue.nextTick)().then(handleStyle);
338
732
  };
339
- const showOptionPanel = () => {
733
+ const showOptionPanel = evnt => {
340
734
  const {
341
735
  loading,
342
736
  remote,
343
737
  filterable
344
738
  } = props;
345
739
  const {
346
- fullOptionList
740
+ treeFullData
347
741
  } = internalData;
348
742
  const isDisabled = computeIsDisabled.value;
349
743
  const remoteOpts = computeRemoteOpts.value;
@@ -355,7 +749,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
355
749
  reactData.isActivated = true;
356
750
  reactData.isAniVisible = true;
357
751
  if (filterable) {
358
- if (remote && remoteOpts.enabled && remoteOpts.autoLoad && !fullOptionList.length) {
752
+ if (remote && remoteOpts.enabled && remoteOpts.autoLoad && !treeFullData.length) {
359
753
  handleSearchEvent();
360
754
  }
361
755
  }
@@ -365,13 +759,66 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
365
759
  }, 10);
366
760
  updateZindex();
367
761
  updatePlacement();
762
+ dispatchEvent('visible-change', {
763
+ visible: true
764
+ }, evnt || null);
368
765
  }
369
766
  };
370
- const hideOptionPanel = () => {
767
+ const hideOptionPanel = evnt => {
371
768
  reactData.visiblePanel = false;
372
769
  internalData.hpTimeout = setTimeout(() => {
373
770
  reactData.isAniVisible = false;
374
771
  }, 350);
772
+ dispatchEvent('visible-change', {
773
+ visible: false
774
+ }, evnt || null);
775
+ };
776
+ const setCurrentNode = node => {
777
+ reactData.currentNode = node;
778
+ return (0, _vue.nextTick)();
779
+ };
780
+ const setAllCheckboxNode = checked => {
781
+ const selectMaps = {};
782
+ const childrenField = computeChildrenField.value;
783
+ const mapChildrenField = computeMapChildrenField.value;
784
+ const treeOpts = computeTreeOpts.value;
785
+ const {
786
+ transform
787
+ } = treeOpts;
788
+ const checkKeys = [];
789
+ const checkNodes = [];
790
+ if (checked) {
791
+ _xeUtils.default.eachTree(internalData.afterTreeList, node => {
792
+ const nodeid = getNodeId(node);
793
+ checkKeys.push(nodeid);
794
+ checkNodes.push(node);
795
+ selectMaps[nodeid] = true;
796
+ }, {
797
+ children: transform ? mapChildrenField : childrenField
798
+ });
799
+ }
800
+ internalData.indeterminateRowMaps = {};
801
+ internalData.selectCheckboxMaps = selectMaps;
802
+ reactData.updateCheckboxFlag++;
803
+ updateCheckboxStatus();
804
+ return (0, _vue.nextTick)().then(() => {
805
+ return {
806
+ checkNodeKeys: checkKeys,
807
+ checkNodes
808
+ };
809
+ });
810
+ };
811
+ const clearCheckboxNode = () => {
812
+ internalData.indeterminateRowMaps = {};
813
+ internalData.selectCheckboxMaps = {};
814
+ reactData.updateCheckboxFlag++;
815
+ updateCheckboxStatus();
816
+ return (0, _vue.nextTick)().then(() => {
817
+ return {
818
+ checkNodeKeys: [],
819
+ checkNodes: []
820
+ };
821
+ });
375
822
  };
376
823
  const changeEvent = (evnt, selectValue, node) => {
377
824
  const value = _xeUtils.default.isArray(selectValue) ? selectValue.map(_util.deNodeValue) : (0, _util.deNodeValue)(selectValue);
@@ -396,7 +843,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
396
843
  };
397
844
  const clearEvent = (params, evnt) => {
398
845
  clearValueEvent(evnt, null);
399
- hideOptionPanel();
846
+ hideOptionPanel(evnt);
400
847
  };
401
848
  const allCheckedPanelEvent = params => {
402
849
  const {
@@ -404,24 +851,21 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
404
851
  } = params;
405
852
  const {
406
853
  multiple,
407
- autoClose
854
+ checkedClosable
408
855
  } = props;
409
- const $tree = refTree.value;
410
856
  if (multiple) {
411
- if ($tree) {
412
- $tree.setAllCheckboxNode(true).then(({
413
- checkNodeKeys,
414
- checkNodes
415
- }) => {
416
- changeEvent($event, checkNodeKeys, checkNodes[0]);
417
- dispatchEvent('all-change', {
418
- value: checkNodeKeys
419
- }, $event);
420
- if (autoClose) {
421
- hideOptionPanel();
422
- }
423
- });
424
- }
857
+ setAllCheckboxNode(true).then(({
858
+ checkNodeKeys,
859
+ checkNodes
860
+ }) => {
861
+ changeEvent($event, checkNodeKeys, checkNodes[0]);
862
+ dispatchEvent('all-change', {
863
+ value: checkNodeKeys
864
+ }, $event);
865
+ if (checkedClosable) {
866
+ hideOptionPanel($event);
867
+ }
868
+ });
425
869
  }
426
870
  };
427
871
  const clearCheckedPanelEvent = params => {
@@ -430,21 +874,24 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
430
874
  } = params;
431
875
  const {
432
876
  multiple,
433
- autoClose
877
+ checkedClosable
434
878
  } = props;
435
- const $tree = refTree.value;
436
- if ($tree) {
437
- const value = multiple ? [] : null;
438
- $tree.clearCheckboxNode().then(() => {
439
- if (autoClose) {
440
- hideOptionPanel();
441
- }
442
- });
443
- changeEvent($event, value, null);
444
- dispatchEvent('clear', {
445
- value
446
- }, $event);
447
- }
879
+ const value = multiple ? [] : null;
880
+ clearCheckboxNode().then(() => {
881
+ if (checkedClosable) {
882
+ hideOptionPanel($event);
883
+ }
884
+ });
885
+ changeEvent($event, value, null);
886
+ dispatchEvent('clear', {
887
+ value
888
+ }, $event);
889
+ };
890
+ const closePanelEvent = params => {
891
+ const {
892
+ $event
893
+ } = params;
894
+ hideOptionPanel($event);
448
895
  };
449
896
  const handleGlobalMousewheelEvent = evnt => {
450
897
  const {
@@ -457,7 +904,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
457
904
  if ((0, _dom.getEventTargetNode)(evnt, panelElem).flag) {
458
905
  updatePlacement();
459
906
  } else {
460
- hideOptionPanel();
907
+ hideOptionPanel(evnt);
461
908
  }
462
909
  }
463
910
  }
@@ -472,17 +919,17 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
472
919
  const panelElem = refOptionPanel.value;
473
920
  reactData.isActivated = (0, _dom.getEventTargetNode)(evnt, el).flag || (0, _dom.getEventTargetNode)(evnt, panelElem).flag;
474
921
  if (visiblePanel && !reactData.isActivated) {
475
- hideOptionPanel();
922
+ hideOptionPanel(evnt);
476
923
  }
477
924
  }
478
925
  };
479
- const handleGlobalBlurEvent = () => {
926
+ const handleGlobalBlurEvent = evnt => {
480
927
  const {
481
928
  visiblePanel,
482
929
  isActivated
483
930
  } = reactData;
484
931
  if (visiblePanel) {
485
- hideOptionPanel();
932
+ hideOptionPanel(evnt);
486
933
  }
487
934
  if (isActivated) {
488
935
  reactData.isActivated = false;
@@ -512,12 +959,436 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
512
959
  });
513
960
  }
514
961
  };
962
+ const changeCurrentEvent = (evnt, node) => {
963
+ evnt.preventDefault();
964
+ const isChecked = true;
965
+ reactData.currentNode = node;
966
+ dispatchEvent('current-change', {
967
+ node,
968
+ checked: isChecked
969
+ }, evnt);
970
+ };
971
+ const changeRadioEvent = (evnt, node) => {
972
+ evnt.preventDefault();
973
+ evnt.stopPropagation();
974
+ const {
975
+ nodeMaps
976
+ } = internalData;
977
+ const radioOpts = computeRadioOpts.value;
978
+ const childrenField = computeChildrenField.value;
979
+ const {
980
+ checkMode,
981
+ checkMethod
982
+ } = radioOpts;
983
+ const nodeid = getNodeId(node);
984
+ const childList = node[childrenField];
985
+ const isExistChild = childList && childList.length > 0;
986
+ const nodeItem = nodeMaps[nodeid] || {};
987
+ const nLevel = nodeItem.level;
988
+ const isDisabled = checkMethod ? !checkMethod({
989
+ $cascader: $xeCascader,
990
+ node
991
+ }) : !handleVisibleOrCheckMode(checkMode, isExistChild, nLevel);
992
+ if (isDisabled) {
993
+ return;
994
+ }
995
+ const value = nodeid;
996
+ reactData.selectRadioKey = value;
997
+ changeEvent(evnt, value, node);
998
+ hideOptionPanel(evnt);
999
+ };
1000
+ const handleAsyncTreeExpandChilds = node => {
1001
+ const checkboxOpts = computeCheckboxOpts.value;
1002
+ const treeOpts = computeTreeOpts.value;
1003
+ const {
1004
+ loadMethod
1005
+ } = treeOpts;
1006
+ const {
1007
+ checkStrictly
1008
+ } = checkboxOpts;
1009
+ return new Promise(resolve => {
1010
+ if (loadMethod) {
1011
+ const {
1012
+ nodeMaps
1013
+ } = internalData;
1014
+ const nodeid = getNodeId(node);
1015
+ const nodeItem = nodeMaps[nodeid];
1016
+ internalData.treeExpandLazyLoadedMaps[nodeid] = true;
1017
+ Promise.resolve(loadMethod({
1018
+ $cascader: $xeCascader,
1019
+ node
1020
+ })).then(childRecords => {
1021
+ const {
1022
+ treeExpandLazyLoadedMaps
1023
+ } = internalData;
1024
+ nodeItem.treeLoaded = true;
1025
+ if (treeExpandLazyLoadedMaps[nodeid]) {
1026
+ treeExpandLazyLoadedMaps[nodeid] = false;
1027
+ }
1028
+ if (!_xeUtils.default.isArray(childRecords)) {
1029
+ childRecords = [];
1030
+ }
1031
+ if (childRecords) {
1032
+ return $xeCascader.loadChildrenNode(node, childRecords).then(childRows => {
1033
+ const {
1034
+ treeExpandedMaps
1035
+ } = internalData;
1036
+ if (childRows.length && !treeExpandedMaps[nodeid]) {
1037
+ treeExpandedMaps[nodeid] = true;
1038
+ }
1039
+ reactData.updateExpandedFlag++;
1040
+ // 如果当前节点已选中,则展开后子节点也被选中
1041
+ if (!checkStrictly && $xeCascader.isCheckedByCheckboxNodeId(nodeid)) {
1042
+ handleCheckedCheckboxNode(childRows, true);
1043
+ }
1044
+ dispatchEvent('load-success', {
1045
+ node,
1046
+ data: childRecords
1047
+ }, new Event('load-success'));
1048
+ return (0, _vue.nextTick)();
1049
+ });
1050
+ } else {
1051
+ dispatchEvent('load-success', {
1052
+ node,
1053
+ data: childRecords
1054
+ }, new Event('load-success'));
1055
+ }
1056
+ }).catch(e => {
1057
+ const {
1058
+ treeExpandLazyLoadedMaps
1059
+ } = internalData;
1060
+ nodeItem.treeLoaded = false;
1061
+ if (treeExpandLazyLoadedMaps[nodeid]) {
1062
+ treeExpandLazyLoadedMaps[nodeid] = false;
1063
+ }
1064
+ dispatchEvent('load-error', {
1065
+ node,
1066
+ data: e
1067
+ }, new Event('load-error'));
1068
+ }).finally(() => {
1069
+ handleTreeToList();
1070
+ handleData();
1071
+ });
1072
+ } else {
1073
+ resolve();
1074
+ }
1075
+ });
1076
+ };
1077
+ /**
1078
+ * 展开与收起树节点
1079
+ * @param nodeList
1080
+ * @param expanded
1081
+ * @returns
1082
+ */
1083
+ const handleBaseTreeExpand = (nodeList, expanded) => {
1084
+ const {
1085
+ treeExpandLazyLoadedMaps,
1086
+ treeExpandedMaps
1087
+ } = internalData;
1088
+ const {
1089
+ nodeMaps
1090
+ } = internalData;
1091
+ const childrenField = computeChildrenField.value;
1092
+ const hasChildField = computeHasChildField.value;
1093
+ const treeOpts = computeTreeOpts.value;
1094
+ const {
1095
+ lazy,
1096
+ toggleMethod
1097
+ } = treeOpts;
1098
+ const result = [];
1099
+ let validNodes = toggleMethod ? nodeList.filter(node => toggleMethod({
1100
+ $cascader: $xeCascader,
1101
+ expanded,
1102
+ node
1103
+ })) : nodeList;
1104
+ validNodes = validNodes.length ? [validNodes[validNodes.length - 1]] : [];
1105
+ // 同一级只能展开一个
1106
+ const nodeid = getNodeId(validNodes[0]);
1107
+ const nodeItem = nodeMaps[nodeid];
1108
+ if (nodeItem) {
1109
+ nodeItem.items.forEach(item => {
1110
+ const itemNodeId = getNodeId(item);
1111
+ if (treeExpandedMaps[itemNodeId]) {
1112
+ delete treeExpandedMaps[itemNodeId];
1113
+ }
1114
+ });
1115
+ }
1116
+ const expandNodes = [];
1117
+ if (expanded) {
1118
+ validNodes.forEach(item => {
1119
+ const itemNodeId = getNodeId(item);
1120
+ if (!treeExpandedMaps[itemNodeId]) {
1121
+ const nodeItem = nodeMaps[itemNodeId];
1122
+ const isLoad = lazy && item[hasChildField] && !nodeItem.treeLoaded && !treeExpandLazyLoadedMaps[itemNodeId];
1123
+ // 是否使用懒加载
1124
+ if (isLoad) {
1125
+ result.push(handleAsyncTreeExpandChilds(item));
1126
+ } else {
1127
+ if (item[childrenField] && item[childrenField].length) {
1128
+ treeExpandedMaps[itemNodeId] = true;
1129
+ expandNodes.push(item);
1130
+ }
1131
+ }
1132
+ }
1133
+ });
1134
+ } else {
1135
+ validNodes.forEach(item => {
1136
+ const itemNodeId = getNodeId(item);
1137
+ if (treeExpandedMaps[itemNodeId]) {
1138
+ delete treeExpandedMaps[itemNodeId];
1139
+ expandNodes.push(item);
1140
+ }
1141
+ });
1142
+ }
1143
+ reactData.updateExpandedFlag++;
1144
+ handleTreeToList();
1145
+ handleData();
1146
+ return Promise.all(result);
1147
+ };
1148
+ const toggleExpandEvent = (evnt, node, chunks, chunkIndex) => {
1149
+ const {
1150
+ currentItems
1151
+ } = reactData;
1152
+ const {
1153
+ treeExpandLazyLoadedMaps
1154
+ } = internalData;
1155
+ const treeOpts = computeTreeOpts.value;
1156
+ const {
1157
+ lazy
1158
+ } = treeOpts;
1159
+ const stItems = currentItems.slice(0, chunkIndex);
1160
+ const nodeid = getNodeId(node);
1161
+ const expanded = true;
1162
+ evnt.stopPropagation();
1163
+ stItems.push(nodeid);
1164
+ reactData.currentItems = stItems;
1165
+ if (!lazy || !treeExpandLazyLoadedMaps[nodeid]) {
1166
+ handleBaseTreeExpand([node], expanded);
1167
+ }
1168
+ setCurrentNode(node);
1169
+ updateCurrentChunk();
1170
+ dispatchEvent('node-expand', {
1171
+ node,
1172
+ expanded
1173
+ }, evnt);
1174
+ };
1175
+ const updateCheckboxStatus = () => {
1176
+ const {
1177
+ selectCheckboxMaps,
1178
+ indeterminateRowMaps,
1179
+ afterTreeList
1180
+ } = internalData;
1181
+ const childrenField = computeChildrenField.value;
1182
+ const mapChildrenField = computeMapChildrenField.value;
1183
+ const checkboxOpts = computeCheckboxOpts.value;
1184
+ const {
1185
+ checkStrictly,
1186
+ checkMethod
1187
+ } = checkboxOpts;
1188
+ const treeOpts = computeTreeOpts.value;
1189
+ const {
1190
+ transform
1191
+ } = treeOpts;
1192
+ if (!checkStrictly) {
1193
+ const childRowMaps = {};
1194
+ const childRowList = [];
1195
+ _xeUtils.default.eachTree(afterTreeList, node => {
1196
+ const nodeid = getNodeId(node);
1197
+ const childList = node[childrenField];
1198
+ if (childList && childList.length && !childRowMaps[nodeid]) {
1199
+ childRowMaps[nodeid] = 1;
1200
+ childRowList.unshift([node, nodeid, childList]);
1201
+ }
1202
+ }, {
1203
+ children: transform ? mapChildrenField : childrenField
1204
+ });
1205
+ childRowList.forEach(vals => {
1206
+ const node = vals[0];
1207
+ const nodeid = vals[1];
1208
+ const childList = vals[2];
1209
+ let sLen = 0; // 已选
1210
+ let hLen = 0; // 半选
1211
+ let vLen = 0; // 有效子行
1212
+ const cLen = childList.length; // 子行
1213
+ childList.forEach(checkMethod ? item => {
1214
+ const childNodeid = getNodeId(item);
1215
+ const isSelect = selectCheckboxMaps[childNodeid];
1216
+ if (checkMethod({
1217
+ $cascader: $xeCascader,
1218
+ node: item
1219
+ })) {
1220
+ if (isSelect) {
1221
+ sLen++;
1222
+ } else if (indeterminateRowMaps[childNodeid]) {
1223
+ hLen++;
1224
+ }
1225
+ vLen++;
1226
+ } else {
1227
+ if (isSelect) {
1228
+ sLen++;
1229
+ } else if (indeterminateRowMaps[childNodeid]) {
1230
+ hLen++;
1231
+ }
1232
+ }
1233
+ } : item => {
1234
+ const childNodeid = getNodeId(item);
1235
+ const isSelect = selectCheckboxMaps[childNodeid];
1236
+ if (isSelect) {
1237
+ sLen++;
1238
+ } else if (indeterminateRowMaps[childNodeid]) {
1239
+ hLen++;
1240
+ }
1241
+ vLen++;
1242
+ });
1243
+ let isSelected = false;
1244
+ if (cLen > 0) {
1245
+ if (vLen > 0) {
1246
+ isSelected = (sLen > 0 || hLen > 0) && sLen >= vLen;
1247
+ } else {
1248
+ // 如果存在子项禁用
1249
+ if (sLen > 0 && sLen >= vLen) {
1250
+ isSelected = true;
1251
+ } else if (selectCheckboxMaps[nodeid]) {
1252
+ isSelected = true;
1253
+ } else {
1254
+ isSelected = false;
1255
+ }
1256
+ }
1257
+ } else {
1258
+ // 如果无子项
1259
+ isSelected = selectCheckboxMaps[nodeid];
1260
+ }
1261
+ const halfSelect = !isSelected && (sLen > 0 || hLen > 0);
1262
+ if (isSelected) {
1263
+ selectCheckboxMaps[nodeid] = node;
1264
+ if (indeterminateRowMaps[nodeid]) {
1265
+ delete indeterminateRowMaps[nodeid];
1266
+ }
1267
+ } else {
1268
+ if (selectCheckboxMaps[nodeid]) {
1269
+ delete selectCheckboxMaps[nodeid];
1270
+ }
1271
+ if (halfSelect) {
1272
+ indeterminateRowMaps[nodeid] = node;
1273
+ } else {
1274
+ if (indeterminateRowMaps[nodeid]) {
1275
+ delete indeterminateRowMaps[nodeid];
1276
+ }
1277
+ }
1278
+ }
1279
+ });
1280
+ reactData.updateCheckboxFlag++;
1281
+ }
1282
+ };
1283
+ const changeCheckboxEvent = (evnt, node) => {
1284
+ evnt.preventDefault();
1285
+ evnt.stopPropagation();
1286
+ const {
1287
+ selectCheckboxMaps,
1288
+ nodeMaps
1289
+ } = internalData;
1290
+ const childrenField = computeChildrenField.value;
1291
+ const mapChildrenField = computeMapChildrenField.value;
1292
+ const checkboxOpts = computeCheckboxOpts.value;
1293
+ const {
1294
+ checkStrictly,
1295
+ checkMode,
1296
+ checkMethod
1297
+ } = checkboxOpts;
1298
+ const treeOpts = computeTreeOpts.value;
1299
+ const {
1300
+ transform
1301
+ } = treeOpts;
1302
+ const nodeid = getNodeId(node);
1303
+ const childList = node[childrenField];
1304
+ const isExistChild = childList && childList.length > 0;
1305
+ const nodeItem = nodeMaps[nodeid] || {};
1306
+ const nLevel = nodeItem.level;
1307
+ const isDisabled = checkMethod ? !checkMethod({
1308
+ $cascader: $xeCascader,
1309
+ node
1310
+ }) : !handleVisibleOrCheckMode(checkMode, isExistChild, nLevel);
1311
+ if (isDisabled) {
1312
+ return;
1313
+ }
1314
+ let isChecked = false;
1315
+ if (selectCheckboxMaps[nodeid]) {
1316
+ delete selectCheckboxMaps[nodeid];
1317
+ } else {
1318
+ isChecked = true;
1319
+ selectCheckboxMaps[nodeid] = node;
1320
+ }
1321
+ if (!checkStrictly) {
1322
+ _xeUtils.default.eachTree(_xeUtils.default.get(node, transform ? mapChildrenField : childrenField), childNode => {
1323
+ const childNodeid = getNodeId(childNode);
1324
+ if (isChecked) {
1325
+ if (!selectCheckboxMaps[childNodeid]) {
1326
+ selectCheckboxMaps[childNodeid] = true;
1327
+ }
1328
+ } else {
1329
+ if (selectCheckboxMaps[childNodeid]) {
1330
+ delete selectCheckboxMaps[childNodeid];
1331
+ }
1332
+ }
1333
+ }, {
1334
+ children: transform ? mapChildrenField : childrenField
1335
+ });
1336
+ }
1337
+ reactData.updateCheckboxFlag++;
1338
+ updateCheckboxStatus();
1339
+ const nodeids = _xeUtils.default.keys(selectCheckboxMaps);
1340
+ const value = nodeids;
1341
+ changeEvent(evnt, value, node);
1342
+ };
1343
+ const handleNodeClickEvent = (evnt, node, chunks, chunkIndex) => {
1344
+ const {
1345
+ multiple
1346
+ } = props;
1347
+ const treeOpts = computeTreeOpts.value;
1348
+ const radioOpts = computeRadioOpts.value;
1349
+ const checkboxOpts = computeCheckboxOpts.value;
1350
+ const childrenField = computeChildrenField.value;
1351
+ const mapChildrenField = computeMapChildrenField.value;
1352
+ const {
1353
+ transform,
1354
+ trigger
1355
+ } = treeOpts;
1356
+ const childList = node[transform ? mapChildrenField : childrenField];
1357
+ let triggerCurrent = false;
1358
+ let triggerRadio = false;
1359
+ let triggerCheckbox = false;
1360
+ let triggerExpand = false;
1361
+ triggerCurrent = true;
1362
+ changeCurrentEvent(evnt, node);
1363
+ if (trigger !== 'icon') {
1364
+ triggerExpand = true;
1365
+ toggleExpandEvent(evnt, node, chunks, chunkIndex);
1366
+ }
1367
+ if (multiple) {
1368
+ if (checkboxOpts.trigger === 'node' || !checkboxOpts.showIcon && (!childList || !childList.length)) {
1369
+ triggerCheckbox = true;
1370
+ changeCheckboxEvent(evnt, node);
1371
+ }
1372
+ } else {
1373
+ if (radioOpts.trigger === 'node' || !radioOpts.showIcon && (!childList || !childList.length)) {
1374
+ triggerRadio = true;
1375
+ changeRadioEvent(evnt, node);
1376
+ }
1377
+ }
1378
+ dispatchEvent('node-click', {
1379
+ node,
1380
+ triggerCurrent,
1381
+ triggerRadio,
1382
+ triggerCheckbox,
1383
+ triggerExpand
1384
+ }, evnt);
1385
+ };
515
1386
  const focusEvent = evnt => {
516
1387
  const isDisabled = computeIsDisabled.value;
517
1388
  if (!isDisabled) {
518
1389
  if (!reactData.visiblePanel) {
519
1390
  reactData.triggerFocusPanel = true;
520
- showOptionPanel();
1391
+ showOptionPanel(evnt);
521
1392
  setTimeout(() => {
522
1393
  reactData.triggerFocusPanel = false;
523
1394
  }, 150);
@@ -526,7 +1397,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
526
1397
  dispatchEvent('focus', {}, evnt);
527
1398
  };
528
1399
  const clickEvent = evnt => {
529
- togglePanelEvent(evnt);
1400
+ evnt.preventDefault();
1401
+ if (reactData.triggerFocusPanel) {
1402
+ reactData.triggerFocusPanel = false;
1403
+ } else {
1404
+ if (!reactData.visiblePanel) {
1405
+ showOptionPanel(evnt);
1406
+ }
1407
+ }
530
1408
  dispatchEvent('click', {}, evnt);
531
1409
  };
532
1410
  const blurEvent = evnt => {
@@ -535,18 +1413,18 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
535
1413
  };
536
1414
  const modelSearchEvent = value => {
537
1415
  reactData.searchValue = value;
1416
+ triggerSearchEvent(new Event('filter'));
538
1417
  };
539
1418
  const handleSearchEvent = () => {
540
1419
  const {
541
1420
  modelValue,
542
- remote,
543
- remoteMethod
1421
+ remote
544
1422
  } = props;
545
1423
  const {
546
1424
  searchValue
547
1425
  } = reactData;
548
1426
  const remoteOpts = computeRemoteOpts.value;
549
- const queryMethod = remoteOpts.queryMethod || remoteMethod;
1427
+ const queryMethod = remoteOpts.queryMethod;
550
1428
  if (remote && queryMethod && remoteOpts.enabled) {
551
1429
  reactData.searchLoading = true;
552
1430
  Promise.resolve(queryMethod({
@@ -567,14 +1445,240 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
567
1445
  reactData.triggerFocusPanel = false;
568
1446
  } else {
569
1447
  if (reactData.visiblePanel) {
570
- hideOptionPanel();
1448
+ hideOptionPanel($event);
571
1449
  } else {
572
- showOptionPanel();
1450
+ showOptionPanel($event);
573
1451
  }
574
1452
  }
575
1453
  };
576
- const cascaderPrivateMethods = {};
1454
+ const cascaderPrivateMethods = {
1455
+ isCheckedByCheckboxNodeId,
1456
+ /**
1457
+ * 用于树结构,给行数据加载子节点
1458
+ */
1459
+ loadChildrenNode(node, childRecords) {
1460
+ const {
1461
+ separator
1462
+ } = props;
1463
+ const {
1464
+ nodeMaps
1465
+ } = internalData;
1466
+ const treeOpts = computeTreeOpts.value;
1467
+ const labelField = computeLabelField.value;
1468
+ const {
1469
+ lazy,
1470
+ transform
1471
+ } = treeOpts;
1472
+ if (!lazy) {
1473
+ return Promise.resolve([]);
1474
+ }
1475
+ const childrenField = computeChildrenField.value;
1476
+ const mapChildrenField = computeMapChildrenField.value;
1477
+ const parentNodeItem = nodeMaps[getNodeId(node)];
1478
+ const parentLevel = parentNodeItem ? parentNodeItem.level : 0;
1479
+ const parentNodes = parentNodeItem ? parentNodeItem.nodes : [];
1480
+ return createNode(childRecords).then(nodeList => {
1481
+ _xeUtils.default.eachTree(nodeList, (childRow, index, items, path, parent, nodes) => {
1482
+ const itemNodeId = getNodeId(childRow);
1483
+ nodeMaps[itemNodeId] = {
1484
+ item: childRow,
1485
+ index: -1,
1486
+ $index: -1,
1487
+ _index: -1,
1488
+ items,
1489
+ parent: parent || parentNodeItem.item,
1490
+ nodes: parentNodes.concat(nodes),
1491
+ level: parentLevel + nodes.length,
1492
+ treeIndex: -1,
1493
+ lineCount: 0,
1494
+ treeLoaded: false,
1495
+ fullLabel: nodes.map(item => item[labelField]).join(separator || ' / ')
1496
+ };
1497
+ }, {
1498
+ children: childrenField
1499
+ });
1500
+ node[childrenField] = nodeList;
1501
+ if (transform) {
1502
+ node[mapChildrenField] = nodeList;
1503
+ }
1504
+ updateAfterDataIndex();
1505
+ return nodeList;
1506
+ });
1507
+ }
1508
+ };
577
1509
  Object.assign($xeCascader, cascaderMethods, cascaderPrivateMethods);
1510
+ const handleVisibleOrCheckMode = (mode, isExistChild, nLevel) => {
1511
+ if (mode) {
1512
+ if (mode === 'first') {
1513
+ return !nLevel;
1514
+ }
1515
+ if (mode === 'last') {
1516
+ return !isExistChild;
1517
+ }
1518
+ }
1519
+ return true;
1520
+ };
1521
+ const renderRadio = (node, isExistChild, nLevel, isChecked) => {
1522
+ const radioOpts = computeRadioOpts.value;
1523
+ const {
1524
+ showIcon,
1525
+ checkMode,
1526
+ checkMethod,
1527
+ visibleMode,
1528
+ visibleMethod
1529
+ } = radioOpts;
1530
+ const isVisible = visibleMethod ? visibleMethod({
1531
+ $cascader: $xeCascader,
1532
+ node
1533
+ }) : handleVisibleOrCheckMode(visibleMode, isExistChild, nLevel);
1534
+ if (showIcon && isVisible) {
1535
+ const isDisabled = checkMethod ? !checkMethod({
1536
+ $cascader: $xeCascader,
1537
+ node
1538
+ }) : !handleVisibleOrCheckMode(checkMode, isExistChild, nLevel);
1539
+ return (0, _vue.h)('div', {
1540
+ class: ['vxe-tree--radio-option', {
1541
+ 'is--checked': isChecked,
1542
+ 'is--disabled': isDisabled
1543
+ }],
1544
+ onClick: evnt => {
1545
+ if (!isDisabled) {
1546
+ changeRadioEvent(evnt, node);
1547
+ }
1548
+ }
1549
+ }, [(0, _vue.h)('span', {
1550
+ class: ['vxe-radio--icon', isChecked ? (0, _ui.getIcon)().RADIO_CHECKED : (0, _ui.getIcon)().RADIO_UNCHECKED]
1551
+ })]);
1552
+ }
1553
+ return (0, _ui.renderEmptyElement)($xeCascader);
1554
+ };
1555
+ const renderCheckbox = (node, isExistChild, nLevel, isChecked, isIndeterminate) => {
1556
+ const checkboxOpts = computeCheckboxOpts.value;
1557
+ const {
1558
+ showIcon,
1559
+ checkMode,
1560
+ checkMethod,
1561
+ visibleMode,
1562
+ visibleMethod
1563
+ } = checkboxOpts;
1564
+ const isVisible = visibleMethod ? visibleMethod({
1565
+ $cascader: $xeCascader,
1566
+ node
1567
+ }) : handleVisibleOrCheckMode(visibleMode, isExistChild, nLevel);
1568
+ if (showIcon && isVisible) {
1569
+ const isDisabled = checkMethod ? !checkMethod({
1570
+ $cascader: $xeCascader,
1571
+ node
1572
+ }) : !handleVisibleOrCheckMode(checkMode, isExistChild, nLevel);
1573
+ return (0, _vue.h)('div', {
1574
+ class: ['vxe-cascader--checkbox-option', {
1575
+ 'is--checked': isChecked,
1576
+ 'is--indeterminate': isIndeterminate,
1577
+ 'is--disabled': isDisabled
1578
+ }],
1579
+ onClick: evnt => {
1580
+ if (!isDisabled) {
1581
+ changeCheckboxEvent(evnt, node);
1582
+ }
1583
+ }
1584
+ }, [(0, _vue.h)('span', {
1585
+ class: ['vxe-checkbox--icon', isIndeterminate ? (0, _ui.getIcon)().CHECKBOX_INDETERMINATE : isChecked ? (0, _ui.getIcon)().CHECKBOX_CHECKED : (0, _ui.getIcon)().CHECKBOX_UNCHECKED]
1586
+ })]);
1587
+ }
1588
+ return (0, _ui.renderEmptyElement)($xeCascader);
1589
+ };
1590
+ const renderNode = (node, nodeid, nodeIndex, chunks, chunkIndex) => {
1591
+ const {
1592
+ multiple
1593
+ } = props;
1594
+ const {
1595
+ currentNode,
1596
+ selectRadioKey,
1597
+ updateCheckboxFlag,
1598
+ updateExpandedFlag
1599
+ } = reactData;
1600
+ const {
1601
+ nodeMaps,
1602
+ selectCheckboxMaps,
1603
+ indeterminateRowMaps,
1604
+ treeExpandedMaps,
1605
+ treeExpandLazyLoadedMaps
1606
+ } = internalData;
1607
+ const treeOpts = computeTreeOpts.value;
1608
+ const {
1609
+ lazy,
1610
+ iconLoaded,
1611
+ iconOpen,
1612
+ iconClose
1613
+ } = treeOpts;
1614
+ const childrenField = computeChildrenField.value;
1615
+ const labelField = computeLabelField.value;
1616
+ const hasChildField = computeHasChildField.value;
1617
+ const childList = node[childrenField];
1618
+ const isExistChild = childList && childList.length > 0;
1619
+ const iconSlot = slots.icon;
1620
+ const titleSlot = slots.title;
1621
+ const isExpand = updateExpandedFlag && treeExpandedMaps[nodeid];
1622
+ const nodeItem = nodeMaps[nodeid] || {};
1623
+ const nodeTitle = node[labelField];
1624
+ const nLevel = nodeItem.level;
1625
+ let isRadioChecked = false;
1626
+ if (!multiple) {
1627
+ isRadioChecked = nodeid === selectRadioKey;
1628
+ }
1629
+ let isCheckboxChecked = false;
1630
+ let isIndeterminate = false;
1631
+ if (multiple) {
1632
+ isCheckboxChecked = !!(updateCheckboxFlag && selectCheckboxMaps[nodeid]);
1633
+ isIndeterminate = !!(updateCheckboxFlag && indeterminateRowMaps[nodeid]);
1634
+ }
1635
+ let hasLazyChilds = false;
1636
+ let isLazyLoading = false;
1637
+ let isLazyLoaded = false;
1638
+ if (lazy) {
1639
+ isLazyLoading = !!treeExpandLazyLoadedMaps[nodeid];
1640
+ hasLazyChilds = node[hasChildField];
1641
+ isLazyLoaded = !!nodeItem.treeLoaded;
1642
+ }
1643
+ const nParams = {
1644
+ node
1645
+ };
1646
+ return (0, _vue.h)('div', {
1647
+ key: `${chunkIndex}_${nodeIndex}`,
1648
+ class: ['vxe-cascader-chunk--node-item', {
1649
+ 'is--current': currentNode && (currentNode === node || getNodeId(currentNode) === nodeid),
1650
+ 'is-radio--checked': isRadioChecked,
1651
+ 'is-checkbox--checked': isCheckboxChecked,
1652
+ 'is-checkbox--indeterminate': isIndeterminate,
1653
+ 'is--expand': isExpand
1654
+ }],
1655
+ title: nodeTitle,
1656
+ onMousedown: evnt => {
1657
+ const isLeftBtn = evnt.button === 0;
1658
+ if (isLeftBtn) {
1659
+ evnt.stopPropagation();
1660
+ }
1661
+ },
1662
+ onClick(evnt) {
1663
+ handleNodeClickEvent(evnt, node, chunks, chunkIndex);
1664
+ }
1665
+ }, [multiple ? renderCheckbox(node, isExistChild, nLevel, isCheckboxChecked, isIndeterminate) : renderRadio(node, isExistChild, nLevel, isRadioChecked), (0, _vue.h)('div', {
1666
+ class: 'vxe-cascader-chunk--node-item-inner'
1667
+ }, [(0, _vue.h)('div', {
1668
+ class: 'vxe-cascader-chunk--node-item-title'
1669
+ }, titleSlot ? (0, _ui.getSlotVNs)(titleSlot(nParams)) : nodeTitle)]), treeOpts.showIcon && (lazy ? isLazyLoaded ? isExistChild : hasLazyChilds : isExistChild) ? (0, _vue.h)('div', {
1670
+ class: 'vxe-cascader-chunk--node-item-switcher'
1671
+ }, [[(0, _vue.h)('div', {
1672
+ class: 'vxe-cascader--node-item-icon',
1673
+ onClick(evnt) {
1674
+ if (treeOpts.trigger === 'icon') {
1675
+ toggleExpandEvent(evnt, node, chunks, chunkIndex);
1676
+ }
1677
+ }
1678
+ }, iconSlot ? (0, _ui.getSlotVNs)(iconSlot(nParams)) : [(0, _vue.h)('i', {
1679
+ class: isLazyLoading ? iconLoaded || (0, _ui.getIcon)().CASCADER_NODE_LOADED : isExpand ? iconOpen || (0, _ui.getIcon)().CASCADER_NODE_OPEN : iconClose || (0, _ui.getIcon)().CASCADER_NODE_CLOSE
1680
+ })])]]) : (0, _ui.renderEmptyElement)($xeCascader)]);
1681
+ };
578
1682
  const renderVN = () => {
579
1683
  const {
580
1684
  className,
@@ -584,14 +1688,16 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
584
1688
  filterable,
585
1689
  showTotalButton,
586
1690
  showCheckedButton,
587
- showClearButton
1691
+ showClearButton,
1692
+ showCloseButton
588
1693
  } = props;
589
1694
  const {
590
1695
  initialized,
591
1696
  isActivated,
592
1697
  isAniVisible,
593
1698
  visiblePanel,
594
- searchValue
1699
+ searchValue,
1700
+ currentCunkList
595
1701
  } = reactData;
596
1702
  const vSize = computeSize.value;
597
1703
  const isDisabled = computeIsDisabled.value;
@@ -657,7 +1763,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
657
1763
  'ani--enter': !loading && visiblePanel
658
1764
  }],
659
1765
  placement: reactData.panelPlacement,
660
- style: reactData.panelStyle
1766
+ style: popupWrapperStyle
661
1767
  }, initialized ? [(0, _vue.h)('div', {
662
1768
  class: 'vxe-cascader--panel-wrapper'
663
1769
  }, [filterable ? (0, _vue.h)('div', {
@@ -672,37 +1778,80 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
672
1778
  placeholder: (0, _ui.getI18n)('vxe.cascader.search'),
673
1779
  prefixIcon: (0, _ui.getIcon)().INPUT_SEARCH,
674
1780
  'onUpdate:modelValue': modelSearchEvent
675
- })]) : (0, _ui.renderEmptyElement)($xeCascader), showTotalButton || showCheckedButton && multiple || showClearButton || headerSlot ? (0, _vue.h)('div', {
676
- class: 'vxe-cascader--panel-header'
1781
+ })]) : (0, _ui.renderEmptyElement)($xeCascader), showCheckedButton && multiple || showClearButton || headerSlot ? (0, _vue.h)('div', {
1782
+ class: 'vxe-tree-select--panel-header'
677
1783
  }, headerSlot ? headerSlot({}) : [(0, _vue.h)('div', {
678
- class: 'vxe-cascader--header-button'
679
- }, [showTotalButton ? (0, _vue.h)('div', {
680
- class: 'vxe-cascader--header-total'
681
- }, (0, _ui.getI18n)('vxe.cascader.total', [selectVals.length])) : (0, _ui.renderEmptyElement)($xeCascader), (0, _vue.h)('div', {
682
- class: 'vxe-cascader--header-btns'
1784
+ class: 'vxe-tree-select--header-button'
1785
+ }, [showCheckedButton && showClearButton ? (0, _vue.h)('div', {
1786
+ class: 'vxe-tree-select--selected-btns'
683
1787
  }, [showCheckedButton && multiple ? (0, _vue.h)(_button.default, {
684
- content: (0, _ui.getI18n)('vxe.cascader.allChecked'),
1788
+ content: (0, _ui.getI18n)('vxe.treeSelect.allChecked'),
685
1789
  mode: 'text',
686
1790
  onClick: allCheckedPanelEvent
687
1791
  }) : (0, _ui.renderEmptyElement)($xeCascader), showClearButton ? (0, _vue.h)(_button.default, {
688
- content: (0, _ui.getI18n)('vxe.cascader.clearChecked'),
1792
+ content: (0, _ui.getI18n)('vxe.treeSelect.clearChecked'),
689
1793
  mode: 'text',
690
1794
  onClick: clearCheckedPanelEvent
691
- }) : (0, _ui.renderEmptyElement)($xeCascader)])])]) : (0, _ui.renderEmptyElement)($xeCascader), (0, _vue.h)('div', {
1795
+ }) : (0, _ui.renderEmptyElement)($xeCascader)]) : (0, _ui.renderEmptyElement)($xeCascader)])]) : (0, _ui.renderEmptyElement)($xeCascader), (0, _vue.h)('div', {
692
1796
  class: 'vxe-cascader--panel-body'
693
1797
  }, [(0, _vue.h)('div', {
694
- ref: refTreeWrapper,
695
- class: 'vxe-cascader-tree--wrapper',
696
- style: popupWrapperStyle
697
- }, [])]), footerSlot ? (0, _vue.h)('div', {
1798
+ ref: refChunkWrapper,
1799
+ class: 'vxe-cascader-chunk--wrapper'
1800
+ }, [currentCunkList.map((chunks, chunkIndex) => {
1801
+ return (0, _vue.h)('div', {
1802
+ key: chunkIndex,
1803
+ class: 'vxe-cascader-chunk--item-wrapper'
1804
+ }, [(0, _vue.h)(_list.default, {
1805
+ data: chunks
1806
+ }, {
1807
+ default(slotParams) {
1808
+ const {
1809
+ items
1810
+ } = slotParams;
1811
+ return items.map((node, nodeIndex) => {
1812
+ const nodeid = getNodeId(node);
1813
+ return renderNode(node, nodeid, nodeIndex, chunks, chunkIndex);
1814
+ });
1815
+ }
1816
+ })]);
1817
+ })])]), footerSlot || showTotalButton || showCloseButton && multiple ? (0, _vue.h)('div', {
698
1818
  class: 'vxe-cascader--panel-footer'
699
- }, footerSlot({})) : (0, _ui.renderEmptyElement)($xeCascader)])] : [])])]);
1819
+ }, footerSlot ? footerSlot({}) : [(0, _vue.h)('div', {
1820
+ class: 'vxe-cascader--footer-button'
1821
+ }, [showTotalButton ? (0, _vue.h)('div', {
1822
+ class: 'vxe-cascader--total-btns'
1823
+ }, (0, _ui.getI18n)('vxe.treeSelect.total', [selectVals.length])) : (0, _ui.renderEmptyElement)($xeCascader), showCloseButton && multiple ? (0, _vue.h)('div', {
1824
+ class: 'vxe-cascader--oper-btns'
1825
+ }, [(0, _vue.h)(_button.default, {
1826
+ content: (0, _ui.getI18n)('vxe.select.close'),
1827
+ mode: 'text',
1828
+ onClick: closePanelEvent
1829
+ })]) : (0, _ui.renderEmptyElement)($xeCascader)])]) : (0, _ui.renderEmptyElement)($xeCascader)])] : [])])]);
700
1830
  };
1831
+ (0, _vue.watch)(() => props.modelValue, () => {
1832
+ if (!reactData.visiblePanel) {
1833
+ handleCurrentItems();
1834
+ updateCurrentChunk();
1835
+ }
1836
+ });
1837
+ (0, _vue.watch)(() => props.options, () => {
1838
+ cacheNodeMap();
1839
+ });
1840
+ const dataFlag = (0, _vue.ref)(0);
1841
+ (0, _vue.watch)(() => props.options ? props.options.length : 0, () => {
1842
+ dataFlag.value++;
1843
+ });
701
1844
  (0, _vue.watch)(() => props.options, () => {
702
- cacheDataMap();
1845
+ dataFlag.value++;
1846
+ });
1847
+ (0, _vue.watch)(dataFlag, () => {
1848
+ loadData(props.options || []);
703
1849
  });
704
- cacheDataMap();
1850
+ loadData(props.options || []);
705
1851
  (0, _vue.onMounted)(() => {
1852
+ if (props.filterable) {
1853
+ (0, _log.errLog)('vxe.error.notProp', ['filterable']);
1854
+ }
706
1855
  _ui.globalEvents.on($xeCascader, 'mousewheel', handleGlobalMousewheelEvent);
707
1856
  _ui.globalEvents.on($xeCascader, 'mousedown', handleGlobalMousedownEvent);
708
1857
  _ui.globalEvents.on($xeCascader, 'blur', handleGlobalBlurEvent);