vxe-pc-ui 4.20.9 → 4.20.11

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 (102) hide show
  1. package/dist/all.esm.js +1874 -2040
  2. package/dist/style.css +1 -1
  3. package/dist/style.min.css +1 -1
  4. package/es/date-panel/src/date-panel.js +58 -36
  5. package/es/date-panel/style.css +22 -20
  6. package/es/date-panel/style.min.css +1 -1
  7. package/es/icon/style.css +1 -1
  8. package/es/icon-picker/src/icon-picker.js +74 -38
  9. package/es/icon-picker/style.css +9 -3
  10. package/es/icon-picker/style.min.css +1 -1
  11. package/es/list/src/list.js +12 -165
  12. package/es/scrollbar/src/scrollbar.js +20 -173
  13. package/es/select/src/select.js +246 -8
  14. package/es/select/style.css +44 -0
  15. package/es/select/style.min.css +1 -1
  16. package/es/style.css +1 -1
  17. package/es/style.min.css +1 -1
  18. package/es/tooltip/src/tooltip.js +2 -4
  19. package/es/tooltip/style.css +2 -0
  20. package/es/tooltip/style.min.css +1 -1
  21. package/es/tree/src/tree.js +21 -173
  22. package/es/ui/index.js +1 -1
  23. package/es/ui/src/log.js +1 -1
  24. package/es/vxe-date-panel/style.css +22 -20
  25. package/es/vxe-date-panel/style.min.css +1 -1
  26. package/es/vxe-icon-picker/style.css +9 -3
  27. package/es/vxe-icon-picker/style.min.css +1 -1
  28. package/es/vxe-select/style.css +44 -0
  29. package/es/vxe-select/style.min.css +1 -1
  30. package/es/vxe-tooltip/style.css +2 -0
  31. package/es/vxe-tooltip/style.min.css +1 -1
  32. package/lib/date-panel/src/date-panel.js +56 -34
  33. package/lib/date-panel/src/date-panel.min.js +1 -1
  34. package/lib/date-panel/style/style.css +22 -20
  35. package/lib/date-panel/style/style.min.css +1 -1
  36. package/lib/icon/style/style.css +1 -1
  37. package/lib/icon/style/style.min.css +1 -1
  38. package/lib/icon-picker/src/icon-picker.js +101 -45
  39. package/lib/icon-picker/src/icon-picker.min.js +1 -1
  40. package/lib/icon-picker/style/style.css +9 -3
  41. package/lib/icon-picker/style/style.min.css +1 -1
  42. package/lib/index.umd.js +827 -761
  43. package/lib/index.umd.min.js +1 -1
  44. package/lib/list/src/list.js +29 -195
  45. package/lib/list/src/list.min.js +1 -1
  46. package/lib/scrollbar/src/scrollbar.js +34 -199
  47. package/lib/scrollbar/src/scrollbar.min.js +1 -1
  48. package/lib/select/src/select.js +318 -68
  49. package/lib/select/src/select.min.js +1 -1
  50. package/lib/select/style/style.css +44 -0
  51. package/lib/select/style/style.min.css +1 -1
  52. package/lib/style.css +1 -1
  53. package/lib/style.min.css +1 -1
  54. package/lib/tooltip/src/tooltip.js +2 -4
  55. package/lib/tooltip/src/tooltip.min.js +1 -1
  56. package/lib/tooltip/style/style.css +2 -0
  57. package/lib/tooltip/style/style.min.css +1 -1
  58. package/lib/tree/src/tree.js +40 -202
  59. package/lib/tree/src/tree.min.js +1 -1
  60. package/lib/ui/index.js +1 -1
  61. package/lib/ui/index.min.js +1 -1
  62. package/lib/ui/src/log.js +1 -1
  63. package/lib/ui/src/log.min.js +1 -1
  64. package/lib/vxe-date-panel/style/style.css +22 -20
  65. package/lib/vxe-date-panel/style/style.min.css +1 -1
  66. package/lib/vxe-icon-picker/style/style.css +9 -3
  67. package/lib/vxe-icon-picker/style/style.min.css +1 -1
  68. package/lib/vxe-select/style/style.css +44 -0
  69. package/lib/vxe-select/style/style.min.css +1 -1
  70. package/lib/vxe-tooltip/style/style.css +2 -0
  71. package/lib/vxe-tooltip/style/style.min.css +1 -1
  72. package/package.json +2 -2
  73. package/packages/date-panel/src/date-panel.ts +58 -36
  74. package/packages/icon-picker/src/icon-picker.ts +80 -38
  75. package/packages/list/src/list.ts +28 -182
  76. package/packages/scrollbar/src/scrollbar.ts +36 -188
  77. package/packages/select/src/select.ts +281 -8
  78. package/packages/tooltip/src/tooltip.ts +2 -4
  79. package/packages/tree/src/tree.ts +37 -190
  80. package/styles/components/date-panel.scss +31 -29
  81. package/styles/components/icon-picker.scss +9 -3
  82. package/styles/components/select.scss +77 -0
  83. package/styles/components/tooltip.scss +1 -0
  84. package/types/components/gantt-module/gantt-view.d.ts +16 -16
  85. package/types/components/icon-picker.d.ts +21 -1
  86. package/types/components/list.d.ts +4 -0
  87. package/types/components/scrollbar.d.ts +7 -14
  88. package/types/components/select.d.ts +28 -3
  89. package/types/components/table.d.ts +30 -18
  90. package/types/components/tree.d.ts +7 -16
  91. /package/es/icon/{iconfont.1792139440389.ttf → iconfont.1792226845944.ttf} +0 -0
  92. /package/es/icon/{iconfont.1792139440389.woff → iconfont.1792226845944.woff} +0 -0
  93. /package/es/icon/{iconfont.1792139440389.woff2 → iconfont.1792226845944.woff2} +0 -0
  94. /package/es/{iconfont.1792139440389.ttf → iconfont.1792226845944.ttf} +0 -0
  95. /package/es/{iconfont.1792139440389.woff → iconfont.1792226845944.woff} +0 -0
  96. /package/es/{iconfont.1792139440389.woff2 → iconfont.1792226845944.woff2} +0 -0
  97. /package/lib/icon/style/{iconfont.1792139440389.ttf → iconfont.1792226845944.ttf} +0 -0
  98. /package/lib/icon/style/{iconfont.1792139440389.woff → iconfont.1792226845944.woff} +0 -0
  99. /package/lib/icon/style/{iconfont.1792139440389.woff2 → iconfont.1792226845944.woff2} +0 -0
  100. /package/lib/{iconfont.1792139440389.ttf → iconfont.1792226845944.ttf} +0 -0
  101. /package/lib/{iconfont.1792139440389.woff → iconfont.1792226845944.woff} +0 -0
  102. /package/lib/{iconfont.1792139440389.woff2 → iconfont.1792226845944.woff2} +0 -0
