uni-app-fe 0.1.7 → 0.1.8

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.
@@ -281,7 +281,7 @@ class UniDialogError {
281
281
  this.showToast('ErrorRemoved');
282
282
  }
283
283
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniDialogError, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
284
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniDialogError, isStandalone: true, selector: "uni-dialog-error", inputs: { errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div\r\n class=\"relative flex h-full w-full flex-col gap-6 overflow-hidden rounded-4xl border border-rose-800/25 bg-linear-to-tr from-rose-500/10 via-rose-900/20 to-rose-500/5 p-6 text-left shadow-[0_50px_100px_-20px_rgba(0,0,0,0.7),inset_0_1px_0_rgba(255,255,255,0.15)] backdrop-blur-3xl\">\r\n <div\r\n class=\"pointer-events-none absolute -top-40 -left-40 size-96 animate-pulse rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n <div\r\n class=\"pointer-events-none absolute -right-40 -bottom-40 size-96 rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n\r\n <!-- Titolo -->\r\n <header class=\"flex items-center justify-between gap-4 border-b border-rose-400/25 pb-5\">\r\n <!-- Titolo: led -->\r\n <span class=\"relative flex size-3\">\r\n <span\r\n class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-rose-400 opacity-40\"></span>\r\n <span\r\n class=\"relative inline-flex size-3 rounded-full bg-linear-to-tr from-rose-500 to-rose-300 shadow-[0_0_20px_rgba(244,63,94,0.8)]\"></span>\r\n </span>\r\n\r\n <!-- Titolo: scritta -->\r\n <div class=\"flex flex-1 flex-col\">\r\n <h1 class=\"text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n </div>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"rounded-xl border border-white/7.5 bg-white/5 px-3 py-1.5 font-mono text-xs font-semibold tracking-wider text-neutral-200\">\r\n {{ 'Total' | translate }}: {{ errors().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'close'\"\r\n (onClick)=\"onCloseDialog()\"></dx-button>\r\n </header>\r\n\r\n <!-- Lista Errori -->\r\n <main\r\n class=\"scrollbar-none overflow-y-auto [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\">\r\n <ul class=\"flex flex-col gap-4 px-6 pt-2 pb-4\">\r\n @for (error of errorsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let errorData = error | get_data;\r\n <li\r\n class=\"group squircle flex w-full flex-col overflow-hidden rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': error.isOpen }\">\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Titolo -->\r\n <div class=\"flex items-center justify-between gap-4\">\r\n <!-- Titolo: reference -->\r\n <div class=\"flex min-w-0 items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': error.isOpen }\"\r\n [title]=\"(error.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(error.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ errorData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Titolo: type -->\r\n <div\r\n class=\"flex items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 font-mono text-xs font-medium text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(error.type === 'network' || error.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"errorData.icon\" [title]=\"error.type\" />\r\n <span class=\"text-2xs hidden tracking-wider uppercase sm:inline\">\r\n {{ error.type }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Messaggio -->\r\n <div class=\"container-message flex flex-col gap-4\">\r\n <!-- Messaggio default -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }}\r\n <button (click)=\"onCopy(errorData.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">{{ errorData.message }}</p>\r\n </article>\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }} {{ 'Inner' | translate }}\r\n <button (click)=\"onCopy(error.innerException.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">\r\n {{ error.innerException.message }}\r\n </p>\r\n </article>\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(error.isOpen) {\r\n <div class=\"container-detail flex flex-col gap-6\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-3xl! font-semibold text-rose-300\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-8\">\r\n @if(error.type === 'be' || error.type === 'server') {\r\n <!-- Dettagli: request -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Request' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex gap-16\">\r\n <!-- Dettagli: request metodo http -->\r\n <article class=\"shrink-0 basis-24\">\r\n <h3 class=\"group/title\">\r\n {{ 'Method' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMethod' | translate\" />\r\n </h3>\r\n <p>{{ error.request.method }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request url -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n URL\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUrl' | translate\" />\r\n </h3>\r\n <p class=\"truncate\">{{ error.request.url }}</p>\r\n </article>\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Query params\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipQueryParams' | translate\" />\r\n </h3>\r\n @let queryParams = [...(error.request.url | url).searchParams];\r\n @if(queryParams.length) {\r\n <ul>\r\n @for (param of queryParams; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ param[0] }}: {{ param[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request headers -->\r\n <article>\r\n @let headers = [...error.request.headers.entries()];\r\n <h3 class=\"group/title\">\r\n Headers\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipHeaders' | translate\" />\r\n <button [disabled]=\"!headers.length\" (click)=\"onCopy(headers)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(headers.length) {\r\n <ul>\r\n @for (header of headers; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ header[0] }}: {{ header[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request body -->\r\n <article>\r\n @let body = error.request | get_body_async | async;\r\n <h3 class=\"group/title\">\r\n Body\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipBody' | translate\" />\r\n <button [disabled]=\"!error.request.body\" (click)=\"onCopy(body)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(error.request.body) {\r\n <pre>{{ body | parse | json }}</pre>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex gap-4\">\r\n <!-- Dettagli: request info mode -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Mode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.mode }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Credentials' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCredentials' | translate\" />\r\n </h3>\r\n <p>{{ error.request.credentials }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info cache -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'CacheMode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCacheMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.cache }}</p>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dettagli: info -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Diagnostic' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Duration' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipDuration' | translate\" />\r\n </h3>\r\n <p>{{ error.durationMs / 1000 }}s</p>\r\n </article>\r\n\r\n <!-- Dettagli: info user agent -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n User agent\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUserAgent' | translate\" />\r\n </h3>\r\n <p>{{ error.userAgent }}s</p>\r\n </article>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Dettagli: eccezione -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Exception' | translate }} ({{ error.type }})</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.functionName\"\r\n (click)=\"onCopy(error.exception.functionName)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.functionName }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipType' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.type\"\r\n (click)=\"onCopy(error.exception.type)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.type }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipStackTrace' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.stackTrace \"\r\n (click)=\"onCopy(error.exception.stackTrace)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.exception.stackTrace }}</pre>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Frames\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFrames' | translate\" />\r\n </h3>\r\n <ul>\r\n @for (frame of error.exception.stackTraceFrames; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span class=\"flex-1\"> {{ frame.file }} </span>\r\n <span> {{ 'Line' | translate }} {{ frame.line }} </span>\r\n </li>\r\n }\r\n </ul>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(error.isOpen) { @if((error.type === 'be' || error.type === 'server') &&\r\n error.innerException) {\r\n <div class=\"container-inner flex flex-col gap-4\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-2xl! font-semibold text-rose-300\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.innerException.functionName\"\r\n (click)=\"onCopy(error.innerException.functionName)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.functionName }}</p>\r\n </article>\r\n\r\n <!-- Interno: tipo -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerType' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.type)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.type }}</p>\r\n </article>\r\n\r\n <!-- Interno: stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerStackTrace' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.stackTrace)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.innerException.stackTrace }}</pre>\r\n </article>\r\n </div>\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 sm:flex-row sm:items-center\">\r\n <!-- Footer: metadata -->\r\n <div class=\"flex items-center gap-6 text-xs\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex min-w-22 items-center justify-center gap-2 rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1\">\r\n <span\r\n class=\"font-mono font-bold text-rose-400 transition-colors duration-300 group-hover:text-white\">\r\n HTTP\r\n </span>\r\n <span class=\"font-mono text-neutral-300\"> {{ errorData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-neutral-300\">\r\n {{ error.timestamp | date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ error.count }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"flex scale-95 items-center justify-end gap-2 opacity-0 transition duration-300 group-hover:scale-100 group-hover:opacity-100\">\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isCopied\"\r\n (click)=\"onCopyAll(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isSaved\"\r\n (click)=\"onSave(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(error.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">\u2713</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n", styles: ["@reference \"tailwindcss\";:host{display:block;height:min(700px,80%);max-height:80%;width:min(1000px,60%);max-width:80%}.container-detail article,.container-inner article{@apply border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400;}.container-detail h1,.container-inner h1,.container-detail article h3,.container-inner article h3{@apply text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400;}.container-detail h2,.container-inner h2{@apply text-lg text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400;}article{@apply flex flex-col gap-1;}article>*:last-child{@apply my-auto;}article>h3{@apply mr-auto flex items-center gap-1 text-[10px] font-bold tracking-wide text-neutral-400/50 uppercase transition-colors duration-300 group-hover:text-white/50;}article>h3>*{@apply invisible group-hover/title:visible hover:text-rose-300;}article>h3>fa-icon{@apply cursor-help text-[9px];}article>h3>button{@apply transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-115 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25;}article>p,article>ul>li>span:nth-child(2){@apply max-w-full text-sm leading-relaxed tracking-wide whitespace-pre-wrap text-rose-200 transition-colors duration-300 group-hover:text-rose-100;}article>pre{@apply overflow-x-auto font-mono text-sm leading-relaxed text-rose-200 transition-colors duration-300 group-hover:text-rose-100;}article ul{@apply flex flex-col gap-2;}article ul li{@apply flex items-center gap-4;}article ul li>span:nth-child(1){@apply font-mono text-xs font-bold text-rose-100;}article ul li>span:nth-child(3){@apply rounded border border-white/7.5 bg-white/2.5 px-2 py-0.5 font-mono text-[10px] font-bold whitespace-nowrap text-rose-400 uppercase transition-colors duration-300 group-hover:border-white/20 group-hover:bg-white/5 group-hover:text-white;}.btn{@apply w-8 transition-colors duration-200 hover:bg-rose-400 focus:bg-rose-400 active:bg-rose-400;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: DxButtonModule }, { kind: "component", type: i2.DxButtonComponent, selector: "dx-button", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "icon", "rtlEnabled", "stylingMode", "tabIndex", "template", "text", "type", "useSubmitBehavior", "validationGroup", "visible", "width"], outputs: ["onClick", "onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconChange", "rtlEnabledChange", "stylingModeChange", "tabIndexChange", "templateChange", "textChange", "typeChange", "useSubmitBehaviorChange", "validationGroupChange", "visibleChange", "widthChange"] }, { kind: "ngmodule", type: DxTooltipModule }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: UniTranslatePipe, name: "translate" }, { kind: "pipe", type: GetDataPipe, name: "get_data" }, { kind: "pipe", type: GetBodyAsyncPipe, name: "get_body_async" }, { kind: "pipe", type: UniParsePipe, name: "parse" }, { kind: "pipe", type: UniUrlPipe, name: "url" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
284
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniDialogError, isStandalone: true, selector: "uni-dialog-error", inputs: { errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div\r\n class=\"relative flex h-full w-full flex-col gap-6 overflow-hidden rounded-4xl border border-rose-800/25 bg-linear-to-tr from-rose-500/10 via-rose-900/20 to-rose-500/5 p-6 text-left shadow-[0_50px_100px_-20px_rgba(0,0,0,0.7),inset_0_1px_0_rgba(255,255,255,0.15)] backdrop-blur-3xl\">\r\n <div\r\n class=\"pointer-events-none absolute -top-40 -left-40 size-96 animate-pulse rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n <div\r\n class=\"pointer-events-none absolute -right-40 -bottom-40 size-96 rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n\r\n <!-- Titolo -->\r\n <header class=\"flex items-center justify-between gap-4 border-b border-rose-400/25 pb-5\">\r\n <!-- Titolo: led -->\r\n <span class=\"relative flex size-3\">\r\n <span\r\n class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-rose-400 opacity-40\"></span>\r\n <span\r\n class=\"relative inline-flex size-3 rounded-full bg-linear-to-tr from-rose-500 to-rose-300 shadow-[0_0_20px_rgba(244,63,94,0.8)]\"></span>\r\n </span>\r\n\r\n <!-- Titolo: scritta -->\r\n <div class=\"flex flex-1 flex-col\">\r\n <h1 class=\"text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n </div>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"rounded-xl border border-white/7.5 bg-white/5 px-3 py-1.5 font-mono text-xs font-semibold tracking-wider text-neutral-200\">\r\n {{ 'Total' | translate }}: {{ errors().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'close'\"\r\n (onClick)=\"onCloseDialog()\"></dx-button>\r\n </header>\r\n\r\n <!-- Lista Errori -->\r\n <main\r\n class=\"scrollbar-none overflow-y-auto [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\">\r\n <ul class=\"flex flex-col gap-4 px-6 pt-2 pb-4\">\r\n @for (error of errorsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let errorData = error | get_data;\r\n <li\r\n class=\"group squircle flex w-full flex-col overflow-hidden rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': error.isOpen }\">\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Titolo -->\r\n <div class=\"flex items-center justify-between gap-4\">\r\n <!-- Titolo: reference -->\r\n <div class=\"flex min-w-0 items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': error.isOpen }\"\r\n [title]=\"(error.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(error.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ errorData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Titolo: type -->\r\n <div\r\n class=\"flex items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 font-mono text-xs font-medium text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(error.type === 'network' || error.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"errorData.icon\" [title]=\"error.type\" />\r\n <span class=\"text-2xs hidden tracking-wider uppercase sm:inline\">\r\n {{ error.type }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Messaggio -->\r\n <div class=\"container-message flex flex-col gap-4\">\r\n <!-- Messaggio default -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }}\r\n <button (click)=\"onCopy(errorData.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">{{ errorData.message }}</p>\r\n </article>\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }} {{ 'Inner' | translate }}\r\n <button (click)=\"onCopy(error.innerException.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">\r\n {{ error.innerException.message }}\r\n </p>\r\n </article>\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(error.isOpen) {\r\n <div class=\"container-detail flex flex-col gap-6\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-3xl! font-semibold text-rose-300\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-8\">\r\n @if(error.type === 'be' || error.type === 'server') {\r\n <!-- Dettagli: request -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Request' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex gap-16\">\r\n <!-- Dettagli: request metodo http -->\r\n <article class=\"shrink-0 basis-24\">\r\n <h3 class=\"group/title\">\r\n {{ 'Method' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMethod' | translate\" />\r\n </h3>\r\n <p>{{ error.request.method }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request url -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n URL\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUrl' | translate\" />\r\n </h3>\r\n <p class=\"truncate\">{{ error.request.url }}</p>\r\n </article>\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Query params\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipQueryParams' | translate\" />\r\n </h3>\r\n @let queryParams = [...(error.request.url | url).searchParams];\r\n @if(queryParams.length) {\r\n <ul>\r\n @for (param of queryParams; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ param[0] }}: {{ param[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request headers -->\r\n <article>\r\n @let headers = [...error.request.headers.entries()];\r\n <h3 class=\"group/title\">\r\n Headers\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipHeaders' | translate\" />\r\n <button [disabled]=\"!headers.length\" (click)=\"onCopy(headers)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(headers.length) {\r\n <ul>\r\n @for (header of headers; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ header[0] }}: {{ header[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request body -->\r\n <article>\r\n @let body = error.request | get_body_async | async;\r\n <h3 class=\"group/title\">\r\n Body\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipBody' | translate\" />\r\n <button [disabled]=\"!error.request.body\" (click)=\"onCopy(body)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(error.request.body) {\r\n <pre>{{ body | parse | json }}</pre>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex gap-4\">\r\n <!-- Dettagli: request info mode -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Mode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.mode }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Credentials' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCredentials' | translate\" />\r\n </h3>\r\n <p>{{ error.request.credentials }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info cache -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'CacheMode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCacheMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.cache }}</p>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dettagli: info -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Diagnostic' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Duration' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipDuration' | translate\" />\r\n </h3>\r\n <p>{{ error.durationMs / 1000 }}s</p>\r\n </article>\r\n\r\n <!-- Dettagli: info user agent -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n User agent\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUserAgent' | translate\" />\r\n </h3>\r\n <p>{{ error.userAgent }}s</p>\r\n </article>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Dettagli: eccezione -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Exception' | translate }} ({{ error.type }})</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.functionName\"\r\n (click)=\"onCopy(error.exception.functionName)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.functionName }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipType' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.type\"\r\n (click)=\"onCopy(error.exception.type)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.type }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipStackTrace' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.stackTrace \"\r\n (click)=\"onCopy(error.exception.stackTrace)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.exception.stackTrace }}</pre>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Frames\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFrames' | translate\" />\r\n </h3>\r\n <ul>\r\n @for (frame of error.exception.stackTraceFrames; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span class=\"flex-1\"> {{ frame.file }} </span>\r\n <span> {{ 'Line' | translate }} {{ frame.line }} </span>\r\n </li>\r\n }\r\n </ul>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(error.isOpen) { @if((error.type === 'be' || error.type === 'server') &&\r\n error.innerException) {\r\n <div class=\"container-inner flex flex-col gap-4\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-2xl! font-semibold text-rose-300\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.innerException.functionName\"\r\n (click)=\"onCopy(error.innerException.functionName)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.functionName }}</p>\r\n </article>\r\n\r\n <!-- Interno: tipo -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerType' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.type)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.type }}</p>\r\n </article>\r\n\r\n <!-- Interno: stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerStackTrace' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.stackTrace)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.innerException.stackTrace }}</pre>\r\n </article>\r\n </div>\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 sm:flex-row sm:items-center\">\r\n <!-- Footer: metadata -->\r\n <div class=\"flex items-center gap-6 text-xs\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex min-w-22 items-center justify-center gap-2 rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1\">\r\n <span\r\n class=\"font-mono font-bold text-rose-400 transition-colors duration-300 group-hover:text-white\">\r\n HTTP\r\n </span>\r\n <span class=\"font-mono text-neutral-300\"> {{ errorData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-neutral-300\">\r\n {{ error.timestamp | date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ error.count }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"flex scale-95 items-center justify-end gap-2 opacity-0 transition duration-300 group-hover:scale-100 group-hover:opacity-100\">\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isCopied\"\r\n (click)=\"onCopyAll(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isSaved\"\r\n (click)=\"onSave(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(error.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">\u2713</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n", styles: ["@reference \"tailwindcss\";:host{display:block;height:min(700px,80%);max-height:80%;width:min(1000px,60%);max-width:80%}.container-detail article,.container-inner article{@apply border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400;}.container-detail h1,.container-inner h1{@apply text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400;}.container-detail h2,.container-inner h2{@apply text-lg text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400;}.container-detail article h3,.container-inner article h3{@apply text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400;}article{@apply flex flex-col gap-1;}article>*:last-child{@apply my-auto;}article>h3{@apply mr-auto flex items-center gap-1 text-[10px] font-bold tracking-wide text-neutral-400/50 uppercase transition-colors duration-300 group-hover:text-white/50;}article>h3>*{@apply invisible group-hover/title:visible hover:text-rose-300;}article>h3>fa-icon{@apply cursor-help text-[9px];}article>h3>button{@apply transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-115 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25;}article>p,article>ul>li>span:nth-child(2){@apply max-w-full text-sm leading-relaxed tracking-wide whitespace-pre-wrap text-rose-200 transition-colors duration-300 group-hover:text-rose-100;}article>pre{@apply overflow-x-auto font-mono text-sm leading-relaxed text-rose-200 transition-colors duration-300 group-hover:text-rose-100;}article ul{@apply flex flex-col gap-2;}article ul li{@apply flex items-center gap-4;}article ul li>span:nth-child(1){@apply font-mono text-xs font-bold text-rose-100;}article ul li>span:nth-child(3){@apply rounded border border-white/7.5 bg-white/2.5 px-2 py-0.5 font-mono text-[10px] font-bold whitespace-nowrap text-rose-400 uppercase transition-colors duration-300 group-hover:border-white/20 group-hover:bg-white/5 group-hover:text-white;}.btn{@apply w-8 transition-colors duration-200 hover:bg-rose-400 focus:bg-rose-400 active:bg-rose-400;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: DxButtonModule }, { kind: "component", type: i2.DxButtonComponent, selector: "dx-button", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "icon", "rtlEnabled", "stylingMode", "tabIndex", "template", "text", "type", "useSubmitBehavior", "validationGroup", "visible", "width"], outputs: ["onClick", "onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconChange", "rtlEnabledChange", "stylingModeChange", "tabIndexChange", "templateChange", "textChange", "typeChange", "useSubmitBehaviorChange", "validationGroupChange", "visibleChange", "widthChange"] }, { kind: "ngmodule", type: DxTooltipModule }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: UniTranslatePipe, name: "translate" }, { kind: "pipe", type: GetDataPipe, name: "get_data" }, { kind: "pipe", type: GetBodyAsyncPipe, name: "get_body_async" }, { kind: "pipe", type: UniParsePipe, name: "parse" }, { kind: "pipe", type: UniUrlPipe, name: "url" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
285
285
  }
