uni-app-fe 0.1.22 → 0.1.24

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.
@@ -231,46 +231,6 @@ class UniDialogError {
231
231
  this.ICON_COUNT = faInbox;
232
232
  this.ICON_INFO = faCircleInfo;
233
233
  this.ICON_COPY = faCopy;
234
- /* ------------------ Methods: utils ------------------ */
235
- this.showToast = (label) => {
236
- /* Reset vecchio timeout (se ancora in corso) */
237
- if (this.toast()?.timeoutId) {
238
- clearTimeout(this.toast().timeoutId);
239
- }
240
- /* Reset vecchio toast (se ancora in corso) */
241
- this.toast.set(null);
242
- /* Piccolo timeout cosi da evidenziare un nuovo toast (se presente ancora un toast in corso) */
243
- setTimeout(() => {
244
- /* Nascosto toast dopo x tempo */
245
- const timeoutId = setTimeout(() => this.toast.set(null), 2000);
246
- /* Mostrato toast */
247
- this.toast.set({ timeoutId, label });
248
- }, 100);
249
- };
250
- this.copy = async (value, lblToast) => {
251
- let valueFormatted = '';
252
- try {
253
- // Se è una stringa si prova a convertirla in oggetto JSON
254
- if (typeof valueFormatted === 'string') {
255
- try {
256
- valueFormatted = JSON.parse(value);
257
- }
258
- catch {
259
- valueFormatted = value;
260
- }
261
- }
262
- const formattedText = typeof valueFormatted === 'object' && valueFormatted !== null
263
- ? JSON.stringify(valueFormatted, null, 2)
264
- : String(valueFormatted)
265
- .replaceAll(String.raw `\r\n`, '\n')
266
- .replaceAll(String.raw `\n`, '\n');
267
- await navigator.clipboard.writeText(formattedText);
268
- this.showToast(lblToast);
269
- }
270
- catch {
271
- this.showToast('OperationNotAvailable');
272
- }
273
- };
274
234
  }
275
235
  /* ------------------ Methods ------------------ */
