@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.
- package/dist/esm2022/expertrees-angular.mjs +5 -0
- package/dist/esm2022/index.mjs +2 -0
- package/dist/esm2022/lib/expertree.component.mjs +116 -0
- package/dist/fesm2022/expertrees-angular.mjs +123 -0
- package/dist/fesm2022/expertrees-angular.mjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/lib/expertree.component.d.ts +44 -0
- package/package.json +43 -0
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|