@vxe-ui/core 4.4.12 → 4.4.13

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 (64) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +43 -43
  3. package/README.md +43 -43
  4. package/README.zh-TW.md +43 -43
  5. package/dist/all.esm.js +920 -0
  6. package/es/src/core.js +1 -1
  7. package/es/src/log.js +1 -1
  8. package/lib/index.umd.js +173 -73
  9. package/lib/index.umd.min.js +1 -1
  10. package/lib/src/core.js +1 -1
  11. package/lib/src/core.min.js +1 -1
  12. package/lib/src/log.js +1 -1
  13. package/lib/src/log.min.js +1 -1
  14. package/package.json +82 -79
  15. package/packages/index.ts +149 -149
  16. package/packages/src/clipboard.ts +56 -56
  17. package/packages/src/commands.ts +56 -56
  18. package/packages/src/config.ts +30 -30
  19. package/packages/src/configStore.ts +8 -8
  20. package/packages/src/core.ts +11 -11
  21. package/packages/src/dataStore.ts +4 -4
  22. package/packages/src/event.ts +160 -160
  23. package/packages/src/formats.ts +56 -56
  24. package/packages/src/hooks.ts +5 -5
  25. package/packages/src/i18n.ts +63 -63
  26. package/packages/src/i18nStore.ts +11 -11
  27. package/packages/src/icon.ts +32 -32
  28. package/packages/src/iconStore.ts +3 -3
  29. package/packages/src/interceptor.ts +64 -64
  30. package/packages/src/log.ts +19 -19
  31. package/packages/src/menus.ts +56 -56
  32. package/packages/src/permission.ts +61 -61
  33. package/packages/src/renderer.ts +48 -48
  34. package/packages/src/resize.ts +89 -89
  35. package/packages/src/store.ts +47 -47
  36. package/packages/src/theme.ts +20 -20
  37. package/packages/src/themeStore.ts +7 -7
  38. package/packages/src/useFns.ts +34 -34
  39. package/packages/src/validators.ts +7 -7
  40. package/packages/src/vm.ts +10 -10
  41. package/types/core/clipboard.d.ts +22 -22
  42. package/types/core/commands.d.ts +19 -19
  43. package/types/core/components.d.ts +5 -5
  44. package/types/core/formats.d.ts +19 -19
  45. package/types/core/global-config.d.ts +70 -70
  46. package/types/core/global-data.d.ts +7 -7
  47. package/types/core/global-event.d.ts +47 -47
  48. package/types/core/global-icon.d.ts +10 -10
  49. package/types/core/global-lang.d.ts +27 -27
  50. package/types/core/global-resize.d.ts +3 -3
  51. package/types/core/global-theme.d.ts +1 -1
  52. package/types/core/hooks.d.ts +14 -14
  53. package/types/core/index.d.ts +294 -294
  54. package/types/core/interceptor.d.ts +22 -22
  55. package/types/core/log.d.ts +8 -8
  56. package/types/core/menus.d.ts +19 -19
  57. package/types/core/permission.d.ts +10 -10
  58. package/types/core/renderer.d.ts +14 -14
  59. package/types/core/useFn.d.ts +27 -27
  60. package/types/core/validators.d.ts +19 -19
  61. package/types/index.d.ts +13 -13
  62. package/types/tool/common.d.ts +150 -150
  63. package/types/tool/index.d.ts +2 -2
  64. package/types/tool/util.d.ts +4 -4
