@dt-frames/ui 2.0.4 → 2.0.6

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 (56) hide show
  1. package/es/assets/locales/en.d.ts +2 -0
  2. package/es/assets/locales/en.ts +2 -0
  3. package/es/assets/locales/zh.d.ts +1 -0
  4. package/es/assets/locales/zh.ts +6 -5
  5. package/es/components/curd/index.js +117 -62
  6. package/es/components/curd/src/components/Curd.d.ts +0 -8
  7. package/es/components/curd/src/props.d.ts +0 -4
  8. package/es/components/form/index.d.ts +20 -53
  9. package/es/components/form/index.js +5 -3
  10. package/es/components/form/index.less +8 -3
  11. package/es/components/form/src/index.d.ts +16 -41
  12. package/es/components/source/index.js +8 -5
  13. package/es/components/source/types/source.type.d.ts +1 -0
  14. package/es/components/table/index.js +145 -95
  15. package/es/components/table/index.less +26 -5
  16. package/es/components/table/src/components/TableAction.d.ts +1 -1
  17. package/es/components/table/src/index.d.ts +10 -0
  18. package/es/components/table/src/props.d.ts +4 -0
  19. package/es/components/tree/index.d.ts +2 -0
  20. package/es/components/tree/index.js +1087 -0
  21. package/es/components/tree/index.less +119 -0
  22. package/es/components/tree/src/basicProps.d.ts +146 -0
  23. package/es/components/tree/src/components/ContextMenu.d.ts +64 -0
  24. package/es/components/tree/src/components/TreeHeader.d.ts +98 -0
  25. package/es/components/tree/src/enums/index.d.ts +6 -0
  26. package/es/components/tree/src/hooks/useContextMenu.d.ts +2 -0
  27. package/es/components/tree/src/hooks/useTree.d.ts +14 -0
  28. package/es/components/tree/src/index.d.ts +6526 -0
  29. package/es/components/tree/src/type/menu.d.ts +33 -0
  30. package/es/components/tree/src/type/tree.d.ts +55 -0
  31. package/es/components/tree/src/utils/tree.d.ts +5 -0
  32. package/es/theme/index.d.ts +2 -1
  33. package/es/theme/index.js +829 -699
  34. package/es/theme/index.less +56 -0
  35. package/es/theme/src/components/content/index.d.ts +6 -4
  36. package/es/theme/src/components/header/components/logo.d.ts +22 -0
  37. package/es/theme/src/components/header/index.d.ts +110 -0
  38. package/es/theme/src/components/header/multiple-header.d.ts +154 -20
  39. package/es/theme/src/components/sider/index.d.ts +22 -0
  40. package/es/theme/src/components/sider/mix-sider.d.ts +22 -0
  41. package/es/theme/src/components/tabs/components/TabContent.d.ts +33 -3
  42. package/es/theme/src/components/tabs/components/TabRedo.d.ts +6 -4
  43. package/es/theme/src/components/tabs/hooks/useTabDropdown.d.ts +6 -4
  44. package/es/theme/src/components/tabs/hooks/useTabs.d.ts +10 -0
  45. package/es/theme/src/components/tabs/index.d.ts +43 -20
  46. package/es/theme/src/hooks/useMenu.d.ts +1 -1
  47. package/es/theme/src/hooks/useMultifyTab.d.ts +1 -0
  48. package/es/theme/src/index.d.ts +293 -24
  49. package/es/theme/src/stores/routeReuse.store.d.ts +6 -4
  50. package/es/theme/src/stores/theme.store.d.ts +1 -0
  51. package/es/theme/src/types/theme.type.d.ts +2 -0
  52. package/index.d.ts +2 -1
  53. package/index.js +6 -2
  54. package/package.json +4 -2
  55. package/tsconfig.json +1 -0
  56. package/vite.config.ts +1 -0
