Skip to content

Commit 6880f5f

Browse files
author
fanyang
committed
refactor(extension): snapshot重构
1 parent f42f371 commit 6880f5f

File tree

11 files changed

+137
-70
lines changed

11 files changed

+137
-70
lines changed

examples/feature-examples/src/pages/extensions/snapshot/data.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
export default {
22
nodes: [
33
{
4-
type: 'uml',
4+
type: 'customHtml',
55
x: 0,
66
y: 50,
77
id: 'uml_1',
88
properties: {
9-
name: 'haod',
9+
name: 'hello',
1010
body: '哈哈哈哈',
1111
},
1212
},

examples/feature-examples/src/pages/extensions/snapshot/index.tsx

Lines changed: 69 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,20 @@ import {
1212
Space,
1313
Select,
1414
Input,
15+
InputNumber,
16+
Switch,
1517
} from 'antd'
1618
import ImageNode from './imageNode'
17-
import Uml from './uml'
19+
import CustomHtml from '../../../components/nodes/custom-html/Html'
1820
import data from './data'
21+
import { circle as circleSvgUrl, rect as rectSvgUrl } from './svg'
1922

2023
import './index.less'
2124
import '@logicflow/core/es/index.css'
2225
import '@logicflow/extension/es/index.css'
2326

27+
import type { ToImageOptions } from '@logicflow/extension'
28+
2429
const config: Partial<LogicFlow.Options> = {
2530
style: {
2631
rect: {
@@ -52,6 +57,7 @@ const config: Partial<LogicFlow.Options> = {
5257
grid: {
5358
size: 20,
5459
},
60+
partial: true,
5561
}
5662

5763
/**
@@ -63,10 +69,11 @@ export default function SnapshotExample() {
6369

6470
const [fileName, setFileName] = useState<string>() // 文件名
6571
const [fileType, setFileType] = useState<string>('png') // 下载的图片类型
66-
const [width, setWidth] = useState<string>() // 宽度
67-
const [height, setHeight] = useState<string>() // 高度
68-
const [padding, setPaddding] = useState<string>() //padding
69-
const [quality, setQuality] = useState<string>() // 图片质量
72+
const [width, setWidth] = useState<number>() // 宽度
73+
const [height, setHeight] = useState<number>() // 高度
74+
const [padding, setPadding] = useState<number>() //padding
75+
const [quality, setQuality] = useState<number>() // 图片质量
76+
const [partial, setPartial] = useState<boolean>(true) // 导出局部渲染
7077

7178
const [blobData, setBlobData] = useState('')
7279
const [base64Data, setBase64Data] = useState('')
@@ -80,24 +87,30 @@ export default function SnapshotExample() {
8087
plugins: [Snapshot, DndPanel],
8188
})
8289

83-
lf.register(Uml)
90+
lf.register(CustomHtml)
8491
lf.register(ImageNode)
8592

8693
lf.setPatternItems([
8794
{
8895
type: 'circle',
8996
text: 'circle',
9097
label: 'circle',
91-
icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAnBJREFUOBGdVL1rU1EcPfdGBddmaZLiEhdx1MHZQXApraCzQ7GKLgoRBxMfcRELuihWKcXFRcEWF8HBf0DdDCKYRZpnl7p0svLe9Zzbd29eQhTbC8nv+9zf130AT63jvooOGS8Vf9Nt5zxba7sXQwODfkWpkbjTQfCGUd9gIp3uuPP8bZ946g56dYQvnBg+b1HB8VIQmMFrazKcKSvFW2dQTxJnJdQ77urmXWOMBCmXM2Rke4S7UAW+/8ywwFoewmBps2tu7mbTdp8VMOkIRAkKfrVawalJTtIliclFbaOBqa0M2xImHeVIfd/nKAfVq/LGnPss5Kh00VEdSzfwnBXPUpmykNss4lUI9C1ga+8PNrBD5YeqRY2Zz8PhjooIbfJXjowvQJBqkmEkVnktWhwu2SM7SMx7Cj0N9IC0oQXRo8xwAGzQms+xrB/nNSUWVveI48ayrFGyC2+E2C+aWrZHXvOuz+CiV6iycWe1Rd1Q6+QUG07nb5SbPrL4426d+9E1axKjY3AoRrlEeSQo2Eu0T6BWAAr6COhTcWjRaYfKG5csnvytvUr/WY4rrPMB53Uo7jZRjXaG6/CFfNMaXEu75nG47X+oepU7PKJvvzGDY1YLSKHJrK7vFUwXKkaxwhCW3u+sDFMVrIju54RYYbFKpALZAo7sB6wcKyyrd+aBMryMT2gPyD6GsQoRFkGHr14TthZni9ck0z+Pnmee460mHXbRAypKNy3nuMdrWgVKj8YVV8E7PSzp1BZ9SJnJAsXdryw/h5ctboUVi4AFiCd+lQaYMw5z3LGTBKjLQOeUF35k89f58Vv/tGh+l+PE/wG0rgfIUbZK5AAAAABJRU5ErkJggg==',
98+
icon: circleSvgUrl,
9299
},
93100
{
94101
type: 'rect',
95102
label: 'rect',
96103
text: 'circle',
97-
icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg==',
104+
icon: rectSvgUrl,
98105
},
99106
])
100107

108+
lf.on('custom:button-click', (model: any) => {
109+
lf.setProperties(model.id, {
110+
body: 'LogicFlow',
111+
})
112+
})
113+
101114
// 默认开启css样式
102115
lf.extension.snapshot.useGlobalRules = true
103116
// 不会覆盖css样式,会叠加,customCssRules优先级高
@@ -118,14 +131,14 @@ export default function SnapshotExample() {
118131

119132
// 下载
120133
const downLoad = () => {
121-
const params = {
134+
const params: ToImageOptions = {
122135
fileType,
123136
backgroundColor: 'yellow',
124-
partialElement: true,
125-
...(width ? { width: Number(width) } : {}),
126-
...(height ? { height: Number(height) } : {}),
127-
...(padding ? { padding: Number(padding) } : {}),
128-
...(quality ? { quality: Number(quality) } : {}),
137+
partial,
138+
width,
139+
height,
140+
padding,
141+
quality,
129142
}
130143
console.log(params, 'params')
131144
lfRef.current && lfRef.current.getSnapshot(fileName, params)
@@ -177,6 +190,38 @@ export default function SnapshotExample() {
177190
}
178191
}
179192

193+
const handleWidthChange = (value: number | null | undefined) => {
194+
if (value === null || value === undefined) {
195+
setWidth(undefined) // 处理 null 或 undefined 的情况
196+
} else {
197+
setWidth(value) // 设置有效的数字值
198+
}
199+
}
200+
201+
const handleHeightChange = (value: number | null | undefined) => {
202+
if (value === null || value === undefined) {
203+
setHeight(undefined) // 处理 null 或 undefined 的情况
204+
} else {
205+
setHeight(value) // 设置有效的数字值
206+
}
207+
}
208+
209+
const handlePaddingChange = (value: number | null | undefined) => {
210+
if (value === null || value === undefined) {
211+
setPadding(undefined) // 处理 null 或 undefined 的情况
212+
} else {
213+
setPadding(value) // 设置有效的数字值
214+
}
215+
}
216+
217+
const handleQualityChange = (value: number | null | undefined) => {
218+
if (value === null || value === undefined) {
219+
setQuality(undefined) // 处理 null 或 undefined 的情况
220+
} else {
221+
setQuality(value) // 设置有效的数字值
222+
}
223+
}
224+
180225
return (
181226
<Card title="LogicFlow Extension - Snapshot">
182227
<Space>
@@ -198,29 +243,31 @@ export default function SnapshotExample() {
198243
{ value: 'svg', label: 'svg' },
199244
]}
200245
/>
201-
<Input
246+
<InputNumber
202247
addonBefore="宽度:"
203248
value={width}
204-
onChange={(e) => setWidth(e.target.value)}
249+
onChange={handleWidthChange}
205250
/>
206-
<Input
251+
<InputNumber
207252
addonBefore="高度:"
208253
value={height}
209-
onChange={(e) => setHeight(e.target.value)}
254+
onChange={handleHeightChange}
210255
/>
211256
</Space>
212257
<p></p>
213258
<Space>
214-
<Input
259+
<InputNumber
215260
addonBefore="padding:"
216261
value={padding}
217-
onChange={(e) => setPaddding(e.target.value)}
262+
onChange={handlePaddingChange}
218263
/>
219-
<Input
264+
<InputNumber
220265
addonBefore="图片质量:"
221266
value={quality}
222-
onChange={(e) => setQuality(e.target.value)}
267+
onChange={handleQualityChange}
223268
/>
269+
<span>导出局部渲染:</span>
270+
<Switch defaultChecked onChange={(partial) => setPartial(partial)} />
224271
</Space>
225272
<Divider />
226273
<Space>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
const circle =
2+
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAnBJREFUOBGdVL1rU1EcPfdGBddmaZLiEhdx1MHZQXApraCzQ7GKLgoRBxMfcRELuihWKcXFRcEWF8HBf0DdDCKYRZpnl7p0svLe9Zzbd29eQhTbC8nv+9zf130AT63jvooOGS8Vf9Nt5zxba7sXQwODfkWpkbjTQfCGUd9gIp3uuPP8bZ946g56dYQvnBg+b1HB8VIQmMFrazKcKSvFW2dQTxJnJdQ77urmXWOMBCmXM2Rke4S7UAW+/8ywwFoewmBps2tu7mbTdp8VMOkIRAkKfrVawalJTtIliclFbaOBqa0M2xImHeVIfd/nKAfVq/LGnPss5Kh00VEdSzfwnBXPUpmykNss4lUI9C1ga+8PNrBD5YeqRY2Zz8PhjooIbfJXjowvQJBqkmEkVnktWhwu2SM7SMx7Cj0N9IC0oQXRo8xwAGzQms+xrB/nNSUWVveI48ayrFGyC2+E2C+aWrZHXvOuz+CiV6iycWe1Rd1Q6+QUG07nb5SbPrL4426d+9E1axKjY3AoRrlEeSQo2Eu0T6BWAAr6COhTcWjRaYfKG5csnvytvUr/WY4rrPMB53Uo7jZRjXaG6/CFfNMaXEu75nG47X+oepU7PKJvvzGDY1YLSKHJrK7vFUwXKkaxwhCW3u+sDFMVrIju54RYYbFKpALZAo7sB6wcKyyrd+aBMryMT2gPyD6GsQoRFkGHr14TthZni9ck0z+Pnmee460mHXbRAypKNy3nuMdrWgVKj8YVV8E7PSzp1BZ9SJnJAsXdryw/h5ctboUVi4AFiCd+lQaYMw5z3LGTBKjLQOeUF35k89f58Vv/tGh+l+PE/wG0rgfIUbZK5AAAAABJRU5ErkJggg=='
3+
4+
const rect =
5+
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg=='
6+
7+
export { circle, rect }

packages/core/src/constant/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ export enum EventType {
114114
TEXT_UPDATE = 'text:update',
115115
GRAPH_TRANSFORM = 'graph:transform',
116116
GRAPH_RENDERED = 'graph:rendered',
117+
GRAPH_UPDATED = 'graph:updated',
117118
}
118119

119120
export enum OverlapMode {

packages/core/src/event/eventArgs.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,15 @@ interface CommonEventArgs {
282282
*/
283283
data: GraphData
284284
}
285+
/**
286+
* 画布渲染数据更新后后触发,即改变画布上的属性,比如partial。
287+
*/
288+
'graph:updated': {
289+
/**
290+
* 渲染后的画布数据
291+
*/
292+
data: GraphData
293+
}
285294
}
286295

287296
type AnchorEventArgsPick<T extends 'data' | 'e' | 'nodeModel' | 'edgeModel'> =

packages/core/src/event/eventEmitter.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,9 @@ export default class EventEmitter {
7474
*/
7575
emit<T extends keyof EventArgs>(evts: T, eventArgs: CallbackArgs<T>): void
7676
emit<T extends string>(evts: T, eventArgs: CallbackArgs<T>): void
77-
emit(evts: string, eventArgs: EventCallback) {
77+
emit(evts: string, eventArgs?: EventCallback) {
7878
evts?.split(',').forEach((evt) => {
7979
const events = this._events[evt] || []
80-
// TODO: 这是什么??? +1
8180
const wildcardEvents = this._events[WILDCARD] || []
8281
// 实际的处理 emit 方法
8382
const doEmit = (es: EventType[]) => {

packages/core/src/model/GraphModel.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1489,18 +1489,20 @@ export class GraphModel {
14891489
}
14901490

14911491
/**
1492-
* 设置是否开启局部渲染模式,返回重新渲染后promise
1492+
* 获取当前局部渲染模式
1493+
* @returns boolean
1494+
*/
1495+
getPartial(): boolean {
1496+
return this.partial
1497+
}
1498+
1499+
/**
1500+
* 设置是否开启局部渲染模式
14931501
* @param partial boolean
1494-
* @returns Promise<boolean>
1502+
* @returns
14951503
*/
1496-
@action setPartial(partial: boolean): Promise<boolean> {
1504+
@action setPartial(partial: boolean): void {
14971505
this.partial = partial
1498-
return new Promise((resolve, reject) => {
1499-
this.eventCenter.on('graph: partialRendered', ({ isRendered }) => {
1500-
isRendered ? resolve(isRendered) : reject(isRendered)
1501-
this.eventCenter.off('graph: partialRendered')
1502-
})
1503-
})
15041506
}
15051507
}
15061508

packages/core/src/view/Graph.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
BaseNodeModel,
2121
SnaplineModel,
2222
} from '../model'
23+
import { EventType } from '../constant'
2324

2425
type IGraphProps = {
2526
getView: (type: string) => ComponentType<any> | undefined
@@ -45,6 +46,12 @@ class Graph extends Component<IGraphProps> {
4546
window.addEventListener('resize', throttle(this.handleResize, 200))
4647
}
4748

49+
componentDidUpdate() {
50+
this.props.graphModel.eventCenter.emit(EventType.GRAPH_UPDATED, {
51+
data: this.props.graphModel,
52+
})
53+
}
54+
4855
componentWillUnmount() {
4956
window.removeEventListener('resize', throttle(this.handleResize, 200))
5057
}
@@ -83,7 +90,6 @@ class Graph extends Component<IGraphProps> {
8390
const grid = options.grid && Grid.getGridOptions(options.grid)
8491
const { fakeNode, editConfigModel } = graphModel
8592
const { adjustEdge } = editConfigModel
86-
graphModel.eventCenter.emit('graph: partialRendered', { isRendered: true })
8793
return (
8894
<div className="lf-graph" flow-id={graphModel.flowId}>
8995
<CanvasOverlay graphModel={graphModel} dnd={dnd}>

packages/extension/src/tools/snapshot/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ getSnapshot(fileName?: string, toImageOptions?: ToImageOptions) : Promise<void>
8484
| backgroundColor | string | - | | 图片背景,不设置背景默认透明 |
8585
| quality | number | - | | 图片质量,在指定图片格式为 jpeg 或 webp 的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92。其他不合法参数会被忽略 |
8686
| padding | number | 40 | | 图片内边距: 元素内容所在区之外空白空间,不设置默认有40的内边距 |
87-
| partialElement | boolean | false | |开启局部渲染后,默认不会导出已经移出画布区域的元素,开启后,将会导出 |
87+
| partial | boolean | - | | 导出时是否开启局部渲染,false:将导出画布上所有的元素,true:只导出画面区域内的可见元素,不设置默认为lf实例身上partial值 |
8888

8989
注意:
9090
- `svg`目前暂不支持`width``height``backgroundColor``padding` 属性。

0 commit comments

Comments
 (0)