@expertrees/angular 0.1.0

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.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZXJ0cmVlcy1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4cGVydHJlZXMtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export { ExpertreeCanvasComponent } from './lib/expertree.component';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMkJBQTJCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBFeHBlcnRyZWVDYW52YXNDb21wb25lbnQgfSBmcm9tICcuL2xpYi9leHBlcnRyZWUuY29tcG9uZW50J1xuIl19
@@ -0,0 +1,116 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core';
2
+ import { SkillTreeEngine, } from '@expertrees/core';
3
+ import * as i0 from "@angular/core";
4
+ export class ExpertreeCanvasComponent {
5
+ data;
6
+ theme;
7
+ lod;
8
+ initialContextNodeId;
9
+ width = '100%';
10
+ height = '100%';
11
+ nodeClick = new EventEmitter();
12
+ nodeHover = new EventEmitter();
13
+ nodeBlur = new EventEmitter();
14
+ canvasClick = new EventEmitter();
15
+ zoomChange = new EventEmitter();
16
+ contextEnter = new EventEmitter();
17
+ contextExit = new EventEmitter();
18
+ graphReady = new EventEmitter();
19
+ canvasRef;
20
+ engine = null;
21
+ ngAfterViewInit() {
22
+ this._createEngine();
23
+ }
24
+ ngOnChanges(changes) {
25
+ if (changes['data'] && !changes['data'].firstChange) {
26
+ this._createEngine();
27
+ }
28
+ }
29
+ ngOnDestroy() {
30
+ this.engine?.dispose();
31
+ }
32
+ setNodeState(nodeId, state) {
33
+ this.engine?.setNodeState(nodeId, state);
34
+ }
35
+ addEvidence(nodeId, evidence) {
36
+ this.engine?.addEvidence(nodeId, evidence);
37
+ }
38
+ removeEvidence(nodeId, evidenceId) {
39
+ this.engine?.removeEvidence(nodeId, evidenceId);
40
+ }
41
+ updateTheme(theme) {
42
+ this.engine?.updateTheme(theme);
43
+ }
44
+ zoomIn() { this.engine?.zoomIn(); }
45
+ zoomOut() { this.engine?.zoomOut(); }
46
+ goBack() { this.engine?.goBack(); }
47
+ enterContext(nodeId) { this.engine?.enterContext(nodeId); }
48
+ jumpToNavDepth(targetLength) { this.engine?.jumpToNavDepth(targetLength); }
49
+ getGraph() { return this.engine?.getGraph() ?? this.data; }
50
+ getNavigationStack() { return this.engine?.getNavigationStack() ?? []; }
51
+ _createEngine() {
52
+ this.engine?.dispose();
53
+ const canvas = this.canvasRef?.nativeElement;
54
+ if (!canvas)
55
+ return;
56
+ this.engine = new SkillTreeEngine({
57
+ canvas,
58
+ data: this.data,
59
+ ...(this.theme !== undefined && { theme: this.theme }),
60
+ ...(this.lod !== undefined && { lod: this.lod }),
61
+ ...(this.initialContextNodeId !== undefined && { initialContextNodeId: this.initialContextNodeId }),
62
+ on: {
63
+ 'node:click': (node) => this.nodeClick.emit(node),
64
+ 'node:hover': (node) => this.nodeHover.emit(node),
65
+ 'node:blur': (node) => this.nodeBlur.emit(node),
66
+ 'canvas:click': () => this.canvasClick.emit(),
67
+ 'zoom:change': (zoom) => this.zoomChange.emit(zoom),
68
+ 'context:enter': (node, stack) => this.contextEnter.emit({ node, stack }),
69
+ 'context:exit': (frame, stack) => this.contextExit.emit({ frame, stack }),
70
+ 'graph:ready': (graph) => this.graphReady.emit(graph),
71
+ },
72
+ });
73
+ }
74
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ExpertreeCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
75
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ExpertreeCanvasComponent, isStandalone: true, selector: "expertree-canvas", inputs: { data: "data", theme: "theme", lod: "lod", initialContextNodeId: "initialContextNodeId", width: "width", height: "height" }, outputs: { nodeClick: "nodeClick", nodeHover: "nodeHover", nodeBlur: "nodeBlur", canvasClick: "canvasClick", zoomChange: "zoomChange", contextEnter: "contextEnter", contextExit: "contextExit", graphReady: "graphReady" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `<canvas #canvas [style.width]="width" [style.height]="height" style="display:block"></canvas>`, isInline: true });
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ExpertreeCanvasComponent, decorators: [{
78
+ type: Component,
79
+ args: [{
80
+ selector: 'expertree-canvas',
81
+ standalone: true,
82
+ template: `<canvas #canvas [style.width]="width" [style.height]="height" style="display:block"></canvas>`,
83
+ }]
84
+ }], propDecorators: { data: [{
85
+ type: Input
86
+ }], theme: [{
87
+ type: Input
88
+ }], lod: [{
89
+ type: Input
90
+ }], initialContextNodeId: [{
91
+ type: Input
92
+ }], width: [{
93
+ type: Input
94
+ }], height: [{
95
+ type: Input
96
+ }], nodeClick: [{
97
+ type: Output
98
+ }], nodeHover: [{
99
+ type: Output
100
+ }], nodeBlur: [{
101
+ type: Output
102
+ }], canvasClick: [{
103
+ type: Output
104
+ }], zoomChange: [{
105
+ type: Output
106
+ }], contextEnter: [{
107
+ type: Output
108
+ }], contextExit: [{
109
+ type: Output
110
+ }], graphReady: [{
111
+ type: Output
112
+ }], canvasRef: [{
113
+ type: ViewChild,
114
+ args: ['canvas']
115
+ }] } });
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZXJ0cmVlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvZXhwZXJ0cmVlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUlaLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQ0wsZUFBZSxHQVFoQixNQUFNLGtCQUFrQixDQUFBOztBQU96QixNQUFNLE9BQU8sd0JBQXdCO0lBQzFCLElBQUksQ0FBYTtJQUNqQixLQUFLLENBQWE7SUFDbEIsR0FBRyxDQUFpQjtJQUNwQixvQkFBb0IsQ0FBUztJQUM3QixLQUFLLEdBQUcsTUFBTSxDQUFBO0lBQ2QsTUFBTSxHQUFHLE1BQU0sQ0FBQTtJQUVkLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFBO0lBQ3pDLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFBO0lBQ3pDLFFBQVEsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFBO0lBQ3hDLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFBO0lBQ3RDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFBO0lBQ3ZDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBMEQsQ0FBQTtJQUN6RixXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWlFLENBQUE7SUFDL0YsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUE7SUFFeEIsU0FBUyxDQUFnQztJQUU5RCxNQUFNLEdBQTJCLElBQUksQ0FBQTtJQUU3QyxlQUFlO1FBQ2IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQ3RCLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEQsSUFB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O2dCQUVzQixTQUFTO3NCQUFyQyxTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIEFmdGVyVmlld0luaXQsXG4gIFZpZXdDaGlsZCxcbiAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7XG4gIFNraWxsVHJlZUVuZ2luZSxcbiAgdHlwZSBTa2lsbEdyYXBoLFxuICB0eXBlIFNraWxsTm9kZSxcbiAgdHlwZSBOb2RlU3RhdGUsXG4gIHR5cGUgRXZpZGVuY2UsXG4gIHR5cGUgVGhlbWVJbnB1dCxcbiAgdHlwZSBMb2RUaHJlc2hvbGQsXG4gIHR5cGUgTmF2aWdhdGlvbkZyYW1lLFxufSBmcm9tICdAZXhwZXJ0cmVlcy9jb3JlJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdleHBlcnRyZWUtY2FudmFzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGU6IGA8Y2FudmFzICNjYW52YXMgW3N0eWxlLndpZHRoXT1cIndpZHRoXCIgW3N0eWxlLmhlaWdodF09XCJoZWlnaHRcIiBzdHlsZT1cImRpc3BsYXk6YmxvY2tcIj48L2NhbnZhcz5gLFxufSlcbmV4cG9ydCBjbGFzcyBFeHBlcnRyZWVDYW52YXNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGRhdGEhOiBTa2lsbEdyYXBoXG4gIEBJbnB1dCgpIHRoZW1lPzogVGhlbWVJbnB1dFxuICBASW5wdXQoKSBsb2Q/OiBMb2RUaHJlc2hvbGRbXVxuICBASW5wdXQoKSBpbml0aWFsQ29udGV4dE5vZGVJZD86IHN0cmluZ1xuICBASW5wdXQoKSB3aWR0aCA9ICcxMDAlJ1xuICBASW5wdXQoKSBoZWlnaHQgPSAnMTAwJSdcblxuICBAT3V0cHV0KCkgbm9kZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxTa2lsbE5vZGU+KClcbiAgQE91dHB1dCgpIG5vZGVIb3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2tpbGxOb2RlPigpXG4gIEBPdXRwdXQoKSBub2RlQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8U2tpbGxOb2RlPigpXG4gIEBPdXRwdXQoKSBjYW52YXNDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKVxuICBAT3V0cHV0KCkgem9vbUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpXG4gIEBPdXRwdXQoKSBjb250ZXh0RW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbm9kZTogU2tpbGxOb2RlOyBzdGFjazogcmVhZG9ubHkgTmF2aWdhdGlvbkZyYW1lW10gfT4oKVxuICBAT3V0cHV0KCkgY29udGV4dEV4aXQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZnJhbWU6IE5hdmlnYXRpb25GcmFtZTsgc3RhY2s6IHJlYWRvbmx5IE5hdmlnYXRpb25GcmFtZVtdIH0+KClcbiAgQE91dHB1dCgpIGdyYXBoUmVhZHkgPSBuZXcgRXZlbnRFbWl0dGVyPFNraWxsR3JhcGg+KClcblxuICBAVmlld0NoaWxkKCdjYW52YXMnKSBwcml2YXRlIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+XG5cbiAgcHJpdmF0ZSBlbmdpbmU6IFNraWxsVHJlZUVuZ2luZSB8IG51bGwgPSBudWxsXG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NyZWF0ZUVuZ2luZSgpXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGEnXSAmJiAhY2hhbmdlc1snZGF0YSddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLl9jcmVhdGVFbmdpbmUoKVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZW5naW5lPy5kaXNwb3NlKClcbiAgfVxuXG4gIHNldE5vZGVTdGF0ZShub2RlSWQ6IHN0cmluZywgc3RhdGU6IE5vZGVTdGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuZW5naW5lPy5zZXROb2RlU3RhdGUobm9kZUlkLCBzdGF0ZSlcbiAgfVxuXG4gIGFkZEV2aWRlbmNlKG5vZGVJZDogc3RyaW5nLCBldmlkZW5jZTogRXZpZGVuY2UpOiB2b2lkIHtcbiAgICB0aGlzLmVuZ2luZT8uYWRkRXZpZGVuY2Uobm9kZUlkLCBldmlkZW5jZSlcbiAgfVxuXG4gIHJlbW92ZUV2aWRlbmNlKG5vZGVJZDogc3RyaW5nLCBldmlkZW5jZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmVuZ2luZT8ucmVtb3ZlRXZpZGVuY2Uobm9kZUlkLCBldmlkZW5jZUlkKVxuICB9XG5cbiAgdXBkYXRlVGhlbWUodGhlbWU6IFRoZW1lSW5wdXQpOiB2b2lkIHtcbiAgICB0aGlzLmVuZ2luZT8udXBkYXRlVGhlbWUodGhlbWUpXG4gIH1cblxuICB6b29tSW4oKTogdm9pZCB7IHRoaXMuZW5naW5lPy56b29tSW4oKSB9XG4gIHpvb21PdXQoKTogdm9pZCB7IHRoaXMuZW5naW5lPy56b29tT3V0KCkgfVxuICBnb0JhY2soKTogdm9pZCB7IHRoaXMuZW5naW5lPy5nb0JhY2soKSB9XG4gIGVudGVyQ29udGV4dChub2RlSWQ6IHN0cmluZyk6IHZvaWQgeyB0aGlzLmVuZ2luZT8uZW50ZXJDb250ZXh0KG5vZGVJZCkgfVxuICBqdW1wVG9OYXZEZXB0aCh0YXJnZXRMZW5ndGg6IG51bWJlcik6IHZvaWQgeyB0aGlzLmVuZ2luZT8uanVtcFRvTmF2RGVwdGgodGFyZ2V0TGVuZ3RoKSB9XG4gIGdldEdyYXBoKCk6IFNraWxsR3JhcGggeyByZXR1cm4gdGhpcy5lbmdpbmU/LmdldEdyYXBoKCkgPz8gdGhpcy5kYXRhIH1cbiAgZ2V0TmF2aWdhdGlvblN0YWNrKCk6IHJlYWRvbmx5IE5hdmlnYXRpb25GcmFtZVtdIHsgcmV0dXJuIHRoaXMuZW5naW5lPy5nZXROYXZpZ2F0aW9uU3RhY2soKSA/PyBbXSB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRW5naW5lKCk6IHZvaWQge1xuICAgIHRoaXMuZW5naW5lPy5kaXNwb3NlKClcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhc1JlZj8ubmF0aXZlRWxlbWVudFxuICAgIGlmICghY2FudmFzKSByZXR1cm5cblxuICAgIHRoaXMuZW5naW5lID0gbmV3IFNraWxsVHJlZUVuZ2luZSh7XG4gICAgICBjYW52YXMsXG4gICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgICAuLi4odGhpcy50aGVtZSAhPT0gdW5kZWZpbmVkICYmIHsgdGhlbWU6IHRoaXMudGhlbWUgfSksXG4gICAgICAuLi4odGhpcy5sb2QgIT09IHVuZGVmaW5lZCAmJiB7IGxvZDogdGhpcy5sb2QgfSksXG4gICAgICAuLi4odGhpcy5pbml0aWFsQ29udGV4dE5vZGVJZCAhPT0gdW5kZWZpbmVkICYmIHsgaW5pdGlhbENvbnRleHROb2RlSWQ6IHRoaXMuaW5pdGlhbENvbnRleHROb2RlSWQgfSksXG4gICAgICBvbjoge1xuICAgICAgICAnbm9kZTpjbGljayc6IChub2RlKSA9PiB0aGlzLm5vZGVDbGljay5lbWl0KG5vZGUpLFxuICAgICAgICAnbm9kZTpob3Zlcic6IChub2RlKSA9PiB0aGlzLm5vZGVIb3Zlci5lbWl0KG5vZGUpLFxuICAgICAgICAnbm9kZTpibHVyJzogKG5vZGUpID0+IHRoaXMubm9kZUJsdXIuZW1pdChub2RlKSxcbiAgICAgICAgJ2NhbnZhczpjbGljayc6ICgpID0+IHRoaXMuY2FudmFzQ2xpY2suZW1pdCgpLFxuICAgICAgICAnem9vbTpjaGFuZ2UnOiAoem9vbSkgPT4gdGhpcy56b29tQ2hhbmdlLmVtaXQoem9vbSksXG4gICAgICAgICdjb250ZXh0OmVudGVyJzogKG5vZGUsIHN0YWNrKSA9PiB0aGlzLmNvbnRleHRFbnRlci5lbWl0KHsgbm9kZSwgc3RhY2sgfSksXG4gICAgICAgICdjb250ZXh0OmV4aXQnOiAoZnJhbWUsIHN0YWNrKSA9PiB0aGlzLmNvbnRleHRFeGl0LmVtaXQoeyBmcmFtZSwgc3RhY2sgfSksXG4gICAgICAgICdncmFwaDpyZWFkeSc6IChncmFwaCkgPT4gdGhpcy5ncmFwaFJlYWR5LmVtaXQoZ3JhcGgpLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG59XG4iXX0=
@@ -0,0 +1,123 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, ViewChild, Output, Input, Component } from '@angular/core';
3
+ import { SkillTreeEngine } from '@expertrees/core';
4
+
5
+ class ExpertreeCanvasComponent {
6
+ data;
7
+ theme;
8
+ lod;
9
+ initialContextNodeId;
10
+ width = '100%';
11
+ height = '100%';
12
+ nodeClick = new EventEmitter();
13
+ nodeHover = new EventEmitter();
14
+ nodeBlur = new EventEmitter();
15
+ canvasClick = new EventEmitter();
16
+ zoomChange = new EventEmitter();
17
+ contextEnter = new EventEmitter();
18
+ contextExit = new EventEmitter();
19
+ graphReady = new EventEmitter();
20
+ canvasRef;
21
+ engine = null;
22
+ ngAfterViewInit() {
23
+ this._createEngine();
24
+ }
25
+ ngOnChanges(changes) {
26
+ if (changes['data'] && !changes['data'].firstChange) {
27
+ this._createEngine();
28
+ }
29
+ }
30
+ ngOnDestroy() {
31
+ this.engine?.dispose();
32
+ }
33
+ setNodeState(nodeId, state) {
34
+ this.engine?.setNodeState(nodeId, state);
35
+ }
36
+ addEvidence(nodeId, evidence) {
37
+ this.engine?.addEvidence(nodeId, evidence);
38
+ }
39
+ removeEvidence(nodeId, evidenceId) {
40
+ this.engine?.removeEvidence(nodeId, evidenceId);
41
+ }
42
+ updateTheme(theme) {
43
+ this.engine?.updateTheme(theme);
44
+ }
45
+ zoomIn() { this.engine?.zoomIn(); }
46
+ zoomOut() { this.engine?.zoomOut(); }
47
+ goBack() { this.engine?.goBack(); }
48
+ enterContext(nodeId) { this.engine?.enterContext(nodeId); }
49
+ jumpToNavDepth(targetLength) { this.engine?.jumpToNavDepth(targetLength); }
50
+ getGraph() { return this.engine?.getGraph() ?? this.data; }
51
+ getNavigationStack() { return this.engine?.getNavigationStack() ?? []; }
52
+ _createEngine() {
53
+ this.engine?.dispose();
54
+ const canvas = this.canvasRef?.nativeElement;
55
+ if (!canvas)
56
+ return;
57
+ this.engine = new SkillTreeEngine({
58
+ canvas,
59
+ data: this.data,
60
+ ...(this.theme !== undefined && { theme: this.theme }),
61
+ ...(this.lod !== undefined && { lod: this.lod }),
62
+ ...(this.initialContextNodeId !== undefined && { initialContextNodeId: this.initialContextNodeId }),
63
+ on: {
64
+ 'node:click': (node) => this.nodeClick.emit(node),
65
+ 'node:hover': (node) => this.nodeHover.emit(node),
66
+ 'node:blur': (node) => this.nodeBlur.emit(node),
67
+ 'canvas:click': () => this.canvasClick.emit(),
68
+ 'zoom:change': (zoom) => this.zoomChange.emit(zoom),
69
+ 'context:enter': (node, stack) => this.contextEnter.emit({ node, stack }),
70
+ 'context:exit': (frame, stack) => this.contextExit.emit({ frame, stack }),
71
+ 'graph:ready': (graph) => this.graphReady.emit(graph),
72
+ },
73
+ });
74
+ }
75
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ExpertreeCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
76
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ExpertreeCanvasComponent, isStandalone: true, selector: "expertree-canvas", inputs: { data: "data", theme: "theme", lod: "lod", initialContextNodeId: "initialContextNodeId", width: "width", height: "height" }, outputs: { nodeClick: "nodeClick", nodeHover: "nodeHover", nodeBlur: "nodeBlur", canvasClick: "canvasClick", zoomChange: "zoomChange", contextEnter: "contextEnter", contextExit: "contextExit", graphReady: "graphReady" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `<canvas #canvas [style.width]="width" [style.height]="height" style="display:block"></canvas>`, isInline: true });
77
+ }
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ExpertreeCanvasComponent, decorators: [{
79
+ type: Component,
80
+ args: [{
81
+ selector: 'expertree-canvas',
82
+ standalone: true,
83
+ template: `<canvas #canvas [style.width]="width" [style.height]="height" style="display:block"></canvas>`,
84
+ }]
85
+ }], propDecorators: { data: [{
86
+ type: Input
87
+ }], theme: [{
88
+ type: Input
89
+ }], lod: [{
90
+ type: Input
91
+ }], initialContextNodeId: [{
92
+ type: Input
93
+ }], width: [{
94
+ type: Input
95
+ }], height: [{
96
+ type: Input
97
+ }], nodeClick: [{
98
+ type: Output
99
+ }], nodeHover: [{
100
+ type: Output
101
+ }], nodeBlur: [{
102
+ type: Output
103
+ }], canvasClick: [{
104
+ type: Output
105
+ }], zoomChange: [{
106
+ type: Output
107
+ }], contextEnter: [{
108
+ type: Output
109
+ }], contextExit: [{
110
+ type: Output
111
+ }], graphReady: [{
112
+ type: Output
113
+ }], canvasRef: [{
114
+ type: ViewChild,
115
+ args: ['canvas']
116
+ }] } });
117
+
118
+ /**
119
+ * Generated bundle index. Do not edit.
120
+ */
121
+
122
+ export { ExpertreeCanvasComponent };
123
+ //# sourceMappingURL=expertrees-angular.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expertrees-angular.mjs","sources":["../../src/lib/expertree.component.ts","../../src/expertrees-angular.ts"],"sourcesContent":["import {\n Component,\n ElementRef,\n Input,\n Output,\n EventEmitter,\n OnChanges,\n OnDestroy,\n AfterViewInit,\n ViewChild,\n SimpleChanges,\n} from '@angular/core'\nimport {\n SkillTreeEngine,\n type SkillGraph,\n type SkillNode,\n type NodeState,\n type Evidence,\n type ThemeInput,\n type LodThreshold,\n type NavigationFrame,\n} from '@expertrees/core'\n\n@Component({\n selector: 'expertree-canvas',\n standalone: true,\n template: `<canvas #canvas [style.width]=\"width\" [style.height]=\"height\" style=\"display:block\"></canvas>`,\n})\nexport class ExpertreeCanvasComponent implements AfterViewInit, OnChanges, OnDestroy {\n @Input() data!: SkillGraph\n @Input() theme?: ThemeInput\n @Input() lod?: LodThreshold[]\n @Input() initialContextNodeId?: string\n @Input() width = '100%'\n @Input() height = '100%'\n\n @Output() nodeClick = new EventEmitter<SkillNode>()\n @Output() nodeHover = new EventEmitter<SkillNode>()\n @Output() nodeBlur = new EventEmitter<SkillNode>()\n @Output() canvasClick = new EventEmitter<void>()\n @Output() zoomChange = new EventEmitter<number>()\n @Output() contextEnter = new EventEmitter<{ node: SkillNode; stack: readonly NavigationFrame[] }>()\n @Output() contextExit = new EventEmitter<{ frame: NavigationFrame; stack: readonly NavigationFrame[] }>()\n @Output() graphReady = new EventEmitter<SkillGraph>()\n\n @ViewChild('canvas') private canvasRef!: ElementRef<HTMLCanvasElement>\n\n private engine: SkillTreeEngine | null = null\n\n ngAfterViewInit(): void {\n this._createEngine()\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['data'] && !changes['data'].firstChange) {\n this._createEngine()\n }\n }\n\n ngOnDestroy(): void {\n this.engine?.dispose()\n }\n\n setNodeState(nodeId: string, state: NodeState): void {\n this.engine?.setNodeState(nodeId, state)\n }\n\n addEvidence(nodeId: string, evidence: Evidence): void {\n this.engine?.addEvidence(nodeId, evidence)\n }\n\n removeEvidence(nodeId: string, evidenceId: string): void {\n this.engine?.removeEvidence(nodeId, evidenceId)\n }\n\n updateTheme(theme: ThemeInput): void {\n this.engine?.updateTheme(theme)\n }\n\n zoomIn(): void { this.engine?.zoomIn() }\n zoomOut(): void { this.engine?.zoomOut() }\n goBack(): void { this.engine?.goBack() }\n enterContext(nodeId: string): void { this.engine?.enterContext(nodeId) }\n jumpToNavDepth(targetLength: number): void { this.engine?.jumpToNavDepth(targetLength) }\n getGraph(): SkillGraph { return this.engine?.getGraph() ?? this.data }\n getNavigationStack(): readonly NavigationFrame[] { return this.engine?.getNavigationStack() ?? [] }\n\n private _createEngine(): void {\n this.engine?.dispose()\n const canvas = this.canvasRef?.nativeElement\n if (!canvas) return\n\n this.engine = new SkillTreeEngine({\n canvas,\n data: this.data,\n ...(this.theme !== undefined && { theme: this.theme }),\n ...(this.lod !== undefined && { lod: this.lod }),\n ...(this.initialContextNodeId !== undefined && { initialContextNodeId: this.initialContextNodeId }),\n on: {\n 'node:click': (node) => this.nodeClick.emit(node),\n 'node:hover': (node) => this.nodeHover.emit(node),\n 'node:blur': (node) => this.nodeBlur.emit(node),\n 'canvas:click': () => this.canvasClick.emit(),\n 'zoom:change': (zoom) => this.zoomChange.emit(zoom),\n 'context:enter': (node, stack) => this.contextEnter.emit({ node, stack }),\n 'context:exit': (frame, stack) => this.contextExit.emit({ frame, stack }),\n 'graph:ready': (graph) => this.graphReady.emit(graph),\n },\n })\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { ExpertreeCanvasComponent } from './lib/expertree.component';
@@ -0,0 +1,44 @@
1
+ import { EventEmitter, OnChanges, OnDestroy, AfterViewInit, SimpleChanges } from '@angular/core';
2
+ import { type SkillGraph, type SkillNode, type NodeState, type Evidence, type ThemeInput, type LodThreshold, type NavigationFrame } from '@expertrees/core';
3
+ import * as i0 from "@angular/core";
4
+ export declare class ExpertreeCanvasComponent implements AfterViewInit, OnChanges, OnDestroy {
5
+ data: SkillGraph;
6
+ theme?: ThemeInput;
7
+ lod?: LodThreshold[];
8
+ initialContextNodeId?: string;
9
+ width: string;
10
+ height: string;
11
+ nodeClick: EventEmitter<SkillNode>;
12
+ nodeHover: EventEmitter<SkillNode>;
13
+ nodeBlur: EventEmitter<SkillNode>;
14
+ canvasClick: EventEmitter<void>;
15
+ zoomChange: EventEmitter<number>;
16
+ contextEnter: EventEmitter<{
17
+ node: SkillNode;
18
+ stack: readonly NavigationFrame[];
19
+ }>;
20
+ contextExit: EventEmitter<{
21
+ frame: NavigationFrame;
22
+ stack: readonly NavigationFrame[];
23
+ }>;
24
+ graphReady: EventEmitter<SkillGraph>;
25
+ private canvasRef;
26
+ private engine;
27
+ ngAfterViewInit(): void;
28
+ ngOnChanges(changes: SimpleChanges): void;
29
+ ngOnDestroy(): void;
30
+ setNodeState(nodeId: string, state: NodeState): void;
31
+ addEvidence(nodeId: string, evidence: Evidence): void;
32
+ removeEvidence(nodeId: string, evidenceId: string): void;
33
+ updateTheme(theme: ThemeInput): void;
34
+ zoomIn(): void;
35
+ zoomOut(): void;
36
+ goBack(): void;
37
+ enterContext(nodeId: string): void;
38
+ jumpToNavDepth(targetLength: number): void;
39
+ getGraph(): SkillGraph;
40
+ getNavigationStack(): readonly NavigationFrame[];
41
+ private _createEngine;
42
+ static ɵfac: i0.ɵɵFactoryDeclaration<ExpertreeCanvasComponent, never>;
43
+ static ɵcmp: i0.ɵɵComponentDeclaration<ExpertreeCanvasComponent, "expertree-canvas", never, { "data": { "alias": "data"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "lod": { "alias": "lod"; "required": false; }; "initialContextNodeId": { "alias": "initialContextNodeId"; "required": false; }; "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; }, { "nodeClick": "nodeClick"; "nodeHover": "nodeHover"; "nodeBlur": "nodeBlur"; "canvasClick": "canvasClick"; "zoomChange": "zoomChange"; "contextEnter": "contextEnter"; "contextExit": "contextExit"; "graphReady": "graphReady"; }, never, never, true, never>;
44
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@expertrees/angular",
3
+ "version": "0.1.0",
4
+ "description": "Angular component for @expertrees/core",
5
+ "license": "MIT",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "publishConfig": {
10
+ "access": "public"
11
+ },
12
+ "keywords": [
13
+ "knowledge-graph",
14
+ "skill-tree",
15
+ "angular",
16
+ "visualization"
17
+ ],
18
+ "scripts": {
19
+ "build": "ng-packagr -p ng-package.json",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "clean": "rm -rf dist"
23
+ },
24
+ "peerDependencies": {
25
+ "@angular/common": ">=17.0.0",
26
+ "@angular/core": ">=17.0.0",
27
+ "@expertrees/core": ">=0.1.0"
28
+ },
29
+ "devDependencies": {
30
+ "@angular/common": "^17.0.0",
31
+ "@angular/compiler": "^17.0.0",
32
+ "@angular/compiler-cli": "^17.0.0",
33
+ "@angular/core": "^17.0.0",
34
+ "@angular/platform-browser": "^17.3.12",
35
+ "@angular/platform-browser-dynamic": "^17.3.12",
36
+ "@expertrees/core": "*",
37
+ "happy-dom": "^20.8.4",
38
+ "ng-packagr": "^17.0.0",
39
+ "typescript": "^5.2.0",
40
+ "vitest": "^2.1.9",
41
+ "zone.js": "^0.16.1"
42
+ }
43
+ }