@flowgram-vue/renderer 0.2.0
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/LICENSE +22 -0
- package/dist/index.cjs +2933 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +721 -0
- package/dist/index.js +2918 -0
- package/dist/index.js.map +1 -0
- package/index.module.less +167 -0
- package/package.json +64 -0
- package/src/components/Adder.ts +107 -0
- package/src/components/BranchDraggableRenderer.ts +77 -0
- package/src/components/Collapse.ts +87 -0
- package/src/components/CollapseAdder.ts +94 -0
- package/src/components/CustomLine.ts +35 -0
- package/src/components/LabelsRenderer.ts +162 -0
- package/src/components/LinesRenderer.ts +99 -0
- package/src/components/MarkerActivatedArrow.ts +44 -0
- package/src/components/MarkerArrow.ts +44 -0
- package/src/components/RoundedTurningLine.ts +165 -0
- package/src/components/StraightLine.ts +31 -0
- package/src/components/utils.ts +295 -0
- package/src/entities/README.md +3 -0
- package/src/entities/flow-drag-entity.ts +267 -0
- package/src/entities/flow-select-config-entity.ts +114 -0
- package/src/entities/index.ts +8 -0
- package/src/entities/selector-box-config-entity.ts +88 -0
- package/src/env.d.ts +10 -0
- package/src/flow-renderer-container-module.ts +14 -0
- package/src/flow-renderer-contribution.ts +12 -0
- package/src/flow-renderer-registry.ts +155 -0
- package/src/flow-renderer-resize-observer.ts +56 -0
- package/src/hooks/use-base-color.ts +26 -0
- package/src/index.ts +16 -0
- package/src/layer-vue-provide.ts +44 -0
- package/src/layers/flow-context-menu-layer.ts +153 -0
- package/src/layers/flow-debug-layer.ts +227 -0
- package/src/layers/flow-drag-layer.ts +413 -0
- package/src/layers/flow-labels-layer.ts +100 -0
- package/src/layers/flow-lines-layer.ts +111 -0
- package/src/layers/flow-nodes-content-layer.ts +155 -0
- package/src/layers/flow-nodes-transform-layer.ts +151 -0
- package/src/layers/flow-scroll-bar-layer.ts +401 -0
- package/src/layers/flow-scroll-limit-layer.ts +36 -0
- package/src/layers/flow-selector-bounds-layer.ts +191 -0
- package/src/layers/flow-selector-box-layer.ts +244 -0
- package/src/layers/index.ts +16 -0
- package/src/utils/element.ts +36 -0
- package/src/utils/find-selected-nodes.ts +80 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/scroll-bar-events.ts +13 -0
- package/src/utils/scroll-limit.ts +58 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
:root {
|
|
7
|
+
--g-selection-background: #336df4;
|
|
8
|
+
--g-editor-background: #f2f3f5;
|
|
9
|
+
--g-playground-select: var(--g-selection-background);
|
|
10
|
+
--g-playground-hover: var(--g-selection-background);
|
|
11
|
+
--g-playground-line: var(--g-selection-background);
|
|
12
|
+
--g-playground-blur: #999;
|
|
13
|
+
--g-playground-ruler-select: #3794ff;
|
|
14
|
+
--g-playground-selectBox-outline: var(--g-selection-background);
|
|
15
|
+
--g-playground-selectBox-background: rgba(51, 109, 244, 0.1);
|
|
16
|
+
--g-playground-select-hover-background: rgba(51, 109, 244, 0.1);
|
|
17
|
+
--g-playground-select-control-size: 12px;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
:global {
|
|
21
|
+
.gedit-playground {
|
|
22
|
+
position: absolute;
|
|
23
|
+
width: 100%;
|
|
24
|
+
height: 100%;
|
|
25
|
+
left: 0;
|
|
26
|
+
top: 0;
|
|
27
|
+
z-index: 10;
|
|
28
|
+
overflow: hidden;
|
|
29
|
+
user-select: none;
|
|
30
|
+
outline: none;
|
|
31
|
+
box-sizing: border-box;
|
|
32
|
+
background-color: var(--g-editor-background);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.gedit-playground-scroll-right {
|
|
36
|
+
position: absolute;
|
|
37
|
+
right: 2px;
|
|
38
|
+
height: 100vh;
|
|
39
|
+
width: 7px;
|
|
40
|
+
z-index: 10;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.gedit-playground-scroll-bottom {
|
|
44
|
+
position: absolute;
|
|
45
|
+
bottom: 2px;
|
|
46
|
+
width: 100vw;
|
|
47
|
+
height: 7px;
|
|
48
|
+
z-index: 10;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.gedit-playground-scroll-right-block {
|
|
52
|
+
position: absolute;
|
|
53
|
+
opacity: 0.3;
|
|
54
|
+
border-radius: 3.5px;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.gedit-playground-scroll-right-block:hover {
|
|
58
|
+
opacity: 0.6;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.gedit-playground-scroll-bottom-block {
|
|
62
|
+
position: absolute;
|
|
63
|
+
opacity: 0.3;
|
|
64
|
+
border-radius: 3.5px;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.gedit-playground-scroll-bottom-block:hover {
|
|
68
|
+
opacity: 0.6;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.gedit-playground-scroll-hidden {
|
|
72
|
+
opacity: 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.gedit-playground * {
|
|
76
|
+
box-sizing: border-box;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.gedit-playground-loading {
|
|
80
|
+
position: absolute;
|
|
81
|
+
color: white;
|
|
82
|
+
left: 50%;
|
|
83
|
+
top: 50%;
|
|
84
|
+
z-index: 100;
|
|
85
|
+
display: flex;
|
|
86
|
+
justify-content: center;
|
|
87
|
+
align-items: center;
|
|
88
|
+
transition: opacity 0.8s;
|
|
89
|
+
flex-direction: column;
|
|
90
|
+
text-align: center;
|
|
91
|
+
opacity: 0.8;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.gedit-hidden {
|
|
95
|
+
display: none;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.gedit-playground-pipeline {
|
|
99
|
+
position: absolute;
|
|
100
|
+
overflow: visible;
|
|
101
|
+
width: 100%;
|
|
102
|
+
height: 100%;
|
|
103
|
+
left: 0;
|
|
104
|
+
top: 0;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.gedit-playground-pipeline::before {
|
|
108
|
+
content: '';
|
|
109
|
+
position: absolute;
|
|
110
|
+
width: 1px;
|
|
111
|
+
height: 100%;
|
|
112
|
+
left: 0;
|
|
113
|
+
top: 0;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.gedit-playground-layer {
|
|
117
|
+
position: absolute;
|
|
118
|
+
overflow: visible;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.gedit-selector-box {
|
|
122
|
+
position: absolute;
|
|
123
|
+
left: 0;
|
|
124
|
+
top: 0;
|
|
125
|
+
width: 0;
|
|
126
|
+
height: 0;
|
|
127
|
+
z-index: 33;
|
|
128
|
+
outline: 1px solid var(--g-playground-selectBox-outline);
|
|
129
|
+
background-color: var(--g-playground-selectBox-background);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.gedit-selector-box-block {
|
|
133
|
+
position: absolute;
|
|
134
|
+
left: 0;
|
|
135
|
+
top: 0;
|
|
136
|
+
width: 0;
|
|
137
|
+
height: 0;
|
|
138
|
+
z-index: 9999;
|
|
139
|
+
display: none;
|
|
140
|
+
background-color: rgba(0, 0, 0, 0);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.gedit-selector-bounds-background {
|
|
144
|
+
position: absolute;
|
|
145
|
+
left: 0;
|
|
146
|
+
top: 0;
|
|
147
|
+
width: 0;
|
|
148
|
+
height: 0;
|
|
149
|
+
outline: 1px solid var(--g-playground-selectBox-outline);
|
|
150
|
+
background-color: #f0f4ff;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.gedit-selector-bounds-foreground {
|
|
154
|
+
position: absolute;
|
|
155
|
+
left: 0;
|
|
156
|
+
top: 0;
|
|
157
|
+
width: 0;
|
|
158
|
+
height: 0;
|
|
159
|
+
z-index: 33;
|
|
160
|
+
background: rgba(255, 255, 255, 0);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.gedit-flow-activity-node {
|
|
164
|
+
position: absolute;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flowgram-vue/renderer",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://flowgram.ai/",
|
|
7
|
+
"repository": "https://github.com/Crayon-hua/flowgram-vue",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"main": "./dist/index.cjs",
|
|
16
|
+
"module": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"files": [
|
|
19
|
+
"src",
|
|
20
|
+
"dist",
|
|
21
|
+
"index.module.less"
|
|
22
|
+
],
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"inversify": "^6.0.1",
|
|
25
|
+
"lodash-es": "^4.17.21",
|
|
26
|
+
"reflect-metadata": "~0.2.2",
|
|
27
|
+
"@flowgram-vue/i18n": "0.2.0",
|
|
28
|
+
"@flowgram-vue/document": "0.2.0",
|
|
29
|
+
"@flowgram-vue/core": "0.2.0",
|
|
30
|
+
"@flowgram-vue/utils": "0.2.0"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"vue": "^3.3.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/lodash-es": "^4.17.12",
|
|
37
|
+
"@types/node": "^20",
|
|
38
|
+
"@vitejs/plugin-vue": "^6.0.1",
|
|
39
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
40
|
+
"@vue/test-utils": "^2.4.6",
|
|
41
|
+
"eslint": "^9.0.0",
|
|
42
|
+
"jsdom": "^26.1.0",
|
|
43
|
+
"typescript": "^5.8.3",
|
|
44
|
+
"vitest": "^3.2.4",
|
|
45
|
+
"vue": "^3.5.18",
|
|
46
|
+
"@flowgram-vue/ts-config": "0.2.0",
|
|
47
|
+
"@flowgram-vue/eslint-config": "0.2.0",
|
|
48
|
+
"@flowgram-vue/build-config": "0.2.0"
|
|
49
|
+
},
|
|
50
|
+
"publishConfig": {
|
|
51
|
+
"access": "public",
|
|
52
|
+
"registry": "https://registry.npmjs.org/"
|
|
53
|
+
},
|
|
54
|
+
"scripts": {
|
|
55
|
+
"build": "flowgram-build",
|
|
56
|
+
"test": "vitest run",
|
|
57
|
+
"test:cov": "vitest run --coverage",
|
|
58
|
+
"lint": "eslint .",
|
|
59
|
+
"ts-check": "tsc --noEmit",
|
|
60
|
+
"type-check": "tsc --noEmit",
|
|
61
|
+
"build:fast": "flowgram-build --fast",
|
|
62
|
+
"build:watch": "flowgram-build --watch"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineComponent, h, ref } from 'vue';
|
|
7
|
+
import type { Component } from 'vue';
|
|
8
|
+
import {
|
|
9
|
+
type AdderProps,
|
|
10
|
+
type FlowNodeTransitionData,
|
|
11
|
+
type FlowNodeEntity,
|
|
12
|
+
FlowDragService,
|
|
13
|
+
} from '@flowgram-vue/document';
|
|
14
|
+
import { useService } from '@flowgram-vue/core';
|
|
15
|
+
|
|
16
|
+
import { FlowRendererKey, type FlowRendererRegistry } from '../flow-renderer-registry';
|
|
17
|
+
import { getTransitionLabelHoverHeight, getTransitionLabelHoverWidth } from './utils';
|
|
18
|
+
|
|
19
|
+
interface PropsType {
|
|
20
|
+
data: FlowNodeTransitionData;
|
|
21
|
+
rendererRegistry: FlowRendererRegistry;
|
|
22
|
+
hoverWidth?: number;
|
|
23
|
+
hoverHeight?: number;
|
|
24
|
+
[key: string]: unknown;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const getFlowRenderKey = (
|
|
28
|
+
node: FlowNodeEntity,
|
|
29
|
+
{ dragService }: { dragService?: FlowDragService }
|
|
30
|
+
) => {
|
|
31
|
+
if (dragService && dragService.dragging && dragService.isDroppableNode(node)) {
|
|
32
|
+
if (dragService.dropNodeId === node.id) {
|
|
33
|
+
return FlowRendererKey.DRAG_HIGHLIGHT_ADDER;
|
|
34
|
+
}
|
|
35
|
+
return FlowRendererKey.DRAGGABLE_ADDER;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return FlowRendererKey.ADDER;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const Adder = defineComponent({
|
|
42
|
+
name: 'Adder',
|
|
43
|
+
inheritAttrs: false,
|
|
44
|
+
setup(_, { attrs }) {
|
|
45
|
+
const props = attrs as unknown as PropsType;
|
|
46
|
+
const hoverActivated = ref(false);
|
|
47
|
+
const dragService = useService<FlowDragService>(FlowDragService);
|
|
48
|
+
|
|
49
|
+
const handleMouseEnter = () => {
|
|
50
|
+
hoverActivated.value = true;
|
|
51
|
+
};
|
|
52
|
+
const handleMouseLeave = () => {
|
|
53
|
+
hoverActivated.value = false;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
return () => {
|
|
57
|
+
const {
|
|
58
|
+
data,
|
|
59
|
+
rendererRegistry,
|
|
60
|
+
hoverHeight = getTransitionLabelHoverHeight(data),
|
|
61
|
+
hoverWidth = getTransitionLabelHoverWidth(data),
|
|
62
|
+
...restProps
|
|
63
|
+
} = props;
|
|
64
|
+
const node = data.entity;
|
|
65
|
+
const flowRenderKey = getFlowRenderKey(node, { dragService });
|
|
66
|
+
const adder = rendererRegistry.getRendererComponent(flowRenderKey);
|
|
67
|
+
const from = node;
|
|
68
|
+
const to = data.entity.document.renderTree.getOriginInfo(node).next;
|
|
69
|
+
const renderTo = node.next;
|
|
70
|
+
const child = h(adder.renderer as Component, {
|
|
71
|
+
node,
|
|
72
|
+
from,
|
|
73
|
+
to,
|
|
74
|
+
renderTo,
|
|
75
|
+
hoverActivated: hoverActivated.value,
|
|
76
|
+
setHoverActivated: (v: boolean) => {
|
|
77
|
+
hoverActivated.value = v;
|
|
78
|
+
},
|
|
79
|
+
hoverWidth,
|
|
80
|
+
hoverHeight,
|
|
81
|
+
...restProps,
|
|
82
|
+
} as AdderProps);
|
|
83
|
+
|
|
84
|
+
return h(
|
|
85
|
+
'div',
|
|
86
|
+
{
|
|
87
|
+
class: 'flow-canvas-adder',
|
|
88
|
+
'data-testid': 'sdk.flowcanvas.line.adder',
|
|
89
|
+
'data-from': from.id,
|
|
90
|
+
'data-to': to?.id ?? '',
|
|
91
|
+
onMouseenter: handleMouseEnter,
|
|
92
|
+
onMouseleave: handleMouseLeave,
|
|
93
|
+
style: {
|
|
94
|
+
width: `${hoverWidth}px`,
|
|
95
|
+
height: `${hoverHeight}px`,
|
|
96
|
+
display: 'flex',
|
|
97
|
+
justifyContent: 'center',
|
|
98
|
+
alignItems: 'center',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
[child]
|
|
102
|
+
);
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
export default Adder;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineComponent, h } from 'vue';
|
|
7
|
+
import type { Component } from 'vue';
|
|
8
|
+
import {
|
|
9
|
+
type AdderProps,
|
|
10
|
+
type FlowNodeTransitionData,
|
|
11
|
+
type LABEL_SIDE_TYPE,
|
|
12
|
+
FlowDragService,
|
|
13
|
+
} from '@flowgram-vue/document';
|
|
14
|
+
import { FlowNodeEntity } from '@flowgram-vue/document';
|
|
15
|
+
import { useService } from '@flowgram-vue/core';
|
|
16
|
+
|
|
17
|
+
import { FlowRendererKey, type FlowRendererRegistry } from '../flow-renderer-registry';
|
|
18
|
+
|
|
19
|
+
interface PropsType {
|
|
20
|
+
data: FlowNodeTransitionData;
|
|
21
|
+
rendererRegistry: FlowRendererRegistry;
|
|
22
|
+
hoverHeight?: number;
|
|
23
|
+
side?: LABEL_SIDE_TYPE;
|
|
24
|
+
[key: string]: unknown;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const getFlowRenderKey = (
|
|
28
|
+
node: FlowNodeEntity,
|
|
29
|
+
{ dragService, side }: { dragService: FlowDragService; side?: LABEL_SIDE_TYPE }
|
|
30
|
+
) => {
|
|
31
|
+
if (
|
|
32
|
+
dragService.isDragBranch &&
|
|
33
|
+
side &&
|
|
34
|
+
dragService.labelSide === side &&
|
|
35
|
+
dragService.isDroppableBranch(node, side)
|
|
36
|
+
) {
|
|
37
|
+
if (dragService.dropNodeId === node.id) {
|
|
38
|
+
return FlowRendererKey.DRAG_BRANCH_HIGHLIGHT_ADDER;
|
|
39
|
+
}
|
|
40
|
+
return FlowRendererKey.DRAGGABLE_ADDER;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return '';
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const BranchDraggableRenderer = defineComponent({
|
|
47
|
+
name: 'BranchDraggableRenderer',
|
|
48
|
+
inheritAttrs: false,
|
|
49
|
+
setup(_, { attrs }) {
|
|
50
|
+
const dragService = useService<FlowDragService>(FlowDragService);
|
|
51
|
+
|
|
52
|
+
return () => {
|
|
53
|
+
const props = attrs as unknown as PropsType;
|
|
54
|
+
const { data, rendererRegistry, side, ...restProps } = props;
|
|
55
|
+
const node = data.entity;
|
|
56
|
+
const flowRenderKey = getFlowRenderKey(node, { side, dragService });
|
|
57
|
+
if (!flowRenderKey) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const adder = rendererRegistry.getRendererComponent(flowRenderKey);
|
|
61
|
+
const from = node;
|
|
62
|
+
const to = data.entity.document.renderTree.getOriginInfo(node).next;
|
|
63
|
+
const renderTo = node.next;
|
|
64
|
+
const child = h(adder.renderer as Component, {
|
|
65
|
+
node,
|
|
66
|
+
from,
|
|
67
|
+
to,
|
|
68
|
+
renderTo,
|
|
69
|
+
...restProps,
|
|
70
|
+
} as AdderProps);
|
|
71
|
+
|
|
72
|
+
return h('div', { class: 'flow-canvas-branch-draggable-adder' }, [child]);
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
export default BranchDraggableRenderer;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineComponent, h, ref } from 'vue';
|
|
7
|
+
import type { Component, CSSProperties } from 'vue';
|
|
8
|
+
import {
|
|
9
|
+
type CollapseProps,
|
|
10
|
+
FlowNodeRenderData,
|
|
11
|
+
type FlowNodeTransitionData,
|
|
12
|
+
} from '@flowgram-vue/document';
|
|
13
|
+
|
|
14
|
+
import { FlowRendererKey, type FlowRendererRegistry } from '../flow-renderer-registry';
|
|
15
|
+
import { getTransitionLabelHoverHeight, getTransitionLabelHoverWidth } from './utils';
|
|
16
|
+
|
|
17
|
+
interface PropsType extends Partial<CollapseProps> {
|
|
18
|
+
data: FlowNodeTransitionData;
|
|
19
|
+
rendererRegistry: FlowRendererRegistry;
|
|
20
|
+
hoverHeight?: number;
|
|
21
|
+
hoverWidth?: number;
|
|
22
|
+
wrapperStyle?: CSSProperties;
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const Collapse = defineComponent({
|
|
27
|
+
name: 'Collapse',
|
|
28
|
+
inheritAttrs: false,
|
|
29
|
+
setup(_, { attrs }) {
|
|
30
|
+
const hoverActivated = ref(false);
|
|
31
|
+
|
|
32
|
+
return () => {
|
|
33
|
+
const props = attrs as unknown as PropsType;
|
|
34
|
+
const {
|
|
35
|
+
data,
|
|
36
|
+
rendererRegistry,
|
|
37
|
+
forceVisible,
|
|
38
|
+
hoverHeight = getTransitionLabelHoverHeight(data),
|
|
39
|
+
hoverWidth = getTransitionLabelHoverWidth(data),
|
|
40
|
+
wrapperStyle,
|
|
41
|
+
...restProps
|
|
42
|
+
} = props;
|
|
43
|
+
const { activateNode } = restProps;
|
|
44
|
+
const activateData = activateNode?.getData(FlowNodeRenderData);
|
|
45
|
+
|
|
46
|
+
const handleMouseEnter = () => {
|
|
47
|
+
hoverActivated.value = true;
|
|
48
|
+
activateData?.toggleMouseEnter();
|
|
49
|
+
};
|
|
50
|
+
const handleMouseLeave = () => {
|
|
51
|
+
hoverActivated.value = false;
|
|
52
|
+
activateData?.toggleMouseLeave();
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const collapseOpener = rendererRegistry.getRendererComponent(FlowRendererKey.COLLAPSE);
|
|
56
|
+
const node = data.entity;
|
|
57
|
+
const child = h(collapseOpener.renderer as Component, {
|
|
58
|
+
node,
|
|
59
|
+
collapseNode: node,
|
|
60
|
+
...restProps,
|
|
61
|
+
hoverActivated: hoverActivated.value,
|
|
62
|
+
} as CollapseProps);
|
|
63
|
+
const isChildVisible =
|
|
64
|
+
data.collapsed || activateData?.hovered || hoverActivated.value || forceVisible;
|
|
65
|
+
|
|
66
|
+
return h(
|
|
67
|
+
'div',
|
|
68
|
+
{
|
|
69
|
+
class: 'flow-canvas-collapse',
|
|
70
|
+
onMouseenter: handleMouseEnter,
|
|
71
|
+
onMouseleave: handleMouseLeave,
|
|
72
|
+
style: {
|
|
73
|
+
width: `${hoverWidth}px`,
|
|
74
|
+
height: `${hoverHeight}px`,
|
|
75
|
+
display: 'flex',
|
|
76
|
+
justifyContent: 'center',
|
|
77
|
+
alignItems: 'center',
|
|
78
|
+
...wrapperStyle,
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
[isChildVisible ? child : null]
|
|
82
|
+
);
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
export default Collapse;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineComponent, h, ref } from 'vue';
|
|
7
|
+
import {
|
|
8
|
+
type CollapseAdderProps,
|
|
9
|
+
FlowNodeRenderData,
|
|
10
|
+
type FlowNodeTransitionData,
|
|
11
|
+
} from '@flowgram-vue/document';
|
|
12
|
+
|
|
13
|
+
import { type FlowRendererRegistry } from '../flow-renderer-registry';
|
|
14
|
+
import Collapse from './Collapse';
|
|
15
|
+
import Adder from './Adder';
|
|
16
|
+
|
|
17
|
+
interface PropsType extends Partial<CollapseAdderProps> {
|
|
18
|
+
data: FlowNodeTransitionData;
|
|
19
|
+
rendererRegistry: FlowRendererRegistry;
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const CollapseAdder = defineComponent({
|
|
24
|
+
name: 'CollapseAdder',
|
|
25
|
+
inheritAttrs: false,
|
|
26
|
+
setup(_, { attrs }) {
|
|
27
|
+
const hoverActivated = ref(false);
|
|
28
|
+
const handleMouseEnter = () => {
|
|
29
|
+
hoverActivated.value = true;
|
|
30
|
+
};
|
|
31
|
+
const handleMouseLeave = () => {
|
|
32
|
+
hoverActivated.value = false;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
return () => {
|
|
36
|
+
const props = attrs as unknown as PropsType;
|
|
37
|
+
const { data, activateNode } = props;
|
|
38
|
+
const activateData = activateNode?.getData(FlowNodeRenderData);
|
|
39
|
+
const isVertical = activateNode?.isVertical;
|
|
40
|
+
const activated = activateData?.hovered || hoverActivated.value;
|
|
41
|
+
|
|
42
|
+
if (isVertical) {
|
|
43
|
+
return h(
|
|
44
|
+
'div',
|
|
45
|
+
{
|
|
46
|
+
class: 'flow-canvas-collapse-adder',
|
|
47
|
+
onMouseenter: handleMouseEnter,
|
|
48
|
+
onMouseleave: handleMouseLeave,
|
|
49
|
+
},
|
|
50
|
+
[
|
|
51
|
+
activated || data.collapsed
|
|
52
|
+
? h(Collapse, {
|
|
53
|
+
...props,
|
|
54
|
+
forceVisible: true,
|
|
55
|
+
wrapperStyle: { alignItems: 'flex-end' },
|
|
56
|
+
hoverHeight: 20,
|
|
57
|
+
})
|
|
58
|
+
: null,
|
|
59
|
+
!data.collapsed
|
|
60
|
+
? h(Adder, { ...props, hoverHeight: activated ? 20 : 40, hoverActivated: activated })
|
|
61
|
+
: null,
|
|
62
|
+
]
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return h(
|
|
67
|
+
'div',
|
|
68
|
+
{
|
|
69
|
+
class: 'flow-canvas-collapse-adder',
|
|
70
|
+
onMouseenter: handleMouseEnter,
|
|
71
|
+
onMouseleave: handleMouseLeave,
|
|
72
|
+
style: {
|
|
73
|
+
display: data.collapsed ? 'block' : 'flex',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
[
|
|
77
|
+
activated || data.collapsed
|
|
78
|
+
? h(Collapse, {
|
|
79
|
+
...props,
|
|
80
|
+
forceVisible: true,
|
|
81
|
+
wrapperStyle: { justifyContent: 'flex-end' },
|
|
82
|
+
hoverWidth: 20,
|
|
83
|
+
})
|
|
84
|
+
: null,
|
|
85
|
+
!data.collapsed
|
|
86
|
+
? h(Adder, { ...props, hoverWidth: activated ? 20 : 40, hoverActivated: activated })
|
|
87
|
+
: null,
|
|
88
|
+
]
|
|
89
|
+
);
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
export default CollapseAdder;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2025 Bytedance Ltd. and/or its affiliates
|
|
3
|
+
* SPDX-License-Identifier: MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { defineComponent, h } from 'vue';
|
|
7
|
+
import type { Component } from 'vue';
|
|
8
|
+
import type { FlowTransitionLine } from '@flowgram-vue/document';
|
|
9
|
+
|
|
10
|
+
import { type FlowRendererRegistry } from '../flow-renderer-registry';
|
|
11
|
+
|
|
12
|
+
interface PropsType extends FlowTransitionLine {
|
|
13
|
+
rendererRegistry: FlowRendererRegistry;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const CustomLine = defineComponent({
|
|
17
|
+
name: 'CustomLine',
|
|
18
|
+
inheritAttrs: false,
|
|
19
|
+
setup(_, { attrs }) {
|
|
20
|
+
return () => {
|
|
21
|
+
const props = attrs as unknown as PropsType;
|
|
22
|
+
const { renderKey, rendererRegistry, ...line } = props;
|
|
23
|
+
if (!renderKey) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const renderer = rendererRegistry.getRendererComponent(renderKey);
|
|
27
|
+
if (!renderer) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return h(renderer.renderer as Component, { lineId: props.lineId, ...line });
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
export default CustomLine;
|