vxe-pc-ui 4.11.28 → 4.11.29

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 (233) hide show
  1. package/README.md +6 -0
  2. package/es/backtop/index.js +12 -0
  3. package/es/backtop/src/backtop.js +231 -0
  4. package/es/backtop/style.css +90 -0
  5. package/es/backtop/style.min.css +1 -0
  6. package/es/cascader/index.js +12 -0
  7. package/es/cascader/src/cascader.js +669 -0
  8. package/es/cascader/style.css +168 -0
  9. package/es/cascader/style.min.css +1 -0
  10. package/es/components.js +18 -0
  11. package/es/icon/{iconfont.1767178201934.ttf → iconfont.1767441272505.ttf} +0 -0
  12. package/es/icon/iconfont.1767441272505.woff +0 -0
  13. package/es/icon/iconfont.1767441272505.woff2 +0 -0
  14. package/es/icon/style.css +9 -1
  15. package/es/icon/style.min.css +1 -1
  16. package/{lib/icon/style/iconfont.1767178201934.ttf → es/iconfont.1767441272505.ttf} +0 -0
  17. package/es/iconfont.1767441272505.woff +0 -0
  18. package/es/iconfont.1767441272505.woff2 +0 -0
  19. package/es/layout-body/src/layout-body.js +39 -6
  20. package/es/mention/index.js +12 -0
  21. package/es/mention/src/mention.js +51 -0
  22. package/es/mention/style.css +0 -0
  23. package/es/mention/style.min.css +0 -0
  24. package/es/segmented/index.js +12 -0
  25. package/es/segmented/src/segmented.js +218 -0
  26. package/es/segmented/style.css +195 -0
  27. package/es/segmented/style.min.css +1 -0
  28. package/es/style.css +1 -1
  29. package/es/style.min.css +1 -1
  30. package/es/tabs/src/tabs.js +1 -4
  31. package/es/timeline/index.js +12 -0
  32. package/es/timeline/src/timeline-item.js +46 -0
  33. package/es/timeline/src/timeline.js +51 -0
  34. package/es/timeline/style.css +0 -0
  35. package/es/timeline/style.min.css +0 -0
  36. package/es/timeline-item/index.js +12 -0
  37. package/es/timeline-item/style.css +0 -0
  38. package/es/timeline-item/style.min.css +0 -0
  39. package/es/tour/index.js +12 -0
  40. package/es/tour/src/tour.js +51 -0
  41. package/es/tour/style.css +0 -0
  42. package/es/tour/style.min.css +0 -0
  43. package/es/ui/index.js +15 -2
  44. package/es/ui/src/log.js +1 -1
  45. package/es/vxe-backtop/index.js +3 -0
  46. package/es/vxe-backtop/style.css +90 -0
  47. package/es/vxe-backtop/style.min.css +1 -0
  48. package/es/vxe-cascader/index.js +3 -0
  49. package/es/vxe-cascader/style.css +168 -0
  50. package/es/vxe-cascader/style.min.css +1 -0
  51. package/es/vxe-icon/style.css +9 -1
  52. package/es/vxe-icon/style.min.css +1 -1
  53. package/es/vxe-mention/index.js +3 -0
  54. package/es/vxe-mention/style.css +0 -0
  55. package/es/vxe-mention/style.min.css +0 -0
  56. package/es/vxe-segmented/index.js +3 -0
  57. package/es/vxe-segmented/style.css +195 -0
  58. package/es/vxe-segmented/style.min.css +1 -0
  59. package/es/vxe-timeline/index.js +3 -0
  60. package/es/vxe-timeline/style.css +0 -0
  61. package/es/vxe-timeline/style.min.css +0 -0
  62. package/es/vxe-timeline-item/index.js +3 -0
  63. package/es/vxe-timeline-item/style.css +0 -0
  64. package/es/vxe-timeline-item/style.min.css +0 -0
  65. package/es/vxe-tour/index.js +3 -0
  66. package/es/vxe-tour/style.css +0 -0
  67. package/es/vxe-tour/style.min.css +0 -0
  68. package/lib/backtop/index.js +19 -0
  69. package/lib/backtop/index.min.js +1 -0
  70. package/lib/backtop/src/backtop.js +256 -0
  71. package/lib/backtop/src/backtop.min.js +1 -0
  72. package/lib/backtop/style/index.js +1 -0
  73. package/lib/backtop/style/style.css +90 -0
  74. package/lib/backtop/style/style.min.css +1 -0
  75. package/lib/cascader/index.js +19 -0
  76. package/lib/cascader/index.min.js +1 -0
  77. package/lib/cascader/src/cascader.js +723 -0
  78. package/lib/cascader/src/cascader.min.js +1 -0
  79. package/lib/cascader/style/index.js +1 -0
  80. package/lib/cascader/style/style.css +168 -0
  81. package/lib/cascader/style/style.min.css +1 -0
  82. package/lib/components.js +73 -1
  83. package/lib/components.min.js +1 -1
  84. package/lib/{iconfont.1767178201934.ttf → icon/style/iconfont.1767441272505.ttf} +0 -0
  85. package/lib/icon/style/iconfont.1767441272505.woff +0 -0
  86. package/lib/icon/style/iconfont.1767441272505.woff2 +0 -0
  87. package/lib/icon/style/style.css +9 -1
  88. package/lib/icon/style/style.min.css +9 -1
  89. package/{es/iconfont.1767178201934.ttf → lib/iconfont.1767441272505.ttf} +0 -0
  90. package/lib/iconfont.1767441272505.woff +0 -0
  91. package/lib/iconfont.1767441272505.woff2 +0 -0
  92. package/lib/index.umd.js +5255 -3740
  93. package/lib/index.umd.min.js +1 -1
  94. package/lib/layout-body/src/layout-body.js +34 -4
  95. package/lib/layout-body/src/layout-body.min.js +1 -1
  96. package/lib/mention/index.js +19 -0
  97. package/lib/mention/index.min.js +1 -0
  98. package/lib/mention/src/mention.js +62 -0
  99. package/lib/mention/src/mention.min.js +1 -0
  100. package/lib/mention/style/index.js +1 -0
  101. package/lib/mention/style/style.css +0 -0
  102. package/lib/mention/style/style.min.css +0 -0
  103. package/lib/segmented/index.js +19 -0
  104. package/lib/segmented/index.min.js +1 -0
  105. package/lib/segmented/src/segmented.js +237 -0
  106. package/lib/segmented/src/segmented.min.js +1 -0
  107. package/lib/segmented/style/index.js +1 -0
  108. package/lib/segmented/style/style.css +195 -0
  109. package/lib/segmented/style/style.min.css +1 -0
  110. package/lib/style.css +1 -1
  111. package/lib/style.min.css +1 -1
  112. package/lib/tabs/src/tabs.js +1 -5
  113. package/lib/tabs/src/tabs.min.js +1 -1
  114. package/lib/timeline/index.js +19 -0
  115. package/lib/timeline/index.min.js +1 -0
  116. package/lib/timeline/src/timeline-item.js +57 -0
  117. package/lib/timeline/src/timeline-item.min.js +1 -0
  118. package/lib/timeline/src/timeline.js +62 -0
  119. package/lib/timeline/src/timeline.min.js +1 -0
  120. package/lib/timeline/style/index.js +1 -0
  121. package/lib/timeline/style/style.css +0 -0
  122. package/lib/timeline/style/style.min.css +0 -0
  123. package/lib/timeline-item/index.js +19 -0
  124. package/lib/timeline-item/index.min.js +1 -0
  125. package/lib/timeline-item/style/index.js +1 -0
  126. package/lib/timeline-item/style/style.css +0 -0
  127. package/lib/timeline-item/style/style.min.css +0 -0
  128. package/lib/tour/index.js +19 -0
  129. package/lib/tour/index.min.js +1 -0
  130. package/lib/tour/src/tour.js +62 -0
  131. package/lib/tour/src/tour.min.js +1 -0
  132. package/lib/tour/style/index.js +1 -0
  133. package/lib/tour/style/style.css +0 -0
  134. package/lib/tour/style/style.min.css +0 -0
  135. package/lib/ui/index.js +15 -2
  136. package/lib/ui/index.min.js +1 -1
  137. package/lib/ui/src/log.js +1 -1
  138. package/lib/ui/src/log.min.js +1 -1
  139. package/lib/vxe-backtop/index.js +22 -0
  140. package/lib/vxe-backtop/index.min.js +1 -0
  141. package/lib/vxe-backtop/style/index.js +1 -0
  142. package/lib/vxe-backtop/style/style.css +90 -0
  143. package/lib/vxe-backtop/style/style.min.css +1 -0
  144. package/lib/vxe-cascader/index.js +22 -0
  145. package/lib/vxe-cascader/index.min.js +1 -0
  146. package/lib/vxe-cascader/style/index.js +1 -0
  147. package/lib/vxe-cascader/style/style.css +168 -0
  148. package/lib/vxe-cascader/style/style.min.css +1 -0
  149. package/lib/vxe-icon/style/style.css +9 -1
  150. package/lib/vxe-icon/style/style.min.css +1 -1
  151. package/lib/vxe-mention/index.js +22 -0
  152. package/lib/vxe-mention/index.min.js +1 -0
  153. package/lib/vxe-mention/style/index.js +1 -0
  154. package/lib/vxe-mention/style/style.css +0 -0
  155. package/lib/vxe-mention/style/style.min.css +0 -0
  156. package/lib/vxe-segmented/index.js +22 -0
  157. package/lib/vxe-segmented/index.min.js +1 -0
  158. package/lib/vxe-segmented/style/index.js +1 -0
  159. package/lib/vxe-segmented/style/style.css +195 -0
  160. package/lib/vxe-segmented/style/style.min.css +1 -0
  161. package/lib/vxe-timeline/index.js +22 -0
  162. package/lib/vxe-timeline/index.min.js +1 -0
  163. package/lib/vxe-timeline/style/index.js +1 -0
  164. package/lib/vxe-timeline/style/style.css +0 -0
  165. package/lib/vxe-timeline/style/style.min.css +0 -0
  166. package/lib/vxe-timeline-item/index.js +22 -0
  167. package/lib/vxe-timeline-item/index.min.js +1 -0
  168. package/lib/vxe-timeline-item/style/index.js +1 -0
  169. package/lib/vxe-timeline-item/style/style.css +0 -0
  170. package/lib/vxe-timeline-item/style/style.min.css +0 -0
  171. package/lib/vxe-tour/index.js +22 -0
  172. package/lib/vxe-tour/index.min.js +1 -0
  173. package/lib/vxe-tour/style/index.js +1 -0
  174. package/lib/vxe-tour/style/style.css +0 -0
  175. package/lib/vxe-tour/style/style.min.css +0 -0
  176. package/package.json +1 -1
  177. package/packages/backtop/index.ts +16 -0
  178. package/packages/backtop/src/backtop.ts +264 -0
  179. package/packages/cascader/index.ts +16 -0
  180. package/packages/cascader/src/cascader.ts +739 -0
  181. package/packages/components.ts +18 -0
  182. package/packages/layout-body/src/layout-body.ts +43 -9
  183. package/packages/mention/index.ts +16 -0
  184. package/packages/mention/src/mention.ts +71 -0
  185. package/packages/segmented/index.ts +16 -0
  186. package/packages/segmented/src/segmented.ts +254 -0
  187. package/packages/tabs/src/tabs.ts +1 -4
  188. package/packages/timeline/index.ts +16 -0
  189. package/packages/timeline/src/timeline-item.ts +67 -0
  190. package/packages/timeline/src/timeline.ts +71 -0
  191. package/packages/timeline-item/index.ts +16 -0
  192. package/packages/tour/index.ts +16 -0
  193. package/packages/tour/src/tour.ts +71 -0
  194. package/packages/ui/index.ts +15 -1
  195. package/styles/all.scss +7 -0
  196. package/styles/components/backtop.scss +111 -0
  197. package/styles/components/cascader.scss +140 -0
  198. package/styles/components/icon.scss +9 -2
  199. package/styles/components/mention.scss +0 -0
  200. package/styles/components/segmented.scss +214 -0
  201. package/styles/components/timeline-item.scss +0 -0
  202. package/styles/components/timeline.scss +0 -0
  203. package/styles/components/tour.scss +0 -0
  204. package/styles/icon/iconfont.ttf +0 -0
  205. package/styles/icon/iconfont.woff +0 -0
  206. package/styles/icon/iconfont.woff2 +0 -0
  207. package/styles/theme/base.scss +4 -0
  208. package/types/all.d.ts +21 -0
  209. package/types/components/backtop.d.ts +111 -0
  210. package/types/components/cascader.d.ts +255 -0
  211. package/types/components/icon.d.ts +2 -2
  212. package/types/components/layout-body.d.ts +9 -0
  213. package/types/components/list.d.ts +2 -2
  214. package/types/components/mention.d.ts +77 -0
  215. package/types/components/rate.d.ts +1 -1
  216. package/types/components/segmented.d.ts +123 -0
  217. package/types/components/select.d.ts +1 -1
  218. package/types/components/table.d.ts +4 -4
  219. package/types/components/timeline-item.d.ts +75 -0
  220. package/types/components/timeline.d.ts +77 -0
  221. package/types/components/tour.d.ts +77 -0
  222. package/types/components/tree-select.d.ts +1 -1
  223. package/types/components/tree.d.ts +1 -1
  224. package/types/ui/global-config.d.ts +14 -0
  225. package/types/ui/global-icon.d.ts +3 -0
  226. package/es/icon/iconfont.1767178201934.woff +0 -0
  227. package/es/icon/iconfont.1767178201934.woff2 +0 -0
  228. package/es/iconfont.1767178201934.woff +0 -0
  229. package/es/iconfont.1767178201934.woff2 +0 -0
  230. package/lib/icon/style/iconfont.1767178201934.woff +0 -0
  231. package/lib/icon/style/iconfont.1767178201934.woff2 +0 -0
  232. package/lib/iconfont.1767178201934.woff +0 -0
  233. package/lib/iconfont.1767178201934.woff2 +0 -0
