@bpmn-nova/studio 0.3.0-preview → 0.3.2-preview
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/README.md +245 -20
- package/dist/canvas.js +7 -4
- package/dist/context-menu.js +2 -2
- package/dist/controller.js +84 -6
- package/dist/index.d.ts +138 -38
- package/dist/index.js +12 -11
- package/dist/interactions.js +1 -1
- package/dist/modules/bpmn-model/index.d.ts +11 -0
- package/dist/modules/bpmn-model/index.js +703 -0
- package/dist/modules/core/containment.js +590 -0
- package/dist/modules/core/gateway.js +72 -0
- package/dist/modules/core/history.js +32 -0
- package/dist/modules/core/index.d.ts +268 -0
- package/dist/modules/core/index.js +7 -0
- package/dist/modules/core/layout.js +644 -0
- package/dist/modules/core/model.js +287 -0
- package/dist/modules/core/runtime-transition-route.js +360 -0
- package/dist/modules/core/scope.js +99 -0
- package/dist/modules/designer/index.d.ts +79 -0
- package/dist/modules/designer/index.js +607 -0
- package/dist/modules/engine-activiti/index.d.ts +19 -0
- package/dist/modules/engine-activiti/index.js +160 -0
- package/dist/modules/engine-flowable/index.d.ts +19 -0
- package/dist/modules/engine-flowable/index.js +160 -0
- package/dist/modules/export-svg/index.d.ts +112 -0
- package/dist/modules/export-svg/index.js +2 -0
- package/dist/modules/export-svg/preview.js +327 -0
- package/dist/modules/export-svg/render.js +718 -0
- package/dist/modules/icons/index.d.ts +24 -0
- package/dist/modules/icons/index.js +264 -0
- package/dist/modules/palette/index.d.ts +74 -0
- package/dist/modules/palette/index.js +99 -0
- package/dist/modules/palette/panel.js +99 -0
- package/dist/modules/properties/index.d.ts +20 -0
- package/dist/modules/properties/index.js +19 -0
- package/dist/modules/properties-activiti/index.d.ts +3 -0
- package/dist/modules/properties-activiti/index.js +97 -0
- package/dist/modules/properties-bpmn/index.d.ts +3 -0
- package/dist/modules/properties-bpmn/index.js +518 -0
- package/dist/modules/properties-core/index.d.ts +124 -0
- package/dist/modules/properties-core/index.js +312 -0
- package/dist/modules/properties-flowable/index.d.ts +3 -0
- package/dist/modules/properties-flowable/index.js +114 -0
- package/dist/modules/properties-renderer/index.d.ts +25 -0
- package/dist/modules/properties-renderer/index.js +491 -0
- package/dist/modules/renderer-svg/index.d.ts +118 -0
- package/dist/modules/renderer-svg/index.js +1460 -0
- package/dist/modules/runtime/index.d.ts +169 -0
- package/dist/modules/runtime/index.js +535 -0
- package/dist/modules/theme/index.d.ts +95 -0
- package/dist/modules/theme/index.js +368 -0
- package/dist/modules/viewer/index.d.ts +265 -0
- package/dist/modules/viewer/index.js +1011 -0
- package/dist/modules/viewer/runtime-content.js +123 -0
- package/dist/modules/viewer/runtime-details-motion.js +228 -0
- package/dist/modules/viewer/runtime-trace.js +574 -0
- package/dist/modules/viewer/timeline.js +276 -0
- package/dist/selection-layout.js +1 -1
- package/dist/shell.js +210 -26
- package/dist/styles.css +116 -7
- package/llms-full.txt +3082 -0
- package/llms.txt +225 -0
- package/package.json +39 -16
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export const EMBEDDED_SUBPROCESS_TYPES = new Set(['subProcess', 'eventSubProcess', 'transaction', 'adHocSubProcess']);
|
|
2
|
+
|
|
3
|
+
export function isEmbeddedSubProcess(nodeOrType) {
|
|
4
|
+
return EMBEDDED_SUBPROCESS_TYPES.has(typeof nodeOrType === 'string' ? nodeOrType : nodeOrType?.type);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function elementScopeId(model, element) {
|
|
8
|
+
return element?.scopeId || model?.id || '';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function scopeExists(model, scopeId) {
|
|
12
|
+
return scopeId === model?.id || model?.nodes?.some((node) => node.id === scopeId && isEmbeddedSubProcess(node));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function getScopeOwner(model, scopeId) {
|
|
16
|
+
if (!model || scopeId === model.id) return model || null;
|
|
17
|
+
return model.nodes.find((node) => node.id === scopeId && isEmbeddedSubProcess(node)) || null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function getParentScopeId(model, scopeId) {
|
|
21
|
+
if (!model || scopeId === model.id) return null;
|
|
22
|
+
const owner = getScopeOwner(model, scopeId);
|
|
23
|
+
return owner ? elementScopeId(model, owner) : null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function getScopePath(model, scopeId = model?.id) {
|
|
27
|
+
if (!model) return [];
|
|
28
|
+
const chain = [];
|
|
29
|
+
const seen = new Set();
|
|
30
|
+
let current = scopeExists(model, scopeId) ? scopeId : model.id;
|
|
31
|
+
while (current && current !== model.id && !seen.has(current)) {
|
|
32
|
+
seen.add(current);
|
|
33
|
+
const owner = getScopeOwner(model, current);
|
|
34
|
+
if (!owner) break;
|
|
35
|
+
chain.unshift({ id: owner.id, name: owner.name || owner.id, kind: 'subProcess' });
|
|
36
|
+
current = elementScopeId(model, owner);
|
|
37
|
+
}
|
|
38
|
+
return [{ id: model.id, name: model.name || model.id, kind: 'process' }, ...chain];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function getScopeGraph(model, scopeId = model?.id) {
|
|
42
|
+
if (!model) return { nodes: [], edges: [] };
|
|
43
|
+
const activeScopeId = scopeExists(model, scopeId) ? scopeId : model.id;
|
|
44
|
+
return {
|
|
45
|
+
...model,
|
|
46
|
+
nodes: model.nodes.filter((node) => elementScopeId(model, node) === activeScopeId),
|
|
47
|
+
edges: model.edges.filter((edge) => elementScopeId(model, edge) === activeScopeId),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function getDescendantScopeIds(model, ownerId) {
|
|
52
|
+
const scopes = new Set();
|
|
53
|
+
const queue = [ownerId];
|
|
54
|
+
while (queue.length) {
|
|
55
|
+
const scopeId = queue.shift();
|
|
56
|
+
if (scopes.has(scopeId)) continue;
|
|
57
|
+
scopes.add(scopeId);
|
|
58
|
+
for (const node of model.nodes) {
|
|
59
|
+
if (elementScopeId(model, node) === scopeId && isEmbeddedSubProcess(node)) queue.push(node.id);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return scopes;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function hasScopeChildren(model, ownerId) {
|
|
66
|
+
return model.nodes.some((node) => elementScopeId(model, node) === ownerId)
|
|
67
|
+
|| model.edges.some((edge) => elementScopeId(model, edge) === ownerId);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function getScopeIntegrityIssues(model) {
|
|
71
|
+
if (!model) return [];
|
|
72
|
+
const issues = [];
|
|
73
|
+
for (const node of model.nodes || []) {
|
|
74
|
+
const scopeId = elementScopeId(model, node);
|
|
75
|
+
if (!scopeExists(model, scopeId)) issues.push({ kind: 'node', id: node.id, scopeId, reason: 'missing-scope' });
|
|
76
|
+
else {
|
|
77
|
+
const seen = new Set();
|
|
78
|
+
let current = scopeId;
|
|
79
|
+
while (current !== model.id && scopeExists(model, current)) {
|
|
80
|
+
if (seen.has(current)) {
|
|
81
|
+
issues.push({ kind: 'node', id: node.id, scopeId, reason: 'cyclic-scope' });
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
seen.add(current);
|
|
85
|
+
current = getParentScopeId(model, current);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (const edge of model.edges || []) {
|
|
90
|
+
const scopeId = elementScopeId(model, edge);
|
|
91
|
+
const source = model.nodes.find((node) => node.id === edge.source);
|
|
92
|
+
const target = model.nodes.find((node) => node.id === edge.target);
|
|
93
|
+
if (!scopeExists(model, scopeId)) issues.push({ kind: 'edge', id: edge.id, scopeId, reason: 'missing-scope' });
|
|
94
|
+
if (source && target && (elementScopeId(model, source) !== scopeId || elementScopeId(model, target) !== scopeId)) {
|
|
95
|
+
issues.push({ kind: 'edge', id: edge.id, scopeId, reason: 'cross-scope' });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return issues;
|
|
99
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
BpmnEdge,
|
|
3
|
+
BpmnNode,
|
|
4
|
+
EngineId,
|
|
5
|
+
ElementSelection,
|
|
6
|
+
LayoutOptions,
|
|
7
|
+
NodeType,
|
|
8
|
+
ProcessModel,
|
|
9
|
+
} from '../core/index.js'
|
|
10
|
+
import type { DiagramRenderer } from '../renderer-svg/index.js'
|
|
11
|
+
import type { NovaThemeInput, NovaThemeMode, NovaThemeState, ThemeController } from '../theme/index.js'
|
|
12
|
+
import type { SvgExportArtifact, SvgExportOptions, SvgExportPreviewController, SvgNodeRenderer } from '../export-svg/index.js'
|
|
13
|
+
|
|
14
|
+
export interface DesignerState {
|
|
15
|
+
selection: ElementSelection | null
|
|
16
|
+
connectingSource: string | null
|
|
17
|
+
canUndo: boolean
|
|
18
|
+
canRedo: boolean
|
|
19
|
+
engine: EngineId
|
|
20
|
+
}
|
|
21
|
+
export interface DesignerOptions {
|
|
22
|
+
container: HTMLElement
|
|
23
|
+
model: ProcessModel
|
|
24
|
+
historyLimit?: number
|
|
25
|
+
onChange?: (model: ProcessModel, reason: string) => void
|
|
26
|
+
onSelectionChange?: (selection: ElementSelection | null, element: BpmnNode | BpmnEdge | null) => void
|
|
27
|
+
onStateChange?: (state: DesignerState) => void
|
|
28
|
+
onViewportChange?: (state: { zoom: number; pan: { x: number; y: number } }) => void
|
|
29
|
+
themeController?: ThemeController
|
|
30
|
+
theme?: NovaThemeInput
|
|
31
|
+
onThemeChange?: (state: NovaThemeState) => void
|
|
32
|
+
svgExport?: SvgExportOptions & { label?: string; nodeRenderers?: Record<string, SvgNodeRenderer> }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function normalizeCanvasCoordinate(value: unknown): number
|
|
36
|
+
export function canSequenceConnect(model: ProcessModel, sourceId: string, targetId: string): boolean
|
|
37
|
+
export class BpmnDesigner {
|
|
38
|
+
constructor(options: DesignerOptions)
|
|
39
|
+
model: ProcessModel
|
|
40
|
+
selection: ElementSelection | null
|
|
41
|
+
connectingSource: string | null
|
|
42
|
+
renderer: DiagramRenderer
|
|
43
|
+
properties?: unknown
|
|
44
|
+
getSelectedElement(): BpmnNode | BpmnEdge | null
|
|
45
|
+
getState(): DesignerState
|
|
46
|
+
setModel(model: ProcessModel, options?: { resetHistory?: boolean }): void
|
|
47
|
+
select(selection: ElementSelection): void
|
|
48
|
+
clearSelection(): void
|
|
49
|
+
on(event: 'change', handler: (payload: { model: ProcessModel; reason: string; state: DesignerState }) => void): () => void
|
|
50
|
+
on(event: 'selection', handler: (payload: { selection: ElementSelection | null; element: BpmnNode | BpmnEdge | null; state: DesignerState }) => void): () => void
|
|
51
|
+
off(event: 'change' | 'selection', handler: Function): void
|
|
52
|
+
exportXml(engine?: EngineId): string
|
|
53
|
+
exportSvg(options?: SvgExportOptions): Promise<SvgExportArtifact>
|
|
54
|
+
openSvgExportPreview(options?: SvgExportOptions & { previewTitle?: string; onDownload?: (artifact: SvgExportArtifact) => void }): SvgExportPreviewController
|
|
55
|
+
importXml(xml: string, engineHint?: EngineId): ProcessModel
|
|
56
|
+
validate(): Array<{ level: 'error' | 'warning'; elementId?: string; message: string }>
|
|
57
|
+
setTheme(theme: NovaThemeInput): NovaThemeState
|
|
58
|
+
setThemeMode(mode: NovaThemeMode): NovaThemeState
|
|
59
|
+
getThemeState(): NovaThemeState
|
|
60
|
+
addNode(type: NodeType, x: number, y: number, overrides?: Partial<BpmnNode>): BpmnNode
|
|
61
|
+
quickAdd(sourceId: string, type?: NodeType, preset?: Partial<BpmnNode>): BpmnNode | null
|
|
62
|
+
startConnect(sourceId: string): void
|
|
63
|
+
connect(source: string, target: string, overrides?: Partial<BpmnEdge>): BpmnEdge | null
|
|
64
|
+
changeNodeType(id: string, type: NodeType): void
|
|
65
|
+
changeElementId(kind: 'process' | 'node' | 'edge', oldId: string, nextId: string): boolean
|
|
66
|
+
updateProcess(patch: Partial<ProcessModel>): void
|
|
67
|
+
updateNode(id: string, patch: Partial<BpmnNode>): void
|
|
68
|
+
updateEdge(id: string, patch: Partial<BpmnEdge>): void
|
|
69
|
+
updateEdges(patches: Array<{ id: string; patch: Partial<BpmnEdge> }>): void
|
|
70
|
+
resetEdgeRoute(id: string): void
|
|
71
|
+
rerouteEdges(options?: LayoutOptions): void
|
|
72
|
+
autoLayout(direction?: 'horizontal' | 'vertical'): void
|
|
73
|
+
beautify(options?: LayoutOptions): void
|
|
74
|
+
removeSelection(): void
|
|
75
|
+
setEngine(engine: EngineId): void
|
|
76
|
+
undo(): void
|
|
77
|
+
redo(): void
|
|
78
|
+
destroy(): void
|
|
79
|
+
}
|