keevo-components 2.0.172 → 2.0.174

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Component, Input, Output, ViewChild, Injectable, signal, Directive, Pipe, ViewChildren, ContentChildren, forwardRef, viewChild, input, model, output, effect, computed, HostListener, TemplateRef, ContentChild, NgModule, untracked, inject, ChangeDetectionStrategy, ViewContainerRef, HostBinding, contentChildren, Injector } from '@angular/core';
2
+ import { EventEmitter, Component, Input, Output, ViewChild, Injectable, signal, Directive, Pipe, ViewChildren, ContentChildren, forwardRef, viewChild, input, model, output, effect, computed, HostListener, TemplateRef, ContentChild, NgModule, untracked, inject, ChangeDetectionStrategy, ViewContainerRef, HostBinding, contentChildren, Injector, ChangeDetectorRef } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule, NgClass, DatePipe } from '@angular/common';
5
5
  import * as i1$1 from 'primeng/button';
@@ -13282,41 +13282,91 @@ class NoArvoreComponent {
13282
13282
  constructor() {
13283
13283
  this.noPlano = input.required();
13284
13284
  this.noAlternado = new EventEmitter();
13285
+ this.actionExecuted = new EventEmitter();
13286
+ this._cachedItems = null;
13287
+ this._lastActionsLength = -1;
13288
+ this._lastActionsLabels = '';
13289
+ this._cachedStyles = {};
13290
+ }
13291
+ ngOnDestroy() {
13292
+ this._cachedItems = null;
13293
+ this._cachedStyles = {};
13294
+ this._lastActionsLength = -1;
13295
+ this._lastActionsLabels = '';
13285
13296
  }
13286
13297
  get items() {
13287
- return this.noPlano().dadosOriginais.actions || [];
13298
+ const actionsOriginais = this.noPlano().dadosOriginais.actions || [];
13299
+ const currentLength = actionsOriginais.length;
13300
+ const currentLabels = actionsOriginais.map(a => a.label).join('|');
13301
+ if (this._lastActionsLength !== currentLength || this._lastActionsLabels !== currentLabels) {
13302
+ this._cachedItems = actionsOriginais.map(action => ({
13303
+ ...action,
13304
+ command: undefined
13305
+ }));
13306
+ this._lastActionsLength = currentLength;
13307
+ this._lastActionsLabels = currentLabels;
13308
+ }
13309
+ return this._cachedItems || [];
13310
+ }
13311
+ getOriginalCommand(actionLabel) {
13312
+ const actionsOriginais = this.noPlano().dadosOriginais.actions || [];
13313
+ const action = actionsOriginais.find(a => a.label === actionLabel);
13314
+ return action?.command;
13288
13315
  }
13289
13316
  alternarExpansao() {
13290
13317
  this.noAlternado.emit(this.noPlano());
13291
13318
  }
13319
+ onActionClick(item, event) {
13320
+ this.actionExecuted.emit(this.noPlano());
13321
+ const originalCommand = this.getOriginalCommand(item.label);
13322
+ if (originalCommand) {
13323
+ originalCommand(event);
13324
+ }
13325
+ event.stopPropagation();
13326
+ event.preventDefault();
13327
+ }
13292
13328
  ehNoPai() {
13293
13329
  const no = this.noPlano().dadosOriginais;
13294
13330
  return !!(no.filhos && no.filhos.length > 0);
13295
13331
  }
13296
13332
  obterEstilosIcone(no) {
13333
+ const cacheKey = `${no.rotulo}:${!!no.filhos?.length}:${no.ativo}:${no.cor}`;
13334
+ if (this._cachedStyles[cacheKey]) {
13335
+ return this._cachedStyles[cacheKey];
13336
+ }
13297
13337
  const pai = no.filhos && no.filhos.length > 0;
13298
13338
  const corPadrao = '#2f80ed';
13299
13339
  const corFinal = no.cor || corPadrao;
13340
+ let estilos;
13300
13341
  if (no.ativo === false) {
13301
- return pai
13342
+ estilos = pai
13302
13343
  ? { 'background-color': '#f2f2f2', 'color': '#bdbdbd' }
13303
13344
  : { 'background-color': 'transparent', 'color': '#bdbdbd' };
13304
13345
  }
13305
- return pai
13306
- ? { 'background-color': corFinal, 'color': 'white' }
13307
- : { 'background-color': 'transparent', 'color': corFinal };
13346
+ else {
13347
+ estilos = pai
13348
+ ? { 'background-color': corFinal, 'color': 'white' }
13349
+ : { 'background-color': 'transparent', 'color': corFinal };
13350
+ }
13351
+ if (Object.keys(this._cachedStyles).length < 100) {
13352
+ this._cachedStyles[cacheKey] = estilos;
13353
+ }
13354
+ return estilos;
13308
13355
  }
13309
13356
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: NoArvoreComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13310
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: NoArvoreComponent, isStandalone: true, selector: "no-arvore", inputs: { noPlano: { classPropertyName: "noPlano", publicName: "noPlano", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { noAlternado: "noAlternado" }, ngImport: i0, template: "<li \n class=\"no-container\"\n [class.inativo]=\"noPlano().dadosOriginais.ativo === false\">\n\n <div class=\"linhas-guia\">\n @for(i of [].constructor(noPlano().nivel); track i) {\n <div class=\"linha-vertical\"></div>\n }\n </div>\n\n <div \n class=\"no-conteudo\" \n [class.is-last-child]=\"noPlano().isLast\"\n (click)=\"alternarExpansao()\">\n\n <div class=\"container-icone\" [ngStyle]=\"obterEstilosIcone(noPlano().dadosOriginais)\">\n <span class=\"material-symbols-outlined text-lg no-icone\">\n {{ noPlano().dadosOriginais.icone }}\n </span>\n </div>\n\n <span \n class=\"no-rotulo\"\n [class.font-bold]=\"ehNoPai()\"\n [class.text-500]=\"ehNoPai()\">\n {{ noPlano().dadosOriginais.rotulo }}\n </span>\n\n @if (items.length > 0) {\n <span\n class=\"material-symbols-outlined flex text-lg ml-2 cursor-pointer icone-arrow\"\n (click)=\"$event.stopPropagation()\"\n (click)=\"menu.toggle($event)\"\n >\n more_horiz\n </span>\n\n <p-tieredMenu\n #menu\n [popup]=\"true\"\n [model]=\"items\"\n appendTo=\"body\"\n >\n <ng-template let-item pTemplate=\"item\">\n <div\n [pTooltip]=\"item.tooltip\"\n tooltipPosition=\"left\"\n class=\"cursor-pointer\"\n >\n <span class=\"text-xs\">\n {{ item.label }}\n </span>\n </div>\n </ng-template>\n </p-tieredMenu>\n }\n \n </div>\n \n \n</li>\n\n", styles: [":host{--ident-size: 2rem;--line-color: #e0e0e0;--line-width: 1px}.no-container{display:flex;align-items:stretch;position:relative}.linhas-guia{display:flex;flex-shrink:0;position:relative}.linha-vertical{width:var(--ident-size);position:relative}.linha-vertical:before{content:\"\";position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%);width:var(--line-width);background-color:var(--line-color)}.no-conteudo{display:flex;align-items:center;cursor:pointer;position:relative;padding:4px 4px 4px 0}.no-conteudo:before{content:\"\";position:absolute;left:calc(var(--ident-size) / -2);top:50%;width:calc(var(--ident-size) / 2);height:var(--line-width);background-color:var(--line-color)}.no-conteudo:hover{background-color:#0000000a;border-radius:4px}.is-last-child~.linhas-guia .linha-vertical:last-child:before,.is-last-child .linhas-guia .linha-vertical:last-child:before{height:50%}:host:first-child .no-conteudo:before,:host:first-child .linhas-guia{display:none}.no-seta{transition:transform .25s ease-in-out;color:#555;width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:24px}.no-seta.rotacionado{transform:rotate(0)}.no-seta:not(.rotacionado){transform:rotate(-90deg)}.container-icone{width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:3px;margin-right:8px;flex-shrink:0}.container-icone .no-icone{font-size:18px}.no-rotulo{font-family:system-ui,sans-serif;color:#333}.inativo .no-rotulo,.inativo .no-seta{color:#bdbdbd}.icone-arrow{font-weight:500;color:rgb(var(--kv-color-system),.75);transition:all .4s;height:15px;opacity:0;transition:opacity .2s ease,transform .2s ease;padding:1px}.icone-arrow:hover{background:#0000001a;border-radius:4px}.no-conteudo:hover .icone-arrow{opacity:1}::ng-deep .p-tieredmenu{padding:.5rem!important}::ng-deep .p-tieredmenu .p-tieredmenu-root-list{font-size:.75rem!important}::ng-deep .p-tieredmenu .p-menuitem>.p-menuitem-content{padding:.5rem}::ng-deep p-tieredmenusub .p-disabled *:active{pointer-events:none!important;font-size:.75rem!important;padding:.5rem!important}::ng-deep .p-disabled *{pointer-events:auto!important}.icon-more{font-weight:500;font-size:1.4rem!important;color:rgb(var(--kv-color-system),.75);transition:all .4s}.icon-more:hover,.icon-more:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: TieredMenuModule }, { kind: "component", type: i13.TieredMenu, selector: "p-tieredMenu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "autoDisplay", "showTransitionOptions", "hideTransitionOptions", "id", "ariaLabel", "ariaLabelledBy", "disabled", "tabindex"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i2$3.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i1$2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }] }); }
13357
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: NoArvoreComponent, isStandalone: true, selector: "no-arvore", inputs: { noPlano: { classPropertyName: "noPlano", publicName: "noPlano", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { noAlternado: "noAlternado", actionExecuted: "actionExecuted" }, ngImport: i0, template: "<li \n class=\"no-container\"\n [class.inativo]=\"noPlano().dadosOriginais.ativo === false\">\n\n <div class=\"linhas-guia\">\n @for(i of [].constructor(noPlano().nivel); track i) {\n <div class=\"linha-vertical\"></div>\n }\n </div>\n\n <div \n class=\"no-conteudo\" \n [class.is-last-child]=\"noPlano().isLast\"\n (click)=\"alternarExpansao()\">\n\n <div class=\"container-icone\" [ngStyle]=\"obterEstilosIcone(noPlano().dadosOriginais)\">\n <span class=\"material-symbols-outlined text-lg no-icone\">\n {{ noPlano().dadosOriginais.icone }}\n </span>\n </div>\n\n <span \n class=\"no-rotulo\"\n [class.font-bold]=\"ehNoPai()\"\n [class.text-500]=\"ehNoPai()\">\n {{ noPlano().dadosOriginais.rotulo }}\n </span>\n\n @if (items.length > 0) {\n <span\n class=\"material-symbols-outlined flex text-lg ml-2 cursor-pointer icone-arrow\"\n (click)=\"$event.stopPropagation()\"\n (click)=\"menu.toggle($event)\"\n >\n more_horiz\n </span>\n\n <p-tieredMenu\n #menu\n [popup]=\"true\"\n [model]=\"items\"\n appendTo=\"body\"\n >\n <ng-template let-item pTemplate=\"item\">\n <div\n [pTooltip]=\"item.tooltip\"\n tooltipPosition=\"left\"\n class=\"cursor-pointer\"\n (click)=\"onActionClick(item, $event)\"\n >\n <span class=\"text-xs\">\n {{ item.label }}\n </span>\n </div>\n </ng-template>\n </p-tieredMenu>\n }\n \n </div>\n \n \n</li>\n\n", styles: [":host{--ident-size: 2rem;--line-color: #e0e0e0;--line-width: 1px}.no-container{display:flex;align-items:stretch;position:relative}.linhas-guia{display:flex;flex-shrink:0;position:relative}.linha-vertical{width:var(--ident-size);position:relative}.linha-vertical:before{content:\"\";position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%);width:var(--line-width);background-color:var(--line-color)}.no-conteudo{display:flex;align-items:center;cursor:pointer;position:relative;padding:4px 4px 4px 0}.no-conteudo:before{content:\"\";position:absolute;left:calc(var(--ident-size) / -2);top:50%;width:calc(var(--ident-size) / 2);height:var(--line-width);background-color:var(--line-color)}.no-conteudo:hover{background-color:#0000000a;border-radius:4px}.is-last-child~.linhas-guia .linha-vertical:last-child:before,.is-last-child .linhas-guia .linha-vertical:last-child:before{height:50%}:host:first-child .no-conteudo:before,:host:first-child .linhas-guia{display:none}.no-seta{transition:transform .25s ease-in-out;color:#555;width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:24px}.no-seta.rotacionado{transform:rotate(0)}.no-seta:not(.rotacionado){transform:rotate(-90deg)}.container-icone{width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:3px;margin-right:8px;flex-shrink:0}.container-icone .no-icone{font-size:18px}.no-rotulo{font-family:system-ui,sans-serif;color:#333}.inativo .no-rotulo,.inativo .no-seta{color:#bdbdbd}.icone-arrow{font-weight:500;color:rgb(var(--kv-color-system),.75);transition:all .4s;height:15px;opacity:0;transition:opacity .2s ease,transform .2s ease;padding:1px}.icone-arrow:hover{background:#0000001a;border-radius:4px}.no-conteudo:hover .icone-arrow{opacity:1}::ng-deep .p-tieredmenu{padding:.5rem!important}::ng-deep .p-tieredmenu .p-tieredmenu-root-list{font-size:.75rem!important}::ng-deep .p-tieredmenu .p-menuitem>.p-menuitem-content{padding:.5rem}::ng-deep p-tieredmenusub .p-disabled *:active{pointer-events:none!important;font-size:.75rem!important;padding:.5rem!important}::ng-deep .p-disabled *{pointer-events:auto!important}.icon-more{font-weight:500;font-size:1.4rem!important;color:rgb(var(--kv-color-system),.75);transition:all .4s}.icon-more:hover,.icon-more:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: TieredMenuModule }, { kind: "component", type: i13.TieredMenu, selector: "p-tieredMenu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "autoDisplay", "showTransitionOptions", "hideTransitionOptions", "id", "ariaLabel", "ariaLabelledBy", "disabled", "tabindex"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i2$3.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "directive", type: i1$2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: TooltipModule }] }); }
13311
13358
  }
