uni-app-fe 0.1.11 → 0.1.13

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.
@@ -91,7 +91,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
91
91
  }] });
92
92
 
93
93
  class GetDataPipe {
94
- transform(error) {
94
+ transform(value) {
95
+ const error = value.error;
95
96
  switch (error.type) {
96
97
  case 'fe': {
97
98
  return {
@@ -104,7 +105,7 @@ class GetDataPipe {
104
105
  }
105
106
  case 'network': {
106
107
  return {
107
- title: error.id,
108
+ title: value.id,
108
109
  message: error.exception.message,
109
110
  icon: faWifi,
110
111
  httpStatus: '-', // 0
@@ -124,7 +125,7 @@ class GetDataPipe {
124
125
  }
125
126
  }
126
127
  return {
127
- title: error.id,
128
+ title: value.id,
128
129
  message: displayMessage,
129
130
  icon: faComputer,
130
131
  httpStatus: (error.httpStatus > 0 ? error.httpStatus : '-').toString(),
@@ -133,7 +134,7 @@ class GetDataPipe {
133
134
  }
134
135
  case 'be': {
135
136
  return {
136
- title: error.id,
137
+ title: value.id,
137
138
  message: error.exception.message,
138
139
  icon: faServer,
139
140
  httpStatus: (error.httpStatus > 0 ? error.httpStatus : '-').toString(),
@@ -178,10 +179,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
178
179
  class UniDialogError {
179
180
  constructor() {
180
181
  /* Input */
181
- this.errors = input.required(...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
182
- this.errorsWithStatus = linkedSignal({ ...(ngDevMode ? { debugName: "errorsWithStatus" } : /* istanbul ignore next */ {}), source: this.errors,
182
+ this.storeItems = input.required(...(ngDevMode ? [{ debugName: "storeItems" }] : /* istanbul ignore next */ []));
183
+ this.storeItemsWithStatus = linkedSignal({ ...(ngDevMode ? { debugName: "storeItemsWithStatus" } : /* istanbul ignore next */ {}), source: this.storeItems,
183
184
  computation: (newErrors, prev) => {
184
- return newErrors.map((x) => {
185
+ return newErrors
186
+ .map((x) => {
185
187
  // Se l'errore esisteva già, restituisce l'oggetto vecchio
186
188
  const existing = prev?.value.find((old) => old.id === x.id);
187
189
  if (existing) {
@@ -192,6 +194,11 @@ class UniDialogError {
192
194
  // Se è un errore nuovo, crea l'oggetto con i flag di default
193
195
  const newItem = { ...x, isOpen: false, isCopied: false, isSaved: false };
194
196
  return newItem;
197
+ })
198
+ .toSorted((a, b) => {
199
+ const timeA = a.historyItems?.at(-1)?.timestamp ?? 0;
200
+ const timeB = b.historyItems?.at(-1)?.timestamp ?? 0;
201
+ return timeB - timeA;
195
202
  });
196
203
  } });
197
204
  /* Variables */
@@ -248,7 +255,7 @@ class UniDialogError {
248
255
  UniErrorManager.removeAll();
249
256
  }
250
257
  onToggleIsOpen(id) {
251
- this.errorsWithStatus.update((x) => x.map((y) => {
258
+ this.storeItemsWithStatus.update((x) => x.map((y) => {
252
259
  if (y.id === id)
253
260
  y.isOpen = !y.isOpen;
254
261
  return y;
@@ -259,35 +266,35 @@ class UniDialogError {
259
266
  }
260
267
  async onCopyAll(id) {
261
268
  /* Recupero errore */
262
- const currentError = this.errorsWithStatus().find((e) => e.id === id);
269
+ const currentError = this.storeItemsWithStatus().find((e) => e.id === id);
263
270
  if (!currentError)
264
271
  return;
265
272
  /* Azione */
266
273
  await this.copy(JSON.stringify(currentError, null, 2), 'ErrorCopied');
267
274
  /* Aggiornamento datasource */
268
- this.errorsWithStatus.update((list) => list.map((err) => ({ ...err, isCopied: err.id === id })));
275
+ this.storeItemsWithStatus.update((list) => list.map((err) => ({ ...err, isCopied: err.id === id })));
269
276
  }
270
277
  onSave(id) {
271
278
  /* Recupero errore */
272
- const currentError = this.errorsWithStatus().find((e) => e.id === id);
279
+ const currentError = this.storeItemsWithStatus().find((e) => e.id === id);
273
280
  if (!currentError)
274
281
  return;
275
282
  /* Azione */
276
283
  const log = {
277
284
  id: -1,
278
285
  severity: 'error',
279
- module: currentError.type,
280
- timestamp: currentError.timestamp,
286
+ module: currentError.error.type,
287
+ timestamp: currentError.historyItems.at(-1).timestamp,
281
288
  ref: currentError.id,
282
- exceptionFunctionName: currentError.exception.functionName,
283
- exceptionType: currentError.exception.type,
284
- exceptionMessage: currentError.exception.message,
285
- exceptionStackTrace: currentError.exception.stackTrace,
286
- exceptionStackTraceFrames: currentError.exception.stackTraceFrames,
289
+ exceptionFunctionName: currentError.error.exception.functionName,
290
+ exceptionType: currentError.error.exception.type,
291
+ exceptionMessage: currentError.error.exception.message,
292
+ exceptionStackTrace: currentError.error.exception.stackTrace,
293
+ exceptionStackTraceFrames: currentError.error.exception.stackTraceFrames,
287
294
  };
288
295
  /* Api */
289
296
  UniHttpManager.create$({ ref: 'Log', path: '/Log/AddFeLog', hasToast: false }, log).subscribe(() => {
290
- this.errorsWithStatus.update((list) => list.map((err) => {
297
+ this.storeItemsWithStatus.update((list) => list.map((err) => {
291
298
  if (err.id === id)
292
299
  err.isSaved = true;
293
300
  return err;
@@ -303,7 +310,7 @@ class UniDialogError {
303
310
  this.showToast('ErrorRemoved');
304
311
  }
305
312
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniDialogError, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
306
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniDialogError, isStandalone: true, selector: "uni-dialog-error", inputs: { errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div\r\n class=\"relative flex h-full w-full flex-col gap-6 overflow-hidden rounded-4xl border border-rose-800/25 bg-linear-to-tr from-rose-500/10 via-rose-900/20 to-rose-500/5 p-6 text-left shadow-[0_50px_100px_-20px_rgba(0,0,0,0.7),inset_0_1px_0_rgba(255,255,255,0.15)] backdrop-blur-3xl\">\r\n <div\r\n class=\"pointer-events-none absolute -top-40 -left-40 size-96 animate-pulse rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n <div\r\n class=\"pointer-events-none absolute -right-40 -bottom-40 size-96 rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n\r\n <!-- Titolo -->\r\n <header class=\"flex items-center justify-between gap-4 border-b border-rose-400/25 pb-5\">\r\n <!-- Titolo: led -->\r\n <span class=\"relative flex size-3\">\r\n <span\r\n class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-rose-400 opacity-40\"></span>\r\n <span\r\n class=\"relative inline-flex size-3 rounded-full bg-linear-to-tr from-rose-500 to-rose-300 shadow-[0_0_20px_rgba(244,63,94,0.8)]\"></span>\r\n </span>\r\n\r\n <!-- Titolo: scritta -->\r\n <div class=\"flex flex-1 flex-col\">\r\n <h1 class=\"text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n </div>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"rounded-xl border border-white/7.5 bg-white/5 px-3 py-1.5 font-mono text-xs font-semibold tracking-wider text-neutral-200\">\r\n {{ 'Total' | translate }}: {{ errors().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"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 (error of errorsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let errorData = error | get_data;\r\n <li\r\n class=\"group squircle flex w-full flex-col overflow-hidden rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': error.isOpen }\">\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Titolo -->\r\n <div class=\"flex items-center justify-between gap-4\">\r\n <!-- Titolo: reference -->\r\n <div class=\"flex items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': error.isOpen }\"\r\n [title]=\"(error.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(error.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ errorData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Titolo: type -->\r\n <div\r\n class=\"flex items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(error.type === 'network' || error.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"errorData.icon\" [title]=\"error.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ error.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: error.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: error.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(error.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(error.type === 'be' || error.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: error.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: error.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(error.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 = [...error.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 = error.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: error.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: error.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: error.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: `${error.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: error.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 }} ({{ error.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: error.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: error.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: error.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: error.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(error.isOpen) { @if((error.type === 'be' || error.type === 'server') &&\r\n error.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: error.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: error.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: error.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\"> {{ errorData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-neutral-300\">\r\n {{ error.timestamp | date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ error.count }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"flex scale-95 items-center justify-end gap-2 opacity-0 transition duration-300 group-hover:scale-100 group-hover:opacity-100\">\r\n <dx-button\r\n class=\"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]=\"error.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isCopied\"\r\n (click)=\"onCopyAll(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"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]=\"error.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isSaved\"\r\n (click)=\"onSave(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"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(error.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">\u2713</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n", styles: [":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 }); }
313
+ 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 }}: {{ storeItemsWithStatus().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 storeItemsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let error = storeItem.error; @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\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ 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(error.type === 'network' || error.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]=\"error.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ error.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: error.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: error.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(error.type === 'be' || error.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: error.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: error.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(error.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 = [...error.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 = error.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: error.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: error.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: error.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: `${error.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: error.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 }} ({{ error.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: error.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: error.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: error.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: error.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((error.type === 'be' || error.type === 'server') &&\r\n error.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: error.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: error.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: error.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 }); }
307
314
  }
308
315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniDialogError, decorators: [{
309
316
  type: Component,
@@ -319,8 +326,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
319
326
  GetBodyAsyncPipe,
320
327
  UniParsePipe,
321
328
  UniUrlPipe,
322
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n class=\"relative flex h-full w-full flex-col gap-6 overflow-hidden rounded-4xl border border-rose-800/25 bg-linear-to-tr from-rose-500/10 via-rose-900/20 to-rose-500/5 p-6 text-left shadow-[0_50px_100px_-20px_rgba(0,0,0,0.7),inset_0_1px_0_rgba(255,255,255,0.15)] backdrop-blur-3xl\">\r\n <div\r\n class=\"pointer-events-none absolute -top-40 -left-40 size-96 animate-pulse rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n <div\r\n class=\"pointer-events-none absolute -right-40 -bottom-40 size-96 rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n\r\n <!-- Titolo -->\r\n <header class=\"flex items-center justify-between gap-4 border-b border-rose-400/25 pb-5\">\r\n <!-- Titolo: led -->\r\n <span class=\"relative flex size-3\">\r\n <span\r\n class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-rose-400 opacity-40\"></span>\r\n <span\r\n class=\"relative inline-flex size-3 rounded-full bg-linear-to-tr from-rose-500 to-rose-300 shadow-[0_0_20px_rgba(244,63,94,0.8)]\"></span>\r\n </span>\r\n\r\n <!-- Titolo: scritta -->\r\n <div class=\"flex flex-1 flex-col\">\r\n <h1 class=\"text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n </div>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"rounded-xl border border-white/7.5 bg-white/5 px-3 py-1.5 font-mono text-xs font-semibold tracking-wider text-neutral-200\">\r\n {{ 'Total' | translate }}: {{ errors().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"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 (error of errorsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let errorData = error | get_data;\r\n <li\r\n class=\"group squircle flex w-full flex-col overflow-hidden rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': error.isOpen }\">\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Titolo -->\r\n <div class=\"flex items-center justify-between gap-4\">\r\n <!-- Titolo: reference -->\r\n <div class=\"flex items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': error.isOpen }\"\r\n [title]=\"(error.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(error.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ errorData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Titolo: type -->\r\n <div\r\n class=\"flex items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(error.type === 'network' || error.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"errorData.icon\" [title]=\"error.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ error.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: error.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: error.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(error.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(error.type === 'be' || error.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: error.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: error.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(error.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 = [...error.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 = error.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: error.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: error.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: error.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: `${error.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: error.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 }} ({{ error.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: error.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: error.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: error.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: error.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(error.isOpen) { @if((error.type === 'be' || error.type === 'server') &&\r\n error.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: error.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: error.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: error.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\"> {{ errorData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-neutral-300\">\r\n {{ error.timestamp | date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ error.count }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"flex scale-95 items-center justify-end gap-2 opacity-0 transition duration-300 group-hover:scale-100 group-hover:opacity-100\">\r\n <dx-button\r\n class=\"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]=\"error.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isCopied\"\r\n (click)=\"onCopyAll(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"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]=\"error.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isSaved\"\r\n (click)=\"onSave(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"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(error.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">\u2713</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{display:block;height:min(700px,80%);max-height:80%;width:min(1000px,60%);max-width:80%}\n"] }]
323
- }], propDecorators: { errors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: true }] }] } });
329
+ ], 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 }}: {{ storeItemsWithStatus().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 storeItemsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let error = storeItem.error; @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\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ 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(error.type === 'network' || error.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]=\"error.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ error.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: error.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: error.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(error.type === 'be' || error.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: error.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: error.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(error.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 = [...error.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 = error.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: error.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: error.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: error.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: `${error.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: error.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 }} ({{ error.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: error.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: error.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: error.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: error.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((error.type === 'be' || error.type === 'server') &&\r\n error.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: error.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: error.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: error.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"] }]
330
+ }], propDecorators: { storeItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "storeItems", required: true }] }] } });
324
331
 
325
332
  class UniHeader {
326
333
  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 { IUniFeError, IUniHttpError } from 'uni-model-type/type';\n\ninterface ErrorDataByType {\n title: string;\n message: string;\n icon: IconDefinition;\n httpStatus: string;\n functionName: string;\n}\n\n@Pipe({\n name: 'get_data',\n})\nexport class GetDataPipe implements PipeTransform {\n transform(error: { id: string } & (IUniFeError | IUniHttpError)): ErrorDataByType {\n switch (error.type) {\n case 'fe': {\n return {\n title: `${error.exception.functionName}()`,\n message: error.exception.message,\n icon: faDesktop,\n httpStatus: '-', // non presente\n functionName: `${error.exception.functionName}()`,\n };\n }\n case 'network': {\n return {\n title: error.id,\n message: error.exception.message,\n icon: faWifi,\n httpStatus: '-', // 0\n functionName: `${error.exception.functionName}()`,\n };\n }\n case 'server': {\n let displayMessage = error.exception.message;\n\n // Verifica se il message è un json\n if (\n displayMessage &&\n (displayMessage.codePointAt(0) === 123 || displayMessage.codePointAt(0) === 91)\n ) {\n try {\n displayMessage = JSON.stringify(JSON.parse(displayMessage), null, 2);\n } catch {\n // Fallback silenzioso: se il parsing fallisce viene tenuta la stringa originale\n }\n }\n\n return {\n title: error.id,\n message: displayMessage,\n icon: faComputer,\n httpStatus: (error.httpStatus > 0 ? error.httpStatus : '-').toString(),\n functionName: `${error.exception.functionName}()`,\n };\n }\n case 'be': {\n return {\n title: error.id,\n message: error.exception.message,\n icon: faServer,\n httpStatus: (error.httpStatus > 0 ? error.httpStatus : '-').toString(),\n functionName: error.exception.functionName,\n };\n }\n }\n }\n}\n\n","/* eslint-disable @typescript-eslint/no-explicit-any */\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 { FeLog, IUniFeError, IUniHttpError } from 'uni-model-type/type';\r\n\r\nimport { GetBodyAsyncPipe } from './get-body-async.pipe';\r\nimport { GetDataPipe } from './get-data.pipe';\r\nimport { UniDialogErrorArticle } from './uni-dialog-error-article/uni-dialog-error-article';\r\n\r\ntype UError = { id: string } & (IUniFeError | IUniHttpError);\r\ntype UErrorWithStatus = UError & { isOpen: boolean; isCopied: boolean; isSaved: boolean };\r\n\r\n@Component({\r\n selector: 'uni-dialog-error',\r\n imports: [\r\n CommonModule,\r\n DxButtonModule,\r\n DxTooltipModule,\r\n FaIconComponent,\r\n 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 errors = input.required<UError[]>();\r\n errorsWithStatus = linkedSignal({\r\n source: this.errors,\r\n computation: (newErrors, prev: { value: UErrorWithStatus[] } | undefined) => {\r\n return newErrors.map((x) => {\r\n // Se l'errore esisteva già, restituisce l'oggetto vecchio\r\n const existing = prev?.value.find((old) => old.id === x.id);\r\n if (existing) {\r\n existing.isCopied = false;\r\n existing.isSaved = false;\r\n return existing;\r\n }\r\n\r\n // Se è un errore nuovo, crea l'oggetto con i flag di default\r\n const newItem = { ...x, isOpen: false, isCopied: false, isSaved: false };\r\n\r\n return newItem;\r\n });\r\n },\r\n });\r\n\r\n /* Variables */\r\n toast = signal<{ timeoutId: number; label: string } | null>(null);\r\n\r\n /* Icons */\r\n readonly ICON_FE = faDesktop;\r\n readonly ICON_TIMER = faClock;\r\n readonly ICON_COUNT = faInbox;\r\n readonly ICON_INFO = faCircleInfo;\r\n readonly ICON_COPY = faCopy;\r\n\r\n /* ------------------ Methods ------------------ */\r\n onCloseDialog(): void {\r\n UniErrorManager.removeAll();\r\n }\r\n\r\n onToggleIsOpen(id: string): void {\r\n this.errorsWithStatus.update((x) =>\r\n x.map((y) => {\r\n if (y.id === id) y.isOpen = !y.isOpen;\r\n return y;\r\n }),\r\n );\r\n }\r\n\r\n async onCopy(value: any): Promise<void> {\r\n await this.copy(value, 'ValueCopied');\r\n }\r\n\r\n async onCopyAll(id: string): Promise<void> {\r\n /* Recupero errore */\r\n const currentError = this.errorsWithStatus().find((e) => e.id === id);\r\n if (!currentError) return;\r\n\r\n /* Azione */\r\n await this.copy(JSON.stringify(currentError, null, 2), 'ErrorCopied');\r\n\r\n /* Aggiornamento datasource */\r\n this.errorsWithStatus.update((list) =>\r\n list.map((err) => ({ ...err, isCopied: err.id === id })),\r\n );\r\n }\r\n\r\n onSave(id: string): void {\r\n /* Recupero errore */\r\n const currentError = this.errorsWithStatus().find((e) => e.id === id);\r\n if (!currentError) return;\r\n\r\n /* Azione */\r\n const log: FeLog = {\r\n id: -1,\r\n severity: 'error',\r\n module: currentError.type,\r\n timestamp: currentError.timestamp,\r\n ref: currentError.id,\r\n exceptionFunctionName: currentError.exception.functionName,\r\n exceptionType: currentError.exception.type,\r\n exceptionMessage: currentError.exception.message,\r\n exceptionStackTrace: currentError.exception.stackTrace,\r\n exceptionStackTraceFrames: currentError.exception.stackTraceFrames,\r\n };\r\n\r\n /* Api */\r\n UniHttpManager.create$({ ref: 'Log', path: '/Log/AddFeLog', hasToast: false }, log).subscribe(\r\n () => {\r\n this.errorsWithStatus.update((list) =>\r\n list.map((err) => {\r\n if (err.id === id) err.isSaved = true;\r\n return err;\r\n }),\r\n );\r\n\r\n /* Toast */\r\n this.showToast('ErrorSaved');\r\n },\r\n );\r\n }\r\n\r\n onDelete(id: string): void {\r\n /* Azione */\r\n UniErrorManager.remove(id);\r\n\r\n /* Toast */\r\n this.showToast('ErrorRemoved');\r\n }\r\n\r\n /* ------------------ Methods: utils ------------------ */\r\n private showToast = (label: string) => {\r\n /* Reset vecchio timeout (se ancora in corso) */\r\n if (this.toast()?.timeoutId) {\r\n clearTimeout(this.toast()!.timeoutId);\r\n }\r\n\r\n /* Reset vecchio toast (se ancora in corso) */\r\n this.toast.set(null);\r\n\r\n /* Piccolo timeout cosi da evidenziare un nuovo toast (se presente ancora un toast in corso) */\r\n setTimeout(() => {\r\n /* Nascosto toast dopo x tempo */\r\n const timeoutId = setTimeout(() => this.toast.set(null), 2000);\r\n\r\n /* Mostrato toast */\r\n this.toast.set({ timeoutId, label });\r\n }, 100);\r\n };\r\n\r\n private copy = async (value: any, lblToast: string) => {\r\n let valueFormatted = '';\r\n try {\r\n // Se è una stringa si prova a convertirla in oggetto JSON\r\n if (typeof valueFormatted === 'string') {\r\n try {\r\n valueFormatted = JSON.parse(value);\r\n } catch {\r\n 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 }}: {{ errors().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 (error of errorsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let errorData = error | get_data;\r\n <li\r\n class=\"group squircle flex w-full flex-col overflow-hidden rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': error.isOpen }\">\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Titolo -->\r\n <div class=\"flex items-center justify-between gap-4\">\r\n <!-- Titolo: reference -->\r\n <div class=\"flex items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': error.isOpen }\"\r\n [title]=\"(error.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(error.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ errorData.title }}\r\n </span>\r\n </div>\r\n\r\n <!-- Titolo: type -->\r\n <div\r\n class=\"flex items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white\">\r\n @if(error.type === 'network' || error.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"errorData.icon\" [title]=\"error.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ error.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: error.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: error.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(error.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(error.type === 'be' || error.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: error.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: error.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(error.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 = [...error.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 = error.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: error.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: error.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: error.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: `${error.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: error.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 }} ({{ error.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: error.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: error.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: error.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: error.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(error.isOpen) { @if((error.type === 'be' || error.type === 'server') &&\r\n error.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: error.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: error.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: error.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\"> {{ errorData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-neutral-300\">\r\n {{ error.timestamp | date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex min-w-22 items-center gap-2 font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ error.count }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"flex scale-95 items-center justify-end gap-2 opacity-0 transition duration-300 group-hover:scale-100 group-hover:opacity-100\">\r\n <dx-button\r\n class=\"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]=\"error.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isCopied\"\r\n (click)=\"onCopyAll(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"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]=\"error.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"error.isSaved\"\r\n (click)=\"onSave(error.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"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(error.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">✓</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n","import { NgOptimizedImage } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\r\nimport { DxButtonModule } from 'devextreme-angular/ui/button';\r\n\r\n@Component({\r\n selector: 'uni-header',\r\n standalone: true,\r\n imports: [DxButtonModule, NgOptimizedImage],\r\n templateUrl: './uni-header.html',\r\n styleUrls: ['./uni-header.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniHeader {\r\n /* Input */\r\n title = input.required<string>();\r\n version = input.required<string>();\r\n pathBrandLogo = input.required<string>();\r\n pathAppLogo = input<string>();\r\n sideMenu = input<boolean>(false);\r\n\r\n /* Output */\r\n evtToggleMenu = output<true>();\r\n}\r\n","<div\r\n class=\"dark:bg-theme-dark-800 flex h-16 items-center gap-4 overflow-hidden rounded-xl bg-blue-300 px-4 py-3 text-white\">\r\n <!-- App logo -->\r\n @if (pathAppLogo(); as pathAppLogo) {\r\n <img\r\n [ngSrc]=\"pathAppLogo\"\r\n width=\"40\"\r\n height=\"40\"\r\n priority\r\n class=\"aspect-square h-full w-auto\"\r\n alt=\"App logo\" />\r\n }\r\n\r\n <!-- Info -->\r\n <div class=\"flex flex-1 flex-col overflow-hidden\">\r\n <p class=\"truncate text-xl font-semibold uppercase leading-tight\">{{ title() }}</p>\r\n <p class=\"text-xs opacity-75\">{{ version() }}</p>\r\n </div>\r\n\r\n <div class=\"flex h-full items-center gap-2\">\r\n <!-- Brand Logo -->\r\n <div class=\"2xs:block relative hidden h-full w-24\">\r\n <img\r\n [ngSrc]=\"pathBrandLogo()\"\r\n fill\r\n priority\r\n class=\"object-contain object-right\"\r\n alt=\"Brand logo\" />\r\n </div>\r\n\r\n <!-- Button menu -->\r\n @if (sideMenu()) {\r\n <dx-button class=\"shadow-none!\" [icon]=\"'menu'\" (onClick)=\"evtToggleMenu.emit(true)\">\r\n </dx-button>\r\n }\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\n\r\n@Component({\r\n selector: 'uni-item-field-with-hight-contrast',\r\n imports: [DxTooltipModule, UniTranslatePipe],\r\n templateUrl: './uni-item-field-with-hight-contrast.html',\r\n styleUrl: './uni-item-field-with-hight-contrast.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniItemFieldWithHightContrast {\r\n /* Input */\r\n label = input.required<string>();\r\n value = input.required<string | number | null | undefined>();\r\n}\r\n","<div class=\"flex flex-col items-start\">\r\n <span class=\"max-w-full min-w-0 truncate text-lg text-nowrap text-gray-500 dark:text-gray-300\">\r\n {{ label() | translate }}\r\n </span>\r\n <span #tooltipTarget class=\"max-w-full min-w-0 cursor-help truncate text-3xl font-semibold\">\r\n {{ value() || '-' }}\r\n </span>\r\n</div>\r\n\r\n<dx-tooltip\r\n [target]=\"tooltipTarget\"\r\n showEvent=\"mouseenter\"\r\n hideEvent=\"mouseleave\"\r\n [hideOnOutsideClick]=\"false\">\r\n <div *dxTemplate=\"let data = data; of: 'content'\">{{ value() || '-' }}</div>\r\n</dx-tooltip>\r\n","import { CommonModule, DatePipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\nimport { UniToastManager } from 'uni-manager/toast';\r\n\r\n@Component({\r\n selector: 'uni-item-field',\r\n imports: [CommonModule, DxTooltipModule, UniTranslatePipe],\r\n providers: [DatePipe],\r\n templateUrl: './uni-item-field.html',\r\n styleUrl: './uni-item-field.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniItemField {\r\n /* Pipe */\r\n readonly datePipe = inject(DatePipe);\r\n\r\n /* Input */\r\n label = input.required<string>();\r\n value = input.required<string | number | Date | null | undefined>();\r\n udm = input<string>();\r\n dateFormat = input<'short' | 'medium' | 'shortDate' | 'mediumDate' | 'longDate' | 'fullDate'>(\r\n 'longDate',\r\n );\r\n\r\n /* Variable */\r\n valueFormatted = computed(() => {\r\n const value = this.value();\r\n if (!value) return '';\r\n\r\n if (\r\n (value instanceof Date && !Number.isNaN(value.getTime())) ||\r\n (typeof value === 'string' && this.isValidDateString(value))\r\n ) {\r\n return this.datePipe.transform(new Date(value), this.dateFormat());\r\n }\r\n return `${value}${this.udm() ?? ''}`;\r\n });\r\n\r\n /* ---------------- Methods: event ---------------- */\r\n async onCopyValue(): Promise<void> {\r\n const value = this.valueFormatted();\r\n if (!value) return;\r\n\r\n // Controllo se l'API è disponibile e il contesto è sicuro (HTTPS/Localhost)\r\n if (navigator.clipboard && globalThis.isSecureContext) {\r\n await navigator.clipboard.writeText(value);\r\n UniToastManager.show({ label: 'ValueCopied' });\r\n }\r\n }\r\n\r\n /* ---------------- Methods: utils ---------------- */\r\n private isValidDateString(value: unknown): value is string {\r\n if (typeof value !== 'string') return false;\r\n\r\n // ISO 8601 (con o senza timezone)\r\n const isoRegex =\r\n /^\\d{4}-\\d{2}-\\d{2}(?:[T ]\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})?)?$/;\r\n\r\n if (!isoRegex.test(value)) return false;\r\n\r\n const date = new Date(value);\r\n return !Number.isNaN(date.getTime());\r\n }\r\n}\r\n","<li class=\"flex items-center gap-2 text-sm!\">\r\n <span class=\"text-nowrap text-gray-500 dark:text-gray-300\"> {{ label() | translate }}: </span>\r\n <span\r\n #tooltipTarget\r\n [ngClass]=\"{'text-gray-500/50 dark:text-gray-300/50': !valueFormatted() }\"\r\n class=\"max-w-full min-w-0 cursor-help truncate font-semibold transition duration-100 ease-in-out hover:opacity-75 active:scale-95\"\r\n (click)=\"onCopyValue()\">\r\n {{ valueFormatted() || '-' }}\r\n </span>\r\n</li>\r\n\r\n<dx-tooltip\r\n [target]=\"tooltipTarget\"\r\n showEvent=\"mouseenter\"\r\n hideEvent=\"mouseleave\"\r\n [hideOnOutsideClick]=\"false\">\r\n <div *dxTemplate=\"let data = data; of: 'content'\">{{ valueFormatted() || '-' }}</div>\r\n</dx-tooltip>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { faCircleInfo } from '@fortawesome/free-solid-svg-icons';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\n\r\nimport { UniItemField } from '../uni-item-field/uni-item-field';\r\n\r\n@Component({\r\n selector: 'uni-item-field-with-lens-tooltip',\r\n imports: [DxTooltipModule, FaIconComponent, UniItemField],\r\n templateUrl: './uni-item-field-with-lens-tooltip.html',\r\n styleUrl: './uni-item-field-with-lens-tooltip.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniItemFieldWithLensTooltip {\r\n /* Input */\r\n id = input.required<string>();\r\n label = input.required<string>();\r\n value = input.required<string | number | Date | null | undefined>();\r\n\r\n /* Icon */\r\n readonly ICON_INFO = faCircleInfo;\r\n}\r\n","<div class=\"flex items-center gap-1\">\r\n <uni-item-field [label]=\"label()\" [value]=\"value()\" />\r\n\r\n <div #tooltipInfoTarget>\r\n <fa-icon\r\n class=\"text-theme-200 cursor-help rounded px-1 text-xs! transition duration-150 ease-in-out hover:opacity-75\"\r\n [icon]=\"ICON_INFO\">\r\n </fa-icon>\r\n </div>\r\n\r\n <dx-tooltip\r\n [target]=\"tooltipInfoTarget\"\r\n showEvent=\"mouseenter\"\r\n hideEvent=\"mouseleave\"\r\n [hideOnOutsideClick]=\"false\">\r\n <div *dxTemplate=\"let data = data; of: 'content'\">\r\n <ng-content></ng-content>\r\n </div>\r\n </dx-tooltip>\r\n</div>\r\n","export enum LedStatus {\r\n OK,\r\n WARNING,\r\n ERROR,\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\n\r\nimport { LedStatus } from './model';\r\n\r\n@Component({\r\n selector: 'uni-led',\r\n imports: [CommonModule],\r\n templateUrl: './uni-led.html',\r\n styleUrls: ['./uni-led.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniLed {\r\n /* Inputs */\r\n public description = input.required<string>();\r\n public status = input.required<LedStatus | boolean | null | undefined>();\r\n\r\n /* Enum */\r\n protected readonly LED_STATUS = LedStatus;\r\n}\r\n","<div class=\"flex items-center gap-1\">\r\n <div\r\n class=\"led\"\r\n [ngClass]=\"{\r\n ok: status() === true || status() === LED_STATUS.OK,\r\n warning: status() === LED_STATUS.WARNING,\r\n error: status() === false || status() === LED_STATUS.ERROR,\r\n }\"></div>\r\n <p class=\"truncate text-sm\">{{ description() }}</p>\r\n <ng-content></ng-content>\r\n</div>\r\n","import { CommonModule, NgOptimizedImage } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n inject,\r\n input,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { RouterLink, RouterLinkActive } from '@angular/router';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport {\r\n faArrowRightFromBracket,\r\n faArrowRightToBracket,\r\n faBell,\r\n faLanguage,\r\n faMoon,\r\n faSun,\r\n faUser,\r\n} from '@fortawesome/free-solid-svg-icons';\r\nimport { DxButtonModule } from 'devextreme-angular/ui/button';\r\nimport { DxSelectBoxModule } from 'devextreme-angular/ui/select-box';\r\nimport { DxSwitchModule } from 'devextreme-angular/ui/switch';\r\nimport { ValueChangedEvent as SelectBoxValueChangedEvent } from 'devextreme/ui/select_box_types';\r\nimport { ValueChangedEvent as SwitchValueChangedEvent } from 'devextreme/ui/switch_types';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\nimport { UniLoaderService } from 'uni-app-fe/service';\r\nimport { UniLocaleManager } from 'uni-manager/locale';\r\n\r\nimport { MenuInteraction, MenuItem } from './model';\r\n\r\n@Component({\r\n selector: 'uni-side-menu',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n RouterLink,\r\n RouterLinkActive,\r\n DxButtonModule,\r\n DxSelectBoxModule,\r\n DxSwitchModule,\r\n UniTranslatePipe,\r\n FaIconComponent,\r\n NgOptimizedImage,\r\n ],\r\n templateUrl: './uni-side-menu.html',\r\n styleUrls: ['./uni-side-menu.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniSideMenu {\r\n /* Service */\r\n readonly elementRef = inject(ElementRef);\r\n readonly uniLoader = inject(UniLoaderService);\r\n\r\n /* Input */\r\n readonly pathUnitecLogo = input.required<string>();\r\n readonly menuItems = input<MenuItem[]>([]);\r\n readonly menuInteractions = input<MenuInteraction[]>([]);\r\n\r\n /* Output */\r\n evtToggleMenu = output<false>();\r\n\r\n /* Variables */\r\n locale = UniLocaleManager.locale;\r\n localesSupported = UniLocaleManager.localesSupported;\r\n darkMode = signal<boolean>(\r\n !localStorage.getItem('uni-theme') || localStorage.getItem('uni-theme') === 'dark',\r\n );\r\n\r\n /* Icons */\r\n readonly ICON = {\r\n USER: faUser,\r\n LOGIN: faArrowRightToBracket,\r\n LOGOUT: faArrowRightFromBracket,\r\n LIGHT_MODE: faSun,\r\n DARK_MODE: faMoon,\r\n LANGUAGE: faLanguage,\r\n NOTIFICATION: faBell,\r\n };\r\n\r\n /* ---------------------- Host listener ---------------------- */\r\n @HostListener('document:click', ['$event'])\r\n protected onClickOutside(event: Event): void {\r\n const target = event.target as HTMLElement;\r\n\r\n // Controlla se il click è avvenuto dentro il menu principale\r\n const clickedInsideMenu = this.elementRef.nativeElement.contains(target);\r\n\r\n // Controlla se il click è avvenuto dentro un popup/dropdown aperto\r\n const clickedInsideOverlay = !!target.closest(\r\n '.dx-overlay-wrapper, .dx-dropdowneditor-overlay',\r\n );\r\n\r\n // Se il click è fuori da entrambi, allora chiude il menu\r\n if (!clickedInsideMenu && !clickedInsideOverlay) {\r\n this.evtToggleMenu.emit(false);\r\n }\r\n }\r\n\r\n /* ---------------------- Methods ---------------------- */\r\n updateTheme(e: SwitchValueChangedEvent): void {\r\n this.uniLoader.show();\r\n localStorage.setItem('uni-theme', e.value ? 'dark' : 'light');\r\n globalThis.location.reload();\r\n }\r\n\r\n updateLocale(e: SelectBoxValueChangedEvent): void {\r\n this.uniLoader.show();\r\n localStorage.setItem('uni-locale', e.value);\r\n globalThis.location.reload();\r\n }\r\n}\r\n","<aside\r\n class=\"dark:bg-theme-dark-800 dark:border-theme-dark-900 flex h-screen w-[80vw] max-w-75 flex-col gap-6 overflow-hidden rounded-l border-b-2 border-l-2 border-blue-400/33 bg-blue-300 p-4 shadow-2xl\">\r\n <!-- Header: User/Close -->\r\n <div class=\"flex h-8 w-full shrink-0 items-center\">\r\n <dx-button class=\"ml-auto rounded-full!\" [icon]=\"'close'\" (onClick)=\"evtToggleMenu.emit(false)\">\r\n </dx-button>\r\n </div>\r\n\r\n <div class=\"custom-scrollbar flex flex-1 flex-col overflow-x-hidden overflow-y-auto pr-1\">\r\n <!-- Sezione Menu Principale -->\r\n @if (menuItems().length) {\r\n <ul class=\"flex flex-col gap-1.5\">\r\n @for (item of menuItems(); track item.id) { @if (item.visible !== false) {\r\n <li>\r\n <a\r\n class=\"group flex h-12 items-center gap-3 rounded-lg px-3 text-white! transition-colors dark:text-gray-300!\"\r\n [ngClass]=\"{\r\n 'dark:hover:bg-theme-dark-700 hover:bg-blue-400': !item.badge && !item.disabled,\r\n 'hover:bg-red-500/50': item.badge && !item.disabled,\r\n 'pointer-events-none opacity-30 grayscale': item.disabled,\r\n }\"\r\n [routerLink]=\"item.disabled ? null : item.path\"\r\n [routerLinkActive]=\"item.badge ?\r\n 'bg-red-500/60 *:text-white! *:font-semibold!' :\r\n 'bg-blue-400/75 dark:bg-theme-dark-700 *:text-white! *:font-semibold!'\r\n \"\r\n (click)=\"evtToggleMenu.emit(false)\">\r\n <fa-icon [icon]=\"item.icon\" class=\"w-6 text-center text-lg\"></fa-icon>\r\n <span class=\"flex-1 truncate font-medium\">{{ item.label }}</span>\r\n @if (item.badge) {\r\n <div\r\n class=\"flex size-6 animate-pulse items-center justify-center rounded bg-red-500 shadow-lg\">\r\n <fa-icon class=\"text-xs\" [icon]=\"ICON.NOTIFICATION\"></fa-icon>\r\n </div>\r\n }\r\n </a>\r\n </li>\r\n } }\r\n </ul>\r\n }\r\n\r\n <!-- Sezione Interazioni Dinamiche -->\r\n @if (menuInteractions().length) {\r\n <hr class=\"dark:border-theme-dark-900 my-6 border-blue-400/30\" />\r\n <ul class=\"flex flex-col gap-2 text-white\">\r\n @for (item of menuInteractions(); track item.id) { @if (item.data.type === 'button') {\r\n <li>\r\n <button\r\n type=\"button\"\r\n class=\"flex h-12 w-full items-center gap-3 rounded-lg px-3 transition-all active:scale-95\"\r\n [class]=\"item.class\"\r\n (click)=\"item.data.onClick()\">\r\n <fa-icon class=\"w-6\" [icon]=\"item.data.icon\"></fa-icon>\r\n <span class=\"flex-1 truncate text-left font-medium\">{{ item.label }}</span>\r\n </button>\r\n </li>\r\n } @else if (item.data.type === 'select') {\r\n <li\r\n class=\"dark:bg-theme-dark-700 flex flex-col gap-1 rounded-lg bg-blue-400/75 p-3 shadow-sm\">\r\n <span class=\"text-xs font-bold uppercase opacity-60\">{{ item.label }}</span>\r\n <dx-select-box\r\n class=\"w-full\"\r\n valueExpr=\"id\"\r\n displayExpr=\"description\"\r\n [items]=\"item.data.combos\"\r\n [value]=\"item.data.value\"\r\n stylingMode=\"underlined\"\r\n (onValueChanged)=\"item.data.onValueChanged($event)\">\r\n </dx-select-box>\r\n </li>\r\n } }\r\n </ul>\r\n }\r\n\r\n <!-- Settings Statici -->\r\n <hr class=\"dark:border-theme-dark-900 my-6 border-blue-400/30\" />\r\n <div class=\"flex flex-col gap-3\">\r\n <div\r\n class=\"dark:bg-theme-dark-700 flex h-14 items-center justify-between rounded-lg bg-blue-400/75 px-4 text-white shadow-sm\">\r\n <div class=\"flex items-center gap-3\">\r\n <fa-icon [icon]=\"darkMode() ? ICON.DARK_MODE : ICON.LIGHT_MODE\"></fa-icon>\r\n <span class=\"truncate\">{{ 'DarkMode' | translate }}</span>\r\n </div>\r\n <dx-switch [value]=\"darkMode()\" (onValueChanged)=\"updateTheme($event)\"></dx-switch>\r\n </div>\r\n\r\n <div\r\n class=\"dark:bg-theme-dark-700 flex h-14 items-center justify-between rounded-lg bg-blue-400/75 px-4 text-white shadow-sm\">\r\n <div class=\"flex items-center gap-3\">\r\n <fa-icon [icon]=\"ICON.LANGUAGE\"></fa-icon>\r\n <span class=\"truncate\">{{ 'Language' | translate }}</span>\r\n </div>\r\n <dx-select-box\r\n class=\"w-24\"\r\n [items]=\"localesSupported\"\r\n [value]=\"locale\"\r\n stylingMode=\"underlined\"\r\n (onValueChanged)=\"updateLocale($event)\">\r\n </dx-select-box>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer Logo -->\r\n <div class=\"mt-auto border-t border-white/20 pt-4\">\r\n <img\r\n class=\"ml-auto opacity-90 transition-opacity hover:opacity-100\"\r\n [ngSrc]=\"pathUnitecLogo()\"\r\n priority\r\n alt=\"Brand logo\"\r\n height=\"32\"\r\n width=\"88\" />\r\n </div>\r\n</aside>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i1"],"mappings":"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"}
1
+ {"version":3,"file":"uni-app-fe-component.mjs","sources":["../../../projects/uni-app-fe/component/uni-banner-alert/uni-banner-alert.ts","../../../projects/uni-app-fe/component/uni-banner-alert/uni-banner-alert.html","../../../projects/uni-app-fe/component/uni-dialog-error/get-body-async.pipe.ts","../../../projects/uni-app-fe/component/uni-dialog-error/get-data.pipe.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error-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.error;\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\ntype UErrorStore = { id: string } & ErrorStore;\r\ntype UErrorStoreWithStatus = UErrorStore & { isOpen: boolean; isCopied: boolean; isSaved: boolean };\r\n\r\n@Component({\r\n selector: 'uni-dialog-error',\r\n imports: [\r\n CommonModule,\r\n DxButtonModule,\r\n DxTooltipModule,\r\n FaIconComponent,\r\n 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<UErrorStore[]>();\r\n storeItemsWithStatus = linkedSignal({\r\n source: this.storeItems,\r\n computation: (newErrors, prev: { value: UErrorStoreWithStatus[] } | undefined) => {\r\n return newErrors\r\n .map((x) => {\r\n // Se l'errore esisteva già, restituisce l'oggetto vecchio\r\n const existing = prev?.value.find((old) => old.id === x.id);\r\n if (existing) {\r\n existing.isCopied = false;\r\n existing.isSaved = false;\r\n return existing;\r\n }\r\n\r\n // Se è un errore nuovo, crea l'oggetto con i flag di default\r\n const newItem = { ...x, isOpen: false, isCopied: false, isSaved: false };\r\n\r\n return newItem;\r\n })\r\n .toSorted((a, b) => {\r\n const timeA = a.historyItems?.at(-1)?.timestamp ?? 0;\r\n const timeB = b.historyItems?.at(-1)?.timestamp ?? 0;\r\n return timeB - timeA;\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.storeItemsWithStatus.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.storeItemsWithStatus().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.storeItemsWithStatus.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.storeItemsWithStatus().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.error.type,\r\n timestamp: currentError.historyItems.at(-1)!.timestamp,\r\n ref: currentError.id,\r\n exceptionFunctionName: currentError.error.exception.functionName,\r\n exceptionType: currentError.error.exception.type,\r\n exceptionMessage: currentError.error.exception.message,\r\n exceptionStackTrace: currentError.error.exception.stackTrace,\r\n exceptionStackTraceFrames: currentError.error.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.storeItemsWithStatus.update((list) =>\r\n list.map((err) => {\r\n if (err.id === id) err.isSaved = true;\r\n return err;\r\n }),\r\n );\r\n\r\n /* Toast */\r\n this.showToast('ErrorSaved');\r\n },\r\n );\r\n }\r\n\r\n onDelete(id: string): void {\r\n /* Azione */\r\n UniErrorManager.remove(id);\r\n\r\n /* Toast */\r\n this.showToast('ErrorRemoved');\r\n }\r\n\r\n /* ------------------ Methods: utils ------------------ */\r\n private showToast = (label: string) => {\r\n /* Reset vecchio timeout (se ancora in corso) */\r\n if (this.toast()?.timeoutId) {\r\n clearTimeout(this.toast()!.timeoutId);\r\n }\r\n\r\n /* Reset vecchio toast (se ancora in corso) */\r\n this.toast.set(null);\r\n\r\n /* Piccolo timeout cosi da evidenziare un nuovo toast (se presente ancora un toast in corso) */\r\n setTimeout(() => {\r\n /* Nascosto toast dopo x tempo */\r\n const timeoutId = setTimeout(() => this.toast.set(null), 2000);\r\n\r\n /* Mostrato toast */\r\n this.toast.set({ timeoutId, label });\r\n }, 100);\r\n };\r\n\r\n private copy = async (value: any, lblToast: string) => {\r\n let valueFormatted = '';\r\n try {\r\n // Se è una stringa si prova a convertirla in oggetto JSON\r\n if (typeof valueFormatted === 'string') {\r\n try {\r\n valueFormatted = JSON.parse(value);\r\n } catch {\r\n 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 }}: {{ storeItemsWithStatus().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 storeItemsWithStatus(); track $index) {\r\n <!-- Data -->\r\n @let error = storeItem.error; @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\">&gt;</span>\r\n </button>\r\n <span\r\n class=\"truncate font-sans text-base font-bold tracking-tight text-neutral-200 transition-colors duration-300 group-hover:text-white\">\r\n {{ 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(error.type === 'network' || error.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]=\"error.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ error.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: error.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(error.type === 'be' && error.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: error.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(error.type === 'be' || error.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: error.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: error.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(error.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 = [...error.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 = error.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: error.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: error.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: error.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: `${error.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: error.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 }} ({{ error.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: error.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: error.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: error.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: error.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((error.type === 'be' || error.type === 'server') &&\r\n error.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: error.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: error.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: error.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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"}
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "uni-app-fe",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
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.5",
10
- "uni-error": ">=0.1.18",
11
- "uni-manager": ">=0.1.21"
9
+ "uni-model-type": ">=0.1.6",
10
+ "uni-error": ">=0.1.19",
11
+ "uni-manager": ">=0.1.23"
12
12
  },
13
13
  "dependencies": {
14
14
  "tslib": "^2.3.0"
@@ -2,7 +2,7 @@ import * as _angular_core from '@angular/core';
2
2
  import { ElementRef } from '@angular/core';
3
3
  import { IconDefinition } from '@fortawesome/free-solid-svg-icons';
4
4
  import * as _fortawesome_fontawesome_common_types from '@fortawesome/fontawesome-common-types';
5
- import { IUniFeError, IUniHttpError, Combo } from 'uni-model-type/type';
5
+ import { ErrorStore, Combo } from 'uni-model-type/type';
6
6
  import { DatePipe } from '@angular/common';
7
7
  import { IconDefinition as IconDefinition$1 } from '@fortawesome/fontawesome-svg-core';
8
8
  import { ValueChangedEvent } from 'devextreme/ui/select_box_types';
@@ -10,7 +10,7 @@ import { ValueChangedEvent as ValueChangedEvent$1 } from 'devextreme/ui/switch_t
10
10
  import { UniLoaderService } from 'uni-app-fe/service';
11
11
 
12
12
  declare class UniBannerAlert {
13
- type: _angular_core.InputSignal<"warning" | "error">;
13
+ type: _angular_core.InputSignal<"error" | "warning">;
14
14
  lblTitle: _angular_core.InputSignal<string>;
15
15
  lblDescription: _angular_core.InputSignal<string>;
16
16
  icon: _angular_core.InputSignal<IconDefinition | undefined>;
@@ -19,17 +19,17 @@ declare class UniBannerAlert {
19
19
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniBannerAlert, "uni-banner-alert", never, { "type": { "alias": "type"; "required": true; "isSignal": true; }; "lblTitle": { "alias": "lblTitle"; "required": true; "isSignal": true; }; "lblDescription": { "alias": "lblDescription"; "required": true; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
20
20
  }
21
21
 
22
- type UError = {
22
+ type UErrorStore = {
23
23
  id: string;
24
- } & (IUniFeError | IUniHttpError);
25
- type UErrorWithStatus = UError & {
24
+ } & ErrorStore;
25
+ type UErrorStoreWithStatus = UErrorStore & {
26
26
  isOpen: boolean;
27
27
  isCopied: boolean;
28
28
  isSaved: boolean;
29
29
  };
30
30
  declare class UniDialogError {
31
- errors: _angular_core.InputSignal<UError[]>;
32
- errorsWithStatus: _angular_core.WritableSignal<UErrorWithStatus[]>;
31
+ storeItems: _angular_core.InputSignal<UErrorStore[]>;
32
+ storeItemsWithStatus: _angular_core.WritableSignal<UErrorStoreWithStatus[]>;
33
33
  toast: _angular_core.WritableSignal<{
34
34
  timeoutId: number;
35
35
  label: string;
@@ -48,7 +48,7 @@ declare class UniDialogError {
48
48
  private showToast;
49
49
  private copy;
50
50
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniDialogError, never>;
51
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDialogError, "uni-dialog-error", never, { "errors": { "alias": "errors"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
51
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniDialogError, "uni-dialog-error", never, { "storeItems": { "alias": "storeItems"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
52
52
  }
53
53
 
54
54
  declare class UniHeader {