wuic-framework-lib 1.5.0 → 1.7.0
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-0J1ghIrS.mjs → wuic-framework-lib-chart-list.component-Bl424n7x.mjs} +50 -38
- package/fesm2022/{wuic-framework-lib-code-editor.component-C21mvjyr.mjs → wuic-framework-lib-code-editor.component-N6HMl2mf.mjs} +174 -274
- package/fesm2022/{wuic-framework-lib-designer.component-x10ZzUEy.mjs → wuic-framework-lib-designer.component-Bd2fwl6H.mjs} +499 -581
- package/fesm2022/{wuic-framework-lib-first-run-wizard.component-BuSxs_CM.mjs → wuic-framework-lib-first-run-wizard.component-NN6cWVHL.mjs} +22 -24
- package/fesm2022/{wuic-framework-lib-framework-docs.component-xTGLbEnp.mjs → wuic-framework-lib-framework-docs.component-B867JAYe.mjs} +2912 -294
- package/fesm2022/{wuic-framework-lib-pivot-builder.component-BkFFjPm4.mjs → wuic-framework-lib-pivot-builder.component-DWukH0L-.mjs} +580 -68
- package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-Bi-TrJB6.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-DWO1Rcgv.mjs} +2 -2
- package/fesm2022/wuic-framework-lib-report-designer.component-QcrU81m6.mjs +380 -0
- package/fesm2022/wuic-framework-lib-report-scaffold-dialog.component-U-zdOoRV.mjs +431 -0
- package/fesm2022/{wuic-framework-lib-report-viewer.component-BR-BfI2r.mjs → wuic-framework-lib-report-viewer.component-B4LhA3SL.mjs} +8 -13
- package/fesm2022/{wuic-framework-lib-scene3d-designer.component-BQzFxSXP.mjs → wuic-framework-lib-scene3d-designer.component-DjOfzKLo.mjs} +323 -88
- package/fesm2022/{wuic-framework-lib-scene3d-light-baker-gpu-0LjqhSNn.mjs → wuic-framework-lib-scene3d-light-baker-gpu-C96T9uIW.mjs} +2 -2
- package/fesm2022/{wuic-framework-lib-scene3d-shader-effect-CQLWkuh1.mjs → wuic-framework-lib-scene3d-shader-effect-DjHyCAFK.mjs} +612 -32
- package/fesm2022/{wuic-framework-lib-scene3d-viewer.component-imoV3HOs.mjs → wuic-framework-lib-scene3d-viewer.component-Dboz1fjl.mjs} +149 -18
- package/fesm2022/{wuic-framework-lib-scheduler-list.component-xzlTEkoq.mjs → wuic-framework-lib-scheduler-list.component--wY21R3o.mjs} +169 -53
- package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-CrS6fOGj.mjs → wuic-framework-lib-spreadsheet-list-sf.component-Ek30J8v-.mjs} +149 -108
- package/fesm2022/{wuic-framework-lib-stimulsoft-license.service-BIyxB4pO.mjs → wuic-framework-lib-stimulsoft-license.service-CsNNSFYs.mjs} +3 -3
- package/fesm2022/wuic-framework-lib-timeline-list.component-aqCH4P0G.mjs +805 -0
- package/fesm2022/{wuic-framework-lib-workflow-designer.component-5xtQ7-6z.mjs → wuic-framework-lib-workflow-designer.component-DMM8BeXm.mjs} +180 -150
- package/fesm2022/{wuic-framework-lib-wuic-framework-lib-3TZ-j-yL.mjs → wuic-framework-lib-wuic-framework-lib-dfLTqam5.mjs} +6761 -2347
- package/fesm2022/wuic-framework-lib.mjs +1 -1
- package/package.json +4 -2
- package/styles/_wuic-tokens.scss +82 -0
- package/styles/styles.scss +160 -0
- package/types/wuic-framework-lib.d.ts +4264 -2691
- package/fesm2022/wuic-framework-lib-report-designer.component-ZvB46-LV.mjs +0 -194
|
@@ -3,17 +3,23 @@ import * as i0 from '@angular/core';
|
|
|
3
3
|
import { EventEmitter, HostListener, Output, Input, ViewChild, Component } from '@angular/core';
|
|
4
4
|
import * as i3 from '@fullcalendar/angular';
|
|
5
5
|
import { FullCalendarModule } from '@fullcalendar/angular';
|
|
6
|
+
import itLocale from '@fullcalendar/core/locales/it';
|
|
7
|
+
import frLocale from '@fullcalendar/core/locales/fr';
|
|
8
|
+
import esLocale from '@fullcalendar/core/locales/es';
|
|
9
|
+
import deLocale from '@fullcalendar/core/locales/de';
|
|
6
10
|
import dayGridPlugin from '@fullcalendar/daygrid';
|
|
7
11
|
import interactionPlugin from '@fullcalendar/interaction';
|
|
8
12
|
import timeGridPlugin from '@fullcalendar/timegrid';
|
|
9
13
|
import * as i1 from '@angular/platform-browser';
|
|
10
14
|
import { Title } from '@angular/platform-browser';
|
|
11
|
-
import {
|
|
15
|
+
import { W as WtoolboxService, f as ParametricDialogComponent, q as FilterInfo, s as FilterItem, M as MetadataProviderService, D as DynamicGenericTemplateComponent, T as TranslationManagerService } from './wuic-framework-lib-wuic-framework-lib-dfLTqam5.mjs';
|
|
12
16
|
import { BehaviorSubject } from 'rxjs';
|
|
13
17
|
|
|
14
|
-
// https://fullcalendar.io/docs/initialize-globals#premium-bundle -
|
|
18
|
+
// https://fullcalendar.io/docs/initialize-globals#premium-bundle -
|
|
15
19
|
// https://fullcalendar.io/docs/addResource-demo
|
|
16
20
|
// https://fullcalendar.io/docs/upgrading-from-v5#content-injection
|
|
21
|
+
/** Locale registrati sul calendario (en e' built-in nel core). */
|
|
22
|
+
const SCHEDULER_LOCALES = [itLocale, frLocale, esLocale, deLocale];
|
|
17
23
|
class SchedulerListComponent {
|
|
18
24
|
titleService;
|
|
19
25
|
cd;
|
|
@@ -110,6 +116,14 @@ class SchedulerListComponent {
|
|
|
110
116
|
* Flag di stato che governa il comportamento UI/logico relativo a loading.
|
|
111
117
|
*/
|
|
112
118
|
loading = false;
|
|
119
|
+
/**
|
|
120
|
+
* Ultimo intervallo emesso da `datesSet` di full-calendar e chiave dei campi
|
|
121
|
+
* from/to usati nell'ultimo filtro di range: servono a capire se la prima
|
|
122
|
+
* fetch e' partita con campi provvisori e va rifatta (vedi subscribeToDS).
|
|
123
|
+
*/
|
|
124
|
+
lastDatesSetInfo = null;
|
|
125
|
+
lastRangeFieldsKey = '';
|
|
126
|
+
rangeRefetchInFlight = false;
|
|
113
127
|
/**
|
|
114
128
|
* Proprieta di stato del componente per from field, usata dalla logica interna e dal template.
|
|
115
129
|
*/
|
|
@@ -146,6 +160,8 @@ class SchedulerListComponent {
|
|
|
146
160
|
* Proprieta di stato del componente per datasource sub, usata dalla logica interna e dal template.
|
|
147
161
|
*/
|
|
148
162
|
datasourceSub;
|
|
163
|
+
/** Subscription al cambio lingua: riallinea il locale del calendario. */
|
|
164
|
+
langChangeSub;
|
|
149
165
|
/**
|
|
150
166
|
* Inietta i servizi usati dal planner per titolo pagina, change detection e traduzioni.
|
|
151
167
|
* @param titleService Servizio Angular `Title`.
|
|
@@ -157,6 +173,35 @@ class SchedulerListComponent {
|
|
|
157
173
|
this.cd = cd;
|
|
158
174
|
this.trslSrv = trslSrv;
|
|
159
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* Codice locale per FullCalendar, derivato dalla lingua attiva.
|
|
178
|
+
* I locale registrati usano il codice a 2 lettere (`it`, `fr`, ...), mentre
|
|
179
|
+
* la lingua applicativa e' nel formato `it-IT`: prendiamo il prefisso.
|
|
180
|
+
*/
|
|
181
|
+
currentCalendarLocale() {
|
|
182
|
+
const lang = String(this.trslSrv?.getCurrentLang?.() || '').trim();
|
|
183
|
+
if (!lang) {
|
|
184
|
+
return 'en';
|
|
185
|
+
}
|
|
186
|
+
return lang.split('-')[0].toLowerCase();
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Applica al calendario gia' istanziato il locale della lingua attiva.
|
|
190
|
+
* Le `calendarOptions` sono lette da FullCalendar alla costruzione: al
|
|
191
|
+
* cambio lingua aggiorniamo l'opzione sull'API pubblica, cosi' header e
|
|
192
|
+
* bottoni si ridisegnano senza ricreare il componente.
|
|
193
|
+
*/
|
|
194
|
+
applyCalendarLocale() {
|
|
195
|
+
const locale = this.currentCalendarLocale();
|
|
196
|
+
if (this.calendarOptions) {
|
|
197
|
+
this.calendarOptions.locale = locale;
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
this.calendar?.getApi?.()?.setOption?.('locale', locale);
|
|
201
|
+
}
|
|
202
|
+
catch { /* calendario non ancora istanziato: bastera' calendarOptions */ }
|
|
203
|
+
this.cd?.detectChanges?.();
|
|
204
|
+
}
|
|
160
205
|
/**
|
|
161
206
|
* Completa inizializzazione dopo il rendering della view e collega riferimenti UI.
|
|
162
207
|
*/
|
|
@@ -165,6 +210,12 @@ class SchedulerListComponent {
|
|
|
165
210
|
let calOpts = {
|
|
166
211
|
initialView: 'dayGridMonth',
|
|
167
212
|
plugins: [dayGridPlugin, timeGridPlugin, interactionPlugin],
|
|
213
|
+
// Header (mesi, giorni, bottoni prev/next/today) nella lingua attiva:
|
|
214
|
+
// senza `locale` FullCalendar resta sull'inglese di default anche dopo
|
|
215
|
+
// il cambio lingua dell'app. `locales` va fornito perche' il bundle
|
|
216
|
+
// core include solo en — vedi schedulerLocales.
|
|
217
|
+
locale: this.currentCalendarLocale(),
|
|
218
|
+
locales: SCHEDULER_LOCALES,
|
|
168
219
|
headerToolbar: {
|
|
169
220
|
left: 'prev,next today',
|
|
170
221
|
center: 'title',
|
|
@@ -190,7 +241,7 @@ class SchedulerListComponent {
|
|
|
190
241
|
unselectAuto: true,
|
|
191
242
|
dateClick: function (info) {
|
|
192
243
|
self.onSchedulerDateClick.emit(info);
|
|
193
|
-
if (self.datasource
|
|
244
|
+
if (self.datasource?.value?.metaInfo?.tableMetadata.md_insertable) {
|
|
194
245
|
let header = self.trslSrv.instant('insert') + ' ' + self.metaInfo.tableMetadata.md_display_string;
|
|
195
246
|
const fromCol = self.getColumnMetadata(self.fromField);
|
|
196
247
|
const toCol = self.getColumnMetadata(self.toField);
|
|
@@ -265,12 +316,17 @@ class SchedulerListComponent {
|
|
|
265
316
|
dateInfo.end.setHours(23);
|
|
266
317
|
dateInfo.end.setMinutes(59);
|
|
267
318
|
dateInfo.end.setSeconds(59);
|
|
268
|
-
if (self.datasource
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
319
|
+
if (self.datasource?.value) {
|
|
320
|
+
// Memorizza l'intervallo: serve a subscribeToDS per rifare la fetch
|
|
321
|
+
// se i campi from/to arrivano solo DOPO (vedi resolveSchedulerFields).
|
|
322
|
+
self.lastDatesSetInfo = dateInfo;
|
|
323
|
+
// Risolvi from/to PRIMA di costruire il filtro: al primo render le
|
|
324
|
+
// proprieta' valgono ancora gli inizializzatori 'from'/'to'.
|
|
325
|
+
if (self.datasource.value.metaInfo) {
|
|
326
|
+
self.resolveSchedulerFields(self.datasource.value.metaInfo);
|
|
327
|
+
}
|
|
328
|
+
self.applyRangeFilter(dateInfo);
|
|
329
|
+
if (self.datasource?.value?.metaInfo && self.datasource.value.metaInfo.columnMetadata.length > 0) {
|
|
274
330
|
await self.datasource.value.fetchData();
|
|
275
331
|
}
|
|
276
332
|
}
|
|
@@ -288,11 +344,15 @@ class SchedulerListComponent {
|
|
|
288
344
|
// to `0` (view created) within the same CD cycle.
|
|
289
345
|
queueMicrotask(() => {
|
|
290
346
|
self.calendarOptions = calOpts; // error in prod
|
|
347
|
+
// Header/bottoni del calendario seguono la lingua attiva anche quando
|
|
348
|
+
// viene cambiata a calendario gia' montato.
|
|
349
|
+
self.langChangeSub?.unsubscribe?.();
|
|
350
|
+
self.langChangeSub = self.trslSrv?.onLangChange$?.subscribe(() => self.applyCalendarLocale());
|
|
291
351
|
if (this.hardcodedDatasource) {
|
|
292
352
|
this.datasource = new BehaviorSubject(this.hardcodedDatasource);
|
|
293
353
|
this.subscribeToDS();
|
|
294
354
|
}
|
|
295
|
-
else if (this.datasource
|
|
355
|
+
else if (this.datasource?.value) {
|
|
296
356
|
this.subscribeToDS();
|
|
297
357
|
}
|
|
298
358
|
else {
|
|
@@ -307,6 +367,76 @@ class SchedulerListComponent {
|
|
|
307
367
|
this.refreshCalendarView();
|
|
308
368
|
});
|
|
309
369
|
}
|
|
370
|
+
/**
|
|
371
|
+
* Risolve `fromField`/`toField`/`titleField` dai metadati della route:
|
|
372
|
+
* dalle opzioni archetype (`md_props_bag.archetypes.scheduler`) se presenti,
|
|
373
|
+
* altrimenti per auto-detect sulle colonne data/testo.
|
|
374
|
+
*
|
|
375
|
+
* Sta in un metodo a se' perche' va invocato in DUE momenti: qui da
|
|
376
|
+
* `subscribeToDS` (dopo ogni fetch) e da `datesSet` PRIMA di costruire il
|
|
377
|
+
* filtro di range. `datesSet` scatta al primo render del calendario ed e'
|
|
378
|
+
* lui a lanciare l'unica fetch iniziale: se i campi non fossero gia'
|
|
379
|
+
* risolti, il filtro userebbe gli inizializzatori 'from'/'to' — colonne che
|
|
380
|
+
* non esistono. Il backend scarta i filtri su colonne ignote e restituisce
|
|
381
|
+
* la PRIMA PAGINA non filtrata, quindi il calendario mostra 0 eventi per il
|
|
382
|
+
* mese corrente senza alcun errore visibile (e nessun refetch la corregge,
|
|
383
|
+
* perche' un nuovo `datesSet` arriva solo se l'utente naviga).
|
|
384
|
+
*
|
|
385
|
+
* @param metaInfo Metadati della route da cui leggere opzioni e colonne.
|
|
386
|
+
* @returns Le opzioni archetype scheduler se presenti, altrimenti undefined.
|
|
387
|
+
*/
|
|
388
|
+
resolveSchedulerFields(metaInfo) {
|
|
389
|
+
const schedOptions = metaInfo?.tableMetadata?.extraProps?.archetypes?.scheduler;
|
|
390
|
+
if (schedOptions) {
|
|
391
|
+
this.fromField = schedOptions.fromField;
|
|
392
|
+
this.toField = schedOptions.toField;
|
|
393
|
+
this.titleField = schedOptions.titleField;
|
|
394
|
+
return schedOptions;
|
|
395
|
+
}
|
|
396
|
+
const columnMetadata = metaInfo?.columnMetadata || [];
|
|
397
|
+
const dateFields = columnMetadata.filter(c => c.mc_ui_column_type == 'date' || c.mc_ui_column_type == 'datetime');
|
|
398
|
+
if (dateFields.length >= 2) {
|
|
399
|
+
const fromCandidates = dateFields.filter(c => c.mc_nome_colonna.toLowerCase().includes('from'));
|
|
400
|
+
const toCandidates = dateFields.filter(c => c.mc_nome_colonna.toLowerCase().includes('to'));
|
|
401
|
+
if (fromCandidates.length > 0 && toCandidates.length > 0) {
|
|
402
|
+
this.fromField = fromCandidates[0].mc_nome_colonna;
|
|
403
|
+
this.toField = toCandidates[0].mc_nome_colonna;
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
this.fromField = dateFields[0].mc_nome_colonna;
|
|
407
|
+
this.toField = dateFields[1].mc_nome_colonna;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
// Solo se l'auto-detect trova davvero qualcosa: al primo `datesSet` i
|
|
412
|
+
// columnMetadata possono non essere ancora popolati, e sovrascrivere i
|
|
413
|
+
// campi con `undefined` produrrebbe un filtro SENZA `field` (che il
|
|
414
|
+
// backend scarta esattamente come uno su colonna inesistente).
|
|
415
|
+
const single = columnMetadata.find(c => c.mc_ui_column_type == 'date' || c.mc_ui_column_type == 'datetime')?.mc_nome_colonna;
|
|
416
|
+
if (single) {
|
|
417
|
+
this.fromField = this.toField = single;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
const detectedTitle = columnMetadata.find(c => c.mc_ui_column_type == 'text' || c.mc_ui_column_type == 'txt_area')?.mc_nome_colonna;
|
|
421
|
+
if (detectedTitle) {
|
|
422
|
+
this.titleField = detectedTitle;
|
|
423
|
+
}
|
|
424
|
+
return undefined;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Costruisce il filtro di range sul datasource per l'intervallo visualizzato
|
|
428
|
+
* dal calendario, usando i campi from/to correnti.
|
|
429
|
+
*/
|
|
430
|
+
applyRangeFilter(dateInfo) {
|
|
431
|
+
const ds = this.datasource?.value;
|
|
432
|
+
if (!ds || !dateInfo)
|
|
433
|
+
return;
|
|
434
|
+
ds.filterInfo = new FilterInfo('AND', [
|
|
435
|
+
new FilterItem({ operator: 'gte', field: this.toField, value: dateInfo.start }),
|
|
436
|
+
new FilterItem({ operator: 'lte', field: this.fromField, value: dateInfo.end })
|
|
437
|
+
]);
|
|
438
|
+
this.lastRangeFieldsKey = `${this.fromField}|${this.toField}`;
|
|
439
|
+
}
|
|
310
440
|
/**
|
|
311
441
|
* Sottoscrive lo stream `fetchInfo$` del datasource, applica le opzioni scheduler
|
|
312
442
|
* dai metadati tabella e aggiorna gli eventi mostrati nel calendario.
|
|
@@ -316,44 +446,34 @@ class SchedulerListComponent {
|
|
|
316
446
|
this.fetchInfoSub = this.datasource.value.fetchInfo$.subscribe((info) => {
|
|
317
447
|
if (info) {
|
|
318
448
|
this.metaInfo = info.metaInfo;
|
|
319
|
-
let schedOptions = info.metaInfo
|
|
449
|
+
let schedOptions = this.resolveSchedulerFields(info.metaInfo);
|
|
320
450
|
this.calendarOptions.editable = info.metaInfo.tableMetadata.md_editable;
|
|
451
|
+
// La prima fetch la lancia `datesSet`, quando le opzioni archetype
|
|
452
|
+
// possono non essere ancora state idratate in `extraProps`: in quel
|
|
453
|
+
// caso il filtro di range e' stato costruito su campi diversi da
|
|
454
|
+
// quelli veri e i dati a schermo NON sono quelli dell'intervallo
|
|
455
|
+
// richiesto. Ora che i campi sono corretti, si rifa' la fetch una
|
|
456
|
+
// volta sola (al giro successivo la chiave coincide e non si rientra).
|
|
457
|
+
const fieldsKey = `${this.fromField}|${this.toField}`;
|
|
458
|
+
if (this.lastDatesSetInfo && this.lastRangeFieldsKey && this.lastRangeFieldsKey !== fieldsKey && !this.rangeRefetchInFlight) {
|
|
459
|
+
this.rangeRefetchInFlight = true;
|
|
460
|
+
this.applyRangeFilter(this.lastDatesSetInfo);
|
|
461
|
+
Promise.resolve(this.datasource?.value?.fetchData?.())
|
|
462
|
+
.finally(() => { this.rangeRefetchInFlight = false; });
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
321
465
|
if (schedOptions) {
|
|
322
|
-
this.fromField = schedOptions.fromField;
|
|
323
|
-
this.toField = schedOptions.toField;
|
|
324
|
-
this.titleField = schedOptions.titleField;
|
|
325
466
|
if (schedOptions.itemTemplateString || this.metaInfo.tableMetadata.md_book_html_template) {
|
|
326
467
|
this.itemTemplateString = schedOptions.itemTemplateString || this.metaInfo.tableMetadata.md_book_html_template;
|
|
327
468
|
}
|
|
328
|
-
else {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
this.titleFunction = (record) => WtoolboxService.runUserCallbackSync('archetypes.scheduler.titleFunction', () => compiledTitleFn(record), [], { archetype: 'scheduler', route });
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
else {
|
|
340
|
-
let dateFields = this.metaInfo.columnMetadata.filter(c => c.mc_ui_column_type == 'date' || c.mc_ui_column_type == 'datetime');
|
|
341
|
-
if (dateFields.length >= 2) {
|
|
342
|
-
let fromCandidates = dateFields.filter(c => c.mc_nome_colonna.toLowerCase().includes('from'));
|
|
343
|
-
let toCandidates = dateFields.filter(c => c.mc_nome_colonna.toLowerCase().includes('to'));
|
|
344
|
-
if (fromCandidates.length > 0 && toCandidates.length > 0) {
|
|
345
|
-
this.fromField = fromCandidates[0].mc_nome_colonna;
|
|
346
|
-
this.toField = toCandidates[0].mc_nome_colonna;
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
this.fromField = dateFields[0].mc_nome_colonna;
|
|
350
|
-
this.toField = dateFields[1].mc_nome_colonna;
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
this.fromField = this.toField = this.metaInfo.columnMetadata.find(c => c.mc_ui_column_type == 'date' || c.mc_ui_column_type == 'datetime')?.mc_nome_colonna;
|
|
469
|
+
else if (schedOptions.titleFunction) {
|
|
470
|
+
// skills/typed-localized-exceptions: cached compiled fn → wrap il
|
|
471
|
+
// call-site (non la compile) cosi' ogni invocazione runtime e' protetta
|
|
472
|
+
// (titleFunction(record) viene chiamata per ogni evento renderizzato).
|
|
473
|
+
const compiledTitleFn = new Function('record', schedOptions.titleFunction);
|
|
474
|
+
const route = this.metaInfo?.tableMetadata?.md_route_name;
|
|
475
|
+
this.titleFunction = (record) => WtoolboxService.runUserCallbackSync('archetypes.scheduler.titleFunction', () => compiledTitleFn(record), [], { archetype: 'scheduler', route });
|
|
355
476
|
}
|
|
356
|
-
this.titleField = this.metaInfo.columnMetadata.find(c => c.mc_ui_column_type == 'text' || c.mc_ui_column_type == 'txt_area')?.mc_nome_colonna;
|
|
357
477
|
}
|
|
358
478
|
let title = this.metaInfo.tableMetadata.md_display_string;
|
|
359
479
|
this.titleService.setTitle(title);
|
|
@@ -371,9 +491,6 @@ class SchedulerListComponent {
|
|
|
371
491
|
else {
|
|
372
492
|
this.datasource.value.fetchData();
|
|
373
493
|
}
|
|
374
|
-
// this.totalRecords = info.resultInfo.totalRowCount || 0;
|
|
375
|
-
// this.aggregates = info.resultInfo.Agg || [];
|
|
376
|
-
// this.filter();
|
|
377
494
|
}
|
|
378
495
|
});
|
|
379
496
|
}
|
|
@@ -427,7 +544,7 @@ class SchedulerListComponent {
|
|
|
427
544
|
if (col.mc_ui_column_type == 'date') {
|
|
428
545
|
if (typeof date === 'string') {
|
|
429
546
|
const raw = date.trim();
|
|
430
|
-
const m =
|
|
547
|
+
const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(raw);
|
|
431
548
|
if (m) {
|
|
432
549
|
return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));
|
|
433
550
|
}
|
|
@@ -454,9 +571,6 @@ class SchedulerListComponent {
|
|
|
454
571
|
* @param arg Parametro utilizzato dal metodo nel flusso elaborativo.
|
|
455
572
|
*/
|
|
456
573
|
async updateEvent(arg) {
|
|
457
|
-
// var instance = this.datasource.value.getObservable(arg.event.extendedProps);
|
|
458
|
-
// this.datasource.value.pristine = arg.event.extendedProps;
|
|
459
|
-
// this.datasource.value.resultInfo.current = instance;
|
|
460
574
|
const originalRecord = JSON.parse(JSON.stringify(arg?.event?.extendedProps || {}));
|
|
461
575
|
this.datasource.value.setCurrent(originalRecord);
|
|
462
576
|
let instance = this.datasource.value.resultInfo.current;
|
|
@@ -499,7 +613,7 @@ class SchedulerListComponent {
|
|
|
499
613
|
return (this.metaInfo?.columnMetadata || []).find((c) => String(c?.mc_nome_colonna || '').trim().toLowerCase() === key);
|
|
500
614
|
}
|
|
501
615
|
serializeDateForColumn(date, col) {
|
|
502
|
-
if (!(date instanceof Date) || isNaN(date.getTime())) {
|
|
616
|
+
if (!(date instanceof Date) || Number.isNaN(Number(date.getTime()))) {
|
|
503
617
|
return '';
|
|
504
618
|
}
|
|
505
619
|
const type = String(col?.mc_ui_column_type || '').trim().toLowerCase();
|
|
@@ -522,10 +636,10 @@ class SchedulerListComponent {
|
|
|
522
636
|
return `${yyyy}-${mm}-${dd}T${hh}:${mi}:${ss}`;
|
|
523
637
|
}
|
|
524
638
|
addDays(date, delta) {
|
|
525
|
-
if (!(date instanceof Date) || isNaN(date.getTime()) || !Number.isFinite(delta)) {
|
|
639
|
+
if (!(date instanceof Date) || Number.isNaN(Number(date.getTime())) || !Number.isFinite(delta)) {
|
|
526
640
|
return date;
|
|
527
641
|
}
|
|
528
|
-
const clone = new Date(date
|
|
642
|
+
const clone = new Date(date);
|
|
529
643
|
clone.setDate(clone.getDate() + delta);
|
|
530
644
|
return clone;
|
|
531
645
|
}
|
|
@@ -595,6 +709,8 @@ class SchedulerListComponent {
|
|
|
595
709
|
this.fetchInfoSub = null;
|
|
596
710
|
this.datasourceSub?.unsubscribe?.();
|
|
597
711
|
this.datasourceSub = null;
|
|
712
|
+
this.langChangeSub?.unsubscribe?.();
|
|
713
|
+
this.langChangeSub = null;
|
|
598
714
|
}
|
|
599
715
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SchedulerListComponent, deps: [{ token: i1.Title }, { token: i0.ChangeDetectorRef }, { token: TranslationManagerService }], target: i0.ɵɵFactoryTarget.Component });
|
|
600
716
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SchedulerListComponent, isStandalone: true, selector: "wuic-scheduler-list", inputs: { hardcodedRoute: "hardcodedRoute", parentRecord: "parentRecord", parentMetaInfo: "parentMetaInfo", datasource: "datasource", hardcodedDatasource: "hardcodedDatasource", hideToolbar: "hideToolbar" }, outputs: { onSchedulerDateClick: "onSchedulerDateClick", onSchedulerEventClick: "onSchedulerEventClick", onSchedulerEventDrop: "onSchedulerEventDrop", onSchedulerEventResize: "onSchedulerEventResize", onSchedulerDatesSet: "onSchedulerDatesSet", onSchedulerDataBound: "onSchedulerDataBound", onSchedulerEventSync: "onSchedulerEventSync" }, host: { listeners: { "window:resize": "onWindowResize()" } }, providers: [Title], viewQueries: [{ propertyName: "eventContent", first: true, predicate: ["fcEventContent"], descendants: true }, { propertyName: "calendar", first: true, predicate: ["calendar"], descendants: true }], ngImport: i0, template: "@if (calendarOptions) {\n<full-calendar #calendar [options]=\"calendarOptions\" [events]=\"data\">\n <ng-template #eventContent let-arg>\n <ng-container\n *ngComponentOutlet=\"itemTemplate; inputs: { record: arg.event, rowData: arg.event, metaInfo: metaInfo, datasource: datasource }\"></ng-container>\n </ng-template>\n</full-calendar>\n}", styles: [":host ::ng-deep .fc{--fc-event-bg-color: var(--primary-color, var(--p-primary-color, #3b82f6));--fc-event-border-color: var(--primary-color, var(--p-primary-color, #3b82f6));--fc-event-text-color: var(--primary-color-text, var(--p-primary-contrast-color, #ffffff))}:host ::ng-deep .fc .fc-h-event,:host ::ng-deep .fc .fc-v-event,:host ::ng-deep .fc .fc-daygrid-event,:host ::ng-deep .fc .fc-timegrid-event{border-color:var(--fc-event-border-color)!important;background-color:var(--fc-event-bg-color)!important;color:var(--fc-event-text-color)!important}\n"], dependencies: [{ kind: "ngmodule", type: FullCalendarModule }, { kind: "component", type: i3.FullCalendarComponent, selector: "full-calendar", inputs: ["options", "deepChangeDetection", "events", "eventSources", "resources"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }] });
|
|
@@ -640,4 +756,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
640
756
|
}] } });
|
|
641
757
|
|
|
642
758
|
export { SchedulerListComponent };
|
|
643
|
-
//# sourceMappingURL=wuic-framework-lib-scheduler-list.component
|
|
759
|
+
//# sourceMappingURL=wuic-framework-lib-scheduler-list.component--wY21R3o.mjs.map
|