@@ -15,6 +15,21 @@ var _log = require("../../ui/src/log");
15
15
  var _input = _interopRequireDefault(require("../../input"));
16
16
  var _button = _interopRequireDefault(require("../../button"));
17
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
+ const {
19
+ getConfig,
20
+ getIcon,
21
+ getI18n,
22
+ baseUtils,
23
+ domUtils,
24
+ globalEvents,
25
+ GLOBAL_EVENT_KEYS,
26
+ globalResize,
27
+ createEvent,
28
+ renderEmptyElement
29
+ } = _ui.VxeUI;
30
+ const {
31
+ getDefVal
32
+ } = baseUtils;
18
33
  const {
19
34
  errLog
20
35
  } = (0, _log.createComponentLog)('select');
@@ -36,6 +51,9 @@ function createReactData() {
36
51
  currentOption: null,
37
52
  searchValue: '',
38
53
  searchLoading: false,
54
+ // 滚动条
55
+ yThumbHeight: 0,
56
+ xThumbWidth: 0,
39
57
  panelIndex: 0,
40
58
  panelStyle: {},
41
59
  panelPlacement: null,
@@ -55,8 +73,14 @@ function createInternalData() {
55
73
  optGroupKeyMaps: {},
56
74
  optFullValMaps: {},
57
75
  remoteValMaps: {},
58
- lastScrollLeft: 0,
76
+ // 滚动条
77
+ // scrollObserver: undefined,
78
+ // isThumbDrag: false,
79
+ thumbDragOffset: 0,
80
+ yThumbTop: 0,
81
+ xThumbLeft: 0,
59
82
  lastScrollTop: 0,
83
+ lastScrollLeft: 0,
60
84
  scrollYStore: {
61
85
  startIndex: 0,
62
86
  endIndex: 0,
@@ -75,11 +99,11 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
75
99
  defaultConfig: Object,
76
100
  emptyValue: {
77
101
  type: [String, Number, Boolean, Array],
78
- default: () => (0, _ui.getConfig)().select.emptyValue
102
+ default: () => getConfig().select.emptyValue
79
103
  },
80
104
  clearable: {
81
105
  type: Boolean,
82
- default: () => (0, _ui.getConfig)().select.clearable
106
+ default: () => getConfig().select.clearable
83
107
  },
84
108
  placeholder: String,
85
109
  readonly: {
@@ -94,12 +118,12 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
94
118
  multiple: Boolean,
95
119
  multiCharOverflow: {
96
120
  type: [Number, String],
97
- default: () => (0, _ui.getConfig)().select.multiCharOverflow
121
+ default: () => getConfig().select.multiCharOverflow
98
122
  },
99
123
  prefixIcon: String,
100
124
  allowCreate: {
101
125
  type: Boolean,
102
- default: () => (0, _ui.getConfig)().select.allowCreate
126
+ default: () => getConfig().select.allowCreate
103
127
  },
104
128
  placement: String,
105
129
  lazyOptions: Array,
@@ -121,12 +145,12 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
121
145
  },
122
146
  showRadio: {
123
147
  type: Boolean,
124
- default: () => (0, _ui.getConfig)().select.showRadio
148
+ default: () => getConfig().select.showRadio
125
149
  },
126
150
  radioConfig: Object,
127
151
  showCheckbox: {
128
152
  type: Boolean,
129
- default: () => (0, _ui.getConfig)().select.showCheckedButton
153
+ default: () => getConfig().select.showCheckedButton
130
154
  },
131
155
  checkboxConfig: Object,
132
156
  /**
@@ -136,7 +160,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
136
160
  zIndex: Number,
137
161
  size: {
138
162
  type: String,
139
- default: () => (0, _ui.getConfig)().select.size || (0, _ui.getConfig)().size
163
+ default: () => getConfig().select.size || getConfig().size
140
164
  },
141
165
  filterable: Boolean,
142
166
  /**
@@ -150,27 +174,27 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
150
174
  emptyText: String,
151
175
  checkedClosable: {
152
176
  type: Boolean,
153
- default: () => (0, _ui.getConfig)().select.checkedClosable
177
+ default: () => getConfig().select.checkedClosable
154
178
  },
155
179
  clearClosable: {
156
180
  type: Boolean,
157
- default: () => (0, _ui.getConfig)().select.clearClosable
181
+ default: () => getConfig().select.clearClosable
158
182
  },
159
183
  showCloseButton: {
160
184
  type: Boolean,
161
- default: () => (0, _ui.getConfig)().select.showCloseButton
185
+ default: () => getConfig().select.showCloseButton
162
186
  },
163
187
  showTotalButton: {
164
188
  type: Boolean,
165
- default: () => (0, _ui.getConfig)().select.showTotalButton
189
+ default: () => getConfig().select.showTotalButton
166
190
  },
167
191
  showCheckedButton: {
168
192
  type: Boolean,
169
- default: () => (0, _ui.getConfig)().select.showCheckedButton
193
+ default: () => getConfig().select.showCheckedButton
170
194
  },
171
195
  showClearButton: {
172
196
  type: Boolean,
173
- default: () => (0, _ui.getConfig)().select.showClearButton
197
+ default: () => getConfig().select.showClearButton
174
198
  },
175
199
  transfer: {
176
200
  type: Boolean,
@@ -179,6 +203,11 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
179
203
  popupConfig: Object,
180
204
  virtualYConfig: Object,
181
205
  scrollY: Object,
206
+ useScrollbar: {
207
+ type: Boolean,
208
+ default: () => getDefVal(getConfig().select.useScrollbar, getConfig().useScrollbar)
209
+ },
210
+ scrollbarConfig: Object,
182
211
  /**
183
212
  * 已废弃,被 remote-config.queryMethod 替换
184
213
  * @deprecated
@@ -190,7 +219,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
190
219
  */
191
220
  optionId: {
192
221
  type: String,
193
- default: () => (0, _ui.getConfig)().select.optionId
222
+ default: () => getConfig().select.optionId
194
223
  },
195
224
  /**
196
225
  * 已废弃,被 option-config.useKey 替换
@@ -216,10 +245,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
216
245
  const refInpSearch = (0, _vue.ref)();
217
246
  const refVirtualWrapper = (0, _vue.ref)();
218
247
  const refOptionPanel = (0, _vue.ref)();
248
+ const refVirtualSpaceElem = (0, _vue.ref)();
219
249
  const refVirtualBody = (0, _vue.ref)();
220
250
  const {
221
251
  computeSize
222
- } = (0, _ui.useSize)(props);
252
+ } = _ui.useFns.useSize(props);
253
+ const {
254
+ computeIsVScrollbar
255
+ } = _ui.useFns.useVScrollbar(props);
223
256
  const reactData = (0, _vue.reactive)(createReactData());
224
257
  const internalData = createInternalData();
225
258
  const refMaps = {
@@ -233,6 +266,21 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
233
266
  internalData,
234
267
  getRefMaps: () => refMaps
235
268
  };
269
+ const {
270
+ refTrackXElem,
271
+ refTrackYElem,
272
+ refThumbXElem,
273
+ refThumbYElem,
274
+ updateThumbSize,
275
+ updateThumbOffset,
276
+ clickTrackXEvent,
277
+ clickTrackYEvent,
278
+ pointerdownThumbXEvent,
279
+ pointermoveThumbXEvent,
280
+ cleatPointerThumbEvent,
281
+ pointerdownThumbYEvent,
282
+ pointermoveThumbYEvent
283
+ } = _ui.useFns.useInitVScrollbar($xeSelect);
236
284
  const computeFormReadonly = (0, _vue.computed)(() => {
237
285
  const {
238
286
  readonly
@@ -266,7 +314,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
266
314
  return popupOpts.transfer;
267
315
  }
268
316
  if (transfer === null) {
269
- const globalTransfer = (0, _ui.getConfig)().select.transfer;
317
+ const globalTransfer = getConfig().select.transfer;
270
318
  if (_xeUtils.default.isBoolean(globalTransfer)) {
271
319
  return globalTransfer;
272
320
  }
@@ -283,11 +331,11 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
283
331
  if (placeholder) {
284
332
  return (0, _utils.getFuncText)(placeholder);
285
333
  }
286
- const globalPlaceholder = (0, _ui.getConfig)().select.placeholder;
334
+ const globalPlaceholder = getConfig().select.placeholder;
287
335
  if (globalPlaceholder) {
288
336
  return (0, _utils.getFuncText)(globalPlaceholder);
289
337
  }
290
- return (0, _ui.getI18n)('vxe.base.pleaseSelect');
338
+ return getI18n('vxe.base.pleaseSelect');
291
339
  });
292
340
  const computeDefaultOpts = (0, _vue.computed)(() => {
293
341
  return Object.assign({}, props.defaultConfig);
@@ -319,25 +367,25 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
319
367
  return checkMaxLimit(selectVals);
320
368
  });
321
369
  const computePopupOpts = (0, _vue.computed)(() => {
322
- return Object.assign({}, (0, _ui.getConfig)().select.popupConfig, props.popupConfig);
370
+ return Object.assign({}, getConfig().select.popupConfig, props.popupConfig);
323
371
  });
324
372
  const computeVirtualYOpts = (0, _vue.computed)(() => {
325
- return Object.assign({}, (0, _ui.getConfig)().select.virtualYConfig || (0, _ui.getConfig)().select.scrollY, props.virtualYConfig || props.scrollY);
373
+ return Object.assign({}, getConfig().select.virtualYConfig || getConfig().select.scrollY, props.virtualYConfig || props.scrollY);
326
374
  });
327
375
  const computeRemoteOpts = (0, _vue.computed)(() => {
328
- return Object.assign({}, (0, _ui.getConfig)().select.remoteConfig, props.remoteConfig);
376
+ return Object.assign({}, getConfig().select.remoteConfig, props.remoteConfig);
329
377
  });
330
378
  const computeFilterOpts = (0, _vue.computed)(() => {
331
- return Object.assign({}, (0, _ui.getConfig)().select.filterConfig, props.filterConfig);
379
+ return Object.assign({}, getConfig().select.filterConfig, props.filterConfig);
332
380
  });
333
381
  const computeOptionOpts = (0, _vue.computed)(() => {
334
- return Object.assign({}, (0, _ui.getConfig)().select.optionConfig, props.optionConfig);
382
+ return Object.assign({}, getConfig().select.optionConfig, props.optionConfig);
335
383
  });
336
384
  const computeRadioOpts = (0, _vue.computed)(() => {
337
- return Object.assign({}, (0, _ui.getConfig)().select.radioConfig, props.radioConfig);
385
+ return Object.assign({}, getConfig().select.radioConfig, props.radioConfig);
338
386
  });
339
387
  const computeCheckboxOpts = (0, _vue.computed)(() => {
340
- return Object.assign({}, (0, _ui.getConfig)().select.checkboxConfig, props.checkboxConfig);
388
+ return Object.assign({}, getConfig().select.checkboxConfig, props.checkboxConfig);
341
389
  });
342
390
  const computeMultiMaxCharNum = (0, _vue.computed)(() => {
343
391
  return _xeUtils.default.toNumber(props.multiCharOverflow);
@@ -419,6 +467,71 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
419
467
  }
420
468
  return labels.join(', ');
421
469
  });
470
+ const computeScrollbarOpts = (0, _vue.computed)(() => {
471
+ return Object.assign({}, getConfig().tree.scrollbarConfig, props.scrollbarConfig);
472
+ });
473
+ const computeScrollbarXOpts = (0, _vue.computed)(() => {
474
+ const scrollbarOpts = computeScrollbarOpts.value;
475
+ return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig, {
476
+ visible: false
477
+ });
478
+ });
479
+ const computeScrollbarYOpts = (0, _vue.computed)(() => {
480
+ const scrollbarOpts = computeScrollbarOpts.value;
481
+ return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig);
482
+ });
483
+ const computeScrollXHeight = (0, _vue.computed)(() => {
484
+ const scrollbarOpts = computeScrollbarOpts.value;
485
+ const scrollbarXOpts = computeScrollbarXOpts.value;
486
+ return getDefVal(getDefVal(scrollbarXOpts.height, scrollbarOpts.height), getConfig().scrollbar.height);
487
+ });
488
+ const computeScrollYWidth = (0, _vue.computed)(() => {
489
+ const scrollbarOpts = computeScrollbarOpts.value;
490
+ const scrollbarYOpts = computeScrollbarYOpts.value;
491
+ return getDefVal(getDefVal(scrollbarYOpts.width, scrollbarOpts.width), getConfig().scrollbar.width);
492
+ });
493
+ const computeScrollXVisible = (0, _vue.computed)(() => {
494
+ const scrollbarOpts = computeScrollbarOpts.value;
495
+ const scrollbarXOpts = computeScrollbarXOpts.value;
496
+ return getDefVal(scrollbarXOpts.visible, scrollbarOpts.visible);
497
+ });
498
+ const computeScrollYVisible = (0, _vue.computed)(() => {
499
+ const scrollbarOpts = computeScrollbarOpts.value;
500
+ const scrollbarYOpts = computeScrollbarYOpts.value;
501
+ return getDefVal(scrollbarYOpts.visible, scrollbarOpts.visible);
502
+ });
503
+ const computeScrollXAutoHide = (0, _vue.computed)(() => {
504
+ const scrollbarOpts = computeScrollbarOpts.value;
505
+ const scrollbarXOpts = computeScrollbarXOpts.value;
506
+ return getDefVal(getDefVal(scrollbarXOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
507
+ });
508
+ const computeScrollYAutoHide = (0, _vue.computed)(() => {
509
+ const scrollbarOpts = computeScrollbarOpts.value;
510
+ const scrollbarYOpts = computeScrollbarYOpts.value;
511
+ return getDefVal(getDefVal(scrollbarYOpts.autoHide, scrollbarOpts.autoHide), getConfig().scrollbar.autoHide);
512
+ });
513
+ const computeScrollbarWrapperClss = (0, _vue.computed)(() => {
514
+ const {
515
+ yThumbHeight,
516
+ xThumbWidth
517
+ } = reactData;
518
+ const scrollbarXToTop = computeScrollbarXToTop.value;
519
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
520
+ const scrollXVisible = computeScrollXVisible.value;
521
+ const scrollYVisible = computeScrollYVisible.value;
522
+ return domUtils.buildClass(['vxe-scrollbar is--virtual', `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}`, `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}`, `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`], {
523
+ 'overflow-y': yThumbHeight,
524
+ 'overflow-x': xThumbWidth
525
+ });
526
+ });
527
+ const computeScrollbarXToTop = (0, _vue.computed)(() => {
528
+ const scrollbarXOpts = computeScrollbarXOpts.value;
529
+ return scrollbarXOpts.position === 'top';
530
+ });
531
+ const computeScrollbarYToLeft = (0, _vue.computed)(() => {
532
+ const scrollbarYOpts = computeScrollbarYOpts.value;
533
+ return scrollbarYOpts.position === 'left';
534
+ });
422
535
  const callSlot = (slotFunc, params) => {
423
536
  if (slotFunc) {
424
537
  if (_xeUtils.default.isString(slotFunc)) {
@@ -431,7 +544,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
431
544
  return [];
432
545
  };
433
546
  const dispatchEvent = (type, params, evnt) => {
434
- emit(type, (0, _ui.createEvent)(evnt, {
547
+ emit(type, createEvent(evnt, {
435
548
  $select: $xeSelect
436
549
  }, params));
437
550
  };
@@ -780,7 +893,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
780
893
  if (checkMaxLimit(currVlas)) {
781
894
  if (_ui.VxeUI) {
782
895
  _ui.VxeUI.modal.message({
783
- content: (0, _ui.getI18n)('vxe.select.overSizeErr', [max]),
896
+ content: getI18n('vxe.select.overSizeErr', [max]),
784
897
  status: 'warning'
785
898
  });
786
899
  }
@@ -965,12 +1078,12 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
965
1078
  trigger
966
1079
  } = popupOpts;
967
1080
  if (!isDisabled) {
968
- const isTab = _ui.globalEvents.hasKey(evnt, _ui.GLOBAL_EVENT_KEYS.TAB);
969
- const isEnter = _ui.globalEvents.hasKey(evnt, _ui.GLOBAL_EVENT_KEYS.ENTER);
970
- const isEsc = _ui.globalEvents.hasKey(evnt, _ui.GLOBAL_EVENT_KEYS.ESCAPE);
971
- const isUpArrow = _ui.globalEvents.hasKey(evnt, _ui.GLOBAL_EVENT_KEYS.ARROW_UP);
972
- const isDwArrow = _ui.globalEvents.hasKey(evnt, _ui.GLOBAL_EVENT_KEYS.ARROW_DOWN);
973
- const isDel = _ui.globalEvents.hasKey(evnt, _ui.GLOBAL_EVENT_KEYS.DELETE);
1081
+ const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB);
1082
+ const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER);
1083
+ const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE);
1084
+ const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP);
1085
+ const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN);
1086
+ const isDel = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.DELETE);
974
1087
  if (isTab) {
975
1088
  reactData.isActivated = false;
976
1089
  }
@@ -1336,13 +1449,25 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1336
1449
  }
1337
1450
  });
1338
1451
  };
1452
+ const updateScrollbar = () => {
1453
+ const isVScrollbar = computeIsVScrollbar.value;
1454
+ if (isVScrollbar) {
1455
+ return (0, _vue.nextTick)().then(() => {
1456
+ updateThumbSize();
1457
+ updateThumbOffset();
1458
+ });
1459
+ }
1460
+ return Promise.resolve();
1461
+ };
1339
1462
  /**
1340
1463
  * 重新计算列表
1341
1464
  */
1342
1465
  const recalculate = () => {
1343
1466
  const el = refElem.value;
1344
1467
  if (el && el.clientWidth && el.clientHeight) {
1345
- return computeScrollLoad();
1468
+ return computeScrollLoad().then(() => {
1469
+ return updateScrollbar();
1470
+ });
1346
1471
  }
1347
1472
  return Promise.resolve();
1348
1473
  };
@@ -1384,6 +1509,10 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1384
1509
  const scrollLeft = scrollBodyElem.scrollLeft;
1385
1510
  const isX = scrollLeft !== internalData.lastScrollLeft;
1386
1511
  const isY = scrollTop !== internalData.lastScrollTop;
1512
+ const isVScrollbar = computeIsVScrollbar.value;
1513
+ if (isVScrollbar) {
1514
+ updateThumbOffset();
1515
+ }
1387
1516
  internalData.lastScrollTop = scrollTop;
1388
1517
  internalData.lastScrollLeft = scrollLeft;
1389
1518
  if (reactData.scrollYLoad) {
@@ -1471,6 +1600,10 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1471
1600
  };
1472
1601
  const selectMethods = {
1473
1602
  dispatchEvent,
1603
+ getScrollViewElem() {
1604
+ const viewEl = refVirtualWrapper.value;
1605
+ return viewEl || null;
1606
+ },
1474
1607
  loadData,
1475
1608
  reloadData(datas) {
1476
1609
  internalData.isLoaded = false;
@@ -1524,6 +1657,28 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1524
1657
  recalculate,
1525
1658
  clearScroll
1526
1659
  };
1660
+ const bindScrollbarResize = () => {
1661
+ const isVScrollbar = computeIsVScrollbar.value;
1662
+ const {
1663
+ scrollObserver
1664
+ } = internalData;
1665
+ if (isVScrollbar) {
1666
+ if (!scrollObserver) {
1667
+ const el = refElem.value;
1668
+ const viewInnerEl = refVirtualSpaceElem.value;
1669
+ const scrollObserver = globalResize.create(() => {
1670
+ reScrollFlag.value++;
1671
+ });
1672
+ if (el) {
1673
+ scrollObserver.observe(el);
1674
+ }
1675
+ if (viewInnerEl) {
1676
+ scrollObserver.observe(viewInnerEl);
1677
+ }
1678
+ internalData.scrollObserver = scrollObserver;
1679
+ }
1680
+ }
1681
+ };
1527
1682
  Object.assign($xeSelect, selectMethods);
1528
1683
  const renderRadio = (option, isOptGroup, isChecked, isDisabled) => {
1529
1684
  const radioOpts = computeRadioOpts.value;
@@ -1532,7 +1687,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1532
1687
  trigger
1533
1688
  } = radioOpts;
1534
1689
  if (isOptGroup || showIcon === false) {
1535
- return (0, _ui.renderEmptyElement)($xeSelect);
1690
+ return renderEmptyElement($xeSelect);
1536
1691
  }
1537
1692
  const ons = {};
1538
1693
  if (!trigger || trigger === 'default') {
@@ -1549,7 +1704,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1549
1704
  'is--disabled': isDisabled
1550
1705
  }]
1551
1706
  }, ons), [(0, _vue.h)('span', {
1552
- class: ['vxe-radio--icon', isChecked ? (0, _ui.getIcon)().RADIO_CHECKED : isDisabled ? (0, _ui.getIcon)().RADIO_DISABLED_UNCHECKED : (0, _ui.getIcon)().RADIO_UNCHECKED]
1707
+ class: ['vxe-radio--icon', isChecked ? getIcon().RADIO_CHECKED : isDisabled ? getIcon().RADIO_DISABLED_UNCHECKED : getIcon().RADIO_UNCHECKED]
1553
1708
  })]);
