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