@arsedizioni/ars-utils 22.1.5 → 22.5.2
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/README.md +158 -10
- package/clipper.ui/clipper.scss +564 -0
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +1 -1
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +11 -7
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.date.mjs +609 -0
- package/fesm2022/arsedizioni-ars-utils-core.date.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-core.markdown.mjs +591 -0
- package/fesm2022/arsedizioni-ars-utils-core.markdown.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-core.mjs +270 -1449
- package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +1 -1
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs +1 -1
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +14 -4108
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.controls.mjs +962 -0
- package/fesm2022/arsedizioni-ars-utils-ui.controls.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs +506 -0
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.auth.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.mjs +450 -0
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs +184 -0
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.prompt.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs +825 -0
- package/fesm2022/arsedizioni-ars-utils-ui.dialogs.select.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.files.mjs +708 -0
- package/fesm2022/arsedizioni-ars-utils-ui.files.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.filters.mjs +426 -0
- package/fesm2022/arsedizioni-ars-utils-ui.filters.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.help.mjs +531 -0
- package/fesm2022/arsedizioni-ars-utils-ui.help.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.mjs +54 -1227
- package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs +1049 -0
- package/fesm2022/arsedizioni-ars-utils-ui.navigation.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.notifications.mjs +263 -0
- package/fesm2022/arsedizioni-ars-utils-ui.notifications.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +4 -3
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.paginator.mjs +53 -0
- package/fesm2022/arsedizioni-ars-utils-ui.paginator.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.shell.mjs +517 -0
- package/fesm2022/arsedizioni-ars-utils-ui.shell.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils-ui.tinymce.mjs +246 -0
- package/fesm2022/arsedizioni-ars-utils-ui.tinymce.mjs.map +1 -0
- package/fesm2022/arsedizioni-ars-utils.mjs +13 -12
- package/fesm2022/arsedizioni-ars-utils.mjs.map +1 -1
- package/help/package.json +4 -0
- package/package.json +80 -14
- package/styles/ui.colors.scss +23 -0
- package/support.ui/package.json +4 -0
- package/tinymce/package.json +4 -0
- package/types/arsedizioni-ars-utils-clipper.common.d.ts +1 -2
- package/types/arsedizioni-ars-utils-clipper.ui.d.ts +4 -1
- package/types/arsedizioni-ars-utils-core.d.ts +684 -1004
- package/types/arsedizioni-ars-utils-core.date.d.ts +304 -0
- package/types/arsedizioni-ars-utils-core.markdown.d.ts +159 -0
- package/types/arsedizioni-ars-utils-ui.application.d.ts +10 -2022
- package/types/arsedizioni-ars-utils-ui.controls.d.ts +413 -0
- package/types/arsedizioni-ars-utils-ui.d.ts +183 -566
- package/types/arsedizioni-ars-utils-ui.dialogs.auth.d.ts +224 -0
- package/types/arsedizioni-ars-utils-ui.dialogs.d.ts +228 -0
- package/types/arsedizioni-ars-utils-ui.dialogs.prompt.d.ts +47 -0
- package/types/arsedizioni-ars-utils-ui.dialogs.select.d.ts +309 -0
- package/types/arsedizioni-ars-utils-ui.files.d.ts +271 -0
- package/types/arsedizioni-ars-utils-ui.filters.d.ts +163 -0
- package/types/arsedizioni-ars-utils-ui.help.d.ts +220 -0
- package/types/arsedizioni-ars-utils-ui.navigation.d.ts +650 -0
- package/types/arsedizioni-ars-utils-ui.notifications.d.ts +73 -0
- package/types/arsedizioni-ars-utils-ui.paginator.d.ts +23 -0
- package/types/arsedizioni-ars-utils-ui.shell.d.ts +345 -0
- package/types/arsedizioni-ars-utils-ui.tinymce.d.ts +63 -0
- package/types/arsedizioni-ars-utils.d.ts +4 -10
- package/ui.tinymce/README.md +12 -0
- package/ui.tinymce/langs/it.js +466 -0
package/README.md
CHANGED
|
@@ -1,10 +1,158 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
Common tools and components shared among
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
##
|
|
10
|
-
|
|
1
|
+
# ARS Utils
|
|
2
|
+
|
|
3
|
+
Common tools and standalone components shared among ARS Edizioni Angular based web applications.
|
|
4
|
+
|
|
5
|
+
Rispetto alla versione monolitica precedente adotta la struttura a entry point
|
|
6
|
+
introdotta con `@fabio.buscaroli/scm-utils`: code splitting e tree shaking sono il criterio di
|
|
7
|
+
ripartizione dei simboli, non un effetto collaterale.
|
|
8
|
+
|
|
9
|
+
## Platform
|
|
10
|
+
|
|
11
|
+
Angular 22 + Material
|
|
12
|
+
|
|
13
|
+
## Entry points
|
|
14
|
+
|
|
15
|
+
La libreria non espone un barrel unico: l'entry point secondario e' l'unica unita' di
|
|
16
|
+
code splitting riconosciuta da ng-packagr, quindi ogni gruppo di simboli che ha un ciclo
|
|
17
|
+
di vita proprio vive nel suo entry point. Importare sempre dal path specifico.
|
|
18
|
+
|
|
19
|
+
### Nucleo condiviso
|
|
20
|
+
|
|
21
|
+
| Livello | Entry point | Contenuto | Note |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| L0 | `core` | `SystemUtils`, models, definitions, pipe, direttive validator, servizi (broadcast, screen, theme, splash, environment), `LoginOAuthType` | nessuna dipendenza da Angular Material |
|
|
24
|
+
| L0 | `core.date` | `provideArsDateFns`, `provideArsLocalDates`, `MAT_DATE_FNS_FORMATS`, `arsLocalDateInterceptor`, `ARS_TIME_ZONE` | isola `@angular/material/core` + `datepicker` |
|
|
25
|
+
| L0 | `core.markdown` | `MarkdownUtils`, `FormatMarkdownPipe` | parser markdown, fuori dal percorso comune |
|
|
26
|
+
| L0.5 | `ui.shell` | `ShellService` (`info`, `error`, `busy*`, `wait`, `BusyTimer`), `ShellMessageComponent`, `ShellBusyComponent` | zero Material e zero CDK: e' quello che shell, interceptor, guard e app initializer possono permettersi sul percorso di boot |
|
|
27
|
+
| L1 | `ui` | `FlexLayoutModule`, `MediaObserver`, `UIService`, tipi dei dialog | kernel: deve restare magro, e non importa nulla da Material |
|
|
28
|
+
| L1 | `ui.paginator` | `PaginatorIntl` | isola `@angular/material/paginator`, che si porta dietro `mat-select` e `mat-option` |
|
|
29
|
+
| L1.5 | `ui.dialogs` | `DialogService` (estende `ShellService`) + confirm, delete, toast, `open` | tutto cio' che chiede qualcosa all'utente, piu' il toast |
|
|
30
|
+
| L2 | `ui.dialogs.auth` | credentials, reset-password, recover-password, prompt-otp, `OtpInputComponent`, `PasswordStrengthComponent` | solo route di login/account |
|
|
31
|
+
| L2 | `ui.dialogs.prompt` | prompt, prompt-date, prompt-time | porta `@angular/material/datepicker` |
|
|
32
|
+
| L2 | `ui.dialogs.select` | select, select-tree, send-to | porta `mat-tree`, `mat-list`, `mat-chips` |
|
|
33
|
+
| L2 | `ui.files` | file-input, file-preview, select-file, select-picture | |
|
|
34
|
+
| L2 | `ui.controls` | button-selector, button-toggle, chips-selector, tree-picker, calendar-empty-header | |
|
|
35
|
+
| L2 | `ui.filters` | `FilterBarComponent` + modello `Filters` | |
|
|
36
|
+
| L2 | `ui.navigation` | `NavigationBarComponent` + definizioni | shell applicativa |
|
|
37
|
+
| L3 | `ui.application` | `ApplicationDialogService` | facade: carica i dialog pesanti con `import()` |
|
|
38
|
+
|
|
39
|
+
### Specifici ARS
|
|
40
|
+
|
|
41
|
+
| Livello | Entry point | Contenuto | Dipendenze pesanti |
|
|
42
|
+
|---|---|---|---|
|
|
43
|
+
| L0.5 | `support.common` | `SupportService`, notifiche, definitions, messages | - |
|
|
44
|
+
| L0.5 | `evolution.common` | `EvolutionService`, account, compliance, login, interceptor auth | - |
|
|
45
|
+
| L2 | `ui.oauth` | `LoginOAuthComponent`, `LoginOAuthOkMSComponent` | `@azure/msal-angular`, `@azure/msal-browser` |
|
|
46
|
+
| L2 | `ui.help` | `HelpService`, `HelpViewerComponent`, modello dei capitoli | - |
|
|
47
|
+
| L2 | `ui.tinymce` | `TinymceUtils`, `FullScreenEditorComponent`, `langs/it.js` | `tinymce`, `@tinymce/tinymce-angular` |
|
|
48
|
+
| L2 | `ui.notifications` | `NotificationsBrowserComponent` (ex `support.ui`) | - |
|
|
49
|
+
| L2 | `clipper.common` | `ClipperService`, archive, calendar, collaboration, documents, login, note, interceptor auth | - |
|
|
50
|
+
| L4 | `clipper.ui` | browser, document, note, references, search-* e `ClipperDocumentsUtils` | `clipper.scss` |
|
|
51
|
+
|
|
52
|
+
I peer dependency opzionali (`@azure/msal-*`, `tinymce`, `@tinymce/tinymce-angular`) servono
|
|
53
|
+
solo a chi importa rispettivamente `ui.oauth` e `ui.tinymce`: sono dichiarati in
|
|
54
|
+
`peerDependenciesMeta.optional` proprio perche' nessun altro entry point li aggancia.
|
|
55
|
+
|
|
56
|
+
### Grafo delle dipendenze statiche
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
core core.date core.markdown ui.paginator
|
|
60
|
+
| \
|
|
61
|
+
| ui.shell
|
|
62
|
+
| |
|
|
63
|
+
ui ------|-----------------------------------------------------------
|
|
64
|
+
| | | | | | |
|
|
65
|
+
| | ui.controls ui.filters ui.navigation ui.dialogs.select clipper.common
|
|
66
|
+
| |
|
|
67
|
+
ui.dialogs <-- DialogService extends ShellService: dipende da `ui` E da `ui.shell`
|
|
68
|
+
| | | | | |
|
|
69
|
+
| ui.dialogs.auth ui.dialogs.prompt ui.files ui.help ui.oauth
|
|
70
|
+
| ui.notifications (+ support.common)
|
|
71
|
+
ui.application --- import() ---> ui.dialogs.{auth,prompt,select}, ui.files
|
|
72
|
+
|
|
|
73
|
+
clipper.ui (+ clipper.common, ui.controls, ui.files, ui.dialogs.select)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
`evolution.common` e `support.common` dipendono solo da `core`.
|
|
77
|
+
|
|
78
|
+
### Regole da rispettare
|
|
79
|
+
|
|
80
|
+
1. Il grafo tra entry point deve restare un DAG. Un entry point di livello L2 non puo'
|
|
81
|
+
importare `ui.application`, ne' un entry point puo' importare se stesso per package path
|
|
82
|
+
(ng-packagr lo segnala come `circular dependency on itself`).
|
|
83
|
+
2. I tipi condivisi fra il facade e i dialog pesanti stanno in `ui` (`dialog.definitions.ts`).
|
|
84
|
+
Se un tipo servisse a entrambi e vivesse nel dialog, l'`import()` del facade tornerebbe statico.
|
|
85
|
+
3. Il facade usa `import type` per i tipi dei componenti e `import()` per i valori: e' quello
|
|
86
|
+
che tiene i dialog fuori dal bundle iniziale.
|
|
87
|
+
4. Dopo una modifica, verificare che gli `import()` sopravvivano alla build:
|
|
88
|
+
`grep -o "import('@arsedizioni[^']*')" dist/ars-utils/fesm2022/*ui.application.mjs`
|
|
89
|
+
5. `ui.shell` non importa nulla da `@angular/material` ne' da `@angular/cdk`, e nemmeno da `ui`.
|
|
90
|
+
E' l'unica ragione per cui esiste: se ci finisce dentro un solo simbolo di Material, la shell
|
|
91
|
+
torna a pagare l'intero stack sul percorso di boot. Da verificare dopo ogni build:
|
|
92
|
+
`grep -oE "@angular/(material|cdk)[^'\"]*" dist/ars-utils/fesm2022/*ui.shell.mjs` non deve
|
|
93
|
+
stampare nulla.
|
|
94
|
+
7. Le sovrapposizioni di `ui.shell` non stanno nello stack del CDK, quindi il loro ordine e' un
|
|
95
|
+
z-index fisso: `cdk-overlay-container` sta a 1000, il busy a 1090 e il messaggio a 1100. Un
|
|
96
|
+
errore che esce mentre un dialog Material e' aperto deve stargli sopra, ed e' cosi'. L'unico
|
|
97
|
+
caso che un numero fisso non sa esprimere e un dialog aperto mentre il busy e ancora su:
|
|
98
|
+
per questo `DialogService.open()` chiama `clearBusy(true)`, senza periodo di grazia.
|
|
99
|
+
6. `ui` non importa valori da Material. `PaginatorIntl` e' uscito da li' proprio per questo: era
|
|
100
|
+
l'unico simbolo che ne dipendeva, e faceva pagare `mat-paginator` + `mat-select` + `mat-option`
|
|
101
|
+
a chiunque toccasse `ui.dialogs`. Restano due eccezioni, entrambe volute:
|
|
102
|
+
`MatFormFieldAppearance` in `dialog.definitions.ts`, che e' un `import type` e quindi sparisce
|
|
103
|
+
in compilazione, e `@angular/cdk/layout` (1 KB) di cui `MediaObserver` ha bisogno.
|
|
104
|
+
|
|
105
|
+
### Da dove parte un'applicazione
|
|
106
|
+
|
|
107
|
+
`core` + `ui.shell`. Sono i due entry point che una applicazione ARS carica comunque prima di
|
|
108
|
+
avere una rotta, e gli unici due che non costano Material. `core` porta `SystemUtils`, i modelli,
|
|
109
|
+
`BroadcastService`, `SplashService`, `EnvironmentService`, `ThemeService`; `ui.shell` porta il modo
|
|
110
|
+
di dire all'utente che la sessione e' scaduta o che l'API non risponde.
|
|
111
|
+
|
|
112
|
+
Non sono un entry point solo, e non devono diventarlo: `core` e' L0 e ci dipendono anche
|
|
113
|
+
`clipper.common`, `evolution.common` e `support.common`, che di interfaccia non ne hanno. Fonderli
|
|
114
|
+
significherebbe far dipendere tre entry point headless da uno di UI, cioe' rompere la regola 1.
|
|
115
|
+
|
|
116
|
+
La conseguenza pratica per chi scrive l'applicazione:
|
|
117
|
+
|
|
118
|
+
- shell, interceptor, guard, `provideAppInitializer` -> `ShellService` di `ui.shell`
|
|
119
|
+
- componenti di rotta -> `DialogService` di `ui.dialogs`, e `ApplicationDialogService` di `ui.application` per i dialog pesanti
|
|
120
|
+
|
|
121
|
+
I tre servizi sono una catena, non tre servizi diversi:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
ShellService info, error, busy*, wait, busyTimer ui.shell
|
|
125
|
+
└ DialogService + open, confirm, delete, toast ui.dialogs
|
|
126
|
+
└ ApplicationDialogService + select, prompt, sendTo, ... ui.application
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Quindi chi inietta `DialogService` ha tutto quello che aveva prima: `info`, `error` e `busy` non
|
|
130
|
+
sono spariti, sono ereditati. E non esistono in due copie — c'e' una implementazione sola, quella
|
|
131
|
+
senza Material.
|
|
132
|
+
|
|
133
|
+
`ShellService.info()` e `ShellService.error()` hanno gli stessi parametri, nello stesso ordine,
|
|
134
|
+
delle omonime di `DialogService`: spostare una chiamata dall'una all'altra e' un cambio di servizio
|
|
135
|
+
iniettato e nient'altro.
|
|
136
|
+
|
|
137
|
+
## Differenze rispetto alla versione precedente (22.1.x monolitica)
|
|
138
|
+
|
|
139
|
+
- Nessun barrel radice: `@arsedizioni/ars-utils` esporta solo `ARS_UTILS_VERSION`.
|
|
140
|
+
- `ui` non contiene piu' i dialog: `DialogService` sta in `ui.dialogs`.
|
|
141
|
+
- `ui.application` resta il solo facade e non riesporta piu' componenti: i controlli sono in
|
|
142
|
+
`ui.controls`, i file in `ui.files`, i filtri in `ui.filters`, la navigazione in `ui.navigation`.
|
|
143
|
+
- `SystemUtils.markdownToHtml` non esiste piu': usare `MarkdownUtils.toHtml` da `core.markdown`.
|
|
144
|
+
- `SelectableModel` espone `first` e `selectedAny` al posto di `selectedFirst` e `selectedAll`.
|
|
145
|
+
- `support.ui` si chiama `ui.notifications`, `help` si chiama `ui.help`, `tinymce` si chiama `ui.tinymce`.
|
|
146
|
+
- `PaginatorIntl` non sta piu' in `ui`: sta in `ui.paginator`.
|
|
147
|
+
- La shell non deve piu' iniettare `DialogService` per mostrare un errore: c'e' `ShellService` in `ui.shell`.
|
|
148
|
+
- `info`, `error`, `busy`, `busySpinner`, `busyHourglass`, `wait`, `busyTimer` e `clearBusy` sono
|
|
149
|
+
passati a `ShellService`. `DialogService` li eredita, quindi nessuna chiamata cambia.
|
|
150
|
+
- `info()` e `error()` restituiscono `ShellMessageRef` invece di `MatDialogRef<InfoDialogComponent>`.
|
|
151
|
+
In myARS nessun chiamante usava quel valore; controllare nelle altre applicazioni.
|
|
152
|
+
- `clearBusy()` accetta `immediate`: `clearBusy(true)` non aspetta i 500 ms di grazia.
|
|
153
|
+
- `BusyTimer` si importa da `ui.shell`, non piu' da `ui.dialogs`.
|
|
154
|
+
- `InfoDialogComponent` e `BusyDialogComponent` non esistono piu': li sostituiscono
|
|
155
|
+
`ShellMessageComponent` e `ShellBusyComponent`, senza Material.
|
|
156
|
+
|
|
157
|
+
## Authors
|
|
158
|
+
Fabio Buscaroli, Alberto Doria
|