1554
1709
  };
1555
1710
  const renderCheckbox = (option, isOptGroup, isChecked, isDisabled) => {
@@ -1559,7 +1714,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1559
1714
  trigger
1560
1715
  } = checkboxOpts;
1561
1716
  if (isOptGroup || showIcon === false) {
1562
- return (0, _ui.renderEmptyElement)($xeSelect);
1717
+ return renderEmptyElement($xeSelect);
1563
1718
  }
1564
1719
  const ons = {};
1565
1720
  if (!trigger || trigger === 'default') {
@@ -1576,7 +1731,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1576
1731
  'is--disabled': isDisabled
1577
1732
  }]
1578
1733
  }, ons), [(0, _vue.h)('span', {
1579
- class: ['vxe-checkbox--icon', isChecked ? (0, _ui.getIcon)().CHECKBOX_CHECKED : isDisabled ? (0, _ui.getIcon)().CHECKBOX_DISABLED_UNCHECKED : (0, _ui.getIcon)().CHECKBOX_UNCHECKED]
1734
+ class: ['vxe-checkbox--icon', isChecked ? getIcon().CHECKBOX_CHECKED : isDisabled ? getIcon().CHECKBOX_DISABLED_UNCHECKED : getIcon().CHECKBOX_UNCHECKED]
1580
1735
  })]);
