Skip to content

Commit b1fdbbd

Browse files
committed
feat(core): 更新插件相关类型定义,完善插件相关方法 use/installPlugins/installPlugin 的功能
- 解决插件中一些类型问题 - 测试并修复 LogicFlow.use api 的功能 bug
1 parent 4a1b2d5 commit b1fdbbd

File tree

10 files changed

+101
-62
lines changed

10 files changed

+101
-62
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ export default function BPMNExtension() {
180180
const { control, miniMap } = lf.extension
181181

182182
;(control as Control).addItem({
183+
key: 'mini-map',
183184
iconClass: 'custom-minimap',
184185
title: '',
185186
text: '导航',

examples/feature-examples/src/pages/extensions/mini-map/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,16 @@ export default function MiniMapExtension() {
7777
const [position, setPosition] = useState('right-bottom')
7878

7979
useEffect(() => {
80+
LogicFlow.use(MiniMap)
8081
if (!lfRef.current) {
8182
const lf = new LogicFlow({
8283
...config,
8384
container: containerRef.current as HTMLElement,
8485
grid: {
8586
size: 20,
8687
},
87-
plugins: [Control, MiniMap],
88+
// plugins: [Control, MiniMap],
89+
plugins: [Control],
8890
pluginsOptions: {
8991
MiniMap: {
9092
...miniMapOptions,

packages/core/src/LogicFlow.tsx

Lines changed: 77 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ComponentType, createElement as h, render } from 'preact/compat'
2-
import { cloneDeep, forEach } from 'lodash-es'
2+
import { cloneDeep, forEach, indexOf } from 'lodash-es'
33
import { observer } from '.'
44
import { Options as LFOptions } from './options'
55
import * as _Model from './model'
@@ -24,8 +24,9 @@ import History from './history'
2424
import { EventCallback, CallbackArgs, EventArgs } from './event/eventEmitter'
2525
import { ElementType, EventType, SegmentDirection } from './constant'
2626
import { initDefaultShortcut } from './keyboard/shortcut'
27+
2728
import Extension = LogicFlow.Extension
28-
import RegisteredExtension = LogicFlow.RegisteredExtension
29+
import ExtensionConfig = LogicFlow.ExtensionConfig
2930
import ExtensionConstructor = LogicFlow.ExtensionConstructor
3031
import GraphConfigData = LogicFlow.GraphConfigData
3132
import NodeConfig = LogicFlow.NodeConfig
@@ -38,11 +39,13 @@ import RegisterParam = LogicFlow.RegisterParam
3839
import GraphElements = LogicFlow.GraphElements
3940
import Position = LogicFlow.Position
4041
import PointTuple = LogicFlow.PointTuple
41-
import ExtensionRender = LogicFlow.ExtensionRender
42+
import ExtensionRenderFunc = LogicFlow.ExtensionRenderFunc
4243
import RegisterElementFunc = LogicFlow.RegisterElementFunc
4344
import PropertiesType = LogicFlow.PropertiesType
4445
import BaseNodeModelCtor = LogicFlow.BaseNodeModelCtor
4546
import ClientPosition = LogicFlow.ClientPosition
47+
import ExtensionDefinition = LogicFlow.ExtensionDefinition
48+
import ExtensionType = LogicFlow.ExtensionType
4649

4750
const pluginFlag = Symbol('plugin registered by Logicflow.use')
4851

@@ -61,13 +64,13 @@ export class LogicFlow {
6164
tool: Tool
6265
snaplineModel?: SnaplineModel
6366

64-
components: ExtensionRender[] = []
67+
components: ExtensionRenderFunc[] = []
6568
// 个性配置的插件,覆盖全局配置的插件
66-
readonly plugins: ExtensionConstructor[]
69+
readonly plugins: ExtensionType[]
6770
// 全局配置的插件,所有的LogicFlow示例都会使用
68-
static extensions: Map<string, RegisteredExtension> = new Map()
71+
static extensions: Map<string, ExtensionConfig> = new Map()
6972
// 插件扩展方法
70-
extension: Record<string, Extension> = {}
73+
extension: Record<string, Extension | ExtensionDefinition> = {}
7174

7275
readonly width?: number // 只读:画布宽度
7376
readonly height?: number // 只读:画布高度
@@ -1292,19 +1295,14 @@ export class LogicFlow {
12921295
* @param props
12931296
*/
12941297
static use(
1295-
extension: ExtensionConstructor,
1298+
extension: ExtensionConstructor | ExtensionDefinition,
12961299
props?: Record<string, unknown>,
12971300
): void {
1298-
let { pluginName } = extension
1301+
const { pluginName } = extension
12991302
if (!pluginName) {
1300-
console.warn(
1301-
`请给插件${
1302-
extension.name || extension.constructor.name
1303-
}指定pluginName!`,
1304-
)
1305-
pluginName = extension.name // 兼容以前name的情况,1.0版本去掉。
1303+
throw new Error(`请给插件指定 pluginName!`)
13061304
}
1307-
// TODO: 应该在何时进行插件的销毁
1305+
// TODO: 应该在何时进行插件的销毁???
13081306
// const preExtension = this.extensions.get(pluginName)?.extension
13091307
// preExtension?.destroy?.() // 该代码应该有问题,因为 preExtension 直接用的是 Constructor,没有实例化。无法访问实例方法 destroy
13101308

@@ -1316,19 +1314,26 @@ export class LogicFlow {
13161314
}
13171315

13181316
private installPlugins(disabledPlugins: string[] = []) {
1317+
const extensionsAddByUse = Array.from(
1318+
LogicFlow.extensions,
1319+
([, extension]) => extension,
1320+
)
13191321
// 安装插件,优先使用个性插件
1320-
const extensions = this.plugins ?? LogicFlow.extensions
1321-
extensions.forEach((ext: any) => {
1322-
let extension: any
1323-
let props = null
1324-
if (ext[pluginFlag]) {
1322+
const extensions = [...this.plugins, ...extensionsAddByUse]
1323+
forEach(extensions, (ext) => {
1324+
let extension: ExtensionConstructor | ExtensionDefinition
1325+
let props: Record<string, any> | undefined
1326+
1327+
if (pluginFlag in ext) {
13251328
extension = ext.extension
13261329
props = ext.props
13271330
} else {
13281331
extension = ext
13291332
}
1330-
const pluginName = extension?.pluginName || extension?.name
1331-
if (disabledPlugins.indexOf(pluginName) === -1) {
1333+
1334+
const pluginName = extension?.pluginName
1335+
1336+
if (indexOf(disabledPlugins, pluginName) === -1) {
13321337
this.installPlugin(extension, props)
13331338
}
13341339
})
@@ -1337,31 +1342,38 @@ export class LogicFlow {
13371342
/**
13381343
* 加载插件-内部方法
13391344
*/
1340-
private installPlugin(extension: Extension, props: any) {
1341-
if (typeof extension === 'object') {
1342-
const { pluginName, install, render: renderComponent } = extension
1345+
private installPlugin(
1346+
extension: ExtensionConstructor | ExtensionDefinition,
1347+
props?: Record<string, any>,
1348+
) {
1349+
if ('pluginName' in extension && 'install' in extension) {
1350+
const { pluginName, install, render } = extension
13431351
if (pluginName) {
13441352
install && install.call(extension, this, LogicFlow)
1345-
renderComponent && this.components.push(renderComponent.bind(extension))
1353+
render && this.components.push(render.bind(extension))
13461354
this.extension[pluginName] = extension
13471355
}
13481356
return
13491357
}
1350-
const ExtensionCls = extension as ExtensionConstructor
1351-
const extensionInstance = new ExtensionCls({
1358+
1359+
const ExtensionCtor = extension as ExtensionConstructor
1360+
const extensionIns = new ExtensionCtor({
13521361
lf: this,
13531362
LogicFlow,
1354-
options: this.options.pluginsOptions ?? {},
13551363
props,
1364+
options: this.options.pluginsOptions ?? {},
13561365
})
1357-
extensionInstance.render &&
1358-
this.components.push(extensionInstance.render.bind(extensionInstance))
1359-
this.extension[ExtensionCls.pluginName] = extensionInstance
1366+
extensionIns.render &&
1367+
this.components.push(extensionIns.render.bind(extensionIns))
1368+
this.extension[ExtensionCtor.pluginName] = extensionIns
13601369
}
13611370
}
13621371

13631372
// Option
13641373
export namespace LogicFlow {
1374+
/**
1375+
* LogicFlow init Options
1376+
*/
13651377
export interface Options extends LFOptions.Common {}
13661378

13671379
export type DomAttributes = {
@@ -1376,6 +1388,7 @@ export namespace LogicFlow {
13761388
ry?: number
13771389
} & Record<string, any>
13781390
export type AttributesType = Record<string, any>
1391+
13791392
export type VectorData = {
13801393
deltaX: number
13811394
deltaY: number
@@ -1755,8 +1768,14 @@ export namespace LogicFlow {
17551768

17561769
// Render or Functions
17571770
export namespace LogicFlow {
1758-
type FocusOnById = { id: string; coordinate?: never }
1759-
type FocusOnByCoordinate = { id?: string; coordinate: Position }
1771+
type FocusOnById = {
1772+
id: string
1773+
coordinate?: never
1774+
}
1775+
type FocusOnByCoordinate = {
1776+
id?: string
1777+
coordinate: Position
1778+
}
17601779
export type FocusOnArgsType = FocusOnById | FocusOnByCoordinate
17611780

17621781
export type BaseNodeModelCtor = typeof BaseNodeModel
@@ -1794,32 +1813,43 @@ export namespace LogicFlow {
17941813
new (options: LFOptions.Definition): LogicFlow
17951814
}
17961815

1797-
export type RegisteredExtension = {
1816+
/**
1817+
* Extension 插件类型
1818+
*/
1819+
export type ExtensionType = ExtensionConstructor | ExtensionDefinition
1820+
export type ExtensionConfig = {
17981821
[pluginFlag]: symbol
1799-
extension: ExtensionConstructor
1800-
props?: Record<string, unknown>
1822+
extension: ExtensionType
1823+
props?: Record<string, any> // TODO: 看这类型是否可以更精确
18011824
}
18021825

1803-
export type ExtensionProps = {
1826+
export type IExtensionProps = {
18041827
lf: LogicFlow
18051828
LogicFlow: LogicFlowConstructor
1806-
options: Record<string, unknown>
18071829
props?: Record<string, unknown>
1830+
options: Record<string, unknown>
18081831
}
18091832

18101833
export interface ExtensionConstructor {
18111834
pluginName: string
1812-
1813-
new (props: ExtensionProps): Extension
1835+
new (props: IExtensionProps): Extension
18141836
}
18151837

1816-
export type ExtensionRender = (lf: LogicFlow, container: HTMLElement) => void
1838+
export type ExtensionRenderFunc = (
1839+
lf: LogicFlow,
1840+
container: HTMLElement,
1841+
) => void
1842+
1843+
// 对象形式定义的插件
1844+
export type ExtensionDefinition = {
1845+
pluginName: string
1846+
install?: (lf: LogicFlow, LFCtor: LogicFlowConstructor) => void
1847+
render?: ExtensionRenderFunc
1848+
}
18171849

18181850
export interface Extension {
1819-
readonly pluginName?: string // 插件名称,只用用于插件覆盖和细粒度控制加载哪些插件
1820-
install?: (lf: LogicFlow, logicFlow: LogicFlowConstructor) => void
1821-
render?: ExtensionRender
1822-
destroy?: () => void
1851+
render: ExtensionRenderFunc
1852+
destroy?: () => void // TODO: 确认插件销毁函数参数类型
18231853
}
18241854
}
18251855

packages/core/src/options.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import GridOptions = Grid.GridOptions
1010
export namespace Options {
1111
import NodeData = LogicFlow.NodeData
1212
import EdgeData = LogicFlow.EdgeData
13-
import ExtensionConstructor = LogicFlow.ExtensionConstructor
1413
import GraphData = LogicFlow.GraphData
14+
import ExtensionType = LogicFlow.ExtensionType
1515
export type EdgeType = 'line' | 'polyline' | 'bezier' | string
1616
export type BackgroundConfig = {
1717
// 背景图片地址
@@ -88,7 +88,7 @@ export namespace Options {
8888
guards?: GuardsConfig
8989
overlapMode?: OverlapMode
9090

91-
plugins?: ExtensionConstructor[]
91+
plugins?: ExtensionType[]
9292
pluginsOptions?: Record<string, any>
9393
disabledPlugins?: string[]
9494
disabledTools?: string[]

packages/extension/src/bpmn/constant.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export const UserTaskConfig = {
2525
height: 80,
2626
}
2727

28-
export const theme: LogicFlow.CommonTheme = {
28+
export const theme: Partial<LogicFlow.Theme> = {
2929
rect: {
3030
radius: 5,
3131
stroke: 'rgb(24, 125, 255)',
@@ -43,6 +43,9 @@ export const theme: LogicFlow.CommonTheme = {
4343
selectedStroke: 'rgb(24, 125, 255)',
4444
},
4545
edgeText: {
46+
textWidth: 100,
47+
overflowMode: 'default',
48+
fontSize: 12,
4649
background: {
4750
fill: 'white',
4851
height: 14,

packages/extension/src/bpmn/index.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import LogicFlow from '@logicflow/core'
12
import { theme } from './constant'
23
import {
34
StartEvent,
@@ -22,10 +23,12 @@ import {
2223
ServiceTaskModel,
2324
} from './tasks'
2425

25-
class BpmnElement {
26-
static pluginName = 'bpmnElement'
26+
import ExtensionDefinition = LogicFlow.ExtensionDefinition
2727

28-
constructor({ lf }) {
28+
const BpmnElement: ExtensionDefinition = {
29+
pluginName: 'bpmnElement',
30+
31+
install(lf) {
2932
lf.setTheme(theme)
3033
lf.register(StartEvent)
3134
lf.register(EndEvent)
@@ -37,7 +40,7 @@ class BpmnElement {
3740
lf.register(SequenceFlow)
3841
lf.setDefaultEdgeType('bpmn:sequenceFlow')
3942
}
40-
}
43+
},
4144
}
4245

4346
export {

packages/extension/src/components/control/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ type ControlItem = {
55
iconClass: string
66
title: string
77
text: string
8-
onClick?: (lf: LogicFlow) => void
9-
onMouseEnter?: (lf: LogicFlow) => void
10-
onMouseLeave?: (lf: LogicFlow) => void
8+
onClick?: (lf: LogicFlow, e: MouseEvent) => void
9+
onMouseEnter?: (lf: LogicFlow, e: MouseEvent) => void
10+
onMouseLeave?: (lf: LogicFlow, e: MouseEvent) => void
1111
}
1212

1313
export class Control {
@@ -64,7 +64,7 @@ export class Control {
6464
private domContainer?: HTMLElement
6565
private toolEl?: HTMLElement
6666

67-
constructor({ lf }: LogicFlow.ExtensionProps) {
67+
constructor({ lf }: LogicFlow.IExtensionProps) {
6868
this.lf = lf
6969
}
7070

packages/extension/src/components/mini-map/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ export class MiniMap {
177177
*/
178178
private disabledPlugins = ['miniMap', 'control', 'selectionSelect']
179179

180-
constructor({ lf, LogicFlow, options }: LogicFlow.ExtensionProps) {
180+
constructor({ lf, LogicFlow, options }: LogicFlow.IExtensionProps) {
181181
this.lf = lf
182182
this.LFCtor = LogicFlow
183183
if (options && options.MiniMap) {

packages/extension/src/components/selection-select/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export class SelectionSelect {
1515
private isWholeNode = true
1616
private isWholeEdge = true
1717

18-
constructor({ lf }: LogicFlow.ExtensionProps) {
18+
constructor({ lf }: LogicFlow.IExtensionProps) {
1919
this.lf = lf
2020
// 初始化isDefaultStopMoveGraph取值
2121
const { stopMoveGraph } = lf.getEditConfig()

packages/extension/src/materials/group/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export class Group {
2424
activeGroup: any
2525
nodeGroupMap: Map<string, string> = new Map()
2626

27-
constructor({ lf }: LogicFlow.ExtensionProps) {
27+
constructor({ lf }: LogicFlow.IExtensionProps) {
2828
lf.register(GroupNode)
2929
this.lf = lf
3030

0 commit comments

Comments
 (0)