@@ -0,0 +1,920 @@
1
+ import { h, reactive, computed, inject, provide, createCommentVNode } from 'vue';
2
+ import XEUtils from 'xe-utils';
3
+ import DomZIndex from 'dom-zindex';
4
+
5
+ const coreVersion = "4.4.13";
6
+ const VxeCore = {
7
+ coreVersion,
8
+ uiVersion: '',
9
+ tableVersion: '',
10
+ designVersion: '',
11
+ ganttVersion: ''
12
+ };
13
+
14
+ const globalConfigStore = {
15
+ size: '',
16
+ version: 1,
17
+ zIndex: 999,
18
+ resizeInterval: 500
19
+ };
20
+
21
+ const themeConfigStore = {
22
+ theme: ''
23
+ };
24
+
25
+ function setTheme(name) {
26
+ const theme = !name || name === 'default' ? 'light' : name;
27
+ themeConfigStore.theme = theme;
28
+ if (typeof document !== 'undefined') {
29
+ const documentElement = document.documentElement;
30
+ if (documentElement) {
31
+ documentElement.setAttribute('data-vxe-ui-theme', theme);
32
+ }
33
+ }
34
+ return VxeCore;
35
+ }
36
+ function getTheme() {
37
+ return themeConfigStore.theme;
38
+ }
39
+
40
+ /**
41
+ * 全局参数设置
42
+ */
43
+ function setConfig(options) {
44
+ if (options) {
45
+ if (options.zIndex) {
46
+ DomZIndex.setCurrent(options.zIndex);
47
+ }
48
+ if (options.theme) {
49
+ setTheme(options.theme);
50
+ }
51
+ XEUtils.merge(globalConfigStore, options);
52
+ }
53
+ return VxeCore;
54
+ }
55
+ /**
56
+ * 获取全局参数
57
+ */
58
+ function getConfig(key, defaultValue) {
59
+ return arguments.length ? XEUtils.get(globalConfigStore, key, defaultValue) : globalConfigStore;
60
+ }
61
+
62
+ const globalStore = {};
63
+
64
+ const iconConfigStore = {};
65
+
66
+ function getSlotVNs(vns) {
67
+ if (XEUtils.isArray(vns)) {
68
+ return vns;
69
+ }
70
+ return vns ? [vns] : [];
71
+ }
72
+
73
+ function setIcon(options) {
74
+ if (options) {
75
+ Object.assign(iconConfigStore, options);
76
+ }
77
+ return VxeCore;
78
+ }
79
+ function getIcon(key) {
80
+ return arguments.length ? XEUtils.get(iconConfigStore, key) : iconConfigStore;
81
+ }
82
+ function renderGlobalIcon(name) {
83
+ const icon = getIcon(name);
84
+ return renderCustomIcon(icon, name);
85
+ }
86
+ function renderCustomIcon(icon, name) {
87
+ if (XEUtils.isFunction(icon)) {
88
+ return h('span', {}, getSlotVNs(icon({ name })));
89
+ }
90
+ return h('i', {
91
+ class: icon
92
+ });
93
+ }
94
+
95
+ const GLOBAL_EVENT_KEYS = {
96
+ F2: 'F2',
97
+ F10: 'F10',
98
+ TAB: 'Tab',
99
+ ESCAPE: 'Escape',
100
+ ENTER: 'Enter',
101
+ DELETE: 'Delete',
102
+ BACKSPACE: 'Backspace',
103
+ SPACEBAR: ' ',
104
+ CONTEXT_MENU: 'ContextMenu',
105
+ ARROW_UP: 'ArrowUp',
106
+ ARROW_DOWN: 'ArrowDown',
107
+ ARROW_LEFT: 'ArrowLeft',
108
+ ARROW_RIGHT: 'ArrowRight',
109
+ PAGE_UP: 'PageUp',
110
+ PAGE_DOWN: 'PageDown',
111
+ HOME: 'Home',
112
+ END: 'End',
113
+ A: 'A',
114
+ X: 'X',
115
+ C: 'C',
116
+ V: 'V',
117
+ D: 'D',
118
+ F: 'F',
119
+ H: 'H',
120
+ M: 'M',
121
+ Y: 'Y',
122
+ Z: 'Z',
123
+ R: 'R',
124
+ P: 'P'
125
+ };
126
+ const browse = XEUtils.browse();
127
+ const convertEventKeys = {
128
+ ' ': 'Spacebar',
129
+ Apps: GLOBAL_EVENT_KEYS.CONTEXT_MENU,
130
+ Del: GLOBAL_EVENT_KEYS.DELETE,
131
+ Up: GLOBAL_EVENT_KEYS.ARROW_UP,
132
+ Down: GLOBAL_EVENT_KEYS.ARROW_DOWN,
133
+ Left: GLOBAL_EVENT_KEYS.ARROW_LEFT,
134
+ Right: GLOBAL_EVENT_KEYS.ARROW_RIGHT
135
+ };
136
+ // 监听全局事件
137
+ const wheelName = browse.firefox ? 'DOMMouseScroll' : 'mousewheel';
138
+ const eventStore$1 = [];
139
+ function triggerEvent(evnt) {
140
+ const isWheel = evnt.type === wheelName;
141
+ eventStore$1.forEach(({ type, cb }) => {
142
+ // 如果被取消冒泡,不再执行
143
+ if (!evnt.cancelBubble) {
144
+ if (type === evnt.type || (isWheel && type === 'mousewheel')) {
145
+ cb(evnt);
146
+ }
147
+ }
148
+ });
149
+ }
150
+ class VxeComponentEvent {
151
+ constructor(evnt, params1, params2) {
152
+ Object.defineProperty(this, "$event", {
153
+ enumerable: true,
154
+ configurable: true,
155
+ writable: true,
156
+ value: void 0
157
+ });
158
+ Object.defineProperty(this, "type", {
159
+ enumerable: true,
160
+ configurable: true,
161
+ writable: true,
162
+ value: ''
163
+ });
164
+ Object.defineProperty(this, "key", {
165
+ enumerable: true,
166
+ configurable: true,
167
+ writable: true,
168
+ value: ''
169
+ });
170
+ Object.defineProperty(this, "code", {
171
+ enumerable: true,
172
+ configurable: true,
173
+ writable: true,
174
+ value: ''
175
+ });
176
+ this.$event = evnt;
177
+ if (evnt) {
178
+ if (evnt.type) {
179
+ this.type = evnt.type;
180
+ }
181
+ if (evnt.key) {
182
+ this.key = evnt.key;
183
+ }
184
+ if (evnt.code) {
185
+ this.code = evnt.code;
186
+ }
187
+ }
188
+ Object.assign(this, params1);
189
+ XEUtils.objectEach(params2, (val, key) => {
190
+ if (XEUtils.isFunction(val)) {
191
+ let rest = null;
192
+ let isRun = false;
193
+ Object.defineProperty(this, key, {
194
+ get() {
195
+ if (!isRun) {
196
+ isRun = true;
197
+ rest = val();
198
+ }
199
+ return rest;
200
+ }
201
+ });
202
+ }
203
+ else {
204
+ this[key] = val;
205
+ }
206
+ });
207
+ }
208
+ stopPropagation() {
209
+ const evnt = this.$event;
210
+ if (evnt) {
211
+ evnt.stopPropagation();
212
+ }
213
+ }
214
+ preventDefault() {
215
+ const evnt = this.$event;
216
+ if (evnt) {
217
+ evnt.preventDefault();
218
+ }
219
+ }
220
+ }
221
+ const createEvent = (evnt, params1, params2) => {
222
+ if (evnt instanceof VxeComponentEvent) {
223
+ evnt = evnt.$event;
224
+ }
225
+ return new VxeComponentEvent(evnt, params1, params2);
226
+ };
227
+ const globalEvents = {
228
+ on(comp, type, cb) {
229
+ eventStore$1.push({ comp, type, cb });
230
+ },
231
+ off(comp, type) {
232
+ XEUtils.remove(eventStore$1, item => item.comp === comp && item.type === type);
233
+ },
234
+ hasKey(evnt, targetKey) {
235
+ if (!targetKey) {
236
+ return false;
237
+ }
238
+ const { key } = evnt;
239
+ targetKey = targetKey.toLowerCase();
240
+ return key ? (targetKey === key.toLowerCase() || !!(convertEventKeys[key] && convertEventKeys[key].toLowerCase() === targetKey)) : false;
241
+ }
242
+ };
243
+ if (browse.isDoc) {
244
+ if (!browse.msie) {
245
+ window.addEventListener('copy', triggerEvent, false);
246
+ window.addEventListener('cut', triggerEvent, false);
247
+ window.addEventListener('paste', triggerEvent, false);
248
+ }
249
+ document.addEventListener('scroll', triggerEvent, true);
250
+ document.addEventListener('keydown', triggerEvent, false);
251
+ document.addEventListener('contextmenu', triggerEvent, false);
252
+ window.addEventListener('mousedown', triggerEvent, false);
253
+ window.addEventListener('click', triggerEvent, false);
254
+ window.addEventListener('blur', triggerEvent, false);
255
+ window.addEventListener('resize', triggerEvent, false);
256
+ window.addEventListener(wheelName, XEUtils.throttle(triggerEvent, 100, { leading: true, trailing: false }), { passive: true, capture: false });
257
+ }
258
+
259
+ /**
260
+ * 监听 resize 事件
261
+ * 如果项目中已使用了 resize-observer-polyfill,那么只需要将方法定义全局,该组件就会自动使用
262
+ */
263
+ let resizeTimeout;
264
+ /* eslint-disable no-use-before-define */
265
+ const eventStore = [];
266
+ const defaultInterval = 500;
267
+ function eventHandle() {
268
+ if (eventStore.length) {
269
+ eventStore.forEach((item) => {
270
+ item.tarList.forEach((observer) => {
271
+ const { target, width, heighe } = observer;
272
+ const clientWidth = target.clientWidth;
273
+ const clientHeight = target.clientHeight;
274
+ const rWidth = clientWidth && width !== clientWidth;
275
+ const rHeight = clientHeight && heighe !== clientHeight;
276
+ if (rWidth || rHeight) {
277
+ observer.width = clientWidth;
278
+ observer.heighe = clientHeight;
279
+ setTimeout(item.callback);
280
+ }
281
+ });
282
+ });
283
+ /* eslint-disable @typescript-eslint/no-use-before-define */
284
+ eventListener();
285
+ }
286
+ }
287
+ function eventListener() {
288
+ clearTimeout(resizeTimeout);
289
+ resizeTimeout = setTimeout(eventHandle, globalConfigStore.resizeInterval || defaultInterval);
290
+ }
291
+ class XEResizeObserver {
292
+ constructor(callback) {
293
+ Object.defineProperty(this, "tarList", {
294
+ enumerable: true,
295
+ configurable: true,
296
+ writable: true,
297
+ value: []
298
+ });
299
+ Object.defineProperty(this, "callback", {
300
+ enumerable: true,
301
+ configurable: true,
302
+ writable: true,
303
+ value: void 0
304
+ });
305
+ this.callback = callback;
306
+ }
307
+ observe(target) {
308
+ if (target) {
309
+ const { tarList } = this;
310
+ if (!tarList.some(observer => observer.target === target)) {
311
+ tarList.push({
312
+ target,
313
+ width: target.clientWidth,
314
+ heighe: target.clientHeight
315
+ });
316
+ }
317
+ if (!eventStore.length) {
318
+ eventListener();
319
+ }
320
+ if (!eventStore.some((item) => item === this)) {
321
+ eventStore.push(this);
322
+ }
323
+ }
324
+ }
325
+ unobserve(target) {
326
+ XEUtils.remove(eventStore, item => item.tarList.some(observer => observer.target === target));
327
+ }
328
+ disconnect() {
329
+ XEUtils.remove(eventStore, item => item === this);
330
+ }
331
+ }
332
+ const globalResize = {
333
+ create(callback) {
334
+ if (window.ResizeObserver) {
335
+ return new window.ResizeObserver(callback);
336
+ }
337
+ return new XEResizeObserver(callback);
338
+ }
339
+ };
340
+
341
+ const i18nConfigStore = reactive({
342
+ language: '',
343
+ langMaps: {}
344
+ });
345
+
346
+ let checkInstall = false;
347
+ let cacheMaps = {};
348
+ function getDefaultExport(mod) {
349
+ if (mod && mod.__esModule) {
350
+ return mod.default;
351
+ }
352
+ return mod;
353
+ }
354
+ function getI18n(key, args) {
355
+ const { langMaps, language } = i18nConfigStore;
356
+ const { i18n } = globalConfigStore;
357
+ if (i18n) {
358
+ return `${i18n(key, args) || ''}`;
359
+ }
360
+ if (!checkInstall) {
361
+ if (!langMaps[language]) {
362
+ console.error(`[vxe core] 语言包未安装。Language not installed. https://${VxeCore.uiVersion ? 'vxeui.com' : 'vxetable.cn'}/#/start/i18n`);
363
+ }
364
+ checkInstall = true;
365
+ }
366
+ if (!args && cacheMaps[key]) {
367
+ return cacheMaps[key];
368
+ }
369
+ const i18nLabel = XEUtils.toFormatString(XEUtils.get(langMaps[language], key, key), args);
370
+ if (!args) {
371
+ cacheMaps[key] = i18nLabel;
372
+ }
373
+ return i18nLabel;
374
+ }
375
+ function setLanguage(locale) {
376
+ const { language } = i18nConfigStore;
377
+ const targetlang = locale || 'zh-CN';
378
+ if (language !== targetlang) {
379
+ i18nConfigStore.language = targetlang;
380
+ cacheMaps = {};
381
+ }
382
+ return VxeCore;
383
+ }
384
+ function setI18n(locale, data) {
385
+ i18nConfigStore.langMaps[locale] = Object.assign({}, getDefaultExport(data));
386
+ return VxeCore;
387
+ }
388
+ function hasLanguage(language) {
389
+ const { langMaps } = i18nConfigStore;
390
+ return !!langMaps[language];
391
+ }
392
+ function getLanguage() {
393
+ const { language } = i18nConfigStore;
394
+ return language;
395
+ }
396
+
397
+ function createLog(type, name) {
398
+ return function (key, args) {
399
+ const msg = `[vxe ${name || ''}] ${getI18n(key, args)}`;
400
+ console[type](msg);
401
+ return msg;
402
+ };
403
+ }
404
+ const version = "4.4.13";
405
+ const log = {
406
+ create: createLog,
407
+ warn: createLog('warn', `v${version}`),
408
+ err: createLog('error', `v${version}`)
409
+ };
410
+
411
+ /**
412
+ * 内置的组件渲染
413
+ */
414
+ const renderMap = {};
415
+ /**
416
+ * 全局渲染器
417
+ */
418
+ const renderer = {
419
+ mixin(opts) {
420
+ XEUtils.each(opts, (options, name) => renderer.add(name, options));
421
+ return renderer;
422
+ },
423
+ get(name) {
424
+ return renderMap[name] || null;
425
+ },
426
+ add(name, options) {
427
+ if (name && options) {
428
+ const renders = renderMap[name];
429
+ if (renders) {
430
+ // 检测是否覆盖
431
+ XEUtils.each(options, (val, key) => {
432
+ if (!XEUtils.eqNull(renders[key]) && renders[key] !== val) {
433
+ log.warn('vxe.error.coverProp', [`Renderer.${name}`, key]);
434
+ }
435
+ });
436
+ Object.assign(renders, options);
437
+ }
438
+ else {
439
+ renderMap[name] = options;
440
+ }
441
+ }
442
+ return renderer;
443
+ },
444
+ forEach(callback) {
445
+ XEUtils.objectEach(renderMap, callback);
446
+ return renderer;
447
+ },
448
+ delete(name) {
449
+ delete renderMap[name];
450
+ return renderer;
451
+ }
452
+ };
453
+
454
+ /**
455
+ * 创建数据仓库
456
+ */
457
+ class Store {
458
+ constructor() {
459
+ Object.defineProperty(this, "store", {
460
+ enumerable: true,
461
+ configurable: true,
462
+ writable: true,
463
+ value: {}
464
+ });
465
+ }
466
+ mixin(options) {
467
+ XEUtils.each(options, (item, key) => {
468
+ this.add(key, item);
469
+ });
470
+ return this;
471
+ }
472
+ has(name) {
473
+ return !!this.get(name);
474
+ }
475
+ get(name) {
476
+ return this.store[name];
477
+ }
478
+ add(name, options) {
479
+ const conf = this.store[name];
480
+ // 检测是否覆盖
481
+ const confKeys = XEUtils.keys(conf);
482
+ XEUtils.each(options, (item, key) => {
483
+ if (confKeys.includes(key)) {
484
+ log.warn('vxe.error.coverProp', [name, key]);
485
+ }
486
+ });
487
+ this.store[name] = conf ? XEUtils.merge(conf, options) : options;
488
+ return this;
489
+ }
490
+ delete(name) {
491
+ delete this.store[name];
492
+ }
493
+ forEach(callback) {
494
+ XEUtils.objectEach(this.store, callback);
495
+ }
496
+ }
497
+
498
+ const validators = new Store();
499
+ Object.assign(validators, { _name: 'Validators' });
500
+
501
+ class VXEMenusStore {
502
+ constructor() {
503
+ Object.defineProperty(this, "store", {
504
+ enumerable: true,
505
+ configurable: true,
506
+ writable: true,
507
+ value: {}
508
+ });
509
+ }
510
+ mixin(options) {
511
+ XEUtils.each(options, (item, key) => {
512
+ this.add(key, item);
513
+ });
514
+ return this;
515
+ }
516
+ has(name) {
517
+ return !!this.get(name);
518
+ }
519
+ get(name) {
520
+ return this.store[name];
521
+ }
522
+ add(name, render) {
523
+ const conf = this.store[name];
524
+ // 兼容
525
+ if (XEUtils.isFunction(render)) {
526
+ log.warn('vxe.error.delProp', ['menus -> callback', 'menuMethod']);
527
+ render = {
528
+ menuMethod: render
529
+ };
530
+ }
531
+ // 检测是否覆盖
532
+ const confKeys = XEUtils.keys(conf);
533
+ XEUtils.each(render, (item, key) => {
534
+ if (confKeys.includes(key)) {
535
+ log.warn('vxe.error.coverProp', [name, key]);
536
+ }
537
+ });
538
+ this.store[name] = conf ? XEUtils.merge(conf, render) : render;
539
+ return this;
540
+ }
541
+ delete(name) {
542
+ delete this.store[name];
543
+ }
544
+ forEach(callback) {
545
+ XEUtils.objectEach(this.store, callback);
546
+ }
547
+ }
548
+ const menus = new VXEMenusStore();
549
+ Object.assign(menus, { _name: 'Menus' });
550
+
551
+ class VXEFormatsStore {
552
+ constructor() {
553
+ Object.defineProperty(this, "store", {
554
+ enumerable: true,
555
+ configurable: true,
556
+ writable: true,
557
+ value: {}
558
+ });
559
+ }
560
+ mixin(options) {
561
+ XEUtils.each(options, (item, key) => {
562
+ this.add(key, item);
563
+ });
564
+ return this;
565
+ }
566
+ has(name) {
567
+ return !!this.get(name);
568
+ }
569
+ get(name) {
570
+ return this.store[name];
571
+ }
572
+ add(name, render) {
573
+ const conf = this.store[name];
574
+ // 兼容
575
+ if (XEUtils.isFunction(render)) {
576
+ log.warn('vxe.error.delProp', ['formats -> callback', 'cellFormatMethod']);
577
+ render = {
578
+ cellFormatMethod: render
579
+ };
580
+ }
581
+ // 检测是否覆盖
582
+ const confKeys = XEUtils.keys(conf);
583
+ XEUtils.each(render, (item, key) => {
584
+ if (confKeys.includes(key)) {
585
+ log.warn('vxe.error.coverProp', [name, key]);
586
+ }
587
+ });
588
+ this.store[name] = conf ? XEUtils.merge(conf, render) : render;
589
+ return this;
590
+ }
591
+ delete(name) {
592
+ delete this.store[name];
593
+ }
594
+ forEach(callback) {
595
+ XEUtils.objectEach(this.store, callback);
596
+ }
597
+ }
598
+ const formats = new VXEFormatsStore();
599
+ Object.assign(formats, { _name: 'Formats' });
600
+
601
+ class VXECommandsStore {
602
+ constructor() {
603
+ Object.defineProperty(this, "store", {
604
+ enumerable: true,
605
+ configurable: true,
606
+ writable: true,
607
+ value: {}
608
+ });
609
+ }
610
+ mixin(options) {
611
+ XEUtils.each(options, (item, key) => {
612
+ this.add(key, item);
613
+ });
614
+ return this;
615
+ }
616
+ has(name) {
617
+ return !!this.get(name);
618
+ }
619
+ get(name) {
620
+ return this.store[name];
621
+ }
622
+ add(name, render) {
623
+ const conf = this.store[name];
624
+ // 兼容
625
+ if (XEUtils.isFunction(render)) {
626
+ log.warn('vxe.error.delProp', ['commands -> callback', 'commandMethod']);
627
+ render = {
628
+ commandMethod: render
629
+ };
630
+ }
631
+ // 检测是否覆盖
632
+ const confKeys = XEUtils.keys(conf);
633
+ XEUtils.each(render, (item, key) => {
634
+ if (confKeys.includes(key)) {
635
+ log.warn('vxe.error.coverProp', [name, key]);
636
+ }
637
+ });
638
+ this.store[name] = conf ? XEUtils.merge(conf, render) : render;
639
+ return this;
640
+ }
641
+ delete(name) {
642
+ delete this.store[name];
643
+ }
644
+ forEach(callback) {
645
+ XEUtils.objectEach(this.store, callback);
646
+ }
647
+ }
648
+ const commands = new VXECommandsStore();
649
+ Object.assign(commands, { _name: 'Commands' });
650
+
651
+ const storeMap = {};
652
+ const interceptor = {
653
+ mixin(options) {
654
+ XEUtils.each(options, (render, type) => {
655
+ interceptor.add(type, render);
656
+ });
657
+ return interceptor;
658
+ },
659
+ get(type) {
660
+ if (type) {
661
+ return storeMap[type] || [];
662
+ }
663
+ return [];
664
+ },
665
+ add(type, render) {
666
+ // 兼容
667
+ if (XEUtils.isFunction(render)) {
668
+ // log.warn('vxe.error.delProp', ['interceptor -> callback', 'tableInterceptorMethod'])
669
+ render = {
670
+ tableInterceptorMethod: render
671
+ };
672
+ }
673
+ const callback = render.tableInterceptorMethod;
674
+ if (callback) {
675
+ let eList = storeMap[type];
676
+ if (!eList) {
677
+ eList = storeMap[type] = [];
678
+ }
679
+ // 检测重复
680
+ if (eList.indexOf(callback) > -1) {
681
+ log.warn('vxe.error.coverProp', ['Interceptor', type]);
682
+ }
683
+ eList.push(callback);
684
+ }
685
+ return interceptor;
686
+ },
687
+ delete(type, render) {
688
+ const eList = storeMap[type];
689
+ if (eList) {
690
+ // 兼容
691
+ if (XEUtils.isFunction(render)) {
692
+ render = {
693
+ tableInterceptorMethod: render
694
+ };
695
+ }
696
+ const callback = render ? render.tableInterceptorMethod : null;
697
+ if (callback) {
698
+ XEUtils.remove(eList, fn => fn === callback);
699
+ }
700
+ else {
701
+ delete storeMap[type];
702
+ }
703
+ }
704
+ }
705
+ };
706
+
707
+ let copyElem;
708
+ const clipStore = {
709
+ text: '',
710
+ html: ''
711
+ };
712
+ function handleText(text) {
713
+ if (!copyElem) {
714
+ copyElem = document.createElement('textarea');
715
+ copyElem.id = '$VxeCopy';
716
+ const styles = copyElem.style;
717
+ styles.width = '48px';
718
+ styles.height = '24px';
719
+ styles.position = 'fixed';
720
+ styles.zIndex = '0';
721
+ styles.left = '-500px';
722
+ styles.top = '-500px';
723
+ document.body.appendChild(copyElem);
724
+ }
725
+ copyElem.value = text;
726
+ }
727
+ const clipboard = {
728
+ getStore() {
729
+ return clipStore;
730
+ },
731
+ setStore(data) {
732
+ Object.assign(clipStore, data || {});
733
+ },
734
+ /**
735
+ * 复制内容到剪贴板
736
+ *
737
+ * @param {String} content Text 内容
738
+ */
739
+ copy(content) {
740
+ let result = false;
741
+ try {
742
+ const text = XEUtils.toValueString(content);
743
+ handleText(text);
744
+ copyElem.select();
745
+ copyElem.setSelectionRange(0, copyElem.value.length);
746
+ result = document.execCommand('copy');
747
+ copyElem.blur();
748
+ clipStore.text = text;
749
+ clipStore.html = '';
750
+ }
751
+ catch (e) { }
752
+ return result;
753
+ },
754
+ getText() {
755
+ return clipStore.text || '';
756
+ }
757
+ };
758
+
759
+ function handleCheckInfo(permissionCode, permissionMethod) {
760
+ let checkVisible = true;
761
+ let checkDisabled = false;
762
+ const checkMethod = permissionMethod || globalConfigStore.permissionMethod;
763
+ if (permissionCode && checkMethod) {
764
+ checkVisible = false;
765
+ checkDisabled = true;
766
+ let vDone = false;
767
+ let dDone = false;
768
+ // 或 使用 | 隔开:任意一个为可视,则可视;任意一个禁用,则禁用
769
+ const codeList = String(permissionCode).split('|');
770
+ for (let i = 0; i < codeList.length; i++) {
771
+ const code = codeList[i];
772
+ let visible = true;
773
+ let disabled = false;
774
+ const rest = checkMethod({ code });
775
+ if (XEUtils.isBoolean(rest)) {
776
+ visible = rest;
777
+ }
778
+ else if (rest) {
779
+ visible = !!rest.visible;
780
+ disabled = !!rest.disabled;
781
+ }
782
+ if (!disabled && !dDone) {
783
+ dDone = true;
784
+ checkDisabled = disabled;
785
+ }
786
+ if (visible && !vDone) {
787
+ vDone = true;
788
+ checkVisible = visible;
789
+ }
790
+ if (vDone && dDone) {
791
+ break;
792
+ }
793
+ }
794
+ }
795
+ const info = {
796
+ code: permissionCode,
797
+ visible: checkVisible,
798
+ disabled: checkDisabled
799
+ };
800
+ return info;
801
+ }
802
+ const permission = {
803
+ getCheckInfo(code) {
804
+ return handleCheckInfo(code);
805
+ },
806
+ checkVisible(code) {
807
+ const permissionInfo = handleCheckInfo(code);
808
+ return permissionInfo.visible;
809
+ },
810
+ checkDisable(code) {
811
+ const permissionInfo = handleCheckInfo(code);
812
+ return permissionInfo.disabled;
813
+ }
814
+ };
815
+
816
+ const hooks = new Store();
817
+
818
+ function useSize(props) {
819
+ // 组件尺寸上下文
820
+ const xeSizeInfo = inject('xeSizeInfo', null);
821
+ const computeSize = computed(() => {
822
+ return props.size || (xeSizeInfo ? xeSizeInfo.value : null);
823
+ });
824
+ provide('xeSizeInfo', computeSize);
825
+ return { computeSize };
826
+ }
827
+ function usePermission(props) {
828
+ const computePermissionInfo = computed(() => {
829
+ return handleCheckInfo(props.permissionCode, props.permissionMethod);
830
+ });
831
+ return {
832
+ computePermissionInfo
833
+ };
834
+ }
835
+ const useFns = {
836
+ useSize,
837
+ usePermission
838
+ };
839
+
840
+ const installedPlugins = [];
841
+ function use(Plugin, options) {
842
+ if (Plugin && Plugin.install) {
843
+ if (installedPlugins.indexOf(Plugin) === -1) {
844
+ Plugin.install(VxeUI, options);
845
+ installedPlugins.push(Plugin);
846
+ }
847
+ }
848
+ return VxeUI;
849
+ }
850
+ const components = {};
851
+ function getComponent(name) {
852
+ return components[name] || null;
853
+ }
854
+ function hasComponent(name) {
855
+ return !!components[name];
856
+ }
857
+ function component(comp) {
858
+ if (comp && comp.name) {
859
+ components[comp.name] = comp;
860
+ components[XEUtils.kebabCase(comp.name)] = comp;
861
+ }
862
+ }
863
+ function renderEmptyElement() {
864
+ return createCommentVNode();
865
+ }
866
+ function checkVersion(version, pVersion, sVersion) {
867
+ if (version) {
868
+ const vRest = `${version}`.match(/(\d+).(\d+).(\d+)/);
869
+ if (vRest) {
870
+ const pV = XEUtils.toNumber(vRest[1]);
871
+ if (sVersion) {
872
+ const sV = XEUtils.toNumber(vRest[2]);
873
+ return pV >= pVersion && sV >= sVersion;
874
+ }
875
+ return pV >= pVersion;
876
+ }
877
+ }
878
+ return false;
879
+ }
880
+ const VxeUI = Object.assign(VxeCore, {
881
+ renderEmptyElement,
882
+ setTheme,
883
+ getTheme,
884
+ setConfig,
885
+ getConfig: getConfig,
886
+ setIcon,
887
+ getIcon: getIcon,
888
+ renderGlobalIcon,
889
+ renderCustomIcon,
890
+ setLanguage,
891
+ hasLanguage,
892
+ getLanguage,
893
+ setI18n,
894
+ getI18n,
895
+ globalEvents,
896
+ GLOBAL_EVENT_KEYS,
897
+ createEvent,
898
+ globalResize,
899
+ renderer,
900
+ validators,
901
+ menus,
902
+ formats,
903
+ commands,
904
+ interceptor,
905
+ clipboard,
906
+ log,
907
+ permission,
908
+ globalStore,
909
+ hooks,
910
+ component,
911
+ getComponent,
912
+ hasComponent,
913
+ useFns,
914
+ getSlotVNs,
915
+ checkVersion,
916
+ use
917
+ });
918
+ setTheme();
919
+
920
+ export { GLOBAL_EVENT_KEYS, VxeCore, VxeUI, checkVersion, clipboard, commands, component, coreVersion, createEvent, VxeUI as default, formats, getComponent, getConfig, getI18n, getIcon, getLanguage, getSlotVNs, getTheme, globalEvents, globalResize, globalStore, handleCheckInfo, hasComponent, hasLanguage, hooks, interceptor, log, menus, permission, renderCustomIcon, renderEmptyElement, renderGlobalIcon, renderer, setConfig, setI18n, setIcon, setLanguage, setTheme, use, useFns, usePermission, useSize, validators };