286
286
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniDialogError, decorators: [{
287
287
  type: Component,
@@ -296,7 +296,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
296
296
  GetBodyAsyncPipe,
297
297
  UniParsePipe,
298
298
  UniUrlPipe,
299
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n class=\"relative flex h-full w-full flex-col gap-6 overflow-hidden rounded-4xl border border-rose-800/25 bg-linear-to-tr from-rose-500/10 via-rose-900/20 to-rose-500/5 p-6 text-left shadow-[0_50px_100px_-20px_rgba(0,0,0,0.7),inset_0_1px_0_rgba(255,255,255,0.15)] backdrop-blur-3xl\">\r\n <div\r\n class=\"pointer-events-none absolute -top-40 -left-40 size-96 animate-pulse rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n <div\r\n class=\"pointer-events-none absolute -right-40 -bottom-40 size-96 rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n\r\n <!-- Titolo -->\r\n <header class=\"flex items-center justify-between gap-4 border-b border-rose-400/25 pb-5\">\r\n <!-- Titolo: led -->\r\n <span class=\"relative flex size-3\">\r\n <span\r\n class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-rose-400 opacity-40\"></span>\r\n <span\r\n class=\"relative inline-flex size-3 rounded-full bg-linear-to-tr from-rose-500 to-rose-300 shadow-[0_0_20px_rgba(244,63,94,0.8)]\"></span>\r\n </span>\r\n\r\n <!-- Titolo: scritta -->\r\n <div class=\"flex flex-1 flex-col\">\r\n <h1 class=\"text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n </div>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"rounded-xl border border-white/7.5 bg-white/5 px-3 py-1.5 font-mono text-xs font-semibold tracking-wider text-neutral-200\">\r\n {{ 'Total' | translate }}: {{ errors().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'close'\"\r\n (onClick)=\"onCloseDialog()\"></dx-button>\r\n </header>\r\n\r\n <!-- Lista Errori -->\r\n <main\r\n class=\"scrollbar-none overflow-y-auto [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\">\r\n <ul class=\"flex flex-col gap-4 px-6 pt-2 pb-4\">\r\n @for (error of errorsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let errorData = error | get_data;\r\n <li\r\n class=\"group squircle flex w-full flex-col overflow-hidden rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': error.isOpen }\">\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Titolo -->\r\n <div class=\"flex items-center justify-between gap-4\">\r\n <!-- Titolo: reference -->\r\n <div class=\"flex min-w-0 items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': error.isOpen }\"\r\n [title]=\"(error.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(error.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ errorData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Titolo: type -->\r\n <div\r\n class=\"flex items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 font-mono text-xs font-medium text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(error.type === 'network' || error.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"errorData.icon\" [title]=\"error.type\" />\r\n <span class=\"text-2xs hidden tracking-wider uppercase sm:inline\">\r\n {{ error.type }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Messaggio -->\r\n <div class=\"container-message flex flex-col gap-4\">\r\n <!-- Messaggio default -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }}\r\n <button (click)=\"onCopy(errorData.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">{{ errorData.message }}</p>\r\n </article>\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }} {{ 'Inner' | translate }}\r\n <button (click)=\"onCopy(error.innerException.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">\r\n {{ error.innerException.message }}\r\n </p>\r\n </article>\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(error.isOpen) {\r\n <div class=\"container-detail flex flex-col gap-6\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-3xl! font-semibold text-rose-300\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-8\">\r\n @if(error.type === 'be' || error.type === 'server') {\r\n <!-- Dettagli: request -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Request' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex gap-16\">\r\n <!-- Dettagli: request metodo http -->\r\n <article class=\"shrink-0 basis-24\">\r\n <h3 class=\"group/title\">\r\n {{ 'Method' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMethod' | translate\" />\r\n </h3>\r\n <p>{{ error.request.method }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request url -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n URL\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUrl' | translate\" />\r\n </h3>\r\n <p class=\"truncate\">{{ error.request.url }}</p>\r\n </article>\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Query params\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipQueryParams' | translate\" />\r\n </h3>\r\n @let queryParams = [...(error.request.url | url).searchParams];\r\n @if(queryParams.length) {\r\n <ul>\r\n @for (param of queryParams; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ param[0] }}: {{ param[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request headers -->\r\n <article>\r\n @let headers = [...error.request.headers.entries()];\r\n <h3 class=\"group/title\">\r\n Headers\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipHeaders' | translate\" />\r\n <button [disabled]=\"!headers.length\" (click)=\"onCopy(headers)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(headers.length) {\r\n <ul>\r\n @for (header of headers; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ header[0] }}: {{ header[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request body -->\r\n <article>\r\n @let body = error.request | get_body_async | async;\r\n <h3 class=\"group/title\">\r\n Body\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipBody' | translate\" />\r\n <button [disabled]=\"!error.request.body\" (click)=\"onCopy(body)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(error.request.body) {\r\n <pre>{{ body | parse | json }}</pre>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex gap-4\">\r\n <!-- Dettagli: request info mode -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Mode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.mode }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Credentials' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCredentials' | translate\" />\r\n </h3>\r\n <p>{{ error.request.credentials }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info cache -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'CacheMode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCacheMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.cache }}</p>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dettagli: info -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Diagnostic' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Duration' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipDuration' | translate\" />\r\n </h3>\r\n <p>{{ error.durationMs / 1000 }}s</p>\r\n </article>\r\n\r\n <!-- Dettagli: info user agent -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n User agent\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUserAgent' | translate\" />\r\n </h3>\r\n <p>{{ error.userAgent }}s</p>\r\n </article>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Dettagli: eccezione -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Exception' | translate }} ({{ error.type }})</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.functionName\"\r\n (click)=\"onCopy(error.exception.functionName)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.functionName }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipType' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.type\"\r\n (click)=\"onCopy(error.exception.type)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.type }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipStackTrace' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.stackTrace \"\r\n (click)=\"onCopy(error.exception.stackTrace)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.exception.stackTrace }}</pre>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Frames\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFrames' | translate\" />\r\n </h3>\r\n <ul>\r\n @for (frame of error.exception.stackTraceFrames; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span class=\"flex-1\"> {{ frame.file }} </span>\r\n <span> {{ 'Line' | translate }} {{ frame.line }} </span>\r\n </li>\r\n }\r\n </ul>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(error.isOpen) { @if((error.type === 'be' || error.type === 'server') &&\r\n error.innerException) {\r\n <div class=\"container-inner flex flex-col gap-4\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-2xl! font-semibold text-rose-300\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.innerException.functionName\"\r\n (click)=\"onCopy(error.innerException.functionName)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.functionName }}</p>\r\n </article>\r\n\r\n <!-- Interno: tipo -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerType' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.type)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.type }}</p>\r\n </article>\r\n\r\n <!-- Interno: stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerStackTrace' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.stackTrace)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.innerException.stackTrace }}</pre>\r\n </article>\r\n </div>\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 sm:flex-row sm:items-center\">\r\n <!-- Footer: metadata -->\r\n <div class=\"flex items-center gap-6 text-xs\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex min-w-22 items-center justify-center gap-2 rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1\">\r\n <span\r\n class=\"font-mono font-bold text-rose-400 transition-colors duration-300 group-hover:text-white\">\r\n HTTP\r\n </span>\r\n <span class=\"font-mono text-neutral-300\"> {{ errorData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-neutral-300\">\r\n {{ error.timestamp | date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ error.count }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"flex scale-95 items-center justify-end gap-2 opacity-0 transition duration-300 group-hover:scale-100 group-hover:opacity-100\">\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isCopied\"\r\n (click)=\"onCopyAll(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isSaved\"\r\n (click)=\"onSave(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(error.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">\u2713</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n", styles: ["@reference \"tailwindcss\";:host{display:block;height:min(700px,80%);max-height:80%;width:min(1000px,60%);max-width:80%}.container-detail article,.container-inner article{@apply border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400;}.container-detail h1,.container-inner h1,.container-detail article h3,.container-inner article h3{@apply text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400;}.container-detail h2,.container-inner h2{@apply text-lg text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400;}article{@apply flex flex-col gap-1;}article>*:last-child{@apply my-auto;}article>h3{@apply mr-auto flex items-center gap-1 text-[10px] font-bold tracking-wide text-neutral-400/50 uppercase transition-colors duration-300 group-hover:text-white/50;}article>h3>*{@apply invisible group-hover/title:visible hover:text-rose-300;}article>h3>fa-icon{@apply cursor-help text-[9px];}article>h3>button{@apply transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-115 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25;}article>p,article>ul>li>span:nth-child(2){@apply max-w-full text-sm leading-relaxed tracking-wide whitespace-pre-wrap text-rose-200 transition-colors duration-300 group-hover:text-rose-100;}article>pre{@apply overflow-x-auto font-mono text-sm leading-relaxed text-rose-200 transition-colors duration-300 group-hover:text-rose-100;}article ul{@apply flex flex-col gap-2;}article ul li{@apply flex items-center gap-4;}article ul li>span:nth-child(1){@apply font-mono text-xs font-bold text-rose-100;}article ul li>span:nth-child(3){@apply rounded border border-white/7.5 bg-white/2.5 px-2 py-0.5 font-mono text-[10px] font-bold whitespace-nowrap text-rose-400 uppercase transition-colors duration-300 group-hover:border-white/20 group-hover:bg-white/5 group-hover:text-white;}.btn{@apply w-8 transition-colors duration-200 hover:bg-rose-400 focus:bg-rose-400 active:bg-rose-400;}\n"] }]
299
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n class=\"relative flex h-full w-full flex-col gap-6 overflow-hidden rounded-4xl border border-rose-800/25 bg-linear-to-tr from-rose-500/10 via-rose-900/20 to-rose-500/5 p-6 text-left shadow-[0_50px_100px_-20px_rgba(0,0,0,0.7),inset_0_1px_0_rgba(255,255,255,0.15)] backdrop-blur-3xl\">\r\n <div\r\n class=\"pointer-events-none absolute -top-40 -left-40 size-96 animate-pulse rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n <div\r\n class=\"pointer-events-none absolute -right-40 -bottom-40 size-96 rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n\r\n <!-- Titolo -->\r\n <header class=\"flex items-center justify-between gap-4 border-b border-rose-400/25 pb-5\">\r\n <!-- Titolo: led -->\r\n <span class=\"relative flex size-3\">\r\n <span\r\n class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-rose-400 opacity-40\"></span>\r\n <span\r\n class=\"relative inline-flex size-3 rounded-full bg-linear-to-tr from-rose-500 to-rose-300 shadow-[0_0_20px_rgba(244,63,94,0.8)]\"></span>\r\n </span>\r\n\r\n <!-- Titolo: scritta -->\r\n <div class=\"flex flex-1 flex-col\">\r\n <h1 class=\"text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n </div>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"rounded-xl border border-white/7.5 bg-white/5 px-3 py-1.5 font-mono text-xs font-semibold tracking-wider text-neutral-200\">\r\n {{ 'Total' | translate }}: {{ errors().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'close'\"\r\n (onClick)=\"onCloseDialog()\"></dx-button>\r\n </header>\r\n\r\n <!-- Lista Errori -->\r\n <main\r\n class=\"scrollbar-none overflow-y-auto [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\">\r\n <ul class=\"flex flex-col gap-4 px-6 pt-2 pb-4\">\r\n @for (error of errorsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let errorData = error | get_data;\r\n <li\r\n class=\"group squircle flex w-full flex-col overflow-hidden rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': error.isOpen }\">\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Titolo -->\r\n <div class=\"flex items-center justify-between gap-4\">\r\n <!-- Titolo: reference -->\r\n <div class=\"flex min-w-0 items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': error.isOpen }\"\r\n [title]=\"(error.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(error.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ errorData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Titolo: type -->\r\n <div\r\n class=\"flex items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 font-mono text-xs font-medium text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(error.type === 'network' || error.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"errorData.icon\" [title]=\"error.type\" />\r\n <span class=\"text-2xs hidden tracking-wider uppercase sm:inline\">\r\n {{ error.type }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Messaggio -->\r\n <div class=\"container-message flex flex-col gap-4\">\r\n <!-- Messaggio default -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }}\r\n <button (click)=\"onCopy(errorData.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">{{ errorData.message }}</p>\r\n </article>\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }} {{ 'Inner' | translate }}\r\n <button (click)=\"onCopy(error.innerException.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">\r\n {{ error.innerException.message }}\r\n </p>\r\n </article>\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(error.isOpen) {\r\n <div class=\"container-detail flex flex-col gap-6\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-3xl! font-semibold text-rose-300\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-8\">\r\n @if(error.type === 'be' || error.type === 'server') {\r\n <!-- Dettagli: request -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Request' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex gap-16\">\r\n <!-- Dettagli: request metodo http -->\r\n <article class=\"shrink-0 basis-24\">\r\n <h3 class=\"group/title\">\r\n {{ 'Method' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMethod' | translate\" />\r\n </h3>\r\n <p>{{ error.request.method }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request url -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n URL\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUrl' | translate\" />\r\n </h3>\r\n <p class=\"truncate\">{{ error.request.url }}</p>\r\n </article>\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Query params\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipQueryParams' | translate\" />\r\n </h3>\r\n @let queryParams = [...(error.request.url | url).searchParams];\r\n @if(queryParams.length) {\r\n <ul>\r\n @for (param of queryParams; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ param[0] }}: {{ param[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request headers -->\r\n <article>\r\n @let headers = [...error.request.headers.entries()];\r\n <h3 class=\"group/title\">\r\n Headers\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipHeaders' | translate\" />\r\n <button [disabled]=\"!headers.length\" (click)=\"onCopy(headers)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(headers.length) {\r\n <ul>\r\n @for (header of headers; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ header[0] }}: {{ header[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request body -->\r\n <article>\r\n @let body = error.request | get_body_async | async;\r\n <h3 class=\"group/title\">\r\n Body\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipBody' | translate\" />\r\n <button [disabled]=\"!error.request.body\" (click)=\"onCopy(body)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(error.request.body) {\r\n <pre>{{ body | parse | json }}</pre>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex gap-4\">\r\n <!-- Dettagli: request info mode -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Mode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.mode }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Credentials' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCredentials' | translate\" />\r\n </h3>\r\n <p>{{ error.request.credentials }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info cache -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'CacheMode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCacheMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.cache }}</p>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dettagli: info -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Diagnostic' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Duration' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipDuration' | translate\" />\r\n </h3>\r\n <p>{{ error.durationMs / 1000 }}s</p>\r\n </article>\r\n\r\n <!-- Dettagli: info user agent -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n User agent\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUserAgent' | translate\" />\r\n </h3>\r\n <p>{{ error.userAgent }}s</p>\r\n </article>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Dettagli: eccezione -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Exception' | translate }} ({{ error.type }})</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.functionName\"\r\n (click)=\"onCopy(error.exception.functionName)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.functionName }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipType' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.type\"\r\n (click)=\"onCopy(error.exception.type)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.type }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipStackTrace' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.stackTrace \"\r\n (click)=\"onCopy(error.exception.stackTrace)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.exception.stackTrace }}</pre>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Frames\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFrames' | translate\" />\r\n </h3>\r\n <ul>\r\n @for (frame of error.exception.stackTraceFrames; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span class=\"flex-1\"> {{ frame.file }} </span>\r\n <span> {{ 'Line' | translate }} {{ frame.line }} </span>\r\n </li>\r\n }\r\n </ul>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(error.isOpen) { @if((error.type === 'be' || error.type === 'server') &&\r\n error.innerException) {\r\n <div class=\"container-inner flex flex-col gap-4\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-2xl! font-semibold text-rose-300\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.innerException.functionName\"\r\n (click)=\"onCopy(error.innerException.functionName)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.functionName }}</p>\r\n </article>\r\n\r\n <!-- Interno: tipo -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerType' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.type)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.type }}</p>\r\n </article>\r\n\r\n <!-- Interno: stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerStackTrace' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.stackTrace)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.innerException.stackTrace }}</pre>\r\n </article>\r\n </div>\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 sm:flex-row sm:items-center\">\r\n <!-- Footer: metadata -->\r\n <div class=\"flex items-center gap-6 text-xs\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex min-w-22 items-center justify-center gap-2 rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1\">\r\n <span\r\n class=\"font-mono font-bold text-rose-400 transition-colors duration-300 group-hover:text-white\">\r\n HTTP\r\n </span>\r\n <span class=\"font-mono text-neutral-300\"> {{ errorData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-neutral-300\">\r\n {{ error.timestamp | date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ error.count }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"flex scale-95 items-center justify-end gap-2 opacity-0 transition duration-300 group-hover:scale-100 group-hover:opacity-100\">\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isCopied\"\r\n (click)=\"onCopyAll(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isSaved\"\r\n (click)=\"onSave(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(error.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">\u2713</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n", styles: ["@reference \"tailwindcss\";:host{display:block;height:min(700px,80%);max-height:80%;width:min(1000px,60%);max-width:80%}.container-detail article,.container-inner article{@apply border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400;}.container-detail h1,.container-inner h1{@apply text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400;}.container-detail h2,.container-inner h2{@apply text-lg text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400;}.container-detail article h3,.container-inner article h3{@apply text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400;}article{@apply flex flex-col gap-1;}article>*:last-child{@apply my-auto;}article>h3{@apply mr-auto flex items-center gap-1 text-[10px] font-bold tracking-wide text-neutral-400/50 uppercase transition-colors duration-300 group-hover:text-white/50;}article>h3>*{@apply invisible group-hover/title:visible hover:text-rose-300;}article>h3>fa-icon{@apply cursor-help text-[9px];}article>h3>button{@apply transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-115 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25;}article>p,article>ul>li>span:nth-child(2){@apply max-w-full text-sm leading-relaxed tracking-wide whitespace-pre-wrap text-rose-200 transition-colors duration-300 group-hover:text-rose-100;}article>pre{@apply overflow-x-auto font-mono text-sm leading-relaxed text-rose-200 transition-colors duration-300 group-hover:text-rose-100;}article ul{@apply flex flex-col gap-2;}article ul li{@apply flex items-center gap-4;}article ul li>span:nth-child(1){@apply font-mono text-xs font-bold text-rose-100;}article ul li>span:nth-child(3){@apply rounded border border-white/7.5 bg-white/2.5 px-2 py-0.5 font-mono text-[10px] font-bold whitespace-nowrap text-rose-400 uppercase transition-colors duration-300 group-hover:border-white/20 group-hover:bg-white/5 group-hover:text-white;}.btn{@apply w-8 transition-colors duration-200 hover:bg-rose-400 focus:bg-rose-400 active:bg-rose-400;}\n"] }]
300
300
  }], propDecorators: { errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: true }] }] } });