13312
13359
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: NoArvoreComponent, decorators: [{
13313
13360
  type: Component,
13314
13361
  args: [{ standalone: true, selector: 'no-arvore', imports: [
13315
13362
  CommonModule,
13316
- TieredMenuModule
13317
- ], template: "<li \n class=\"no-container\"\n [class.inativo]=\"noPlano().dadosOriginais.ativo === false\">\n\n <div class=\"linhas-guia\">\n @for(i of [].constructor(noPlano().nivel); track i) {\n <div class=\"linha-vertical\"></div>\n }\n </div>\n\n <div \n class=\"no-conteudo\" \n [class.is-last-child]=\"noPlano().isLast\"\n (click)=\"alternarExpansao()\">\n\n <div class=\"container-icone\" [ngStyle]=\"obterEstilosIcone(noPlano().dadosOriginais)\">\n <span class=\"material-symbols-outlined text-lg no-icone\">\n {{ noPlano().dadosOriginais.icone }}\n </span>\n </div>\n\n <span \n class=\"no-rotulo\"\n [class.font-bold]=\"ehNoPai()\"\n [class.text-500]=\"ehNoPai()\">\n {{ noPlano().dadosOriginais.rotulo }}\n </span>\n\n @if (items.length > 0) {\n <span\n class=\"material-symbols-outlined flex text-lg ml-2 cursor-pointer icone-arrow\"\n (click)=\"$event.stopPropagation()\"\n (click)=\"menu.toggle($event)\"\n >\n more_horiz\n </span>\n\n <p-tieredMenu\n #menu\n [popup]=\"true\"\n [model]=\"items\"\n appendTo=\"body\"\n >\n <ng-template let-item pTemplate=\"item\">\n <div\n [pTooltip]=\"item.tooltip\"\n tooltipPosition=\"left\"\n class=\"cursor-pointer\"\n >\n <span class=\"text-xs\">\n {{ item.label }}\n </span>\n </div>\n </ng-template>\n </p-tieredMenu>\n }\n \n </div>\n \n \n</li>\n\n", styles: [":host{--ident-size: 2rem;--line-color: #e0e0e0;--line-width: 1px}.no-container{display:flex;align-items:stretch;position:relative}.linhas-guia{display:flex;flex-shrink:0;position:relative}.linha-vertical{width:var(--ident-size);position:relative}.linha-vertical:before{content:\"\";position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%);width:var(--line-width);background-color:var(--line-color)}.no-conteudo{display:flex;align-items:center;cursor:pointer;position:relative;padding:4px 4px 4px 0}.no-conteudo:before{content:\"\";position:absolute;left:calc(var(--ident-size) / -2);top:50%;width:calc(var(--ident-size) / 2);height:var(--line-width);background-color:var(--line-color)}.no-conteudo:hover{background-color:#0000000a;border-radius:4px}.is-last-child~.linhas-guia .linha-vertical:last-child:before,.is-last-child .linhas-guia .linha-vertical:last-child:before{height:50%}:host:first-child .no-conteudo:before,:host:first-child .linhas-guia{display:none}.no-seta{transition:transform .25s ease-in-out;color:#555;width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:24px}.no-seta.rotacionado{transform:rotate(0)}.no-seta:not(.rotacionado){transform:rotate(-90deg)}.container-icone{width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:3px;margin-right:8px;flex-shrink:0}.container-icone .no-icone{font-size:18px}.no-rotulo{font-family:system-ui,sans-serif;color:#333}.inativo .no-rotulo,.inativo .no-seta{color:#bdbdbd}.icone-arrow{font-weight:500;color:rgb(var(--kv-color-system),.75);transition:all .4s;height:15px;opacity:0;transition:opacity .2s ease,transform .2s ease;padding:1px}.icone-arrow:hover{background:#0000001a;border-radius:4px}.no-conteudo:hover .icone-arrow{opacity:1}::ng-deep .p-tieredmenu{padding:.5rem!important}::ng-deep .p-tieredmenu .p-tieredmenu-root-list{font-size:.75rem!important}::ng-deep .p-tieredmenu .p-menuitem>.p-menuitem-content{padding:.5rem}::ng-deep p-tieredmenusub .p-disabled *:active{pointer-events:none!important;font-size:.75rem!important;padding:.5rem!important}::ng-deep .p-disabled *{pointer-events:auto!important}.icon-more{font-weight:500;font-size:1.4rem!important;color:rgb(var(--kv-color-system),.75);transition:all .4s}.icon-more:hover,.icon-more:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}\n"] }]
13363
+ TieredMenuModule,
13364
+ TooltipModule
13365
+ ], template: "<li \n class=\"no-container\"\n [class.inativo]=\"noPlano().dadosOriginais.ativo === false\">\n\n <div class=\"linhas-guia\">\n @for(i of [].constructor(noPlano().nivel); track i) {\n <div class=\"linha-vertical\"></div>\n }\n </div>\n\n <div \n class=\"no-conteudo\" \n [class.is-last-child]=\"noPlano().isLast\"\n (click)=\"alternarExpansao()\">\n\n <div class=\"container-icone\" [ngStyle]=\"obterEstilosIcone(noPlano().dadosOriginais)\">\n <span class=\"material-symbols-outlined text-lg no-icone\">\n {{ noPlano().dadosOriginais.icone }}\n </span>\n </div>\n\n <span \n class=\"no-rotulo\"\n [class.font-bold]=\"ehNoPai()\"\n [class.text-500]=\"ehNoPai()\">\n {{ noPlano().dadosOriginais.rotulo }}\n </span>\n\n @if (items.length > 0) {\n <span\n class=\"material-symbols-outlined flex text-lg ml-2 cursor-pointer icone-arrow\"\n (click)=\"$event.stopPropagation()\"\n (click)=\"menu.toggle($event)\"\n >\n more_horiz\n </span>\n\n <p-tieredMenu\n #menu\n [popup]=\"true\"\n [model]=\"items\"\n appendTo=\"body\"\n >\n <ng-template let-item pTemplate=\"item\">\n <div\n [pTooltip]=\"item.tooltip\"\n tooltipPosition=\"left\"\n class=\"cursor-pointer\"\n (click)=\"onActionClick(item, $event)\"\n >\n <span class=\"text-xs\">\n {{ item.label }}\n </span>\n </div>\n </ng-template>\n </p-tieredMenu>\n }\n \n </div>\n \n \n</li>\n\n", styles: [":host{--ident-size: 2rem;--line-color: #e0e0e0;--line-width: 1px}.no-container{display:flex;align-items:stretch;position:relative}.linhas-guia{display:flex;flex-shrink:0;position:relative}.linha-vertical{width:var(--ident-size);position:relative}.linha-vertical:before{content:\"\";position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%);width:var(--line-width);background-color:var(--line-color)}.no-conteudo{display:flex;align-items:center;cursor:pointer;position:relative;padding:4px 4px 4px 0}.no-conteudo:before{content:\"\";position:absolute;left:calc(var(--ident-size) / -2);top:50%;width:calc(var(--ident-size) / 2);height:var(--line-width);background-color:var(--line-color)}.no-conteudo:hover{background-color:#0000000a;border-radius:4px}.is-last-child~.linhas-guia .linha-vertical:last-child:before,.is-last-child .linhas-guia .linha-vertical:last-child:before{height:50%}:host:first-child .no-conteudo:before,:host:first-child .linhas-guia{display:none}.no-seta{transition:transform .25s ease-in-out;color:#555;width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:24px}.no-seta.rotacionado{transform:rotate(0)}.no-seta:not(.rotacionado){transform:rotate(-90deg)}.container-icone{width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:3px;margin-right:8px;flex-shrink:0}.container-icone .no-icone{font-size:18px}.no-rotulo{font-family:system-ui,sans-serif;color:#333}.inativo .no-rotulo,.inativo .no-seta{color:#bdbdbd}.icone-arrow{font-weight:500;color:rgb(var(--kv-color-system),.75);transition:all .4s;height:15px;opacity:0;transition:opacity .2s ease,transform .2s ease;padding:1px}.icone-arrow:hover{background:#0000001a;border-radius:4px}.no-conteudo:hover .icone-arrow{opacity:1}::ng-deep .p-tieredmenu{padding:.5rem!important}::ng-deep .p-tieredmenu .p-tieredmenu-root-list{font-size:.75rem!important}::ng-deep .p-tieredmenu .p-menuitem>.p-menuitem-content{padding:.5rem}::ng-deep p-tieredmenusub .p-disabled *:active{pointer-events:none!important;font-size:.75rem!important;padding:.5rem!important}::ng-deep .p-disabled *{pointer-events:auto!important}.icon-more{font-weight:500;font-size:1.4rem!important;color:rgb(var(--kv-color-system),.75);transition:all .4s}.icon-more:hover,.icon-more:focus{color:#5e5e5e;transition:color .3s,transform .3s;background-color:#eaeaea;border-radius:50%}\n"] }]
13318
13366
  }], propDecorators: { noAlternado: [{
13319
13367
  type: Output
13368
+ }], actionExecuted: [{
13369
+ type: Output
13320
13370
  }] } });
