@veltra/desktop 1.0.7 → 1.0.9
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.
- package/dist/components/action/action-group.vue.d.ts +1 -1
- package/dist/components/action/action.vue.d.ts +3 -3
- package/dist/components/action/style.js +3 -0
- package/dist/components/auto-complete/auto-complete.vue.d.ts +2 -2
- package/dist/components/auto-complete/style.js +5 -0
- package/dist/components/batch-edit/style.js +9 -0
- package/dist/components/breadcrumb/style2.css +0 -6
- package/dist/components/button/style.js +1 -0
- package/dist/components/cascade/cascade.js +15 -13
- package/dist/components/cascade/cascade.js.map +1 -1
- package/dist/components/cascade/cascade.vue.d.ts +3 -3
- package/dist/components/cascade/node.js.map +1 -1
- package/dist/components/cascade/style.js +7 -0
- package/dist/components/cascade/use-check.js +3 -2
- package/dist/components/cascade/use-check.js.map +1 -1
- package/dist/components/cascade/use-select.js +3 -3
- package/dist/components/cascade/use-select.js.map +1 -1
- package/dist/components/checkbox/style.js +1 -0
- package/dist/components/checkbox/style2.css +0 -8
- package/dist/components/checkbox-group/checkbox-group.vue.d.ts +2 -2
- package/dist/components/checkbox-group/style.js +1 -0
- package/dist/components/context-menu/style.js +1 -0
- package/dist/components/date-panel/date-panel.vue.d.ts +1 -1
- package/dist/components/date-picker/date-picker.js +9 -9
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-picker/date-picker.vue.d.ts +2 -2
- package/dist/components/date-picker/style.js +3 -0
- package/dist/components/date-range-picker/date-range-picker.js +9 -9
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.vue.d.ts +2 -2
- package/dist/components/date-range-picker/style.js +3 -0
- package/dist/components/dialog/style.js +2 -0
- package/dist/components/drawer/style.js +1 -0
- package/dist/components/drawer/style2.css +4 -16
- package/dist/components/empty/style.js +1 -0
- package/dist/components/expression-editor/style.js +6 -0
- package/dist/components/file-picker/file-picker.vue.d.ts +1 -1
- package/dist/components/file-picker/helper.js +19 -7
- package/dist/components/file-picker/helper.js.map +1 -1
- package/dist/components/file-viewer/file-viewer.js +294 -0
- package/dist/components/file-viewer/file-viewer.js.map +1 -0
- package/dist/components/file-viewer/file-viewer.vue.d.ts +42 -0
- package/dist/components/file-viewer/helper.js +185 -0
- package/dist/components/file-viewer/helper.js.map +1 -0
- package/dist/components/file-viewer/index.d.ts +1 -0
- package/dist/components/file-viewer/previewers/docx-previewer.js +76 -0
- package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -0
- package/dist/components/file-viewer/previewers/image-previewer.js +64 -0
- package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -0
- package/dist/components/file-viewer/previewers/pdf-previewer.js +90 -0
- package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -0
- package/dist/components/file-viewer/previewers/sheet-previewer.js +175 -0
- package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -0
- package/dist/components/file-viewer/previewers/text-previewer.js +74 -0
- package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -0
- package/dist/components/file-viewer/previewers/video-previewer.js +62 -0
- package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -0
- package/dist/components/file-viewer/style.d.ts +1 -0
- package/dist/components/file-viewer/style.js +4 -0
- package/dist/components/file-viewer/style2.css +445 -0
- package/dist/components/float-button/style.js +1 -0
- package/dist/components/form/style.js +2 -0
- package/dist/components/form-item/style.js +1 -0
- package/dist/components/form-item/style2.css +2 -3
- package/dist/components/grid-input/grid-input.vue.d.ts +1 -1
- package/dist/components/index.d.ts +12 -9
- package/dist/components/input/input.vue.d.ts +2 -2
- package/dist/components/input/style.js +1 -0
- package/dist/components/layout/style.js +1 -0
- package/dist/components/list/style.js +1 -0
- package/dist/components/loading/style2.css +16 -20
- package/dist/components/menu/style.js +2 -0
- package/dist/components/menu/style2.css +0 -78
- package/dist/components/multi-select/multi-select-option.js +14 -10
- package/dist/components/multi-select/multi-select-option.js.map +1 -1
- package/dist/components/multi-select/multi-select.js +16 -19
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-select/multi-select.vue.d.ts +3 -3
- package/dist/components/multi-select/style.js +7 -0
- package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +4 -4
- package/dist/components/multi-tree-select/style.js +7 -0
- package/dist/components/notification/notification.vue.d.ts +1 -1
- package/dist/components/number-input/number-input.vue.d.ts +2 -2
- package/dist/components/number-input/style.js +1 -0
- package/dist/components/number-range-input/number-range-input.vue.d.ts +2 -2
- package/dist/components/number-range-input/style.js +1 -0
- package/dist/components/paginator/style.js +3 -0
- package/dist/components/palette/di.js.map +1 -1
- package/dist/components/palette/palette-alpha.js +7 -10
- package/dist/components/palette/palette-alpha.js.map +1 -1
- package/dist/components/palette/palette-hue.js +5 -7
- package/dist/components/palette/palette-hue.js.map +1 -1
- package/dist/components/palette/palette-sv.js +8 -10
- package/dist/components/palette/palette-sv.js.map +1 -1
- package/dist/components/palette/palette.js +22 -24
- package/dist/components/palette/palette.js.map +1 -1
- package/dist/components/palette/style.js +3 -0
- package/dist/components/password-input/password-input.vue.d.ts +1 -1
- package/dist/components/password-input/style.js +2 -0
- package/dist/components/pop-confirm/pop-confirm.vue.d.ts +1 -1
- package/dist/components/pop-confirm/style.js +3 -0
- package/dist/components/progress-nodes/progress-nodes.vue.d.ts +2 -2
- package/dist/components/progress-nodes/style2.css +79 -33
- package/dist/components/radio/style2.css +0 -8
- package/dist/components/radio-group/radio-group.vue.d.ts +2 -2
- package/dist/components/radio-group/style.js +1 -0
- package/dist/components/rich-text-editor/rich-text-editor.vue.d.ts +2 -2
- package/dist/components/select/select.js +14 -12
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/select/select.vue.d.ts +2 -2
- package/dist/components/select/style.js +5 -0
- package/dist/components/select/style2.css +0 -20
- package/dist/components/slider/slider-thumb.js +10 -13
- package/dist/components/slider/slider-thumb.js.map +1 -1
- package/dist/components/slider/slider.js +12 -15
- package/dist/components/slider/slider.js.map +1 -1
- package/dist/components/steps/style.js +2 -0
- package/dist/components/steps/style2.css +28 -35
- package/dist/components/switch/style2.css +0 -3
- package/dist/components/table/di.js.map +1 -1
- package/dist/components/table/node/row.d.ts +10 -1
- package/dist/components/table/node/row.js +9 -0
- package/dist/components/table/node/row.js.map +1 -1
- package/dist/components/table/style.js +7 -0
- package/dist/components/table/style2.css +0 -41
- package/dist/components/table/table-body.js +25 -26
- package/dist/components/table/table-body.js.map +1 -1
- package/dist/components/table/table-cell.js +16 -9
- package/dist/components/table/table-cell.js.map +1 -1
- package/dist/components/table/table-row.js +78 -19
- package/dist/components/table/table-row.js.map +1 -1
- package/dist/components/table/table.js +76 -34
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table/use-fixed-columns.js +27 -8
- package/dist/components/table/use-fixed-columns.js.map +1 -1
- package/dist/components/table/use-rows.js +2 -2
- package/dist/components/table/use-rows.js.map +1 -1
- package/dist/components/table/use-table.js +25 -3
- package/dist/components/table/use-table.js.map +1 -1
- package/dist/components/table-editor/style.js +2 -0
- package/dist/components/tabs/index.d.ts +3 -1
- package/dist/components/tabs/style.js +2 -0
- package/dist/components/tabs/style2.css +169 -107
- package/dist/components/tabs/tabs-horizontal.js +133 -0
- package/dist/components/tabs/tabs-horizontal.js.map +1 -0
- package/dist/components/tabs/tabs-horizontal.vue.d.ts +29 -0
- package/dist/components/tabs/tabs-vertical.js +89 -0
- package/dist/components/tabs/tabs-vertical.js.map +1 -0
- package/dist/components/tabs/tabs-vertical.vue.d.ts +28 -0
- package/dist/components/tabs/tabs.js +75 -105
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/tabs/tabs.vue.d.ts +9 -23
- package/dist/components/tabs/use-tabs-bar.js +105 -0
- package/dist/components/tabs/use-tabs-bar.js.map +1 -0
- package/dist/components/tag/style2.css +0 -6
- package/dist/components/textarea/style.js +1 -0
- package/dist/components/textarea/textarea.vue.d.ts +2 -2
- package/dist/components/theme/style.js +5 -0
- package/dist/components/tip/tip.vue.d.ts +2 -2
- package/dist/components/tree/style.js +4 -0
- package/dist/components/tree/style2.css +45 -23
- package/dist/components/tree/tree-node.js +50 -35
- package/dist/components/tree/tree-node.js.map +1 -1
- package/dist/components/tree/tree.js +27 -20
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree/tree.vue.d.ts +1 -1
- package/dist/components/tree/use-check.js +52 -14
- package/dist/components/tree/use-check.js.map +1 -1
- package/dist/components/tree/use-tree-nodes.js +51 -24
- package/dist/components/tree/use-tree-nodes.js.map +1 -1
- package/dist/components/tree-select/style.js +4 -0
- package/dist/components/tree-select/tree-select.vue.d.ts +3 -3
- package/dist/components/watermark/watermark.vue.d.ts +1 -1
- package/dist/index.d.ts +57 -53
- package/dist/index.js +51 -48
- package/dist/types/file-viewer.d.ts +71 -0
- package/dist/types/index.d.ts +4 -3
- package/dist/types/tabs.d.ts +106 -14
- package/dist/types/tree.d.ts +6 -1
- package/package.json +32 -31
- package/src/components/breadcrumb/style.scss +0 -6
- package/src/components/cascade/cascade.vue +18 -18
- package/src/components/cascade/node.ts +4 -1
- package/src/components/cascade/use-check.ts +5 -4
- package/src/components/cascade/use-select.ts +4 -5
- package/src/components/checkbox/style.scss +0 -4
- package/src/components/date-picker/date-picker.vue +10 -9
- package/src/components/date-range-picker/date-range-picker.vue +12 -12
- package/src/components/drawer/style.scss +18 -11
- package/src/components/file-picker/helper.ts +21 -10
- package/src/components/file-viewer/file-viewer.vue +311 -0
- package/src/components/file-viewer/helper.ts +193 -0
- package/src/components/file-viewer/index.ts +1 -0
- package/src/components/file-viewer/previewers/docx-previewer.vue +78 -0
- package/src/components/file-viewer/previewers/image-previewer.vue +64 -0
- package/src/components/file-viewer/previewers/pdf-previewer.vue +90 -0
- package/src/components/file-viewer/previewers/sheet-previewer.vue +210 -0
- package/src/components/file-viewer/previewers/text-previewer.vue +76 -0
- package/src/components/file-viewer/previewers/video-previewer.vue +72 -0
- package/src/components/file-viewer/style.scss +504 -0
- package/src/components/file-viewer/style.ts +4 -0
- package/src/components/form-item/style.scss +2 -3
- package/src/components/index.ts +2 -0
- package/src/components/loading/style.scss +125 -126
- package/src/components/menu/style.scss +0 -31
- package/src/components/multi-select/multi-select-option.vue +16 -3
- package/src/components/multi-select/multi-select.vue +17 -9
- package/src/components/palette/di.ts +5 -3
- package/src/components/palette/palette-alpha.vue +7 -10
- package/src/components/palette/palette-hue.vue +5 -7
- package/src/components/palette/palette-sv.vue +12 -14
- package/src/components/palette/palette.vue +19 -21
- package/src/components/progress-nodes/style.scss +28 -22
- package/src/components/radio/style.scss +0 -4
- package/src/components/select/select.vue +21 -19
- package/src/components/select/style.scss +0 -12
- package/src/components/slider/slider-thumb.vue +11 -14
- package/src/components/slider/slider.vue +15 -15
- package/src/components/steps/style.scss +10 -10
- package/src/components/switch/style.scss +0 -4
- package/src/components/table/di.ts +20 -3
- package/src/components/table/node/row.ts +10 -1
- package/src/components/table/style.scss +0 -26
- package/src/components/table/table-body.vue +28 -33
- package/src/components/table/table-cell.vue +17 -9
- package/src/components/table/table-row.tsx +83 -17
- package/src/components/table/table.vue +73 -45
- package/src/components/table/use-fixed-columns.ts +46 -12
- package/src/components/table/use-rows.ts +14 -3
- package/src/components/table/use-table.ts +27 -3
- package/src/components/tabs/index.ts +2 -0
- package/src/components/tabs/style.scss +217 -134
- package/src/components/tabs/tabs-horizontal.vue +125 -0
- package/src/components/tabs/tabs-vertical.vue +75 -0
- package/src/components/tabs/tabs.vue +56 -127
- package/src/components/tabs/use-tabs-bar.ts +119 -0
- package/src/components/tag/style.scss +0 -6
- package/src/components/tree/style.scss +74 -29
- package/src/components/tree/tree-node.vue +10 -4
- package/src/components/tree/tree.vue +39 -12
- package/src/components/tree/use-check.ts +79 -23
- package/src/components/tree/use-tree-nodes.ts +85 -34
- package/src/types/file-viewer.ts +69 -0
- package/src/types/index.ts +1 -0
- package/src/types/tabs.ts +113 -19
- package/src/types/tree.ts +6 -1
- package/dist/types/index.js +0 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { nextTick, onBeforeUnmount, onMounted, shallowRef, watch } from "vue";
|
|
2
|
+
import { useResizeObserver } from "@veltra/compositions";
|
|
3
|
+
//#region src/components/tabs/use-tabs-bar.ts
|
|
4
|
+
/**
|
|
5
|
+
* 水平标签栏的溢出滚动逻辑:
|
|
6
|
+
* - 计算 nav 按钮显隐与可用状态
|
|
7
|
+
* - 提供按步滚动与活动标签自动滚入视野的方法
|
|
8
|
+
* - 绑定 wheel / scroll / resize 事件
|
|
9
|
+
*/
|
|
10
|
+
function useTabsBar(options) {
|
|
11
|
+
const { viewportRef, listRef, items, model } = options;
|
|
12
|
+
const showNav = shallowRef(false);
|
|
13
|
+
const canPrev = shallowRef(false);
|
|
14
|
+
const canNext = shallowRef(false);
|
|
15
|
+
/** 依据 viewport 与内容尺寸推导滚动按钮可用状态 */
|
|
16
|
+
const updateNavState = () => {
|
|
17
|
+
const vp = viewportRef.value;
|
|
18
|
+
if (!vp) return;
|
|
19
|
+
const { scrollLeft, scrollWidth, clientWidth } = vp;
|
|
20
|
+
const overflowing = scrollWidth - clientWidth > 1;
|
|
21
|
+
showNav.value = overflowing;
|
|
22
|
+
canPrev.value = overflowing && scrollLeft > 0;
|
|
23
|
+
canNext.value = overflowing && scrollLeft + clientWidth < scrollWidth - 1;
|
|
24
|
+
};
|
|
25
|
+
/** 箭头按钮:按视口宽度 80% 的步长平滑滚动 */
|
|
26
|
+
const scrollByStep = (dir) => {
|
|
27
|
+
const vp = viewportRef.value;
|
|
28
|
+
if (!vp) return;
|
|
29
|
+
vp.scrollTo({
|
|
30
|
+
left: vp.scrollLeft + dir * vp.clientWidth * .8,
|
|
31
|
+
behavior: "smooth"
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
/** 活动标签自动滚入视野 */
|
|
35
|
+
const ensureActiveVisible = () => {
|
|
36
|
+
const vp = viewportRef.value;
|
|
37
|
+
const list = listRef.value;
|
|
38
|
+
if (!vp || !list) return;
|
|
39
|
+
const activeKey = model.value;
|
|
40
|
+
if (!activeKey) return;
|
|
41
|
+
const activeIndex = items.value.findIndex((i) => i.key === activeKey);
|
|
42
|
+
if (activeIndex < 0) return;
|
|
43
|
+
const el = list.children[activeIndex];
|
|
44
|
+
if (!el) return;
|
|
45
|
+
const vpRect = vp.getBoundingClientRect();
|
|
46
|
+
const elRect = el.getBoundingClientRect();
|
|
47
|
+
if (elRect.left < vpRect.left) vp.scrollTo({
|
|
48
|
+
left: vp.scrollLeft + (elRect.left - vpRect.left) - 8,
|
|
49
|
+
behavior: "smooth"
|
|
50
|
+
});
|
|
51
|
+
else if (elRect.right > vpRect.right) vp.scrollTo({
|
|
52
|
+
left: vp.scrollLeft + (elRect.right - vpRect.right) + 8,
|
|
53
|
+
behavior: "smooth"
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
/** 鼠标滚轮(纵向)驱动水平滚动;触控板横滑(已有 deltaX)不拦截 */
|
|
57
|
+
const handleWheel = (e) => {
|
|
58
|
+
if (!showNav.value) return;
|
|
59
|
+
const vp = viewportRef.value;
|
|
60
|
+
if (!vp) return;
|
|
61
|
+
if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return;
|
|
62
|
+
if (e.deltaY === 0) return;
|
|
63
|
+
e.preventDefault();
|
|
64
|
+
vp.scrollLeft += e.deltaY;
|
|
65
|
+
};
|
|
66
|
+
useResizeObserver({
|
|
67
|
+
targets: [viewportRef, listRef],
|
|
68
|
+
onResize: () => updateNavState()
|
|
69
|
+
});
|
|
70
|
+
watch(model, async () => {
|
|
71
|
+
await nextTick();
|
|
72
|
+
ensureActiveVisible();
|
|
73
|
+
});
|
|
74
|
+
watch(items, async () => {
|
|
75
|
+
await nextTick();
|
|
76
|
+
updateNavState();
|
|
77
|
+
ensureActiveVisible();
|
|
78
|
+
}, { deep: false });
|
|
79
|
+
onMounted(() => {
|
|
80
|
+
const vp = viewportRef.value;
|
|
81
|
+
if (!vp) return;
|
|
82
|
+
vp.addEventListener("wheel", handleWheel, { passive: false });
|
|
83
|
+
vp.addEventListener("scroll", updateNavState, { passive: true });
|
|
84
|
+
updateNavState();
|
|
85
|
+
nextTick(ensureActiveVisible);
|
|
86
|
+
});
|
|
87
|
+
onBeforeUnmount(() => {
|
|
88
|
+
const vp = viewportRef.value;
|
|
89
|
+
if (!vp) return;
|
|
90
|
+
vp.removeEventListener("wheel", handleWheel);
|
|
91
|
+
vp.removeEventListener("scroll", updateNavState);
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
showNav,
|
|
95
|
+
canPrev,
|
|
96
|
+
canNext,
|
|
97
|
+
updateNavState,
|
|
98
|
+
scrollByStep,
|
|
99
|
+
ensureActiveVisible
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//#endregion
|
|
103
|
+
export { useTabsBar };
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=use-tabs-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-tabs-bar.js","names":[],"sources":["../../../src/components/tabs/use-tabs-bar.ts"],"sourcesContent":["import { useResizeObserver } from '@veltra/compositions'\nimport {\n type ModelRef,\n type Ref,\n type ShallowRef,\n nextTick,\n onBeforeUnmount,\n onMounted,\n shallowRef,\n watch\n} from 'vue'\n\nimport type { TabItem } from '../../types'\n\ninterface UseTabsBarOptions {\n viewportRef: ShallowRef<HTMLElement | undefined>\n listRef: ShallowRef<HTMLElement | undefined>\n items: Ref<TabItem[]>\n model: ModelRef<string | undefined>\n}\n\n/**\n * 水平标签栏的溢出滚动逻辑:\n * - 计算 nav 按钮显隐与可用状态\n * - 提供按步滚动与活动标签自动滚入视野的方法\n * - 绑定 wheel / scroll / resize 事件\n */\nexport function useTabsBar(options: UseTabsBarOptions) {\n const { viewportRef, listRef, items, model } = options\n\n const showNav = shallowRef(false)\n const canPrev = shallowRef(false)\n const canNext = shallowRef(false)\n\n /** 依据 viewport 与内容尺寸推导滚动按钮可用状态 */\n const updateNavState = () => {\n const vp = viewportRef.value\n if (!vp) return\n const { scrollLeft, scrollWidth, clientWidth } = vp\n const overflowing = scrollWidth - clientWidth > 1\n showNav.value = overflowing\n canPrev.value = overflowing && scrollLeft > 0\n canNext.value = overflowing && scrollLeft + clientWidth < scrollWidth - 1\n }\n\n /** 箭头按钮:按视口宽度 80% 的步长平滑滚动 */\n const scrollByStep = (dir: 1 | -1) => {\n const vp = viewportRef.value\n if (!vp) return\n vp.scrollTo({ left: vp.scrollLeft + dir * vp.clientWidth * 0.8, behavior: 'smooth' })\n }\n\n /** 活动标签自动滚入视野 */\n const ensureActiveVisible = () => {\n const vp = viewportRef.value\n const list = listRef.value\n if (!vp || !list) return\n const activeKey = model.value\n if (!activeKey) return\n const activeIndex = items.value.findIndex((i) => i.key === activeKey)\n if (activeIndex < 0) return\n const el = list.children[activeIndex] as HTMLElement | undefined\n if (!el) return\n\n const vpRect = vp.getBoundingClientRect()\n const elRect = el.getBoundingClientRect()\n if (elRect.left < vpRect.left) {\n vp.scrollTo({ left: vp.scrollLeft + (elRect.left - vpRect.left) - 8, behavior: 'smooth' })\n } else if (elRect.right > vpRect.right) {\n vp.scrollTo({ left: vp.scrollLeft + (elRect.right - vpRect.right) + 8, behavior: 'smooth' })\n }\n }\n\n /** 鼠标滚轮(纵向)驱动水平滚动;触控板横滑(已有 deltaX)不拦截 */\n const handleWheel = (e: WheelEvent) => {\n if (!showNav.value) return\n const vp = viewportRef.value\n if (!vp) return\n if (Math.abs(e.deltaX) > Math.abs(e.deltaY)) return\n if (e.deltaY === 0) return\n e.preventDefault()\n vp.scrollLeft += e.deltaY\n }\n\n useResizeObserver({ targets: [viewportRef, listRef], onResize: () => updateNavState() })\n\n watch(model, async () => {\n await nextTick()\n ensureActiveVisible()\n })\n\n watch(\n items,\n async () => {\n await nextTick()\n updateNavState()\n ensureActiveVisible()\n },\n { deep: false }\n )\n\n onMounted(() => {\n const vp = viewportRef.value\n if (!vp) return\n vp.addEventListener('wheel', handleWheel, { passive: false })\n vp.addEventListener('scroll', updateNavState, { passive: true })\n updateNavState()\n nextTick(ensureActiveVisible)\n })\n\n onBeforeUnmount(() => {\n const vp = viewportRef.value\n if (!vp) return\n vp.removeEventListener('wheel', handleWheel)\n vp.removeEventListener('scroll', updateNavState)\n })\n\n return { showNav, canPrev, canNext, updateNavState, scrollByStep, ensureActiveVisible }\n}\n"],"mappings":";;;;;;;;;AA2BA,SAAgB,WAAW,SAA4B;CACrD,MAAM,EAAE,aAAa,SAAS,OAAO,UAAU;CAE/C,MAAM,UAAU,WAAW,MAAM;CACjC,MAAM,UAAU,WAAW,MAAM;CACjC,MAAM,UAAU,WAAW,MAAM;;CAGjC,MAAM,uBAAuB;EAC3B,MAAM,KAAK,YAAY;AACvB,MAAI,CAAC,GAAI;EACT,MAAM,EAAE,YAAY,aAAa,gBAAgB;EACjD,MAAM,cAAc,cAAc,cAAc;AAChD,UAAQ,QAAQ;AAChB,UAAQ,QAAQ,eAAe,aAAa;AAC5C,UAAQ,QAAQ,eAAe,aAAa,cAAc,cAAc;;;CAI1E,MAAM,gBAAgB,QAAgB;EACpC,MAAM,KAAK,YAAY;AACvB,MAAI,CAAC,GAAI;AACT,KAAG,SAAS;GAAE,MAAM,GAAG,aAAa,MAAM,GAAG,cAAc;GAAK,UAAU;GAAU,CAAC;;;CAIvF,MAAM,4BAA4B;EAChC,MAAM,KAAK,YAAY;EACvB,MAAM,OAAO,QAAQ;AACrB,MAAI,CAAC,MAAM,CAAC,KAAM;EAClB,MAAM,YAAY,MAAM;AACxB,MAAI,CAAC,UAAW;EAChB,MAAM,cAAc,MAAM,MAAM,WAAW,MAAM,EAAE,QAAQ,UAAU;AACrE,MAAI,cAAc,EAAG;EACrB,MAAM,KAAK,KAAK,SAAS;AACzB,MAAI,CAAC,GAAI;EAET,MAAM,SAAS,GAAG,uBAAuB;EACzC,MAAM,SAAS,GAAG,uBAAuB;AACzC,MAAI,OAAO,OAAO,OAAO,KACvB,IAAG,SAAS;GAAE,MAAM,GAAG,cAAc,OAAO,OAAO,OAAO,QAAQ;GAAG,UAAU;GAAU,CAAC;WACjF,OAAO,QAAQ,OAAO,MAC/B,IAAG,SAAS;GAAE,MAAM,GAAG,cAAc,OAAO,QAAQ,OAAO,SAAS;GAAG,UAAU;GAAU,CAAC;;;CAKhG,MAAM,eAAe,MAAkB;AACrC,MAAI,CAAC,QAAQ,MAAO;EACpB,MAAM,KAAK,YAAY;AACvB,MAAI,CAAC,GAAI;AACT,MAAI,KAAK,IAAI,EAAE,OAAO,GAAG,KAAK,IAAI,EAAE,OAAO,CAAE;AAC7C,MAAI,EAAE,WAAW,EAAG;AACpB,IAAE,gBAAgB;AAClB,KAAG,cAAc,EAAE;;AAGrB,mBAAkB;EAAE,SAAS,CAAC,aAAa,QAAQ;EAAE,gBAAgB,gBAAgB;EAAE,CAAC;AAExF,OAAM,OAAO,YAAY;AACvB,QAAM,UAAU;AAChB,uBAAqB;GACrB;AAEF,OACE,OACA,YAAY;AACV,QAAM,UAAU;AAChB,kBAAgB;AAChB,uBAAqB;IAEvB,EAAE,MAAM,OAAO,CAChB;AAED,iBAAgB;EACd,MAAM,KAAK,YAAY;AACvB,MAAI,CAAC,GAAI;AACT,KAAG,iBAAiB,SAAS,aAAa,EAAE,SAAS,OAAO,CAAC;AAC7D,KAAG,iBAAiB,UAAU,gBAAgB,EAAE,SAAS,MAAM,CAAC;AAChE,kBAAgB;AAChB,WAAS,oBAAoB;GAC7B;AAEF,uBAAsB;EACpB,MAAM,KAAK,YAAY;AACvB,MAAI,CAAC,GAAI;AACT,KAAG,oBAAoB,SAAS,YAAY;AAC5C,KAAG,oBAAoB,UAAU,eAAe;GAChD;AAEF,QAAO;EAAE;EAAS;EAAS;EAAS;EAAgB;EAAc;EAAqB"}
|
|
@@ -15,12 +15,6 @@
|
|
|
15
15
|
* --u-height-small: 24px;
|
|
16
16
|
*/
|
|
17
17
|
/** 暗色:data-theme 与系统偏好,与 UITheme.injectBuiltInThemes 选择器策略一致 */
|
|
18
|
-
:root {
|
|
19
|
-
--u-tag-small: 20px;
|
|
20
|
-
--u-tag-default: 24px;
|
|
21
|
-
--u-tag-large: 28px;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
18
|
.u-tag {
|
|
25
19
|
cursor: default;
|
|
26
20
|
color: var(--u-text-color-main);
|
|
@@ -22,10 +22,10 @@ declare const __VLS_export: _$vue.DefineComponent<__VLS_PublicProps, {}, {}, {},
|
|
|
22
22
|
onFocus?: (() => any) | undefined;
|
|
23
23
|
onBlur?: (() => any) | undefined;
|
|
24
24
|
}>, {
|
|
25
|
-
placeholder: string;
|
|
26
|
-
clearable: boolean;
|
|
27
25
|
disabled: boolean;
|
|
28
26
|
readonly: boolean;
|
|
27
|
+
placeholder: string;
|
|
28
|
+
clearable: boolean;
|
|
29
29
|
resize: boolean;
|
|
30
30
|
autosize: boolean;
|
|
31
31
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
@@ -11,12 +11,12 @@ declare const __VLS_base: _$vue.DefineComponent<TipProps, {}, {}, {}, {}, _$vue.
|
|
|
11
11
|
}, string, _$vue.PublicProps, Readonly<TipProps> & Readonly<{
|
|
12
12
|
"onUpdate:visible"?: ((value: boolean) => any) | undefined;
|
|
13
13
|
}>, {
|
|
14
|
-
|
|
14
|
+
content: string;
|
|
15
15
|
trigger: "hover" | "click";
|
|
16
16
|
contentTag: string;
|
|
17
17
|
visible: boolean;
|
|
18
|
+
direction: TipDirection;
|
|
18
19
|
alignment: TipAlign;
|
|
19
|
-
content: string;
|
|
20
20
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
21
21
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
22
22
|
declare const _default: typeof __VLS_export;
|
|
@@ -19,26 +19,38 @@
|
|
|
19
19
|
border-radius: var(--u-radius-small);
|
|
20
20
|
padding: var(--u-gap-small);
|
|
21
21
|
line-height: 1;
|
|
22
|
+
gap: var(--u-gap-small);
|
|
22
23
|
}
|
|
23
24
|
.u-tree--small .u-tree__checkbox {
|
|
24
25
|
margin-right: var(--u-gap-small);
|
|
25
26
|
}
|
|
27
|
+
.u-tree--small .u-tree__node {
|
|
28
|
+
min-height: 28px;
|
|
29
|
+
}
|
|
26
30
|
.u-tree--default .u-tree__node-content {
|
|
27
31
|
border-radius: var(--u-radius-default);
|
|
28
32
|
padding: var(--u-gap-default);
|
|
29
33
|
line-height: 1;
|
|
34
|
+
gap: var(--u-gap-default);
|
|
30
35
|
}
|
|
31
36
|
.u-tree--default .u-tree__checkbox {
|
|
32
37
|
margin-right: var(--u-gap-default);
|
|
33
38
|
}
|
|
39
|
+
.u-tree--default .u-tree__node {
|
|
40
|
+
min-height: 32px;
|
|
41
|
+
}
|
|
34
42
|
.u-tree--large .u-tree__node-content {
|
|
35
43
|
border-radius: var(--u-radius-large);
|
|
36
44
|
padding: var(--u-gap-large);
|
|
37
45
|
line-height: 1;
|
|
46
|
+
gap: var(--u-gap-large);
|
|
38
47
|
}
|
|
39
48
|
.u-tree--large .u-tree__checkbox {
|
|
40
49
|
margin-right: var(--u-gap-large);
|
|
41
50
|
}
|
|
51
|
+
.u-tree--large .u-tree__node {
|
|
52
|
+
min-height: 40px;
|
|
53
|
+
}
|
|
42
54
|
.u-tree__checkbox {
|
|
43
55
|
height: fit-content;
|
|
44
56
|
flex-shrink: 0;
|
|
@@ -52,6 +64,9 @@
|
|
|
52
64
|
left: 0;
|
|
53
65
|
width: 100%;
|
|
54
66
|
}
|
|
67
|
+
.u-tree__wrap:not(.is-virtual) .u-tree__node + .u-tree__wrap:not(.is-virtual) .u-tree__node {
|
|
68
|
+
margin-top: 2px;
|
|
69
|
+
}
|
|
55
70
|
.u-tree.is-selectable .u-tree__node:not(.is-disabled) .u-tree__node-content:hover {
|
|
56
71
|
background-color: var(--u-bg-color-hover);
|
|
57
72
|
}
|
|
@@ -59,17 +74,27 @@
|
|
|
59
74
|
background-color: var(--u-bg-color-hover);
|
|
60
75
|
}
|
|
61
76
|
.u-tree__node {
|
|
77
|
+
position: relative;
|
|
62
78
|
cursor: pointer;
|
|
63
|
-
margin-bottom: 0.2rem;
|
|
64
79
|
display: flex;
|
|
65
80
|
justify-content: flex-start;
|
|
66
81
|
align-items: center;
|
|
67
82
|
flex-wrap: nowrap;
|
|
68
83
|
}
|
|
84
|
+
.u-tree__node.is-selected::before {
|
|
85
|
+
content: "";
|
|
86
|
+
position: absolute;
|
|
87
|
+
left: 0;
|
|
88
|
+
top: 4px;
|
|
89
|
+
bottom: 4px;
|
|
90
|
+
width: 3px;
|
|
91
|
+
border-radius: 3px;
|
|
92
|
+
background-color: var(--u-color-primary);
|
|
93
|
+
}
|
|
69
94
|
.u-tree__node.is-selected .u-tree__node-content {
|
|
70
|
-
background-color: var(--u-color-primary-light-9)
|
|
95
|
+
background-color: var(--u-color-primary-light-9);
|
|
71
96
|
color: var(--u-color-primary);
|
|
72
|
-
font-weight:
|
|
97
|
+
font-weight: 500;
|
|
73
98
|
}
|
|
74
99
|
.u-tree__node.is-expanded .u-tree__expand-icon {
|
|
75
100
|
transform: rotate(90deg);
|
|
@@ -80,48 +105,45 @@
|
|
|
80
105
|
.u-tree__node.is-disabled .u-tree__node-content {
|
|
81
106
|
color: var(--u-text-color-disabled);
|
|
82
107
|
}
|
|
83
|
-
.u-
|
|
108
|
+
.u-tree__node.is-disabled .u-tree__node-content:hover {
|
|
109
|
+
background-color: transparent;
|
|
110
|
+
}
|
|
111
|
+
.u-tree__indent {
|
|
84
112
|
flex-shrink: 0;
|
|
85
113
|
width: 20px;
|
|
86
|
-
|
|
114
|
+
}
|
|
115
|
+
.u-tree__indent__indent--leaf {
|
|
116
|
+
width: 20px;
|
|
87
117
|
}
|
|
88
118
|
.u-tree__expand-icon {
|
|
89
119
|
cursor: pointer;
|
|
90
|
-
transition: transform 0.2s, background-color 0.2s;
|
|
91
120
|
flex-shrink: 0;
|
|
121
|
+
width: 20px;
|
|
122
|
+
height: 20px;
|
|
92
123
|
font-size: 20px;
|
|
93
124
|
border-radius: 50%;
|
|
125
|
+
transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1);
|
|
94
126
|
}
|
|
95
127
|
.u-tree__expand-icon:hover {
|
|
96
|
-
background-color: var(--u-color-
|
|
97
|
-
}
|
|
98
|
-
.u-tree__icon-placeholder {
|
|
99
|
-
padding: 5px;
|
|
100
|
-
}
|
|
101
|
-
.u-tree__icon-placeholder::before {
|
|
102
|
-
content: "";
|
|
103
|
-
box-sizing: border-box;
|
|
104
|
-
width: 100%;
|
|
105
|
-
height: 100%;
|
|
106
|
-
display: block;
|
|
107
|
-
border-radius: 50%;
|
|
108
|
-
border: 2px solid var(--u-text-color-main);
|
|
128
|
+
background-color: var(--u-bg-color-hover);
|
|
109
129
|
}
|
|
110
130
|
.u-tree__node-content {
|
|
111
131
|
flex-grow: 1;
|
|
112
132
|
overflow: hidden;
|
|
113
133
|
user-select: none;
|
|
114
|
-
word-break: break-
|
|
115
|
-
transition: background-color 0.
|
|
134
|
+
word-break: break-word;
|
|
135
|
+
transition: background-color 0.2s ease;
|
|
116
136
|
display: flex;
|
|
117
137
|
justify-content: flex-start;
|
|
118
138
|
align-items: center;
|
|
119
139
|
flex-wrap: nowrap;
|
|
120
140
|
}
|
|
121
141
|
.u-tree__ripple {
|
|
122
|
-
background-color: var(--u-color-primary-light-
|
|
123
|
-
opacity: 0.
|
|
142
|
+
background-color: var(--u-color-primary-light-5);
|
|
143
|
+
opacity: 0.25;
|
|
124
144
|
}
|
|
125
145
|
.u-tree__empty {
|
|
126
146
|
text-align: center;
|
|
147
|
+
padding: var(--u-gap-default) 0;
|
|
148
|
+
color: var(--u-text-color-secondary);
|
|
127
149
|
}
|
|
@@ -2,8 +2,8 @@ import _sfc_main$1 from "../icon/icon.js";
|
|
|
2
2
|
import NodeRender from "../node-render/node-render.js";
|
|
3
3
|
import _sfc_main$2 from "../checkbox/checkbox.js";
|
|
4
4
|
import { TreeDIKey } from "./di.js";
|
|
5
|
-
import { createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, inject, normalizeClass,
|
|
6
|
-
import { bem
|
|
5
|
+
import { Fragment, createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, inject, normalizeClass, openBlock, renderList, unref, withCtx, withDirectives, withModifiers } from "vue";
|
|
6
|
+
import { bem } from "@veltra/utils";
|
|
7
7
|
import { vRipple } from "@veltra/directives";
|
|
8
8
|
import { ArrowRight } from "@veltra/icons/normal";
|
|
9
9
|
//#region src/components/tree/tree-node.vue
|
|
@@ -12,11 +12,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
12
12
|
__name: "tree-node",
|
|
13
13
|
props: {
|
|
14
14
|
node: {},
|
|
15
|
+
index: {},
|
|
15
16
|
measureElement: { type: Function }
|
|
16
17
|
},
|
|
17
18
|
setup(__props) {
|
|
18
19
|
const props = __props;
|
|
19
20
|
const { treeProps, treeEmit, cls, getTreeSlotsNode, getFlattedNodes, toggleCheck, handleSelect } = inject(TreeDIKey);
|
|
21
|
+
function measureRef(el) {
|
|
22
|
+
if (typeof props.index !== "number" || !props.measureElement) return;
|
|
23
|
+
props.measureElement(props.index, el);
|
|
24
|
+
}
|
|
20
25
|
function toggleExpand() {
|
|
21
26
|
const { node } = props;
|
|
22
27
|
node.expanded = !node.expanded;
|
|
@@ -40,39 +45,49 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
40
45
|
unref(bem).is("expanded", __props.node.expanded),
|
|
41
46
|
unref(bem).is("disabled", __props.node.disabled)
|
|
42
47
|
]),
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
48
|
+
ref: measureRef
|
|
49
|
+
}, [
|
|
50
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.node.depth, (i) => {
|
|
51
|
+
return openBlock(), createElementBlock("span", {
|
|
52
|
+
key: i,
|
|
53
|
+
class: normalizeClass(unref(cls).e("indent")),
|
|
54
|
+
"aria-hidden": "true"
|
|
55
|
+
}, null, 2);
|
|
56
|
+
}), 128)),
|
|
57
|
+
!__props.node.isLeaf ? (openBlock(), createBlock(unref(_sfc_main$1), {
|
|
58
|
+
key: 0,
|
|
59
|
+
class: normalizeClass(unref(cls).e("expand-icon")),
|
|
60
|
+
onClick: withModifiers(toggleExpand, ["stop"])
|
|
61
|
+
}, {
|
|
62
|
+
default: withCtx(() => [createVNode(unref(ArrowRight))]),
|
|
63
|
+
_: 1
|
|
64
|
+
}, 8, ["class"])) : (openBlock(), createElementBlock("i", {
|
|
65
|
+
key: 1,
|
|
66
|
+
class: normalizeClass([unref(cls).e("indent"), unref(cls).em("indent", "leaf")]),
|
|
67
|
+
"aria-hidden": "true"
|
|
68
|
+
}, null, 2)),
|
|
69
|
+
withDirectives((openBlock(), createElementBlock("div", {
|
|
70
|
+
class: normalizeClass(unref(cls).e("node-content")),
|
|
71
|
+
onClick: handleClick,
|
|
72
|
+
onContextmenu: _cache[1] || (_cache[1] = ($event) => unref(treeEmit)("node-contextmenu", $event, __props.node))
|
|
73
|
+
}, [unref(treeProps).checkable ? (openBlock(), createBlock(_sfc_main$2, {
|
|
74
|
+
key: 0,
|
|
75
|
+
class: normalizeClass(unref(cls).e("checkbox")),
|
|
76
|
+
"model-value": __props.node.checked,
|
|
77
|
+
indeterminate: __props.node.indeterminate,
|
|
78
|
+
disabled: __props.node.disabled,
|
|
79
|
+
onChange: handleChange,
|
|
80
|
+
onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"]))
|
|
81
|
+
}, null, 8, [
|
|
82
|
+
"class",
|
|
83
|
+
"model-value",
|
|
84
|
+
"indeterminate",
|
|
85
|
+
"disabled"
|
|
86
|
+
])) : createCommentVNode("v-if", true), createVNode(unref(NodeRender), { content: unref(getTreeSlotsNode)({
|
|
87
|
+
node: __props.node,
|
|
88
|
+
data: __props.node.data
|
|
89
|
+
}) }, null, 8, ["content"])], 34)), [[unref(vRipple), (unref(treeProps).checkable || unref(treeProps).selectable) && !__props.node.disabled ? unref(cls).e("ripple") : false]])
|
|
90
|
+
], 2);
|
|
76
91
|
};
|
|
77
92
|
}
|
|
78
93
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-node.js","names":[],"sources":["../../../src/components/tree/tree-node.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.e('node'), bem.is('expanded', node.expanded), bem.is('disabled', node.disabled)]\"\n :
|
|
1
|
+
{"version":3,"file":"tree-node.js","names":[],"sources":["../../../src/components/tree/tree-node.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.e('node'), bem.is('expanded', node.expanded), bem.is('disabled', node.disabled)]\"\n :ref=\"measureRef\"\n >\n <span v-for=\"i in node.depth\" :key=\"i\" :class=\"cls.e('indent')\" aria-hidden=\"true\"></span>\n\n <u-icon v-if=\"!node.isLeaf\" :class=\"cls.e('expand-icon')\" @click.stop=\"toggleExpand\">\n <ArrowRight />\n </u-icon>\n <i v-else :class=\"[cls.e('indent'), cls.em('indent', 'leaf')]\" aria-hidden=\"true\"></i>\n\n <div\n :class=\"cls.e('node-content')\"\n @click=\"handleClick\"\n @contextmenu=\"treeEmit('node-contextmenu', $event, node)\"\n v-ripple=\"\n (treeProps.checkable || treeProps.selectable) && !node.disabled ? cls.e('ripple') : false\n \"\n >\n <u-checkbox\n v-if=\"treeProps.checkable\"\n :class=\"cls.e('checkbox')\"\n :model-value=\"node.checked\"\n :indeterminate=\"node.indeterminate\"\n :disabled=\"node.disabled\"\n @change=\"handleChange\"\n @click.stop\n />\n\n <u-node-render :content=\"getTreeSlotsNode({ node, data: node.data })\" />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { vRipple } from '@veltra/directives'\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { inject } from 'vue'\n\nimport type { TreeNodeProps } from '../../types'\nimport UCheckbox from '../checkbox/checkbox.vue'\nimport { UIcon } from '../icon'\nimport { UNodeRender } from '../node-render'\nimport { TreeDIKey } from './di'\n\ndefineOptions({\n name: 'TreeNode'\n})\n\nconst props = defineProps<TreeNodeProps>()\n\nconst { treeProps, treeEmit, cls, getTreeSlotsNode, getFlattedNodes, toggleCheck, handleSelect } =\n inject(TreeDIKey)!\n\nfunction measureRef(el: unknown) {\n if (typeof props.index !== 'number' || !props.measureElement) return\n props.measureElement(props.index, el as Element | null)\n}\n\nfunction toggleExpand() {\n const { node } = props\n node.expanded = !node.expanded\n getFlattedNodes()\n\n treeEmit('expand', node)\n}\n\nfunction handleChange(checked: boolean, e: MouseEvent) {\n toggleCheck(props.node, checked, e.ctrlKey)\n}\n\nfunction handleClick(e: MouseEvent) {\n const { node } = props\n treeEmit('node-click', node)\n\n treeProps.selectable && handleSelect(node)\n treeProps.expandOnClickNode && toggleExpand()\n treeProps.checkable &&\n !node.disabled &&\n !treeProps.expandOnClickNode &&\n toggleCheck(node, !node.checked, e.ctrlKey)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAmDA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,UAAU,KAAK,kBAAkB,iBAAiB,aAAa,iBAChF,OAAO,UAAU;EAEnB,SAAS,WAAW,IAAa;AAC/B,OAAI,OAAO,MAAM,UAAU,YAAY,CAAC,MAAM,eAAgB;AAC9D,SAAM,eAAe,MAAM,OAAO,GAAoB;;EAGxD,SAAS,eAAe;GACtB,MAAM,EAAE,SAAS;AACjB,QAAK,WAAW,CAAC,KAAK;AACtB,oBAAgB;AAEhB,YAAS,UAAU,KAAI;;EAGzB,SAAS,aAAa,SAAkB,GAAe;AACrD,eAAY,MAAM,MAAM,SAAS,EAAE,QAAO;;EAG5C,SAAS,YAAY,GAAe;GAClC,MAAM,EAAE,SAAS;AACjB,YAAS,cAAc,KAAI;AAE3B,aAAU,cAAc,aAAa,KAAI;AACzC,aAAU,qBAAqB,cAAa;AAC5C,aAAU,aACR,CAAC,KAAK,YACN,CAAC,UAAU,qBACX,YAAY,MAAM,CAAC,KAAK,SAAS,EAAE,QAAO;;;uBAjF5C,mBA+BM,OAAA;IA9BH,OAAK,eAAA;KAAG,MAAA,IAAG,CAAC,EAAC,OAAA;KAAU,MAAA,IAAG,CAAC,GAAE,YAAa,QAAA,KAAK,SAAQ;KAAG,MAAA,IAAG,CAAC,GAAE,YAAa,QAAA,KAAK,SAAQ;KAAA,CAAA;IAC1F,KAAK;;sBAEN,mBAA0F,UAAA,MAAA,WAAxE,QAAA,KAAK,QAAV,MAAC;yBAAd,mBAA0F,QAAA;MAA3D,KAAK;MAAI,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,SAAA,CAAA;MAAY,eAAY;;;KAE7D,QAAA,KAAK,UAAA,WAAA,EAApB,YAES,MAAA,YAAA,EAAA;;KAFoB,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,cAAA,CAAA;KAAkB,SAAK,cAAO,cAAY,CAAA,OAAA,CAAA;;4BACnE,CAAd,YAAc,MAAA,WAAA,CAAA,CAAA,CAAA;;sCAEhB,mBAAsF,KAAA;;KAA3E,OAAK,eAAA,CAAG,MAAA,IAAG,CAAC,EAAC,SAAA,EAAY,MAAA,IAAG,CAAC,GAAE,UAAA,OAAA,CAAA,CAAA;KAAqB,eAAY;;iCAE3E,mBAmBM,OAAA;KAlBH,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,eAAA,CAAA;KACZ,SAAO;KACP,eAAW,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,SAAQ,CAAA,oBAAqB,QAAQ,QAAA,KAAI;QAM/C,MAAA,UAAS,CAAC,aAAA,WAAA,EADlB,YAQE,aAAA;;KANC,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,WAAA,CAAA;KACZ,eAAa,QAAA,KAAK;KAClB,eAAe,QAAA,KAAK;KACpB,UAAU,QAAA,KAAK;KACf,UAAQ;KACR,SAAK,OAAA,OAAA,OAAA,KAAA,oBAAN,IAAW,CAAA,OAAA,CAAA;;;;;;4CAGb,YAAwE,MAAA,WAAA,EAAA,EAAxD,SAAS,MAAA,iBAAgB,CAAA;KAAA,MAAG,QAAA;KAAI,MAAQ,QAAA,KAAK;KAAI,CAAA,EAAA,EAAA,MAAA,GAAA,CAAA,UAAA,CAAA,CAAA,EAAA,GAAA,GAAA,CAAA,CAAA,MAAA,QAAA,GAd7C,MAAA,UAAS,CAAC,aAAa,MAAA,UAAS,CAAC,eAAU,CAAM,QAAA,KAAK,WAAW,MAAA,IAAG,CAAC,EAAC,SAAA,GAAA,MAAA,CAAA,CAAA"}
|
|
@@ -7,8 +7,8 @@ import { useFilter } from "./use-filter.js";
|
|
|
7
7
|
import { useSelect } from "./use-select.js";
|
|
8
8
|
import { useTreeNodes } from "./use-tree-nodes.js";
|
|
9
9
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, provide, renderList, shallowRef, unref, useSlots, watch, watchEffect, withCtx } from "vue";
|
|
10
|
-
import { bem, nextFrame, scrollIntoContainerView
|
|
11
|
-
import { useFormComponent, useFormFallbackProps,
|
|
10
|
+
import { bem, nextFrame, scrollIntoContainerView } from "@veltra/utils";
|
|
11
|
+
import { useFormComponent, useFormFallbackProps, useVirtualizer } from "@veltra/compositions";
|
|
12
12
|
//#region src/components/tree/tree.vue
|
|
13
13
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
14
14
|
name: "Tree",
|
|
@@ -87,25 +87,38 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
87
87
|
nodeDict,
|
|
88
88
|
getFlattedNodes
|
|
89
89
|
});
|
|
90
|
-
const
|
|
90
|
+
const estimateSize = () => {
|
|
91
|
+
switch (size.value) {
|
|
92
|
+
case "small": return 32;
|
|
93
|
+
case "large": return 44;
|
|
94
|
+
default: return 36;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const virtualEnabled = computed(() => nodes.value.length > 80);
|
|
98
|
+
const { virtualizer, items } = useVirtualizer({
|
|
91
99
|
count: computed(() => nodes.value.length),
|
|
92
|
-
|
|
100
|
+
scrollEl: () => scrollRef.value?.containerRef ?? null,
|
|
101
|
+
contentEl: () => virtualEnabled.value ? scrollRef.value?.contentRef ?? null : null,
|
|
102
|
+
estimateSize,
|
|
93
103
|
gap: 2,
|
|
94
|
-
|
|
95
|
-
scrollEl: computed(() => scrollRef.value?.containerRef ?? null)
|
|
104
|
+
getItemKey: (i) => nodes.value[i]?.key ?? i
|
|
96
105
|
});
|
|
97
106
|
const virtualNodes = computed(() => {
|
|
98
107
|
const _nodes = nodes.value;
|
|
99
|
-
return
|
|
108
|
+
return items.value.map((item) => {
|
|
100
109
|
const node = _nodes[item.index];
|
|
101
110
|
return {
|
|
102
111
|
node,
|
|
103
|
-
key: node
|
|
112
|
+
key: node?.key ?? item.index,
|
|
104
113
|
offset: item.start,
|
|
105
114
|
index: item.index
|
|
106
115
|
};
|
|
107
116
|
});
|
|
108
117
|
});
|
|
118
|
+
const measureElement = (index, el) => virtualizer.measureElement(index, el);
|
|
119
|
+
function scrollTo(index) {
|
|
120
|
+
virtualizer.scrollToIndex(index, { align: "center" });
|
|
121
|
+
}
|
|
109
122
|
function scrollIntoView() {
|
|
110
123
|
const { selectable, checkable, scrollToView } = props;
|
|
111
124
|
if (!scrollToView || !selectable && !checkable || !nodes.value) return;
|
|
@@ -176,22 +189,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
176
189
|
class: normalizeClass(className.value),
|
|
177
190
|
ref_key: "scrollRef",
|
|
178
191
|
ref: scrollRef,
|
|
179
|
-
"content-
|
|
180
|
-
"content-class": [unref(cls).e("wrap"), unref(bem).is("virtual", unref(virtualEnabled))]
|
|
192
|
+
"content-class": [unref(cls).e("wrap"), unref(bem).is("virtual", virtualEnabled.value)]
|
|
181
193
|
}, {
|
|
182
|
-
default: withCtx(() => [
|
|
194
|
+
default: withCtx(() => [virtualEnabled.value ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(virtualNodes.value, ({ node, key, offset, index }) => {
|
|
183
195
|
return openBlock(), createBlock(_sfc_main$3, {
|
|
184
196
|
node,
|
|
185
197
|
key,
|
|
186
198
|
class: normalizeClass(unref(bem).is("selected", node.data === unref(selectedData))),
|
|
187
|
-
|
|
188
|
-
"measure-element":
|
|
199
|
+
index,
|
|
200
|
+
"measure-element": measureElement,
|
|
189
201
|
style: normalizeStyle({ transform: `translateY(${offset}px)` })
|
|
190
202
|
}, null, 8, [
|
|
191
203
|
"node",
|
|
192
204
|
"class",
|
|
193
|
-
"
|
|
194
|
-
"measure-element",
|
|
205
|
+
"index",
|
|
195
206
|
"style"
|
|
196
207
|
]);
|
|
197
208
|
}), 128)) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(unref(nodes), (node) => {
|
|
@@ -205,11 +216,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
205
216
|
class: normalizeClass(unref(cls).e("empty"))
|
|
206
217
|
}, [createVNode(unref(_sfc_main$2))], 2)) : createCommentVNode("v-if", true)]),
|
|
207
218
|
_: 1
|
|
208
|
-
}, 8, [
|
|
209
|
-
"class",
|
|
210
|
-
"content-style",
|
|
211
|
-
"content-class"
|
|
212
|
-
]);
|
|
219
|
+
}, 8, ["class", "content-class"]);
|
|
213
220
|
};
|
|
214
221
|
}
|
|
215
222
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","names":[],"sources":["../../../src/components/tree/tree.vue"],"sourcesContent":["<template>\n <u-scroll\n :class=\"className\"\n ref=\"scrollRef\"\n :content-
|
|
1
|
+
{"version":3,"file":"tree.js","names":[],"sources":["../../../src/components/tree/tree.vue"],"sourcesContent":["<template>\n <u-scroll\n :class=\"className\"\n ref=\"scrollRef\"\n :content-class=\"[cls.e('wrap'), bem.is('virtual', virtualEnabled)]\"\n >\n <template v-if=\"virtualEnabled\">\n <UTreeNode\n v-for=\"{ node, key, offset, index } of virtualNodes\"\n :node=\"node\"\n :key=\"key\"\n :class=\"bem.is('selected', node.data === selectedData)\"\n :index=\"index\"\n :measure-element=\"measureElement\"\n :style=\"{ transform: `translateY(${offset}px)` }\"\n />\n </template>\n <template v-else>\n <UTreeNode\n v-for=\"node of nodes\"\n :node=\"node\"\n :key=\"node.key\"\n :class=\"bem.is('selected', node.data === selectedData)\"\n />\n </template>\n\n <div :class=\"cls.e('empty')\" v-if=\"!nodes.length\">\n <UEmpty />\n </div>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormComponent, useFormFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { bem, nextFrame, scrollIntoContainerView } from '@veltra/utils'\nimport { computed, provide, shallowRef, useSlots, watch, watchEffect, type VNode } from 'vue'\n\nimport type { TreeProps, TreeEmit, _TreeExposed } from '../../types'\nimport type { ScrollExposed } from '../../types'\nimport { UEmpty } from '../empty'\nimport { UScroll } from '../scroll'\nimport { TreeDIKey, type TreeConText, type TreeSlotsScope } from './di'\nimport UTreeNode from './tree-node.vue'\nimport { useCheck } from './use-check'\nimport { useFilter } from './use-filter'\nimport { useSelect } from './use-select'\nimport { useTreeNodes } from './use-tree-nodes'\n\ndefineOptions({\n name: 'Tree'\n})\n\nconst props = withDefaults(defineProps<TreeProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n childrenKey: 'children',\n expandOnClickNode: false,\n checkStrictly: false,\n data: () => []\n})\n\nconst emit = defineEmits<TreeEmit>()\n\nconst cls = bem('tree')\n\nconst { formProps } = useFormComponent()\n\nconst { size } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default'\n})\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('selectable', props.selectable),\n bem.is('checkable', props.checkable)\n ]\n})\n\ndefineSlots<{\n default: (props: TreeSlotsScope) => any\n}>()\n\nconst slots = useSlots()\n\nfunction getTreeSlotsNode(ctx: TreeSlotsScope): VNode[] | string | undefined {\n return (props.slots?.default ?? slots.default)?.(ctx) ?? ctx.node.label\n}\n\nconst { nodes, forest, getFlattedNodes, nodeDict } = useTreeNodes({\n props\n})\n\nwatch(\n [() => props.selectable, () => props.checkable, forest],\n ([s, c]) => {\n // 如果选择或勾选,则不更新节点\n if (s || c) return\n getFlattedNodes()\n },\n { immediate: true }\n)\n\nconst { filter } = useFilter({ forest, getFlattedNodes })\n\nconst { handleSelect, selectedData } = useSelect({\n props,\n emit,\n nodeDict,\n getFlattedNodes\n})\n\nconst { checkedData, toggleCheck } = useCheck({\n props,\n emit,\n nodeDict,\n getFlattedNodes\n})\n\nconst estimateSize = (): number => {\n // 基于 style.scss 中节点稳态高度推算的默认值;\n // 实际高度仍由 `measureElement` 通过 ResizeObserver 回填覆盖。\n switch (size.value) {\n case 'small':\n return 32\n case 'large':\n return 44\n default:\n return 36\n }\n}\n\n// 80 阈值内化为消费者侧语义;低于此值时不启用虚拟化。\nconst virtualEnabled = computed(() => nodes.value.length > 80)\n\nconst { virtualizer, items } = useVirtualizer({\n count: computed(() => nodes.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n // 仅在虚拟化启用时把内容容器的 height 撑开到 totalSize;\n // 关闭时传 null,hook 会清除此前写入的内联 height,回到 CSS 默认。\n contentEl: () => (virtualEnabled.value ? (scrollRef.value?.contentRef ?? null) : null),\n estimateSize,\n gap: 2,\n // 以节点稳定 key 作为虚拟项身份,展开 / 收起 / 过滤引起的 nodes 数组变更\n // 保留未移动节点的真实测量值,避免再次滚动首屏抖动。\n getItemKey: (i) => nodes.value[i]?.key ?? i\n})\n\n// 身份稳定性已由底层 `getItemKey` 保证;直接以 `node.key` 作为 Vue 层 key。\n// `item.index` 仅作为 nodes / snapshot 竞态边缘的 fallback。\nconst virtualNodes = computed(() => {\n const _nodes = nodes.value\n return items.value.map((item) => {\n const node = _nodes[item.index]!\n return {\n node,\n key: node?.key ?? item.index,\n offset: item.start,\n index: item.index\n }\n })\n})\n\nconst measureElement: (index: number, el: Element | null) => void = (index, el) =>\n virtualizer.measureElement(index, el)\n\nfunction scrollTo(index: number): void {\n virtualizer.scrollToIndex(index, { align: 'center' })\n}\n\nfunction scrollIntoView() {\n const { selectable, checkable, scrollToView } = props\n if (!scrollToView || (!selectable && !checkable) || !nodes.value) return\n let index = -1\n\n if (selectable) {\n if (!selectedData.value) return\n index = nodes.value.findIndex((node) => node.data === selectedData.value)\n } else if (checkable) {\n if (!checkedData.size) return\n index = nodes.value.findIndex((node) => checkedData.has(node.data))\n }\n\n if (virtualEnabled.value) {\n scrollTo(index)\n } else {\n const { contentRef, containerRef } = scrollRef.value ?? {}\n const el = contentRef?.children[index]\n el && scrollIntoContainerView(el as HTMLElement, containerRef ?? null)\n }\n}\n\nwatchEffect(() => {\n nextFrame(() => {\n scrollIntoView()\n })\n})\n\nprovide(TreeDIKey, {\n cls,\n selectedData,\n checkedData,\n getFlattedNodes,\n getTreeSlotsNode,\n treeEmit: emit as TreeEmit,\n treeProps: props as TreeProps,\n toggleCheck: toggleCheck as TreeConText['toggleCheck'],\n handleSelect: handleSelect as TreeConText['handleSelect']\n})\n\ndefineExpose<_TreeExposed>({\n filter,\n forest,\n nodes,\n checkNode: toggleCheck,\n selectNode: handleSelect,\n checkAll(check: boolean) {\n forest.value.roots.forEach((node) => {\n toggleCheck(node, check)\n })\n },\n getSelected() {\n return selectedData\n },\n getChecked() {\n return Array.from(checkedData)\n },\n scrollTo,\n\n expandAll() {\n forest.value.dfs((node) => {\n node.expanded = true\n })\n getFlattedNodes()\n },\n collapseAll() {\n forest.value.dfs((node) => {\n node.expanded = false\n })\n getFlattedNodes()\n }\n})\n</script>\n"],"mappings":"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"}
|
|
@@ -24,8 +24,8 @@ declare const __VLS_base: _$vue.DefineComponent<TreeProps, _TreeExposed, {}, {},
|
|
|
24
24
|
labelKey: string;
|
|
25
25
|
valueKey: string;
|
|
26
26
|
data: Record<string, any>[];
|
|
27
|
-
childrenKey: string;
|
|
28
27
|
expandOnClickNode: boolean;
|
|
28
|
+
childrenKey: string;
|
|
29
29
|
checkStrictly: boolean;
|
|
30
30
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
31
31
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|