1581
1736
  };
1582
1737
  const renderOption = list => {
@@ -1685,8 +1840,8 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1685
1840
  key: 2,
1686
1841
  class: 'vxe-select-option--add-icon'
1687
1842
  }, [(0, _vue.h)('i', {
1688
- class: (0, _ui.getIcon)().SELECT_ADD_OPTION
1689
- })]) : (0, _ui.renderEmptyElement)($xeSelect)] : optVNs) : (0, _ui.renderEmptyElement)($xeSelect);
1843
+ class: getIcon().SELECT_ADD_OPTION
1844
+ })]) : renderEmptyElement($xeSelect)] : optVNs) : renderEmptyElement($xeSelect);
1690
1845
  });
1691
1846
  };
1692
1847
  const renderOpts = () => {
@@ -1698,17 +1853,17 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1698
1853
  return [(0, _vue.h)('div', {
1699
1854
  class: 'vxe-select--search-loading'
1700
1855
  }, [(0, _vue.h)('i', {
1701
- class: ['vxe-select--search-icon', (0, _ui.getIcon)().SELECT_LOADED]
1856
+ class: ['vxe-select--search-icon', getIcon().SELECT_LOADED]
1702
1857
  }), (0, _vue.h)('span', {
1703
1858
  class: 'vxe-select--search-text'
1704
- }, (0, _ui.getI18n)('vxe.select.loadingText'))])];
1859
+ }, getI18n('vxe.select.loadingText'))])];
1705
1860
  }
