Louis Young 19ff04abc7
feat(free-demo): support create nodes group (#185)
* feat(demo): create group tool

* feat(demo): create group shortcut

* refactor(core): split group service, controller, utils files

* feat(history): free history add group operations

* feat(demo): group node render

* feat(demo): group node registry

* refactor(stack): remove layer computing config

* feat(stack): line stackIndex cannot be recalculated by default

* feat(demo): group title & color palette acess form

* feat(demo): ungroup button & shortcut

* feat(demo): create group & ungroup operation register to free history service

* refactor(group): group shortcuts move to group-plugin

* refactor(group): group node render move to group-plugin

* fix(group): undo/redo of create node or ungroup not work

* perf(history): free history remove async operation

* feat(group): trigger select box inside group

* fix(group): container inside group

* fix(group): auto layout should not be affected by group node

* feat(container): support multi-layer nested containers

* fix(group): group css variables overwrite each other

* fix(container): node move in or out group shouldn't clear lines

* feat(demo): node should follow mouse after move out container button clicked

* feat(container): disable group move to non-group container node

* fix(container): cross-level node moving causing coord offset

* feat(demo): comment node support more button

* fix(demo): comment in container fromJSON

* feat(container): node into container show move out tips

* feat(group): node into group show move out tips

* feat(group): delete group when blocks is empty

* refactor(group): createFreeGroupPlugin move to container-plugin

* refactor(demo): replace disablePorts with defaultPorts

* fix(demo): react warning

* refactor(group): group plugin built-in GroupNodeRegistry

* refactor(group): create free-group-plugin

* fix(ci): lock & ts-check & test errors
2025-05-07 13:21:34 +00:00

48 lines
1.5 KiB
TypeScript

import { WorkflowDocument } from '@flowgram.ai/free-layout-core';
import { PositionSchema, startTween, TransformData } from '@flowgram.ai/core';
import { LayoutNode } from './type';
import { LayoutStore } from './store';
export class LayoutPosition {
constructor(private readonly store: LayoutStore) {}
public async position(): Promise<void> {
return new Promise((resolve) => {
startTween({
from: { d: 0 },
to: { d: 100 },
duration: 300,
onUpdate: (v) => {
this.store.nodes.forEach((layoutNode) => {
this.updateNodePosition({ layoutNode, step: v.d });
});
},
onComplete: () => {
resolve();
},
});
});
}
private updateNodePosition(params: { layoutNode: LayoutNode; step: number }): void {
const { layoutNode, step } = params;
const transform = layoutNode.entity.getData(TransformData);
const position: PositionSchema = {
x: layoutNode.position.x + layoutNode.offset.x,
y: layoutNode.position.y + layoutNode.offset.y,
};
const deltaX = ((position.x - transform.position.x) * step) / 100;
const deltaY = ((position.y - transform.bounds.height / 2 - transform.position.y) * step) / 100;
transform.update({
position: {
x: transform.position.x + deltaX,
y: transform.position.y + deltaY,
},
});
const document = layoutNode.entity.document as WorkflowDocument;
document.layout.updateAffectedTransform(layoutNode.entity);
}
}