vxe-pc-ui 3.17.19 → 3.17.21

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 (78) hide show
  1. package/es/components.js +31 -1
  2. package/es/icon/style.css +1 -1
  3. package/es/slider/src/slider.js +220 -82
  4. package/es/slider/style.css +8 -15
  5. package/es/slider/style.min.css +1 -1
  6. package/es/space/index.js +12 -0
  7. package/es/space/src/space.js +143 -0
  8. package/es/space/style.css +37 -0
  9. package/es/space/style.min.css +1 -0
  10. package/es/style.css +1 -1
  11. package/es/style.min.css +1 -1
  12. package/es/ui/index.js +2 -1
  13. package/es/ui/src/dom.js +3 -0
  14. package/es/ui/src/log.js +1 -1
  15. package/es/vxe-slider/style.css +8 -15
  16. package/es/vxe-slider/style.min.css +1 -1
  17. package/es/vxe-space/index.js +3 -0
  18. package/es/vxe-space/style.css +37 -0
  19. package/es/vxe-space/style.min.css +1 -0
  20. package/lib/components.js +41 -2
  21. package/lib/components.min.js +1 -1
  22. package/lib/icon/style/style.css +1 -1
  23. package/lib/icon/style/style.min.css +1 -1
  24. package/lib/index.umd.js +462 -91
  25. package/lib/index.umd.min.js +1 -1
  26. package/lib/slider/src/slider.js +237 -87
  27. package/lib/slider/src/slider.min.js +1 -1
  28. package/lib/slider/style/style.css +8 -15
  29. package/lib/slider/style/style.min.css +1 -1
  30. package/lib/space/index.js +19 -0
  31. package/lib/space/index.min.js +1 -0
  32. package/lib/space/src/space.js +172 -0
  33. package/lib/space/src/space.min.js +1 -0
  34. package/lib/space/style/index.js +1 -0
  35. package/lib/space/style/style.css +37 -0
  36. package/lib/space/style/style.min.css +1 -0
  37. package/lib/style.css +1 -1
  38. package/lib/style.min.css +1 -1
  39. package/lib/ui/index.js +2 -1
  40. package/lib/ui/index.min.js +1 -1
  41. package/lib/ui/src/dom.js +4 -0
  42. package/lib/ui/src/dom.min.js +1 -1
  43. package/lib/ui/src/log.js +1 -1
  44. package/lib/ui/src/log.min.js +1 -1
  45. package/lib/vxe-slider/style/style.css +8 -15
  46. package/lib/vxe-slider/style/style.min.css +1 -1
  47. package/lib/vxe-space/index.js +22 -0
  48. package/lib/vxe-space/index.min.js +1 -0
  49. package/lib/vxe-space/style/index.js +1 -0
  50. package/lib/vxe-space/style/style.css +37 -0
  51. package/lib/vxe-space/style/style.min.css +1 -0
  52. package/package.json +2 -2
  53. package/packages/components.ts +31 -1
  54. package/packages/slider/src/slider.ts +226 -80
  55. package/packages/space/index.ts +16 -0
  56. package/packages/space/src/space.ts +159 -0
  57. package/packages/ui/index.ts +1 -0
  58. package/packages/ui/src/dom.ts +4 -0
  59. package/styles/all.scss +1 -0
  60. package/styles/components/slider.scss +8 -13
  61. package/styles/components/space.scss +38 -0
  62. package/styles/theme/base.scss +20 -6
  63. package/types/all.d.ts +3 -0
  64. package/types/components/slider.d.ts +13 -0
  65. package/types/components/space.d.ts +102 -0
  66. package/types/ui/global-config.d.ts +2 -0
  67. /package/es/icon/{iconfont.1787739873173.ttf → iconfont.1787994741699.ttf} +0 -0
  68. /package/es/icon/{iconfont.1787739873173.woff → iconfont.1787994741699.woff} +0 -0
  69. /package/es/icon/{iconfont.1787739873173.woff2 → iconfont.1787994741699.woff2} +0 -0
  70. /package/es/{iconfont.1787739873173.ttf → iconfont.1787994741699.ttf} +0 -0
  71. /package/es/{iconfont.1787739873173.woff → iconfont.1787994741699.woff} +0 -0
  72. /package/es/{iconfont.1787739873173.woff2 → iconfont.1787994741699.woff2} +0 -0
  73. /package/lib/icon/style/{iconfont.1787739873173.ttf → iconfont.1787994741699.ttf} +0 -0
  74. /package/lib/icon/style/{iconfont.1787739873173.woff → iconfont.1787994741699.woff} +0 -0
  75. /package/lib/icon/style/{iconfont.1787739873173.woff2 → iconfont.1787994741699.woff2} +0 -0
  76. /package/lib/{iconfont.1787739873173.ttf → iconfont.1787994741699.ttf} +0 -0
  77. /package/lib/{iconfont.1787739873173.woff → iconfont.1787994741699.woff} +0 -0
  78. /package/lib/{iconfont.1787739873173.woff2 → iconfont.1787994741699.woff2} +0 -0
