@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.
151 lines • 18.1 kB
JavaScript
import { booleanAttribute, DestroyRef, Directive, EventEmitter, inject, Input, Output, } from "@angular/core";
import { PointExtensions, SizeExtensions } from '@foblex/2d';
import { F_NODE, FNodeBase } from './f-node-base';
import { NotifyTransformChangedRequest } from '../f-storage';
import { FMediator } from '@foblex/mediator';
import { AddNodeToStoreRequest, UpdateNodeWhenStateOrSizeChangedRequest, RemoveNodeFromStoreRequest } from '../domain';
import * as i0 from "@angular/core";
import * as i1 from "@foblex/platform";
let uniqueId = 0;
export class FGroupDirective extends FNodeBase {
renderer;
fBrowser;
_destroyRef = inject(DestroyRef);
_fMediator = inject(FMediator);
fId = `f-group-${uniqueId++}`;
fParentId = null;
set position(value) {
if (!PointExtensions.isEqual(this._position, value)) {
this._position = value;
this.redraw();
this.refresh();
}
}
get position() {
return this._position;
}
positionChange = new EventEmitter();
set rotate(value) {
if (this._rotate !== value) {
this._rotate = value;
this.redraw();
this.refresh();
}
}
get rotate() {
return this._rotate;
}
rotateChange = new EventEmitter();
set size(value) {
if (!this.size || !SizeExtensions.isEqual(this._size, value)) {
this._size = value;
this.redraw();
this.refresh();
}
}
get size() {
return this._size;
}
sizeChange = new EventEmitter();
fDraggingDisabled = false;
fSelectionDisabled = false;
fIncludePadding = true;
fConnectOnNode = true;
fMinimapClass = [];
constructor(elementReference, renderer, fBrowser) {
super(elementReference.nativeElement);
this.renderer = renderer;
this.fBrowser = fBrowser;
}
ngOnInit() {
this.setStyle('position', 'absolute');
this.setStyle('transform-origin', 'center');
this.setStyle('user-select', 'none');
this.setStyle('pointer-events', 'all');
this.setStyle('left', '0');
this.setStyle('top', '0');
super.redraw();
this._fMediator.execute(new AddNodeToStoreRequest(this));
}
setStyle(styleName, value) {
this.renderer.setStyle(this.hostElement, styleName, value);
}
redraw() {
super.redraw();
this._fMediator.execute(new NotifyTransformChangedRequest());
}
ngAfterViewInit() {
if (!this.fBrowser.isBrowser()) {
return;
}
this._listenStateSizeChanges();
}
_listenStateSizeChanges() {
this._fMediator.execute(new UpdateNodeWhenStateOrSizeChangedRequest(this, this._destroyRef));
}
refresh() {
this.stateChanges.notify();
}
ngOnDestroy() {
this._fMediator.execute(new RemoveNodeFromStoreRequest(this));
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FGroupDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.BrowserService }], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.13", type: FGroupDirective, selector: "[fGroup]", inputs: { fId: ["fGroupId", "fId"], fParentId: ["fGroupParentId", "fParentId"], position: ["fGroupPosition", "position"], rotate: ["fGroupRotate", "rotate"], size: ["fGroupSize", "size"], fDraggingDisabled: ["fGroupDraggingDisabled", "fDraggingDisabled", booleanAttribute], fSelectionDisabled: ["fGroupSelectionDisabled", "fSelectionDisabled", booleanAttribute], fIncludePadding: ["fIncludePadding", "fIncludePadding", booleanAttribute], fConnectOnNode: ["fConnectOnNode", "fConnectOnNode", booleanAttribute], fMinimapClass: "fMinimapClass" }, outputs: { positionChange: "fGroupPositionChange", rotateChange: "fGroupRotateChange", sizeChange: "fGroupSizeChange" }, host: { properties: { "attr.data-f-group-id": "fId", "class.f-group-dragging-disabled": "fDraggingDisabled", "class.f-group-selection-disabled": "fSelectionDisabled" }, classAttribute: "f-group f-component" }, providers: [
{ provide: F_NODE, useExisting: FGroupDirective }
], exportAs: ["fComponent"], usesInheritance: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FGroupDirective, decorators: [{
type: Directive,
args: [{
selector: "[fGroup]",
exportAs: "fComponent",
host: {
'[attr.data-f-group-id]': 'fId',
class: "f-group f-component",
'[class.f-group-dragging-disabled]': 'fDraggingDisabled',
'[class.f-group-selection-disabled]': 'fSelectionDisabled',
},
providers: [
{ provide: F_NODE, useExisting: FGroupDirective }
],
}]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.BrowserService }], propDecorators: { fId: [{
type: Input,
args: ['fGroupId']
}], fParentId: [{
type: Input,
args: ['fGroupParentId']
}], position: [{
type: Input,
args: ['fGroupPosition']
}], positionChange: [{
type: Output,
args: ['fGroupPositionChange']
}], rotate: [{
type: Input,
args: ['fGroupRotate']
}], rotateChange: [{
type: Output,
args: ['fGroupRotateChange']
}], size: [{
type: Input,
args: ['fGroupSize']
}], sizeChange: [{
type: Output,
args: ['fGroupSizeChange']
}], fDraggingDisabled: [{
type: Input,
args: [{ alias: 'fGroupDraggingDisabled', transform: booleanAttribute }]
}], fSelectionDisabled: [{
type: Input,
args: [{ alias: 'fGroupSelectionDisabled', transform: booleanAttribute }]
}], fIncludePadding: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], fConnectOnNode: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], fMinimapClass: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1ncm91cC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2Ytbm9kZS9mLWdyb3VwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ1UsZ0JBQWdCLEVBQUUsVUFBVSxFQUMzQyxTQUFTLEVBRVQsWUFBWSxFQUFFLE1BQU0sRUFDcEIsS0FBSyxFQUdMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbkYsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc3QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsdUNBQXVDLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxXQUFXLENBQUM7OztBQUV2SCxJQUFJLFFBQVEsR0FBVyxDQUFDLENBQUM7QUFlekIsTUFBTSxPQUFPLGVBQWdCLFNBQVEsU0FBUztJQTBFbEM7SUFDQTtJQXhFTyxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLFVBQVUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFHaEMsR0FBRyxHQUFXLFdBQVksUUFBUSxFQUFHLEVBQUUsQ0FBQztJQUd4QyxTQUFTLEdBQThCLElBQUksQ0FBQztJQUU1RCxJQUNvQixRQUFRLENBQUMsS0FBYTtRQUN4QyxJQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLE1B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LE1BQU07c0JBRHpCLEtBQUs7dUJBQUMsY0FBYztnQkFhTCxZQUFZO3NCQUQzQixNQUFNO3VCQUFDLG9CQUFvQjtnQkFLUixJQUFJO3NCQUR2QixLQUFLO3VCQUFDLFlBQVk7Z0JBWUgsVUFBVTtzQkFEekIsTUFBTTt1QkFBQyxrQkFBa0I7Z0JBSVYsaUJBQWlCO3NCQURoQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJdkQsa0JBQWtCO3NCQURqQyxLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLHlCQUF5QixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJeEQsZUFBZTtzQkFEOUIsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJdEIsY0FBYztzQkFEN0IsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJdEIsYUFBYTtzQkFENUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsIGJvb2xlYW5BdHRyaWJ1dGUsIERlc3Ryb3lSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLCBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBJUG9pbnQsIElSZWN0LCBJU2l6ZSwgUG9pbnRFeHRlbnNpb25zLCBTaXplRXh0ZW5zaW9ucyB9IGZyb20gJ0Bmb2JsZXgvMmQnO1xuaW1wb3J0IHsgRl9OT0RFLCBGTm9kZUJhc2UgfSBmcm9tICcuL2Ytbm9kZS1iYXNlJztcbmltcG9ydCB7IE5vdGlmeVRyYW5zZm9ybUNoYW5nZWRSZXF1ZXN0IH0gZnJvbSAnLi4vZi1zdG9yYWdlJztcbmltcG9ydCB7IEZNZWRpYXRvciB9IGZyb20gJ0Bmb2JsZXgvbWVkaWF0b3InO1xuaW1wb3J0IHsgQnJvd3NlclNlcnZpY2UgfSBmcm9tICdAZm9ibGV4L3BsYXRmb3JtJztcbmltcG9ydCB7IElIYXNIb3N0RWxlbWVudCB9IGZyb20gJy4uL2ktaGFzLWhvc3QtZWxlbWVudCc7XG5pbXBvcnQgeyBBZGROb2RlVG9TdG9yZVJlcXVlc3QsIFVwZGF0ZU5vZGVXaGVuU3RhdGVPclNpemVDaGFuZ2VkUmVxdWVzdCwgUmVtb3ZlTm9kZUZyb21TdG9yZVJlcXVlc3QgfSBmcm9tICcuLi9kb21haW4nO1xuXG5sZXQgdW5pcXVlSWQ6IG51bWJlciA9IDA7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbZkdyb3VwXVwiLFxuICBleHBvcnRBczogXCJmQ29tcG9uZW50XCIsXG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIuZGF0YS1mLWdyb3VwLWlkXSc6ICdmSWQnLFxuICAgIGNsYXNzOiBcImYtZ3JvdXAgZi1jb21wb25lbnRcIixcbiAgICAnW2NsYXNzLmYtZ3JvdXAtZHJhZ2dpbmctZGlzYWJsZWRdJzogJ2ZEcmFnZ2luZ0Rpc2FibGVkJyxcbiAgICAnW2NsYXNzLmYtZ3JvdXAtc2VsZWN0aW9uLWRpc2FibGVkXSc6ICdmU2VsZWN0aW9uRGlzYWJsZWQnLFxuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7IHByb3ZpZGU6IEZfTk9ERSwgdXNlRXhpc3Rpbmc6IEZHcm91cERpcmVjdGl2ZSB9XG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZHcm91cERpcmVjdGl2ZSBleHRlbmRzIEZOb2RlQmFzZVxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgSUhhc0hvc3RFbGVtZW50LCBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZNZWRpYXRvciA9IGluamVjdChGTWVkaWF0b3IpO1xuXG4gIEBJbnB1dCgnZkdyb3VwSWQnKVxuICBwdWJsaWMgb3ZlcnJpZGUgZklkOiBzdHJpbmcgPSBgZi1ncm91cC0keyB1bmlxdWVJZCsrIH1gO1xuXG4gIEBJbnB1dCgnZkdyb3VwUGFyZW50SWQnKVxuICBwdWJsaWMgb3ZlcnJpZGUgZlBhcmVudElkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbDtcblxuICBASW5wdXQoJ2ZHcm91cFBvc2l0aW9uJylcbiAgcHVibGljIG92ZXJyaWRlIHNldCBwb3NpdGlvbih2YWx1ZTogSVBvaW50KSB7XG4gICAgaWYoIVBvaW50RXh0ZW5zaW9ucy5pc0VxdWFsKHRoaXMuX3Bvc2l0aW9uLCB2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX3Bvc2l0aW9uID0gdmFsdWU7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBvdmVycmlkZSBnZXQgcG9zaXRpb24oKTogSVBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gIH1cbiAgQE91dHB1dCgnZkdyb3VwUG9zaXRpb25DaGFuZ2UnKVxuICBwdWJsaWMgb3ZlcnJpZGUgcG9zaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElQb2ludD4oKTtcblxuXG4gIEBJbnB1dCgnZkdyb3VwUm90YXRlJylcbiAgcHVibGljIG92ZXJyaWRlIHNldCByb3RhdGUodmFsdWU6IG51bWJlcikge1xuICAgIGlmKHRoaXMuX3JvdGF0ZSAhPT0gdmFsdWUpIHtcbiAgICAgIHRoaXMuX3JvdGF0ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IHJvdGF0ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yb3RhdGU7XG4gIH1cblxuICBAT3V0cHV0KCdmR3JvdXBSb3RhdGVDaGFuZ2UnKVxuICBwdWJsaWMgb3ZlcnJpZGUgcm90YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cblxuICBASW5wdXQoJ2ZHcm91cFNpemUnKVxuICBwdWJsaWMgb3ZlcnJpZGUgc2V0IHNpemUodmFsdWU6IElTaXplKSB7XG4gICAgaWYoIXRoaXMuc2l6ZSB8fCAhU2l6ZUV4dGVuc2lvbnMuaXNFcXVhbCh0aGlzLl9zaXplISwgdmFsdWUpKSB7XG4gICAgICB0aGlzLl9zaXplID0gdmFsdWU7XG4gICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgdGhpcy5yZWZyZXNoKClcbiAgICB9XG4gIH1cbiAgcHVibGljIG92ZXJyaWRlIGdldCBzaXplKCk6IElTaXplIHtcbiAgICByZXR1cm4gdGhpcy5fc2l6ZSE7XG4gIH1cbiAgQE91dHB1dCgnZkdyb3VwU2l6ZUNoYW5nZScpXG4gIHB1YmxpYyBvdmVycmlkZSBzaXplQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJUmVjdD4oKTtcblxuICBASW5wdXQoeyBhbGlhczogJ2ZHcm91cERyYWdnaW5nRGlzYWJsZWQnLCB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgcHVibGljIG92ZXJyaWRlIGZEcmFnZ2luZ0Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KHsgYWxpYXM6ICdmR3JvdXBTZWxlY3Rpb25EaXNhYmxlZCcsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgZlNlbGVjdGlvbkRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBvdmVycmlkZSBmSW5jbHVkZVBhZGRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgZkNvbm5lY3RPbk5vZGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvdmVycmlkZSBmTWluaW1hcENsYXNzOiBzdHJpbmdbXSB8IHN0cmluZyA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRSZWZlcmVuY2U6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGZCcm93c2VyOiBCcm93c2VyU2VydmljZVxuICApIHtcbiAgICBzdXBlcihlbGVtZW50UmVmZXJlbmNlLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0U3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gICAgdGhpcy5zZXRTdHlsZSgndHJhbnNmb3JtLW9yaWdpbicsICdjZW50ZXInKTtcbiAgICB0aGlzLnNldFN0eWxlKCd1c2VyLXNlbGVjdCcsICdub25lJyk7XG4gICAgdGhpcy5zZXRTdHlsZSgncG9pbnRlci1ldmVudHMnLCAnYWxsJyk7XG4gICAgdGhpcy5zZXRTdHlsZSgnbGVmdCcsICcwJyk7XG4gICAgdGhpcy5zZXRTdHlsZSgndG9wJywgJzAnKTtcbiAgICBzdXBlci5yZWRyYXcoKTtcblxuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBBZGROb2RlVG9TdG9yZVJlcXVlc3QodGhpcykpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHNldFN0eWxlKHN0eWxlTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmhvc3RFbGVtZW50LCBzdHlsZU5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSByZWRyYXcoKTogdm9pZCB7XG4gICAgc3VwZXIucmVkcmF3KCk7XG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUobmV3IE5vdGlmeVRyYW5zZm9ybUNoYW5nZWRSZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZighdGhpcy5mQnJvd3Nlci5pc0Jyb3dzZXIoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9saXN0ZW5TdGF0ZVNpemVDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5TdGF0ZVNpemVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KG5ldyBVcGRhdGVOb2RlV2hlblN0YXRlT3JTaXplQ2hhbmdlZFJlcXVlc3QodGhpcywgdGhpcy5fZGVzdHJveVJlZikpO1xuICB9XG5cbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubm90aWZ5KCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8dm9pZD4obmV3IFJlbW92ZU5vZGVGcm9tU3RvcmVSZXF1ZXN0KHRoaXMpKTtcbiAgfVxufVxuIl19