@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.
83 lines • 14 kB
JavaScript
import { __decorate } from "tslib";
import { inject, Injectable, Injector } from '@angular/core';
import { FNodeDropToGroupPreparationRequest } from './f-node-drop-to-group-preparation.request';
import { FExecutionRegister, FMediator } from '@foblex/mediator';
import { FComponentsStore } from '../../../f-storage';
import { PointExtensions, RectExtensions } from '@foblex/2d';
import { GetNormalizedElementRectRequest, GetParentNodesRequest } from '../../../domain';
import { FDraggableDataContext } from '../../f-draggable-data-context';
import { FNodeDropToGroupDragHandler } from '../f-node-drop-to-group.drag-handler';
import { FSummaryNodeMoveDragHandler } from '../../f-node-move';
import { FExternalItemDragHandler } from "../../../f-external-item";
import * as i0 from "@angular/core";
let FNodeDropToGroupPreparationExecution = class FNodeDropToGroupPreparationExecution {
_fMediator = inject(FMediator);
_fDraggableDataContext = inject(FDraggableDataContext);
_fComponentsStore = inject(FComponentsStore);
_injector = inject(Injector);
get _fNodes() {
return this._fComponentsStore.fNodes;
}
get _transform() {
return this._fComponentsStore.fCanvas.transform;
}
get _fCanvasPosition() {
return PointExtensions.sum(this._transform.position, this._transform.scaledPosition);
}
handle(request) {
if (!this._isValid()) {
return;
}
const fNode = this._fComponentsStore
.fNodes.find(n => n.isContains(request.event.targetElement));
if (!fNode && !this._isExternalItemDragHandler()) {
throw new Error('Node not found');
}
this._fDraggableDataContext.draggableItems.push(new FNodeDropToGroupDragHandler(this._injector, this._getNotDraggedNodesRects()));
}
_isValid() {
return this._isNodeDragHandler() || this._isExternalItemDragHandler();
}
_isNodeDragHandler() {
return this._fDraggableDataContext.draggableItems
.some((x) => x instanceof FSummaryNodeMoveDragHandler);
}
_isExternalItemDragHandler() {
return this._fDraggableDataContext.draggableItems
.some((x) => x instanceof FExternalItemDragHandler);
}
_getNotDraggedNodesRects() {
const draggedNodes = this._addParentNodes(this._getNodesBeingDragged());
return this._getNotDraggedNodes(draggedNodes).map((x) => {
const rect = this._fMediator.execute(new GetNormalizedElementRectRequest(x.hostElement));
return {
node: x,
rect: RectExtensions.initialize(rect.x * this._transform.scale + this._fCanvasPosition.x, rect.y * this._transform.scale + this._fCanvasPosition.y, rect.width * this._transform.scale, rect.height * this._transform.scale)
};
});
}
_getNodesBeingDragged() {
return this._fDraggableDataContext.draggableItems
.find((x) => x instanceof FSummaryNodeMoveDragHandler)
?.fHandlers.map((x) => x.fNode) || [];
}
_addParentNodes(fNodes) {
return fNodes.reduce((result, x) => {
result.push(x, ...this._fMediator.execute(new GetParentNodesRequest(x)));
return result;
}, []);
}
_getNotDraggedNodes(draggedNodes) {
return this._fNodes.filter((x) => !draggedNodes.includes(x));
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNodeDropToGroupPreparationExecution, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNodeDropToGroupPreparationExecution });
};
FNodeDropToGroupPreparationExecution = __decorate([
FExecutionRegister(FNodeDropToGroupPreparationRequest)
], FNodeDropToGroupPreparationExecution);
export { FNodeDropToGroupPreparationExecution };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FNodeDropToGroupPreparationExecution, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1ub2RlLWRyb3AtdG8tZ3JvdXAtcHJlcGFyYXRpb24uZXhlY3V0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9mLWRyYWdnYWJsZS9mLWRyb3AtdG8tZ3JvdXAvZHJvcC10by1ncm91cC1wcmVwYXJhdGlvbi9mLW5vZGUtZHJvcC10by1ncm91cC1wcmVwYXJhdGlvbi5leGVjdXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsU0FBUyxFQUFhLE1BQU0sa0JBQWtCLENBQUM7QUFDM0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFcEQsT0FBTyxFQUFpQyxlQUFlLEVBQUUsY0FBYyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzNGLE9BQU8sRUFBQywrQkFBK0IsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXZGLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pGLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzlELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDOztBQUkzRCxJQUFNLG9DQUFvQyxHQUExQyxNQUFNLG9DQUFvQztJQUc5QixVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3ZELGlCQUFpQixHQUFHLE1BQU0s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QUVPLHFCQUFxQjtRQUMzQixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjO2FBQzlDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLDJCQUEyQixDQUFDO1lBQ3RELEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRU8sZUFBZSxDQUFDLE1BQW1CO1FBQ3pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW1CLEVBQUUsQ0FBWSxFQUFFLEVBQUU7WUFDekQsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBYyxJQUFJLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsWUFBeUI7UUFDbkQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQzt3R0FuRlUsb0NBQW9DOzRHQUFwQyxvQ0FBb0M7O0FBQXBDLG9DQUFvQztJQURoRCxrQkFBa0IsQ0FBQyxrQ0FBa0MsQ0FBQztHQUMxQyxvQ0FBb0MsQ0FvRmhEOzs0RkFwRlksb0NBQW9DO2tCQUZoRCxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Rk5vZGVEcm9wVG9Hcm91cFByZXBhcmF0aW9uUmVxdWVzdH0gZnJvbSAnLi9mLW5vZGUtZHJvcC10by1ncm91cC1wcmVwYXJhdGlvbi5yZXF1ZXN0JztcbmltcG9ydCB7RkV4ZWN1dGlvblJlZ2lzdGVyLCBGTWVkaWF0b3IsIElFeGVjdXRpb259IGZyb20gJ0Bmb2JsZXgvbWVkaWF0b3InO1xuaW1wb3J0IHtGQ29tcG9uZW50c1N0b3JlfSBmcm9tICcuLi8uLi8uLi9mLXN0b3JhZ2UnO1xuaW1wb3J0IHtJTm9kZVdpdGhSZWN0fSBmcm9tICcuLi8uLi9kb21haW4nO1xuaW1wb3J0IHtJUG9pbnQsIElSZWN0LCBJVHJhbnNmb3JtTW9kZWwsIFBvaW50RXh0ZW5zaW9ucywgUmVjdEV4dGVuc2lvbnN9IGZyb20gJ0Bmb2JsZXgvMmQnO1xuaW1wb3J0IHtHZXROb3JtYWxpemVkRWxlbWVudFJlY3RSZXF1ZXN0LCBHZXRQYXJlbnROb2Rlc1JlcXVlc3R9IGZyb20gJy4uLy4uLy4uL2RvbWFpbic7XG5pbXBvcnQge0ZOb2RlQmFzZX0gZnJvbSAnLi4vLi4vLi4vZi1ub2RlJztcbmltcG9ydCB7RkRyYWdnYWJsZURhdGFDb250ZXh0fSBmcm9tICcuLi8uLi9mLWRyYWdnYWJsZS1kYXRhLWNvbnRleHQnO1xuaW1wb3J0IHtGTm9kZURyb3BUb0dyb3VwRHJhZ0hhbmRsZXJ9IGZyb20gJy4uL2Ytbm9kZS1kcm9wLXRvLWdyb3VwLmRyYWctaGFuZGxlcic7XG5pbXBvcnQge0ZTdW1tYXJ5Tm9kZU1vdmVEcmFnSGFuZGxlcn0gZnJvbSAnLi4vLi4vZi1ub2RlLW1vdmUnO1xuaW1wb3J0IHtGRXh0ZXJuYWxJdGVtRHJhZ0hhbmRsZXJ9IGZyb20gXCIuLi8uLi8uLi9mLWV4dGVybmFsLWl0ZW1cIjtcblxuQEluamVjdGFibGUoKVxuQEZFeGVjdXRpb25SZWdpc3RlcihGTm9kZURyb3BUb0dyb3VwUHJlcGFyYXRpb25SZXF1ZXN0KVxuZXhwb3J0IGNsYXNzIEZOb2RlRHJvcFRvR3JvdXBQcmVwYXJhdGlvbkV4ZWN1dGlvblxuICBpbXBsZW1lbnRzIElFeGVjdXRpb248Rk5vZGVEcm9wVG9Hcm91cFByZXBhcmF0aW9uUmVxdWVzdCwgdm9pZD4ge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZNZWRpYXRvciA9IGluamVjdChGTWVkaWF0b3IpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9mRHJhZ2dhYmxlRGF0YUNvbnRleHQgPSBpbmplY3QoRkRyYWdnYWJsZURhdGFDb250ZXh0KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZkNvbXBvbmVudHNTdG9yZSA9IGluamVjdChGQ29tcG9uZW50c1N0b3JlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gIHByaXZhdGUgZ2V0IF9mTm9kZXMoKTogRk5vZGVCYXNlW10ge1xuICAgIHJldHVybiB0aGlzLl9mQ29tcG9uZW50c1N0b3JlLmZOb2RlcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF90cmFuc2Zvcm0oKTogSVRyYW5zZm9ybU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5fZkNvbXBvbmVudHNTdG9yZS5mQ2FudmFzIS50cmFuc2Zvcm07XG4gIH1cblxuICBwcml2YXRlIGdldCBfZkNhbnZhc1Bvc2l0aW9uKCk6IElQb2ludCB7XG4gICAgcmV0dXJuIFBvaW50RXh0ZW5zaW9ucy5zdW0odGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLCB0aGlzLl90cmFuc2Zvcm0uc2NhbGVkUG9zaXRpb24pXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlKHJlcXVlc3Q6IEZOb2RlRHJvcFRvR3JvdXBQcmVwYXJhdGlvblJlcXVlc3QpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmTm9kZSA9IHRoaXMuX2ZDb21wb25lbnRzU3RvcmVcbiAgICAgIC5mTm9kZXMuZmluZChuID0+IG4uaXNDb250YWlucyhyZXF1ZXN0LmV2ZW50LnRhcmdldEVsZW1lbnQpKTtcbiAgICBpZiAoIWZOb2RlICYmICF0aGlzLl9pc0V4dGVybmFsSXRlbURyYWdIYW5kbGVyKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm9kZSBub3QgZm91bmQnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9mRHJhZ2dhYmxlRGF0YUNvbnRleHQuZHJhZ2dhYmxlSXRlbXMucHVzaChcbiAgICAgIG5ldyBGTm9kZURyb3BUb0dyb3VwRHJhZ0hhbmRsZXIoXG4gICAgICAgIHRoaXMuX2luamVjdG9yLFxuICAgICAgICB0aGlzLl9nZXROb3REcmFnZ2VkTm9kZXNSZWN0cygpXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTm9kZURyYWdIYW5kbGVyKCkgfHwgdGhpcy5faXNFeHRlcm5hbEl0ZW1EcmFnSGFuZGxlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNOb2RlRHJhZ0hhbmRsZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZEcmFnZ2FibGVEYXRhQ29udGV4dC5kcmFnZ2FibGVJdGVtc1xuICAgICAgLnNvbWUoKHgpID0+IHggaW5zdGFuY2VvZiBGU3VtbWFyeU5vZGVNb3ZlRHJhZ0hhbmRsZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNFeHRlcm5hbEl0ZW1EcmFnSGFuZGxlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0LmRyYWdnYWJsZUl0ZW1zXG4gICAgICAuc29tZSgoeCkgPT4geCBpbnN0YW5jZW9mIEZFeHRlcm5hbEl0ZW1EcmFnSGFuZGxlcik7XG4gIH1cblxuICBwcml2YXRlIF9nZXROb3REcmFnZ2VkTm9kZXNSZWN0cygpOiBJTm9kZVdpdGhSZWN0W10ge1xuICAgIGNvbnN0IGRyYWdnZWROb2RlcyA9IHRoaXMuX2FkZFBhcmVudE5vZGVzKHRoaXMuX2dldE5vZGVzQmVpbmdEcmFnZ2VkKCkpO1xuICAgIHJldHVybiB0aGlzLl9nZXROb3REcmFnZ2VkTm9kZXMoZHJhZ2dlZE5vZGVzKS5tYXAoKHgpID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTxJUmVjdD4obmV3IEdldE5vcm1hbGl6ZWRFbGVtZW50UmVjdFJlcXVlc3QoeC5ob3N0RWxlbWVudCkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZTogeCxcbiAgICAgICAgcmVjdDogUmVjdEV4dGVuc2lvbnMuaW5pdGlhbGl6ZShcbiAgICAgICAgICByZWN0LnggKiB0aGlzLl90cmFuc2Zvcm0uc2NhbGUgKyB0aGlzLl9mQ2FudmFzUG9zaXRpb24ueCxcbiAgICAgICAgICByZWN0LnkgKiB0aGlzLl90cmFuc2Zvcm0uc2NhbGUgKyB0aGlzLl9mQ2FudmFzUG9zaXRpb24ueSxcbiAgICAgICAgICByZWN0LndpZHRoICogdGhpcy5fdHJhbnNmb3JtLnNjYWxlLFxuICAgICAgICAgIHJlY3QuaGVpZ2h0ICogdGhpcy5fdHJhbnNmb3JtLnNjYWxlXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE5vZGVzQmVpbmdEcmFnZ2VkKCk6IEZOb2RlQmFzZVtdIHtcbiAgICByZXR1cm4gdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0LmRyYWdnYWJsZUl0ZW1zXG4gICAgICAuZmluZCgoeCkgPT4geCBpbnN0YW5jZW9mIEZTdW1tYXJ5Tm9kZU1vdmVEcmFnSGFuZGxlcilcbiAgICAgID8uZkhhbmRsZXJzLm1hcCgoeCkgPT4geC5mTm9kZSkgfHwgW107XG4gIH1cblxuICBwcml2YXRlIF9hZGRQYXJlbnROb2RlcyhmTm9kZXM6IEZOb2RlQmFzZVtdKTogRk5vZGVCYXNlW10ge1xuICAgIHJldHVybiBmTm9kZXMucmVkdWNlKChyZXN1bHQ6IEZOb2RlQmFzZVtdLCB4OiBGTm9kZUJhc2UpID0+IHtcbiAgICAgIHJlc3VsdC5wdXNoKHgsIC4uLnRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPEZOb2RlQmFzZVtdPihuZXcgR2V0UGFyZW50Tm9kZXNSZXF1ZXN0KHgpKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE5vdERyYWdnZWROb2RlcyhkcmFnZ2VkTm9kZXM6IEZOb2RlQmFzZVtdKTogRk5vZGVCYXNlW10ge1xuICAgIHJldHVybiB0aGlzLl9mTm9kZXMuZmlsdGVyKCh4KSA9PiAhZHJhZ2dlZE5vZGVzLmluY2x1ZGVzKHgpKTtcbiAgfVxufVxuIl19