276
236
  onCloseDialog() {
@@ -294,7 +254,7 @@ class UniDialogError {
294
254
  /* Azione */
295
255
  await this.copy(JSON.stringify(currentError, null, 2), 'ErrorCopied');
296
256
  /* Aggiornamento datasource */
297
- this.storeItemsVisibile.update((list) => list.map((err) => ({ ...err, isCopied: err.id === id })));
257
+ this.storeItemsVisibile.update((list) => list.map((error) => ({ ...error, isCopied: error.id === id })));
298
258
  }
299
259
  onSave(id) {
300
260
  /* Recupero errore */
@@ -315,12 +275,13 @@ class UniDialogError {
315
275
  exceptionStackTraceFrames: currentError.uniError.exception.stackTraceFrames,
316
276
  };
317
277
  /* Api */
318
- UniHttpManager.create$({ ref: 'Log', path: '/Log/AddFeLog', hasToast: false }, log).subscribe(() => {
319
- this.storeItemsVisibile.update((list) => list.map((err) => {
320
- if (err.id === id) {
321
- err.isSaved = true;
278
+ UniHttpManager.create$({ ref: 'Log', path: '/Log/Fe/Error', hasToast: false }, log).subscribe(() => {
279
+ /* Aggiornamento prop isSaved */
280
+ this.storeItemsVisibile.update((list) => list.map((error) => {
281
+ if (error.id === id) {
282
+ error.isSaved = true;
322
283
  }
323
- return err;
284
+ return error;
324
285
  }));
325
286
  /* Toast */
326
287
  this.showToast('ErrorSaved');
@@ -332,6 +293,46 @@ class UniDialogError {
332
293
  /* Toast */
333
294
  this.showToast('ErrorRemoved');
334
295
  }
296
+ /* ------------------ Methods: utils ------------------ */
297
+ showToast(label) {
298
+ /* Reset vecchio timeout (se ancora in corso) */
299
+ if (this.toast()?.timeoutId) {
300
+ clearTimeout(this.toast().timeoutId);
301
+ }
302
+ /* Reset vecchio toast (se ancora in corso) */
303
+ this.toast.set(null);
304
+ /* Piccolo timeout cosi da evidenziare un nuovo toast (se presente ancora un toast in corso) */
305
+ setTimeout(() => {
306
+ /* Nascosto toast dopo x tempo */
307
+ const timeoutId = setTimeout(() => this.toast.set(null), 2000);
308
+ /* Mostrato toast */
309
+ this.toast.set({ timeoutId, label });
310
+ }, 100);
311
+ }
312
+ async copy(value, lblToast) {
313
+ let valueFormatted = '';
314
+ try {
315
+ // Se è una stringa si prova a convertirla in oggetto JSON
316
+ if (typeof valueFormatted === 'string') {
317
+ try {
318
+ valueFormatted = JSON.parse(value);
319
+ }
320
+ catch {
321
+ valueFormatted = value;
322
+ }
323
+ }
324
+ const formattedText = typeof valueFormatted === 'object' && valueFormatted !== null
325
+ ? JSON.stringify(valueFormatted, null, 2)
326
+ : String(valueFormatted)
327
+ .replaceAll(String.raw `\r\n`, '\n')
328
+ .replaceAll(String.raw `\n`, '\n');
329
+ await navigator.clipboard.writeText(formattedText);
330
+ this.showToast(lblToast);
331
+ }
332
+ catch {
333
+ this.showToast('OperationNotAvailable');
334
+ }
335
+ }
335
336
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniDialogError, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
336
337
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniDialogError, isStandalone: true, selector: "uni-dialog-error", inputs: { storeItems: { classPropertyName: "storeItems", publicName: "storeItems", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<div\r\n class=\"relative flex h-full w-full flex-col gap-6 overflow-hidden rounded-4xl border border-rose-800/25 bg-linear-to-tr from-rose-500/10 via-rose-900/20 to-rose-500/5 p-6 text-left shadow-[0_50px_100px_-20px_rgba(0,0,0,0.7),inset_0_1px_0_rgba(255,255,255,0.15)] backdrop-blur-3xl\">\r\n <div\r\n class=\"pointer-events-none absolute -top-40 -left-40 size-96 animate-pulse rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n <div\r\n class=\"pointer-events-none absolute -right-40 -bottom-40 size-96 rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n\r\n <!-- Titolo -->\r\n <header class=\"flex items-center justify-between gap-4 border-b border-rose-400/25 pb-5\">\r\n <!-- Titolo: led -->\r\n <span class=\"relative flex size-3\">\r\n <span\r\n class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-rose-400 opacity-40\"></span>\r\n <span\r\n class=\"relative inline-flex size-3 rounded-full bg-linear-to-tr from-rose-500 to-rose-300 shadow-[0_0_20px_rgba(244,63,94,0.8)]\"></span>\r\n </span>\r\n\r\n <!-- Titolo: scritta -->\r\n <h1 class=\"mr-auto truncate text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"xs:block hidden rounded-xl border border-white/7.5 bg-white/5 px-3 py-1.5 font-mono text-xs font-semibold tracking-wider text-neutral-200\">\r\n {{ 'Total' | translate }}: {{ storeItemsVisibile().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'close'\"\r\n (onClick)=\"onCloseDialog()\"></dx-button>\r\n </header>\r\n\r\n <!-- Lista Errori -->\r\n <main\r\n class=\"scrollbar-none overflow-y-auto [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\">\r\n <ul class=\"flex flex-col gap-6 overflow-x-auto p-2\">\r\n @for (storeItem of storeItemsVisibile(); track $index) {\r\n <!-- Data -->\r\n @let uniError = storeItem.uniError; @let storeItemData = storeItem | get_data;\r\n <li\r\n class=\"group squircle @container/item relative flex w-full min-w-32 flex-col rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': storeItem.isOpen }\">\r\n <!-- Badges -->\r\n <div class=\"absolute -top-2 -right-1 flex gap-2 text-white\">\r\n @if(storeItem.isCopied) {\r\n <span class=\"squircle rounded-full bg-amber-500 px-3 py-px\">\r\n {{ 'Copied' | translate }}\r\n </span>\r\n } @if(storeItem.isSaved) {\r\n <span class=\"squircle rounded-full bg-emerald-500 px-3 py-px\">\r\n {{ 'Saved' | translate }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Header -->\r\n <div class=\"@container/header flex items-center justify-between gap-4 p-4\">\r\n <!-- Header: titolo -->\r\n <div class=\"flex min-w-0 items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': storeItem.isOpen }\"\r\n [title]=\"(storeItem.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(storeItem.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&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 <!-- Header: type -->\r\n <div\r\n class=\"hidden items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white @xs/header:flex\">\r\n @if(uniError.type === 'network' || uniError.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"storeItemData.icon\" [title]=\"uniError.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ uniError.type }} </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Messaggio -->\r\n <div\r\n class=\"flex flex-col gap-4 [&_article]:border-0 [&_article]:p-0 [&_article_h3]:text-neutral-400 [&_article_h3]:group-hover:text-neutral-200 [&_article_h3_div_*]:hover:text-white [&_article_p]:text-white\">\r\n <!-- Messaggio default -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Message'\"\r\n [property]=\"{ value: uniError.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(uniError.type === 'be' && uniError.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: uniError.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(storeItem.isOpen) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-12\">\r\n @if(uniError.type === 'be' || uniError.type === 'server') {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: request -->\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Request' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex flex-col gap-x-16 gap-y-4 @md/item:flex-row\">\r\n <!-- Dettagli: request metodo http -->\r\n <uni-dialog-error-article\r\n class=\"shrink-0 @md/item:basis-24\"\r\n [lblTitle]=\"'Method'\"\r\n [property]=\"{ value: uniError.request.method, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n <!-- Dettagli: request url -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Url'\"\r\n [property]=\"{ value: uniError.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(uniError.request.url | url).searchParams];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'QueryParams'\"\r\n [property]=\"{ value: queryParams, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request headers -->\r\n @let headers = [...uniError.request.headers.entries()];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Headers'\"\r\n [property]=\"{ value: headers, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request body -->\r\n @let body = uniError.request | get_body_async | async;\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Body'\"\r\n [property]=\"{ value: body | parse, type: 'json'}\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex flex-col gap-4 @md/item:flex-row\">\r\n <!-- Dettagli: request info mode -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Mode'\"\r\n [property]=\"{ value: uniError.request.mode, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Credentials'\"\r\n [property]=\"{ value: uniError.request.credentials, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info cache -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'CacheMode'\"\r\n [property]=\"{ value: uniError.request.cache, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dettagli: info -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Diagnostic' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Duration'\"\r\n [property]=\"{ value: `${uniError.durationMs / 1000}s`, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: info user agent -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'UserAgent'\"\r\n [property]=\"{ value: uniError.userAgent, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Dettagli: eccezione -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Exception' | translate }} ({{ uniError.type }})\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.exception.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.exception.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.exception.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Frames'\"\r\n [property]=\"{ value: uniError.exception.stackTraceFrames.map(x => ([x.file, `LINE ${x.line}`])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(storeItem.isOpen) { @if((uniError.type === 'be' || uniError.type === 'server') &&\r\n uniError.innerException) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.innerException.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: tipo -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.innerException.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.innerException.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n } }\r\n\r\n <!-- Storico -->\r\n @if(storeItem.isOpen){ @if(storeItem.historyItems.length > 0) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'History' | translate }}\r\n </h1>\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Timestamp'\"\r\n [property]=\"{ value: (storeItem.historyItems | get_timestamp_formatted).map(x => ([x.message, x.date])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"@container/footer flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 @lg/item:flex-row @lg/item:items-center\">\r\n <!-- Footer: metadata -->\r\n <div\r\n class=\"flex min-w-0 flex-col items-center justify-between gap-x-4 gap-y-2 overflow-hidden text-xs @2xs/footer:flex-row\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex h-6 max-w-full min-w-22 items-center justify-center gap-2 overflow-hidden rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1 font-mono\">\r\n <span\r\n class=\"font-mono font-bold text-rose-400 transition-colors duration-300 group-hover:text-white\">\r\n HTTP\r\n </span>\r\n <span class=\"font-mono text-neutral-300\"> {{ storeItemData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"flex-1 truncate overflow-hidden font-mono text-neutral-300\">\r\n {{ storeItem.historyItems.at(-1)?.timestamp| date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"truncate font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ storeItem.historyItems.length }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"touch:opacity-100 flex flex-col items-center justify-center gap-2 transition duration-300 group-hover:opacity-100 @[110px]/footer:flex-row @sm/footer:opacity-10\">\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isCopied\"\r\n (click)=\"onCopyAll(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isSaved\"\r\n (click)=\"onSave(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(storeItem.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">\u2713</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{display:block;height:min(700px,80%);max-height:80%;width:min(1000px,60%);max-width:80%}@media(max-width:768px){:host{width:100%!important;max-width:100%!important;height:100%!important;max-height:100%!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: DxButtonModule }, { kind: "component", type: i2.DxButtonComponent, selector: "dx-button", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "icon", "rtlEnabled", "stylingMode", "tabIndex", "template", "text", "type", "useSubmitBehavior", "validationGroup", "visible", "width"], outputs: ["onClick", "onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconChange", "rtlEnabledChange", "stylingModeChange", "tabIndexChange", "templateChange", "textChange", "typeChange", "useSubmitBehaviorChange", "validationGroupChange", "visibleChange", "widthChange"] }, { kind: "ngmodule", type: DxTooltipModule }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "component", type: UniDialogErrorArticle, selector: "uni-dialog-error-article", inputs: ["lblTitle", "property"], outputs: ["onCopyEvt"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: UniTranslatePipe, name: "translate" }, { kind: "pipe", type: GetDataPipe, name: "get_data" }, { kind: "pipe", type: GetBodyAsyncPipe, name: "get_body_async" }, { kind: "pipe", type: GetTimestampFormattedPipe, name: "get_timestamp_formatted" }, { kind: "pipe", type: UniParsePipe, name: "parse" }, { kind: "pipe", type: UniUrlPipe, name: "url" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
337
338
  }
@@ -357,25 +358,21 @@ class UniHeader {
357
358
  constructor() {
358
359
  /* Input */
359
360
  this.title = input.required(...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
360
- this.versionFe = input.required(...(ngDevMode ? [{ debugName: "versionFe" }] : /* istanbul ignore next */ []));
361
- this.versionBe = input(localStorage.getItem('uni-version-be') ?? '?', ...(ngDevMode ? [{ debugName: "versionBe" }] : /* istanbul ignore next */ []));
361
+ this.subTitle = input(...(ngDevMode ? [undefined, { debugName: "subTitle" }] : /* istanbul ignore next */ []));
362
362
  this.pathBrandLogo = input.required(...(ngDevMode ? [{ debugName: "pathBrandLogo" }] : /* istanbul ignore next */ []));
363
363
  this.pathAppLogo = input(...(ngDevMode ? [undefined, { debugName: "pathAppLogo" }] : /* istanbul ignore next */ []));
364
364
  this.hasSideMenu = input(false, ...(ngDevMode ? [{ debugName: "hasSideMenu" }] : /* istanbul ignore next */ []));
365
365
  this.centralDescription = input(...(ngDevMode ? [undefined, { debugName: "centralDescription" }] : /* istanbul ignore next */ []));
366
366
  /* Output */
367
367
  this.evtToggleMenu = output();
368
- /* ICON */
369
- this.ICON_FE = faDesktop;
370
- this.ICON_BE = faComputer;
371
368
  }
372
369
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniHeader, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
373
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniHeader, isStandalone: true, selector: "uni-header", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, versionFe: { classPropertyName: "versionFe", publicName: "versionFe", isSignal: true, isRequired: true, transformFunction: null }, versionBe: { classPropertyName: "versionBe", publicName: "versionBe", isSignal: true, isRequired: false, transformFunction: null }, pathBrandLogo: { classPropertyName: "pathBrandLogo", publicName: "pathBrandLogo", isSignal: true, isRequired: true, transformFunction: null }, pathAppLogo: { classPropertyName: "pathAppLogo", publicName: "pathAppLogo", isSignal: true, isRequired: false, transformFunction: null }, hasSideMenu: { classPropertyName: "hasSideMenu", publicName: "hasSideMenu", isSignal: true, isRequired: false, transformFunction: null }, centralDescription: { classPropertyName: "centralDescription", publicName: "centralDescription", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { evtToggleMenu: "evtToggleMenu" }, ngImport: i0, template: "<div\r\n class=\"dark:bg-theme-dark-800 flex h-16 items-center gap-4 overflow-hidden rounded-xl bg-blue-300 px-4 py-2.5 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 h-full flex-auto flex-col justify-between overflow-hidden\">\r\n <p class=\"truncate text-xl leading-tight font-semibold tracking-wider uppercase\">\r\n {{ title() }}\r\n </p>\r\n <div class=\"clas flex gap-4 tracking-wide opacity-60\">\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon class=\"text-2xs\" [icon]=\"ICON_FE\"></fa-icon>\r\n <span class=\"truncate text-xs\">{{ versionFe() }}</span>\r\n </p>\r\n -\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon class=\"text-2xs\" [icon]=\"ICON_BE\"></fa-icon>\r\n <span class=\"truncate text-xs\">{{ versionBe() }}</span>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n @if(centralDescription(); as centralDescription) {\r\n <div class=\"hidden flex-100 sm:flex\">\r\n <p\r\n class=\"squircle mx-auto rounded-full border border-white/5 bg-white/2.5 px-4 py-1.5 text-center text-xl font-bold tracking-wider antialiased\">\r\n {{ centralDescription }}\r\n </p>\r\n </div>\r\n }\r\n\r\n <!-- Brand Logo -->\r\n <div class=\"xs:block hidden h-full min-w-28 py-2.5\">\r\n <div class=\"relative h-full\">\r\n <img [ngSrc]=\"pathBrandLogo()\" fill priority alt=\"Brand logo\" class=\"object-contain\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Button menu -->\r\n @if (hasSideMenu()) {\r\n <dx-button class=\"shadow-none!\" [icon]=\"'menu'\" (onClick)=\"evtToggleMenu.emit(true)\" />\r\n }\r\n</div>\r\n", styles: [":host{display:block}:host ::ng-deep .dx-button{height:24px;min-width:24px;background-color:transparent}:host ::ng-deep .dx-button .dx-icon{font-size:24px;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: DxButtonModule }, { kind: "component", type: i2.DxButtonComponent, selector: "dx-button", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "icon", "rtlEnabled", "stylingMode", "tabIndex", "template", "text", "type", "useSubmitBehavior", "validationGroup", "visible", "width"], outputs: ["onClick", "onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconChange", "rtlEnabledChange", "stylingModeChange", "tabIndexChange", "templateChange", "textChange", "typeChange", "useSubmitBehaviorChange", "validationGroupChange", "visibleChange", "widthChange"] }, { kind: "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: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "decoding", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
370
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniHeader, isStandalone: true, selector: "uni-header", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subTitle: { classPropertyName: "subTitle", publicName: "subTitle", isSignal: true, isRequired: false, transformFunction: null }, pathBrandLogo: { classPropertyName: "pathBrandLogo", publicName: "pathBrandLogo", isSignal: true, isRequired: true, transformFunction: null }, pathAppLogo: { classPropertyName: "pathAppLogo", publicName: "pathAppLogo", isSignal: true, isRequired: false, transformFunction: null }, hasSideMenu: { classPropertyName: "hasSideMenu", publicName: "hasSideMenu", isSignal: true, isRequired: false, transformFunction: null }, centralDescription: { classPropertyName: "centralDescription", publicName: "centralDescription", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { evtToggleMenu: "evtToggleMenu" }, ngImport: i0, template: "<header\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-2 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-10 w-auto\"\r\n alt=\"App logo\" />\r\n }\r\n\r\n <!-- Info -->\r\n <div\r\n class=\"flex h-full flex-auto flex-col justify-between overflow-hidden leading-tight tracking-wider\">\r\n <h1 class=\"my-auto truncate text-xl! font-semibold! uppercase\">{{ title() }}</h1>\r\n @if(subTitle(); as subTitle) {\r\n <h2 class=\"text-sm! font-normal! opacity-75\">{{ subTitle }}</h2>\r\n }\r\n </div>\r\n\r\n @if(centralDescription(); as centralDescription) {\r\n <div class=\"hidden flex-100 sm:flex\">\r\n <p\r\n class=\"squircle mx-auto rounded-full border border-white/5 bg-white/2.5 px-4 py-1.5 text-center text-xl font-bold tracking-wider antialiased\">\r\n {{ centralDescription }}\r\n </p>\r\n </div>\r\n }\r\n\r\n <!-- Brand Logo -->\r\n <div class=\"xs:block hidden h-full min-w-28 py-2.5\">\r\n <div class=\"relative h-full\">\r\n <img [ngSrc]=\"pathBrandLogo()\" fill priority alt=\"Brand logo\" class=\"object-contain\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Button menu -->\r\n @if (hasSideMenu()) {\r\n <dx-button class=\"shadow-none!\" [icon]=\"'menu'\" (onClick)=\"evtToggleMenu.emit(true)\" />\r\n }\r\n</header>\r\n", styles: [":host{display:block}:host ::ng-deep .dx-button{height:24px;min-width:24px;background-color:transparent}:host ::ng-deep .dx-button .dx-icon{font-size:24px;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: DxButtonModule }, { kind: "component", type: i2.DxButtonComponent, selector: "dx-button", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "icon", "rtlEnabled", "stylingMode", "tabIndex", "template", "text", "type", "useSubmitBehavior", "validationGroup", "visible", "width"], outputs: ["onClick", "onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconChange", "rtlEnabledChange", "stylingModeChange", "tabIndexChange", "templateChange", "textChange", "typeChange", "useSubmitBehaviorChange", "validationGroupChange", "visibleChange", "widthChange"] }, { kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "decoding", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
374
371
  }
375
372
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniHeader, decorators: [{
376
373
  type: Component,
377
- args: [{ selector: 'uni-header', standalone: true, imports: [DxButtonModule, FaIconComponent, NgOptimizedImage], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n class=\"dark:bg-theme-dark-800 flex h-16 items-center gap-4 overflow-hidden rounded-xl bg-blue-300 px-4 py-2.5 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 h-full flex-auto flex-col justify-between overflow-hidden\">\r\n <p class=\"truncate text-xl leading-tight font-semibold tracking-wider uppercase\">\r\n {{ title() }}\r\n </p>\r\n <div class=\"clas flex gap-4 tracking-wide opacity-60\">\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon class=\"text-2xs\" [icon]=\"ICON_FE\"></fa-icon>\r\n <span class=\"truncate text-xs\">{{ versionFe() }}</span>\r\n </p>\r\n -\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon class=\"text-2xs\" [icon]=\"ICON_BE\"></fa-icon>\r\n <span class=\"truncate text-xs\">{{ versionBe() }}</span>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n @if(centralDescription(); as centralDescription) {\r\n <div class=\"hidden flex-100 sm:flex\">\r\n <p\r\n class=\"squircle mx-auto rounded-full border border-white/5 bg-white/2.5 px-4 py-1.5 text-center text-xl font-bold tracking-wider antialiased\">\r\n {{ centralDescription }}\r\n </p>\r\n </div>\r\n }\r\n\r\n <!-- Brand Logo -->\r\n <div class=\"xs:block hidden h-full min-w-28 py-2.5\">\r\n <div class=\"relative h-full\">\r\n <img [ngSrc]=\"pathBrandLogo()\" fill priority alt=\"Brand logo\" class=\"object-contain\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Button menu -->\r\n @if (hasSideMenu()) {\r\n <dx-button class=\"shadow-none!\" [icon]=\"'menu'\" (onClick)=\"evtToggleMenu.emit(true)\" />\r\n }\r\n</div>\r\n", styles: [":host{display:block}:host ::ng-deep .dx-button{height:24px;min-width:24px;background-color:transparent}:host ::ng-deep .dx-button .dx-icon{font-size:24px;color:#fff}\n"] }]
378
- }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], versionFe: [{ type: i0.Input, args: [{ isSignal: true, alias: "versionFe", required: true }] }], versionBe: [{ type: i0.Input, args: [{ isSignal: true, alias: "versionBe", required: false }] }], pathBrandLogo: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathBrandLogo", required: true }] }], pathAppLogo: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathAppLogo", required: false }] }], hasSideMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasSideMenu", required: false }] }], centralDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "centralDescription", required: false }] }], evtToggleMenu: [{ type: i0.Output, args: ["evtToggleMenu"] }] } });
374
+ args: [{ selector: 'uni-header', standalone: true, imports: [DxButtonModule, NgOptimizedImage], changeDetection: ChangeDetectionStrategy.OnPush, template: "<header\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-2 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-10 w-auto\"\r\n alt=\"App logo\" />\r\n }\r\n\r\n <!-- Info -->\r\n <div\r\n class=\"flex h-full flex-auto flex-col justify-between overflow-hidden leading-tight tracking-wider\">\r\n <h1 class=\"my-auto truncate text-xl! font-semibold! uppercase\">{{ title() }}</h1>\r\n @if(subTitle(); as subTitle) {\r\n <h2 class=\"text-sm! font-normal! opacity-75\">{{ subTitle }}</h2>\r\n }\r\n </div>\r\n\r\n @if(centralDescription(); as centralDescription) {\r\n <div class=\"hidden flex-100 sm:flex\">\r\n <p\r\n class=\"squircle mx-auto rounded-full border border-white/5 bg-white/2.5 px-4 py-1.5 text-center text-xl font-bold tracking-wider antialiased\">\r\n {{ centralDescription }}\r\n </p>\r\n </div>\r\n }\r\n\r\n <!-- Brand Logo -->\r\n <div class=\"xs:block hidden h-full min-w-28 py-2.5\">\r\n <div class=\"relative h-full\">\r\n <img [ngSrc]=\"pathBrandLogo()\" fill priority alt=\"Brand logo\" class=\"object-contain\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Button menu -->\r\n @if (hasSideMenu()) {\r\n <dx-button class=\"shadow-none!\" [icon]=\"'menu'\" (onClick)=\"evtToggleMenu.emit(true)\" />\r\n }\r\n</header>\r\n", styles: [":host{display:block}:host ::ng-deep .dx-button{height:24px;min-width:24px;background-color:transparent}:host ::ng-deep .dx-button .dx-icon{font-size:24px;color:#fff}\n"] }]
375
+ }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: true }] }], subTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "subTitle", required: false }] }], pathBrandLogo: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathBrandLogo", required: true }] }], pathAppLogo: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathAppLogo", required: false }] }], hasSideMenu: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasSideMenu", required: false }] }], centralDescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "centralDescription", required: false }] }], evtToggleMenu: [{ type: i0.Output, args: ["evtToggleMenu"] }] } });
379
376
 
