wuic-framework-lib 1.5.0 → 1.7.1

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.
Files changed (27) hide show
  1. package/fesm2022/{wuic-framework-lib-chart-list.component-0J1ghIrS.mjs → wuic-framework-lib-chart-list.component-Dq9IEKsY.mjs} +50 -38
  2. package/fesm2022/{wuic-framework-lib-code-editor.component-C21mvjyr.mjs → wuic-framework-lib-code-editor.component-B6IpTSo8.mjs} +174 -274
  3. package/fesm2022/{wuic-framework-lib-designer.component-x10ZzUEy.mjs → wuic-framework-lib-designer.component-D6cbqNFg.mjs} +499 -581
  4. package/fesm2022/wuic-framework-lib-first-run-wizard.component-D1ZQUl-q.mjs +1630 -0
  5. package/fesm2022/{wuic-framework-lib-framework-docs.component-xTGLbEnp.mjs → wuic-framework-lib-framework-docs.component-C_o5r7pg.mjs} +4320 -1255
  6. package/fesm2022/{wuic-framework-lib-pivot-builder.component-BkFFjPm4.mjs → wuic-framework-lib-pivot-builder.component-DkWGzJpr.mjs} +580 -68
  7. package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-Bi-TrJB6.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-D29go5yA.mjs} +2 -2
  8. package/fesm2022/wuic-framework-lib-report-designer.component-DcpCWghx.mjs +380 -0
  9. package/fesm2022/wuic-framework-lib-report-scaffold-dialog.component-CgUjG7Bi.mjs +431 -0
  10. package/fesm2022/{wuic-framework-lib-report-viewer.component-BR-BfI2r.mjs → wuic-framework-lib-report-viewer.component-C4Opgl_M.mjs} +8 -13
  11. package/fesm2022/{wuic-framework-lib-scene3d-designer.component-BQzFxSXP.mjs → wuic-framework-lib-scene3d-designer.component-8l3vsyEb.mjs} +323 -88
  12. package/fesm2022/{wuic-framework-lib-scene3d-light-baker-gpu-0LjqhSNn.mjs → wuic-framework-lib-scene3d-light-baker-gpu-C1w-8Aai.mjs} +2 -2
  13. package/fesm2022/{wuic-framework-lib-scene3d-shader-effect-CQLWkuh1.mjs → wuic-framework-lib-scene3d-shader-effect-DjHyCAFK.mjs} +612 -32
  14. package/fesm2022/{wuic-framework-lib-scene3d-viewer.component-imoV3HOs.mjs → wuic-framework-lib-scene3d-viewer.component-nMSl5jbe.mjs} +149 -18
  15. package/fesm2022/{wuic-framework-lib-scheduler-list.component-xzlTEkoq.mjs → wuic-framework-lib-scheduler-list.component-Cvk3Zg0Q.mjs} +169 -53
  16. package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-CrS6fOGj.mjs → wuic-framework-lib-spreadsheet-list-sf.component-C1U7JPiq.mjs} +149 -108
  17. package/fesm2022/{wuic-framework-lib-stimulsoft-license.service-BIyxB4pO.mjs → wuic-framework-lib-stimulsoft-license.service-CsNNSFYs.mjs} +3 -3
  18. package/fesm2022/wuic-framework-lib-timeline-list.component-cZbPgNh1.mjs +805 -0
  19. package/fesm2022/{wuic-framework-lib-workflow-designer.component-5xtQ7-6z.mjs → wuic-framework-lib-workflow-designer.component-C_4RQGa0.mjs} +180 -150
  20. package/fesm2022/{wuic-framework-lib-wuic-framework-lib-3TZ-j-yL.mjs → wuic-framework-lib-wuic-framework-lib-BZZwta8b.mjs} +6785 -2347
  21. package/fesm2022/wuic-framework-lib.mjs +1 -1
  22. package/package.json +21 -2
  23. package/styles/_wuic-tokens.scss +82 -0
  24. package/styles/styles.scss +160 -0
  25. package/types/wuic-framework-lib.d.ts +4269 -2691
  26. package/fesm2022/wuic-framework-lib-first-run-wizard.component-BuSxs_CM.mjs +0 -1316
  27. 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 { o as FilterInfo, q as FilterItem, W as WtoolboxService, d as ParametricDialogComponent, M as MetadataProviderService, D as DynamicGenericTemplateComponent, T as TranslationManagerService } from './wuic-framework-lib-wuic-framework-lib-3TZ-j-yL.mjs';
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-BZZwta8b.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 && self.datasource.value && self.datasource.value.metaInfo && self.datasource.value.metaInfo.tableMetadata.md_insertable) {
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 && self.datasource.value) {
269
- self.datasource.value.filterInfo = new FilterInfo('AND', [
270
- new FilterItem({ operator: 'gte', field: self.toField, value: dateInfo.start }),
271
- new FilterItem({ operator: 'lte', field: self.fromField, value: dateInfo.end })
272
- ]);
273
- if (self.datasource && self.datasource.value && self.datasource.value.metaInfo && self.datasource.value.metaInfo.columnMetadata.length > 0) {
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 && this.datasource.value) {
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.tableMetadata.extraProps?.archetypes?.scheduler;
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
- if (schedOptions.titleFunction) {
330
- // skills/typed-localized-exceptions: cached compiled fn → wrap il
331
- // call-site (non la compile) cosi' ogni invocazione runtime e' protetta
332
- // (titleFunction(record) viene chiamata per ogni evento renderizzato).
333
- const compiledTitleFn = new Function('record', schedOptions.titleFunction);
334
- const route = this.metaInfo?.tableMetadata?.md_route_name;
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 = raw.match(/^(\d{4})-(\d{2})-(\d{2})$/);
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.getTime());
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-xzlTEkoq.mjs.map
759
+ //# sourceMappingURL=wuic-framework-lib-scheduler-list.component-Cvk3Zg0Q.mjs.map