UNPKG

@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
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=