380
377
  class UniItemFieldWithHightContrast {
381
378
  constructor() {
@@ -488,9 +485,11 @@ class UniSideMenu {
488
485
  this.elementRef = inject(ElementRef);
489
486
  this.uniLoader = inject(UniLoaderService);
490
487
  /* Input */
488
+ this.versionFe = input.required(...(ngDevMode ? [{ debugName: "versionFe" }] : /* istanbul ignore next */ []));
489
+ this.versionBe = input(localStorage.getItem('uni-version-be') ?? '?', ...(ngDevMode ? [{ debugName: "versionBe" }] : /* istanbul ignore next */ []));
491
490
  this.pathUnitecLogo = input.required(...(ngDevMode ? [{ debugName: "pathUnitecLogo" }] : /* istanbul ignore next */ []));
492
491
  this.menuItems = input([], ...(ngDevMode ? [{ debugName: "menuItems" }] : /* istanbul ignore next */ []));
493
- this.menuInteractions = input([], ...(ngDevMode ? [{ debugName: "menuInteractions" }] : /* istanbul ignore next */ []));
492
+ this.menuInteractions = input(...(ngDevMode ? [undefined, { debugName: "menuInteractions" }] : /* istanbul ignore next */ []));
494
493
  /* Output */
495
494
  this.evtToggleMenu = output();
496
495
  /* Variables */
@@ -506,6 +505,8 @@ class UniSideMenu {
506
505
  DARK_MODE: faMoon,
507
506
  LANGUAGE: faLanguage,
508
507
  NOTIFICATION: faBell,
508
+ FE: faDesktop,
509
+ BE: faComputer,
509
510
  };
510
511
  }
511
512
  /* ---------------------- Host listener ---------------------- */
@@ -514,9 +515,9 @@ class UniSideMenu {
514
515
  // Controlla se il click è avvenuto dentro il menu principale
515
516
  const clickedInsideMenu = this.elementRef.nativeElement.contains(target);
516
517
  // Controlla se il click è avvenuto dentro un popup/dropdown aperto
517
- const clickedInsideOverlay = !!target.closest('.dx-overlay-wrapper, .dx-dropdowneditor-overlay');
518
+ const isClickedInsideOverlay = !!target.closest('.dx-overlay-wrapper, .dx-dropdowneditor-overlay');
518
519
  // Se il click è fuori da entrambi, allora chiude il menu
519
- if (!clickedInsideMenu && !clickedInsideOverlay) {
520
+ if (!clickedInsideMenu && !isClickedInsideOverlay) {
520
521
  this.evtToggleMenu.emit(false);
521
522
  }
522
523
  }
@@ -524,15 +525,15 @@ class UniSideMenu {
524
525
  updateTheme(e) {
525
526
  this.uniLoader.show();
526
527
  localStorage.setItem('uni-theme', e.value ? 'dark' : 'light');
527
- globalThis.location.reload();
528
+ location.reload();
528
529
  }
529
530
  updateLocale(e) {
530
531
  this.uniLoader.show();
531
532
  localStorage.setItem('uni-locale', e.value);
532
- globalThis.location.reload();
533
+ location.reload();
533
534
  }
534
535
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniSideMenu, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
535
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniSideMenu, isStandalone: true, selector: "uni-side-menu", inputs: { pathUnitecLogo: { classPropertyName: "pathUnitecLogo", publicName: "pathUnitecLogo", isSignal: true, isRequired: true, transformFunction: null }, menuItems: { classPropertyName: "menuItems", publicName: "menuItems", isSignal: true, isRequired: false, transformFunction: null }, menuInteractions: { classPropertyName: "menuInteractions", publicName: "menuInteractions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { evtToggleMenu: "evtToggleMenu" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, ngImport: i0, template: "<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", styles: [":host{position:fixed;top:0;right:0;z-index:999}:host ::ng-deep input.dx-texteditor-input{padding:2px 0!important;color:#fff!important}:host ::ng-deep .dx-dropdowneditor-icon{color:#fff}:host ::ng-deep .dx-texteditor.dx-editor-underlined:after{border-color:#fff!important}:host ::ng-deep dx-select-box .dx-placeholder:before{padding-block:0px!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { 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: DxSelectBoxModule }, { kind: "component", type: i3.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "customItemCreateEvent", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldAddons", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isDirty", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "customItemCreateEventChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldAddonsChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isDirtyChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "ngmodule", type: DxSwitchModule }, { kind: "component", type: i4.DxSwitchComponent, selector: "dx-switch", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "isDirty", "isValid", "name", "readOnly", "rtlEnabled", "switchedOffText", "switchedOnText", "tabIndex", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "isDirtyChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "switchedOffTextChange", "switchedOnTextChange", "tabIndexChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { 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: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "decoding", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }, { kind: "pipe", type: UniTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
536
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: UniSideMenu, isStandalone: true, selector: "uni-side-menu", inputs: { versionFe: { classPropertyName: "versionFe", publicName: "versionFe", isSignal: true, isRequired: true, transformFunction: null }, versionBe: { classPropertyName: "versionBe", publicName: "versionBe", isSignal: true, isRequired: false, transformFunction: null }, pathUnitecLogo: { classPropertyName: "pathUnitecLogo", publicName: "pathUnitecLogo", isSignal: true, isRequired: true, transformFunction: null }, menuItems: { classPropertyName: "menuItems", publicName: "menuItems", isSignal: true, isRequired: false, transformFunction: null }, menuInteractions: { classPropertyName: "menuInteractions", publicName: "menuInteractions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { evtToggleMenu: "evtToggleMenu" }, host: { listeners: { "document:click": "onClickOutside($event)" } }, ngImport: i0, template: "<aside\r\n class=\"dark:bg-theme-dark-800 dark:border-theme-dark-900 flex h-screen w-[80vw] max-w-80 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 <div class=\"flex flex-col gap-2\">\r\n <h1 class=\"text-xl! font-semibold! text-white!\">{{ 'Pages' | translate }}</h1>\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 </div>\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 <div class=\"flex flex-col gap-2\">\r\n <h1 class=\"text-xl! font-semibold! text-white!\">{{ 'Interaction' | translate }}</h1>\r\n <ul class=\"flex flex-col gap-2\">\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 </div>\r\n\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-2\">\r\n <h1 class=\"text-xl! font-semibold! text-white!\">{{ 'Settings' | translate }}</h1>\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 </div>\r\n\r\n <!-- Footer Logo -->\r\n <div class=\"mt-auto flex items-center gap-4 border-t border-white/20 pt-4\">\r\n <div class=\"flex h-full flex-col justify-between tracking-wide text-white opacity-60\">\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon [icon]=\"ICON.FE\"></fa-icon>\r\n <span class=\"truncate\">{{ versionFe() }}</span>\r\n </p>\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon [icon]=\"ICON.BE\"></fa-icon>\r\n <span class=\"truncate\">{{ versionBe() }}</span>\r\n </p>\r\n </div>\r\n <img\r\n class=\"ml-auto\"\r\n [ngSrc]=\"pathUnitecLogo()\"\r\n priority\r\n alt=\"Brand logo\"\r\n height=\"36\"\r\n width=\"100\" />\r\n </div>\r\n</aside>\r\n", styles: [":host{position:fixed;top:0;right:0;z-index:999}:host ::ng-deep .dx-texteditor-input{color:#fff!important}:host ::ng-deep .dx-dropdowneditor-icon{color:#fff}:host ::ng-deep .dx-editor-underlined:after{border-color:#fff!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { 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: DxSelectBoxModule }, { kind: "component", type: i3.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "customItemCreateEvent", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldAddons", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isDirty", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "customItemCreateEventChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldAddonsChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isDirtyChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "ngmodule", type: DxSwitchModule }, { kind: "component", type: i4.DxSwitchComponent, selector: "dx-switch", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "isDirty", "isValid", "name", "readOnly", "rtlEnabled", "switchedOffText", "switchedOnText", "tabIndex", "validationError", "validationErrors", "validationMessageMode", "validationMessagePosition", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "isDirtyChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "switchedOffTextChange", "switchedOnTextChange", "tabIndexChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationMessagePositionChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { 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: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "decoding", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }, { kind: "pipe", type: UniTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
536
537
  }
537
538
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: UniSideMenu, decorators: [{
538
539
  type: Component,
@@ -546,8 +547,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
546
547
  UniTranslatePipe,
547
548
  FaIconComponent,
548
549
  NgOptimizedImage,
549
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<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", styles: [":host{position:fixed;top:0;right:0;z-index:999}:host ::ng-deep input.dx-texteditor-input{padding:2px 0!important;color:#fff!important}:host ::ng-deep .dx-dropdowneditor-icon{color:#fff}:host ::ng-deep .dx-texteditor.dx-editor-underlined:after{border-color:#fff!important}:host ::ng-deep dx-select-box .dx-placeholder:before{padding-block:0px!important}\n"] }]
550
- }], propDecorators: { pathUnitecLogo: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathUnitecLogo", required: true }] }], menuItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuItems", required: false }] }], menuInteractions: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuInteractions", required: false }] }], evtToggleMenu: [{ type: i0.Output, args: ["evtToggleMenu"] }], onClickOutside: [{
550
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<aside\r\n class=\"dark:bg-theme-dark-800 dark:border-theme-dark-900 flex h-screen w-[80vw] max-w-80 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 <div class=\"flex flex-col gap-2\">\r\n <h1 class=\"text-xl! font-semibold! text-white!\">{{ 'Pages' | translate }}</h1>\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 </div>\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 <div class=\"flex flex-col gap-2\">\r\n <h1 class=\"text-xl! font-semibold! text-white!\">{{ 'Interaction' | translate }}</h1>\r\n <ul class=\"flex flex-col gap-2\">\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 </div>\r\n\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-2\">\r\n <h1 class=\"text-xl! font-semibold! text-white!\">{{ 'Settings' | translate }}</h1>\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 </div>\r\n\r\n <!-- Footer Logo -->\r\n <div class=\"mt-auto flex items-center gap-4 border-t border-white/20 pt-4\">\r\n <div class=\"flex h-full flex-col justify-between tracking-wide text-white opacity-60\">\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon [icon]=\"ICON.FE\"></fa-icon>\r\n <span class=\"truncate\">{{ versionFe() }}</span>\r\n </p>\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon [icon]=\"ICON.BE\"></fa-icon>\r\n <span class=\"truncate\">{{ versionBe() }}</span>\r\n </p>\r\n </div>\r\n <img\r\n class=\"ml-auto\"\r\n [ngSrc]=\"pathUnitecLogo()\"\r\n priority\r\n alt=\"Brand logo\"\r\n height=\"36\"\r\n width=\"100\" />\r\n </div>\r\n</aside>\r\n", styles: [":host{position:fixed;top:0;right:0;z-index:999}:host ::ng-deep .dx-texteditor-input{color:#fff!important}:host ::ng-deep .dx-dropdowneditor-icon{color:#fff}:host ::ng-deep .dx-editor-underlined:after{border-color:#fff!important}\n"] }]
551
+ }], propDecorators: { versionFe: [{ type: i0.Input, args: [{ isSignal: true, alias: "versionFe", required: true }] }], versionBe: [{ type: i0.Input, args: [{ isSignal: true, alias: "versionBe", required: false }] }], pathUnitecLogo: [{ type: i0.Input, args: [{ isSignal: true, alias: "pathUnitecLogo", required: true }] }], menuItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuItems", required: false }] }], menuInteractions: [{ type: i0.Input, args: [{ isSignal: true, alias: "menuInteractions", required: false }] }], evtToggleMenu: [{ type: i0.Output, args: ["evtToggleMenu"] }], onClickOutside: [{
551
552
  type: HostListener,
552
553
  args: ['document:click', ['$event']]
553
554
  }] } });