1706
1861
  if (optList.length) {
1707
1862
  return renderOption(optList);
1708
1863
  }
1709
1864
  return [(0, _vue.h)('div', {
1710
1865
  class: 'vxe-select--empty-placeholder'
1711
- }, props.emptyText || (0, _ui.getI18n)('vxe.select.emptyText'))];
1866
+ }, props.emptyText || getI18n('vxe.select.emptyText'))];
1712
1867
  };
1713
1868
  const renderVN = () => {
1714
1869
  const {
@@ -1728,9 +1883,12 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1728
1883
  optList,
1729
1884
  visiblePanel,
1730
1885
  bodyHeight,
1731
- topSpaceHeight
1886
+ topSpaceHeight,
1887
+ xThumbWidth,
1888
+ yThumbHeight
1732
1889
  } = reactData;
1733
1890
  const vSize = computeSize.value;
1891
+ const isVScrollbar = computeIsVScrollbar.value;
1734
1892
  const isDisabled = computeIsDisabled.value;
1735
1893
  const selectLabel = computeSelectLabel.value;
1736
1894
  const fullLabel = computeFullLabel.value;
@@ -1761,6 +1919,14 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1761
1919
  appendTo
1762
1920
  } = popupOpts;
1763
1921
  const ppClassName = popupOpts.className || props.popupClassName;
