concepto-user-controls 0.0.18 → 0.0.19
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.
|
@@ -47,8 +47,8 @@ export class ConceptoContextMenuComponent {
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
onOptionClick(option) {
|
|
50
|
+
this.optionSelected.emit(option);
|
|
50
51
|
if (!option.children || option.children.length === 0) {
|
|
51
|
-
this.optionSelected.emit(option);
|
|
52
52
|
this.hide();
|
|
53
53
|
}
|
|
54
54
|
}
|
|
@@ -69,4 +69,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
69
69
|
type: HostListener,
|
|
70
70
|
args: ['document:click', ['$event']]
|
|
71
71
|
}] } });
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2VwdG8tY29udGV4dC1tZW51LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmNlcHRvLXVzZXItY29udHJvbHMvc3JjL2xpYi9jb25jZXB0by1jb250ZXh0LW1lbnUvY29uY2VwdG8tY29udGV4dC1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmNlcHRvLXVzZXItY29udHJvbHMvc3JjL2xpYi9jb25jZXB0by1jb250ZXh0LW1lbnUvY29uY2VwdG8tY29udGV4dC1tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBa0IvQyxNQUFNLE9BQU8sNEJBQTRCO0lBUW5CO0lBTlgsS0FBSyxHQUFpQixFQUFFLENBQUM7SUFDeEIsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFDMUQsUUFBUSxHQUFpQixFQUFFLENBQUM7SUFDNUIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUVyQixZQUFvQixLQUFpQjtRQUFqQixVQUFLLEdBQUwsS0FBSyxDQUFZO0lBQUcsQ0FBQztJQUV6QyxXQUFXO1FBQ1QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7UUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFR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UCxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOb2RlT3B0aW9uIHtcclxuICBOb2Rlc0lkOiBzdHJpbmc7XHJcbiAgTm9kZXNUZXh0OiBzdHJpbmc7XHJcbiAgTm9kZXNQYXJlbnRJZDogc3RyaW5nO1xyXG4gIE5vZGVzSW1nOiBzdHJpbmc7XHJcbiAgY2hpbGRyZW4/OiBOb2RlT3B0aW9uW107XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY29uY2VwdG8tY29udGV4dC1tZW51JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb25jZXB0by1jb250ZXh0LW1lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9jb25jZXB0by1jb250ZXh0LW1lbnUuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIENvbmNlcHRvQ29udGV4dE1lbnVDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoKSBub2RlczogTm9kZU9wdGlvbltdID0gW107XHJcbiAgQE91dHB1dCgpIG9wdGlvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxOb2RlT3B0aW9uPigpO1xyXG4gIG1lbnVUcmVlOiBOb2RlT3B0aW9uW10gPSBbXTtcclxuICB2aXNpYmxlID0gZmFsc2U7XHJcbiAgcG9zID0geyB4OiAwLCB5OiAwIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYpIHt9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIE5vZGVPcHRpb24+KCk7XHJcbiAgICB0aGlzLm5vZGVzLmZvckVhY2gobiA9PiBtYXAuc2V0KG4uTm9kZXNJZCwgeyAuLi5uLCBjaGlsZHJlbjogW10gfSkpO1xyXG5cclxuICAgIGNvbnN0IHJvb3RzOiBOb2RlT3B0aW9uW10gPSBbXTtcclxuICAgIG1hcC5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICBpZiAobi5Ob2Rlc1BhcmVudElkICYmIG1hcC5oYXMobi5Ob2Rlc1BhcmVudElkKSkge1xyXG4gICAgICAgIG1hcC5nZXQobi5Ob2Rlc1BhcmVudElkKT8uY2hpbGRyZW4/LnB1c2gobik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcm9vdHMucHVzaChuKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1lbnVUcmVlID0gcm9vdHM7XHJcbiAgfVxyXG5cclxuICBzaG93QXRFdmVudChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYO1xyXG4gICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFk7XHJcbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lbnUgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmNvbnRleHQtbWVudScpO1xyXG4gICAgICBjb25zdCByZWN0ID0gbWVudS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgdGhpcy5wb3MueCA9IHggKyByZWN0LndpZHRoID4gd2luZG93LmlubmVyV2lkdGggPyB3aW5kb3cuaW5uZXJXaWR0aCAtIHJlY3Qud2lkdGggLSAxMCA6IHg7XHJcbiAgICAgIHRoaXMucG9zLnkgPSB5ICsgcmVjdC5oZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQgPyB3aW5kb3cuaW5uZXJIZWlnaHQgLSByZWN0LmhlaWdodCAtIDEwIDogeTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaGlkZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uT3V0c2lkZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25PcHRpb25DbGljayhvcHRpb246IE5vZGVPcHRpb24pOiB2b2lkIHtcclxuICAgIHRoaXMub3B0aW9uU2VsZWN0ZWQuZW1pdChvcHRpb24pO1xyXG4gICAgaWYgKCFvcHRpb24uY2hpbGRyZW4gfHwgb3B0aW9uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhc0NoaWxkcmVuKG9wdGlvbjogTm9kZU9wdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhb3B0aW9uLmNoaWxkcmVuICYmIG9wdGlvbi5jaGlsZHJlbi5sZW5ndGggPiAwO1xyXG4gIH1cclxufVxyXG5cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRleHQtbWVudVwiICpuZ0lmPVwidmlzaWJsZVwiIFtuZ1N0eWxlXT1cInsgdG9wOiBwb3MueSArICdweCcsIGxlZnQ6IHBvcy54ICsgJ3B4JyB9XCI+XHJcbiAgICA8dWwgY2xhc3M9XCJtZW51LXJvb3RcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1lbnVUcmVlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW5kZXJOb2RlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3VsPlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjcmVuZGVyTm9kZSBsZXQtbm9kZT5cclxuICAgIDxsaSBjbGFzcz1cIm1lbnUtaXRlbVwiIFtjbGFzcy5oYXMtY2hpbGRyZW5dPVwiaGFzQ2hpbGRyZW4obm9kZSlcIj5cclxuICAgICAgICA8ZGl2IChjbGljayk9XCJvbk9wdGlvbkNsaWNrKG5vZGUpXCI+XHJcbiAgICAgICAgICAgIEBpZiAobm9kZS5Ob2Rlc0ltZykge1xyXG4gICAgICAgICAgICA8aW1nIFtzcmNdPVwibm9kZS5Ob2Rlc0ltZ1wiIGNsYXNzPVwiaWNvblwiIC8+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgQGlmICghbm9kZS5Ob2Rlc0ltZykge1xyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHt7IG5vZGUuTm9kZXNUZXh0IH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwic3VibWVudVwiICpuZ0lmPVwiaGFzQ2hpbGRyZW4obm9kZSlcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlblwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInJlbmRlck5vZGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBjaGlsZCB9XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICA8L2xpPlxyXG48L25nLXRlbXBsYXRlPiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concepto-user-controls.mjs","sources":["../../../projects/concepto-user-controls/src/lib/concepto-user-controls.service.ts","../../../projects/concepto-user-controls/src/lib/concepto-user-controls.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-message/concepto-message.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-message/concepto-message.component.html","../../../projects/concepto-user-controls/src/lib/concepto-context-menu/concepto-context-menu.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-context-menu/concepto-context-menu.component.html","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree-node.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree-options.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-expander/tree-node-expander.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-checkbox/tree-node-checkbox.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-content/tree-node-content.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/services/tree-drag-drop.service.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-drag.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-drop.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node/tree-node.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-viewport/tree-viewport.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-node-template.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-root/tree-root.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/concepto-tree.component.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/core/services/entity-comparison.service.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/components/entity-comparison.component.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/components/entity-comparison.component.html","../../../projects/concepto-user-controls/src/lib/concepto-input/concepto-input.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-input/concepto-input.component.html","../../../projects/concepto-user-controls/src/public-api.ts","../../../projects/concepto-user-controls/src/concepto-user-controls.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConceptoUserControlsService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-concepto-message',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <p>\r\n concepto-message works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class ConceptoUserControls {\r\n\r\n}\r\n","import { NgIf } from '@angular/common';\r\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\r\n\r\n\r\n@Component({\r\n selector: 'concepto-message',\r\n standalone: true,\r\n imports: [NgIf],\r\n templateUrl: './concepto-message.component.html',\r\n styleUrl: './concepto-message.component.css'\r\n})\r\nexport class ConceptoMessageComponent {\r\n @Input() title: string = 'Mensaje';\r\n @Input() message: string = 'Este es un mensaje';\r\n @Input() visible: boolean = false;\r\n\r\n @Output() closed = new EventEmitter<void>();\r\n @Output() accepted = new EventEmitter<void>();\r\n\r\n close() {\r\n this.closed.emit();\r\n }\r\n\r\n accept() {\r\n this.accepted.emit();\r\n }\r\n\r\n show() {\r\n this.visible = true;\r\n }\r\n}\r\n","<div class=\"modal-backdrop\" *ngIf=\"visible\">\r\n <div class=\"modal\">\r\n <div class=\"modal-header\">\r\n <h3>{{ title }}</h3>\r\n <button class=\"close-button\" (click)=\"close()\">×</button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <p>{{ message }}</p>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button (click)=\"accept()\">Aceptar</button>\r\n </div>\r\n </div>\r\n</div>","import { Component, ElementRef, EventEmitter, HostListener, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n\r\nexport interface NodeOption {\r\n NodesId: string;\r\n NodesText: string;\r\n NodesParentId: string;\r\n NodesImg: string;\r\n children?: NodeOption[];\r\n}\r\n\r\n@Component({\r\n selector: 'concepto-context-menu',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './concepto-context-menu.component.html',\r\n styleUrl: './concepto-context-menu.component.css'\r\n})\r\nexport class ConceptoContextMenuComponent {\r\n\r\n @Input() nodes: NodeOption[] = [];\r\n @Output() optionSelected = new EventEmitter<NodeOption>();\r\n menuTree: NodeOption[] = [];\r\n visible = false;\r\n pos = { x: 0, y: 0 };\r\n\r\n constructor(private elRef: ElementRef) {}\r\n\r\n ngOnChanges(): void {\r\n const map = new Map<string, NodeOption>();\r\n this.nodes.forEach(n => map.set(n.NodesId, { ...n, children: [] }));\r\n\r\n const roots: NodeOption[] = [];\r\n map.forEach(n => {\r\n if (n.NodesParentId && map.has(n.NodesParentId)) {\r\n map.get(n.NodesParentId)?.children?.push(n);\r\n } else {\r\n roots.push(n);\r\n }\r\n });\r\n this.menuTree = roots;\r\n }\r\n\r\n showAtEvent(event: MouseEvent): void {\r\n event.preventDefault();\r\n const x = event.clientX;\r\n const y = event.clientY;\r\n this.visible = true;\r\n setTimeout(() => {\r\n const menu = this.elRef.nativeElement.querySelector('.context-menu');\r\n const rect = menu.getBoundingClientRect();\r\n this.pos.x = x + rect.width > window.innerWidth ? window.innerWidth - rect.width - 10 : x;\r\n this.pos.y = y + rect.height > window.innerHeight ? window.innerHeight - rect.height - 10 : y;\r\n });\r\n }\r\n\r\n hide(): void {\r\n this.visible = false;\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onOutsideClick(event: MouseEvent): void {\r\n if (!this.elRef.nativeElement.contains(event.target)) {\r\n this.hide();\r\n }\r\n }\r\n\r\n onOptionClick(option: NodeOption): void {\r\n if (!option.children || option.children.length === 0) {\r\n this.optionSelected.emit(option);\r\n this.hide();\r\n }\r\n }\r\n\r\n hasChildren(option: NodeOption): boolean {\r\n return !!option.children && option.children.length > 0;\r\n }\r\n}\r\n\r\n","<div class=\"context-menu\" *ngIf=\"visible\" [ngStyle]=\"{ top: pos.y + 'px', left: pos.x + 'px' }\">\r\n <ul class=\"menu-root\">\r\n <ng-container *ngFor=\"let item of menuTree\">\r\n <ng-container *ngTemplateOutlet=\"renderNode; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n</div>\r\n\r\n<ng-template #renderNode let-node>\r\n <li class=\"menu-item\" [class.has-children]=\"hasChildren(node)\">\r\n <div (click)=\"onOptionClick(node)\">\r\n @if (node.NodesImg) {\r\n <img [src]=\"node.NodesImg\" class=\"icon\" />\r\n }\r\n @if (!node.NodesImg) {\r\n <div class=\"icon\"></div>\r\n }\r\n {{ node.NodesText }}\r\n </div>\r\n <ul class=\"submenu\" *ngIf=\"hasChildren(node)\">\r\n <ng-container *ngFor=\"let child of node.children\">\r\n <ng-container *ngTemplateOutlet=\"renderNode; context: { $implicit: child }\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n </li>\r\n</ng-template>","// lib/core/models/tree-node.model.ts\r\nimport { signal, computed, Signal } from '@angular/core';\r\nimport { TreeOptions } from './tree-options.model';\r\n\r\nexport interface TreeNodeData {\r\n id: string | number;\r\n [key: string]: any;\r\n}\r\n\r\nexport class TreeNode {\r\n // Signals for reactive state\r\n readonly isExpanded = signal(false);\r\n readonly isActive = signal(false);\r\n readonly isSelected = signal(false);\r\n readonly isFocused = signal(false);\r\n readonly isHidden = signal(false);\r\n readonly isLoading = signal(false);\r\n \r\n // Computed signals\r\n readonly isCollapsed = computed(() => !this.isExpanded());\r\n readonly isLeaf = computed(() => !this.hasChildren);\r\n readonly isVisible = computed(() => !this.isHidden());\r\n \r\n id: string | number;\r\n data: TreeNodeData;\r\n parent: TreeNode | null;\r\n children: TreeNode[] = [];\r\n level: number;\r\n path: Array<string | number>;\r\n index: number;\r\n hasChildren: boolean;\r\n icon?: string;\r\n \r\n constructor(\r\n data: TreeNodeData,\r\n parent: TreeNode | null,\r\n level: number,\r\n index: number,\r\n options: TreeOptions\r\n ) {\r\n this.data = data;\r\n this.parent = parent;\r\n this.level = level;\r\n this.index = index;\r\n this.id = data[options.idField || 'id'];\r\n this.icon = data[options.iconField || 'icon'];\r\n\r\n const childrenData = data[options.childrenField || 'children'];\r\n this.hasChildren = Array.isArray(childrenData) && childrenData.length > 0;\r\n \r\n // Initialize expanded state\r\n if (options.isExpandedField && data[options.isExpandedField]) {\r\n this.isExpanded.set(true);\r\n }\r\n \r\n // Build path\r\n this.path = parent ? [...parent.path, this.id] : [this.id];\r\n }\r\n \r\n // Actions\r\n expand(): void {\r\n if (this.hasChildren) {\r\n this.isExpanded.set(true);\r\n }\r\n }\r\n \r\n collapse(): void {\r\n this.isExpanded.set(false);\r\n }\r\n \r\n toggle(): void {\r\n this.isExpanded.update(value => !value);\r\n }\r\n \r\n setActive(value: boolean): void {\r\n this.isActive.set(value);\r\n }\r\n \r\n setSelected(value: boolean): void {\r\n this.isSelected.set(value);\r\n }\r\n \r\n setFocus(value: boolean): void {\r\n this.isFocused.set(value);\r\n }\r\n \r\n setHidden(value: boolean): void {\r\n this.isHidden.set(value);\r\n }\r\n \r\n setLoading(value: boolean): void {\r\n this.isLoading.set(value);\r\n }\r\n \r\n // Helper methods\r\n ensureVisible(): void {\r\n let node: TreeNode | null = this.parent;\r\n while (node) {\r\n node.expand();\r\n node = node.parent;\r\n }\r\n }\r\n \r\n setActiveAndVisible(): void {\r\n this.ensureVisible();\r\n this.setActive(true);\r\n }\r\n \r\n // Get all ancestors\r\n getAncestors(): TreeNode[] {\r\n const ancestors: TreeNode[] = [];\r\n let node: TreeNode | null = this.parent;\r\n while (node) {\r\n ancestors.unshift(node);\r\n node = node.parent;\r\n }\r\n return ancestors;\r\n }\r\n \r\n // Get all descendants\r\n getDescendants(): TreeNode[] {\r\n const descendants: TreeNode[] = [];\r\n const traverse = (node: TreeNode) => {\r\n node.children.forEach(child => {\r\n descendants.push(child);\r\n traverse(child);\r\n });\r\n };\r\n traverse(this);\r\n return descendants;\r\n }\r\n}","// lib/core/models/tree.model.ts\r\nimport { signal, computed, effect } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { TreeNode } from './tree-node.model';\r\nimport { TreeOptions } from './tree-options.model';\r\nimport { TreeEvent } from './tree-events.model';\r\n\r\nexport class TreeModel {\r\n // Reactive state with signals\r\n readonly roots = signal<TreeNode[]>([]);\r\n readonly focusedNodeId = signal<string | number | null>(null);\r\n readonly expandedNodeIds = signal<Set<string | number>>(new Set());\r\n readonly activeNodeIds = signal<Set<string | number>>(new Set());\r\n readonly selectedNodeIds = signal<Set<string | number>>(new Set());\r\n readonly hiddenNodeIds = signal<Set<string | number>>(new Set());\r\n \r\n // Computed signals\r\n readonly focusedNode = computed(() => {\r\n const id = this.focusedNodeId();\r\n return id ? this.getNodeById(id) : null;\r\n });\r\n \r\n readonly expandedNodes = computed(() => \r\n this.getAllNodes().filter(node => \r\n this.expandedNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly activeNodes = computed(() =>\r\n this.getAllNodes().filter(node =>\r\n this.activeNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly selectedNodes = computed(() =>\r\n this.getAllNodes().filter(node =>\r\n this.selectedNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly visibleNodes = computed(() =>\r\n this.getAllNodes().filter(node => !node.isHidden())\r\n );\r\n \r\n readonly flattenedNodes = computed(() => {\r\n const flattened: TreeNode[] = [];\r\n const traverse = (nodes: TreeNode[]) => {\r\n nodes.forEach(node => {\r\n if (!node.isHidden()) {\r\n flattened.push(node);\r\n if (node.isExpanded() && node.children.length > 0) {\r\n traverse(node.children);\r\n }\r\n }\r\n });\r\n };\r\n traverse(this.roots());\r\n return flattened;\r\n });\r\n \r\n // Event streams\r\n readonly events$ = new Subject<TreeEvent>();\r\n \r\n // Virtual root for unified handling\r\n virtualRoot: TreeNode | null = null;\r\n \r\n // Node registry for quick lookup\r\n private nodeRegistry = new Map<string | number, TreeNode>();\r\n \r\n constructor(public options: TreeOptions) {\r\n // Constructor sin effects - se sincronizan en las operaciones\r\n }\r\n \r\n // Data management\r\n setData(data: any[]): void {\r\n this.nodeRegistry.clear();\r\n const roots = this.buildNodes(data, null, 0);\r\n this.roots.set(roots);\r\n this.emitEvent({ type: 'initialized', treeModel: this });\r\n }\r\n \r\n private buildNodes(\r\n data: any[],\r\n parent: TreeNode | null,\r\n level: number\r\n ): TreeNode[] {\r\n return data.map((item, index) => {\r\n const node = new TreeNode(item, parent, level, index, this.options);\r\n this.nodeRegistry.set(node.id, node);\r\n \r\n // Recursively build children\r\n const childrenData = item[this.options.childrenField || 'children'];\r\n if (Array.isArray(childrenData) && childrenData.length > 0) {\r\n node.children = this.buildNodes(childrenData, node, level + 1);\r\n }\r\n \r\n return node;\r\n });\r\n }\r\n \r\n update(): void {\r\n // Trigger change detection by creating new signal values\r\n this.roots.set([...this.roots()]);\r\n this.emitEvent({ type: 'update', treeModel: this });\r\n }\r\n \r\n // Node lookup\r\n getNodeById(id: string | number): TreeNode | null {\r\n return this.nodeRegistry.get(id) || null;\r\n }\r\n \r\n getNodeBy(predicate: (node: TreeNode) => boolean): TreeNode | null {\r\n return this.getAllNodes().find(predicate) || null;\r\n }\r\n \r\n getAllNodes(): TreeNode[] {\r\n const nodes: TreeNode[] = [];\r\n const traverse = (nodeList: TreeNode[]) => {\r\n nodeList.forEach(node => {\r\n nodes.push(node);\r\n if (node.children.length > 0) {\r\n traverse(node.children);\r\n }\r\n });\r\n };\r\n traverse(this.roots());\r\n return nodes;\r\n }\r\n \r\n // Navigation\r\n focusNode(node: TreeNode | null): void {\r\n if (this.focusedNode()) {\r\n this.focusedNode()!.setFocus(false);\r\n }\r\n if (node) {\r\n this.focusedNodeId.set(node.id);\r\n node.setFocus(true);\r\n this.emitEvent({ type: 'focus', node });\r\n } else {\r\n this.focusedNodeId.set(null);\r\n }\r\n }\r\n \r\n focusNextNode(): void {\r\n const flattened = this.flattenedNodes();\r\n const currentIndex = flattened.findIndex(\r\n n => n.id === this.focusedNodeId()\r\n );\r\n if (currentIndex < flattened.length - 1) {\r\n this.focusNode(flattened[currentIndex + 1]);\r\n }\r\n }\r\n \r\n focusPreviousNode(): void {\r\n const flattened = this.flattenedNodes();\r\n const currentIndex = flattened.findIndex(\r\n n => n.id === this.focusedNodeId()\r\n );\r\n if (currentIndex > 0) {\r\n this.focusNode(flattened[currentIndex - 1]);\r\n }\r\n }\r\n \r\n focusDrillDown(): void {\r\n const focused = this.focusedNode();\r\n if (focused) {\r\n if (!focused.isExpanded() && focused.hasChildren) {\r\n focused.expand();\r\n } else if (focused.children.length > 0) {\r\n this.focusNode(focused.children[0]);\r\n }\r\n }\r\n }\r\n \r\n focusDrillUp(): void {\r\n const focused = this.focusedNode();\r\n if (focused) {\r\n if (focused.isExpanded() && focused.hasChildren) {\r\n focused.collapse();\r\n } else if (focused.parent) {\r\n this.focusNode(focused.parent);\r\n }\r\n }\r\n }\r\n \r\n // Operations\r\n expandAll(): void {\r\n const ids = new Set(this.getAllNodes().map(n => n.id));\r\n this.expandedNodeIds.set(ids);\r\n this.emitEvent({ type: 'expandAll', treeModel: this });\r\n }\r\n \r\n collapseAll(): void {\r\n this.expandedNodeIds.set(new Set());\r\n this.emitEvent({ type: 'collapseAll', treeModel: this });\r\n }\r\n \r\n expandNode(node: TreeNode): void {\r\n this.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.add(node.id);\r\n return newIds;\r\n });\r\n node.isExpanded.set(true);\r\n this.emitEvent({ type: 'expand', node });\r\n }\r\n\r\n collapseNode(node: TreeNode): void {\r\n this.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.delete(node.id);\r\n return newIds;\r\n });\r\n node.isExpanded.set(false);\r\n this.emitEvent({ type: 'collapse', node });\r\n }\r\n\r\n activateNode(node: TreeNode, multi: boolean = false): void {\r\n if (!multi) {\r\n this.activeNodeIds.set(new Set([node.id]));\r\n this.getAllNodes().forEach(n => n.isActive.set(n.id === node.id));\r\n } else {\r\n this.activeNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.add(node.id);\r\n return newIds;\r\n });\r\n node.isActive.set(true);\r\n }\r\n this.emitEvent({ type: 'activate', node });\r\n }\r\n \r\n deactivateNode(node: TreeNode): void {\r\n this.activeNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.delete(node.id);\r\n return newIds;\r\n });\r\n node.isActive.set(false);\r\n this.emitEvent({ type: 'deactivate', node });\r\n }\r\n \r\n selectNode(node: TreeNode, multi: boolean = false): void {\r\n if (!multi) {\r\n this.selectedNodeIds.set(new Set([node.id]));\r\n } else {\r\n this.selectedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n if (ids.has(node.id)) {\r\n newIds.delete(node.id);\r\n } else {\r\n newIds.add(node.id);\r\n }\r\n return newIds;\r\n });\r\n }\r\n this.emitEvent({ type: 'select', node });\r\n }\r\n \r\n // Filtering\r\n filterNodes(filterFn: (node: TreeNode) => boolean, autoShow = true): void {\r\n const hiddenIds = new Set<string | number>();\r\n \r\n this.getAllNodes().forEach(node => {\r\n const matches = filterFn(node);\r\n if (!matches) {\r\n hiddenIds.add(node.id);\r\n } else if (autoShow) {\r\n // Show ancestors of matching nodes\r\n node.getAncestors().forEach(ancestor => {\r\n hiddenIds.delete(ancestor.id);\r\n });\r\n }\r\n });\r\n \r\n this.hiddenNodeIds.set(hiddenIds);\r\n this.emitEvent({ type: 'filter', treeModel: this });\r\n }\r\n \r\n clearFilter(): void {\r\n this.hiddenNodeIds.set(new Set());\r\n this.emitEvent({ type: 'clearFilter', treeModel: this });\r\n }\r\n \r\n // Drag & Drop\r\n canMoveNode(\r\n node: TreeNode,\r\n to: { parent: TreeNode; index: number }\r\n ): boolean {\r\n // Prevent moving to itself or descendants\r\n if (node === to.parent) return false;\r\n if (to.parent.getAncestors().includes(node)) return false;\r\n \r\n // Custom validation\r\n if (this.options.allowDrop) {\r\n if (typeof this.options.allowDrop === 'function') {\r\n return this.options.allowDrop(node, to);\r\n }\r\n return this.options.allowDrop;\r\n }\r\n \r\n return true;\r\n }\r\n \r\n moveNode(node: TreeNode, to: { parent: TreeNode; index: number }): void {\r\n if (!this.canMoveNode(node, to)) return;\r\n\r\n // Remove from old parent\r\n if (node.parent) {\r\n const oldIndex = node.parent.children.indexOf(node);\r\n if (oldIndex !== -1) {\r\n // Create new array to trigger change detection\r\n node.parent.children = [\r\n ...node.parent.children.slice(0, oldIndex),\r\n ...node.parent.children.slice(oldIndex + 1)\r\n ];\r\n }\r\n } else {\r\n // Handle root nodes\r\n const rootIndex = this.roots().indexOf(node);\r\n if (rootIndex !== -1) {\r\n this.roots.set([\r\n ...this.roots().slice(0, rootIndex),\r\n ...this.roots().slice(rootIndex + 1)\r\n ]);\r\n }\r\n }\r\n\r\n // Add to new parent - create new array to trigger change detection\r\n const newChildren = [...to.parent.children];\r\n newChildren.splice(to.index, 0, node);\r\n to.parent.children = newChildren;\r\n node.parent = to.parent;\r\n\r\n // Update levels\r\n this.updateNodeLevels(node);\r\n\r\n this.emitEvent({ type: 'moveNode', node, to });\r\n this.update();\r\n }\r\n \r\n private updateNodeLevels(node: TreeNode): void {\r\n const newLevel = node.parent ? node.parent.level + 1 : 0;\r\n node.level = newLevel;\r\n \r\n node.children.forEach(child => this.updateNodeLevels(child));\r\n }\r\n \r\n // Async children loading\r\n async loadChildren(node: TreeNode): Promise<void> {\r\n if (!this.options.getChildren) return;\r\n \r\n node.setLoading(true);\r\n \r\n try {\r\n const childrenData = await this.options.getChildren(node);\r\n node.children = this.buildNodes(childrenData, node, node.level + 1);\r\n node.hasChildren = node.children.length > 0;\r\n \r\n this.emitEvent({ type: 'loadChildren', node });\r\n this.update();\r\n } catch (error) {\r\n this.emitEvent({ type: 'loadChildrenError', node, error });\r\n } finally {\r\n node.setLoading(false);\r\n }\r\n }\r\n \r\n // Events\r\n private emitEvent(event: TreeEvent): void {\r\n this.events$.next(event);\r\n }\r\n}","// lib/core/models/tree-options.model.ts\r\nimport { TreeNode } from './tree-node.model';\r\n\r\nexport interface TreeOptions {\r\n // Field mappings\r\n idField?: string;\r\n childrenField?: string;\r\n displayField?: string;\r\n isExpandedField?: string;\r\n hasChildrenField?: string;\r\n iconField?: string;\r\n \r\n // Behavior\r\n allowDrag?: boolean | ((node: TreeNode) => boolean);\r\n allowDrop?: boolean | ((node: TreeNode, to: any) => boolean);\r\n useCheckbox?: boolean;\r\n useTriState?: boolean;\r\n levelPadding?: number;\r\n \r\n // Virtual scroll\r\n useVirtualScroll?: boolean;\r\n nodeHeight?: number | ((node: TreeNode) => number);\r\n scrollContainerHeight?: number;\r\n bufferAmount?: number;\r\n \r\n // Async loading\r\n getChildren?: (node: TreeNode) => Promise<any[]>;\r\n \r\n // Animations\r\n animateExpand?: boolean;\r\n animateSpeed?: number;\r\n animateAcceleration?: number;\r\n \r\n // Scroll behavior\r\n scrollOnActivate?: boolean;\r\n scrollContainer?: HTMLElement;\r\n \r\n // Keyboard\r\n rtl?: boolean;\r\n \r\n // Selection\r\n multiSelect?: boolean;\r\n useMetaKey?: boolean;\r\n}\r\n\r\nexport const DEFAULT_TREE_OPTIONS: TreeOptions = {\r\n idField: 'id',\r\n childrenField: 'children',\r\n displayField: 'name',\r\n isExpandedField: 'isExpanded',\r\n hasChildrenField: 'hasChildren',\r\n iconField: 'icon',\r\n allowDrag: false,\r\n allowDrop: false,\r\n useCheckbox: false,\r\n useTriState: false,\r\n levelPadding: 20,\r\n useVirtualScroll: false,\r\n nodeHeight: 22,\r\n bufferAmount: 5,\r\n animateExpand: false,\r\n animateSpeed: 1,\r\n animateAcceleration: 1.2,\r\n scrollOnActivate: true,\r\n rtl: false,\r\n multiSelect: false,\r\n useMetaKey: true,\r\n};","// lib/components/tree-node-expander/tree-node-expander.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-expander',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"tree-node-expander\"\r\n [class.tree-node-expander-loading]=\"node.isLoading()\"\r\n (click)=\"onExpanderClick($event)\">\r\n @if (node.isLoading()) {\r\n <span class=\"expander-spinner\"></span>\r\n } @else if (node.hasChildren) {\r\n <svg \r\n class=\"expander-icon\"\r\n [class.expander-icon-expanded]=\"node.isExpanded()\"\r\n width=\"16\" \r\n height=\"16\" \r\n viewBox=\"0 0 16 16\">\r\n <path d=\"M6 4l4 4-4 4\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n stroke-width=\"2\" \r\n stroke-linecap=\"round\"/>\r\n </svg>\r\n } @else {\r\n <span class=\"expander-placeholder\"></span>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node-expander {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n border-radius: 3px;\r\n transition: background-color 0.15s;\r\n flex-shrink: 0;\r\n }\r\n \r\n .tree-node-expander:hover {\r\n background-color: rgba(0, 0, 0, 0.05);\r\n }\r\n \r\n .expander-icon {\r\n transition: transform 0.2s ease;\r\n transform: rotate(0deg);\r\n }\r\n \r\n .expander-icon-expanded {\r\n transform: rotate(90deg);\r\n }\r\n \r\n .expander-placeholder {\r\n width: 16px;\r\n height: 16px;\r\n }\r\n \r\n .expander-spinner {\r\n display: inline-block;\r\n width: 14px;\r\n height: 14px;\r\n border: 2px solid #f3f3f3;\r\n border-top: 2px solid #2196f3;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n})\r\nexport class TreeNodeExpanderComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Output() toggle = new EventEmitter<void>();\r\n \r\n onExpanderClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.toggle.emit();\r\n }\r\n}","// lib/components/tree-node-checkbox/tree-node-checkbox.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-checkbox',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"tree-node-checkbox\"\r\n (click)=\"onCheckboxClick($event)\">\r\n <input \r\n type=\"checkbox\"\r\n [checked]=\"isChecked()\"\r\n [indeterminate]=\"isIndeterminate()\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (click)=\"$event.stopPropagation()\">\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node-checkbox {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n flex-shrink: 0;\r\n }\r\n \r\n input[type=\"checkbox\"] {\r\n cursor: pointer;\r\n width: 16px;\r\n height: 16px;\r\n margin: 0;\r\n }\r\n `],\r\n})\r\nexport class TreeNodeCheckboxComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input() useTriState = false;\r\n @Output() change = new EventEmitter<boolean>();\r\n \r\n readonly isChecked = computed(() => {\r\n return this.treeModel.selectedNodeIds().has(this.node.id);\r\n });\r\n \r\n readonly isIndeterminate = computed(() => {\r\n if (!this.useTriState || !this.node.hasChildren) {\r\n return false;\r\n }\r\n \r\n const selectedIds = this.treeModel.selectedNodeIds();\r\n const descendants = this.node.getDescendants();\r\n \r\n if (descendants.length === 0) return false;\r\n \r\n const selectedCount = descendants.filter(d => \r\n selectedIds.has(d.id)\r\n ).length;\r\n \r\n return selectedCount > 0 && selectedCount < descendants.length;\r\n });\r\n \r\n onCheckboxClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n }\r\n \r\n onCheckboxChange(event: Event): void {\r\n event.stopPropagation();\r\n const checked = (event.target as HTMLInputElement).checked;\r\n \r\n if (this.useTriState) {\r\n // Update node and all descendants\r\n this.updateNodeAndDescendants(this.node, checked);\r\n } else {\r\n this.change.emit(checked);\r\n }\r\n }\r\n \r\n private updateNodeAndDescendants(node: TreeNode, checked: boolean): void {\r\n this.treeModel.selectedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n \r\n if (checked) {\r\n newIds.add(node.id);\r\n node.getDescendants().forEach(d => newIds.add(d.id));\r\n } else {\r\n newIds.delete(node.id);\r\n node.getDescendants().forEach(d => newIds.delete(d.id));\r\n }\r\n \r\n return newIds;\r\n });\r\n \r\n this.change.emit(checked);\r\n }\r\n}","// lib/components/tree-node-content/tree-node-content.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-content',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n @if (template) {\r\n <ng-container\r\n *ngTemplateOutlet=\"template; context: templateContext\">\r\n </ng-container>\r\n } @else {\r\n <span class=\"tree-node-content-default\">\r\n @if (node.icon) {\r\n <img [src]=\"node.icon\" alt=\"\" class=\"tree-node-icon\" />\r\n }\r\n <span class=\"tree-node-text\">{{ node.data[displayField] }}</span>\r\n </span>\r\n }\r\n `,\r\n styles: [`\r\n .tree-node-content-default {\r\n flex: 1;\r\n padding: 0 4px;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n overflow: hidden;\r\n user-select: none;\r\n }\r\n\r\n .tree-node-icon {\r\n width: 16px;\r\n height: 16px;\r\n flex-shrink: 0;\r\n object-fit: contain;\r\n }\r\n\r\n .tree-node-text {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n `],\r\n})\r\nexport class TreeNodeContentComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input() template?: TemplateRef<any>;\r\n @Input() displayField = 'name';\r\n \r\n NgOnInit(){\r\n }\r\n\r\n get templateContext() {\r\n return {\r\n $implicit: this.node,\r\n node: this.node,\r\n treeModel: this.treeModel,\r\n };\r\n }\r\n}","// lib/core/services/tree-drag-drop.service.ts\r\nimport { Injectable, signal } from '@angular/core';\r\nimport { TreeNode } from '../models/tree-node.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TreeDragDropService {\r\n private readonly draggedNode = signal<TreeNode | null>(null);\r\n \r\n setDraggedNode(node: TreeNode): void {\r\n this.draggedNode.set(node);\r\n }\r\n \r\n getDraggedNode(): TreeNode | null {\r\n return this.draggedNode();\r\n }\r\n \r\n clearDraggedNode(): void {\r\n this.draggedNode.set(null);\r\n }\r\n \r\n isDragging(): boolean {\r\n return this.draggedNode() !== null;\r\n }\r\n}","// lib/directives/tree-drag.directive.ts\r\nimport {\r\n Directive,\r\n Input,\r\n HostListener,\r\n HostBinding,\r\n ElementRef,\r\n inject, // Add inject\r\n} from '@angular/core';\r\nimport { TreeNode } from '../core/models/tree-node.model';\r\nimport { TreeModel } from '../core/models/tree.model';\r\nimport { TreeOptions } from '../core/models/tree-options.model';\r\nimport { TreeDragDropService } from '../core/services/tree-drag-drop.service';\r\n\r\n@Directive({\r\n selector: '[treeDrag]',\r\n standalone: true,\r\n})\r\nexport class TreeDragDirective {\r\n @Input({ required: true, alias: 'treeDrag' }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n \r\n // Use inject() function instead of constructor injection\r\n private readonly elementRef = inject(ElementRef);\r\n private readonly dragDropService = inject(TreeDragDropService);\r\n \r\n @HostBinding('attr.draggable')\r\n get draggable(): boolean {\r\n if (typeof this.options.allowDrag === 'function') {\r\n return this.options.allowDrag(this.node);\r\n }\r\n return this.options.allowDrag || false;\r\n }\r\n \r\n @HostListener('dragstart', ['$event'])\r\n onDragStart(event: DragEvent): void {\r\n if (!this.draggable) {\r\n event.preventDefault();\r\n return;\r\n }\r\n \r\n this.dragDropService.setDraggedNode(this.node);\r\n \r\n if (event.dataTransfer) {\r\n event.dataTransfer.effectAllowed = 'move';\r\n event.dataTransfer.setData('text/plain', this.node.id.toString());\r\n \r\n // Create drag image\r\n const dragImage = this.elementRef.nativeElement.cloneNode(true) as HTMLElement;\r\n dragImage.style.opacity = '0.7';\r\n document.body.appendChild(dragImage);\r\n event.dataTransfer.setDragImage(dragImage, 0, 0);\r\n \r\n setTimeout(() => document.body.removeChild(dragImage), 0);\r\n }\r\n \r\n this.elementRef.nativeElement.classList.add('tree-node-dragging');\r\n }\r\n \r\n @HostListener('dragend', ['$event'])\r\n onDragEnd(event: DragEvent): void {\r\n this.dragDropService.clearDraggedNode();\r\n this.elementRef.nativeElement.classList.remove('tree-node-dragging');\r\n }\r\n}","// lib/directives/tree-drop.directive.ts\r\nimport {\r\n Directive,\r\n Input,\r\n HostListener,\r\n HostBinding,\r\n ElementRef,\r\n signal,\r\n inject, // Add inject\r\n} from '@angular/core';\r\nimport { TreeNode } from '../core/models/tree-node.model';\r\nimport { TreeModel } from '../core/models/tree.model';\r\nimport { TreeOptions } from '../core/models/tree-options.model';\r\nimport { TreeDragDropService } from '../core/services/tree-drag-drop.service';\r\n\r\ntype DropPosition = 'before' | 'after' | 'inside';\r\n\r\n@Directive({\r\n selector: '[treeDrop]',\r\n standalone: true,\r\n})\r\nexport class TreeDropDirective {\r\n @Input({ required: true, alias: 'treeDrop' }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() dropPosition: DropPosition = 'inside';\r\n \r\n // Use inject() function instead of constructor injection\r\n private readonly elementRef = inject(ElementRef);\r\n private readonly dragDropService = inject(TreeDragDropService);\r\n \r\n readonly isDraggingOver = signal(false);\r\n readonly canDrop = signal(false);\r\n \r\n @HostBinding('class.tree-drop-target')\r\n get isDropTarget(): boolean {\r\n return this.isDraggingOver() && this.canDrop();\r\n }\r\n \r\n @HostBinding('class.tree-drop-disabled')\r\n get isDropDisabled(): boolean {\r\n return this.isDraggingOver() && !this.canDrop();\r\n }\r\n \r\n @HostListener('dragenter', ['$event'])\r\n onDragEnter(event: DragEvent): void {\r\n event.preventDefault();\r\n \r\n const draggedNode = this.dragDropService.getDraggedNode();\r\n if (!draggedNode) return;\r\n \r\n this.isDraggingOver.set(true);\r\n \r\n const dropTarget = this.getDropTarget();\r\n const canDrop = this.treeModel.canMoveNode(draggedNode, dropTarget);\r\n this.canDrop.set(canDrop);\r\n \r\n if (canDrop && event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n \r\n @HostListener('dragover', ['$event'])\r\n onDragOver(event: DragEvent): void {\r\n if (this.canDrop()) {\r\n event.preventDefault();\r\n if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n }\r\n \r\n @HostListener('dragleave', ['$event'])\r\n onDragLeave(event: DragEvent): void {\r\n // Check if we're really leaving (not just entering a child element)\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const x = event.clientX;\r\n const y = event.clientY;\r\n \r\n if (x < rect.left || x >= rect.right || y < rect.top || y >= rect.bottom) {\r\n this.isDraggingOver.set(false);\r\n this.canDrop.set(false);\r\n }\r\n }\r\n \r\n @HostListener('drop', ['$event'])\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n \r\n const draggedNode = this.dragDropService.getDraggedNode();\r\n if (!draggedNode || !this.canDrop()) return;\r\n \r\n const dropTarget = this.getDropTarget();\r\n this.treeModel.moveNode(draggedNode, dropTarget);\r\n \r\n this.isDraggingOver.set(false);\r\n this.canDrop.set(false);\r\n this.dragDropService.clearDraggedNode();\r\n }\r\n \r\n private getDropTarget(): { parent: TreeNode; index: number } {\r\n switch (this.dropPosition) {\r\n case 'before':\r\n return {\r\n parent: this.node.parent!,\r\n index: this.node.index,\r\n };\r\n case 'after':\r\n return {\r\n parent: this.node.parent!,\r\n index: this.node.index + 1,\r\n };\r\n case 'inside':\r\n default:\r\n return {\r\n parent: this.node,\r\n index: this.node.children.length,\r\n };\r\n }\r\n }\r\n}","// lib/components/tree-node/tree-node.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { trigger, state, style, transition, animate } from '@angular/animations';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeOptions } from '../../core/models/tree-options.model';\r\nimport { TreeNodeExpanderComponent } from '../tree-node-expander/tree-node-expander.component';\r\nimport { TreeNodeCheckboxComponent } from '../tree-node-checkbox/tree-node-checkbox.component';\r\nimport { TreeNodeContentComponent } from '../tree-node-content/tree-node-content.component';\r\nimport { TreeDragDirective } from '../../directives/tree-drag.directive';\r\nimport { TreeDropDirective } from '../../directives/tree-drop.directive';\r\n\r\n@Component({\r\n selector: 'tree-node',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TreeNodeExpanderComponent,\r\n TreeNodeCheckboxComponent,\r\n TreeNodeContentComponent,\r\n TreeDragDirective,\r\n TreeDropDirective,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"tree-node\"\r\n [attr.data-node-id]=\"node.id\"\r\n [class.tree-node-expanded]=\"node.isExpanded()\"\r\n [class.tree-node-collapsed]=\"node.isCollapsed()\"\r\n [class.tree-node-active]=\"node.isActive()\"\r\n [class.tree-node-focused]=\"node.isFocused()\"\r\n [class.tree-node-leaf]=\"node.isLeaf()\"\r\n [class.tree-node-loading]=\"node.isLoading()\"\r\n [style.padding-left.px]=\"paddingLeft()\">\r\n \r\n <div class=\"tree-node-wrapper\"\r\n [treeDrag]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\">\r\n \r\n <!-- Drop zone before node -->\r\n <div class=\"tree-node-drop-slot tree-node-drop-slot-before\"\r\n [treeDrop]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [dropPosition]=\"'before'\"\r\n [options]=\"options\">\r\n </div>\r\n \r\n <!-- Node content wrapper -->\r\n <div class=\"tree-node-content-wrapper\"\r\n (click)=\"onNodeClick($event)\"\r\n (dblclick)=\"onNodeDoubleClick($event)\"\r\n (contextmenu)=\"onNodeContextMenu($event)\">\r\n \r\n <!-- Expander -->\r\n @if (node.hasChildren) {\r\n <tree-node-expander\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n (toggle)=\"onToggleExpanded()\">\r\n </tree-node-expander>\r\n }\r\n \r\n <!-- Checkbox -->\r\n @if (options.useCheckbox) {\r\n <tree-node-checkbox\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [useTriState]=\"options.useTriState ?? false\"\r\n (change)=\"onCheckboxChange($event)\">\r\n </tree-node-checkbox>\r\n }\r\n \r\n <!-- Content -->\r\n <tree-node-content\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [template]=\"nodeTemplate\"\r\n [displayField]=\"options.displayField || 'name'\">\r\n </tree-node-content>\r\n </div>\r\n \r\n <!-- Drop zone after node -->\r\n <div class=\"tree-node-drop-slot tree-node-drop-slot-after\"\r\n [treeDrop]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [dropPosition]=\"'after'\"\r\n [options]=\"options\">\r\n </div>\r\n </div>\r\n \r\n <!-- Children container -->\r\n @if (node.isExpanded() && node.children.length > 0) {\r\n <div class=\"tree-node-children\"\r\n [@expandCollapse]=\"node.isExpanded() ? 'expanded' : 'collapsed'\">\r\n @for (child of node.children; track child.id) {\r\n <tree-node\r\n [node]=\"child\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\"\r\n [nodeTemplate]=\"nodeTemplate\">\r\n </tree-node>\r\n }\r\n </div>\r\n }\r\n \r\n <!-- Loading indicator -->\r\n @if (node.isLoading()) {\r\n <div class=\"tree-node-loading\">\r\n <span class=\"loading-spinner\"></span>\r\n Loading...\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node {\r\n position: relative;\r\n }\r\n \r\n .tree-node-wrapper {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n min-height: 22px;\r\n }\r\n \r\n .tree-node-content-wrapper {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n cursor: pointer;\r\n border-radius: 3px;\r\n padding: 2px 4px;\r\n transition: background-color 0.15s;\r\n }\r\n \r\n .tree-node-content-wrapper:hover {\r\n background-color: #f5f5f5;\r\n }\r\n \r\n .tree-node-active .tree-node-content-wrapper {\r\n background-color: #e3f2fd;\r\n }\r\n \r\n .tree-node-focused .tree-node-content-wrapper {\r\n outline: 2px solid #2196f3;\r\n outline-offset: -2px;\r\n }\r\n \r\n .tree-node-children {\r\n overflow: hidden;\r\n }\r\n \r\n .tree-node-drop-slot {\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n height: 2px;\r\n z-index: 10;\r\n }\r\n \r\n .tree-node-drop-slot-before {\r\n top: -1px;\r\n }\r\n \r\n .tree-node-drop-slot-after {\r\n bottom: -1px;\r\n }\r\n \r\n .tree-node-loading {\r\n padding: 8px 24px;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n color: #666;\r\n font-size: 14px;\r\n }\r\n \r\n .loading-spinner {\r\n display: inline-block;\r\n width: 16px;\r\n height: 16px;\r\n border: 2px solid #f3f3f3;\r\n border-top: 2px solid #2196f3;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n animations: [\r\n trigger('expandCollapse', [\r\n state('collapsed', style({\r\n height: '0',\r\n overflow: 'hidden',\r\n opacity: '0'\r\n })),\r\n state('expanded', style({\r\n height: '*',\r\n overflow: 'visible',\r\n opacity: '1'\r\n })),\r\n transition('collapsed <=> expanded', [\r\n animate('200ms ease-in-out')\r\n ])\r\n ])\r\n ],\r\n})\r\nexport class TreeNodeComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() nodeTemplate?: TemplateRef<any>;\r\n \r\n readonly paddingLeft = computed(() => {\r\n return this.options.levelPadding || 40;\r\n });\r\n \r\n onNodeClick(event: MouseEvent): void {\r\n const useMetaKey = this.options.useMetaKey !== false;\r\n const multiSelect = this.options.multiSelect || false;\r\n \r\n const isMetaKeyPressed = event.ctrlKey || event.metaKey;\r\n const shouldMultiSelect = multiSelect && (!useMetaKey || isMetaKeyPressed);\r\n \r\n this.treeModel.activateNode(this.node, shouldMultiSelect);\r\n this.treeModel.focusNode(this.node);\r\n }\r\n \r\n onNodeDoubleClick(event: MouseEvent): void {\r\n if (this.node.hasChildren) {\r\n this.node.toggle();\r\n this.treeModel.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n if (this.node.isExpanded()) {\r\n newIds.add(this.node.id);\r\n } else {\r\n newIds.delete(this.node.id);\r\n }\r\n return newIds;\r\n });\r\n }\r\n }\r\n \r\n onNodeContextMenu(event: MouseEvent): void {\r\n event.preventDefault();\r\n // Emit context menu event\r\n }\r\n \r\n onToggleExpanded(): void {\r\n if (this.node.hasChildren) {\r\n this.node.toggle();\r\n \r\n if (this.node.isExpanded()) {\r\n // Load children if needed\r\n if (this.options.getChildren && this.node.children.length === 0) {\r\n this.treeModel.loadChildren(this.node);\r\n }\r\n this.treeModel.expandNode(this.node);\r\n } else {\r\n this.treeModel.collapseNode(this.node);\r\n }\r\n }\r\n }\r\n \r\n onCheckboxChange(checked: boolean): void {\r\n this.treeModel.selectNode(this.node, this.options.multiSelect || false);\r\n }\r\n}","// lib/components/tree-viewport/tree-viewport.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n OnInit,\r\n OnDestroy,\r\n ViewChild,\r\n ElementRef,\r\n ChangeDetectionStrategy,\r\n signal,\r\n computed,\r\n TemplateRef,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeOptions } from '../../core/models/tree-options.model';\r\nimport { TreeNodeComponent } from '../tree-node/tree-node.component';\r\nimport { fromEvent, Subject, takeUntil } from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'tree-viewport',\r\n standalone: true,\r\n imports: [CommonModule, TreeNodeComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div \r\n #scrollContainer\r\n class=\"tree-viewport-container\"\r\n [style.height.px]=\"options.scrollContainerHeight || 400\"\r\n (scroll)=\"onScroll()\">\r\n \r\n <div class=\"tree-viewport-content\"\r\n [style.height.px]=\"totalHeight()\">\r\n \r\n <div class=\"tree-viewport-padding-top\"\r\n [style.height.px]=\"paddingTop()\">\r\n </div>\r\n \r\n @for (node of visibleNodes(); track node.id) {\r\n <tree-node\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\"\r\n [nodeTemplate]=\"nodeTemplate\">\r\n </tree-node>\r\n }\r\n \r\n <div class=\"tree-viewport-padding-bottom\"\r\n [style.height.px]=\"paddingBottom()\">\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-viewport-container {\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n position: relative;\r\n }\r\n \r\n .tree-viewport-content {\r\n position: relative;\r\n width: 100%;\r\n }\r\n \r\n .tree-viewport-padding-top,\r\n .tree-viewport-padding-bottom {\r\n width: 100%;\r\n }\r\n `],\r\n})\r\nexport class TreeViewportComponent implements OnInit, OnDestroy {\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() nodeTemplate?: TemplateRef<any>;\r\n \r\n @ViewChild('scrollContainer', { static: true }) \r\n scrollContainer!: ElementRef<HTMLElement>;\r\n \r\n private destroy$ = new Subject<void>();\r\n \r\n readonly scrollTop = signal(0);\r\n readonly viewportHeight = signal(0);\r\n \r\n readonly flattenedNodes = computed(() => {\r\n return this.treeModel.flattenedNodes();\r\n });\r\n \r\n readonly totalHeight = computed(() => {\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n \r\n if (typeof nodeHeight === 'number') {\r\n return nodes.length * nodeHeight;\r\n }\r\n \r\n return nodes.reduce((sum, node) => sum + nodeHeight(node), 0);\r\n });\r\n \r\n readonly visibleRange = computed(() => {\r\n const scrollTop = this.scrollTop();\r\n const viewportHeight = this.viewportHeight();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n const bufferAmount = this.options.bufferAmount || 5;\r\n \r\n let startIndex = 0;\r\n let accumulatedHeight = 0;\r\n \r\n // Find start index\r\n for (let i = 0; i < nodes.length; i++) {\r\n const height = typeof nodeHeight === 'number' \r\n ? nodeHeight \r\n : nodeHeight(nodes[i]);\r\n \r\n if (accumulatedHeight + height > scrollTop) {\r\n startIndex = Math.max(0, i - bufferAmount);\r\n break;\r\n }\r\n accumulatedHeight += height;\r\n }\r\n \r\n // Find end index\r\n let endIndex = startIndex;\r\n accumulatedHeight = 0;\r\n \r\n for (let i = startIndex; i < nodes.length; i++) {\r\n const height = typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n \r\n accumulatedHeight += height;\r\n \r\n if (accumulatedHeight > viewportHeight + (bufferAmount * (typeof nodeHeight === 'number' ? nodeHeight : 22))) {\r\n endIndex = i;\r\n break;\r\n }\r\n }\r\n \r\n if (endIndex === startIndex) {\r\n endIndex = nodes.length;\r\n }\r\n \r\n return { startIndex, endIndex };\r\n });\r\n \r\n readonly visibleNodes = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n return nodes.slice(range.startIndex, range.endIndex);\r\n });\r\n \r\n readonly paddingTop = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n \r\n let height = 0;\r\n for (let i = 0; i < range.startIndex; i++) {\r\n height += typeof nodeHeight === 'number' \r\n ? nodeHeight \r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n return height;\r\n });\r\n \r\n readonly paddingBottom = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n const totalHeight = this.totalHeight();\r\n \r\n let visibleHeight = this.paddingTop();\r\n \r\n for (let i = range.startIndex; i < range.endIndex; i++) {\r\n visibleHeight += typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n return Math.max(0, totalHeight - visibleHeight);\r\n });\r\n \r\n constructor() {\r\n // Update viewport when tree changes\r\n effect(() => {\r\n this.flattenedNodes(); // Subscribe to changes\r\n this.updateViewport();\r\n });\r\n }\r\n \r\n ngOnInit(): void {\r\n this.setupScrollListener();\r\n this.updateViewportHeight();\r\n }\r\n \r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n \r\n private setupScrollListener(): void {\r\n fromEvent(this.scrollContainer.nativeElement, 'scroll')\r\n .pipe(\r\n debounceTime(10),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe(() => {\r\n this.onScroll();\r\n });\r\n }\r\n \r\n private updateViewportHeight(): void {\r\n const height = this.scrollContainer.nativeElement.clientHeight;\r\n this.viewportHeight.set(height);\r\n }\r\n \r\n onScroll(): void {\r\n const scrollTop = this.scrollContainer.nativeElement.scrollTop;\r\n this.scrollTop.set(scrollTop);\r\n }\r\n \r\n private updateViewport(): void {\r\n // Force recalculation\r\n this.scrollTop.set(this.scrollContainer.nativeElement.scrollTop);\r\n }\r\n \r\n scrollToNode(node: TreeNode): void {\r\n const nodes = this.flattenedNodes();\r\n const index = nodes.findIndex(n => n.id === node.id);\r\n \r\n if (index === -1) return;\r\n \r\n const nodeHeight = this.options.nodeHeight || 22;\r\n let targetScrollTop = 0;\r\n \r\n for (let i = 0; i < index; i++) {\r\n targetScrollTop += typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n this.scrollContainer.nativeElement.scrollTop = targetScrollTop;\r\n }\r\n}","// lib/directives/tree-node-template.directive.ts\r\nimport { Directive, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[treeNodeTemplate]',\r\n standalone: true,\r\n})\r\nexport class TreeNodeTemplateDirective {\r\n constructor(public template: TemplateRef<any>) {}\r\n}","// lib/components/tree-root/tree-root.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n HostListener,\r\n signal,\r\n contentChild,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeOptions, DEFAULT_TREE_OPTIONS } from '../../core/models/tree-options.model';\r\nimport { TreeEvent } from '../../core/models/tree-events.model';\r\nimport { TreeNodeComponent } from '../tree-node/tree-node.component';\r\nimport { TreeViewportComponent } from '../tree-viewport/tree-viewport.component';\r\nimport { TreeNodeTemplateDirective } from '../../directives/tree-node-template.directive';\r\n\r\n@Component({\r\n selector: 'tree-root',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TreeNodeComponent,\r\n TreeViewportComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"tree-container\"\r\n [class.tree-rtl]=\"mergedOptions?.rtl\"\r\n tabindex=\"0\">\r\n\r\n @if (mergedOptions?.useVirtualScroll) {\r\n <tree-viewport\r\n [treeModel]=\"treeModel\"\r\n [options]=\"mergedOptions\"\r\n [nodeTemplate]=\"nodeTemplate()\">\r\n </tree-viewport>\r\n } @else {\r\n @for (root of treeModel.roots(); track root.id) {\r\n <tree-node\r\n [node]=\"root\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"mergedOptions\"\r\n [nodeTemplate]=\"nodeTemplate()\">\r\n </tree-node>\r\n }\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-container {\r\n width: 100%;\r\n height: 100%;\r\n outline: none;\r\n }\r\n \r\n .tree-rtl {\r\n direction: rtl;\r\n }\r\n `],\r\n host: {\r\n '[class.tree-focused]': 'isFocused()',\r\n },\r\n})\r\nexport class TreeRootComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() nodes: any[] = [];\r\n @Input() options: Partial<TreeOptions> = {};\r\n \r\n @Output() initialized = new EventEmitter<TreeEvent>();\r\n @Output() toggleExpanded = new EventEmitter<TreeEvent>();\r\n @Output() activate = new EventEmitter<TreeEvent>();\r\n @Output() deactivate = new EventEmitter<TreeEvent>();\r\n @Output() select = new EventEmitter<TreeEvent>();\r\n @Output() deselect = new EventEmitter<TreeEvent>();\r\n @Output() focus = new EventEmitter<TreeEvent>();\r\n @Output() blur = new EventEmitter<TreeEvent>();\r\n @Output() moveNode = new EventEmitter<TreeEvent>();\r\n @Output() loadChildren = new EventEmitter<TreeEvent>();\r\n @Output() treeEvent = new EventEmitter<TreeEvent>();\r\n \r\n // Content queries\r\n readonly nodeTemplate = contentChild(TreeNodeTemplateDirective, {\r\n read: TemplateRef\r\n });\r\n \r\n treeModel!: TreeModel;\r\n mergedOptions!: TreeOptions;\r\n isFocused = signal(false);\r\n\r\n private eventsSubscription?: Subscription;\r\n \r\n ngOnInit(): void {\r\n this.initializeTreeModel();\r\n }\r\n \r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['options'] && !changes['options'].firstChange) {\r\n this.initializeTreeModel();\r\n }\r\n \r\n if (changes['nodes'] && !changes['nodes'].firstChange) {\r\n this.treeModel.setData(this.nodes);\r\n }\r\n }\r\n \r\n private initializeTreeModel(): void {\r\n // Unsubscribe from previous subscription if exists\r\n this.eventsSubscription?.unsubscribe();\r\n\r\n this.mergedOptions = {\r\n ...DEFAULT_TREE_OPTIONS,\r\n ...this.options,\r\n };\r\n\r\n this.treeModel = new TreeModel(this.mergedOptions);\r\n this.treeModel.setData(this.nodes);\r\n\r\n // Subscribe to tree events\r\n this.eventsSubscription = this.treeModel.events$.subscribe(event => {\r\n this.handleTreeEvent(event);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Clean up subscription\r\n this.eventsSubscription?.unsubscribe();\r\n }\r\n \r\n private handleTreeEvent(event: TreeEvent): void {\r\n this.treeEvent.emit(event);\r\n \r\n switch (event.type) {\r\n case 'initialized':\r\n this.initialized.emit(event);\r\n break;\r\n case 'expand':\r\n case 'collapse':\r\n this.toggleExpanded.emit(event);\r\n break;\r\n case 'activate':\r\n this.activate.emit(event);\r\n break;\r\n case 'deactivate':\r\n this.deactivate.emit(event);\r\n break;\r\n case 'select':\r\n this.select.emit(event);\r\n break;\r\n case 'deselect':\r\n this.deselect.emit(event);\r\n break;\r\n case 'focus':\r\n this.focus.emit(event);\r\n break;\r\n case 'blur':\r\n this.blur.emit(event);\r\n break;\r\n case 'moveNode':\r\n this.moveNode.emit(event);\r\n break;\r\n case 'loadChildren':\r\n this.loadChildren.emit(event);\r\n break;\r\n }\r\n }\r\n \r\n // Keyboard navigation\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n if (!this.isFocused()) return;\r\n \r\n const key = event.key;\r\n const isRtl = this.options.rtl;\r\n \r\n switch (key) {\r\n case 'ArrowDown':\r\n this.treeModel.focusNextNode();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowUp':\r\n this.treeModel.focusPreviousNode();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowRight':\r\n isRtl ? this.treeModel.focusDrillUp() : this.treeModel.focusDrillDown();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowLeft':\r\n isRtl ? this.treeModel.focusDrillDown() : this.treeModel.focusDrillUp();\r\n event.preventDefault();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n const focused = this.treeModel.focusedNode();\r\n if (focused) {\r\n this.treeModel.activateNode(focused);\r\n }\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n \r\n @HostListener('focus')\r\n onFocus(): void {\r\n this.isFocused.set(true);\r\n }\r\n \r\n @HostListener('blur')\r\n onBlur(): void {\r\n this.isFocused.set(false);\r\n }\r\n}","import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, signal, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TreeRootComponent } from './components/tree-root/tree-root.component';\r\nimport { TreeOptions } from './core/models/tree-options.model';\r\nimport { TreeEvent } from './core/models/tree-events.model';\r\nimport { TreeNode } from './core/models/tree-node.model';\r\n\r\n@Component({\r\n selector: 'lib-concepto-tree',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, TreeRootComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"concepto-tree-container\">\r\n <div class=\"search-bar-container\">\r\n <div class=\"custom-select\" [class.open]=\"isDropdownOpen()\" (click)=\"toggleDropdown()\">\r\n <div class=\"selected-option\">\r\n {{ selectedNode() ? selectedNode()?.data?.[displayField] : 'Buscar nodo...' }}\r\n </div>\r\n <div class=\"arrow\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 9L12 15L18 9\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"currentColor\"/></svg></div>\r\n </div>\r\n \r\n <div class=\"backdrop\" *ngIf=\"isDropdownOpen()\" (click)=\"closeDropdown()\"></div>\r\n\r\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen()\">\r\n <div class=\"search-input-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <input \r\n type=\"text\" \r\n [ngModel]=\"searchTerm()\"\r\n (ngModelChange)=\"searchTerm.set($event)\" \r\n placeholder=\"Buscar...\"\r\n class=\"search-input\"\r\n #searchInput\r\n autofocus\r\n >\r\n </div>\r\n <div class=\"options-list\">\r\n <div \r\n *ngFor=\"let node of filteredNodes()\" \r\n class=\"option-item\" \r\n (click)=\"selectNode(node); $event.stopPropagation()\"\r\n >\r\n {{ node.data[displayField] }}\r\n </div>\r\n <div *ngIf=\"filteredNodes().length === 0\" class=\"no-results\">\r\n No se encontraron resultados\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <tree-root\r\n [nodes]=\"nodes\"\r\n [options]=\"options\"\r\n (initialized)=\"onTreeInitialized($event)\"\r\n (toggleExpanded)=\"toggleExpanded.emit($event)\"\r\n (activate)=\"onNodeActivated($event)\"\r\n (deactivate)=\"deactivate.emit($event)\"\r\n (select)=\"select.emit($event)\"\r\n (deselect)=\"deselect.emit($event)\"\r\n (focus)=\"focus.emit($event)\"\r\n (blur)=\"blur.emit($event)\"\r\n (moveNode)=\"moveNode.emit($event)\"\r\n (loadChildren)=\"loadChildren.emit($event)\"\r\n (treeEvent)=\"treeEvent.emit($event)\"\r\n ></tree-root>\r\n </div>\r\n `,\r\n styles: [`\r\n .concepto-tree-container {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n gap: 10px;\r\n }\r\n \r\n .search-bar-container {\r\n position: relative;\r\n width: 100%;\r\n z-index: 100;\r\n }\r\n\r\n .custom-select {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n border: 1px solid #ccc;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n background: #e7e7e7;\r\n user-select: none;\r\n transition: border-color 0.2s;\r\n }\r\n\r\n .custom-select:hover {\r\n border-color: #888;\r\n }\r\n \r\n .custom-select.open {\r\n border-color: #007bff;\r\n border-bottom-left-radius: 0;\r\n border-bottom-right-radius: 0;\r\n }\r\n\r\n .backdrop {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n z-index: 101;\r\n background: transparent;\r\n }\r\n\r\n .dropdown-menu {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n width: 100%;\r\n background: white;\r\n border: 1px solid #ccc;\r\n border-top: none;\r\n border-radius: 0 0 4px 4px;\r\n box-shadow: 0 4px 6px rgba(0,0,0,0.1);\r\n margin-top: 0;\r\n max-height: 300px;\r\n overflow-y: auto;\r\n z-index: 102;\r\n }\r\n\r\n .search-input-wrapper {\r\n padding: 8px;\r\n position: sticky;\r\n top: 0;\r\n background: white;\r\n border-bottom: 1px solid #eee;\r\n z-index: 103;\r\n }\r\n\r\n .search-input {\r\n width: 100%;\r\n padding: 8px;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n box-sizing: border-box;\r\n outline: none;\r\n background: #e7e7e7;\r\n }\r\n \r\n .search-input:focus {\r\n border-color: #007bff;\r\n }\r\n\r\n .options-list {\r\n max-height: 250px;\r\n overflow-y: auto;\r\n }\r\n\r\n .option-item {\r\n padding: 8px 12px;\r\n cursor: pointer;\r\n transition: background-color 0.1s;\r\n }\r\n\r\n .option-item:hover {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n .no-results {\r\n padding: 12px;\r\n color: #888;\r\n font-style: italic;\r\n text-align: center;\r\n }\r\n \r\n tree-root {\r\n flex: 1;\r\n overflow: hidden;\r\n }\r\n `]\r\n})\r\nexport class ConceptoTreeComponent {\r\n @Input() nodes: any[] = [];\r\n @Input() options: Partial<TreeOptions> = {};\r\n\r\n @Output() initialized = new EventEmitter<TreeEvent>();\r\n @Output() toggleExpanded = new EventEmitter<TreeEvent>();\r\n @Output() activate = new EventEmitter<TreeEvent>();\r\n @Output() deactivate = new EventEmitter<TreeEvent>();\r\n @Output() select = new EventEmitter<TreeEvent>();\r\n @Output() deselect = new EventEmitter<TreeEvent>();\r\n @Output() focus = new EventEmitter<TreeEvent>();\r\n @Output() blur = new EventEmitter<TreeEvent>();\r\n @Output() moveNode = new EventEmitter<TreeEvent>();\r\n @Output() loadChildren = new EventEmitter<TreeEvent>();\r\n @Output() treeEvent = new EventEmitter<TreeEvent>();\r\n\r\n @ViewChild(TreeRootComponent, { static: false }) treeRoot!: TreeRootComponent;\r\n\r\n // Estado con Signals\r\n isDropdownOpen = signal(false);\r\n searchTerm = signal(''); // Cambiamos a Signal\r\n selectedNode = signal<TreeNode | null>(null);\r\n \r\n // Almacén de todos los nodos (no necesita ser signal porque no cambia tras la carga inicial)\r\n private allNodes: TreeNode[] = [];\r\n\r\n // Signal computada: Se actualiza sola cuando cambia searchTerm o allNodes es asignado\r\n filteredNodes = computed(() => {\r\n const term = this.searchTerm().toLowerCase();\r\n if (!term) return this.allNodes;\r\n \r\n return this.allNodes.filter(node =>\r\n String(node.data[this.displayField]).toLowerCase().includes(term)\r\n );\r\n });\r\n\r\n get displayField(): string {\r\n return this.options.displayField || 'name';\r\n }\r\n\r\n toggleDropdown() {\r\n this.isDropdownOpen.update(v => !v);\r\n if (this.isDropdownOpen()) {\r\n this.searchTerm.set(''); // Reseteamos el término al abrir\r\n }\r\n }\r\n\r\n closeDropdown() {\r\n this.isDropdownOpen.set(false);\r\n }\r\n\r\n selectNode(node: TreeNode) {\r\n this.selectedNode.set(node);\r\n this.isDropdownOpen.set(false);\r\n\r\n // Use setTimeout to avoid 'firstCreatePass' error when accessing ViewChild\r\n setTimeout(() => {\r\n if (this.treeRoot?.treeModel) {\r\n // Expandir los nodos padres y activar el nodo\r\n node.setActiveAndVisible();\r\n\r\n // Hacer scroll al nodo después de un pequeño delay para permitir que se expandan los padres\r\n setTimeout(() => {\r\n this.scrollToNode(node);\r\n }, 300); // Delay para permitir que las animaciones de expansión terminen\r\n }\r\n });\r\n }\r\n\r\n private scrollToNode(node: TreeNode): void {\r\n // Buscar el elemento DOM del nodo usando su ID\r\n const nodeElement = document.querySelector(`.tree-node[data-node-id=\"${node.id}\"]`);\r\n\r\n if (nodeElement) {\r\n nodeElement.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'center',\r\n inline: 'nearest'\r\n });\r\n }\r\n }\r\n\r\n onTreeInitialized(event: TreeEvent) {\r\n this.initialized.emit(event);\r\n \r\n // Mantenemos el setTimeout para evitar el error 'firstCreatePass'\r\n setTimeout(() => {\r\n if (event.treeModel) {\r\n this.allNodes = event.treeModel.getAllNodes();\r\n \r\n // Buscamos manualmente el nodo activo si existe\r\n const activeNode = this.allNodes.find(n => n.isActive);\r\n if (activeNode) {\r\n this.selectedNode.set(activeNode);\r\n }\r\n \r\n // Forzamos una actualización inicial de la lista filtrada\r\n // Al setear searchTerm de nuevo, disparas el computed\r\n this.searchTerm.set('');\r\n }\r\n });\r\n }\r\n\r\n onNodeActivated(event: TreeEvent) {\r\n this.activate.emit(event);\r\n if (event.node) {\r\n this.selectedNode.set(event.node);\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ComparisonResult } from '../../components/entity-comparison.component';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EntityComparisonService {\r\n\r\n parseEntities(xmlString: string): any[] {\r\n const parser = new DOMParser();\r\n const xmlDoc = parser.parseFromString(xmlString, 'text/xml');\r\n \r\n const exportItems = xmlDoc.querySelectorAll('ExportItem[Type=\"Entity\"]');\r\n const entities: any[] = [];\r\n \r\n exportItems.forEach((item) => {\r\n const entity = item.querySelector('Entity_WithoutRedundancies');\r\n if (!entity) return;\r\n \r\n const structureJson = entity.querySelector('EntityStructureJson')?.textContent;\r\n if (!structureJson) return;\r\n \r\n try {\r\n const structure = JSON.parse(structureJson);\r\n entities.push({\r\n id: entity.querySelector('EntityId')?.textContent || '',\r\n name: entity.querySelector('EntityName')?.textContent || '',\r\n structure: structure\r\n });\r\n } catch (e) {\r\n console.error('Error parsing EntityStructureJson:', e);\r\n }\r\n });\r\n \r\n return entities;\r\n }\r\n\r\n compareStructures(leftStructure: any[], rightStructure: any[]): ComparisonResult {\r\n const leftOnly: any[] = [];\r\n const rightOnly: any[] = [];\r\n const modified: any[] = [];\r\n const unchanged: any[] = [];\r\n \r\n // Create maps for quick lookup\r\n const leftMap = this.createNodeMap(leftStructure);\r\n const rightMap = this.createNodeMap(rightStructure);\r\n \r\n // Find nodes only in left or modified\r\n for (const [key, leftNode] of leftMap.entries()) {\r\n if (!rightMap.has(key)) {\r\n leftOnly.push(leftNode);\r\n } else {\r\n const rightNode = rightMap.get(key);\r\n const diff = this.compareNodes(leftNode, rightNode!);\r\n if (diff.length > 0) {\r\n modified.push({ ...leftNode, modifiedProperties: diff });\r\n } else {\r\n unchanged.push(leftNode);\r\n }\r\n }\r\n }\r\n \r\n // Find nodes only in right\r\n for (const [key, rightNode] of rightMap.entries()) {\r\n if (!leftMap.has(key)) {\r\n rightOnly.push(rightNode);\r\n }\r\n }\r\n \r\n return { leftOnly, rightOnly, modified, unchanged };\r\n }\r\n\r\n private createNodeMap(structure: any[], parentPath: string = ''): Map<string, any> {\r\n const map = new Map<string, any>();\r\n \r\n for (const node of structure) {\r\n const nodePath = parentPath ? `${parentPath}/${node.Id}-${node.name}` : `${node.Id}-${node.name}`;\r\n map.set(nodePath, node);\r\n \r\n if (node.Children) {\r\n try {\r\n const children = JSON.parse(node.Children);\r\n const childMap = this.createNodeMap(children, nodePath);\r\n for (const [key, value] of childMap.entries()) {\r\n map.set(key, value);\r\n }\r\n } catch (e) {\r\n // Ignore parsing errors\r\n }\r\n }\r\n }\r\n \r\n return map;\r\n }\r\n\r\n private compareNodes(left: any, right: any): string[] {\r\n const modifiedProps: string[] = [];\r\n \r\n try {\r\n const leftProps = JSON.parse(left.Properties || '{}');\r\n const rightProps = JSON.parse(right.Properties || '{}');\r\n \r\n const allKeys = new Set([\r\n ...Object.keys(leftProps),\r\n ...Object.keys(rightProps)\r\n ]);\r\n \r\n for (const key of allKeys) {\r\n if (leftProps[key] !== rightProps[key]) {\r\n modifiedProps.push(key);\r\n }\r\n }\r\n } catch (e) {\r\n // Ignore parsing errors\r\n }\r\n \r\n return modifiedProps;\r\n }\r\n}","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EntityComparisonService } from '../core/services/entity-comparison.service';\r\n\r\nexport interface ComparisonResult {\r\n leftOnly: any[];\r\n rightOnly: any[];\r\n modified: any[];\r\n unchanged: any[];\r\n}\r\n\r\n@Component({\r\n selector: 'app-entity-comparison',\r\n standalone: true,\r\n imports: [CommonModule],\r\n providers: [EntityComparisonService],\r\n templateUrl: './entity-comparison.component.html',\r\n styleUrls: ['./entity-comparison.component.css']\r\n})\r\nexport class EntityComparisonComponent {\r\n leftFile: string = '';\r\n rightFile: string = '';\r\n leftEntities: any[] = [];\r\n rightEntities: any[] = [];\r\n selectedLeftEntity: any = null;\r\n selectedRightEntity: any = null;\r\n comparisonResult: ComparisonResult | null = null;\r\n expandedNodes = new Set<string>();\r\n isFullScreen = false;\r\n currentDifferenceIndex = 0;\r\n differences: any[] = [];\r\n\r\n constructor(private comparisonService: EntityComparisonService) {}\r\n\r\n onLeftFileSelected(event: any): void {\r\n const file: File = event.target.files[0];\r\n if (!file) return;\r\n\r\n this.leftFile = file.name;\r\n const reader = new FileReader();\r\n \r\n reader.onload = (e: any) => {\r\n const xmlContent = e.target.result;\r\n this.leftEntities = this.comparisonService.parseEntities(xmlContent);\r\n this.selectedLeftEntity = null;\r\n this.comparisonResult = null;\r\n };\r\n \r\n reader.readAsText(file);\r\n }\r\n\r\n onRightFileSelected(event: any): void {\r\n const file: File = event.target.files[0];\r\n if (!file) return;\r\n\r\n this.rightFile = file.name;\r\n const reader = new FileReader();\r\n \r\n reader.onload = (e: any) => {\r\n const xmlContent = e.target.result;\r\n this.rightEntities = this.comparisonService.parseEntities(xmlContent);\r\n this.selectedRightEntity = null;\r\n this.comparisonResult = null;\r\n };\r\n \r\n reader.readAsText(file);\r\n }\r\n\r\n selectLeftEntity(entity: any): void {\r\n this.selectedLeftEntity = entity;\r\n this.compareIfBothSelected();\r\n }\r\n\r\n selectRightEntity(entity: any): void {\r\n this.selectedRightEntity = entity;\r\n this.compareIfBothSelected();\r\n }\r\n\r\n private compareIfBothSelected(): void {\r\n if (this.selectedLeftEntity && this.selectedRightEntity) {\r\n this.comparisonResult = this.comparisonService.compareStructures(\r\n this.selectedLeftEntity.structure,\r\n this.selectedRightEntity.structure\r\n );\r\n this.buildDifferencesList();\r\n this.currentDifferenceIndex = 0;\r\n }\r\n }\r\n\r\n private buildDifferencesList(): void {\r\n if (!this.comparisonResult) {\r\n this.differences = [];\r\n return;\r\n }\r\n\r\n this.differences = [\r\n ...this.comparisonResult.leftOnly.map(node => ({ node, type: 'removed' })),\r\n ...this.comparisonResult.rightOnly.map(node => ({ node, type: 'added' })),\r\n ...this.comparisonResult.modified.map(node => ({ node, type: 'modified' }))\r\n ];\r\n }\r\n\r\n navigateToNextDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n this.currentDifferenceIndex = (this.currentDifferenceIndex + 1) % this.differences.length;\r\n this.scrollToDifference();\r\n }\r\n\r\n navigateToPreviousDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n this.currentDifferenceIndex = this.currentDifferenceIndex === 0\r\n ? this.differences.length - 1\r\n : this.currentDifferenceIndex - 1;\r\n this.scrollToDifference();\r\n }\r\n\r\n private scrollToDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n const currentDiff = this.differences[this.currentDifferenceIndex];\r\n const nodeId = `${currentDiff.node.Id}-${currentDiff.node.name}`;\r\n\r\n // Expand parent nodes FIRST to make the difference visible\r\n this.expandPathToNode(currentDiff.node);\r\n\r\n // Wait for DOM to update after expansion, then scroll\r\n setTimeout(() => {\r\n const leftElement = document.querySelector(`[data-node-id=\"left-${nodeId}\"]`);\r\n const rightElement = document.querySelector(`[data-node-id=\"right-${nodeId}\"]`);\r\n\r\n if (leftElement) {\r\n leftElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n if (rightElement) {\r\n rightElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }, 100);\r\n }\r\n\r\n private expandPathToNode(node: any): void {\r\n // Find and expand all parent nodes in both structures\r\n this.expandParentsInStructure(this.selectedLeftEntity.structure, node, 'left');\r\n this.expandParentsInStructure(this.selectedRightEntity.structure, node, 'right');\r\n }\r\n\r\n private expandParentsInStructure(structure: any[], targetNode: any, side: string): boolean {\r\n for (const node of structure) {\r\n const nodeId = `${side}-${node.Id}-${node.name}`;\r\n const targetId = `${targetNode.Id}-${targetNode.name}`;\r\n const currentId = `${node.Id}-${node.name}`;\r\n\r\n // If this is the target node, we found it\r\n if (currentId === targetId) {\r\n return true;\r\n }\r\n\r\n // Check children if they exist\r\n if (this.hasChildren(node)) {\r\n const children = this.getChildren(node);\r\n if (this.expandParentsInStructure(children, targetNode, side)) {\r\n // If the target is in this branch, expand this node\r\n this.expandedNodes.add(nodeId);\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n get hasDifferences(): boolean {\r\n return this.differences.length > 0;\r\n }\r\n\r\n get currentDifferenceNumber(): number {\r\n return this.currentDifferenceIndex + 1;\r\n }\r\n\r\n get totalDifferences(): number {\r\n return this.differences.length;\r\n }\r\n\r\n toggleNode(nodeId: string): void {\r\n if (this.expandedNodes.has(nodeId)) {\r\n this.expandedNodes.delete(nodeId);\r\n } else {\r\n this.expandedNodes.add(nodeId);\r\n }\r\n }\r\n\r\n isExpanded(nodeId: string): boolean {\r\n return this.expandedNodes.has(nodeId);\r\n }\r\n\r\n getNodeId(node: any, prefix: string): string {\r\n return `${prefix}-${node.Id}-${node.name}`;\r\n }\r\n\r\n hasChildren(node: any): boolean {\r\n return node.Children && JSON.parse(node.Children).length > 0;\r\n }\r\n\r\n getChildren(node: any): any[] {\r\n if (!node.Children) return [];\r\n try {\r\n return JSON.parse(node.Children);\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n getProperties(node: any): any {\r\n if (!node.Properties) return {};\r\n try {\r\n return JSON.parse(node.Properties);\r\n } catch {\r\n return {};\r\n }\r\n }\r\n\r\n getPropertyKeys(node: any): string[] {\r\n const props = this.getProperties(node);\r\n return Object.keys(props);\r\n }\r\n\r\n getChangeType(node: any): string {\r\n if (!this.comparisonResult) return '';\r\n \r\n const nodeId = `${node.Id}-${node.name}`;\r\n \r\n if (this.comparisonResult.leftOnly.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'removed';\r\n }\r\n if (this.comparisonResult.rightOnly.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'added';\r\n }\r\n if (this.comparisonResult.modified.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'modified';\r\n }\r\n return 'unchanged';\r\n }\r\n\r\n getModifiedProperties(node: any): string[] {\r\n if (!this.comparisonResult) return [];\r\n\r\n const nodeId = `${node.Id}-${node.name}`;\r\n const modified = this.comparisonResult.modified.find(n => `${n.Id}-${n.name}` === nodeId);\r\n\r\n return modified?.modifiedProperties || [];\r\n }\r\n\r\n toggleFullScreen(): void {\r\n this.isFullScreen = !this.isFullScreen;\r\n }\r\n}","<div class=\"comparison-container\" [class.fullscreen]=\"isFullScreen\">\r\n <header class=\"header\">\r\n <h1>Entity Structure Comparison</h1>\r\n <p class=\"subtitle\">Compare EntityStructureJson between two entity exports</p>\r\n </header>\r\n\r\n <div class=\"file-selection\">\r\n <div class=\"file-input-group\">\r\n <label class=\"file-label left\">\r\n <input type=\"file\" accept=\".xml\" (change)=\"onLeftFileSelected($event)\" hidden>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"17 8 12 3 7 8\" />\r\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\r\n </svg>\r\n Load Left Entity\r\n </label>\r\n <span *ngIf=\"leftFile\" class=\"file-name\">{{ leftFile }}</span>\r\n </div>\r\n\r\n <div class=\"vs-separator\">VS</div>\r\n\r\n <div class=\"file-input-group\">\r\n <label class=\"file-label right\">\r\n <input type=\"file\" accept=\".xml\" (change)=\"onRightFileSelected($event)\" hidden>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"17 8 12 3 7 8\" />\r\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\r\n </svg>\r\n Load Right Entity\r\n </label>\r\n <span *ngIf=\"rightFile\" class=\"file-name\">{{ rightFile }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"entity-selection\" *ngIf=\"leftEntities.length > 0 || rightEntities.length > 0\">\r\n <div class=\"entity-list\">\r\n <h3>Left Entities</h3>\r\n <div class=\"entities\">\r\n <div *ngFor=\"let entity of leftEntities\" class=\"entity-card\"\r\n [class.selected]=\"selectedLeftEntity === entity\" (click)=\"selectLeftEntity(entity)\">\r\n <div class=\"entity-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\">\r\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n </svg>\r\n </div>\r\n <div class=\"entity-info\">\r\n <div class=\"entity-name\">{{ entity.name }}</div>\r\n <div class=\"entity-id\">{{ entity.id }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"entity-list\">\r\n <h3>Right Entities</h3>\r\n <div class=\"entities\">\r\n <div *ngFor=\"let entity of rightEntities\" class=\"entity-card\"\r\n [class.selected]=\"selectedRightEntity === entity\" (click)=\"selectRightEntity(entity)\">\r\n <div class=\"entity-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\">\r\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n </svg>\r\n </div>\r\n <div class=\"entity-info\">\r\n <div class=\"entity-name\">{{ entity.name }}</div>\r\n <div class=\"entity-id\">{{ entity.id }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"summary-section\" *ngIf=\"comparisonResult\">\r\n <div class=\"summary\">\r\n <div class=\"summary-item added\">\r\n <span class=\"count\">{{ comparisonResult.rightOnly.length }}</span>\r\n <span class=\"label\">Added</span>\r\n </div>\r\n <div class=\"summary-item removed\">\r\n <span class=\"count\">{{ comparisonResult.leftOnly.length }}</span>\r\n <span class=\"label\">Removed</span>\r\n </div>\r\n <div class=\"summary-item modified\">\r\n <span class=\"count\">{{ comparisonResult.modified.length }}</span>\r\n <span class=\"label\">Modified</span>\r\n </div>\r\n <div class=\"summary-item unchanged\">\r\n <span class=\"count\">{{ comparisonResult.unchanged.length }}</span>\r\n <span class=\"label\">Unchanged</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"comparison-results\" *ngIf=\"comparisonResult\">\r\n <div class=\"results-header\">\r\n <div class=\"header-title\">\r\n <h2>Comparison Results</h2>\r\n <div class=\"header-actions\">\r\n <div class=\"diff-navigation\" *ngIf=\"hasDifferences\">\r\n <button class=\"nav-btn\" (click)=\"navigateToPreviousDifference()\" title=\"Previous Difference\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"18 15 12 9 6 15\" />\r\n </svg>\r\n </button>\r\n <span class=\"diff-counter\">{{ currentDifferenceNumber }} / {{ totalDifferences }}</span>\r\n <button class=\"nav-btn\" (click)=\"navigateToNextDifference()\" title=\"Next Difference\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <button class=\"fullscreen-btn\" (click)=\"toggleFullScreen()\" [title]=\"isFullScreen ? 'Exit Full Screen' : 'Enter Full Screen'\">\r\n <svg *ngIf=\"!isFullScreen\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\" />\r\n </svg>\r\n <svg *ngIf=\"isFullScreen\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"structure-comparison\">\r\n <div class=\"comparison-section\">\r\n <h3>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M9 11l3 3L22 4\" />\r\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />\r\n </svg>\r\n {{ selectedLeftEntity.name }}\r\n </h3>\r\n <div class=\"structure-tree\">\r\n <ng-container *ngFor=\"let node of selectedLeftEntity.structure\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: node, side: 'left' }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"comparison-section\">\r\n <h3>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M9 11l3 3L22 4\" />\r\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />\r\n </svg>\r\n {{ selectedRightEntity.name }}\r\n </h3>\r\n <div class=\"structure-tree\">\r\n <ng-container *ngFor=\"let node of selectedRightEntity.structure\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: node, side: 'right' }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #nodeTemplate let-node let-side=\"side\">\r\n <div class=\"tree-node\" [class]=\"getChangeType(node)\" [attr.data-node-id]=\"getNodeId(node, side)\">\r\n <div class=\"node-header\">\r\n <button *ngIf=\"hasChildren(node)\" class=\"expand-btn\" (click)=\"toggleNode(getNodeId(node, side))\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline *ngIf=\"!isExpanded(getNodeId(node, side))\" points=\"9 18 15 12 9 6\" />\r\n <polyline *ngIf=\"isExpanded(getNodeId(node, side))\" points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n <div *ngIf=\"!hasChildren(node)\" class=\"spacer\"></div>\r\n\r\n <div class=\"node-icon\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path *ngIf=\"node.nodeType === 'Group'\"\r\n d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n <circle *ngIf=\"node.nodeType === 'Attribute'\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"node-content\">\r\n <span class=\"node-name\">{{ node.name }}</span>\r\n <span class=\"node-type\">{{ node.nodeType }}</span>\r\n <span class=\"change-badge\" *ngIf=\"getChangeType(node) !== 'unchanged'\">\r\n {{ getChangeType(node) }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"node-properties\" *ngIf=\"getPropertyKeys(node).length > 0\">\r\n <div *ngFor=\"let key of getPropertyKeys(node)\" class=\"property\"\r\n [class.modified]=\"getModifiedProperties(node).includes(key)\">\r\n <span class=\"property-key\">{{ key }}:</span>\r\n <span class=\"property-value\">{{ getProperties(node)[key] }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"node-children\" *ngIf=\"hasChildren(node) && isExpanded(getNodeId(node, side))\">\r\n <ng-container *ngFor=\"let child of getChildren(node)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: child, side: side }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>","import { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'concepto-input',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './concepto-input.component.html',\r\n styleUrl: './concepto-input.component.css'\r\n})\r\nexport class ConceptoInputComponent {\r\n @Input() labelText: string = 'Date';\r\n @Input() name: string = 'date-input';\r\n @Input() type: string = 'text';\r\n}\r\n","<div class=\"field\">\r\n @if(labelText !== '') {\r\n <label [for]=\"name\" class=\"label\">{{labelText}}</label>\r\n }\r\n @if(type === 'text') {\r\n <input [name]=\"name\" [id]=\"name\" type=\"text\" class=\"text-input\" />\r\n } @else if(type === 'date') {\r\n <input [name]=\"name\" [id]=\"name\" type=\"date\" class=\"date-input\" />\r\n } @else if(type === 'dropdown') {\r\n <select [name]=\"name\" [id]=\"name\" class=\"dropdown-input\">\r\n <option value=\"\" disabled selected>Select an option</option>\r\n </select>\r\n }\r\n</div>","/*\r\n * Public API Surface of concepto-message\r\n */\r\n\r\nexport * from './lib/concepto-user-controls.service';\r\nexport * from './lib/concepto-user-controls.component';\r\nexport * from './lib/concepto-message/concepto-message.component';\r\nexport * from './lib/concepto-context-menu/concepto-context-menu.component';\r\nexport * from './lib/concepto-tree/concepto-tree.component';\r\nexport * from './lib/entity-comparison/components/entity-comparison.component';\r\nexport * from './lib/entity-comparison/core/services/entity-comparison.service';\r\nexport * from './lib/concepto-input/concepto-input.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.EntityComparisonService","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"concepto-user-controls.mjs","sources":["../../../projects/concepto-user-controls/src/lib/concepto-user-controls.service.ts","../../../projects/concepto-user-controls/src/lib/concepto-user-controls.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-message/concepto-message.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-message/concepto-message.component.html","../../../projects/concepto-user-controls/src/lib/concepto-context-menu/concepto-context-menu.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-context-menu/concepto-context-menu.component.html","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree-node.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/models/tree-options.model.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-expander/tree-node-expander.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-checkbox/tree-node-checkbox.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node-content/tree-node-content.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/core/services/tree-drag-drop.service.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-drag.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-drop.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-node/tree-node.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-viewport/tree-viewport.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/directives/tree-node-template.directive.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/components/tree-root/tree-root.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-tree/concepto-tree.component.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/core/services/entity-comparison.service.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/components/entity-comparison.component.ts","../../../projects/concepto-user-controls/src/lib/entity-comparison/components/entity-comparison.component.html","../../../projects/concepto-user-controls/src/lib/concepto-input/concepto-input.component.ts","../../../projects/concepto-user-controls/src/lib/concepto-input/concepto-input.component.html","../../../projects/concepto-user-controls/src/public-api.ts","../../../projects/concepto-user-controls/src/concepto-user-controls.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConceptoUserControlsService {\r\n\r\n constructor() { }\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-concepto-message',\r\n standalone: true,\r\n imports: [],\r\n template: `\r\n <p>\r\n concepto-message works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class ConceptoUserControls {\r\n\r\n}\r\n","import { NgIf } from '@angular/common';\r\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\r\n\r\n\r\n@Component({\r\n selector: 'concepto-message',\r\n standalone: true,\r\n imports: [NgIf],\r\n templateUrl: './concepto-message.component.html',\r\n styleUrl: './concepto-message.component.css'\r\n})\r\nexport class ConceptoMessageComponent {\r\n @Input() title: string = 'Mensaje';\r\n @Input() message: string = 'Este es un mensaje';\r\n @Input() visible: boolean = false;\r\n\r\n @Output() closed = new EventEmitter<void>();\r\n @Output() accepted = new EventEmitter<void>();\r\n\r\n close() {\r\n this.closed.emit();\r\n }\r\n\r\n accept() {\r\n this.accepted.emit();\r\n }\r\n\r\n show() {\r\n this.visible = true;\r\n }\r\n}\r\n","<div class=\"modal-backdrop\" *ngIf=\"visible\">\r\n <div class=\"modal\">\r\n <div class=\"modal-header\">\r\n <h3>{{ title }}</h3>\r\n <button class=\"close-button\" (click)=\"close()\">×</button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <p>{{ message }}</p>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button (click)=\"accept()\">Aceptar</button>\r\n </div>\r\n </div>\r\n</div>","import { Component, ElementRef, EventEmitter, HostListener, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n\r\nexport interface NodeOption {\r\n NodesId: string;\r\n NodesText: string;\r\n NodesParentId: string;\r\n NodesImg: string;\r\n children?: NodeOption[];\r\n}\r\n\r\n@Component({\r\n selector: 'concepto-context-menu',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './concepto-context-menu.component.html',\r\n styleUrl: './concepto-context-menu.component.css'\r\n})\r\nexport class ConceptoContextMenuComponent {\r\n\r\n @Input() nodes: NodeOption[] = [];\r\n @Output() optionSelected = new EventEmitter<NodeOption>();\r\n menuTree: NodeOption[] = [];\r\n visible = false;\r\n pos = { x: 0, y: 0 };\r\n\r\n constructor(private elRef: ElementRef) {}\r\n\r\n ngOnChanges(): void {\r\n const map = new Map<string, NodeOption>();\r\n this.nodes.forEach(n => map.set(n.NodesId, { ...n, children: [] }));\r\n\r\n const roots: NodeOption[] = [];\r\n map.forEach(n => {\r\n if (n.NodesParentId && map.has(n.NodesParentId)) {\r\n map.get(n.NodesParentId)?.children?.push(n);\r\n } else {\r\n roots.push(n);\r\n }\r\n });\r\n this.menuTree = roots;\r\n }\r\n\r\n showAtEvent(event: MouseEvent): void {\r\n event.preventDefault();\r\n const x = event.clientX;\r\n const y = event.clientY;\r\n this.visible = true;\r\n setTimeout(() => {\r\n const menu = this.elRef.nativeElement.querySelector('.context-menu');\r\n const rect = menu.getBoundingClientRect();\r\n this.pos.x = x + rect.width > window.innerWidth ? window.innerWidth - rect.width - 10 : x;\r\n this.pos.y = y + rect.height > window.innerHeight ? window.innerHeight - rect.height - 10 : y;\r\n });\r\n }\r\n\r\n hide(): void {\r\n this.visible = false;\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onOutsideClick(event: MouseEvent): void {\r\n if (!this.elRef.nativeElement.contains(event.target)) {\r\n this.hide();\r\n }\r\n }\r\n\r\n onOptionClick(option: NodeOption): void {\r\n this.optionSelected.emit(option);\r\n if (!option.children || option.children.length === 0) {\r\n this.hide();\r\n }\r\n }\r\n\r\n hasChildren(option: NodeOption): boolean {\r\n return !!option.children && option.children.length > 0;\r\n }\r\n}\r\n\r\n","<div class=\"context-menu\" *ngIf=\"visible\" [ngStyle]=\"{ top: pos.y + 'px', left: pos.x + 'px' }\">\r\n <ul class=\"menu-root\">\r\n <ng-container *ngFor=\"let item of menuTree\">\r\n <ng-container *ngTemplateOutlet=\"renderNode; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n</div>\r\n\r\n<ng-template #renderNode let-node>\r\n <li class=\"menu-item\" [class.has-children]=\"hasChildren(node)\">\r\n <div (click)=\"onOptionClick(node)\">\r\n @if (node.NodesImg) {\r\n <img [src]=\"node.NodesImg\" class=\"icon\" />\r\n }\r\n @if (!node.NodesImg) {\r\n <div class=\"icon\"></div>\r\n }\r\n {{ node.NodesText }}\r\n </div>\r\n <ul class=\"submenu\" *ngIf=\"hasChildren(node)\">\r\n <ng-container *ngFor=\"let child of node.children\">\r\n <ng-container *ngTemplateOutlet=\"renderNode; context: { $implicit: child }\"></ng-container>\r\n </ng-container>\r\n </ul>\r\n </li>\r\n</ng-template>","// lib/core/models/tree-node.model.ts\r\nimport { signal, computed, Signal } from '@angular/core';\r\nimport { TreeOptions } from './tree-options.model';\r\n\r\nexport interface TreeNodeData {\r\n id: string | number;\r\n [key: string]: any;\r\n}\r\n\r\nexport class TreeNode {\r\n // Signals for reactive state\r\n readonly isExpanded = signal(false);\r\n readonly isActive = signal(false);\r\n readonly isSelected = signal(false);\r\n readonly isFocused = signal(false);\r\n readonly isHidden = signal(false);\r\n readonly isLoading = signal(false);\r\n \r\n // Computed signals\r\n readonly isCollapsed = computed(() => !this.isExpanded());\r\n readonly isLeaf = computed(() => !this.hasChildren);\r\n readonly isVisible = computed(() => !this.isHidden());\r\n \r\n id: string | number;\r\n data: TreeNodeData;\r\n parent: TreeNode | null;\r\n children: TreeNode[] = [];\r\n level: number;\r\n path: Array<string | number>;\r\n index: number;\r\n hasChildren: boolean;\r\n icon?: string;\r\n \r\n constructor(\r\n data: TreeNodeData,\r\n parent: TreeNode | null,\r\n level: number,\r\n index: number,\r\n options: TreeOptions\r\n ) {\r\n this.data = data;\r\n this.parent = parent;\r\n this.level = level;\r\n this.index = index;\r\n this.id = data[options.idField || 'id'];\r\n this.icon = data[options.iconField || 'icon'];\r\n\r\n const childrenData = data[options.childrenField || 'children'];\r\n this.hasChildren = Array.isArray(childrenData) && childrenData.length > 0;\r\n \r\n // Initialize expanded state\r\n if (options.isExpandedField && data[options.isExpandedField]) {\r\n this.isExpanded.set(true);\r\n }\r\n \r\n // Build path\r\n this.path = parent ? [...parent.path, this.id] : [this.id];\r\n }\r\n \r\n // Actions\r\n expand(): void {\r\n if (this.hasChildren) {\r\n this.isExpanded.set(true);\r\n }\r\n }\r\n \r\n collapse(): void {\r\n this.isExpanded.set(false);\r\n }\r\n \r\n toggle(): void {\r\n this.isExpanded.update(value => !value);\r\n }\r\n \r\n setActive(value: boolean): void {\r\n this.isActive.set(value);\r\n }\r\n \r\n setSelected(value: boolean): void {\r\n this.isSelected.set(value);\r\n }\r\n \r\n setFocus(value: boolean): void {\r\n this.isFocused.set(value);\r\n }\r\n \r\n setHidden(value: boolean): void {\r\n this.isHidden.set(value);\r\n }\r\n \r\n setLoading(value: boolean): void {\r\n this.isLoading.set(value);\r\n }\r\n \r\n // Helper methods\r\n ensureVisible(): void {\r\n let node: TreeNode | null = this.parent;\r\n while (node) {\r\n node.expand();\r\n node = node.parent;\r\n }\r\n }\r\n \r\n setActiveAndVisible(): void {\r\n this.ensureVisible();\r\n this.setActive(true);\r\n }\r\n \r\n // Get all ancestors\r\n getAncestors(): TreeNode[] {\r\n const ancestors: TreeNode[] = [];\r\n let node: TreeNode | null = this.parent;\r\n while (node) {\r\n ancestors.unshift(node);\r\n node = node.parent;\r\n }\r\n return ancestors;\r\n }\r\n \r\n // Get all descendants\r\n getDescendants(): TreeNode[] {\r\n const descendants: TreeNode[] = [];\r\n const traverse = (node: TreeNode) => {\r\n node.children.forEach(child => {\r\n descendants.push(child);\r\n traverse(child);\r\n });\r\n };\r\n traverse(this);\r\n return descendants;\r\n }\r\n}","// lib/core/models/tree.model.ts\r\nimport { signal, computed, effect } from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { TreeNode } from './tree-node.model';\r\nimport { TreeOptions } from './tree-options.model';\r\nimport { TreeEvent } from './tree-events.model';\r\n\r\nexport class TreeModel {\r\n // Reactive state with signals\r\n readonly roots = signal<TreeNode[]>([]);\r\n readonly focusedNodeId = signal<string | number | null>(null);\r\n readonly expandedNodeIds = signal<Set<string | number>>(new Set());\r\n readonly activeNodeIds = signal<Set<string | number>>(new Set());\r\n readonly selectedNodeIds = signal<Set<string | number>>(new Set());\r\n readonly hiddenNodeIds = signal<Set<string | number>>(new Set());\r\n \r\n // Computed signals\r\n readonly focusedNode = computed(() => {\r\n const id = this.focusedNodeId();\r\n return id ? this.getNodeById(id) : null;\r\n });\r\n \r\n readonly expandedNodes = computed(() => \r\n this.getAllNodes().filter(node => \r\n this.expandedNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly activeNodes = computed(() =>\r\n this.getAllNodes().filter(node =>\r\n this.activeNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly selectedNodes = computed(() =>\r\n this.getAllNodes().filter(node =>\r\n this.selectedNodeIds().has(node.id)\r\n )\r\n );\r\n \r\n readonly visibleNodes = computed(() =>\r\n this.getAllNodes().filter(node => !node.isHidden())\r\n );\r\n \r\n readonly flattenedNodes = computed(() => {\r\n const flattened: TreeNode[] = [];\r\n const traverse = (nodes: TreeNode[]) => {\r\n nodes.forEach(node => {\r\n if (!node.isHidden()) {\r\n flattened.push(node);\r\n if (node.isExpanded() && node.children.length > 0) {\r\n traverse(node.children);\r\n }\r\n }\r\n });\r\n };\r\n traverse(this.roots());\r\n return flattened;\r\n });\r\n \r\n // Event streams\r\n readonly events$ = new Subject<TreeEvent>();\r\n \r\n // Virtual root for unified handling\r\n virtualRoot: TreeNode | null = null;\r\n \r\n // Node registry for quick lookup\r\n private nodeRegistry = new Map<string | number, TreeNode>();\r\n \r\n constructor(public options: TreeOptions) {\r\n // Constructor sin effects - se sincronizan en las operaciones\r\n }\r\n \r\n // Data management\r\n setData(data: any[]): void {\r\n this.nodeRegistry.clear();\r\n const roots = this.buildNodes(data, null, 0);\r\n this.roots.set(roots);\r\n this.emitEvent({ type: 'initialized', treeModel: this });\r\n }\r\n \r\n private buildNodes(\r\n data: any[],\r\n parent: TreeNode | null,\r\n level: number\r\n ): TreeNode[] {\r\n return data.map((item, index) => {\r\n const node = new TreeNode(item, parent, level, index, this.options);\r\n this.nodeRegistry.set(node.id, node);\r\n \r\n // Recursively build children\r\n const childrenData = item[this.options.childrenField || 'children'];\r\n if (Array.isArray(childrenData) && childrenData.length > 0) {\r\n node.children = this.buildNodes(childrenData, node, level + 1);\r\n }\r\n \r\n return node;\r\n });\r\n }\r\n \r\n update(): void {\r\n // Trigger change detection by creating new signal values\r\n this.roots.set([...this.roots()]);\r\n this.emitEvent({ type: 'update', treeModel: this });\r\n }\r\n \r\n // Node lookup\r\n getNodeById(id: string | number): TreeNode | null {\r\n return this.nodeRegistry.get(id) || null;\r\n }\r\n \r\n getNodeBy(predicate: (node: TreeNode) => boolean): TreeNode | null {\r\n return this.getAllNodes().find(predicate) || null;\r\n }\r\n \r\n getAllNodes(): TreeNode[] {\r\n const nodes: TreeNode[] = [];\r\n const traverse = (nodeList: TreeNode[]) => {\r\n nodeList.forEach(node => {\r\n nodes.push(node);\r\n if (node.children.length > 0) {\r\n traverse(node.children);\r\n }\r\n });\r\n };\r\n traverse(this.roots());\r\n return nodes;\r\n }\r\n \r\n // Navigation\r\n focusNode(node: TreeNode | null): void {\r\n if (this.focusedNode()) {\r\n this.focusedNode()!.setFocus(false);\r\n }\r\n if (node) {\r\n this.focusedNodeId.set(node.id);\r\n node.setFocus(true);\r\n this.emitEvent({ type: 'focus', node });\r\n } else {\r\n this.focusedNodeId.set(null);\r\n }\r\n }\r\n \r\n focusNextNode(): void {\r\n const flattened = this.flattenedNodes();\r\n const currentIndex = flattened.findIndex(\r\n n => n.id === this.focusedNodeId()\r\n );\r\n if (currentIndex < flattened.length - 1) {\r\n this.focusNode(flattened[currentIndex + 1]);\r\n }\r\n }\r\n \r\n focusPreviousNode(): void {\r\n const flattened = this.flattenedNodes();\r\n const currentIndex = flattened.findIndex(\r\n n => n.id === this.focusedNodeId()\r\n );\r\n if (currentIndex > 0) {\r\n this.focusNode(flattened[currentIndex - 1]);\r\n }\r\n }\r\n \r\n focusDrillDown(): void {\r\n const focused = this.focusedNode();\r\n if (focused) {\r\n if (!focused.isExpanded() && focused.hasChildren) {\r\n focused.expand();\r\n } else if (focused.children.length > 0) {\r\n this.focusNode(focused.children[0]);\r\n }\r\n }\r\n }\r\n \r\n focusDrillUp(): void {\r\n const focused = this.focusedNode();\r\n if (focused) {\r\n if (focused.isExpanded() && focused.hasChildren) {\r\n focused.collapse();\r\n } else if (focused.parent) {\r\n this.focusNode(focused.parent);\r\n }\r\n }\r\n }\r\n \r\n // Operations\r\n expandAll(): void {\r\n const ids = new Set(this.getAllNodes().map(n => n.id));\r\n this.expandedNodeIds.set(ids);\r\n this.emitEvent({ type: 'expandAll', treeModel: this });\r\n }\r\n \r\n collapseAll(): void {\r\n this.expandedNodeIds.set(new Set());\r\n this.emitEvent({ type: 'collapseAll', treeModel: this });\r\n }\r\n \r\n expandNode(node: TreeNode): void {\r\n this.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.add(node.id);\r\n return newIds;\r\n });\r\n node.isExpanded.set(true);\r\n this.emitEvent({ type: 'expand', node });\r\n }\r\n\r\n collapseNode(node: TreeNode): void {\r\n this.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.delete(node.id);\r\n return newIds;\r\n });\r\n node.isExpanded.set(false);\r\n this.emitEvent({ type: 'collapse', node });\r\n }\r\n\r\n activateNode(node: TreeNode, multi: boolean = false): void {\r\n if (!multi) {\r\n this.activeNodeIds.set(new Set([node.id]));\r\n this.getAllNodes().forEach(n => n.isActive.set(n.id === node.id));\r\n } else {\r\n this.activeNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.add(node.id);\r\n return newIds;\r\n });\r\n node.isActive.set(true);\r\n }\r\n this.emitEvent({ type: 'activate', node });\r\n }\r\n \r\n deactivateNode(node: TreeNode): void {\r\n this.activeNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n newIds.delete(node.id);\r\n return newIds;\r\n });\r\n node.isActive.set(false);\r\n this.emitEvent({ type: 'deactivate', node });\r\n }\r\n \r\n selectNode(node: TreeNode, multi: boolean = false): void {\r\n if (!multi) {\r\n this.selectedNodeIds.set(new Set([node.id]));\r\n } else {\r\n this.selectedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n if (ids.has(node.id)) {\r\n newIds.delete(node.id);\r\n } else {\r\n newIds.add(node.id);\r\n }\r\n return newIds;\r\n });\r\n }\r\n this.emitEvent({ type: 'select', node });\r\n }\r\n \r\n // Filtering\r\n filterNodes(filterFn: (node: TreeNode) => boolean, autoShow = true): void {\r\n const hiddenIds = new Set<string | number>();\r\n \r\n this.getAllNodes().forEach(node => {\r\n const matches = filterFn(node);\r\n if (!matches) {\r\n hiddenIds.add(node.id);\r\n } else if (autoShow) {\r\n // Show ancestors of matching nodes\r\n node.getAncestors().forEach(ancestor => {\r\n hiddenIds.delete(ancestor.id);\r\n });\r\n }\r\n });\r\n \r\n this.hiddenNodeIds.set(hiddenIds);\r\n this.emitEvent({ type: 'filter', treeModel: this });\r\n }\r\n \r\n clearFilter(): void {\r\n this.hiddenNodeIds.set(new Set());\r\n this.emitEvent({ type: 'clearFilter', treeModel: this });\r\n }\r\n \r\n // Drag & Drop\r\n canMoveNode(\r\n node: TreeNode,\r\n to: { parent: TreeNode; index: number }\r\n ): boolean {\r\n // Prevent moving to itself or descendants\r\n if (node === to.parent) return false;\r\n if (to.parent.getAncestors().includes(node)) return false;\r\n \r\n // Custom validation\r\n if (this.options.allowDrop) {\r\n if (typeof this.options.allowDrop === 'function') {\r\n return this.options.allowDrop(node, to);\r\n }\r\n return this.options.allowDrop;\r\n }\r\n \r\n return true;\r\n }\r\n \r\n moveNode(node: TreeNode, to: { parent: TreeNode; index: number }): void {\r\n if (!this.canMoveNode(node, to)) return;\r\n\r\n // Remove from old parent\r\n if (node.parent) {\r\n const oldIndex = node.parent.children.indexOf(node);\r\n if (oldIndex !== -1) {\r\n // Create new array to trigger change detection\r\n node.parent.children = [\r\n ...node.parent.children.slice(0, oldIndex),\r\n ...node.parent.children.slice(oldIndex + 1)\r\n ];\r\n }\r\n } else {\r\n // Handle root nodes\r\n const rootIndex = this.roots().indexOf(node);\r\n if (rootIndex !== -1) {\r\n this.roots.set([\r\n ...this.roots().slice(0, rootIndex),\r\n ...this.roots().slice(rootIndex + 1)\r\n ]);\r\n }\r\n }\r\n\r\n // Add to new parent - create new array to trigger change detection\r\n const newChildren = [...to.parent.children];\r\n newChildren.splice(to.index, 0, node);\r\n to.parent.children = newChildren;\r\n node.parent = to.parent;\r\n\r\n // Update levels\r\n this.updateNodeLevels(node);\r\n\r\n this.emitEvent({ type: 'moveNode', node, to });\r\n this.update();\r\n }\r\n \r\n private updateNodeLevels(node: TreeNode): void {\r\n const newLevel = node.parent ? node.parent.level + 1 : 0;\r\n node.level = newLevel;\r\n \r\n node.children.forEach(child => this.updateNodeLevels(child));\r\n }\r\n \r\n // Async children loading\r\n async loadChildren(node: TreeNode): Promise<void> {\r\n if (!this.options.getChildren) return;\r\n \r\n node.setLoading(true);\r\n \r\n try {\r\n const childrenData = await this.options.getChildren(node);\r\n node.children = this.buildNodes(childrenData, node, node.level + 1);\r\n node.hasChildren = node.children.length > 0;\r\n \r\n this.emitEvent({ type: 'loadChildren', node });\r\n this.update();\r\n } catch (error) {\r\n this.emitEvent({ type: 'loadChildrenError', node, error });\r\n } finally {\r\n node.setLoading(false);\r\n }\r\n }\r\n \r\n // Events\r\n private emitEvent(event: TreeEvent): void {\r\n this.events$.next(event);\r\n }\r\n}","// lib/core/models/tree-options.model.ts\r\nimport { TreeNode } from './tree-node.model';\r\n\r\nexport interface TreeOptions {\r\n // Field mappings\r\n idField?: string;\r\n childrenField?: string;\r\n displayField?: string;\r\n isExpandedField?: string;\r\n hasChildrenField?: string;\r\n iconField?: string;\r\n \r\n // Behavior\r\n allowDrag?: boolean | ((node: TreeNode) => boolean);\r\n allowDrop?: boolean | ((node: TreeNode, to: any) => boolean);\r\n useCheckbox?: boolean;\r\n useTriState?: boolean;\r\n levelPadding?: number;\r\n \r\n // Virtual scroll\r\n useVirtualScroll?: boolean;\r\n nodeHeight?: number | ((node: TreeNode) => number);\r\n scrollContainerHeight?: number;\r\n bufferAmount?: number;\r\n \r\n // Async loading\r\n getChildren?: (node: TreeNode) => Promise<any[]>;\r\n \r\n // Animations\r\n animateExpand?: boolean;\r\n animateSpeed?: number;\r\n animateAcceleration?: number;\r\n \r\n // Scroll behavior\r\n scrollOnActivate?: boolean;\r\n scrollContainer?: HTMLElement;\r\n \r\n // Keyboard\r\n rtl?: boolean;\r\n \r\n // Selection\r\n multiSelect?: boolean;\r\n useMetaKey?: boolean;\r\n}\r\n\r\nexport const DEFAULT_TREE_OPTIONS: TreeOptions = {\r\n idField: 'id',\r\n childrenField: 'children',\r\n displayField: 'name',\r\n isExpandedField: 'isExpanded',\r\n hasChildrenField: 'hasChildren',\r\n iconField: 'icon',\r\n allowDrag: false,\r\n allowDrop: false,\r\n useCheckbox: false,\r\n useTriState: false,\r\n levelPadding: 20,\r\n useVirtualScroll: false,\r\n nodeHeight: 22,\r\n bufferAmount: 5,\r\n animateExpand: false,\r\n animateSpeed: 1,\r\n animateAcceleration: 1.2,\r\n scrollOnActivate: true,\r\n rtl: false,\r\n multiSelect: false,\r\n useMetaKey: true,\r\n};","// lib/components/tree-node-expander/tree-node-expander.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-expander',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"tree-node-expander\"\r\n [class.tree-node-expander-loading]=\"node.isLoading()\"\r\n (click)=\"onExpanderClick($event)\">\r\n @if (node.isLoading()) {\r\n <span class=\"expander-spinner\"></span>\r\n } @else if (node.hasChildren) {\r\n <svg \r\n class=\"expander-icon\"\r\n [class.expander-icon-expanded]=\"node.isExpanded()\"\r\n width=\"16\" \r\n height=\"16\" \r\n viewBox=\"0 0 16 16\">\r\n <path d=\"M6 4l4 4-4 4\" \r\n fill=\"none\" \r\n stroke=\"currentColor\" \r\n stroke-width=\"2\" \r\n stroke-linecap=\"round\"/>\r\n </svg>\r\n } @else {\r\n <span class=\"expander-placeholder\"></span>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node-expander {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n cursor: pointer;\r\n border-radius: 3px;\r\n transition: background-color 0.15s;\r\n flex-shrink: 0;\r\n }\r\n \r\n .tree-node-expander:hover {\r\n background-color: rgba(0, 0, 0, 0.05);\r\n }\r\n \r\n .expander-icon {\r\n transition: transform 0.2s ease;\r\n transform: rotate(0deg);\r\n }\r\n \r\n .expander-icon-expanded {\r\n transform: rotate(90deg);\r\n }\r\n \r\n .expander-placeholder {\r\n width: 16px;\r\n height: 16px;\r\n }\r\n \r\n .expander-spinner {\r\n display: inline-block;\r\n width: 14px;\r\n height: 14px;\r\n border: 2px solid #f3f3f3;\r\n border-top: 2px solid #2196f3;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n})\r\nexport class TreeNodeExpanderComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Output() toggle = new EventEmitter<void>();\r\n \r\n onExpanderClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n this.toggle.emit();\r\n }\r\n}","// lib/components/tree-node-checkbox/tree-node-checkbox.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-checkbox',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"tree-node-checkbox\"\r\n (click)=\"onCheckboxClick($event)\">\r\n <input \r\n type=\"checkbox\"\r\n [checked]=\"isChecked()\"\r\n [indeterminate]=\"isIndeterminate()\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (click)=\"$event.stopPropagation()\">\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node-checkbox {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n flex-shrink: 0;\r\n }\r\n \r\n input[type=\"checkbox\"] {\r\n cursor: pointer;\r\n width: 16px;\r\n height: 16px;\r\n margin: 0;\r\n }\r\n `],\r\n})\r\nexport class TreeNodeCheckboxComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input() useTriState = false;\r\n @Output() change = new EventEmitter<boolean>();\r\n \r\n readonly isChecked = computed(() => {\r\n return this.treeModel.selectedNodeIds().has(this.node.id);\r\n });\r\n \r\n readonly isIndeterminate = computed(() => {\r\n if (!this.useTriState || !this.node.hasChildren) {\r\n return false;\r\n }\r\n \r\n const selectedIds = this.treeModel.selectedNodeIds();\r\n const descendants = this.node.getDescendants();\r\n \r\n if (descendants.length === 0) return false;\r\n \r\n const selectedCount = descendants.filter(d => \r\n selectedIds.has(d.id)\r\n ).length;\r\n \r\n return selectedCount > 0 && selectedCount < descendants.length;\r\n });\r\n \r\n onCheckboxClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n }\r\n \r\n onCheckboxChange(event: Event): void {\r\n event.stopPropagation();\r\n const checked = (event.target as HTMLInputElement).checked;\r\n \r\n if (this.useTriState) {\r\n // Update node and all descendants\r\n this.updateNodeAndDescendants(this.node, checked);\r\n } else {\r\n this.change.emit(checked);\r\n }\r\n }\r\n \r\n private updateNodeAndDescendants(node: TreeNode, checked: boolean): void {\r\n this.treeModel.selectedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n \r\n if (checked) {\r\n newIds.add(node.id);\r\n node.getDescendants().forEach(d => newIds.add(d.id));\r\n } else {\r\n newIds.delete(node.id);\r\n node.getDescendants().forEach(d => newIds.delete(d.id));\r\n }\r\n \r\n return newIds;\r\n });\r\n \r\n this.change.emit(checked);\r\n }\r\n}","// lib/components/tree-node-content/tree-node-content.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\n\r\n@Component({\r\n selector: 'tree-node-content',\r\n standalone: true,\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n @if (template) {\r\n <ng-container\r\n *ngTemplateOutlet=\"template; context: templateContext\">\r\n </ng-container>\r\n } @else {\r\n <span class=\"tree-node-content-default\">\r\n @if (node.icon) {\r\n <img [src]=\"node.icon\" alt=\"\" class=\"tree-node-icon\" />\r\n }\r\n <span class=\"tree-node-text\">{{ node.data[displayField] }}</span>\r\n </span>\r\n }\r\n `,\r\n styles: [`\r\n .tree-node-content-default {\r\n flex: 1;\r\n padding: 0 4px;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n overflow: hidden;\r\n user-select: none;\r\n }\r\n\r\n .tree-node-icon {\r\n width: 16px;\r\n height: 16px;\r\n flex-shrink: 0;\r\n object-fit: contain;\r\n }\r\n\r\n .tree-node-text {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n }\r\n `],\r\n})\r\nexport class TreeNodeContentComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input() template?: TemplateRef<any>;\r\n @Input() displayField = 'name';\r\n \r\n NgOnInit(){\r\n }\r\n\r\n get templateContext() {\r\n return {\r\n $implicit: this.node,\r\n node: this.node,\r\n treeModel: this.treeModel,\r\n };\r\n }\r\n}","// lib/core/services/tree-drag-drop.service.ts\r\nimport { Injectable, signal } from '@angular/core';\r\nimport { TreeNode } from '../models/tree-node.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class TreeDragDropService {\r\n private readonly draggedNode = signal<TreeNode | null>(null);\r\n \r\n setDraggedNode(node: TreeNode): void {\r\n this.draggedNode.set(node);\r\n }\r\n \r\n getDraggedNode(): TreeNode | null {\r\n return this.draggedNode();\r\n }\r\n \r\n clearDraggedNode(): void {\r\n this.draggedNode.set(null);\r\n }\r\n \r\n isDragging(): boolean {\r\n return this.draggedNode() !== null;\r\n }\r\n}","// lib/directives/tree-drag.directive.ts\r\nimport {\r\n Directive,\r\n Input,\r\n HostListener,\r\n HostBinding,\r\n ElementRef,\r\n inject, // Add inject\r\n} from '@angular/core';\r\nimport { TreeNode } from '../core/models/tree-node.model';\r\nimport { TreeModel } from '../core/models/tree.model';\r\nimport { TreeOptions } from '../core/models/tree-options.model';\r\nimport { TreeDragDropService } from '../core/services/tree-drag-drop.service';\r\n\r\n@Directive({\r\n selector: '[treeDrag]',\r\n standalone: true,\r\n})\r\nexport class TreeDragDirective {\r\n @Input({ required: true, alias: 'treeDrag' }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n \r\n // Use inject() function instead of constructor injection\r\n private readonly elementRef = inject(ElementRef);\r\n private readonly dragDropService = inject(TreeDragDropService);\r\n \r\n @HostBinding('attr.draggable')\r\n get draggable(): boolean {\r\n if (typeof this.options.allowDrag === 'function') {\r\n return this.options.allowDrag(this.node);\r\n }\r\n return this.options.allowDrag || false;\r\n }\r\n \r\n @HostListener('dragstart', ['$event'])\r\n onDragStart(event: DragEvent): void {\r\n if (!this.draggable) {\r\n event.preventDefault();\r\n return;\r\n }\r\n \r\n this.dragDropService.setDraggedNode(this.node);\r\n \r\n if (event.dataTransfer) {\r\n event.dataTransfer.effectAllowed = 'move';\r\n event.dataTransfer.setData('text/plain', this.node.id.toString());\r\n \r\n // Create drag image\r\n const dragImage = this.elementRef.nativeElement.cloneNode(true) as HTMLElement;\r\n dragImage.style.opacity = '0.7';\r\n document.body.appendChild(dragImage);\r\n event.dataTransfer.setDragImage(dragImage, 0, 0);\r\n \r\n setTimeout(() => document.body.removeChild(dragImage), 0);\r\n }\r\n \r\n this.elementRef.nativeElement.classList.add('tree-node-dragging');\r\n }\r\n \r\n @HostListener('dragend', ['$event'])\r\n onDragEnd(event: DragEvent): void {\r\n this.dragDropService.clearDraggedNode();\r\n this.elementRef.nativeElement.classList.remove('tree-node-dragging');\r\n }\r\n}","// lib/directives/tree-drop.directive.ts\r\nimport {\r\n Directive,\r\n Input,\r\n HostListener,\r\n HostBinding,\r\n ElementRef,\r\n signal,\r\n inject, // Add inject\r\n} from '@angular/core';\r\nimport { TreeNode } from '../core/models/tree-node.model';\r\nimport { TreeModel } from '../core/models/tree.model';\r\nimport { TreeOptions } from '../core/models/tree-options.model';\r\nimport { TreeDragDropService } from '../core/services/tree-drag-drop.service';\r\n\r\ntype DropPosition = 'before' | 'after' | 'inside';\r\n\r\n@Directive({\r\n selector: '[treeDrop]',\r\n standalone: true,\r\n})\r\nexport class TreeDropDirective {\r\n @Input({ required: true, alias: 'treeDrop' }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() dropPosition: DropPosition = 'inside';\r\n \r\n // Use inject() function instead of constructor injection\r\n private readonly elementRef = inject(ElementRef);\r\n private readonly dragDropService = inject(TreeDragDropService);\r\n \r\n readonly isDraggingOver = signal(false);\r\n readonly canDrop = signal(false);\r\n \r\n @HostBinding('class.tree-drop-target')\r\n get isDropTarget(): boolean {\r\n return this.isDraggingOver() && this.canDrop();\r\n }\r\n \r\n @HostBinding('class.tree-drop-disabled')\r\n get isDropDisabled(): boolean {\r\n return this.isDraggingOver() && !this.canDrop();\r\n }\r\n \r\n @HostListener('dragenter', ['$event'])\r\n onDragEnter(event: DragEvent): void {\r\n event.preventDefault();\r\n \r\n const draggedNode = this.dragDropService.getDraggedNode();\r\n if (!draggedNode) return;\r\n \r\n this.isDraggingOver.set(true);\r\n \r\n const dropTarget = this.getDropTarget();\r\n const canDrop = this.treeModel.canMoveNode(draggedNode, dropTarget);\r\n this.canDrop.set(canDrop);\r\n \r\n if (canDrop && event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n \r\n @HostListener('dragover', ['$event'])\r\n onDragOver(event: DragEvent): void {\r\n if (this.canDrop()) {\r\n event.preventDefault();\r\n if (event.dataTransfer) {\r\n event.dataTransfer.dropEffect = 'move';\r\n }\r\n }\r\n }\r\n \r\n @HostListener('dragleave', ['$event'])\r\n onDragLeave(event: DragEvent): void {\r\n // Check if we're really leaving (not just entering a child element)\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const x = event.clientX;\r\n const y = event.clientY;\r\n \r\n if (x < rect.left || x >= rect.right || y < rect.top || y >= rect.bottom) {\r\n this.isDraggingOver.set(false);\r\n this.canDrop.set(false);\r\n }\r\n }\r\n \r\n @HostListener('drop', ['$event'])\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n \r\n const draggedNode = this.dragDropService.getDraggedNode();\r\n if (!draggedNode || !this.canDrop()) return;\r\n \r\n const dropTarget = this.getDropTarget();\r\n this.treeModel.moveNode(draggedNode, dropTarget);\r\n \r\n this.isDraggingOver.set(false);\r\n this.canDrop.set(false);\r\n this.dragDropService.clearDraggedNode();\r\n }\r\n \r\n private getDropTarget(): { parent: TreeNode; index: number } {\r\n switch (this.dropPosition) {\r\n case 'before':\r\n return {\r\n parent: this.node.parent!,\r\n index: this.node.index,\r\n };\r\n case 'after':\r\n return {\r\n parent: this.node.parent!,\r\n index: this.node.index + 1,\r\n };\r\n case 'inside':\r\n default:\r\n return {\r\n parent: this.node,\r\n index: this.node.children.length,\r\n };\r\n }\r\n }\r\n}","// lib/components/tree-node/tree-node.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n computed,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { trigger, state, style, transition, animate } from '@angular/animations';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeOptions } from '../../core/models/tree-options.model';\r\nimport { TreeNodeExpanderComponent } from '../tree-node-expander/tree-node-expander.component';\r\nimport { TreeNodeCheckboxComponent } from '../tree-node-checkbox/tree-node-checkbox.component';\r\nimport { TreeNodeContentComponent } from '../tree-node-content/tree-node-content.component';\r\nimport { TreeDragDirective } from '../../directives/tree-drag.directive';\r\nimport { TreeDropDirective } from '../../directives/tree-drop.directive';\r\n\r\n@Component({\r\n selector: 'tree-node',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TreeNodeExpanderComponent,\r\n TreeNodeCheckboxComponent,\r\n TreeNodeContentComponent,\r\n TreeDragDirective,\r\n TreeDropDirective,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"tree-node\"\r\n [attr.data-node-id]=\"node.id\"\r\n [class.tree-node-expanded]=\"node.isExpanded()\"\r\n [class.tree-node-collapsed]=\"node.isCollapsed()\"\r\n [class.tree-node-active]=\"node.isActive()\"\r\n [class.tree-node-focused]=\"node.isFocused()\"\r\n [class.tree-node-leaf]=\"node.isLeaf()\"\r\n [class.tree-node-loading]=\"node.isLoading()\"\r\n [style.padding-left.px]=\"paddingLeft()\">\r\n \r\n <div class=\"tree-node-wrapper\"\r\n [treeDrag]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\">\r\n \r\n <!-- Drop zone before node -->\r\n <div class=\"tree-node-drop-slot tree-node-drop-slot-before\"\r\n [treeDrop]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [dropPosition]=\"'before'\"\r\n [options]=\"options\">\r\n </div>\r\n \r\n <!-- Node content wrapper -->\r\n <div class=\"tree-node-content-wrapper\"\r\n (click)=\"onNodeClick($event)\"\r\n (dblclick)=\"onNodeDoubleClick($event)\"\r\n (contextmenu)=\"onNodeContextMenu($event)\">\r\n \r\n <!-- Expander -->\r\n @if (node.hasChildren) {\r\n <tree-node-expander\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n (toggle)=\"onToggleExpanded()\">\r\n </tree-node-expander>\r\n }\r\n \r\n <!-- Checkbox -->\r\n @if (options.useCheckbox) {\r\n <tree-node-checkbox\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [useTriState]=\"options.useTriState ?? false\"\r\n (change)=\"onCheckboxChange($event)\">\r\n </tree-node-checkbox>\r\n }\r\n \r\n <!-- Content -->\r\n <tree-node-content\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [template]=\"nodeTemplate\"\r\n [displayField]=\"options.displayField || 'name'\">\r\n </tree-node-content>\r\n </div>\r\n \r\n <!-- Drop zone after node -->\r\n <div class=\"tree-node-drop-slot tree-node-drop-slot-after\"\r\n [treeDrop]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [dropPosition]=\"'after'\"\r\n [options]=\"options\">\r\n </div>\r\n </div>\r\n \r\n <!-- Children container -->\r\n @if (node.isExpanded() && node.children.length > 0) {\r\n <div class=\"tree-node-children\"\r\n [@expandCollapse]=\"node.isExpanded() ? 'expanded' : 'collapsed'\">\r\n @for (child of node.children; track child.id) {\r\n <tree-node\r\n [node]=\"child\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\"\r\n [nodeTemplate]=\"nodeTemplate\">\r\n </tree-node>\r\n }\r\n </div>\r\n }\r\n \r\n <!-- Loading indicator -->\r\n @if (node.isLoading()) {\r\n <div class=\"tree-node-loading\">\r\n <span class=\"loading-spinner\"></span>\r\n Loading...\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-node {\r\n position: relative;\r\n }\r\n \r\n .tree-node-wrapper {\r\n position: relative;\r\n display: flex;\r\n align-items: center;\r\n min-height: 22px;\r\n }\r\n \r\n .tree-node-content-wrapper {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n cursor: pointer;\r\n border-radius: 3px;\r\n padding: 2px 4px;\r\n transition: background-color 0.15s;\r\n }\r\n \r\n .tree-node-content-wrapper:hover {\r\n background-color: #f5f5f5;\r\n }\r\n \r\n .tree-node-active .tree-node-content-wrapper {\r\n background-color: #e3f2fd;\r\n }\r\n \r\n .tree-node-focused .tree-node-content-wrapper {\r\n outline: 2px solid #2196f3;\r\n outline-offset: -2px;\r\n }\r\n \r\n .tree-node-children {\r\n overflow: hidden;\r\n }\r\n \r\n .tree-node-drop-slot {\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n height: 2px;\r\n z-index: 10;\r\n }\r\n \r\n .tree-node-drop-slot-before {\r\n top: -1px;\r\n }\r\n \r\n .tree-node-drop-slot-after {\r\n bottom: -1px;\r\n }\r\n \r\n .tree-node-loading {\r\n padding: 8px 24px;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n color: #666;\r\n font-size: 14px;\r\n }\r\n \r\n .loading-spinner {\r\n display: inline-block;\r\n width: 16px;\r\n height: 16px;\r\n border: 2px solid #f3f3f3;\r\n border-top: 2px solid #2196f3;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `],\r\n animations: [\r\n trigger('expandCollapse', [\r\n state('collapsed', style({\r\n height: '0',\r\n overflow: 'hidden',\r\n opacity: '0'\r\n })),\r\n state('expanded', style({\r\n height: '*',\r\n overflow: 'visible',\r\n opacity: '1'\r\n })),\r\n transition('collapsed <=> expanded', [\r\n animate('200ms ease-in-out')\r\n ])\r\n ])\r\n ],\r\n})\r\nexport class TreeNodeComponent {\r\n @Input({ required: true }) node!: TreeNode;\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() nodeTemplate?: TemplateRef<any>;\r\n \r\n readonly paddingLeft = computed(() => {\r\n return this.options.levelPadding || 40;\r\n });\r\n \r\n onNodeClick(event: MouseEvent): void {\r\n const useMetaKey = this.options.useMetaKey !== false;\r\n const multiSelect = this.options.multiSelect || false;\r\n \r\n const isMetaKeyPressed = event.ctrlKey || event.metaKey;\r\n const shouldMultiSelect = multiSelect && (!useMetaKey || isMetaKeyPressed);\r\n \r\n this.treeModel.activateNode(this.node, shouldMultiSelect);\r\n this.treeModel.focusNode(this.node);\r\n }\r\n \r\n onNodeDoubleClick(event: MouseEvent): void {\r\n if (this.node.hasChildren) {\r\n this.node.toggle();\r\n this.treeModel.expandedNodeIds.update(ids => {\r\n const newIds = new Set(ids);\r\n if (this.node.isExpanded()) {\r\n newIds.add(this.node.id);\r\n } else {\r\n newIds.delete(this.node.id);\r\n }\r\n return newIds;\r\n });\r\n }\r\n }\r\n \r\n onNodeContextMenu(event: MouseEvent): void {\r\n event.preventDefault();\r\n // Emit context menu event\r\n }\r\n \r\n onToggleExpanded(): void {\r\n if (this.node.hasChildren) {\r\n this.node.toggle();\r\n \r\n if (this.node.isExpanded()) {\r\n // Load children if needed\r\n if (this.options.getChildren && this.node.children.length === 0) {\r\n this.treeModel.loadChildren(this.node);\r\n }\r\n this.treeModel.expandNode(this.node);\r\n } else {\r\n this.treeModel.collapseNode(this.node);\r\n }\r\n }\r\n }\r\n \r\n onCheckboxChange(checked: boolean): void {\r\n this.treeModel.selectNode(this.node, this.options.multiSelect || false);\r\n }\r\n}","// lib/components/tree-viewport/tree-viewport.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n OnInit,\r\n OnDestroy,\r\n ViewChild,\r\n ElementRef,\r\n ChangeDetectionStrategy,\r\n signal,\r\n computed,\r\n TemplateRef,\r\n effect,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeNode } from '../../core/models/tree-node.model';\r\nimport { TreeOptions } from '../../core/models/tree-options.model';\r\nimport { TreeNodeComponent } from '../tree-node/tree-node.component';\r\nimport { fromEvent, Subject, takeUntil } from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'tree-viewport',\r\n standalone: true,\r\n imports: [CommonModule, TreeNodeComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div \r\n #scrollContainer\r\n class=\"tree-viewport-container\"\r\n [style.height.px]=\"options.scrollContainerHeight || 400\"\r\n (scroll)=\"onScroll()\">\r\n \r\n <div class=\"tree-viewport-content\"\r\n [style.height.px]=\"totalHeight()\">\r\n \r\n <div class=\"tree-viewport-padding-top\"\r\n [style.height.px]=\"paddingTop()\">\r\n </div>\r\n \r\n @for (node of visibleNodes(); track node.id) {\r\n <tree-node\r\n [node]=\"node\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"options\"\r\n [nodeTemplate]=\"nodeTemplate\">\r\n </tree-node>\r\n }\r\n \r\n <div class=\"tree-viewport-padding-bottom\"\r\n [style.height.px]=\"paddingBottom()\">\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-viewport-container {\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n position: relative;\r\n }\r\n \r\n .tree-viewport-content {\r\n position: relative;\r\n width: 100%;\r\n }\r\n \r\n .tree-viewport-padding-top,\r\n .tree-viewport-padding-bottom {\r\n width: 100%;\r\n }\r\n `],\r\n})\r\nexport class TreeViewportComponent implements OnInit, OnDestroy {\r\n @Input({ required: true }) treeModel!: TreeModel;\r\n @Input({ required: true }) options!: TreeOptions;\r\n @Input() nodeTemplate?: TemplateRef<any>;\r\n \r\n @ViewChild('scrollContainer', { static: true }) \r\n scrollContainer!: ElementRef<HTMLElement>;\r\n \r\n private destroy$ = new Subject<void>();\r\n \r\n readonly scrollTop = signal(0);\r\n readonly viewportHeight = signal(0);\r\n \r\n readonly flattenedNodes = computed(() => {\r\n return this.treeModel.flattenedNodes();\r\n });\r\n \r\n readonly totalHeight = computed(() => {\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n \r\n if (typeof nodeHeight === 'number') {\r\n return nodes.length * nodeHeight;\r\n }\r\n \r\n return nodes.reduce((sum, node) => sum + nodeHeight(node), 0);\r\n });\r\n \r\n readonly visibleRange = computed(() => {\r\n const scrollTop = this.scrollTop();\r\n const viewportHeight = this.viewportHeight();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n const bufferAmount = this.options.bufferAmount || 5;\r\n \r\n let startIndex = 0;\r\n let accumulatedHeight = 0;\r\n \r\n // Find start index\r\n for (let i = 0; i < nodes.length; i++) {\r\n const height = typeof nodeHeight === 'number' \r\n ? nodeHeight \r\n : nodeHeight(nodes[i]);\r\n \r\n if (accumulatedHeight + height > scrollTop) {\r\n startIndex = Math.max(0, i - bufferAmount);\r\n break;\r\n }\r\n accumulatedHeight += height;\r\n }\r\n \r\n // Find end index\r\n let endIndex = startIndex;\r\n accumulatedHeight = 0;\r\n \r\n for (let i = startIndex; i < nodes.length; i++) {\r\n const height = typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n \r\n accumulatedHeight += height;\r\n \r\n if (accumulatedHeight > viewportHeight + (bufferAmount * (typeof nodeHeight === 'number' ? nodeHeight : 22))) {\r\n endIndex = i;\r\n break;\r\n }\r\n }\r\n \r\n if (endIndex === startIndex) {\r\n endIndex = nodes.length;\r\n }\r\n \r\n return { startIndex, endIndex };\r\n });\r\n \r\n readonly visibleNodes = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n return nodes.slice(range.startIndex, range.endIndex);\r\n });\r\n \r\n readonly paddingTop = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n \r\n let height = 0;\r\n for (let i = 0; i < range.startIndex; i++) {\r\n height += typeof nodeHeight === 'number' \r\n ? nodeHeight \r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n return height;\r\n });\r\n \r\n readonly paddingBottom = computed(() => {\r\n const range = this.visibleRange();\r\n const nodes = this.flattenedNodes();\r\n const nodeHeight = this.options.nodeHeight || 22;\r\n const totalHeight = this.totalHeight();\r\n \r\n let visibleHeight = this.paddingTop();\r\n \r\n for (let i = range.startIndex; i < range.endIndex; i++) {\r\n visibleHeight += typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n return Math.max(0, totalHeight - visibleHeight);\r\n });\r\n \r\n constructor() {\r\n // Update viewport when tree changes\r\n effect(() => {\r\n this.flattenedNodes(); // Subscribe to changes\r\n this.updateViewport();\r\n });\r\n }\r\n \r\n ngOnInit(): void {\r\n this.setupScrollListener();\r\n this.updateViewportHeight();\r\n }\r\n \r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n \r\n private setupScrollListener(): void {\r\n fromEvent(this.scrollContainer.nativeElement, 'scroll')\r\n .pipe(\r\n debounceTime(10),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe(() => {\r\n this.onScroll();\r\n });\r\n }\r\n \r\n private updateViewportHeight(): void {\r\n const height = this.scrollContainer.nativeElement.clientHeight;\r\n this.viewportHeight.set(height);\r\n }\r\n \r\n onScroll(): void {\r\n const scrollTop = this.scrollContainer.nativeElement.scrollTop;\r\n this.scrollTop.set(scrollTop);\r\n }\r\n \r\n private updateViewport(): void {\r\n // Force recalculation\r\n this.scrollTop.set(this.scrollContainer.nativeElement.scrollTop);\r\n }\r\n \r\n scrollToNode(node: TreeNode): void {\r\n const nodes = this.flattenedNodes();\r\n const index = nodes.findIndex(n => n.id === node.id);\r\n \r\n if (index === -1) return;\r\n \r\n const nodeHeight = this.options.nodeHeight || 22;\r\n let targetScrollTop = 0;\r\n \r\n for (let i = 0; i < index; i++) {\r\n targetScrollTop += typeof nodeHeight === 'number'\r\n ? nodeHeight\r\n : nodeHeight(nodes[i]);\r\n }\r\n \r\n this.scrollContainer.nativeElement.scrollTop = targetScrollTop;\r\n }\r\n}","// lib/directives/tree-node-template.directive.ts\r\nimport { Directive, TemplateRef } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[treeNodeTemplate]',\r\n standalone: true,\r\n})\r\nexport class TreeNodeTemplateDirective {\r\n constructor(public template: TemplateRef<any>) {}\r\n}","// lib/components/tree-root/tree-root.component.ts\r\nimport {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnInit,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n HostListener,\r\n signal,\r\n contentChild,\r\n TemplateRef,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { TreeModel } from '../../core/models/tree.model';\r\nimport { TreeOptions, DEFAULT_TREE_OPTIONS } from '../../core/models/tree-options.model';\r\nimport { TreeEvent } from '../../core/models/tree-events.model';\r\nimport { TreeNodeComponent } from '../tree-node/tree-node.component';\r\nimport { TreeViewportComponent } from '../tree-viewport/tree-viewport.component';\r\nimport { TreeNodeTemplateDirective } from '../../directives/tree-node-template.directive';\r\n\r\n@Component({\r\n selector: 'tree-root',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n TreeNodeComponent,\r\n TreeViewportComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"tree-container\"\r\n [class.tree-rtl]=\"mergedOptions?.rtl\"\r\n tabindex=\"0\">\r\n\r\n @if (mergedOptions?.useVirtualScroll) {\r\n <tree-viewport\r\n [treeModel]=\"treeModel\"\r\n [options]=\"mergedOptions\"\r\n [nodeTemplate]=\"nodeTemplate()\">\r\n </tree-viewport>\r\n } @else {\r\n @for (root of treeModel.roots(); track root.id) {\r\n <tree-node\r\n [node]=\"root\"\r\n [treeModel]=\"treeModel\"\r\n [options]=\"mergedOptions\"\r\n [nodeTemplate]=\"nodeTemplate()\">\r\n </tree-node>\r\n }\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tree-container {\r\n width: 100%;\r\n height: 100%;\r\n outline: none;\r\n }\r\n \r\n .tree-rtl {\r\n direction: rtl;\r\n }\r\n `],\r\n host: {\r\n '[class.tree-focused]': 'isFocused()',\r\n },\r\n})\r\nexport class TreeRootComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() nodes: any[] = [];\r\n @Input() options: Partial<TreeOptions> = {};\r\n \r\n @Output() initialized = new EventEmitter<TreeEvent>();\r\n @Output() toggleExpanded = new EventEmitter<TreeEvent>();\r\n @Output() activate = new EventEmitter<TreeEvent>();\r\n @Output() deactivate = new EventEmitter<TreeEvent>();\r\n @Output() select = new EventEmitter<TreeEvent>();\r\n @Output() deselect = new EventEmitter<TreeEvent>();\r\n @Output() focus = new EventEmitter<TreeEvent>();\r\n @Output() blur = new EventEmitter<TreeEvent>();\r\n @Output() moveNode = new EventEmitter<TreeEvent>();\r\n @Output() loadChildren = new EventEmitter<TreeEvent>();\r\n @Output() treeEvent = new EventEmitter<TreeEvent>();\r\n \r\n // Content queries\r\n readonly nodeTemplate = contentChild(TreeNodeTemplateDirective, {\r\n read: TemplateRef\r\n });\r\n \r\n treeModel!: TreeModel;\r\n mergedOptions!: TreeOptions;\r\n isFocused = signal(false);\r\n\r\n private eventsSubscription?: Subscription;\r\n \r\n ngOnInit(): void {\r\n this.initializeTreeModel();\r\n }\r\n \r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['options'] && !changes['options'].firstChange) {\r\n this.initializeTreeModel();\r\n }\r\n \r\n if (changes['nodes'] && !changes['nodes'].firstChange) {\r\n this.treeModel.setData(this.nodes);\r\n }\r\n }\r\n \r\n private initializeTreeModel(): void {\r\n // Unsubscribe from previous subscription if exists\r\n this.eventsSubscription?.unsubscribe();\r\n\r\n this.mergedOptions = {\r\n ...DEFAULT_TREE_OPTIONS,\r\n ...this.options,\r\n };\r\n\r\n this.treeModel = new TreeModel(this.mergedOptions);\r\n this.treeModel.setData(this.nodes);\r\n\r\n // Subscribe to tree events\r\n this.eventsSubscription = this.treeModel.events$.subscribe(event => {\r\n this.handleTreeEvent(event);\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Clean up subscription\r\n this.eventsSubscription?.unsubscribe();\r\n }\r\n \r\n private handleTreeEvent(event: TreeEvent): void {\r\n this.treeEvent.emit(event);\r\n \r\n switch (event.type) {\r\n case 'initialized':\r\n this.initialized.emit(event);\r\n break;\r\n case 'expand':\r\n case 'collapse':\r\n this.toggleExpanded.emit(event);\r\n break;\r\n case 'activate':\r\n this.activate.emit(event);\r\n break;\r\n case 'deactivate':\r\n this.deactivate.emit(event);\r\n break;\r\n case 'select':\r\n this.select.emit(event);\r\n break;\r\n case 'deselect':\r\n this.deselect.emit(event);\r\n break;\r\n case 'focus':\r\n this.focus.emit(event);\r\n break;\r\n case 'blur':\r\n this.blur.emit(event);\r\n break;\r\n case 'moveNode':\r\n this.moveNode.emit(event);\r\n break;\r\n case 'loadChildren':\r\n this.loadChildren.emit(event);\r\n break;\r\n }\r\n }\r\n \r\n // Keyboard navigation\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(event: KeyboardEvent): void {\r\n if (!this.isFocused()) return;\r\n \r\n const key = event.key;\r\n const isRtl = this.options.rtl;\r\n \r\n switch (key) {\r\n case 'ArrowDown':\r\n this.treeModel.focusNextNode();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowUp':\r\n this.treeModel.focusPreviousNode();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowRight':\r\n isRtl ? this.treeModel.focusDrillUp() : this.treeModel.focusDrillDown();\r\n event.preventDefault();\r\n break;\r\n case 'ArrowLeft':\r\n isRtl ? this.treeModel.focusDrillDown() : this.treeModel.focusDrillUp();\r\n event.preventDefault();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n const focused = this.treeModel.focusedNode();\r\n if (focused) {\r\n this.treeModel.activateNode(focused);\r\n }\r\n event.preventDefault();\r\n break;\r\n }\r\n }\r\n \r\n @HostListener('focus')\r\n onFocus(): void {\r\n this.isFocused.set(true);\r\n }\r\n \r\n @HostListener('blur')\r\n onBlur(): void {\r\n this.isFocused.set(false);\r\n }\r\n}","import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, signal, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { TreeRootComponent } from './components/tree-root/tree-root.component';\r\nimport { TreeOptions } from './core/models/tree-options.model';\r\nimport { TreeEvent } from './core/models/tree-events.model';\r\nimport { TreeNode } from './core/models/tree-node.model';\r\n\r\n@Component({\r\n selector: 'lib-concepto-tree',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, TreeRootComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div class=\"concepto-tree-container\">\r\n <div class=\"search-bar-container\">\r\n <div class=\"custom-select\" [class.open]=\"isDropdownOpen()\" (click)=\"toggleDropdown()\">\r\n <div class=\"selected-option\">\r\n {{ selectedNode() ? selectedNode()?.data?.[displayField] : 'Buscar nodo...' }}\r\n </div>\r\n <div class=\"arrow\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 9L12 15L18 9\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke=\"currentColor\"/></svg></div>\r\n </div>\r\n \r\n <div class=\"backdrop\" *ngIf=\"isDropdownOpen()\" (click)=\"closeDropdown()\"></div>\r\n\r\n <div class=\"dropdown-menu\" *ngIf=\"isDropdownOpen()\">\r\n <div class=\"search-input-wrapper\" (click)=\"$event.stopPropagation()\">\r\n <input \r\n type=\"text\" \r\n [ngModel]=\"searchTerm()\"\r\n (ngModelChange)=\"searchTerm.set($event)\" \r\n placeholder=\"Buscar...\"\r\n class=\"search-input\"\r\n #searchInput\r\n autofocus\r\n >\r\n </div>\r\n <div class=\"options-list\">\r\n <div \r\n *ngFor=\"let node of filteredNodes()\" \r\n class=\"option-item\" \r\n (click)=\"selectNode(node); $event.stopPropagation()\"\r\n >\r\n {{ node.data[displayField] }}\r\n </div>\r\n <div *ngIf=\"filteredNodes().length === 0\" class=\"no-results\">\r\n No se encontraron resultados\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <tree-root\r\n [nodes]=\"nodes\"\r\n [options]=\"options\"\r\n (initialized)=\"onTreeInitialized($event)\"\r\n (toggleExpanded)=\"toggleExpanded.emit($event)\"\r\n (activate)=\"onNodeActivated($event)\"\r\n (deactivate)=\"deactivate.emit($event)\"\r\n (select)=\"select.emit($event)\"\r\n (deselect)=\"deselect.emit($event)\"\r\n (focus)=\"focus.emit($event)\"\r\n (blur)=\"blur.emit($event)\"\r\n (moveNode)=\"moveNode.emit($event)\"\r\n (loadChildren)=\"loadChildren.emit($event)\"\r\n (treeEvent)=\"treeEvent.emit($event)\"\r\n ></tree-root>\r\n </div>\r\n `,\r\n styles: [`\r\n .concepto-tree-container {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n gap: 10px;\r\n }\r\n \r\n .search-bar-container {\r\n position: relative;\r\n width: 100%;\r\n z-index: 100;\r\n }\r\n\r\n .custom-select {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 12px;\r\n border: 1px solid #ccc;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n background: #e7e7e7;\r\n user-select: none;\r\n transition: border-color 0.2s;\r\n }\r\n\r\n .custom-select:hover {\r\n border-color: #888;\r\n }\r\n \r\n .custom-select.open {\r\n border-color: #007bff;\r\n border-bottom-left-radius: 0;\r\n border-bottom-right-radius: 0;\r\n }\r\n\r\n .backdrop {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n z-index: 101;\r\n background: transparent;\r\n }\r\n\r\n .dropdown-menu {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n width: 100%;\r\n background: white;\r\n border: 1px solid #ccc;\r\n border-top: none;\r\n border-radius: 0 0 4px 4px;\r\n box-shadow: 0 4px 6px rgba(0,0,0,0.1);\r\n margin-top: 0;\r\n max-height: 300px;\r\n overflow-y: auto;\r\n z-index: 102;\r\n }\r\n\r\n .search-input-wrapper {\r\n padding: 8px;\r\n position: sticky;\r\n top: 0;\r\n background: white;\r\n border-bottom: 1px solid #eee;\r\n z-index: 103;\r\n }\r\n\r\n .search-input {\r\n width: 100%;\r\n padding: 8px;\r\n border: 1px solid #ddd;\r\n border-radius: 4px;\r\n box-sizing: border-box;\r\n outline: none;\r\n background: #e7e7e7;\r\n }\r\n \r\n .search-input:focus {\r\n border-color: #007bff;\r\n }\r\n\r\n .options-list {\r\n max-height: 250px;\r\n overflow-y: auto;\r\n }\r\n\r\n .option-item {\r\n padding: 8px 12px;\r\n cursor: pointer;\r\n transition: background-color 0.1s;\r\n }\r\n\r\n .option-item:hover {\r\n background-color: #f5f5f5;\r\n }\r\n\r\n .no-results {\r\n padding: 12px;\r\n color: #888;\r\n font-style: italic;\r\n text-align: center;\r\n }\r\n \r\n tree-root {\r\n flex: 1;\r\n overflow: hidden;\r\n }\r\n `]\r\n})\r\nexport class ConceptoTreeComponent {\r\n @Input() nodes: any[] = [];\r\n @Input() options: Partial<TreeOptions> = {};\r\n\r\n @Output() initialized = new EventEmitter<TreeEvent>();\r\n @Output() toggleExpanded = new EventEmitter<TreeEvent>();\r\n @Output() activate = new EventEmitter<TreeEvent>();\r\n @Output() deactivate = new EventEmitter<TreeEvent>();\r\n @Output() select = new EventEmitter<TreeEvent>();\r\n @Output() deselect = new EventEmitter<TreeEvent>();\r\n @Output() focus = new EventEmitter<TreeEvent>();\r\n @Output() blur = new EventEmitter<TreeEvent>();\r\n @Output() moveNode = new EventEmitter<TreeEvent>();\r\n @Output() loadChildren = new EventEmitter<TreeEvent>();\r\n @Output() treeEvent = new EventEmitter<TreeEvent>();\r\n\r\n @ViewChild(TreeRootComponent, { static: false }) treeRoot!: TreeRootComponent;\r\n\r\n // Estado con Signals\r\n isDropdownOpen = signal(false);\r\n searchTerm = signal(''); // Cambiamos a Signal\r\n selectedNode = signal<TreeNode | null>(null);\r\n \r\n // Almacén de todos los nodos (no necesita ser signal porque no cambia tras la carga inicial)\r\n private allNodes: TreeNode[] = [];\r\n\r\n // Signal computada: Se actualiza sola cuando cambia searchTerm o allNodes es asignado\r\n filteredNodes = computed(() => {\r\n const term = this.searchTerm().toLowerCase();\r\n if (!term) return this.allNodes;\r\n \r\n return this.allNodes.filter(node =>\r\n String(node.data[this.displayField]).toLowerCase().includes(term)\r\n );\r\n });\r\n\r\n get displayField(): string {\r\n return this.options.displayField || 'name';\r\n }\r\n\r\n toggleDropdown() {\r\n this.isDropdownOpen.update(v => !v);\r\n if (this.isDropdownOpen()) {\r\n this.searchTerm.set(''); // Reseteamos el término al abrir\r\n }\r\n }\r\n\r\n closeDropdown() {\r\n this.isDropdownOpen.set(false);\r\n }\r\n\r\n selectNode(node: TreeNode) {\r\n this.selectedNode.set(node);\r\n this.isDropdownOpen.set(false);\r\n\r\n // Use setTimeout to avoid 'firstCreatePass' error when accessing ViewChild\r\n setTimeout(() => {\r\n if (this.treeRoot?.treeModel) {\r\n // Expandir los nodos padres y activar el nodo\r\n node.setActiveAndVisible();\r\n\r\n // Hacer scroll al nodo después de un pequeño delay para permitir que se expandan los padres\r\n setTimeout(() => {\r\n this.scrollToNode(node);\r\n }, 300); // Delay para permitir que las animaciones de expansión terminen\r\n }\r\n });\r\n }\r\n\r\n private scrollToNode(node: TreeNode): void {\r\n // Buscar el elemento DOM del nodo usando su ID\r\n const nodeElement = document.querySelector(`.tree-node[data-node-id=\"${node.id}\"]`);\r\n\r\n if (nodeElement) {\r\n nodeElement.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'center',\r\n inline: 'nearest'\r\n });\r\n }\r\n }\r\n\r\n onTreeInitialized(event: TreeEvent) {\r\n this.initialized.emit(event);\r\n \r\n // Mantenemos el setTimeout para evitar el error 'firstCreatePass'\r\n setTimeout(() => {\r\n if (event.treeModel) {\r\n this.allNodes = event.treeModel.getAllNodes();\r\n \r\n // Buscamos manualmente el nodo activo si existe\r\n const activeNode = this.allNodes.find(n => n.isActive);\r\n if (activeNode) {\r\n this.selectedNode.set(activeNode);\r\n }\r\n \r\n // Forzamos una actualización inicial de la lista filtrada\r\n // Al setear searchTerm de nuevo, disparas el computed\r\n this.searchTerm.set('');\r\n }\r\n });\r\n }\r\n\r\n onNodeActivated(event: TreeEvent) {\r\n this.activate.emit(event);\r\n if (event.node) {\r\n this.selectedNode.set(event.node);\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ComparisonResult } from '../../components/entity-comparison.component';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EntityComparisonService {\r\n\r\n parseEntities(xmlString: string): any[] {\r\n const parser = new DOMParser();\r\n const xmlDoc = parser.parseFromString(xmlString, 'text/xml');\r\n \r\n const exportItems = xmlDoc.querySelectorAll('ExportItem[Type=\"Entity\"]');\r\n const entities: any[] = [];\r\n \r\n exportItems.forEach((item) => {\r\n const entity = item.querySelector('Entity_WithoutRedundancies');\r\n if (!entity) return;\r\n \r\n const structureJson = entity.querySelector('EntityStructureJson')?.textContent;\r\n if (!structureJson) return;\r\n \r\n try {\r\n const structure = JSON.parse(structureJson);\r\n entities.push({\r\n id: entity.querySelector('EntityId')?.textContent || '',\r\n name: entity.querySelector('EntityName')?.textContent || '',\r\n structure: structure\r\n });\r\n } catch (e) {\r\n console.error('Error parsing EntityStructureJson:', e);\r\n }\r\n });\r\n \r\n return entities;\r\n }\r\n\r\n compareStructures(leftStructure: any[], rightStructure: any[]): ComparisonResult {\r\n const leftOnly: any[] = [];\r\n const rightOnly: any[] = [];\r\n const modified: any[] = [];\r\n const unchanged: any[] = [];\r\n \r\n // Create maps for quick lookup\r\n const leftMap = this.createNodeMap(leftStructure);\r\n const rightMap = this.createNodeMap(rightStructure);\r\n \r\n // Find nodes only in left or modified\r\n for (const [key, leftNode] of leftMap.entries()) {\r\n if (!rightMap.has(key)) {\r\n leftOnly.push(leftNode);\r\n } else {\r\n const rightNode = rightMap.get(key);\r\n const diff = this.compareNodes(leftNode, rightNode!);\r\n if (diff.length > 0) {\r\n modified.push({ ...leftNode, modifiedProperties: diff });\r\n } else {\r\n unchanged.push(leftNode);\r\n }\r\n }\r\n }\r\n \r\n // Find nodes only in right\r\n for (const [key, rightNode] of rightMap.entries()) {\r\n if (!leftMap.has(key)) {\r\n rightOnly.push(rightNode);\r\n }\r\n }\r\n \r\n return { leftOnly, rightOnly, modified, unchanged };\r\n }\r\n\r\n private createNodeMap(structure: any[], parentPath: string = ''): Map<string, any> {\r\n const map = new Map<string, any>();\r\n \r\n for (const node of structure) {\r\n const nodePath = parentPath ? `${parentPath}/${node.Id}-${node.name}` : `${node.Id}-${node.name}`;\r\n map.set(nodePath, node);\r\n \r\n if (node.Children) {\r\n try {\r\n const children = JSON.parse(node.Children);\r\n const childMap = this.createNodeMap(children, nodePath);\r\n for (const [key, value] of childMap.entries()) {\r\n map.set(key, value);\r\n }\r\n } catch (e) {\r\n // Ignore parsing errors\r\n }\r\n }\r\n }\r\n \r\n return map;\r\n }\r\n\r\n private compareNodes(left: any, right: any): string[] {\r\n const modifiedProps: string[] = [];\r\n \r\n try {\r\n const leftProps = JSON.parse(left.Properties || '{}');\r\n const rightProps = JSON.parse(right.Properties || '{}');\r\n \r\n const allKeys = new Set([\r\n ...Object.keys(leftProps),\r\n ...Object.keys(rightProps)\r\n ]);\r\n \r\n for (const key of allKeys) {\r\n if (leftProps[key] !== rightProps[key]) {\r\n modifiedProps.push(key);\r\n }\r\n }\r\n } catch (e) {\r\n // Ignore parsing errors\r\n }\r\n \r\n return modifiedProps;\r\n }\r\n}","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EntityComparisonService } from '../core/services/entity-comparison.service';\r\n\r\nexport interface ComparisonResult {\r\n leftOnly: any[];\r\n rightOnly: any[];\r\n modified: any[];\r\n unchanged: any[];\r\n}\r\n\r\n@Component({\r\n selector: 'app-entity-comparison',\r\n standalone: true,\r\n imports: [CommonModule],\r\n providers: [EntityComparisonService],\r\n templateUrl: './entity-comparison.component.html',\r\n styleUrls: ['./entity-comparison.component.css']\r\n})\r\nexport class EntityComparisonComponent {\r\n leftFile: string = '';\r\n rightFile: string = '';\r\n leftEntities: any[] = [];\r\n rightEntities: any[] = [];\r\n selectedLeftEntity: any = null;\r\n selectedRightEntity: any = null;\r\n comparisonResult: ComparisonResult | null = null;\r\n expandedNodes = new Set<string>();\r\n isFullScreen = false;\r\n currentDifferenceIndex = 0;\r\n differences: any[] = [];\r\n\r\n constructor(private comparisonService: EntityComparisonService) {}\r\n\r\n onLeftFileSelected(event: any): void {\r\n const file: File = event.target.files[0];\r\n if (!file) return;\r\n\r\n this.leftFile = file.name;\r\n const reader = new FileReader();\r\n \r\n reader.onload = (e: any) => {\r\n const xmlContent = e.target.result;\r\n this.leftEntities = this.comparisonService.parseEntities(xmlContent);\r\n this.selectedLeftEntity = null;\r\n this.comparisonResult = null;\r\n };\r\n \r\n reader.readAsText(file);\r\n }\r\n\r\n onRightFileSelected(event: any): void {\r\n const file: File = event.target.files[0];\r\n if (!file) return;\r\n\r\n this.rightFile = file.name;\r\n const reader = new FileReader();\r\n \r\n reader.onload = (e: any) => {\r\n const xmlContent = e.target.result;\r\n this.rightEntities = this.comparisonService.parseEntities(xmlContent);\r\n this.selectedRightEntity = null;\r\n this.comparisonResult = null;\r\n };\r\n \r\n reader.readAsText(file);\r\n }\r\n\r\n selectLeftEntity(entity: any): void {\r\n this.selectedLeftEntity = entity;\r\n this.compareIfBothSelected();\r\n }\r\n\r\n selectRightEntity(entity: any): void {\r\n this.selectedRightEntity = entity;\r\n this.compareIfBothSelected();\r\n }\r\n\r\n private compareIfBothSelected(): void {\r\n if (this.selectedLeftEntity && this.selectedRightEntity) {\r\n this.comparisonResult = this.comparisonService.compareStructures(\r\n this.selectedLeftEntity.structure,\r\n this.selectedRightEntity.structure\r\n );\r\n this.buildDifferencesList();\r\n this.currentDifferenceIndex = 0;\r\n }\r\n }\r\n\r\n private buildDifferencesList(): void {\r\n if (!this.comparisonResult) {\r\n this.differences = [];\r\n return;\r\n }\r\n\r\n this.differences = [\r\n ...this.comparisonResult.leftOnly.map(node => ({ node, type: 'removed' })),\r\n ...this.comparisonResult.rightOnly.map(node => ({ node, type: 'added' })),\r\n ...this.comparisonResult.modified.map(node => ({ node, type: 'modified' }))\r\n ];\r\n }\r\n\r\n navigateToNextDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n this.currentDifferenceIndex = (this.currentDifferenceIndex + 1) % this.differences.length;\r\n this.scrollToDifference();\r\n }\r\n\r\n navigateToPreviousDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n this.currentDifferenceIndex = this.currentDifferenceIndex === 0\r\n ? this.differences.length - 1\r\n : this.currentDifferenceIndex - 1;\r\n this.scrollToDifference();\r\n }\r\n\r\n private scrollToDifference(): void {\r\n if (this.differences.length === 0) return;\r\n\r\n const currentDiff = this.differences[this.currentDifferenceIndex];\r\n const nodeId = `${currentDiff.node.Id}-${currentDiff.node.name}`;\r\n\r\n // Expand parent nodes FIRST to make the difference visible\r\n this.expandPathToNode(currentDiff.node);\r\n\r\n // Wait for DOM to update after expansion, then scroll\r\n setTimeout(() => {\r\n const leftElement = document.querySelector(`[data-node-id=\"left-${nodeId}\"]`);\r\n const rightElement = document.querySelector(`[data-node-id=\"right-${nodeId}\"]`);\r\n\r\n if (leftElement) {\r\n leftElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n if (rightElement) {\r\n rightElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }, 100);\r\n }\r\n\r\n private expandPathToNode(node: any): void {\r\n // Find and expand all parent nodes in both structures\r\n this.expandParentsInStructure(this.selectedLeftEntity.structure, node, 'left');\r\n this.expandParentsInStructure(this.selectedRightEntity.structure, node, 'right');\r\n }\r\n\r\n private expandParentsInStructure(structure: any[], targetNode: any, side: string): boolean {\r\n for (const node of structure) {\r\n const nodeId = `${side}-${node.Id}-${node.name}`;\r\n const targetId = `${targetNode.Id}-${targetNode.name}`;\r\n const currentId = `${node.Id}-${node.name}`;\r\n\r\n // If this is the target node, we found it\r\n if (currentId === targetId) {\r\n return true;\r\n }\r\n\r\n // Check children if they exist\r\n if (this.hasChildren(node)) {\r\n const children = this.getChildren(node);\r\n if (this.expandParentsInStructure(children, targetNode, side)) {\r\n // If the target is in this branch, expand this node\r\n this.expandedNodes.add(nodeId);\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n get hasDifferences(): boolean {\r\n return this.differences.length > 0;\r\n }\r\n\r\n get currentDifferenceNumber(): number {\r\n return this.currentDifferenceIndex + 1;\r\n }\r\n\r\n get totalDifferences(): number {\r\n return this.differences.length;\r\n }\r\n\r\n toggleNode(nodeId: string): void {\r\n if (this.expandedNodes.has(nodeId)) {\r\n this.expandedNodes.delete(nodeId);\r\n } else {\r\n this.expandedNodes.add(nodeId);\r\n }\r\n }\r\n\r\n isExpanded(nodeId: string): boolean {\r\n return this.expandedNodes.has(nodeId);\r\n }\r\n\r\n getNodeId(node: any, prefix: string): string {\r\n return `${prefix}-${node.Id}-${node.name}`;\r\n }\r\n\r\n hasChildren(node: any): boolean {\r\n return node.Children && JSON.parse(node.Children).length > 0;\r\n }\r\n\r\n getChildren(node: any): any[] {\r\n if (!node.Children) return [];\r\n try {\r\n return JSON.parse(node.Children);\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n getProperties(node: any): any {\r\n if (!node.Properties) return {};\r\n try {\r\n return JSON.parse(node.Properties);\r\n } catch {\r\n return {};\r\n }\r\n }\r\n\r\n getPropertyKeys(node: any): string[] {\r\n const props = this.getProperties(node);\r\n return Object.keys(props);\r\n }\r\n\r\n getChangeType(node: any): string {\r\n if (!this.comparisonResult) return '';\r\n \r\n const nodeId = `${node.Id}-${node.name}`;\r\n \r\n if (this.comparisonResult.leftOnly.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'removed';\r\n }\r\n if (this.comparisonResult.rightOnly.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'added';\r\n }\r\n if (this.comparisonResult.modified.some(n => `${n.Id}-${n.name}` === nodeId)) {\r\n return 'modified';\r\n }\r\n return 'unchanged';\r\n }\r\n\r\n getModifiedProperties(node: any): string[] {\r\n if (!this.comparisonResult) return [];\r\n\r\n const nodeId = `${node.Id}-${node.name}`;\r\n const modified = this.comparisonResult.modified.find(n => `${n.Id}-${n.name}` === nodeId);\r\n\r\n return modified?.modifiedProperties || [];\r\n }\r\n\r\n toggleFullScreen(): void {\r\n this.isFullScreen = !this.isFullScreen;\r\n }\r\n}","<div class=\"comparison-container\" [class.fullscreen]=\"isFullScreen\">\r\n <header class=\"header\">\r\n <h1>Entity Structure Comparison</h1>\r\n <p class=\"subtitle\">Compare EntityStructureJson between two entity exports</p>\r\n </header>\r\n\r\n <div class=\"file-selection\">\r\n <div class=\"file-input-group\">\r\n <label class=\"file-label left\">\r\n <input type=\"file\" accept=\".xml\" (change)=\"onLeftFileSelected($event)\" hidden>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"17 8 12 3 7 8\" />\r\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\r\n </svg>\r\n Load Left Entity\r\n </label>\r\n <span *ngIf=\"leftFile\" class=\"file-name\">{{ leftFile }}</span>\r\n </div>\r\n\r\n <div class=\"vs-separator\">VS</div>\r\n\r\n <div class=\"file-input-group\">\r\n <label class=\"file-label right\">\r\n <input type=\"file\" accept=\".xml\" (change)=\"onRightFileSelected($event)\" hidden>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\r\n <polyline points=\"17 8 12 3 7 8\" />\r\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\r\n </svg>\r\n Load Right Entity\r\n </label>\r\n <span *ngIf=\"rightFile\" class=\"file-name\">{{ rightFile }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"entity-selection\" *ngIf=\"leftEntities.length > 0 || rightEntities.length > 0\">\r\n <div class=\"entity-list\">\r\n <h3>Left Entities</h3>\r\n <div class=\"entities\">\r\n <div *ngFor=\"let entity of leftEntities\" class=\"entity-card\"\r\n [class.selected]=\"selectedLeftEntity === entity\" (click)=\"selectLeftEntity(entity)\">\r\n <div class=\"entity-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\">\r\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n </svg>\r\n </div>\r\n <div class=\"entity-info\">\r\n <div class=\"entity-name\">{{ entity.name }}</div>\r\n <div class=\"entity-id\">{{ entity.id }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"entity-list\">\r\n <h3>Right Entities</h3>\r\n <div class=\"entities\">\r\n <div *ngFor=\"let entity of rightEntities\" class=\"entity-card\"\r\n [class.selected]=\"selectedRightEntity === entity\" (click)=\"selectRightEntity(entity)\">\r\n <div class=\"entity-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\">\r\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n </svg>\r\n </div>\r\n <div class=\"entity-info\">\r\n <div class=\"entity-name\">{{ entity.name }}</div>\r\n <div class=\"entity-id\">{{ entity.id }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"summary-section\" *ngIf=\"comparisonResult\">\r\n <div class=\"summary\">\r\n <div class=\"summary-item added\">\r\n <span class=\"count\">{{ comparisonResult.rightOnly.length }}</span>\r\n <span class=\"label\">Added</span>\r\n </div>\r\n <div class=\"summary-item removed\">\r\n <span class=\"count\">{{ comparisonResult.leftOnly.length }}</span>\r\n <span class=\"label\">Removed</span>\r\n </div>\r\n <div class=\"summary-item modified\">\r\n <span class=\"count\">{{ comparisonResult.modified.length }}</span>\r\n <span class=\"label\">Modified</span>\r\n </div>\r\n <div class=\"summary-item unchanged\">\r\n <span class=\"count\">{{ comparisonResult.unchanged.length }}</span>\r\n <span class=\"label\">Unchanged</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"comparison-results\" *ngIf=\"comparisonResult\">\r\n <div class=\"results-header\">\r\n <div class=\"header-title\">\r\n <h2>Comparison Results</h2>\r\n <div class=\"header-actions\">\r\n <div class=\"diff-navigation\" *ngIf=\"hasDifferences\">\r\n <button class=\"nav-btn\" (click)=\"navigateToPreviousDifference()\" title=\"Previous Difference\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"18 15 12 9 6 15\" />\r\n </svg>\r\n </button>\r\n <span class=\"diff-counter\">{{ currentDifferenceNumber }} / {{ totalDifferences }}</span>\r\n <button class=\"nav-btn\" (click)=\"navigateToNextDifference()\" title=\"Next Difference\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <button class=\"fullscreen-btn\" (click)=\"toggleFullScreen()\" [title]=\"isFullScreen ? 'Exit Full Screen' : 'Enter Full Screen'\">\r\n <svg *ngIf=\"!isFullScreen\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\" />\r\n </svg>\r\n <svg *ngIf=\"isFullScreen\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3\" />\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"structure-comparison\">\r\n <div class=\"comparison-section\">\r\n <h3>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M9 11l3 3L22 4\" />\r\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />\r\n </svg>\r\n {{ selectedLeftEntity.name }}\r\n </h3>\r\n <div class=\"structure-tree\">\r\n <ng-container *ngFor=\"let node of selectedLeftEntity.structure\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: node, side: 'left' }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"comparison-section\">\r\n <h3>\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M9 11l3 3L22 4\" />\r\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />\r\n </svg>\r\n {{ selectedRightEntity.name }}\r\n </h3>\r\n <div class=\"structure-tree\">\r\n <ng-container *ngFor=\"let node of selectedRightEntity.structure\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: node, side: 'right' }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #nodeTemplate let-node let-side=\"side\">\r\n <div class=\"tree-node\" [class]=\"getChangeType(node)\" [attr.data-node-id]=\"getNodeId(node, side)\">\r\n <div class=\"node-header\">\r\n <button *ngIf=\"hasChildren(node)\" class=\"expand-btn\" (click)=\"toggleNode(getNodeId(node, side))\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <polyline *ngIf=\"!isExpanded(getNodeId(node, side))\" points=\"9 18 15 12 9 6\" />\r\n <polyline *ngIf=\"isExpanded(getNodeId(node, side))\" points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n </button>\r\n <div *ngIf=\"!hasChildren(node)\" class=\"spacer\"></div>\r\n\r\n <div class=\"node-icon\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path *ngIf=\"node.nodeType === 'Group'\"\r\n d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n <circle *ngIf=\"node.nodeType === 'Attribute'\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"node-content\">\r\n <span class=\"node-name\">{{ node.name }}</span>\r\n <span class=\"node-type\">{{ node.nodeType }}</span>\r\n <span class=\"change-badge\" *ngIf=\"getChangeType(node) !== 'unchanged'\">\r\n {{ getChangeType(node) }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"node-properties\" *ngIf=\"getPropertyKeys(node).length > 0\">\r\n <div *ngFor=\"let key of getPropertyKeys(node)\" class=\"property\"\r\n [class.modified]=\"getModifiedProperties(node).includes(key)\">\r\n <span class=\"property-key\">{{ key }}:</span>\r\n <span class=\"property-value\">{{ getProperties(node)[key] }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"node-children\" *ngIf=\"hasChildren(node) && isExpanded(getNodeId(node, side))\">\r\n <ng-container *ngFor=\"let child of getChildren(node)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"nodeTemplate; context: { $implicit: child, side: side }\"></ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>","import { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'concepto-input',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './concepto-input.component.html',\r\n styleUrl: './concepto-input.component.css'\r\n})\r\nexport class ConceptoInputComponent {\r\n @Input() labelText: string = 'Date';\r\n @Input() name: string = 'date-input';\r\n @Input() type: string = 'text';\r\n}\r\n","<div class=\"field\">\r\n @if(labelText !== '') {\r\n <label [for]=\"name\" class=\"label\">{{labelText}}</label>\r\n }\r\n @if(type === 'text') {\r\n <input [name]=\"name\" [id]=\"name\" type=\"text\" class=\"text-input\" />\r\n } @else if(type === 'date') {\r\n <input [name]=\"name\" [id]=\"name\" type=\"date\" class=\"date-input\" />\r\n } @else if(type === 'dropdown') {\r\n <select [name]=\"name\" [id]=\"name\" class=\"dropdown-input\">\r\n <option value=\"\" disabled selected>Select an option</option>\r\n </select>\r\n }\r\n</div>","/*\r\n * Public API Surface of concepto-message\r\n */\r\n\r\nexport * from './lib/concepto-user-controls.service';\r\nexport * from './lib/concepto-user-controls.component';\r\nexport * from './lib/concepto-message/concepto-message.component';\r\nexport * from './lib/concepto-context-menu/concepto-context-menu.component';\r\nexport * from './lib/concepto-tree/concepto-tree.component';\r\nexport * from './lib/entity-comparison/components/entity-comparison.component';\r\nexport * from './lib/entity-comparison/core/services/entity-comparison.service';\r\nexport * from './lib/concepto-input/concepto-input.component';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.EntityComparisonService","i2"],"mappings":"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"}
|