uni-manager 0.0.61 → 0.0.63
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.
- package/fesm2022/uni-manager.mjs +186 -175
- package/fesm2022/uni-manager.mjs.map +1 -1
- package/package.json +4 -4
- package/types/uni-manager.d.ts +1 -1
package/fesm2022/uni-manager.mjs
CHANGED
|
@@ -78,9 +78,9 @@ class UniFileManager {
|
|
|
78
78
|
// Crea l'iframe e lo aggiunge al body della nuova finestra
|
|
79
79
|
const iframe = this.createIframe(newWindow.document, data.url, '100%', '100%');
|
|
80
80
|
newWindow.document.body.style.margin = '0';
|
|
81
|
-
newWindow.document.body.
|
|
81
|
+
newWindow.document.body.append(iframe);
|
|
82
82
|
// Rimuove l'oggetto URL dalla memoria dopo un tempo congruo per il caricamento
|
|
83
|
-
setTimeout(() => URL.revokeObjectURL(data.url),
|
|
83
|
+
setTimeout(() => URL.revokeObjectURL(data.url), 3000);
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
86
86
|
* Stampa un file aprendo il dialogo di stampa nativo del sistema
|
|
@@ -93,20 +93,20 @@ class UniFileManager {
|
|
|
93
93
|
const iframe = this.createIframe(document, data.url, '0', '0');
|
|
94
94
|
iframe.style.position = 'fixed';
|
|
95
95
|
iframe.style.bottom = '0';
|
|
96
|
-
document.body.
|
|
96
|
+
document.body.append(iframe);
|
|
97
97
|
// Attende il completamento del caricamento del file nell'iframe
|
|
98
|
-
iframe.
|
|
98
|
+
iframe.addEventListener('load', () => {
|
|
99
99
|
// Attesa supplementare per consentire il rendering del PDF
|
|
100
100
|
setTimeout(() => {
|
|
101
101
|
iframe.contentWindow?.focus();
|
|
102
102
|
iframe.contentWindow?.print();
|
|
103
103
|
// Rimozione dell'iframe dal DOM e pulizia della memoria
|
|
104
104
|
setTimeout(() => {
|
|
105
|
-
|
|
105
|
+
iframe.remove();
|
|
106
106
|
URL.revokeObjectURL(data.url);
|
|
107
|
-
},
|
|
108
|
-
},
|
|
109
|
-
};
|
|
107
|
+
}, 1000);
|
|
108
|
+
}, 1000);
|
|
109
|
+
});
|
|
110
110
|
}
|
|
111
111
|
/**
|
|
112
112
|
* Scarica un file localmente sul dispositivo dell'utente
|
|
@@ -120,11 +120,11 @@ class UniFileManager {
|
|
|
120
120
|
link.download = data.name;
|
|
121
121
|
// Opzionale: assicura che il link non sia visibile
|
|
122
122
|
link.style.display = 'none';
|
|
123
|
-
document.body.
|
|
123
|
+
document.body.append(link);
|
|
124
124
|
link.click();
|
|
125
125
|
// Pulizia: rimuove l'elemento e revoca l'URL
|
|
126
126
|
setTimeout(() => {
|
|
127
|
-
|
|
127
|
+
link.remove();
|
|
128
128
|
URL.revokeObjectURL(data.url);
|
|
129
129
|
}, 100);
|
|
130
130
|
}
|
|
@@ -282,9 +282,9 @@ class UniLocaleManager {
|
|
|
282
282
|
}
|
|
283
283
|
// Mappa i parametri in un oggetto di interpolazione: { inlineParam0: val, inlineParam1: val, ... }
|
|
284
284
|
const interpolateParams = {};
|
|
285
|
-
params.
|
|
285
|
+
for (const [index, val] of params.entries()) {
|
|
286
286
|
interpolateParams[`param${index}`] = val;
|
|
287
|
-
}
|
|
287
|
+
}
|
|
288
288
|
return this.translate(label, 'lbl', interpolateParams);
|
|
289
289
|
}
|
|
290
290
|
/* ------------------------------------------------------------------------------- */
|
|
@@ -312,20 +312,22 @@ class UniLocaleManager {
|
|
|
312
312
|
static toDate(date, mode = 'full', force) {
|
|
313
313
|
const dt = new Date(date);
|
|
314
314
|
// Controllo: validità data
|
|
315
|
-
if (isNaN(dt.getTime())) {
|
|
315
|
+
if (Number.isNaN(dt.getTime())) {
|
|
316
316
|
console.error(`[UniLocaleManager] Data non valida fornita a formatDateTime:`, date);
|
|
317
317
|
return '';
|
|
318
318
|
}
|
|
319
319
|
// Controllo: locale da forzare
|
|
320
320
|
const locale = force && this._locale.startsWith(force.oldLang) ? force.newLocale : this._locale;
|
|
321
321
|
switch (mode) {
|
|
322
|
-
case 'date':
|
|
322
|
+
case 'date': {
|
|
323
323
|
return dt.toLocaleDateString(locale);
|
|
324
|
-
|
|
324
|
+
}
|
|
325
|
+
case 'time': {
|
|
325
326
|
return dt.toLocaleTimeString(locale);
|
|
326
|
-
|
|
327
|
-
|
|
327
|
+
}
|
|
328
|
+
case 'full': {
|
|
328
329
|
return dt.toLocaleString(locale);
|
|
330
|
+
}
|
|
329
331
|
}
|
|
330
332
|
}
|
|
331
333
|
}
|
|
@@ -361,13 +363,14 @@ class UniToastManager {
|
|
|
361
363
|
const allParams = { ...interpolateParams };
|
|
362
364
|
/* Estrazione parametri dalla risposta (se esiste ed è un oggetto) */
|
|
363
365
|
if (res && typeof res === 'object') {
|
|
364
|
-
|
|
365
|
-
if (!(key in res))
|
|
366
|
-
|
|
366
|
+
for (const key of resParams ?? []) {
|
|
367
|
+
if (!(key in res)) {
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
367
370
|
const rawValue = res[key];
|
|
368
371
|
// Se esiste un formatter per questa chiave lo si usa, altrimenti valore grezzo
|
|
369
372
|
allParams[key] = formatters?.[key] ? formatters[key](rawValue) : rawValue;
|
|
370
|
-
}
|
|
373
|
+
}
|
|
371
374
|
}
|
|
372
375
|
/* Conteggio array */
|
|
373
376
|
if (resLengthParams && Array.isArray(res)) {
|
|
@@ -463,7 +466,7 @@ async function executeBlob(url, init) {
|
|
|
463
466
|
if (disposition) {
|
|
464
467
|
const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(disposition);
|
|
465
468
|
if (!!matches && matches[1]) {
|
|
466
|
-
fileName = matches[1].
|
|
469
|
+
fileName = matches[1].replaceAll(/['"]/g, '');
|
|
467
470
|
}
|
|
468
471
|
}
|
|
469
472
|
/* Genera l'URL temporaneo dal blob */
|
|
@@ -475,7 +478,7 @@ async function executeBlob(url, init) {
|
|
|
475
478
|
* Aggiunge una nuova ref nello store solo se non è già presente.
|
|
476
479
|
* Se l'ID esiste già, l'operazione viene interrotta per preservare il dato originale.
|
|
477
480
|
*/
|
|
478
|
-
function add(id,
|
|
481
|
+
function add(id, url, type) {
|
|
479
482
|
// Recupera l'ultimo stato (Map)
|
|
480
483
|
const oldMap = UniHttpManager.currentValue;
|
|
481
484
|
// Controllo: se è presente l'item allora termina
|
|
@@ -484,7 +487,7 @@ function add(id, lineId, url, type) {
|
|
|
484
487
|
// Crea il nuovo oggetto
|
|
485
488
|
const newItemMap = {
|
|
486
489
|
type,
|
|
487
|
-
lineId,
|
|
490
|
+
lineId: undefined,
|
|
488
491
|
url,
|
|
489
492
|
hasError: false,
|
|
490
493
|
pendingCount: 0,
|
|
@@ -568,15 +571,18 @@ function removeAll() {
|
|
|
568
571
|
function operatorHandler(operator) {
|
|
569
572
|
// Gestione della concorrenza in base al parametro
|
|
570
573
|
switch (operator) {
|
|
571
|
-
case MapOperator.EXHAUST_MAP:
|
|
574
|
+
case MapOperator.EXHAUST_MAP: {
|
|
572
575
|
return (project) => exhaustMap(project);
|
|
573
|
-
|
|
576
|
+
}
|
|
577
|
+
case MapOperator.CONCAT_MAP: {
|
|
574
578
|
return (project) => concatMap(project);
|
|
575
|
-
|
|
579
|
+
}
|
|
580
|
+
case MapOperator.MERGE_MAP: {
|
|
576
581
|
return (project) => mergeMap(project);
|
|
577
|
-
|
|
578
|
-
|
|
582
|
+
}
|
|
583
|
+
case MapOperator.SWITCH_MAP: {
|
|
579
584
|
return (project) => switchMap(project);
|
|
585
|
+
}
|
|
580
586
|
}
|
|
581
587
|
}
|
|
582
588
|
function errorHandler(err, errorMode, ref) {
|
|
@@ -588,16 +594,19 @@ function errorHandler(err, errorMode, ref) {
|
|
|
588
594
|
updateHasError(ref, true);
|
|
589
595
|
// Gestione dell'errore in base al parametro
|
|
590
596
|
switch (errorMode) {
|
|
591
|
-
case PollingErrorMode.IGNORE:
|
|
592
|
-
return of(
|
|
593
|
-
|
|
597
|
+
case PollingErrorMode.IGNORE: {
|
|
598
|
+
return of();
|
|
599
|
+
}
|
|
600
|
+
case PollingErrorMode.SKIP: {
|
|
594
601
|
return EMPTY;
|
|
602
|
+
}
|
|
595
603
|
case PollingErrorMode.IGNORE_WITH_ERROR: {
|
|
596
|
-
|
|
597
|
-
|
|
604
|
+
{
|
|
605
|
+
UniErrorManager.add(ref, err);
|
|
606
|
+
return of();
|
|
607
|
+
}
|
|
598
608
|
}
|
|
599
|
-
case PollingErrorMode.STOP:
|
|
600
|
-
default: {
|
|
609
|
+
case PollingErrorMode.STOP: {
|
|
601
610
|
UniErrorManager.add(ref, err);
|
|
602
611
|
return throwError(() => err);
|
|
603
612
|
}
|
|
@@ -612,7 +621,7 @@ function http$(url, refType, config, promiseFactory) {
|
|
|
612
621
|
return http$.pipe(tap({
|
|
613
622
|
subscribe: () => {
|
|
614
623
|
/* Creazione reference */
|
|
615
|
-
add(ref,
|
|
624
|
+
add(ref, url, refType);
|
|
616
625
|
/* Incrementa per il loader */
|
|
617
626
|
if (hasLoader !== false) {
|
|
618
627
|
updateIsLoading(ref, 1);
|
|
@@ -646,7 +655,7 @@ function httpPolling$(url, config, promiseFactory) {
|
|
|
646
655
|
const source$ = timer$.pipe(tap({
|
|
647
656
|
subscribe: () => {
|
|
648
657
|
/* Creazione reference */
|
|
649
|
-
add(ref,
|
|
658
|
+
add(ref, url, 'polling');
|
|
650
659
|
},
|
|
651
660
|
unsubscribe: () => {
|
|
652
661
|
/* Rimozione reference */
|
|
@@ -686,6 +695,123 @@ function httpPolling$(url, config, promiseFactory) {
|
|
|
686
695
|
: source$;
|
|
687
696
|
}
|
|
688
697
|
|
|
698
|
+
/**
|
|
699
|
+
* Classe di utilità per la gestione e formattazione delle date.
|
|
700
|
+
* Fornisce metodi per convertire in modo sicuro valori di tipo Date, stringa o null in formati standardizzati.
|
|
701
|
+
*/
|
|
702
|
+
class UniTypeDateManager {
|
|
703
|
+
static toYYYYMMDD(date) {
|
|
704
|
+
if (!date)
|
|
705
|
+
return '';
|
|
706
|
+
const d = new Date(date);
|
|
707
|
+
if (Number.isNaN(d.getTime()))
|
|
708
|
+
return '';
|
|
709
|
+
const year = d.getFullYear();
|
|
710
|
+
const month = String(d.getMonth() + 1).padStart(2, '0');
|
|
711
|
+
const day = String(d.getDate()).padStart(2, '0');
|
|
712
|
+
return `${year}-${month}-${day}`;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
/**
|
|
717
|
+
* Utility per la gestione e formattazione di valori numerici.
|
|
718
|
+
*/
|
|
719
|
+
class UniTypeNumberManager {
|
|
720
|
+
/** Applica il padding a un numero o una stringa */
|
|
721
|
+
static toPad(value, count, character = '0') {
|
|
722
|
+
// Se il valore è null/undefined, riempiamo l'intero campo con il carattere scelto
|
|
723
|
+
if (value === null || value === undefined) {
|
|
724
|
+
return ''.padStart(count, character);
|
|
725
|
+
}
|
|
726
|
+
// Convertiamo in stringa e applichiamo il padding
|
|
727
|
+
return value.toString().padStart(count, character);
|
|
728
|
+
}
|
|
729
|
+
/** Formatta un numero in una versione leggibile (es: 1000 -> 1K, 1000000 -> 1M) */
|
|
730
|
+
static toTruncateAndAdUdm(value, decimalDigits = 0, maxIntegerDigits = 3) {
|
|
731
|
+
// Nessun limite impostato o numero inferiore alla soglia definita
|
|
732
|
+
if (Math.abs(value) < Math.pow(10, maxIntegerDigits)) {
|
|
733
|
+
return value.toFixed(decimalDigits);
|
|
734
|
+
}
|
|
735
|
+
// Definizione delle scale di riduzione per grandi numeri
|
|
736
|
+
const scales = [
|
|
737
|
+
{ threshold: 1e12, suffix: 'T' }, // Trilioni
|
|
738
|
+
{ threshold: 1e9, suffix: 'B' }, // Miliardi
|
|
739
|
+
{ threshold: 1e6, suffix: 'M' }, // Milioni
|
|
740
|
+
{ threshold: 1e3, suffix: 'K' }, // Migliaia
|
|
741
|
+
];
|
|
742
|
+
// Itera dalla scala più grande alla più piccola per trovare la soglia corretta
|
|
743
|
+
for (const { threshold, suffix } of scales) {
|
|
744
|
+
if (Math.abs(value) >= threshold) {
|
|
745
|
+
const reduced = value / threshold;
|
|
746
|
+
// parseFloat(toFixed()) rimuove gli zeri decimali superflui (es: 1.50 -> 1.5)
|
|
747
|
+
// aggiungendo poi il relativo suffisso (K, M, B, T)
|
|
748
|
+
return Number.parseFloat(reduced.toFixed(decimalDigits)).toString() + suffix;
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
// Fallback: se il numero è grande ma non rientra nelle scale (caso raro con la logica attuale)
|
|
752
|
+
return value.toFixed(decimalDigits);
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
/**
|
|
757
|
+
* Utility per la manipolazione di stringhe
|
|
758
|
+
*/
|
|
759
|
+
class UniTypeStringManager {
|
|
760
|
+
/** Converte una stringa in formato lblPascalCase (es. "user_id" -> "lblUserId") */
|
|
761
|
+
static toLabelize(key, prefix = 'lbl') {
|
|
762
|
+
// Se vuoto restituisce vuoto
|
|
763
|
+
if (!key)
|
|
764
|
+
return '';
|
|
765
|
+
// Unisce il prefisso
|
|
766
|
+
return prefix + this.toPascalCase(key);
|
|
767
|
+
}
|
|
768
|
+
/** Converte una stringa in PascalCase (es. "user_id" -> "UserId") */
|
|
769
|
+
static toPascalCase(key) {
|
|
770
|
+
// Se vuoto restituisce vuoto
|
|
771
|
+
if (!key)
|
|
772
|
+
return '';
|
|
773
|
+
// Normalizza e pulisce
|
|
774
|
+
const parts = this.splitString(key);
|
|
775
|
+
if (parts.length === 0)
|
|
776
|
+
return '';
|
|
777
|
+
// Converte in PascalCase
|
|
778
|
+
const pascalCased = this.toPascalCaseParts(parts);
|
|
779
|
+
return pascalCased;
|
|
780
|
+
}
|
|
781
|
+
/** Converte una stringa in camelCase (es. "user_id" -> "userId") */
|
|
782
|
+
static toCamelCase(key) {
|
|
783
|
+
// Se vuoto restituisce vuoto
|
|
784
|
+
if (!key)
|
|
785
|
+
return '';
|
|
786
|
+
// Normalizza e pulisce
|
|
787
|
+
const parts = this.splitString(key);
|
|
788
|
+
if (parts.length === 0)
|
|
789
|
+
return '';
|
|
790
|
+
// La prima parola resta minuscola, le successive PascalCase
|
|
791
|
+
const first = parts[0].toLowerCase();
|
|
792
|
+
const rest = parts.slice(1);
|
|
793
|
+
return first + this.toPascalCaseParts(rest);
|
|
794
|
+
}
|
|
795
|
+
/** Capitalizza solo la prima lettera della stringa */
|
|
796
|
+
static toCapitalize(key) {
|
|
797
|
+
// Se vuoto restituisce vuoto
|
|
798
|
+
if (!key)
|
|
799
|
+
return '';
|
|
800
|
+
return key.charAt(0).toUpperCase() + key.slice(1);
|
|
801
|
+
}
|
|
802
|
+
/* ----------------- Utils ----------------- */
|
|
803
|
+
static splitString(key) {
|
|
804
|
+
return key
|
|
805
|
+
.trim()
|
|
806
|
+
.replace(/^[-_\s]+/, '') // Rimuove separatori iniziali
|
|
807
|
+
.split(/[-_\s]+/)
|
|
808
|
+
.filter(Boolean);
|
|
809
|
+
}
|
|
810
|
+
static toPascalCaseParts(parts) {
|
|
811
|
+
return parts.map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()).join('');
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
|
|
689
815
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
690
816
|
/**
|
|
691
817
|
* Costruisce un URL completo per l'API partendo dai parametri di configurazione.
|
|
@@ -695,21 +821,24 @@ function getUrl(hostname, port, path, params) {
|
|
|
695
821
|
const url = new URL(`/api${path}`, base);
|
|
696
822
|
// Aggiungi i parametri
|
|
697
823
|
if (params) {
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
824
|
+
for (const [key, val] of Object.entries(params)) {
|
|
825
|
+
// Usiamo continue per saltare i valori vuoti
|
|
826
|
+
if (val === undefined || val === null) {
|
|
827
|
+
continue;
|
|
701
828
|
}
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
829
|
+
// Array
|
|
830
|
+
if (Array.isArray(val)) {
|
|
831
|
+
const params = val;
|
|
832
|
+
for (const param of params) {
|
|
833
|
+
if (!param)
|
|
834
|
+
continue;
|
|
835
|
+
url.searchParams.append(key, val instanceof Date ? UniTypeDateManager.toYYYYMMDD(param) : String(param));
|
|
836
|
+
}
|
|
837
|
+
continue;
|
|
710
838
|
}
|
|
711
|
-
|
|
712
|
-
|
|
839
|
+
// Valore singolo
|
|
840
|
+
url.searchParams.append(key, val instanceof Date ? UniTypeDateManager.toYYYYMMDD(val) : String(val));
|
|
841
|
+
}
|
|
713
842
|
}
|
|
714
843
|
return url;
|
|
715
844
|
}
|
|
@@ -721,10 +850,9 @@ function normalizeHttpBody(body, isRoot = true) {
|
|
|
721
850
|
if (body === null || body === undefined) {
|
|
722
851
|
return body;
|
|
723
852
|
}
|
|
724
|
-
// Gestione STRINGHE: trim
|
|
853
|
+
// Gestione STRINGHE: trim
|
|
725
854
|
if (typeof body === 'string') {
|
|
726
|
-
|
|
727
|
-
return (trimmed === '' ? null : trimmed);
|
|
855
|
+
return body.trim();
|
|
728
856
|
}
|
|
729
857
|
// Gestione ARRAY: normalizziamo ogni elemento ricorsivamente
|
|
730
858
|
if (Array.isArray(body)) {
|
|
@@ -831,7 +959,7 @@ class UniHttpManager {
|
|
|
831
959
|
/* Toast di default */
|
|
832
960
|
const configCustom = {
|
|
833
961
|
...config,
|
|
834
|
-
toast: config.toast === null ?
|
|
962
|
+
toast: config.toast === null ? undefined : (config.toast ?? { label: 'OperationCompleted' }),
|
|
835
963
|
};
|
|
836
964
|
/* Chiama API */
|
|
837
965
|
const url = getUrl(this.hostname, this.port, path, config.params);
|
|
@@ -857,7 +985,7 @@ class UniHttpManager {
|
|
|
857
985
|
/* Toast di default */
|
|
858
986
|
const configCustom = {
|
|
859
987
|
...config,
|
|
860
|
-
toast: config.toast === null ?
|
|
988
|
+
toast: config.toast === null ? undefined : (config.toast ?? { label: 'OperationCompleted' }),
|
|
861
989
|
};
|
|
862
990
|
/* Chiama API */
|
|
863
991
|
const url = getUrl(this.hostname, this.port, path, config.params);
|
|
@@ -881,7 +1009,7 @@ class UniHttpManager {
|
|
|
881
1009
|
/* Toast di default */
|
|
882
1010
|
const configCustom = {
|
|
883
1011
|
...config,
|
|
884
|
-
toast: config.toast === null ?
|
|
1012
|
+
toast: config.toast === null ? undefined : (config.toast ?? { label: 'OperationCompleted' }),
|
|
885
1013
|
};
|
|
886
1014
|
/* Chiama API */
|
|
887
1015
|
const url = getUrl(this.hostname, this.port, path, config.params);
|
|
@@ -902,7 +1030,7 @@ class UniHttpManager {
|
|
|
902
1030
|
/* Toast di default */
|
|
903
1031
|
const configCustom = {
|
|
904
1032
|
...config,
|
|
905
|
-
toast: config.toast === null ?
|
|
1033
|
+
toast: config.toast === null ? undefined : (config.toast ?? { label: 'OperationCompleted' }),
|
|
906
1034
|
};
|
|
907
1035
|
/* Chiama API */
|
|
908
1036
|
const url = getUrl(this.hostname, this.port, path, config.params);
|
|
@@ -968,123 +1096,6 @@ class UniHttpManager {
|
|
|
968
1096
|
|
|
969
1097
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
970
1098
|
|
|
971
|
-
/**
|
|
972
|
-
* Classe di utilità per la gestione e formattazione delle date.
|
|
973
|
-
* Fornisce metodi per convertire in modo sicuro valori di tipo Date, stringa o null in formati standardizzati.
|
|
974
|
-
*/
|
|
975
|
-
class UniTypeDateManager {
|
|
976
|
-
static toYYYYMMDD(date) {
|
|
977
|
-
if (!date)
|
|
978
|
-
return '';
|
|
979
|
-
const d = new Date(date);
|
|
980
|
-
if (isNaN(d.getTime()))
|
|
981
|
-
return '';
|
|
982
|
-
const year = d.getFullYear();
|
|
983
|
-
const month = String(d.getMonth() + 1).padStart(2, '0');
|
|
984
|
-
const day = String(d.getDate()).padStart(2, '0');
|
|
985
|
-
return `${year}-${month}-${day}`;
|
|
986
|
-
}
|
|
987
|
-
}
|
|
988
|
-
|
|
989
|
-
/**
|
|
990
|
-
* Utility per la gestione e formattazione di valori numerici.
|
|
991
|
-
*/
|
|
992
|
-
class UniTypeNumberManager {
|
|
993
|
-
/** Applica il padding a un numero o una stringa */
|
|
994
|
-
static toPad(value, count, character = '0') {
|
|
995
|
-
// Se il valore è null/undefined, riempiamo l'intero campo con il carattere scelto
|
|
996
|
-
if (value === null || value === undefined) {
|
|
997
|
-
return ''.padStart(count, character);
|
|
998
|
-
}
|
|
999
|
-
// Convertiamo in stringa e applichiamo il padding
|
|
1000
|
-
return value.toString().padStart(count, character);
|
|
1001
|
-
}
|
|
1002
|
-
/** Formatta un numero in una versione leggibile (es: 1000 -> 1K, 1000000 -> 1M) */
|
|
1003
|
-
static toTruncateAndAdUdm(value, decimalDigits = 0, maxIntegerDigits = 3) {
|
|
1004
|
-
// Nessun limite impostato o numero inferiore alla soglia definita
|
|
1005
|
-
if (Math.abs(value) < Math.pow(10, maxIntegerDigits)) {
|
|
1006
|
-
return value.toFixed(decimalDigits);
|
|
1007
|
-
}
|
|
1008
|
-
// Definizione delle scale di riduzione per grandi numeri
|
|
1009
|
-
const scales = [
|
|
1010
|
-
{ threshold: 1e12, suffix: 'T' }, // Trilioni
|
|
1011
|
-
{ threshold: 1e9, suffix: 'B' }, // Miliardi
|
|
1012
|
-
{ threshold: 1e6, suffix: 'M' }, // Milioni
|
|
1013
|
-
{ threshold: 1e3, suffix: 'K' }, // Migliaia
|
|
1014
|
-
];
|
|
1015
|
-
// Itera dalla scala più grande alla più piccola per trovare la soglia corretta
|
|
1016
|
-
for (const { threshold, suffix } of scales) {
|
|
1017
|
-
if (Math.abs(value) >= threshold) {
|
|
1018
|
-
const reduced = value / threshold;
|
|
1019
|
-
// parseFloat(toFixed()) rimuove gli zeri decimali superflui (es: 1.50 -> 1.5)
|
|
1020
|
-
// aggiungendo poi il relativo suffisso (K, M, B, T)
|
|
1021
|
-
return parseFloat(reduced.toFixed(decimalDigits)).toString() + suffix;
|
|
1022
|
-
}
|
|
1023
|
-
}
|
|
1024
|
-
// Fallback: se il numero è grande ma non rientra nelle scale (caso raro con la logica attuale)
|
|
1025
|
-
return value.toFixed(decimalDigits);
|
|
1026
|
-
}
|
|
1027
|
-
}
|
|
1028
|
-
|
|
1029
|
-
/**
|
|
1030
|
-
* Utility per la manipolazione di stringhe
|
|
1031
|
-
*/
|
|
1032
|
-
class UniTypeStringManager {
|
|
1033
|
-
/** Converte una stringa in formato lblPascalCase (es. "user_id" -> "lblUserId") */
|
|
1034
|
-
static toLabelize(key, prefix = 'lbl') {
|
|
1035
|
-
// Se vuoto restituisce vuoto
|
|
1036
|
-
if (!key)
|
|
1037
|
-
return '';
|
|
1038
|
-
// Unisce il prefisso
|
|
1039
|
-
return prefix + this.toPascalCase(key);
|
|
1040
|
-
}
|
|
1041
|
-
/** Converte una stringa in PascalCase (es. "user_id" -> "UserId") */
|
|
1042
|
-
static toPascalCase(key) {
|
|
1043
|
-
// Se vuoto restituisce vuoto
|
|
1044
|
-
if (!key)
|
|
1045
|
-
return '';
|
|
1046
|
-
// Normalizza e pulisce
|
|
1047
|
-
const parts = this.splitString(key);
|
|
1048
|
-
if (parts.length === 0)
|
|
1049
|
-
return '';
|
|
1050
|
-
// Converte in PascalCase
|
|
1051
|
-
const pascalCased = this.toPascalCaseParts(parts);
|
|
1052
|
-
return pascalCased;
|
|
1053
|
-
}
|
|
1054
|
-
/** Converte una stringa in camelCase (es. "user_id" -> "userId") */
|
|
1055
|
-
static toCamelCase(key) {
|
|
1056
|
-
// Se vuoto restituisce vuoto
|
|
1057
|
-
if (!key)
|
|
1058
|
-
return '';
|
|
1059
|
-
// Normalizza e pulisce
|
|
1060
|
-
const parts = this.splitString(key);
|
|
1061
|
-
if (parts.length === 0)
|
|
1062
|
-
return '';
|
|
1063
|
-
// La prima parola resta minuscola, le successive PascalCase
|
|
1064
|
-
const first = parts[0].toLowerCase();
|
|
1065
|
-
const rest = parts.slice(1);
|
|
1066
|
-
return first + this.toPascalCaseParts(rest);
|
|
1067
|
-
}
|
|
1068
|
-
/** Capitalizza solo la prima lettera della stringa */
|
|
1069
|
-
static toCapitalize(key) {
|
|
1070
|
-
// Se vuoto restituisce vuoto
|
|
1071
|
-
if (!key)
|
|
1072
|
-
return '';
|
|
1073
|
-
return key.charAt(0).toUpperCase() + key.slice(1);
|
|
1074
|
-
}
|
|
1075
|
-
/* ----------------- Utils ----------------- */
|
|
1076
|
-
static splitString(key) {
|
|
1077
|
-
return key
|
|
1078
|
-
.trim()
|
|
1079
|
-
.replace(/^[-_\s]+/, '') // Rimuove separatori iniziali
|
|
1080
|
-
.split(/[-_\s]+/)
|
|
1081
|
-
.filter(Boolean);
|
|
1082
|
-
}
|
|
1083
|
-
static toPascalCaseParts(parts) {
|
|
1084
|
-
return parts.map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()).join('');
|
|
1085
|
-
}
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
1099
|
/*
|
|
1089
1100
|
* Public API Surface of uni-manager
|
|
1090
1101
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uni-manager.mjs","sources":["../../../projects/uni-manager/src/lib/error/manager.ts","../../../projects/uni-manager/src/lib/file/manager.ts","../../../projects/uni-manager/src/lib/http/enum.ts","../../../projects/uni-manager/src/lib/locale/manager.ts","../../../projects/uni-manager/src/lib/toast/manager.ts","../../../projects/uni-manager/src/lib/http/execute.ts","../../../projects/uni-manager/src/lib/http/ref.ts","../../../projects/uni-manager/src/lib/http/handler.ts","../../../projects/uni-manager/src/lib/http/http.ts","../../../projects/uni-manager/src/lib/http/util.ts","../../../projects/uni-manager/src/lib/http/manager.ts","../../../projects/uni-manager/src/lib/http/model.ts","../../../projects/uni-manager/src/lib/type/date.manager.ts","../../../projects/uni-manager/src/lib/type/number.manager.ts","../../../projects/uni-manager/src/lib/type/string.manager.ts","../../../projects/uni-manager/src/public-api.ts","../../../projects/uni-manager/src/uni-manager.ts"],"sourcesContent":["import { BehaviorSubject, type Observable } from 'rxjs';\r\nimport type { IUniFeError, IUniHttpError } from 'uni-error';\r\n\r\nexport class UniErrorManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n private static store = new BehaviorSubject<Map<string, IUniFeError | IUniHttpError>>(new Map());\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$: Observable<Map<string, IUniFeError | IUniHttpError>> =\r\n UniErrorManager.store.asObservable();\r\n\r\n /** Ottiene lo stato attuale della Map senza dover sottoscrivere l'observable */\r\n public static get currentValue(): Map<string, IUniFeError | IUniHttpError> {\r\n return UniErrorManager.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: store -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Aggiunge o aggiorna un errore nello store.\r\n * Se l'errore esiste già (stesso ID), incrementa il contatore 'count'.\r\n */\r\n public static add(id: string, error: IUniHttpError | IUniFeError): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniErrorManager.currentValue;\r\n\r\n // Tenta di recuperare l'oggetto corrente\r\n const oldItem = oldMap.get(id);\r\n\r\n // Crea il nuovo oggetto\r\n const newItemMap: IUniFeError | IUniHttpError = {\r\n ...error,\r\n count: oldItem ? oldItem.count + 1 : 1,\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n\r\n /**\r\n * Rimuove un errore tramite ID\r\n */\r\n public static remove(id: string): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniErrorManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n if (!oldMap.has(id)) return;\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.delete(id);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n\r\n /**\r\n * Svuota completamente la lista degli errori\r\n */\r\n public static removeAll(): void {\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map();\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n}\r\n","import { FileDatasource } from './model';\r\n\r\nexport class UniFileManager {\r\n /**\r\n * Apre un file (es. PDF, immagine) in una nuova scheda del browser\r\n * Il contenuto viene caricato all'interno di un iframe per garantire compatibilità di visualizzazione\r\n */\r\n public static openInNewTab(data: FileDatasource | undefined): void {\r\n if (!data || !data.url) return;\r\n\r\n const newWindow = window.open('', '_blank');\r\n if (!newWindow) return;\r\n\r\n newWindow.document.title = data.name;\r\n\r\n // Crea l'iframe e lo aggiunge al body della nuova finestra\r\n const iframe = this.createIframe(newWindow.document, data.url, '100%', '100%');\r\n newWindow.document.body.style.margin = '0';\r\n newWindow.document.body.appendChild(iframe);\r\n\r\n // Rimuove l'oggetto URL dalla memoria dopo un tempo congruo per il caricamento\r\n setTimeout(() => URL.revokeObjectURL(data.url), 3_000);\r\n }\r\n\r\n /**\r\n * Stampa un file aprendo il dialogo di stampa nativo del sistema\r\n * Utilizza un iframe invisibile per non interrompere la navigazione\r\n */\r\n public static openInPrintPreview(data: FileDatasource | undefined): void {\r\n if (!data || !data.url) return;\r\n\r\n // Crea l'iframe come elemento fisso e nascosto (dimensioni zero)\r\n const iframe = this.createIframe(document, data.url, '0', '0');\r\n iframe.style.position = 'fixed';\r\n iframe.style.bottom = '0';\r\n document.body.appendChild(iframe);\r\n\r\n // Attende il completamento del caricamento del file nell'iframe\r\n iframe.onload = (): void => {\r\n // Attesa supplementare per consentire il rendering del PDF\r\n setTimeout(() => {\r\n iframe.contentWindow?.focus();\r\n iframe.contentWindow?.print();\r\n\r\n // Rimozione dell'iframe dal DOM e pulizia della memoria\r\n setTimeout(() => {\r\n document.body.removeChild(iframe);\r\n URL.revokeObjectURL(data.url);\r\n }, 1_000);\r\n }, 1_000);\r\n };\r\n }\r\n\r\n /**\r\n * Scarica un file localmente sul dispositivo dell'utente\r\n */\r\n public static download(data: FileDatasource | undefined): void {\r\n if (!data || !data.url) return;\r\n\r\n const link = document.createElement('a');\r\n link.href = data.url;\r\n\r\n // Specifica il nome con cui il file verrà salvato\r\n link.download = data.name;\r\n\r\n // Opzionale: assicura che il link non sia visibile\r\n link.style.display = 'none';\r\n\r\n document.body.appendChild(link);\r\n link.click();\r\n\r\n // Pulizia: rimuove l'elemento e revoca l'URL\r\n setTimeout(() => {\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(data.url);\r\n }, 100);\r\n }\r\n\r\n /* ----------------------------- Utils ----------------------------- */\r\n private static createIframe(\r\n doc: Document,\r\n url: string,\r\n width: string,\r\n height: string,\r\n ): HTMLIFrameElement {\r\n const iframe = doc.createElement('iframe');\r\n iframe.src = url;\r\n iframe.style.width = width;\r\n iframe.style.height = height;\r\n iframe.style.border = 'none';\r\n return iframe;\r\n }\r\n}\r\n","export enum MapOperator {\r\n\t/** Cancella la precedente richiesta, mantiene solo l’ultima */\r\n\tSWITCH_MAP,\r\n\r\n\t/** Ignora nuovi valori finché la corrente non finisce */\r\n\tEXHAUST_MAP,\r\n\r\n\t/** Mette le richieste in coda, le esegue una alla volta */\r\n\tCONCAT_MAP,\r\n\r\n\t/** Esegue tutte le richieste in parallelo, ordine non garantito */\r\n\tMERGE_MAP\r\n}\r\n\r\nexport enum PollingErrorMode {\r\n\t/** Salta questa iterazione emettendo un undefined. Il polling continua al tick successivo. */\r\n\tIGNORE,\r\n\r\n\t/** Salta questa iterazione senza emettere valori. Il polling continua al tick successivo. */\r\n\tSKIP,\r\n\r\n\t/** Interrompe il polling propagando l'errore. */\r\n\tSTOP,\r\n\r\n\t/** Ignora l'errore, lo salva (es. per UI), e continua il polling. Emette `undefined`. */\r\n\tIGNORE_WITH_ERROR\r\n}\r\n\r\nexport enum EmitValueMode {\r\n\t/** Aggiorna lo stato solo se arrivano dati nuovi (distinct) */\r\n\tON_NEW_DATA,\r\n\r\n\t/** Aggiorna lo stato ad ogni chiamata, anche se i dati sono uguali */\r\n\tEVERY_TIME\r\n}\r\n","import { BehaviorSubject, map, Observable } from 'rxjs';\r\n\r\nexport class UniLocaleManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------------- Config ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Codice lingua corrente (es. 'it-IT', 'en-US') usato per formattare date e numeri */\r\n private static _locale = navigator.language ?? 'en-US';\r\n\r\n /** Elenco dei codici lingua supportati dall'applicazione (es. ['it-IT', 'en-US']) */\r\n private static _localesSupported: string[] = [];\r\n\r\n /** Prefisso globale applicato a tutte le chiavi di traduzione (es. 'APP_') */\r\n private static _prefix: string | undefined = undefined;\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* --------------------------------- Metodi: get --------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Restituisce il codice lingua corrente */\r\n public static get locale(): string {\r\n return this._locale;\r\n }\r\n\r\n /** Restituisce l'array contenente tutti i codici locale supportati.*/\r\n public static get localesSupported(): string[] {\r\n return this._localesSupported;\r\n }\r\n\r\n /** Restituisce solo la lingua (es. 'it') */\r\n public static get language(): string {\r\n return this._locale.split('-')[0];\r\n }\r\n\r\n /** Restituisce solo il paese (es. 'IT') */\r\n public static get region(): string {\r\n const parts = this._locale.split('-');\r\n return parts.length > 1 ? parts[1] : '';\r\n }\r\n\r\n /** Restituisce se lo store ha le traduzioni o meno */\r\n public static get hasTranslation$(): Observable<boolean> {\r\n return this.store$.pipe(map((x) => Object.keys(x).length > 1));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n public static store = new BehaviorSubject<Record<string, string>>({});\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$ = this.store.asObservable();\r\n\r\n /** Ottiene il dizionario attuale senza sottoscrizione */\r\n public static get currentValue(): Record<string, string> {\r\n return this.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: setup -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Inizializza la configurazione di rete del manager.\r\n * Deve essere chiamato prima di effettuare qualsiasi richiesta HTTP.\r\n */\r\n public static setup(locale: string | null | undefined, prefix?: string): void {\r\n this._locale = locale ?? 'en-US';\r\n this._prefix = prefix;\r\n }\r\n\r\n /** Imposta l'elenco dei codici lingua supportati dall'applicazione */\r\n public static setLocalesSupported(locales: string[] | undefined): void {\r\n this._localesSupported = locales ?? [];\r\n }\r\n\r\n /**\r\n * Aggiorna lo store locale con il dizionario delle traduzioni fornito.\r\n * Se viene passato undefined, lo store viene inizializzato come oggetto vuoto.\r\n */\r\n public static setTranslations(translations: Record<string, string> | undefined): void {\r\n this.store.next(translations ?? {});\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------- Metodi: traduzioni ------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Traduce una label in base al dizionario caricato.\r\n * Gestisce la composizione della chiave, i parametri dinamici (interpolazione) e il fallback.\r\n */\r\n public static translate(\r\n key: string,\r\n prefix = 'lbl',\r\n interpolateParams?: Record<string, string | number | Date>,\r\n ): string {\r\n if (!key) return '-';\r\n\r\n // Costruzione chiave: prefissoGlobale + prefissoLocale + LabelConInizialeMaiuscola\r\n const cleanKey = key.trim();\r\n const keyWithoutPrefix = cleanKey.replace(new RegExp(`^(${prefix})+`, 'i'), '');\r\n const capitalizedKey = keyWithoutPrefix.charAt(0).toUpperCase() + keyWithoutPrefix.slice(1);\r\n const finalKey = `${this._prefix ?? ''}${prefix}${capitalizedKey}`;\r\n\r\n // Cerca la chiave in minuscolo (standardizzazione)\r\n let translation = this.currentValue?.[finalKey.toLowerCase()];\r\n\r\n // Log e fallback se la traduzione manca\r\n if (!translation) {\r\n console.warn(`Translation missing for key: ${finalKey}`);\r\n return `🔑 ${finalKey}`;\r\n }\r\n\r\n // Interpolazione variabili\r\n if (interpolateParams) {\r\n for (const [key, value] of Object.entries(interpolateParams)) {\r\n const displayValue =\r\n value instanceof Date ? value.toLocaleDateString(this._locale) : String(value);\r\n\r\n translation = translation.replaceAll(`{{${key}}}`, displayValue);\r\n }\r\n }\r\n\r\n return translation;\r\n }\r\n\r\n /**\r\n * Traduce una stringa che contiene parametri separati da un carattere specifico.\r\n * Supporta ora un numero arbitrario di parametri in formato \"label/param1/param2\"\r\n * o semplicemente \"label\".\r\n */\r\n public static translateInlineParams(keyWithParams: string, splitChar: string): string {\r\n if (!keyWithParams) return '-';\r\n\r\n const [label, ...params] = keyWithParams.split(splitChar);\r\n\r\n // Se non ci sono parametri, esegui una traduzione semplice\r\n if (params.length === 0) {\r\n return this.translate(label);\r\n }\r\n\r\n // Mappa i parametri in un oggetto di interpolazione: { inlineParam0: val, inlineParam1: val, ... }\r\n const interpolateParams: Record<string, string> = {};\r\n params.forEach((val, index) => {\r\n interpolateParams[`param${index}`] = val;\r\n });\r\n\r\n return this.translate(label, 'lbl', interpolateParams);\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------- Metodi: numeri -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Converte un valore numerico in una stringa formattata secondo il locale impostato.\r\n * Disabilita i separatori delle migliaia e forza un numero fisso di decimali.\r\n */\r\n public static toStringNumber(value: number, decimal: number): string {\r\n return new Intl.NumberFormat(this._locale, {\r\n useGrouping: true,\r\n minimumFractionDigits: decimal,\r\n maximumFractionDigits: decimal,\r\n numberingSystem: 'latn',\r\n }).format(value);\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: date --------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Formatta una data o una stringa in base al locale corrente.\r\n * Gestisce tre modalità predefinite (date, time, full) e accetta opzioni personalizzate Intl.\r\n */\r\n public static toDate(\r\n date: string | Date,\r\n mode: 'date' | 'time' | 'full' = 'full',\r\n force?: { oldLang: string; newLocale: string },\r\n ): string {\r\n const dt = new Date(date);\r\n\r\n // Controllo: validità data\r\n if (isNaN(dt.getTime())) {\r\n console.error(`[UniLocaleManager] Data non valida fornita a formatDateTime:`, date);\r\n return '';\r\n }\r\n\r\n // Controllo: locale da forzare\r\n const locale = force && this._locale.startsWith(force.oldLang) ? force.newLocale : this._locale;\r\n\r\n switch (mode) {\r\n case 'date':\r\n return dt.toLocaleDateString(locale);\r\n case 'time':\r\n return dt.toLocaleTimeString(locale);\r\n case 'full':\r\n default:\r\n return dt.toLocaleString(locale);\r\n }\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { UniLocaleManager } from '../locale';\r\nimport type { IToastManager, ToastConfig, ToastHttpConfig } from './model';\r\n\r\nexport class UniToastManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------------- Config ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Riferimento interno all'istanza */\r\n private static manager: IToastManager;\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: setup -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Inizializza il manager con una serie di operazioni\r\n */\r\n public static setup(operations: IToastManager): void {\r\n this.manager = operations;\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: show --------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Mostra un toast di successo basato su una risposta HTTP e una label di traduzione.\r\n */\r\n public static show(\r\n label: string,\r\n interpolateParams: Record<string, any> = {},\r\n operation: keyof IToastManager = 'success',\r\n config: ToastConfig = {},\r\n ): void {\r\n /* Messaggio tradotto */\r\n const msg = UniLocaleManager.translate(label, 'toast', interpolateParams);\r\n this.manager[operation](msg, config);\r\n }\r\n\r\n /**\r\n * Mostra un toast di successo basato su una risposta HTTP e una label di traduzione.\r\n */\r\n public static showHttp<T>(\r\n res: T | undefined,\r\n label: string,\r\n interpolateParams: Record<string, any> = {},\r\n config: ToastConfig & Omit<ToastHttpConfig<T>, 'label' | 'interpolateParams'> = {},\r\n ): void {\r\n const { resParams, resLengthParams, formatters } = config;\r\n\r\n /* Parametri statici di base */\r\n const allParams: Record<string, any> = { ...interpolateParams };\r\n\r\n /* Estrazione parametri dalla risposta (se esiste ed è un oggetto) */\r\n if (res && typeof res === 'object') {\r\n resParams?.forEach((key) => {\r\n if (!(key in res)) return;\r\n\r\n const rawValue = res[key];\r\n // Se esiste un formatter per questa chiave lo si usa, altrimenti valore grezzo\r\n allParams[key] = formatters?.[key] ? formatters[key]!(rawValue) : rawValue;\r\n });\r\n }\r\n\r\n /* Conteggio array */\r\n if (resLengthParams && Array.isArray(res)) {\r\n allParams[resLengthParams] = res.length;\r\n }\r\n\r\n /* Messaggio tradotto */\r\n const msg = UniLocaleManager.translate(label, 'toast', allParams);\r\n this.manager.success(msg, config);\r\n }\r\n}\r\n","import { isHttpErrorBody, UniHttpError } from 'uni-error';\r\n\r\nasync function execute(url: URL, init?: RequestInit): Promise<Response | undefined> {\r\n try {\r\n /* Esegue chiamata http */\r\n const res = await fetch(url, init);\r\n\r\n /* Nessun contenuto cons status 204 */\r\n if (res.status === 204) {\r\n return undefined;\r\n }\r\n\r\n /* Recupero se è un json */\r\n const contentType = res.headers.get('content-type') ?? '';\r\n const isJson = contentType.startsWith('application/json');\r\n\r\n /* Errore HTTP (quindi risposta ricevuta ma non ok) */\r\n if (!res.ok) {\r\n let errorBody: unknown;\r\n\r\n try {\r\n /* Clona risposta solo se c'è errore, per leggerla senza consumare la originale */\r\n const resClone = res.clone();\r\n\r\n /* Aggiorna body con struttura errore */\r\n errorBody = isJson ? await resClone.json() : await resClone.text();\r\n } catch {\r\n errorBody = await res.text();\r\n }\r\n\r\n if (isHttpErrorBody(errorBody)) {\r\n const type = errorBody.exceptionType.includes('HttpRequestException') ? 'be' : 'ice';\r\n throw new UniHttpError(type, res.status, url, errorBody);\r\n } else {\r\n const error = new Error(`HTTP ${res.statusText}`);\r\n throw new UniHttpError('base', res.status, url, {\r\n exceptionMessage: error.message,\r\n exceptionType: 'ErrorBase',\r\n message: error.message,\r\n stackTrace: error.stack ?? '',\r\n });\r\n }\r\n }\r\n\r\n /* Risposta ok */\r\n return res;\r\n } catch (error: unknown) {\r\n if (error instanceof TypeError) {\r\n throw new UniHttpError('network', -1, url, {\r\n exceptionMessage: `${error.name}: ${error.message}\\n${error.stack}`,\r\n exceptionType: error.name,\r\n message: error.message,\r\n stackTrace: error.stack ?? '',\r\n });\r\n }\r\n\r\n // Fallback\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function executeHttp<T>(url: URL, init?: RequestInit): Promise<T | undefined> {\r\n /* Esegue la chiamata HTTP e restituisce il corpo decodificato come JSON */\r\n const res = await execute(url, init);\r\n if (!res) return undefined;\r\n\r\n /* Estrae il contenuto come testo */\r\n const text = await res.text();\r\n\r\n /* Controllo: se il testo è vuoto (''), ritorna undefined */\r\n if (!text || text.trim().length === 0) {\r\n return undefined;\r\n }\r\n\r\n /* Parsa manualmente il testo, dato che lo stream è stato già letto */\r\n return JSON.parse(text) as T;\r\n}\r\n\r\nexport async function executeBlob(\r\n url: URL,\r\n init?: RequestInit,\r\n): Promise<{ url: string; name: string } | undefined> {\r\n /* Esegue la chiamata HTTP */\r\n const res = await execute(url, init);\r\n if (!res) return undefined;\r\n\r\n /* Estrae il contenuto come Blob direttamente */\r\n const blob = await res.blob();\r\n\r\n /* Controllo: se il blob è vuoto (0 byte), ritorna undefined */\r\n if (blob.size === 0) {\r\n return undefined;\r\n }\r\n\r\n /* Estrae il nome del file dall'header */\r\n const disposition = res.headers.get('Content-Disposition');\r\n let fileName = 'download.pdf'; // Fallback di default\r\n if (disposition) {\r\n const matches = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/.exec(disposition);\r\n if (!!matches && matches[1]) {\r\n fileName = matches[1].replace(/['\"]/g, '');\r\n }\r\n }\r\n\r\n /* Genera l'URL temporaneo dal blob */\r\n const fileUrl = URL.createObjectURL(blob);\r\n\r\n return { url: fileUrl, name: fileName };\r\n}\r\n","import { UniHttpManager } from './manager';\r\nimport type { HttpRef } from './model';\r\n\r\n/**\r\n * Aggiunge una nuova ref nello store solo se non è già presente.\r\n * Se l'ID esiste già, l'operazione viene interrotta per preservare il dato originale.\r\n */\r\nexport function add(id: string, lineId: null, url: URL, type: HttpRef['type']): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se è presente l'item allora termina\r\n if (oldMap.get(id)) return;\r\n\r\n // Crea il nuovo oggetto\r\n const newItemMap: HttpRef = {\r\n type,\r\n lineId,\r\n url,\r\n hasError: false,\r\n pendingCount: 0,\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Rimuove un http ref tramite ID\r\n */\r\nexport function remove(id: string): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n if (!oldMap.has(id)) return;\r\n\r\n // Aggiorna store\r\n const newMap = new Map(oldMap);\r\n newMap.delete(id);\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Aggiorna il contatore delle chiamate pendenti per una specifica ref.\r\n * Incrementa o decrementa 'pendingCount' garantendo che non scenda mai sotto lo zero.\r\n * Se la ref non esiste, l'operazione viene ignorata.\r\n */\r\nexport function updateIsLoading(id: string, delta: -1 | 1): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n const oldItem = oldMap.get(id);\r\n if (!oldItem) return;\r\n\r\n // Aggiorna l'oggetto\r\n const newItemMap: HttpRef = {\r\n ...oldItem,\r\n pendingCount: Math.max(0, oldItem.pendingCount + delta),\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Aggiorna lo stato di errore per una specifica ref.\r\n * Se il valore di 'hasError' è identico a quello attuale o se la ref non esiste,\r\n * l'operazione viene interrotta per evitare aggiornamenti inutili.\r\n */\r\nexport function updateHasError(id: string, hasError: boolean): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n const oldItem = oldMap.get(id);\r\n if (!oldItem) return;\r\n\r\n // Controllo: se con lo stesso valore, salta\r\n if (oldItem.hasError === hasError) return;\r\n\r\n // Aggiorna l'oggetto\r\n const newItemMap: HttpRef = { ...oldItem, hasError };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Svuota completamente la lista delle refs\r\n */\r\nexport function removeAll(): void {\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map();\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n","import {\r\n concatMap,\r\n EMPTY,\r\n exhaustMap,\r\n mergeMap,\r\n Observable,\r\n of,\r\n type OperatorFunction,\r\n switchMap,\r\n throwError,\r\n} from 'rxjs';\r\nimport { UniHttpError } from 'uni-error';\r\n\r\nimport { UniErrorManager } from '../error';\r\nimport { MapOperator, PollingErrorMode } from './enum';\r\nimport { updateHasError } from './ref';\r\n\r\nexport function operatorHandler<T>(\r\n operator: MapOperator,\r\n): (\r\n project: (value: number) => Observable<T | undefined>,\r\n) => OperatorFunction<number, T | undefined> {\r\n // Gestione della concorrenza in base al parametro\r\n switch (operator) {\r\n case MapOperator.EXHAUST_MAP:\r\n return (project) => exhaustMap(project);\r\n case MapOperator.CONCAT_MAP:\r\n return (project) => concatMap(project);\r\n case MapOperator.MERGE_MAP:\r\n return (project) => mergeMap(project);\r\n case MapOperator.SWITCH_MAP:\r\n default:\r\n return (project) => switchMap(project);\r\n }\r\n}\r\n\r\nexport function errorHandler(\r\n err: unknown,\r\n errorMode: PollingErrorMode,\r\n ref: string,\r\n): Observable<undefined> {\r\n // Controllo: sia effettivamente un errore di tipo 'UniHttpError'\r\n if (!(err instanceof UniHttpError)) {\r\n return throwError(() => err);\r\n }\r\n\r\n // Aggiorna la ref nella map\r\n updateHasError(ref, true);\r\n\r\n // Gestione dell'errore in base al parametro\r\n switch (errorMode) {\r\n case PollingErrorMode.IGNORE:\r\n return of(undefined);\r\n case PollingErrorMode.SKIP:\r\n return EMPTY;\r\n case PollingErrorMode.IGNORE_WITH_ERROR: {\r\n UniErrorManager.add(ref, err);\r\n return of(undefined);\r\n }\r\n case PollingErrorMode.STOP:\r\n default: {\r\n UniErrorManager.add(ref, err);\r\n return throwError(() => err);\r\n }\r\n }\r\n}\r\n","import { isEqual } from 'lodash-es';\r\nimport {\r\n catchError,\r\n defer,\r\n distinctUntilChanged,\r\n finalize,\r\n from,\r\n Observable,\r\n tap,\r\n timer,\r\n} from 'rxjs';\r\n\r\nimport { UniErrorManager } from '../error';\r\nimport { UniToastManager } from '../toast';\r\nimport { EmitValueMode, MapOperator, PollingErrorMode } from './enum';\r\nimport { errorHandler, operatorHandler } from './handler';\r\nimport type { HttpConfig, HttpConfigPolling, HttpRef } from './model';\r\nimport { add, remove, updateHasError, updateIsLoading } from './ref';\r\n\r\nexport function http$<T>(\r\n url: URL,\r\n refType: HttpRef['type'],\r\n config: HttpConfig<T>,\r\n promiseFactory: () => Promise<T | undefined>,\r\n): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { ref, toast, hasLoader } = config;\r\n\r\n return defer(() => {\r\n const http$ = from(promiseFactory());\r\n return http$.pipe(\r\n tap({\r\n subscribe: () => {\r\n /* Creazione reference */\r\n add(ref, null, url, refType);\r\n\r\n /* Incrementa per il loader */\r\n if (hasLoader !== false) {\r\n updateIsLoading(ref, 1);\r\n }\r\n },\r\n unsubscribe: () => {\r\n /* Rimozione reference */\r\n remove(ref);\r\n },\r\n next: (res) => {\r\n /* Mostra toast (se presente) */\r\n if (toast) {\r\n UniToastManager.showHttp(res, toast.label, toast.interpolateParams, toast);\r\n }\r\n },\r\n }),\r\n catchError((err) => {\r\n /* Gestione errore */\r\n return errorHandler(err, PollingErrorMode.STOP, ref);\r\n }),\r\n finalize(() => {\r\n /* Decrementa per il loader */\r\n if (hasLoader !== false) {\r\n updateIsLoading(ref, -1);\r\n }\r\n }),\r\n );\r\n });\r\n}\r\n\r\nexport function httpPolling$<T>(\r\n url: URL,\r\n config: HttpConfigPolling<T>,\r\n promiseFactory: () => Promise<T | undefined>,\r\n): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const {\r\n interval,\r\n ref,\r\n operator = MapOperator.SWITCH_MAP,\r\n errorMode = PollingErrorMode.STOP,\r\n emitValueMode = EmitValueMode.ON_NEW_DATA,\r\n firstIteration,\r\n } = config;\r\n\r\n const timer$ = timer(0, interval);\r\n const source$ = timer$.pipe(\r\n tap({\r\n subscribe: () => {\r\n /* Creazione reference */\r\n add(ref, null, url, 'polling');\r\n },\r\n unsubscribe: () => {\r\n /* Rimozione reference */\r\n remove(ref);\r\n },\r\n }),\r\n operatorHandler<T>(operator)((index) => {\r\n /* Incrementa per il loader */\r\n if (index === 0 && firstIteration?.hasLoader !== false) {\r\n updateIsLoading(ref, 1);\r\n }\r\n\r\n return defer(() => {\r\n const http$ = from(promiseFactory());\r\n return http$.pipe(\r\n tap((res) => {\r\n /* Rimozione popup di errore nel caso di errorMode = 'IGNORE_WITH_ERROR' */\r\n if (errorMode === PollingErrorMode.IGNORE_WITH_ERROR) {\r\n updateHasError(ref, false);\r\n UniErrorManager.remove(ref);\r\n }\r\n\r\n /* Prima risposta */\r\n if (index === 0 && firstIteration) {\r\n const { toast } = firstIteration;\r\n UniToastManager.showHttp(res, toast.label, toast.interpolateParams, toast);\r\n }\r\n }),\r\n catchError((err) => {\r\n /* Gestione errore */\r\n return errorHandler(err, errorMode, ref);\r\n }),\r\n finalize(() => {\r\n /* Decrementa per il loader */\r\n if (index === 0 && firstIteration?.hasLoader !== false) {\r\n updateIsLoading(ref, -1);\r\n }\r\n }),\r\n );\r\n });\r\n }),\r\n );\r\n\r\n return emitValueMode === EmitValueMode.ON_NEW_DATA\r\n ? source$.pipe(distinctUntilChanged((prev, cur) => isEqual(prev, cur)))\r\n : source$;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { HttpBody } from './model';\r\n\r\n/**\r\n * Costruisce un URL completo per l'API partendo dai parametri di configurazione.\r\n */\r\nexport function getUrl(\r\n hostname: string,\r\n port: number,\r\n path: string,\r\n params: Record<string, any> | undefined,\r\n): URL {\r\n const base = `http://${hostname}:${port}`;\r\n const url = new URL(`/api${path}`, base);\r\n\r\n // Aggiungi i parametri\r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value === undefined || value === null) {\r\n return;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n value.forEach((x) => {\r\n if (x === undefined || x === null) {\r\n return;\r\n }\r\n\r\n url.searchParams.append(key, String(x));\r\n });\r\n return;\r\n }\r\n\r\n url.searchParams.append(key, String(value));\r\n });\r\n }\r\n\r\n return url;\r\n}\r\n\r\n/**\r\n * Normalizza i valori del body cosi da sistemare le incongruenze tra ui e db\r\n */\r\nexport function normalizeHttpBody<T extends HttpBody>(body: T, isRoot = true): T {\r\n // Gestione NULL o valori non definiti\r\n if (body === null || body === undefined) {\r\n return body;\r\n }\r\n\r\n // Gestione STRINGHE: trim e conversione in null se vuote\r\n if (typeof body === 'string') {\r\n const trimmed = body.trim();\r\n return (trimmed === '' ? null : trimmed) as T;\r\n }\r\n\r\n // Gestione ARRAY: normalizziamo ogni elemento ricorsivamente\r\n if (Array.isArray(body)) {\r\n return body.map((item) => normalizeHttpBody(item)) as T;\r\n }\r\n\r\n // Gestione DATE e altri tipi primitivi: restituiamo così come sono\r\n if (body instanceof Date || typeof body !== 'object') {\r\n return body;\r\n }\r\n\r\n // 5. Gestione OGGETTI (Record<string, any>): normalizziamo valore ricorsivamente\r\n const entries = Object.entries(body)\r\n .filter(([key, value]) => {\r\n const isNotIdOk =\r\n isRoot &&\r\n key.toLowerCase() === 'id' &&\r\n (!key || typeof value === 'string' || (typeof value === 'number' && value <= 0));\r\n return !isNotIdOk;\r\n })\r\n .map(([key, value]) => [key, normalizeHttpBody(value, false)]);\r\n\r\n return Object.fromEntries(entries);\r\n}\r\n","import { BehaviorSubject, map, Observable, tap } from 'rxjs';\r\n\r\nimport { FileDatasource } from '../file/model';\r\nimport { UniToastManager } from '../toast/manager';\r\nimport { executeBlob, executeHttp } from './execute';\r\nimport { http$, httpPolling$ } from './http';\r\nimport type { HttpBody, HttpConfig, HttpConfigPolling, HttpRef } from './model';\r\nimport { updateHasError } from './ref';\r\nimport { getUrl, normalizeHttpBody } from './util';\r\n\r\nexport class UniHttpManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------------- Config ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Hostname del server (es. 'api.example.com' o 'localhost') */\r\n private static hostname: string;\r\n\r\n /** Porta del server su cui effettuare le chiamate (es. 80, 443 o 3000) */\r\n private static port: number;\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* --------------------------------- Metodi: get --------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Restituisce se lo store ha chiamate in attesa di risposta o meno */\r\n public static get hasWaitingRequests$(): Observable<boolean> {\r\n return this.store$.pipe(map((x) => [...x.values()].some((y) => y.pendingCount > 0)));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n public static store = new BehaviorSubject<Map<string, HttpRef>>(new Map());\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$: Observable<Map<string, HttpRef>> = this.store.asObservable();\r\n\r\n /** Ottiene lo stato attuale della Map senza dover sottoscrivere l'observable */\r\n public static get currentValue(): Map<string, HttpRef> {\r\n return this.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: setup -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Inizializza la configurazione di rete del manager.\r\n * Deve essere chiamato prima di effettuare qualsiasi richiesta HTTP.\r\n */\r\n public static setup(hostname: string, port: number): void {\r\n this.hostname = hostname;\r\n this.port = port;\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------ Metodi: http one ------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /*\r\n * Esegue una singola richiesta HTTP GET.\r\n * Utilizza il path configurato per costruire l'URL completo e restituisce un Observable del risultato.\r\n */\r\n public static read$<T>(config: HttpConfig<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'GET',\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'one', config, () => executeHttp<T>(url, initCustom)).pipe(\r\n tap((res) => {\r\n const { toast } = config;\r\n if (Array.isArray(res) && toast === undefined) {\r\n UniToastManager.show('ItemsFound', { count: res.length });\r\n }\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Recupera un'immagine tramite una richiesta GET e la trasforma in un formato gestibile (es. Blob o Base64).\r\n * Delega la logica di conversione alla funzione executeImage.\r\n */\r\n public static readImage$(\r\n config: HttpConfig<{ url: string; name: string }>,\r\n ): Observable<{ url: string; name: string } | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'GET',\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'one', config, () => executeBlob(url, initCustom));\r\n }\r\n\r\n /**\r\n * Recupera un file (es. PDF) tramite una richiesta GET e restituisce un Object URL temporaneo.\r\n * Delega la logica di conversione alla funzione executeFile.\r\n */\r\n public static readFile$(\r\n config: HttpConfig<FileDatasource>,\r\n ): Observable<FileDatasource | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'GET',\r\n };\r\n\r\n /* Toast di default */\r\n const configCustom: HttpConfig<FileDatasource> = {\r\n ...config,\r\n toast: config.toast === null ? null : (config.toast ?? { label: 'OperationCompleted' }),\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'file', configCustom, () => executeBlob(url, initCustom));\r\n }\r\n\r\n /**\r\n * Esegue una richiesta HTTP POST inviando un payload JSON nel corpo della richiesta.\r\n * Imposta automaticamente l'header 'Content-Type' come 'application/json'.\r\n */\r\n public static create$<T>(config: HttpConfig<T>, body: HttpBody): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'POST',\r\n headers: {\r\n ...init?.headers,\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(normalizeHttpBody(body)),\r\n };\r\n\r\n /* Toast di default */\r\n const configCustom: HttpConfig<T> = {\r\n ...config,\r\n toast: config.toast === null ? null : (config.toast ?? { label: 'OperationCompleted' }),\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'one', configCustom, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Esegue una singola richiesta HTTP PUT per aggiornare una risorsa esistente.\r\n */\r\n public static update$<T>(config: HttpConfig<T>, body?: HttpBody): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = { ...init, method: 'PUT' };\r\n if (body) {\r\n initCustom.headers = {\r\n ...init?.headers,\r\n 'Content-Type': 'application/json',\r\n };\r\n initCustom.body = JSON.stringify(normalizeHttpBody(body));\r\n }\r\n\r\n /* Toast di default */\r\n const configCustom: HttpConfig<T> = {\r\n ...config,\r\n toast: config.toast === null ? null : (config.toast ?? { label: 'OperationCompleted' }),\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'one', configCustom, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Esegue una richiesta HTTP DELETE per rimuovere una risorsa.\r\n * Utilizza il path configurato per costruire l'URL completo e restituisce un Observable del risultato.\r\n */\r\n public static delete$<T>(config: HttpConfig<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'DELETE',\r\n };\r\n\r\n /* Toast di default */\r\n const configCustom: HttpConfig<T> = {\r\n ...config,\r\n toast: config.toast === null ? null : (config.toast ?? { label: 'OperationCompleted' }),\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'one', configCustom, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ---------------------------- Metodi: http polling ----------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Avvia un ciclo di polling basato su richieste GET.\r\n * Continua a emettere valori in base alla configurazione di intervallo definita in HttpConfigPolling.\r\n */\r\n public static readPolling$<T>(config: HttpConfigPolling<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'GET' };\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return httpPolling$(url, config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Avvia un ciclo di polling basato su richieste POST.\r\n * Invia il body specificato a ogni iterazione del ciclo.\r\n */\r\n public static createPolling$<T>(\r\n config: HttpConfigPolling<T>,\r\n body: HttpBody,\r\n ): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(body),\r\n };\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return httpPolling$(url, config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Avvia un ciclo di polling basato su richieste PUT.\r\n */\r\n public static updatePolling$<T>(\r\n config: HttpConfigPolling<T>,\r\n body?: HttpBody,\r\n ): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'PUT' };\r\n if (body) {\r\n initCustom.headers = {\r\n ...initCustom.headers,\r\n 'Content-Type': 'application/json',\r\n };\r\n initCustom.body = JSON.stringify(body);\r\n }\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return httpPolling$(url, config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: store -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Imposta o resetta lo stato di errore per una specifica reference.\r\n */\r\n public static updateHasError(id: string, hasError: boolean): void {\r\n updateHasError(id, hasError);\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { ToastConfig, ToastHttpConfig } from '../toast/model';\r\nimport { EmitValueMode, MapOperator, PollingErrorMode } from './enum';\r\n\r\n/* ------------------ Reference ------------------ */\r\nexport interface HttpRef {\r\n type: 'one' | 'polling' | 'image' | 'file';\r\n lineId: number | null;\r\n url: URL;\r\n hasError: boolean;\r\n pendingCount: number;\r\n}\r\n\r\n/* ------------------ Http config ------------------ */\r\nexport interface HttpConfig<T> {\r\n ref: string;\r\n path: string;\r\n params?: Record<string, any>;\r\n init?: RequestInit;\r\n toast?: null | (ToastConfig & ToastHttpConfig<T>);\r\n hasLoader?: boolean;\r\n}\r\n\r\nexport interface HttpConfigPolling<T> {\r\n ref: string;\r\n interval: number;\r\n path: string;\r\n params?: Record<string, any>;\r\n init?: RequestInit;\r\n operator?: MapOperator;\r\n errorMode?: PollingErrorMode;\r\n emitValueMode?: EmitValueMode;\r\n firstIteration?: {\r\n toast: ToastHttpConfig<T>;\r\n hasLoader?: boolean;\r\n };\r\n}\r\n\r\n/* ------------------ Http body ------------------ */\r\nexport type HttpBody = Record<string, any> | any[] | string | number | boolean | Date;\r\n","/**\r\n * Classe di utilità per la gestione e formattazione delle date.\r\n * Fornisce metodi per convertire in modo sicuro valori di tipo Date, stringa o null in formati standardizzati.\r\n */\r\nexport class UniTypeDateManager {\r\n static toYYYYMMDD(date: Date | string | null | undefined): string {\r\n if (!date) return '';\r\n\r\n const d = new Date(date);\r\n\r\n if (isNaN(d.getTime())) return '';\r\n\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n\r\n return `${year}-${month}-${day}`;\r\n }\r\n}\r\n","/**\r\n * Utility per la gestione e formattazione di valori numerici.\r\n */\r\nexport class UniTypeNumberManager {\r\n /** Applica il padding a un numero o una stringa */\r\n static toPad(value: number | string | null | undefined, count: number, character = '0'): string {\r\n // Se il valore è null/undefined, riempiamo l'intero campo con il carattere scelto\r\n if (value === null || value === undefined) {\r\n return ''.padStart(count, character);\r\n }\r\n\r\n // Convertiamo in stringa e applichiamo il padding\r\n return value.toString().padStart(count, character);\r\n }\r\n\r\n /** Formatta un numero in una versione leggibile (es: 1000 -> 1K, 1000000 -> 1M) */\r\n static toTruncateAndAdUdm(value: number, decimalDigits = 0, maxIntegerDigits = 3): string {\r\n // Nessun limite impostato o numero inferiore alla soglia definita\r\n if (Math.abs(value) < Math.pow(10, maxIntegerDigits)) {\r\n return value.toFixed(decimalDigits);\r\n }\r\n\r\n // Definizione delle scale di riduzione per grandi numeri\r\n const scales = [\r\n { threshold: 1e12, suffix: 'T' }, // Trilioni\r\n { threshold: 1e9, suffix: 'B' }, // Miliardi\r\n { threshold: 1e6, suffix: 'M' }, // Milioni\r\n { threshold: 1e3, suffix: 'K' }, // Migliaia\r\n ];\r\n\r\n // Itera dalla scala più grande alla più piccola per trovare la soglia corretta\r\n for (const { threshold, suffix } of scales) {\r\n if (Math.abs(value) >= threshold) {\r\n const reduced = value / threshold;\r\n\r\n // parseFloat(toFixed()) rimuove gli zeri decimali superflui (es: 1.50 -> 1.5)\r\n // aggiungendo poi il relativo suffisso (K, M, B, T)\r\n return parseFloat(reduced.toFixed(decimalDigits)).toString() + suffix;\r\n }\r\n }\r\n\r\n // Fallback: se il numero è grande ma non rientra nelle scale (caso raro con la logica attuale)\r\n return value.toFixed(decimalDigits);\r\n }\r\n}\r\n","/**\r\n * Utility per la manipolazione di stringhe\r\n */\r\nexport class UniTypeStringManager {\r\n /** Converte una stringa in formato lblPascalCase (es. \"user_id\" -> \"lblUserId\") */\r\n static toLabelize(key: string | null | undefined, prefix = 'lbl'): string {\r\n // Se vuoto restituisce vuoto\r\n if (!key) return '';\r\n\r\n // Unisce il prefisso\r\n return prefix + this.toPascalCase(key);\r\n }\r\n\r\n /** Converte una stringa in PascalCase (es. \"user_id\" -> \"UserId\") */\r\n static toPascalCase(key: string | null | undefined): string {\r\n // Se vuoto restituisce vuoto\r\n if (!key) return '';\r\n\r\n // Normalizza e pulisce\r\n const parts = this.splitString(key);\r\n if (parts.length === 0) return '';\r\n\r\n // Converte in PascalCase\r\n const pascalCased = this.toPascalCaseParts(parts);\r\n\r\n return pascalCased;\r\n }\r\n\r\n /** Converte una stringa in camelCase (es. \"user_id\" -> \"userId\") */\r\n static toCamelCase(key: string | null | undefined): string {\r\n // Se vuoto restituisce vuoto\r\n if (!key) return '';\r\n\r\n // Normalizza e pulisce\r\n const parts = this.splitString(key);\r\n if (parts.length === 0) return '';\r\n\r\n // La prima parola resta minuscola, le successive PascalCase\r\n const first = parts[0].toLowerCase();\r\n const rest = parts.slice(1);\r\n return first + this.toPascalCaseParts(rest);\r\n }\r\n\r\n /** Capitalizza solo la prima lettera della stringa */\r\n static toCapitalize(key: string | null | undefined): string {\r\n // Se vuoto restituisce vuoto\r\n if (!key) return '';\r\n\r\n return key.charAt(0).toUpperCase() + key.slice(1);\r\n }\r\n\r\n /* ----------------- Utils ----------------- */\r\n private static splitString(key: string): string[] {\r\n return key\r\n .trim()\r\n .replace(/^[-_\\s]+/, '') // Rimuove separatori iniziali\r\n .split(/[-_\\s]+/)\r\n .filter(Boolean);\r\n }\r\n\r\n private static toPascalCaseParts(parts: string[]): string {\r\n return parts.map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()).join('');\r\n }\r\n}\r\n","/*\r\n * Public API Surface of uni-manager\r\n */\r\n\r\nexport * from './lib/error';\r\nexport * from './lib/file';\r\nexport * from './lib/http';\r\nexport * from './lib/locale';\r\nexport * from './lib/toast';\r\nexport * from './lib/type';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uni-manager.mjs","sources":["../../../projects/uni-manager/src/lib/error/manager.ts","../../../projects/uni-manager/src/lib/file/manager.ts","../../../projects/uni-manager/src/lib/http/enum.ts","../../../projects/uni-manager/src/lib/locale/manager.ts","../../../projects/uni-manager/src/lib/toast/manager.ts","../../../projects/uni-manager/src/lib/http/execute.ts","../../../projects/uni-manager/src/lib/http/ref.ts","../../../projects/uni-manager/src/lib/http/handler.ts","../../../projects/uni-manager/src/lib/http/http.ts","../../../projects/uni-manager/src/lib/type/date.manager.ts","../../../projects/uni-manager/src/lib/type/number.manager.ts","../../../projects/uni-manager/src/lib/type/string.manager.ts","../../../projects/uni-manager/src/lib/http/util.ts","../../../projects/uni-manager/src/lib/http/manager.ts","../../../projects/uni-manager/src/lib/http/model.ts","../../../projects/uni-manager/src/public-api.ts","../../../projects/uni-manager/src/uni-manager.ts"],"sourcesContent":["import { BehaviorSubject, type Observable } from 'rxjs';\r\nimport type { IUniFeError, IUniHttpError } from 'uni-error';\r\n\r\nexport class UniErrorManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n private static store = new BehaviorSubject<Map<string, IUniFeError | IUniHttpError>>(new Map());\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$: Observable<Map<string, IUniFeError | IUniHttpError>> =\r\n UniErrorManager.store.asObservable();\r\n\r\n /** Ottiene lo stato attuale della Map senza dover sottoscrivere l'observable */\r\n public static get currentValue(): Map<string, IUniFeError | IUniHttpError> {\r\n return UniErrorManager.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: store -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Aggiunge o aggiorna un errore nello store.\r\n * Se l'errore esiste già (stesso ID), incrementa il contatore 'count'.\r\n */\r\n public static add(id: string, error: IUniHttpError | IUniFeError): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniErrorManager.currentValue;\r\n\r\n // Tenta di recuperare l'oggetto corrente\r\n const oldItem = oldMap.get(id);\r\n\r\n // Crea il nuovo oggetto\r\n const newItemMap: IUniFeError | IUniHttpError = {\r\n ...error,\r\n count: oldItem ? oldItem.count + 1 : 1,\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n\r\n /**\r\n * Rimuove un errore tramite ID\r\n */\r\n public static remove(id: string): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniErrorManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n if (!oldMap.has(id)) return;\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.delete(id);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n\r\n /**\r\n * Svuota completamente la lista degli errori\r\n */\r\n public static removeAll(): void {\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map();\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniErrorManager.store.next(newMap);\r\n }\r\n}\r\n","import { FileDatasource } from './model';\r\n\r\nexport class UniFileManager {\r\n /**\r\n * Apre un file (es. PDF, immagine) in una nuova scheda del browser\r\n * Il contenuto viene caricato all'interno di un iframe per garantire compatibilità di visualizzazione\r\n */\r\n public static openInNewTab(data: FileDatasource | undefined): void {\r\n if (!data || !data.url) return;\r\n\r\n const newWindow = window.open('', '_blank');\r\n if (!newWindow) return;\r\n\r\n newWindow.document.title = data.name;\r\n\r\n // Crea l'iframe e lo aggiunge al body della nuova finestra\r\n const iframe = this.createIframe(newWindow.document, data.url, '100%', '100%');\r\n newWindow.document.body.style.margin = '0';\r\n newWindow.document.body.append(iframe);\r\n\r\n // Rimuove l'oggetto URL dalla memoria dopo un tempo congruo per il caricamento\r\n setTimeout(() => URL.revokeObjectURL(data.url), 3000);\r\n }\r\n\r\n /**\r\n * Stampa un file aprendo il dialogo di stampa nativo del sistema\r\n * Utilizza un iframe invisibile per non interrompere la navigazione\r\n */\r\n public static openInPrintPreview(data: FileDatasource | undefined): void {\r\n if (!data || !data.url) return;\r\n\r\n // Crea l'iframe come elemento fisso e nascosto (dimensioni zero)\r\n const iframe = this.createIframe(document, data.url, '0', '0');\r\n iframe.style.position = 'fixed';\r\n iframe.style.bottom = '0';\r\n document.body.append(iframe);\r\n\r\n // Attende il completamento del caricamento del file nell'iframe\r\n iframe.addEventListener('load', (): void => {\r\n // Attesa supplementare per consentire il rendering del PDF\r\n setTimeout(() => {\r\n iframe.contentWindow?.focus();\r\n iframe.contentWindow?.print();\r\n\r\n // Rimozione dell'iframe dal DOM e pulizia della memoria\r\n setTimeout(() => {\r\n iframe.remove();\r\n URL.revokeObjectURL(data.url);\r\n }, 1000);\r\n }, 1000);\r\n });\r\n }\r\n\r\n /**\r\n * Scarica un file localmente sul dispositivo dell'utente\r\n */\r\n public static download(data: FileDatasource | undefined): void {\r\n if (!data || !data.url) return;\r\n\r\n const link = document.createElement('a');\r\n link.href = data.url;\r\n\r\n // Specifica il nome con cui il file verrà salvato\r\n link.download = data.name;\r\n\r\n // Opzionale: assicura che il link non sia visibile\r\n link.style.display = 'none';\r\n\r\n document.body.append(link);\r\n link.click();\r\n\r\n // Pulizia: rimuove l'elemento e revoca l'URL\r\n setTimeout(() => {\r\n link.remove();\r\n URL.revokeObjectURL(data.url);\r\n }, 100);\r\n }\r\n\r\n /* ----------------------------- Utils ----------------------------- */\r\n private static createIframe(\r\n doc: Document,\r\n url: string,\r\n width: string,\r\n height: string,\r\n ): HTMLIFrameElement {\r\n const iframe = doc.createElement('iframe');\r\n iframe.src = url;\r\n iframe.style.width = width;\r\n iframe.style.height = height;\r\n iframe.style.border = 'none';\r\n return iframe;\r\n }\r\n}\r\n","export enum MapOperator {\r\n\t/** Cancella la precedente richiesta, mantiene solo l’ultima */\r\n\tSWITCH_MAP,\r\n\r\n\t/** Ignora nuovi valori finché la corrente non finisce */\r\n\tEXHAUST_MAP,\r\n\r\n\t/** Mette le richieste in coda, le esegue una alla volta */\r\n\tCONCAT_MAP,\r\n\r\n\t/** Esegue tutte le richieste in parallelo, ordine non garantito */\r\n\tMERGE_MAP\r\n}\r\n\r\nexport enum PollingErrorMode {\r\n\t/** Salta questa iterazione emettendo un undefined. Il polling continua al tick successivo. */\r\n\tIGNORE,\r\n\r\n\t/** Salta questa iterazione senza emettere valori. Il polling continua al tick successivo. */\r\n\tSKIP,\r\n\r\n\t/** Interrompe il polling propagando l'errore. */\r\n\tSTOP,\r\n\r\n\t/** Ignora l'errore, lo salva (es. per UI), e continua il polling. Emette `undefined`. */\r\n\tIGNORE_WITH_ERROR\r\n}\r\n\r\nexport enum EmitValueMode {\r\n\t/** Aggiorna lo stato solo se arrivano dati nuovi (distinct) */\r\n\tON_NEW_DATA,\r\n\r\n\t/** Aggiorna lo stato ad ogni chiamata, anche se i dati sono uguali */\r\n\tEVERY_TIME\r\n}\r\n","import { BehaviorSubject, map, Observable } from 'rxjs';\r\n\r\nexport class UniLocaleManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------------- Config ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Codice lingua corrente (es. 'it-IT', 'en-US') usato per formattare date e numeri */\r\n private static _locale = navigator.language ?? 'en-US';\r\n\r\n /** Elenco dei codici lingua supportati dall'applicazione (es. ['it-IT', 'en-US']) */\r\n private static _localesSupported: string[] = [];\r\n\r\n /** Prefisso globale applicato a tutte le chiavi di traduzione (es. 'APP_') */\r\n private static _prefix: string | undefined = undefined;\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* --------------------------------- Metodi: get --------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Restituisce il codice lingua corrente */\r\n public static get locale(): string {\r\n return this._locale;\r\n }\r\n\r\n /** Restituisce l'array contenente tutti i codici locale supportati.*/\r\n public static get localesSupported(): string[] {\r\n return this._localesSupported;\r\n }\r\n\r\n /** Restituisce solo la lingua (es. 'it') */\r\n public static get language(): string {\r\n return this._locale.split('-')[0];\r\n }\r\n\r\n /** Restituisce solo il paese (es. 'IT') */\r\n public static get region(): string {\r\n const parts = this._locale.split('-');\r\n return parts.length > 1 ? parts[1] : '';\r\n }\r\n\r\n /** Restituisce se lo store ha le traduzioni o meno */\r\n public static get hasTranslation$(): Observable<boolean> {\r\n return this.store$.pipe(map((x) => Object.keys(x).length > 1));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n public static store = new BehaviorSubject<Record<string, string>>({});\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$ = this.store.asObservable();\r\n\r\n /** Ottiene il dizionario attuale senza sottoscrizione */\r\n public static get currentValue(): Record<string, string> {\r\n return this.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: setup -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Inizializza la configurazione di rete del manager.\r\n * Deve essere chiamato prima di effettuare qualsiasi richiesta HTTP.\r\n */\r\n public static setup(locale: string | null | undefined, prefix?: string): void {\r\n this._locale = locale ?? 'en-US';\r\n this._prefix = prefix;\r\n }\r\n\r\n /** Imposta l'elenco dei codici lingua supportati dall'applicazione */\r\n public static setLocalesSupported(locales: string[] | undefined): void {\r\n this._localesSupported = locales ?? [];\r\n }\r\n\r\n /**\r\n * Aggiorna lo store locale con il dizionario delle traduzioni fornito.\r\n * Se viene passato undefined, lo store viene inizializzato come oggetto vuoto.\r\n */\r\n public static setTranslations(translations: Record<string, string> | undefined): void {\r\n this.store.next(translations ?? {});\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------- Metodi: traduzioni ------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Traduce una label in base al dizionario caricato.\r\n * Gestisce la composizione della chiave, i parametri dinamici (interpolazione) e il fallback.\r\n */\r\n public static translate(\r\n key: string,\r\n prefix = 'lbl',\r\n interpolateParams?: Record<string, string | number | Date>,\r\n ): string {\r\n if (!key) return '-';\r\n\r\n // Costruzione chiave: prefissoGlobale + prefissoLocale + LabelConInizialeMaiuscola\r\n const cleanKey = key.trim();\r\n const keyWithoutPrefix = cleanKey.replace(new RegExp(`^(${prefix})+`, 'i'), '');\r\n const capitalizedKey = keyWithoutPrefix.charAt(0).toUpperCase() + keyWithoutPrefix.slice(1);\r\n const finalKey = `${this._prefix ?? ''}${prefix}${capitalizedKey}`;\r\n\r\n // Cerca la chiave in minuscolo (standardizzazione)\r\n let translation = this.currentValue?.[finalKey.toLowerCase()];\r\n\r\n // Log e fallback se la traduzione manca\r\n if (!translation) {\r\n console.warn(`Translation missing for key: ${finalKey}`);\r\n return `🔑 ${finalKey}`;\r\n }\r\n\r\n // Interpolazione variabili\r\n if (interpolateParams) {\r\n for (const [key, value] of Object.entries(interpolateParams)) {\r\n const displayValue =\r\n value instanceof Date ? value.toLocaleDateString(this._locale) : String(value);\r\n\r\n translation = translation.replaceAll(`{{${key}}}`, displayValue);\r\n }\r\n }\r\n\r\n return translation;\r\n }\r\n\r\n /**\r\n * Traduce una stringa che contiene parametri separati da un carattere specifico.\r\n * Supporta ora un numero arbitrario di parametri in formato \"label/param1/param2\"\r\n * o semplicemente \"label\".\r\n */\r\n public static translateInlineParams(keyWithParams: string, splitChar: string): string {\r\n if (!keyWithParams) return '-';\r\n\r\n const [label, ...params] = keyWithParams.split(splitChar);\r\n\r\n // Se non ci sono parametri, esegui una traduzione semplice\r\n if (params.length === 0) {\r\n return this.translate(label);\r\n }\r\n\r\n // Mappa i parametri in un oggetto di interpolazione: { inlineParam0: val, inlineParam1: val, ... }\r\n const interpolateParams: Record<string, string> = {};\r\n for (const [index, val] of params.entries()) {\r\n interpolateParams[`param${index}`] = val;\r\n }\r\n\r\n return this.translate(label, 'lbl', interpolateParams);\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------- Metodi: numeri -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Converte un valore numerico in una stringa formattata secondo il locale impostato.\r\n * Disabilita i separatori delle migliaia e forza un numero fisso di decimali.\r\n */\r\n public static toStringNumber(value: number, decimal: number): string {\r\n return new Intl.NumberFormat(this._locale, {\r\n useGrouping: true,\r\n minimumFractionDigits: decimal,\r\n maximumFractionDigits: decimal,\r\n numberingSystem: 'latn',\r\n }).format(value);\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: date --------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Formatta una data o una stringa in base al locale corrente.\r\n * Gestisce tre modalità predefinite (date, time, full) e accetta opzioni personalizzate Intl.\r\n */\r\n public static toDate(\r\n date: string | Date,\r\n mode: 'date' | 'time' | 'full' = 'full',\r\n force?: { oldLang: string; newLocale: string },\r\n ): string {\r\n const dt = new Date(date);\r\n\r\n // Controllo: validità data\r\n if (Number.isNaN(dt.getTime())) {\r\n console.error(`[UniLocaleManager] Data non valida fornita a formatDateTime:`, date);\r\n return '';\r\n }\r\n\r\n // Controllo: locale da forzare\r\n const locale = force && this._locale.startsWith(force.oldLang) ? force.newLocale : this._locale;\r\n\r\n switch (mode) {\r\n case 'date': {\r\n return dt.toLocaleDateString(locale);\r\n }\r\n case 'time': {\r\n return dt.toLocaleTimeString(locale);\r\n }\r\n case 'full': {\r\n return dt.toLocaleString(locale);\r\n }\r\n }\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { UniLocaleManager } from '../locale';\r\nimport type { IToastManager, ToastConfig, ToastHttpConfig } from './model';\r\n\r\nexport class UniToastManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------------- Config ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Riferimento interno all'istanza */\r\n private static manager: IToastManager;\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: setup -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Inizializza il manager con una serie di operazioni\r\n */\r\n public static setup(operations: IToastManager): void {\r\n this.manager = operations;\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: show --------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Mostra un toast di successo basato su una risposta HTTP e una label di traduzione.\r\n */\r\n public static show(\r\n label: string,\r\n interpolateParams: Record<string, any> = {},\r\n operation: keyof IToastManager = 'success',\r\n config: ToastConfig = {},\r\n ): void {\r\n /* Messaggio tradotto */\r\n const msg = UniLocaleManager.translate(label, 'toast', interpolateParams);\r\n this.manager[operation](msg, config);\r\n }\r\n\r\n /**\r\n * Mostra un toast di successo basato su una risposta HTTP e una label di traduzione.\r\n */\r\n public static showHttp<T>(\r\n res: T | undefined,\r\n label: string,\r\n interpolateParams: Record<string, any> = {},\r\n config: ToastConfig & Omit<ToastHttpConfig<T>, 'label' | 'interpolateParams'> = {},\r\n ): void {\r\n const { resParams, resLengthParams, formatters } = config;\r\n\r\n /* Parametri statici di base */\r\n const allParams: Record<string, any> = { ...interpolateParams };\r\n\r\n /* Estrazione parametri dalla risposta (se esiste ed è un oggetto) */\r\n if (res && typeof res === 'object') {\r\n for (const key of resParams ?? []) {\r\n if (!(key in res)) {\r\n continue;\r\n }\r\n\r\n const rawValue = res[key];\r\n\r\n // Se esiste un formatter per questa chiave lo si usa, altrimenti valore grezzo\r\n allParams[key] = formatters?.[key] ? formatters[key]!(rawValue) : rawValue;\r\n }\r\n }\r\n\r\n /* Conteggio array */\r\n if (resLengthParams && Array.isArray(res)) {\r\n allParams[resLengthParams] = res.length;\r\n }\r\n\r\n /* Messaggio tradotto */\r\n const msg = UniLocaleManager.translate(label, 'toast', allParams);\r\n this.manager.success(msg, config);\r\n }\r\n}\r\n","import { isHttpErrorBody, UniHttpError } from 'uni-error';\r\n\r\nasync function execute(url: URL, init?: RequestInit): Promise<Response | undefined> {\r\n try {\r\n /* Esegue chiamata http */\r\n const res = await fetch(url, init);\r\n\r\n /* Nessun contenuto cons status 204 */\r\n if (res.status === 204) {\r\n return undefined;\r\n }\r\n\r\n /* Recupero se è un json */\r\n const contentType = res.headers.get('content-type') ?? '';\r\n const isJson = contentType.startsWith('application/json');\r\n\r\n /* Errore HTTP (quindi risposta ricevuta ma non ok) */\r\n if (!res.ok) {\r\n let errorBody: unknown;\r\n\r\n try {\r\n /* Clona risposta solo se c'è errore, per leggerla senza consumare la originale */\r\n const resClone = res.clone();\r\n\r\n /* Aggiorna body con struttura errore */\r\n errorBody = isJson ? await resClone.json() : await resClone.text();\r\n } catch {\r\n errorBody = await res.text();\r\n }\r\n\r\n if (isHttpErrorBody(errorBody)) {\r\n const type = errorBody.exceptionType.includes('HttpRequestException') ? 'be' : 'ice';\r\n throw new UniHttpError(type, res.status, url, errorBody);\r\n } else {\r\n const error = new Error(`HTTP ${res.statusText}`);\r\n throw new UniHttpError('base', res.status, url, {\r\n exceptionMessage: error.message,\r\n exceptionType: 'ErrorBase',\r\n message: error.message,\r\n stackTrace: error.stack ?? '',\r\n });\r\n }\r\n }\r\n\r\n /* Risposta ok */\r\n return res;\r\n } catch (error: unknown) {\r\n if (error instanceof TypeError) {\r\n throw new UniHttpError('network', -1, url, {\r\n exceptionMessage: `${error.name}: ${error.message}\\n${error.stack}`,\r\n exceptionType: error.name,\r\n message: error.message,\r\n stackTrace: error.stack ?? '',\r\n });\r\n }\r\n\r\n // Fallback\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function executeHttp<T>(url: URL, init?: RequestInit): Promise<T | undefined> {\r\n /* Esegue la chiamata HTTP e restituisce il corpo decodificato come JSON */\r\n const res = await execute(url, init);\r\n if (!res) return undefined;\r\n\r\n /* Estrae il contenuto come testo */\r\n const text = await res.text();\r\n\r\n /* Controllo: se il testo è vuoto (''), ritorna undefined */\r\n if (!text || text.trim().length === 0) {\r\n return undefined;\r\n }\r\n\r\n /* Parsa manualmente il testo, dato che lo stream è stato già letto */\r\n return JSON.parse(text) as T;\r\n}\r\n\r\nexport async function executeBlob(\r\n url: URL,\r\n init?: RequestInit,\r\n): Promise<{ url: string; name: string } | undefined> {\r\n /* Esegue la chiamata HTTP */\r\n const res = await execute(url, init);\r\n if (!res) return undefined;\r\n\r\n /* Estrae il contenuto come Blob direttamente */\r\n const blob = await res.blob();\r\n\r\n /* Controllo: se il blob è vuoto (0 byte), ritorna undefined */\r\n if (blob.size === 0) {\r\n return undefined;\r\n }\r\n\r\n /* Estrae il nome del file dall'header */\r\n const disposition = res.headers.get('Content-Disposition');\r\n let fileName = 'download.pdf'; // Fallback di default\r\n if (disposition) {\r\n const matches = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/.exec(disposition);\r\n if (!!matches && matches[1]) {\r\n fileName = matches[1].replaceAll(/['\"]/g, '');\r\n }\r\n }\r\n\r\n /* Genera l'URL temporaneo dal blob */\r\n const fileUrl = URL.createObjectURL(blob);\r\n\r\n return { url: fileUrl, name: fileName };\r\n}\r\n","import { UniHttpManager } from './manager';\r\nimport type { HttpRef } from './model';\r\n\r\n/**\r\n * Aggiunge una nuova ref nello store solo se non è già presente.\r\n * Se l'ID esiste già, l'operazione viene interrotta per preservare il dato originale.\r\n */\r\nexport function add(id: string, url: URL, type: HttpRef['type']): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se è presente l'item allora termina\r\n if (oldMap.get(id)) return;\r\n\r\n // Crea il nuovo oggetto\r\n const newItemMap: HttpRef = {\r\n type,\r\n lineId: undefined,\r\n url,\r\n hasError: false,\r\n pendingCount: 0,\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Rimuove un http ref tramite ID\r\n */\r\nexport function remove(id: string): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n if (!oldMap.has(id)) return;\r\n\r\n // Aggiorna store\r\n const newMap = new Map(oldMap);\r\n newMap.delete(id);\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Aggiorna il contatore delle chiamate pendenti per una specifica ref.\r\n * Incrementa o decrementa 'pendingCount' garantendo che non scenda mai sotto lo zero.\r\n * Se la ref non esiste, l'operazione viene ignorata.\r\n */\r\nexport function updateIsLoading(id: string, delta: -1 | 1): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n const oldItem = oldMap.get(id);\r\n if (!oldItem) return;\r\n\r\n // Aggiorna l'oggetto\r\n const newItemMap: HttpRef = {\r\n ...oldItem,\r\n pendingCount: Math.max(0, oldItem.pendingCount + delta),\r\n };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Aggiorna lo stato di errore per una specifica ref.\r\n * Se il valore di 'hasError' è identico a quello attuale o se la ref non esiste,\r\n * l'operazione viene interrotta per evitare aggiornamenti inutili.\r\n */\r\nexport function updateHasError(id: string, hasError: boolean): void {\r\n // Recupera l'ultimo stato (Map)\r\n const oldMap = UniHttpManager.currentValue;\r\n\r\n // Controllo: se non è presente l'item allora termina\r\n const oldItem = oldMap.get(id);\r\n if (!oldItem) return;\r\n\r\n // Controllo: se con lo stesso valore, salta\r\n if (oldItem.hasError === hasError) return;\r\n\r\n // Aggiorna l'oggetto\r\n const newItemMap: HttpRef = { ...oldItem, hasError };\r\n\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map(oldMap);\r\n newMap.set(id, newItemMap);\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n\r\n/**\r\n * Svuota completamente la lista delle refs\r\n */\r\nexport function removeAll(): void {\r\n // Crea una nuova istanza della Map\r\n const newMap = new Map();\r\n\r\n // Aggiorna il nuovo stato notificando l'observer\r\n UniHttpManager.store.next(newMap);\r\n}\r\n","import {\r\n concatMap,\r\n EMPTY,\r\n exhaustMap,\r\n mergeMap,\r\n Observable,\r\n of,\r\n type OperatorFunction,\r\n switchMap,\r\n throwError,\r\n} from 'rxjs';\r\nimport { UniHttpError } from 'uni-error';\r\n\r\nimport { UniErrorManager } from '../error';\r\nimport { MapOperator, PollingErrorMode } from './enum';\r\nimport { updateHasError } from './ref';\r\n\r\nexport function operatorHandler<T>(\r\n operator: MapOperator,\r\n): (\r\n project: (value: number) => Observable<T | undefined>,\r\n) => OperatorFunction<number, T | undefined> {\r\n // Gestione della concorrenza in base al parametro\r\n switch (operator) {\r\n case MapOperator.EXHAUST_MAP: {\r\n return (project) => exhaustMap(project);\r\n }\r\n case MapOperator.CONCAT_MAP: {\r\n return (project) => concatMap(project);\r\n }\r\n case MapOperator.MERGE_MAP: {\r\n return (project) => mergeMap(project);\r\n }\r\n case MapOperator.SWITCH_MAP: {\r\n return (project) => switchMap(project);\r\n }\r\n }\r\n}\r\n\r\nexport function errorHandler(\r\n err: unknown,\r\n errorMode: PollingErrorMode,\r\n ref: string,\r\n): Observable<undefined> {\r\n // Controllo: sia effettivamente un errore di tipo 'UniHttpError'\r\n if (!(err instanceof UniHttpError)) {\r\n return throwError(() => err);\r\n }\r\n\r\n // Aggiorna la ref nella map\r\n updateHasError(ref, true);\r\n\r\n // Gestione dell'errore in base al parametro\r\n switch (errorMode) {\r\n case PollingErrorMode.IGNORE: {\r\n return of();\r\n }\r\n case PollingErrorMode.SKIP: {\r\n return EMPTY;\r\n }\r\n case PollingErrorMode.IGNORE_WITH_ERROR: {\r\n {\r\n UniErrorManager.add(ref, err);\r\n return of();\r\n }\r\n }\r\n case PollingErrorMode.STOP: {\r\n UniErrorManager.add(ref, err);\r\n return throwError(() => err);\r\n }\r\n }\r\n}\r\n","import { isEqual } from 'lodash-es';\r\nimport {\r\n catchError,\r\n defer,\r\n distinctUntilChanged,\r\n finalize,\r\n from,\r\n Observable,\r\n tap,\r\n timer,\r\n} from 'rxjs';\r\n\r\nimport { UniErrorManager } from '../error';\r\nimport { UniToastManager } from '../toast';\r\nimport { EmitValueMode, MapOperator, PollingErrorMode } from './enum';\r\nimport { errorHandler, operatorHandler } from './handler';\r\nimport type { HttpConfig, HttpConfigPolling, HttpRef } from './model';\r\nimport { add, remove, updateHasError, updateIsLoading } from './ref';\r\n\r\nexport function http$<T>(\r\n url: URL,\r\n refType: HttpRef['type'],\r\n config: HttpConfig<T>,\r\n promiseFactory: () => Promise<T | undefined>,\r\n): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { ref, toast, hasLoader } = config;\r\n\r\n return defer(() => {\r\n const http$ = from(promiseFactory());\r\n return http$.pipe(\r\n tap({\r\n subscribe: () => {\r\n /* Creazione reference */\r\n add(ref, url, refType);\r\n\r\n /* Incrementa per il loader */\r\n if (hasLoader !== false) {\r\n updateIsLoading(ref, 1);\r\n }\r\n },\r\n unsubscribe: () => {\r\n /* Rimozione reference */\r\n remove(ref);\r\n },\r\n next: (res) => {\r\n /* Mostra toast (se presente) */\r\n if (toast) {\r\n UniToastManager.showHttp(res, toast.label, toast.interpolateParams, toast);\r\n }\r\n },\r\n }),\r\n catchError((err) => {\r\n /* Gestione errore */\r\n return errorHandler(err, PollingErrorMode.STOP, ref);\r\n }),\r\n finalize(() => {\r\n /* Decrementa per il loader */\r\n if (hasLoader !== false) {\r\n updateIsLoading(ref, -1);\r\n }\r\n }),\r\n );\r\n });\r\n}\r\n\r\nexport function httpPolling$<T>(\r\n url: URL,\r\n config: HttpConfigPolling<T>,\r\n promiseFactory: () => Promise<T | undefined>,\r\n): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const {\r\n interval,\r\n ref,\r\n operator = MapOperator.SWITCH_MAP,\r\n errorMode = PollingErrorMode.STOP,\r\n emitValueMode = EmitValueMode.ON_NEW_DATA,\r\n firstIteration,\r\n } = config;\r\n\r\n const timer$ = timer(0, interval);\r\n const source$ = timer$.pipe(\r\n tap({\r\n subscribe: () => {\r\n /* Creazione reference */\r\n add(ref, url, 'polling');\r\n },\r\n unsubscribe: () => {\r\n /* Rimozione reference */\r\n remove(ref);\r\n },\r\n }),\r\n operatorHandler<T>(operator)((index) => {\r\n /* Incrementa per il loader */\r\n if (index === 0 && firstIteration?.hasLoader !== false) {\r\n updateIsLoading(ref, 1);\r\n }\r\n\r\n return defer(() => {\r\n const http$ = from(promiseFactory());\r\n return http$.pipe(\r\n tap((res) => {\r\n /* Rimozione popup di errore nel caso di errorMode = 'IGNORE_WITH_ERROR' */\r\n if (errorMode === PollingErrorMode.IGNORE_WITH_ERROR) {\r\n updateHasError(ref, false);\r\n UniErrorManager.remove(ref);\r\n }\r\n\r\n /* Prima risposta */\r\n if (index === 0 && firstIteration) {\r\n const { toast } = firstIteration;\r\n UniToastManager.showHttp(res, toast.label, toast.interpolateParams, toast);\r\n }\r\n }),\r\n catchError((err) => {\r\n /* Gestione errore */\r\n return errorHandler(err, errorMode, ref);\r\n }),\r\n finalize(() => {\r\n /* Decrementa per il loader */\r\n if (index === 0 && firstIteration?.hasLoader !== false) {\r\n updateIsLoading(ref, -1);\r\n }\r\n }),\r\n );\r\n });\r\n }),\r\n );\r\n\r\n return emitValueMode === EmitValueMode.ON_NEW_DATA\r\n ? source$.pipe(distinctUntilChanged((prev, cur) => isEqual(prev, cur)))\r\n : source$;\r\n}\r\n","/**\r\n * Classe di utilità per la gestione e formattazione delle date.\r\n * Fornisce metodi per convertire in modo sicuro valori di tipo Date, stringa o null in formati standardizzati.\r\n */\r\nexport class UniTypeDateManager {\r\n static toYYYYMMDD(date: Date | string | null | undefined): string {\r\n if (!date) return '';\r\n\r\n const d = new Date(date);\r\n\r\n if (Number.isNaN(d.getTime())) return '';\r\n\r\n const year = d.getFullYear();\r\n const month = String(d.getMonth() + 1).padStart(2, '0');\r\n const day = String(d.getDate()).padStart(2, '0');\r\n\r\n return `${year}-${month}-${day}`;\r\n }\r\n}\r\n","/**\r\n * Utility per la gestione e formattazione di valori numerici.\r\n */\r\nexport class UniTypeNumberManager {\r\n /** Applica il padding a un numero o una stringa */\r\n static toPad(value: number | string | null | undefined, count: number, character = '0'): string {\r\n // Se il valore è null/undefined, riempiamo l'intero campo con il carattere scelto\r\n if (value === null || value === undefined) {\r\n return ''.padStart(count, character);\r\n }\r\n\r\n // Convertiamo in stringa e applichiamo il padding\r\n return value.toString().padStart(count, character);\r\n }\r\n\r\n /** Formatta un numero in una versione leggibile (es: 1000 -> 1K, 1000000 -> 1M) */\r\n static toTruncateAndAdUdm(value: number, decimalDigits = 0, maxIntegerDigits = 3): string {\r\n // Nessun limite impostato o numero inferiore alla soglia definita\r\n if (Math.abs(value) < Math.pow(10, maxIntegerDigits)) {\r\n return value.toFixed(decimalDigits);\r\n }\r\n\r\n // Definizione delle scale di riduzione per grandi numeri\r\n const scales = [\r\n { threshold: 1e12, suffix: 'T' }, // Trilioni\r\n { threshold: 1e9, suffix: 'B' }, // Miliardi\r\n { threshold: 1e6, suffix: 'M' }, // Milioni\r\n { threshold: 1e3, suffix: 'K' }, // Migliaia\r\n ];\r\n\r\n // Itera dalla scala più grande alla più piccola per trovare la soglia corretta\r\n for (const { threshold, suffix } of scales) {\r\n if (Math.abs(value) >= threshold) {\r\n const reduced = value / threshold;\r\n\r\n // parseFloat(toFixed()) rimuove gli zeri decimali superflui (es: 1.50 -> 1.5)\r\n // aggiungendo poi il relativo suffisso (K, M, B, T)\r\n return Number.parseFloat(reduced.toFixed(decimalDigits)).toString() + suffix;\r\n }\r\n }\r\n\r\n // Fallback: se il numero è grande ma non rientra nelle scale (caso raro con la logica attuale)\r\n return value.toFixed(decimalDigits);\r\n }\r\n}\r\n","/**\r\n * Utility per la manipolazione di stringhe\r\n */\r\nexport class UniTypeStringManager {\r\n /** Converte una stringa in formato lblPascalCase (es. \"user_id\" -> \"lblUserId\") */\r\n static toLabelize(key: string | null | undefined, prefix = 'lbl'): string {\r\n // Se vuoto restituisce vuoto\r\n if (!key) return '';\r\n\r\n // Unisce il prefisso\r\n return prefix + this.toPascalCase(key);\r\n }\r\n\r\n /** Converte una stringa in PascalCase (es. \"user_id\" -> \"UserId\") */\r\n static toPascalCase(key: string | null | undefined): string {\r\n // Se vuoto restituisce vuoto\r\n if (!key) return '';\r\n\r\n // Normalizza e pulisce\r\n const parts = this.splitString(key);\r\n if (parts.length === 0) return '';\r\n\r\n // Converte in PascalCase\r\n const pascalCased = this.toPascalCaseParts(parts);\r\n\r\n return pascalCased;\r\n }\r\n\r\n /** Converte una stringa in camelCase (es. \"user_id\" -> \"userId\") */\r\n static toCamelCase(key: string | null | undefined): string {\r\n // Se vuoto restituisce vuoto\r\n if (!key) return '';\r\n\r\n // Normalizza e pulisce\r\n const parts = this.splitString(key);\r\n if (parts.length === 0) return '';\r\n\r\n // La prima parola resta minuscola, le successive PascalCase\r\n const first = parts[0].toLowerCase();\r\n const rest = parts.slice(1);\r\n return first + this.toPascalCaseParts(rest);\r\n }\r\n\r\n /** Capitalizza solo la prima lettera della stringa */\r\n static toCapitalize(key: string | null | undefined): string {\r\n // Se vuoto restituisce vuoto\r\n if (!key) return '';\r\n\r\n return key.charAt(0).toUpperCase() + key.slice(1);\r\n }\r\n\r\n /* ----------------- Utils ----------------- */\r\n private static splitString(key: string): string[] {\r\n return key\r\n .trim()\r\n .replace(/^[-_\\s]+/, '') // Rimuove separatori iniziali\r\n .split(/[-_\\s]+/)\r\n .filter(Boolean);\r\n }\r\n\r\n private static toPascalCaseParts(parts: string[]): string {\r\n return parts.map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase()).join('');\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { UniTypeDateManager } from '../type';\r\nimport { HttpBody } from './model';\r\n\r\n/**\r\n * Costruisce un URL completo per l'API partendo dai parametri di configurazione.\r\n */\r\nexport function getUrl(\r\n hostname: string,\r\n port: number,\r\n path: string,\r\n params: Record<string, any> | undefined,\r\n): URL {\r\n const base = `http://${hostname}:${port}`;\r\n const url = new URL(`/api${path}`, base);\r\n\r\n // Aggiungi i parametri\r\n if (params) {\r\n for (const [key, val] of Object.entries(params)) {\r\n // Usiamo continue per saltare i valori vuoti\r\n if (val === undefined || val === null) {\r\n continue;\r\n }\r\n\r\n // Array\r\n if (Array.isArray(val)) {\r\n const params = val;\r\n for (const param of params) {\r\n if (!param) continue;\r\n\r\n url.searchParams.append(\r\n key,\r\n val instanceof Date ? UniTypeDateManager.toYYYYMMDD(param) : String(param),\r\n );\r\n }\r\n continue;\r\n }\r\n\r\n // Valore singolo\r\n url.searchParams.append(\r\n key,\r\n val instanceof Date ? UniTypeDateManager.toYYYYMMDD(val) : String(val),\r\n );\r\n }\r\n }\r\n\r\n return url;\r\n}\r\n\r\n/**\r\n * Normalizza i valori del body cosi da sistemare le incongruenze tra ui e db\r\n */\r\nexport function normalizeHttpBody<T extends HttpBody>(body: T, isRoot = true): T {\r\n // Gestione NULL o valori non definiti\r\n if (body === null || body === undefined) {\r\n return body;\r\n }\r\n\r\n // Gestione STRINGHE: trim\r\n if (typeof body === 'string') {\r\n return body.trim() as T;\r\n }\r\n\r\n // Gestione ARRAY: normalizziamo ogni elemento ricorsivamente\r\n if (Array.isArray(body)) {\r\n return body.map((item) => normalizeHttpBody(item)) as T;\r\n }\r\n\r\n // Gestione DATE e altri tipi primitivi: restituiamo così come sono\r\n if (body instanceof Date || typeof body !== 'object') {\r\n return body;\r\n }\r\n\r\n // 5. Gestione OGGETTI (Record<string, any>): normalizziamo valore ricorsivamente\r\n const entries = Object.entries(body)\r\n .filter(([key, value]) => {\r\n const isNotIdOk =\r\n isRoot &&\r\n key.toLowerCase() === 'id' &&\r\n (!key || typeof value === 'string' || (typeof value === 'number' && value <= 0));\r\n return !isNotIdOk;\r\n })\r\n .map(([key, value]) => [key, normalizeHttpBody(value, false)]);\r\n\r\n return Object.fromEntries(entries);\r\n}\r\n","import { BehaviorSubject, map, Observable, tap } from 'rxjs';\r\n\r\nimport { FileDatasource } from '../file/model';\r\nimport { UniToastManager } from '../toast/manager';\r\nimport { executeBlob, executeHttp } from './execute';\r\nimport { http$, httpPolling$ } from './http';\r\nimport type { HttpBody, HttpConfig, HttpConfigPolling, HttpRef } from './model';\r\nimport { updateHasError } from './ref';\r\nimport { getUrl, normalizeHttpBody } from './util';\r\n\r\nexport class UniHttpManager {\r\n /* ------------------------------------------------------------------------------- */\r\n /* ----------------------------------- Config ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Hostname del server (es. 'api.example.com' o 'localhost') */\r\n private static hostname: string;\r\n\r\n /** Porta del server su cui effettuare le chiamate (es. 80, 443 o 3000) */\r\n private static port: number;\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* --------------------------------- Metodi: get --------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Restituisce se lo store ha chiamate in attesa di risposta o meno */\r\n public static get hasWaitingRequests$(): Observable<boolean> {\r\n return this.store$.pipe(map((x) => [...x.values()].some((y) => y.pendingCount > 0)));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------------ Store ------------------------------------ */\r\n /* ------------------------------------------------------------------------------- */\r\n /** Store privato (Subject) */\r\n public static store = new BehaviorSubject<Map<string, HttpRef>>(new Map());\r\n\r\n /** Store pubblico (Observable) */\r\n public static store$: Observable<Map<string, HttpRef>> = this.store.asObservable();\r\n\r\n /** Ottiene lo stato attuale della Map senza dover sottoscrivere l'observable */\r\n public static get currentValue(): Map<string, HttpRef> {\r\n return this.store.getValue();\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: setup -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Inizializza la configurazione di rete del manager.\r\n * Deve essere chiamato prima di effettuare qualsiasi richiesta HTTP.\r\n */\r\n public static setup(hostname: string, port: number): void {\r\n this.hostname = hostname;\r\n this.port = port;\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ------------------------------ Metodi: http one ------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /*\r\n * Esegue una singola richiesta HTTP GET.\r\n * Utilizza il path configurato per costruire l'URL completo e restituisce un Observable del risultato.\r\n */\r\n public static read$<T>(config: HttpConfig<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'GET',\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'one', config, () => executeHttp<T>(url, initCustom)).pipe(\r\n tap((res) => {\r\n const { toast } = config;\r\n if (Array.isArray(res) && toast === undefined) {\r\n UniToastManager.show('ItemsFound', { count: res.length });\r\n }\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Recupera un'immagine tramite una richiesta GET e la trasforma in un formato gestibile (es. Blob o Base64).\r\n * Delega la logica di conversione alla funzione executeImage.\r\n */\r\n public static readImage$(\r\n config: HttpConfig<{ url: string; name: string }>,\r\n ): Observable<{ url: string; name: string } | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'GET',\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'one', config, () => executeBlob(url, initCustom));\r\n }\r\n\r\n /**\r\n * Recupera un file (es. PDF) tramite una richiesta GET e restituisce un Object URL temporaneo.\r\n * Delega la logica di conversione alla funzione executeFile.\r\n */\r\n public static readFile$(\r\n config: HttpConfig<FileDatasource>,\r\n ): Observable<FileDatasource | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'GET',\r\n };\r\n\r\n /* Toast di default */\r\n const configCustom: HttpConfig<FileDatasource> = {\r\n ...config,\r\n toast: config.toast === null ? undefined : (config.toast ?? { label: 'OperationCompleted' }),\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'file', configCustom, () => executeBlob(url, initCustom));\r\n }\r\n\r\n /**\r\n * Esegue una richiesta HTTP POST inviando un payload JSON nel corpo della richiesta.\r\n * Imposta automaticamente l'header 'Content-Type' come 'application/json'.\r\n */\r\n public static create$<T>(config: HttpConfig<T>, body: HttpBody): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'POST',\r\n headers: {\r\n ...init?.headers,\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify(normalizeHttpBody(body)),\r\n };\r\n\r\n /* Toast di default */\r\n const configCustom: HttpConfig<T> = {\r\n ...config,\r\n toast: config.toast === null ? undefined : (config.toast ?? { label: 'OperationCompleted' }),\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'one', configCustom, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Esegue una singola richiesta HTTP PUT per aggiornare una risorsa esistente.\r\n */\r\n public static update$<T>(config: HttpConfig<T>, body?: HttpBody): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = { ...init, method: 'PUT' };\r\n if (body) {\r\n initCustom.headers = {\r\n ...init?.headers,\r\n 'Content-Type': 'application/json',\r\n };\r\n initCustom.body = JSON.stringify(normalizeHttpBody(body));\r\n }\r\n\r\n /* Toast di default */\r\n const configCustom: HttpConfig<T> = {\r\n ...config,\r\n toast: config.toast === null ? undefined : (config.toast ?? { label: 'OperationCompleted' }),\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'one', configCustom, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Esegue una richiesta HTTP DELETE per rimuovere una risorsa.\r\n * Utilizza il path configurato per costruire l'URL completo e restituisce un Observable del risultato.\r\n */\r\n public static delete$<T>(config: HttpConfig<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n /* Config */\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'DELETE',\r\n };\r\n\r\n /* Toast di default */\r\n const configCustom: HttpConfig<T> = {\r\n ...config,\r\n toast: config.toast === null ? undefined : (config.toast ?? { label: 'OperationCompleted' }),\r\n };\r\n\r\n /* Chiama API */\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return http$(url, 'one', configCustom, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* ---------------------------- Metodi: http polling ----------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Avvia un ciclo di polling basato su richieste GET.\r\n * Continua a emettere valori in base alla configurazione di intervallo definita in HttpConfigPolling.\r\n */\r\n public static readPolling$<T>(config: HttpConfigPolling<T>): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'GET' };\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return httpPolling$(url, config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Avvia un ciclo di polling basato su richieste POST.\r\n * Invia il body specificato a ogni iterazione del ciclo.\r\n */\r\n public static createPolling$<T>(\r\n config: HttpConfigPolling<T>,\r\n body: HttpBody,\r\n ): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = {\r\n ...init,\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(body),\r\n };\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return httpPolling$(url, config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /**\r\n * Avvia un ciclo di polling basato su richieste PUT.\r\n */\r\n public static updatePolling$<T>(\r\n config: HttpConfigPolling<T>,\r\n body?: HttpBody,\r\n ): Observable<T | undefined> {\r\n /* Recupero configurazione */\r\n const { path, init } = config;\r\n\r\n const initCustom: RequestInit = { ...init, method: 'PUT' };\r\n if (body) {\r\n initCustom.headers = {\r\n ...initCustom.headers,\r\n 'Content-Type': 'application/json',\r\n };\r\n initCustom.body = JSON.stringify(body);\r\n }\r\n const url = getUrl(this.hostname, this.port, path, config.params);\r\n return httpPolling$(url, config, () => executeHttp<T>(url, initCustom));\r\n }\r\n\r\n /* ------------------------------------------------------------------------------- */\r\n /* -------------------------------- Metodi: store -------------------------------- */\r\n /* ------------------------------------------------------------------------------- */\r\n /**\r\n * Imposta o resetta lo stato di errore per una specifica reference.\r\n */\r\n public static updateHasError(id: string, hasError: boolean): void {\r\n updateHasError(id, hasError);\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { ToastConfig, ToastHttpConfig } from '../toast/model';\r\nimport { EmitValueMode, MapOperator, PollingErrorMode } from './enum';\r\n\r\n/* ------------------ Reference ------------------ */\r\nexport interface HttpRef {\r\n type: 'one' | 'polling' | 'image' | 'file';\r\n lineId: number | null | undefined;\r\n url: URL;\r\n hasError: boolean;\r\n pendingCount: number;\r\n}\r\n\r\n/* ------------------ Http config ------------------ */\r\nexport interface HttpConfig<T> {\r\n ref: string;\r\n path: string;\r\n params?: Record<string, any>;\r\n init?: RequestInit;\r\n toast?: null | (ToastConfig & ToastHttpConfig<T>);\r\n hasLoader?: boolean;\r\n}\r\n\r\nexport interface HttpConfigPolling<T> {\r\n ref: string;\r\n interval: number;\r\n path: string;\r\n params?: Record<string, any>;\r\n init?: RequestInit;\r\n operator?: MapOperator;\r\n errorMode?: PollingErrorMode;\r\n emitValueMode?: EmitValueMode;\r\n firstIteration?: {\r\n toast: ToastHttpConfig<T>;\r\n hasLoader?: boolean;\r\n };\r\n}\r\n\r\n/* ------------------ Http body ------------------ */\r\nexport type HttpBody = Record<string, any> | any[] | string | number | boolean | Date;\r\n","/*\r\n * Public API Surface of uni-manager\r\n */\r\n\r\nexport * from './lib/error';\r\nexport * from './lib/file';\r\nexport * from './lib/http';\r\nexport * from './lib/locale';\r\nexport * from './lib/toast';\r\nexport * from './lib/type';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "uni-manager",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.63",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"lodash-es": "
|
|
6
|
-
"rxjs": "
|
|
7
|
-
"uni-error": "
|
|
5
|
+
"lodash-es": ">=4.18.1",
|
|
6
|
+
"rxjs": ">=7.8.2",
|
|
7
|
+
"uni-error": ">=0.0.7"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"tslib": "^2.3.0"
|
package/types/uni-manager.d.ts
CHANGED