301
301
 
302
302
  class UniHeader {
@@ -1 +1 @@
1
- {"version":3,"file":"uni-app-fe-component.mjs","sources":["../../../projects/uni-app-fe/component/uni-banner-alert/uni-banner-alert.ts","../../../projects/uni-app-fe/component/uni-banner-alert/uni-banner-alert.html","../../../projects/uni-app-fe/component/uni-dialog-error/get-body-async.pipe.ts","../../../projects/uni-app-fe/component/uni-dialog-error/get-data.pipe.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error.html","../../../projects/uni-app-fe/component/uni-header/uni-header.ts","../../../projects/uni-app-fe/component/uni-header/uni-header.html","../../../projects/uni-app-fe/component/uni-item-field-with-hight-contrast/uni-item-field-with-hight-contrast.ts","../../../projects/uni-app-fe/component/uni-item-field-with-hight-contrast/uni-item-field-with-hight-contrast.html","../../../projects/uni-app-fe/component/uni-item-field/uni-item-field.ts","../../../projects/uni-app-fe/component/uni-item-field/uni-item-field.html","../../../projects/uni-app-fe/component/uni-item-field-with-lens-tooltip/uni-uni-item-field-with-lens-tooltip.ts","../../../projects/uni-app-fe/component/uni-item-field-with-lens-tooltip/uni-item-field-with-lens-tooltip.html","../../../projects/uni-app-fe/component/uni-led/model.ts","../../../projects/uni-app-fe/component/uni-led/uni-led.ts","../../../projects/uni-app-fe/component/uni-led/uni-led.html","../../../projects/uni-app-fe/component/uni-side-menu/uni-side-menu.ts","../../../projects/uni-app-fe/component/uni-side-menu/uni-side-menu.html","../../../projects/uni-app-fe/component/uni-app-fe-component.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { faTriangleExclamation, IconDefinition } from '@fortawesome/free-solid-svg-icons';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\n\r\n@Component({\r\n selector: 'uni-banner-alert',\r\n imports: [CommonModule, FaIconComponent, UniTranslatePipe],\r\n templateUrl: './uni-banner-alert.html',\r\n styleUrls: ['./uni-banner-alert.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniBannerAlert {\r\n /* Icons */\r\n type = input.required<'warning' | 'error'>();\r\n lblTitle = input.required<string>();\r\n lblDescription = input.required<string>();\r\n icon = input<IconDefinition>();\r\n\r\n /* Icons */\r\n readonly ICON_WARNING = faTriangleExclamation;\r\n}\r\n","<div\r\n class=\"flex w-full flex-col gap-6 rounded-2xl border-2 p-4 text-center shadow-lg backdrop-blur-md\"\r\n [ngClass]=\"{\r\n 'bg-amber-500/25 border-amber-500 dark:text-amber-100 text-amber-500': type() === 'warning',\r\n 'bg-rose-500/25 border-rose-500 dark:text-rose-200 text-rose-500': type() === 'error'\r\n }\">\r\n <div class=\"flex flex-col items-center gap-4\">\r\n <h1 class=\"text-lg! font-semibold\">{{ lblTitle() | translate }}</h1>\r\n @if(icon(); as icon) {\r\n <fa-icon class=\"text-5xl\" [icon]=\"icon\"></fa-icon>\r\n }\r\n <p class=\"text-sm leading-relaxed text-white!\">{{ lblDescription() | translate }}</p>\r\n </div>\r\n</div>\r\n","import { Pipe, type PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'get_body_async',\n standalone: true,\n})\nexport class GetBodyAsyncPipe implements PipeTransform {\n /**\n * Mappa per la memorizzazione (cache) del testo già estratto.\n * Evita il consumo ripetuto dello stream associato alla stessa Request.\n */\n private cache = new Map<Request, string>();\n\n async transform(request: Request | null | undefined): Promise<string> {\n // Gestione del caso in cui la richiesta o il relativo corpo siano assenti\n if (!request || !request.body) {\n return '';\n }\n\n // Restituzione immediata del valore se il testo è già presente in cache\n if (this.cache.has(request)) {\n return this.cache.get(request)!;\n }\n\n // Controllo dello stato del body: se è già bloccato (locked), la lettura fallirebbe\n if (request.body.locked) {\n console.warn('Request stream is currently locked.');\n return '[Body Locked]';\n }\n\n try {\n // Clonazione della richiesta originale per isolare lo stream del body\n const clonedRequest: Request = request.clone();\n\n // Estrazione dello stream grezzo (ReadableStream) per ottenere il body della richiesta\n const bodyStream: ReadableStream<Uint8Array> | null = clonedRequest.body;\n\n // Creazione di una risposta fittizia per consumare lo stream in modo standard\n const temporaryResponse: Response = new Response(bodyStream);\n\n // Avvio della lettura asincrona del testo dallo stream consumato\n const extractedText: string = await temporaryResponse.text();\n\n // Archiviazione del testo nella cache per le consultazioni successive\n this.cache.set(request, extractedText);\n\n return extractedText;\n } catch (error) {\n console.error('Error during stream reading:', error);\n return 'Error reading request body';\n }\n }\n}\n\n","import { Pipe, type PipeTransform } from '@angular/core';\nimport { IconDefinition } from '@fortawesome/angular-fontawesome';\nimport { faComputer, faDesktop, faServer, faWifi } from '@fortawesome/free-solid-svg-icons';\nimport type { IUniFeError, IUniHttpError } from 'uni-model-type/type';\n\ninterface ErrorDataByType {\n title: string;\n message: string;\n icon: IconDefinition;\n httpStatus: string;\n functionName: string;\n}\n\n@Pipe({\n name: 'get_data',\n})\nexport class GetDataPipe implements PipeTransform {\n transform(error: { id: string } & (IUniFeError | IUniHttpError)): ErrorDataByType {\n switch (error.type) {\n case 'fe': {\n return {\n title: `${error.exception.functionName}()`,\n message: error.exception.message,\n icon: faDesktop,\n httpStatus: '-', // non presente\n functionName: `${error.exception.functionName}()`,\n };\n }\n case 'network': {\n return {\n title: error.id,\n message: error.exception.message,\n icon: faWifi,\n httpStatus: '-', // 0\n functionName: `${error.exception.functionName}()`,\n };\n }\n case 'server': {\n let displayMessage = error.exception.message;\n\n // Verifica se il message è un json\n if (\n displayMessage &&\n (displayMessage.codePointAt(0) === 123 || displayMessage.codePointAt(0) === 91)\n ) {\n try {\n displayMessage = JSON.stringify(JSON.parse(displayMessage), null, 2);\n } catch {\n // Fallback silenzioso: se il parsing fallisce viene tenuta la stringa originale\n }\n }\n\n return {\n title: error.id,\n message: displayMessage,\n icon: faComputer,\n httpStatus: (error.httpStatus > 0 ? error.httpStatus : '-').toString(),\n functionName: `${error.exception.functionName}()`,\n };\n }\n case 'be': {\n return {\n title: error.id,\n message: error.exception.message,\n icon: faServer,\n httpStatus: (error.httpStatus > 0 ? error.httpStatus : '-').toString(),\n functionName: error.exception.functionName,\n };\n }\n }\n }\n}\n\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input, linkedSignal, signal } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport {\r\n faCircleInfo,\r\n faClock,\r\n faCopy,\r\n faDesktop,\r\n faInbox,\r\n} from '@fortawesome/free-solid-svg-icons';\r\nimport { DxButtonModule } from 'devextreme-angular/ui/button';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\nimport { UniParsePipe, UniTranslatePipe, UniUrlPipe } from 'uni-app-fe/pipe';\r\nimport { UniErrorManager } from 'uni-manager/error';\r\nimport { UniHttpManager } from 'uni-manager/http';\r\nimport type { FeLog, IUniFeError, IUniHttpError } from 'uni-model-type/type';\r\n\r\nimport { GetBodyAsyncPipe } from './get-body-async.pipe';\r\nimport { GetDataPipe } from './get-data.pipe';\r\n\r\ntype UError = { id: string } & (IUniFeError | IUniHttpError);\r\ntype UErrorWithStatus = UError & { isOpen: boolean; isCopied: boolean; isSaved: boolean };\r\n\r\n@Component({\r\n selector: 'uni-dialog-error',\r\n imports: [\r\n CommonModule,\r\n DxButtonModule,\r\n DxTooltipModule,\r\n FaIconComponent,\r\n DatePipe,\r\n UniTranslatePipe,\r\n GetDataPipe,\r\n GetBodyAsyncPipe,\r\n UniParsePipe,\r\n UniUrlPipe,\r\n ],\r\n templateUrl: './uni-dialog-error.html',\r\n styleUrl: './uni-dialog-error.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniDialogError {\r\n /* Input */\r\n errors = input.required<UError[]>();\r\n errorsWithStatus = linkedSignal({\r\n source: this.errors,\r\n computation: (newErrors, prev: { value: UErrorWithStatus[] } | undefined) => {\r\n return newErrors.map((x) => {\r\n // Se l'errore esisteva già, restituisce l'oggetto vecchio\r\n const existing = prev?.value.find((old) => old.id === x.id);\r\n if (existing) {\r\n existing.isCopied = false;\r\n existing.isSaved = false;\r\n return existing;\r\n }\r\n\r\n // Se è un errore nuovo, crea l'oggetto con i flag di default\r\n const newItem = { ...x, isOpen: false, isCopied: false, isSaved: false };\r\n\r\n return newItem;\r\n });\r\n },\r\n });\r\n\r\n /* Variables */\r\n toast = signal<{ timeoutId: number; label: string } | null>(null);\r\n\r\n /* Icons */\r\n readonly ICON_FE = faDesktop;\r\n readonly ICON_TIMER = faClock;\r\n readonly ICON_COUNT = faInbox;\r\n readonly ICON_INFO = faCircleInfo;\r\n readonly ICON_COPY = faCopy;\r\n\r\n /* ------------------ Methods ------------------ */\r\n onCloseDialog(): void {\r\n UniErrorManager.removeAll();\r\n }\r\n\r\n onToggleIsOpen(id: string): void {\r\n this.errorsWithStatus.update((x) =>\r\n x.map((y) => {\r\n if (y.id === id) y.isOpen = !y.isOpen;\r\n return y;\r\n }),\r\n );\r\n }\r\n\r\n async onCopy(value: any): Promise<void> {\r\n await this.copy(value, 'ValueCopied');\r\n }\r\n\r\n async onCopyAll(id: string): Promise<void> {\r\n /* Recupero errore */\r\n const currentError = this.errorsWithStatus().find((e) => e.id === id);\r\n if (!currentError) return;\r\n\r\n /* Azione */\r\n await this.copy(JSON.stringify(currentError, null, 2), 'ErrorCopied');\r\n\r\n /* Aggiornamento datasource */\r\n this.errorsWithStatus.update((list) =>\r\n list.map((err) => ({ ...err, isCopied: err.id === id })),\r\n );\r\n }\r\n\r\n onSave(id: string): void {\r\n /* Recupero errore */\r\n const currentError = this.errorsWithStatus().find((e) => e.id === id);\r\n if (!currentError) return;\r\n\r\n /* Azione */\r\n const log: FeLog = {\r\n id: -1,\r\n severity: 'error',\r\n module: currentError.type,\r\n timestamp: currentError.timestamp,\r\n ref: currentError.id,\r\n exceptionType: currentError.exception.type,\r\n exceptionFunctionName: currentError.exception.functionName,\r\n exceptionMessage: currentError.exception.message,\r\n exceptionStackTrace: currentError.exception.stackTrace,\r\n exceptionStackTraceFrames: currentError.exception.stackTraceFrames,\r\n };\r\n\r\n /* Api */\r\n UniHttpManager.create$({ ref: 'Log', path: '/Log/AddFeLog', hasToast: false }, log).subscribe(\r\n () => {\r\n this.errorsWithStatus.update((list) =>\r\n list.map((err) => {\r\n if (err.id === id) err.isSaved = true;\r\n return err;\r\n }),\r\n );\r\n\r\n /* Toast */\r\n this.showToast('ErrorSaved');\r\n },\r\n );\r\n }\r\n\r\n onDelete(id: string): void {\r\n /* Azione */\r\n UniErrorManager.remove(id);\r\n\r\n /* Toast */\r\n this.showToast('ErrorRemoved');\r\n }\r\n\r\n /* ------------------ Methods: utils ------------------ */\r\n private showToast = (label: string) => {\r\n /* Reset vecchio timeout (se ancora in corso) */\r\n if (this.toast()?.timeoutId) {\r\n clearTimeout(this.toast()!.timeoutId);\r\n }\r\n\r\n /* Reset vecchio toast (se ancora in corso) */\r\n this.toast.set(null);\r\n\r\n /* Piccolo timeout cosi da evidenziare un nuovo toast (se presente ancora un toast in corso) */\r\n setTimeout(() => {\r\n /* Nascosto toast dopo x tempo */\r\n const timeoutId = setTimeout(() => this.toast.set(null), 2000);\r\n\r\n /* Mostrato toast */\r\n this.toast.set({ timeoutId, label });\r\n }, 100);\r\n };\r\n\r\n private copy = async (value: any, lblToast: string) => {\r\n let valueFormatted = '';\r\n try {\r\n // Se è una stringa si prova a convertirla in oggetto JSON\r\n if (typeof valueFormatted === 'string') {\r\n try {\r\n valueFormatted = JSON.parse(value);\r\n } catch {\r\n /* Non è un JSON, resta stringa */\r\n }\r\n }\r\n\r\n const formattedText =\r\n typeof valueFormatted === 'object' && valueFormatted !== null\r\n ? JSON.stringify(valueFormatted, null, 2)\r\n : String(valueFormatted)\r\n .replaceAll(String.raw`\\r\\n`, '\\n')\r\n .replaceAll(String.raw`\\n`, '\\n');\r\n\r\n await navigator.clipboard.writeText(formattedText);\r\n\r\n this.showToast(lblToast);\r\n } catch {\r\n this.showToast('OperationNotAvailable');\r\n }\r\n };\r\n}\r\n","<div\r\n class=\"relative flex h-full w-full flex-col gap-6 overflow-hidden rounded-4xl border border-rose-800/25 bg-linear-to-tr from-rose-500/10 via-rose-900/20 to-rose-500/5 p-6 text-left shadow-[0_50px_100px_-20px_rgba(0,0,0,0.7),inset_0_1px_0_rgba(255,255,255,0.15)] backdrop-blur-3xl\">\r\n <div\r\n class=\"pointer-events-none absolute -top-40 -left-40 size-96 animate-pulse rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n <div\r\n class=\"pointer-events-none absolute -right-40 -bottom-40 size-96 rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n\r\n <!-- Titolo -->\r\n <header class=\"flex items-center justify-between gap-4 border-b border-rose-400/25 pb-5\">\r\n <!-- Titolo: led -->\r\n <span class=\"relative flex size-3\">\r\n <span\r\n class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-rose-400 opacity-40\"></span>\r\n <span\r\n class=\"relative inline-flex size-3 rounded-full bg-linear-to-tr from-rose-500 to-rose-300 shadow-[0_0_20px_rgba(244,63,94,0.8)]\"></span>\r\n </span>\r\n\r\n <!-- Titolo: scritta -->\r\n <div class=\"flex flex-1 flex-col\">\r\n <h1 class=\"text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n </div>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"rounded-xl border border-white/7.5 bg-white/5 px-3 py-1.5 font-mono text-xs font-semibold tracking-wider text-neutral-200\">\r\n {{ 'Total' | translate }}: {{ errors().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'close'\"\r\n (onClick)=\"onCloseDialog()\"></dx-button>\r\n </header>\r\n\r\n <!-- Lista Errori -->\r\n <main\r\n class=\"scrollbar-none overflow-y-auto [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\">\r\n <ul class=\"flex flex-col gap-4 px-6 pt-2 pb-4\">\r\n @for (error of errorsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let errorData = error | get_data;\r\n <li\r\n class=\"group squircle flex w-full flex-col overflow-hidden rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': error.isOpen }\">\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Titolo -->\r\n <div class=\"flex items-center justify-between gap-4\">\r\n <!-- Titolo: reference -->\r\n <div class=\"flex min-w-0 items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': error.isOpen }\"\r\n [title]=\"(error.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(error.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ errorData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Titolo: type -->\r\n <div\r\n class=\"flex items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 font-mono text-xs font-medium text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(error.type === 'network' || error.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"errorData.icon\" [title]=\"error.type\" />\r\n <span class=\"text-2xs hidden tracking-wider uppercase sm:inline\">\r\n {{ error.type }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Messaggio -->\r\n <div class=\"container-message flex flex-col gap-4\">\r\n <!-- Messaggio default -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }}\r\n <button (click)=\"onCopy(errorData.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">{{ errorData.message }}</p>\r\n </article>\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }} {{ 'Inner' | translate }}\r\n <button (click)=\"onCopy(error.innerException.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">\r\n {{ error.innerException.message }}\r\n </p>\r\n </article>\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(error.isOpen) {\r\n <div class=\"container-detail flex flex-col gap-6\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-3xl! font-semibold text-rose-300\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-8\">\r\n @if(error.type === 'be' || error.type === 'server') {\r\n <!-- Dettagli: request -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Request' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex gap-16\">\r\n <!-- Dettagli: request metodo http -->\r\n <article class=\"shrink-0 basis-24\">\r\n <h3 class=\"group/title\">\r\n {{ 'Method' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMethod' | translate\" />\r\n </h3>\r\n <p>{{ error.request.method }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request url -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n URL\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUrl' | translate\" />\r\n </h3>\r\n <p class=\"truncate\">{{ error.request.url }}</p>\r\n </article>\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Query params\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipQueryParams' | translate\" />\r\n </h3>\r\n @let queryParams = [...(error.request.url | url).searchParams];\r\n @if(queryParams.length) {\r\n <ul>\r\n @for (param of queryParams; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ param[0] }}: {{ param[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request headers -->\r\n <article>\r\n @let headers = [...error.request.headers.entries()];\r\n <h3 class=\"group/title\">\r\n Headers\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipHeaders' | translate\" />\r\n <button [disabled]=\"!headers.length\" (click)=\"onCopy(headers)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(headers.length) {\r\n <ul>\r\n @for (header of headers; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ header[0] }}: {{ header[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request body -->\r\n <article>\r\n @let body = error.request | get_body_async | async;\r\n <h3 class=\"group/title\">\r\n Body\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipBody' | translate\" />\r\n <button [disabled]=\"!error.request.body\" (click)=\"onCopy(body)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(error.request.body) {\r\n <pre>{{ body | parse | json }}</pre>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex gap-4\">\r\n <!-- Dettagli: request info mode -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Mode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.mode }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Credentials' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCredentials' | translate\" />\r\n </h3>\r\n <p>{{ error.request.credentials }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info cache -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'CacheMode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCacheMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.cache }}</p>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dettagli: info -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Diagnostic' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Duration' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipDuration' | translate\" />\r\n </h3>\r\n <p>{{ error.durationMs / 1000 }}s</p>\r\n </article>\r\n\r\n <!-- Dettagli: info user agent -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n User agent\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUserAgent' | translate\" />\r\n </h3>\r\n <p>{{ error.userAgent }}s</p>\r\n </article>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Dettagli: eccezione -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Exception' | translate }} ({{ error.type }})</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.functionName\"\r\n (click)=\"onCopy(error.exception.functionName)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.functionName }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipType' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.type\"\r\n (click)=\"onCopy(error.exception.type)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.type }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipStackTrace' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.stackTrace \"\r\n (click)=\"onCopy(error.exception.stackTrace)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.exception.stackTrace }}</pre>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Frames\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFrames' | translate\" />\r\n </h3>\r\n <ul>\r\n @for (frame of error.exception.stackTraceFrames; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span class=\"flex-1\"> {{ frame.file }} </span>\r\n <span> {{ 'Line' | translate }} {{ frame.line }} </span>\r\n </li>\r\n }\r\n </ul>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(error.isOpen) { @if((error.type === 'be' || error.type === 'server') &&\r\n error.innerException) {\r\n <div class=\"container-inner flex flex-col gap-4\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-2xl! font-semibold text-rose-300\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.innerException.functionName\"\r\n (click)=\"onCopy(error.innerException.functionName)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.functionName }}</p>\r\n </article>\r\n\r\n <!-- Interno: tipo -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerType' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.type)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.type }}</p>\r\n </article>\r\n\r\n <!-- Interno: stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerStackTrace' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.stackTrace)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.innerException.stackTrace }}</pre>\r\n </article>\r\n </div>\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 sm:flex-row sm:items-center\">\r\n <!-- Footer: metadata -->\r\n <div class=\"flex items-center gap-6 text-xs\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex min-w-22 items-center justify-center gap-2 rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1\">\r\n <span\r\n class=\"font-mono font-bold text-rose-400 transition-colors duration-300 group-hover:text-white\">\r\n HTTP\r\n </span>\r\n <span class=\"font-mono text-neutral-300\"> {{ errorData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-neutral-300\">\r\n {{ error.timestamp | date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ error.count }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"flex scale-95 items-center justify-end gap-2 opacity-0 transition duration-300 group-hover:scale-100 group-hover:opacity-100\">\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isCopied\"\r\n (click)=\"onCopyAll(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isSaved\"\r\n (click)=\"onSave(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(error.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">✓</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n","import { NgOptimizedImage } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\r\nimport { DxButtonModule } from 'devextreme-angular/ui/button';\r\n\r\n@Component({\r\n selector: 'uni-header',\r\n standalone: true,\r\n imports: [DxButtonModule, NgOptimizedImage],\r\n templateUrl: './uni-header.html',\r\n styleUrls: ['./uni-header.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniHeader {\r\n /* Input */\r\n title = input.required<string>();\r\n version = input.required<string>();\r\n pathBrandLogo = input.required<string>();\r\n pathAppLogo = input<string>();\r\n sideMenu = input<boolean>(false);\r\n\r\n /* Output */\r\n evtToggleMenu = output<true>();\r\n}\r\n","<div\r\n class=\"dark:bg-theme-dark-800 flex h-16 items-center gap-4 overflow-hidden rounded-xl bg-blue-300 px-4 py-3 text-white\">\r\n <!-- App logo -->\r\n @if (pathAppLogo(); as pathAppLogo) {\r\n <img\r\n [ngSrc]=\"pathAppLogo\"\r\n width=\"40\"\r\n height=\"40\"\r\n priority\r\n class=\"aspect-square h-full w-auto\"\r\n alt=\"App logo\" />\r\n }\r\n\r\n <!-- Info -->\r\n <div class=\"flex flex-1 flex-col overflow-hidden\">\r\n <p class=\"truncate text-xl font-semibold uppercase leading-tight\">{{ title() }}</p>\r\n <p class=\"text-xs opacity-75\">{{ version() }}</p>\r\n </div>\r\n\r\n <div class=\"flex h-full items-center gap-2\">\r\n <!-- Brand Logo -->\r\n <div class=\"2xs:block relative hidden h-full w-24\">\r\n <img\r\n [ngSrc]=\"pathBrandLogo()\"\r\n fill\r\n priority\r\n class=\"object-contain object-right\"\r\n alt=\"Brand logo\" />\r\n </div>\r\n\r\n <!-- Button menu -->\r\n @if (sideMenu()) {\r\n <dx-button class=\"shadow-none!\" [icon]=\"'menu'\" (onClick)=\"evtToggleMenu.emit(true)\">\r\n </dx-button>\r\n }\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\n\r\n@Component({\r\n selector: 'uni-item-field-with-hight-contrast',\r\n imports: [DxTooltipModule, UniTranslatePipe],\r\n templateUrl: './uni-item-field-with-hight-contrast.html',\r\n styleUrl: './uni-item-field-with-hight-contrast.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniItemFieldWithHightContrast {\r\n /* Input */\r\n label = input.required<string>();\r\n value = input.required<string | number | null | undefined>();\r\n}\r\n","<div class=\"flex flex-col items-start\">\r\n <span class=\"max-w-full min-w-0 truncate text-lg text-nowrap text-gray-500 dark:text-gray-300\">\r\n {{ label() | translate }}\r\n </span>\r\n <span #tooltipTarget class=\"max-w-full min-w-0 cursor-help truncate text-3xl font-semibold\">\r\n {{ value() || '-' }}\r\n </span>\r\n</div>\r\n\r\n<dx-tooltip\r\n [target]=\"tooltipTarget\"\r\n showEvent=\"mouseenter\"\r\n hideEvent=\"mouseleave\"\r\n [hideOnOutsideClick]=\"false\">\r\n <div *dxTemplate=\"let data = data; of: 'content'\">{{ value() || '-' }}</div>\r\n</dx-tooltip>\r\n","import { CommonModule, DatePipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\nimport { UniToastManager } from 'uni-manager/toast';\r\n\r\n@Component({\r\n selector: 'uni-item-field',\r\n imports: [CommonModule, DxTooltipModule, UniTranslatePipe],\r\n providers: [DatePipe],\r\n templateUrl: './uni-item-field.html',\r\n styleUrl: './uni-item-field.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniItemField {\r\n /* Pipe */\r\n readonly datePipe = inject(DatePipe);\r\n\r\n /* Input */\r\n label = input.required<string>();\r\n value = input.required<string | number | Date | null | undefined>();\r\n udm = input<string>();\r\n dateFormat = input<'short' | 'medium' | 'shortDate' | 'mediumDate' | 'longDate' | 'fullDate'>(\r\n 'longDate',\r\n );\r\n\r\n /* Variable */\r\n valueFormatted = computed(() => {\r\n const value = this.value();\r\n if (!value) return '';\r\n\r\n if (\r\n (value instanceof Date && !Number.isNaN(value.getTime())) ||\r\n (typeof value === 'string' && this.isValidDateString(value))\r\n ) {\r\n return this.datePipe.transform(new Date(value), this.dateFormat());\r\n }\r\n return `${value}${this.udm() ?? ''}`;\r\n });\r\n\r\n /* ---------------- Methods: event ---------------- */\r\n async onCopyValue(): Promise<void> {\r\n const value = this.valueFormatted();\r\n if (!value) return;\r\n\r\n // Controllo se l'API è disponibile e il contesto è sicuro (HTTPS/Localhost)\r\n if (navigator.clipboard && globalThis.isSecureContext) {\r\n await navigator.clipboard.writeText(value);\r\n UniToastManager.show({ label: 'ValueCopied' });\r\n }\r\n }\r\n\r\n /* ---------------- Methods: utils ---------------- */\r\n private isValidDateString(value: unknown): value is string {\r\n if (typeof value !== 'string') return false;\r\n\r\n // ISO 8601 (con o senza timezone)\r\n const isoRegex =\r\n /^\\d{4}-\\d{2}-\\d{2}(?:[T ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})?)?$/;\r\n\r\n if (!isoRegex.test(value)) return false;\r\n\r\n const date = new Date(value);\r\n return !Number.isNaN(date.getTime());\r\n }\r\n}\r\n","<li class=\"flex items-center gap-2 text-sm!\">\r\n <span class=\"text-nowrap text-gray-500 dark:text-gray-300\"> {{ label() | translate }}: </span>\r\n <span\r\n #tooltipTarget\r\n [ngClass]=\"{'text-gray-500/50 dark:text-gray-300/50': !valueFormatted() }\"\r\n class=\"max-w-full min-w-0 cursor-help truncate font-semibold transition duration-100 ease-in-out hover:opacity-75 active:scale-95\"\r\n (click)=\"onCopyValue()\">\r\n {{ valueFormatted() || '-' }}\r\n </span>\r\n</li>\r\n\r\n<dx-tooltip\r\n [target]=\"tooltipTarget\"\r\n showEvent=\"mouseenter\"\r\n hideEvent=\"mouseleave\"\r\n [hideOnOutsideClick]=\"false\">\r\n <div *dxTemplate=\"let data = data; of: 'content'\">{{ valueFormatted() || '-' }}</div>\r\n</dx-tooltip>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { faCircleInfo } from '@fortawesome/free-solid-svg-icons';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\n\r\nimport { UniItemField } from '../uni-item-field/uni-item-field';\r\n\r\n@Component({\r\n selector: 'uni-item-field-with-lens-tooltip',\r\n imports: [DxTooltipModule, FaIconComponent, UniItemField],\r\n templateUrl: './uni-item-field-with-lens-tooltip.html',\r\n styleUrl: './uni-item-field-with-lens-tooltip.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniItemFieldWithLensTooltip {\r\n /* Input */\r\n id = input.required<string>();\r\n label = input.required<string>();\r\n value = input.required<string | number | Date | null | undefined>();\r\n\r\n /* Icon */\r\n readonly ICON_INFO = faCircleInfo;\r\n}\r\n","<div class=\"flex items-center gap-1\">\r\n <uni-item-field [label]=\"label()\" [value]=\"value()\" />\r\n\r\n <div #tooltipInfoTarget>\r\n <fa-icon\r\n class=\"text-theme-200 cursor-help rounded px-1 text-xs! transition duration-150 ease-in-out hover:opacity-75\"\r\n [icon]=\"ICON_INFO\">\r\n </fa-icon>\r\n </div>\r\n\r\n <dx-tooltip\r\n [target]=\"tooltipInfoTarget\"\r\n showEvent=\"mouseenter\"\r\n hideEvent=\"mouseleave\"\r\n [hideOnOutsideClick]=\"false\">\r\n <div *dxTemplate=\"let data = data; of: 'content'\">\r\n <ng-content></ng-content>\r\n </div>\r\n </dx-tooltip>\r\n</div>\r\n","export enum LedStatus {\r\n OK,\r\n WARNING,\r\n ERROR,\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\n\r\nimport { LedStatus } from './model';\r\n\r\n@Component({\r\n selector: 'uni-led',\r\n imports: [CommonModule],\r\n templateUrl: './uni-led.html',\r\n styleUrls: ['./uni-led.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniLed {\r\n /* Inputs */\r\n public description = input.required<string>();\r\n public status = input.required<LedStatus | boolean | null | undefined>();\r\n\r\n /* Enum */\r\n protected readonly LED_STATUS = LedStatus;\r\n}\r\n","<div class=\"flex items-center gap-1\">\r\n <div\r\n class=\"led\"\r\n [ngClass]=\"{\r\n ok: status() === true || status() === LED_STATUS.OK,\r\n warning: status() === LED_STATUS.WARNING,\r\n error: status() === false || status() === LED_STATUS.ERROR,\r\n }\"></div>\r\n <p class=\"truncate text-sm\">{{ description() }}</p>\r\n <ng-content></ng-content>\r\n</div>\r\n","import { CommonModule, NgOptimizedImage } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { RouterLink, RouterLinkActive } from '@angular/router';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport {\r\n faArrowRightFromBracket,\r\n faArrowRightToBracket,\r\n faBell,\r\n faLanguage,\r\n faMoon,\r\n faSun,\r\n faUser,\r\n} from '@fortawesome/free-solid-svg-icons';\r\nimport { DxButtonModule } from 'devextreme-angular/ui/button';\r\nimport { DxSelectBoxModule } from 'devextreme-angular/ui/select-box';\r\nimport { DxSwitchModule } from 'devextreme-angular/ui/switch';\r\nimport { ValueChangedEvent as SelectBoxValueChangedEvent } from 'devextreme/ui/select_box_types';\r\nimport { ValueChangedEvent as SwitchValueChangedEvent } from 'devextreme/ui/switch_types';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\nimport { UniLoaderService } from 'uni-app-fe/service';\r\nimport { UniLocaleManager } from 'uni-manager/locale';\r\n\r\nimport { MenuInteraction, MenuItem } from './model';\r\n\r\n@Component({\r\n selector: 'uni-side-menu',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n RouterLink,\r\n RouterLinkActive,\r\n DxButtonModule,\r\n DxSelectBoxModule,\r\n DxSwitchModule,\r\n UniTranslatePipe,\r\n FaIconComponent,\r\n NgOptimizedImage,\r\n ],\r\n templateUrl: './uni-side-menu.html',\r\n styleUrls: ['./uni-side-menu.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniSideMenu {\r\n /* Service */\r\n readonly elementRef = inject(ElementRef);\r\n readonly uniLoader = inject(UniLoaderService);\r\n\r\n /* Input */\r\n readonly pathUnitecLogo = input.required<string>();\r\n readonly menuItems = input<MenuItem[]>([]);\r\n readonly menuInteractions = input<MenuInteraction[]>([]);\r\n\r\n /* Output */\r\n evtToggleMenu = output<false>();\r\n\r\n /* Variables */\r\n locale = UniLocaleManager.locale;\r\n localesSupported = UniLocaleManager.localesSupported;\r\n darkMode = signal<boolean>(\r\n !localStorage.getItem('uni-theme') || localStorage.getItem('uni-theme') === 'dark',\r\n );\r\n\r\n /* Icons */\r\n readonly ICON = {\r\n USER: faUser,\r\n LOGIN: faArrowRightToBracket,\r\n LOGOUT: faArrowRightFromBracket,\r\n LIGHT_MODE: faSun,\r\n DARK_MODE: faMoon,\r\n LANGUAGE: faLanguage,\r\n NOTIFICATION: faBell,\r\n };\r\n\r\n /* ---------------------- Host listener ---------------------- */\r\n @HostListener('document:click', ['$event'])\r\n protected onClickOutside(event: Event): void {\r\n const target = event.target as HTMLElement;\r\n\r\n // Controlla se il click è avvenuto dentro il menu principale\r\n const clickedInsideMenu = this.elementRef.nativeElement.contains(target);\r\n\r\n // Controlla se il click è avvenuto dentro un popup/dropdown aperto\r\n const clickedInsideOverlay = !!target.closest(\r\n '.dx-overlay-wrapper, .dx-dropdowneditor-overlay',\r\n );\r\n\r\n // Se il click è fuori da entrambi, allora chiude il menu\r\n if (!clickedInsideMenu && !clickedInsideOverlay) {\r\n this.evtToggleMenu.emit(false);\r\n }\r\n }\r\n\r\n /* ---------------------- Methods ---------------------- */\r\n updateTheme(e: SwitchValueChangedEvent): void {\r\n this.uniLoader.show();\r\n localStorage.setItem('uni-theme', e.value ? 'dark' : 'light');\r\n globalThis.location.reload();\r\n }\r\n\r\n updateLocale(e: SelectBoxValueChangedEvent): void {\r\n this.uniLoader.show();\r\n localStorage.setItem('uni-locale', e.value);\r\n globalThis.location.reload();\r\n }\r\n}\r\n","<aside\r\n class=\"dark:bg-theme-dark-800 dark:border-theme-dark-900 flex h-screen w-[80vw] max-w-75 flex-col gap-6 overflow-hidden rounded-l border-b-2 border-l-2 border-blue-400/33 bg-blue-300 p-4 shadow-2xl\">\r\n <!-- Header: User/Close -->\r\n <div class=\"flex h-8 w-full shrink-0 items-center\">\r\n <dx-button class=\"ml-auto rounded-full!\" [icon]=\"'close'\" (onClick)=\"evtToggleMenu.emit(false)\">\r\n </dx-button>\r\n </div>\r\n\r\n <div class=\"custom-scrollbar flex flex-1 flex-col overflow-x-hidden overflow-y-auto pr-1\">\r\n <!-- Sezione Menu Principale -->\r\n @if (menuItems().length) {\r\n <ul class=\"flex flex-col gap-1.5\">\r\n @for (item of menuItems(); track item.id) { @if (item.visible !== false) {\r\n <li>\r\n <a\r\n class=\"group flex h-12 items-center gap-3 rounded-lg px-3 text-white! transition-colors dark:text-gray-300!\"\r\n [ngClass]=\"{\r\n 'dark:hover:bg-theme-dark-700 hover:bg-blue-400': !item.badge && !item.disabled,\r\n 'hover:bg-red-500/50': item.badge && !item.disabled,\r\n 'pointer-events-none opacity-30 grayscale': item.disabled,\r\n }\"\r\n [routerLink]=\"item.disabled ? null : item.path\"\r\n [routerLinkActive]=\"item.badge ?\r\n 'bg-red-500/60 *:text-white! *:font-semibold!' :\r\n 'bg-blue-400/75 dark:bg-theme-dark-700 *:text-white! *:font-semibold!'\r\n \"\r\n (click)=\"evtToggleMenu.emit(false)\">\r\n <fa-icon [icon]=\"item.icon\" class=\"w-6 text-center text-lg\"></fa-icon>\r\n <span class=\"flex-1 truncate font-medium\">{{ item.label }}</span>\r\n @if (item.badge) {\r\n <div\r\n class=\"flex size-6 animate-pulse items-center justify-center rounded bg-red-500 shadow-lg\">\r\n <fa-icon class=\"text-xs\" [icon]=\"ICON.NOTIFICATION\"></fa-icon>\r\n </div>\r\n }\r\n </a>\r\n </li>\r\n } }\r\n </ul>\r\n }\r\n\r\n <!-- Sezione Interazioni Dinamiche -->\r\n @if (menuInteractions().length) {\r\n <hr class=\"dark:border-theme-dark-900 my-6 border-blue-400/30\" />\r\n <ul class=\"flex flex-col gap-2 text-white\">\r\n @for (item of menuInteractions(); track item.id) { @if (item.data.type === 'button') {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"flex h-12 w-full items-center gap-3 rounded-lg px-3 transition-all active:scale-95\"\r\n [class]=\"item.class\"\r\n (click)=\"item.data.onClick()\">\r\n <fa-icon class=\"w-6\" [icon]=\"item.data.icon\"></fa-icon>\r\n <span class=\"flex-1 truncate text-left font-medium\">{{ item.label }}</span>\r\n </button>\r\n </li>\r\n } @else if (item.data.type === 'select') {\r\n <li\r\n class=\"dark:bg-theme-dark-700 flex flex-col gap-1 rounded-lg bg-blue-400/75 p-3 shadow-sm\">\r\n <span class=\"text-xs font-bold uppercase opacity-60\">{{ item.label }}</span>\r\n <dx-select-box\r\n class=\"w-full\"\r\n valueExpr=\"id\"\r\n displayExpr=\"description\"\r\n [items]=\"item.data.combos\"\r\n [value]=\"item.data.value\"\r\n stylingMode=\"underlined\"\r\n (onValueChanged)=\"item.data.onValueChanged($event)\">\r\n </dx-select-box>\r\n </li>\r\n } }\r\n </ul>\r\n }\r\n\r\n <!-- Settings Statici -->\r\n <hr class=\"dark:border-theme-dark-900 my-6 border-blue-400/30\" />\r\n <div class=\"flex flex-col gap-3\">\r\n <div\r\n class=\"dark:bg-theme-dark-700 flex h-14 items-center justify-between rounded-lg bg-blue-400/75 px-4 text-white shadow-sm\">\r\n <div class=\"flex items-center gap-3\">\r\n <fa-icon [icon]=\"darkMode() ? ICON.DARK_MODE : ICON.LIGHT_MODE\"></fa-icon>\r\n <span class=\"truncate\">{{ 'DarkMode' | translate }}</span>\r\n </div>\r\n <dx-switch [value]=\"darkMode()\" (onValueChanged)=\"updateTheme($event)\"></dx-switch>\r\n </div>\r\n\r\n <div\r\n class=\"dark:bg-theme-dark-700 flex h-14 items-center justify-between rounded-lg bg-blue-400/75 px-4 text-white shadow-sm\">\r\n <div class=\"flex items-center gap-3\">\r\n <fa-icon [icon]=\"ICON.LANGUAGE\"></fa-icon>\r\n <span class=\"truncate\">{{ 'Language' | translate }}</span>\r\n </div>\r\n <dx-select-box\r\n class=\"w-24\"\r\n [items]=\"localesSupported\"\r\n [value]=\"locale\"\r\n stylingMode=\"underlined\"\r\n (onValueChanged)=\"updateLocale($event)\">\r\n </dx-select-box>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Logo -->\r\n <div class=\"mt-auto border-t border-white/20 pt-4\">\r\n <img\r\n class=\"ml-auto opacity-90 transition-opacity hover:opacity-100\"\r\n [ngSrc]=\"pathUnitecLogo()\"\r\n priority\r\n alt=\"Brand logo\"\r\n height=\"32\"\r\n width=\"88\" />\r\n </div>\r\n</aside>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i1"],"mappings":"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"}
1
+ {"version":3,"file":"uni-app-fe-component.mjs","sources":["../../../projects/uni-app-fe/component/uni-banner-alert/uni-banner-alert.ts","../../../projects/uni-app-fe/component/uni-banner-alert/uni-banner-alert.html","../../../projects/uni-app-fe/component/uni-dialog-error/get-body-async.pipe.ts","../../../projects/uni-app-fe/component/uni-dialog-error/get-data.pipe.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error.html","../../../projects/uni-app-fe/component/uni-header/uni-header.ts","../../../projects/uni-app-fe/component/uni-header/uni-header.html","../../../projects/uni-app-fe/component/uni-item-field-with-hight-contrast/uni-item-field-with-hight-contrast.ts","../../../projects/uni-app-fe/component/uni-item-field-with-hight-contrast/uni-item-field-with-hight-contrast.html","../../../projects/uni-app-fe/component/uni-item-field/uni-item-field.ts","../../../projects/uni-app-fe/component/uni-item-field/uni-item-field.html","../../../projects/uni-app-fe/component/uni-item-field-with-lens-tooltip/uni-uni-item-field-with-lens-tooltip.ts","../../../projects/uni-app-fe/component/uni-item-field-with-lens-tooltip/uni-item-field-with-lens-tooltip.html","../../../projects/uni-app-fe/component/uni-led/model.ts","../../../projects/uni-app-fe/component/uni-led/uni-led.ts","../../../projects/uni-app-fe/component/uni-led/uni-led.html","../../../projects/uni-app-fe/component/uni-side-menu/uni-side-menu.ts","../../../projects/uni-app-fe/component/uni-side-menu/uni-side-menu.html","../../../projects/uni-app-fe/component/uni-app-fe-component.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { faTriangleExclamation, IconDefinition } from '@fortawesome/free-solid-svg-icons';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\n\r\n@Component({\r\n selector: 'uni-banner-alert',\r\n imports: [CommonModule, FaIconComponent, UniTranslatePipe],\r\n templateUrl: './uni-banner-alert.html',\r\n styleUrls: ['./uni-banner-alert.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniBannerAlert {\r\n /* Icons */\r\n type = input.required<'warning' | 'error'>();\r\n lblTitle = input.required<string>();\r\n lblDescription = input.required<string>();\r\n icon = input<IconDefinition>();\r\n\r\n /* Icons */\r\n readonly ICON_WARNING = faTriangleExclamation;\r\n}\r\n","<div\r\n class=\"flex w-full flex-col gap-6 rounded-2xl border-2 p-4 text-center shadow-lg backdrop-blur-md\"\r\n [ngClass]=\"{\r\n 'bg-amber-500/25 border-amber-500 dark:text-amber-100 text-amber-500': type() === 'warning',\r\n 'bg-rose-500/25 border-rose-500 dark:text-rose-200 text-rose-500': type() === 'error'\r\n }\">\r\n <div class=\"flex flex-col items-center gap-4\">\r\n <h1 class=\"text-lg! font-semibold\">{{ lblTitle() | translate }}</h1>\r\n @if(icon(); as icon) {\r\n <fa-icon class=\"text-5xl\" [icon]=\"icon\"></fa-icon>\r\n }\r\n <p class=\"text-sm leading-relaxed text-white!\">{{ lblDescription() | translate }}</p>\r\n </div>\r\n</div>\r\n","import { Pipe, type PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'get_body_async',\n standalone: true,\n})\nexport class GetBodyAsyncPipe implements PipeTransform {\n /**\n * Mappa per la memorizzazione (cache) del testo già estratto.\n * Evita il consumo ripetuto dello stream associato alla stessa Request.\n */\n private cache = new Map<Request, string>();\n\n async transform(request: Request | null | undefined): Promise<string> {\n // Gestione del caso in cui la richiesta o il relativo corpo siano assenti\n if (!request || !request.body) {\n return '';\n }\n\n // Restituzione immediata del valore se il testo è già presente in cache\n if (this.cache.has(request)) {\n return this.cache.get(request)!;\n }\n\n // Controllo dello stato del body: se è già bloccato (locked), la lettura fallirebbe\n if (request.body.locked) {\n console.warn('Request stream is currently locked.');\n return '[Body Locked]';\n }\n\n try {\n // Clonazione della richiesta originale per isolare lo stream del body\n const clonedRequest: Request = request.clone();\n\n // Estrazione dello stream grezzo (ReadableStream) per ottenere il body della richiesta\n const bodyStream: ReadableStream<Uint8Array> | null = clonedRequest.body;\n\n // Creazione di una risposta fittizia per consumare lo stream in modo standard\n const temporaryResponse: Response = new Response(bodyStream);\n\n // Avvio della lettura asincrona del testo dallo stream consumato\n const extractedText: string = await temporaryResponse.text();\n\n // Archiviazione del testo nella cache per le consultazioni successive\n this.cache.set(request, extractedText);\n\n return extractedText;\n } catch (error) {\n console.error('Error during stream reading:', error);\n return 'Error reading request body';\n }\n }\n}\n\n","import { Pipe, type PipeTransform } from '@angular/core';\nimport { IconDefinition } from '@fortawesome/angular-fontawesome';\nimport { faComputer, faDesktop, faServer, faWifi } from '@fortawesome/free-solid-svg-icons';\nimport type { IUniFeError, IUniHttpError } from 'uni-model-type/type';\n\ninterface ErrorDataByType {\n title: string;\n message: string;\n icon: IconDefinition;\n httpStatus: string;\n functionName: string;\n}\n\n@Pipe({\n name: 'get_data',\n})\nexport class GetDataPipe implements PipeTransform {\n transform(error: { id: string } & (IUniFeError | IUniHttpError)): ErrorDataByType {\n switch (error.type) {\n case 'fe': {\n return {\n title: `${error.exception.functionName}()`,\n message: error.exception.message,\n icon: faDesktop,\n httpStatus: '-', // non presente\n functionName: `${error.exception.functionName}()`,\n };\n }\n case 'network': {\n return {\n title: error.id,\n message: error.exception.message,\n icon: faWifi,\n httpStatus: '-', // 0\n functionName: `${error.exception.functionName}()`,\n };\n }\n case 'server': {\n let displayMessage = error.exception.message;\n\n // Verifica se il message è un json\n if (\n displayMessage &&\n (displayMessage.codePointAt(0) === 123 || displayMessage.codePointAt(0) === 91)\n ) {\n try {\n displayMessage = JSON.stringify(JSON.parse(displayMessage), null, 2);\n } catch {\n // Fallback silenzioso: se il parsing fallisce viene tenuta la stringa originale\n }\n }\n\n return {\n title: error.id,\n message: displayMessage,\n icon: faComputer,\n httpStatus: (error.httpStatus > 0 ? error.httpStatus : '-').toString(),\n functionName: `${error.exception.functionName}()`,\n };\n }\n case 'be': {\n return {\n title: error.id,\n message: error.exception.message,\n icon: faServer,\n httpStatus: (error.httpStatus > 0 ? error.httpStatus : '-').toString(),\n functionName: error.exception.functionName,\n };\n }\n }\n }\n}\n\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input, linkedSignal, signal } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport {\r\n faCircleInfo,\r\n faClock,\r\n faCopy,\r\n faDesktop,\r\n faInbox,\r\n} from '@fortawesome/free-solid-svg-icons';\r\nimport { DxButtonModule } from 'devextreme-angular/ui/button';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\nimport { UniParsePipe, UniTranslatePipe, UniUrlPipe } from 'uni-app-fe/pipe';\r\nimport { UniErrorManager } from 'uni-manager/error';\r\nimport { UniHttpManager } from 'uni-manager/http';\r\nimport type { FeLog, IUniFeError, IUniHttpError } from 'uni-model-type/type';\r\n\r\nimport { GetBodyAsyncPipe } from './get-body-async.pipe';\r\nimport { GetDataPipe } from './get-data.pipe';\r\n\r\ntype UError = { id: string } & (IUniFeError | IUniHttpError);\r\ntype UErrorWithStatus = UError & { isOpen: boolean; isCopied: boolean; isSaved: boolean };\r\n\r\n@Component({\r\n selector: 'uni-dialog-error',\r\n imports: [\r\n CommonModule,\r\n DxButtonModule,\r\n DxTooltipModule,\r\n FaIconComponent,\r\n DatePipe,\r\n UniTranslatePipe,\r\n GetDataPipe,\r\n GetBodyAsyncPipe,\r\n UniParsePipe,\r\n UniUrlPipe,\r\n ],\r\n templateUrl: './uni-dialog-error.html',\r\n styleUrl: './uni-dialog-error.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniDialogError {\r\n /* Input */\r\n errors = input.required<UError[]>();\r\n errorsWithStatus = linkedSignal({\r\n source: this.errors,\r\n computation: (newErrors, prev: { value: UErrorWithStatus[] } | undefined) => {\r\n return newErrors.map((x) => {\r\n // Se l'errore esisteva già, restituisce l'oggetto vecchio\r\n const existing = prev?.value.find((old) => old.id === x.id);\r\n if (existing) {\r\n existing.isCopied = false;\r\n existing.isSaved = false;\r\n return existing;\r\n }\r\n\r\n // Se è un errore nuovo, crea l'oggetto con i flag di default\r\n const newItem = { ...x, isOpen: false, isCopied: false, isSaved: false };\r\n\r\n return newItem;\r\n });\r\n },\r\n });\r\n\r\n /* Variables */\r\n toast = signal<{ timeoutId: number; label: string } | null>(null);\r\n\r\n /* Icons */\r\n readonly ICON_FE = faDesktop;\r\n readonly ICON_TIMER = faClock;\r\n readonly ICON_COUNT = faInbox;\r\n readonly ICON_INFO = faCircleInfo;\r\n readonly ICON_COPY = faCopy;\r\n\r\n /* ------------------ Methods ------------------ */\r\n onCloseDialog(): void {\r\n UniErrorManager.removeAll();\r\n }\r\n\r\n onToggleIsOpen(id: string): void {\r\n this.errorsWithStatus.update((x) =>\r\n x.map((y) => {\r\n if (y.id === id) y.isOpen = !y.isOpen;\r\n return y;\r\n }),\r\n );\r\n }\r\n\r\n async onCopy(value: any): Promise<void> {\r\n await this.copy(value, 'ValueCopied');\r\n }\r\n\r\n async onCopyAll(id: string): Promise<void> {\r\n /* Recupero errore */\r\n const currentError = this.errorsWithStatus().find((e) => e.id === id);\r\n if (!currentError) return;\r\n\r\n /* Azione */\r\n await this.copy(JSON.stringify(currentError, null, 2), 'ErrorCopied');\r\n\r\n /* Aggiornamento datasource */\r\n this.errorsWithStatus.update((list) =>\r\n list.map((err) => ({ ...err, isCopied: err.id === id })),\r\n );\r\n }\r\n\r\n onSave(id: string): void {\r\n /* Recupero errore */\r\n const currentError = this.errorsWithStatus().find((e) => e.id === id);\r\n if (!currentError) return;\r\n\r\n /* Azione */\r\n const log: FeLog = {\r\n id: -1,\r\n severity: 'error',\r\n module: currentError.type,\r\n timestamp: currentError.timestamp,\r\n ref: currentError.id,\r\n exceptionType: currentError.exception.type,\r\n exceptionFunctionName: currentError.exception.functionName,\r\n exceptionMessage: currentError.exception.message,\r\n exceptionStackTrace: currentError.exception.stackTrace,\r\n exceptionStackTraceFrames: currentError.exception.stackTraceFrames,\r\n };\r\n\r\n /* Api */\r\n UniHttpManager.create$({ ref: 'Log', path: '/Log/AddFeLog', hasToast: false }, log).subscribe(\r\n () => {\r\n this.errorsWithStatus.update((list) =>\r\n list.map((err) => {\r\n if (err.id === id) err.isSaved = true;\r\n return err;\r\n }),\r\n );\r\n\r\n /* Toast */\r\n this.showToast('ErrorSaved');\r\n },\r\n );\r\n }\r\n\r\n onDelete(id: string): void {\r\n /* Azione */\r\n UniErrorManager.remove(id);\r\n\r\n /* Toast */\r\n this.showToast('ErrorRemoved');\r\n }\r\n\r\n /* ------------------ Methods: utils ------------------ */\r\n private showToast = (label: string) => {\r\n /* Reset vecchio timeout (se ancora in corso) */\r\n if (this.toast()?.timeoutId) {\r\n clearTimeout(this.toast()!.timeoutId);\r\n }\r\n\r\n /* Reset vecchio toast (se ancora in corso) */\r\n this.toast.set(null);\r\n\r\n /* Piccolo timeout cosi da evidenziare un nuovo toast (se presente ancora un toast in corso) */\r\n setTimeout(() => {\r\n /* Nascosto toast dopo x tempo */\r\n const timeoutId = setTimeout(() => this.toast.set(null), 2000);\r\n\r\n /* Mostrato toast */\r\n this.toast.set({ timeoutId, label });\r\n }, 100);\r\n };\r\n\r\n private copy = async (value: any, lblToast: string) => {\r\n let valueFormatted = '';\r\n try {\r\n // Se è una stringa si prova a convertirla in oggetto JSON\r\n if (typeof valueFormatted === 'string') {\r\n try {\r\n valueFormatted = JSON.parse(value);\r\n } catch {\r\n /* Non è un JSON, resta stringa */\r\n }\r\n }\r\n\r\n const formattedText =\r\n typeof valueFormatted === 'object' && valueFormatted !== null\r\n ? JSON.stringify(valueFormatted, null, 2)\r\n : String(valueFormatted)\r\n .replaceAll(String.raw`\\r\\n`, '\\n')\r\n .replaceAll(String.raw`\\n`, '\\n');\r\n\r\n await navigator.clipboard.writeText(formattedText);\r\n\r\n this.showToast(lblToast);\r\n } catch {\r\n this.showToast('OperationNotAvailable');\r\n }\r\n };\r\n}\r\n","<div\r\n class=\"relative flex h-full w-full flex-col gap-6 overflow-hidden rounded-4xl border border-rose-800/25 bg-linear-to-tr from-rose-500/10 via-rose-900/20 to-rose-500/5 p-6 text-left shadow-[0_50px_100px_-20px_rgba(0,0,0,0.7),inset_0_1px_0_rgba(255,255,255,0.15)] backdrop-blur-3xl\">\r\n <div\r\n class=\"pointer-events-none absolute -top-40 -left-40 size-96 animate-pulse rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n <div\r\n class=\"pointer-events-none absolute -right-40 -bottom-40 size-96 rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n\r\n <!-- Titolo -->\r\n <header class=\"flex items-center justify-between gap-4 border-b border-rose-400/25 pb-5\">\r\n <!-- Titolo: led -->\r\n <span class=\"relative flex size-3\">\r\n <span\r\n class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-rose-400 opacity-40\"></span>\r\n <span\r\n class=\"relative inline-flex size-3 rounded-full bg-linear-to-tr from-rose-500 to-rose-300 shadow-[0_0_20px_rgba(244,63,94,0.8)]\"></span>\r\n </span>\r\n\r\n <!-- Titolo: scritta -->\r\n <div class=\"flex flex-1 flex-col\">\r\n <h1 class=\"text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n </div>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"rounded-xl border border-white/7.5 bg-white/5 px-3 py-1.5 font-mono text-xs font-semibold tracking-wider text-neutral-200\">\r\n {{ 'Total' | translate }}: {{ errors().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'close'\"\r\n (onClick)=\"onCloseDialog()\"></dx-button>\r\n </header>\r\n\r\n <!-- Lista Errori -->\r\n <main\r\n class=\"scrollbar-none overflow-y-auto [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\">\r\n <ul class=\"flex flex-col gap-4 px-6 pt-2 pb-4\">\r\n @for (error of errorsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let errorData = error | get_data;\r\n <li\r\n class=\"group squircle flex w-full flex-col overflow-hidden rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': error.isOpen }\">\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Titolo -->\r\n <div class=\"flex items-center justify-between gap-4\">\r\n <!-- Titolo: reference -->\r\n <div class=\"flex min-w-0 items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': error.isOpen }\"\r\n [title]=\"(error.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(error.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ errorData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Titolo: type -->\r\n <div\r\n class=\"flex items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 font-mono text-xs font-medium text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(error.type === 'network' || error.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"errorData.icon\" [title]=\"error.type\" />\r\n <span class=\"text-2xs hidden tracking-wider uppercase sm:inline\">\r\n {{ error.type }}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Messaggio -->\r\n <div class=\"container-message flex flex-col gap-4\">\r\n <!-- Messaggio default -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }}\r\n <button (click)=\"onCopy(errorData.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">{{ errorData.message }}</p>\r\n </article>\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Message' | translate }} {{ 'Inner' | translate }}\r\n <button (click)=\"onCopy(error.innerException.message )\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p class=\"text-neutral-200! group-hover:text-white!\">\r\n {{ error.innerException.message }}\r\n </p>\r\n </article>\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(error.isOpen) {\r\n <div class=\"container-detail flex flex-col gap-6\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-3xl! font-semibold text-rose-300\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-8\">\r\n @if(error.type === 'be' || error.type === 'server') {\r\n <!-- Dettagli: request -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Request' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex gap-16\">\r\n <!-- Dettagli: request metodo http -->\r\n <article class=\"shrink-0 basis-24\">\r\n <h3 class=\"group/title\">\r\n {{ 'Method' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMethod' | translate\" />\r\n </h3>\r\n <p>{{ error.request.method }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request url -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n URL\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUrl' | translate\" />\r\n </h3>\r\n <p class=\"truncate\">{{ error.request.url }}</p>\r\n </article>\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Query params\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipQueryParams' | translate\" />\r\n </h3>\r\n @let queryParams = [...(error.request.url | url).searchParams];\r\n @if(queryParams.length) {\r\n <ul>\r\n @for (param of queryParams; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ param[0] }}: {{ param[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request headers -->\r\n <article>\r\n @let headers = [...error.request.headers.entries()];\r\n <h3 class=\"group/title\">\r\n Headers\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipHeaders' | translate\" />\r\n <button [disabled]=\"!headers.length\" (click)=\"onCopy(headers)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(headers.length) {\r\n <ul>\r\n @for (header of headers; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span>{{ header[0] }}: {{ header[1] }}</span>\r\n </li>\r\n }\r\n </ul>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request body -->\r\n <article>\r\n @let body = error.request | get_body_async | async;\r\n <h3 class=\"group/title\">\r\n Body\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipBody' | translate\" />\r\n <button [disabled]=\"!error.request.body\" (click)=\"onCopy(body)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n @if(error.request.body) {\r\n <pre>{{ body | parse | json }}</pre>\r\n }@else {\r\n <p>-</p>\r\n }\r\n </article>\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex gap-4\">\r\n <!-- Dettagli: request info mode -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Mode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.mode }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'Credentials' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCredentials' | translate\" />\r\n </h3>\r\n <p>{{ error.request.credentials }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: request info cache -->\r\n <article class=\"flex-1\">\r\n <h3 class=\"group/title\">\r\n {{ 'CacheMode' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipCacheMode' | translate\" />\r\n </h3>\r\n <p>{{ error.request.cache }}</p>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dettagli: info -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Diagnostic' | translate }}</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Duration' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipDuration' | translate\" />\r\n </h3>\r\n <p>{{ error.durationMs / 1000 }}s</p>\r\n </article>\r\n\r\n <!-- Dettagli: info user agent -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n User agent\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipUserAgent' | translate\" />\r\n </h3>\r\n <p>{{ error.userAgent }}s</p>\r\n </article>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Dettagli: eccezione -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2>{{ 'Exception' | translate }} ({{ error.type }})</h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.functionName\"\r\n (click)=\"onCopy(error.exception.functionName)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.functionName }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipType' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.type\"\r\n (click)=\"onCopy(error.exception.type)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.exception.type }}</p>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipStackTrace' | translate\" />\r\n <button\r\n [disabled]=\"!error.exception.stackTrace \"\r\n (click)=\"onCopy(error.exception.stackTrace)\">\r\n <fa-icon\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.exception.stackTrace }}</pre>\r\n </article>\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Frames\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFrames' | translate\" />\r\n </h3>\r\n <ul>\r\n @for (frame of error.exception.stackTraceFrames; track $index) {\r\n <li>\r\n <span> #{{ ($index + 1).toString().padStart(2, '0') }} </span>\r\n <span class=\"flex-1\"> {{ frame.file }} </span>\r\n <span> {{ 'Line' | translate }} {{ frame.line }} </span>\r\n </li>\r\n }\r\n </ul>\r\n </article>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(error.isOpen) { @if((error.type === 'be' || error.type === 'server') &&\r\n error.innerException) {\r\n <div class=\"container-inner flex flex-col gap-4\">\r\n <h1 class=\"border-t border-t-white/10 pt-4 text-2xl! font-semibold text-rose-300\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Function' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipFunction' | translate\" />\r\n <button\r\n [disabled]=\"!error.innerException.functionName\"\r\n (click)=\"onCopy(error.innerException.functionName)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.functionName }}</p>\r\n </article>\r\n\r\n <!-- Interno: tipo -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n {{ 'Type' | translate }}\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerType' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.type)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <p>{{ error.innerException.type }}</p>\r\n </article>\r\n\r\n <!-- Interno: stack trace -->\r\n <article>\r\n <h3 class=\"group/title\">\r\n Stack trace\r\n <fa-icon [icon]=\"ICON_INFO\" [title]=\"'lblTooltipInnerStackTrace' | translate\" />\r\n <button (click)=\"onCopy(error.innerException.stackTrace)\">\r\n <fa-icon [icon]=\"ICON_COPY\" [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </h3>\r\n <pre>{{ error.innerException.stackTrace }}</pre>\r\n </article>\r\n </div>\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 sm:flex-row sm:items-center\">\r\n <!-- Footer: metadata -->\r\n <div class=\"flex items-center gap-6 text-xs\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex min-w-22 items-center justify-center gap-2 rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1\">\r\n <span\r\n class=\"font-mono font-bold text-rose-400 transition-colors duration-300 group-hover:text-white\">\r\n HTTP\r\n </span>\r\n <span class=\"font-mono text-neutral-300\"> {{ errorData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-neutral-300\">\r\n {{ error.timestamp | date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ error.count }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"flex scale-95 items-center justify-end gap-2 opacity-0 transition duration-300 group-hover:scale-100 group-hover:opacity-100\">\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isCopied\"\r\n (click)=\"onCopyAll(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"error.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isSaved\"\r\n (click)=\"onSave(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"btn\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(error.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">✓</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n","import { NgOptimizedImage } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\r\nimport { DxButtonModule } from 'devextreme-angular/ui/button';\r\n\r\n@Component({\r\n selector: 'uni-header',\r\n standalone: true,\r\n imports: [DxButtonModule, NgOptimizedImage],\r\n templateUrl: './uni-header.html',\r\n styleUrls: ['./uni-header.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniHeader {\r\n /* Input */\r\n title = input.required<string>();\r\n version = input.required<string>();\r\n pathBrandLogo = input.required<string>();\r\n pathAppLogo = input<string>();\r\n sideMenu = input<boolean>(false);\r\n\r\n /* Output */\r\n evtToggleMenu = output<true>();\r\n}\r\n","<div\r\n class=\"dark:bg-theme-dark-800 flex h-16 items-center gap-4 overflow-hidden rounded-xl bg-blue-300 px-4 py-3 text-white\">\r\n <!-- App logo -->\r\n @if (pathAppLogo(); as pathAppLogo) {\r\n <img\r\n [ngSrc]=\"pathAppLogo\"\r\n width=\"40\"\r\n height=\"40\"\r\n priority\r\n class=\"aspect-square h-full w-auto\"\r\n alt=\"App logo\" />\r\n }\r\n\r\n <!-- Info -->\r\n <div class=\"flex flex-1 flex-col overflow-hidden\">\r\n <p class=\"truncate text-xl font-semibold uppercase leading-tight\">{{ title() }}</p>\r\n <p class=\"text-xs opacity-75\">{{ version() }}</p>\r\n </div>\r\n\r\n <div class=\"flex h-full items-center gap-2\">\r\n <!-- Brand Logo -->\r\n <div class=\"2xs:block relative hidden h-full w-24\">\r\n <img\r\n [ngSrc]=\"pathBrandLogo()\"\r\n fill\r\n priority\r\n class=\"object-contain object-right\"\r\n alt=\"Brand logo\" />\r\n </div>\r\n\r\n <!-- Button menu -->\r\n @if (sideMenu()) {\r\n <dx-button class=\"shadow-none!\" [icon]=\"'menu'\" (onClick)=\"evtToggleMenu.emit(true)\">\r\n </dx-button>\r\n }\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\n\r\n@Component({\r\n selector: 'uni-item-field-with-hight-contrast',\r\n imports: [DxTooltipModule, UniTranslatePipe],\r\n templateUrl: './uni-item-field-with-hight-contrast.html',\r\n styleUrl: './uni-item-field-with-hight-contrast.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniItemFieldWithHightContrast {\r\n /* Input */\r\n label = input.required<string>();\r\n value = input.required<string | number | null | undefined>();\r\n}\r\n","<div class=\"flex flex-col items-start\">\r\n <span class=\"max-w-full min-w-0 truncate text-lg text-nowrap text-gray-500 dark:text-gray-300\">\r\n {{ label() | translate }}\r\n </span>\r\n <span #tooltipTarget class=\"max-w-full min-w-0 cursor-help truncate text-3xl font-semibold\">\r\n {{ value() || '-' }}\r\n </span>\r\n</div>\r\n\r\n<dx-tooltip\r\n [target]=\"tooltipTarget\"\r\n showEvent=\"mouseenter\"\r\n hideEvent=\"mouseleave\"\r\n [hideOnOutsideClick]=\"false\">\r\n <div *dxTemplate=\"let data = data; of: 'content'\">{{ value() || '-' }}</div>\r\n</dx-tooltip>\r\n","import { CommonModule, DatePipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\nimport { UniToastManager } from 'uni-manager/toast';\r\n\r\n@Component({\r\n selector: 'uni-item-field',\r\n imports: [CommonModule, DxTooltipModule, UniTranslatePipe],\r\n providers: [DatePipe],\r\n templateUrl: './uni-item-field.html',\r\n styleUrl: './uni-item-field.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniItemField {\r\n /* Pipe */\r\n readonly datePipe = inject(DatePipe);\r\n\r\n /* Input */\r\n label = input.required<string>();\r\n value = input.required<string | number | Date | null | undefined>();\r\n udm = input<string>();\r\n dateFormat = input<'short' | 'medium' | 'shortDate' | 'mediumDate' | 'longDate' | 'fullDate'>(\r\n 'longDate',\r\n );\r\n\r\n /* Variable */\r\n valueFormatted = computed(() => {\r\n const value = this.value();\r\n if (!value) return '';\r\n\r\n if (\r\n (value instanceof Date && !Number.isNaN(value.getTime())) ||\r\n (typeof value === 'string' && this.isValidDateString(value))\r\n ) {\r\n return this.datePipe.transform(new Date(value), this.dateFormat());\r\n }\r\n return `${value}${this.udm() ?? ''}`;\r\n });\r\n\r\n /* ---------------- Methods: event ---------------- */\r\n async onCopyValue(): Promise<void> {\r\n const value = this.valueFormatted();\r\n if (!value) return;\r\n\r\n // Controllo se l'API è disponibile e il contesto è sicuro (HTTPS/Localhost)\r\n if (navigator.clipboard && globalThis.isSecureContext) {\r\n await navigator.clipboard.writeText(value);\r\n UniToastManager.show({ label: 'ValueCopied' });\r\n }\r\n }\r\n\r\n /* ---------------- Methods: utils ---------------- */\r\n private isValidDateString(value: unknown): value is string {\r\n if (typeof value !== 'string') return false;\r\n\r\n // ISO 8601 (con o senza timezone)\r\n const isoRegex =\r\n /^\\d{4}-\\d{2}-\\d{2}(?:[T ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})?)?$/;\r\n\r\n if (!isoRegex.test(value)) return false;\r\n\r\n const date = new Date(value);\r\n return !Number.isNaN(date.getTime());\r\n }\r\n}\r\n","<li class=\"flex items-center gap-2 text-sm!\">\r\n <span class=\"text-nowrap text-gray-500 dark:text-gray-300\"> {{ label() | translate }}: </span>\r\n <span\r\n #tooltipTarget\r\n [ngClass]=\"{'text-gray-500/50 dark:text-gray-300/50': !valueFormatted() }\"\r\n class=\"max-w-full min-w-0 cursor-help truncate font-semibold transition duration-100 ease-in-out hover:opacity-75 active:scale-95\"\r\n (click)=\"onCopyValue()\">\r\n {{ valueFormatted() || '-' }}\r\n </span>\r\n</li>\r\n\r\n<dx-tooltip\r\n [target]=\"tooltipTarget\"\r\n showEvent=\"mouseenter\"\r\n hideEvent=\"mouseleave\"\r\n [hideOnOutsideClick]=\"false\">\r\n <div *dxTemplate=\"let data = data; of: 'content'\">{{ valueFormatted() || '-' }}</div>\r\n</dx-tooltip>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { faCircleInfo } from '@fortawesome/free-solid-svg-icons';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\n\r\nimport { UniItemField } from '../uni-item-field/uni-item-field';\r\n\r\n@Component({\r\n selector: 'uni-item-field-with-lens-tooltip',\r\n imports: [DxTooltipModule, FaIconComponent, UniItemField],\r\n templateUrl: './uni-item-field-with-lens-tooltip.html',\r\n styleUrl: './uni-item-field-with-lens-tooltip.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniItemFieldWithLensTooltip {\r\n /* Input */\r\n id = input.required<string>();\r\n label = input.required<string>();\r\n value = input.required<string | number | Date | null | undefined>();\r\n\r\n /* Icon */\r\n readonly ICON_INFO = faCircleInfo;\r\n}\r\n","<div class=\"flex items-center gap-1\">\r\n <uni-item-field [label]=\"label()\" [value]=\"value()\" />\r\n\r\n <div #tooltipInfoTarget>\r\n <fa-icon\r\n class=\"text-theme-200 cursor-help rounded px-1 text-xs! transition duration-150 ease-in-out hover:opacity-75\"\r\n [icon]=\"ICON_INFO\">\r\n </fa-icon>\r\n </div>\r\n\r\n <dx-tooltip\r\n [target]=\"tooltipInfoTarget\"\r\n showEvent=\"mouseenter\"\r\n hideEvent=\"mouseleave\"\r\n [hideOnOutsideClick]=\"false\">\r\n <div *dxTemplate=\"let data = data; of: 'content'\">\r\n <ng-content></ng-content>\r\n </div>\r\n </dx-tooltip>\r\n</div>\r\n","export enum LedStatus {\r\n OK,\r\n WARNING,\r\n ERROR,\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\n\r\nimport { LedStatus } from './model';\r\n\r\n@Component({\r\n selector: 'uni-led',\r\n imports: [CommonModule],\r\n templateUrl: './uni-led.html',\r\n styleUrls: ['./uni-led.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniLed {\r\n /* Inputs */\r\n public description = input.required<string>();\r\n public status = input.required<LedStatus | boolean | null | undefined>();\r\n\r\n /* Enum */\r\n protected readonly LED_STATUS = LedStatus;\r\n}\r\n","<div class=\"flex items-center gap-1\">\r\n <div\r\n class=\"led\"\r\n [ngClass]=\"{\r\n ok: status() === true || status() === LED_STATUS.OK,\r\n warning: status() === LED_STATUS.WARNING,\r\n error: status() === false || status() === LED_STATUS.ERROR,\r\n }\"></div>\r\n <p class=\"truncate text-sm\">{{ description() }}</p>\r\n <ng-content></ng-content>\r\n</div>\r\n","import { CommonModule, NgOptimizedImage } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { RouterLink, RouterLinkActive } from '@angular/router';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport {\r\n faArrowRightFromBracket,\r\n faArrowRightToBracket,\r\n faBell,\r\n faLanguage,\r\n faMoon,\r\n faSun,\r\n faUser,\r\n} from '@fortawesome/free-solid-svg-icons';\r\nimport { DxButtonModule } from 'devextreme-angular/ui/button';\r\nimport { DxSelectBoxModule } from 'devextreme-angular/ui/select-box';\r\nimport { DxSwitchModule } from 'devextreme-angular/ui/switch';\r\nimport { ValueChangedEvent as SelectBoxValueChangedEvent } from 'devextreme/ui/select_box_types';\r\nimport { ValueChangedEvent as SwitchValueChangedEvent } from 'devextreme/ui/switch_types';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\nimport { UniLoaderService } from 'uni-app-fe/service';\r\nimport { UniLocaleManager } from 'uni-manager/locale';\r\n\r\nimport { MenuInteraction, MenuItem } from './model';\r\n\r\n@Component({\r\n selector: 'uni-side-menu',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n RouterLink,\r\n RouterLinkActive,\r\n DxButtonModule,\r\n DxSelectBoxModule,\r\n DxSwitchModule,\r\n UniTranslatePipe,\r\n FaIconComponent,\r\n NgOptimizedImage,\r\n ],\r\n templateUrl: './uni-side-menu.html',\r\n styleUrls: ['./uni-side-menu.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniSideMenu {\r\n /* Service */\r\n readonly elementRef = inject(ElementRef);\r\n readonly uniLoader = inject(UniLoaderService);\r\n\r\n /* Input */\r\n readonly pathUnitecLogo = input.required<string>();\r\n readonly menuItems = input<MenuItem[]>([]);\r\n readonly menuInteractions = input<MenuInteraction[]>([]);\r\n\r\n /* Output */\r\n evtToggleMenu = output<false>();\r\n\r\n /* Variables */\r\n locale = UniLocaleManager.locale;\r\n localesSupported = UniLocaleManager.localesSupported;\r\n darkMode = signal<boolean>(\r\n !localStorage.getItem('uni-theme') || localStorage.getItem('uni-theme') === 'dark',\r\n );\r\n\r\n /* Icons */\r\n readonly ICON = {\r\n USER: faUser,\r\n LOGIN: faArrowRightToBracket,\r\n LOGOUT: faArrowRightFromBracket,\r\n LIGHT_MODE: faSun,\r\n DARK_MODE: faMoon,\r\n LANGUAGE: faLanguage,\r\n NOTIFICATION: faBell,\r\n };\r\n\r\n /* ---------------------- Host listener ---------------------- */\r\n @HostListener('document:click', ['$event'])\r\n protected onClickOutside(event: Event): void {\r\n const target = event.target as HTMLElement;\r\n\r\n // Controlla se il click è avvenuto dentro il menu principale\r\n const clickedInsideMenu = this.elementRef.nativeElement.contains(target);\r\n\r\n // Controlla se il click è avvenuto dentro un popup/dropdown aperto\r\n const clickedInsideOverlay = !!target.closest(\r\n '.dx-overlay-wrapper, .dx-dropdowneditor-overlay',\r\n );\r\n\r\n // Se il click è fuori da entrambi, allora chiude il menu\r\n if (!clickedInsideMenu && !clickedInsideOverlay) {\r\n this.evtToggleMenu.emit(false);\r\n }\r\n }\r\n\r\n /* ---------------------- Methods ---------------------- */\r\n updateTheme(e: SwitchValueChangedEvent): void {\r\n this.uniLoader.show();\r\n localStorage.setItem('uni-theme', e.value ? 'dark' : 'light');\r\n globalThis.location.reload();\r\n }\r\n\r\n updateLocale(e: SelectBoxValueChangedEvent): void {\r\n this.uniLoader.show();\r\n localStorage.setItem('uni-locale', e.value);\r\n globalThis.location.reload();\r\n }\r\n}\r\n","<aside\r\n class=\"dark:bg-theme-dark-800 dark:border-theme-dark-900 flex h-screen w-[80vw] max-w-75 flex-col gap-6 overflow-hidden rounded-l border-b-2 border-l-2 border-blue-400/33 bg-blue-300 p-4 shadow-2xl\">\r\n <!-- Header: User/Close -->\r\n <div class=\"flex h-8 w-full shrink-0 items-center\">\r\n <dx-button class=\"ml-auto rounded-full!\" [icon]=\"'close'\" (onClick)=\"evtToggleMenu.emit(false)\">\r\n </dx-button>\r\n </div>\r\n\r\n <div class=\"custom-scrollbar flex flex-1 flex-col overflow-x-hidden overflow-y-auto pr-1\">\r\n <!-- Sezione Menu Principale -->\r\n @if (menuItems().length) {\r\n <ul class=\"flex flex-col gap-1.5\">\r\n @for (item of menuItems(); track item.id) { @if (item.visible !== false) {\r\n <li>\r\n <a\r\n class=\"group flex h-12 items-center gap-3 rounded-lg px-3 text-white! transition-colors dark:text-gray-300!\"\r\n [ngClass]=\"{\r\n 'dark:hover:bg-theme-dark-700 hover:bg-blue-400': !item.badge && !item.disabled,\r\n 'hover:bg-red-500/50': item.badge && !item.disabled,\r\n 'pointer-events-none opacity-30 grayscale': item.disabled,\r\n }\"\r\n [routerLink]=\"item.disabled ? null : item.path\"\r\n [routerLinkActive]=\"item.badge ?\r\n 'bg-red-500/60 *:text-white! *:font-semibold!' :\r\n 'bg-blue-400/75 dark:bg-theme-dark-700 *:text-white! *:font-semibold!'\r\n \"\r\n (click)=\"evtToggleMenu.emit(false)\">\r\n <fa-icon [icon]=\"item.icon\" class=\"w-6 text-center text-lg\"></fa-icon>\r\n <span class=\"flex-1 truncate font-medium\">{{ item.label }}</span>\r\n @if (item.badge) {\r\n <div\r\n class=\"flex size-6 animate-pulse items-center justify-center rounded bg-red-500 shadow-lg\">\r\n <fa-icon class=\"text-xs\" [icon]=\"ICON.NOTIFICATION\"></fa-icon>\r\n </div>\r\n }\r\n </a>\r\n </li>\r\n } }\r\n </ul>\r\n }\r\n\r\n <!-- Sezione Interazioni Dinamiche -->\r\n @if (menuInteractions().length) {\r\n <hr class=\"dark:border-theme-dark-900 my-6 border-blue-400/30\" />\r\n <ul class=\"flex flex-col gap-2 text-white\">\r\n @for (item of menuInteractions(); track item.id) { @if (item.data.type === 'button') {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"flex h-12 w-full items-center gap-3 rounded-lg px-3 transition-all active:scale-95\"\r\n [class]=\"item.class\"\r\n (click)=\"item.data.onClick()\">\r\n <fa-icon class=\"w-6\" [icon]=\"item.data.icon\"></fa-icon>\r\n <span class=\"flex-1 truncate text-left font-medium\">{{ item.label }}</span>\r\n </button>\r\n </li>\r\n } @else if (item.data.type === 'select') {\r\n <li\r\n class=\"dark:bg-theme-dark-700 flex flex-col gap-1 rounded-lg bg-blue-400/75 p-3 shadow-sm\">\r\n <span class=\"text-xs font-bold uppercase opacity-60\">{{ item.label }}</span>\r\n <dx-select-box\r\n class=\"w-full\"\r\n valueExpr=\"id\"\r\n displayExpr=\"description\"\r\n [items]=\"item.data.combos\"\r\n [value]=\"item.data.value\"\r\n stylingMode=\"underlined\"\r\n (onValueChanged)=\"item.data.onValueChanged($event)\">\r\n </dx-select-box>\r\n </li>\r\n } }\r\n </ul>\r\n }\r\n\r\n <!-- Settings Statici -->\r\n <hr class=\"dark:border-theme-dark-900 my-6 border-blue-400/30\" />\r\n <div class=\"flex flex-col gap-3\">\r\n <div\r\n class=\"dark:bg-theme-dark-700 flex h-14 items-center justify-between rounded-lg bg-blue-400/75 px-4 text-white shadow-sm\">\r\n <div class=\"flex items-center gap-3\">\r\n <fa-icon [icon]=\"darkMode() ? ICON.DARK_MODE : ICON.LIGHT_MODE\"></fa-icon>\r\n <span class=\"truncate\">{{ 'DarkMode' | translate }}</span>\r\n </div>\r\n <dx-switch [value]=\"darkMode()\" (onValueChanged)=\"updateTheme($event)\"></dx-switch>\r\n </div>\r\n\r\n <div\r\n class=\"dark:bg-theme-dark-700 flex h-14 items-center justify-between rounded-lg bg-blue-400/75 px-4 text-white shadow-sm\">\r\n <div class=\"flex items-center gap-3\">\r\n <fa-icon [icon]=\"ICON.LANGUAGE\"></fa-icon>\r\n <span class=\"truncate\">{{ 'Language' | translate }}</span>\r\n </div>\r\n <dx-select-box\r\n class=\"w-24\"\r\n [items]=\"localesSupported\"\r\n [value]=\"locale\"\r\n stylingMode=\"underlined\"\r\n (onValueChanged)=\"updateLocale($event)\">\r\n </dx-select-box>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Logo -->\r\n <div class=\"mt-auto border-t border-white/20 pt-4\">\r\n <img\r\n class=\"ml-auto opacity-90 transition-opacity hover:opacity-100\"\r\n [ngSrc]=\"pathUnitecLogo()\"\r\n priority\r\n alt=\"Brand logo\"\r\n height=\"32\"\r\n width=\"88\" />\r\n </div>\r\n</aside>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i1"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uni-app-fe",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=21.2.0",
6
6
  "@angular/core": ">=21.2.0",