ngx-emfular-integration 0.3.6 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngx-emfular-integration.mjs +110 -71
- package/fesm2022/ngx-emfular-integration.mjs.map +1 -1
- package/lib/details/container-details/container-details.component.d.ts +2 -2
- package/lib/details/model-details/model-details.component.d.ts +2 -2
- package/lib/details/{model-details-service.d.ts → tree-details-service.d.ts} +1 -1
- package/lib/details/{basic-model-details.service.d.ts → tree-model-details.service.d.ts} +4 -4
- package/lib/editor/basic-editor/basic-editor.component.d.ts +13 -0
- package/lib/editor/model-canvas/model-canvas.component.d.ts +3 -12
- package/lib/editor/tree-canvas/tree-canvas.component.d.ts +18 -0
- package/lib/editor/tree-editor/tree-editor.component.d.ts +9 -7
- package/package.json +1 -1
- package/public-api.d.ts +5 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, PLATFORM_ID, Inject, Injectable, Input, Component, EventEmitter,
|
|
2
|
+
import { InjectionToken, PLATFORM_ID, Inject, Injectable, Input, Component, EventEmitter, ViewChild, Output } from '@angular/core';
|
|
3
3
|
import { Deserializer, getAllAttributes } from 'emfular';
|
|
4
4
|
import * as i1 from 'ngx-emfular-helper';
|
|
5
5
|
import { HistoryService, InputHandler } from 'ngx-emfular-helper';
|
|
@@ -105,6 +105,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
105
105
|
args: [HISTORY_SERVICE]
|
|
106
106
|
}] }, { type: i1.IoService }, { type: undefined }] });
|
|
107
107
|
|
|
108
|
+
class ModelEditingBarComponent {
|
|
109
|
+
buttons = null;
|
|
110
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: ModelEditingBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
111
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: ModelEditingBarComponent, isStandalone: true, selector: "emfular-model-editing-bar", inputs: { buttons: "buttons" }, ngImport: i0, template: "<div class=\"model-editing-bar\">\n <button *ngFor=\"let b of buttons\" (click)=\"b.action()\">\n <img\n *ngIf=\"b.icon\"\n class=\"icon\"\n [src]=\"b.icon\"\n alt=\"Icon for {{b.label}}\"\n />\n {{ b.label }}\n </button>\n</div>\n", styles: [".model-editing-bar{display:flex;flex-direction:column;gap:.3rem;padding:.4rem;width:60px;background:#f5f5f5;border-right:1px solid #ccc;overflow-y:auto}.model-editing-bar button{padding:.3rem;font-size:.75rem;cursor:pointer;text-align:left;width:100%;box-sizing:border-box;white-space:normal;overflow-wrap:break-word}.icon{margin-right:.2rem;width:.7rem;height:.7rem;object-fit:contain;vertical-align:middle}\n"], dependencies: [{ kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
112
|
+
}
|
|
113
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: ModelEditingBarComponent, decorators: [{
|
|
114
|
+
type: Component,
|
|
115
|
+
args: [{ selector: 'emfular-model-editing-bar', imports: [
|
|
116
|
+
NgForOf,
|
|
117
|
+
NgIf,
|
|
118
|
+
NgOptimizedImage
|
|
119
|
+
], template: "<div class=\"model-editing-bar\">\n <button *ngFor=\"let b of buttons\" (click)=\"b.action()\">\n <img\n *ngIf=\"b.icon\"\n class=\"icon\"\n [src]=\"b.icon\"\n alt=\"Icon for {{b.label}}\"\n />\n {{ b.label }}\n </button>\n</div>\n", styles: [".model-editing-bar{display:flex;flex-direction:column;gap:.3rem;padding:.4rem;width:60px;background:#f5f5f5;border-right:1px solid #ccc;overflow-y:auto}.model-editing-bar button{padding:.3rem;font-size:.75rem;cursor:pointer;text-align:left;width:100%;box-sizing:border-box;white-space:normal;overflow-wrap:break-word}.icon{margin-right:.2rem;width:.7rem;height:.7rem;object-fit:contain;vertical-align:middle}\n"] }]
|
|
120
|
+
}], propDecorators: { buttons: [{
|
|
121
|
+
type: Input
|
|
122
|
+
}] } });
|
|
123
|
+
|
|
124
|
+
class ModelCanvasComponent {
|
|
125
|
+
svgwidth;
|
|
126
|
+
svgheigth;
|
|
127
|
+
svgReady = new EventEmitter();
|
|
128
|
+
svg;
|
|
129
|
+
ngOnInit() {
|
|
130
|
+
// Safe because static: true
|
|
131
|
+
this.svgReady.emit(this.svg.nativeElement);
|
|
132
|
+
}
|
|
133
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: ModelCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
134
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: ModelCanvasComponent, isStandalone: true, selector: "model-canvas", inputs: { svgwidth: "svgwidth", svgheigth: "svgheigth" }, outputs: { svgReady: "svgReady" }, viewQueries: [{ propertyName: "svg", first: true, predicate: ["svg"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"modeling-container\">\n <svg #svg id=\"svg\" class=\"canvas-svg\" [attr.width]=\"svgwidth\" [attr.height]=\"svgheigth\">\n <ng-content></ng-content>\n </svg>\n</div>\n", styles: [""] });
|
|
135
|
+
}
|
|
136
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: ModelCanvasComponent, decorators: [{
|
|
137
|
+
type: Component,
|
|
138
|
+
args: [{ selector: 'model-canvas', imports: [], template: "<div class=\"modeling-container\">\n <svg #svg id=\"svg\" class=\"canvas-svg\" [attr.width]=\"svgwidth\" [attr.height]=\"svgheigth\">\n <ng-content></ng-content>\n </svg>\n</div>\n" }]
|
|
139
|
+
}], propDecorators: { svgwidth: [{
|
|
140
|
+
type: Input
|
|
141
|
+
}], svgheigth: [{
|
|
142
|
+
type: Input
|
|
143
|
+
}], svgReady: [{
|
|
144
|
+
type: Output
|
|
145
|
+
}], svg: [{
|
|
146
|
+
type: ViewChild,
|
|
147
|
+
args: ['svg', { static: true }]
|
|
148
|
+
}] } });
|
|
149
|
+
|
|
108
150
|
class FileLevelBarComponent {
|
|
109
151
|
ioService;
|
|
110
152
|
svg;
|
|
@@ -146,19 +188,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
146
188
|
type: Input
|
|
147
189
|
}] } });
|
|
148
190
|
|
|
149
|
-
class
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
191
|
+
class BasicEditorComponent {
|
|
192
|
+
modelService;
|
|
193
|
+
svgwidth = 1500;
|
|
194
|
+
svgheight = 1000;
|
|
195
|
+
svgElement;
|
|
196
|
+
constructor() { }
|
|
197
|
+
onSvgReady(svg) {
|
|
198
|
+
queueMicrotask(() => this.svgElement = svg);
|
|
199
|
+
}
|
|
200
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: BasicEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
201
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: BasicEditorComponent, isStandalone: true, selector: "emfular-basic-editor", inputs: { modelService: "modelService", svgwidth: "svgwidth", svgheight: "svgheight" }, ngImport: i0, template: "<div class=\"editor-root\">\n\n <!-- Fixed top bar -->\n <div class=\"editor-topbar\">\n <emfular-file-level-bar\n [svg]=\"svgElement\"\n [modelService]=\"modelService\">\n </emfular-file-level-bar>\n </div>\n\n <div class=\"editor-main\">\n <!-- Optional sidebar -->\n <div class=\"editor-sidebar\">\n <ng-content select=\"[sidebar]\"></ng-content>\n </div>\n <model-canvas\n [svgwidth]=\"svgheight\"\n [svgheigth]=\"svgheight\"\n (svgReady)=\"onSvgReady($event)\"\n >\n <ng-content select=\"[canvas]\"></ng-content>\n </model-canvas>\n </div>\n</div>\n", styles: [".editor-root{display:flex;flex-direction:column;width:100%;height:100%}.editor-topbar{flex:0 0 auto}.editor-main{flex:1 1 auto;display:flex;overflow:hidden}.editor-sidebar{flex:0 0 60px;background:#f5f5f5;border-right:1px solid #ccc;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "component", type: ModelCanvasComponent, selector: "model-canvas", inputs: ["svgwidth", "svgheigth"], outputs: ["svgReady"] }, { kind: "component", type: FileLevelBarComponent, selector: "emfular-file-level-bar", inputs: ["svg", "modelService"] }] });
|
|
153
202
|
}
|
|
154
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type:
|
|
203
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: BasicEditorComponent, decorators: [{
|
|
155
204
|
type: Component,
|
|
156
|
-
args: [{ selector: 'emfular-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
205
|
+
args: [{ selector: 'emfular-basic-editor', standalone: true, imports: [ModelCanvasComponent, FileLevelBarComponent], template: "<div class=\"editor-root\">\n\n <!-- Fixed top bar -->\n <div class=\"editor-topbar\">\n <emfular-file-level-bar\n [svg]=\"svgElement\"\n [modelService]=\"modelService\">\n </emfular-file-level-bar>\n </div>\n\n <div class=\"editor-main\">\n <!-- Optional sidebar -->\n <div class=\"editor-sidebar\">\n <ng-content select=\"[sidebar]\"></ng-content>\n </div>\n <model-canvas\n [svgwidth]=\"svgheight\"\n [svgheigth]=\"svgheight\"\n (svgReady)=\"onSvgReady($event)\"\n >\n <ng-content select=\"[canvas]\"></ng-content>\n </model-canvas>\n </div>\n</div>\n", styles: [".editor-root{display:flex;flex-direction:column;width:100%;height:100%}.editor-topbar{flex:0 0 auto}.editor-main{flex:1 1 auto;display:flex;overflow:hidden}.editor-sidebar{flex:0 0 60px;background:#f5f5f5;border-right:1px solid #ccc;display:flex;flex-direction:column}\n"] }]
|
|
206
|
+
}], ctorParameters: () => [], propDecorators: { modelService: [{
|
|
207
|
+
type: Input
|
|
208
|
+
}], svgwidth: [{
|
|
209
|
+
type: Input
|
|
210
|
+
}], svgheight: [{
|
|
162
211
|
type: Input
|
|
163
212
|
}] } });
|
|
164
213
|
|
|
@@ -250,46 +299,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
250
299
|
type: Output
|
|
251
300
|
}] } });
|
|
252
301
|
|
|
253
|
-
class ModelCanvasComponent {
|
|
254
|
-
svgwidth = 1500;
|
|
255
|
-
svgheigth = 1000;
|
|
256
|
-
initialBBox = { x: this.svgwidth / 2, y: 20, w: 200, h: 25 };
|
|
257
|
-
modelService;
|
|
258
|
-
chooseElement = new EventEmitter();
|
|
259
|
-
chooseReference = new EventEmitter();
|
|
260
|
-
svgReady = new EventEmitter();
|
|
261
|
-
svg;
|
|
262
|
-
ngOnInit() {
|
|
263
|
-
// Safe because static: true
|
|
264
|
-
this.svgReady.emit(this.svg.nativeElement);
|
|
265
|
-
}
|
|
266
|
-
choose(element) {
|
|
267
|
-
this.chooseElement.emit(element);
|
|
268
|
-
}
|
|
269
|
-
chooseRef(reference) {
|
|
270
|
-
this.chooseReference.emit(reference);
|
|
271
|
-
}
|
|
272
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: ModelCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
273
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: ModelCanvasComponent, isStandalone: true, selector: "model-canvas", inputs: { modelService: "modelService" }, outputs: { chooseElement: "chooseElement", chooseReference: "chooseReference", svgReady: "svgReady" }, viewQueries: [{ propertyName: "svg", first: true, predicate: ["svg"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"modeling-container\">\n <svg #svg id=\"svg\" class=\"canvas-svg\" [attr.width]=\"svgwidth\" [attr.height]=\"svgheigth\">\n <g referencable-box\n [referencable]=\"modelService.model\"\n [position]=\"initialBBox\"\n (chooseElement)=\"choose($event)\"\n (chooseReference)=\"chooseRef($event)\"\n >\n </g>\n </svg>\n</div>\n", styles: [".modeling-container{flex:1 1 auto;overflow:auto;background:#fff}.canvas-svg{display:block}\n"], dependencies: [{ kind: "component", type: ReferencableBoxComponent, selector: "[referencable-box]", inputs: ["referencable", "position", "color"], outputs: ["chooseElement", "chooseReference"] }] });
|
|
274
|
-
}
|
|
275
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: ModelCanvasComponent, decorators: [{
|
|
276
|
-
type: Component,
|
|
277
|
-
args: [{ selector: 'model-canvas', imports: [
|
|
278
|
-
ReferencableBoxComponent
|
|
279
|
-
], template: "<div class=\"modeling-container\">\n <svg #svg id=\"svg\" class=\"canvas-svg\" [attr.width]=\"svgwidth\" [attr.height]=\"svgheigth\">\n <g referencable-box\n [referencable]=\"modelService.model\"\n [position]=\"initialBBox\"\n (chooseElement)=\"choose($event)\"\n (chooseReference)=\"chooseRef($event)\"\n >\n </g>\n </svg>\n</div>\n", styles: [".modeling-container{flex:1 1 auto;overflow:auto;background:#fff}.canvas-svg{display:block}\n"] }]
|
|
280
|
-
}], propDecorators: { modelService: [{
|
|
281
|
-
type: Input
|
|
282
|
-
}], chooseElement: [{
|
|
283
|
-
type: Output
|
|
284
|
-
}], chooseReference: [{
|
|
285
|
-
type: Output
|
|
286
|
-
}], svgReady: [{
|
|
287
|
-
type: Output
|
|
288
|
-
}], svg: [{
|
|
289
|
-
type: ViewChild,
|
|
290
|
-
args: ['svg', { static: true }]
|
|
291
|
-
}] } });
|
|
292
|
-
|
|
293
302
|
class ContainerDetailsComponent {
|
|
294
303
|
container;
|
|
295
304
|
isTree;
|
|
@@ -393,7 +402,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
393
402
|
type: Input
|
|
394
403
|
}] } });
|
|
395
404
|
|
|
396
|
-
class
|
|
405
|
+
class TreeCanvasComponent {
|
|
406
|
+
svgwidth = 1500;
|
|
407
|
+
svgheigth = 1000;
|
|
408
|
+
initialBBox = { x: this.svgwidth / 2, y: 20, w: 200, h: 25 };
|
|
409
|
+
modelService;
|
|
410
|
+
chooseElement = new EventEmitter();
|
|
411
|
+
chooseReference = new EventEmitter();
|
|
412
|
+
svgReady = new EventEmitter();
|
|
413
|
+
choose(element) {
|
|
414
|
+
this.chooseElement.emit(element);
|
|
415
|
+
}
|
|
416
|
+
chooseRef(reference) {
|
|
417
|
+
this.chooseReference.emit(reference);
|
|
418
|
+
}
|
|
419
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: TreeCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
420
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: TreeCanvasComponent, isStandalone: true, selector: "tree-canvas", inputs: { modelService: "modelService" }, outputs: { chooseElement: "chooseElement", chooseReference: "chooseReference", svgReady: "svgReady" }, ngImport: i0, template: "<model-canvas\n [svgwidth]=\"svgwidth\"\n [svgheigth]=\"svgheigth\"\n (svgReady)=\"svgReady.emit($event)\"\n>\n <svg:g canvas>\n <g referencable-box\n [referencable]=\"modelService.model\"\n [position]=\"initialBBox\"\n (chooseElement)=\"choose($event)\"\n (chooseReference)=\"chooseRef($event)\"\n >\n </g>\n </svg:g>\n</model-canvas>", styles: [".modeling-container{flex:1 1 auto;overflow:auto;background:#fff}.canvas-svg{display:block}\n"], dependencies: [{ kind: "component", type: ReferencableBoxComponent, selector: "[referencable-box]", inputs: ["referencable", "position", "color"], outputs: ["chooseElement", "chooseReference"] }, { kind: "component", type: ModelCanvasComponent, selector: "model-canvas", inputs: ["svgwidth", "svgheigth"], outputs: ["svgReady"] }] });
|
|
421
|
+
}
|
|
422
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: TreeCanvasComponent, decorators: [{
|
|
423
|
+
type: Component,
|
|
424
|
+
args: [{ selector: 'tree-canvas', imports: [
|
|
425
|
+
ReferencableBoxComponent,
|
|
426
|
+
ModelCanvasComponent
|
|
427
|
+
], template: "<model-canvas\n [svgwidth]=\"svgwidth\"\n [svgheigth]=\"svgheigth\"\n (svgReady)=\"svgReady.emit($event)\"\n>\n <svg:g canvas>\n <g referencable-box\n [referencable]=\"modelService.model\"\n [position]=\"initialBBox\"\n (chooseElement)=\"choose($event)\"\n (chooseReference)=\"chooseRef($event)\"\n >\n </g>\n </svg:g>\n</model-canvas>", styles: [".modeling-container{flex:1 1 auto;overflow:auto;background:#fff}.canvas-svg{display:block}\n"] }]
|
|
428
|
+
}], propDecorators: { modelService: [{
|
|
429
|
+
type: Input
|
|
430
|
+
}], chooseElement: [{
|
|
431
|
+
type: Output
|
|
432
|
+
}], chooseReference: [{
|
|
433
|
+
type: Output
|
|
434
|
+
}], svgReady: [{
|
|
435
|
+
type: Output
|
|
436
|
+
}] } });
|
|
437
|
+
|
|
438
|
+
class TreeModelDetailsService {
|
|
397
439
|
overlay;
|
|
398
440
|
constructor(overlay) {
|
|
399
441
|
this.overlay = overlay;
|
|
@@ -424,7 +466,7 @@ class BasicModelDetailsService {
|
|
|
424
466
|
positionStrategy: this.overlay.position()
|
|
425
467
|
.global().centerHorizontally().centerVertically()
|
|
426
468
|
});
|
|
427
|
-
const portal = new ComponentPortal((
|
|
469
|
+
const portal = new ComponentPortal((TreeCanvasComponent));
|
|
428
470
|
const ref = overlayRef.attach(portal);
|
|
429
471
|
ref.instance.modelService = modelService;
|
|
430
472
|
ref.instance.chooseElement.subscribe(next => {
|
|
@@ -447,7 +489,7 @@ class BasicModelDetailsService {
|
|
|
447
489
|
positionStrategy: this.overlay.position()
|
|
448
490
|
.global().centerHorizontally().centerVertically()
|
|
449
491
|
});
|
|
450
|
-
const portal = new ComponentPortal((
|
|
492
|
+
const portal = new ComponentPortal((TreeCanvasComponent));
|
|
451
493
|
const ref = overlayRef.attach(portal);
|
|
452
494
|
ref.instance.modelService = modelService;
|
|
453
495
|
ref.instance.chooseReference.subscribe(next => {
|
|
@@ -461,10 +503,10 @@ class BasicModelDetailsService {
|
|
|
461
503
|
});
|
|
462
504
|
return subject.asObservable();
|
|
463
505
|
}
|
|
464
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type:
|
|
465
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type:
|
|
506
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: TreeModelDetailsService, deps: [{ token: i1$2.Overlay }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
507
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: TreeModelDetailsService, providedIn: 'root' });
|
|
466
508
|
}
|
|
467
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type:
|
|
509
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: TreeModelDetailsService, decorators: [{
|
|
468
510
|
type: Injectable,
|
|
469
511
|
args: [{
|
|
470
512
|
providedIn: 'root'
|
|
@@ -473,10 +515,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
473
515
|
|
|
474
516
|
class TreeEditorComponent {
|
|
475
517
|
basicDetailsService;
|
|
476
|
-
svgElement;
|
|
477
518
|
modelService;
|
|
478
519
|
detailsService;
|
|
479
520
|
customButtons = null;
|
|
521
|
+
svgwidth = 1500;
|
|
522
|
+
svgheigth = 1000;
|
|
523
|
+
initialBBox = { x: this.svgwidth / 2, y: 20, w: 200, h: 25 };
|
|
480
524
|
constructor(basicDetailsService) {
|
|
481
525
|
this.basicDetailsService = basicDetailsService;
|
|
482
526
|
}
|
|
@@ -489,25 +533,20 @@ class TreeEditorComponent {
|
|
|
489
533
|
get effectiveDetailsService() {
|
|
490
534
|
return this.detailsService ?? this.basicDetailsService;
|
|
491
535
|
}
|
|
492
|
-
onSvgReady(svg) {
|
|
493
|
-
queueMicrotask(() => {
|
|
494
|
-
this.svgElement = svg;
|
|
495
|
-
});
|
|
496
|
-
}
|
|
497
536
|
choose(element) {
|
|
498
537
|
this.effectiveDetailsService.openDetails(element, this.modelService);
|
|
499
538
|
}
|
|
500
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: TreeEditorComponent, deps: [{ token:
|
|
501
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: TreeEditorComponent, isStandalone: true, selector: "emfular-tree-editor", inputs: { modelService: "modelService", detailsService: "detailsService", customButtons: "customButtons" }, ngImport: i0, template: "<
|
|
539
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: TreeEditorComponent, deps: [{ token: TreeModelDetailsService }], target: i0.ɵɵFactoryTarget.Component });
|
|
540
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.4", type: TreeEditorComponent, isStandalone: true, selector: "emfular-tree-editor", inputs: { modelService: "modelService", detailsService: "detailsService", customButtons: "customButtons" }, ngImport: i0, template: "<emfular-basic-editor\n [svgwidth]=\"svgwidth\"\n [svgheight]=\"svgheigth\"\n [modelService]=\"modelService\"\n>\n <!-- Default sidebar -->\n <emfular-model-editing-bar\n sidebar\n [buttons]=\"sidebarButtons\">\n </emfular-model-editing-bar>\n\n <!-- Default canvas content, needs svg namespace just like components -->\n <svg:g canvas>\n <g referencable-box\n [referencable]=\"modelService.model\"\n [position]=\"initialBBox\"\n (chooseElement)=\"choose($event)\">\n </g>\n </svg:g>\n</emfular-basic-editor>\n", styles: [".tree-editor{display:flex;flex-direction:column;width:100%;height:100%}emfular-file-level-bar{flex:0 0 auto}.editor-main{flex:1 1 auto;display:flex;overflow:hidden}.model-bar{flex:0 0 60px;background:#f5f5f5;border-right:1px solid #ccc;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "component", type: ModelEditingBarComponent, selector: "emfular-model-editing-bar", inputs: ["buttons"] }, { kind: "component", type: BasicEditorComponent, selector: "emfular-basic-editor", inputs: ["modelService", "svgwidth", "svgheight"] }, { kind: "component", type: ReferencableBoxComponent, selector: "[referencable-box]", inputs: ["referencable", "position", "color"], outputs: ["chooseElement", "chooseReference"] }] });
|
|
502
541
|
}
|
|
503
542
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: TreeEditorComponent, decorators: [{
|
|
504
543
|
type: Component,
|
|
505
544
|
args: [{ selector: 'emfular-tree-editor', imports: [
|
|
506
|
-
FileLevelBarComponent,
|
|
507
545
|
ModelEditingBarComponent,
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
546
|
+
BasicEditorComponent,
|
|
547
|
+
ReferencableBoxComponent
|
|
548
|
+
], template: "<emfular-basic-editor\n [svgwidth]=\"svgwidth\"\n [svgheight]=\"svgheigth\"\n [modelService]=\"modelService\"\n>\n <!-- Default sidebar -->\n <emfular-model-editing-bar\n sidebar\n [buttons]=\"sidebarButtons\">\n </emfular-model-editing-bar>\n\n <!-- Default canvas content, needs svg namespace just like components -->\n <svg:g canvas>\n <g referencable-box\n [referencable]=\"modelService.model\"\n [position]=\"initialBBox\"\n (chooseElement)=\"choose($event)\">\n </g>\n </svg:g>\n</emfular-basic-editor>\n", styles: [".tree-editor{display:flex;flex-direction:column;width:100%;height:100%}emfular-file-level-bar{flex:0 0 auto}.editor-main{flex:1 1 auto;display:flex;overflow:hidden}.model-bar{flex:0 0 60px;background:#f5f5f5;border-right:1px solid #ccc;display:flex;flex-direction:column}\n"] }]
|
|
549
|
+
}], ctorParameters: () => [{ type: TreeModelDetailsService }], propDecorators: { modelService: [{
|
|
511
550
|
type: Input
|
|
512
551
|
}], detailsService: [{
|
|
513
552
|
type: Input
|
|
@@ -564,5 +603,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
564
603
|
* Generated bundle index. Do not edit.
|
|
565
604
|
*/
|
|
566
605
|
|
|
567
|
-
export { BasicModelDetailsService, ContainerDetailsComponent, FileLevelBarComponent, FileLevelBarMaterialComponent, HISTORY_SERVICE, IdHelper, ModelCanvasComponent, ModelDetailsComponent, ModelEditingBarComponent, ModelService, ReferencableBoxComponent, TreeEditorComponent, provideHistoryForModel };
|
|
606
|
+
export { BasicEditorComponent, TreeModelDetailsService as BasicModelDetailsService, ContainerDetailsComponent, FileLevelBarComponent, FileLevelBarMaterialComponent, HISTORY_SERVICE, IdHelper, ModelCanvasComponent, ModelDetailsComponent, ModelEditingBarComponent, ModelService, ReferencableBoxComponent, TreeCanvasComponent, TreeEditorComponent, TreeModelDetailsService, provideHistoryForModel };
|
|
568
607
|
//# sourceMappingURL=ngx-emfular-integration.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-emfular-integration.mjs","sources":["../../../projects/ngx-emfular-integration/src/lib/model.service.ts","../../../projects/ngx-emfular-integration/src/lib/editor/file-level-bar/file-level-bar.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/file-level-bar/file-level-bar.component.html","../../../projects/ngx-emfular-integration/src/lib/editor/model-editing-bar/model-editing-bar.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/model-editing-bar/model-editing-bar.component.html","../../../projects/ngx-emfular-integration/src/lib/utils/graphical-helper.ts","../../../projects/ngx-emfular-integration/src/lib/utils/id-helper.ts","../../../projects/ngx-emfular-integration/src/lib/graphical/referencable-box/referencable-box.component.ts","../../../projects/ngx-emfular-integration/src/lib/graphical/referencable-box/referencable-box.component.svg","../../../projects/ngx-emfular-integration/src/lib/editor/model-canvas/model-canvas.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/model-canvas/model-canvas.component.html","../../../projects/ngx-emfular-integration/src/lib/details/container-details/container-details.component.ts","../../../projects/ngx-emfular-integration/src/lib/details/container-details/container-details.component.html","../../../projects/ngx-emfular-integration/src/lib/details/model-details/model-details.component.ts","../../../projects/ngx-emfular-integration/src/lib/details/model-details/model-details.component.html","../../../projects/ngx-emfular-integration/src/lib/details/basic-model-details.service.ts","../../../projects/ngx-emfular-integration/src/lib/editor/tree-editor/tree-editor.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/tree-editor/tree-editor.component.html","../../../projects/ngx-emfular-integration/src/lib/editor/file-level-bar-material/file-level-bar-material.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/file-level-bar-material/file-level-bar-material.component.html","../../../projects/ngx-emfular-integration/src/public-api.ts","../../../projects/ngx-emfular-integration/src/ngx-emfular-integration.ts"],"sourcesContent":["import {Inject, Injectable, InjectionToken, PLATFORM_ID} from '@angular/core';\nimport {Deserializer, JsonDeserializable, JsonOf, Referencable} from \"emfular\";\nimport {HistoryService, IoService} from \"ngx-emfular-helper\";\n\nexport const HISTORY_SERVICE = new InjectionToken<HistoryService<any>>(\n 'HistoryService'\n);\nexport function provideHistoryForModel<M>(\n prefix: string = 'history_',\n bufferSize: number = 50\n) {\n return {\n provide: HISTORY_SERVICE,\n useFactory: (platformId: Object) => new HistoryService<JsonOf<M>>(prefix, bufferSize, platformId),\n deps: [PLATFORM_ID]\n };\n}\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class ModelService<M extends Referencable<any>> {\n\n private _model!: M\n get model(): M {\n return this._model;\n }\n protected set model(model: M) {\n this._model = this.adjustModel(model);\n this.adaptToModel()\n }\n\n protected constructor(\n @Inject(HISTORY_SERVICE) readonly historyService: HistoryService<JsonOf<M>>,\n readonly ioService: IoService,\n protected readonly modelClass: JsonDeserializable<M>,\n ) {\n this._model = new modelClass() //default initialization without calling set, since adjustments might need not yet initialized properties\n queueMicrotask(() => { //necessary to avoid timing issues if adjust model or adapt to model call services or other not initialized properties of the inheriting class\n this.historyService.state$.subscribe(state => {\n if (state) {\n this.applyJson(state);\n }\n });\n })\n }\n\n //default implementation to override if you need any normalization on a model before setting it\n adjustModel(model: M): M {\n return model;\n }\n\n //default implementation to override if you need adaptation of surroundings,\n // e.g. other attributes, notifications, signals etc\n adaptToModel() {}\n\n // override by either a fixed string or sth from the current model itself\n public fileTitle(): string {\n return \"model\"\n }\n\n newModel() {\n this.model = new this.modelClass()\n this.saveCurrentState()\n }\n\n serialize(): JsonOf<M> {\n return this.model.toJson()\n }\n\n deserialize(modelJson: JsonOf<M>): M {\n let modelEClass = new this.modelClass().getEClass();\n return Deserializer.fromJSON<M>(modelJson, modelEClass);\n }\n\n saveCurrentState() {\n this.historyService.save(this.serialize())\n }\n\n protected applyJson(modelJson: JsonOf<M>): M {\n this.model = this.deserialize(modelJson);\n return this.model;\n }\n\n loadFromJson(modelJson: JsonOf<M>): void {\n this.applyJson(modelJson);\n this.saveCurrentState()\n }\n\n loadFromFile(event: Event) {\n this.ioService.loadStringFromFile(event).then(txt => {\n //todo insert detection code for wrong files (no json, not appropriately structured\n this.loadFromJson(JSON.parse(txt));\n });\n }\n\n save() {\n const jsonString = JSON.stringify(this.serialize());\n this.ioService.saveJson(jsonString, this.fileTitle())\n }\n\n}\n","import {Component, Input} from '@angular/core';\nimport {InputHandler, IoService} from \"ngx-emfular-helper\";\nimport {Referencable} from \"emfular\";\nimport {ModelService} from \"../../model.service\";\n\n@Component({\n selector: 'emfular-file-level-bar',\n imports: [],\n templateUrl: './file-level-bar.component.html',\n styleUrl: './file-level-bar.component.css'\n})\nexport class FileLevelBarComponent<M extends Referencable<any>> {\n @Input() svg!: SVGElement\n @Input() modelService!: ModelService<M>\n protected readonly InputHandler = InputHandler;\n\n constructor(public ioService: IoService) {\n }\n\n openModel() {\n document.getElementById('openModel')?.click();\n }\n\n\n saveSVG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSVG(svgContent, this.modelService.fileTitle())\n }\n }\n\n saveSVGasPNG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSvgAsPng(svgContent, this.modelService.fileTitle())\n }\n }\n\n saveSVGasJPEG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSvgAsJpeg(svgContent, this.modelService.fileTitle())\n }\n }\n\n\n}\n","<input id=\"openModel\" type=\"file\" class=\"file-upload\" style=\"display:none\"\n (change)=\"modelService.loadFromFile($event)\"\n (click)=\"InputHandler.clearElem($event)\">\n\n<div class=\"file-level-bar\">\n <button (click)=\"modelService.newModel()\">New</button>\n <button (click)=\"openModel()\">Open</button>\n <span class=\"separator\"></span>\n <button (click)=\"modelService.historyService.undo()\" [disabled]=\"modelService.historyService.isUndoNotPossible()\">Undo</button>\n <button (click)=\"modelService.historyService.redo()\" [disabled]=\"modelService.historyService.isRedoNotPossible()\">Redo</button>\n <span class=\"separator\"></span>\n <button (click)=\"modelService.save()\">Save</button>\n <button (click)=\"saveSVG()\">Save SVG</button>\n <button (click)=\"saveSVGasPNG()\">Save PNG</button>\n <button (click)=\"saveSVGasJPEG()\">Save JPEG</button>\n</div>\n","import {Component, Input} from '@angular/core';\nimport {NgForOf, NgIf, NgOptimizedImage} from \"@angular/common\";\n\n@Component({\n selector: 'emfular-model-editing-bar',\n imports: [\n NgForOf,\n NgIf,\n NgOptimizedImage\n ],\n templateUrl: './model-editing-bar.component.html',\n styleUrl: './model-editing-bar.component.css'\n})\nexport class ModelEditingBarComponent {\n @Input() buttons: Array<{\n label: string;\n icon?: string;\n action: () => void;\n }> | null = null;\n\n\n}\n","<div class=\"model-editing-bar\">\n <button *ngFor=\"let b of buttons\" (click)=\"b.action()\">\n <img\n *ngIf=\"b.icon\"\n class=\"icon\"\n [src]=\"b.icon\"\n alt=\"Icon for {{b.label}}\"\n />\n {{ b.label }}\n </button>\n</div>\n","import {ReContainer, Referencable } from \"emfular\";\n\nexport class GraphicalHelper {\n\n //todo, refactor into emfular\n static getAsList<T extends Referencable<any>>(refs: ReContainer<T, any>): T[] {\n const items: T[]|T|undefined = refs.get()\n if(items) {\n if(Array.isArray(items)) {\n return items\n }\n const result: T[] = [];\n result.push(items)\n return result\n } else {\n return [];\n }\n }\n\n}\n","import {getAllAttributes, Referencable } from \"emfular\";\n\nexport class IdHelper {\n\n static getLabel(ref: Referencable<any>): string {\n // 1. If the model has a \"name\" attribute → use it\n if ((ref as any).name) {\n return `${(ref as any).name}`;\n }\n\n // 2. Otherwise: first primitive attribute\n const attrs = getAllAttributes(ref.constructor);\n for (const [key] of attrs) {\n const value = (ref as any)[key];\n if (typeof value === \"string\" || typeof value === \"number\") {\n return `${value}`;\n }\n }\n\n /*\n // 3. Otherwise: use ID (EMFular always has stable IDs)\n if ((ref as any).id) {\n return `(id=${(ref as any).id})`;\n }*/\n\n // 4. Otherwise: fallback\n return \"(unnamed)\";\n }\n\n}\n","import {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {Referencable, ReTreeChildrenContainer} from 'emfular';\nimport {ArrowBetweenElemsComponent, BoundingBox, RectangleWithTextComponent, PositionHelper} from 'ngx-svg-graphics';\nimport {GraphicalHelper} from \"../../utils/graphical-helper\";\nimport {IdHelper} from \"../../utils/id-helper\";\n\n@Component({\n selector: '[referencable-box]',\n imports: [RectangleWithTextComponent, ArrowBetweenElemsComponent],\n templateUrl: './referencable-box.component.svg',\n styleUrl: './referencable-box.component.css'\n})\nexport class ReferencableBoxComponent {\n @Input() referencable!: Referencable<any>;\n @Input() position!: BoundingBox\n @Input() color?: string = \"#efad78\"\n @Output() chooseElement: EventEmitter<Referencable<any>> = new EventEmitter();\n @Output() chooseReference: EventEmitter<ReTreeChildrenContainer<any>> = new EventEmitter();\n\n isExpandedArray: boolean[] = []\n\n constructor() {}\n\n toggleExpand(i: number) {\n this.isExpandedArray[i]= !this.isExpandedArray[i];\n }\n\n createBoxInLastPart(bb: BoundingBox): BoundingBox {\n return {\n x: bb.x+bb.w -25,\n y: bb.y+bb.h -25,\n w: 25,\n h: 25\n }\n }\n\n choose(element: Referencable<any>) {\n this.chooseElement.emit(element);\n }\n\n chooseRef(ref: ReTreeChildrenContainer<any>) {\n this.chooseReference.emit(ref)\n }\n\n\n protected readonly GraphicalHelper = GraphicalHelper;\n protected readonly PositionHelper = PositionHelper\n protected readonly IdHelper = IdHelper;\n}\n","<svg:g [attr.id]=\"referencable.$gId\">\n\n <g rectangle-with-text\n (click)=\"choose(referencable)\"\n [id]=\"referencable.$gId + '_main'\"\n [text]=\"IdHelper.getLabel(referencable)\"\n [position]=\"position\"\n [color]=\"color\"\n >\n </g>\n\n <!-- containers -->\n @for (container of referencable.$treeChildren;\n track referencable.$gId + '_' + container.referenceName\n ; let i = $index) {\n\n @let containerKey = referencable.$gId + '_' + container.referenceName;\n @let containerAnchorBox = PositionHelper.computeChildBBox(\n i,\n referencable.$treeChildren.length,\n position\n );\n\n <!-- reference box -->\n <g rectangle-with-text\n (click)=\"chooseRef(container)\"\n [id]=\"containerKey + '_ref'\"\n [text]=\"container.referenceName\"\n [position]=\"containerAnchorBox\"\n color=\"#ede679\"\n >\n </g>\n <g rectangle-with-text\n (click)=\"toggleExpand(i)\"\n [id]=\"containerKey + '_toggle'\"\n [text]=\"isExpandedArray[i]?'◊':'V'\"\n [position]=\"createBoxInLastPart(containerAnchorBox)\"\n color=\"transparent\"\n ></g>\n\n <!-- arrow from main box to reference -->\n <g arrowElems\n [startGID]=\"referencable.$gId\"\n startSuffix=\"_main\"\n [endGID]=\"containerKey\"\n endSuffix=\"_ref\">\n </g>\n\n @if (isExpandedArray[i]) {\n <!-- real children inside this reference -->\n @let realChildren = GraphicalHelper.getAsList(container);\n\n @for (elem of realChildren; track elem.$gId; let j = $index) {\n\n @let elemBox = PositionHelper.computeChildBBox(\n j,\n realChildren.length,\n containerAnchorBox\n );\n <g referencable-box\n (chooseElement)=\"choose($event)\"\n [referencable]=\"elem\"\n [position]=\"elemBox\"\n >\n </g>\n <!-- arrow from reference to child box -->\n <g arrowElems\n [startGID]=\"containerKey\"\n startSuffix=\"_ref\"\n [endGID]=\"elem.$gId\"\n endSuffix=\"_main\">\n </g>\n }\n\n }\n }\n</svg:g>\n","import {Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core';\nimport {ReferencableBoxComponent} from \"../../graphical/referencable-box/referencable-box.component\";\nimport {ModelService} from \"../../model.service\";\nimport { Referencable, ReTreeChildrenContainer } from 'emfular';\nimport { BoundingBox } from 'ngx-svg-graphics';\n\n@Component({\n selector: 'model-canvas',\n imports: [\n ReferencableBoxComponent\n ],\n templateUrl: './model-canvas.component.html',\n styleUrl: './model-canvas.component.css'\n})\nexport class ModelCanvasComponent<M extends Referencable<any>> implements OnInit {\n svgwidth = 1500;\n svgheigth = 1000;\n initialBBox : BoundingBox = {x: this.svgwidth/2, y: 20, w: 200, h: 25}\n\n @Input() modelService!: ModelService<M>\n @Output() chooseElement: EventEmitter<Referencable<any>> = new EventEmitter();\n @Output() chooseReference: EventEmitter<ReTreeChildrenContainer<any>> = new EventEmitter();\n @Output() svgReady: EventEmitter<SVGSVGElement> = new EventEmitter<SVGSVGElement>();\n @ViewChild('svg', { static: true })\n svg!: ElementRef<SVGSVGElement>;\n\n ngOnInit() {\n // Safe because static: true\n this.svgReady.emit(this.svg.nativeElement);\n }\n\n choose(element: Referencable<any>): void {\n this.chooseElement.emit(element);\n }\n\n chooseRef(reference: ReTreeChildrenContainer<any>) {\n this.chooseReference.emit(reference);\n }\n\n}\n","<div class=\"modeling-container\">\n <svg #svg id=\"svg\" class=\"canvas-svg\" [attr.width]=\"svgwidth\" [attr.height]=\"svgheigth\">\n <g referencable-box\n [referencable]=\"modelService.model\"\n [position]=\"initialBBox\"\n (chooseElement)=\"choose($event)\"\n (chooseReference)=\"chooseRef($event)\"\n >\n </g>\n </svg>\n</div>\n","import {Component, Input} from '@angular/core';\nimport {ReContainer, Referencable } from 'emfular';\nimport {GraphicalHelper} from \"../../utils/graphical-helper\";\nimport {NgForOf, NgIf} from \"@angular/common\";\nimport {IdHelper} from \"../../utils/id-helper\";\nimport {ModelService} from \"../../model.service\";\nimport {ModelDetailsService} from \"../model-details-service\";\n\n@Component({\n selector: 'container-details',\n imports: [\n NgForOf,\n NgIf,\n ],\n templateUrl: './container-details.component.html',\n styleUrl: './container-details.component.css'\n})\nexport class ContainerDetailsComponent<M extends Referencable<any>> {\n @Input() container!: ReContainer<any, any>\n @Input() isTree!: boolean\n @Input() modelService!: ModelService<M>\n @Input() detailsService!: ModelDetailsService<M> //todo just enforce interface?\n\n open(ref: Referencable<any>) {\n this.detailsService.openDetails(ref, this.modelService)\n }\n\n remove(ref: Referencable<any>) {\n //todo service should do this... in order for single source of truth\n if(this.container.remove(ref))\n this.modelService.saveCurrentState()\n }\n\n add() {\n //create on tree and open choice by graphical model on other links\n if(this.isTree) {\n console.log(\"Creation for several possible sub types is not solved in a meta-agnostic scenario\")\n } else {\n this.detailsService\n .openModelChoice(this.modelService)\n .subscribe(chosen => {\n if (!chosen) return; // user cancelled\n // todo what about type mismatches?\n if (this.container.add(chosen)) {\n this.modelService.saveCurrentState();\n }\n });\n }\n }\n\n protected readonly GraphicalHelper = GraphicalHelper;\n protected readonly IdHelper = IdHelper;\n}\n","<h4>{{container.referenceName+\":\"}}</h4>\n\n<button *ngIf=\"!isTree\" class=\"add-ref\" (click)=\"add()\">Add</button>\n\n<div class=\"container-row\"\n *ngFor=\"let elem of GraphicalHelper.getAsList(container)\">\n <div class=\"ref-info\">\n <span class=\"ref-icon\">🔗</span>\n <span class=\"ref-type\">{{ elem.getEClass() }}</span>\n <span class=\"ref-label\">{{ IdHelper.getLabel(elem) }}</span>\n </div>\n\n <div class=\"ref-actions\">\n <button (click)=\"open(elem)\">Open</button>\n <button (click)=\"remove(elem)\">Remove</button>\n </div>\n</div>\n\n","import {Component, Input, OnInit} from '@angular/core';\nimport {AttributeOptions, Referencable, ReLinkContainer, ReTreeChildrenContainer } from 'emfular';\nimport {ModelService} from \"../../model.service\";\nimport { getAllAttributes } from \"emfular\";\nimport {FormsModule} from \"@angular/forms\";\nimport {NgForOf, NgIf} from \"@angular/common\";\nimport {\n ContainerDetailsComponent\n} from \"../container-details/container-details.component\";\nimport {ModelDetailsService} from \"../model-details-service\";\nimport {IdHelper} from \"../../utils/id-helper\";\n\n@Component({\n selector: 'lib-model-details',\n imports: [\n FormsModule,\n NgForOf,\n ContainerDetailsComponent,\n NgIf\n ],\n templateUrl: './model-details.component.html',\n styleUrl: './model-details.component.css'\n})\nexport class ModelDetailsComponent<T extends Referencable<any>, M extends Referencable<any>> implements OnInit {\n @Input() model!: T\n @Input() modelService!: ModelService<M>\n @Input() detailsService!: ModelDetailsService<M>\n\n attributes: Array<{ key: string; options: AttributeOptions }> = [];\n\n ngOnInit() {\n const map = getAllAttributes(this.model.constructor);\n this.attributes = Array.from(map.entries()).map(([key, options]) => ({\n key,\n options\n }));\n }\n\n getLinks(): ReLinkContainer<any, any>[] {\n return this.model.$otherReferences\n }\n\n getChildren(): ReTreeChildrenContainer<any>[] {\n return this.model.$treeChildren\n }\n\n chooseParent() {\n this.detailsService\n .openParentChoice(this.modelService)\n .subscribe(chosen => {\n if (!chosen) return; // user cancelled\n // todo what about type mismatches?\n const res = chosen._parent.addToReferencableContainer(\n chosen.referenceName,\n this.model\n )\n if (res) {\n this.modelService.saveCurrentState();\n }\n });\n }\n\n protected readonly IdHelper = IdHelper;\n}\n","<h1>Detail-Editor</h1>\n<h2>{{model.getEClass()}}</h2>\n<div class=\"parent-choice\">\n <label>Current Parent</label>\n <div *ngIf=\"!model.getParentReferencable()\">\n <span class=\"alert-ref\">No Parent</span>\n </div>\n <div class=\"ref-info\" *ngIf=\"model.getParentReferencable()\">\n <span class=\"ref-icon\">🔗</span>\n <span class=\"ref-type\">{{ model.getParentReferencable().getEClass() }}</span>\n <span class=\"ref-label\">{{ IdHelper.getLabel(model.getParentReferencable()) }}</span>\n </div>\n <button (click)=\"chooseParent()\">\n Set Parent\n </button>\n</div>\n<div class=\"attribute-list\">\n <div class=\"attribute-row\" *ngFor=\"let attr of attributes\">\n <label>{{ attr.key }}</label>\n <input\n type=\"text\"\n [(ngModel)]=\"$any(model)[attr.key]\"\n />\n </div>\n</div>\n<h3>References</h3>\n<div class=\"reference-list\">\n <container-details\n *ngFor=\"let container of getChildren()\"\n [container]=\"container\"\n [isTree]=\"true\"\n [modelService]=\"modelService\"\n [detailsService]=\"detailsService\"\n >\n </container-details>\n <container-details\n *ngFor=\"let container of getLinks()\"\n [container]=\"container\"\n [isTree]=\"false\"\n [modelService]=\"modelService\"\n [detailsService]=\"detailsService\"\n >\n </container-details>\n</div>\n\n","import { Injectable } from '@angular/core';\nimport { Referencable, ReTreeChildrenContainer } from 'emfular';\nimport {ModelService} from \"../model.service\";\nimport {ModelDetailsComponent} from \"./model-details/model-details.component\";\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {ModelCanvasComponent} from \"../editor/model-canvas/model-canvas.component\";\nimport {Observable, Subject} from \"rxjs\";\nimport {ModelDetailsService} from \"./model-details-service\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BasicModelDetailsService<M extends Referencable<any>> implements ModelDetailsService<M> {\n\n constructor( private overlay: Overlay) { }\n\n //actually T must be somewhere on M\n openDetails<\n T extends Referencable<any>\n >(elem: T, modelService: ModelService<M>) {\n // instead of opening the generic ModeldetailsCompoennt you might like to consider opening a specific one\n //by determining the eClass and switching based on elem.getEClass()\n\n const overlayRef = this.overlay.create(\n { hasBackdrop: true,\n backdropClass: 'cdk-overlay-dark-backdrop',\n panelClass: 'basic-details-panel',\n positionStrategy: this.overlay.position()\n .global() .centerHorizontally() .centerVertically()\n });\n const portal = new ComponentPortal(ModelDetailsComponent<T,M>);\n const ref = overlayRef.attach(portal);\n ref.instance.model = elem;\n ref.instance.modelService = modelService;\n ref.instance.detailsService = this\n overlayRef.backdropClick().subscribe(\n () => overlayRef.dispose()\n );\n }\n\n openModelChoice(\n modelService: ModelService<M>\n ): Observable<Referencable<any>> {\n\n const subject = new Subject<Referencable<any>>();\n\n const overlayRef = this.overlay.create({\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-dark-backdrop',\n panelClass: 'basic-details-panel',\n positionStrategy: this.overlay.position()\n .global().centerHorizontally().centerVertically()\n });\n\n const portal = new ComponentPortal(ModelCanvasComponent<M>);\n const ref = overlayRef.attach(portal);\n\n ref.instance.modelService = modelService;\n ref.instance.chooseElement.subscribe(next => {\n subject.next(next);\n subject.complete();\n overlayRef.dispose();\n });\n\n overlayRef.backdropClick().subscribe(() => {\n subject.complete();\n overlayRef.dispose();\n });\n\n return subject.asObservable();\n }\n\n openParentChoice(\n modelService: ModelService<M>\n ): Observable<ReTreeChildrenContainer<any>> {\n const subject = new Subject<ReTreeChildrenContainer<any>>();\n\n const overlayRef = this.overlay.create({\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-dark-backdrop',\n panelClass: 'basic-details-panel',\n positionStrategy: this.overlay.position()\n .global().centerHorizontally().centerVertically()\n });\n\n const portal = new ComponentPortal(ModelCanvasComponent<M>);\n const ref = overlayRef.attach(portal);\n\n ref.instance.modelService = modelService;\n ref.instance.chooseReference.subscribe(next => {\n subject.next(next);\n subject.complete();\n overlayRef.dispose();\n });\n\n overlayRef.backdropClick().subscribe(() => {\n subject.complete();\n overlayRef.dispose();\n });\n\n return subject.asObservable();\n }\n\n}\n","import {Component, Input} from '@angular/core';\nimport { Referencable} from \"emfular\";\nimport {FileLevelBarComponent} from \"../file-level-bar/file-level-bar.component\";\nimport {ModelEditingBarComponent} from \"../model-editing-bar/model-editing-bar.component\";\nimport {ModelService} from \"../../model.service\";\nimport {ModelCanvasComponent} from \"../model-canvas/model-canvas.component\";\nimport {ModelDetailsService} from \"../../details/model-details-service\";\nimport {BasicModelDetailsService} from \"../../details/basic-model-details.service\";\nimport {EditButtonDef} from \"../edit-button-def\";\n\n@Component({\n selector: 'emfular-tree-editor',\n imports: [\n FileLevelBarComponent,\n ModelEditingBarComponent,\n ModelCanvasComponent\n ],\n templateUrl: './tree-editor.component.html',\n styleUrl: './tree-editor.component.css'\n})\nexport class TreeEditorComponent<M extends Referencable<any>> {\n svgElement!: SVGSVGElement;\n @Input() modelService!: ModelService<M>\n @Input() detailsService?: ModelDetailsService<M>\n @Input() customButtons: Array<EditButtonDef> | null = null;\n\n constructor(private basicDetailsService: BasicModelDetailsService<M>) {}\n\n get sidebarButtons() {\n if (this.customButtons) return this.customButtons;\n else //todo replace by default create buttons\n return[{label: \"test\", action: () => {console.log(\"Button on model edition works\")}}];\n }\n\n get effectiveDetailsService(): ModelDetailsService<M> {\n return this.detailsService ?? this.basicDetailsService;\n }\n\n onSvgReady(svg: SVGSVGElement) {\n queueMicrotask(() => {\n this.svgElement = svg;\n });\n }\n\n\n choose(element: Referencable<any>) {\n this.effectiveDetailsService.openDetails(element, this.modelService)\n }\n}\n","<div class=\"tree-editor\" id=\"tree-editor\">\n <emfular-file-level-bar\n [svg]=\"svgElement\"\n [modelService]=\"modelService\">\n </emfular-file-level-bar>\n <div class=\"editor-main\">\n <!-- vertical model bar -->\n <emfular-model-editing-bar\n class=\"model-bar\"\n [buttons]=\"sidebarButtons\">\n </emfular-model-editing-bar>\n\n\n <model-canvas\n [modelService]=\"modelService\"\n (svgReady)=\"onSvgReady($event)\"\n (chooseElement)=\"choose($event)\"\n >\n </model-canvas>\n </div>\n</div>\n\n","import {Component, Input} from '@angular/core';\nimport {InputHandler, IoService} from \"ngx-emfular-helper\";\nimport {Referencable} from \"emfular\";\nimport { CommonModule } from '@angular/common';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport {ModelService} from \"../../model.service\";\n\n@Component({\n selector: 'emfular-file-level-bar-material',\n imports: [CommonModule, MatToolbarModule, MatIconModule, MatButtonModule],\n templateUrl: './file-level-bar-material.component.html',\n styleUrl: './file-level-bar-material.component.css'\n})\nexport class FileLevelBarMaterialComponent<M extends Referencable<any>> {\n @Input() svg!: SVGElement\n @Input() modelService!: ModelService<M>\n protected readonly InputHandler = InputHandler;\n\n constructor(public ioService: IoService) {\n }\n\n openModel() {\n document.getElementById('openModel')?.click();\n }\n\n\n saveSVG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSVG(svgContent, this.modelService.fileTitle())\n }\n }\n\n saveSVGasPNG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSvgAsPng(svgContent, this.modelService.fileTitle())\n }\n }\n\n saveSVGasJPEG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSvgAsJpeg(svgContent, this.modelService.fileTitle())\n }\n }\n\n\n}\n","<input id=\"openModel\" type=\"file\" class=\"file-upload\" style=\"display: none\" (change)=\"modelService.loadFromFile($event)\" (click)=\"InputHandler.clearElem($event)\">\n<mat-toolbar class=\"file-level-bar\">\n <button (click)=\"modelService.newModel()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"insert_drive_file\" ></mat-icon>\n New\n </button>\n <button (click)=\"openModel()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"file_upload\" ></mat-icon>\n Open\n </button>\n <hr/>\n <button (click)=\"modelService.historyService.undo()\" [disabled]=\"modelService.historyService.isUndoNotPossible()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"undo\" ></mat-icon>\n Undo</button>\n <button (click)=\"modelService.historyService.redo()\" [disabled]=\"modelService.historyService.isRedoNotPossible()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"redo\" ></mat-icon>\n Redo</button>\n <hr />\n <button (click)=\"modelService.save()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"file_download\" ></mat-icon>\n Save\n </button>\n <button (click)=\"saveSVG()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"photo_library\" ></mat-icon>\n Save SVG\n </button>\n <button (click)=\"saveSVGasPNG()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"photo_library\" ></mat-icon>\n Save PNG\n </button>\n <button (click)=\"saveSVGasJPEG()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"photo_library\" ></mat-icon>\n Save JPEG\n </button>\n</mat-toolbar>\n","/*\n * Public API Surface of ngx-emfular-integration\n */\n\nexport * from './lib/model.service';\n\nexport * from './lib/editor/tree-editor/tree-editor.component'\nexport * from './lib/editor/file-level-bar/file-level-bar.component';\nexport * from './lib/editor/file-level-bar-material/file-level-bar-material.component';\nexport * from './lib/editor/model-editing-bar/model-editing-bar.component';\nexport * from './lib/editor/model-canvas/model-canvas.component';\nexport * from './lib/editor/edit-button-def';\n\nexport * from './lib/graphical/referencable-box/referencable-box.component';\n\nexport * from './lib/details/model-details-service'\nexport * from './lib/details/basic-model-details.service'\nexport * from './lib/details/model-details/model-details.component';\nexport * from './lib/details/container-details/container-details.component'\n\nexport * from './lib/utils/id-helper'","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.BasicModelDetailsService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-emfular-integration.mjs","sources":["../../../projects/ngx-emfular-integration/src/lib/model.service.ts","../../../projects/ngx-emfular-integration/src/lib/editor/model-editing-bar/model-editing-bar.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/model-editing-bar/model-editing-bar.component.html","../../../projects/ngx-emfular-integration/src/lib/editor/model-canvas/model-canvas.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/model-canvas/model-canvas.component.html","../../../projects/ngx-emfular-integration/src/lib/editor/file-level-bar/file-level-bar.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/file-level-bar/file-level-bar.component.html","../../../projects/ngx-emfular-integration/src/lib/editor/basic-editor/basic-editor.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/basic-editor/basic-editor.component.html","../../../projects/ngx-emfular-integration/src/lib/utils/graphical-helper.ts","../../../projects/ngx-emfular-integration/src/lib/utils/id-helper.ts","../../../projects/ngx-emfular-integration/src/lib/graphical/referencable-box/referencable-box.component.ts","../../../projects/ngx-emfular-integration/src/lib/graphical/referencable-box/referencable-box.component.svg","../../../projects/ngx-emfular-integration/src/lib/details/container-details/container-details.component.ts","../../../projects/ngx-emfular-integration/src/lib/details/container-details/container-details.component.html","../../../projects/ngx-emfular-integration/src/lib/details/model-details/model-details.component.ts","../../../projects/ngx-emfular-integration/src/lib/details/model-details/model-details.component.html","../../../projects/ngx-emfular-integration/src/lib/editor/tree-canvas/tree-canvas.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/tree-canvas/tree-canvas.component.html","../../../projects/ngx-emfular-integration/src/lib/details/tree-model-details.service.ts","../../../projects/ngx-emfular-integration/src/lib/editor/tree-editor/tree-editor.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/tree-editor/tree-editor.component.html","../../../projects/ngx-emfular-integration/src/lib/editor/file-level-bar-material/file-level-bar-material.component.ts","../../../projects/ngx-emfular-integration/src/lib/editor/file-level-bar-material/file-level-bar-material.component.html","../../../projects/ngx-emfular-integration/src/public-api.ts","../../../projects/ngx-emfular-integration/src/ngx-emfular-integration.ts"],"sourcesContent":["import {Inject, Injectable, InjectionToken, PLATFORM_ID} from '@angular/core';\nimport {Deserializer, JsonDeserializable, JsonOf, Referencable} from \"emfular\";\nimport {HistoryService, IoService} from \"ngx-emfular-helper\";\n\nexport const HISTORY_SERVICE = new InjectionToken<HistoryService<any>>(\n 'HistoryService'\n);\nexport function provideHistoryForModel<M>(\n prefix: string = 'history_',\n bufferSize: number = 50\n) {\n return {\n provide: HISTORY_SERVICE,\n useFactory: (platformId: Object) => new HistoryService<JsonOf<M>>(prefix, bufferSize, platformId),\n deps: [PLATFORM_ID]\n };\n}\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport abstract class ModelService<M extends Referencable<any>> {\n\n private _model!: M\n get model(): M {\n return this._model;\n }\n protected set model(model: M) {\n this._model = this.adjustModel(model);\n this.adaptToModel()\n }\n\n protected constructor(\n @Inject(HISTORY_SERVICE) readonly historyService: HistoryService<JsonOf<M>>,\n readonly ioService: IoService,\n protected readonly modelClass: JsonDeserializable<M>,\n ) {\n this._model = new modelClass() //default initialization without calling set, since adjustments might need not yet initialized properties\n queueMicrotask(() => { //necessary to avoid timing issues if adjust model or adapt to model call services or other not initialized properties of the inheriting class\n this.historyService.state$.subscribe(state => {\n if (state) {\n this.applyJson(state);\n }\n });\n })\n }\n\n //default implementation to override if you need any normalization on a model before setting it\n adjustModel(model: M): M {\n return model;\n }\n\n //default implementation to override if you need adaptation of surroundings,\n // e.g. other attributes, notifications, signals etc\n adaptToModel() {}\n\n // override by either a fixed string or sth from the current model itself\n public fileTitle(): string {\n return \"model\"\n }\n\n newModel() {\n this.model = new this.modelClass()\n this.saveCurrentState()\n }\n\n serialize(): JsonOf<M> {\n return this.model.toJson()\n }\n\n deserialize(modelJson: JsonOf<M>): M {\n let modelEClass = new this.modelClass().getEClass();\n return Deserializer.fromJSON<M>(modelJson, modelEClass);\n }\n\n saveCurrentState() {\n this.historyService.save(this.serialize())\n }\n\n protected applyJson(modelJson: JsonOf<M>): M {\n this.model = this.deserialize(modelJson);\n return this.model;\n }\n\n loadFromJson(modelJson: JsonOf<M>): void {\n this.applyJson(modelJson);\n this.saveCurrentState()\n }\n\n loadFromFile(event: Event) {\n this.ioService.loadStringFromFile(event).then(txt => {\n //todo insert detection code for wrong files (no json, not appropriately structured\n this.loadFromJson(JSON.parse(txt));\n });\n }\n\n save() {\n const jsonString = JSON.stringify(this.serialize());\n this.ioService.saveJson(jsonString, this.fileTitle())\n }\n\n}\n","import {Component, Input} from '@angular/core';\nimport {NgForOf, NgIf, NgOptimizedImage} from \"@angular/common\";\n\n@Component({\n selector: 'emfular-model-editing-bar',\n imports: [\n NgForOf,\n NgIf,\n NgOptimizedImage\n ],\n templateUrl: './model-editing-bar.component.html',\n styleUrl: './model-editing-bar.component.css'\n})\nexport class ModelEditingBarComponent {\n @Input() buttons: Array<{\n label: string;\n icon?: string;\n action: () => void;\n }> | null = null;\n\n\n}\n","<div class=\"model-editing-bar\">\n <button *ngFor=\"let b of buttons\" (click)=\"b.action()\">\n <img\n *ngIf=\"b.icon\"\n class=\"icon\"\n [src]=\"b.icon\"\n alt=\"Icon for {{b.label}}\"\n />\n {{ b.label }}\n </button>\n</div>\n","import {Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core';\n\n@Component({\n selector: 'model-canvas',\n imports: [],\n templateUrl: './model-canvas.component.html',\n styleUrl: './model-canvas.component.css'\n})\nexport class ModelCanvasComponent implements OnInit {\n\n @Input() svgwidth!: number;\n @Input() svgheigth!: number\n @Output() svgReady: EventEmitter<SVGSVGElement> = new EventEmitter<SVGSVGElement>();\n @ViewChild('svg', { static: true })\n svg!: ElementRef<SVGSVGElement>;\n\n ngOnInit() {\n // Safe because static: true\n this.svgReady.emit(this.svg.nativeElement);\n }\n\n}\n","<div class=\"modeling-container\">\n <svg #svg id=\"svg\" class=\"canvas-svg\" [attr.width]=\"svgwidth\" [attr.height]=\"svgheigth\">\n <ng-content></ng-content>\n </svg>\n</div>\n","import {Component, Input} from '@angular/core';\nimport {InputHandler, IoService} from \"ngx-emfular-helper\";\nimport {Referencable} from \"emfular\";\nimport {ModelService} from \"../../model.service\";\n\n@Component({\n selector: 'emfular-file-level-bar',\n imports: [],\n templateUrl: './file-level-bar.component.html',\n styleUrl: './file-level-bar.component.css'\n})\nexport class FileLevelBarComponent<M extends Referencable<any>> {\n @Input() svg!: SVGElement\n @Input() modelService!: ModelService<M>\n protected readonly InputHandler = InputHandler;\n\n constructor(public ioService: IoService) {\n }\n\n openModel() {\n document.getElementById('openModel')?.click();\n }\n\n\n saveSVG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSVG(svgContent, this.modelService.fileTitle())\n }\n }\n\n saveSVGasPNG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSvgAsPng(svgContent, this.modelService.fileTitle())\n }\n }\n\n saveSVGasJPEG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSvgAsJpeg(svgContent, this.modelService.fileTitle())\n }\n }\n\n\n}\n","<input id=\"openModel\" type=\"file\" class=\"file-upload\" style=\"display:none\"\n (change)=\"modelService.loadFromFile($event)\"\n (click)=\"InputHandler.clearElem($event)\">\n\n<div class=\"file-level-bar\">\n <button (click)=\"modelService.newModel()\">New</button>\n <button (click)=\"openModel()\">Open</button>\n <span class=\"separator\"></span>\n <button (click)=\"modelService.historyService.undo()\" [disabled]=\"modelService.historyService.isUndoNotPossible()\">Undo</button>\n <button (click)=\"modelService.historyService.redo()\" [disabled]=\"modelService.historyService.isRedoNotPossible()\">Redo</button>\n <span class=\"separator\"></span>\n <button (click)=\"modelService.save()\">Save</button>\n <button (click)=\"saveSVG()\">Save SVG</button>\n <button (click)=\"saveSVGasPNG()\">Save PNG</button>\n <button (click)=\"saveSVGasJPEG()\">Save JPEG</button>\n</div>\n","import { Referencable } from \"emfular\";\nimport {Component, Input} from \"@angular/core\";\nimport {ModelService} from \"../../model.service\";\nimport {ModelCanvasComponent} from \"../model-canvas/model-canvas.component\";\nimport {FileLevelBarComponent} from \"../file-level-bar/file-level-bar.component\";\n\n@Component({\n selector: 'emfular-basic-editor',\n standalone: true,\n imports: [ModelCanvasComponent, FileLevelBarComponent],\n templateUrl: './basic-editor.component.html',\n styleUrls: ['./basic-editor.component.css']\n})\nexport class BasicEditorComponent<M extends Referencable<any>> {\n @Input() modelService!: ModelService<M>;\n @Input() svgwidth = 1500;\n @Input() svgheight = 1000;\n\n svgElement!: SVGSVGElement;\n\n constructor() {}\n\n onSvgReady(svg: SVGSVGElement) {\n queueMicrotask(() => this.svgElement = svg);\n }\n\n}\n","<div class=\"editor-root\">\n\n <!-- Fixed top bar -->\n <div class=\"editor-topbar\">\n <emfular-file-level-bar\n [svg]=\"svgElement\"\n [modelService]=\"modelService\">\n </emfular-file-level-bar>\n </div>\n\n <div class=\"editor-main\">\n <!-- Optional sidebar -->\n <div class=\"editor-sidebar\">\n <ng-content select=\"[sidebar]\"></ng-content>\n </div>\n <model-canvas\n [svgwidth]=\"svgheight\"\n [svgheigth]=\"svgheight\"\n (svgReady)=\"onSvgReady($event)\"\n >\n <ng-content select=\"[canvas]\"></ng-content>\n </model-canvas>\n </div>\n</div>\n","import {ReContainer, Referencable } from \"emfular\";\n\nexport class GraphicalHelper {\n\n //todo, refactor into emfular\n static getAsList<T extends Referencable<any>>(refs: ReContainer<T, any>): T[] {\n const items: T[]|T|undefined = refs.get()\n if(items) {\n if(Array.isArray(items)) {\n return items\n }\n const result: T[] = [];\n result.push(items)\n return result\n } else {\n return [];\n }\n }\n\n}\n","import {getAllAttributes, Referencable } from \"emfular\";\n\nexport class IdHelper {\n\n static getLabel(ref: Referencable<any>): string {\n // 1. If the model has a \"name\" attribute → use it\n if ((ref as any).name) {\n return `${(ref as any).name}`;\n }\n\n // 2. Otherwise: first primitive attribute\n const attrs = getAllAttributes(ref.constructor);\n for (const [key] of attrs) {\n const value = (ref as any)[key];\n if (typeof value === \"string\" || typeof value === \"number\") {\n return `${value}`;\n }\n }\n\n /*\n // 3. Otherwise: use ID (EMFular always has stable IDs)\n if ((ref as any).id) {\n return `(id=${(ref as any).id})`;\n }*/\n\n // 4. Otherwise: fallback\n return \"(unnamed)\";\n }\n\n}\n","import {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {Referencable, ReTreeChildrenContainer} from 'emfular';\nimport {ArrowBetweenElemsComponent, BoundingBox, RectangleWithTextComponent, PositionHelper} from 'ngx-svg-graphics';\nimport {GraphicalHelper} from \"../../utils/graphical-helper\";\nimport {IdHelper} from \"../../utils/id-helper\";\n\n@Component({\n selector: '[referencable-box]',\n imports: [RectangleWithTextComponent, ArrowBetweenElemsComponent],\n templateUrl: './referencable-box.component.svg',\n styleUrl: './referencable-box.component.css'\n})\nexport class ReferencableBoxComponent {\n @Input() referencable!: Referencable<any>;\n @Input() position!: BoundingBox\n @Input() color?: string = \"#efad78\"\n @Output() chooseElement: EventEmitter<Referencable<any>> = new EventEmitter();\n @Output() chooseReference: EventEmitter<ReTreeChildrenContainer<any>> = new EventEmitter();\n\n isExpandedArray: boolean[] = []\n\n constructor() {}\n\n toggleExpand(i: number) {\n this.isExpandedArray[i]= !this.isExpandedArray[i];\n }\n\n createBoxInLastPart(bb: BoundingBox): BoundingBox {\n return {\n x: bb.x+bb.w -25,\n y: bb.y+bb.h -25,\n w: 25,\n h: 25\n }\n }\n\n choose(element: Referencable<any>) {\n this.chooseElement.emit(element);\n }\n\n chooseRef(ref: ReTreeChildrenContainer<any>) {\n this.chooseReference.emit(ref)\n }\n\n\n protected readonly GraphicalHelper = GraphicalHelper;\n protected readonly PositionHelper = PositionHelper\n protected readonly IdHelper = IdHelper;\n}\n","<svg:g [attr.id]=\"referencable.$gId\">\n\n <g rectangle-with-text\n (click)=\"choose(referencable)\"\n [id]=\"referencable.$gId + '_main'\"\n [text]=\"IdHelper.getLabel(referencable)\"\n [position]=\"position\"\n [color]=\"color\"\n >\n </g>\n\n <!-- containers -->\n @for (container of referencable.$treeChildren;\n track referencable.$gId + '_' + container.referenceName\n ; let i = $index) {\n\n @let containerKey = referencable.$gId + '_' + container.referenceName;\n @let containerAnchorBox = PositionHelper.computeChildBBox(\n i,\n referencable.$treeChildren.length,\n position\n );\n\n <!-- reference box -->\n <g rectangle-with-text\n (click)=\"chooseRef(container)\"\n [id]=\"containerKey + '_ref'\"\n [text]=\"container.referenceName\"\n [position]=\"containerAnchorBox\"\n color=\"#ede679\"\n >\n </g>\n <g rectangle-with-text\n (click)=\"toggleExpand(i)\"\n [id]=\"containerKey + '_toggle'\"\n [text]=\"isExpandedArray[i]?'◊':'V'\"\n [position]=\"createBoxInLastPart(containerAnchorBox)\"\n color=\"transparent\"\n ></g>\n\n <!-- arrow from main box to reference -->\n <g arrowElems\n [startGID]=\"referencable.$gId\"\n startSuffix=\"_main\"\n [endGID]=\"containerKey\"\n endSuffix=\"_ref\">\n </g>\n\n @if (isExpandedArray[i]) {\n <!-- real children inside this reference -->\n @let realChildren = GraphicalHelper.getAsList(container);\n\n @for (elem of realChildren; track elem.$gId; let j = $index) {\n\n @let elemBox = PositionHelper.computeChildBBox(\n j,\n realChildren.length,\n containerAnchorBox\n );\n <g referencable-box\n (chooseElement)=\"choose($event)\"\n [referencable]=\"elem\"\n [position]=\"elemBox\"\n >\n </g>\n <!-- arrow from reference to child box -->\n <g arrowElems\n [startGID]=\"containerKey\"\n startSuffix=\"_ref\"\n [endGID]=\"elem.$gId\"\n endSuffix=\"_main\">\n </g>\n }\n\n }\n }\n</svg:g>\n","import {Component, Input} from '@angular/core';\nimport {ReContainer, Referencable } from 'emfular';\nimport {GraphicalHelper} from \"../../utils/graphical-helper\";\nimport {NgForOf, NgIf} from \"@angular/common\";\nimport {IdHelper} from \"../../utils/id-helper\";\nimport {ModelService} from \"../../model.service\";\nimport {TreeDetailsService} from \"../tree-details-service\";\n\n@Component({\n selector: 'container-details',\n imports: [\n NgForOf,\n NgIf,\n ],\n templateUrl: './container-details.component.html',\n styleUrl: './container-details.component.css'\n})\nexport class ContainerDetailsComponent<M extends Referencable<any>> {\n @Input() container!: ReContainer<any, any>\n @Input() isTree!: boolean\n @Input() modelService!: ModelService<M>\n @Input() detailsService!: TreeDetailsService<M> //todo just enforce interface?\n\n open(ref: Referencable<any>) {\n this.detailsService.openDetails(ref, this.modelService)\n }\n\n remove(ref: Referencable<any>) {\n //todo service should do this... in order for single source of truth\n if(this.container.remove(ref))\n this.modelService.saveCurrentState()\n }\n\n add() {\n //create on tree and open choice by graphical model on other links\n if(this.isTree) {\n console.log(\"Creation for several possible sub types is not solved in a meta-agnostic scenario\")\n } else {\n this.detailsService\n .openModelChoice(this.modelService)\n .subscribe(chosen => {\n if (!chosen) return; // user cancelled\n // todo what about type mismatches?\n if (this.container.add(chosen)) {\n this.modelService.saveCurrentState();\n }\n });\n }\n }\n\n protected readonly GraphicalHelper = GraphicalHelper;\n protected readonly IdHelper = IdHelper;\n}\n","<h4>{{container.referenceName+\":\"}}</h4>\n\n<button *ngIf=\"!isTree\" class=\"add-ref\" (click)=\"add()\">Add</button>\n\n<div class=\"container-row\"\n *ngFor=\"let elem of GraphicalHelper.getAsList(container)\">\n <div class=\"ref-info\">\n <span class=\"ref-icon\">🔗</span>\n <span class=\"ref-type\">{{ elem.getEClass() }}</span>\n <span class=\"ref-label\">{{ IdHelper.getLabel(elem) }}</span>\n </div>\n\n <div class=\"ref-actions\">\n <button (click)=\"open(elem)\">Open</button>\n <button (click)=\"remove(elem)\">Remove</button>\n </div>\n</div>\n\n","import {Component, Input, OnInit} from '@angular/core';\nimport {AttributeOptions, Referencable, ReLinkContainer, ReTreeChildrenContainer } from 'emfular';\nimport {ModelService} from \"../../model.service\";\nimport { getAllAttributes } from \"emfular\";\nimport {FormsModule} from \"@angular/forms\";\nimport {NgForOf, NgIf} from \"@angular/common\";\nimport {\n ContainerDetailsComponent\n} from \"../container-details/container-details.component\";\nimport {TreeDetailsService} from \"../tree-details-service\";\nimport {IdHelper} from \"../../utils/id-helper\";\n\n@Component({\n selector: 'lib-model-details',\n imports: [\n FormsModule,\n NgForOf,\n ContainerDetailsComponent,\n NgIf\n ],\n templateUrl: './model-details.component.html',\n styleUrl: './model-details.component.css'\n})\nexport class ModelDetailsComponent<T extends Referencable<any>, M extends Referencable<any>> implements OnInit {\n @Input() model!: T\n @Input() modelService!: ModelService<M>\n @Input() detailsService!: TreeDetailsService<M>\n\n attributes: Array<{ key: string; options: AttributeOptions }> = [];\n\n ngOnInit() {\n const map = getAllAttributes(this.model.constructor);\n this.attributes = Array.from(map.entries()).map(([key, options]) => ({\n key,\n options\n }));\n }\n\n getLinks(): ReLinkContainer<any, any>[] {\n return this.model.$otherReferences\n }\n\n getChildren(): ReTreeChildrenContainer<any>[] {\n return this.model.$treeChildren\n }\n\n chooseParent() {\n this.detailsService\n .openParentChoice(this.modelService)\n .subscribe(chosen => {\n if (!chosen) return; // user cancelled\n // todo what about type mismatches?\n const res = chosen._parent.addToReferencableContainer(\n chosen.referenceName,\n this.model\n )\n if (res) {\n this.modelService.saveCurrentState();\n }\n });\n }\n\n protected readonly IdHelper = IdHelper;\n}\n","<h1>Detail-Editor</h1>\n<h2>{{model.getEClass()}}</h2>\n<div class=\"parent-choice\">\n <label>Current Parent</label>\n <div *ngIf=\"!model.getParentReferencable()\">\n <span class=\"alert-ref\">No Parent</span>\n </div>\n <div class=\"ref-info\" *ngIf=\"model.getParentReferencable()\">\n <span class=\"ref-icon\">🔗</span>\n <span class=\"ref-type\">{{ model.getParentReferencable().getEClass() }}</span>\n <span class=\"ref-label\">{{ IdHelper.getLabel(model.getParentReferencable()) }}</span>\n </div>\n <button (click)=\"chooseParent()\">\n Set Parent\n </button>\n</div>\n<div class=\"attribute-list\">\n <div class=\"attribute-row\" *ngFor=\"let attr of attributes\">\n <label>{{ attr.key }}</label>\n <input\n type=\"text\"\n [(ngModel)]=\"$any(model)[attr.key]\"\n />\n </div>\n</div>\n<h3>References</h3>\n<div class=\"reference-list\">\n <container-details\n *ngFor=\"let container of getChildren()\"\n [container]=\"container\"\n [isTree]=\"true\"\n [modelService]=\"modelService\"\n [detailsService]=\"detailsService\"\n >\n </container-details>\n <container-details\n *ngFor=\"let container of getLinks()\"\n [container]=\"container\"\n [isTree]=\"false\"\n [modelService]=\"modelService\"\n [detailsService]=\"detailsService\"\n >\n </container-details>\n</div>\n\n","import {Component, EventEmitter, Input, Output} from '@angular/core';\nimport {ReferencableBoxComponent} from \"../../graphical/referencable-box/referencable-box.component\";\nimport {ModelService} from \"../../model.service\";\nimport { Referencable, ReTreeChildrenContainer } from 'emfular';\nimport { BoundingBox } from 'ngx-svg-graphics';\nimport {ModelCanvasComponent} from \"../model-canvas/model-canvas.component\";\n\n@Component({\n selector: 'tree-canvas',\n imports: [\n ReferencableBoxComponent,\n ModelCanvasComponent\n ],\n templateUrl: './tree-canvas.component.html',\n styleUrl: './tree-canvas.component.css'\n})\nexport class TreeCanvasComponent<M extends Referencable<any>> {\n svgwidth = 1500;\n svgheigth = 1000;\n initialBBox : BoundingBox = {x: this.svgwidth/2, y: 20, w: 200, h: 25}\n\n @Input() modelService!: ModelService<M>\n @Output() chooseElement: EventEmitter<Referencable<any>> = new EventEmitter();\n @Output() chooseReference: EventEmitter<ReTreeChildrenContainer<any>> = new EventEmitter();\n @Output() svgReady: EventEmitter<SVGSVGElement> = new EventEmitter<SVGSVGElement>();\n\n choose(element: Referencable<any>): void {\n this.chooseElement.emit(element);\n }\n\n chooseRef(reference: ReTreeChildrenContainer<any>) {\n this.chooseReference.emit(reference);\n }\n\n}\n","<model-canvas\n [svgwidth]=\"svgwidth\"\n [svgheigth]=\"svgheigth\"\n (svgReady)=\"svgReady.emit($event)\"\n>\n <svg:g canvas>\n <g referencable-box\n [referencable]=\"modelService.model\"\n [position]=\"initialBBox\"\n (chooseElement)=\"choose($event)\"\n (chooseReference)=\"chooseRef($event)\"\n >\n </g>\n </svg:g>\n</model-canvas>","import { Injectable } from '@angular/core';\nimport { Referencable, ReTreeChildrenContainer } from 'emfular';\nimport {ModelService} from \"../model.service\";\nimport {ModelDetailsComponent} from \"./model-details/model-details.component\";\nimport { Overlay } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport {TreeCanvasComponent} from \"../editor/tree-canvas/tree-canvas.component\";\nimport {Observable, Subject} from \"rxjs\";\nimport {TreeDetailsService} from \"./tree-details-service\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TreeModelDetailsService<M extends Referencable<any>> implements TreeDetailsService<M> {\n\n constructor( private overlay: Overlay) { }\n\n //actually T must be somewhere on M\n openDetails<\n T extends Referencable<any>\n >(elem: T, modelService: ModelService<M>) {\n // instead of opening the generic ModeldetailsCompoennt you might like to consider opening a specific one\n //by determining the eClass and switching based on elem.getEClass()\n\n const overlayRef = this.overlay.create(\n { hasBackdrop: true,\n backdropClass: 'cdk-overlay-dark-backdrop',\n panelClass: 'basic-details-panel',\n positionStrategy: this.overlay.position()\n .global() .centerHorizontally() .centerVertically()\n });\n const portal = new ComponentPortal(ModelDetailsComponent<T,M>);\n const ref = overlayRef.attach(portal);\n ref.instance.model = elem;\n ref.instance.modelService = modelService;\n ref.instance.detailsService = this\n overlayRef.backdropClick().subscribe(\n () => overlayRef.dispose()\n );\n }\n\n openModelChoice(\n modelService: ModelService<M>\n ): Observable<Referencable<any>> {\n\n const subject = new Subject<Referencable<any>>();\n\n const overlayRef = this.overlay.create({\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-dark-backdrop',\n panelClass: 'basic-details-panel',\n positionStrategy: this.overlay.position()\n .global().centerHorizontally().centerVertically()\n });\n\n const portal = new ComponentPortal(TreeCanvasComponent<M>);\n const ref = overlayRef.attach(portal);\n\n ref.instance.modelService = modelService;\n ref.instance.chooseElement.subscribe(next => {\n subject.next(next);\n subject.complete();\n overlayRef.dispose();\n });\n\n overlayRef.backdropClick().subscribe(() => {\n subject.complete();\n overlayRef.dispose();\n });\n\n return subject.asObservable();\n }\n\n openParentChoice(\n modelService: ModelService<M>\n ): Observable<ReTreeChildrenContainer<any>> {\n const subject = new Subject<ReTreeChildrenContainer<any>>();\n\n const overlayRef = this.overlay.create({\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-dark-backdrop',\n panelClass: 'basic-details-panel',\n positionStrategy: this.overlay.position()\n .global().centerHorizontally().centerVertically()\n });\n\n const portal = new ComponentPortal(TreeCanvasComponent<M>);\n const ref = overlayRef.attach(portal);\n\n ref.instance.modelService = modelService;\n ref.instance.chooseReference.subscribe(next => {\n subject.next(next);\n subject.complete();\n overlayRef.dispose();\n });\n\n overlayRef.backdropClick().subscribe(() => {\n subject.complete();\n overlayRef.dispose();\n });\n\n return subject.asObservable();\n }\n\n}\n","import {Component, Input} from '@angular/core';\nimport { Referencable} from \"emfular\";\nimport {ModelEditingBarComponent} from \"../model-editing-bar/model-editing-bar.component\";\nimport {ModelService} from \"../../model.service\";\nimport {TreeDetailsService} from \"../../details/tree-details-service\";\nimport {TreeModelDetailsService} from \"../../details/tree-model-details.service\";\nimport {EditButtonDef} from \"../edit-button-def\";\nimport {BasicEditorComponent} from \"../basic-editor/basic-editor.component\";\nimport {ReferencableBoxComponent} from \"../../graphical/referencable-box/referencable-box.component\";\nimport { BoundingBox } from 'ngx-svg-graphics';\n\n@Component({\n selector: 'emfular-tree-editor',\n imports: [\n ModelEditingBarComponent,\n BasicEditorComponent,\n ReferencableBoxComponent\n ],\n templateUrl: './tree-editor.component.html',\n styleUrl: './tree-editor.component.css'\n})\nexport class TreeEditorComponent<M extends Referencable<any>> {\n @Input() modelService!: ModelService<M>\n @Input() detailsService?: TreeDetailsService<M>\n @Input() customButtons: Array<EditButtonDef> | null = null;\n svgwidth = 1500;\n svgheigth = 1000;\n initialBBox : BoundingBox = {x: this.svgwidth/2, y: 20, w: 200, h: 25}\n\n\n constructor(private basicDetailsService: TreeModelDetailsService<M>) {}\n\n get sidebarButtons() {\n if (this.customButtons) return this.customButtons;\n else //todo replace by default create buttons\n return[{label: \"test\", action: () => {console.log(\"Button on model edition works\")}}];\n }\n\n get effectiveDetailsService(): TreeDetailsService<M> {\n return this.detailsService ?? this.basicDetailsService;\n }\n\n choose(element: Referencable<any>) {\n this.effectiveDetailsService.openDetails(element, this.modelService)\n }\n}\n","<emfular-basic-editor\n [svgwidth]=\"svgwidth\"\n [svgheight]=\"svgheigth\"\n [modelService]=\"modelService\"\n>\n <!-- Default sidebar -->\n <emfular-model-editing-bar\n sidebar\n [buttons]=\"sidebarButtons\">\n </emfular-model-editing-bar>\n\n <!-- Default canvas content, needs svg namespace just like components -->\n <svg:g canvas>\n <g referencable-box\n [referencable]=\"modelService.model\"\n [position]=\"initialBBox\"\n (chooseElement)=\"choose($event)\">\n </g>\n </svg:g>\n</emfular-basic-editor>\n","import {Component, Input} from '@angular/core';\nimport {InputHandler, IoService} from \"ngx-emfular-helper\";\nimport {Referencable} from \"emfular\";\nimport { CommonModule } from '@angular/common';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport {ModelService} from \"../../model.service\";\n\n@Component({\n selector: 'emfular-file-level-bar-material',\n imports: [CommonModule, MatToolbarModule, MatIconModule, MatButtonModule],\n templateUrl: './file-level-bar-material.component.html',\n styleUrl: './file-level-bar-material.component.css'\n})\nexport class FileLevelBarMaterialComponent<M extends Referencable<any>> {\n @Input() svg!: SVGElement\n @Input() modelService!: ModelService<M>\n protected readonly InputHandler = InputHandler;\n\n constructor(public ioService: IoService) {\n }\n\n openModel() {\n document.getElementById('openModel')?.click();\n }\n\n\n saveSVG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSVG(svgContent, this.modelService.fileTitle())\n }\n }\n\n saveSVGasPNG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSvgAsPng(svgContent, this.modelService.fileTitle())\n }\n }\n\n saveSVGasJPEG() {\n const svgContent = this.svg;\n if(svgContent) {\n this.ioService.saveSvgAsJpeg(svgContent, this.modelService.fileTitle())\n }\n }\n\n\n}\n","<input id=\"openModel\" type=\"file\" class=\"file-upload\" style=\"display: none\" (change)=\"modelService.loadFromFile($event)\" (click)=\"InputHandler.clearElem($event)\">\n<mat-toolbar class=\"file-level-bar\">\n <button (click)=\"modelService.newModel()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"insert_drive_file\" ></mat-icon>\n New\n </button>\n <button (click)=\"openModel()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"file_upload\" ></mat-icon>\n Open\n </button>\n <hr/>\n <button (click)=\"modelService.historyService.undo()\" [disabled]=\"modelService.historyService.isUndoNotPossible()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"undo\" ></mat-icon>\n Undo</button>\n <button (click)=\"modelService.historyService.redo()\" [disabled]=\"modelService.historyService.isRedoNotPossible()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"redo\" ></mat-icon>\n Redo</button>\n <hr />\n <button (click)=\"modelService.save()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"file_download\" ></mat-icon>\n Save\n </button>\n <button (click)=\"saveSVG()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"photo_library\" ></mat-icon>\n Save SVG\n </button>\n <button (click)=\"saveSVGasPNG()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"photo_library\" ></mat-icon>\n Save PNG\n </button>\n <button (click)=\"saveSVGasJPEG()\">\n <mat-icon aria-hidden=\"false\" fontIcon=\"photo_library\" ></mat-icon>\n Save JPEG\n </button>\n</mat-toolbar>\n","/*\n * Public API Surface of ngx-emfular-integration\n */\n\nexport * from './lib/model.service';\n\nexport * from './lib/editor/tree-editor/tree-editor.component'\nexport * from './lib/editor/file-level-bar/file-level-bar.component';\nexport * from './lib/editor/file-level-bar-material/file-level-bar-material.component';\nexport * from './lib/editor/model-editing-bar/model-editing-bar.component';\nexport * from './lib/editor/tree-canvas/tree-canvas.component';\nexport * from './lib/editor/model-canvas/model-canvas.component';\nexport * from './lib/editor/basic-editor/basic-editor.component';\nexport * from './lib/editor/edit-button-def';\n\nexport * from './lib/graphical/referencable-box/referencable-box.component';\n\nexport * from './lib/details/tree-details-service'\nexport { TreeModelDetailsService as BasicModelDetailsService } from './lib/details/tree-model-details.service';\nexport * from './lib/details/tree-model-details.service'\nexport * from './lib/details/model-details/model-details.component';\nexport * from './lib/details/container-details/container-details.component'\n\nexport * from './lib/utils/id-helper'","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.TreeModelDetailsService"],"mappings":"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"}
|
|
@@ -2,13 +2,13 @@ import { ReContainer, Referencable } from 'emfular';
|
|
|
2
2
|
import { GraphicalHelper } from "../../utils/graphical-helper";
|
|
3
3
|
import { IdHelper } from "../../utils/id-helper";
|
|
4
4
|
import { ModelService } from "../../model.service";
|
|
5
|
-
import {
|
|
5
|
+
import { TreeDetailsService } from "../tree-details-service";
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
export declare class ContainerDetailsComponent<M extends Referencable<any>> {
|
|
8
8
|
container: ReContainer<any, any>;
|
|
9
9
|
isTree: boolean;
|
|
10
10
|
modelService: ModelService<M>;
|
|
11
|
-
detailsService:
|
|
11
|
+
detailsService: TreeDetailsService<M>;
|
|
12
12
|
open(ref: Referencable<any>): void;
|
|
13
13
|
remove(ref: Referencable<any>): void;
|
|
14
14
|
add(): void;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
2
|
import { AttributeOptions, Referencable, ReLinkContainer, ReTreeChildrenContainer } from 'emfular';
|
|
3
3
|
import { ModelService } from "../../model.service";
|
|
4
|
-
import {
|
|
4
|
+
import { TreeDetailsService } from "../tree-details-service";
|
|
5
5
|
import { IdHelper } from "../../utils/id-helper";
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
export declare class ModelDetailsComponent<T extends Referencable<any>, M extends Referencable<any>> implements OnInit {
|
|
8
8
|
model: T;
|
|
9
9
|
modelService: ModelService<M>;
|
|
10
|
-
detailsService:
|
|
10
|
+
detailsService: TreeDetailsService<M>;
|
|
11
11
|
attributes: Array<{
|
|
12
12
|
key: string;
|
|
13
13
|
options: AttributeOptions;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Referencable, ReTreeChildrenContainer } from "emfular";
|
|
2
2
|
import { ModelService } from "../model.service";
|
|
3
3
|
import { Observable } from "rxjs";
|
|
4
|
-
export interface
|
|
4
|
+
export interface TreeDetailsService<M extends Referencable<any>> {
|
|
5
5
|
openDetails<T extends Referencable<any>>(elem: T, modelService: ModelService<M>): void;
|
|
6
6
|
openModelChoice(modelService: ModelService<M>): Observable<Referencable<any>>;
|
|
7
7
|
openParentChoice(modelService: ModelService<M>): Observable<ReTreeChildrenContainer<any>>;
|
|
@@ -2,14 +2,14 @@ import { Referencable, ReTreeChildrenContainer } from 'emfular';
|
|
|
2
2
|
import { ModelService } from "../model.service";
|
|
3
3
|
import { Overlay } from '@angular/cdk/overlay';
|
|
4
4
|
import { Observable } from "rxjs";
|
|
5
|
-
import {
|
|
5
|
+
import { TreeDetailsService } from "./tree-details-service";
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
|
-
export declare class
|
|
7
|
+
export declare class TreeModelDetailsService<M extends Referencable<any>> implements TreeDetailsService<M> {
|
|
8
8
|
private overlay;
|
|
9
9
|
constructor(overlay: Overlay);
|
|
10
10
|
openDetails<T extends Referencable<any>>(elem: T, modelService: ModelService<M>): void;
|
|
11
11
|
openModelChoice(modelService: ModelService<M>): Observable<Referencable<any>>;
|
|
12
12
|
openParentChoice(modelService: ModelService<M>): Observable<ReTreeChildrenContainer<any>>;
|
|
13
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<
|
|
14
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<
|
|
13
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TreeModelDetailsService<any>, never>;
|
|
14
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<TreeModelDetailsService<any>>;
|
|
15
15
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Referencable } from "emfular";
|
|
2
|
+
import { ModelService } from "../../model.service";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class BasicEditorComponent<M extends Referencable<any>> {
|
|
5
|
+
modelService: ModelService<M>;
|
|
6
|
+
svgwidth: number;
|
|
7
|
+
svgheight: number;
|
|
8
|
+
svgElement: SVGSVGElement;
|
|
9
|
+
constructor();
|
|
10
|
+
onSvgReady(svg: SVGSVGElement): void;
|
|
11
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<BasicEditorComponent<any>, never>;
|
|
12
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<BasicEditorComponent<any>, "emfular-basic-editor", never, { "modelService": { "alias": "modelService"; "required": false; }; "svgwidth": { "alias": "svgwidth"; "required": false; }; "svgheight": { "alias": "svgheight"; "required": false; }; }, {}, never, ["[sidebar]", "[canvas]"], true, never>;
|
|
13
|
+
}
|
|
@@ -1,20 +1,11 @@
|
|
|
1
1
|
import { ElementRef, EventEmitter, OnInit } from '@angular/core';
|
|
2
|
-
import { ModelService } from "../../model.service";
|
|
3
|
-
import { Referencable, ReTreeChildrenContainer } from 'emfular';
|
|
4
|
-
import { BoundingBox } from 'ngx-svg-graphics';
|
|
5
2
|
import * as i0 from "@angular/core";
|
|
6
|
-
export declare class ModelCanvasComponent
|
|
3
|
+
export declare class ModelCanvasComponent implements OnInit {
|
|
7
4
|
svgwidth: number;
|
|
8
5
|
svgheigth: number;
|
|
9
|
-
initialBBox: BoundingBox;
|
|
10
|
-
modelService: ModelService<M>;
|
|
11
|
-
chooseElement: EventEmitter<Referencable<any>>;
|
|
12
|
-
chooseReference: EventEmitter<ReTreeChildrenContainer<any>>;
|
|
13
6
|
svgReady: EventEmitter<SVGSVGElement>;
|
|
14
7
|
svg: ElementRef<SVGSVGElement>;
|
|
15
8
|
ngOnInit(): void;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<ModelCanvasComponent<any>, never>;
|
|
19
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ModelCanvasComponent<any>, "model-canvas", never, { "modelService": { "alias": "modelService"; "required": false; }; }, { "chooseElement": "chooseElement"; "chooseReference": "chooseReference"; "svgReady": "svgReady"; }, never, never, true, never>;
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ModelCanvasComponent, never>;
|
|
10
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ModelCanvasComponent, "model-canvas", never, { "svgwidth": { "alias": "svgwidth"; "required": false; }; "svgheigth": { "alias": "svgheigth"; "required": false; }; }, { "svgReady": "svgReady"; }, never, ["*"], true, never>;
|
|
20
11
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { ModelService } from "../../model.service";
|
|
3
|
+
import { Referencable, ReTreeChildrenContainer } from 'emfular';
|
|
4
|
+
import { BoundingBox } from 'ngx-svg-graphics';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export declare class TreeCanvasComponent<M extends Referencable<any>> {
|
|
7
|
+
svgwidth: number;
|
|
8
|
+
svgheigth: number;
|
|
9
|
+
initialBBox: BoundingBox;
|
|
10
|
+
modelService: ModelService<M>;
|
|
11
|
+
chooseElement: EventEmitter<Referencable<any>>;
|
|
12
|
+
chooseReference: EventEmitter<ReTreeChildrenContainer<any>>;
|
|
13
|
+
svgReady: EventEmitter<SVGSVGElement>;
|
|
14
|
+
choose(element: Referencable<any>): void;
|
|
15
|
+
chooseRef(reference: ReTreeChildrenContainer<any>): void;
|
|
16
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TreeCanvasComponent<any>, never>;
|
|
17
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TreeCanvasComponent<any>, "tree-canvas", never, { "modelService": { "alias": "modelService"; "required": false; }; }, { "chooseElement": "chooseElement"; "chooseReference": "chooseReference"; "svgReady": "svgReady"; }, never, never, true, never>;
|
|
18
|
+
}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { Referencable } from "emfular";
|
|
2
2
|
import { ModelService } from "../../model.service";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { TreeDetailsService } from "../../details/tree-details-service";
|
|
4
|
+
import { TreeModelDetailsService } from "../../details/tree-model-details.service";
|
|
5
5
|
import { EditButtonDef } from "../edit-button-def";
|
|
6
|
+
import { BoundingBox } from 'ngx-svg-graphics';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
export declare class TreeEditorComponent<M extends Referencable<any>> {
|
|
8
9
|
private basicDetailsService;
|
|
9
|
-
svgElement: SVGSVGElement;
|
|
10
10
|
modelService: ModelService<M>;
|
|
11
|
-
detailsService?:
|
|
11
|
+
detailsService?: TreeDetailsService<M>;
|
|
12
12
|
customButtons: Array<EditButtonDef> | null;
|
|
13
|
-
|
|
13
|
+
svgwidth: number;
|
|
14
|
+
svgheigth: number;
|
|
15
|
+
initialBBox: BoundingBox;
|
|
16
|
+
constructor(basicDetailsService: TreeModelDetailsService<M>);
|
|
14
17
|
get sidebarButtons(): EditButtonDef[];
|
|
15
|
-
get effectiveDetailsService():
|
|
16
|
-
onSvgReady(svg: SVGSVGElement): void;
|
|
18
|
+
get effectiveDetailsService(): TreeDetailsService<M>;
|
|
17
19
|
choose(element: Referencable<any>): void;
|
|
18
20
|
static ɵfac: i0.ɵɵFactoryDeclaration<TreeEditorComponent<any>, never>;
|
|
19
21
|
static ɵcmp: i0.ɵɵComponentDeclaration<TreeEditorComponent<any>, "emfular-tree-editor", never, { "modelService": { "alias": "modelService"; "required": false; }; "detailsService": { "alias": "detailsService"; "required": false; }; "customButtons": { "alias": "customButtons"; "required": false; }; }, {}, never, never, true, never>;
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -3,11 +3,14 @@ export * from './lib/editor/tree-editor/tree-editor.component';
|
|
|
3
3
|
export * from './lib/editor/file-level-bar/file-level-bar.component';
|
|
4
4
|
export * from './lib/editor/file-level-bar-material/file-level-bar-material.component';
|
|
5
5
|
export * from './lib/editor/model-editing-bar/model-editing-bar.component';
|
|
6
|
+
export * from './lib/editor/tree-canvas/tree-canvas.component';
|
|
6
7
|
export * from './lib/editor/model-canvas/model-canvas.component';
|
|
8
|
+
export * from './lib/editor/basic-editor/basic-editor.component';
|
|
7
9
|
export * from './lib/editor/edit-button-def';
|
|
8
10
|
export * from './lib/graphical/referencable-box/referencable-box.component';
|
|
9
|
-
export * from './lib/details/
|
|
10
|
-
export
|
|
11
|
+
export * from './lib/details/tree-details-service';
|
|
12
|
+
export { TreeModelDetailsService as BasicModelDetailsService } from './lib/details/tree-model-details.service';
|
|
13
|
+
export * from './lib/details/tree-model-details.service';
|
|
11
14
|
export * from './lib/details/model-details/model-details.component';
|
|
12
15
|
export * from './lib/details/container-details/container-details.component';
|
|
13
16
|
export * from './lib/utils/id-helper';
|