13321
13371
 
13322
13372
  class KvTreeEnvironmentComponent {
@@ -13329,19 +13379,34 @@ class KvTreeEnvironmentComponent {
13329
13379
  this.showButtonCollapsed = input(true);
13330
13380
  this.showAddButton = input(true);
13331
13381
  this.onAddClick = new EventEmitter();
13382
+ this.onSelectedItem = new EventEmitter();
13383
+ this.cdr = inject(ChangeDetectorRef);
13332
13384
  this.mapaDeExpansao = new Map();
13385
+ this._cachedDados = null;
13386
+ this._dadosHash = null;
13387
+ this._cachedListaPlana = null;
13388
+ this._listaPlanaHash = null;
13333
13389
  this.listaPlana = signal([]);
13334
13390
  this.iconCollapsed = signal('collapse_all');
13335
13391
  this.collapsedAll = signal(true);
13392
+ this.selectedItem = signal(null);
13336
13393
  effect(() => {
13337
13394
  const estrutura = this.estruturaArvore();
13338
13395
  const dados = this.dadosArvore();
13339
13396
  const simples = this.nosSimples();
13340
13397
  const arvore = this.arvoreDeDados();
13341
- const temDados = estrutura.length > 0 || dados.length > 0 || simples.length > 0 || arvore.length > 0;
13342
- if (temDados) {
13343
- this.gerarListaPlana();
13344
- this.atualizarEstadoCollapseButton();
13398
+ const dadosHash = this.criarHashDados(estrutura, dados, simples, arvore);
13399
+ if (this._dadosHash !== dadosHash) {
13400
+ this._dadosHash = dadosHash;
13401
+ this.invalidarCache();
13402
+ const temDados = estrutura.length > 0 || dados.length > 0 || simples.length > 0 || arvore.length > 0;
13403
+ if (temDados) {
13404
+ this.gerarListaPlanaOtimizada();
13405
+ this.atualizarEstadoCollapseButton();
13406
+ }
13407
+ else {
13408
+ this.listaPlana.set([]);
13409
+ }
13345
13410
  }
13346
13411
  }, { allowSignalWrites: true });
13347
13412
  }
@@ -13354,25 +13419,86 @@ class KvTreeEnvironmentComponent {
13354
13419
  return;
13355
13420
  const estadoAtual = this.mapaDeExpansao.get(noPlano.dadosOriginais.rotulo) ?? false;
13356
13421
  this.mapaDeExpansao.set(noPlano.dadosOriginais.rotulo, !estadoAtual);
13357
- this.gerarListaPlana();
13358
- this.atualizarEstadoCollapseButton();
13422
+ this.forcarAtualizacaoLista();
13359
13423
  }
13360
- gerarListaPlana() {
13361
- const dados = this.obterDados();
13362
- const novaListaPlana = this.transformarParaListaPlana(dados);
13424
+ forcarAtualizacaoLista() {
13425
+ this._cachedListaPlana = null;
13426
+ this._listaPlanaHash = null;
13427
+ const dados = this.obterDadosOtimizado();
13428
+ const novaListaPlana = this.transformarParaListaPlanaOtimizada(dados);
13363
13429
  this.listaPlana.set(novaListaPlana);
13430
+ this.cdr.detectChanges();
13431
+ setTimeout(() => {
13432
+ const expansaoHash = Array.from(this.mapaDeExpansao.entries())
13433
+ .sort(([a], [b]) => a.localeCompare(b))
13434
+ .map(([k, v]) => `${k}:${v}`)
13435
+ .join(',');
13436
+ this._listaPlanaHash = `${this._dadosHash}:${expansaoHash}`;
13437
+ this._cachedListaPlana = novaListaPlana;
13438
+ this.cdr.detectChanges();
13439
+ this.atualizarEstadoCollapseButton();
13440
+ }, 0);
13364
13441
  }
13365
- obterDados() {
13442
+ criarHashDados(estrutura, dados, simples, arvore) {
13443
+ const estruturaHash = `e:${estrutura.length}:${estrutura.map(e => `${e.id}:${e.label}`).join(',')}`;
13444
+ const dadosHash = `d:${dados.length}:${dados.map(d => `${d.id}`).join(',')}`;
13445
+ const simplesHash = `s:${simples.length}:${simples.map(s => s.key).join(',')}`;
13446
+ const arvoreHash = `a:${arvore.length}:${arvore.map(a => a.rotulo).join(',')}`;
13447
+ return `${estruturaHash}|${dadosHash}|${simplesHash}|${arvoreHash}`;
13448
+ }
13449
+ invalidarCache() {
13450
+ this._cachedDados = null;
13451
+ this._cachedListaPlana = null;
13452
+ this._listaPlanaHash = null;
13453
+ }
13454
+ gerarListaPlanaOtimizada() {
13455
+ const dados = this.obterDadosOtimizado();
13456
+ const expansaoHash = Array.from(this.mapaDeExpansao.entries())
13457
+ .sort(([a], [b]) => a.localeCompare(b))
13458
+ .map(([k, v]) => `${k}:${v}`)
13459
+ .join(',');
13460
+ const listaPlanaHash = `${this._dadosHash}:${expansaoHash}`;
13461
+ if (this._listaPlanaHash === listaPlanaHash && this._cachedListaPlana) {
13462
+ this.listaPlana.set(this._cachedListaPlana);
13463
+ return;
13464
+ }
13465
+ const novaListaPlana = this.transformarParaListaPlanaOtimizada(dados);
13466
+ this._cachedListaPlana = novaListaPlana;
13467
+ this._listaPlanaHash = listaPlanaHash;
13468
+ this.listaPlana.set(novaListaPlana);
13469
+ }
13470
+ onActionExecuted(noPlano) {
13471
+ const dados = noPlano.dadosOriginais;
13472
+ this.selectedItem.set(dados);
13473
+ this.onSelectedItem.emit(dados);
13474
+ }
13475
+ gerarListaPlana() {
13476
+ this.gerarListaPlanaOtimizada();
13477
+ }
13478
+ obterDadosOtimizado() {
13479
+ if (this._cachedDados && this._dadosHash) {
13480
+ return this._cachedDados;
13481
+ }
13366
13482
  const estrutura = this.estruturaArvore();
13367
13483
  const dados = this.dadosArvore();
13484
+ let resultado;
13368
13485
  if (estrutura && estrutura.length > 0) {
13369
- return this.combinarEstruturaComDados(estrutura, dados || []);
13486
+ resultado = this.combinarEstruturaComDados(estrutura, dados || []);
13370
13487
  }
13371
- const nosSimples = this.nosSimples();
13372
- if (nosSimples && nosSimples.length > 0) {
13373
- return this.converterSimplesParaCompleto(nosSimples);
13488
+ else {
13489
+ const nosSimples = this.nosSimples();
13490
+ if (nosSimples && nosSimples.length > 0) {
13491
+ resultado = this.converterSimplesParaCompleto(nosSimples);
13492
+ }
13493
+ else {
13494
+ resultado = this.arvoreDeDados();
13495
+ }
13374
13496
  }
13375
- return this.arvoreDeDados();
13497
+ this._cachedDados = resultado;
13498
+ return resultado;
13499
+ }
13500
+ obterDados() {
13501
+ return this.obterDadosOtimizado();
13376
13502
  }
13377
13503
  converterSimplesParaCompleto(nosSimples) {
13378
13504
  const mapa = new Map();
@@ -13406,21 +13532,26 @@ class KvTreeEnvironmentComponent {
13406
13532
  return raiz;
13407
13533
  }
13408
13534
  transformarParaListaPlana(nodes, nivel = 0) {
13409
- let lista = [];
13535
+ return this.transformarParaListaPlanaOtimizada(nodes, nivel);
13536
+ }
13537
+ transformarParaListaPlanaOtimizada(nodes, nivel = 0) {
13538
+ const lista = [];
13410
13539
  nodes.forEach((node, index) => {
13411
13540
  const rotulo = node.rotulo;
13412
13541
  const estaExpandido = this.mapaDeExpansao.get(rotulo) ?? (node.estaExpandido ?? false);
13542
+ const temFilhos = !!(node.filhos && node.filhos.length > 0);
13413
13543
  const noPlano = {
13414
13544
  id: rotulo,
13415
13545
  nivel: nivel,
13416
- expansivel: !!node.filhos && node.filhos.length > 0,
13546
+ expansivel: temFilhos,
13417
13547
  estaExpandido: estaExpandido,
13418
13548
  isLast: index === nodes.length - 1,
13419
13549
  dadosOriginais: node
13420
13550
  };
13421
13551
  lista.push(noPlano);
13422
- if (estaExpandido && node.filhos) {
13423
- lista = lista.concat(this.transformarParaListaPlana(node.filhos, nivel + 1));
13552
+ if (estaExpandido && temFilhos) {
13553
+ const filhosPlanos = this.transformarParaListaPlanaOtimizada(node.filhos, nivel + 1);
13554
+ lista.push(...filhosPlanos);
13424
13555
  }
13425
13556
  });
13426
13557
  return lista;
@@ -13431,27 +13562,40 @@ class KvTreeEnvironmentComponent {
13431
13562
  executeCollapsed() {
13432
13563
  const todosColapsados = this.collapsedAll();
13433
13564
  if (todosColapsados) {
13434
- this.expandirTodos();
13565
+ this.expandirTodosOtimizado();
13435
13566
  }
13436
13567
  else {
13437
- this.colapsarTodos();
13568
+ this.colapsarTodosOtimizado();
13438
13569
  }
13439
- this.gerarListaPlana();
13440
- this.atualizarEstadoCollapseButton();
13570
+ this.forcarAtualizacaoLista();
13441
13571
  }
13442
13572
  expandirTodos() {
13443
- this.percorrerTodosNos(this.obterDados(), (node) => {
13573
+ this.expandirTodosOtimizado();
13574
+ }
13575
+ colapsarTodos() {
13576
+ this.colapsarTodosOtimizado();
13577
+ }
13578
+ expandirTodosOtimizado() {
13579
+ const dados = this.obterDadosOtimizado();
13580
+ const stack = [...dados];
13581
+ while (stack.length > 0) {
13582
+ const node = stack.pop();
13444
13583
  if (node.filhos && node.filhos.length > 0) {
13445
13584
  this.mapaDeExpansao.set(node.rotulo, true);
13585
+ stack.push(...node.filhos);
13446
13586
  }
13447
- });
13587
+ }
13448
13588
  }
13449
- colapsarTodos() {
13450
- this.percorrerTodosNos(this.obterDados(), (node) => {
13589
+ colapsarTodosOtimizado() {
13590
+ const dados = this.obterDadosOtimizado();
13591
+ const stack = [...dados];
13592
+ while (stack.length > 0) {
13593
+ const node = stack.pop();
13451
13594
  if (node.filhos && node.filhos.length > 0) {
13452
13595
  this.mapaDeExpansao.set(node.rotulo, false);
13596
+ stack.push(...node.filhos);
13453
13597
  }
13454
- });
13598
+ }
13455
13599
  }
13456
13600
  percorrerTodosNos(nodes, callback) {
13457
13601
  nodes.forEach(node => {
@@ -13498,7 +13642,8 @@ class KvTreeEnvironmentComponent {
13498
13642
  ativo: dado?.ativo ?? true,
13499
13643
  estaExpandido: est.estaExpandido,
13500
13644
  filhos: [],
13501
- actions: est.actions
13645
+ actions: est.actions,
13646
+ data: est.data
13502
13647
  };
13503
13648
  mapaEstrutura.set(est.id, no);
13504
13649
  });
@@ -13519,8 +13664,14 @@ class KvTreeEnvironmentComponent {
13519
13664
  executeAdd() {
13520
13665
  this.onAddClick.emit();
13521
13666
  }
13667
+ ngOnDestroy() {
13668
+ this._cachedDados = null;
13669
+ this._cachedListaPlana = null;
13670
+ this._dadosHash = '';
13671
+ this._listaPlanaHash = '';
13672
+ }
13522
13673
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvTreeEnvironmentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13523
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.8", type: KvTreeEnvironmentComponent, isStandalone: true, selector: "kv-tree-environment", inputs: { arvoreDeDados: { classPropertyName: "arvoreDeDados", publicName: "arvoreDeDados", isSignal: true, isRequired: false, transformFunction: null }, nosSimples: { classPropertyName: "nosSimples", publicName: "nosSimples", isSignal: true, isRequired: false, transformFunction: null }, estruturaArvore: { classPropertyName: "estruturaArvore", publicName: "estruturaArvore", isSignal: true, isRequired: false, transformFunction: null }, dadosArvore: { classPropertyName: "dadosArvore", publicName: "dadosArvore", isSignal: true, isRequired: false, transformFunction: null }, configuracao: { classPropertyName: "configuracao", publicName: "configuracao", isSignal: true, isRequired: false, transformFunction: null }, showButtonCollapsed: { classPropertyName: "showButtonCollapsed", publicName: "showButtonCollapsed", isSignal: true, isRequired: false, transformFunction: null }, showAddButton: { classPropertyName: "showAddButton", publicName: "showAddButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onAddClick: "onAddClick" }, ngImport: i0, template: "<div class=\"grid-container h-full\">\n <span \n class=\"material-symbols-outlined text-sm text-500 mx-1 p-1 cursor-pointer hover:surface-300\"\n style=\"border-radius: 4px; margin-top: 12px;\" \n (click)=\"executeCollapsed()\"\n [pTooltip]=\"collapsedAll() ? 'Expandir tudo' : 'Recolher tudo'\"\n >\n {{ iconCollapsed() }}\n </span>\n <cdk-virtual-scroll-viewport class=\"h-full w-full\" itemSize=\"40\">\n \n <ul class=\"lista-arvore-virtual pr-2 py-2\">\n <no-arvore \n *cdkVirtualFor=\"let no of listaPlana(); trackBy: trackByNode\" \n [noPlano]=\"no\"\n (noAlternado)=\"alternarNo($event)\" />\n </ul>\n\n </cdk-virtual-scroll-viewport>\n</div>", styles: [".grid-container{display:grid;grid-template-columns:auto 1fr;align-items:start}.lista-arvore-virtual{list-style:none;padding:0;margin:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: NoArvoreComponent, selector: "no-arvore", inputs: ["noPlano"], outputs: ["noAlternado"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1$8.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1$8.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1$8.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: PrimeNgModule }, { kind: "directive", type: i2$3.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }] }); }
13674
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "17.3.8", type: KvTreeEnvironmentComponent, isStandalone: true, selector: "kv-tree-environment", inputs: { arvoreDeDados: { classPropertyName: "arvoreDeDados", publicName: "arvoreDeDados", isSignal: true, isRequired: false, transformFunction: null }, nosSimples: { classPropertyName: "nosSimples", publicName: "nosSimples", isSignal: true, isRequired: false, transformFunction: null }, estruturaArvore: { classPropertyName: "estruturaArvore", publicName: "estruturaArvore", isSignal: true, isRequired: false, transformFunction: null }, dadosArvore: { classPropertyName: "dadosArvore", publicName: "dadosArvore", isSignal: true, isRequired: false, transformFunction: null }, configuracao: { classPropertyName: "configuracao", publicName: "configuracao", isSignal: true, isRequired: false, transformFunction: null }, showButtonCollapsed: { classPropertyName: "showButtonCollapsed", publicName: "showButtonCollapsed", isSignal: true, isRequired: false, transformFunction: null }, showAddButton: { classPropertyName: "showAddButton", publicName: "showAddButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onAddClick: "onAddClick", onSelectedItem: "onSelectedItem" }, ngImport: i0, template: "<div class=\"grid-container h-full\">\n <span \n class=\"material-symbols-outlined text-sm text-500 mx-1 p-1 cursor-pointer hover:surface-300\"\n style=\"border-radius: 4px; margin-top: 12px;\" \n (click)=\"executeCollapsed()\"\n [pTooltip]=\"collapsedAll() ? 'Expandir tudo' : 'Recolher tudo'\"\n >\n {{ iconCollapsed() }}\n </span>\n <cdk-virtual-scroll-viewport class=\"h-full w-full\" itemSize=\"40\">\n \n <ul class=\"lista-arvore-virtual pr-2 py-2\">\n <no-arvore \n *cdkVirtualFor=\"let no of listaPlana(); trackBy: trackByNode\" \n [noPlano]=\"no\"\n (noAlternado)=\"alternarNo($event)\"\n (actionExecuted)=\"onActionExecuted($event)\" />\n </ul>\n\n </cdk-virtual-scroll-viewport>\n</div>", styles: [".grid-container{display:grid;grid-template-columns:auto 1fr;align-items:start}.lista-arvore-virtual{list-style:none;padding:0;margin:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: NoArvoreComponent, selector: "no-arvore", inputs: ["noPlano"], outputs: ["noAlternado", "actionExecuted"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1$8.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1$8.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1$8.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "ngmodule", type: PrimeNgModule }, { kind: "directive", type: i2$3.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }] }); }
13524
13675
  }
13525
13676
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: KvTreeEnvironmentComponent, decorators: [{
13526
13677
  type: Component,
@@ -13529,9 +13680,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImpor
13529
13680
  NoArvoreComponent,
13530
13681
  ScrollingModule,
13531
13682
  PrimeNgModule
13532
- ], template: "<div class=\"grid-container h-full\">\n <span \n class=\"material-symbols-outlined text-sm text-500 mx-1 p-1 cursor-pointer hover:surface-300\"\n style=\"border-radius: 4px; margin-top: 12px;\" \n (click)=\"executeCollapsed()\"\n [pTooltip]=\"collapsedAll() ? 'Expandir tudo' : 'Recolher tudo'\"\n >\n {{ iconCollapsed() }}\n </span>\n <cdk-virtual-scroll-viewport class=\"h-full w-full\" itemSize=\"40\">\n \n <ul class=\"lista-arvore-virtual pr-2 py-2\">\n <no-arvore \n *cdkVirtualFor=\"let no of listaPlana(); trackBy: trackByNode\" \n [noPlano]=\"no\"\n (noAlternado)=\"alternarNo($event)\" />\n </ul>\n\n </cdk-virtual-scroll-viewport>\n</div>", styles: [".grid-container{display:grid;grid-template-columns:auto 1fr;align-items:start}.lista-arvore-virtual{list-style:none;padding:0;margin:0}\n"] }]
13683
+ ], template: "<div class=\"grid-container h-full\">\n <span \n class=\"material-symbols-outlined text-sm text-500 mx-1 p-1 cursor-pointer hover:surface-300\"\n style=\"border-radius: 4px; margin-top: 12px;\" \n (click)=\"executeCollapsed()\"\n [pTooltip]=\"collapsedAll() ? 'Expandir tudo' : 'Recolher tudo'\"\n >\n {{ iconCollapsed() }}\n </span>\n <cdk-virtual-scroll-viewport class=\"h-full w-full\" itemSize=\"40\">\n \n <ul class=\"lista-arvore-virtual pr-2 py-2\">\n <no-arvore \n *cdkVirtualFor=\"let no of listaPlana(); trackBy: trackByNode\" \n [noPlano]=\"no\"\n (noAlternado)=\"alternarNo($event)\"\n (actionExecuted)=\"onActionExecuted($event)\" />\n </ul>\n\n </cdk-virtual-scroll-viewport>\n</div>", styles: [".grid-container{display:grid;grid-template-columns:auto 1fr;align-items:start}.lista-arvore-virtual{list-style:none;padding:0;margin:0}\n"] }]
13533
13684
  }], ctorParameters: () => [], propDecorators: { onAddClick: [{
13534
13685
  type: Output
13686
+ }], onSelectedItem: [{
13687
+ type: Output
13535
13688
  }] } });
13536
13689
 
13537
13690
  /*