@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.
95 lines • 14.5 kB
JavaScript
import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, input, numberAttribute } from "@angular/core";
import { PointExtensions, TransformModelExtensions } from '@foblex/2d';
import { F_BACKGROUND_PATTERN } from '../domain';
import { BrowserService } from '@foblex/platform';
import { createSVGElement } from '../../domain';
import { FChannel, FChannelHub, notifyOnStart } from '../../reactivity';
import * as i0 from "@angular/core";
let uniqueId = 0;
export class FCirclePatternComponent {
_destroyRef = inject(DestroyRef);
_elementReference = inject(ElementRef);
_fBrowser = inject(BrowserService);
_stateChanges = new FChannel();
get hostElement() {
return this._elementReference.nativeElement;
}
id = input(`f-pattern-${uniqueId++}`);
color = input('rgba(0,0,0,0.1)');
radius = input(20, { transform: numberAttribute });
_scaledRadius = 20;
_transform = TransformModelExtensions.default();
_position = PointExtensions.initialize();
_pattern;
_circle;
constructor() {
this._createPattern();
}
_createPattern() {
this._pattern = createSVGElement('pattern', this._fBrowser);
this._pattern.setAttribute('patternUnits', 'userSpaceOnUse');
this.hostElement.appendChild(this._pattern);
this._circle = createSVGElement('circle', this._fBrowser);
this._pattern.appendChild(this._circle);
}
ngOnInit() {
this._listenStateChanges();
}
_listenStateChanges() {
new FChannelHub(this._stateChanges).pipe(notifyOnStart()).listen(this._destroyRef, () => this._redraw());
}
ngOnChanges(changes) {
if (changes['radius'] || changes['color']) {
this._refresh();
}
}
_redraw() {
this._calculatePattern();
this._redrawPattern();
this._redrawElement();
}
_calculatePattern() {
this._position.x = this._transform.position.x + this._transform.scaledPosition.x;
this._position.y = this._transform.position.y + this._transform.scaledPosition.y;
this._scaledRadius = this.radius() * this._transform.scale;
}
_redrawPattern() {
this._pattern.setAttribute('x', `${this._position.x}`);
this._pattern.setAttribute('y', `${this._position.y}`);
this._pattern.setAttribute('width', `${this._scaledRadius}`);
this._pattern.setAttribute('height', `${this._scaledRadius}`);
}
_redrawElement() {
this._circle.setAttribute('fill', this.color());
this._circle.setAttribute('cx', `${this._scaledRadius / 2}`);
this._circle.setAttribute('cy', `${this._scaledRadius / 2}`);
this._circle.setAttribute('r', `${this._scaledRadius / this.radius()}`);
}
setTransform(transform) {
this._transform = transform;
this._refresh();
}
_refresh() {
this._stateChanges.notify();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FCirclePatternComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: FCirclePatternComponent, isStandalone: true, selector: "f-circle-pattern", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, radius: { classPropertyName: "radius", publicName: "radius", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.id": "id" } }, providers: [
{ provide: F_BACKGROUND_PATTERN, useExisting: FCirclePatternComponent }
], usesOnChanges: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FCirclePatternComponent, decorators: [{
type: Component,
args: [{
selector: "f-circle-pattern",
template: ``,
standalone: true,
host: {
'[attr.id]': 'id'
},
providers: [
{ provide: F_BACKGROUND_PATTERN, useExisting: FCirclePatternComponent }
],
changeDetection: ChangeDetectionStrategy.OnPush
}]
}], ctorParameters: () => [] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1jaXJjbGUtcGF0dGVybi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2YtYmFja2dyb3VkL2YtY2lyY2xlLXBhdHRlcm4vZi1jaXJjbGUtcGF0dGVybi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQUUsVUFBVSxFQUNyQixVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBUyxlQUFlLEVBRWxELE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3pCLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxvQkFBb0IsRUFBdUIsTUFBTSxXQUFXLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFeEUsSUFBSSxRQUFRLEdBQVcsQ0FBQyxDQUFDO0FBY3pCLE1BQU0sT0FBTyx1QkFBdUI7SUFFakIsV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdkMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVuQyxhQUFhLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztJQUVoRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDO0lBQzlDLENBQUM7SUFFTSxFQUFFLEdBQUcsS0FBSyxDQUFTLGFBQWMsUUFBUSxFQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELEtB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b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCwgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgSW5wdXQsIG51bWJlckF0dHJpYnV0ZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksXG4gIE9uSW5pdCwgU2ltcGxlQ2hhbmdlc1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgSVBvaW50LFxuICBJVHJhbnNmb3JtTW9kZWwsXG4gIFBvaW50RXh0ZW5zaW9ucyxcbiAgVHJhbnNmb3JtTW9kZWxFeHRlbnNpb25zXG59IGZyb20gJ0Bmb2JsZXgvMmQnO1xuaW1wb3J0IHsgRl9CQUNLR1JPVU5EX1BBVFRFUk4sIElGQmFja2dyb3VuZFBhdHRlcm4gfSBmcm9tICcuLi9kb21haW4nO1xuaW1wb3J0IHsgQnJvd3NlclNlcnZpY2UgfSBmcm9tICdAZm9ibGV4L3BsYXRmb3JtJztcbmltcG9ydCB7IGNyZWF0ZVNWR0VsZW1lbnQgfSBmcm9tICcuLi8uLi9kb21haW4nO1xuaW1wb3J0IHsgRkNoYW5uZWwsIEZDaGFubmVsSHViLCBub3RpZnlPblN0YXJ0IH0gZnJvbSAnLi4vLi4vcmVhY3Rpdml0eSc7XG5cbmxldCB1bmlxdWVJZDogbnVtYmVyID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImYtY2lyY2xlLXBhdHRlcm5cIixcbiAgdGVtcGxhdGU6IGBgLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBob3N0OiB7XG4gICAgJ1thdHRyLmlkXSc6ICdpZCdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgeyBwcm92aWRlOiBGX0JBQ0tHUk9VTkRfUEFUVEVSTiwgdXNlRXhpc3Rpbmc6IEZDaXJjbGVQYXR0ZXJuQ29tcG9uZW50IH1cbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgRkNpcmNsZVBhdHRlcm5Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgSUZCYWNrZ3JvdW5kUGF0dGVybiB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudFJlZmVyZW5jZSA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZkJyb3dzZXIgPSBpbmplY3QoQnJvd3NlclNlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXRlQ2hhbmdlcyA9IG5ldyBGQ2hhbm5lbCgpO1xuXG4gIHB1YmxpYyBnZXQgaG9zdEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50UmVmZXJlbmNlLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgaWQgPSBpbnB1dDxzdHJpbmc+KGBmLXBhdHRlcm4tJHsgdW5pcXVlSWQrKyB9YCk7XG4gIHB1YmxpYyBjb2xvciA9IGlucHV0PHN0cmluZz4oJ3JnYmEoMCwwLDAsMC4xKScpO1xuICBwdWJsaWMgcmFkaXVzID0gaW5wdXQ8bnVtYmVyLCB1bmtub3duPigyMCwgeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZX0pO1xuXG4gIHByaXZhdGUgX3NjYWxlZFJhZGl1czogbnVtYmVyID0gMjA7XG5cbiAgcHJpdmF0ZSBfdHJhbnNmb3JtOiBJVHJhbnNmb3JtTW9kZWwgPSBUcmFuc2Zvcm1Nb2RlbEV4dGVuc2lvbnMuZGVmYXVsdCgpO1xuXG4gIHByaXZhdGUgX3Bvc2l0aW9uOiBJUG9pbnQgPSBQb2ludEV4dGVuc2lvbnMuaW5pdGlhbGl6ZSgpO1xuXG4gIHByaXZhdGUgX3BhdHRlcm4hOiBTVkdQYXR0ZXJuRWxlbWVudDtcbiAgcHJpdmF0ZSBfY2lyY2xlITogU1ZHQ2lyY2xlRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgKSB7XG4gICAgdGhpcy5fY3JlYXRlUGF0dGVybigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlUGF0dGVybigpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXR0ZXJuID0gY3JlYXRlU1ZHRWxlbWVudCgncGF0dGVybicsIHRoaXMuX2ZCcm93c2VyKTtcbiAgICB0aGlzLl9wYXR0ZXJuLnNldEF0dHJpYnV0ZSgncGF0dGVyblVuaXRzJywgJ3VzZXJTcGFjZU9uVXNlJyk7XG4gICAgdGhpcy5ob3N0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9wYXR0ZXJuKTtcblxuICAgIHRoaXMuX2NpcmNsZSA9IGNyZWF0ZVNWR0VsZW1lbnQoJ2NpcmNsZScsIHRoaXMuX2ZCcm93c2VyKTtcbiAgICB0aGlzLl9wYXR0ZXJuLmFwcGVuZENoaWxkKHRoaXMuX2NpcmNsZSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fbGlzdGVuU3RhdGVDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5TdGF0ZUNoYW5nZXMoKTogdm9pZCB7XG4gICAgbmV3IEZDaGFubmVsSHViKHRoaXMuX3N0YXRlQ2hhbmdlcykucGlwZShub3RpZnlPblN0YXJ0KCkpLmxpc3Rlbih0aGlzLl9kZXN0cm95UmVmLCAoKSA9PiB0aGlzLl9yZWRyYXcoKSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydyYWRpdXMnXSB8fCBjaGFuZ2VzWydjb2xvciddKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVkcmF3KCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbGN1bGF0ZVBhdHRlcm4oKTtcbiAgICB0aGlzLl9yZWRyYXdQYXR0ZXJuKCk7XG4gICAgdGhpcy5fcmVkcmF3RWxlbWVudCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlUGF0dGVybigpOiB2b2lkIHtcbiAgICB0aGlzLl9wb3NpdGlvbi54ID0gdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnggKyB0aGlzLl90cmFuc2Zvcm0uc2NhbGVkUG9zaXRpb24ueDtcbiAgICB0aGlzLl9wb3NpdGlvbi55ID0gdGhpcy5fdHJhbnNmb3JtLnBvc2l0aW9uLnkgKyB0aGlzLl90cmFuc2Zvcm0uc2NhbGVkUG9zaXRpb24ueTtcbiAgICB0aGlzLl9zY2FsZWRSYWRpdXMgPSB0aGlzLnJhZGl1cygpICogdGhpcy5fdHJhbnNmb3JtLnNjYWxlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVkcmF3UGF0dGVybigpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXR0ZXJuLnNldEF0dHJpYnV0ZSgneCcsIGAkeyB0aGlzLl9wb3NpdGlvbi54IH1gKTtcbiAgICB0aGlzLl9wYXR0ZXJuLnNldEF0dHJpYnV0ZSgneScsIGAkeyB0aGlzLl9wb3NpdGlvbi55IH1gKTtcbiAgICB0aGlzLl9wYXR0ZXJuLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBgJHsgdGhpcy5fc2NhbGVkUmFkaXVzIH1gKTtcbiAgICB0aGlzLl9wYXR0ZXJuLnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgYCR7IHRoaXMuX3NjYWxlZFJhZGl1cyB9YCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWRyYXdFbGVtZW50KCk6IHZvaWQge1xuICAgIHRoaXMuX2NpcmNsZS5zZXRBdHRyaWJ1dGUoJ2ZpbGwnLCB0aGlzLmNvbG9yKCkpO1xuICAgIHRoaXMuX2NpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N4JywgYCR7IHRoaXMuX3NjYWxlZFJhZGl1cyAvIDIgfWApO1xuICAgIHRoaXMuX2NpcmNsZS5zZXRBdHRyaWJ1dGUoJ2N5JywgYCR7IHRoaXMuX3NjYWxlZFJhZGl1cyAvIDIgfWApO1xuICAgIHRoaXMuX2NpcmNsZS5zZXRBdHRyaWJ1dGUoJ3InLCBgJHsgdGhpcy5fc2NhbGVkUmFkaXVzIC8gdGhpcy5yYWRpdXMoKSB9YCk7XG4gIH1cblxuICBwdWJsaWMgc2V0VHJhbnNmb3JtKHRyYW5zZm9ybTogSVRyYW5zZm9ybU1vZGVsKTogdm9pZCB7XG4gICAgdGhpcy5fdHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIHRoaXMuX3JlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdGVDaGFuZ2VzLm5vdGlmeSgpO1xuICB9XG59XG4iXX0=