@@ -3,7 +3,21 @@ import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
4
  import { getConfig, createEvent, renderEmptyElement } from '../../ui'
5
5
 
6
- import type { SliderReactData, VxeSliderEmits, ValueOf, VxeSliderPropTypes, VxeFormDefines, VxeComponentSizeType, VxeFormConstructor, VxeFormPrivateMethods } from '../../../types'
6
+ import type { SliderReactData, SliderInternalData, VxeSliderEmits, ValueOf, VxeSliderPropTypes, VxeFormDefines, VxeComponentSizeType, VxeFormConstructor, VxeFormPrivateMethods } from '../../../types'
7
+
8
+ function createInternalData (): SliderInternalData {
9
+ return {
10
+ // _isUp: false,
11
+ currValue: 0,
12
+ startValue: 0,
13
+ endValue: 0
14
+ }
15
+ }
16
+
17
+ function createReactData (): SliderReactData {
18
+ return {
19
+ }
20
+ }
7
21
 
8
22
  export default /* define-vxe-component start */ defineVxeComponent({
9
23
  name: 'VxeSlider',
@@ -13,6 +27,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
13
27
  },
14
28
  props: {
15
29
  value: [String, Number, Array] as PropType<VxeSliderPropTypes.ModelValue>,
30
+ startValue: [String, Number] as PropType<VxeSliderPropTypes.StartValue>,
31
+ endValue: [String, Number] as PropType<VxeSliderPropTypes.EndValue>,
16
32
  vertical: Boolean as PropType<VxeSliderPropTypes.Vertical>,
17
33
  max: {
18
34
  type: [String, Number] as PropType<VxeSliderPropTypes.Max>,
@@ -41,6 +57,10 @@ export default /* define-vxe-component start */ defineVxeComponent({
41
57
  disabled: {
42
58
  type: Boolean as PropType<VxeSliderPropTypes.Disabled>,
43
59
  default: null
60
+ },
61
+ immediate: {
62
+ type: Boolean as PropType<VxeSliderPropTypes.Immediate>,
63
+ default: () => getConfig().slider.immediate
44
64
  }
45
65
  },
46
66
  inject: {
@@ -54,11 +74,11 @@ export default /* define-vxe-component start */ defineVxeComponent({
54
74
  },
55
75
  data () {
56
76
  const xID = XEUtils.uniqueId()
57
- const reactData: SliderReactData = {
58
- startValue: 0,
59
- endValue: 0
60
- }
77
+ const reactData = createReactData()
61
78
  return {
79
+ ...({} as {
80
+ internalData: SliderInternalData,
81
+ }),
62
82
  xID,
63
83
  reactData
64
84
  }
@@ -108,6 +128,13 @@ export default /* define-vxe-component start */ defineVxeComponent({
108
128
  const props = $xeSlider
109
129
 
110
130
  return XEUtils.toNumber(props.min || 0)
131
+ },
132
+ computeMVal () {
133
+ const $xeSlider = this
134
+ const props = $xeSlider
135
+
136
+ const { range, startValue, endValue } = props
137
+ return range ? `${startValue || ''}${endValue || ''}` : ''
111
138
  }
112
139
  },
113
140
  methods: {
@@ -120,141 +147,230 @@ export default /* define-vxe-component start */ defineVxeComponent({
120
147
  },
121
148
  emitModel (value: any) {
122
149
  const $xeSlider = this
150
+ const internalData = $xeSlider.internalData
123
151
 
124
152
  const { _events } = $xeSlider as any
153
+ internalData._isUp = true
125
154
  if (_events && _events.modelValue) {
126
155
  $xeSlider.$emit('modelValue', value)
127
156
  } else {
128
157
  $xeSlider.$emit('model-value', value)
129
158
  }
130
159
  },
131
- getStartPercent (startValue: number) {
160
+ getBarPercent (currValue: number) {
132
161
  const $xeSlider = this
133
- const props = $xeSlider
134
162
 
135
- const { range } = props
136
163
  const maxNum = $xeSlider.computeMaxNum
137
164
  const minNum = $xeSlider.computeMinNum
138
- return range ? XEUtils.floor((startValue - minNum) / XEUtils.toNumber(maxNum - minNum) * 100) : 0
165
+ if (maxNum === minNum) {
166
+ return 0
167
+ }
168
+ if (currValue < minNum) {
169
+ currValue = minNum
170
+ }
171
+ if (currValue > maxNum) {
172
+ currValue = maxNum
173
+ }
174
+ return ((currValue - minNum) / (maxNum - minNum)) * 100
139
175
  },
140
- getEndPercent (startValue: number, endValue: number) {
176
+ parseFields (startValue?: VxeSliderPropTypes.StartValue, endValue?: VxeSliderPropTypes.EndValue) {
141
177
  const $xeSlider = this
142
- const props = $xeSlider
178
+ const internalData = $xeSlider.internalData
143
179
 
144
- const { range } = props
145
- const maxNum = $xeSlider.computeMaxNum
146
- const minNum = $xeSlider.computeMinNum
147
- return XEUtils.floor((endValue - (range ? startValue : 0) - minNum) / XEUtils.toNumber(maxNum - minNum) * 100)
180
+ const [sVal, eVal] = XEUtils.orderBy([XEUtils.toNumber(startValue), XEUtils.toNumber(endValue)])
181
+ const currValue = XEUtils.floor(XEUtils.toNumber(sVal || 0))
182
+ internalData.currValue = currValue
183
+ internalData.startValue = currValue
184
+ internalData.endValue = XEUtils.floor(XEUtils.toNumber(eVal || 0))
148
185
  },
149
- updateModel () {
186
+ parseArrs (arrVals: number[]) {
187
+ const $xeSlider = this
188
+ const internalData = $xeSlider.internalData
189
+
190
+ const [sVal, eVal] = XEUtils.orderBy(arrVals)
191
+ const currValue = XEUtils.floor(XEUtils.toNumber(sVal || 0))
192
+ internalData.currValue = currValue
193
+ internalData.startValue = currValue
194
+ internalData.endValue = XEUtils.floor(XEUtils.toNumber(eVal || 0))
195
+ },
196
+ parseNum (val: VxeSliderPropTypes.ModelValue | undefined) {
197
+ const $xeSlider = this
198
+ const internalData = $xeSlider.internalData
199
+
200
+ const currValue = XEUtils.floor(XEUtils.toNumber(val || 0))
201
+ internalData.currValue = currValue
202
+ internalData.startValue = 0
203
+ internalData.endValue = currValue
204
+ },
205
+ updateModelValue (umType?: 1 | 2) {
150
206
  const $xeSlider = this
151
207
  const props = $xeSlider
152
- const reactData = $xeSlider.reactData
153
208
 
154
- const { value } = props
155
- if (XEUtils.isArray(value)) {
156
- const [sVal, eVal] = XEUtils.clone(value, true).sort()
157
- reactData.startValue = XEUtils.floor(XEUtils.toNumber(sVal || 0))
158
- reactData.endValue = XEUtils.floor(XEUtils.toNumber(eVal || 0))
209
+ const { range, value: modelValue, startValue, endValue } = props
210
+ if (!umType) {
211
+ if (range) {
212
+ if (XEUtils.eqNull(modelValue)) {
213
+ if (startValue || endValue) {
214
+ $xeSlider.parseFields(startValue, endValue)
215
+ }
216
+ } else {
217
+ if (XEUtils.isArray(modelValue)) {
218
+ $xeSlider.parseArrs(modelValue.map(num => XEUtils.toNumber(num)))
219
+ } else {
220
+ $xeSlider.parseNum(modelValue)
221
+ }
222
+ }
223
+ } else {
224
+ $xeSlider.parseNum(modelValue)
225
+ }
226
+ } else if (range && umType === 2) {
227
+ $xeSlider.parseFields(startValue, endValue)
159
228
  } else {
160
- reactData.startValue = 0
161
- reactData.endValue = XEUtils.floor(XEUtils.toNumber(value || 0))
229
+ if (XEUtils.isArray(modelValue)) {
230
+ $xeSlider.parseArrs(modelValue.map(num => XEUtils.toNumber(num)))
231
+ } else {
232
+ $xeSlider.parseNum(modelValue)
233
+ }
162
234
  }
235
+ $xeSlider.updateBarStyle()
236
+ $xeSlider.updateTrackStyle()
163
237
  },
164
238
  updateBarStyle () {
165
239
  const $xeSlider = this
166
- const reactData = $xeSlider.reactData
240
+ const props = $xeSlider
241
+ const internalData = $xeSlider.internalData
167
242
 
168
- const { startValue, endValue } = reactData
169
- const trackElem = $xeSlider.$refs.refTrackElem as HTMLDivElement
243
+ const { range } = props
244
+ const { currValue, startValue, endValue } = internalData
170
245
  const startBtnElem = $xeSlider.$refs.refStartBtnElem as HTMLDivElement
171
246
  const endBtnElem = $xeSlider.$refs.refEndBtnElem as HTMLDivElement
172
- let startPercent = 0
173
- let endPercent = 0
174
- if (startValue > endValue) {
175
- startPercent = $xeSlider.getStartPercent(endValue)
176
- endPercent = $xeSlider.getEndPercent(endValue, startValue)
247
+ if (range) {
248
+ const [sVal, eVal] = XEUtils.orderBy([startValue, endValue])
249
+ if (startBtnElem) {
250
+ startBtnElem.style.left = $xeSlider.getBarPercent(sVal) + '%'
251
+ }
252
+ if (endBtnElem) {
253
+ endBtnElem.style.left = $xeSlider.getBarPercent(eVal) + '%'
254
+ }
177
255
  } else {
178
- startPercent = $xeSlider.getStartPercent(startValue)
179
- endPercent = $xeSlider.getEndPercent(startValue, endValue)
256
+ if (endBtnElem) {
257
+ endBtnElem.style.left = $xeSlider.getBarPercent(currValue) + '%'
258
+ }
180
259
  }
260
+ },
261
+ updateTrackStyle () {
262
+ const $xeSlider = this
263
+ const props = $xeSlider
264
+ const internalData = $xeSlider.internalData
265
+
266
+ const { range } = props
267
+ const { currValue, startValue, endValue } = internalData
268
+ const trackElem = $xeSlider.$refs.refTrackElem as HTMLDivElement
181
269
  if (trackElem) {
182
- trackElem.style.left = `${startPercent}%`
183
- trackElem.style.width = `${endPercent}%`
184
- }
185
- if (startBtnElem) {
186
- startBtnElem.style.left = `${startPercent}%`
187
- }
188
- if (endBtnElem) {
189
- endBtnElem.style.left = `${XEUtils.floor(startPercent + endPercent)}%`
270
+ if (range) {
271
+ const [sVal, eVal] = XEUtils.orderBy([startValue, endValue])
272
+ trackElem.style.left = $xeSlider.getBarPercent(sVal) + '%'
273
+ trackElem.style.width = $xeSlider.getBarPercent(eVal - sVal) + '%'
274
+ } else {
275
+ trackElem.style.left = '0'
276
+ trackElem.style.width = $xeSlider.getBarPercent(currValue) + '%'
277
+ }
190
278
  }
191
279
  },
192
280
  changeEvent (evnt: MouseEvent) {
193
281
  const $xeSlider = this
194
282
  const props = $xeSlider
195
- const reactData = $xeSlider.reactData
283
+ const internalData = $xeSlider.internalData
196
284
  const $xeForm = $xeSlider.$xeForm
197
285
  const formItemInfo = $xeSlider.formItemInfo
198
286
 
199
287
  const { range } = props
200
- const { startValue, endValue } = reactData
201
- const value = range ? [startValue, endValue].sort() : endValue
288
+ const { currValue, startValue, endValue } = internalData
289
+ const vals = range ? XEUtils.orderBy([startValue, endValue]) : []
290
+ const value = range ? vals : currValue
202
291
  $xeSlider.emitModel(value)
292
+ if (range) {
293
+ $xeSlider.$emit('update:startValue', vals[0] || 0)
294
+ $xeSlider.$emit('update:endValue', vals[1] || 0)
295
+ }
203
296
  $xeSlider.dispatchEvent('change', { value }, evnt)
204
297
  // 自动更新校验状态
205
298
  if ($xeForm && formItemInfo) {
206
299
  $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
207
300
  }
208
301
  },
209
- handleMousedownEvent (evnt: MouseEvent, isEnd: boolean) {
302
+ getValueByLeft (offsetLeft: number, barWidth: number) {
210
303
  const $xeSlider = this
211
- const reactData = $xeSlider.reactData
212
304
 
213
- const formReadonly = $xeSlider.computeFormReadonly
214
- const isDisabled = $xeSlider.computeIsDisabled
215
305
  const maxNum = $xeSlider.computeMaxNum
216
306
  const minNum = $xeSlider.computeMinNum
307
+ if (barWidth === 0) {
308
+ return minNum
309
+ }
310
+ const clamped = Math.max(0, Math.min(barWidth, offsetLeft))
311
+ const ratio = clamped / barWidth
312
+ const raw = minNum + ratio * (maxNum - minNum)
313
+ return Math.floor(raw)
314
+ },
315
+ handleBtnMousedownEvent (evnt: MouseEvent) {
316
+ const $xeSlider = this
317
+ const props = $xeSlider
318
+ const internalData = $xeSlider.internalData
319
+
320
+ const { range, immediate } = props
321
+ const btnElem = evnt.currentTarget as HTMLDivElement
322
+ const formReadonly = $xeSlider.computeFormReadonly
323
+ const isDisabled = $xeSlider.computeIsDisabled
217
324
  if (!(formReadonly || isDisabled)) {
218
325
  evnt.preventDefault()
219
326
  document.onmousemove = evnt => {
220
327
  evnt.preventDefault()
328
+ const el = $xeSlider.$refs.refElem as HTMLDivElement
221
329
  const barElem = $xeSlider.$refs.refBarElem as HTMLDivElement
222
- if (barElem) {
330
+ if (el && barElem) {
331
+ const btnType = btnElem.getAttribute('data-type')
223
332
  const barRect = barElem.getBoundingClientRect()
224
- const trackWidth = (evnt.clientX - barRect.left) / barRect.width
225
- if (isEnd) {
226
- reactData.endValue = XEUtils.floor(Math.max(minNum, Math.min(maxNum, trackWidth * (maxNum - minNum) + minNum)))
227
- } else {
228
- reactData.startValue = XEUtils.floor(Math.max(minNum, Math.min(maxNum, trackWidth * (maxNum - minNum))))
333
+ const barWidth = barRect.width
334
+ const offsetLeft = Math.min(barWidth, Math.max(0, evnt.clientX - barRect.left))
335
+ const currValue = $xeSlider.getValueByLeft(offsetLeft, barWidth)
336
+ if (range) {
337
+ if (btnType === '1') {
338
+ internalData.startValue = currValue
339
+ } else {
340
+ internalData.endValue = currValue
341
+ }
229
342
  }
230
- $xeSlider.dispatchEvent('track-dragover', { startValue: reactData.startValue, endValue: reactData.endValue }, evnt)
343
+ internalData.currValue = currValue
344
+ btnElem.style.left = $xeSlider.getBarPercent(currValue) + '%'
345
+ $xeSlider.dispatchEvent('track-dragover', {
346
+ currentValue: internalData.currValue,
347
+ startValue: internalData.startValue,
348
+ endValue: internalData.endValue
349
+ }, evnt)
350
+ }
351
+ if (immediate) {
352
+ $xeSlider.changeEvent(evnt)
231
353
  }
232
- $xeSlider.updateBarStyle()
354
+ $xeSlider.updateTrackStyle()
233
355
  }
234
356
  document.onmouseup = (evnt: MouseEvent) => {
235
357
  document.onmousemove = null
236
358
  document.onmouseup = null
237
- $xeSlider.dispatchEvent('track-dragend', { startValue: reactData.startValue, endValue: reactData.endValue }, evnt)
359
+ $xeSlider.dispatchEvent('track-dragend', {
360
+ currentValue: internalData.currValue,
361
+ startValue: internalData.startValue,
362
+ endValue: internalData.endValue
363
+ }, evnt)
238
364
  $xeSlider.changeEvent(evnt)
239
- $xeSlider.updateBarStyle()
365
+ $xeSlider.updateTrackStyle()
240
366
  }
241
- $xeSlider.dispatchEvent('track-dragstart', { startValue: reactData.startValue, endValue: reactData.endValue }, evnt)
367
+ $xeSlider.dispatchEvent('track-dragstart', {
368
+ currentValue: internalData.currValue,
369
+ startValue: internalData.startValue,
370
+ endValue: internalData.endValue
371
+ }, evnt)
242
372
  }
243
373
  },
244
- handleStartMousedownEvent (evnt: MouseEvent) {
245
- const $xeSlider = this
246
-
247
- const endBtnElem = $xeSlider.$refs.refEndBtnElem as HTMLDivElement
248
- const startBtnElem = evnt.currentTarget as HTMLDivElement
249
- $xeSlider.handleMousedownEvent(evnt, endBtnElem ? endBtnElem.offsetLeft < startBtnElem.offsetLeft : false)
250
- },
251
- handleEndMousedownEvent (evnt: MouseEvent) {
252
- const $xeSlider = this
253
-
254
- const startBtnElem = $xeSlider.$refs.refStartBtnElem as HTMLDivElement
255
- const endBtnElem = evnt.currentTarget as HTMLDivElement
256
- $xeSlider.handleMousedownEvent(evnt, startBtnElem ? endBtnElem.offsetLeft > startBtnElem.offsetLeft : true)
257
- },
258
374
 
259
375
  //
260
376
  // Render
@@ -291,18 +407,24 @@ export default /* define-vxe-component start */ defineVxeComponent({
291
407
  ? renderEmptyElement($xeSlider)
292
408
  : h('div', {
293
409
  ref: 'refStartBtnElem',
294
- class: 'vxe-slider--bar-btn vxe-slider--start-btn',
410
+ class: 'vxe-slider--bar-btn',
411
+ attrs: {
412
+ 'data-type': '1'
413
+ },
295
414
  on: {
296
- mousedown: $xeSlider.handleStartMousedownEvent
415
+ mousedown: $xeSlider.handleBtnMousedownEvent
297
416
  }
298
417
  }),
299
418
  formReadonly
300
419
  ? renderEmptyElement($xeSlider)
301
420
  : h('div', {
302
421
  ref: 'refEndBtnElem',
303
- class: 'vxe-slider--bar-btn vxe-slider--end-btn',
422
+ class: 'vxe-slider--bar-btn',
423
+ attrs: {
424
+ 'data-type': '2'
425
+ },
304
426
  on: {
305
- mousedown: $xeSlider.handleEndMousedownEvent
427
+ mousedown: $xeSlider.handleBtnMousedownEvent
306
428
  }
307
429
  })
308
430
  ])
@@ -312,19 +434,43 @@ export default /* define-vxe-component start */ defineVxeComponent({
312
434
  watch: {
313
435
  value () {
314
436
  const $xeSlider = this
437
+ const internalData = $xeSlider.internalData
315
438
 
316
- $xeSlider.updateModel()
439
+ if (!internalData._isUp) {
440
+ $xeSlider.updateModelValue(1)
441
+ }
442
+ internalData._isUp = false
443
+ },
444
+ computeMVal () {
445
+ const $xeSlider = this
446
+ const internalData = $xeSlider.internalData
447
+
448
+ if (!internalData._isUp) {
449
+ $xeSlider.updateModelValue(2)
450
+ }
451
+ internalData._isUp = false
317
452
  }
318
453
  },
319
454
  created () {
320
455
  const $xeSlider = this
321
456
 
322
- $xeSlider.updateModel()
457
+ $xeSlider.internalData = createInternalData()
458
+
459
+ $xeSlider.updateModelValue()
323
460
  },
324
461
  mounted () {
325
462
  const $xeSlider = this
326
463
 
327
464
  $xeSlider.updateBarStyle()
465
+ $xeSlider.updateTrackStyle()
466
+ },
467
+ beforeDestroy () {
468
+ const $xeSlider = this
469
+ const reactData = $xeSlider.reactData
470
+ const internalData = $xeSlider.internalData
471
+
472
+ XEUtils.assign(reactData, createReactData())
473
+ XEUtils.assign(internalData, createInternalData())
328
474
  },
329
475
  render (this: any, h) {
330
476
  return this.renderVN(h)
@@ -0,0 +1,16 @@
1
+ import { VueConstructor } from 'vue'
2
+ import { VxeUI } from '@vxe-ui/core'
3
+ import VxeSpaceComponent from './src/space'
4
+ import { dynamicApp } from '../dynamics'
5
+
6
+ export const VxeSpace = Object.assign({}, VxeSpaceComponent, {
7
+ install (app: VueConstructor) {
8
+ app.component(VxeSpaceComponent.name as string, VxeSpaceComponent)
9
+ }
10
+ })
11
+
12
+ dynamicApp.use(VxeSpace)
13
+ VxeUI.component(VxeSpaceComponent)
14
+
15
+ export const Space = VxeSpace
16
+ export default VxeSpace
@@ -0,0 +1,159 @@
1
+ import { CreateElement, VNode, PropType } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import XEUtils from 'xe-utils'
4
+ import { getConfig, createEvent, globalMixins } from '../../ui'
5
+ import { getPropClass, toCssUnit } from '../../ui/src/dom'
6
+ import { eqEmptyValue } from '../../ui/src/utils'
7
+
8
+ import type { SpaceReactData, VxeSpaceEmits, VxeSpacePropTypes, ValueOf, VxeComponentSizeType, VxeComponentPermissionInfo, VxeComponentStyleType } from '../../../types'
9
+
10
+ export default /* define-vxe-component start */ defineVxeComponent({
11
+ name: 'VxeSpace',
12
+ mixins: [
13
+ globalMixins.sizeMixin,
14
+ globalMixins.permissionMixin
15
+ ],
16
+ props: {
17
+ size: {
18
+ type: String as PropType<VxeSpacePropTypes.Size>,
19
+ default: () => getConfig().space.size || getConfig().size
20
+ },
21
+ wrap: {
22
+ type: Boolean as PropType<VxeSpacePropTypes.Wrap>,
23
+ default: () => getConfig().space.wrap
24
+ },
25
+ gap: {
26
+ type: [Number, String, Array, Object] as PropType<VxeSpacePropTypes.Gap>,
27
+ default: () => getConfig().space.gap
28
+ },
29
+ vertical: {
30
+ type: Boolean as PropType<VxeSpacePropTypes.Vertical>,
31
+ default: () => getConfig().space.vertical
32
+ },
33
+ className: {
34
+ type: String as PropType<VxeSpacePropTypes.ClassName>,
35
+ default: () => getConfig().space.className
36
+ },
37
+ itemClassName: {
38
+ type: String as PropType<VxeSpacePropTypes.ItemClassName>,
39
+ default: () => getConfig().space.itemClassName
40
+ },
41
+ separator: {
42
+ type: String as PropType<VxeSpacePropTypes.Separator>,
43
+ default: () => getConfig().space.separator
44
+ },
45
+ align: {
46
+ type: String as PropType<VxeSpacePropTypes.Align>,
47
+ default: () => getConfig().space.align
48
+ }
49
+ },
50
+ data () {
51
+ const xID = XEUtils.uniqueId()
52
+ const reactData: SpaceReactData = {
53
+ activeValue: null
54
+ }
55
+ return {
56
+ xID,
57
+ reactData
58
+ }
59
+ },
60
+ computed: {
61
+ ...({} as {
62
+ computePermissionInfo(): VxeComponentPermissionInfo
63
+ computeSize(): VxeComponentSizeType
64
+ }),
65
+ computeWrapperStyle () {
66
+ const $xeSpace = this
67
+ const props = $xeSpace
68
+
69
+ const { align, gap } = props
70
+ const stys: VxeComponentStyleType = {}
71
+ let rowGap: string | number = ''
72
+ let columGap: string | number = ''
73
+ if (XEUtils.isNumber(gap) || XEUtils.isString(gap)) {
74
+ rowGap = gap
75
+ columGap = gap
76
+ } else if (gap) {
77
+ if (XEUtils.isArray(gap)) {
78
+ rowGap = gap[0]
79
+ columGap = gap[1]
80
+ } else {
81
+ rowGap = gap.rowGap || ''
82
+ columGap = gap.columGap || ''
83
+ }
84
+ }
85
+ if (align) {
86
+ stys['align-items'] = align
87
+ }
88
+ if (!eqEmptyValue(rowGap)) {
89
+ stys['--vxe-ui-space-current-row-gap'] = toCssUnit(rowGap)
90
+ }
91
+ if (!eqEmptyValue(columGap)) {
92
+ stys['--vxe-ui-space-current-column-gap'] = toCssUnit(columGap)
93
+ }
94
+ return stys
95
+ }
96
+ },
97
+ methods: {
98
+ //
99
+ // Method
100
+ //
101
+ dispatchEvent (type: ValueOf<VxeSpaceEmits>, params: Record<string, any>, evnt: Event | null) {
102
+ const $xeSpace = this
103
+ $xeSpace.$emit(type, createEvent(evnt, { $space: $xeSpace }, params))
104
+ },
105
+
106
+ //
107
+ // Render
108
+ //
109
+ renderItems (h: CreateElement) {
110
+ const $xeSpace = this
111
+ const props = $xeSpace
112
+ const slots = $xeSpace.$scopedSlots
113
+
114
+ const { separator, itemClassName } = props
115
+ const itemVNs: VNode[] = []
116
+ const defaultSlot = slots.default
117
+ const separatorSlot = slots.separator
118
+ if (defaultSlot) {
119
+ XEUtils.each(defaultSlot({}), (itemVN, index, items) => {
120
+ itemVNs.push(
121
+ h('div', {
122
+ key: 'i' + index,
123
+ class: ['vxe-space--item', getPropClass(itemClassName, { index })]
124
+ }, [itemVN])
125
+ )
126
+ if ((separator || separatorSlot) && index < items.length - 1) {
127
+ itemVNs.push(
128
+ h('div', {
129
+ key: 's' + index,
130
+ class: 'vxe-space--separator'
131
+ }, separatorSlot ? separatorSlot({}) : ('' + separator))
132
+ )
133
+ }
134
+ })
135
+ }
136
+ return itemVNs
137
+ },
138
+ renderVN (h: CreateElement): VNode {
139
+ const $xeSpace = this
140
+ const props = $xeSpace
141
+
142
+ const { vertical, wrap, className } = props
143
+ const wrapperStyle = $xeSpace.computeWrapperStyle
144
+ const vSize = $xeSpace.computeSize
145
+ return h('div', {
146
+ ref: 'refElem',
147
+ class: ['vxe-space', getPropClass(className, {}), {
148
+ [`size--${vSize}`]: vSize,
149
+ 'is--wrap': wrap,
150
+ 'is--vertical': vertical
151
+ }],
152
+ style: wrapperStyle
153
+ }, $xeSpace.renderItems(h))
154
+ }
155
+ },
156
+ render (this: any, h) {
157
+ return this.renderVN(h)
158
+ }
159
+ }) /* define-vxe-component end */
@@ -382,6 +382,7 @@ setConfig({
382
382
  max: 100,
383
383
  min: 0
384
384
  },
385
+ space: {},
385
386
  steps: {},
386
387
  switch: {},
387
388
  tabPane: {},
@@ -17,6 +17,10 @@ export function getTpImg () {
17
17
  return tpImgEl
18
18
  }
19
19
 
20
+ export function getPropClass (property: any, params: any) {
21
+ return property ? (XEUtils.isFunction(property) ? property(params) : property) || '' : ''
22
+ }
23
+
20
24
  const reClsMap: { [key: string]: any } = {}
21
25
 
22
26
  function getClsRE (cls: any) {
package/styles/all.scss CHANGED
@@ -70,6 +70,7 @@
70
70
  @use './components/split.scss';
71
71
  @use './components/split-pane.scss';
72
72
  @use './components/slider.scss';
73
+ @use './components/space.scss';
73
74
  @use './components/steps.scss';
74
75
  @use './components/switch.scss';
75
76
  @use './components/tab-pane.scss';