@@ -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/get-timestamp-formatted.pipe.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error-article/uni-dialog-error-article.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error-article/uni-dialog-error-article.html","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error.html","../../../projects/uni-app-fe/component/uni-header/uni-header.ts","../../../projects/uni-app-fe/component/uni-header/uni-header.html","../../../projects/uni-app-fe/component/uni-item-field-with-hight-contrast/uni-item-field-with-hight-contrast.ts","../../../projects/uni-app-fe/component/uni-item-field-with-hight-contrast/uni-item-field-with-hight-contrast.html","../../../projects/uni-app-fe/component/uni-item-field/uni-item-field.ts","../../../projects/uni-app-fe/component/uni-item-field/uni-item-field.html","../../../projects/uni-app-fe/component/uni-item-field-with-lens-tooltip/uni-uni-item-field-with-lens-tooltip.ts","../../../projects/uni-app-fe/component/uni-item-field-with-lens-tooltip/uni-item-field-with-lens-tooltip.html","../../../projects/uni-app-fe/component/uni-led/model.ts","../../../projects/uni-app-fe/component/uni-led/uni-led.ts","../../../projects/uni-app-fe/component/uni-led/uni-led.html","../../../projects/uni-app-fe/component/uni-side-menu/uni-side-menu.ts","../../../projects/uni-app-fe/component/uni-side-menu/uni-side-menu.html","../../../projects/uni-app-fe/component/uni-app-fe-component.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { faTriangleExclamation, IconDefinition } from '@fortawesome/free-solid-svg-icons';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\n\r\n@Component({\r\n selector: 'uni-banner-alert',\r\n imports: [CommonModule, FaIconComponent, UniTranslatePipe],\r\n templateUrl: './uni-banner-alert.html',\r\n styleUrls: ['./uni-banner-alert.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniBannerAlert {\r\n /* Icons */\r\n type = input.required<'warning' | 'error'>();\r\n keyTitle = input.required<string>();\r\n keyDescription = input.required<string>();\r\n icon = input<IconDefinition>();\r\n\r\n /* Icons */\r\n readonly ICON_WARNING = faTriangleExclamation;\r\n}\r\n","<div\r\n class=\"relative flex w-full gap-4 overflow-hidden rounded-xl border p-4 text-left shadow-lg backdrop-blur-xl transition-all duration-300\"\r\n [ngClass]=\"{\r\n 'bg-amber-900/25 border-amber-500/30 text-amber-400': type() === 'warning',\r\n 'bg-rose-900/25 border-rose-500/30 text-rose-400': type() === 'error'\r\n }\">\r\n <div\r\n class=\"absolute top-0 bottom-0 left-0 w-1 animate-pulse rounded-l-xl\"\r\n [ngClass]=\"{ 'bg-amber-500': type() === 'warning', 'bg-rose-500': type() === 'error' }\"></div>\r\n\r\n <div class=\"flex w-full min-w-0 flex-col justify-center gap-1.5\">\r\n <h1\r\n class=\"animate-pulse truncate text-base! font-bold tracking-widest uppercase\"\r\n [ngClass]=\"{ 'text-amber-400/90': type() === 'warning', 'text-rose-400/90': type() === 'error' }\">\r\n {{ keyTitle() | translate }}\r\n </h1>\r\n\r\n @if(icon(); as icon) {\r\n <div class=\"mx-auto flex shrink-0 items-start\">\r\n <div\r\n class=\"flex size-12 items-center justify-center rounded-lg border bg-black/20 shadow-inner backdrop-blur-sm\"\r\n [ngClass]=\"{ 'border-amber-500/20': type() === 'warning', 'border-rose-500/20': type() === 'error' }\">\r\n <fa-icon class=\"text-2xl\" [icon]=\"icon\"></fa-icon>\r\n </div>\r\n </div>\r\n }\r\n\r\n <p class=\"text-sm leading-relaxed font-normal wrap-break-word text-slate-300/90 antialiased\">\r\n {{ keyDescription() | translate }}\r\n </p>\r\n </div>\r\n</div>\r\n","import { Pipe, type PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'get_body_async',\n standalone: true,\n})\nexport class GetBodyAsyncPipe implements PipeTransform {\n /**\n * Mappa per la memorizzazione (cache) del testo già estratto.\n * Evita il consumo ripetuto dello stream associato alla stessa Request.\n */\n private cache = new Map<Request, string>();\n\n async transform(request: Request | null | undefined): Promise<string> {\n // Gestione del caso in cui la richiesta o il relativo corpo siano assenti\n if (!request || !request.body) {\n return '';\n }\n\n // Restituzione immediata del valore se il testo è già presente in cache\n if (this.cache.has(request)) {\n return this.cache.get(request)!;\n }\n\n // Controllo dello stato del body: se è già bloccato (locked), la lettura fallirebbe\n if (request.body.locked) {\n console.warn('Request stream is currently locked.');\n return '[Body Locked]';\n }\n\n try {\n // Clonazione della richiesta originale per isolare lo stream del body\n const clonedRequest: Request = request.clone();\n\n // Estrazione dello stream grezzo (ReadableStream) per ottenere il body della richiesta\n const bodyStream: ReadableStream<Uint8Array> | null = clonedRequest.body;\n\n // Creazione di una risposta fittizia per consumare lo stream in modo standard\n const temporaryResponse: Response = new Response(bodyStream);\n\n // Avvio della lettura asincrona del testo dallo stream consumato\n const extractedText: string = await temporaryResponse.text();\n\n // Archiviazione del testo nella cache per le consultazioni successive\n this.cache.set(request, extractedText);\n\n return extractedText;\n } catch (error) {\n console.error('Error during stream reading:', error);\n return 'Error reading request body';\n }\n }\n}\n\n","import { Pipe, type PipeTransform } from '@angular/core';\nimport { IconDefinition } from '@fortawesome/angular-fontawesome';\nimport {\n faComputer,\n faDesktop,\n faHouseSignal,\n faTowerBroadcast,\n} from '@fortawesome/free-solid-svg-icons';\nimport type { ErrorStore } from 'uni-model-type/type';\n\ninterface ErrorDataByType {\n title: string;\n message: string;\n icon: IconDefinition;\n httpStatus: string;\n functionName: string;\n}\n\n@Pipe({\n name: 'get_data',\n})\nexport class GetDataPipe implements PipeTransform {\n transform(value: { id: string } & ErrorStore): ErrorDataByType {\n const error = value.uniError;\n\n switch (error.type) {\n case 'fe': {\n return {\n title: `${error.exception.functionName}()`,\n message: error.exception.message,\n icon: faDesktop,\n httpStatus: '-', // non presente\n functionName: `${error.exception.functionName}()`,\n };\n }\n case 'network': {\n return {\n title: value.id,\n message: error.exception.message,\n icon: faTowerBroadcast,\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: faHouseSignal,\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: faComputer,\n httpStatus: (error.httpStatus > 0 ? error.httpStatus : '-').toString(),\n functionName: error.exception.functionName,\n };\n }\n }\n }\n}\n\n","import { Pipe, type PipeTransform } from '@angular/core';\nimport { UniLocaleManager } from 'uni-manager/locale';\nimport { ErrorStore } from 'uni-model-type/type';\n\n@Pipe({\n name: 'get_timestamp_formatted',\n})\nexport class GetTimestampFormattedPipe implements PipeTransform {\n transform(value: ErrorStore['historyItems']) {\n return value.map((x) => ({\n message: x.message,\n date: UniLocaleManager.toDate(new Date(x.timestamp)),\n }));\n }\n}\n\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, output, signal } from '@angular/core';\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\nimport { faCircleInfo, faCopy } from '@fortawesome/free-solid-svg-icons';\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\n\n@Component({\n selector: 'uni-dialog-error-article',\n imports: [CommonModule, FaIconComponent, UniTranslatePipe],\n templateUrl: './uni-dialog-error-article.html',\n styleUrl: './uni-dialog-error-article.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UniDialogErrorArticle {\n /* Input */\n lblTitle = input.required<string>();\n property = input.required<\n | { value: string; type: 'string' }\n | { value: string; type: 'pre' }\n | { value: Record<string, any>; type: 'json' }\n | { value: [string, any][]; type: 'array' }\n >();\n\n /* Output */\n onCopyEvt = output<any>();\n\n /* Variables */\n toast = signal<{ timeoutId: number; label: string } | null>(null);\n\n /* Icons */\n readonly ICON_INFO = faCircleInfo;\n readonly ICON_COPY = faCopy;\n}\n\n","@if(property(); as p) {\r\n<article\r\n class=\"flex h-full flex-col gap-1 border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400\">\r\n <!-- Titolo -->\r\n <h3\r\n class=\"group/title mr-auto flex max-w-full items-center gap-1 font-bold tracking-wide text-rose-400/50 uppercase transition-colors duration-300 group-hover:text-rose-400\">\r\n <span class=\"text-2xs! truncate\">{{ lblTitle() | translate }}</span>\r\n <div class=\"invisible flex items-center gap-1 text-[9px] group-hover/title:visible\">\r\n <fa-icon\r\n class=\"cursor-help hover:text-rose-300\"\r\n [icon]=\"ICON_INFO\"\r\n [title]=\"`Tooltip${lblTitle()}` | translate\" />\r\n <button\r\n class=\"transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-120 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25\"\r\n (click)=\"onCopyEvt.emit(p.value)\">\r\n <fa-icon\r\n class=\"hover:text-rose-300\"\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </div>\r\n </h3>\r\n\r\n <div\r\n class=\"my-auto text-sm text-rose-200 transition-colors duration-300 group-hover:text-rose-100\">\r\n <!-- string / pre -->\r\n @if(p.type === 'string' || p.type === 'pre') {\r\n <!-- #2 -->\r\n @if(p.value; as value) {\r\n <!-- #2.1 - 3 -->\r\n @switch (p.type) {\r\n <!-- #3.1 -->\r\n @case ('string') {\r\n <p class=\"overflow-hidden text-ellipsis whitespace-pre-wrap\">{{ value }}</p>\r\n }\r\n <!-- #3.2 -->\r\n @case ('pre') {\r\n <pre class=\"overflow-x-auto\">{{ value }}</pre>\r\n } } }\r\n <!-- #2.2 -->\r\n @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n\r\n <!-- json -->\r\n @if(p.type === 'json') {\r\n <!-- #2 -->\r\n @if((p.value | json) !== '{}') {\r\n <pre class=\"overflow-x-auto font-sans\">{{ p.value | json }}</pre>\r\n } @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n\r\n <!-- array -->\r\n @if(p.type === 'array') {\r\n <!-- #2 -->\r\n @if(p.value.length > 0) {\r\n <ul class=\"@container/list flex flex-col gap-2\">\r\n @for (item of p.value; track $index) {\r\n <li\r\n class=\"flex max-w-full flex-col gap-x-4 gap-y-0.5 border-b border-dashed border-white/5 p-1 hover:bg-white/0.5 @lg/list:flex-row @lg/list:items-center\">\r\n <p class=\"flex min-w-0 flex-1 items-center gap-4\">\r\n <span class=\"font-mono text-xs font-bold text-rose-100\">\r\n #{{ ($index + 1).toString().padStart(2, '0') }}\r\n </span>\r\n <span class=\"cursor-help truncate\" [title]=\"item[0]\"> {{ item[0] }} </span>\r\n </p>\r\n <span\r\n class=\"shrink-0 truncate rounded bg-white/5 px-4 py-px text-center font-mono text-nowrap text-rose-300 transition-colors duration-300 group-hover:text-rose-400 @lg/list:ml-auto @lg/list:basis-48\">\r\n {{ item[1] }}\r\n </span>\r\n </li>\r\n }\r\n </ul>\r\n } @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n </div>\r\n</article>\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input, linkedSignal, signal } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport {\r\n faCircleInfo,\r\n faClock,\r\n faCopy,\r\n faDesktop,\r\n faInbox,\r\n} from '@fortawesome/free-solid-svg-icons';\r\nimport { DxButtonModule } from 'devextreme-angular/ui/button';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\nimport { UniParsePipe, UniTranslatePipe, UniUrlPipe } from 'uni-app-fe/pipe';\r\nimport { UniErrorManager } from 'uni-manager/error';\r\nimport { UniHttpManager } from 'uni-manager/http';\r\nimport type { ErrorStore, FeLog } from 'uni-model-type/type';\r\n\r\nimport { GetBodyAsyncPipe } from './get-body-async.pipe';\r\nimport { GetDataPipe } from './get-data.pipe';\r\nimport { GetTimestampFormattedPipe } from './get-timestamp-formatted.pipe';\r\nimport { UniDialogErrorArticle } from './uni-dialog-error-article/uni-dialog-error-article';\r\n\r\n@Component({\r\n selector: 'uni-dialog-error',\r\n imports: [\r\n CommonModule,\r\n DxButtonModule,\r\n DxTooltipModule,\r\n FaIconComponent,\r\n UniDialogErrorArticle,\r\n DatePipe,\r\n UniTranslatePipe,\r\n GetDataPipe,\r\n GetBodyAsyncPipe,\r\n GetTimestampFormattedPipe,\r\n UniParsePipe,\r\n UniUrlPipe,\r\n ],\r\n templateUrl: './uni-dialog-error.html',\r\n styleUrl: './uni-dialog-error.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniDialogError {\r\n /* Input */\r\n storeItems = input.required<({ id: string } & ErrorStore)[]>();\r\n\r\n /* Variables */\r\n storeItemsVisibile = linkedSignal<\r\n ({ id: string } & ErrorStore)[],\r\n ({ id: string } & ErrorStore)[]\r\n >({\r\n source: () => this.storeItems(),\r\n computation: (newItems, prev) => {\r\n const visibleItems = newItems.filter((item) => item.isVisible);\r\n const previousList = prev?.value;\r\n if (!previousList) return visibleItems;\r\n\r\n return visibleItems.map((item) => {\r\n // Ricerca del record corrispondente nello stato precedente\r\n const existing = previousList.find((old) => old.id === item.id);\r\n if (!existing) return item;\r\n\r\n // Una variazione nella lunghezza della cronologia indica la ripetizione dell'errore.\r\n // In questo scenario si ignorano i vecchi flag e si applicano i valori azzerati dallo store.\r\n if (existing.historyItems.length !== item.historyItems.length) {\r\n return item;\r\n }\r\n\r\n // Se l'errore non ha subito variazioni strutturali, viene preservato lo stato locale della UI\r\n return {\r\n ...item,\r\n isOpen: existing.isOpen,\r\n isCopied: existing.isCopied,\r\n isSaved: existing.isSaved,\r\n };\r\n });\r\n },\r\n });\r\n\r\n /* Variables */\r\n toast = signal<{ timeoutId: number; label: string } | null>(null);\r\n\r\n /* Icons */\r\n readonly ICON_FE = faDesktop;\r\n readonly ICON_TIMER = faClock;\r\n readonly ICON_COUNT = faInbox;\r\n readonly ICON_INFO = faCircleInfo;\r\n readonly ICON_COPY = faCopy;\r\n\r\n /* ------------------ Methods ------------------ */\r\n onCloseDialog(): void {\r\n UniErrorManager.removeAll();\r\n }\r\n\r\n onToggleIsOpen(id: string): void {\r\n this.storeItemsVisibile.update((x) =>\r\n x.map((y) => {\r\n if (y.id === id) y.isOpen = !y.isOpen;\r\n return y;\r\n }),\r\n );\r\n }\r\n\r\n async onCopy(value: any): Promise<void> {\r\n await this.copy(value, 'ValueCopied');\r\n }\r\n\r\n async onCopyAll(id: string): Promise<void> {\r\n /* Recupero errore */\r\n const currentError = this.storeItemsVisibile().find((e) => e.id === id);\r\n if (!currentError) return;\r\n\r\n /* Azione */\r\n await this.copy(JSON.stringify(currentError, null, 2), 'ErrorCopied');\r\n\r\n /* Aggiornamento datasource */\r\n this.storeItemsVisibile.update((list) =>\r\n list.map((err) => ({ ...err, isCopied: err.id === id })),\r\n );\r\n }\r\n\r\n onSave(id: string): void {\r\n /* Recupero errore */\r\n const currentError = this.storeItemsVisibile().find((e) => e.id === id);\r\n if (!currentError) return;\r\n\r\n /* Azione */\r\n const log: FeLog = {\r\n id: -1,\r\n severity: 'error',\r\n module: currentError.uniError.type,\r\n timestamp: currentError.historyItems.at(-1)!.timestamp,\r\n ref: currentError.id,\r\n exceptionFunctionName: currentError.uniError.exception.functionName,\r\n exceptionType: currentError.uniError.exception.type,\r\n exceptionMessage: currentError.uniError.exception.message,\r\n exceptionStackTrace: currentError.uniError.exception.stackTrace,\r\n exceptionStackTraceFrames: currentError.uniError.exception.stackTraceFrames,\r\n };\r\n\r\n /* Api */\r\n UniHttpManager.create$({ ref: 'Log', path: '/Log/AddFeLog', hasToast: false }, log).subscribe(\r\n () => {\r\n this.storeItemsVisibile.update((list) =>\r\n list.map((err) => {\r\n if (err.id === id) {\r\n err.isSaved = true;\r\n }\r\n return err;\r\n }),\r\n );\r\n\r\n /* Toast */\r\n this.showToast('ErrorSaved');\r\n },\r\n );\r\n }\r\n\r\n onDelete(id: string): void {\r\n /* Azione */\r\n UniErrorManager.hide(id);\r\n\r\n /* Toast */\r\n this.showToast('ErrorRemoved');\r\n }\r\n\r\n /* ------------------ Methods: utils ------------------ */\r\n private showToast = (label: string) => {\r\n /* Reset vecchio timeout (se ancora in corso) */\r\n if (this.toast()?.timeoutId) {\r\n clearTimeout(this.toast()!.timeoutId);\r\n }\r\n\r\n /* Reset vecchio toast (se ancora in corso) */\r\n this.toast.set(null);\r\n\r\n /* Piccolo timeout cosi da evidenziare un nuovo toast (se presente ancora un toast in corso) */\r\n setTimeout(() => {\r\n /* Nascosto toast dopo x tempo */\r\n const timeoutId = setTimeout(() => this.toast.set(null), 2000);\r\n\r\n /* Mostrato toast */\r\n this.toast.set({ timeoutId, label });\r\n }, 100);\r\n };\r\n\r\n private copy = async (value: any, lblToast: string) => {\r\n let valueFormatted = '';\r\n try {\r\n // Se è una stringa si prova a convertirla in oggetto JSON\r\n if (typeof valueFormatted === 'string') {\r\n try {\r\n valueFormatted = JSON.parse(value);\r\n } catch {\r\n valueFormatted = value;\r\n }\r\n }\r\n\r\n const formattedText =\r\n typeof valueFormatted === 'object' && valueFormatted !== null\r\n ? JSON.stringify(valueFormatted, null, 2)\r\n : String(valueFormatted)\r\n .replaceAll(String.raw`\\r\\n`, '\\n')\r\n .replaceAll(String.raw`\\n`, '\\n');\r\n\r\n await navigator.clipboard.writeText(formattedText);\r\n\r\n this.showToast(lblToast);\r\n } catch {\r\n this.showToast('OperationNotAvailable');\r\n }\r\n };\r\n}\r\n","<div\r\n class=\"relative flex h-full w-full flex-col gap-6 overflow-hidden rounded-4xl border border-rose-800/25 bg-linear-to-tr from-rose-500/10 via-rose-900/20 to-rose-500/5 p-6 text-left shadow-[0_50px_100px_-20px_rgba(0,0,0,0.7),inset_0_1px_0_rgba(255,255,255,0.15)] backdrop-blur-3xl\">\r\n <div\r\n class=\"pointer-events-none absolute -top-40 -left-40 size-96 animate-pulse rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n <div\r\n class=\"pointer-events-none absolute -right-40 -bottom-40 size-96 rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n\r\n <!-- Titolo -->\r\n <header class=\"flex items-center justify-between gap-4 border-b border-rose-400/25 pb-5\">\r\n <!-- Titolo: led -->\r\n <span class=\"relative flex size-3\">\r\n <span\r\n class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-rose-400 opacity-40\"></span>\r\n <span\r\n class=\"relative inline-flex size-3 rounded-full bg-linear-to-tr from-rose-500 to-rose-300 shadow-[0_0_20px_rgba(244,63,94,0.8)]\"></span>\r\n </span>\r\n\r\n <!-- Titolo: scritta -->\r\n <h1 class=\"mr-auto truncate text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"xs:block hidden rounded-xl border border-white/7.5 bg-white/5 px-3 py-1.5 font-mono text-xs font-semibold tracking-wider text-neutral-200\">\r\n {{ 'Total' | translate }}: {{ storeItemsVisibile().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'close'\"\r\n (onClick)=\"onCloseDialog()\"></dx-button>\r\n </header>\r\n\r\n <!-- Lista Errori -->\r\n <main\r\n class=\"scrollbar-none overflow-y-auto [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\">\r\n <ul class=\"flex flex-col gap-6 overflow-x-auto p-2\">\r\n @for (storeItem of storeItemsVisibile(); track $index) {\r\n <!-- Data -->\r\n @let uniError = storeItem.uniError; @let storeItemData = storeItem | get_data;\r\n <li\r\n class=\"group squircle @container/item relative flex w-full min-w-32 flex-col rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': storeItem.isOpen }\">\r\n <!-- Badges -->\r\n <div class=\"absolute -top-2 -right-1 flex gap-2 text-white\">\r\n @if(storeItem.isCopied) {\r\n <span class=\"squircle rounded-full bg-amber-500 px-3 py-px\">\r\n {{ 'Copied' | translate }}\r\n </span>\r\n } @if(storeItem.isSaved) {\r\n <span class=\"squircle rounded-full bg-emerald-500 px-3 py-px\">\r\n {{ 'Saved' | translate }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Header -->\r\n <div class=\"@container/header flex items-center justify-between gap-4 p-4\">\r\n <!-- Header: titolo -->\r\n <div class=\"flex min-w-0 items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': storeItem.isOpen }\"\r\n [title]=\"(storeItem.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(storeItem.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&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 <!-- Header: type -->\r\n <div\r\n class=\"hidden items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white @xs/header:flex\">\r\n @if(uniError.type === 'network' || uniError.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"storeItemData.icon\" [title]=\"uniError.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ uniError.type }} </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Messaggio -->\r\n <div\r\n class=\"flex flex-col gap-4 [&_article]:border-0 [&_article]:p-0 [&_article_h3]:text-neutral-400 [&_article_h3]:group-hover:text-neutral-200 [&_article_h3_div_*]:hover:text-white [&_article_p]:text-white\">\r\n <!-- Messaggio default -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Message'\"\r\n [property]=\"{ value: uniError.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(uniError.type === 'be' && uniError.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: uniError.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(storeItem.isOpen) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-12\">\r\n @if(uniError.type === 'be' || uniError.type === 'server') {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: request -->\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Request' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex flex-col gap-x-16 gap-y-4 @md/item:flex-row\">\r\n <!-- Dettagli: request metodo http -->\r\n <uni-dialog-error-article\r\n class=\"shrink-0 @md/item:basis-24\"\r\n [lblTitle]=\"'Method'\"\r\n [property]=\"{ value: uniError.request.method, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n <!-- Dettagli: request url -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Url'\"\r\n [property]=\"{ value: uniError.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(uniError.request.url | url).searchParams];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'QueryParams'\"\r\n [property]=\"{ value: queryParams, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request headers -->\r\n @let headers = [...uniError.request.headers.entries()];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Headers'\"\r\n [property]=\"{ value: headers, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request body -->\r\n @let body = uniError.request | get_body_async | async;\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Body'\"\r\n [property]=\"{ value: body | parse, type: 'json'}\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex flex-col gap-4 @md/item:flex-row\">\r\n <!-- Dettagli: request info mode -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Mode'\"\r\n [property]=\"{ value: uniError.request.mode, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Credentials'\"\r\n [property]=\"{ value: uniError.request.credentials, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info cache -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'CacheMode'\"\r\n [property]=\"{ value: uniError.request.cache, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dettagli: info -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Diagnostic' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Duration'\"\r\n [property]=\"{ value: `${uniError.durationMs / 1000}s`, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: info user agent -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'UserAgent'\"\r\n [property]=\"{ value: uniError.userAgent, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Dettagli: eccezione -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Exception' | translate }} ({{ uniError.type }})\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.exception.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.exception.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.exception.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Frames'\"\r\n [property]=\"{ value: uniError.exception.stackTraceFrames.map(x => ([x.file, `LINE ${x.line}`])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(storeItem.isOpen) { @if((uniError.type === 'be' || uniError.type === 'server') &&\r\n uniError.innerException) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.innerException.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: tipo -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.innerException.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.innerException.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n } }\r\n\r\n <!-- Storico -->\r\n @if(storeItem.isOpen){ @if(storeItem.historyItems.length > 0) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'History' | translate }}\r\n </h1>\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Timestamp'\"\r\n [property]=\"{ value: (storeItem.historyItems | get_timestamp_formatted).map(x => ([x.message, x.date])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"@container/footer flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 @lg/item:flex-row @lg/item:items-center\">\r\n <!-- Footer: metadata -->\r\n <div\r\n class=\"flex min-w-0 flex-col items-center justify-between gap-x-4 gap-y-2 overflow-hidden text-xs @2xs/footer:flex-row\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex h-6 max-w-full min-w-22 items-center justify-center gap-2 overflow-hidden rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1 font-mono\">\r\n <span\r\n class=\"font-mono font-bold text-rose-400 transition-colors duration-300 group-hover:text-white\">\r\n HTTP\r\n </span>\r\n <span class=\"font-mono text-neutral-300\"> {{ storeItemData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"flex-1 truncate overflow-hidden font-mono text-neutral-300\">\r\n {{ storeItem.historyItems.at(-1)?.timestamp| date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"truncate font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ storeItem.historyItems.length }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"touch:opacity-100 flex flex-col items-center justify-center gap-2 transition duration-300 group-hover:opacity-100 @[110px]/footer:flex-row @sm/footer:opacity-10\">\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isCopied\"\r\n (click)=\"onCopyAll(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isSaved\"\r\n (click)=\"onSave(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(storeItem.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">✓</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n","import { NgOptimizedImage } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { faComputer, faDesktop } from '@fortawesome/free-solid-svg-icons';\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, FaIconComponent, 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 versionFe = input.required<string>();\r\n versionBe = input<string>(localStorage.getItem('uni-version-be') ?? '?');\r\n pathBrandLogo = input.required<string>();\r\n pathAppLogo = input<string>();\r\n hasSideMenu = input<boolean>(false);\r\n centralDescription = input<string>();\r\n\r\n /* Output */\r\n evtToggleMenu = output<true>();\r\n\r\n /* ICON */\r\n readonly ICON_FE = faDesktop;\r\n readonly ICON_BE = faComputer;\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-2.5 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 h-full flex-auto flex-col justify-between overflow-hidden\">\r\n <p class=\"truncate text-xl leading-tight font-semibold tracking-wider uppercase\">\r\n {{ title() }}\r\n </p>\r\n <div class=\"clas flex gap-4 tracking-wide opacity-60\">\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon class=\"text-2xs\" [icon]=\"ICON_FE\"></fa-icon>\r\n <span class=\"truncate text-xs\">{{ versionFe() }}</span>\r\n </p>\r\n -\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon class=\"text-2xs\" [icon]=\"ICON_BE\"></fa-icon>\r\n <span class=\"truncate text-xs\">{{ versionBe() }}</span>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n @if(centralDescription(); as centralDescription) {\r\n <div class=\"hidden flex-100 sm:flex\">\r\n <p\r\n class=\"squircle mx-auto rounded-full border border-white/5 bg-white/2.5 px-4 py-1.5 text-center text-xl font-bold tracking-wider antialiased\">\r\n {{ centralDescription }}\r\n </p>\r\n </div>\r\n }\r\n\r\n <!-- Brand Logo -->\r\n <div class=\"xs:block hidden h-full min-w-28 py-2.5\">\r\n <div class=\"relative h-full\">\r\n <img [ngSrc]=\"pathBrandLogo()\" fill priority alt=\"Brand logo\" class=\"object-contain\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Button menu -->\r\n @if (hasSideMenu()) {\r\n <dx-button class=\"shadow-none!\" [icon]=\"'menu'\" (onClick)=\"evtToggleMenu.emit(true)\" />\r\n }\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":["i1","i2","i3"],"mappings":"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"}
1
+ {"version":3,"file":"uni-app-fe-component.mjs","sources":["../../../projects/uni-app-fe/component/uni-banner-alert/uni-banner-alert.ts","../../../projects/uni-app-fe/component/uni-banner-alert/uni-banner-alert.html","../../../projects/uni-app-fe/component/uni-dialog-error/get-body-async.pipe.ts","../../../projects/uni-app-fe/component/uni-dialog-error/get-data.pipe.ts","../../../projects/uni-app-fe/component/uni-dialog-error/get-timestamp-formatted.pipe.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error-article/uni-dialog-error-article.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error-article/uni-dialog-error-article.html","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error.ts","../../../projects/uni-app-fe/component/uni-dialog-error/uni-dialog-error.html","../../../projects/uni-app-fe/component/uni-header/uni-header.ts","../../../projects/uni-app-fe/component/uni-header/uni-header.html","../../../projects/uni-app-fe/component/uni-item-field-with-hight-contrast/uni-item-field-with-hight-contrast.ts","../../../projects/uni-app-fe/component/uni-item-field-with-hight-contrast/uni-item-field-with-hight-contrast.html","../../../projects/uni-app-fe/component/uni-item-field/uni-item-field.ts","../../../projects/uni-app-fe/component/uni-item-field/uni-item-field.html","../../../projects/uni-app-fe/component/uni-item-field-with-lens-tooltip/uni-uni-item-field-with-lens-tooltip.ts","../../../projects/uni-app-fe/component/uni-item-field-with-lens-tooltip/uni-item-field-with-lens-tooltip.html","../../../projects/uni-app-fe/component/uni-led/model.ts","../../../projects/uni-app-fe/component/uni-led/uni-led.ts","../../../projects/uni-app-fe/component/uni-led/uni-led.html","../../../projects/uni-app-fe/component/uni-side-menu/uni-side-menu.ts","../../../projects/uni-app-fe/component/uni-side-menu/uni-side-menu.html","../../../projects/uni-app-fe/component/uni-app-fe-component.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { faTriangleExclamation, IconDefinition } from '@fortawesome/free-solid-svg-icons';\r\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\r\n\r\n@Component({\r\n selector: 'uni-banner-alert',\r\n imports: [CommonModule, FaIconComponent, UniTranslatePipe],\r\n templateUrl: './uni-banner-alert.html',\r\n styleUrls: ['./uni-banner-alert.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniBannerAlert {\r\n /* Icons */\r\n type = input.required<'warning' | 'error'>();\r\n keyTitle = input.required<string>();\r\n keyDescription = input.required<string>();\r\n icon = input<IconDefinition>();\r\n\r\n /* Icons */\r\n readonly ICON_WARNING = faTriangleExclamation;\r\n}\r\n","<div\r\n class=\"relative flex w-full gap-4 overflow-hidden rounded-xl border p-4 text-left shadow-lg backdrop-blur-xl transition-all duration-300\"\r\n [ngClass]=\"{\r\n 'bg-amber-900/25 border-amber-500/30 text-amber-400': type() === 'warning',\r\n 'bg-rose-900/25 border-rose-500/30 text-rose-400': type() === 'error'\r\n }\">\r\n <div\r\n class=\"absolute top-0 bottom-0 left-0 w-1 animate-pulse rounded-l-xl\"\r\n [ngClass]=\"{ 'bg-amber-500': type() === 'warning', 'bg-rose-500': type() === 'error' }\"></div>\r\n\r\n <div class=\"flex w-full min-w-0 flex-col justify-center gap-1.5\">\r\n <h1\r\n class=\"animate-pulse truncate text-base! font-bold tracking-widest uppercase\"\r\n [ngClass]=\"{ 'text-amber-400/90': type() === 'warning', 'text-rose-400/90': type() === 'error' }\">\r\n {{ keyTitle() | translate }}\r\n </h1>\r\n\r\n @if(icon(); as icon) {\r\n <div class=\"mx-auto flex shrink-0 items-start\">\r\n <div\r\n class=\"flex size-12 items-center justify-center rounded-lg border bg-black/20 shadow-inner backdrop-blur-sm\"\r\n [ngClass]=\"{ 'border-amber-500/20': type() === 'warning', 'border-rose-500/20': type() === 'error' }\">\r\n <fa-icon class=\"text-2xl\" [icon]=\"icon\"></fa-icon>\r\n </div>\r\n </div>\r\n }\r\n\r\n <p class=\"text-sm leading-relaxed font-normal wrap-break-word text-slate-300/90 antialiased\">\r\n {{ keyDescription() | translate }}\r\n </p>\r\n </div>\r\n</div>\r\n","import { Pipe, type PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'get_body_async',\n standalone: true,\n})\nexport class GetBodyAsyncPipe implements PipeTransform {\n /**\n * Mappa per la memorizzazione (cache) del testo già estratto.\n * Evita il consumo ripetuto dello stream associato alla stessa Request.\n */\n private cache = new Map<Request, string>();\n\n async transform(request: Request | null | undefined): Promise<string> {\n // Gestione del caso in cui la richiesta o il relativo corpo siano assenti\n if (!request || !request.body) {\n return '';\n }\n\n // Restituzione immediata del valore se il testo è già presente in cache\n if (this.cache.has(request)) {\n return this.cache.get(request)!;\n }\n\n // Controllo dello stato del body: se è già bloccato (locked), la lettura fallirebbe\n if (request.body.locked) {\n console.warn('Request stream is currently locked.');\n return '[Body Locked]';\n }\n\n try {\n // Clonazione della richiesta originale per isolare lo stream del body\n const clonedRequest: Request = request.clone();\n\n // Estrazione dello stream grezzo (ReadableStream) per ottenere il body della richiesta\n const bodyStream: ReadableStream<Uint8Array> | null = clonedRequest.body;\n\n // Creazione di una risposta fittizia per consumare lo stream in modo standard\n const temporaryResponse: Response = new Response(bodyStream);\n\n // Avvio della lettura asincrona del testo dallo stream consumato\n const extractedText: string = await temporaryResponse.text();\n\n // Archiviazione del testo nella cache per le consultazioni successive\n this.cache.set(request, extractedText);\n\n return extractedText;\n } catch (error) {\n console.error('Error during stream reading:', error);\n return 'Error reading request body';\n }\n }\n}\n\n","import { Pipe, type PipeTransform } from '@angular/core';\nimport { IconDefinition } from '@fortawesome/angular-fontawesome';\nimport {\n faComputer,\n faDesktop,\n faHouseSignal,\n faTowerBroadcast,\n} from '@fortawesome/free-solid-svg-icons';\nimport type { ErrorStore } from 'uni-model-type/type';\n\ninterface ErrorDataByType {\n title: string;\n message: string;\n icon: IconDefinition;\n httpStatus: string;\n functionName: string;\n}\n\n@Pipe({\n name: 'get_data',\n})\nexport class GetDataPipe implements PipeTransform {\n transform(value: { id: string } & ErrorStore): ErrorDataByType {\n const error = value.uniError;\n\n switch (error.type) {\n case 'fe': {\n return {\n title: `${error.exception.functionName}()`,\n message: error.exception.message,\n icon: faDesktop,\n httpStatus: '-', // non presente\n functionName: `${error.exception.functionName}()`,\n };\n }\n case 'network': {\n return {\n title: value.id,\n message: error.exception.message,\n icon: faTowerBroadcast,\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: faHouseSignal,\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: faComputer,\n httpStatus: (error.httpStatus > 0 ? error.httpStatus : '-').toString(),\n functionName: error.exception.functionName,\n };\n }\n }\n }\n}\n\n","import { Pipe, type PipeTransform } from '@angular/core';\nimport { UniLocaleManager } from 'uni-manager/locale';\nimport { ErrorStore } from 'uni-model-type/type';\n\n@Pipe({\n name: 'get_timestamp_formatted',\n})\nexport class GetTimestampFormattedPipe implements PipeTransform {\n transform(value: ErrorStore['historyItems']) {\n return value.map((x) => ({\n message: x.message,\n date: UniLocaleManager.toDate(new Date(x.timestamp)),\n }));\n }\n}\n\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, output, signal } from '@angular/core';\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\nimport { faCircleInfo, faCopy } from '@fortawesome/free-solid-svg-icons';\nimport { UniTranslatePipe } from 'uni-app-fe/pipe';\n\n@Component({\n selector: 'uni-dialog-error-article',\n imports: [CommonModule, FaIconComponent, UniTranslatePipe],\n templateUrl: './uni-dialog-error-article.html',\n styleUrl: './uni-dialog-error-article.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UniDialogErrorArticle {\n /* Input */\n lblTitle = input.required<string>();\n property = input.required<\n | { value: string; type: 'string' }\n | { value: string; type: 'pre' }\n | { value: Record<string, any>; type: 'json' }\n | { value: [string, any][]; type: 'array' }\n >();\n\n /* Output */\n onCopyEvt = output<any>();\n\n /* Variables */\n toast = signal<{ timeoutId: number; label: string } | null>(null);\n\n /* Icons */\n readonly ICON_INFO = faCircleInfo;\n readonly ICON_COPY = faCopy;\n}\n\n","@if(property(); as p) {\r\n<article\r\n class=\"flex h-full flex-col gap-1 border-l-[1.5px] border-rose-400/50 px-4 py-2 transition-colors duration-300 group-hover:border-rose-400\">\r\n <!-- Titolo -->\r\n <h3\r\n class=\"group/title mr-auto flex max-w-full items-center gap-1 font-bold tracking-wide text-rose-400/50 uppercase transition-colors duration-300 group-hover:text-rose-400\">\r\n <span class=\"text-2xs! truncate\">{{ lblTitle() | translate }}</span>\r\n <div class=\"invisible flex items-center gap-1 text-[9px] group-hover/title:visible\">\r\n <fa-icon\r\n class=\"cursor-help hover:text-rose-300\"\r\n [icon]=\"ICON_INFO\"\r\n [title]=\"`Tooltip${lblTitle()}` | translate\" />\r\n <button\r\n class=\"transition-transform duration-150 enabled:cursor-pointer enabled:hover:scale-120 enabled:active:scale-95 enabled:active:opacity-50 disabled:opacity-25\"\r\n (click)=\"onCopyEvt.emit(p.value)\">\r\n <fa-icon\r\n class=\"hover:text-rose-300\"\r\n [icon]=\"ICON_COPY\"\r\n [title]=\"'Copy' | translate : { prefix: 'btn' }\" />\r\n </button>\r\n </div>\r\n </h3>\r\n\r\n <div\r\n class=\"my-auto text-sm text-rose-200 transition-colors duration-300 group-hover:text-rose-100\">\r\n <!-- string / pre -->\r\n @if(p.type === 'string' || p.type === 'pre') {\r\n <!-- #2 -->\r\n @if(p.value; as value) {\r\n <!-- #2.1 - 3 -->\r\n @switch (p.type) {\r\n <!-- #3.1 -->\r\n @case ('string') {\r\n <p class=\"overflow-hidden text-ellipsis whitespace-pre-wrap\">{{ value }}</p>\r\n }\r\n <!-- #3.2 -->\r\n @case ('pre') {\r\n <pre class=\"overflow-x-auto\">{{ value }}</pre>\r\n } } }\r\n <!-- #2.2 -->\r\n @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n\r\n <!-- json -->\r\n @if(p.type === 'json') {\r\n <!-- #2 -->\r\n @if((p.value | json) !== '{}') {\r\n <pre class=\"overflow-x-auto font-sans\">{{ p.value | json }}</pre>\r\n } @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n\r\n <!-- array -->\r\n @if(p.type === 'array') {\r\n <!-- #2 -->\r\n @if(p.value.length > 0) {\r\n <ul class=\"@container/list flex flex-col gap-2\">\r\n @for (item of p.value; track $index) {\r\n <li\r\n class=\"flex max-w-full flex-col gap-x-4 gap-y-0.5 border-b border-dashed border-white/5 p-1 hover:bg-white/0.5 @lg/list:flex-row @lg/list:items-center\">\r\n <p class=\"flex min-w-0 flex-1 items-center gap-4\">\r\n <span class=\"font-mono text-xs font-bold text-rose-100\">\r\n #{{ ($index + 1).toString().padStart(2, '0') }}\r\n </span>\r\n <span class=\"cursor-help truncate\" [title]=\"item[0]\"> {{ item[0] }} </span>\r\n </p>\r\n <span\r\n class=\"shrink-0 truncate rounded bg-white/5 px-4 py-px text-center font-mono text-nowrap text-rose-300 transition-colors duration-300 group-hover:text-rose-400 @lg/list:ml-auto @lg/list:basis-48\">\r\n {{ item[1] }}\r\n </span>\r\n </li>\r\n }\r\n </ul>\r\n } @else {\r\n <p class=\"my-auto\">-</p>\r\n } }\r\n </div>\r\n</article>\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { CommonModule, DatePipe } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input, linkedSignal, signal } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport {\r\n faCircleInfo,\r\n faClock,\r\n faCopy,\r\n faDesktop,\r\n faInbox,\r\n} from '@fortawesome/free-solid-svg-icons';\r\nimport { DxButtonModule } from 'devextreme-angular/ui/button';\r\nimport { DxTooltipModule } from 'devextreme-angular/ui/tooltip';\r\nimport { UniParsePipe, UniTranslatePipe, UniUrlPipe } from 'uni-app-fe/pipe';\r\nimport { UniErrorManager } from 'uni-manager/error';\r\nimport { UniHttpManager } from 'uni-manager/http';\r\nimport type { ErrorStore, FeLog } from 'uni-model-type/type';\r\n\r\nimport { GetBodyAsyncPipe } from './get-body-async.pipe';\r\nimport { GetDataPipe } from './get-data.pipe';\r\nimport { GetTimestampFormattedPipe } from './get-timestamp-formatted.pipe';\r\nimport { UniDialogErrorArticle } from './uni-dialog-error-article/uni-dialog-error-article';\r\n\r\n@Component({\r\n selector: 'uni-dialog-error',\r\n imports: [\r\n CommonModule,\r\n DxButtonModule,\r\n DxTooltipModule,\r\n FaIconComponent,\r\n UniDialogErrorArticle,\r\n DatePipe,\r\n UniTranslatePipe,\r\n GetDataPipe,\r\n GetBodyAsyncPipe,\r\n GetTimestampFormattedPipe,\r\n UniParsePipe,\r\n UniUrlPipe,\r\n ],\r\n templateUrl: './uni-dialog-error.html',\r\n styleUrl: './uni-dialog-error.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniDialogError {\r\n /* Input */\r\n storeItems = input.required<({ id: string } & ErrorStore)[]>();\r\n\r\n /* Variables */\r\n storeItemsVisibile = linkedSignal<\r\n ({ id: string } & ErrorStore)[],\r\n ({ id: string } & ErrorStore)[]\r\n >({\r\n source: () => this.storeItems(),\r\n computation: (newItems, prev) => {\r\n const visibleItems = newItems.filter((item) => item.isVisible);\r\n const previousList = prev?.value;\r\n if (!previousList) return visibleItems;\r\n\r\n return visibleItems.map((item) => {\r\n // Ricerca del record corrispondente nello stato precedente\r\n const existing = previousList.find((old) => old.id === item.id);\r\n if (!existing) return item;\r\n\r\n // Una variazione nella lunghezza della cronologia indica la ripetizione dell'errore.\r\n // In questo scenario si ignorano i vecchi flag e si applicano i valori azzerati dallo store.\r\n if (existing.historyItems.length !== item.historyItems.length) {\r\n return item;\r\n }\r\n\r\n // Se l'errore non ha subito variazioni strutturali, viene preservato lo stato locale della UI\r\n return {\r\n ...item,\r\n isOpen: existing.isOpen,\r\n isCopied: existing.isCopied,\r\n isSaved: existing.isSaved,\r\n };\r\n });\r\n },\r\n });\r\n\r\n /* Variables */\r\n toast = signal<{ timeoutId: number; label: string } | null>(null);\r\n\r\n /* Icons */\r\n readonly ICON_FE = faDesktop;\r\n readonly ICON_TIMER = faClock;\r\n readonly ICON_COUNT = faInbox;\r\n readonly ICON_INFO = faCircleInfo;\r\n readonly ICON_COPY = faCopy;\r\n\r\n /* ------------------ Methods ------------------ */\r\n onCloseDialog(): void {\r\n UniErrorManager.removeAll();\r\n }\r\n\r\n onToggleIsOpen(id: string): void {\r\n this.storeItemsVisibile.update((x) =>\r\n x.map((y) => {\r\n if (y.id === id) y.isOpen = !y.isOpen;\r\n return y;\r\n }),\r\n );\r\n }\r\n\r\n async onCopy(value: any): Promise<void> {\r\n await this.copy(value, 'ValueCopied');\r\n }\r\n\r\n async onCopyAll(id: string): Promise<void> {\r\n /* Recupero errore */\r\n const currentError = this.storeItemsVisibile().find((e) => e.id === id);\r\n if (!currentError) return;\r\n\r\n /* Azione */\r\n await this.copy(JSON.stringify(currentError, null, 2), 'ErrorCopied');\r\n\r\n /* Aggiornamento datasource */\r\n this.storeItemsVisibile.update((list) =>\r\n list.map((error) => ({ ...error, isCopied: error.id === id })),\r\n );\r\n }\r\n\r\n onSave(id: string): void {\r\n /* Recupero errore */\r\n const currentError = this.storeItemsVisibile().find((e) => e.id === id);\r\n if (!currentError) return;\r\n\r\n /* Azione */\r\n const log: FeLog = {\r\n id: -1,\r\n severity: 'error',\r\n module: currentError.uniError.type,\r\n timestamp: currentError.historyItems.at(-1)!.timestamp,\r\n ref: currentError.id,\r\n exceptionFunctionName: currentError.uniError.exception.functionName,\r\n exceptionType: currentError.uniError.exception.type,\r\n exceptionMessage: currentError.uniError.exception.message,\r\n exceptionStackTrace: currentError.uniError.exception.stackTrace,\r\n exceptionStackTraceFrames: currentError.uniError.exception.stackTraceFrames,\r\n };\r\n\r\n /* Api */\r\n UniHttpManager.create$({ ref: 'Log', path: '/Log/Fe/Error', hasToast: false }, log).subscribe(\r\n () => {\r\n /* Aggiornamento prop isSaved */\r\n this.storeItemsVisibile.update((list) =>\r\n list.map((error) => {\r\n if (error.id === id) {\r\n error.isSaved = true;\r\n }\r\n return error;\r\n }),\r\n );\r\n\r\n /* Toast */\r\n this.showToast('ErrorSaved');\r\n },\r\n );\r\n }\r\n\r\n onDelete(id: string): void {\r\n /* Azione */\r\n UniErrorManager.hide(id);\r\n\r\n /* Toast */\r\n this.showToast('ErrorRemoved');\r\n }\r\n\r\n /* ------------------ Methods: utils ------------------ */\r\n private showToast(label: string): void {\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 async copy(value: any, lblToast: string): Promise<void> {\r\n let valueFormatted = '';\r\n try {\r\n // Se è una stringa si prova a convertirla in oggetto JSON\r\n if (typeof valueFormatted === 'string') {\r\n try {\r\n valueFormatted = JSON.parse(value);\r\n } catch {\r\n valueFormatted = value;\r\n }\r\n }\r\n\r\n const formattedText =\r\n typeof valueFormatted === 'object' && valueFormatted !== null\r\n ? JSON.stringify(valueFormatted, null, 2)\r\n : String(valueFormatted)\r\n .replaceAll(String.raw`\\r\\n`, '\\n')\r\n .replaceAll(String.raw`\\n`, '\\n');\r\n\r\n await navigator.clipboard.writeText(formattedText);\r\n\r\n this.showToast(lblToast);\r\n } catch {\r\n this.showToast('OperationNotAvailable');\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"relative flex h-full w-full flex-col gap-6 overflow-hidden rounded-4xl border border-rose-800/25 bg-linear-to-tr from-rose-500/10 via-rose-900/20 to-rose-500/5 p-6 text-left shadow-[0_50px_100px_-20px_rgba(0,0,0,0.7),inset_0_1px_0_rgba(255,255,255,0.15)] backdrop-blur-3xl\">\r\n <div\r\n class=\"pointer-events-none absolute -top-40 -left-40 size-96 animate-pulse rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n <div\r\n class=\"pointer-events-none absolute -right-40 -bottom-40 size-96 rounded-full bg-rose-500/10 blur-[120px]\"></div>\r\n\r\n <!-- Titolo -->\r\n <header class=\"flex items-center justify-between gap-4 border-b border-rose-400/25 pb-5\">\r\n <!-- Titolo: led -->\r\n <span class=\"relative flex size-3\">\r\n <span\r\n class=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-rose-400 opacity-40\"></span>\r\n <span\r\n class=\"relative inline-flex size-3 rounded-full bg-linear-to-tr from-rose-500 to-rose-300 shadow-[0_0_20px_rgba(244,63,94,0.8)]\"></span>\r\n </span>\r\n\r\n <!-- Titolo: scritta -->\r\n <h1 class=\"mr-auto truncate text-2xl font-black tracking-tight text-white antialiased\">\r\n {{ 'Errors' | translate }}\r\n </h1>\r\n\r\n <!-- Titolo: totale -->\r\n <span\r\n class=\"xs:block hidden rounded-xl border border-white/7.5 bg-white/5 px-3 py-1.5 font-mono text-xs font-semibold tracking-wider text-neutral-200\">\r\n {{ 'Total' | translate }}: {{ storeItemsVisibile().length }}\r\n </span>\r\n\r\n <!-- Titolo: bottone chiusura -->\r\n <dx-button\r\n class=\"w-8 transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'close'\"\r\n (onClick)=\"onCloseDialog()\"></dx-button>\r\n </header>\r\n\r\n <!-- Lista Errori -->\r\n <main\r\n class=\"scrollbar-none overflow-y-auto [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\">\r\n <ul class=\"flex flex-col gap-6 overflow-x-auto p-2\">\r\n @for (storeItem of storeItemsVisibile(); track $index) {\r\n <!-- Data -->\r\n @let uniError = storeItem.uniError; @let storeItemData = storeItem | get_data;\r\n <li\r\n class=\"group squircle @container/item relative flex w-full min-w-32 flex-col rounded-3xl border-[1.5px] border-white/7.5 bg-white/2.5 text-left shadow-[0_4px_12px_-4px_rgba(0,0,0,0.5)] transition duration-300 hover:scale-[1.01] hover:border-white/33 hover:bg-white/5\"\r\n [ngClass]=\"{ 'bg-white/7.5! shadow-[0_30px_40px_-18px_rgba(0,0,0,0.75),inset_0_1px_1px_rgba(255,255,255,0.15)]! hover:border-rose-400!': storeItem.isOpen }\">\r\n <!-- Badges -->\r\n <div class=\"absolute -top-2 -right-1 flex gap-2 text-white\">\r\n @if(storeItem.isCopied) {\r\n <span class=\"squircle rounded-full bg-amber-500 px-3 py-px\">\r\n {{ 'Copied' | translate }}\r\n </span>\r\n } @if(storeItem.isSaved) {\r\n <span class=\"squircle rounded-full bg-emerald-500 px-3 py-px\">\r\n {{ 'Saved' | translate }}\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Header -->\r\n <div class=\"@container/header flex items-center justify-between gap-4 p-4\">\r\n <!-- Header: titolo -->\r\n <div class=\"flex min-w-0 items-center gap-3.5\">\r\n <button\r\n class=\"flex size-7 shrink-0 cursor-pointer items-center justify-center rounded-lg border border-white/10 bg-white/5 text-neutral-400 transition duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white hover:bg-rose-400\"\r\n [ngClass]=\"{ 'rotate-90': storeItem.isOpen }\"\r\n [title]=\"(storeItem.isOpen ? 'Close' : 'Open') | translate: { prefix: 'btn' }\"\r\n (click)=\"onToggleIsOpen(storeItem.id)\">\r\n <span class=\"font-mono text-xs font-bold\">&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 <!-- Header: type -->\r\n <div\r\n class=\"hidden items-center gap-2 rounded-lg border border-white/10 bg-white/5 px-3 py-1.5 text-rose-400 transition-colors duration-300 group-hover:border-white/30 group-hover:bg-white/10 group-hover:text-white @xs/header:flex\">\r\n @if(uniError.type === 'network' || uniError.type === 'server') {\r\n <fa-icon [icon]=\"ICON_FE\" />\r\n <span class=\"font-mono text-xs opacity-30\">/</span>\r\n }\r\n <fa-icon [icon]=\"storeItemData.icon\" [title]=\"uniError.type\" />\r\n <span class=\"font-mono text-xs tracking-wider uppercase\"> {{ uniError.type }} </span>\r\n </div>\r\n </div>\r\n\r\n <!-- Main -->\r\n <div class=\"flex flex-col gap-8 p-4\">\r\n <!-- Messaggio -->\r\n <div\r\n class=\"flex flex-col gap-4 [&_article]:border-0 [&_article]:p-0 [&_article_h3]:text-neutral-400 [&_article_h3]:group-hover:text-neutral-200 [&_article_h3_div_*]:hover:text-white [&_article_p]:text-white\">\r\n <!-- Messaggio default -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Message'\"\r\n [property]=\"{ value: uniError.exception.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Messaggio intero -->\r\n @if(uniError.type === 'be' && uniError.innerException) {\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'InnerMessage'\"\r\n [property]=\"{ value: uniError.innerException.message, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n }\r\n </div>\r\n\r\n <!-- Dettagli -->\r\n @if(storeItem.isOpen) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Details' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-12\">\r\n @if(uniError.type === 'be' || uniError.type === 'server') {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: request -->\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Request' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"flex flex-col gap-x-16 gap-y-4 @md/item:flex-row\">\r\n <!-- Dettagli: request metodo http -->\r\n <uni-dialog-error-article\r\n class=\"shrink-0 @md/item:basis-24\"\r\n [lblTitle]=\"'Method'\"\r\n [property]=\"{ value: uniError.request.method, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n <!-- Dettagli: request url -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Url'\"\r\n [property]=\"{ value: uniError.request.url, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n\r\n <!-- Dettagli: request query params -->\r\n @let queryParams = [...(uniError.request.url | url).searchParams];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'QueryParams'\"\r\n [property]=\"{ value: queryParams, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request headers -->\r\n @let headers = [...uniError.request.headers.entries()];\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Headers'\"\r\n [property]=\"{ value: headers, type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request body -->\r\n @let body = uniError.request | get_body_async | async;\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Body'\"\r\n [property]=\"{ value: body | parse, type: 'json'}\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info -->\r\n <div class=\"flex flex-col gap-4 @md/item:flex-row\">\r\n <!-- Dettagli: request info mode -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Mode'\"\r\n [property]=\"{ value: uniError.request.mode, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info credentials -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'Credentials'\"\r\n [property]=\"{ value: uniError.request.credentials, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: request info cache -->\r\n <uni-dialog-error-article\r\n class=\"flex-1\"\r\n [lblTitle]=\"'CacheMode'\"\r\n [property]=\"{ value: uniError.request.cache, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Dettagli: info -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Diagnostic' | translate }}\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: info durata -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Duration'\"\r\n [property]=\"{ value: `${uniError.durationMs / 1000}s`, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: info user agent -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'UserAgent'\"\r\n [property]=\"{ value: uniError.userAgent, type: 'string' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Dettagli: eccezione -->\r\n <div class=\"flex flex-col gap-4\">\r\n <h2\r\n class=\"text-lg! font-semibold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Exception' | translate }} ({{ uniError.type }})\r\n </h2>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Dettagli: eccezione nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.exception.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione tipo eccezione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.exception.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.exception.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Dettagli: eccezione frames -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Frames'\"\r\n [property]=\"{ value: uniError.exception.stackTraceFrames.map(x => ([x.file, `LINE ${x.line}`])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Interno -->\r\n @if(storeItem.isOpen) { @if((uniError.type === 'be' || uniError.type === 'server') &&\r\n uniError.innerException) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'Inner' | translate }}\r\n </h1>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Interno: nome funzione -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Function'\"\r\n [property]=\"{ value: uniError.innerException.functionName, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: tipo -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Type'\"\r\n [property]=\"{ value: uniError.innerException.type, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n\r\n <!-- Interno: stack trace -->\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'StackTrace'\"\r\n [property]=\"{ value: uniError.innerException.stackTrace, type: 'pre' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n </div>\r\n } }\r\n\r\n <!-- Storico -->\r\n @if(storeItem.isOpen){ @if(storeItem.historyItems.length > 0) {\r\n <div class=\"flex flex-col gap-6 border-t border-t-white/12.5 pt-4\">\r\n <h1\r\n class=\"text-3xl! font-bold text-rose-400/50 transition-colors duration-300 group-hover:text-rose-400\">\r\n {{ 'History' | translate }}\r\n </h1>\r\n <uni-dialog-error-article\r\n [lblTitle]=\"'Timestamp'\"\r\n [property]=\"{ value: (storeItem.historyItems | get_timestamp_formatted).map(x => ([x.message, x.date])), type: 'array' }\"\r\n (onCopyEvt)=\"onCopy($event)\" />\r\n </div>\r\n } }\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n class=\"@container/footer flex flex-col justify-between gap-4 border-t border-white/5 bg-white/1 p-5 pt-4 @lg/item:flex-row @lg/item:items-center\">\r\n <!-- Footer: metadata -->\r\n <div\r\n class=\"flex min-w-0 flex-col items-center justify-between gap-x-4 gap-y-2 overflow-hidden text-xs @2xs/footer:flex-row\">\r\n <!-- Footer: metadata http -->\r\n <p\r\n class=\"squircle flex h-6 max-w-full min-w-22 items-center justify-center gap-2 overflow-hidden rounded-xl border border-white/7.5 bg-white/2.5 px-2.5 py-1 font-mono\">\r\n <span\r\n class=\"font-mono font-bold text-rose-400 transition-colors duration-300 group-hover:text-white\">\r\n HTTP\r\n </span>\r\n <span class=\"font-mono text-neutral-300\"> {{ storeItemData.httpStatus }} </span>\r\n </p>\r\n\r\n <!-- Footer: metadata timestamp -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_TIMER\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"flex-1 truncate overflow-hidden font-mono text-neutral-300\">\r\n {{ storeItem.historyItems.at(-1)?.timestamp| date:'HH:mm:ss' }}\r\n </span>\r\n </p>\r\n\r\n <!-- Footer: metadata count -->\r\n <p class=\"flex h-6 max-w-full min-w-22 items-center gap-2 overflow-hidden font-mono\">\r\n <fa-icon\r\n [icon]=\"ICON_COUNT\"\r\n class=\"text-rose-400 transition-colors duration-300 group-hover:text-white\" />\r\n <span class=\"truncate font-mono text-nowrap text-neutral-300 lowercase\">\r\n {{ storeItem.historyItems.length }} {{ ('Times' | translate) }}\r\n </span>\r\n </p>\r\n </div>\r\n\r\n <!-- Footer: bottoni -->\r\n <div\r\n class=\"touch:opacity-100 flex flex-col items-center justify-center gap-2 transition duration-300 group-hover:opacity-100 @[110px]/footer:flex-row @sm/footer:opacity-10\">\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isCopied ? 'check' : 'copy'\"\r\n [hint]=\"'Copy' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isCopied\"\r\n (click)=\"onCopyAll(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"storeItem.isSaved ? 'check' : 'save'\"\r\n [hint]=\"'Save' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"storeItem.isSaved\"\r\n (click)=\"onSave(storeItem.id)\">\r\n </dx-button>\r\n <dx-button\r\n class=\"h-6! min-w-8! transition-colors duration-200 hover:bg-rose-400! focus:bg-transparent! active:bg-rose-500!\"\r\n [stylingMode]=\"'text'\"\r\n [icon]=\"'trash'\"\r\n [hint]=\"'Delete' | translate : { prefix: 'btn' }\"\r\n [disabled]=\"false\"\r\n (click)=\"onDelete(storeItem.id)\"></dx-button>\r\n </div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </main>\r\n\r\n @if (toast(); as toast) {\r\n <div\r\n class=\"pointer-events-none absolute bottom-6 left-1/2 flex -translate-x-1/2 rounded-lg border border-emerald-500/20 bg-emerald-950/90 px-4 py-2.5 shadow-[0_4px_12px_rgba(0,0,0,0.5),0_2px_4px_rgba(16,185,129,0.1)] backdrop-blur-md transition duration-300\">\r\n <span\r\n class=\"flex items-center gap-2 font-sans text-xs font-medium tracking-wide text-emerald-200\">\r\n <span class=\"font-mono text-sm font-bold text-emerald-400\">✓</span>\r\n {{ toast.label | translate : { prefix: 'toast' } }}\r\n </span>\r\n </div>\r\n }\r\n</div>\r\n","import { NgOptimizedImage } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\r\nimport { DxButtonModule } from 'devextreme-angular/ui/button';\r\n\r\n@Component({\r\n selector: 'uni-header',\r\n standalone: true,\r\n imports: [DxButtonModule, NgOptimizedImage],\r\n templateUrl: './uni-header.html',\r\n styleUrls: ['./uni-header.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UniHeader {\r\n /* Input */\r\n title = input.required<string>();\r\n subTitle = input<string>();\r\n pathBrandLogo = input.required<string>();\r\n pathAppLogo = input<string>();\r\n hasSideMenu = input<boolean>(false);\r\n centralDescription = input<string>();\r\n\r\n /* Output */\r\n evtToggleMenu = output<true>();\r\n}\r\n","<header\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-2 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-10 w-auto\"\r\n alt=\"App logo\" />\r\n }\r\n\r\n <!-- Info -->\r\n <div\r\n class=\"flex h-full flex-auto flex-col justify-between overflow-hidden leading-tight tracking-wider\">\r\n <h1 class=\"my-auto truncate text-xl! font-semibold! uppercase\">{{ title() }}</h1>\r\n @if(subTitle(); as subTitle) {\r\n <h2 class=\"text-sm! font-normal! opacity-75\">{{ subTitle }}</h2>\r\n }\r\n </div>\r\n\r\n @if(centralDescription(); as centralDescription) {\r\n <div class=\"hidden flex-100 sm:flex\">\r\n <p\r\n class=\"squircle mx-auto rounded-full border border-white/5 bg-white/2.5 px-4 py-1.5 text-center text-xl font-bold tracking-wider antialiased\">\r\n {{ centralDescription }}\r\n </p>\r\n </div>\r\n }\r\n\r\n <!-- Brand Logo -->\r\n <div class=\"xs:block hidden h-full min-w-28 py-2.5\">\r\n <div class=\"relative h-full\">\r\n <img [ngSrc]=\"pathBrandLogo()\" fill priority alt=\"Brand logo\" class=\"object-contain\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Button menu -->\r\n @if (hasSideMenu()) {\r\n <dx-button class=\"shadow-none!\" [icon]=\"'menu'\" (onClick)=\"evtToggleMenu.emit(true)\" />\r\n }\r\n</header>\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 faComputer,\r\n faDesktop,\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 versionFe = input.required<string>();\r\n readonly versionBe = input<string>(localStorage.getItem('uni-version-be') ?? '?');\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 FE: faDesktop,\r\n BE: faComputer,\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 isClickedInsideOverlay = !!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 && !isClickedInsideOverlay) {\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 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 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-80 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 <div class=\"flex flex-col gap-2\">\r\n <h1 class=\"text-xl! font-semibold! text-white!\">{{ 'Pages' | translate }}</h1>\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 </div>\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 <div class=\"flex flex-col gap-2\">\r\n <h1 class=\"text-xl! font-semibold! text-white!\">{{ 'Interaction' | translate }}</h1>\r\n <ul class=\"flex flex-col gap-2\">\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 </div>\r\n\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-2\">\r\n <h1 class=\"text-xl! font-semibold! text-white!\">{{ 'Settings' | translate }}</h1>\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 </div>\r\n\r\n <!-- Footer Logo -->\r\n <div class=\"mt-auto flex items-center gap-4 border-t border-white/20 pt-4\">\r\n <div class=\"flex h-full flex-col justify-between tracking-wide text-white opacity-60\">\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon [icon]=\"ICON.FE\"></fa-icon>\r\n <span class=\"truncate\">{{ versionFe() }}</span>\r\n </p>\r\n <p class=\"flex items-center gap-1 truncate\">\r\n <fa-icon [icon]=\"ICON.BE\"></fa-icon>\r\n <span class=\"truncate\">{{ versionBe() }}</span>\r\n </p>\r\n </div>\r\n <img\r\n class=\"ml-auto\"\r\n [ngSrc]=\"pathUnitecLogo()\"\r\n priority\r\n alt=\"Brand logo\"\r\n height=\"36\"\r\n width=\"100\" />\r\n </div>\r\n</aside>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i1"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uni-app-fe",
3
- "version": "0.1.22",
3
+ "version": "0.1.24",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=21.2.0",
6
6
  "@angular/core": ">=21.2.0",
@@ -50,17 +50,14 @@ declare class UniDialogError {
50
50
 
51
51
  declare class UniHeader {
52
52
  title: _angular_core.InputSignal<string>;
53
- versionFe: _angular_core.InputSignal<string>;
54
- versionBe: _angular_core.InputSignal<string>;
53
+ subTitle: _angular_core.InputSignal<string | undefined>;
55
54
  pathBrandLogo: _angular_core.InputSignal<string>;
56
55
  pathAppLogo: _angular_core.InputSignal<string | undefined>;
57
56
  hasSideMenu: _angular_core.InputSignal<boolean>;
58
57
  centralDescription: _angular_core.InputSignal<string | undefined>;
59
58
  evtToggleMenu: _angular_core.OutputEmitterRef<true>;
60
- readonly ICON_FE: _fortawesome_fontawesome_common_types.IconDefinition;
61
- readonly ICON_BE: _fortawesome_fontawesome_common_types.IconDefinition;
62
59
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniHeader, never>;
63
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniHeader, "uni-header", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "versionFe": { "alias": "versionFe"; "required": true; "isSignal": true; }; "versionBe": { "alias": "versionBe"; "required": false; "isSignal": true; }; "pathBrandLogo": { "alias": "pathBrandLogo"; "required": true; "isSignal": true; }; "pathAppLogo": { "alias": "pathAppLogo"; "required": false; "isSignal": true; }; "hasSideMenu": { "alias": "hasSideMenu"; "required": false; "isSignal": true; }; "centralDescription": { "alias": "centralDescription"; "required": false; "isSignal": true; }; }, { "evtToggleMenu": "evtToggleMenu"; }, never, never, true, never>;
60
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniHeader, "uni-header", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "subTitle": { "alias": "subTitle"; "required": false; "isSignal": true; }; "pathBrandLogo": { "alias": "pathBrandLogo"; "required": true; "isSignal": true; }; "pathAppLogo": { "alias": "pathAppLogo"; "required": false; "isSignal": true; }; "hasSideMenu": { "alias": "hasSideMenu"; "required": false; "isSignal": true; }; "centralDescription": { "alias": "centralDescription"; "required": false; "isSignal": true; }; }, { "evtToggleMenu": "evtToggleMenu"; }, never, never, true, never>;
64
61
  }
65
62
 
66
63
  declare class UniItemFieldWithHightContrast {
@@ -137,9 +134,11 @@ interface MenuItem {
137
134
  declare class UniSideMenu {
138
135
  readonly elementRef: ElementRef<any>;
139
136
  readonly uniLoader: UniLoaderService;
137
+ readonly versionFe: _angular_core.InputSignal<string>;
138
+ readonly versionBe: _angular_core.InputSignal<string>;
140
139
  readonly pathUnitecLogo: _angular_core.InputSignal<string>;
141
140
  readonly menuItems: _angular_core.InputSignal<MenuItem[]>;
142
- readonly menuInteractions: _angular_core.InputSignal<MenuInteraction[]>;
141
+ readonly menuInteractions: _angular_core.InputSignal<MenuInteraction[] | undefined>;
143
142
  evtToggleMenu: _angular_core.OutputEmitterRef<false>;
144
143
  locale: uni_manager_locale.Locale;
145
144
  localesSupported: uni_manager_locale.Locale[];
@@ -152,12 +151,14 @@ declare class UniSideMenu {
152
151
  DARK_MODE: _fortawesome_fontawesome_common_types.IconDefinition;
153
152
  LANGUAGE: _fortawesome_fontawesome_common_types.IconDefinition;
154
153
  NOTIFICATION: _fortawesome_fontawesome_common_types.IconDefinition;
154
+ FE: _fortawesome_fontawesome_common_types.IconDefinition;
155
+ BE: _fortawesome_fontawesome_common_types.IconDefinition;
155
156
  };
156
157
  protected onClickOutside(event: Event): void;
157
158
  updateTheme(e: ValueChangedEvent$1): void;
158
159
  updateLocale(e: ValueChangedEvent): void;
159
160
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UniSideMenu, never>;
160
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSideMenu, "uni-side-menu", never, { "pathUnitecLogo": { "alias": "pathUnitecLogo"; "required": true; "isSignal": true; }; "menuItems": { "alias": "menuItems"; "required": false; "isSignal": true; }; "menuInteractions": { "alias": "menuInteractions"; "required": false; "isSignal": true; }; }, { "evtToggleMenu": "evtToggleMenu"; }, never, never, true, never>;
161
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UniSideMenu, "uni-side-menu", never, { "versionFe": { "alias": "versionFe"; "required": true; "isSignal": true; }; "versionBe": { "alias": "versionBe"; "required": false; "isSignal": true; }; "pathUnitecLogo": { "alias": "pathUnitecLogo"; "required": true; "isSignal": true; }; "menuItems": { "alias": "menuItems"; "required": false; "isSignal": true; }; "menuInteractions": { "alias": "menuInteractions"; "required": false; "isSignal": true; }; }, { "evtToggleMenu": "evtToggleMenu"; }, never, never, true, never>;
161
162
  }
162
163
 
163
164
  export { LedStatus, UniBannerAlert, UniDialogError, UniHeader, UniItemField, UniItemFieldWithHightContrast, UniItemFieldWithLensTooltip, UniLed, UniSideMenu };