@foblex/flow
Version:
An Angular library designed to simplify the creation and manipulation of dynamic flow. Provides components for flows, nodes, and connections, automating node manipulation and inter-node connections.
84 lines • 15.2 kB
JavaScript
import { __decorate } from "tslib";
import { inject, Injectable, Injector } from '@angular/core';
import { FNodeRotatePreparationRequest } from './f-node-rotate-preparation.request';
import { Point } from '@foblex/2d';
import { FExecutionRegister, FMediator } from '@foblex/mediator';
import { FComponentsStore } from '../../../f-storage';
import { FDraggableDataContext } from '../../f-draggable-data-context';
import { CalculateInputConnectionsRequest, CalculateOutputConnectionsRequest, GetNormalizedElementRectRequest, isValidEventTrigger, SelectAndUpdateNodeLayerRequest, } from '../../../domain';
import { isRotateHandle } from '../../../f-node';
import { FNodeRotateDragHandler } from '../f-node-rotate.drag-handler';
import { SourceConnectionDragHandler, TargetConnectionDragHandler } from '../../f-node-move';
import * as i0 from "@angular/core";
let FNodeRotatePreparationExecution = class FNodeRotatePreparationExecution {
_fMediator = inject(FMediator);
_fComponentsStore = inject(FComponentsStore);
_fDraggableDataContext = inject(FDraggableDataContext);
_injector = inject(Injector);
get _transform() {
return this._fComponentsStore.fCanvas.transform;
}
get _fHost() {
return this._fComponentsStore.fFlow.hostElement;
}
_fNode;
handle(request) {
if (!this._isValid(request) || !this._isValidTrigger(request)) {
return;
}
this._selectAndUpdateNodeLayer();
this._fDraggableDataContext.onPointerDownScale = this._transform.scale;
this._fDraggableDataContext.onPointerDownPosition = Point.fromPoint(request.event.getPosition())
.elementTransform(this._fHost).div(this._transform.scale);
this._fDraggableDataContext.draggableItems = [
new FNodeRotateDragHandler(this._injector, this._fNode, this._calculateOutputConnectionsDragHandlers(), this._calculateInputConnectionsDragHandlers())
];
}
_isValid(request) {
return this._fDraggableDataContext.isEmpty()
&& isRotateHandle(request.event.targetElement)
&& this._isNodeCanBeDragged(this._getNode(request.event.targetElement));
}
_isNodeCanBeDragged(fNode) {
return !!fNode && !fNode.fDraggingDisabled;
}
_getNode(element) {
this._fNode = this._fComponentsStore
.fNodes.find(x => x.isContains(element));
return this._fNode;
}
_isValidTrigger(request) {
return isValidEventTrigger(request.event.originalEvent, request.fTrigger);
}
_selectAndUpdateNodeLayer() {
this._fMediator.execute(new SelectAndUpdateNodeLayerRequest(this._fNode));
}
_calculateInputConnectionsDragHandlers() {
return this._fMediator.execute(new CalculateInputConnectionsRequest(this._fNode)).map((x) => {
const connector = this._fComponentsStore.fInputs.find((y) => y.fId === x.fInputId).hostElement;
return {
connection: new TargetConnectionDragHandler(this._injector, x),
connector: this._fMediator.execute(new GetNormalizedElementRectRequest(connector)).gravityCenter
};
});
}
_calculateOutputConnectionsDragHandlers() {
return this._fMediator.execute(new CalculateOutputConnectionsRequest(this._fNode)).map((x) => {
const connector = this._fComponentsStore.fOutputs.find((y) => y.fId === x.fOutputId).hostElement;
return {
connection: new SourceConnectionDragHandler(this._injector, x),
connector: this._fMediator.execute(new GetNormalizedElementRectRequest(connector)).gravityCenter
};
});
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNodeRotatePreparationExecution, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNodeRotatePreparationExecution });
};
FNodeRotatePreparationExecution = __decorate([
FExecutionRegister(FNodeRotatePreparationRequest)
], FNodeRotatePreparationExecution);
export { FNodeRotatePreparationExecution };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNodeRotatePreparationExecution, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1ub2RlLXJvdGF0ZS1wcmVwYXJhdGlvbi5leGVjdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2YtZHJhZ2dhYmxlL2Ytbm9kZS1yb3RhdGUvcm90YXRlLXByZXBhcmF0aW9uL2Ytbm9kZS1yb3RhdGUtcHJlcGFyYXRpb24uZXhlY3V0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDcEYsT0FBTyxFQUFrQyxLQUFLLEVBQWtCLE1BQU0sWUFBWSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RSxPQUFPLEVBQ0wsZ0NBQWdDLEVBQUUsaUNBQWlDLEVBQUUsK0JBQStCLEVBQ3BHLG1CQUFtQixFQUNuQiwrQkFBK0IsR0FDaEMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQWEsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkUsT0FBTyxFQUE2QiwyQkFBMkIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUtqSCxJQUFNLCtCQUErQixHQUFyQyxNQUFNLCtCQUErQjtJQUV6QixVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdD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Y3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRk5vZGVSb3RhdGVQcmVwYXJhdGlvblJlcXVlc3QgfSBmcm9tICcuL2Ytbm9kZS1yb3RhdGUtcHJlcGFyYXRpb24ucmVxdWVzdCc7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBJVHJhbnNmb3JtTW9kZWwsIFBvaW50LCBSZWN0RXh0ZW5zaW9ucyB9IGZyb20gJ0Bmb2JsZXgvMmQnO1xuaW1wb3J0IHsgRkV4ZWN1dGlvblJlZ2lzdGVyLCBGTWVkaWF0b3IsIElFeGVjdXRpb24gfSBmcm9tICdAZm9ibGV4L21lZGlhdG9yJztcbmltcG9ydCB7IEZDb21wb25lbnRzU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9mLXN0b3JhZ2UnO1xuaW1wb3J0IHsgRkRyYWdnYWJsZURhdGFDb250ZXh0IH0gZnJvbSAnLi4vLi4vZi1kcmFnZ2FibGUtZGF0YS1jb250ZXh0JztcbmltcG9ydCB7XG4gIENhbGN1bGF0ZUlucHV0Q29ubmVjdGlvbnNSZXF1ZXN0LCBDYWxjdWxhdGVPdXRwdXRDb25uZWN0aW9uc1JlcXVlc3QsIEdldE5vcm1hbGl6ZWRFbGVtZW50UmVjdFJlcXVlc3QsXG4gIGlzVmFsaWRFdmVudFRyaWdnZXIsXG4gIFNlbGVjdEFuZFVwZGF0ZU5vZGVMYXllclJlcXVlc3QsXG59IGZyb20gJy4uLy4uLy4uL2RvbWFpbic7XG5pbXBvcnQgeyBGTm9kZUJhc2UsIGlzUm90YXRlSGFuZGxlIH0gZnJvbSAnLi4vLi4vLi4vZi1ub2RlJztcbmltcG9ydCB7IEZOb2RlUm90YXRlRHJhZ0hhbmRsZXIgfSBmcm9tICcuLi9mLW5vZGUtcm90YXRlLmRyYWctaGFuZGxlcic7XG5pbXBvcnQgeyBCYXNlQ29ubmVjdGlvbkRyYWdIYW5kbGVyLCBTb3VyY2VDb25uZWN0aW9uRHJhZ0hhbmRsZXIsIFRhcmdldENvbm5lY3Rpb25EcmFnSGFuZGxlciB9IGZyb20gJy4uLy4uL2Ytbm9kZS1tb3ZlJztcbmltcG9ydCB7IEZDb25uZWN0aW9uQmFzZSB9IGZyb20gJy4uLy4uLy4uL2YtY29ubmVjdGlvbic7XG5cbkBJbmplY3RhYmxlKClcbkBGRXhlY3V0aW9uUmVnaXN0ZXIoRk5vZGVSb3RhdGVQcmVwYXJhdGlvblJlcXVlc3QpXG5leHBvcnQgY2xhc3MgRk5vZGVSb3RhdGVQcmVwYXJhdGlvbkV4ZWN1dGlvbiBpbXBsZW1lbnRzIElFeGVjdXRpb248Rk5vZGVSb3RhdGVQcmVwYXJhdGlvblJlcXVlc3QsIHZvaWQ+IHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9mTWVkaWF0b3IgPSBpbmplY3QoRk1lZGlhdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZkNvbXBvbmVudHNTdG9yZSA9IGluamVjdChGQ29tcG9uZW50c1N0b3JlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZkRyYWdnYWJsZURhdGFDb250ZXh0ID0gaW5qZWN0KEZEcmFnZ2FibGVEYXRhQ29udGV4dCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICBwcml2YXRlIGdldCBfdHJhbnNmb3JtKCk6IElUcmFuc2Zvcm1Nb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZDb21wb25lbnRzU3RvcmUuZkNhbnZhcyEudHJhbnNmb3JtO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2ZIb3N0KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5fZkNvbXBvbmVudHNTdG9yZS5mRmxvdyEuaG9zdEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIF9mTm9kZTogRk5vZGVCYXNlIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBoYW5kbGUocmVxdWVzdDogRk5vZGVSb3RhdGVQcmVwYXJhdGlvblJlcXVlc3QpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzVmFsaWQocmVxdWVzdCkgfHwgIXRoaXMuX2lzVmFsaWRUcmlnZ2VyKHJlcXVlc3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc2VsZWN0QW5kVXBkYXRlTm9kZUxheWVyKCk7XG5cbiAgICB0aGlzLl9mRHJhZ2dhYmxlRGF0YUNvbnRleHQub25Qb2ludGVyRG93blNjYWxlID0gdGhpcy5fdHJhbnNmb3JtLnNjYWxlO1xuICAgIHRoaXMuX2ZEcmFnZ2FibGVEYXRhQ29udGV4dC5vblBvaW50ZXJEb3duUG9zaXRpb24gPSBQb2ludC5mcm9tUG9pbnQocmVxdWVzdC5ldmVudC5nZXRQb3NpdGlvbigpKVxuICAgICAgLmVsZW1lbnRUcmFuc2Zvcm0odGhpcy5fZkhvc3QpLmRpdih0aGlzLl90cmFuc2Zvcm0uc2NhbGUpO1xuXG4gICAgdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0LmRyYWdnYWJsZUl0ZW1zID0gW1xuICAgICAgbmV3IEZOb2RlUm90YXRlRHJhZ0hhbmRsZXIoXG4gICAgICAgIHRoaXMuX2luamVjdG9yLFxuICAgICAgICB0aGlzLl9mTm9kZSEsXG4gICAgICAgIHRoaXMuX2NhbGN1bGF0ZU91dHB1dENvbm5lY3Rpb25zRHJhZ0hhbmRsZXJzKCksXG4gICAgICAgIHRoaXMuX2NhbGN1bGF0ZUlucHV0Q29ubmVjdGlvbnNEcmFnSGFuZGxlcnMoKSxcbiAgICAgIClcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNWYWxpZChyZXF1ZXN0OiBGTm9kZVJvdGF0ZVByZXBhcmF0aW9uUmVxdWVzdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mRHJhZ2dhYmxlRGF0YUNvbnRleHQuaXNFbXB0eSgpXG4gICAgICAmJiBpc1JvdGF0ZUhhbmRsZShyZXF1ZXN0LmV2ZW50LnRhcmdldEVsZW1lbnQpXG4gICAgICAmJiB0aGlzLl9pc05vZGVDYW5CZURyYWdnZWQodGhpcy5fZ2V0Tm9kZShyZXF1ZXN0LmV2ZW50LnRhcmdldEVsZW1lbnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzTm9kZUNhbkJlRHJhZ2dlZChmTm9kZT86IEZOb2RlQmFzZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWZOb2RlICYmICFmTm9kZS5mRHJhZ2dpbmdEaXNhYmxlZDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE5vZGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBGTm9kZUJhc2UgfCB1bmRlZmluZWQge1xuICAgIHRoaXMuX2ZOb2RlID0gdGhpcy5fZkNvbXBvbmVudHNTdG9yZVxuICAgICAgLmZOb2Rlcy5maW5kKHggPT4geC5pc0NvbnRhaW5zKGVsZW1lbnQpKTtcbiAgICByZXR1cm4gdGhpcy5fZk5vZGU7XG4gIH1cblxuICBwcml2YXRlIF9pc1ZhbGlkVHJpZ2dlcihyZXF1ZXN0OiBGTm9kZVJvdGF0ZVByZXBhcmF0aW9uUmVxdWVzdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkRXZlbnRUcmlnZ2VyKHJlcXVlc3QuZXZlbnQub3JpZ2luYWxFdmVudCwgcmVxdWVzdC5mVHJpZ2dlcik7XG4gIH1cblxuICBwcml2YXRlIF9zZWxlY3RBbmRVcGRhdGVOb2RlTGF5ZXIoKSB7XG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUoXG4gICAgICBuZXcgU2VsZWN0QW5kVXBkYXRlTm9kZUxheWVyUmVxdWVzdCh0aGlzLl9mTm9kZSEpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZUlucHV0Q29ubmVjdGlvbnNEcmFnSGFuZGxlcnMoKToge1xuICAgIGNvbm5lY3Rpb246IEJhc2VDb25uZWN0aW9uRHJhZ0hhbmRsZXIsXG4gICAgY29ubmVjdG9yOiBJUG9pbnQsXG4gIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPEZDb25uZWN0aW9uQmFzZVtdPihcbiAgICAgIG5ldyBDYWxjdWxhdGVJbnB1dENvbm5lY3Rpb25zUmVxdWVzdCh0aGlzLl9mTm9kZSEpXG4gICAgKS5tYXAoKHg6IEZDb25uZWN0aW9uQmFzZSkgPT4ge1xuICAgICAgY29uc3QgY29ubmVjdG9yID0gdGhpcy5fZkNvbXBvbmVudHNTdG9yZS5mSW5wdXRzLmZpbmQoKHkpID0+IHkuZklkID09PSB4LmZJbnB1dElkKSEuaG9zdEVsZW1lbnQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb25uZWN0aW9uOiBuZXcgVGFyZ2V0Q29ubmVjdGlvbkRyYWdIYW5kbGVyKHRoaXMuX2luamVjdG9yLCB4KSxcbiAgICAgICAgY29ubmVjdG9yOiB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTxJUmVjdD4obmV3IEdldE5vcm1hbGl6ZWRFbGVtZW50UmVjdFJlcXVlc3QoY29ubmVjdG9yKSkuZ3Jhdml0eUNlbnRlclxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlT3V0cHV0Q29ubmVjdGlvbnNEcmFnSGFuZGxlcnMoKToge1xuICAgIGNvbm5lY3Rpb246IEJhc2VDb25uZWN0aW9uRHJhZ0hhbmRsZXIsXG4gICAgY29ubmVjdG9yOiBJUG9pbnQsXG4gIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPEZDb25uZWN0aW9uQmFzZVtdPihcbiAgICAgIG5ldyBDYWxjdWxhdGVPdXRwdXRDb25uZWN0aW9uc1JlcXVlc3QodGhpcy5fZk5vZGUhKVxuICAgICkubWFwKCh4OiBGQ29ubmVjdGlvbkJhc2UpID0+IHtcbiAgICAgIGNvbnN0IGNvbm5lY3RvciA9IHRoaXMuX2ZDb21wb25lbnRzU3RvcmUuZk91dHB1dHMuZmluZCgoeSkgPT4geS5mSWQgPT09IHguZk91dHB1dElkKSEuaG9zdEVsZW1lbnQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb25uZWN0aW9uOiBuZXcgU291cmNlQ29ubmVjdGlvbkRyYWdIYW5kbGVyKHRoaXMuX2luamVjdG9yLCB4KSxcbiAgICAgICAgY29ubmVjdG9yOiB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTxJUmVjdD4obmV3IEdldE5vcm1hbGl6ZWRFbGVtZW50UmVjdFJlcXVlc3QoY29ubmVjdG9yKSkuZ3Jhdml0eUNlbnRlclxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=