1922
+ const scrollbarOpts = computeScrollbarOpts.value;
1923
+ const scrollXVisible = computeScrollXVisible.value;
1924
+ const scrollYVisible = computeScrollYVisible.value;
1925
+ const scrollbarXToTop = computeScrollbarXToTop.value;
1926
+ const scrollbarYToLeft = computeScrollbarYToLeft.value;
1927
+ const scrollXAutoHide = computeScrollXAutoHide.value;
1928
+ const scrollYAutoHide = computeScrollYAutoHide.value;
1929
+ const scrollbarWrapperClss = computeScrollbarWrapperClss.value;
1764
1930
  return (0, _vue.h)('div', {
1765
1931
  ref: refElem,
1766
1932
  class: ['vxe-select', className ? _xeUtils.default.isFunction(className) ? className({
@@ -1785,7 +1951,7 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1785
1951
  disabled: isDisabled,
1786
1952
  type: 'text',
1787
1953
  prefixIcon: props.prefixIcon,
1788
- suffixIcon: loading ? (0, _ui.getIcon)().SELECT_LOADED : visiblePanel ? (0, _ui.getIcon)().SELECT_OPEN : (0, _ui.getIcon)().SELECT_CLOSE,
1954
+ suffixIcon: loading ? getIcon().SELECT_LOADED : visiblePanel ? getIcon().SELECT_OPEN : getIcon().SELECT_CLOSE,
1789
1955
  autoFocus: false,
1790
1956
  title: fullLabel,
1791
1957
  modelValue: selectLabel,
@@ -1824,33 +1990,41 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1824
1990
  clearable: true,
1825
1991
  disabled: false,
1826
1992
  readonly: false,
1827
- placeholder: (0, _ui.getI18n)('vxe.select.search'),
1828
- prefixIcon: (0, _ui.getIcon)().INPUT_SEARCH,
1993
+ placeholder: getI18n('vxe.select.search'),
1994
+ prefixIcon: getIcon().INPUT_SEARCH,
1829
1995
  'onUpdate:modelValue': modelSearchEvent,
1830
1996
  onFocus: focusSearchEvent,
1831
1997
  onChange: triggerSearchEvent,
1832
1998
  onSearch: triggerSearchEvent
1833
- })]) : (0, _ui.renderEmptyElement)($xeSelect), showCheckedButton && multiple || showClearButton || headerSlot ? (0, _vue.h)('div', {
1999
+ })]) : renderEmptyElement($xeSelect), showCheckedButton && multiple || showClearButton || headerSlot ? (0, _vue.h)('div', {
1834
2000
  class: 'vxe-select--panel-header'
1835
2001
  }, headerSlot ? callSlot(headerSlot, {}) : [(0, _vue.h)('div', {
1836
2002
  class: 'vxe-select--header-button'
1837
2003
  }, [(0, _vue.h)('div', {
1838
2004
  class: 'vxe-select--header-btns'
1839
2005
  }, [showCheckedButton && multiple ? (0, _vue.h)(_button.default, {
1840
- content: (0, _ui.getI18n)('vxe.select.allChecked'),
2006
+ content: getI18n('vxe.select.allChecked'),
1841
2007
  mode: 'text',
1842
2008
  onClick: allCheckedPanelEvent
1843
- }) : (0, _ui.renderEmptyElement)($xeSelect), showClearButton ? (0, _vue.h)(_button.default, {
1844
- content: (0, _ui.getI18n)('vxe.select.clear'),
2009
+ }) : renderEmptyElement($xeSelect), showClearButton ? (0, _vue.h)(_button.default, {
2010
+ content: getI18n('vxe.select.clear'),
1845
2011
  mode: 'text',
1846
2012
  onClick: clearCheckedPanelEvent
1847
- }) : (0, _ui.renderEmptyElement)($xeSelect)])])]) : (0, _ui.renderEmptyElement)($xeSelect), (0, _vue.h)('div', {
1848
- class: 'vxe-select--panel-body'
2013
+ }) : renderEmptyElement($xeSelect)])])]) : renderEmptyElement($xeSelect), (0, _vue.h)('div', {
2014
+ class: ['vxe-select--panel-body', isVScrollbar ? `ov-x--${scrollXVisible === false ? 'hidden' : 'visible'}` : '', isVScrollbar ? `ov-y--${scrollYVisible === false ? 'hidden' : 'visible'}` : '', isVScrollbar ? `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}` : '', isVScrollbar ? `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}` : '', {
2015
+ 'is--virtual-scrollbar': isVScrollbar,
2016
+ 'ov-padding': isVScrollbar && scrollbarOpts.padding,
2017
+ 'ov-x--auto-hide': isVScrollbar && scrollXAutoHide,
2018
+ 'ov-y--auto-hide': isVScrollbar && scrollYAutoHide,
2019
+ 'overflow-y': yThumbHeight,
2020
+ 'overflow-x': xThumbWidth
2021
+ }]
1849
2022
  }, [(0, _vue.h)('div', {
1850
2023
  ref: refVirtualWrapper,
1851
2024
  class: 'vxe-select-option--wrapper',
1852
2025
  onScroll: scrollEvent
1853
2026
  }, [(0, _vue.h)('div', {
2027
+ ref: refVirtualSpaceElem,
1854
2028
  class: 'vxe-select--y-space',
1855
2029
  style: {
1856
2030
  height: bodyHeight ? `${bodyHeight}px` : ''
@@ -1861,19 +2035,49 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1861
2035
  style: {
1862
2036
  marginTop: `${topSpaceHeight}px`
1863
2037
  }
1864
- }, renderOpts())])]), footerSlot || showTotalButton || showCloseButton && multiple ? (0, _vue.h)('div', {
2038
+ }, renderOpts())]),
2039
+ /**
2040
+ * 滚动条
2041
+ */
2042
+ isVScrollbar ? (0, _vue.h)('div', {
2043
+ class: scrollbarWrapperClss
2044
+ }, [scrollXVisible === false ? renderEmptyElement($xeSelect) : (0, _vue.h)('div', {
2045
+ ref: refTrackXElem,
2046
+ class: 'vxe-scrollbar--track-x',
2047
+ onClick: clickTrackXEvent
2048
+ }, [(0, _vue.h)('div', {
2049
+ ref: refThumbXElem,
2050
+ class: 'vxe-scrollbar--thumb-x',
2051
+ onPointerdown: pointerdownThumbXEvent,
2052
+ onPointermove: pointermoveThumbXEvent,
2053
+ onPointerup: cleatPointerThumbEvent,
2054
+ onPointercancel: cleatPointerThumbEvent,
2055
+ onLostpointercapture: cleatPointerThumbEvent
2056
+ })]), scrollYVisible === false ? renderEmptyElement($xeSelect) : (0, _vue.h)('div', {
2057
+ ref: refTrackYElem,
2058
+ class: 'vxe-scrollbar--track-y',
2059
+ onClick: clickTrackYEvent
2060
+ }, [(0, _vue.h)('div', {
2061
+ ref: refThumbYElem,
2062
+ class: 'vxe-scrollbar--thumb-y',
2063
+ onPointerdown: pointerdownThumbYEvent,
2064
+ onPointermove: pointermoveThumbYEvent,
2065
+ onPointerup: cleatPointerThumbEvent,
2066
+ onPointercancel: cleatPointerThumbEvent,
2067
+ onLostpointercapture: cleatPointerThumbEvent
2068
+ })])]) : renderEmptyElement($xeSelect)]), footerSlot || showTotalButton || showCloseButton && multiple ? (0, _vue.h)('div', {
1865
2069
  class: 'vxe-select--panel-footer'
1866
2070
  }, footerSlot ? callSlot(footerSlot, {}) : [(0, _vue.h)('div', {
1867
2071
  class: 'vxe-select--footer-button'
1868
2072
  }, [showTotalButton ? (0, _vue.h)('div', {
1869
2073
  class: 'vxe-select--total-btns'
1870
- }, (0, _ui.getI18n)('vxe.select.total', [selectVals.length, optList.length])) : (0, _ui.renderEmptyElement)($xeSelect), showCloseButton && multiple ? (0, _vue.h)('div', {
2074
+ }, getI18n('vxe.select.total', [selectVals.length, optList.length])) : renderEmptyElement($xeSelect), showCloseButton && multiple ? (0, _vue.h)('div', {
1871
2075
  class: 'vxe-select--oper-btns'
1872
2076
  }, [(0, _vue.h)(_button.default, {
1873
- content: (0, _ui.getI18n)('vxe.select.close'),
2077
+ content: getI18n('vxe.select.close'),
1874
2078
  mode: 'text',
1875
2079
  onClick: closePanelEvent
1876
- })]) : (0, _ui.renderEmptyElement)($xeSelect)])]) : (0, _ui.renderEmptyElement)($xeSelect)])] : [])])]);
2080
+ })]) : renderEmptyElement($xeSelect)])]) : renderEmptyElement($xeSelect)])] : [])])]);
1877
2081
  };
