wuic-framework-lib 1.0.11 → 1.0.20
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/{wuic-framework-lib-chart-list.component-vuzmQW9F.mjs → wuic-framework-lib-chart-list.component-B44k_wZe.mjs} +79 -19
- package/fesm2022/{wuic-framework-lib-code-editor.component-BjbIkm4g.mjs → wuic-framework-lib-code-editor.component-D1dy4Dl9.mjs} +261 -261
- package/fesm2022/{wuic-framework-lib-designer.component-BM3elB-a.mjs → wuic-framework-lib-designer.component-CnOQbvEH.mjs} +178 -151
- package/fesm2022/{wuic-framework-lib-first-run-wizard.component-5tcl67dK.mjs → wuic-framework-lib-first-run-wizard.component-C9lswoxG.mjs} +248 -42
- package/fesm2022/{wuic-framework-lib-framework-docs.component-BGcJ7k1X.mjs → wuic-framework-lib-framework-docs.component-B6qNTs5H.mjs} +830 -121
- package/fesm2022/{wuic-framework-lib-pivot-builder.component-ChNyMAfi.mjs → wuic-framework-lib-pivot-builder.component-DMk26H0M.mjs} +475 -100
- package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-DFLR_EmK.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-y3shST6g.mjs} +5 -5
- package/fesm2022/{wuic-framework-lib-report-designer.component-B_SC7VkW.mjs → wuic-framework-lib-report-designer.component-BnngR2eL.mjs} +15 -15
- package/fesm2022/{wuic-framework-lib-report-viewer.component-BTK-p8xF.mjs → wuic-framework-lib-report-viewer.component-LGNRIQh2.mjs} +82 -12
- package/fesm2022/{wuic-framework-lib-scheduler-list.component-CIoGVf4O.mjs → wuic-framework-lib-scheduler-list.component-DbcFMwx5.mjs} +42 -19
- package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-DQ5OxO4j.mjs → wuic-framework-lib-spreadsheet-list-sf.component-DXyRX0YK.mjs} +25 -11
- package/fesm2022/{wuic-framework-lib-workflow-designer.component-BHLT4MER.mjs → wuic-framework-lib-workflow-designer.component-Bm719AWV.mjs} +9 -9
- package/fesm2022/{wuic-framework-lib-wuic-framework-lib-DDokY6wY.mjs → wuic-framework-lib-wuic-framework-lib-CGCZvtKK.mjs} +3795 -1466
- package/fesm2022/wuic-framework-lib.mjs +1 -1
- package/package.json +1 -1
- package/types/wuic-framework-lib.d.ts +647 -26
|
@@ -18,7 +18,7 @@ import { GoogleMap, MapInfoWindow, MapPolygon } from '@angular/google-maps';
|
|
|
18
18
|
import { MarkerClusterer } from '@googlemaps/markerclusterer';
|
|
19
19
|
import { SplitButton } from 'primeng/splitbutton';
|
|
20
20
|
import { Menubar } from 'primeng/menubar';
|
|
21
|
-
import { AutoCompleteCompleteEvent } from 'primeng/autocomplete';
|
|
21
|
+
import { AutoComplete, AutoCompleteCompleteEvent } from 'primeng/autocomplete';
|
|
22
22
|
import { Select } from 'primeng/select';
|
|
23
23
|
import { PrimeNG } from 'primeng/config';
|
|
24
24
|
import { Popover } from 'primeng/popover';
|
|
@@ -94,11 +94,106 @@ declare class WuicClientException extends Error {
|
|
|
94
94
|
});
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Normalized context passed to error delegates registered via
|
|
99
|
+
* {@link GlobalHandler.registerDelegate}.
|
|
100
|
+
*
|
|
101
|
+
* Built from any raw error (HttpErrorResponse, Error, WuicClientException,
|
|
102
|
+
* or arbitrary thrown object) so component delegates can do lookups
|
|
103
|
+
* (e.g. `ctx.message.includes('METADATA_DB_EXISTS_CONFIRM_REQUIRED')`)
|
|
104
|
+
* without caring about the envelope shape.
|
|
105
|
+
*/
|
|
106
|
+
interface ErrorDelegateContext {
|
|
107
|
+
/** Raw error as received by the GlobalHandler. */
|
|
108
|
+
error: any;
|
|
109
|
+
/** `errorCode` from the typed-exception envelope (e.g. `errors.server.unhandled`). */
|
|
110
|
+
errorCode?: string;
|
|
111
|
+
/** `args` map from the typed-exception envelope. */
|
|
112
|
+
args?: Record<string, unknown>;
|
|
113
|
+
/** Server's `fallbackMessage` (raw, untranslated). */
|
|
114
|
+
fallbackMessage?: string;
|
|
115
|
+
/** Best-effort merged message — concatenates every plausible source
|
|
116
|
+
* (body.message, body.rootMessage, args.message, fallbackMessage,
|
|
117
|
+
* err.message) so substring matches work regardless of envelope shape. */
|
|
118
|
+
message: string;
|
|
119
|
+
/** HTTP status code, if the error is an HttpErrorResponse. */
|
|
120
|
+
status?: number;
|
|
121
|
+
/** Request URL, if the error is an HttpErrorResponse. */
|
|
122
|
+
url?: string;
|
|
123
|
+
/** True if the raw error looks like an HttpErrorResponse. */
|
|
124
|
+
isHttpError: boolean;
|
|
125
|
+
/** True if the raw error is a typed `WuicClientException`. */
|
|
126
|
+
isClientException: boolean;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Delegate function: returns true (sync or via Promise) to suppress the
|
|
130
|
+
* default error dialog. See {@link GlobalHandler.registerDelegate} for the
|
|
131
|
+
* full contract and async semantics.
|
|
132
|
+
*/
|
|
133
|
+
type ErrorDelegate = (ctx: ErrorDelegateContext) => boolean | void | Promise<boolean | void>;
|
|
134
|
+
/**
|
|
135
|
+
* Options for {@link GlobalHandler.notify}: controls how the error is
|
|
136
|
+
* surfaced to the user (toast vs dialog) and what header/severity to use.
|
|
137
|
+
*/
|
|
138
|
+
interface NotifyOptions {
|
|
139
|
+
/** True → render as PrimeNG toast (via WtoolboxService.messageNotificationService).
|
|
140
|
+
* False/undefined → full dialog flow (handleError path). Default: false. */
|
|
141
|
+
isToast?: boolean;
|
|
142
|
+
/** Toast header text. Default: 'Errore'. (Toast-only.) */
|
|
143
|
+
summary?: string;
|
|
144
|
+
/** Toast severity (PrimeNG). Default: 'error'. (Toast-only.) */
|
|
145
|
+
severity?: 'success' | 'info' | 'warn' | 'error';
|
|
146
|
+
/** Toast lifetime ms. Default: 6000. (Toast-only.) */
|
|
147
|
+
life?: number;
|
|
148
|
+
/** True → bypass registered delegates (rare; default false). */
|
|
149
|
+
skipDelegates?: boolean;
|
|
150
|
+
}
|
|
97
151
|
declare class GlobalHandler implements ErrorHandler {
|
|
98
152
|
static messageNotification: BehaviorSubject<{
|
|
99
153
|
show: boolean;
|
|
100
154
|
exception: CustomException;
|
|
101
155
|
}>;
|
|
156
|
+
/**
|
|
157
|
+
* Flag globale "backend in restart" — quando true, `handleError` non
|
|
158
|
+
* mostra dialog/toast di errore e non inoltra al CrashReporter. Acceso
|
|
159
|
+
* da `app-settings-editor.component.ts:saveAndApply` mentre l'overlay
|
|
160
|
+
* "Riavvio in corso" e' visibile (poll-fail → bump → poll-up). Spento
|
|
161
|
+
* appena il nuovo worker risponde.
|
|
162
|
+
*
|
|
163
|
+
* Razionale: durante il restart il worker e' down per ~5-30s. Tutte le
|
|
164
|
+
* chiamate HTTP correnti (notification polling, crashForward, lazy
|
|
165
|
+
* fetches) falliscono con `ERR_CONNECTION_REFUSED`. Ogni fallimento
|
|
166
|
+
* fa partire `handleError` → dialog "Errore HTTP 0" sotto il dialog
|
|
167
|
+
* "Riavvio in corso". Brutto e fuorviante per l'utente che sta
|
|
168
|
+
* legittimamente aspettando il restart. Soppresso fino a fine restart.
|
|
169
|
+
*/
|
|
170
|
+
private static _restartInProgress;
|
|
171
|
+
static setRestartInProgress(value: boolean): void;
|
|
172
|
+
static isRestartInProgress(): boolean;
|
|
173
|
+
/**
|
|
174
|
+
* Auto-bootstrap del CrashReporterService al primo istanziamento del
|
|
175
|
+
* GlobalHandler (registrato dal consumer come `{ provide: ErrorHandler,
|
|
176
|
+
* useClass: GlobalHandler }` → eager-instantiated dal DI Angular al boot).
|
|
177
|
+
*
|
|
178
|
+
* Bug fix 2026-04-28: prima nessun consumer (WuicTest, WuicDemo, CrmApp)
|
|
179
|
+
* chiamava `CrashReporterService.init()` esplicitamente → l'`enabled`
|
|
180
|
+
* restava false → `(globalThis as any).__wuicCrashReporter` mai assegnato
|
|
181
|
+
* → `handleError` saltava silenziosamente il forward → tutti i crash JS
|
|
182
|
+
* (incluse le `TypeError` da librerie 3p come Stimulsoft viewer)
|
|
183
|
+
* non arrivavano mai a `MetaService.crashForward` → e di conseguenza
|
|
184
|
+
* mai al receiver `errors.wuic-framework.com`. Visibile anche dal
|
|
185
|
+
* Network panel browser: nessuna POST a `crashForward` dopo un errore.
|
|
186
|
+
*
|
|
187
|
+
* Centralizzare il bootstrap qui ha questi vantaggi:
|
|
188
|
+
* 1. Niente codice consumer-side richiesto — la lib si auto-attiva.
|
|
189
|
+
* 2. Garantisce che `__wuicCrashReporter` sia popolato PRIMA che
|
|
190
|
+
* `handleError` lo legga (stesso ciclo di costruzione DI).
|
|
191
|
+
* 3. Guard `_bootstrapAttempted`: niente double-init se per qualche
|
|
192
|
+
* ragione GlobalHandler venisse istanziato N volte (es.
|
|
193
|
+
* `handleErrorStatic` ne crea uno transient per request).
|
|
194
|
+
*/
|
|
195
|
+
private static _bootstrapAttempted;
|
|
196
|
+
constructor();
|
|
102
197
|
/**
|
|
103
198
|
* Static dispatcher — lets framework code that doesn't have access to
|
|
104
199
|
* the Angular ErrorHandler instance (e.g. the HTTP interceptor)
|
|
@@ -112,6 +207,24 @@ declare class GlobalHandler implements ErrorHandler {
|
|
|
112
207
|
* Angular zone (e.g. swallowed lifecycle errors).
|
|
113
208
|
*/
|
|
114
209
|
static emitClientException(exc: WuicClientException): void;
|
|
210
|
+
/**
|
|
211
|
+
* Component-friendly entry point: take an error and surface it to the
|
|
212
|
+
* user as a TOAST (default) or DIALOG, choosing the right message
|
|
213
|
+
* automatically from the typed-exception envelope.
|
|
214
|
+
*
|
|
215
|
+
* Use case: components doing their own try/catch on HTTP calls (e.g.
|
|
216
|
+
* pivot-builder, view-builder) want to show a contextual error in a
|
|
217
|
+
* PrimeNG toast — they used to do
|
|
218
|
+
* `messageService.add({ severity:'error', detail: err.message })`
|
|
219
|
+
* which prints the useless "Http failure response for X: 500 OK".
|
|
220
|
+
* With `notify(err, { isToast:true })` the toast shows the SERVER's
|
|
221
|
+
* `fallbackMessage` / `args.message` from the JsonExceptionFilter envelope.
|
|
222
|
+
*
|
|
223
|
+
* Also runs the registered delegates first, so a marker-intercepting
|
|
224
|
+
* delegate (e.g. wizard's METADATA_DB_EXISTS) can take over and
|
|
225
|
+
* suppress the toast/dialog if it handles the error itself.
|
|
226
|
+
*/
|
|
227
|
+
static notify(error: any, opts?: NotifyOptions): void;
|
|
115
228
|
/**
|
|
116
229
|
* Optional bootstrap: install window/promise handlers that wrap any
|
|
117
230
|
* native unhandled error into a typed WuicClientException. Call once
|
|
@@ -123,6 +236,25 @@ declare class GlobalHandler implements ErrorHandler {
|
|
|
123
236
|
static installWindowHandlers(opts?: {
|
|
124
237
|
exposeForTests?: boolean;
|
|
125
238
|
}): void;
|
|
239
|
+
private static delegates;
|
|
240
|
+
private static nextDelegateId;
|
|
241
|
+
/**
|
|
242
|
+
* Register a delegate that intercepts errors before the default dialog.
|
|
243
|
+
* Higher priority delegates are called first; first one returning true
|
|
244
|
+
* suppresses the default dialog and stops further delegate calls.
|
|
245
|
+
* @returns disposer function — call it to unregister (e.g. ngOnDestroy).
|
|
246
|
+
*/
|
|
247
|
+
static registerDelegate(fn: ErrorDelegate, opts?: {
|
|
248
|
+
priority?: number;
|
|
249
|
+
}): () => void;
|
|
250
|
+
/** Build a normalized context from a raw error (HttpErrorResponse, Error,
|
|
251
|
+
* WuicClientException, or anything else with .error). */
|
|
252
|
+
private static extractErrorContext;
|
|
253
|
+
/** Iterate delegates; first one returning true suppresses default flow.
|
|
254
|
+
* Async delegates: their Promise is dispatched fire-and-forget; the
|
|
255
|
+
* return value seen here is `Promise` (truthy), which we treat as
|
|
256
|
+
* "delegate took over" → suppress default dialog. */
|
|
257
|
+
private static dispatchToDelegates;
|
|
126
258
|
handleError(e: any): void;
|
|
127
259
|
/**
|
|
128
260
|
* @deprecated Pre-typed-envelope branches. Remove once server migration
|
|
@@ -1702,6 +1834,19 @@ declare class DataSourceComponent implements OnInit, OnDestroy {
|
|
|
1702
1834
|
*/
|
|
1703
1835
|
private refreshPristineFromCurrent;
|
|
1704
1836
|
/**
|
|
1837
|
+
* Rebase: sposta la pristine baseline al record corrente e azzera il tracker
|
|
1838
|
+
* dei pending changes. Usato dai custom edit-form component dopo aver
|
|
1839
|
+
* applicato `mc_default_value_callback` async (es. progressivo da stored)
|
|
1840
|
+
* sul record gia' BS-wrappato — senza questo refresh il record `__new=true`
|
|
1841
|
+
* risulterebbe `hasPendingChanges()=true` al primo open del dialog Insert
|
|
1842
|
+
* (i BS.next dei default callback vengono tracciati come edit utente).
|
|
1843
|
+
*
|
|
1844
|
+
* NB: usare SOLO se il record e' `__new=true` (modalita' Insert) e i valori
|
|
1845
|
+
* applicati sono default-set, non user-edit. Su record gia' persistente
|
|
1846
|
+
* questo metodo cancella i changes pendenti -> rischio data loss.
|
|
1847
|
+
*/
|
|
1848
|
+
rebasePristineAfterDefaults(): void;
|
|
1849
|
+
/**
|
|
1705
1850
|
* Pubblica uno stato locale aggiornato su `fetchInfo$` per riallineare i consumer del datasource.
|
|
1706
1851
|
*/
|
|
1707
1852
|
private publishLocalStateUpdate;
|
|
@@ -1833,18 +1978,103 @@ declare class MapOptions implements IDesignerProperties {
|
|
|
1833
1978
|
useCurrentLocation: boolean;
|
|
1834
1979
|
useClusterer: boolean;
|
|
1835
1980
|
filterByBoundaries: boolean;
|
|
1981
|
+
/**
|
|
1982
|
+
* Pass-through al `google.maps.MapOptions.clickableIcons`. Quando `false`,
|
|
1983
|
+
* Google Maps NON apre la propria info window built-in sui POI cliccati
|
|
1984
|
+
* (negozi, fermate, indirizzi, ecc.) — utile quando l'app deve gestire
|
|
1985
|
+
* solo i click dei marker custom (l'info window del POI di Google
|
|
1986
|
+
* intercetta i click che dovrebbero arrivare al marker e copre l'info
|
|
1987
|
+
* window del framework). Default `undefined` (= comportamento Google,
|
|
1988
|
+
* `true`).
|
|
1989
|
+
*/
|
|
1990
|
+
clickableIcons?: boolean;
|
|
1836
1991
|
customMarkerImageSrc: string;
|
|
1837
1992
|
customMarkerImageSrcField: string;
|
|
1838
1993
|
markerContentCallback: string;
|
|
1994
|
+
/**
|
|
1995
|
+
* Campo del record che contiene il colore (CSS string `#rrggbb`) da usare
|
|
1996
|
+
* sul `PinElement` del marker. Ignorato se il record ha
|
|
1997
|
+
* `customMarkerImageSrcField` valorizzato (immagine/SVG ha precedenza).
|
|
1998
|
+
*/
|
|
1999
|
+
markerColorField?: string;
|
|
1839
2000
|
titleField: string;
|
|
1840
2001
|
infoField: string;
|
|
1841
2002
|
infoFunction: string;
|
|
1842
2003
|
itemTemplateString: string;
|
|
2004
|
+
/**
|
|
2005
|
+
* Polyline overlay configurabile via `mdpropsbag.archetypes.map.polyline`.
|
|
2006
|
+
* Quando `enabled=true`, il componente raggruppa i record per `groupByField`,
|
|
2007
|
+
* li ordina per `orderByField` e disegna una `<map-polyline>` per ogni gruppo
|
|
2008
|
+
* unendo i punti `{lat: record[latField], lng: record[lngField]}`.
|
|
2009
|
+
* Caso d'uso: tracciamento percorsi GPS (mezzi, persone, asset) dove ogni
|
|
2010
|
+
* record e' una posizione storicizzata.
|
|
2011
|
+
*/
|
|
2012
|
+
polyline?: PolylineOverlayOptions;
|
|
1843
2013
|
constructor();
|
|
1844
2014
|
init(metaInfo: MetaInfo): void;
|
|
1845
2015
|
archetypePropName: string;
|
|
1846
2016
|
getDesignerProps(metaInfo: MetaInfo, action: BehaviorSubject<any>): MetaInfo;
|
|
1847
2017
|
}
|
|
2018
|
+
/**
|
|
2019
|
+
* Configurazione overlay polyline per archetype map. Permette di trasformare un
|
|
2020
|
+
* elenco di record (es. posizioni GPS storicizzate) in una o piu' polyline,
|
|
2021
|
+
* raggruppate per un campo (es. mezzo_id) e ordinate per un campo (es. timestamp).
|
|
2022
|
+
*
|
|
2023
|
+
* Le coordinate vengono lette dalla colonna `point` esistente sulla tabella/view
|
|
2024
|
+
* (auto-detect: la stessa colonna che il map-list usa per i marker). Per usarla,
|
|
2025
|
+
* la tabella DEVE avere una colonna con `mc_ui_column_type='point'` contenente
|
|
2026
|
+
* JSON `{"lat":..,"lng":..}`.
|
|
2027
|
+
*
|
|
2028
|
+
* Quando `snapToRoads=true` il componente usa Google DirectionsService per
|
|
2029
|
+
* snappare i waypoint alle strade reali (max 25 waypoint per chiamata; se ci
|
|
2030
|
+
* sono piu' punti viene fatto batching automatico).
|
|
2031
|
+
*/
|
|
2032
|
+
interface PolylineOverlayOptions {
|
|
2033
|
+
enabled: boolean;
|
|
2034
|
+
/** Campo record per raggruppare (es. 'mezzo_id'). Se omesso → 1 sola polyline globale. */
|
|
2035
|
+
groupByField?: string;
|
|
2036
|
+
/** Campo record per ordinare i punti dentro ogni gruppo (es. 'timestamp_pos'). */
|
|
2037
|
+
orderByField?: string;
|
|
2038
|
+
/**
|
|
2039
|
+
* Campo record alternativo per leggere le coordinate (auto-detect via
|
|
2040
|
+
* colonna `point` se omesso). Utile se la tabella/view ha piu' colonne
|
|
2041
|
+
* point e vuoi specificare quale usare per la polyline.
|
|
2042
|
+
*/
|
|
2043
|
+
pointField?: string;
|
|
2044
|
+
/**
|
|
2045
|
+
* Campo record che contiene il colore della polyline (CSS string `#rrggbb`).
|
|
2046
|
+
* Quando valorizzato, il colore viene letto dal primo record del gruppo
|
|
2047
|
+
* (assume omogeneita' per gruppo) e sovrascrive `strokeColor` /
|
|
2048
|
+
* `strokeColorByGroup`. Tipico use-case: colore configurato sul mezzo
|
|
2049
|
+
* (FK lookup) e portato nella view sorgente.
|
|
2050
|
+
*/
|
|
2051
|
+
colorField?: string;
|
|
2052
|
+
/** Colore tratto polyline (default `#1d4ed8`). */
|
|
2053
|
+
strokeColor?: string;
|
|
2054
|
+
/** Se true, ogni gruppo riceve un colore distinto (palette interna). */
|
|
2055
|
+
strokeColorByGroup?: boolean;
|
|
2056
|
+
/** Spessore tratto in pixel (default 4). */
|
|
2057
|
+
strokeWeight?: number;
|
|
2058
|
+
/** Opacita 0..1 (default 0.85). */
|
|
2059
|
+
strokeOpacity?: number;
|
|
2060
|
+
/** Se true, snappa la polyline alle strade reali via Google DirectionsService. */
|
|
2061
|
+
snapToRoads?: boolean;
|
|
2062
|
+
/** Se false, nasconde i marker (mostra solo la polyline). Default true. */
|
|
2063
|
+
showMarkers?: boolean;
|
|
2064
|
+
/** Modalita di viaggio per snapToRoads (`DRIVING` default, `WALKING`, `BICYCLING`). */
|
|
2065
|
+
travelMode?: 'DRIVING' | 'WALKING' | 'BICYCLING';
|
|
2066
|
+
/**
|
|
2067
|
+
* Se true, oltre alla polyline disegna un dot (`<map-circle>`) sulle
|
|
2068
|
+
* coordinate originali di ciascun record. Utile per distinguere visivamente
|
|
2069
|
+
* i punti GPS realmente storicizzati dal path interpolato/snapped.
|
|
2070
|
+
* Default false.
|
|
2071
|
+
*/
|
|
2072
|
+
showWaypointDots?: boolean;
|
|
2073
|
+
/**
|
|
2074
|
+
* Raggio in metri del dot (cerchio reale, scala con lo zoom). Default 8.
|
|
2075
|
+
*/
|
|
2076
|
+
waypointDotRadius?: number;
|
|
2077
|
+
}
|
|
1848
2078
|
declare class Point {
|
|
1849
2079
|
lat: number;
|
|
1850
2080
|
lng: number;
|
|
@@ -2246,7 +2476,7 @@ declare class MetadatiTabella {
|
|
|
2246
2476
|
* Flag toolbar-level controllati da `md_props_bag.toolbar.*` (JSON).
|
|
2247
2477
|
* Cambiabili per-route senza toccare lo schema SQL di
|
|
2248
2478
|
* `_metadati__tabelle`. Esempio in `md_props_bag`:
|
|
2249
|
-
* { "toolbar": { "hideManageState": true } }
|
|
2479
|
+
* { "toolbar": { "hideManageState": true, "hideBatchActions": true } }
|
|
2250
2480
|
*
|
|
2251
2481
|
* - `hideManageState`: nasconde il bottone "Gestione stato"
|
|
2252
2482
|
* (icona bookmark) + la select degli stati salvati nella
|
|
@@ -2254,9 +2484,18 @@ declare class MetadatiTabella {
|
|
|
2254
2484
|
* demo dove il saved-state feature (persistenza user_id +
|
|
2255
2485
|
* route via MetaService) non ha senso — es. Pattern 3 puro
|
|
2256
2486
|
* OData senza route metadata registrata.
|
|
2487
|
+
* - `hideBatchActions`: nasconde dalla caption-left i pulsanti
|
|
2488
|
+
* "Salva modifiche" / "Annulla modifiche" + l'indicatore
|
|
2489
|
+
* conteggio changes (badge pencil + count) generati quando
|
|
2490
|
+
* `md_inline_cell_editing` + `md_batch_save` sono attivi.
|
|
2491
|
+
* Utile per nested grid (es. righe documento dentro un
|
|
2492
|
+
* parametric-dialog) dove il save/cancel del padre persiste
|
|
2493
|
+
* master + righe in un colpo via batch save framework e i
|
|
2494
|
+
* duplicati toolbar sulla nested confondono l'UX.
|
|
2257
2495
|
*/
|
|
2258
2496
|
toolbar?: {
|
|
2259
2497
|
hideManageState?: boolean;
|
|
2498
|
+
hideBatchActions?: boolean;
|
|
2260
2499
|
};
|
|
2261
2500
|
/**
|
|
2262
2501
|
* Tuning server-side letto da `DataProviderMetaService.select`
|
|
@@ -3012,6 +3251,16 @@ declare class MetadataProviderService {
|
|
|
3012
3251
|
value: string;
|
|
3013
3252
|
type: string;
|
|
3014
3253
|
}>>;
|
|
3254
|
+
/**
|
|
3255
|
+
* Elimina un report (file `.mrt`) e relativo cleanup metadata via `MetaService.removeReport`.
|
|
3256
|
+
* Solo gli utenti admin possono effettivamente cancellare; il backend ritorna `false` per non-admin.
|
|
3257
|
+
* Dopo successo invalida la cache report-list locale per la route, cosi' il prossimo
|
|
3258
|
+
* `getReportList` ricarica dal backend.
|
|
3259
|
+
* @param route Route applicativa che ospita il report.
|
|
3260
|
+
* @param name Nome file `.mrt` da rimuovere.
|
|
3261
|
+
* @returns `true` se la cancellazione e' andata a buon fine.
|
|
3262
|
+
*/
|
|
3263
|
+
removeReport(route: string, name: string): Promise<boolean>;
|
|
3015
3264
|
static ɵfac: i0.ɵɵFactoryDeclaration<MetadataProviderService, never>;
|
|
3016
3265
|
static ɵprov: i0.ɵɵInjectableDeclaration<MetadataProviderService>;
|
|
3017
3266
|
}
|
|
@@ -3212,6 +3461,18 @@ declare class DataProviderMetaService {
|
|
|
3212
3461
|
* additional columns alongside the text field).
|
|
3213
3462
|
*/
|
|
3214
3463
|
static buildSlimComboRestriction(field: MetadatiColonna | null | undefined): string[];
|
|
3464
|
+
/**
|
|
3465
|
+
* Sanitize di un body HTTP rimuovendo qualunque BehaviorSubject (e
|
|
3466
|
+
* BS-of-BS) che potrebbe essere finito dentro `filterInfo`,
|
|
3467
|
+
* `currentRecord`, slot di un record BS-wrapped, ecc. Pre-serializza
|
|
3468
|
+
* con replacer BS-aware e parse back: il risultato e' un body plain
|
|
3469
|
+
* che Angular `HttpRequest.serializeBody` puo' stringificare senza
|
|
3470
|
+
* "Converting circular structure to JSON" (SafeSubscriber →
|
|
3471
|
+
* Subscription._finalizers → _parentage). Da usare in tutti i
|
|
3472
|
+
* `http.post`/`http.put` che possono ricevere payload provenienti da
|
|
3473
|
+
* datasource reattive.
|
|
3474
|
+
*/
|
|
3475
|
+
static sanitizeBodyForHttp(body: any): any;
|
|
3215
3476
|
/**
|
|
3216
3477
|
* Carica i dati della route corrente chiamando `MetaService.getFlatRecordData` (`MetadataProviderService.readUri`).
|
|
3217
3478
|
* Invia paginazione/ordinamenti/gruppi/filtri/aggregazioni e `has_server_operation`, poi mappa la risposta
|
|
@@ -4267,6 +4528,36 @@ declare class WtoolboxService {
|
|
|
4267
4528
|
suggestColumnMD(record: {
|
|
4268
4529
|
[key: string]: BehaviorSubject<any>;
|
|
4269
4530
|
}, field: MetadatiColonna, type: string, routeRef?: string): Promise<void>;
|
|
4531
|
+
/**
|
|
4532
|
+
* Suggest del campo `mc_ui_lookup_computed_dataTextField` (Lookup
|
|
4533
|
+
* Computed Data Text Field — formula display nella grid del parent):
|
|
4534
|
+
* apre albero da `MetaService.getLookupListByIDLevelUP` (root = tabella
|
|
4535
|
+
* proprietaria di mc_id, con i lookup edges per navigare alle target)
|
|
4536
|
+
* e genera il select con `appendOnly=2` (JOIN alias `<colFK>_<target>`
|
|
4537
|
+
* coerente con quello costruito da JoinBuilder a runtime nella query
|
|
4538
|
+
* della grid). Vedi anche `suggestLookupComputedEdit` per il caso
|
|
4539
|
+
* speculare nel field-editor.
|
|
4540
|
+
* @param record Record metadata corrente (`mc_id` usato dal backend).
|
|
4541
|
+
* @param field Campo formula da aggiornare.
|
|
4542
|
+
*/
|
|
4543
|
+
suggestLookupComputed(record: {
|
|
4544
|
+
[key: string]: BehaviorSubject<any>;
|
|
4545
|
+
}, field: MetadatiColonna): Promise<void>;
|
|
4546
|
+
/**
|
|
4547
|
+
* Suggest del campo `mc_ui_lookup_combo_text_edit_computed_dataTextField`
|
|
4548
|
+
* (Lookup Edit Text Computed Formula — testo del lookup nel field-editor):
|
|
4549
|
+
* apre albero da `MetaService.getLookupListFromLookupTarget` con root
|
|
4550
|
+
* spostata sulla TABELLA TARGET del lookup (es. mc_id=`prodotto_id` -> root
|
|
4551
|
+
* `prodotti` con i suoi campi `codice`/`descrizione`/...). Genera il
|
|
4552
|
+
* select con `appendOnly=3` -> qualifier `[<targetTable>].[<col>]`
|
|
4553
|
+
* (es. `[prodotti].[codice]`), perche' la formula gira in un SELECT
|
|
4554
|
+
* diretto sulla target nel field-editor, senza JOIN alias.
|
|
4555
|
+
* @param record Record metadata corrente (`mc_id` usato dal backend).
|
|
4556
|
+
* @param field Campo formula da aggiornare.
|
|
4557
|
+
*/
|
|
4558
|
+
suggestLookupComputedEdit(record: {
|
|
4559
|
+
[key: string]: BehaviorSubject<any>;
|
|
4560
|
+
}, field: MetadatiColonna): Promise<void>;
|
|
4270
4561
|
/**
|
|
4271
4562
|
* Costruisce formula computed partendo da gerarchia lookup: apre albero da
|
|
4272
4563
|
* `MetaService.getLookupListByIDLevelUP` e invia la selezione a `getClauseByLookupHierarchy`
|
|
@@ -5078,6 +5369,14 @@ declare class ListGridComponent implements AfterViewInit, OnInit, OnDestroy, IDa
|
|
|
5078
5369
|
hardcodedDatasource: DataSourceComponent;
|
|
5079
5370
|
rowCustomSelect: (rowData: any, $event: any, dt: Table) => void;
|
|
5080
5371
|
hideToolbar: boolean;
|
|
5372
|
+
/**
|
|
5373
|
+
* Provider letto da `<wuic-import-export-button>` al click su Export XLS.
|
|
5374
|
+
* Arrow function (NON metodo) per preservare il binding di `this` quando
|
|
5375
|
+
* passata come Input — un metodo verrebbe richiamato col `this` del child.
|
|
5376
|
+
* Ritorna lo stato filtri LIVE del datasource: include i filtri applicati
|
|
5377
|
+
* via header/filter-bar che NON vengono propagati nella URL query string.
|
|
5378
|
+
*/
|
|
5379
|
+
getCurrentFilterInfoForExport: () => any;
|
|
5081
5380
|
/**
|
|
5082
5381
|
* Evento emesso subito prima del rendering logico della singola riga.
|
|
5083
5382
|
* Il consumer puo annullare la riga chiamando `cancelRender()`.
|
|
@@ -5127,6 +5426,15 @@ declare class ListGridComponent implements AfterViewInit, OnInit, OnDestroy, IDa
|
|
|
5127
5426
|
private outerTheadObserveRetryTimer?;
|
|
5128
5427
|
records: any[];
|
|
5129
5428
|
cols: any[];
|
|
5429
|
+
/**
|
|
5430
|
+
* Constant CSS value for `<col>`/`<th>` min-width binding. Pulled into a
|
|
5431
|
+
* field (instead of `getColumnMinWidthCss()` method) so the template binding
|
|
5432
|
+
* `[style.min-width]="columnMinWidthCss"` resolves to a property read
|
|
5433
|
+
* (no function call) and Angular's change-detection short-circuits when
|
|
5434
|
+
* the value didn't change. Saves ~3 function calls per column per CD cycle
|
|
5435
|
+
* (template uses it on `<col>`, header `<th>`, and filter row `<th>`).
|
|
5436
|
+
*/
|
|
5437
|
+
readonly columnMinWidthCss = "10px";
|
|
5130
5438
|
metas: MetadatiColonna[];
|
|
5131
5439
|
metaInfo: MetaInfo;
|
|
5132
5440
|
routeName: string;
|
|
@@ -6141,6 +6449,11 @@ declare class ListGridComponent implements AfterViewInit, OnInit, OnDestroy, IDa
|
|
|
6141
6449
|
/**
|
|
6142
6450
|
* Restituisce il valore CSS per `min-width` sulle colonne della tabella.
|
|
6143
6451
|
* @returns Valore CSS da applicare.
|
|
6452
|
+
*
|
|
6453
|
+
* NOTE: per i template binding usare direttamente il field
|
|
6454
|
+
* `columnMinWidthCss`. Questa funzione resta solo per i call-site interni
|
|
6455
|
+
* (TS) che la consumano via `getColumnMinWidthForCol` o
|
|
6456
|
+
* `Number.parseFloat(getColumnMinWidthCss())`.
|
|
6144
6457
|
*/
|
|
6145
6458
|
getColumnMinWidthCss(): string;
|
|
6146
6459
|
/**
|
|
@@ -6480,8 +6793,25 @@ declare class ImportExportButtonComponent {
|
|
|
6480
6793
|
private notificationRealtime;
|
|
6481
6794
|
private trslSrv;
|
|
6482
6795
|
private userInfo;
|
|
6796
|
+
private cdr;
|
|
6483
6797
|
routeName: string;
|
|
6484
6798
|
tableMetadata: any;
|
|
6799
|
+
/**
|
|
6800
|
+
* Callback opzionale fornito dal componente host (list-grid, spreadsheet-list-sf, ...)
|
|
6801
|
+
* per leggere il `filterInfo` corrente del datasource al momento del click su Export.
|
|
6802
|
+
*
|
|
6803
|
+
* Razionale: prima del fix, l'export leggeva il filtro SOLO dalla query string
|
|
6804
|
+
* (`?filterInfo=...`), che NON viene aggiornata quando l'utente filtra in-grid via
|
|
6805
|
+
* intestazioni di colonna o filter-bar — la URL resta `/cities/list` mentre lo stato
|
|
6806
|
+
* filtri vive in `datasource.value.filterInfo`. Risultato: l'XLS scaricato conteneva
|
|
6807
|
+
* SEMPRE l'intero dataset ignorando il filtro applicato.
|
|
6808
|
+
*
|
|
6809
|
+
* Il provider e' una funzione (non un binding `@Input() filterInfo: any`) per garantire
|
|
6810
|
+
* che venga letto il valore CORRENTE al click, non quello catturato all'ultima CD.
|
|
6811
|
+
* Fallback (provider non bindato): `parseFilterInfoFromQueryString()` per back-compat
|
|
6812
|
+
* con eventuali host esterni che non passano il provider.
|
|
6813
|
+
*/
|
|
6814
|
+
filterInfoProvider?: () => any;
|
|
6485
6815
|
importFileInputRef?: ElementRef<HTMLInputElement>;
|
|
6486
6816
|
private popupMenuItemsCache;
|
|
6487
6817
|
private popupMenuItemsCacheKey;
|
|
@@ -6526,7 +6856,7 @@ declare class ImportExportButtonComponent {
|
|
|
6526
6856
|
private exportMonitoringOnly;
|
|
6527
6857
|
private lastHandledExportResumeGuid;
|
|
6528
6858
|
private exportBackgroundNotifiedGuids;
|
|
6529
|
-
constructor(route: ActivatedRoute, dataSrv: DataProviderService, dataMetaSrv: DataProviderMetaService, notificationRealtime: NotificationRealtimeService, trslSrv: TranslationManagerService, userInfo: UserInfoService);
|
|
6859
|
+
constructor(route: ActivatedRoute, dataSrv: DataProviderService, dataMetaSrv: DataProviderMetaService, notificationRealtime: NotificationRealtimeService, trslSrv: TranslationManagerService, userInfo: UserInfoService, cdr: ChangeDetectorRef);
|
|
6530
6860
|
private t;
|
|
6531
6861
|
get canExportXls(): boolean;
|
|
6532
6862
|
get canImportXls(): boolean;
|
|
@@ -6562,7 +6892,7 @@ declare class ImportExportButtonComponent {
|
|
|
6562
6892
|
private applyImportProgressValue;
|
|
6563
6893
|
private stopImportProgressPolling;
|
|
6564
6894
|
static ɵfac: i0.ɵɵFactoryDeclaration<ImportExportButtonComponent, never>;
|
|
6565
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ImportExportButtonComponent, "wuic-import-export-button", never, { "routeName": { "alias": "routeName"; "required": false; }; "tableMetadata": { "alias": "tableMetadata"; "required": false; }; }, {}, never, never, true, never>;
|
|
6895
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ImportExportButtonComponent, "wuic-import-export-button", never, { "routeName": { "alias": "routeName"; "required": false; }; "tableMetadata": { "alias": "tableMetadata"; "required": false; }; "filterInfoProvider": { "alias": "filterInfoProvider"; "required": false; }; }, {}, never, never, true, never>;
|
|
6566
6896
|
}
|
|
6567
6897
|
|
|
6568
6898
|
declare class PagerComponent implements OnInit, OnChanges, OnDestroy {
|
|
@@ -6797,6 +7127,14 @@ declare class FilterBarComponent implements OnInit, OnChanges, OnDestroy {
|
|
|
6797
7127
|
* a bloated, unreadable URL with duplicated filter serializations.
|
|
6798
7128
|
*/
|
|
6799
7129
|
skipUrlSync: boolean;
|
|
7130
|
+
/**
|
|
7131
|
+
* Quando true, il filter-bar non lancia `datasource.value.fetchData()` (e
|
|
7132
|
+
* quindi nessuna `MetaService.getFlatRecordData`) sugli apply* — emette solo
|
|
7133
|
+
* gli output. Usato dal pivot-builder dove il `nestedSource` non rappresenta
|
|
7134
|
+
* una grid visibile: la SQL preview viene rigenerata via
|
|
7135
|
+
* `previewViewDefinition` come reazione agli output, niente fetch sul route.
|
|
7136
|
+
*/
|
|
7137
|
+
skipFetch: boolean;
|
|
6800
7138
|
filterApplied: EventEmitter<void>;
|
|
6801
7139
|
onFilterApplied: EventEmitter<{
|
|
6802
7140
|
mode: "basic" | "advanced" | "clear";
|
|
@@ -6939,7 +7277,7 @@ declare class FilterBarComponent implements OnInit, OnChanges, OnDestroy {
|
|
|
6939
7277
|
private syncGridStateQueryString;
|
|
6940
7278
|
private resetCursorPagingState;
|
|
6941
7279
|
static ɵfac: i0.ɵɵFactoryDeclaration<FilterBarComponent, never>;
|
|
6942
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FilterBarComponent, "wuic-filter-bar", never, { "datasource": { "alias": "datasource"; "required": false; }; "hardcodedDatasource": { "alias": "hardcodedDatasource"; "required": false; }; "multiDatasourceMetas": { "alias": "multiDatasourceMetas"; "required": false; }; "skipUrlSync": { "alias": "skipUrlSync"; "required": false; }; }, { "filterApplied": "filterApplied"; "onFilterApplied": "onFilterApplied"; "onSortingApplied": "onSortingApplied"; "onPageSizeApplied": "onPageSizeApplied"; "onGroupingChanged": "onGroupingChanged"; "onFilterBarCollapseChanged": "onFilterBarCollapseChanged"; }, never, never, true, never>;
|
|
7280
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FilterBarComponent, "wuic-filter-bar", never, { "datasource": { "alias": "datasource"; "required": false; }; "hardcodedDatasource": { "alias": "hardcodedDatasource"; "required": false; }; "multiDatasourceMetas": { "alias": "multiDatasourceMetas"; "required": false; }; "skipUrlSync": { "alias": "skipUrlSync"; "required": false; }; "skipFetch": { "alias": "skipFetch"; "required": false; }; }, { "filterApplied": "filterApplied"; "onFilterApplied": "onFilterApplied"; "onSortingApplied": "onSortingApplied"; "onPageSizeApplied": "onPageSizeApplied"; "onGroupingChanged": "onGroupingChanged"; "onFilterBarCollapseChanged": "onFilterBarCollapseChanged"; }, never, never, true, never>;
|
|
6943
7281
|
}
|
|
6944
7282
|
|
|
6945
7283
|
declare class LazySchedulerListComponent implements OnInit {
|
|
@@ -7088,7 +7426,7 @@ interface IDesigner<T extends IDesignerProperties> {
|
|
|
7088
7426
|
archetypeOptions: T;
|
|
7089
7427
|
}
|
|
7090
7428
|
|
|
7091
|
-
declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOptions>, IDataBoundHostComponent {
|
|
7429
|
+
declare class MapListComponent implements OnInit, AfterViewInit, OnDestroy, IBindable, IDesigner<MapOptions>, IDataBoundHostComponent {
|
|
7092
7430
|
private titleService;
|
|
7093
7431
|
private cd;
|
|
7094
7432
|
private route;
|
|
@@ -7122,10 +7460,6 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
|
|
|
7122
7460
|
* Proprieta di stato del componente per place lib, usata dalla logica interna e dal template.
|
|
7123
7461
|
*/
|
|
7124
7462
|
PLACE_LIB: google.maps.PlacesLibrary;
|
|
7125
|
-
/**
|
|
7126
|
-
* Proprieta di stato del componente per drawing lib, usata dalla logica interna e dal template.
|
|
7127
|
-
*/
|
|
7128
|
-
DRAWING_LIB: google.maps.DrawingLibrary;
|
|
7129
7463
|
/**
|
|
7130
7464
|
* Input dal componente padre per hardcoded route; usata nella configurazione e nel rendering del componente.
|
|
7131
7465
|
*/
|
|
@@ -7269,6 +7603,34 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
|
|
|
7269
7603
|
* Collezione dati per data, consumata dal rendering e dalle operazioni del componente.
|
|
7270
7604
|
*/
|
|
7271
7605
|
data: any[];
|
|
7606
|
+
/**
|
|
7607
|
+
* Polyline overlay calcolate da `parseData` quando
|
|
7608
|
+
* `archetypeOptions.polyline.enabled=true`. Una polyline per gruppo
|
|
7609
|
+
* (`groupByField`), ordinate per `orderByField`. Renderizzate via
|
|
7610
|
+
* `<map-polyline>` nel template.
|
|
7611
|
+
*/
|
|
7612
|
+
polylines: {
|
|
7613
|
+
path: {
|
|
7614
|
+
lat: number;
|
|
7615
|
+
lng: number;
|
|
7616
|
+
}[];
|
|
7617
|
+
options: any;
|
|
7618
|
+
group: any;
|
|
7619
|
+
}[];
|
|
7620
|
+
/**
|
|
7621
|
+
* Dot sui waypoint originali (coordinate reali dei record) renderizzati
|
|
7622
|
+
* via `<map-circle>` quando `archetypeOptions.polyline.showWaypointDots=true`.
|
|
7623
|
+
* Utile per distinguere i punti GPS storicizzati dal path interpolato/snapped.
|
|
7624
|
+
*/
|
|
7625
|
+
polylineDots: {
|
|
7626
|
+
center: {
|
|
7627
|
+
lat: number;
|
|
7628
|
+
lng: number;
|
|
7629
|
+
};
|
|
7630
|
+
options: any;
|
|
7631
|
+
group: any;
|
|
7632
|
+
record: any;
|
|
7633
|
+
}[];
|
|
7272
7634
|
/**
|
|
7273
7635
|
* Configurazione di presentazione per item template string, usata nel rendering del componente.
|
|
7274
7636
|
*/
|
|
@@ -7436,6 +7798,21 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
|
|
|
7436
7798
|
* Rilascia risorse e sottoscrizioni per evitare leak e stati pendenti.
|
|
7437
7799
|
*/
|
|
7438
7800
|
ngOnDestroy(): void;
|
|
7801
|
+
/** Cleanup function per ogni listener gmp-click attivo. */
|
|
7802
|
+
private markerGmpClickCleanups;
|
|
7803
|
+
/** Subscription a `markerElements.changes`. */
|
|
7804
|
+
private markerElementsChangesSub?;
|
|
7805
|
+
ngAfterViewInit(): void;
|
|
7806
|
+
/**
|
|
7807
|
+
* Iterazione `markerElements` ↔ `data.filter(__marker)` in parallelo
|
|
7808
|
+
* (stesso ordine di rendering). Per ogni AdvancedMarkerElement:
|
|
7809
|
+
* - removeEventListener su quello vecchio (cleanup);
|
|
7810
|
+
* - addEventListener('gmp-click', ...) sul nuovo, capturando record/marker
|
|
7811
|
+
* nello scope per chiamare `openInfo` esattamente come faceva
|
|
7812
|
+
* `(mapClick)="openInfo(markerElem, record.__marker)"`.
|
|
7813
|
+
*/
|
|
7814
|
+
private wireMarkerGmpClick;
|
|
7815
|
+
private detachAllMarkerGmpClick;
|
|
7439
7816
|
/**
|
|
7440
7817
|
* Si sottoscrive a `fetchInfo$` del datasource, aggiorna metadati/viewport e inizializza Google Maps al primo caricamento.
|
|
7441
7818
|
* Nei caricamenti successivi ripopola marker/poligoni e aggiorna clusterer e resize pass.
|
|
@@ -7454,11 +7831,54 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
|
|
|
7454
7831
|
*/
|
|
7455
7832
|
parseData(data: any): any;
|
|
7456
7833
|
/**
|
|
7834
|
+
* Costruisce le polyline overlay dai record applicando
|
|
7835
|
+
* `archetypeOptions.polyline`. Ogni gruppo (`groupByField`) → 1 polyline
|
|
7836
|
+
* con path ordinato per `orderByField`. Estende `bounds` cosi' fitBounds
|
|
7837
|
+
* include i punti del percorso.
|
|
7838
|
+
*
|
|
7839
|
+
* Se `snapToRoads=true`, dopo il render iniziale (path = punti raw) viene
|
|
7840
|
+
* lanciato `snapPolylinesToRoads()` async che chiama Google DirectionsService
|
|
7841
|
+
* e sostituisce ogni `path` con `overview_path` della rotta calcolata.
|
|
7842
|
+
*/
|
|
7843
|
+
buildPolylines(data: any[], bounds: google.maps.LatLngBounds): {
|
|
7844
|
+
path: {
|
|
7845
|
+
lat: number;
|
|
7846
|
+
lng: number;
|
|
7847
|
+
}[];
|
|
7848
|
+
options: any;
|
|
7849
|
+
group: any;
|
|
7850
|
+
}[];
|
|
7851
|
+
/**
|
|
7852
|
+
* Snap async delle polyline alle strade reali. Usa la nuova
|
|
7853
|
+
* **Routes API** (`google.maps.routes.Route.computeRoutes`) che sostituisce
|
|
7854
|
+
* `DirectionsService` deprecato dal 2026-02-25. Fallback automatico a
|
|
7855
|
+
* `DirectionsService` legacy se la libreria `routes` non e' disponibile
|
|
7856
|
+
* o la chiamata fallisce (key senza "Routes API" abilitata, ecc.).
|
|
7857
|
+
*
|
|
7858
|
+
* Migration guide: https://developers.google.com/maps/documentation/javascript/routes/routes-js-migration
|
|
7859
|
+
*
|
|
7860
|
+
* Limite waypoint per chiamata = 25 (origin + 23 intermediates + destination):
|
|
7861
|
+
* polyline piu' lunghe vengono chunkate.
|
|
7862
|
+
*
|
|
7863
|
+
* Travel mode legacy → routes mapping: DRIVING→DRIVE, WALKING→WALK,
|
|
7864
|
+
* BICYCLING→BICYCLE.
|
|
7865
|
+
*/
|
|
7866
|
+
private snapPolylinesToRoads;
|
|
7867
|
+
/**
|
|
7457
7868
|
* Recupera i dati/valori richiesti da `getMarkerContent`.
|
|
7458
7869
|
* @param record Dato/record su cui il metodo applica elaborazioni o aggiornamenti.
|
|
7459
7870
|
* @returns Valore risolto da `getMarkerContent` in base ai criteri implementati.
|
|
7460
7871
|
*/
|
|
7461
7872
|
getMarkerContent(record: any): any;
|
|
7873
|
+
/**
|
|
7874
|
+
* Costruisce un HTMLElement marker-content da una stringa che puo' essere:
|
|
7875
|
+
* - SVG inline (`<svg ...>...</svg>`) → wrappato in un `<div>` per renderlo
|
|
7876
|
+
* un AdvancedMarker content valido (deve essere un Element, non un
|
|
7877
|
+
* DocumentFragment). Dimensioni controllate dal viewBox dell'SVG.
|
|
7878
|
+
* - URL immagine (http/https/data:image/...) → `<img src>`.
|
|
7879
|
+
* - Stringa vuota / null → null (caller usa il fallback successivo).
|
|
7880
|
+
*/
|
|
7881
|
+
private buildMarkerVisualFromValue;
|
|
7462
7882
|
/**
|
|
7463
7883
|
* Restituisce una Promise che wrappa `navigator.geolocation.getCurrentPosition`.
|
|
7464
7884
|
* @returns Posizione geolocalizzata del browser oppure errore se non disponibile/negata.
|
|
@@ -7618,6 +8038,15 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
|
|
|
7618
8038
|
* Apre l'info window del marker selezionato valorizzando `infoContent` con il template record.
|
|
7619
8039
|
*/
|
|
7620
8040
|
openInfo(markerElem: any, marker: any): void;
|
|
8041
|
+
/**
|
|
8042
|
+
* Apre l'info window su un waypoint (`<map-circle>`) della polyline overlay.
|
|
8043
|
+
* Riusa lo stesso `itemTemplate` del marker principale: il record del
|
|
8044
|
+
* waypoint contiene tutti i campi (incluso `timestamp_pos`, `velocita_kmh`,
|
|
8045
|
+
* `note`, ecc.) che il template puo' leggere via `rowData.record?.<field>`.
|
|
8046
|
+
* L'anchor non e' un marker — passiamo la posizione esplicita via
|
|
8047
|
+
* `infoWindowOptions.position`.
|
|
8048
|
+
*/
|
|
8049
|
+
openWaypointInfo(dot: any, $event?: any): void;
|
|
7621
8050
|
/**
|
|
7622
8051
|
* Apre la stessa info window usata dai marker quando l'utente clicca un poligono.
|
|
7623
8052
|
* Se non e disponibile un anchor marker, usa la posizione click o il centro geometrico del poligono.
|
|
@@ -7745,7 +8174,7 @@ declare class MapListComponent implements OnInit, IBindable, IDesigner<MapOption
|
|
|
7745
8174
|
static ɵcmp: i0.ɵɵComponentDeclaration<MapListComponent, "wuic-map-list", never, { "hardcodedRoute": { "alias": "hardcodedRoute"; "required": false; }; "parentRecord": { "alias": "parentRecord"; "required": false; }; "parentMetaInfo": { "alias": "parentMetaInfo"; "required": false; }; "datasource": { "alias": "datasource"; "required": false; }; "hardcodedDatasource": { "alias": "hardcodedDatasource"; "required": false; }; "hideToolbar": { "alias": "hideToolbar"; "required": false; }; }, { "onMapClick": "onMapClick"; "onMarkerDragStart": "onMarkerDragStart"; "onMarkerDragEnd": "onMarkerDragEnd"; "onMarkerClick": "onMarkerClick"; "onPolygonClick": "onPolygonClick"; "onPolygonShapeChangedEvent": "onPolygonShapeChangedEvent"; "onMapDataBound": "onMapDataBound"; "onMapBoundsChanged": "onMapBoundsChanged"; "onMapCenterChanged": "onMapCenterChanged"; "onMapContextMenu": "onMapContextMenu"; "onMapDrag": "onMapDrag"; "onMapDragEnd": "onMapDragEnd"; "onMapDragStart": "onMapDragStart"; "onMapMouseMove": "onMapMouseMove"; "onMapMouseOut": "onMapMouseOut"; "onMapMouseOver": "onMapMouseOver"; "onMapResize": "onMapResize"; "onMapZoomChanged": "onMapZoomChanged"; }, never, never, true, never>;
|
|
7746
8175
|
}
|
|
7747
8176
|
|
|
7748
|
-
declare class CarouselListComponent implements IBindable, IDesigner<CarouselOptions>, AfterViewInit, OnDestroy, IDataBoundHostComponent {
|
|
8177
|
+
declare class CarouselListComponent implements IBindable, IDesigner<CarouselOptions>, OnInit, AfterViewInit, OnDestroy, IDataBoundHostComponent {
|
|
7749
8178
|
private titleService;
|
|
7750
8179
|
private cd;
|
|
7751
8180
|
private route;
|
|
@@ -8002,7 +8431,7 @@ declare class LazySpreadsheetListSfComponent implements OnInit {
|
|
|
8002
8431
|
static ɵcmp: i0.ɵɵComponentDeclaration<LazySpreadsheetListSfComponent, "wuic-spreadsheet-list-sf-lazy", never, { "hardcodedRoute": { "alias": "hardcodedRoute"; "required": false; }; "parentRecord": { "alias": "parentRecord"; "required": false; }; "parentMetaInfo": { "alias": "parentMetaInfo"; "required": false; }; "datasource": { "alias": "datasource"; "required": false; }; "hardcodedDatasource": { "alias": "hardcodedDatasource"; "required": false; }; "hideToolbar": { "alias": "hideToolbar"; "required": false; }; }, {}, never, never, true, never>;
|
|
8003
8432
|
}
|
|
8004
8433
|
|
|
8005
|
-
declare class TreeListComponent implements OnDestroy, IDataBoundHostComponent {
|
|
8434
|
+
declare class TreeListComponent implements OnInit, OnDestroy, IDataBoundHostComponent {
|
|
8006
8435
|
private titleService;
|
|
8007
8436
|
private dataSrv;
|
|
8008
8437
|
private cd;
|
|
@@ -8146,8 +8575,12 @@ declare class TreeListComponent implements OnDestroy, IDataBoundHostComponent {
|
|
|
8146
8575
|
constructor(titleService: Title, dataSrv: DataProviderService, cd: ChangeDetectorRef, trslSrv: TranslationManagerService);
|
|
8147
8576
|
/**
|
|
8148
8577
|
* Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
|
|
8578
|
+
*
|
|
8579
|
+
* Fire-and-forget: Angular `OnInit.ngOnInit` deve ritornare void; deleghiamo
|
|
8580
|
+
* la logica async a `initAsync()` per evitare Promise floating tipizzata void.
|
|
8149
8581
|
*/
|
|
8150
|
-
ngOnInit():
|
|
8582
|
+
ngOnInit(): void;
|
|
8583
|
+
private initAsync;
|
|
8151
8584
|
/**
|
|
8152
8585
|
* Gestisce la logica di `subscribeToDS` con regole guidate dai metadati server `_Metadati_*` (tabella/colonna), gestendo esplicitamente il ciclo di vita delle subscription RxJS, preparando/aggiornando il dataset visualizzato.
|
|
8153
8586
|
*/
|
|
@@ -8209,7 +8642,7 @@ declare class TreeListComponent implements OnDestroy, IDataBoundHostComponent {
|
|
|
8209
8642
|
static ɵcmp: i0.ɵɵComponentDeclaration<TreeListComponent, "wuic-tree-list", never, { "hardcodedRoute": { "alias": "hardcodedRoute"; "required": false; }; "parentRecord": { "alias": "parentRecord"; "required": false; }; "parentMetaInfo": { "alias": "parentMetaInfo"; "required": false; }; "datasource": { "alias": "datasource"; "required": false; }; "hardcodedDatasource": { "alias": "hardcodedDatasource"; "required": false; }; "hideToolbar": { "alias": "hideToolbar"; "required": false; }; }, { "onTreeDataBound": "onTreeDataBound"; "onTreeNodeExpand": "onTreeNodeExpand"; "onTreeNodeExpanded": "onTreeNodeExpanded"; "onTreeNodeSelect": "onTreeNodeSelect"; "onTreeNodeUnselect": "onTreeNodeUnselect"; "onTreeNodeCollapse": "onTreeNodeCollapse"; }, never, never, true, never>;
|
|
8210
8643
|
}
|
|
8211
8644
|
|
|
8212
|
-
declare class ParametricDialogComponent implements OnDestroy, IDataBoundHostComponent {
|
|
8645
|
+
declare class ParametricDialogComponent implements OnInit, AfterViewInit, OnDestroy, IDataBoundHostComponent {
|
|
8213
8646
|
ref: DynamicDialogRef | null;
|
|
8214
8647
|
config: DynamicDialogConfig | null;
|
|
8215
8648
|
private route;
|
|
@@ -8709,6 +9142,18 @@ declare class AppSettingsEditorComponent implements OnInit {
|
|
|
8709
9142
|
private pristine;
|
|
8710
9143
|
current: Map<string, any>;
|
|
8711
9144
|
readonly activeTabValue: i0.WritableSignal<number>;
|
|
9145
|
+
/**
|
|
9146
|
+
* Chiave localStorage per persistere il tab corrente. Salvato per `name`
|
|
9147
|
+
* (stable identifier della sezione, non per index che puo' cambiare se
|
|
9148
|
+
* vengono aggiunte/rimosse sezioni). Letto in `loadSchema` per ripristinare
|
|
9149
|
+
* il tab dopo refresh / restart-driven reload.
|
|
9150
|
+
*/
|
|
9151
|
+
private static readonly ACTIVE_TAB_LS_KEY;
|
|
9152
|
+
/**
|
|
9153
|
+
* Wire-up dal template: persiste il tab corrente su localStorage ad
|
|
9154
|
+
* ogni cambio. Salva il `name` della sezione (stabile cross-reload).
|
|
9155
|
+
*/
|
|
9156
|
+
onTabChange(newIndex: number): void;
|
|
8712
9157
|
readonly pendingChanges: i0.Signal<SaveChange[]>;
|
|
8713
9158
|
readonly hasPendingChanges: i0.Signal<boolean>;
|
|
8714
9159
|
readonly pendingChangesCount: i0.Signal<number>;
|
|
@@ -8777,6 +9222,52 @@ declare class AppSettingsEditorComponent implements OnInit {
|
|
|
8777
9222
|
onReload(): Promise<void>;
|
|
8778
9223
|
private confirmDiscardChanges;
|
|
8779
9224
|
private sleep;
|
|
9225
|
+
/**
|
|
9226
|
+
* Restart-completion poll con flow a 4 fasi (algoritmo concordato):
|
|
9227
|
+
*
|
|
9228
|
+
* 1) Phase A — poll Health finche' fallisce. Quando il save di un setting
|
|
9229
|
+
* con impact `restart` ritorna, il vecchio worker e' ancora vivo per
|
|
9230
|
+
* ~800ms-5s prima dello StopApplication. Se non aspettiamo che muoia
|
|
9231
|
+
* davvero, qualunque "200 OK" iniziale e' un FALSE POSITIVE — il vecchio
|
|
9232
|
+
* worker risponde, dismissa il dialog, l'utente naviga e si schianta.
|
|
9233
|
+
*
|
|
9234
|
+
* 2) Phase B — wait `postDownGraceMs` (default 10s) DOPO la prima failure.
|
|
9235
|
+
* Margine per dotnet-watch di completare lo shutdown e arrivare in
|
|
9236
|
+
* "Waiting for changes" idle state.
|
|
9237
|
+
*
|
|
9238
|
+
* 3) Phase C — chiama `/api/__dev__/bump-watch-trigger` (Angular dev-server
|
|
9239
|
+
* proxy bypass middleware in `proxy.conf.js`). Il middleware riscrive
|
|
9240
|
+
* `HotReloadTrigger.cs` con un nome metodo unico → rude edit → dotnet-watch
|
|
9241
|
+
* fa rebuild + restart del worker. In IIS/ANCM o dotnet run puro l'endpoint
|
|
9242
|
+
* non esiste, la chiamata fallisce silente, ANCM/NSSM ricicla per conto suo.
|
|
9243
|
+
*
|
|
9244
|
+
* 4) Phase D — poll Health finche' un nuovo response 200 arriva: nuovo worker up.
|
|
9245
|
+
*
|
|
9246
|
+
* @param maxWaitMs budget totale in ms (default 90s).
|
|
9247
|
+
* @param postDownGraceMs grace post-down (default 10s).
|
|
9248
|
+
* @returns true se il restart e' stato completato, false su timeout.
|
|
9249
|
+
*/
|
|
9250
|
+
private waitForRestart;
|
|
9251
|
+
/**
|
|
9252
|
+
* [PROD path] Polling semplice usato sotto IIS/ANCM/NSSM dove il
|
|
9253
|
+
* supervisor ricicla il worker autonomamente in pochi secondi.
|
|
9254
|
+
* Comportamento identico alla versione legacy: polla finche' Health
|
|
9255
|
+
* risponde 200, senza fasi di pre-attesa o trigger esterni.
|
|
9256
|
+
*
|
|
9257
|
+
* Nota: c'e' un piccolo rischio di falso positivo nel primo ping se il
|
|
9258
|
+
* vecchio worker non e' ancora morto (~1-2s di sovrapposizione), ma sotto
|
|
9259
|
+
* ANCM/NSSM la finestra e' molto stretta e il caller (`saveAndApply`)
|
|
9260
|
+
* gia' fa un `sleep(Math.max(800, restartDelayMs+200))` prima di chiamare
|
|
9261
|
+
* questo metodo, coprendo il caso normale.
|
|
9262
|
+
*/
|
|
9263
|
+
private waitForHealthSimple;
|
|
9264
|
+
/**
|
|
9265
|
+
* Wrapper legacy mantenuto per back-compat: alias di
|
|
9266
|
+
* `waitForHealthSimple`. Eventuali consumer storici che chiamavano
|
|
9267
|
+
* `waitForHealth(ms)` continuano a vedere il polling semplice (non il
|
|
9268
|
+
* 4-phase) — coerente con ambienti prod dove il supervisor gestisce
|
|
9269
|
+
* il restart.
|
|
9270
|
+
*/
|
|
8780
9271
|
private waitForHealth;
|
|
8781
9272
|
private forceLogout;
|
|
8782
9273
|
static ɵfac: i0.ɵɵFactoryDeclaration<AppSettingsEditorComponent, never>;
|
|
@@ -8987,6 +9478,19 @@ interface LicenseStatusResponse {
|
|
|
8987
9478
|
maintenanceExpiryUtc?: string | null;
|
|
8988
9479
|
tier?: string;
|
|
8989
9480
|
features?: string[];
|
|
9481
|
+
/**
|
|
9482
|
+
* DBMS utilizzato dal backend per il **DB DATI** (`AppSettings.dbms`):
|
|
9483
|
+
* `'mssql'` o `'mysql'`. Aggiunto 2026-04-28 per il tooltip license del
|
|
9484
|
+
* meta-menu — sysadmin vede a colpo d'occhio su quale provider gira il
|
|
9485
|
+
* deploy.
|
|
9486
|
+
*/
|
|
9487
|
+
dataDbms?: string;
|
|
9488
|
+
/**
|
|
9489
|
+
* DBMS utilizzato dal backend per il **DB METADATI** (`AppSettings.meta-dbms`).
|
|
9490
|
+
* Tipicamente uguale a `dataDbms` ma puo' divergere quando
|
|
9491
|
+
* `allowMultipleDBMS=true` (es. data MySQL + metadata MSSQL).
|
|
9492
|
+
*/
|
|
9493
|
+
metaDbms?: string;
|
|
8990
9494
|
}
|
|
8991
9495
|
/**
|
|
8992
9496
|
* Client-side view of the current license. Exposes synchronous `has(feature)`
|
|
@@ -9235,6 +9739,11 @@ declare class AuthSessionService {
|
|
|
9235
9739
|
*/
|
|
9236
9740
|
setSessionTimeout(minutes: number, warningMinutes?: number): void;
|
|
9237
9741
|
private activityListenersAttached;
|
|
9742
|
+
/** Timestamp dell'ultimo reset throttled, in ms epoch. */
|
|
9743
|
+
private lastActivityResetAt;
|
|
9744
|
+
/** Min intervallo tra reset throttled (mousemove/scroll). 1s e' un buon compromesso
|
|
9745
|
+
* tra responsiveness al "vero" idle e overhead da event flood. */
|
|
9746
|
+
private static readonly ACTIVITY_RESET_THROTTLE_MS;
|
|
9238
9747
|
private setupActivityListeners;
|
|
9239
9748
|
/**
|
|
9240
9749
|
* Avvia/riavvia i timer di sessione. Chiamato dopo login e ad ogni attività HTTP.
|
|
@@ -9410,6 +9919,7 @@ declare class MetaMenuComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
|
9410
9919
|
*/
|
|
9411
9920
|
private runtimeMenuSub?;
|
|
9412
9921
|
private authStateSub?;
|
|
9922
|
+
private authConfigRefreshHandler;
|
|
9413
9923
|
/**
|
|
9414
9924
|
* Proprieta di stato del componente per menu updated sub, usata dalla logica interna e dal template.
|
|
9415
9925
|
*/
|
|
@@ -9639,7 +10149,18 @@ declare class MetaMenuComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
|
9639
10149
|
* sincronizza permessi/menu e applica l'eventuale redirect richiesto via query/hash.
|
|
9640
10150
|
*/
|
|
9641
10151
|
loginLegacy(): Promise<void>;
|
|
9642
|
-
|
|
10152
|
+
/**
|
|
10153
|
+
* Re-carica la AuthConfig dal backend. Chiamato in `ngOnInit` al boot e
|
|
10154
|
+
* (via global event `wuic:auth-config-refresh`) dopo il restart del
|
|
10155
|
+
* backend per applicare immediatamente nuovi `sessionTimeoutMinutes`,
|
|
10156
|
+
* `notifySessionExpirationBefore`, `enableUserLanguageSwitch` e altri
|
|
10157
|
+
* setting hot-reload-relevant senza richiedere page reload.
|
|
10158
|
+
*
|
|
10159
|
+
* Esposto come `public` cosi' altri componenti (es. app-settings-editor
|
|
10160
|
+
* post-save) possono triggerarlo direttamente quando hanno il riferimento
|
|
10161
|
+
* al meta-menu, oppure dispatcciare l'evento globale.
|
|
10162
|
+
*/
|
|
10163
|
+
loadAuthConfig(): Promise<void>;
|
|
9643
10164
|
onDocumentClick(): void;
|
|
9644
10165
|
toggleUserLanguageMenu(event?: Event): void;
|
|
9645
10166
|
isCurrentUserLanguage(langId: string): boolean;
|
|
@@ -10120,7 +10641,7 @@ declare class NumberEditorComponent implements IFieldEditor, AfterViewInit {
|
|
|
10120
10641
|
static ɵcmp: i0.ɵɵComponentDeclaration<NumberEditorComponent, "wuic-number-editor", never, { "record": { "alias": "record"; "required": false; }; "field": { "alias": "field"; "required": false; }; "metaInfo": { "alias": "metaInfo"; "required": false; }; "isFilter": { "alias": "isFilter"; "required": false; }; "nestedIndex": { "alias": "nestedIndex"; "required": false; }; "triggerProp": { "alias": "triggerProp"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; }, {}, never, never, true, never>;
|
|
10121
10642
|
}
|
|
10122
10643
|
|
|
10123
|
-
declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, AfterViewChecked,
|
|
10644
|
+
declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, AfterViewChecked, OnChanges, OnDestroy {
|
|
10124
10645
|
private trslSrv;
|
|
10125
10646
|
private cd;
|
|
10126
10647
|
private hostElementRef;
|
|
@@ -10167,6 +10688,14 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
|
|
|
10167
10688
|
* Riferimento a elementi o componenti figli usato dalla logica UI per nested source.
|
|
10168
10689
|
*/
|
|
10169
10690
|
nestedSource: DataSourceComponent;
|
|
10691
|
+
/**
|
|
10692
|
+
* Riferimento al p-autoComplete PrimeNG, usato per re-triggerare l'apertura
|
|
10693
|
+
* della dropdown dopo che il layout di focus-expand inline-cell-editing ha
|
|
10694
|
+
* riposizionato l'input (cell -> 360px). Senza re-show, la prima onDropdownClick
|
|
10695
|
+
* calcola la posizione overlay sulla larghezza vecchia e l'overlay puo' restare
|
|
10696
|
+
* chiuso o ancorato male.
|
|
10697
|
+
*/
|
|
10698
|
+
autoCompleteRef: AutoComplete;
|
|
10170
10699
|
/**
|
|
10171
10700
|
* Collezione dati per items, consumata dal rendering e dalle operazioni del componente.
|
|
10172
10701
|
*/
|
|
@@ -10194,11 +10723,8 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
|
|
|
10194
10723
|
* @param hostElementRef Parametro in ingresso utilizzato per determinare il flusso operativo del metodo.
|
|
10195
10724
|
*/
|
|
10196
10725
|
constructor(trslSrv: TranslationManagerService, cd: ChangeDetectorRef, hostElementRef: ElementRef<HTMLElement>);
|
|
10197
|
-
/**
|
|
10198
|
-
* Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
|
|
10199
|
-
*/
|
|
10200
|
-
ngOnInit(): void;
|
|
10201
10726
|
ngOnChanges(_changes: SimpleChanges): void;
|
|
10727
|
+
ngOnDestroy(): void;
|
|
10202
10728
|
/**
|
|
10203
10729
|
* Legge `mc_props_bag.lookup.virtualize` e determina se abilitare il virtual scroll del p-autocomplete.
|
|
10204
10730
|
* Supporta boolean/number/string oppure object con `enabled`.
|
|
@@ -10213,6 +10739,52 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
|
|
|
10213
10739
|
* Completa inizializzazione dopo il rendering della view e collega riferimenti UI.
|
|
10214
10740
|
*/
|
|
10215
10741
|
ngAfterViewInit(): void;
|
|
10742
|
+
/**
|
|
10743
|
+
* Subscribe a `record[mc_nome_colonna]` BehaviorSubject: quando un FK viene
|
|
10744
|
+
* settato programmaticamente (es. importazione documento sorgente, CAI
|
|
10745
|
+
* setRecordValue, custom callback) e il valore NON e' presente in `items`
|
|
10746
|
+
* — perche' la prima fetch e' avvenuta prima che il setRecordValue propagasse,
|
|
10747
|
+
* o il valore e' fuori dalla pagina corrente del combo — avviare una
|
|
10748
|
+
* second-stage fetch filtrata sul valore per recuperare il record correlato e
|
|
10749
|
+
* popolare `__lookup_obj` (cosi' il dropdown mostra il display text).
|
|
10750
|
+
*
|
|
10751
|
+
* Skip cases:
|
|
10752
|
+
* - lookupByID multi-value (isFilter operatore=eqor, multiple_check)
|
|
10753
|
+
* - prima emit del BS (init flow gia' coperto sopra)
|
|
10754
|
+
* - valore null/undefined (utente ha clearato)
|
|
10755
|
+
* - valore gia' nei items
|
|
10756
|
+
* - hasActiveLookupQuery true (utente sta typing una query manuale)
|
|
10757
|
+
*/
|
|
10758
|
+
private installProgrammaticValueAutoFetch;
|
|
10759
|
+
/**
|
|
10760
|
+
* Workaround per inline-cell-editing + focus-expand:
|
|
10761
|
+
*
|
|
10762
|
+
* Quando la lookup vive dentro una <wuic-list-grid> con `md_inline_cell_editing=1`,
|
|
10763
|
+
* il primo click sul chevron (button.p-autocomplete-dropdown) genera questa sequenza:
|
|
10764
|
+
* 1. mousedown sul chevron alla posizione X
|
|
10765
|
+
* 2. PrimeNG sposta il focus sull'input
|
|
10766
|
+
* 3. il selector CSS `:focus-within` sul TD espande l'input da cell-width a 360px
|
|
10767
|
+
* 4. il chevron, che e' inline-flex accanto all'input, si sposta verso destra
|
|
10768
|
+
* 5. mouseup avviene alla posizione X originale, che ora e' DENTRO l'input
|
|
10769
|
+
* espanso (non piu' sul chevron)
|
|
10770
|
+
* 6. il browser NON emette `click` perche' mouseup-target != mousedown-target
|
|
10771
|
+
* 7. di conseguenza ne il PrimeNG handler interno ne il nostro
|
|
10772
|
+
* `(onDropdownClick)` ricevono mai l'evento -> overlay mai aperto
|
|
10773
|
+
*
|
|
10774
|
+
* Soluzione: ascoltare `mousedown` sul chevron (che PARTE prima di qualunque
|
|
10775
|
+
* reflow e si triggera regolarmente) e schedulare `show()` con un delay che
|
|
10776
|
+
* lascia stabilizzare il focus-expand. Cosi' l'overlay si aggancia al chevron
|
|
10777
|
+
* nella sua posizione finale, esattamente come ci si aspetta.
|
|
10778
|
+
*/
|
|
10779
|
+
/**
|
|
10780
|
+
* Handler delegato dal template (`<p-autoComplete (mousedown)="onLookupHostMousedown($event)">`).
|
|
10781
|
+
* Si triggera al mousedown su qualunque punto dell'autoComplete, e in particolare
|
|
10782
|
+
* cattura il mousedown sul chevron PRIMA del reflow del focus-expand.
|
|
10783
|
+
*
|
|
10784
|
+
* Solo dentro inline-cell-editing: in normale edit form il click funziona gia'
|
|
10785
|
+
* nativamente (nessun focus-expand che muove il chevron) e qui ritorniamo NOOP.
|
|
10786
|
+
*/
|
|
10787
|
+
onLookupHostMousedown(event: MouseEvent): void;
|
|
10216
10788
|
ngAfterViewChecked(): void;
|
|
10217
10789
|
private applyAriaLabelledByToInput;
|
|
10218
10790
|
/**
|
|
@@ -10243,11 +10815,27 @@ declare class LookupEditorComponent implements IFieldEditor, AfterViewInit, Afte
|
|
|
10243
10815
|
private restoreLookupInputFocusIfNeeded;
|
|
10244
10816
|
onLookupOverlayShow(): void;
|
|
10245
10817
|
onLookupOverlayHide(): void;
|
|
10818
|
+
/**
|
|
10819
|
+
* Re-triggera l'apertura della dropdown dopo un breve delay.
|
|
10820
|
+
*
|
|
10821
|
+
* Use case: quando la lookup vive dentro una <wuic-list-grid> con
|
|
10822
|
+
* `md_inline_cell_editing=1`, il click sul chevron mette il focus sull'input
|
|
10823
|
+
* e attiva la regola CSS `:focus-within` che espande l'input da cell-width a
|
|
10824
|
+
* 360px (Excel-like). PrimeNG calcola la posizione dell'overlay e fa il
|
|
10825
|
+
* primo `show()` PRIMA che il reflow CSS sia stato applicato, quindi
|
|
10826
|
+
* l'overlay puo' risultare chiuso, mal posizionato o riagganciato a
|
|
10827
|
+
* un'ancora di larghezza vecchia.
|
|
10828
|
+
*
|
|
10829
|
+
* Il delay di 120ms lascia che il reflow del focus-expand si stabilizzi,
|
|
10830
|
+
* poi forziamo un secondo `show()` che ricalcola posizione/larghezza
|
|
10831
|
+
* coerenti con l'input gia' espanso.
|
|
10832
|
+
*/
|
|
10833
|
+
onDropdownClickHandler(_event: any): void;
|
|
10246
10834
|
static ɵfac: i0.ɵɵFactoryDeclaration<LookupEditorComponent, never>;
|
|
10247
10835
|
static ɵcmp: i0.ɵɵComponentDeclaration<LookupEditorComponent, "wuic-lookup-editor", never, { "record": { "alias": "record"; "required": false; }; "field": { "alias": "field"; "required": false; }; "metaInfo": { "alias": "metaInfo"; "required": false; }; "isFilter": { "alias": "isFilter"; "required": false; }; "nestedIndex": { "alias": "nestedIndex"; "required": false; }; "triggerProp": { "alias": "triggerProp"; "required": false; }; "readOnly": { "alias": "readOnly"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; }; }, {}, never, never, true, never>;
|
|
10248
10836
|
}
|
|
10249
10837
|
|
|
10250
|
-
declare class DictionaryEditorComponent implements OnInit, OnChanges, AfterViewChecked, OnDestroy {
|
|
10838
|
+
declare class DictionaryEditorComponent implements OnInit, OnChanges, AfterViewChecked, AfterViewInit, OnDestroy {
|
|
10251
10839
|
private trnSrv;
|
|
10252
10840
|
private hostElementRef;
|
|
10253
10841
|
/**
|
|
@@ -10688,10 +11276,6 @@ declare class ButtonEditorComponent {
|
|
|
10688
11276
|
*/
|
|
10689
11277
|
constructor(confirmationService: ConfirmationService, trn: TranslateService, wtoolbox: WtoolboxService);
|
|
10690
11278
|
/**
|
|
10691
|
-
* Completa inizializzazione dopo il rendering della view e collega riferimenti UI.
|
|
10692
|
-
*/
|
|
10693
|
-
ngAfterViewInit(): void;
|
|
10694
|
-
/**
|
|
10695
11279
|
* Valuta una condizione tramite `isButtonVisible` con il flusso specifico definito dalla sua implementazione.
|
|
10696
11280
|
* @returns Esito booleano calcolato dal metodo.
|
|
10697
11281
|
*/
|
|
@@ -10841,6 +11425,23 @@ declare class FieldEditorComponent implements OnInit, OnChanges, OnDestroy, DoCh
|
|
|
10841
11425
|
* @returns Valore calcolato dinamicamente a partire dallo stato corrente del componente.
|
|
10842
11426
|
*/
|
|
10843
11427
|
get classes(): string | null;
|
|
11428
|
+
/**
|
|
11429
|
+
* True quando il field-editor e' renderizzato dentro una cella di una
|
|
11430
|
+
* list-grid in `md_inline_cell_editing` mode. In quel contesto la
|
|
11431
|
+
* larghezza della cella e' governata dalla colonna del p-table (e da
|
|
11432
|
+
* `mc_ui_grid_size_width`), non dalla form-default `mc_ui_size_width`
|
|
11433
|
+
* — applicare 300px sull'editor o sul span readonly inflerebbe le
|
|
11434
|
+
* colonne. Il caller (list-grid row template) NON passa un input
|
|
11435
|
+
* dedicato: identifichiamo l'inline mode dal flag tableMetadata.
|
|
11436
|
+
*/
|
|
11437
|
+
get isInlineCellHost(): boolean;
|
|
11438
|
+
/**
|
|
11439
|
+
* Width da applicare all'editor / span readonly. In inline cell host
|
|
11440
|
+
* usa `100%` (la cella ha gia' la sua larghezza dalla colonna). Fuori
|
|
11441
|
+
* inline-grid (form/dialog) usa la logica storica:
|
|
11442
|
+
* `mc_ui_size_width || widgetMap[type].width || undefined`.
|
|
11443
|
+
*/
|
|
11444
|
+
get widgetWidth(): string | undefined;
|
|
10844
11445
|
private syncDomAttrs;
|
|
10845
11446
|
/**
|
|
10846
11447
|
* function Object() { [native code] }
|
|
@@ -10861,6 +11462,16 @@ declare class FieldEditorComponent implements OnInit, OnChanges, OnDestroy, DoCh
|
|
|
10861
11462
|
*/
|
|
10862
11463
|
ngOnChanges(_changes: SimpleChanges): void;
|
|
10863
11464
|
ngOnDestroy(): void;
|
|
11465
|
+
/**
|
|
11466
|
+
* Valore formattato per il readonly span (template: `{{readonlySpanValue}}`).
|
|
11467
|
+
* Aggiornato reattivamente in setupReadonlySpanBinding subscribendo alla
|
|
11468
|
+
* BehaviorSubject del campo: quando un setRecordValue programmatico (es.
|
|
11469
|
+
* default async di sp_next_progressivo) chiama BS.next, lo span si
|
|
11470
|
+
* aggiorna senza dover rendere `formatGridViewValue` impure.
|
|
11471
|
+
*/
|
|
11472
|
+
readonlySpanValue: unknown;
|
|
11473
|
+
private readonlySpanSub?;
|
|
11474
|
+
private setupReadonlySpanBinding;
|
|
10864
11475
|
/**
|
|
10865
11476
|
* Rileva mutazioni in-place del tipo widget (es. da text a dictionary nel designer)
|
|
10866
11477
|
* e riallinea il componente editor visualizzato.
|
|
@@ -13645,8 +14256,18 @@ declare class WuicErrorDialogComponent implements OnInit, OnDestroy {
|
|
|
13645
14256
|
private cdr;
|
|
13646
14257
|
visible: boolean;
|
|
13647
14258
|
currentException: CustomException | null;
|
|
14259
|
+
/**
|
|
14260
|
+
* Set di firme errori che l'utente ha gia' chiuso esplicitamente in
|
|
14261
|
+
* questa sessione (dismissedSignatures). Il dialog NON si riapre per
|
|
14262
|
+
* eventi successivi con stessa firma -> evita il loop "fetch fallisce
|
|
14263
|
+
* -> dialog si riapre" che impedisce all'utente di intervenire sulla
|
|
14264
|
+
* pagina sotto (es. aprire metadata-editor per riparare la causa).
|
|
14265
|
+
* Firma = `<traceId>` se presente, altrimenti `<title>::<body>`.
|
|
14266
|
+
*/
|
|
14267
|
+
private dismissedSignatures;
|
|
13648
14268
|
private sub?;
|
|
13649
14269
|
constructor(cdr: ChangeDetectorRef);
|
|
14270
|
+
private signatureOf;
|
|
13650
14271
|
ngOnInit(): void;
|
|
13651
14272
|
ngOnDestroy(): void;
|
|
13652
14273
|
formatParameters(params: Record<string, unknown> | undefined | null): string;
|
|
@@ -13790,4 +14411,4 @@ declare function getThemeOptions(): ThemeOption[];
|
|
|
13790
14411
|
declare function getThemePrimaryHex(value: string): string;
|
|
13791
14412
|
|
|
13792
14413
|
export { AUTH_REDIRECT_REASON_KEY, AppSettingsEditorComponent, AuthSessionService, BooleanEditorComponent, BoundedRepeaterComponent, ButtonEditorComponent, CallbackPipe, CallbackPipe2, CarouselListComponent, CodeAreaEditorComponent, ColorEditorComponent, CrashReporterService, CustomException, DataActionButtonComponent, DataProviderOdataService, DataRepeaterComponent, DataSourceComponent, DateEditorComponent, DesignerRouteComponent, DictionaryEditorComponent, DynamicCompilerService, DynamicRowTemplateComponent, FieldEditorComponent, FilterBarComponent, FilterInfo, FormatGridViewValuePipe, GetSrcUploadPreviewPipe, GlobalHandler, HtmlEditorComponent, ImageWrapperComponent, ImportExportButtonComponent, IsSelectedRowPipe, KanbanListComponent, KanbanOptions, KanbanStatusColumnItem, LazyChartListComponent, LazyCodeEditorComponent, LazyDataActionButtonComponent, LazyDataSourceComponent, LazyFieldEditorComponent, LazyFirstRunWizardComponent, LazyImageWrapperComponent, LazyKanbanListComponent, LazyMetaMenuComponent, LazyPivotBuilderComponent, LazyReportDesignerComponent, LazyReportViewerComponent, LazySchedulerListComponent, LazySpreadsheetListSfComponent, LicenseFeatureService, ListGridComponent, LookupEditorComponent, MapListComponent, MetaInfo, MetaMenuComponent, MetadataEditorService, MetadataProviderService, MetadatiColonna, MetadatiTabella, NotificationBellComponent, NotificationRealtimeService, NumberEditorComponent, PRIMARY_PALETTES, PagerComponent, ParametricDialogComponent, PropertyArrayEditorComponent, PropertyObjectEditorComponent, THEME_OPTIONS, TextAreaEditorComponent, TextEditorComponent, TranslationManagerService, TreeListComponent, TreeViewSelectorComponent, UploadDialogComponent, UploadEditorComponent, UserInfoService, ValidationRule, ValueChangedPayload, VisibleFieldListPipe, WidgetDefinition, WorkflowDesignerRouteComponent, WorkflowRunnerComponent, WorkflowRuntimeMetadataService, WtoolboxService, WuicErrorDialogComponent, WuicErrorInterceptor, WuicFeatureDirective, WuicFrozenColumnDirective, WuicRagChatbotComponent, WuicRagChatbotFabComponent, WuicRagService, WuicRowTogglerDirective, _PRIMENG_TABLE_DIRECTIVES_NAMES, authExpiredInterceptor, boundedRepeaterPendingChangesGuard, featureRouteCanActivateGuard, featureRouteCanMatchGuard, getThemeOptions, getThemePrimaryHex, inferTemplateFieldFromBaseClass, loadBooleanEditorComponent, loadButtonEditorComponent, loadCodeAreaEditorComponent, loadColorEditorComponent, loadDateEditorComponent, loadDictionaryEditorComponent, loadHtmlEditorComponent, loadLookupEditorComponent, loadNumberEditorComponent, loadPropertyArrayEditorComponent, loadPropertyObjectEditorComponent, loadTextAreaEditorComponent, loadTextEditorComponent, loadTreeViewSelectorComponent, loadUploadEditorComponent, menuRouteAccessCanActivateGuard, menuRouteAccessCanMatchGuard, routes, wuicErrorInterceptor };
|
|
13793
|
-
export type { AuthSessionState, Breadcrumb, CompileDynamicComponentOptions, CrashReportPayload, CrashReportingConfig, DataSourceAfterSyncEvent, DataSourceBeforeSyncEvent, DataSourceSyncOperation, IDataBoundHostComponent, IFieldEditor, KanbanStatusColumn, LicenseStatusResponse, ListGridAfterRenderEvent, ListGridAfterRowRenderEvent, ListGridBeforeRowRenderEvent, MultiDatasourceMeta, NotificationItem, RagAskAcceptedResponse, RagAskRequest, RagChatHistorySnapshot, RagChatMessageDto, RagChatMessageStatus, RagChatRequest, RagChatResponse, RagChatSessionDto, RagChatTurn, RagChatbotTurn, RagHealthResponse, RagQueryRequest, RagQueryResponse, RagSource, RealtimeProgressEvent, ThemeOption, ThemePresetName, ThemePrimaryName, WorkflowRuntimeLinkedActionRouteMetadataEntry, WorkflowRuntimePreviousRouteNodeEntry, WorkflowRuntimeRouteMetadataEntry, WorkflowRuntimeRouteNodePayloadEntry };
|
|
14414
|
+
export type { AuthSessionState, Breadcrumb, CompileDynamicComponentOptions, CrashReportPayload, CrashReportingConfig, DataSourceAfterSyncEvent, DataSourceBeforeSyncEvent, DataSourceSyncOperation, ErrorDelegate, ErrorDelegateContext, IDataBoundHostComponent, IFieldEditor, KanbanStatusColumn, LicenseStatusResponse, ListGridAfterRenderEvent, ListGridAfterRowRenderEvent, ListGridBeforeRowRenderEvent, MultiDatasourceMeta, NotificationItem, NotifyOptions, RagAskAcceptedResponse, RagAskRequest, RagChatHistorySnapshot, RagChatMessageDto, RagChatMessageStatus, RagChatRequest, RagChatResponse, RagChatSessionDto, RagChatTurn, RagChatbotTurn, RagHealthResponse, RagQueryRequest, RagQueryResponse, RagSource, RealtimeProgressEvent, ThemeOption, ThemePresetName, ThemePrimaryName, WorkflowRuntimeLinkedActionRouteMetadataEntry, WorkflowRuntimePreviousRouteNodeEntry, WorkflowRuntimeRouteMetadataEntry, WorkflowRuntimeRouteNodePayloadEntry };
|