@@ -0,0 +1,1087 @@
1
+ import { InputSearch, MenuItem, MenuDivider, Menu, Dropdown, Tree, Empty, Spin } from "ant-design-vue/es";
2
+ import "ant-design-vue/es/spin/style";
3
+ import "ant-design-vue/es/empty/style";
4
+ import "ant-design-vue/es/tree/style";
5
+ import { unref, defineComponent, useSlots, ref, computed, watch, openBlock, createElementBlock, renderSlot, createCommentVNode, toDisplayString, createVNode, createBlock, withModifiers, withCtx, Fragment, renderList, normalizeProps, guardReactiveProps, createTextVNode, createElementVNode, onMounted, onUnmounted, isVNode, getCurrentInstance, render, useAttrs, reactive, toRaw, watchEffect, withDirectives, mergeProps, vShow } from "vue";
6
+ import { useI18n, useSlots as useSlots$1, isArray, isFunction, isEmpty, isBoolean } from "@dt-frames/core";
7
+ import { cloneDeep, difference, omit, get } from "lodash-es";
8
+ import "ant-design-vue/es/dropdown/style";
9
+ import "ant-design-vue/es/menu/style";
10
+ import "ant-design-vue/es/input/style";
11
+ import { useDebounceFn } from "@vueuse/core";
12
+ import { Menu as Menu$1, Divider } from "ant-design-vue";
13
+ const BasicProps = {
14
+ defaultExpandLevel: {
15
+ type: String
16
+ },
17
+ defaultExpandAll: {
18
+ type: Boolean
19
+ },
20
+ showIcon: {
21
+ type: Boolean,
22
+ default: true
23
+ },
24
+ loading: {
25
+ type: Boolean,
26
+ default: false
27
+ },
28
+ checkStrictly: {
29
+ type: Boolean,
30
+ default: false
31
+ },
32
+ expandedKeys: {
33
+ type: Array,
34
+ default: () => []
35
+ },
36
+ selectedKeys: {
37
+ type: Array,
38
+ default: () => []
39
+ },
40
+ checkedKeys: {
41
+ type: Array,
42
+ default: () => []
43
+ },
44
+ fieldNames: {
45
+ type: Object
46
+ },
47
+ beforeRightClick: {
48
+ type: Function,
49
+ default: void 0
50
+ },
51
+ rightMenuList: {
52
+ type: Array
53
+ },
54
+ renderIcon: {
55
+ type: Function
56
+ },
57
+ highlight: {
58
+ type: [Boolean, String],
59
+ default: false
60
+ },
61
+ actionList: {
62
+ type: Array,
63
+ default: () => []
64
+ },
65
+ clickRowToExpand: {
66
+ type: Boolean,
67
+ default: false
68
+ },
69
+ searchValue: {
70
+ type: String,
71
+ default: ""
72
+ },
73
+ filterFn: {
74
+ type: Function,
75
+ default: void 0
76
+ },
77
+ checkable: Boolean,
78
+ expandOnSearch: Boolean,
79
+ checkOnSearch: Boolean,
80
+ selectedOnSearch: Boolean,
81
+ treeData: {
82
+ type: Array
83
+ },
84
+ value: {
85
+ type: [Object, Array]
86
+ },
87
+ title: {
88
+ type: String,
89
+ default: ""
90
+ },
91
+ toolbar: Boolean,
92
+ search: {
93
+ type: Boolean,
94
+ default: false
95
+ }
96
+ };
97
+ const searchProps = {
98
+ title: {
99
+ type: String,
100
+ default: ""
101
+ },
102
+ toolbar: {
103
+ type: Boolean,
104
+ default: false
105
+ },
106
+ checkable: {
107
+ type: Boolean,
108
+ default: false
109
+ },
110
+ search: {
111
+ type: Boolean,
112
+ default: false
113
+ },
114
+ searchText: {
115
+ type: String,
116
+ default: ""
117
+ },
118
+ checkAll: {
119
+ type: Function,
120
+ default: void 0
121
+ },
122
+ expandAll: {
123
+ type: Function,
124
+ default: void 0
125
+ }
126
+ };
127
+ const rightMenuProps = {
128
+ width: {
129
+ type: Number,
130
+ default: 156
131
+ },
132
+ customEvent: {
133
+ type: Object,
134
+ default: null
135
+ },
136
+ styles: {
137
+ type: Object
138
+ },
139
+ showIcon: {
140
+ type: Boolean,
141
+ default: true
142
+ },
143
+ axis: {
144
+ type: Object,
145
+ default: () => {
146
+ return { x: 0, y: 0 };
147
+ }
148
+ },
149
+ items: {
150
+ type: Array,
151
+ default: () => []
152
+ }
153
+ };
154
+ function eachTree(treeDatas, callBack, parentNode = {}) {
155
+ treeDatas.forEach((el) => {
156
+ const newNode = callBack(el, parentNode) || el;
157
+ if (el.children) {
158
+ eachTree(el.children, callBack, newNode);
159
+ }
160
+ });
161
+ }
162
+ function forEach(tree, func, config = {}) {
163
+ const list = [...tree];
164
+ const { children = "children" } = config;
165
+ for (let i = 0; i < list.length; i++) {
166
+ if (func(list[i])) {
167
+ return;
168
+ }
169
+ children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]);
170
+ }
171
+ }
172
+ function filter(tree, func, config = {}) {
173
+ const children = config.children || "children";
174
+ function listFilter(list) {
175
+ return list.map((node) => ({ ...node })).filter((node) => {
176
+ node[children] = node[children] && listFilter(node[children]);
177
+ return func(node) || node[children] && node[children].length;
178
+ });
179
+ }
180
+ return listFilter(tree);
181
+ }
182
+ function treeToList(tree, config = {}) {
183
+ const { children = "children" } = config;
184
+ const result = [...tree];
185
+ for (let i = 0; i < result.length; i++) {
186
+ if (!result[i][children])
187
+ continue;
188
+ result.splice(i + 1, 0, ...result[i][children]);
189
+ }
190
+ return result;
191
+ }
192
+ function useTree(treeDataRef, getFieldNames) {
193
+ function getAllKeys(list) {
194
+ const keys = [];
195
+ const treeData = list || unref(treeDataRef);
196
+ const { key: keyField, children: childrenField } = unref(getFieldNames);
197
+ if (!childrenField || !keyField)
198
+ return keys;
199
+ for (let index2 = 0; index2 < treeData.length; index2++) {
200
+ const node = treeData[index2];
201
+ keys.push(node[keyField]);
202
+ const children = node[childrenField];
203
+ if (children && children.length) {
204
+ keys.push(...getAllKeys(children));
205
+ }
206
+ }
207
+ return keys;
208
+ }
209
+ function getEnabledKeys(list) {
210
+ const keys = [];
211
+ const treeData = list || unref(treeDataRef);
212
+ const { key: keyField, children: childrenField } = unref(getFieldNames);
213
+ if (!childrenField || !keyField)
214
+ return keys;
215
+ for (let index2 = 0; index2 < treeData.length; index2++) {
216
+ const node = treeData[index2];
217
+ node.disabled !== true && node.selectable !== false && keys.push(node[keyField]);
218
+ const children = node[childrenField];
219
+ if (children && children.length) {
220
+ keys.push(...getEnabledKeys(children));
221
+ }
222
+ }
223
+ return keys;
224
+ }
225
+ function getChildrenKeys(nodeKey, list) {
226
+ const keys = [];
227
+ const treeData = list || unref(treeDataRef);
228
+ const { key: keyField, children: childrenField } = unref(getFieldNames);
229
+ if (!childrenField || !keyField)
230
+ return keys;
231
+ for (let index2 = 0; index2 < treeData.length; index2++) {
232
+ const node = treeData[index2];
233
+ const children = node[childrenField];
234
+ if (nodeKey === node[keyField]) {
235
+ keys.push(node[keyField]);
236
+ if (children && children.length) {
237
+ keys.push(...getAllKeys(children));
238
+ }
239
+ } else {
240
+ if (children && children.length) {
241
+ keys.push(...getChildrenKeys(nodeKey, children));
242
+ }
243
+ }
244
+ }
245
+ return keys;
246
+ }
247
+ function updateNodeByKey(key, node, list) {
248
+ if (!key)
249
+ return;
250
+ const treeData = list || unref(treeDataRef);
251
+ const { key: keyField, children: childrenField } = unref(getFieldNames);
252
+ if (!childrenField || !keyField)
253
+ return;
254
+ for (let index2 = 0; index2 < treeData.length; index2++) {
255
+ const element = treeData[index2];
256
+ const children = element[childrenField];
257
+ if (element[keyField] === key) {
258
+ treeData[index2] = { ...treeData[index2], ...node };
259
+ break;
260
+ } else if (children && children.length) {
261
+ updateNodeByKey(key, node, element[childrenField]);
262
+ }
263
+ }
264
+ }
265
+ function filterByLevel(level = 1, list, currentLevel = 1) {
266
+ if (!level)
267
+ return [];
268
+ const res = [];
269
+ const data = list || unref(treeDataRef) || [];
270
+ for (let index2 = 0; index2 < data.length; index2++) {
271
+ const item = data[index2];
272
+ const { key: keyField, children: childrenField } = unref(getFieldNames);
273
+ const key = keyField ? item[keyField] : "";
274
+ const children = childrenField ? item[childrenField] : [];
275
+ res.push(key);
276
+ if (children && children.length && currentLevel < level) {
277
+ currentLevel += 1;
278
+ res.push(...filterByLevel(level, children, currentLevel));
279
+ }
280
+ }
281
+ return res;
282
+ }
283
+ function insertNodeByKey({ parentKey = null, node, push = "push" }) {
284
+ const treeData = cloneDeep(unref(treeDataRef));
285
+ if (!parentKey) {
286
+ treeData[push](node);
287
+ treeDataRef.value = treeData;
288
+ return;
289
+ }
290
+ const { key: keyField, children: childrenField } = unref(getFieldNames);
291
+ if (!childrenField || !keyField)
292
+ return;
293
+ forEach(treeData, (treeItem) => {
294
+ if (treeItem[keyField] === parentKey) {
295
+ treeItem[childrenField] = treeItem[childrenField] || [];
296
+ treeItem[childrenField][push](node);
297
+ return true;
298
+ }
299
+ });
300
+ treeDataRef.value = treeData;
301
+ }
302
+ function insertNodesByKey({ parentKey = null, list, push = "push" }) {
303
+ const treeData = cloneDeep(unref(treeDataRef));
304
+ if (!list || list.length < 1)
305
+ return;
306
+ if (!parentKey) {
307
+ for (let i = 0; i < list.length; i++) {
308
+ treeData[push](list[i]);
309
+ }
310
+ } else {
311
+ const { key: keyField, children: childrenField } = unref(getFieldNames);
312
+ if (!childrenField || !keyField)
313
+ return;
314
+ forEach(treeData, (treeItem) => {
315
+ if (treeItem[keyField] === parentKey) {
316
+ treeItem[childrenField] = treeItem[childrenField] || [];
317
+ for (let i = 0; i < list.length; i++) {
318
+ treeItem[childrenField][push](list[i]);
319
+ }
320
+ treeDataRef.value = treeData;
321
+ return true;
322
+ }
323
+ });
324
+ }
325
+ }
326
+ function deleteNodeByKey(key, list) {
327
+ if (!key)
328
+ return;
329
+ const treeData = list || unref(treeDataRef);
330
+ const { key: keyField, children: childrenField } = unref(getFieldNames);
331
+ if (!childrenField || !keyField)
332
+ return;
333
+ for (let index2 = 0; index2 < treeData.length; index2++) {
334
+ const element = treeData[index2];
335
+ const children = element[childrenField];
336
+ if (element[keyField] === key) {
337
+ treeData.splice(index2, 1);
338
+ break;
339
+ } else if (children && children.length) {
340
+ deleteNodeByKey(key, element[childrenField]);
341
+ }
342
+ }
343
+ }
344
+ function getSelectedNode(key, list, selectedNode) {
345
+ if (!key && key !== 0)
346
+ return null;
347
+ const treeData = list || unref(treeDataRef);
348
+ treeData.forEach((item) => {
349
+ if (selectedNode?.key || selectedNode?.key === 0)
350
+ return selectedNode;
351
+ if (item.key === key) {
352
+ selectedNode = item;
353
+ return;
354
+ }
355
+ if (item.children && item.children.length) {
356
+ selectedNode = getSelectedNode(key, item.children, selectedNode);
357
+ }
358
+ });
359
+ return selectedNode || null;
360
+ }
361
+ return {
362
+ getAllKeys,
363
+ getEnabledKeys,
364
+ getChildrenKeys,
365
+ updateNodeByKey,
366
+ filterByLevel,
367
+ insertNodeByKey,
368
+ insertNodesByKey,
369
+ deleteNodeByKey,
370
+ getSelectedNode
371
+ };
372
+ }
373
+ var ToolbarEnum = /* @__PURE__ */ ((ToolbarEnum2) => {
374
+ ToolbarEnum2[ToolbarEnum2["SELECT_ALL"] = 0] = "SELECT_ALL";
375
+ ToolbarEnum2[ToolbarEnum2["UN_SELECT_ALL"] = 1] = "UN_SELECT_ALL";
376
+ ToolbarEnum2[ToolbarEnum2["EXPAND_ALL"] = 2] = "EXPAND_ALL";
377
+ ToolbarEnum2[ToolbarEnum2["UN_EXPAND_ALL"] = 3] = "UN_EXPAND_ALL";
378
+ return ToolbarEnum2;
379
+ })(ToolbarEnum || {});
380
+ const _hoisted_1$1 = { class: "dt-tree-header flex px-2 py-1.5 items-center" };
381
+ const _hoisted_2 = {
382
+ key: 1,
383
+ class: "text-center leading-8 m-0"
384
+ };
385
+ const _hoisted_3 = {
386
+ key: 2,
387
+ class: "dt-tree-search flex flex-1 items-center"
388
+ };
389
+ const _hoisted_4 = {
390
+ key: 0,
391
+ class: "flex-1"
392
+ };
393
+ const _hoisted_5 = /* @__PURE__ */ createElementVNode("i", { class: "i ic:baseline-more-vert text-center cursor-pointer" }, null, -1);
394
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
395
+ __name: "TreeHeader",
396
+ props: searchProps,
397
+ emits: [
398
+ "search"
399
+ ],
400
+ setup(__props, { emit: emits }) {
401
+ const props = __props;
402
+ const slots = useSlots();
403
+ const { t } = useI18n("UI");
404
+ const searchValue = ref("");
405
+ function emitChange(value) {
406
+ emits("search", value);
407
+ }
408
+ function handleMenuClick(e) {
409
+ const { key } = e;
410
+ switch (key) {
411
+ case ToolbarEnum.SELECT_ALL:
412
+ props.checkAll?.(true);
413
+ break;
414
+ case ToolbarEnum.UN_SELECT_ALL:
415
+ props.checkAll?.(false);
416
+ break;
417
+ case ToolbarEnum.EXPAND_ALL:
418
+ props.expandAll?.(true);
419
+ break;
420
+ case ToolbarEnum.UN_EXPAND_ALL:
421
+ props.expandAll?.(false);
422
+ break;
423
+ }
424
+ }
425
+ const toolbarList = computed(() => {
426
+ const { checkable } = props;
427
+ const defaultToolbarList = [
428
+ { label: t("EXPAND_ALL"), value: ToolbarEnum.EXPAND_ALL },
429
+ {
430
+ label: t("COLLAPSE_ALL"),
431
+ value: ToolbarEnum.UN_EXPAND_ALL
432
+ }
433
+ ];
434
+ return checkable ? [
435
+ { label: t("SELECT_ALL1"), value: ToolbarEnum.SELECT_ALL },
436
+ {
437
+ label: t("CANCEL_SELECT_ALL"),
438
+ value: ToolbarEnum.UN_SELECT_ALL,
439
+ divider: checkable
440
+ },
441
+ ...defaultToolbarList
442
+ ] : defaultToolbarList;
443
+ });
444
+ const debounceEmitChange = useDebounceFn(emitChange, 200);
445
+ watch(
446
+ () => searchValue.value,
447
+ (v) => {
448
+ debounceEmitChange(v);
449
+ }
450
+ );
451
+ return (_ctx, _cache) => {
452
+ const _component_AInputSearch = InputSearch;
453
+ const _component_AMenuItem = MenuItem;
454
+ const _component_AMenuDivider = MenuDivider;
455
+ const _component_AMenu = Menu;
456
+ const _component_ADropdown = Dropdown;
457
+ return openBlock(), createElementBlock("div", _hoisted_1$1, [
458
+ unref(slots).headerTitle ? renderSlot(_ctx.$slots, "headerTitle", { key: 0 }) : createCommentVNode("v-if", true),
459
+ !unref(slots).headerTitle && _ctx.title ? (openBlock(), createElementBlock("h4", _hoisted_2, toDisplayString(_ctx.title), 1)) : createCommentVNode("v-if", true),
460
+ _ctx.search || _ctx.toolbar ? (openBlock(), createElementBlock("div", _hoisted_3, [
461
+ _ctx.search ? (openBlock(), createElementBlock("div", _hoisted_4, [
462
+ createVNode(_component_AInputSearch, {
463
+ size: "small",
464
+ allowClear: "",
465
+ value: searchValue.value,
466
+ "onUpdate:value": _cache[0] || (_cache[0] = ($event) => searchValue.value = $event),
467
+ placeholder: unref(t)("FILTER")
468
+ }, null, 8, ["value", "placeholder"])
469
+ ])) : createCommentVNode("v-if", true),
470
+ _ctx.toolbar ? (openBlock(), createBlock(_component_ADropdown, {
471
+ key: 1,
472
+ onClick: _cache[1] || (_cache[1] = withModifiers(() => {
473
+ }, ["prevent"]))
474
+ }, {
475
+ overlay: withCtx(() => [
476
+ createVNode(_component_AMenu, { onClick: handleMenuClick }, {
477
+ default: withCtx(() => [
478
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(toolbarList), (item) => {
479
+ return openBlock(), createElementBlock(Fragment, {
480
+ key: item.value
481
+ }, [
482
+ createVNode(_component_AMenuItem, normalizeProps(guardReactiveProps({ key: item.value })), {
483
+ default: withCtx(() => [
484
+ createTextVNode(toDisplayString(item.label), 1)
485
+ ]),
486
+ _: 2
487
+ }, 1040),
488
+ item.divider ? (openBlock(), createBlock(_component_AMenuDivider, { key: 0 })) : createCommentVNode("v-if", true)
489
+ ], 64);
490
+ }), 128))
491
+ ]),
492
+ _: 1
493
+ })
494
+ ]),
495
+ default: withCtx(() => [
496
+ _hoisted_5
497
+ ]),
498
+ _: 1
499
+ })) : createCommentVNode("v-if", true)
500
+ ])) : createCommentVNode("v-if", true)
501
+ ]);
502
+ };
503
+ }
504
+ });
505
+ const _export_sfc = (sfc, props) => {
506
+ const target = sfc.__vccOpts || sfc;
507
+ for (const [key, val] of props) {
508
+ target[key] = val;
509
+ }
510
+ return target;
511
+ };
512
+ const TreeHeader = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__file", "D:/dt/dt-frame-front/dt-frames/frames/packages/ui/src/components/tree/src/components/TreeHeader.vue"]]);
513
+ function _isSlot(s) {
514
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
515
+ }
516
+ const _sfc_main$1 = defineComponent({
517
+ name: "ContextMenu",
518
+ props: rightMenuProps,
519
+ setup(props) {
520
+ const wrapRef = ref(null);
521
+ const showRef = ref(false);
522
+ const ItemContent = (props2) => {
523
+ const {
524
+ item
525
+ } = props2;
526
+ return createVNode("span", {
527
+ "class": "px-4 w-full flex items-center",
528
+ "onClick": props2.handler.bind(null, item)
529
+ }, [props2.showIcon && item.icon && createVNode("i", {
530
+ "class": "i mr-2 " + item.icon
531
+ }, null), createVNode("span", null, [item.label])]);
532
+ };
533
+ const getStyle = computed(() => {
534
+ const {
535
+ axis,
536
+ items,
537
+ styles,
538
+ width
539
+ } = props;
540
+ const {
541
+ x,
542
+ y
543
+ } = axis || {
544
+ x: 0,
545
+ y: 0
546
+ };
547
+ const menuHeight = (items || []).length * 40;
548
+ const body = document.body;
549
+ const left = body.clientWidth < x + width ? x - width : x;
550
+ const top = body.clientHeight < y + menuHeight ? y - menuHeight : y;
551
+ return {
552
+ ...styles,
553
+ position: "absolute",
554
+ width: `${width}px`,
555
+ left: `${left + 1}px`,
556
+ top: `${top + 1}px`,
557
+ zIndex: 9999
558
+ };
559
+ });
560
+ function handleAction(item, e) {
561
+ const {
562
+ handler,
563
+ disabled
564
+ } = item;
565
+ if (disabled)
566
+ return;
567
+ showRef.value = false;
568
+ e?.stopPropagation();
569
+ e?.preventDefault();
570
+ handler?.();
571
+ }
572
+ function renderMenuItem(items) {
573
+ const visibleItems = items.filter((item) => !item.hidden);
574
+ return visibleItems.map((item) => {
575
+ const {
576
+ disabled,
577
+ label,
578
+ children,
579
+ divider = false
580
+ } = item;
581
+ const contentProps = {
582
+ item,
583
+ handler: handleAction,
584
+ showIcon: props.showIcon
585
+ };
586
+ if (!children || children.length === 0) {
587
+ return createVNode(Fragment, null, [createVNode(Menu$1.Item, {
588
+ "disabled": disabled,
589
+ "class": "dt-context-menu__item",
590
+ "key": label
591
+ }, {
592
+ default: () => [createVNode(ItemContent, contentProps, null)]
593
+ }), divider ? createVNode(Divider, {
594
+ "key": `d-${label}`
595
+ }, null) : null]);
596
+ }
597
+ return createVNode(Menu$1.SubMenu, {
598
+ "key": label,
599
+ "disabled": disabled,
600
+ "popupClassName": "dt-context-menu__popup"
601
+ }, {
602
+ title: () => createVNode(ItemContent, contentProps, null),
603
+ default: () => renderMenuItem(children)
604
+ });
605
+ });
606
+ }
607
+ onMounted(() => {
608
+ nextTick(() => showRef.value = true);
609
+ });
610
+ onUnmounted(() => {
611
+ const el = unref(wrapRef);
612
+ el && document.body.removeChild(el);
613
+ });
614
+ return () => {
615
+ let _slot;
616
+ if (!unref(showRef)) {
617
+ return null;
618
+ }
619
+ const {
620
+ items
621
+ } = props;
622
+ return createVNode("div", {
623
+ "class": "dt-context-menu fixed top-0 left-0 z-50 block m-0"
624
+ }, [createVNode(Menu$1, {
625
+ "inlineIndent": 12,
626
+ "mode": "vertical",
627
+ "ref": wrapRef,
628
+ "style": unref(getStyle)
629
+ }, _isSlot(_slot = renderMenuItem(items)) ? _slot : {
630
+ default: () => [_slot]
631
+ })]);
632
+ };
633
+ }
634
+ });
635
+ const contextMenuVue = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__file", "D:/dt/dt-frame-front/dt-frames/frames/packages/ui/src/components/tree/src/components/ContextMenu.vue"]]);
636
+ function useContextMenu() {
637
+ const menuManager = {
638
+ domList: [],
639
+ resolve: () => {
640
+ }
641
+ };
642
+ function createContextMenu(options) {
643
+ const { event } = options || {};
644
+ event && event?.preventDefault();
645
+ return new Promise((resolve) => {
646
+ const body = document.body;
647
+ const container = document.createElement("div");
648
+ const propsData = {};
649
+ if (options.styles) {
650
+ propsData.styles = options.styles;
651
+ }
652
+ if (options.items) {
653
+ propsData.items = options.items;
654
+ }
655
+ if (options.event) {
656
+ propsData.customEvent = event;
657
+ propsData.axis = { x: event.clientX, y: event.clientY };
658
+ }
659
+ const vm = createVNode(contextMenuVue, propsData);
660
+ render(vm, container);
661
+ const handleClick = function() {
662
+ menuManager.resolve("");
663
+ };
664
+ menuManager.domList.push(container);
665
+ const remove = function() {
666
+ menuManager.domList.forEach((dom) => {
667
+ try {
668
+ dom && body.removeChild(dom);
669
+ } catch (error) {
670
+ }
671
+ });
672
+ body.removeEventListener("click", handleClick);
673
+ body.removeEventListener("scroll", handleClick);
674
+ };
675
+ menuManager.resolve = function(arg) {
676
+ remove();
677
+ resolve(arg);
678
+ };
679
+ remove();
680
+ body.appendChild(container);
681
+ body.addEventListener("click", handleClick);
682
+ body.addEventListener("scroll", handleClick);
683
+ });
684
+ }
685
+ function destroyContextMenu() {
686
+ if (menuManager) {
687
+ menuManager.resolve("");
688
+ menuManager.domList = [];
689
+ }
690
+ }
691
+ if (getCurrentInstance()) {
692
+ onUnmounted(() => {
693
+ destroyContextMenu();
694
+ });
695
+ }
696
+ return [createContextMenu, destroyContextMenu];
697
+ }
698
+ const _hoisted_1 = {
699
+ class: "dt-tree h-full flex flex-col"
700
+ };
701
+ const _sfc_main = /* @__PURE__ */ defineComponent({
702
+ __name: "index",
703
+ props: BasicProps,
704
+ emits: ["update:expandedKeys", "update:selectedKeys", "update:value", "check", "change", "clickNode", "update:searchValue"],
705
+ setup(__props, {
706
+ expose,
707
+ emit
708
+ }) {
709
+ const props = __props;
710
+ const {
711
+ t
712
+ } = useI18n("UI");
713
+ const {
714
+ getSlot,
715
+ extendSlots
716
+ } = useSlots$1();
717
+ const attrs = useAttrs();
718
+ const slots = useSlots();
719
+ const state = reactive({
720
+ checkStrictly: props.checkStrictly,
721
+ expandedKeys: props.expandedKeys || [],
722
+ selectedKeys: props.selectedKeys || [],
723
+ checkedKeys: props.checkedKeys || []
724
+ });
725
+ const searchState = reactive({
726
+ startSearch: false,
727
+ searchText: "",
728
+ searchData: []
729
+ });
730
+ const treeDataRef = ref([]);
731
+ const getFieldNames = computed(() => {
732
+ const {
733
+ fieldNames
734
+ } = props;
735
+ return {
736
+ children: "children",
737
+ title: "title",
738
+ key: "key",
739
+ ...fieldNames
740
+ };
741
+ });
742
+ const getTreeData = computed(() => {
743
+ return searchState.startSearch ? searchState.searchData : unref(treeDataRef);
744
+ });
745
+ const getNotFound = computed(() => {
746
+ return !getTreeData.value || getTreeData.value.length === 0;
747
+ });
748
+ const getIcon = (params, icon) => {
749
+ if (!icon) {
750
+ if (props.renderIcon && isFunction(props.renderIcon)) {
751
+ return props.renderIcon(params);
752
+ }
753
+ }
754
+ return icon;
755
+ };
756
+ const treeData = computed(() => {
757
+ const data = cloneDeep(getTreeData.value);
758
+ eachTree(data, (item, _parent) => {
759
+ const searchText = searchState.searchText;
760
+ const {
761
+ highlight
762
+ } = unref(props);
763
+ const {
764
+ title: titleField,
765
+ key: keyField,
766
+ children: childrenField
767
+ } = unref(getFieldNames);
768
+ const icon = getIcon(item, item.icon);
769
+ const title = get(item, titleField);
770
+ const searchIdx = searchText ? title.indexOf(searchText) : -1;
771
+ const isHighlight = searchState.startSearch && !isEmpty(searchText) && highlight && searchIdx !== -1;
772
+ const highlightStyle = `color: ${isBoolean(highlight) ? "#f50" : highlight}`;
773
+ const titleDom = isHighlight ? createVNode("span", {
774
+ "class": "tree-content"
775
+ }, [createVNode("span", null, [title.substr(0, searchIdx)]), createVNode("span", {
776
+ "style": highlightStyle
777
+ }, [searchText]), createVNode("span", null, [title.substr(searchIdx + searchText.length)])]) : title;
778
+ item._title = item.title;
779
+ item[titleField] = createVNode("span", {
780
+ "class": "tree-title",
781
+ "onClick": handleClickNode.bind(null, item[keyField], item[childrenField], item)
782
+ }, [slots?.title ? getSlot(slots, "title", item) : createVNode(Fragment, null, [unref(getBindValues).showIcon && icon && createVNode("i", {
783
+ "class": `i ${icon}`
784
+ }, null), titleDom, createVNode("span", {
785
+ "class": "tree-action"
786
+ }, [renderAction(item)])])]);
787
+ });
788
+ return data;
789
+ });
790
+ const getBindValues = computed(() => {
791
+ let propsData = {
792
+ blockNode: true,
793
+ ...attrs,
794
+ ...props,
795
+ expandedKeys: state.expandedKeys,
796
+ selectedKeys: state.selectedKeys,
797
+ checkedKeys: state.checkedKeys,
798
+ checkStrictly: state.checkStrictly,
799
+ fieldNames: unref(getFieldNames),
800
+ "onUpdate:expandedKeys": (v) => {
801
+ state.expandedKeys = v;
802
+ emit("update:expandedKeys", v);
803
+ },
804
+ "onUpdate:selectedKeys": (v) => {
805
+ state.selectedKeys = v;
806
+ emit("update:selectedKeys", v);
807
+ },
808
+ onCheck: (v, e) => {
809
+ let currentValue = toRaw(state.checkedKeys);
810
+ if (isArray(currentValue) && searchState.startSearch) {
811
+ const {
812
+ key
813
+ } = unref(getFieldNames);
814
+ currentValue = difference(currentValue, getChildrenKeys(e.node.$attrs.node[key]));
815
+ if (e.checked) {
816
+ currentValue.push(e.node.$attrs.node[key]);
817
+ }
818
+ state.checkedKeys = currentValue;
819
+ } else {
820
+ state.checkedKeys = v;
821
+ }
822
+ const rawVal = toRaw(state.checkedKeys);
823
+ emit("update:value", rawVal);
824
+ emit("check", rawVal, e);
825
+ },
826
+ onRightClick: handleRightClick
827
+ };
828
+ return omit(propsData, "treeData", "class");
829
+ });
830
+ const showTitle = computed(() => {
831
+ const {
832
+ title,
833
+ toolbar,
834
+ search
835
+ } = props;
836
+ return title || toolbar || search || slots.headerTitle;
837
+ });
838
+ function handleClickNode(key, children, node) {
839
+ emit("clickNode", node);
840
+ if (!props.clickRowToExpand || !children || children.length === 0)
841
+ return;
842
+ if (!state.expandedKeys.includes(key)) {
843
+ setExpandedKeys([...state.expandedKeys, key]);
844
+ } else {
845
+ const keys = [...state.expandedKeys];
846
+ const index2 = keys.findIndex((item) => item === key);
847
+ if (index2 !== -1) {
848
+ keys.splice(index2, 1);
849
+ }
850
+ setExpandedKeys(keys);
851
+ }
852
+ }
853
+ function renderAction(node) {
854
+ const {
855
+ actionList
856
+ } = props;
857
+ if (!actionList || actionList.length === 0)
858
+ return;
859
+ return actionList.map((item, index2) => {
860
+ let nodeShow = true;
861
+ if (isFunction(item.show)) {
862
+ nodeShow = item.show?.(node);
863
+ } else if (isBoolean(item.show)) {
864
+ nodeShow = item.show;
865
+ }
866
+ if (!nodeShow)
867
+ return null;
868
+ return createVNode("span", {
869
+ "key": index2,
870
+ "class": "tree-action"
871
+ }, [item.render(node)]);
872
+ });
873
+ }
874
+ function handleSearch(searchValue) {
875
+ if (searchValue !== searchState.searchText)
876
+ searchState.searchText = searchValue;
877
+ emit("update:searchValue", searchValue);
878
+ if (!searchValue) {
879
+ searchState.startSearch = false;
880
+ return;
881
+ }
882
+ const {
883
+ filterFn,
884
+ checkable,
885
+ expandOnSearch,
886
+ checkOnSearch,
887
+ selectedOnSearch
888
+ } = unref(props);
889
+ const {
890
+ title: titleField,
891
+ key: keyField
892
+ } = unref(getFieldNames);
893
+ const matchedKeys = [];
894
+ searchState.startSearch = true;
895
+ searchState.searchData = filter(unref(treeDataRef), (node) => {
896
+ const result = filterFn ? filterFn(searchValue, node, unref(getFieldNames)) : node[titleField]?.includes(searchValue) ?? false;
897
+ if (result) {
898
+ matchedKeys.push(node[keyField]);
899
+ }
900
+ return result;
901
+ }, unref(getFieldNames));
902
+ if (expandOnSearch) {
903
+ const expandKeys = treeToList(searchState.searchData).map((val) => {
904
+ return val[keyField];
905
+ });
906
+ if (expandKeys && expandKeys.length) {
907
+ setExpandedKeys(expandKeys);
908
+ }
909
+ }
910
+ if (checkOnSearch && checkable && matchedKeys.length) {
911
+ setCheckedKeys(matchedKeys);
912
+ }
913
+ if (selectedOnSearch && matchedKeys.length) {
914
+ setSelectedKeys(matchedKeys);
915
+ }
916
+ }
917
+ const [createContextMenu] = useContextMenu();
918
+ async function handleRightClick({
919
+ event,
920
+ node
921
+ }) {
922
+ const {
923
+ rightMenuList: menuList = [],
924
+ beforeRightClick
925
+ } = props;
926
+ let contextMenuOptions = {
927
+ event,
928
+ items: []
929
+ };
930
+ if (beforeRightClick && isFunction(beforeRightClick)) {
931
+ let result = await beforeRightClick(node, event);
932
+ if (Array.isArray(result)) {
933
+ contextMenuOptions.items = result;
934
+ } else {
935
+ Object.assign(contextMenuOptions, result);
936
+ }
937
+ } else {
938
+ contextMenuOptions.items = menuList;
939
+ }
940
+ if (!contextMenuOptions.items?.length)
941
+ return;
942
+ contextMenuOptions.items = contextMenuOptions.items.filter((item) => !item.hidden);
943
+ createContextMenu(contextMenuOptions);
944
+ }
945
+ const {
946
+ deleteNodeByKey,
947
+ insertNodeByKey,
948
+ insertNodesByKey,
949
+ filterByLevel,
950
+ updateNodeByKey,
951
+ getAllKeys,
952
+ getChildrenKeys,
953
+ getEnabledKeys,
954
+ getSelectedNode
955
+ } = useTree(treeDataRef, getFieldNames);
956
+ function setExpandedKeys(keys) {
957
+ state.expandedKeys = keys;
958
+ }
959
+ function getExpandedKeys() {
960
+ return state.expandedKeys;
961
+ }
962
+ function setSelectedKeys(keys) {
963
+ state.selectedKeys = keys;
964
+ }
965
+ function getSelectedKeys() {
966
+ return state.selectedKeys;
967
+ }
968
+ function setCheckedKeys(keys) {
969
+ state.checkedKeys = keys;
970
+ }
971
+ function getCheckedKeys() {
972
+ return state.checkedKeys;
973
+ }
974
+ function checkAll(checkAll2) {
975
+ state.checkedKeys = checkAll2 ? getEnabledKeys() : [];
976
+ }
977
+ function expandAll(expandAll2) {
978
+ state.expandedKeys = expandAll2 ? getAllKeys() : [];
979
+ }
980
+ function onStrictlyChange(strictly) {
981
+ state.checkStrictly = strictly;
982
+ }
983
+ const instance = {
984
+ setExpandedKeys,
985
+ getExpandedKeys,
986
+ setSelectedKeys,
987
+ getSelectedKeys,
988
+ setCheckedKeys,
989
+ getCheckedKeys,
990
+ insertNodeByKey,
991
+ insertNodesByKey,
992
+ deleteNodeByKey,
993
+ updateNodeByKey,
994
+ getSelectedNode,
995
+ checkAll,
996
+ expandAll,
997
+ onStrictlyChange,
998
+ filterByLevel: (level) => {
999
+ state.expandedKeys = filterByLevel(level);
1000
+ },
1001
+ setSearchValue: (value) => {
1002
+ handleSearch(value);
1003
+ },
1004
+ getSearchValue: () => {
1005
+ return searchState.searchText;
1006
+ }
1007
+ };
1008
+ onMounted(() => {
1009
+ const level = parseInt(props.defaultExpandLevel);
1010
+ if (level > 0) {
1011
+ state.expandedKeys = filterByLevel(level);
1012
+ } else if (props.defaultExpandAll) {
1013
+ expandAll(true);
1014
+ }
1015
+ });
1016
+ watch(() => props.searchValue, (val) => {
1017
+ if (val !== searchState.searchText) {
1018
+ searchState.searchText = val;
1019
+ }
1020
+ }, {
1021
+ immediate: true
1022
+ });
1023
+ watch(() => props.treeData, (val) => {
1024
+ if (val) {
1025
+ handleSearch(searchState.searchText);
1026
+ }
1027
+ });
1028
+ watch(() => props.value, () => {
1029
+ state.checkedKeys = toRaw(props.value || []);
1030
+ }, {
1031
+ immediate: true
1032
+ });
1033
+ watch(() => state.checkedKeys, () => {
1034
+ const v = toRaw(state.checkedKeys);
1035
+ emit("update:value", v);
1036
+ emit("change", v);
1037
+ });
1038
+ watchEffect(() => {
1039
+ treeDataRef.value = props.treeData;
1040
+ });
1041
+ watchEffect(() => {
1042
+ state.expandedKeys = props.expandedKeys;
1043
+ });
1044
+ watchEffect(() => {
1045
+ state.selectedKeys = props.selectedKeys;
1046
+ });
1047
+ watchEffect(() => {
1048
+ state.checkedKeys = props.checkedKeys;
1049
+ });
1050
+ watchEffect(() => {
1051
+ state.checkStrictly = props.checkStrictly;
1052
+ });
1053
+ expose(instance);
1054
+ return (_ctx, _cache) => {
1055
+ const _component_ATree = Tree;
1056
+ const _component_AEmpty = Empty;
1057
+ const _component_ASpin = Spin;
1058
+ return openBlock(), createElementBlock("div", _hoisted_1, [unref(showTitle) ? (openBlock(), createBlock(TreeHeader, {
1059
+ key: 0,
1060
+ title: _ctx.title,
1061
+ toolbar: _ctx.toolbar,
1062
+ search: _ctx.search,
1063
+ checkable: _ctx.checkable,
1064
+ searchText: searchState.searchText,
1065
+ checkAll,
1066
+ expandAll,
1067
+ onSearch: handleSearch
1068
+ }, {
1069
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(extendSlots)(unref(slots))), 1)]),
1070
+ _: 1
1071
+ }, 8, ["title", "toolbar", "search", "checkable", "searchText"])) : createCommentVNode("v-if", true), createVNode(_component_ASpin, {
1072
+ spinning: _ctx.loading,
1073
+ tip: unref(t)("LOADING")
1074
+ }, {
1075
+ default: withCtx(() => [withDirectives(createElementVNode("div", null, [createVNode(_component_ATree, mergeProps(unref(getBindValues), {
1076
+ showIcon: false,
1077
+ treeData: unref(treeData)
1078
+ }), null, 16, ["treeData"])], 512), [[vShow, !unref(getNotFound)]]), withDirectives(createVNode(_component_AEmpty, null, null, 512), [[vShow, unref(getNotFound)]])]),
1079
+ _: 1
1080
+ }, 8, ["spinning", "tip"])]);
1081
+ };
1082
+ }
1083
+ });
1084
+ const index = /* @__PURE__ */ _export_sfc(_sfc_main, [["__file", "D:/dt/dt-frame-front/dt-frames/frames/packages/ui/src/components/tree/src/index.vue"]]);
1085
+ export {
1086
+ index as DtTree
1087
+ };