1878
2082
  (0, _vue.watch)(() => reactData.staticOptions, val => {
1879
2083
  loadData(val);
@@ -1884,6 +2088,42 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1884
2088
  (0, _vue.watch)(() => props.optionGroups, val => {
1885
2089
  loadData(val || []);
1886
2090
  });
2091
+ const reScrollFlag = (0, _vue.ref)(0);
2092
+ const reLayoutFlag = (0, _vue.ref)(0);
2093
+ (0, _vue.watch)(computeIsVScrollbar, () => {
2094
+ (0, _vue.nextTick)(() => {
2095
+ bindScrollbarResize();
2096
+ (0, _vue.nextTick)(() => {
2097
+ reLayoutFlag.value++;
2098
+ });
2099
+ });
2100
+ });
2101
+ (0, _vue.watch)(computeScrollYWidth, () => {
2102
+ reLayoutFlag.value++;
2103
+ });
2104
+ (0, _vue.watch)(computeScrollXHeight, () => {
2105
+ reLayoutFlag.value++;
2106
+ });
2107
+ (0, _vue.watch)(computeScrollXVisible, () => {
2108
+ (0, _vue.nextTick)(() => {
2109
+ reLayoutFlag.value++;
2110
+ });
2111
+ });
2112
+ (0, _vue.watch)(computeScrollYVisible, () => {
2113
+ (0, _vue.nextTick)(() => {
2114
+ reLayoutFlag.value++;
2115
+ });
2116
+ });
2117
+ (0, _vue.watch)(reLayoutFlag, () => {
2118
+ recalculate().then(() => {
2119
+ recalculate();
2120
+ });
2121
+ });
2122
+ (0, _vue.watch)(reScrollFlag, () => {
2123
+ updateScrollbar().then(() => {
2124
+ updateScrollbar();
2125
+ });
2126
+ });
1887
2127
  (0, _vue.onMounted)(() => {
1888
2128
  (0, _vue.nextTick)(() => {
1889
2129
  const {
@@ -1896,18 +2136,28 @@ var _default = exports.default = (0, _comp.defineVxeComponent)({
1896
2136
  loadData(options);
1897
2137
  }
1898
2138
  });
1899
- _ui.globalEvents.on($xeSelect, 'mousedown', handleGlobalMousedownEvent);
1900
- _ui.globalEvents.on($xeSelect, 'keydown', handleGlobalKeydownEvent);
1901
- _ui.globalEvents.on($xeSelect, 'blur', handleGlobalBlurEvent);
1902
- _ui.globalEvents.on($xeSelect, 'resize', handleGlobalResizeEvent);
1903
- _ui.globalEvents.on($xeSelect, 'scroll', handleGlobalScrollEvent);
2139
+ reLayoutFlag.value++;
2140
+ bindScrollbarResize();
2141
+ globalEvents.on($xeSelect, 'mousedown', handleGlobalMousedownEvent);
2142
+ globalEvents.on($xeSelect, 'keydown', handleGlobalKeydownEvent);
2143
+ globalEvents.on($xeSelect, 'blur', handleGlobalBlurEvent);
2144
+ globalEvents.on($xeSelect, 'resize', handleGlobalResizeEvent);
2145
+ globalEvents.on($xeSelect, 'scroll', handleGlobalScrollEvent);
2146
+ });
2147
+ (0, _vue.onBeforeUnmount)(() => {
2148
+ const {
2149
+ scrollObserver
2150
+ } = internalData;
2151
+ if (scrollObserver) {
2152
+ scrollObserver.disconnect();
2153
+ }
1904
2154
  });
1905
2155
  (0, _vue.onUnmounted)(() => {
1906
- _ui.globalEvents.off($xeSelect, 'mousedown');
1907
- _ui.globalEvents.off($xeSelect, 'keydown');
1908
- _ui.globalEvents.off($xeSelect, 'blur');
1909
- _ui.globalEvents.off($xeSelect, 'resize');
1910
- _ui.globalEvents.off($xeSelect, 'scroll');
2156
+ globalEvents.off($xeSelect, 'mousedown');
2157
+ globalEvents.off($xeSelect, 'keydown');
2158
+ globalEvents.off($xeSelect, 'blur');
2159
+ globalEvents.off($xeSelect, 'resize');
2160
+ globalEvents.off($xeSelect, 'scroll');
1911
2161
  _xeUtils.default.assign(reactData, createReactData());
1912
2162
  _xeUtils.default.assign(internalData, createInternalData());
1913
2163
  });