@@ -0,0 +1,739 @@
1
+ import { ref, computed, h, PropType, nextTick, inject, provide, reactive, Teleport, onMounted, onUnmounted, watch } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import { getConfig, getI18n, getIcon, globalEvents, createEvent, useSize, renderEmptyElement } from '../../ui'
4
+ import { getEventTargetNode, updatePanelPlacement, toCssUnit } from '../../ui/src/dom'
5
+ import { getLastZIndex, nextZIndex } from '../../ui/src/utils'
6
+ import { deNodeValue } from '../../tree/src/util'
7
+ import { errLog } from '../../ui/src/log'
8
+ import XEUtils from 'xe-utils'
9
+ import VxeInputComponent from '../../input/src/input'
10
+ import VxeButtonComponent from '../../button/src/button'
11
+
12
+ import type { CascaderReactData, VxeCascaderEmits, CascaderInternalData, VxeButtonEvents, ValueOf, VxeComponentStyleType, CascaderPrivateRef, CascaderPrivateMethods, CascaderMethods, VxeCascaderPrivateComputed, VxeCascaderPropTypes, VxeCascaderConstructor, VxeFormDefines, VxeDrawerConstructor, VxeDrawerMethods, VxeCascaderPrivateMethods, VxeFormConstructor, VxeFormPrivateMethods, VxeInputConstructor, VxeModalConstructor, VxeModalMethods, VxeTreeConstructor } from '../../../types'
13
+ import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
14
+
15
+ function getOptUniqueId () {
16
+ return XEUtils.uniqueId('node_')
17
+ }
18
+
19
+ function createInternalData (): CascaderInternalData {
20
+ return {
21
+ // hpTimeout: undefined,
22
+ fullOptionList: [],
23
+ fullNodeMaps: {}
24
+ }
25
+ }
26
+
27
+ export default defineVxeComponent({
28
+ name: 'VxeCascader',
29
+ props: {
30
+ modelValue: [String, Number, Array] as PropType<VxeCascaderPropTypes.ModelValue>,
31
+ clearable: Boolean as PropType<VxeCascaderPropTypes.Clearable>,
32
+ placeholder: {
33
+ type: String as PropType<VxeCascaderPropTypes.Placeholder>,
34
+ default: () => XEUtils.eqNull(getConfig().cascader.placeholder) ? getI18n('vxe.base.pleaseSelect') : getConfig().cascader.placeholder
35
+ },
36
+ readonly: {
37
+ type: Boolean as PropType<VxeCascaderPropTypes.Readonly>,
38
+ default: null
39
+ },
40
+ loading: Boolean as PropType<VxeCascaderPropTypes.Loading>,
41
+ disabled: {
42
+ type: Boolean as PropType<VxeCascaderPropTypes.Disabled>,
43
+ default: null
44
+ },
45
+ filterable: Boolean as PropType<VxeCascaderPropTypes.Filterable>,
46
+ filterConfig: Object as PropType<VxeCascaderPropTypes.FilterConfig>,
47
+ multiple: Boolean as PropType<VxeCascaderPropTypes.Multiple>,
48
+ className: [String, Function] as PropType<VxeCascaderPropTypes.ClassName>,
49
+ prefixIcon: String as PropType<VxeCascaderPropTypes.PrefixIcon>,
50
+ placement: String as PropType<VxeCascaderPropTypes.Placement>,
51
+ transform: Boolean as PropType<VxeCascaderPropTypes.Transform>,
52
+ lazyOptions: Array as PropType<VxeCascaderPropTypes.LazyOptions>,
53
+ options: Array as PropType<VxeCascaderPropTypes.Options>,
54
+ optionProps: Object as PropType<VxeCascaderPropTypes.OptionProps>,
55
+ zIndex: Number as PropType<VxeCascaderPropTypes.ZIndex>,
56
+ size: {
57
+ type: String as PropType<VxeCascaderPropTypes.Size>,
58
+ default: () => getConfig().cascader.size || getConfig().size
59
+ },
60
+ remote: Boolean as PropType<VxeCascaderPropTypes.Remote>,
61
+ remoteConfig: Function as PropType<VxeCascaderPropTypes.RemoteConfig>,
62
+ popupConfig: Object as PropType<VxeCascaderPropTypes.PopupConfig>,
63
+ autoClose: {
64
+ type: Boolean as PropType<VxeCascaderPropTypes.AutoClose>,
65
+ default: () => getConfig().cascader.autoClose
66
+ },
67
+ showTotalButoon: {
68
+ type: Boolean as PropType<VxeCascaderPropTypes.ShowTotalButoon>,
69
+ default: () => getConfig().cascader.showTotalButoon
70
+ },
71
+ showCheckedButoon: {
72
+ type: Boolean as PropType<VxeCascaderPropTypes.ShowCheckedButoon>,
73
+ default: () => getConfig().cascader.showCheckedButoon
74
+ },
75
+ showClearButton: {
76
+ type: Boolean as PropType<VxeCascaderPropTypes.ShowClearButton>,
77
+ default: () => getConfig().cascader.showClearButton
78
+ },
79
+ transfer: {
80
+ type: Boolean as PropType<VxeCascaderPropTypes.Transfer>,
81
+ default: null
82
+ },
83
+
84
+ /**
85
+ * 已废弃,被 remote-config.queryMethod 替换
86
+ * @deprecated
87
+ */
88
+ remoteMethod: Function as PropType<VxeCascaderPropTypes.RemoteMethod>
89
+ },
90
+ emits: [
91
+ 'update:modelValue',
92
+ 'change',
93
+ 'all-change',
94
+ 'clear',
95
+ 'blur',
96
+ 'focus',
97
+ 'click',
98
+ 'node-click'
99
+ ] as VxeCascaderEmits,
100
+ setup (props, context) {
101
+ const { emit, slots } = context
102
+
103
+ const $xeModal = inject<(VxeModalConstructor & VxeModalMethods)| null>('$xeModal', null)
104
+ const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
105
+ const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
106
+ const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
107
+ const formItemInfo = inject<VxeFormDefines.ProvideItemInfo | null>('xeFormItemInfo', null)
108
+
109
+ const xID = XEUtils.uniqueId()
110
+
111
+ const { computeSize } = useSize(props)
112
+
113
+ const refElem = ref<HTMLDivElement>()
114
+ const refInput = ref<VxeInputConstructor>()
115
+ const refInpSearch = ref<VxeInputConstructor>()
116
+ const refTreeWrapper = ref<HTMLDivElement>()
117
+ const refOptionPanel = ref<HTMLDivElement>()
118
+ const refTree = ref<VxeTreeConstructor>()
119
+
120
+ const reactData = reactive<CascaderReactData>({
121
+ initialized: false,
122
+ searchValue: '',
123
+ searchLoading: false,
124
+ panelIndex: 0,
125
+ panelStyle: {},
126
+ panelPlacement: null,
127
+ triggerFocusPanel: false,
128
+ visiblePanel: false,
129
+ isAniVisible: false,
130
+ isActivated: false
131
+ })
132
+
133
+ const internalData = createInternalData()
134
+
135
+ const refMaps: CascaderPrivateRef = {
136
+ refElem
137
+ }
138
+
139
+ const computeFormReadonly = computed(() => {
140
+ const { readonly } = props
141
+ if (readonly === null) {
142
+ if ($xeForm) {
143
+ return $xeForm.props.readonly
144
+ }
145
+ return false
146
+ }
147
+ return readonly
148
+ })
149
+
150
+ const computeIsDisabled = computed(() => {
151
+ const { disabled } = props
152
+ if (disabled === null) {
153
+ if ($xeForm) {
154
+ return $xeForm.props.disabled
155
+ }
156
+ return false
157
+ }
158
+ return disabled
159
+ })
160
+
161
+ const computeBtnTransfer = computed(() => {
162
+ const { transfer } = props
163
+ if (transfer === null) {
164
+ const globalTransfer = getConfig().select.transfer
165
+ if (XEUtils.isBoolean(globalTransfer)) {
166
+ return globalTransfer
167
+ }
168
+ if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
169
+ return true
170
+ }
171
+ }
172
+ return transfer
173
+ })
174
+
175
+ const computePopupOpts = computed(() => {
176
+ return Object.assign({}, getConfig().cascader.popupConfig, props.popupConfig)
177
+ })
178
+
179
+ const computePropsOpts = computed(() => {
180
+ return props.optionProps || {}
181
+ })
182
+
183
+ const computeNodeKeyField = computed(() => {
184
+ const valueField = computeValueField.value
185
+ return valueField
186
+ })
187
+
188
+ const computeLabelField = computed(() => {
189
+ const propsOpts = computePropsOpts.value
190
+ return propsOpts.label || 'label'
191
+ })
192
+
193
+ const computeValueField = computed(() => {
194
+ const propsOpts = computePropsOpts.value
195
+ return propsOpts.value || 'value'
196
+ })
197
+
198
+ const computeChildrenField = computed(() => {
199
+ const propsOpts = computePropsOpts.value
200
+ return propsOpts.children || 'children'
201
+ })
202
+
203
+ const computeRemoteOpts = computed(() => {
204
+ return Object.assign({}, getConfig().cascader.remoteConfig, props.remoteConfig)
205
+ })
206
+
207
+ const computeSelectLabel = computed(() => {
208
+ const { modelValue, lazyOptions } = props
209
+ const { fullNodeMaps } = internalData
210
+ const valueField = computeValueField.value
211
+ const labelField = computeLabelField.value
212
+ const selectVals = XEUtils.eqNull(modelValue) ? [] : (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
213
+ return selectVals.map(val => {
214
+ const cacheItem = fullNodeMaps[val]
215
+ if (cacheItem) {
216
+ return cacheItem.item[labelField]
217
+ }
218
+ if (lazyOptions) {
219
+ const lazyItem = lazyOptions.find(item => item[valueField] === val)
220
+ if (lazyItem) {
221
+ return lazyItem[labelField]
222
+ }
223
+ }
224
+ return val
225
+ }).join(', ')
226
+ })
227
+
228
+ const computePopupWrapperStyle = computed(() => {
229
+ const popupOpts = computePopupOpts.value
230
+ const { height, width } = popupOpts
231
+ const stys: VxeComponentStyleType = {}
232
+ if (width) {
233
+ stys.width = toCssUnit(width)
234
+ }
235
+ if (height) {
236
+ stys.height = toCssUnit(height)
237
+ stys.maxHeight = toCssUnit(height)
238
+ }
239
+ return stys
240
+ })
241
+
242
+ const computeMaps: VxeCascaderPrivateComputed = {
243
+ }
244
+
245
+ const $xeCascader = {
246
+ xID,
247
+ props,
248
+ context,
249
+ reactData,
250
+ internalData,
251
+
252
+ getRefMaps: () => refMaps,
253
+ getComputeMaps: () => computeMaps
254
+ } as unknown as VxeCascaderConstructor & VxeCascaderPrivateMethods
255
+
256
+ const dispatchEvent = (type: ValueOf<VxeCascaderEmits>, params: Record<string, any>, evnt: Event | null) => {
257
+ emit(type, createEvent(evnt, { $cascader: $xeCascader }, params))
258
+ }
259
+
260
+ const emitModel = (value: any) => {
261
+ emit('update:modelValue', value)
262
+ }
263
+
264
+ const cascaderMethods: CascaderMethods = {
265
+ dispatchEvent
266
+ }
267
+
268
+ const getNodeid = (option: any) => {
269
+ const nodeKeyField = computeNodeKeyField.value
270
+ const nodeid = option[nodeKeyField]
271
+ return nodeid ? encodeURIComponent(nodeid) : ''
272
+ }
273
+
274
+ const cacheDataMap = () => {
275
+ const { transform, options } = props
276
+ const nodeKeyField = computeNodeKeyField.value
277
+ const childrenField = computeChildrenField.value
278
+ const valueField = computeValueField.value
279
+ const nodeMaps: Record<string, {
280
+ item: any
281
+ index: number
282
+ items: any[]
283
+ parent: any
284
+ nodes: any[]
285
+ }> = {}
286
+ const keyMaps: Record<string, boolean> = {}
287
+ const handleOptNode = (item: any, index: number, items: any[], path: string[], parent: any, nodes: any[]) => {
288
+ let nodeid = getNodeid(item)
289
+ if (!nodeid) {
290
+ nodeid = getOptUniqueId()
291
+ }
292
+ if (keyMaps[nodeid]) {
293
+ errLog('vxe.error.repeatKey', [`[tree-select] ${nodeKeyField}`, nodeid])
294
+ }
295
+ keyMaps[nodeid] = true
296
+ const value = item[valueField]
297
+ if (nodeMaps[value]) {
298
+ errLog('vxe.error.repeatKey', [`[tree-select] ${valueField}`, value])
299
+ }
300
+ nodeMaps[value] = { item, index, items, parent, nodes }
301
+ }
302
+ if (options) {
303
+ if (transform) {
304
+ options.forEach((item, index, items) => {
305
+ handleOptNode(item, index, items, [], null, [])
306
+ })
307
+ } else {
308
+ XEUtils.eachTree(options, handleOptNode, { children: childrenField })
309
+ }
310
+ }
311
+ internalData.fullOptionList = options || []
312
+ internalData.fullNodeMaps = nodeMaps
313
+ }
314
+
315
+ const updateZindex = () => {
316
+ const { zIndex } = props
317
+ if (zIndex) {
318
+ reactData.panelIndex = zIndex
319
+ } else if (reactData.panelIndex < getLastZIndex()) {
320
+ reactData.panelIndex = nextZIndex()
321
+ }
322
+ }
323
+
324
+ const updatePlacement = () => {
325
+ const { placement } = props
326
+ const { panelIndex } = reactData
327
+ const targetElem = refElem.value
328
+ const panelElem = refOptionPanel.value
329
+ const btnTransfer = computeBtnTransfer.value
330
+ const handleStyle = () => {
331
+ const ppObj = updatePanelPlacement(targetElem, panelElem, {
332
+ placement,
333
+ teleportTo: btnTransfer
334
+ })
335
+ const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
336
+ zIndex: panelIndex
337
+ })
338
+ reactData.panelStyle = panelStyle
339
+ reactData.panelPlacement = ppObj.placement
340
+ }
341
+ handleStyle()
342
+ return nextTick().then(handleStyle)
343
+ }
344
+
345
+ const showOptionPanel = () => {
346
+ const { loading, remote, filterable } = props
347
+ const { fullOptionList } = internalData
348
+ const isDisabled = computeIsDisabled.value
349
+ const remoteOpts = computeRemoteOpts.value
350
+ if (!loading && !isDisabled) {
351
+ clearTimeout(internalData.hpTimeout)
352
+ if (!reactData.initialized) {
353
+ reactData.initialized = true
354
+ }
355
+ reactData.isActivated = true
356
+ reactData.isAniVisible = true
357
+ if (filterable) {
358
+ if (remote && remoteOpts.enabled && remoteOpts.autoLoad && !fullOptionList.length) {
359
+ handleSearchEvent()
360
+ }
361
+ }
362
+ setTimeout(() => {
363
+ reactData.visiblePanel = true
364
+ handleFocusSearch()
365
+ }, 10)
366
+ updateZindex()
367
+ updatePlacement()
368
+ }
369
+ }
370
+
371
+ const hideOptionPanel = () => {
372
+ reactData.visiblePanel = false
373
+ internalData.hpTimeout = setTimeout(() => {
374
+ reactData.isAniVisible = false
375
+ }, 350)
376
+ }
377
+
378
+ const changeEvent = (evnt: Event, selectValue: any, node: any) => {
379
+ const value = XEUtils.isArray(selectValue) ? selectValue.map(deNodeValue) : deNodeValue(selectValue)
380
+ emitModel(value)
381
+ if (value !== props.modelValue) {
382
+ dispatchEvent('change', { value, node, option: node }, evnt)
383
+ // 自动更新校验状态
384
+ if ($xeForm && formItemInfo) {
385
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
386
+ }
387
+ }
388
+ }
389
+
390
+ const clearValueEvent = (evnt: Event, selectValue: any) => {
391
+ changeEvent(evnt, selectValue, null)
392
+ dispatchEvent('clear', { value: selectValue }, evnt)
393
+ }
394
+
395
+ const clearEvent = (params: any, evnt: Event) => {
396
+ clearValueEvent(evnt, null)
397
+ hideOptionPanel()
398
+ }
399
+
400
+ const allCheckedPanelEvent: VxeButtonEvents.Click = (params) => {
401
+ const { $event } = params
402
+ const { multiple, autoClose } = props
403
+ const $tree = refTree.value
404
+ if (multiple) {
405
+ if ($tree) {
406
+ $tree.setAllCheckboxNode(true).then(({ checkNodeKeys, checkNodes }) => {
407
+ changeEvent($event, checkNodeKeys, checkNodes[0])
408
+ dispatchEvent('all-change', { value: checkNodeKeys }, $event)
409
+ if (autoClose) {
410
+ hideOptionPanel()
411
+ }
412
+ })
413
+ }
414
+ }
415
+ }
416
+
417
+ const clearCheckedPanelEvent: VxeButtonEvents.Click = (params) => {
418
+ const { $event } = params
419
+ const { multiple, autoClose } = props
420
+ const $tree = refTree.value
421
+ if ($tree) {
422
+ const value = multiple ? [] : null
423
+ $tree.clearCheckboxNode().then(() => {
424
+ if (autoClose) {
425
+ hideOptionPanel()
426
+ }
427
+ })
428
+ changeEvent($event, value, null)
429
+ dispatchEvent('clear', { value }, $event)
430
+ }
431
+ }
432
+
433
+ const handleGlobalMousewheelEvent = (evnt: MouseEvent) => {
434
+ const { visiblePanel } = reactData
435
+ const isDisabled = computeIsDisabled.value
436
+ if (!isDisabled) {
437
+ if (visiblePanel) {
438
+ const panelElem = refOptionPanel.value
439
+ if (getEventTargetNode(evnt, panelElem).flag) {
440
+ updatePlacement()
441
+ } else {
442
+ hideOptionPanel()
443
+ }
444
+ }
445
+ }
446
+ }
447
+
448
+ const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
449
+ const { visiblePanel } = reactData
450
+ const isDisabled = computeIsDisabled.value
451
+ if (!isDisabled) {
452
+ const el = refElem.value
453
+ const panelElem = refOptionPanel.value
454
+ reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
455
+ if (visiblePanel && !reactData.isActivated) {
456
+ hideOptionPanel()
457
+ }
458
+ }
459
+ }
460
+
461
+ const handleGlobalBlurEvent = () => {
462
+ const { visiblePanel, isActivated } = reactData
463
+ if (visiblePanel) {
464
+ hideOptionPanel()
465
+ }
466
+ if (isActivated) {
467
+ reactData.isActivated = false
468
+ }
469
+ if (visiblePanel || isActivated) {
470
+ const $input = refInput.value
471
+ if ($input) {
472
+ $input.blur()
473
+ }
474
+ }
475
+ }
476
+
477
+ const handleGlobalResizeEvent = () => {
478
+ const { visiblePanel } = reactData
479
+ if (visiblePanel) {
480
+ updatePlacement()
481
+ }
482
+ }
483
+
484
+ const handleFocusSearch = () => {
485
+ if (props.filterable) {
486
+ nextTick(() => {
487
+ const inpSearch = refInpSearch.value
488
+ if (inpSearch) {
489
+ inpSearch.focus()
490
+ }
491
+ })
492
+ }
493
+ }
494
+
495
+ const focusEvent = (evnt: FocusEvent) => {
496
+ const isDisabled = computeIsDisabled.value
497
+ if (!isDisabled) {
498
+ if (!reactData.visiblePanel) {
499
+ reactData.triggerFocusPanel = true
500
+ showOptionPanel()
501
+ setTimeout(() => {
502
+ reactData.triggerFocusPanel = false
503
+ }, 150)
504
+ }
505
+ }
506
+ dispatchEvent('focus', {}, evnt)
507
+ }
508
+
509
+ const clickEvent = (evnt: MouseEvent) => {
510
+ togglePanelEvent(evnt)
511
+ dispatchEvent('click', {}, evnt)
512
+ }
513
+
514
+ const blurEvent = (evnt: FocusEvent) => {
515
+ reactData.isActivated = false
516
+ dispatchEvent('blur', {}, evnt)
517
+ }
518
+
519
+ const modelSearchEvent = (value: string) => {
520
+ reactData.searchValue = value
521
+ }
522
+
523
+ const handleSearchEvent = () => {
524
+ const { modelValue, remote, remoteMethod } = props
525
+ const { searchValue } = reactData
526
+ const remoteOpts = computeRemoteOpts.value
527
+ const queryMethod = remoteOpts.queryMethod || remoteMethod
528
+ if (remote && queryMethod && remoteOpts.enabled) {
529
+ reactData.searchLoading = true
530
+ Promise.resolve(
531
+ queryMethod({ $cascader: $xeCascader, searchValue, value: modelValue })
532
+ ).then(() => nextTick())
533
+ .catch(() => nextTick())
534
+ .finally(() => {
535
+ reactData.searchLoading = false
536
+ })
537
+ }
538
+ }
539
+
540
+ const togglePanelEvent = (params: any) => {
541
+ const { $event } = params
542
+ $event.preventDefault()
543
+ if (reactData.triggerFocusPanel) {
544
+ reactData.triggerFocusPanel = false
545
+ } else {
546
+ if (reactData.visiblePanel) {
547
+ hideOptionPanel()
548
+ } else {
549
+ showOptionPanel()
550
+ }
551
+ }
552
+ }
553
+
554
+ const cascaderPrivateMethods: CascaderPrivateMethods = {
555
+ }
556
+
557
+ Object.assign($xeCascader, cascaderMethods, cascaderPrivateMethods)
558
+
559
+ const renderVN = () => {
560
+ const { className, modelValue, multiple, loading, filterable, showTotalButoon, showCheckedButoon, showClearButton } = props
561
+ const { initialized, isActivated, isAniVisible, visiblePanel, searchValue } = reactData
562
+ const vSize = computeSize.value
563
+ const isDisabled = computeIsDisabled.value
564
+ const selectLabel = computeSelectLabel.value
565
+ const btnTransfer = computeBtnTransfer.value
566
+ const formReadonly = computeFormReadonly.value
567
+ const popupWrapperStyle = computePopupWrapperStyle.value
568
+ const headerSlot = slots.header
569
+ const footerSlot = slots.footer
570
+ const prefixSlot = slots.prefix
571
+ const popupOpts = computePopupOpts.value
572
+ const popupClassName = popupOpts.className
573
+
574
+ if (formReadonly) {
575
+ return h('div', {
576
+ ref: refElem,
577
+ class: ['vxe-cascader--readonly', className]
578
+ }, [
579
+ h('span', {
580
+ class: 'vxe-cascader-label'
581
+ }, selectLabel)
582
+ ])
583
+ }
584
+ const selectVals = XEUtils.eqNull(modelValue) ? [] : (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
585
+ return h('div', {
586
+ ref: refElem,
587
+ class: ['vxe-cascader', className ? (XEUtils.isFunction(className) ? className({ $cascader: $xeCascader }) : className) : '', {
588
+ [`size--${vSize}`]: vSize,
589
+ 'is--filterable': filterable,
590
+ 'is--visible': visiblePanel,
591
+ 'is--disabled': isDisabled,
592
+ 'is--loading': loading,
593
+ 'is--active': isActivated
594
+ }]
595
+ }, [
596
+ h(VxeInputComponent, {
597
+ ref: refInput,
598
+ clearable: props.clearable,
599
+ placeholder: loading ? getI18n('vxe.select.loadingText') : props.placeholder,
600
+ readonly: true,
601
+ disabled: isDisabled,
602
+ type: 'text',
603
+ prefixIcon: props.prefixIcon,
604
+ suffixIcon: loading ? getIcon().TREE_SELECT_LOADED : (visiblePanel ? getIcon().TREE_SELECT_OPEN : getIcon().TREE_SELECT_CLOSE),
605
+ modelValue: loading ? '' : selectLabel,
606
+ title: selectLabel,
607
+ onClear: clearEvent,
608
+ onClick: clickEvent,
609
+ onFocus: focusEvent,
610
+ onBlur: blurEvent,
611
+ onSuffixClick: togglePanelEvent
612
+ }, prefixSlot
613
+ ? {
614
+ prefix: () => prefixSlot({})
615
+ }
616
+ : {}),
617
+ h(Teleport, {
618
+ to: 'body',
619
+ disabled: btnTransfer ? !initialized : true
620
+ }, [
621
+ h('div', {
622
+ ref: refOptionPanel,
623
+ class: ['vxe-table--ignore-clear vxe-cascader--panel', popupClassName ? (XEUtils.isFunction(popupClassName) ? popupClassName({ $cascader: $xeCascader }) : popupClassName) : '', {
624
+ [`size--${vSize}`]: vSize,
625
+ 'is--transfer': btnTransfer,
626
+ 'ani--leave': !loading && isAniVisible,
627
+ 'ani--enter': !loading && visiblePanel
628
+ }],
629
+ placement: reactData.panelPlacement,
630
+ style: reactData.panelStyle
631
+ }, initialized
632
+ ? [
633
+ h('div', {
634
+ class: 'vxe-cascader--panel-wrapper'
635
+ }, [
636
+ filterable
637
+ ? h('div', {
638
+ class: 'vxe-cascader--panel-search'
639
+ }, [
640
+ h(VxeInputComponent, {
641
+ ref: refInpSearch,
642
+ class: 'vxe-cascader-search--input',
643
+ modelValue: searchValue,
644
+ clearable: true,
645
+ disabled: false,
646
+ readonly: false,
647
+ placeholder: getI18n('vxe.cascader.search'),
648
+ prefixIcon: getIcon().INPUT_SEARCH,
649
+ 'onUpdate:modelValue': modelSearchEvent
650
+ })
651
+ ])
652
+ : renderEmptyElement($xeCascader),
653
+ showTotalButoon || (showCheckedButoon && multiple) || showClearButton || headerSlot
654
+ ? h('div', {
655
+ class: 'vxe-cascader--panel-header'
656
+ }, headerSlot
657
+ ? headerSlot({})
658
+ : [
659
+ h('div', {
660
+ class: 'vxe-cascader--header-button'
661
+ }, [
662
+ showTotalButoon
663
+ ? h('div', {
664
+ class: 'vxe-cascader--header-total'
665
+ }, getI18n('vxe.cascader.total', [selectVals.length]))
666
+ : renderEmptyElement($xeCascader),
667
+ h('div', {
668
+ class: 'vxe-cascader--header-btns'
669
+ }, [
670
+ (showCheckedButoon && multiple)
671
+ ? h(VxeButtonComponent, {
672
+ content: getI18n('vxe.cascader.allChecked'),
673
+ mode: 'text',
674
+ onClick: allCheckedPanelEvent
675
+ })
676
+ : renderEmptyElement($xeCascader),
677
+ showClearButton
678
+ ? h(VxeButtonComponent, {
679
+ content: getI18n('vxe.cascader.clearChecked'),
680
+ mode: 'text',
681
+ onClick: clearCheckedPanelEvent
682
+ })
683
+ : renderEmptyElement($xeCascader)
684
+ ])
685
+ ])
686
+ ])
687
+ : renderEmptyElement($xeCascader),
688
+ h('div', {
689
+ class: 'vxe-cascader--panel-body'
690
+ }, [
691
+ h('div', {
692
+ ref: refTreeWrapper,
693
+ class: 'vxe-cascader-tree--wrapper',
694
+ style: popupWrapperStyle
695
+ }, [])
696
+ ]),
697
+ footerSlot
698
+ ? h('div', {
699
+ class: 'vxe-cascader--panel-footer'
700
+ }, footerSlot({}))
701
+ : renderEmptyElement($xeCascader)
702
+ ])
703
+ ]
704
+ : [])
705
+ ])
706
+ ])
707
+ }
708
+
709
+ watch(() => props.options, () => {
710
+ cacheDataMap()
711
+ })
712
+
713
+ cacheDataMap()
714
+
715
+ onMounted(() => {
716
+ globalEvents.on($xeCascader, 'mousewheel', handleGlobalMousewheelEvent)
717
+ globalEvents.on($xeCascader, 'mousedown', handleGlobalMousedownEvent)
718
+ globalEvents.on($xeCascader, 'blur', handleGlobalBlurEvent)
719
+ globalEvents.on($xeCascader, 'resize', handleGlobalResizeEvent)
720
+ })
721
+
722
+ onUnmounted(() => {
723
+ globalEvents.off($xeCascader, 'mousewheel')
724
+ globalEvents.off($xeCascader, 'mousedown')
725
+ globalEvents.off($xeCascader, 'blur')
726
+ globalEvents.off($xeCascader, 'resize')
727
+ XEUtils.assign(internalData, createInternalData())
728
+ })
729
+
730
+ provide('$xeCascader', $xeCascader)
731
+
732
+ $xeCascader.renderVN = renderVN
733
+
734
+ return $xeCascader
735
+ },
736
+ render () {
737
+ return this.renderVN()
738
+ }
739
+ })