uni-app-fe 0.1.14 → 0.1.16
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.
|
@@ -11,6 +11,7 @@ import * as i1$1 from 'devextreme-angular/ui/tooltip';
|
|
|
11
11
|
import { DxTooltipModule } from 'devextreme-angular/ui/tooltip';
|
|
12
12
|
import { UniErrorManager } from 'uni-manager/error';
|
|
13
13
|
import { UniHttpManager } from 'uni-manager/http';
|
|
14
|
+
import { UniLocaleManager } from 'uni-manager/locale';
|
|
14
15
|
import * as i2$1 from 'devextreme-angular/core';
|
|
15
16
|
import { UniToastManager } from 'uni-manager/toast';
|
|
16
17
|
import { RouterLink, RouterLinkActive } from '@angular/router';
|
|
@@ -19,25 +20,25 @@ import { DxSelectBoxModule } from 'devextreme-angular/ui/select-box';
|
|
|
19
20
|
import * as i4 from 'devextreme-angular/ui/switch';
|
|
20
21
|
import { DxSwitchModule } from 'devextreme-angular/ui/switch';
|
|
21
22
|
import { UniLoaderService } from 'uni-app-fe/service';
|
|
22
|
-
import { UniLocaleManager } from 'uni-manager/locale';
|
|
23
23
|
|
|
24
24
|
class UniBannerAlert {
|
|
25
25
|
constructor() {
|
|
26
26
|
/* Icons */
|
|
27
27
|
this.type = input.required(...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
|
|
28
|
-
this.
|
|
29
|
-
this.
|
|
28
|
+
this.keyTitle = input.required(...(ngDevMode ? [{ debugName: "keyTitle" }] : /* istanbul ignore next */ []));
|
|
29
|
+
this.keyDescription = input.required(...(ngDevMode ? [{ debugName: "keyDescription" }] : /* istanbul ignore next */ []));
|
|
30
|
+
this.paramsDescription = input(...(ngDevMode ? [undefined, { debugName: "paramsDescription" }] : /* istanbul ignore next */ []));
|
|
30
31
|
this.icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : /* istanbul ignore next */ []));
|
|
31
32
|
/* Icons */
|
|
32
33
|
this.ICON_WARNING = faTriangleExclamation;
|
|
33
34
|
}
|
|
34
35
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniBannerAlert, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
35
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniBannerAlert, isStandalone: true, selector: "uni-banner-alert", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: true, transformFunction: null },
|
|
36
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniBannerAlert, isStandalone: true, selector: "uni-banner-alert", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: true, transformFunction: null }, keyTitle: { classPropertyName: "keyTitle", publicName: "keyTitle", isSignal: true, isRequired: true, transformFunction: null }, keyDescription: { classPropertyName: "keyDescription", publicName: "keyDescription", isSignal: true, isRequired: true, transformFunction: null }, paramsDescription: { classPropertyName: "paramsDescription", publicName: "paramsDescription", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<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 overflow-hidden\">\r\n <h1 class=\"max-w-full truncate text-lg! font-bold tracking-wider\">\r\n {{ keyTitle() | translate }}\r\n </h1>\r\n @if(icon(); as icon) {\r\n <fa-icon class=\"text-5xl\" [icon]=\"icon\"></fa-icon>\r\n }\r\n <p\r\n class=\"max-w-full text-sm leading-relaxed tracking-wide wrap-break-word text-white! antialiased\">\r\n {{ keyDescription() | translate: { prefix: type(), params: paramsDescription() } }}\r\n </p>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: UniTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
36
37
|
}
|
|
37
38
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniBannerAlert, decorators: [{
|
|
38
39
|
type: Component,
|
|
39
|
-
args: [{ selector: 'uni-banner-alert', imports: [CommonModule, FaIconComponent, UniTranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "<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-
|
|
40
|
-
}], propDecorators: { type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: true }] }],
|
|
40
|
+
args: [{ selector: 'uni-banner-alert', imports: [CommonModule, FaIconComponent, UniTranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "<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 overflow-hidden\">\r\n <h1 class=\"max-w-full truncate text-lg! font-bold tracking-wider\">\r\n {{ keyTitle() | translate }}\r\n </h1>\r\n @if(icon(); as icon) {\r\n <fa-icon class=\"text-5xl\" [icon]=\"icon\"></fa-icon>\r\n }\r\n <p\r\n class=\"max-w-full text-sm leading-relaxed tracking-wide wrap-break-word text-white! antialiased\">\r\n {{ keyDescription() | translate: { prefix: type(), params: paramsDescription() } }}\r\n </p>\r\n </div>\r\n</div>\r\n", styles: [":host{display:block}\n"] }]
|
|
41
|
+
}], propDecorators: { type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: true }] }], keyTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "keyTitle", required: true }] }], keyDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "keyDescription", required: true }] }], paramsDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "paramsDescription", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }] } });
|
|
41
42
|
|
|
42
43
|
class GetBodyAsyncPipe {
|
|
43
44
|
constructor() {
|
|
@@ -153,6 +154,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
|
|
|
153
154
|
}]
|
|
154
155
|
}] });
|
|
155
156
|
|
|
157
|
+
class GetTimestampFormattedPipe {
|
|
158
|
+
transform(value) {
|
|
159
|
+
return value.map((x) => ({
|
|
160
|
+
message: x.message,
|
|
161
|
+
date: UniLocaleManager.toDate(new Date(x.timestamp)),
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: GetTimestampFormattedPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
165
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.12", ngImport: i0, type: GetTimestampFormattedPipe, isStandalone: true, name: "get_timestamp_formatted" }); }
|
|
166
|
+
}
|
|
167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: GetTimestampFormattedPipe, decorators: [{
|
|
168
|
+
type: Pipe,
|
|
169
|
+
args: [{
|
|
170
|
+
name: 'get_timestamp_formatted',
|
|
171
|
+
}]
|
|
172
|
+
}] });
|
|
173
|
+
|
|
156
174
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
157
175
|
class UniDialogErrorArticle {
|
|
158
176
|
constructor() {
|
|
@@ -168,11 +186,11 @@ class UniDialogErrorArticle {
|
|
|
168
186
|
this.ICON_COPY = faCopy;
|
|
169
187
|
}
|
|
170
188
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniDialogErrorArticle, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
171
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniDialogErrorArticle, isStandalone: true, selector: "uni-dialog-error-article", inputs: { lblTitle: { classPropertyName: "lblTitle", publicName: "lblTitle", isSignal: true, isRequired: true, transformFunction: null }, property: { classPropertyName: "property", publicName: "property", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onCopyEvt: "onCopyEvt" }, ngImport: i0, template: "@if(property(); as p) {\n<article\n class=\"flex flex-col gap-1 border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400\">\n <!-- Titolo -->\n <h3\n class=\"group/title text-2xs! mr-auto flex items-center gap-1 font-bold tracking-wide text-rose-400/50 uppercase transition-colors duration-300 group-hover:text-rose-400\">\n {{ lblTitle() | translate }}\n <div class=\"invisible flex items-center gap-1 text-[9px] group-hover/title:visible\">\n <fa-icon\n class=\"cursor-help hover:text-rose-300\"\n [icon]=\"ICON_INFO\"\n [title]=\"`Tooltip${lblTitle()}` | translate\" />\n <button\n class=\"transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-120 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25\"\n (click)=\"onCopyEvt.emit(p.value)\">\n <fa-icon\n class=\"hover:text-rose-300\"\n [icon]=\"ICON_COPY\"\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\n </button>\n </div>\n </h3>\n\n <div
|
|
189
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniDialogErrorArticle, isStandalone: true, selector: "uni-dialog-error-article", inputs: { lblTitle: { classPropertyName: "lblTitle", publicName: "lblTitle", isSignal: true, isRequired: true, transformFunction: null }, property: { classPropertyName: "property", publicName: "property", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onCopyEvt: "onCopyEvt" }, ngImport: i0, template: "@if(property(); as p) {\r\n<article\r\n class=\"flex h-full flex-col gap-1 border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400\">\r\n <!-- Titolo -->\r\n <h3\r\n class=\"group/title text-2xs! mr-auto flex max-w-full items-center gap-1 font-bold tracking-wide text-rose-400/50 uppercase transition-colors duration-300 group-hover:text-rose-400\">\r\n <span class=\"truncate\">{{ lblTitle() | translate }}</span>\r\n <div class=\"invisible flex items-center gap-1 text-[9px] group-hover/title:visible\">\r\n <fa-icon\r\n class=\"cursor-help hover:text-rose-300\"\r\n [icon]=\"ICON_INFO\"\r\n [title]=\"`Tooltip${lblTitle()}` | translate\" />\r\n <button\r\n class=\"transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-120 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25\"\r\n (click)=\"onCopyEvt.emit(p.value)\">\r\n <fa-icon\r\n class=\"hover:text-rose-300\"\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </div>\r\n </h3>\r\n\r\n <div\r\n class=\"my-auto text-sm text-rose-200 transition-colors duration-300 group-hover:text-rose-100\">\r\n <!-- string / pre -->\r\n @if(p.type === 'string' || p.type === 'pre') {\r\n <!-- #2 -->\r\n @if(p.value; as value) {\r\n <!-- #2.1 - 3 -->\r\n @switch (p.type) {\r\n <!-- #3.1 -->\r\n @case ('string') {\r\n <p class=\"overflow-hidden text-ellipsis whitespace-pre-wrap\">{{ value }}</p>\r\n }\r\n <!-- #3.2 -->\r\n @case ('pre') {\r\n <pre class=\"overflow-x-auto\">{{ value }}</pre>\r\n } } }\r\n <!-- #2.2 -->\r\n @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n\r\n <!-- json -->\r\n @if(p.type === 'json') {\r\n <!-- #2 -->\r\n @if((p.value | json) !== '{}') {\r\n <pre class=\"overflow-x-auto font-sans\">{{ p.value | json }}</pre>\r\n } @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n\r\n <!-- array -->\r\n @if(p.type === 'array') {\r\n <!-- #2 -->\r\n @if(p.value.length > 0) {\r\n <ul class=\"@container/list flex flex-col gap-2\">\r\n @for (item of p.value; track $index) {\r\n <li\r\n class=\"flex max-w-full flex-col gap-x-4 gap-y-0.5 border-b border-dashed border-white/5 p-1 hover:bg-white/0.5 @lg/list:flex-row @lg/list:items-center\">\r\n <p class=\"flex min-w-0 flex-1 items-center gap-4\">\r\n <span class=\"font-mono text-xs font-bold text-rose-100\">\r\n #{{ ($index + 1).toString().padStart(2, '0') }}\r\n </span>\r\n <span class=\"cursor-help truncate\" [title]=\"item[0]\"> {{ item[0] }} </span>\r\n </p>\r\n <span\r\n class=\"shrink-0 truncate rounded bg-white/5 px-4 py-px text-center font-mono text-nowrap text-rose-300 transition-colors duration-300 group-hover:text-rose-400 @lg/list:ml-auto @lg/list:basis-48\">\r\n {{ item[1] }}\r\n </span>\r\n </li>\r\n }\r\n </ul>\r\n } @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n </div>\r\n</article>\r\n}\r\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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.JsonPipe, name: "json" }, { kind: "pipe", type: UniTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
172
190
|
}
|
|
173
191
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniDialogErrorArticle, decorators: [{
|
|
174
192
|
type: Component,
|
|
175
|
-
args: [{ selector: 'uni-dialog-error-article', imports: [CommonModule, FaIconComponent, UniTranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if(property(); as p) {\n<article\n class=\"flex flex-col gap-1 border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400\">\n <!-- Titolo -->\n <h3\n class=\"group/title text-2xs! mr-auto flex items-center gap-1 font-bold tracking-wide text-rose-400/50 uppercase transition-colors duration-300 group-hover:text-rose-400\">\n {{ lblTitle() | translate }}\n <div class=\"invisible flex items-center gap-1 text-[9px] group-hover/title:visible\">\n <fa-icon\n class=\"cursor-help hover:text-rose-300\"\n [icon]=\"ICON_INFO\"\n [title]=\"`Tooltip${lblTitle()}` | translate\" />\n <button\n class=\"transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-120 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25\"\n (click)=\"onCopyEvt.emit(p.value)\">\n <fa-icon\n class=\"hover:text-rose-300\"\n [icon]=\"ICON_COPY\"\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\n </button>\n </div>\n </h3>\n\n <div
|
|
193
|
+
args: [{ selector: 'uni-dialog-error-article', imports: [CommonModule, FaIconComponent, UniTranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if(property(); as p) {\r\n<article\r\n class=\"flex h-full flex-col gap-1 border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400\">\r\n <!-- Titolo -->\r\n <h3\r\n class=\"group/title text-2xs! mr-auto flex max-w-full items-center gap-1 font-bold tracking-wide text-rose-400/50 uppercase transition-colors duration-300 group-hover:text-rose-400\">\r\n <span class=\"truncate\">{{ lblTitle() | translate }}</span>\r\n <div class=\"invisible flex items-center gap-1 text-[9px] group-hover/title:visible\">\r\n <fa-icon\r\n class=\"cursor-help hover:text-rose-300\"\r\n [icon]=\"ICON_INFO\"\r\n [title]=\"`Tooltip${lblTitle()}` | translate\" />\r\n <button\r\n class=\"transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-120 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25\"\r\n (click)=\"onCopyEvt.emit(p.value)\">\r\n <fa-icon\r\n class=\"hover:text-rose-300\"\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </div>\r\n </h3>\r\n\r\n <div\r\n class=\"my-auto text-sm text-rose-200 transition-colors duration-300 group-hover:text-rose-100\">\r\n <!-- string / pre -->\r\n @if(p.type === 'string' || p.type === 'pre') {\r\n <!-- #2 -->\r\n @if(p.value; as value) {\r\n <!-- #2.1 - 3 -->\r\n @switch (p.type) {\r\n <!-- #3.1 -->\r\n @case ('string') {\r\n <p class=\"overflow-hidden text-ellipsis whitespace-pre-wrap\">{{ value }}</p>\r\n }\r\n <!-- #3.2 -->\r\n @case ('pre') {\r\n <pre class=\"overflow-x-auto\">{{ value }}</pre>\r\n } } }\r\n <!-- #2.2 -->\r\n @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n\r\n <!-- json -->\r\n @if(p.type === 'json') {\r\n <!-- #2 -->\r\n @if((p.value | json) !== '{}') {\r\n <pre class=\"overflow-x-auto font-sans\">{{ p.value | json }}</pre>\r\n } @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n\r\n <!-- array -->\r\n @if(p.type === 'array') {\r\n <!-- #2 -->\r\n @if(p.value.length > 0) {\r\n <ul class=\"@container/list flex flex-col gap-2\">\r\n @for (item of p.value; track $index) {\r\n <li\r\n class=\"flex max-w-full flex-col gap-x-4 gap-y-0.5 border-b border-dashed border-white/5 p-1 hover:bg-white/0.5 @lg/list:flex-row @lg/list:items-center\">\r\n <p class=\"flex min-w-0 flex-1 items-center gap-4\">\r\n <span class=\"font-mono text-xs font-bold text-rose-100\">\r\n #{{ ($index + 1).toString().padStart(2, '0') }}\r\n </span>\r\n <span class=\"cursor-help truncate\" [title]=\"item[0]\"> {{ item[0] }} </span>\r\n </p>\r\n <span\r\n class=\"shrink-0 truncate rounded bg-white/5 px-4 py-px text-center font-mono text-nowrap text-rose-300 transition-colors duration-300 group-hover:text-rose-400 @lg/list:ml-auto @lg/list:basis-48\">\r\n {{ item[1] }}\r\n </span>\r\n </li>\r\n }\r\n </ul>\r\n } @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n </div>\r\n</article>\r\n}\r\n", styles: [":host{display:block}\n"] }]
|
|
176
194
|
}], propDecorators: { lblTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "lblTitle", required: true }] }], property: [{ type: i0.Input, args: [{ isSignal: true, alias: "property", required: true }] }], onCopyEvt: [{ type: i0.Output, args: ["onCopyEvt"] }] } });
|
|
177
195
|
|
|
178
196
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
@@ -180,7 +198,32 @@ class UniDialogError {
|
|
|
180
198
|
constructor() {
|
|
181
199
|
/* Input */
|
|
182
200
|
this.storeItems = input.required(...(ngDevMode ? [{ debugName: "storeItems" }] : /* istanbul ignore next */ []));
|
|
183
|
-
|
|
201
|
+
/* Variables */
|
|
202
|
+
this.storeItemsVisibile = linkedSignal({ ...(ngDevMode ? { debugName: "storeItemsVisibile" } : /* istanbul ignore next */ {}), source: () => this.storeItems(),
|
|
203
|
+
computation: (newItems, prev) => {
|
|
204
|
+
const visibleItems = newItems.filter((item) => item.isVisible);
|
|
205
|
+
const previousList = prev?.value;
|
|
206
|
+
if (!previousList)
|
|
207
|
+
return visibleItems;
|
|
208
|
+
return visibleItems.map((item) => {
|
|
209
|
+
// Ricerca del record corrispondente nello stato precedente
|
|
210
|
+
const existing = previousList.find((old) => old.id === item.id);
|
|
211
|
+
if (!existing)
|
|
212
|
+
return item;
|
|
213
|
+
// Una variazione nella lunghezza della cronologia indica la ripetizione dell'errore.
|
|
214
|
+
// In questo scenario si ignorano i vecchi flag e si applicano i valori azzerati dallo store.
|
|
215
|
+
if (existing.historyItems.length !== item.historyItems.length) {
|
|
216
|
+
return item;
|
|
217
|
+
}
|
|
218
|
+
// Se l'errore non ha subito variazioni strutturali, viene preservato lo stato locale della UI
|
|
219
|
+
return {
|
|
220
|
+
...item,
|
|
221
|
+
isOpen: existing.isOpen,
|
|
222
|
+
isCopied: existing.isCopied,
|
|
223
|
+
isSaved: existing.isSaved,
|
|
224
|
+
};
|
|
225
|
+
});
|
|
226
|
+
} });
|
|
184
227
|
/* Variables */
|
|
185
228
|
this.toast = signal(null, ...(ngDevMode ? [{ debugName: "toast" }] : /* istanbul ignore next */ []));
|
|
186
229
|
/* Icons */
|
|
@@ -286,12 +329,12 @@ class UniDialogError {
|
|
|
286
329
|
}
|
|
287
330
|
onDelete(id) {
|
|
288
331
|
/* Azione */
|
|
289
|
-
UniErrorManager.
|
|
332
|
+
UniErrorManager.hide(id);
|
|
290
333
|
/* Toast */
|
|
291
334
|
this.showToast('ErrorRemoved');
|
|
292
335
|
}
|
|
293
336
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniDialogError, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
294
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniDialogError, isStandalone: true, selector: "uni-dialog-error", inputs: { storeItems: { classPropertyName: "storeItems", publicName: "storeItems", 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 }}: {{ storeItemsVisibile().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\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-4 pt-2 pb-4\">\r\n @for (storeItem of storeItemsVisibile(); track $index) {\r\n <!-- Data -->\r\n @let uniError = storeItem.uniError; @let storeItemData = storeItem | 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!': storeItem.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 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': storeItem.isOpen }\"\r\n [title]=\"(storeItem.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(storeItem.id)\">\r\n <span class=\"font-mono text-xs font-bold\">></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 {{ storeItemData.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 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(uniError.type === 'network' || uniError.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"storeItemData.icon\" [title]=\"uniError.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ uniError.type }} </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Messaggio -->\r\n <div\r\n class=\"flex flex-col gap-4 [&_article]:border-0 [&_article]:p-0 [&_article_h3]:text-neutral-400 [&_article_h3]:group-hover:text-neutral-200 [&_article_h3_div_*]:hover:text-white [&_article_p]:text-white\">\r\n <!-- Messaggio default -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Message'\"\r\n [property]=\"{ value: uniError.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(uniError.type === 'be' && uniError.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: uniError.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(storeItem.isOpen) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-12\">\r\n @if(uniError.type === 'be' || uniError.type === 'server') {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: request -->\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Request' | translate }}\r\n </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 <uni-dialog-error-article\r\n class=\"shrink-0 basis-24\"\r\n [lblTitle]=\"'Method'\"\r\n [property]=\"{ value: uniError.request.method, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n <!-- Dettagli: request url -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Url'\"\r\n [property]=\"{ value: uniError.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(uniError.request.url | url).searchParams];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'QueryParams'\"\r\n [property]=\"{ value: queryParams, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request headers -->\r\n @let headers = [...uniError.request.headers.entries()];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Headers'\"\r\n [property]=\"{ value: headers, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request body -->\r\n @let body = uniError.request | get_body_async | async;\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Body'\"\r\n [property]=\"{ value: body | parse, type: 'json'}\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex gap-4\">\r\n <!-- Dettagli: request info mode -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Mode'\"\r\n [property]=\"{ value: uniError.request.mode, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Credentials'\"\r\n [property]=\"{ value: uniError.request.credentials, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info cache -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'CacheMode'\"\r\n [property]=\"{ value: uniError.request.cache, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Diagnostic' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Duration'\"\r\n [property]=\"{ value: `${uniError.durationMs / 1000}s`, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: info user agent -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'UserAgent'\"\r\n [property]=\"{ value: uniError.userAgent, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Exception' | translate }} ({{ uniError.type }})\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.exception.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.exception.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.exception.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Frames'\"\r\n [property]=\"{ value: uniError.exception.stackTraceFrames.map(x => ([x.file, `LINE ${x.line}`])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(storeItem.isOpen) { @if((uniError.type === 'be' || uniError.type === 'server') &&\r\n uniError.innerException) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.innerException.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: tipo -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.innerException.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.innerException.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\"> {{ storeItemData.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 {{ storeItem.historyItems.at(-1)?.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 {{ storeItem.historyItems.length }} {{ ('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=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isCopied\"\r\n (click)=\"onCopyAll(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isSaved\"\r\n (click)=\"onSave(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(storeItem.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: [":host{display:block;height:min(700px,80%);max-height:80%;width:min(1000px,60%);max-width:80%}\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: "component", type: UniDialogErrorArticle, selector: "uni-dialog-error-article", inputs: ["lblTitle", "property"], outputs: ["onCopyEvt"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { 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 }); }
|
|
337
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniDialogError, isStandalone: true, selector: "uni-dialog-error", inputs: { storeItems: { classPropertyName: "storeItems", publicName: "storeItems", 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 <h1 class=\"mr-auto truncate text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"xs:block hidden 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 }}: {{ storeItemsVisibile().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\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-6 overflow-x-auto p-2\">\r\n @for (storeItem of storeItemsVisibile(); track $index) {\r\n <!-- Data -->\r\n @let uniError = storeItem.uniError; @let storeItemData = storeItem | get_data;\r\n <li\r\n class=\"group squircle @container/item relative flex w-full min-w-32 flex-col 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!': storeItem.isOpen }\">\r\n <!-- Badges -->\r\n <div class=\"absolute -top-2 -right-1 flex gap-2 text-white\">\r\n @if(storeItem.isCopied) {\r\n <span class=\"squircle rounded-full bg-amber-500 px-3 py-px\">\r\n {{ 'Copied' | translate }}\r\n </span>\r\n } @if(storeItem.isSaved) {\r\n <span class=\"squircle rounded-full bg-emerald-500 px-3 py-px\">\r\n {{ 'Saved' | translate }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Header -->\r\n <div class=\"@container/header flex items-center justify-between gap-4 p-4\">\r\n <!-- Header: titolo -->\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': storeItem.isOpen }\"\r\n [title]=\"(storeItem.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(storeItem.id)\">\r\n <span class=\"font-mono text-xs font-bold\">></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 {{ storeItemData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Header: type -->\r\n <div\r\n class=\"hidden items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white @xs/header:flex\">\r\n @if(uniError.type === 'network' || uniError.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"storeItemData.icon\" [title]=\"uniError.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ uniError.type }} </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Messaggio -->\r\n <div\r\n class=\"flex flex-col gap-4 [&_article]:border-0 [&_article]:p-0 [&_article_h3]:text-neutral-400 [&_article_h3]:group-hover:text-neutral-200 [&_article_h3_div_*]:hover:text-white [&_article_p]:text-white\">\r\n <!-- Messaggio default -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Message'\"\r\n [property]=\"{ value: uniError.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(uniError.type === 'be' && uniError.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: uniError.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(storeItem.isOpen) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-12\">\r\n @if(uniError.type === 'be' || uniError.type === 'server') {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: request -->\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Request' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex flex-col gap-x-16 gap-y-4 @md/item:flex-row\">\r\n <!-- Dettagli: request metodo http -->\r\n <uni-dialog-error-article\r\n class=\"shrink-0 @md/item:basis-24\"\r\n [lblTitle]=\"'Method'\"\r\n [property]=\"{ value: uniError.request.method, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n <!-- Dettagli: request url -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Url'\"\r\n [property]=\"{ value: uniError.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(uniError.request.url | url).searchParams];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'QueryParams'\"\r\n [property]=\"{ value: queryParams, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request headers -->\r\n @let headers = [...uniError.request.headers.entries()];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Headers'\"\r\n [property]=\"{ value: headers, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request body -->\r\n @let body = uniError.request | get_body_async | async;\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Body'\"\r\n [property]=\"{ value: body | parse, type: 'json'}\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex flex-col gap-4 @md/item:flex-row\">\r\n <!-- Dettagli: request info mode -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Mode'\"\r\n [property]=\"{ value: uniError.request.mode, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Credentials'\"\r\n [property]=\"{ value: uniError.request.credentials, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info cache -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'CacheMode'\"\r\n [property]=\"{ value: uniError.request.cache, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Diagnostic' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Duration'\"\r\n [property]=\"{ value: `${uniError.durationMs / 1000}s`, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: info user agent -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'UserAgent'\"\r\n [property]=\"{ value: uniError.userAgent, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Exception' | translate }} ({{ uniError.type }})\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.exception.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.exception.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.exception.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Frames'\"\r\n [property]=\"{ value: uniError.exception.stackTraceFrames.map(x => ([x.file, `LINE ${x.line}`])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(storeItem.isOpen) { @if((uniError.type === 'be' || uniError.type === 'server') &&\r\n uniError.innerException) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.innerException.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: tipo -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.innerException.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.innerException.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n } }\r\n\r\n <!-- Storico -->\r\n @if(storeItem.isOpen){ @if(storeItem.historyItems.length > 0) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'History' | translate }}\r\n </h1>\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Timestamp'\"\r\n [property]=\"{ value: (storeItem.historyItems | get_timestamp_formatted).map(x => ([x.message, x.date])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"@container/footer flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 @lg/item:flex-row @lg/item:items-center\">\r\n <!-- Footer: metadata -->\r\n <div\r\n class=\"flex min-w-0 flex-col items-center justify-between gap-x-4 gap-y-2 overflow-hidden text-xs @2xs/footer:flex-row\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex h-6 max-w-full min-w-22 items-center justify-center gap-2 overflow-hidden rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1 font-mono\">\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\"> {{ storeItemData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden 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=\"flex-1 truncate overflow-hidden font-mono text-neutral-300\">\r\n {{ storeItem.historyItems.at(-1)?.timestamp| date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden 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=\"truncate font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ storeItem.historyItems.length }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"touch:opacity-100 flex flex-col items-center justify-center gap-2 transition duration-300 group-hover:opacity-100 @[110px]/footer:flex-row @sm/footer:opacity-10\">\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isCopied\"\r\n (click)=\"onCopyAll(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isSaved\"\r\n (click)=\"onSave(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(storeItem.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: [":host{display:block;height:min(700px,80%);max-height:80%;width:min(1000px,60%);max-width:80%}@media(max-width:768px){:host{width:100%!important;max-width:100%!important;height:100%!important;max-height:100%!important}}\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: "component", type: UniDialogErrorArticle, selector: "uni-dialog-error-article", inputs: ["lblTitle", "property"], outputs: ["onCopyEvt"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { 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: GetTimestampFormattedPipe, name: "get_timestamp_formatted" }, { kind: "pipe", type: UniParsePipe, name: "parse" }, { kind: "pipe", type: UniUrlPipe, name: "url" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
295
338
|
}
|
|
296
339
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniDialogError, decorators: [{
|
|
297
340
|
type: Component,
|
|
@@ -305,9 +348,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
|
|
|
305
348
|
UniTranslatePipe,
|
|
306
349
|
GetDataPipe,
|
|
307
350
|
GetBodyAsyncPipe,
|
|
351
|
+
GetTimestampFormattedPipe,
|
|
308
352
|
UniParsePipe,
|
|
309
353
|
UniUrlPipe,
|
|
310
|
-
], 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 }}: {{ storeItemsVisibile().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\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-4 pt-2 pb-4\">\r\n @for (storeItem of storeItemsVisibile(); track $index) {\r\n <!-- Data -->\r\n @let uniError = storeItem.uniError; @let storeItemData = storeItem | 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!': storeItem.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 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': storeItem.isOpen }\"\r\n [title]=\"(storeItem.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(storeItem.id)\">\r\n <span class=\"font-mono text-xs font-bold\">></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 {{ storeItemData.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 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(uniError.type === 'network' || uniError.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"storeItemData.icon\" [title]=\"uniError.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ uniError.type }} </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Messaggio -->\r\n <div\r\n class=\"flex flex-col gap-4 [&_article]:border-0 [&_article]:p-0 [&_article_h3]:text-neutral-400 [&_article_h3]:group-hover:text-neutral-200 [&_article_h3_div_*]:hover:text-white [&_article_p]:text-white\">\r\n <!-- Messaggio default -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Message'\"\r\n [property]=\"{ value: uniError.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(uniError.type === 'be' && uniError.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: uniError.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(storeItem.isOpen) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-12\">\r\n @if(uniError.type === 'be' || uniError.type === 'server') {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: request -->\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Request' | translate }}\r\n </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 <uni-dialog-error-article\r\n class=\"shrink-0 basis-24\"\r\n [lblTitle]=\"'Method'\"\r\n [property]=\"{ value: uniError.request.method, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n <!-- Dettagli: request url -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Url'\"\r\n [property]=\"{ value: uniError.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(uniError.request.url | url).searchParams];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'QueryParams'\"\r\n [property]=\"{ value: queryParams, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request headers -->\r\n @let headers = [...uniError.request.headers.entries()];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Headers'\"\r\n [property]=\"{ value: headers, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request body -->\r\n @let body = uniError.request | get_body_async | async;\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Body'\"\r\n [property]=\"{ value: body | parse, type: 'json'}\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex gap-4\">\r\n <!-- Dettagli: request info mode -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Mode'\"\r\n [property]=\"{ value: uniError.request.mode, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Credentials'\"\r\n [property]=\"{ value: uniError.request.credentials, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info cache -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'CacheMode'\"\r\n [property]=\"{ value: uniError.request.cache, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Diagnostic' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Duration'\"\r\n [property]=\"{ value: `${uniError.durationMs / 1000}s`, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: info user agent -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'UserAgent'\"\r\n [property]=\"{ value: uniError.userAgent, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Exception' | translate }} ({{ uniError.type }})\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.exception.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.exception.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.exception.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Frames'\"\r\n [property]=\"{ value: uniError.exception.stackTraceFrames.map(x => ([x.file, `LINE ${x.line}`])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(storeItem.isOpen) { @if((uniError.type === 'be' || uniError.type === 'server') &&\r\n uniError.innerException) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.innerException.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: tipo -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.innerException.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.innerException.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\"> {{ storeItemData.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 {{ storeItem.historyItems.at(-1)?.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 {{ storeItem.historyItems.length }} {{ ('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=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isCopied\"\r\n (click)=\"onCopyAll(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isSaved\"\r\n (click)=\"onSave(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(storeItem.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: [":host{display:block;height:min(700px,80%);max-height:80%;width:min(1000px,60%);max-width:80%}\n"] }]
|
|
354
|
+
], 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 <h1 class=\"mr-auto truncate text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"xs:block hidden 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 }}: {{ storeItemsVisibile().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\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-6 overflow-x-auto p-2\">\r\n @for (storeItem of storeItemsVisibile(); track $index) {\r\n <!-- Data -->\r\n @let uniError = storeItem.uniError; @let storeItemData = storeItem | get_data;\r\n <li\r\n class=\"group squircle @container/item relative flex w-full min-w-32 flex-col 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!': storeItem.isOpen }\">\r\n <!-- Badges -->\r\n <div class=\"absolute -top-2 -right-1 flex gap-2 text-white\">\r\n @if(storeItem.isCopied) {\r\n <span class=\"squircle rounded-full bg-amber-500 px-3 py-px\">\r\n {{ 'Copied' | translate }}\r\n </span>\r\n } @if(storeItem.isSaved) {\r\n <span class=\"squircle rounded-full bg-emerald-500 px-3 py-px\">\r\n {{ 'Saved' | translate }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Header -->\r\n <div class=\"@container/header flex items-center justify-between gap-4 p-4\">\r\n <!-- Header: titolo -->\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': storeItem.isOpen }\"\r\n [title]=\"(storeItem.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(storeItem.id)\">\r\n <span class=\"font-mono text-xs font-bold\">></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 {{ storeItemData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Header: type -->\r\n <div\r\n class=\"hidden items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white @xs/header:flex\">\r\n @if(uniError.type === 'network' || uniError.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"storeItemData.icon\" [title]=\"uniError.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ uniError.type }} </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Messaggio -->\r\n <div\r\n class=\"flex flex-col gap-4 [&_article]:border-0 [&_article]:p-0 [&_article_h3]:text-neutral-400 [&_article_h3]:group-hover:text-neutral-200 [&_article_h3_div_*]:hover:text-white [&_article_p]:text-white\">\r\n <!-- Messaggio default -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Message'\"\r\n [property]=\"{ value: uniError.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(uniError.type === 'be' && uniError.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: uniError.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(storeItem.isOpen) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-12\">\r\n @if(uniError.type === 'be' || uniError.type === 'server') {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: request -->\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Request' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex flex-col gap-x-16 gap-y-4 @md/item:flex-row\">\r\n <!-- Dettagli: request metodo http -->\r\n <uni-dialog-error-article\r\n class=\"shrink-0 @md/item:basis-24\"\r\n [lblTitle]=\"'Method'\"\r\n [property]=\"{ value: uniError.request.method, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n <!-- Dettagli: request url -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Url'\"\r\n [property]=\"{ value: uniError.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(uniError.request.url | url).searchParams];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'QueryParams'\"\r\n [property]=\"{ value: queryParams, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request headers -->\r\n @let headers = [...uniError.request.headers.entries()];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Headers'\"\r\n [property]=\"{ value: headers, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request body -->\r\n @let body = uniError.request | get_body_async | async;\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Body'\"\r\n [property]=\"{ value: body | parse, type: 'json'}\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex flex-col gap-4 @md/item:flex-row\">\r\n <!-- Dettagli: request info mode -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Mode'\"\r\n [property]=\"{ value: uniError.request.mode, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Credentials'\"\r\n [property]=\"{ value: uniError.request.credentials, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info cache -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'CacheMode'\"\r\n [property]=\"{ value: uniError.request.cache, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Diagnostic' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Duration'\"\r\n [property]=\"{ value: `${uniError.durationMs / 1000}s`, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: info user agent -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'UserAgent'\"\r\n [property]=\"{ value: uniError.userAgent, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Exception' | translate }} ({{ uniError.type }})\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.exception.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.exception.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.exception.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Frames'\"\r\n [property]=\"{ value: uniError.exception.stackTraceFrames.map(x => ([x.file, `LINE ${x.line}`])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(storeItem.isOpen) { @if((uniError.type === 'be' || uniError.type === 'server') &&\r\n uniError.innerException) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.innerException.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: tipo -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.innerException.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.innerException.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n } }\r\n\r\n <!-- Storico -->\r\n @if(storeItem.isOpen){ @if(storeItem.historyItems.length > 0) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'History' | translate }}\r\n </h1>\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Timestamp'\"\r\n [property]=\"{ value: (storeItem.historyItems | get_timestamp_formatted).map(x => ([x.message, x.date])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"@container/footer flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 @lg/item:flex-row @lg/item:items-center\">\r\n <!-- Footer: metadata -->\r\n <div\r\n class=\"flex min-w-0 flex-col items-center justify-between gap-x-4 gap-y-2 overflow-hidden text-xs @2xs/footer:flex-row\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex h-6 max-w-full min-w-22 items-center justify-center gap-2 overflow-hidden rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1 font-mono\">\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\"> {{ storeItemData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden 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=\"flex-1 truncate overflow-hidden font-mono text-neutral-300\">\r\n {{ storeItem.historyItems.at(-1)?.timestamp| date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden 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=\"truncate font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ storeItem.historyItems.length }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"touch:opacity-100 flex flex-col items-center justify-center gap-2 transition duration-300 group-hover:opacity-100 @[110px]/footer:flex-row @sm/footer:opacity-10\">\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isCopied\"\r\n (click)=\"onCopyAll(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isSaved\"\r\n (click)=\"onSave(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(storeItem.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: [":host{display:block;height:min(700px,80%);max-height:80%;width:min(1000px,60%);max-width:80%}@media(max-width:768px){:host{width:100%!important;max-width:100%!important;height:100%!important;max-height:100%!important}}\n"] }]
|
|
311
355
|
}], propDecorators: { storeItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "storeItems", required: true }] }] } });
|
|
312
356
|
|
|
313
357
|
class UniHeader {
|
|
@@ -317,17 +361,18 @@ class UniHeader {
|
|
|
317
361
|
this.version = input.required(...(ngDevMode ? [{ debugName: "version" }] : /* istanbul ignore next */ []));
|
|
318
362
|
this.pathBrandLogo = input.required(...(ngDevMode ? [{ debugName: "pathBrandLogo" }] : /* istanbul ignore next */ []));
|
|
319
363
|
this.pathAppLogo = input(...(ngDevMode ? [undefined, { debugName: "pathAppLogo" }] : /* istanbul ignore next */ []));
|
|
320
|
-
this.
|
|
364
|
+
this.hasSideMenu = input(false, ...(ngDevMode ? [{ debugName: "hasSideMenu" }] : /* istanbul ignore next */ []));
|
|
365
|
+
this.centralDescription = input(...(ngDevMode ? [undefined, { debugName: "centralDescription" }] : /* istanbul ignore next */ []));
|
|
321
366
|
/* Output */
|
|
322
367
|
this.evtToggleMenu = output();
|
|
323
368
|
}
|
|
324
369
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniHeader, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
325
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniHeader, isStandalone: true, selector: "uni-header", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, version: { classPropertyName: "version", publicName: "version", isSignal: true, isRequired: true, transformFunction: null }, pathBrandLogo: { classPropertyName: "pathBrandLogo", publicName: "pathBrandLogo", isSignal: true, isRequired: true, transformFunction: null }, pathAppLogo: { classPropertyName: "pathAppLogo", publicName: "pathAppLogo", isSignal: true, isRequired: false, transformFunction: null },
|
|
370
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniHeader, isStandalone: true, selector: "uni-header", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, version: { classPropertyName: "version", publicName: "version", isSignal: true, isRequired: true, transformFunction: null }, pathBrandLogo: { classPropertyName: "pathBrandLogo", publicName: "pathBrandLogo", isSignal: true, isRequired: true, transformFunction: null }, pathAppLogo: { classPropertyName: "pathAppLogo", publicName: "pathAppLogo", isSignal: true, isRequired: false, transformFunction: null }, hasSideMenu: { classPropertyName: "hasSideMenu", publicName: "hasSideMenu", isSignal: true, isRequired: false, transformFunction: null }, centralDescription: { classPropertyName: "centralDescription", publicName: "centralDescription", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { evtToggleMenu: "evtToggleMenu" }, ngImport: i0, template: "<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-auto flex-col overflow-hidden\">\r\n <p class=\"truncate text-xl leading-tight font-semibold tracking-wider uppercase\">\r\n {{ title() }}\r\n </p>\r\n <p class=\"truncate text-xs tracking-wide opacity-75\">{{ version() }}</p>\r\n </div>\r\n\r\n @if(centralDescription(); as centralDescription) {\r\n <div class=\"hidden flex-100 sm:flex\">\r\n <p\r\n class=\"squircle mx-auto rounded-full border border-white/5 bg-white/2.5 px-4 py-1.5 text-center text-xl font-bold tracking-wider antialiased\">\r\n {{ centralDescription }}\r\n </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=\"xs: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 (hasSideMenu()) {\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", styles: [":host{display:block}:host ::ng-deep .dx-button{height:24px;min-width:24px;background-color:transparent}:host ::ng-deep .dx-button .dx-icon{font-size:24px;color:#fff}\n"], dependencies: [{ 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: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "decoding", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
326
371
|
}
|
|
327
372
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniHeader, decorators: [{
|
|
328
373
|
type: Component,
|
|
329
|
-
args: [{ selector: 'uni-header', standalone: true, imports: [DxButtonModule, NgOptimizedImage], changeDetection: ChangeDetectionStrategy.OnPush, template: "<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
|
|
330
|
-
}], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], version: [{ type: i0.Input, args: [{ isSignal: true, alias: "version", required: true }] }], pathBrandLogo: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathBrandLogo", required: true }] }], pathAppLogo: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathAppLogo", required: false }] }],
|
|
374
|
+
args: [{ selector: 'uni-header', standalone: true, imports: [DxButtonModule, NgOptimizedImage], changeDetection: ChangeDetectionStrategy.OnPush, template: "<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-auto flex-col overflow-hidden\">\r\n <p class=\"truncate text-xl leading-tight font-semibold tracking-wider uppercase\">\r\n {{ title() }}\r\n </p>\r\n <p class=\"truncate text-xs tracking-wide opacity-75\">{{ version() }}</p>\r\n </div>\r\n\r\n @if(centralDescription(); as centralDescription) {\r\n <div class=\"hidden flex-100 sm:flex\">\r\n <p\r\n class=\"squircle mx-auto rounded-full border border-white/5 bg-white/2.5 px-4 py-1.5 text-center text-xl font-bold tracking-wider antialiased\">\r\n {{ centralDescription }}\r\n </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=\"xs: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 (hasSideMenu()) {\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", styles: [":host{display:block}:host ::ng-deep .dx-button{height:24px;min-width:24px;background-color:transparent}:host ::ng-deep .dx-button .dx-icon{font-size:24px;color:#fff}\n"] }]
|
|
375
|
+
}], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], version: [{ type: i0.Input, args: [{ isSignal: true, alias: "version", required: true }] }], pathBrandLogo: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathBrandLogo", required: true }] }], pathAppLogo: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathAppLogo", required: false }] }], hasSideMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasSideMenu", required: false }] }], centralDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "centralDescription", required: false }] }], evtToggleMenu: [{ type: i0.Output, args: ["evtToggleMenu"] }] } });
|
|
331
376
|
|
|
332
377
|
class UniItemFieldWithHightContrast {
|
|
333
378
|
constructor() {
|
|
@@ -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-article/uni-dialog-error-article.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error-article/uni-dialog-error-article.html","../../../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 { ErrorStore } 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(value: { id: string } & ErrorStore): ErrorDataByType {\n const error = value.uniError;\n\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: value.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: value.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: value.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 */\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, output, signal } from '@angular/core';\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\nimport { faCircleInfo, faCopy } from '@fortawesome/free-solid-svg-icons';\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\n\n@Component({\n selector: 'uni-dialog-error-article',\n imports: [CommonModule, FaIconComponent, UniTranslatePipe],\n templateUrl: './uni-dialog-error-article.html',\n styleUrl: './uni-dialog-error-article.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UniDialogErrorArticle {\n /* Input */\n lblTitle = input.required<string>();\n property = input.required<\n | { value: string; type: 'string' }\n | { value: string; type: 'pre' }\n | { value: Record<string, any>; type: 'json' }\n | { value: [string, any][]; type: 'array' }\n >();\n\n /* Output */\n onCopyEvt = output<any>();\n\n /* Variables */\n toast = signal<{ timeoutId: number; label: string } | null>(null);\n\n /* Icons */\n readonly ICON_INFO = faCircleInfo;\n readonly ICON_COPY = faCopy;\n}\n\n","@if(property(); as p) {\n<article\n class=\"flex flex-col gap-1 border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400\">\n <!-- Titolo -->\n <h3\n class=\"group/title text-2xs! mr-auto flex items-center gap-1 font-bold tracking-wide text-rose-400/50 uppercase transition-colors duration-300 group-hover:text-rose-400\">\n {{ lblTitle() | translate }}\n <div class=\"invisible flex items-center gap-1 text-[9px] group-hover/title:visible\">\n <fa-icon\n class=\"cursor-help hover:text-rose-300\"\n [icon]=\"ICON_INFO\"\n [title]=\"`Tooltip${lblTitle()}` | translate\" />\n <button\n class=\"transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-120 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25\"\n (click)=\"onCopyEvt.emit(p.value)\">\n <fa-icon\n class=\"hover:text-rose-300\"\n [icon]=\"ICON_COPY\"\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\n </button>\n </div>\n </h3>\n\n <div class=\"text-sm text-rose-200 transition-colors duration-300 group-hover:text-rose-100\">\n <!-- string / pre -->\n @if(p.type === 'string' || p.type === 'pre') {\n <!-- #2 -->\n @if(p.value; as value) {\n <!-- #2.1 - 3 -->\n @switch (p.type) {\n <!-- #3.1 -->\n @case ('string') {\n <p class=\"whitespace-pre-wrap\">{{ value }}</p>\n }\n <!-- #3.2 -->\n @case ('pre') {\n <pre class=\"overflow-x-auto\">{{ value }}</pre>\n } } }\n <!-- #2.2 -->\n @else {\n <p class=\"my-auto\">-</p>\n } }\n\n <!-- json -->\n @if(p.type === 'json') {\n <!-- #2 -->\n @if((p.value | json) !== '{}') {\n <pre class=\"overflow-x-auto font-sans\">{{ p.value | json }}</pre>\n } @else {\n <p class=\"my-auto\">-</p>\n } }\n\n <!-- array -->\n @if(p.type === 'array') {\n <!-- #2 -->\n @if(p.value.length > 0) {\n <ul class=\"flex flex-col gap-2\">\n @for (item of p.value; track $index) {\n <li class=\"flex items-center gap-4 border-b border-dashed border-white/5 pb-1\">\n <span class=\"font-mono text-xs font-bold text-rose-100\">\n #{{ ($index + 1).toString().padStart(2, '0') }}\n </span>\n <span> {{ item[0] }} </span>\n <span\n class=\"ml-auto basis-28 rounded bg-white/5 px-4 py-px text-center font-mono text-rose-300 transition-colors duration-300 group-hover:text-rose-400\">\n {{ item[1] }}\n </span>\n </li>\n }\n </ul>\n } @else {\n <p class=\"my-auto\">-</p>\n } }\n </div>\n</article>\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 { ErrorStore, FeLog } from 'uni-model-type/type';\r\n\r\nimport { GetBodyAsyncPipe } from './get-body-async.pipe';\r\nimport { GetDataPipe } from './get-data.pipe';\r\nimport { UniDialogErrorArticle } from './uni-dialog-error-article/uni-dialog-error-article';\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 UniDialogErrorArticle,\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 storeItems = input.required<({ id: string } & ErrorStore)[]>();\r\n storeItemsVisibile = linkedSignal(() => this.storeItems().filter((x) => x.isVisible));\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.storeItemsVisibile.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.storeItemsVisibile().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.storeItemsVisibile.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.storeItemsVisibile().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.uniError.type,\r\n timestamp: currentError.historyItems.at(-1)!.timestamp,\r\n ref: currentError.id,\r\n exceptionFunctionName: currentError.uniError.exception.functionName,\r\n exceptionType: currentError.uniError.exception.type,\r\n exceptionMessage: currentError.uniError.exception.message,\r\n exceptionStackTrace: currentError.uniError.exception.stackTrace,\r\n exceptionStackTraceFrames: currentError.uniError.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.storeItemsVisibile.update((list) =>\r\n list.map((err) => {\r\n if (err.id === id) {\r\n err.isSaved = true;\r\n }\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 valueFormatted = value;\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 }}: {{ storeItemsVisibile().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\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-4 pt-2 pb-4\">\r\n @for (storeItem of storeItemsVisibile(); track $index) {\r\n <!-- Data -->\r\n @let uniError = storeItem.uniError; @let storeItemData = storeItem | 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!': storeItem.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 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': storeItem.isOpen }\"\r\n [title]=\"(storeItem.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(storeItem.id)\">\r\n <span class=\"font-mono text-xs font-bold\">></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 {{ storeItemData.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 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(uniError.type === 'network' || uniError.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"storeItemData.icon\" [title]=\"uniError.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ uniError.type }} </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Messaggio -->\r\n <div\r\n class=\"flex flex-col gap-4 [&_article]:border-0 [&_article]:p-0 [&_article_h3]:text-neutral-400 [&_article_h3]:group-hover:text-neutral-200 [&_article_h3_div_*]:hover:text-white [&_article_p]:text-white\">\r\n <!-- Messaggio default -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Message'\"\r\n [property]=\"{ value: uniError.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(uniError.type === 'be' && uniError.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: uniError.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(storeItem.isOpen) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-12\">\r\n @if(uniError.type === 'be' || uniError.type === 'server') {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: request -->\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Request' | translate }}\r\n </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 <uni-dialog-error-article\r\n class=\"shrink-0 basis-24\"\r\n [lblTitle]=\"'Method'\"\r\n [property]=\"{ value: uniError.request.method, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n <!-- Dettagli: request url -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Url'\"\r\n [property]=\"{ value: uniError.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(uniError.request.url | url).searchParams];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'QueryParams'\"\r\n [property]=\"{ value: queryParams, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request headers -->\r\n @let headers = [...uniError.request.headers.entries()];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Headers'\"\r\n [property]=\"{ value: headers, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request body -->\r\n @let body = uniError.request | get_body_async | async;\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Body'\"\r\n [property]=\"{ value: body | parse, type: 'json'}\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex gap-4\">\r\n <!-- Dettagli: request info mode -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Mode'\"\r\n [property]=\"{ value: uniError.request.mode, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Credentials'\"\r\n [property]=\"{ value: uniError.request.credentials, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info cache -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'CacheMode'\"\r\n [property]=\"{ value: uniError.request.cache, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Diagnostic' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Duration'\"\r\n [property]=\"{ value: `${uniError.durationMs / 1000}s`, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: info user agent -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'UserAgent'\"\r\n [property]=\"{ value: uniError.userAgent, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Exception' | translate }} ({{ uniError.type }})\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.exception.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.exception.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.exception.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Frames'\"\r\n [property]=\"{ value: uniError.exception.stackTraceFrames.map(x => ([x.file, `LINE ${x.line}`])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(storeItem.isOpen) { @if((uniError.type === 'be' || uniError.type === 'server') &&\r\n uniError.innerException) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.innerException.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: tipo -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.innerException.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.innerException.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\"> {{ storeItemData.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 {{ storeItem.historyItems.at(-1)?.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 {{ storeItem.historyItems.length }} {{ ('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=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isCopied\"\r\n (click)=\"onCopyAll(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isSaved\"\r\n (click)=\"onSave(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-rose-400! active:bg-rose-400!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(storeItem.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/get-timestamp-formatted.pipe.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error-article/uni-dialog-error-article.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error-article/uni-dialog-error-article.html","../../../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 keyTitle = input.required<string>();\r\n keyDescription = input.required<string>();\r\n paramsDescription = input<Record<string, string | number | Date>>();\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 overflow-hidden\">\r\n <h1 class=\"max-w-full truncate text-lg! font-bold tracking-wider\">\r\n {{ keyTitle() | translate }}\r\n </h1>\r\n @if(icon(); as icon) {\r\n <fa-icon class=\"text-5xl\" [icon]=\"icon\"></fa-icon>\r\n }\r\n <p\r\n class=\"max-w-full text-sm leading-relaxed tracking-wide wrap-break-word text-white! antialiased\">\r\n {{ keyDescription() | translate: { prefix: type(), params: paramsDescription() } }}\r\n </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 { ErrorStore } 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(value: { id: string } & ErrorStore): ErrorDataByType {\n const error = value.uniError;\n\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: value.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: value.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: value.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","import { Pipe, type PipeTransform } from '@angular/core';\nimport { UniLocaleManager } from 'uni-manager/locale';\nimport { ErrorStore } from 'uni-model-type/type';\n\n@Pipe({\n name: 'get_timestamp_formatted',\n})\nexport class GetTimestampFormattedPipe implements PipeTransform {\n transform(value: ErrorStore['historyItems']) {\n return value.map((x) => ({\n message: x.message,\n date: UniLocaleManager.toDate(new Date(x.timestamp)),\n }));\n }\n}\n\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, output, signal } from '@angular/core';\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\nimport { faCircleInfo, faCopy } from '@fortawesome/free-solid-svg-icons';\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\n\n@Component({\n selector: 'uni-dialog-error-article',\n imports: [CommonModule, FaIconComponent, UniTranslatePipe],\n templateUrl: './uni-dialog-error-article.html',\n styleUrl: './uni-dialog-error-article.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UniDialogErrorArticle {\n /* Input */\n lblTitle = input.required<string>();\n property = input.required<\n | { value: string; type: 'string' }\n | { value: string; type: 'pre' }\n | { value: Record<string, any>; type: 'json' }\n | { value: [string, any][]; type: 'array' }\n >();\n\n /* Output */\n onCopyEvt = output<any>();\n\n /* Variables */\n toast = signal<{ timeoutId: number; label: string } | null>(null);\n\n /* Icons */\n readonly ICON_INFO = faCircleInfo;\n readonly ICON_COPY = faCopy;\n}\n\n","@if(property(); as p) {\r\n<article\r\n class=\"flex h-full flex-col gap-1 border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400\">\r\n <!-- Titolo -->\r\n <h3\r\n class=\"group/title text-2xs! mr-auto flex max-w-full items-center gap-1 font-bold tracking-wide text-rose-400/50 uppercase transition-colors duration-300 group-hover:text-rose-400\">\r\n <span class=\"truncate\">{{ lblTitle() | translate }}</span>\r\n <div class=\"invisible flex items-center gap-1 text-[9px] group-hover/title:visible\">\r\n <fa-icon\r\n class=\"cursor-help hover:text-rose-300\"\r\n [icon]=\"ICON_INFO\"\r\n [title]=\"`Tooltip${lblTitle()}` | translate\" />\r\n <button\r\n class=\"transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-120 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25\"\r\n (click)=\"onCopyEvt.emit(p.value)\">\r\n <fa-icon\r\n class=\"hover:text-rose-300\"\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </div>\r\n </h3>\r\n\r\n <div\r\n class=\"my-auto text-sm text-rose-200 transition-colors duration-300 group-hover:text-rose-100\">\r\n <!-- string / pre -->\r\n @if(p.type === 'string' || p.type === 'pre') {\r\n <!-- #2 -->\r\n @if(p.value; as value) {\r\n <!-- #2.1 - 3 -->\r\n @switch (p.type) {\r\n <!-- #3.1 -->\r\n @case ('string') {\r\n <p class=\"overflow-hidden text-ellipsis whitespace-pre-wrap\">{{ value }}</p>\r\n }\r\n <!-- #3.2 -->\r\n @case ('pre') {\r\n <pre class=\"overflow-x-auto\">{{ value }}</pre>\r\n } } }\r\n <!-- #2.2 -->\r\n @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n\r\n <!-- json -->\r\n @if(p.type === 'json') {\r\n <!-- #2 -->\r\n @if((p.value | json) !== '{}') {\r\n <pre class=\"overflow-x-auto font-sans\">{{ p.value | json }}</pre>\r\n } @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n\r\n <!-- array -->\r\n @if(p.type === 'array') {\r\n <!-- #2 -->\r\n @if(p.value.length > 0) {\r\n <ul class=\"@container/list flex flex-col gap-2\">\r\n @for (item of p.value; track $index) {\r\n <li\r\n class=\"flex max-w-full flex-col gap-x-4 gap-y-0.5 border-b border-dashed border-white/5 p-1 hover:bg-white/0.5 @lg/list:flex-row @lg/list:items-center\">\r\n <p class=\"flex min-w-0 flex-1 items-center gap-4\">\r\n <span class=\"font-mono text-xs font-bold text-rose-100\">\r\n #{{ ($index + 1).toString().padStart(2, '0') }}\r\n </span>\r\n <span class=\"cursor-help truncate\" [title]=\"item[0]\"> {{ item[0] }} </span>\r\n </p>\r\n <span\r\n class=\"shrink-0 truncate rounded bg-white/5 px-4 py-px text-center font-mono text-nowrap text-rose-300 transition-colors duration-300 group-hover:text-rose-400 @lg/list:ml-auto @lg/list:basis-48\">\r\n {{ item[1] }}\r\n </span>\r\n </li>\r\n }\r\n </ul>\r\n } @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n </div>\r\n</article>\r\n}\r\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 { ErrorStore, FeLog } from 'uni-model-type/type';\r\n\r\nimport { GetBodyAsyncPipe } from './get-body-async.pipe';\r\nimport { GetDataPipe } from './get-data.pipe';\r\nimport { GetTimestampFormattedPipe } from './get-timestamp-formatted.pipe';\r\nimport { UniDialogErrorArticle } from './uni-dialog-error-article/uni-dialog-error-article';\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 UniDialogErrorArticle,\r\n DatePipe,\r\n UniTranslatePipe,\r\n GetDataPipe,\r\n GetBodyAsyncPipe,\r\n GetTimestampFormattedPipe,\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 storeItems = input.required<({ id: string } & ErrorStore)[]>();\r\n\r\n /* Variables */\r\n storeItemsVisibile = linkedSignal<\r\n ({ id: string } & ErrorStore)[],\r\n ({ id: string } & ErrorStore)[]\r\n >({\r\n source: () => this.storeItems(),\r\n computation: (newItems, prev) => {\r\n const visibleItems = newItems.filter((item) => item.isVisible);\r\n const previousList = prev?.value;\r\n if (!previousList) return visibleItems;\r\n\r\n return visibleItems.map((item) => {\r\n // Ricerca del record corrispondente nello stato precedente\r\n const existing = previousList.find((old) => old.id === item.id);\r\n if (!existing) return item;\r\n\r\n // Una variazione nella lunghezza della cronologia indica la ripetizione dell'errore.\r\n // In questo scenario si ignorano i vecchi flag e si applicano i valori azzerati dallo store.\r\n if (existing.historyItems.length !== item.historyItems.length) {\r\n return item;\r\n }\r\n\r\n // Se l'errore non ha subito variazioni strutturali, viene preservato lo stato locale della UI\r\n return {\r\n ...item,\r\n isOpen: existing.isOpen,\r\n isCopied: existing.isCopied,\r\n isSaved: existing.isSaved,\r\n };\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.storeItemsVisibile.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.storeItemsVisibile().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.storeItemsVisibile.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.storeItemsVisibile().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.uniError.type,\r\n timestamp: currentError.historyItems.at(-1)!.timestamp,\r\n ref: currentError.id,\r\n exceptionFunctionName: currentError.uniError.exception.functionName,\r\n exceptionType: currentError.uniError.exception.type,\r\n exceptionMessage: currentError.uniError.exception.message,\r\n exceptionStackTrace: currentError.uniError.exception.stackTrace,\r\n exceptionStackTraceFrames: currentError.uniError.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.storeItemsVisibile.update((list) =>\r\n list.map((err) => {\r\n if (err.id === id) {\r\n err.isSaved = true;\r\n }\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.hide(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 valueFormatted = value;\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 <h1 class=\"mr-auto truncate text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"xs:block hidden 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 }}: {{ storeItemsVisibile().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\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-6 overflow-x-auto p-2\">\r\n @for (storeItem of storeItemsVisibile(); track $index) {\r\n <!-- Data -->\r\n @let uniError = storeItem.uniError; @let storeItemData = storeItem | get_data;\r\n <li\r\n class=\"group squircle @container/item relative flex w-full min-w-32 flex-col 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!': storeItem.isOpen }\">\r\n <!-- Badges -->\r\n <div class=\"absolute -top-2 -right-1 flex gap-2 text-white\">\r\n @if(storeItem.isCopied) {\r\n <span class=\"squircle rounded-full bg-amber-500 px-3 py-px\">\r\n {{ 'Copied' | translate }}\r\n </span>\r\n } @if(storeItem.isSaved) {\r\n <span class=\"squircle rounded-full bg-emerald-500 px-3 py-px\">\r\n {{ 'Saved' | translate }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Header -->\r\n <div class=\"@container/header flex items-center justify-between gap-4 p-4\">\r\n <!-- Header: titolo -->\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': storeItem.isOpen }\"\r\n [title]=\"(storeItem.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(storeItem.id)\">\r\n <span class=\"font-mono text-xs font-bold\">></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 {{ storeItemData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Header: type -->\r\n <div\r\n class=\"hidden items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white @xs/header:flex\">\r\n @if(uniError.type === 'network' || uniError.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"storeItemData.icon\" [title]=\"uniError.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ uniError.type }} </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Messaggio -->\r\n <div\r\n class=\"flex flex-col gap-4 [&_article]:border-0 [&_article]:p-0 [&_article_h3]:text-neutral-400 [&_article_h3]:group-hover:text-neutral-200 [&_article_h3_div_*]:hover:text-white [&_article_p]:text-white\">\r\n <!-- Messaggio default -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Message'\"\r\n [property]=\"{ value: uniError.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(uniError.type === 'be' && uniError.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: uniError.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(storeItem.isOpen) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-12\">\r\n @if(uniError.type === 'be' || uniError.type === 'server') {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: request -->\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Request' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex flex-col gap-x-16 gap-y-4 @md/item:flex-row\">\r\n <!-- Dettagli: request metodo http -->\r\n <uni-dialog-error-article\r\n class=\"shrink-0 @md/item:basis-24\"\r\n [lblTitle]=\"'Method'\"\r\n [property]=\"{ value: uniError.request.method, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n <!-- Dettagli: request url -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Url'\"\r\n [property]=\"{ value: uniError.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(uniError.request.url | url).searchParams];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'QueryParams'\"\r\n [property]=\"{ value: queryParams, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request headers -->\r\n @let headers = [...uniError.request.headers.entries()];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Headers'\"\r\n [property]=\"{ value: headers, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request body -->\r\n @let body = uniError.request | get_body_async | async;\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Body'\"\r\n [property]=\"{ value: body | parse, type: 'json'}\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex flex-col gap-4 @md/item:flex-row\">\r\n <!-- Dettagli: request info mode -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Mode'\"\r\n [property]=\"{ value: uniError.request.mode, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Credentials'\"\r\n [property]=\"{ value: uniError.request.credentials, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info cache -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'CacheMode'\"\r\n [property]=\"{ value: uniError.request.cache, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Diagnostic' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Duration'\"\r\n [property]=\"{ value: `${uniError.durationMs / 1000}s`, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: info user agent -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'UserAgent'\"\r\n [property]=\"{ value: uniError.userAgent, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\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\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Exception' | translate }} ({{ uniError.type }})\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.exception.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.exception.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.exception.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Frames'\"\r\n [property]=\"{ value: uniError.exception.stackTraceFrames.map(x => ([x.file, `LINE ${x.line}`])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(storeItem.isOpen) { @if((uniError.type === 'be' || uniError.type === 'server') &&\r\n uniError.innerException) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.innerException.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: tipo -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.innerException.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.innerException.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n } }\r\n\r\n <!-- Storico -->\r\n @if(storeItem.isOpen){ @if(storeItem.historyItems.length > 0) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'History' | translate }}\r\n </h1>\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Timestamp'\"\r\n [property]=\"{ value: (storeItem.historyItems | get_timestamp_formatted).map(x => ([x.message, x.date])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"@container/footer flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 @lg/item:flex-row @lg/item:items-center\">\r\n <!-- Footer: metadata -->\r\n <div\r\n class=\"flex min-w-0 flex-col items-center justify-between gap-x-4 gap-y-2 overflow-hidden text-xs @2xs/footer:flex-row\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex h-6 max-w-full min-w-22 items-center justify-center gap-2 overflow-hidden rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1 font-mono\">\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\"> {{ storeItemData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden 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=\"flex-1 truncate overflow-hidden font-mono text-neutral-300\">\r\n {{ storeItem.historyItems.at(-1)?.timestamp| date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden 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=\"truncate font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ storeItem.historyItems.length }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"touch:opacity-100 flex flex-col items-center justify-center gap-2 transition duration-300 group-hover:opacity-100 @[110px]/footer:flex-row @sm/footer:opacity-10\">\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isCopied\"\r\n (click)=\"onCopyAll(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isSaved\"\r\n (click)=\"onSave(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(storeItem.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 hasSideMenu = input<boolean>(false);\r\n centralDescription = input<string>();\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-auto flex-col overflow-hidden\">\r\n <p class=\"truncate text-xl leading-tight font-semibold tracking-wider uppercase\">\r\n {{ title() }}\r\n </p>\r\n <p class=\"truncate text-xs tracking-wide opacity-75\">{{ version() }}</p>\r\n </div>\r\n\r\n @if(centralDescription(); as centralDescription) {\r\n <div class=\"hidden flex-100 sm:flex\">\r\n <p\r\n class=\"squircle mx-auto rounded-full border border-white/5 bg-white/2.5 px-4 py-1.5 text-center text-xl font-bold tracking-wider antialiased\">\r\n {{ centralDescription }}\r\n </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=\"xs: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 (hasSideMenu()) {\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,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uni-app-fe",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.16",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": ">=21.2.0",
|
|
6
6
|
"@angular/core": ">=21.2.0",
|
|
7
7
|
"devextreme": ">=25.2.0",
|
|
8
8
|
"devextreme-angular": ">=25.2.0",
|
|
9
|
-
"uni-model-type": ">=0.1.
|
|
10
|
-
"uni-error": ">=0.1.
|
|
11
|
-
"uni-manager": ">=0.1.
|
|
9
|
+
"uni-model-type": ">=0.1.8",
|
|
10
|
+
"uni-error": ">=0.1.22",
|
|
11
|
+
"uni-manager": ">=0.1.25"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"tslib": "^2.3.0"
|
|
@@ -11,12 +11,13 @@ import { UniLoaderService } from 'uni-app-fe/service';
|
|
|
11
11
|
|
|
12
12
|
declare class UniBannerAlert {
|
|
13
13
|
type: _angular_core.InputSignal<"warning" | "error">;
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
keyTitle: _angular_core.InputSignal<string>;
|
|
15
|
+
keyDescription: _angular_core.InputSignal<string>;
|
|
16
|
+
paramsDescription: _angular_core.InputSignal<Record<string, string | number | Date> | undefined>;
|
|
16
17
|
icon: _angular_core.InputSignal<IconDefinition | undefined>;
|
|
17
18
|
readonly ICON_WARNING: IconDefinition;
|
|
18
19
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniBannerAlert, never>;
|
|
19
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBannerAlert, "uni-banner-alert", never, { "type": { "alias": "type"; "required": true; "isSignal": true; }; "
|
|
20
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBannerAlert, "uni-banner-alert", never, { "type": { "alias": "type"; "required": true; "isSignal": true; }; "keyTitle": { "alias": "keyTitle"; "required": true; "isSignal": true; }; "keyDescription": { "alias": "keyDescription"; "required": true; "isSignal": true; }; "paramsDescription": { "alias": "paramsDescription"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
20
21
|
}
|
|
21
22
|
|
|
22
23
|
declare class UniDialogError {
|
|
@@ -52,10 +53,11 @@ declare class UniHeader {
|
|
|
52
53
|
version: _angular_core.InputSignal<string>;
|
|
53
54
|
pathBrandLogo: _angular_core.InputSignal<string>;
|
|
54
55
|
pathAppLogo: _angular_core.InputSignal<string | undefined>;
|
|
55
|
-
|
|
56
|
+
hasSideMenu: _angular_core.InputSignal<boolean>;
|
|
57
|
+
centralDescription: _angular_core.InputSignal<string | undefined>;
|
|
56
58
|
evtToggleMenu: _angular_core.OutputEmitterRef<true>;
|
|
57
59
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniHeader, never>;
|
|
58
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniHeader, "uni-header", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "version": { "alias": "version"; "required": true; "isSignal": true; }; "pathBrandLogo": { "alias": "pathBrandLogo"; "required": true; "isSignal": true; }; "pathAppLogo": { "alias": "pathAppLogo"; "required": false; "isSignal": true; }; "
|
|
60
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniHeader, "uni-header", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "version": { "alias": "version"; "required": true; "isSignal": true; }; "pathBrandLogo": { "alias": "pathBrandLogo"; "required": true; "isSignal": true; }; "pathAppLogo": { "alias": "pathAppLogo"; "required": false; "isSignal": true; }; "hasSideMenu": { "alias": "hasSideMenu"; "required": false; "isSignal": true; }; "centralDescription": { "alias": "centralDescription"; "required": false; "isSignal": true; }; }, { "evtToggleMenu": "evtToggleMenu"; }, never, never, true, never>;
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
declare class UniItemFieldWithHightContrast {
|