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.

73 lines 12.7 kB
import { __decorate } from "tslib"; import { inject, Injectable } from '@angular/core'; import { MinimapCalculateSvgScaleAndViewBoxRequest } from './minimap-calculate-svg-scale-and-view-box.request'; import { FExecutionRegister, FMediator } from '@foblex/mediator'; import { adjustRectToMinSize, RectExtensions, SizeExtensions } from '@foblex/2d'; import { FComponentsStore } from '../../../f-storage'; import { CalculateNodesBoundingBoxRequest } from '../../../domain'; import * as i0 from "@angular/core"; let MinimapCalculateSvgScaleAndViewBoxExecution = class MinimapCalculateSvgScaleAndViewBoxExecution { _fMediator = inject(FMediator); _fComponentStore = inject(FComponentsStore); get _fFlow() { return this._fComponentStore.fFlow; } get _fCanvas() { return this._fComponentStore.fCanvas; } handle(request) { if (!this._fFlow) { return { scale: 1, viewBox: RectExtensions.initialize(0, 0, 0, 0) }; } const nodesRect = this._getScaledNodesBoundingBox(request.minSize); const minimapRect = this._getMinimapRect(request.element); const scale = this._calculateViewScale(nodesRect, minimapRect); return { scale, viewBox: this._calculateViewBox(nodesRect, minimapRect, scale) }; } _getScaledNodesBoundingBox(minSize) { const globalRect = this._calculateNodesBoundingBox(); const flowRect = this._convertFromGlobalToFlowRect(globalRect); const scaledRect = this._convertRectToMinimapScale(flowRect); return adjustRectToMinSize(scaledRect, minSize); } _calculateNodesBoundingBox() { return this._fMediator.execute(new CalculateNodesBoundingBoxRequest()) || RectExtensions.initialize(0, 0, 0, 0); } _convertFromGlobalToFlowRect(rect) { return RectExtensions.elementTransform(rect, this._fFlow.hostElement); } _convertRectToMinimapScale(rect) { return RectExtensions.div(rect, this._fCanvas.transform.scale); } _getMinimapRect(element) { return RectExtensions.elementTransform(RectExtensions.fromElement(element), this._fFlow.hostElement); } _calculateViewScale(nodesRect, minimapRect) { return Math.max(nodesRect.width / minimapRect.width, nodesRect.height / minimapRect.height); } _calculateViewBox(nodesRect, minimapRect, scale) { return this._calculateCenteredViewBox(nodesRect, this._calculateViewSize(minimapRect, scale)); } _calculateViewSize(minimapRect, scale) { return SizeExtensions.initialize(minimapRect.width * scale || 0, minimapRect.height * scale || 0); } _calculateCenteredViewBox(nodesRect, viewSize) { const centeredX = nodesRect.x - (viewSize.width - nodesRect.width) / 2; const centeredY = nodesRect.y - (viewSize.height - nodesRect.height) / 2; return RectExtensions.initialize(centeredX, centeredY, viewSize.width, viewSize.height); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MinimapCalculateSvgScaleAndViewBoxExecution, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MinimapCalculateSvgScaleAndViewBoxExecution }); }; MinimapCalculateSvgScaleAndViewBoxExecution = __decorate([ FExecutionRegister(MinimapCalculateSvgScaleAndViewBoxRequest) ], MinimapCalculateSvgScaleAndViewBoxExecution); export { MinimapCalculateSvgScaleAndViewBoxExecution }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MinimapCalculateSvgScaleAndViewBoxExecution, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW1hcC1jYWxjdWxhdGUtc3ZnLXNjYWxlLWFuZC12aWV3LWJveC5leGVjdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2YtbWluaW1hcC9kb21haW4vbWluaW1hcC1jYWxjdWxhdGUtc3ZnLXNjYWxlLWFuZC12aWV3LWJveC9taW5pbWFwLWNhbGN1bGF0ZS1zdmctc2NhbGUtYW5kLXZpZXctYm94LmV4ZWN1dGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLHlDQUF5QyxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDL0csT0FBTyxFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBYyxNQUFNLGtCQUFrQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBZ0IsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMvRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUd0RCxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFLNUQsSUFBTSwyQ0FBMkMsR0FBakQsTUFBTSwyQ0FBMkM7SUFHOUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUUvQixnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUVwRCxJQUFZLE1BQU07UUFDaEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBTSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFZLFFBQVE7UUFDbEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBUSxDQUFDO0lBQ3hDLENBQUM7SUFFTSxNQUFNLENBQUMsT0FBa0Q7UUFDOUQsSUFBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVB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QyxHQUFHLENBQUMsQ0FBQztRQUN2RSxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sY0FBYyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFGLENBQUM7d0dBdEVVLDJDQUEyQzs0R0FBM0MsMkNBQTJDOztBQUEzQywyQ0FBMkM7SUFEdkQsa0JBQWtCLENBQUMseUNBQXlDLENBQUM7R0FDakQsMkNBQTJDLENBdUV2RDs7NEZBdkVZLDJDQUEyQztrQkFGdkQsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWluaW1hcENhbGN1bGF0ZVN2Z1NjYWxlQW5kVmlld0JveFJlcXVlc3QgfSBmcm9tICcuL21pbmltYXAtY2FsY3VsYXRlLXN2Zy1zY2FsZS1hbmQtdmlldy1ib3gucmVxdWVzdCc7XG5pbXBvcnQgeyBGRXhlY3V0aW9uUmVnaXN0ZXIsIEZNZWRpYXRvciwgSUV4ZWN1dGlvbiB9IGZyb20gJ0Bmb2JsZXgvbWVkaWF0b3InO1xuaW1wb3J0IHsgYWRqdXN0UmVjdFRvTWluU2l6ZSwgSVJlY3QsIElTaXplLCBSZWN0RXh0ZW5zaW9ucywgU2l6ZUV4dGVuc2lvbnMgfSBmcm9tICdAZm9ibGV4LzJkJztcbmltcG9ydCB7IEZDb21wb25lbnRzU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9mLXN0b3JhZ2UnO1xuaW1wb3J0IHsgRkNhbnZhc0Jhc2UgfSBmcm9tICcuLi8uLi8uLi9mLWNhbnZhcyc7XG5pbXBvcnQgeyBGRmxvd0Jhc2UgfSBmcm9tICcuLi8uLi8uLi9mLWZsb3cnO1xuaW1wb3J0IHsgQ2FsY3VsYXRlTm9kZXNCb3VuZGluZ0JveFJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi9kb21haW4nO1xuaW1wb3J0IHsgSUZNaW5pbWFwU2NhbGVBbmRWaWV3Qm94IH0gZnJvbSAnLi9pLWYtbWluaW1hcC1zY2FsZS1hbmQtdmlldy1ib3gnO1xuXG5ASW5qZWN0YWJsZSgpXG5ARkV4ZWN1dGlvblJlZ2lzdGVyKE1pbmltYXBDYWxjdWxhdGVTdmdTY2FsZUFuZFZpZXdCb3hSZXF1ZXN0KVxuZXhwb3J0IGNsYXNzIE1pbmltYXBDYWxjdWxhdGVTdmdTY2FsZUFuZFZpZXdCb3hFeGVjdXRpb25cbiAgaW1wbGVtZW50cyBJRXhlY3V0aW9uPE1pbmltYXBDYWxjdWxhdGVTdmdTY2FsZUFuZFZpZXdCb3hSZXF1ZXN0LCBJRk1pbmltYXBTY2FsZUFuZFZpZXdCb3g+IHtcblxuICBwcml2YXRlIF9mTWVkaWF0b3IgPSBpbmplY3QoRk1lZGlhdG9yKTtcblxuICBwcml2YXRlIF9mQ29tcG9uZW50U3RvcmUgPSBpbmplY3QoRkNvbXBvbmVudHNTdG9yZSk7XG5cbiAgcHJpdmF0ZSBnZXQgX2ZGbG93KCk6IEZGbG93QmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZDb21wb25lbnRTdG9yZS5mRmxvdyE7XG4gIH1cblxuICBwcml2YXRlIGdldCBfZkNhbnZhcygpOiBGQ2FudmFzQmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZDb21wb25lbnRTdG9yZS5mQ2FudmFzITtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGUocmVxdWVzdDogTWluaW1hcENhbGN1bGF0ZVN2Z1NjYWxlQW5kVmlld0JveFJlcXVlc3QpOiBJRk1pbmltYXBTY2FsZUFuZFZpZXdCb3gge1xuICAgIGlmKCF0aGlzLl9mRmxvdykge1xuICAgICAgcmV0dXJuIHsgc2NhbGU6IDEsIHZpZXdCb3g6IFJlY3RFeHRlbnNpb25zLmluaXRpYWxpemUoMCwgMCwgMCwgMCkgfTtcbiAgICB9XG5cbiAgICBjb25zdCBub2Rlc1JlY3QgPSB0aGlzLl9nZXRTY2FsZWROb2Rlc0JvdW5kaW5nQm94KHJlcXVlc3QubWluU2l6ZSk7XG4gICAgY29uc3QgbWluaW1hcFJlY3QgPSB0aGlzLl9nZXRNaW5pbWFwUmVjdChyZXF1ZXN0LmVsZW1lbnQpO1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5fY2FsY3VsYXRlVmlld1NjYWxlKG5vZGVzUmVjdCwgbWluaW1hcFJlY3QpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNjYWxlLFxuICAgICAgdmlld0JveDogdGhpcy5fY2FsY3VsYXRlVmlld0JveChub2Rlc1JlY3QsIG1pbmltYXBSZWN0LCBzY2FsZSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRTY2FsZWROb2Rlc0JvdW5kaW5nQm94KG1pblNpemU6IG51bWJlcik6IElSZWN0IHtcbiAgICBjb25zdCBnbG9iYWxSZWN0ID0gdGhpcy5fY2FsY3VsYXRlTm9kZXNCb3VuZGluZ0JveCgpO1xuICAgIGNvbnN0IGZsb3dSZWN0ID0gdGhpcy5fY29udmVydEZyb21HbG9iYWxUb0Zsb3dSZWN0KGdsb2JhbFJlY3QpO1xuICAgIGNvbnN0IHNjYWxlZFJlY3QgPSB0aGlzLl9jb252ZXJ0UmVjdFRvTWluaW1hcFNjYWxlKGZsb3dSZWN0KTtcbiAgICByZXR1cm4gYWRqdXN0UmVjdFRvTWluU2l6ZShzY2FsZWRSZWN0LCBtaW5TaXplKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZU5vZGVzQm91bmRpbmdCb3goKTogSVJlY3Qge1xuICAgIHJldHVybiB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTxJUmVjdCB8IG51bGw+KG5ldyBDYWxjdWxhdGVOb2Rlc0JvdW5kaW5nQm94UmVxdWVzdCgpKVxuICAgICAgfHwgUmVjdEV4dGVuc2lvbnMuaW5pdGlhbGl6ZSgwLCAwLCAwLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnZlcnRGcm9tR2xvYmFsVG9GbG93UmVjdChyZWN0OiBJUmVjdCk6IElSZWN0IHtcbiAgICByZXR1cm4gUmVjdEV4dGVuc2lvbnMuZWxlbWVudFRyYW5zZm9ybShyZWN0LCB0aGlzLl9mRmxvdyEuaG9zdEVsZW1lbnQpXG4gIH1cblxuICBwcml2YXRlIF9jb252ZXJ0UmVjdFRvTWluaW1hcFNjYWxlKHJlY3Q6IElSZWN0KTogSVJlY3Qge1xuICAgIHJldHVybiBSZWN0RXh0ZW5zaW9ucy5kaXYocmVjdCwgdGhpcy5fZkNhbnZhcy50cmFuc2Zvcm0uc2NhbGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0TWluaW1hcFJlY3QoZWxlbWVudDogU1ZHU1ZHRWxlbWVudCk6IElSZWN0IHtcbiAgICByZXR1cm4gUmVjdEV4dGVuc2lvbnMuZWxlbWVudFRyYW5zZm9ybShSZWN0RXh0ZW5zaW9ucy5mcm9tRWxlbWVudChlbGVtZW50KSwgdGhpcy5fZkZsb3cuaG9zdEVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlVmlld1NjYWxlKG5vZGVzUmVjdDogSVJlY3QsIG1pbmltYXBSZWN0OiBJUmVjdCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG5vZGVzUmVjdC53aWR0aCAvIG1pbmltYXBSZWN0LndpZHRoLCBub2Rlc1JlY3QuaGVpZ2h0IC8gbWluaW1hcFJlY3QuaGVpZ2h0KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZVZpZXdCb3gobm9kZXNSZWN0OiBJUmVjdCwgbWluaW1hcFJlY3Q6IElSZWN0LCBzY2FsZTogbnVtYmVyKTogSVJlY3Qge1xuICAgIHJldHVybiB0aGlzLl9jYWxjdWxhdGVDZW50ZXJlZFZpZXdCb3gobm9kZXNSZWN0LCB0aGlzLl9jYWxjdWxhdGVWaWV3U2l6ZShtaW5pbWFwUmVjdCwgc2NhbGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZVZpZXdTaXplKG1pbmltYXBSZWN0OiBJUmVjdCwgc2NhbGU6IG51bWJlcik6IElTaXplIHtcbiAgICByZXR1cm4gU2l6ZUV4dGVuc2lvbnMuaW5pdGlhbGl6ZShtaW5pbWFwUmVjdC53aWR0aCAqIHNjYWxlIHx8IDAsIG1pbmltYXBSZWN0LmhlaWdodCAqIHNjYWxlIHx8IDApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlQ2VudGVyZWRWaWV3Qm94KG5vZGVzUmVjdDogSVJlY3QsIHZpZXdTaXplOiBJU2l6ZSk6IElSZWN0IHtcbiAgICBjb25zdCBjZW50ZXJlZFggPSBub2Rlc1JlY3QueCAtICh2aWV3U2l6ZS53aWR0aCAtIG5vZGVzUmVjdC53aWR0aCkgLyAyO1xuICAgIGNvbnN0IGNlbnRlcmVkWSA9IG5vZGVzUmVjdC55IC0gKHZpZXdTaXplLmhlaWdodCAtIG5vZGVzUmVjdC5oZWlnaHQpIC8gMjtcbiAgICByZXR1cm4gUmVjdEV4dGVuc2lvbnMuaW5pdGlhbGl6ZShjZW50ZXJlZFgsIGNlbnRlcmVkWSwgdmlld1NpemUud2lkdGgsIHZpZXdTaXplLmhlaWdodCk7XG4gIH1cbn1cbiJdfQ==