@stocksharp/diagram 0.2.3 → 0.4.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/dist/esm/canvas-renderer.js +79 -28
- package/dist/esm/canvas-renderer.js.map +1 -1
- package/dist/esm/core/action-registry.js +24 -0
- package/dist/esm/core/action-registry.js.map +1 -1
- package/dist/esm/core/document.js +134 -28
- package/dist/esm/core/document.js.map +1 -1
- package/dist/esm/core/json.js +17 -0
- package/dist/esm/core/json.js.map +1 -0
- package/dist/esm/core/model.js +8 -0
- package/dist/esm/core/model.js.map +1 -1
- package/dist/esm/core/state.js +16 -2
- package/dist/esm/core/state.js.map +1 -1
- package/dist/esm/diagram/catalog.js +17 -5
- package/dist/esm/diagram/catalog.js.map +1 -1
- package/dist/esm/diagram/event-emitter.js +10 -0
- package/dist/esm/diagram/event-emitter.js.map +1 -1
- package/dist/esm/diagram/stocksharp-diagram.js +58 -56
- package/dist/esm/diagram/stocksharp-diagram.js.map +1 -1
- package/dist/esm/diagram/types.js +2 -1
- package/dist/esm/diagram/types.js.map +1 -1
- package/dist/esm/embed.js +121 -38
- package/dist/esm/embed.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/ssdiagram.js +380 -150
- package/dist/ssdiagram.js.map +4 -4
- package/dist/types/canvas-renderer.d.ts +11 -6
- package/dist/types/canvas-renderer.d.ts.map +1 -1
- package/dist/types/core/action-registry.d.ts +7 -0
- package/dist/types/core/action-registry.d.ts.map +1 -1
- package/dist/types/core/document.d.ts +1 -1
- package/dist/types/core/document.d.ts.map +1 -1
- package/dist/types/core/json.d.ts +11 -0
- package/dist/types/core/json.d.ts.map +1 -0
- package/dist/types/core/model.d.ts +45 -2
- package/dist/types/core/model.d.ts.map +1 -1
- package/dist/types/core/state.d.ts +24 -1
- package/dist/types/core/state.d.ts.map +1 -1
- package/dist/types/diagram/api.d.ts +6 -6
- package/dist/types/diagram/api.d.ts.map +1 -1
- package/dist/types/diagram/catalog.d.ts +2 -1
- package/dist/types/diagram/catalog.d.ts.map +1 -1
- package/dist/types/diagram/event-emitter.d.ts +6 -1
- package/dist/types/diagram/event-emitter.d.ts.map +1 -1
- package/dist/types/diagram/palette.d.ts +1 -1
- package/dist/types/diagram/palette.d.ts.map +1 -1
- package/dist/types/diagram/stocksharp-diagram.d.ts +29 -22
- package/dist/types/diagram/stocksharp-diagram.d.ts.map +1 -1
- package/dist/types/diagram/types.d.ts +4 -4
- package/dist/types/diagram/types.d.ts.map +1 -1
- package/dist/types/embed.d.ts.map +1 -1
- package/dist/types/index.d.ts +3 -3
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/canvas-renderer.ts +84 -29
- package/src/core/action-registry.ts +25 -0
- package/src/core/document.ts +147 -31
- package/src/core/json.ts +16 -0
- package/src/core/model.ts +55 -2
- package/src/core/state.ts +41 -3
- package/src/diagram/api.ts +6 -5
- package/src/diagram/catalog.ts +18 -6
- package/src/diagram/event-emitter.ts +12 -1
- package/src/diagram/palette.ts +1 -1
- package/src/diagram/stocksharp-diagram.ts +79 -76
- package/src/diagram/types.ts +6 -5
- package/src/embed.ts +140 -39
- package/src/index.ts +4 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { DiagramDocument } from '../core/model.js';
|
|
2
|
-
import type { DiagramGlobalErrorKind, DiagramInteractionPermissions, DiagramPortRuntimeState, DiagramRuntimeState, DiagramSelection, DiagramViewState } from '../core/state.js';
|
|
1
|
+
import type { DiagramDocument, PortDynamicMode } from '../core/model.js';
|
|
2
|
+
import type { DiagramGlobalErrorKind, DiagramInteractionPermissions, DiagramPortRuntimeState, DiagramRuntimeState, DiagramSelection, DiagramSnapshot, DiagramViewState } from '../core/state.js';
|
|
3
3
|
import { EventEmitter } from './event-emitter.js';
|
|
4
4
|
import type { DiagramEvents, ContextCommand, DiagramLoadOptions, DiagramFullscreenLabels, DiagramGridSettings, DiagramNodeBounds, DiagramPoint, DiagramOptions, DiagramScreenshotOptions, DiagramThemeOptions, LinkValidationResult, LinkValidator, NodeErrorKind, NodeErrorOptions } from './api.js';
|
|
5
5
|
import { DiagramNode, Link, Port, type PortDirection, type PortUpdate } from './types.js';
|
|
@@ -21,7 +21,6 @@ export declare class StockSharpDiagram extends EventEmitter<DiagramEvents> {
|
|
|
21
21
|
private fullscreen;
|
|
22
22
|
private fullscreenButtonVisible;
|
|
23
23
|
private fullscreenLabels;
|
|
24
|
-
private linkValidator;
|
|
25
24
|
private readonly contextActions;
|
|
26
25
|
constructor(options: DiagramOptions);
|
|
27
26
|
setLinkValidator(validator: LinkValidator | null): void;
|
|
@@ -33,16 +32,20 @@ export declare class StockSharpDiagram extends EventEmitter<DiagramEvents> {
|
|
|
33
32
|
getPortPosition(nodeId: string, direction: PortDirection, portId: string): DiagramPoint | null;
|
|
34
33
|
worldToView(x: number, y: number): DiagramPoint;
|
|
35
34
|
setGridSnap(enabled: boolean, size?: number): void;
|
|
36
|
-
getGridSnap(): DiagramGridSettings
|
|
35
|
+
getGridSnap(): DiagramSnapshot<DiagramGridSettings>;
|
|
37
36
|
nudgeSelection(dx: number, dy: number): boolean;
|
|
38
37
|
addLink(link: Link): boolean;
|
|
39
38
|
validateLink(link: Link, excludeLinkId?: string): LinkValidationResult;
|
|
40
39
|
relink(linkId: string, link: Link): LinkValidationResult;
|
|
41
40
|
removeLink(link: Link): void;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
/** False when nothing changed: no such node or port, or the edit was a no-op. */
|
|
42
|
+
addPort(nodeId: string, direction: PortDirection, port: Port): boolean;
|
|
43
|
+
/** False when nothing changed: no such node or port, or the edit was a no-op. */
|
|
44
|
+
removePort(nodeId: string, direction: PortDirection, portId: string): boolean;
|
|
45
|
+
/** False when nothing changed: no such node or port, or the edit was a no-op. */
|
|
46
|
+
updatePortType(nodeId: string, direction: PortDirection, portId: string, type: string): boolean;
|
|
45
47
|
updatePort(nodeId: string, direction: PortDirection, portId: string, patch: PortUpdate): boolean;
|
|
48
|
+
/** False when nothing changed: no such node or port, or the edit was a no-op. */
|
|
46
49
|
setNodePorts(nodeId: string, inPorts: ReadonlyArray<{
|
|
47
50
|
key: string;
|
|
48
51
|
name: string;
|
|
@@ -51,7 +54,7 @@ export declare class StockSharpDiagram extends EventEmitter<DiagramEvents> {
|
|
|
51
54
|
maxLinks: number;
|
|
52
55
|
availableTypes?: string[];
|
|
53
56
|
isDynamic?: boolean;
|
|
54
|
-
dynamicMode?:
|
|
57
|
+
dynamicMode?: PortDynamicMode;
|
|
55
58
|
}>, outPorts: ReadonlyArray<{
|
|
56
59
|
key: string;
|
|
57
60
|
name: string;
|
|
@@ -60,45 +63,49 @@ export declare class StockSharpDiagram extends EventEmitter<DiagramEvents> {
|
|
|
60
63
|
maxLinks: number;
|
|
61
64
|
availableTypes?: string[];
|
|
62
65
|
isDynamic?: boolean;
|
|
63
|
-
dynamicMode?:
|
|
64
|
-
}>):
|
|
66
|
+
dynamicMode?: PortDynamicMode;
|
|
67
|
+
}>): boolean;
|
|
68
|
+
/** False when nothing changed: no such node or port, or the edit was a no-op. */
|
|
65
69
|
updateNode(nodeId: string, patch: {
|
|
66
70
|
name?: string;
|
|
67
71
|
description?: string;
|
|
68
72
|
color?: string;
|
|
69
73
|
border?: string;
|
|
70
|
-
}):
|
|
71
|
-
|
|
74
|
+
}): boolean;
|
|
75
|
+
/** False when nothing changed: no such node or port, or the edit was a no-op. */
|
|
76
|
+
setNodeMessage(nodeId: string, message: string): boolean;
|
|
72
77
|
setNodeError(nodeId: string, message: string, options?: NodeErrorOptions): boolean;
|
|
73
78
|
clearNodeError(nodeId: string, kind?: NodeErrorKind): boolean;
|
|
74
|
-
getRuntimeState(): DiagramRuntimeState
|
|
75
|
-
setRuntimeState(state: DiagramRuntimeState): void;
|
|
79
|
+
getRuntimeState(): DiagramSnapshot<DiagramRuntimeState>;
|
|
80
|
+
setRuntimeState(state: DiagramSnapshot<DiagramRuntimeState>): void;
|
|
76
81
|
clearRuntimeState(): void;
|
|
77
82
|
setActiveNode(nodeId: string | null): boolean;
|
|
78
83
|
setPortRuntimeState(nodeId: string, direction: PortDirection, portId: string, patch: Partial<DiagramPortRuntimeState>): boolean;
|
|
79
84
|
setGlobalError(message: string | null, kind?: DiagramGlobalErrorKind): void;
|
|
80
|
-
|
|
81
|
-
|
|
85
|
+
/** False when nothing changed: no such node or port, or the edit was a no-op. */
|
|
86
|
+
setNodeParamValue(nodeId: string, paramName: string, value: string | undefined): boolean;
|
|
87
|
+
/** False when nothing changed: no such node or port, or the edit was a no-op. */
|
|
88
|
+
setNodeName(nodeId: string, value: string): boolean;
|
|
82
89
|
/** Groups host-driven document edits into one undo/redo operation. */
|
|
83
90
|
transaction<T>(label: string, action: () => T): T;
|
|
84
91
|
setShowNodeMessages(show: boolean): void;
|
|
85
92
|
setReadOnly(readonly: boolean): void;
|
|
86
|
-
getInteractionPermissions(): DiagramInteractionPermissions
|
|
93
|
+
getInteractionPermissions(): DiagramSnapshot<DiagramInteractionPermissions>;
|
|
87
94
|
setInteractionPermissions(patch: Partial<DiagramInteractionPermissions>): void;
|
|
88
95
|
applySocketTheme(): void;
|
|
89
96
|
applyOverviewTheme(): void;
|
|
90
97
|
setOverviewVisible(visible: boolean): void;
|
|
91
98
|
zoomToFit(): void;
|
|
92
99
|
setZoom(scale: number): void;
|
|
93
|
-
getViewState(): DiagramViewState
|
|
94
|
-
setViewState(state: DiagramViewState): void;
|
|
100
|
+
getViewState(): DiagramSnapshot<DiagramViewState>;
|
|
101
|
+
setViewState(state: DiagramSnapshot<DiagramViewState>): void;
|
|
95
102
|
/** Serializes only viewport preferences; strategy data stays in saveDocument(). */
|
|
96
103
|
saveViewState(space?: number): string;
|
|
97
104
|
/** Restores a versioned viewport snapshot produced by saveViewState(). */
|
|
98
105
|
loadViewState(source: string | unknown): void;
|
|
99
106
|
/** Detached PNG-ready canvas; use scope: 'content' for the complete scheme. */
|
|
100
107
|
takeScreenshot(options?: DiagramScreenshotOptions): HTMLCanvasElement;
|
|
101
|
-
getSelection(): DiagramSelection
|
|
108
|
+
getSelection(): DiagramSnapshot<DiagramSelection>;
|
|
102
109
|
selectNodes(nodeIds: readonly string[]): void;
|
|
103
110
|
selectLink(linkId: string | null): void;
|
|
104
111
|
selectPort(nodeId: string, direction: PortDirection, portId: string): void;
|
|
@@ -107,8 +114,8 @@ export declare class StockSharpDiagram extends EventEmitter<DiagramEvents> {
|
|
|
107
114
|
setFullscreenButtonVisible(visible: boolean): void;
|
|
108
115
|
isFullscreenButtonVisible(): boolean;
|
|
109
116
|
/** Text of the fullscreen button, for a host that renders in another language. */
|
|
110
|
-
setFullscreenLabels(labels: DiagramFullscreenLabels): void;
|
|
111
|
-
getFullscreenLabels(): DiagramFullscreenLabels
|
|
117
|
+
setFullscreenLabels(labels: DiagramSnapshot<DiagramFullscreenLabels>): void;
|
|
118
|
+
getFullscreenLabels(): DiagramSnapshot<DiagramFullscreenLabels>;
|
|
112
119
|
/** Updates only the control's state after the host changed its own layout. */
|
|
113
120
|
setFullscreenState(fullscreen: boolean): void;
|
|
114
121
|
setTheme(options: DiagramThemeOptions): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stocksharp-diagram.d.ts","sourceRoot":"","sources":["../../../src/diagram/stocksharp-diagram.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"stocksharp-diagram.d.ts","sourceRoot":"","sources":["../../../src/diagram/stocksharp-diagram.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { JsonObject } from '../core/model.js';
|
|
1
|
+
import type { JsonObject, PortDynamicMode } from '../core/model.js';
|
|
2
2
|
export interface PortTypeInit {
|
|
3
3
|
name: string;
|
|
4
4
|
color: string;
|
|
@@ -16,7 +16,7 @@ export interface PortInit {
|
|
|
16
16
|
maxLinks?: number;
|
|
17
17
|
availableTypes?: string[];
|
|
18
18
|
isDynamic?: boolean;
|
|
19
|
-
dynamicMode?:
|
|
19
|
+
dynamicMode?: PortDynamicMode;
|
|
20
20
|
isSibling?: boolean;
|
|
21
21
|
}
|
|
22
22
|
/** Mutable port properties. Port identity and direction remain stable. */
|
|
@@ -29,7 +29,7 @@ export declare class Port {
|
|
|
29
29
|
maxLinks: number;
|
|
30
30
|
availableTypes: string[];
|
|
31
31
|
isDynamic: boolean;
|
|
32
|
-
dynamicMode:
|
|
32
|
+
dynamicMode: PortDynamicMode;
|
|
33
33
|
isSibling: boolean;
|
|
34
34
|
constructor(init: PortInit);
|
|
35
35
|
clone(): Port;
|
|
@@ -124,7 +124,7 @@ export interface PortData {
|
|
|
124
124
|
direction: PortDirection;
|
|
125
125
|
availableTypes?: string[];
|
|
126
126
|
isDynamic?: boolean;
|
|
127
|
-
dynamicMode?:
|
|
127
|
+
dynamicMode?: PortDynamicMode;
|
|
128
128
|
isSibling?: boolean;
|
|
129
129
|
}
|
|
130
130
|
export interface NodeData {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/diagram/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/diagram/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../../src/embed.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGpE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../../src/embed.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGpE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AA4BnE,MAAM,WAAW,sBAAsB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;CAAE;AAC3G,MAAM,WAAW,sBAAsB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;CAAE;AACvG,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,KAAK,EAAE,sBAAsB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IACnC,qBAAqB,CAAC,EAAE,CACvB,OAAO,EAAE,0BAA0B,EACnC,MAAM,EAAE,kBAAkB,KACtB,IAAI,CAAC;IACV,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACnD;AAgPD,wBAAsB,YAAY,CACjC,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,mBAAwB,GAC/B,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAEpC;AA6JD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAGhE;AA4DD,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,mBAAwB,GAC/B,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA2BpC;AAKD,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAC/B,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAwBpC;AAKD,wBAAgB,SAAS,CAAC,IAAI,GAAE,UAAqB,EAAE,OAAO,GAAE,mBAAwB,GAAG,IAAI,CAkB9F"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -4,11 +4,11 @@ export type { DiagramAction, DiagramActionState, } from './core/action-registry.
|
|
|
4
4
|
export { DiagramCommandHistory } from './core/history.js';
|
|
5
5
|
export type { DiagramCommand, DiagramHistoryListener, DiagramHistoryState, } from './core/history.js';
|
|
6
6
|
export { DIAGRAM_DOCUMENT_VERSION } from './core/model.js';
|
|
7
|
-
export type { DiagramDocument, DiagramDocumentEndpoint, DiagramDocumentInput, DiagramDocumentLink, DiagramDocumentLinkInput, DiagramDocumentNode, DiagramDocumentNodeInput, DiagramDocumentPort, DiagramDocumentPortInput, DiagramDocumentVersion, DiagramParameterSchema, JsonObject, JsonPrimitive, JsonValue, } from './core/model.js';
|
|
8
|
-
export { createEditableDiagramPermissions, createDiagramNodeRuntimeState, createDiagramPortRuntimeState, createDiagramRuntimeState, cloneDiagramRuntimeState, createDiagramSelection, createDiagramViewState, createReadOnlyDiagramPermissions, } from './core/state.js';
|
|
7
|
+
export type { DiagramDocument, DiagramDocumentEndpoint, DiagramDocumentInput, DiagramDocumentLink, DiagramDocumentLinkInput, DiagramDocumentNode, DiagramDocumentNodeInput, DiagramDocumentPort, DiagramDocumentPortInput, DiagramDocumentVersion, DiagramParameterSchema, JsonObject, JsonPrimitive, JsonValue, PortDynamicMode, } from './core/model.js';
|
|
8
|
+
export { createEditableDiagramPermissions, createDiagramNodeRuntimeState, createDiagramPortRuntimeState, createDiagramRuntimeState, cloneDiagramNodeErrors, cloneDiagramRuntimeState, createDiagramSelection, createDiagramViewState, createReadOnlyDiagramPermissions, } from './core/state.js';
|
|
9
9
|
export { DIAGRAM_VIEW_STATE_VERSION, DiagramViewStateError, createDiagramViewStateDocument, parseDiagramViewState, serializeDiagramViewState, } from './core/view-state.js';
|
|
10
10
|
export type { DiagramViewStateDocument } from './core/view-state.js';
|
|
11
|
-
export type { DiagramErrorState, DiagramGlobalErrorKind, DiagramInteractionPermissions, DiagramNodeErrorKind, DiagramNodePortRuntimeState, DiagramNodeRuntimeState, DiagramPortDirection, DiagramPortRuntimeState, DiagramRuntimeState, DiagramSelectedPort, DiagramSelection, DiagramViewState, } from './core/state.js';
|
|
11
|
+
export type { DiagramErrorState, DiagramGlobalErrorKind, DiagramInteractionPermissions, DiagramNodeErrorKind, DiagramNodeErrors, DiagramNodePortRuntimeState, DiagramNodeRuntimeState, DiagramPortDirection, DiagramPortRuntimeState, DiagramRuntimeState, DiagramSelectedPort, DiagramSelection, DiagramSnapshot, DiagramViewState, } from './core/state.js';
|
|
12
12
|
export { StockSharpDiagram, } from './diagram/stocksharp-diagram.js';
|
|
13
13
|
export type { ContextCommand, ContextCommandPayload, ContextCommandState, ContextMenuRequestedPayload, DiagramEvents, DiagramClipboard, DiagramGridSettings, DiagramLoadOptions, DiagramNodeBounds, DiagramOptions, DiagramPoint, DiagramScreenshotOptions, DiagramScreenshotScope, DiagramThemeOptions, DocumentLoadFailedPayload, LinkChangePayload, LinkHoverPayload, LinkRelinkedPayload, LinkSelectedPayload, LinkValidationPayload, LinkValidationReason, LinkValidationResult, LinkValidator, LinkValidatorArgs, LoadFinishedPayload, NodeChangePayload, NodeErrorKind, NodeErrorOptions, NodeHoverPayload, NodeMovedPayload, NodeSelectedPayload, PortHoverPayload, PortClickAction, PortClickedPayload, PortSelectedPayload, } from './diagram/api.js';
|
|
14
14
|
export { StockSharpCatalog } from './diagram/catalog.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,GAC3B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,YAAY,EACR,aAAa,EACb,kBAAkB,GACrB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,YAAY,EACR,cAAc,EACd,sBAAsB,EACtB,mBAAmB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,YAAY,EACR,eAAe,EACf,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,EACtB,UAAU,EACV,aAAa,EACb,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stocksharp/diagram",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Browser strategy-diagram editor for StockSharp with typed ports, palette, canvas rendering, persistence, and a TypeScript API.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"author": {
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
"scripts": {
|
|
108
108
|
"build": "node build.mjs",
|
|
109
109
|
"prepack": "npm run build",
|
|
110
|
-
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
110
|
+
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.demo.json && tsc --noEmit -p tsconfig.test.json",
|
|
111
111
|
"api:check": "node tools/check-public-api.mjs",
|
|
112
112
|
"api:update": "node tools/check-public-api.mjs --update",
|
|
113
113
|
"serve": "node serve.mjs",
|
package/src/canvas-renderer.ts
CHANGED
|
@@ -6,11 +6,16 @@
|
|
|
6
6
|
|
|
7
7
|
import { createDiagramDocument, parseDiagramDocument } from './core/document.js';
|
|
8
8
|
import { DiagramCommandHistory } from './core/history.js';
|
|
9
|
+
import { setJsonKey } from './core/json.js';
|
|
10
|
+
import { toPortDynamicMode } from './core/model.js';
|
|
9
11
|
import type {
|
|
12
|
+
DiagramDocumentZone,
|
|
13
|
+
DiagramLinkStyle,
|
|
10
14
|
DiagramDocument,
|
|
11
15
|
DiagramParameterSchema,
|
|
12
16
|
JsonObject,
|
|
13
17
|
JsonValue,
|
|
18
|
+
PortDynamicMode,
|
|
14
19
|
} from './core/model.js';
|
|
15
20
|
import type {
|
|
16
21
|
DiagramGlobalErrorKind,
|
|
@@ -40,7 +45,7 @@ export interface PortInit {
|
|
|
40
45
|
maxLinks?: number;
|
|
41
46
|
availableTypes?: string[];
|
|
42
47
|
isDynamic?: boolean;
|
|
43
|
-
dynamicMode?:
|
|
48
|
+
dynamicMode?: PortDynamicMode;
|
|
44
49
|
isSibling?: boolean;
|
|
45
50
|
metadata?: JsonObject;
|
|
46
51
|
}
|
|
@@ -80,6 +85,8 @@ export interface LinkInit {
|
|
|
80
85
|
fromPort: string;
|
|
81
86
|
to: string;
|
|
82
87
|
toPort: string;
|
|
88
|
+
/** Solid unless the link is one that may not be there - see DiagramLinkStyle. */
|
|
89
|
+
style?: DiagramLinkStyle;
|
|
83
90
|
metadata?: JsonObject;
|
|
84
91
|
}
|
|
85
92
|
|
|
@@ -98,6 +105,8 @@ export interface DiagramOptions {
|
|
|
98
105
|
gridColor?: string;
|
|
99
106
|
/** Snap dragged nodes to a world-space grid. Defaults to false for the low-level renderer. */
|
|
100
107
|
gridSnap?: boolean;
|
|
108
|
+
/** Tint for a zone that names no colour of its own. */
|
|
109
|
+
zoneColor?: string;
|
|
101
110
|
/** Positive world-space grid step. Defaults to 28. */
|
|
102
111
|
gridSize?: number;
|
|
103
112
|
/** Optional explicit socket-type → colour map; unknown types hash to a hue. */
|
|
@@ -258,7 +267,7 @@ function copyJsonValue(value: JsonValue): JsonValue {
|
|
|
258
267
|
function copyJsonObject(value: JsonObject | undefined): JsonObject {
|
|
259
268
|
if (value === undefined) return {};
|
|
260
269
|
const result: JsonObject = {};
|
|
261
|
-
for (const [key, item] of Object.entries(value)) result
|
|
270
|
+
for (const [key, item] of Object.entries(value)) setJsonKey(result, key, copyJsonValue(item));
|
|
262
271
|
return result;
|
|
263
272
|
}
|
|
264
273
|
|
|
@@ -298,7 +307,7 @@ export class PortModel {
|
|
|
298
307
|
maxLinks: number;
|
|
299
308
|
availableTypes: string[];
|
|
300
309
|
isDynamic: boolean;
|
|
301
|
-
dynamicMode:
|
|
310
|
+
dynamicMode: PortDynamicMode;
|
|
302
311
|
isSibling: boolean;
|
|
303
312
|
metadata: JsonObject;
|
|
304
313
|
// layout cache (world coords), filled at draw time
|
|
@@ -313,7 +322,7 @@ export class PortModel {
|
|
|
313
322
|
this.maxLinks = typeof init.maxLinks === 'number' ? init.maxLinks : 0;
|
|
314
323
|
this.availableTypes = [...(init.availableTypes ?? [])];
|
|
315
324
|
this.isDynamic = init.isDynamic ?? false;
|
|
316
|
-
this.dynamicMode = init.dynamicMode
|
|
325
|
+
this.dynamicMode = toPortDynamicMode(init.dynamicMode);
|
|
317
326
|
this.isSibling = init.isSibling ?? false;
|
|
318
327
|
this.metadata = copyJsonObject(init.metadata);
|
|
319
328
|
}
|
|
@@ -421,6 +430,7 @@ export class LinkModel {
|
|
|
421
430
|
public toPort: string,
|
|
422
431
|
id: string = '',
|
|
423
432
|
metadata?: JsonObject,
|
|
433
|
+
public style: DiagramLinkStyle = 'solid',
|
|
424
434
|
) {
|
|
425
435
|
this.id = id;
|
|
426
436
|
this.metadata = copyJsonObject(metadata);
|
|
@@ -434,15 +444,14 @@ export class LinkModel {
|
|
|
434
444
|
fromPort: this.fromPort,
|
|
435
445
|
to: this.to,
|
|
436
446
|
toPort: this.toPort,
|
|
447
|
+
style: this.style,
|
|
437
448
|
metadata: copyJsonObject(this.metadata),
|
|
438
449
|
};
|
|
439
450
|
}
|
|
440
451
|
}
|
|
441
452
|
|
|
442
|
-
const HEADER_H = 22;
|
|
443
453
|
const PORT_R = 6;
|
|
444
454
|
const PORT_ROW_H = 20;
|
|
445
|
-
const NODE_PAD = 10;
|
|
446
455
|
const RELINK_HANDLE_PX = 8; // WPF relink adornment is an 8x8 diamond
|
|
447
456
|
const RELINK_DRAG_THRESHOLD_PX = 4;
|
|
448
457
|
const PORT_SQ = 9; // socket square size — sits outside the node
|
|
@@ -503,6 +512,7 @@ export class Diagram {
|
|
|
503
512
|
|
|
504
513
|
private nodes: NodeModel[] = [];
|
|
505
514
|
private links: LinkModel[] = [];
|
|
515
|
+
private zones: DiagramDocumentZone[] = [];
|
|
506
516
|
private idSeq = 1;
|
|
507
517
|
private linkSeq = 1;
|
|
508
518
|
private documentMetadata: JsonObject = {};
|
|
@@ -530,8 +540,6 @@ export class Diagram {
|
|
|
530
540
|
private dragNode: NodeModel | null = null;
|
|
531
541
|
private dragStart: Array<{ n: NodeModel; x: number; y: number }> = []; // group-drag origin
|
|
532
542
|
private dragAnchor = { wx: 0, wy: 0 };
|
|
533
|
-
private dragDX = 0;
|
|
534
|
-
private dragDY = 0;
|
|
535
543
|
private panning = false;
|
|
536
544
|
private panX = 0;
|
|
537
545
|
private panY = 0;
|
|
@@ -828,7 +836,7 @@ export class Diagram {
|
|
|
828
836
|
this.emit('linkValidation', { fromNode: fn, from: fp, toNode: tn, to: tp, ...validation });
|
|
829
837
|
if (!validation.allowed) return false;
|
|
830
838
|
}
|
|
831
|
-
const link = new LinkModel(init.from, init.fromPort, init.to, init.toPort, init.id ?? this.nextLinkId(), init.metadata);
|
|
839
|
+
const link = new LinkModel(init.from, init.fromPort, init.to, init.toPort, init.id ?? this.nextLinkId(), init.metadata, init.style ?? 'solid');
|
|
832
840
|
if (this.links.some((l) => l.id === link.id)) return false;
|
|
833
841
|
this.links.splice(clamp(Math.trunc(index), 0, this.links.length), 0, link);
|
|
834
842
|
this.emit('linkAdded', { link });
|
|
@@ -1121,7 +1129,7 @@ export class Diagram {
|
|
|
1121
1129
|
setNodeParamValue(nodeId: string, name: string, value: string | undefined): boolean {
|
|
1122
1130
|
return this.updateNodeState(nodeId, 'set node parameter', (node) => {
|
|
1123
1131
|
if (value === undefined) delete node.paramValues[name];
|
|
1124
|
-
else node.paramValues
|
|
1132
|
+
else setJsonKey(node.paramValues, name, value);
|
|
1125
1133
|
});
|
|
1126
1134
|
}
|
|
1127
1135
|
|
|
@@ -1201,13 +1209,13 @@ export class Diagram {
|
|
|
1201
1209
|
if (this.links.some((existing) => existing.id === id)) {
|
|
1202
1210
|
throw new Error(`ssdiagram: duplicate link id "${id}"`);
|
|
1203
1211
|
}
|
|
1204
|
-
const model = new LinkModel(link.from, link.fromPort, link.to, link.toPort, id, link.metadata);
|
|
1212
|
+
const model = new LinkModel(link.from, link.fromPort, link.to, link.toPort, id, link.metadata, link.style ?? 'solid');
|
|
1205
1213
|
if (!this.links.some((existing) => existing.key() === model.key())) this.links.push(model);
|
|
1206
1214
|
}
|
|
1207
1215
|
for (const node of this.nodes) {
|
|
1208
1216
|
if (node.loadError.length === 0) continue;
|
|
1209
1217
|
const state = createDiagramNodeRuntimeState();
|
|
1210
|
-
state.
|
|
1218
|
+
state.errors.load = { kind: 'load', message: node.loadError, pulse: ++this.runtimePulse };
|
|
1211
1219
|
this.runtimeState.nodes[node.id] = state;
|
|
1212
1220
|
}
|
|
1213
1221
|
if (Object.keys(this.runtimeState.nodes).length > 0) this.emitRuntimeStateChanged();
|
|
@@ -1233,9 +1241,11 @@ export class Diagram {
|
|
|
1233
1241
|
fromPort: link.from.portId,
|
|
1234
1242
|
to: link.to.nodeId,
|
|
1235
1243
|
toPort: link.to.portId,
|
|
1244
|
+
style: link.style,
|
|
1236
1245
|
metadata: link.metadata,
|
|
1237
1246
|
})),
|
|
1238
1247
|
);
|
|
1248
|
+
this.zones = document.zones.map((zone) => ({ ...zone, metadata: copyJsonObject(zone.metadata) }));
|
|
1239
1249
|
this.documentMetadata = copyJsonObject(document.metadata);
|
|
1240
1250
|
}
|
|
1241
1251
|
|
|
@@ -1246,8 +1256,10 @@ export class Diagram {
|
|
|
1246
1256
|
id: link.id,
|
|
1247
1257
|
from: { nodeId: link.from, portId: link.fromPort },
|
|
1248
1258
|
to: { nodeId: link.to, portId: link.toPort },
|
|
1259
|
+
style: link.style,
|
|
1249
1260
|
metadata: link.metadata,
|
|
1250
1261
|
})),
|
|
1262
|
+
zones: this.zones.map((zone) => ({ ...zone, metadata: copyJsonObject(zone.metadata) })),
|
|
1251
1263
|
metadata: this.documentMetadata,
|
|
1252
1264
|
});
|
|
1253
1265
|
}
|
|
@@ -1418,15 +1430,17 @@ export class Diagram {
|
|
|
1418
1430
|
this.runtimePulse = Math.max(
|
|
1419
1431
|
this.runtimePulse,
|
|
1420
1432
|
this.runtimeState.globalError?.pulse ?? 0,
|
|
1421
|
-
...Object.values(this.runtimeState.nodes)
|
|
1433
|
+
...Object.values(this.runtimeState.nodes)
|
|
1434
|
+
.flatMap((node) => [node.errors.runtime?.pulse ?? 0, node.errors.load?.pulse ?? 0]),
|
|
1422
1435
|
);
|
|
1423
1436
|
for (const node of this.nodes) {
|
|
1424
|
-
const
|
|
1425
|
-
const
|
|
1426
|
-
|
|
1427
|
-
node.
|
|
1428
|
-
|
|
1429
|
-
|
|
1437
|
+
const errors = this.runtimeState.nodes[node.id]?.errors;
|
|
1438
|
+
const previousRuntime = previous.nodes[node.id]?.errors.runtime;
|
|
1439
|
+
const runtimeError = errors?.runtime;
|
|
1440
|
+
node.runtimeError = runtimeError?.message ?? '';
|
|
1441
|
+
node.loadError = errors?.load?.message ?? '';
|
|
1442
|
+
if (runtimeError !== undefined) {
|
|
1443
|
+
if (previousRuntime === undefined || previousRuntime.pulse !== runtimeError.pulse) {
|
|
1430
1444
|
node.errorFlashStart = performance.now();
|
|
1431
1445
|
}
|
|
1432
1446
|
} else {
|
|
@@ -1486,7 +1500,11 @@ export class Diagram {
|
|
|
1486
1500
|
const state = this.getRuntimeState();
|
|
1487
1501
|
const nodeState = state.nodes[id] ?? createDiagramNodeRuntimeState();
|
|
1488
1502
|
state.nodes[id] = nodeState;
|
|
1489
|
-
|
|
1503
|
+
// Only this kind's slot is written, so an error of the other kind that is
|
|
1504
|
+
// already on the node survives.
|
|
1505
|
+
if (message.length === 0) delete nodeState.errors[kind];
|
|
1506
|
+
else if (kind === 'load') nodeState.errors.load = { kind, message, pulse: ++this.runtimePulse };
|
|
1507
|
+
else nodeState.errors.runtime = { kind, message, pulse: ++this.runtimePulse };
|
|
1490
1508
|
this.runtimeState = state;
|
|
1491
1509
|
this.emitRuntimeStateChanged();
|
|
1492
1510
|
return true;
|
|
@@ -1501,12 +1519,9 @@ export class Diagram {
|
|
|
1501
1519
|
if (kind === undefined || kind === 'load') node.loadError = '';
|
|
1502
1520
|
const state = this.getRuntimeState();
|
|
1503
1521
|
const nodeState = state.nodes[id];
|
|
1504
|
-
if (nodeState !== undefined
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
: node.loadError.length > 0
|
|
1508
|
-
? { kind: 'load', message: node.loadError, pulse: ++this.runtimePulse }
|
|
1509
|
-
: null;
|
|
1522
|
+
if (nodeState !== undefined) {
|
|
1523
|
+
if (kind === undefined || kind === 'runtime') delete nodeState.errors.runtime;
|
|
1524
|
+
if (kind === undefined || kind === 'load') delete nodeState.errors.load;
|
|
1510
1525
|
}
|
|
1511
1526
|
this.runtimeState = state;
|
|
1512
1527
|
this.emitRuntimeStateChanged();
|
|
@@ -2505,7 +2520,10 @@ export class Diagram {
|
|
|
2505
2520
|
if (options.grid) this.drawGrid();
|
|
2506
2521
|
ctx.setTransform(this.dpr * this.scale, 0, 0, this.dpr * this.scale,
|
|
2507
2522
|
this.dpr * this.offX, this.dpr * (this.offY + introDy));
|
|
2508
|
-
//
|
|
2523
|
+
// Zones sit under everything: they say where things are, and a place that painted over
|
|
2524
|
+
// its occupants would be worse than no place at all.
|
|
2525
|
+
this.drawZones();
|
|
2526
|
+
// Links next. Each link jumps over the verticals of the links
|
|
2509
2527
|
// drawn before it (deterministic bridge — Link.JumpOver parity).
|
|
2510
2528
|
const prior: Seg[] = []; // segments of links already drawn
|
|
2511
2529
|
const hoveredNode = this.hoverPort?.node ?? this.hoverNode;
|
|
@@ -2526,7 +2544,7 @@ export class Diagram {
|
|
|
2526
2544
|
const color = state === 'sel' ? this.selectionColor() : state === 'hov' ? this.linkHoverColor() : baseColor;
|
|
2527
2545
|
const width = state === 'sel' ? 3 : state === 'hov' ? 2.6 : 2;
|
|
2528
2546
|
const pts = this.routeLink(a, b, new Set([l.from, l.to]));
|
|
2529
|
-
this.strokeRoute(pts, color, width, prior);
|
|
2547
|
+
this.strokeRoute(pts, color, width, prior, l.style);
|
|
2530
2548
|
this.drawArrow(pts, color);
|
|
2531
2549
|
for (let k = 1; k < pts.length; k += 1) {
|
|
2532
2550
|
const [x1, y1] = pts[k - 1];
|
|
@@ -2669,6 +2687,40 @@ export class Diagram {
|
|
|
2669
2687
|
}
|
|
2670
2688
|
return lines.length > 0 ? lines : [''];
|
|
2671
2689
|
}
|
|
2690
|
+
private drawZones(): void {
|
|
2691
|
+
if (this.zones.length === 0) return;
|
|
2692
|
+
|
|
2693
|
+
const ctx = this.ctx;
|
|
2694
|
+
|
|
2695
|
+
for (const zone of this.zones) {
|
|
2696
|
+
const tint = zone.color.length > 0 ? zone.color : (this.opts.zoneColor ?? '#8a8f98');
|
|
2697
|
+
ctx.save();
|
|
2698
|
+
roundRect(ctx, zone.x, zone.y, zone.width, zone.height, 10);
|
|
2699
|
+
ctx.globalAlpha = 0.12;
|
|
2700
|
+
ctx.fillStyle = tint;
|
|
2701
|
+
ctx.fill();
|
|
2702
|
+
ctx.globalAlpha = 0.5;
|
|
2703
|
+
ctx.setLineDash([10, 6]);
|
|
2704
|
+
ctx.lineWidth = 1.5;
|
|
2705
|
+
ctx.strokeStyle = tint;
|
|
2706
|
+
ctx.stroke();
|
|
2707
|
+
ctx.restore();
|
|
2708
|
+
|
|
2709
|
+
if (zone.name.length === 0) continue;
|
|
2710
|
+
|
|
2711
|
+
ctx.save();
|
|
2712
|
+
ctx.globalAlpha = 0.75;
|
|
2713
|
+
ctx.fillStyle = tint;
|
|
2714
|
+
ctx.font = '600 12px Segoe UI, Tahoma, sans-serif';
|
|
2715
|
+
ctx.textAlign = 'left';
|
|
2716
|
+
ctx.textBaseline = 'top';
|
|
2717
|
+
// Inside the top-left corner: a caption outside the box would collide with whatever
|
|
2718
|
+
// sits above it, and the corner is the one spot a rectangle always has to spare.
|
|
2719
|
+
ctx.fillText(zone.name, zone.x + 12, zone.y + 9, Math.max(0, zone.width - 24));
|
|
2720
|
+
ctx.restore();
|
|
2721
|
+
}
|
|
2722
|
+
}
|
|
2723
|
+
|
|
2672
2724
|
private drawGrid(): void {
|
|
2673
2725
|
const ctx = this.ctx;
|
|
2674
2726
|
const step = this.gridSize * this.scale;
|
|
@@ -2794,10 +2846,12 @@ export class Diagram {
|
|
|
2794
2846
|
// Symmetric jump-over: any segment of THIS link hops the perpendicular
|
|
2795
2847
|
// segments of links drawn before it (H over earlier V, V over earlier
|
|
2796
2848
|
// H). Exactly one bridge per real crossing, consistent everywhere.
|
|
2797
|
-
private strokeRoute(pts: number[][], color: string, width: number, prior: Seg[]): void {
|
|
2849
|
+
private strokeRoute(pts: number[][], color: string, width: number, prior: Seg[], style: DiagramLinkStyle = 'solid'): void {
|
|
2798
2850
|
const ctx = this.ctx;
|
|
2799
2851
|
ctx.strokeStyle = color;
|
|
2800
2852
|
ctx.lineWidth = width;
|
|
2853
|
+
// The dash is measured in world units, so it keeps its rhythm as the canvas is zoomed.
|
|
2854
|
+
if (style === 'dashed') ctx.setLineDash([9, 6]);
|
|
2801
2855
|
ctx.lineJoin = 'miter';
|
|
2802
2856
|
ctx.lineCap = 'butt';
|
|
2803
2857
|
ctx.beginPath();
|
|
@@ -2850,6 +2904,7 @@ export class Diagram {
|
|
|
2850
2904
|
}
|
|
2851
2905
|
}
|
|
2852
2906
|
ctx.stroke();
|
|
2907
|
+
ctx.setLineDash([]);
|
|
2853
2908
|
}
|
|
2854
2909
|
private drawArrow(pts: number[][], color: string): void {
|
|
2855
2910
|
const n = pts.length;
|
|
@@ -22,6 +22,31 @@ export class DiagramActionRegistry<TId extends string, TContext> {
|
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Registers one action per id from a table keyed by TId, in key order.
|
|
27
|
+
* Because the table is a total Record, adding a member to TId without adding
|
|
28
|
+
* its action stops compiling instead of producing a command that silently
|
|
29
|
+
* does nothing.
|
|
30
|
+
*/
|
|
31
|
+
registerAll(actions: Record<TId, Omit<DiagramAction<TId, TContext>, 'id'>>): () => void {
|
|
32
|
+
// Object.keys is typed string[] because a value can carry keys beyond the
|
|
33
|
+
// ones its type names. This parameter is a total Record over TId, so its
|
|
34
|
+
// keys are exactly TId.
|
|
35
|
+
const ids = Object.keys(actions) as TId[];
|
|
36
|
+
// Delegating rather than spreading: a spread would copy own fields and
|
|
37
|
+
// drop the prototype, so a class-based action would register cleanly and
|
|
38
|
+
// then throw on its first call.
|
|
39
|
+
const disposers = ids.map((id) => {
|
|
40
|
+
const action = actions[id];
|
|
41
|
+
return this.register({
|
|
42
|
+
id,
|
|
43
|
+
canExecute: (context) => action.canExecute(context),
|
|
44
|
+
execute: (context) => action.execute(context),
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
return () => disposers.forEach((dispose) => dispose());
|
|
48
|
+
}
|
|
49
|
+
|
|
25
50
|
get(id: TId): DiagramAction<TId, TContext> | null {
|
|
26
51
|
return this.actions.get(id) ?? null;
|
|
27
52
|
}
|