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,11 +3,11 @@ import { ViewEncapsulation, Component, EventEmitter, HostListener, Output, Input
3
3
  import { BehaviorSubject } from 'rxjs';
4
4
  import * as i4 from 'primeng/button';
5
5
  import { ButtonModule } from 'primeng/button';
6
- import * as i2 from '@ngx-translate/core';
6
+ import * as i8 from '@ngx-translate/core';
7
7
  import { TranslateModule } from '@ngx-translate/core';
8
8
  import * as i7 from '@syncfusion/ej2-angular-spreadsheet';
9
9
  import { SpreadsheetModule } from '@syncfusion/ej2-angular-spreadsheet';
10
- import { W as WtoolboxService, M as MetadataProviderService, U as UserInfoService, b as DataSourceComponent, I as ImportExportButtonComponent } from './wuic-framework-lib-wuic-framework-lib-3TZ-j-yL.mjs';
10
+ import { W as WtoolboxService, M as MetadataProviderService, U as UserInfoService, b as DataSourceComponent, I as ImportExportButtonComponent } from './wuic-framework-lib-wuic-framework-lib-BZZwta8b.mjs';
11
11
  import { registerLicense } from '@syncfusion/ej2-base';
12
12
  import * as i1 from '@angular/platform-browser';
13
13
  import * as i1$1 from '@angular/router';
@@ -605,7 +605,7 @@ class SpreadsheetListSfComponent {
605
605
  this.datasource = new BehaviorSubject(this.hardcodedDatasource);
606
606
  this.subscribeToDS();
607
607
  }
608
- else if (this.datasource && this.datasource.value) {
608
+ else if (this.datasource?.value) {
609
609
  this.subscribeToDS();
610
610
  }
611
611
  else if (this.datasource) {
@@ -692,11 +692,15 @@ class SpreadsheetListSfComponent {
692
692
  const datasourcePageSize = Number(this.datasource?.value?.pageSize);
693
693
  const metadataPageSize = Number(this.metaInfo?.tableMetadata?.md_pagesize);
694
694
  const fallbackPageSize = Number(this.pageSize || 10);
695
- this.pageSize = Number.isFinite(datasourcePageSize) && datasourcePageSize > 0
696
- ? Math.trunc(datasourcePageSize)
697
- : (Number.isFinite(metadataPageSize) && metadataPageSize > 0
698
- ? Math.trunc(metadataPageSize)
699
- : Math.max(1, Math.trunc(fallbackPageSize || 10)));
695
+ if (Number.isFinite(datasourcePageSize) && datasourcePageSize > 0) {
696
+ this.pageSize = Math.trunc(datasourcePageSize);
697
+ }
698
+ else if (Number.isFinite(metadataPageSize) && metadataPageSize > 0) {
699
+ this.pageSize = Math.trunc(metadataPageSize);
700
+ }
701
+ else {
702
+ this.pageSize = Math.max(1, Math.trunc(fallbackPageSize || 10));
703
+ }
700
704
  this.pageIndex = Number(this.datasource?.value?.currentPage || this.pageIndex || 1);
701
705
  if (this.datasource?.value) {
702
706
  this.datasource.value.pageSize = Math.max(0, Math.trunc(this.pageSize || 0));
@@ -723,15 +727,14 @@ class SpreadsheetListSfComponent {
723
727
  parseData(raw, metaInfo) {
724
728
  if (!Array.isArray(raw))
725
729
  return [];
726
- const ds = this.datasource?.value;
727
730
  return raw.map(row => {
728
731
  const plain = {};
729
732
  for (const col of metaInfo.columnMetadata || []) {
730
733
  const name = col.mc_nome_colonna;
731
734
  const value = row?.[name];
732
- if (value != null && typeof value === 'object' && 'value' in value && typeof value.subscribe === 'function') {
735
+ if (value != null && typeof value === 'object' && 'value' in value && typeof (value).subscribe === 'function') {
733
736
  // BehaviorSubject — prendi il .value corrente
734
- plain[name] = value.value;
737
+ plain[name] = (value).value;
735
738
  }
736
739
  else {
737
740
  plain[name] = value ?? null;
@@ -742,7 +745,7 @@ class SpreadsheetListSfComponent {
742
745
  const aliasValue = row?.[aliasField];
743
746
  if (aliasValue != null) {
744
747
  plain[aliasField] = typeof aliasValue === 'object' && 'value' in aliasValue
745
- ? aliasValue.value
748
+ ? (aliasValue).value
746
749
  : aliasValue;
747
750
  }
748
751
  }
@@ -799,24 +802,33 @@ class SpreadsheetListSfComponent {
799
802
  if (typeof d === 'boolean')
800
803
  return d;
801
804
  if (typeof d === 'object' && 'value' in d)
802
- return !!d.value;
805
+ return !!(d).value;
803
806
  return !!d;
804
807
  }
805
808
  markRecordDeleted(record) {
806
809
  if (!record)
807
810
  return;
808
811
  const cur = record.__deleted;
809
- if (cur && typeof cur === 'object' && typeof cur.next === 'function') {
810
- cur.next(true);
812
+ if (cur && typeof cur === 'object' && typeof (cur).next === 'function') {
813
+ (cur).next(true);
811
814
  }
812
815
  else {
813
816
  record.__deleted = new BehaviorSubject(true);
814
817
  }
815
818
  }
819
+ /**
820
+ * Colonne metadata visibili nella lista: esclude le colonne con
821
+ * `mc_hide_in_list` (parità col vecchio spreadsheet-list). Tutti i
822
+ * mapping indice-sheet ↔ metadata devono usare questo predicato,
823
+ * altrimenti l'index math celle ↔ colonne diverge.
824
+ */
825
+ getVisibleMetaCols() {
826
+ return (this.metaInfo?.columnMetadata || []).filter(c => !c.mc_hide_in_list);
827
+ }
816
828
  rebuildSheetWithData() {
817
829
  if (!this.metaInfo)
818
830
  return;
819
- const visibleMetaCols = (this.metaInfo.columnMetadata || []).filter(c => !c.mc_hide_in_edit);
831
+ const visibleMetaCols = this.getVisibleMetaCols();
820
832
  const sfColumns = visibleMetaCols.map((col) => this.mapColumnWidth(col));
821
833
  // Page slicing su effectiveRecords (filtered se filter attivo)
822
834
  const source = this.effectiveRecords;
@@ -902,8 +914,8 @@ class SpreadsheetListSfComponent {
902
914
  if (value == null)
903
915
  return '';
904
916
  // Unwrap BehaviorSubject se residuo
905
- if (typeof value === 'object' && 'value' in value && typeof value.subscribe === 'function') {
906
- value = value.value;
917
+ if (typeof value === 'object' && 'value' in value && typeof (value).subscribe === 'function') {
918
+ value = (value).value;
907
919
  }
908
920
  const type = col.mc_ui_column_type;
909
921
  const locale = this.resolveLocale();
@@ -1005,14 +1017,14 @@ class SpreadsheetListSfComponent {
1005
1017
  if (!value)
1006
1018
  return null;
1007
1019
  if (value instanceof Date)
1008
- return isNaN(value.getTime()) ? null : value;
1020
+ return Number.isNaN(Number(value.getTime())) ? null : value;
1009
1021
  const str = String(value);
1010
1022
  // ISO / anything Date() can parse
1011
1023
  const d = new Date(str);
1012
- if (!isNaN(d.getTime()))
1024
+ if (!Number.isNaN(Number(d.getTime())))
1013
1025
  return d;
1014
1026
  // Italian format dd/mm/yyyy
1015
- const m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})(?:\s+(\d{1,2}):(\d{2})(?::(\d{2}))?)?$/);
1027
+ const m = /^(\d{1,2})\/(\d{1,2})\/(\d{4})(?:\s+(\d{1,2}):(\d{2})(?::(\d{2}))?)?$/.exec(str);
1016
1028
  if (m) {
1017
1029
  return new Date(Number(m[3]), Number(m[2]) - 1, Number(m[1]), Number(m[4] || 0), Number(m[5] || 0), Number(m[6] || 0));
1018
1030
  }
@@ -1068,14 +1080,14 @@ class SpreadsheetListSfComponent {
1068
1080
  if (raw == null)
1069
1081
  return fallback;
1070
1082
  const str = String(raw).trim();
1071
- const pxMatch = str.match(/^(\d+(?:\.\d+)?)px$/i);
1083
+ const pxMatch = /^(\d+(?:\.\d+)?)px$/i.exec(str);
1072
1084
  if (pxMatch)
1073
- return Math.max(60, Math.round(parseFloat(pxMatch[1])));
1074
- const percentMatch = str.match(/^(\d+(?:\.\d+)?)%$/);
1085
+ return Math.max(60, Math.round(Number.parseFloat(pxMatch[1])));
1086
+ const percentMatch = /^(\d+(?:\.\d+)?)%$/.exec(str);
1075
1087
  if (percentMatch) {
1076
1088
  const hostWidth = this.spreadsheet?.nativeElement?.clientWidth || 0;
1077
1089
  if (hostWidth > 0) {
1078
- return Math.max(60, Math.round((parseFloat(percentMatch[1]) / 100) * hostWidth));
1090
+ return Math.max(60, Math.round((Number.parseFloat(percentMatch[1]) / 100) * hostWidth));
1079
1091
  }
1080
1092
  }
1081
1093
  const numeric = Number(str);
@@ -1192,9 +1204,8 @@ class SpreadsheetListSfComponent {
1192
1204
  plainRecord['__new'] = record['__new'] || new BehaviorSubject(true);
1193
1205
  plainRecord['__guid'] = record['__guid'] || new BehaviorSubject(WtoolboxService.uuidv4());
1194
1206
  const baseIndex = Number(targetRow);
1195
- const targetIndex = Number.isFinite(baseIndex)
1196
- ? (insertBefore ? Math.max(0, Math.trunc(baseIndex)) : Math.max(0, Math.trunc(baseIndex) + 1))
1197
- : this.records.length;
1207
+ const insertPosition = insertBefore ? Math.max(0, Math.trunc(baseIndex)) : Math.max(0, Math.trunc(baseIndex) + 1);
1208
+ const targetIndex = Number.isFinite(baseIndex) ? insertPosition : this.records.length;
1198
1209
  const insertIndex = Math.min(Math.max(targetIndex, 0), this.records.length);
1199
1210
  // Aggiungi ai records in memoria
1200
1211
  this.records.splice(insertIndex, 0, plainRecord);
@@ -1248,7 +1259,7 @@ class SpreadsheetListSfComponent {
1248
1259
  continue;
1249
1260
  }
1250
1261
  const isNew = record?.__new === true
1251
- || (record?.__new && typeof record.__new === 'object' && record.__new.value === true);
1262
+ || (record?.__new && typeof record.__new === 'object' && (record.__new).value === true);
1252
1263
  if (!record[this.metaInfo?.pKey?.mc_nome_colonna] || isNew) {
1253
1264
  // Riga nuova non ancora salvata sul server → rimozione solo locale,
1254
1265
  // niente payload batch.
@@ -1469,7 +1480,7 @@ class SpreadsheetListSfComponent {
1469
1480
  return null;
1470
1481
  const pKey = this.metaInfo?.pKey?.mc_nome_colonna;
1471
1482
  const unwrap = (v) => (v != null && typeof v === 'object' && 'value' in v && typeof v.subscribe === 'function')
1472
- ? v.value
1483
+ ? (v).value
1473
1484
  : v;
1474
1485
  // DELETE batch: payload minimale con solo la chiave primaria e flag
1475
1486
  // `_destroy: true` riconosciuto da `MetaService.batchRecord`. Serializzare
@@ -1524,10 +1535,10 @@ class SpreadsheetListSfComponent {
1524
1535
  // Esempio "A1:D5" → righe 1-5 in sheet index (1-based, nessun header
1525
1536
  // intermedio — l'header è il column-letter row nativo Syncfusion).
1526
1537
  // data index 0-based = sheetRow - 1.
1527
- const match = selectedRange.match(/^[A-Z]+(\d+):[A-Z]+(\d+)$/i);
1538
+ const match = /^[A-Z]+(\d+):[A-Z]+(\d+)$/i.exec(selectedRange);
1528
1539
  if (match) {
1529
- const startSheetRow = parseInt(match[1], 10);
1530
- const endSheetRow = parseInt(match[2], 10);
1540
+ const startSheetRow = Number.parseInt(match[1], 10);
1541
+ const endSheetRow = Number.parseInt(match[2], 10);
1531
1542
  const startDataIdx = Math.max(0, startSheetRow - 1);
1532
1543
  const endDataIdx = Math.max(0, endSheetRow - 1);
1533
1544
  const pageOffset = this.isServerSide ? 0 : (this.pageIndex - 1) * this.pageSize;
@@ -1615,7 +1626,7 @@ class SpreadsheetListSfComponent {
1615
1626
  if (!this.metaInfo || !this.spreadsheet?.nativeElement)
1616
1627
  return;
1617
1628
  try {
1618
- const visibleMetaCols = (this.metaInfo.columnMetadata || []).filter(c => !c.mc_hide_in_edit);
1629
+ const visibleMetaCols = this.getVisibleMetaCols();
1619
1630
  const headerCells = this.spreadsheet.nativeElement.querySelectorAll('.e-column-header .e-header-cell:not(.e-select-all-cell)');
1620
1631
  headerCells.forEach((cell, idx) => {
1621
1632
  const col = visibleMetaCols[idx];
@@ -1648,7 +1659,9 @@ class SpreadsheetListSfComponent {
1648
1659
  * (nascosto, che sta nella prima cella dati) così si apre il popup distinct.
1649
1660
  */
1650
1661
  ensureHeaderFilterButton(headerCell, colIdx, col) {
1651
- const allowed = col?.mc_allow_filter !== false && col?.mc_show_in_filters !== false;
1662
+ // Parità col vecchio spreadsheet-list: funnel solo se mc_show_in_filters
1663
+ // è truthy (false/0/null/undefined → colonna esclusa dal pannello filtri).
1664
+ const allowed = col?.mc_allow_filter !== false && !!col?.mc_show_in_filters;
1652
1665
  const existing = headerCell.querySelector('.wuic-sf-header-filter-btn');
1653
1666
  if (!allowed) {
1654
1667
  // Colonna senza filter → rimuovi eventuale button
@@ -1964,7 +1977,12 @@ class SpreadsheetListSfComponent {
1964
1977
  let data = resp;
1965
1978
  if (resp && typeof resp === 'object' && 'd' in resp) {
1966
1979
  const d = resp.d;
1967
- data = typeof d === 'string' ? (d ? JSON.parse(d) : null) : d;
1980
+ if (typeof d === 'string') {
1981
+ data = d ? JSON.parse(d) : null;
1982
+ }
1983
+ else {
1984
+ data = d;
1985
+ }
1968
1986
  }
1969
1987
  const results = data?.results || data?.Results || [];
1970
1988
  const distinctMap = new Map();
@@ -2002,7 +2020,7 @@ class SpreadsheetListSfComponent {
2002
2020
  return Array.from(distinctMap.values()).sort((a, b) => {
2003
2021
  const na = Number(a.display);
2004
2022
  const nb = Number(b.display);
2005
- if (!isNaN(na) && !isNaN(nb) && a.display !== '' && b.display !== '')
2023
+ if (!Number.isNaN(Number(na)) && !Number.isNaN(Number(nb)) && a.display !== '' && b.display !== '')
2006
2024
  return na - nb;
2007
2025
  return a.display.localeCompare(b.display, this.resolveLocale(), { numeric: true, sensitivity: 'base' });
2008
2026
  });
@@ -2128,11 +2146,11 @@ class SpreadsheetListSfComponent {
2128
2146
  if (s == null)
2129
2147
  return '';
2130
2148
  return String(s)
2131
- .replace(/&/g, '&')
2132
- .replace(/</g, '&lt;')
2133
- .replace(/>/g, '&gt;')
2134
- .replace(/"/g, '&quot;')
2135
- .replace(/'/g, '&#39;');
2149
+ .replaceAll('&', '&amp;')
2150
+ .replaceAll('<', '&lt;')
2151
+ .replaceAll('>', '&gt;')
2152
+ .replaceAll('"', '&quot;')
2153
+ .replaceAll('\'', '&#39;');
2136
2154
  }
2137
2155
  /** Observer per ri-sincronizzare i nomi colonna quando Syncfusion redraws l'header. */
2138
2156
  colHeaderObserver;
@@ -2165,7 +2183,7 @@ class SpreadsheetListSfComponent {
2165
2183
  let i = Math.max(0, Math.trunc(index));
2166
2184
  let s = '';
2167
2185
  while (true) {
2168
- s = String.fromCharCode(65 + (i % 26)) + s;
2186
+ s = String.fromCodePoint(65 + (i % 26)) + s;
2169
2187
  if (i < 26)
2170
2188
  return s;
2171
2189
  i = Math.floor(i / 26) - 1;
@@ -2192,11 +2210,11 @@ class SpreadsheetListSfComponent {
2192
2210
  const newValue = args.value;
2193
2211
  if (!addr)
2194
2212
  return;
2195
- const cellMatch = addr.match(/!([A-Z]+)(\d+)$/i) || addr.match(/^([A-Z]+)(\d+)$/i);
2213
+ const cellMatch = /!([A-Z]+)(\d+)$/i.exec(addr) || /^([A-Z]+)(\d+)$/i.exec(addr);
2196
2214
  if (!cellMatch)
2197
2215
  return;
2198
2216
  const colLetter = cellMatch[1].toUpperCase();
2199
- const sheetRow = parseInt(cellMatch[2], 10);
2217
+ const sheetRow = Number.parseInt(cellMatch[2], 10);
2200
2218
  const colIndex = this.columnLetterToIndex(colLetter);
2201
2219
  // Syncfusion usa 1-based sheet rows; il column-letter header è row 0
2202
2220
  // del modello ma non è editabile/indirizzabile come cella. La prima
@@ -2206,10 +2224,17 @@ class SpreadsheetListSfComponent {
2206
2224
  return;
2207
2225
  const pageOffset = this.isServerSide ? 0 : (this.pageIndex - 1) * this.pageSize;
2208
2226
  const absoluteRowIndex = pageOffset + dataRowIndex;
2209
- const visibleMetaCols = (this.metaInfo?.columnMetadata || []).filter(c => !c.mc_hide_in_edit);
2227
+ const visibleMetaCols = this.getVisibleMetaCols();
2210
2228
  const col = visibleMetaCols[colIndex];
2211
2229
  if (!col)
2212
2230
  return;
2231
+ // mc_hide_in_edit: campo non modificabile. cellEdit è già bloccato, ma
2232
+ // paste/fill Syncfusion arrivano qui senza passare da cellEdit → scarta
2233
+ // il valore e ripristina la cella dal record.
2234
+ if (col.mc_hide_in_edit) {
2235
+ this.rebuildSheetWithData();
2236
+ return;
2237
+ }
2213
2238
  const record = this.records[absoluteRowIndex];
2214
2239
  if (!record)
2215
2240
  return;
@@ -2311,7 +2336,7 @@ class SpreadsheetListSfComponent {
2311
2336
  li.addEventListener('click', handler, true);
2312
2337
  }
2313
2338
  if (anchor) {
2314
- ul.insertBefore(li, anchor);
2339
+ anchor.before(li);
2315
2340
  }
2316
2341
  else {
2317
2342
  ul.appendChild(li);
@@ -2434,7 +2459,7 @@ class SpreadsheetListSfComponent {
2434
2459
  const colIdx = args.colIndex;
2435
2460
  // Allineamento per tipo colonna: number / date / datetime / time → right,
2436
2461
  // altrimenti left. Applicato a tutte le celle dati.
2437
- const visibleMetaCols = (this.metaInfo.columnMetadata || []).filter(c => !c.mc_hide_in_edit);
2462
+ const visibleMetaCols = this.getVisibleMetaCols();
2438
2463
  const col = visibleMetaCols[colIdx];
2439
2464
  if (col) {
2440
2465
  const t = col.mc_ui_column_type;
@@ -2607,15 +2632,21 @@ class SpreadsheetListSfComponent {
2607
2632
  const addr = args.address;
2608
2633
  if (!addr)
2609
2634
  return;
2610
- const match = addr.match(/!([A-Z]+)(\d+)$/i) || addr.match(/^([A-Z]+)(\d+)$/i);
2635
+ const match = /!([A-Z]+)(\d+)$/i.exec(addr) || /^([A-Z]+)(\d+)$/i.exec(addr);
2611
2636
  if (!match)
2612
2637
  return;
2613
2638
  const colIdx = this.columnLetterToIndex(match[1]);
2614
- const sheetRow = parseInt(match[2], 10);
2615
- const visibleMetaCols = (this.metaInfo.columnMetadata || []).filter(c => !c.mc_hide_in_edit);
2639
+ const sheetRow = Number.parseInt(match[2], 10);
2640
+ const visibleMetaCols = this.getVisibleMetaCols();
2616
2641
  const col = visibleMetaCols[colIdx];
2617
2642
  if (!col)
2618
2643
  return;
2644
+ // mc_hide_in_edit: colonna visibile in lista ma campo escluso dalla
2645
+ // modifica (parità col form di edit) → blocca l'apertura dell'editor.
2646
+ if (col.mc_hide_in_edit) {
2647
+ args.cancel = true;
2648
+ return;
2649
+ }
2619
2650
  this.currentField = col;
2620
2651
  // Editor custom per tipi non-testo:
2621
2652
  // - date / datetime → input HTML5 date/datetime-local (picker nativo)
@@ -2641,7 +2672,6 @@ class SpreadsheetListSfComponent {
2641
2672
  if (type === 'lookupByID' && col.mc_ui_lookup_entity_name && col.mc_ui_lookup_dataTextField) {
2642
2673
  args.cancel = true;
2643
2674
  setTimeout(() => this.openCustomLookupEditor(col, sheetRow, colIdx), 0);
2644
- return;
2645
2675
  }
2646
2676
  }
2647
2677
  // ============================================================
@@ -2730,15 +2760,26 @@ class SpreadsheetListSfComponent {
2730
2760
  const select = document.createElement('select');
2731
2761
  select.className = 'wuic-sf-cell-editor wuic-sf-cell-editor--boolean';
2732
2762
  const locale = this.resolveLocale();
2733
- const yesLabel = locale.startsWith('it') ? 'Sì'
2734
- : locale.startsWith('es') ? 'Sí'
2735
- : locale.startsWith('fr') ? 'Oui'
2736
- : locale.startsWith('de') ? 'Ja'
2737
- : 'Yes';
2738
- const noLabel = locale.startsWith('it') ? 'No'
2739
- : locale.startsWith('fr') ? 'Non'
2740
- : locale.startsWith('de') ? 'Nein'
2741
- : 'No';
2763
+ let yesLabel = 'Yes';
2764
+ if (locale.startsWith('it')) {
2765
+ yesLabel = 'Sì';
2766
+ }
2767
+ else if (locale.startsWith('es')) {
2768
+ yesLabel = 'Sí';
2769
+ }
2770
+ else if (locale.startsWith('fr')) {
2771
+ yesLabel = 'Oui';
2772
+ }
2773
+ else if (locale.startsWith('de')) {
2774
+ yesLabel = 'Ja';
2775
+ }
2776
+ let noLabel = 'No';
2777
+ if (locale.startsWith('fr')) {
2778
+ noLabel = 'Non';
2779
+ }
2780
+ else if (locale.startsWith('de')) {
2781
+ noLabel = 'Nein';
2782
+ }
2742
2783
  // Blank option per permettere null (nullable boolean)
2743
2784
  const blankOpt = document.createElement('option');
2744
2785
  blankOpt.value = '';
@@ -2754,7 +2795,8 @@ class SpreadsheetListSfComponent {
2754
2795
  select.appendChild(noOpt);
2755
2796
  const truthy = rawValue === true || rawValue === 1 || rawValue === '1' || rawValue === 'true' || rawValue === 'True';
2756
2797
  const falsy = rawValue === false || rawValue === 0 || rawValue === '0' || rawValue === 'false' || rawValue === 'False';
2757
- select.value = truthy ? '1' : (falsy ? '0' : '');
2798
+ const uncheckedValue = falsy ? '0' : '';
2799
+ select.value = truthy ? '1' : uncheckedValue;
2758
2800
  inputEl = select;
2759
2801
  getValue = () => {
2760
2802
  const v = select.value;
@@ -2941,7 +2983,7 @@ class SpreadsheetListSfComponent {
2941
2983
  try {
2942
2984
  const sf = this.sfSpreadsheet;
2943
2985
  const editModule = sf?.editModule;
2944
- if (editModule && editModule.isEdit) {
2986
+ if (editModule?.isEdit) {
2945
2987
  if (typeof editModule.syncEditModelFromEditor === 'function') {
2946
2988
  editModule.syncEditModelFromEditor();
2947
2989
  }
@@ -3210,9 +3252,11 @@ class SpreadsheetListSfComponent {
3210
3252
  children.forEach((li, i) => {
3211
3253
  const active = i === this.cellLookupSelectedIndex;
3212
3254
  li.classList.toggle('selected', active);
3213
- li.style.background = active
3214
- ? (this.isDarkThemeActive() ? '#374151' : '#e0e7ff')
3215
- : 'transparent';
3255
+ let background = 'transparent';
3256
+ if (active) {
3257
+ background = this.isDarkThemeActive() ? '#374151' : '#e0e7ff';
3258
+ }
3259
+ li.style.background = background;
3216
3260
  });
3217
3261
  const active = children[this.cellLookupSelectedIndex];
3218
3262
  if (active) {
@@ -3284,16 +3328,16 @@ class SpreadsheetListSfComponent {
3284
3328
  if (!record || !this.metaInfo?.columnMetadata)
3285
3329
  return record;
3286
3330
  const wrapped = {
3287
- __new: new BehaviorSubject(record.__new === true || record.__new?.value === true),
3331
+ __new: new BehaviorSubject(record.__new === true || (record.__new)?.value === true),
3288
3332
  __guid: new BehaviorSubject((record.__guid && typeof record.__guid === 'object' && 'value' in record.__guid)
3289
- ? record.__guid.value
3333
+ ? (record.__guid).value
3290
3334
  : (record.__guid ?? null))
3291
3335
  };
3292
3336
  for (const col of this.metaInfo.columnMetadata) {
3293
3337
  const name = col.mc_nome_colonna;
3294
3338
  const raw = record[name];
3295
- const unwrapped = (raw && typeof raw === 'object' && 'value' in raw && typeof raw.subscribe === 'function')
3296
- ? raw.value
3339
+ const unwrapped = (raw && typeof raw === 'object' && 'value' in raw && typeof (raw).subscribe === 'function')
3340
+ ? (raw).value
3297
3341
  : raw;
3298
3342
  wrapped[name] = new BehaviorSubject(unwrapped ?? null);
3299
3343
  // Se è una colonna lookup a multiple_check, replica anche `__lookup_obj`
@@ -3301,7 +3345,7 @@ class SpreadsheetListSfComponent {
3301
3345
  const lookupKey = name + '__lookup_obj';
3302
3346
  const rawLookup = record[lookupKey];
3303
3347
  const unwrappedLookup = (rawLookup && typeof rawLookup === 'object' && 'value' in rawLookup)
3304
- ? rawLookup.value
3348
+ ? (rawLookup).value
3305
3349
  : (rawLookup ?? []);
3306
3350
  wrapped[lookupKey] = new BehaviorSubject(unwrappedLookup);
3307
3351
  }
@@ -3416,10 +3460,10 @@ class SpreadsheetListSfComponent {
3416
3460
  for (const key of Object.keys(source)) {
3417
3461
  const newVal = source[key];
3418
3462
  const target = dsRec[key];
3419
- if (target && typeof target === 'object' && 'next' in target && typeof target.next === 'function') {
3463
+ if (target && typeof target === 'object' && 'next' in target && typeof (target).next === 'function') {
3420
3464
  // BehaviorSubject → usa .next() (emette ai subscribers del form flow).
3421
3465
  try {
3422
- target.next(newVal);
3466
+ (target).next(newVal);
3423
3467
  }
3424
3468
  catch { /* ignore */ }
3425
3469
  }
@@ -3463,8 +3507,8 @@ class SpreadsheetListSfComponent {
3463
3507
  const out = {};
3464
3508
  for (const key of Object.keys(entity)) {
3465
3509
  const v = entity[key];
3466
- if (v && typeof v === 'object' && 'value' in v && typeof v.subscribe === 'function') {
3467
- out[key] = v.value;
3510
+ if (v && typeof v === 'object' && 'value' in v && typeof (v).subscribe === 'function') {
3511
+ out[key] = (v).value;
3468
3512
  }
3469
3513
  else {
3470
3514
  out[key] = v;
@@ -3530,12 +3574,12 @@ class SpreadsheetListSfComponent {
3530
3574
  const out = {};
3531
3575
  for (const key of Object.keys(record)) {
3532
3576
  const v = record[key];
3533
- if (v && typeof v === 'object' && 'value' in v && typeof v.next === 'function') {
3577
+ if (v && typeof v === 'object' && 'value' in v && typeof (v).next === 'function') {
3534
3578
  // BehaviorSubject-like: capture current value
3535
- out[key] = v.value;
3579
+ out[key] = (v).value;
3536
3580
  }
3537
3581
  else if (v instanceof Date) {
3538
- out[key] = new Date(v.getTime());
3582
+ out[key] = new Date(v);
3539
3583
  }
3540
3584
  else if (Array.isArray(v)) {
3541
3585
  out[key] = v.slice();
@@ -3586,7 +3630,7 @@ class SpreadsheetListSfComponent {
3586
3630
  // parseFloat(280) = 280. Number("280px") invece ritorna NaN → bug
3587
3631
  // storico che faceva finire "NaNpx" nei metadata e perdeva il resize
3588
3632
  // al primo paging/refresh.
3589
- const newWidth = parseFloat(String(args.eventArgs.width));
3633
+ const newWidth = Number.parseFloat(String(args.eventArgs.width));
3590
3634
  if (Number.isFinite(newWidth) && newWidth > 0) {
3591
3635
  this.persistColumnWidth(colIdx, newWidth);
3592
3636
  }
@@ -3620,19 +3664,19 @@ class SpreadsheetListSfComponent {
3620
3664
  const nested = args?.args?.eventArgs || args?.args || args?.eventArgs || {};
3621
3665
  const sortOptions = nested?.sortOptions || args?.args?.sortOptions || {};
3622
3666
  const sortDescriptor = sortOptions?.sortDescriptors || {};
3623
- const field = sortDescriptor?.field;
3624
- const order = sortDescriptor?.order || 'Ascending';
3667
+ const field = (sortDescriptor)?.field;
3668
+ const order = (sortDescriptor)?.order || 'Ascending';
3625
3669
  const range = nested?.range || args?.args?.range;
3626
3670
  let resolvedField = field;
3627
3671
  if (!resolvedField && typeof range === 'string') {
3628
- const m = range.match(/^([A-Z]+)\d+/i);
3672
+ const m = /^([A-Z]+)\d+/i.exec(range);
3629
3673
  if (m)
3630
3674
  resolvedField = m[1];
3631
3675
  }
3632
3676
  // Marca range come "contiene header" per sopprimere l'alert "expand range"
3633
3677
  // di Syncfusion (che tenta di aprire un dialog che crasha).
3634
3678
  if (sortOptions)
3635
- sortOptions.containsHeader = true;
3679
+ (sortOptions).containsHeader = true;
3636
3680
  // Memorizza la richiesta di sort — verrà ri-applicata sui records
3637
3681
  // INTERI dopo che Syncfusion ha completato il suo sort (che tocca
3638
3682
  // solo i 10 visibili, ma non è un problema perché noi riscriviamo
@@ -3710,14 +3754,13 @@ class SpreadsheetListSfComponent {
3710
3754
  return;
3711
3755
  // Mappa lettera colonna sheet → MetadatiColonna visibile
3712
3756
  const sheetColIdx = this.columnLetterToIndex(sheetColLetter);
3713
- const visibleMetaCols = (this.metaInfo.columnMetadata || []).filter(c => !c.mc_hide_in_edit);
3757
+ const visibleMetaCols = this.getVisibleMetaCols();
3714
3758
  const col = visibleMetaCols[sheetColIdx];
3715
3759
  if (!col)
3716
3760
  return;
3717
3761
  const fieldName = col.mc_nome_colonna;
3718
- const dir = order === 'Ascending' ? 'asc'
3719
- : order === 'Descending' ? 'desc'
3720
- : 'none';
3762
+ const descOrNone = order === 'Descending' ? 'desc' : 'none';
3763
+ const dir = order === 'Ascending' ? 'asc' : descOrNone;
3721
3764
  if (this.isServerSide) {
3722
3765
  // Delega al datasource: il WUIC backend legge `ds.sortInfo: SortInfo[]`
3723
3766
  // e applica ORDER BY nel SELECT generato da BuildDynamicSelectQuery.
@@ -3747,8 +3790,8 @@ class SpreadsheetListSfComponent {
3747
3790
  const av = a?.[fieldName];
3748
3791
  const bv = b?.[fieldName];
3749
3792
  // Unwrap BehaviorSubject
3750
- const aUnwrapped = (av && typeof av === 'object' && 'value' in av) ? av.value : av;
3751
- const bUnwrapped = (bv && typeof bv === 'object' && 'value' in bv) ? bv.value : bv;
3793
+ const aUnwrapped = (av && typeof av === 'object' && 'value' in av) ? (av).value : av;
3794
+ const bUnwrapped = (bv && typeof bv === 'object' && 'value' in bv) ? (bv).value : bv;
3752
3795
  // null/undefined vanno in fondo
3753
3796
  if (aUnwrapped == null && bUnwrapped == null)
3754
3797
  return 0;
@@ -3760,7 +3803,7 @@ class SpreadsheetListSfComponent {
3760
3803
  const aNum = Number(aUnwrapped);
3761
3804
  const bNum = Number(bUnwrapped);
3762
3805
  let cmp = 0;
3763
- if (!isNaN(aNum) && !isNaN(bNum) && `${aUnwrapped}`.trim() !== '' && `${bUnwrapped}`.trim() !== '') {
3806
+ if (!Number.isNaN(Number(aNum)) && !Number.isNaN(Number(bNum)) && `${aUnwrapped}`.trim() !== '' && `${bUnwrapped}`.trim() !== '') {
3764
3807
  cmp = aNum - bNum;
3765
3808
  }
3766
3809
  else {
@@ -3779,7 +3822,7 @@ class SpreadsheetListSfComponent {
3779
3822
  persistColumnWidth(sfColIdx, newWidth) {
3780
3823
  if (!this.metaInfo?.columnMetadata)
3781
3824
  return;
3782
- const visibleMetaCols = this.metaInfo.columnMetadata.filter(c => !c.mc_hide_in_edit);
3825
+ const visibleMetaCols = this.getVisibleMetaCols();
3783
3826
  const col = visibleMetaCols[sfColIdx];
3784
3827
  if (!col)
3785
3828
  return;
@@ -3858,7 +3901,7 @@ class SpreadsheetListSfComponent {
3858
3901
  const colIdx = args?.filterIndex?.colIndex ?? args?.colIndex;
3859
3902
  if (colIdx == null)
3860
3903
  return;
3861
- const visibleMetaCols = this.metaInfo.columnMetadata.filter(c => !c.mc_hide_in_edit);
3904
+ const visibleMetaCols = this.getVisibleMetaCols();
3862
3905
  const col = visibleMetaCols[colIdx];
3863
3906
  if (!col || col.mc_ui_column_type !== 'lookupByID')
3864
3907
  return;
@@ -3906,7 +3949,7 @@ class SpreadsheetListSfComponent {
3906
3949
  let idx = 0;
3907
3950
  const upper = letter.toUpperCase();
3908
3951
  for (let i = 0; i < upper.length; i++) {
3909
- idx = idx * 26 + (upper.charCodeAt(i) - 64);
3952
+ idx = idx * 26 + (upper.codePointAt(i) - 64);
3910
3953
  }
3911
3954
  return idx - 1;
3912
3955
  }
@@ -3957,7 +4000,7 @@ class SpreadsheetListSfComponent {
3957
4000
  }
3958
4001
  scheduleLayoutPass() {
3959
4002
  this.clearPendingLayoutPassTimeouts();
3960
- const handle = window.setTimeout(() => {
4003
+ const handle = globalThis.setTimeout(() => {
3961
4004
  try {
3962
4005
  this.sfSpreadsheet?.resize?.();
3963
4006
  }
@@ -3968,7 +4011,7 @@ class SpreadsheetListSfComponent {
3968
4011
  this.pendingLayoutPassTimeouts.push(handle);
3969
4012
  }
3970
4013
  clearPendingLayoutPassTimeouts() {
3971
- this.pendingLayoutPassTimeouts.forEach(id => window.clearTimeout(id));
4014
+ this.pendingLayoutPassTimeouts.forEach(id => globalThis.clearTimeout(id));
3972
4015
  this.pendingLayoutPassTimeouts = [];
3973
4016
  }
3974
4017
  onWindowResize() {
@@ -3999,18 +4042,14 @@ class SpreadsheetListSfComponent {
3999
4042
  * Indice 0-based; il caller mappa a column letter A/B/C tramite indexToColumnLetter().
4000
4043
  */
4001
4044
  getVisibleColumnNames() {
4002
- if (!this.metaInfo?.columnMetadata)
4003
- return [];
4004
- return this.metaInfo.columnMetadata
4005
- .filter(c => !c.mc_hide_in_edit)
4006
- .map(c => c.mc_nome_colonna || '');
4045
+ return this.getVisibleMetaCols().map(c => c.mc_nome_colonna || '');
4007
4046
  }
4008
4047
  /** Converte indice 0-based in letter A1-notation (0 → 'A', 25 → 'Z', 26 → 'AA'). */
4009
4048
  indexToColumnLetter(idx) {
4010
4049
  let s = '';
4011
4050
  let n = idx;
4012
4051
  while (n >= 0) {
4013
- s = String.fromCharCode(65 + (n % 26)) + s;
4052
+ s = String.fromCodePoint(65 + (n % 26)) + s;
4014
4053
  n = Math.floor(n / 26) - 1;
4015
4054
  }
4016
4055
  return s;
@@ -4058,7 +4097,7 @@ class SpreadsheetListSfComponent {
4058
4097
  for (let r = 0; r < rowCount; r++) {
4059
4098
  const sheetRow = rowOffset + r;
4060
4099
  // Sostituisci tutti i token {colName} con <colLetter><rowNumber>
4061
- const resolved = formulaTemplate.replace(/\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g, (_m, colName) => {
4100
+ const resolved = (formulaTemplate).replaceAll(/\{([a-zA-Z_]\w*)\}/g, (_m, colName) => {
4062
4101
  const letter = colIndex[colName];
4063
4102
  if (!letter) {
4064
4103
  console.warn(`[wuic-spreadsheet] formula token {${colName}} → column not visible, leaving as-is`);
@@ -4095,6 +4134,10 @@ class SpreadsheetListSfComponent {
4095
4134
  || this.metaInfo?.tableMetadata?.mdpropsbag
4096
4135
  || {};
4097
4136
  const arch = pb?.archetypes?.spreadsheet?.lock || {};
4137
+ const fallbackScopeFields = arch.primaryScopeField ? [arch.primaryScopeField] : [];
4138
+ const archHeartbeatSec = typeof arch.heartbeatIntervalSec === 'number' && arch.heartbeatIntervalSec > 0
4139
+ ? arch.heartbeatIntervalSec
4140
+ : 60;
4098
4141
  return {
4099
4142
  endpointBase: typeof arch.endpointBase === 'string' && arch.endpointBase.length > 0
4100
4143
  ? arch.endpointBase
@@ -4104,13 +4147,11 @@ class SpreadsheetListSfComponent {
4104
4147
  : null,
4105
4148
  requiredScopeFields: Array.isArray(arch.requiredScopeFields)
4106
4149
  ? arch.requiredScopeFields.filter((s) => typeof s === 'string')
4107
- : (arch.primaryScopeField ? [arch.primaryScopeField] : []),
4150
+ : fallbackScopeFields,
4108
4151
  autoEnableOnScope: arch.autoEnableOnScope === true,
4109
4152
  heartbeatIntervalSec: typeof this.heartbeatIntervalSec === 'number' && this.heartbeatIntervalSec > 0
4110
4153
  ? this.heartbeatIntervalSec
4111
- : (typeof arch.heartbeatIntervalSec === 'number' && arch.heartbeatIntervalSec > 0
4112
- ? arch.heartbeatIntervalSec
4113
- : 60),
4154
+ : archHeartbeatSec,
4114
4155
  };
4115
4156
  }
4116
4157
  /**
@@ -4287,7 +4328,7 @@ class SpreadsheetListSfComponent {
4287
4328
  }
4288
4329
  }
4289
4330
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SpreadsheetListSfComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.Title }, { token: i1$1.ActivatedRoute }, { token: i1$2.HttpClient }, { token: WtoolboxService }, { token: MetadataProviderService }, { token: UserInfoService }], target: i0.ɵɵFactoryTarget.Component });
4290
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SpreadsheetListSfComponent, isStandalone: true, selector: "wuic-spreadsheet-list-sf", inputs: { hardcodedRoute: "hardcodedRoute", parentRecord: "parentRecord", parentMetaInfo: "parentMetaInfo", datasource: "datasource", hardcodedDatasource: "hardcodedDatasource", hideToolbar: "hideToolbar", enableLockAwareness: "enableLockAwareness", lockScope: "lockScope", heartbeatIntervalSec: "heartbeatIntervalSec", showFormulaBar: "showFormulaBar", showRibbon: "showRibbon" }, outputs: { onSpreadsheetDataBound: "onSpreadsheetDataBound", onSpreadsheetBeforePageChange: "onSpreadsheetBeforePageChange", onSpreadsheetPageChange: "onSpreadsheetPageChange", onSpreadsheetRowInserted: "onSpreadsheetRowInserted", onSpreadsheetRowsDeleted: "onSpreadsheetRowsDeleted", onSpreadsheetBatchSaved: "onSpreadsheetBatchSaved", onLockAcquired: "onLockAcquired", onLockConflict: "onLockConflict", onLockReleased: "onLockReleased", onLockExpired: "onLockExpired" }, host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "sfSpreadsheet", first: true, predicate: ["sfSpreadsheet"], descendants: true }, { propertyName: "lookupSource", first: true, predicate: ["lookupSource"], descendants: true }], ngImport: i0, template: "<!--\n Layout root wrapper:\n 1. Toolbar WUIC custom (insert / save batch / export / refresh)\n 2. Syncfusion Spreadsheet host\n 3. Pagination custom (Syncfusion non ha pagination built-in, quindi la\n rendiamo sotto il foglio con nav + page-size dropdown)\n 4. Lookup datasource (invisibile, pattern identico al vecchio componente)\n-->\n\n<!-- Bootstrap CSS Syncfusion (~500 KiB): si monta solo quando questo\n componente lazy \u00E8 istanziato \u2192 CSS NON nel bundle iniziale globale,\n risparmia ~500 KiB su tutte le pagine che non aprono spreadsheet. -->\n<wuic-syncfusion-styles-bootstrap></wuic-syncfusion-styles-bootstrap>\n\n<div class=\"wuic-sf-spreadsheet-wrapper\">\n\n @if (!hideToolbar && metaInfo) {\n <!-- Stile allineato a <wuic-list-grid>: stessa caption-bar, stessi p-button\n PrimeNG con icona + label, stesso componente import/export. -->\n <div class=\"grid-caption-bar wuic-sf-caption-bar\" role=\"toolbar\" aria-label=\"Spreadsheet toolbar\">\n <div class=\"grid-caption-left\">\n @if (!metaInfo.tableMetadata.md_hide_refresh) {\n <p-button icon=\"pi pi-refresh\" label=\"{{'refresh_grid' | translate}}\"\n (onClick)=\"onToolbarRefresh()\" />\n }\n @if (canInsertRows()) {\n <p-button icon=\"pi pi-plus\" label=\"{{'add_grid' | translate}}\"\n (onClick)=\"onToolbarInsert()\" />\n }\n @if (!metaInfo.tableMetadata.md_hide_export_xls) {\n <!-- Include dialog con progress bar + bottoni \"Stoppa e salva\n parziale\" / \"Stoppa\" / \"Continua in background\". -->\n <wuic-import-export-button\n [routeName]=\"metaInfo.tableMetadata.md_route_name\"\n [tableMetadata]=\"metaInfo.tableMetadata\"\n [filterInfoProvider]=\"getCurrentFilterInfoForExport\"></wuic-import-export-button>\n }\n @if (isBatchSaveEnabled()) {\n <p-button icon=\"pi pi-save\" label=\"{{'list_grid.save_changes' | translate}}\"\n (onClick)=\"onToolbarSaveBatch()\" />\n }\n </div>\n </div>\n }\n\n <div class=\"wuic-sf-spreadsheet-host\">\n @if (metaInfo && sfSheets.length > 0) {\n <ejs-spreadsheet #sfSpreadsheet\n [sheets]=\"sfSheets\"\n [height]=\"sfHeight\"\n [width]=\"sfWidth\"\n [scrollSettings]=\"sfScrollSettings\"\n [showRibbon]=\"showRibbon\"\n [showFormulaBar]=\"showFormulaBar\"\n [showSheetTabs]=\"false\"\n [allowEditing]=\"true\"\n [allowSorting]=\"true\"\n [allowFiltering]=\"false\"\n [allowResizing]=\"true\"\n [allowInsert]=\"canInsertRows()\"\n [allowDelete]=\"canDeleteRows()\"\n [enableContextMenu]=\"true\"\n [enableKeyboardNavigation]=\"true\"\n [enableClipboard]=\"true\"\n (created)=\"onSyncfusionCreated()\"\n (dataBound)=\"onSyncfusionDataBound()\"\n (cellSave)=\"onSyncfusionCellSave($event)\"\n (beforeCellSave)=\"onSyncfusionBeforeCellSave($event)\"\n (beforeCellRender)=\"onSyncfusionBeforeCellRender($event)\"\n (cellEdit)=\"onSyncfusionCellEdit($event)\"\n (contextMenuBeforeOpen)=\"onSyncfusionContextMenuBeforeOpen($event)\"\n (contextMenuItemSelect)=\"onSyncfusionContextMenuItemSelect($event)\"\n (actionBegin)=\"onSyncfusionActionBegin($event)\"\n (actionComplete)=\"onSyncfusionActionComplete($event)\"\n (dialogBeforeOpen)=\"onSyncfusionDialogBeforeOpen($event)\">\n </ejs-spreadsheet>\n }\n </div>\n\n @if (totalPages > 1 || totalRecords > pageSize) {\n <div class=\"wuic-sf-pagination\" role=\"navigation\" aria-label=\"Paginazione\">\n <button type=\"button\" class=\"wuic-sf-page-btn\"\n [disabled]=\"pageIndex <= 1\"\n (click)=\"isServerSide ? handleServerPageChange(1, pageSize) : setClientPage(1)\"\n title=\"Prima pagina\">\n <i class=\"pi pi-angle-double-left\"></i>\n </button>\n <button type=\"button\" class=\"wuic-sf-page-btn\"\n [disabled]=\"pageIndex <= 1\"\n (click)=\"isServerSide ? handleServerPageChange(pageIndex - 1, pageSize) : setClientPage(pageIndex - 1)\"\n title=\"Pagina precedente\">\n <i class=\"pi pi-angle-left\"></i>\n </button>\n <span class=\"wuic-sf-page-info\">\n Pagina <strong>{{ pageIndex }}</strong> di <strong>{{ totalPages }}</strong>\n <span class=\"wuic-sf-page-total\">({{ totalRecords }} record)</span>\n </span>\n <button type=\"button\" class=\"wuic-sf-page-btn\"\n [disabled]=\"pageIndex >= totalPages\"\n (click)=\"isServerSide ? handleServerPageChange(pageIndex + 1, pageSize) : setClientPage(pageIndex + 1)\"\n title=\"Pagina successiva\">\n <i class=\"pi pi-angle-right\"></i>\n </button>\n <button type=\"button\" class=\"wuic-sf-page-btn\"\n [disabled]=\"pageIndex >= totalPages\"\n (click)=\"isServerSide ? handleServerPageChange(totalPages, pageSize) : setClientPage(totalPages)\"\n title=\"Ultima pagina\">\n <i class=\"pi pi-angle-double-right\"></i>\n </button>\n <select class=\"wuic-sf-page-size\" [value]=\"pageSize\"\n (change)=\"setPageSize($any($event.target).value)\"\n title=\"Record per pagina\">\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n </select>\n </div>\n }\n\n</div>\n\n@if (!hardcodedRoute) {\n <wuic-data-source #lookupSource [autoload]=\"true\" [routeFromRouting]=\"false\"\n [route]=\"currentRoute\" [parentRecord]=\"currentRecord\"\n [parentMetaInfo]=\"metaInfo\"></wuic-data-source>\n}\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}.wuic-sf-spreadsheet-wrapper{display:flex;flex-direction:column;width:100%;height:100%;min-height:0;overflow:hidden}.wuic-sf-caption-bar{flex:0 0 auto;padding:5px}.grid-caption-left{display:flex;align-items:stretch;gap:.5rem;flex-wrap:nowrap;min-height:2.25rem;height:2.25rem}.wuic-sf-spreadsheet-host{flex:1 1 auto;min-height:0;width:100%;position:relative;overflow:visible}::ng-deep .e-dialog.e-popup-open,::ng-deep .e-excelfilter,::ng-deep .e-filter-popup{z-index:10010!important;min-width:240px}::ng-deep .e-excelfilter .e-footer-content,::ng-deep .e-filter-popup .e-footer-content{display:flex!important;justify-content:flex-end;gap:6px;padding:8px 12px!important}.wuic-sf-spreadsheet-host ejs-spreadsheet{display:block;width:100%;height:100%}:host ::ng-deep .e-spreadsheet .e-column-header .e-header-cell.wuic-sf-colname-header .e-header-cell-div{font-weight:700!important;text-align:left!important;padding-left:6px!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wuic-sf-pagination{display:flex;gap:6px;align-items:center;justify-content:flex-end;padding:6px 10px;background-color:var(--wuic-surface-a, #ffffff);border-top:1px solid var(--wuic-surface-border, #e5e7eb);flex:0 0 auto;font-size:13px}.wuic-sf-page-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;padding:0;border:1px solid var(--wuic-surface-border, #e5e7eb);border-radius:4px;background:transparent;cursor:pointer;color:var(--wuic-text-color, #1f2937);transition:background-color .12s ease,border-color .12s ease}.wuic-sf-page-btn:hover:not(:disabled){background-color:var(--wuic-hover-bg, #f3f4f6);border-color:var(--wuic-primary-color, #6366f1)}.wuic-sf-page-btn:disabled{opacity:.35;cursor:not-allowed}.wuic-sf-page-info{margin:0 8px;white-space:nowrap;color:var(--wuic-text-muted, #6b7280)}.wuic-sf-page-info strong{color:var(--wuic-text-color, #1f2937)}.wuic-sf-page-total{margin-left:6px;font-size:12px;color:var(--wuic-text-muted, #6b7280)}.wuic-sf-page-size{margin-left:8px;height:30px;padding:0 8px;border:1px solid var(--wuic-surface-border, #e5e7eb);border-radius:4px;background:transparent;color:var(--wuic-text-color, #1f2937);cursor:pointer}:host-context(.theme-dark) .wuic-sf-pagination,:host-context([data-theme=\"dark\"]) .wuic-sf-pagination{background-color:var(--wuic-surface-a-dark, #1f2937);border-color:var(--wuic-surface-border-dark, #374151)}:host-context(.theme-dark) .wuic-sf-page-btn,:host-context([data-theme=\"dark\"]) .wuic-sf-page-btn,:host-context(.theme-dark) .wuic-sf-page-size,:host-context([data-theme=\"dark\"]) .wuic-sf-page-size{color:#f3f4f6;border-color:var(--wuic-surface-border-dark, #374151)}:host-context(.theme-dark) .wuic-sf-page-btn:hover:not(:disabled),:host-context([data-theme=\"dark\"]) .wuic-sf-page-btn:hover:not(:disabled){background-color:#374151}:host-context(.theme-dark) .wuic-sf-page-info,:host-context([data-theme=\"dark\"]) .wuic-sf-page-info{color:#9ca3af}:host-context(.theme-dark) .wuic-sf-page-info strong,:host-context([data-theme=\"dark\"]) .wuic-sf-page-info strong{color:#f3f4f6}:host-context(.theme-dark) .wuic-sf-page-total,:host-context([data-theme=\"dark\"]) .wuic-sf-page-total{color:#9ca3af}:host ::ng-deep .e-spreadsheet{font-family:var(--wuic-font-family, inherit)}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-column-header .e-header-cell.wuic-sf-colname-header{background-color:#111827!important;color:#e5e7eb!important}:host ::ng-deep .e-spreadsheet .e-sheet-content .e-filter-btn{opacity:0!important;pointer-events:none!important;width:0!important;height:0!important;min-width:0!important;padding:0!important;margin:0!important;overflow:hidden!important;position:absolute!important;right:0;top:0}:host ::ng-deep .e-spreadsheet .e-column-header .e-header-cell.wuic-sf-colname-header{position:relative!important}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-header-filter-btn{position:absolute;right:2px;top:50%;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;background:transparent;border:none;border-radius:3px;cursor:pointer;color:#475569;flex-shrink:0;transition:background-color .12s,color .12s;z-index:2}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-header-filter-btn:hover{background-color:#e2e8f0;color:#1f2937}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-header-filter-btn svg{display:block;pointer-events:none}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-header-filter-btn svg *{pointer-events:none!important}:host ::ng-deep .e-spreadsheet svg,:host ::ng-deep .e-spreadsheet svg *{pointer-events:none!important}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-header-filter-btn.wuic-filtered{color:#2563eb}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-colname-header .e-header-cell-div{padding-right:22px!important}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-column-header .wuic-sf-header-filter-btn{color:#cbd5e1}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-column-header .wuic-sf-header-filter-btn:hover{background-color:#334155;color:#f3f4f6}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-column-header .wuic-sf-header-filter-btn.wuic-filtered{color:#60a5fa}:host ::ng-deep .e-spreadsheet .e-sheet-panel{background-color:var(--wuic-surface-a, #ffffff)}:host-context(.theme-dark) ::ng-deep .e-spreadsheet,:host-context([data-theme=\"dark\"]) ::ng-deep .e-spreadsheet,:host ::ng-deep ejs-spreadsheet.wuic-sf-dark{background-color:var(--wuic-surface-a-dark, #1f2937);color:#f3f4f6}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-sheet-panel,:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-main-panel{background-color:var(--wuic-surface-a-dark, #1f2937);color:#f3f4f6}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-cell,:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-header-cell{background-color:var(--wuic-surface-a-dark, #1f2937);border-color:var(--wuic-surface-border-dark, #374151);color:#f3f4f6}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-header-row .e-header-cell,:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-row-header .e-header-cell{background-color:#111827!important;color:#e5e7eb!important}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-cell.row-danger{background-color:#7f1d1d!important;color:#fecaca!important}:host ::ng-deep .e-cell.row-danger{background-color:#fee2e2!important}:host ::ng-deep .e-cell.row-warning{background-color:#fef3c7!important}:host ::ng-deep .e-cell.row-success{background-color:#d1fae5!important}::ng-deep .wuic-sf-filter-popup{position:fixed;z-index:99999;min-width:260px;max-width:340px;background:#fff;color:#111827;border:1px solid #d1d5db;border-radius:6px;box-shadow:0 8px 24px #0000002e;font-family:inherit;font-size:13px;display:flex;flex-direction:column;overflow:hidden;-webkit-user-select:none;user-select:none}::ng-deep .wuic-sf-filter-popup-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:#f3f4f6;border-bottom:1px solid #e5e7eb;font-weight:600}::ng-deep .wuic-sf-filter-popup-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .wuic-sf-filter-popup-close{background:transparent;border:none;cursor:pointer;font-size:18px;line-height:1;padding:0 4px;color:#6b7280}::ng-deep .wuic-sf-filter-popup-close:hover{color:#111827}::ng-deep .wuic-sf-filter-popup-sort{display:flex;flex-direction:column;border-bottom:1px solid #e5e7eb}::ng-deep .wuic-sf-filter-popup-sort-btn{background:transparent;border:none;text-align:left;padding:6px 12px;cursor:pointer;font-size:13px;color:#111827;display:flex;align-items:center;gap:6px}::ng-deep .wuic-sf-filter-popup-sort-btn:hover{background:#f3f4f6}::ng-deep .wuic-sf-filter-popup-sort-icon{font-size:10px;color:#6b7280}::ng-deep .wuic-sf-filter-popup-clear{border-bottom:1px solid #e5e7eb}::ng-deep .wuic-sf-filter-popup-clear-btn{width:100%;background:transparent;border:none;text-align:left;padding:6px 12px;cursor:pointer;font-size:13px;color:#2563eb}::ng-deep .wuic-sf-filter-popup-clear-btn:hover:not(:disabled){background:#eff6ff}::ng-deep .wuic-sf-filter-popup-clear-btn:disabled{color:#9ca3af;cursor:not-allowed}::ng-deep .wuic-sf-filter-popup-search{padding:8px 12px;border-bottom:1px solid #e5e7eb}::ng-deep .wuic-sf-filter-popup-search-input{width:100%;padding:4px 8px;border:1px solid #d1d5db;border-radius:4px;font-size:13px;outline:none;box-sizing:border-box}::ng-deep .wuic-sf-filter-popup-search-input:focus{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb33}::ng-deep .wuic-sf-filter-popup-list-wrap{display:flex;flex-direction:column;max-height:260px;overflow:hidden}::ng-deep .wuic-sf-filter-popup-selectall{padding:4px 12px;border-bottom:1px solid #e5e7eb;background:#f9fafb;font-weight:500}::ng-deep .wuic-sf-filter-popup-list{flex:1 1 auto;overflow-y:auto;max-height:220px}::ng-deep .wuic-sf-filter-popup-item{display:flex;align-items:center;gap:6px;padding:4px 12px;cursor:pointer}::ng-deep .wuic-sf-filter-popup-item:hover{background:#f3f4f6}::ng-deep .wuic-sf-filter-popup-item input[type=checkbox]{margin:0;flex:0 0 auto}::ng-deep .wuic-sf-filter-popup-item span{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .wuic-sf-filter-popup-footer{display:flex;justify-content:flex-end;gap:8px;padding:8px 12px;border-top:1px solid #e5e7eb;background:#f9fafb}::ng-deep .wuic-sf-filter-popup-ok,::ng-deep .wuic-sf-filter-popup-cancel{padding:4px 14px;border:1px solid #d1d5db;border-radius:4px;background:#fff;cursor:pointer;font-size:13px}::ng-deep .wuic-sf-filter-popup-ok{background:#2563eb;color:#fff;border-color:#2563eb}::ng-deep .wuic-sf-filter-popup-ok:hover{background:#1d4ed8}::ng-deep .wuic-sf-filter-popup-cancel:hover{background:#f3f4f6}:host ::ng-deep .wuic-sf-header-filter-btn.wuic-sf-header-filter-btn--active{color:#2563eb}:host ::ng-deep .wuic-sf-header-filter-btn.wuic-sf-header-filter-btn--active svg{fill:#2563eb}::ng-deep .wuic-sf-filter-popup.wuic-sf-filter-popup--dark{background:#1f2937;color:#f3f4f6;border-color:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-header,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-footer,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-selectall{background:#111827;border-color:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-sort,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-clear,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-search{border-color:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-sort-btn,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-cancel{color:#f3f4f6;background:transparent;border-color:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-cancel{background:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-sort-btn:hover,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-item:hover,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-cancel:hover{background:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-search-input{background:#111827;color:#f3f4f6;border-color:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-close{color:#9ca3af}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-close:hover{color:#f3f4f6}::ng-deep .wuic-sf-cell-editor{box-sizing:border-box;padding:2px 6px;border:2px solid #2563eb;background:#fff;color:#111827;font-family:inherit;font-size:13px;outline:none;box-shadow:0 2px 8px #00000026;border-radius:2px}::ng-deep .wuic-sf-cell-editor:focus{border-color:#1d4ed8;box-shadow:0 0 0 2px #2563eb40}::ng-deep select.wuic-sf-cell-editor{cursor:pointer}::ng-deep .wuic-sf-cell-editor.wuic-sf-cell-editor--dark{background:#1f2937;color:#f3f4f6;border-color:#2563eb}::ng-deep .wuic-sf-cell-editor.wuic-sf-cell-editor--dark option{background:#1f2937;color:#f3f4f6}\n"], dependencies: [{ kind: "component", type: DataSourceComponent, selector: "wuic-data-source", inputs: ["route", "routeFromRouting", "hardcodedRoute", "autoload", "loading", "changeTracking", "parentRecord", "parentMetaInfo", "parentDatasource", "useComboEndpoint", "comboFormulaLookup", "comboMcId", "comboField", "comboExtraFields", "comboCurrentRecord", "componentRef"] }, { kind: "ngmodule", type: SpreadsheetModule }, { kind: "component", type: i7.SpreadsheetComponent, selector: "ejs-spreadsheet", inputs: ["activeSheetIndex", "allowAutoFill", "allowCellFormatting", "allowChart", "allowConditionalFormat", "allowDataValidation", "allowDelete", "allowEditing", "allowFiltering", "allowFindAndReplace", "allowFreezePane", "allowHyperlink", "allowImage", "allowInsert", "allowMerge", "allowNumberFormatting", "allowOpen", "allowPrint", "allowResizing", "allowSave", "allowScrolling", "allowSorting", "allowUndoRedo", "allowWrap", "author", "autoFillSettings", "calculationMode", "cellStyle", "cssClass", "currencyCode", "definedNames", "enableClipboard", "enableContextMenu", "enableKeyboardNavigation", "enableKeyboardShortcut", "enableNotes", "enablePersistence", "enableRtl", "height", "isProtected", "listSeparator", "locale", "openSettings", "openUrl", "password", "saveUrl", "scrollSettings", "selectionSettings", "sheets", "showAggregate", "showCommentsPane", "showFormulaBar", "showRibbon", "showSheetTabs", "width"], outputs: ["actionBegin", "actionComplete", "afterHyperlinkClick", "afterHyperlinkCreate", "beforeCellFormat", "beforeCellRender", "beforeCellSave", "beforeCellUpdate", "beforeConditionalFormat", "beforeDataBound", "beforeHyperlinkClick", "beforeHyperlinkCreate", "beforeOpen", "beforeSave", "beforeSelect", "beforeSort", "cellEdit", "cellEdited", "cellEditing", "cellSave", "contextMenuBeforeClose", "contextMenuBeforeOpen", "contextMenuItemSelect", "created", "dataBound", "dataSourceChanged", "dialogBeforeOpen", "fileMenuBeforeClose", "fileMenuBeforeOpen", "fileMenuItemSelect", "openComplete", "openFailure", "queryCellInfo", "saveComplete", "select", "sortComplete"] }, { kind: "component", type: ImportExportButtonComponent, selector: "wuic-import-export-button", inputs: ["routeName", "tableMetadata", "filterInfoProvider"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: SyncfusionStylesBootstrapComponent, selector: "wuic-syncfusion-styles-bootstrap" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
4331
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: SpreadsheetListSfComponent, isStandalone: true, selector: "wuic-spreadsheet-list-sf", inputs: { hardcodedRoute: "hardcodedRoute", parentRecord: "parentRecord", parentMetaInfo: "parentMetaInfo", datasource: "datasource", hardcodedDatasource: "hardcodedDatasource", hideToolbar: "hideToolbar", enableLockAwareness: "enableLockAwareness", lockScope: "lockScope", heartbeatIntervalSec: "heartbeatIntervalSec", showFormulaBar: "showFormulaBar", showRibbon: "showRibbon" }, outputs: { onSpreadsheetDataBound: "onSpreadsheetDataBound", onSpreadsheetBeforePageChange: "onSpreadsheetBeforePageChange", onSpreadsheetPageChange: "onSpreadsheetPageChange", onSpreadsheetRowInserted: "onSpreadsheetRowInserted", onSpreadsheetRowsDeleted: "onSpreadsheetRowsDeleted", onSpreadsheetBatchSaved: "onSpreadsheetBatchSaved", onLockAcquired: "onLockAcquired", onLockConflict: "onLockConflict", onLockReleased: "onLockReleased", onLockExpired: "onLockExpired" }, host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "sfSpreadsheet", first: true, predicate: ["sfSpreadsheet"], descendants: true }, { propertyName: "lookupSource", first: true, predicate: ["lookupSource"], descendants: true }], ngImport: i0, template: "<!--\n Layout root wrapper:\n 1. Toolbar WUIC custom (insert / save batch / export / refresh)\n 2. Syncfusion Spreadsheet host\n 3. Pagination custom (Syncfusion non ha pagination built-in, quindi la\n rendiamo sotto il foglio con nav + page-size dropdown)\n 4. Lookup datasource (invisibile, pattern identico al vecchio componente)\n-->\n\n<!-- Bootstrap CSS Syncfusion (~500 KiB): si monta solo quando questo\n componente lazy \u00E8 istanziato \u2192 CSS NON nel bundle iniziale globale,\n risparmia ~500 KiB su tutte le pagine che non aprono spreadsheet. -->\n<wuic-syncfusion-styles-bootstrap></wuic-syncfusion-styles-bootstrap>\n\n<div class=\"wuic-sf-spreadsheet-wrapper\">\n\n @if (!hideToolbar && metaInfo) {\n <!-- Stile allineato a <wuic-list-grid>: stessa caption-bar, stessi p-button\n PrimeNG con icona + label, stesso componente import/export. -->\n <div class=\"grid-caption-bar wuic-sf-caption-bar\" role=\"toolbar\" aria-label=\"Spreadsheet toolbar\">\n <div class=\"grid-caption-left\">\n @if (!metaInfo.tableMetadata.md_hide_refresh) {\n <p-button icon=\"pi pi-refresh\" label=\"{{'refresh_grid' | translate}}\"\n (onClick)=\"onToolbarRefresh()\" />\n }\n @if (canInsertRows()) {\n <p-button icon=\"pi pi-plus\" label=\"{{'add_grid' | translate}}\"\n (onClick)=\"onToolbarInsert()\" />\n }\n @if (!metaInfo.tableMetadata.md_hide_export_xls) {\n <!-- Include dialog con progress bar + bottoni \"Stoppa e salva\n parziale\" / \"Stoppa\" / \"Continua in background\". -->\n <wuic-import-export-button\n [routeName]=\"metaInfo.tableMetadata.md_route_name\"\n [tableMetadata]=\"metaInfo.tableMetadata\"\n [filterInfoProvider]=\"getCurrentFilterInfoForExport\"></wuic-import-export-button>\n }\n @if (isBatchSaveEnabled()) {\n <p-button icon=\"pi pi-save\" label=\"{{'list_grid.save_changes' | translate}}\"\n (onClick)=\"onToolbarSaveBatch()\" />\n }\n </div>\n </div>\n }\n\n <div class=\"wuic-sf-spreadsheet-host\">\n @if (metaInfo && sfSheets.length > 0) {\n <ejs-spreadsheet #sfSpreadsheet\n [sheets]=\"sfSheets\"\n [height]=\"sfHeight\"\n [width]=\"sfWidth\"\n [scrollSettings]=\"sfScrollSettings\"\n [showRibbon]=\"showRibbon\"\n [showFormulaBar]=\"showFormulaBar\"\n [showSheetTabs]=\"false\"\n [allowEditing]=\"true\"\n [allowSorting]=\"true\"\n [allowFiltering]=\"false\"\n [allowResizing]=\"true\"\n [allowInsert]=\"canInsertRows()\"\n [allowDelete]=\"canDeleteRows()\"\n [enableContextMenu]=\"true\"\n [enableKeyboardNavigation]=\"true\"\n [enableClipboard]=\"true\"\n (created)=\"onSyncfusionCreated()\"\n (dataBound)=\"onSyncfusionDataBound()\"\n (cellSave)=\"onSyncfusionCellSave($event)\"\n (beforeCellSave)=\"onSyncfusionBeforeCellSave($event)\"\n (beforeCellRender)=\"onSyncfusionBeforeCellRender($event)\"\n (cellEdit)=\"onSyncfusionCellEdit($event)\"\n (contextMenuBeforeOpen)=\"onSyncfusionContextMenuBeforeOpen($event)\"\n (contextMenuItemSelect)=\"onSyncfusionContextMenuItemSelect($event)\"\n (actionBegin)=\"onSyncfusionActionBegin($event)\"\n (actionComplete)=\"onSyncfusionActionComplete($event)\"\n (dialogBeforeOpen)=\"onSyncfusionDialogBeforeOpen($event)\">\n </ejs-spreadsheet>\n }\n </div>\n\n @if (totalPages > 1 || totalRecords > pageSize) {\n <div class=\"wuic-sf-pagination\" role=\"navigation\" aria-label=\"Paginazione\">\n <button type=\"button\" class=\"wuic-sf-page-btn\"\n [disabled]=\"pageIndex <= 1\"\n (click)=\"isServerSide ? handleServerPageChange(1, pageSize) : setClientPage(1)\"\n title=\"Prima pagina\">\n <i class=\"pi pi-angle-double-left\"></i>\n </button>\n <button type=\"button\" class=\"wuic-sf-page-btn\"\n [disabled]=\"pageIndex <= 1\"\n (click)=\"isServerSide ? handleServerPageChange(pageIndex - 1, pageSize) : setClientPage(pageIndex - 1)\"\n title=\"Pagina precedente\">\n <i class=\"pi pi-angle-left\"></i>\n </button>\n <span class=\"wuic-sf-page-info\">\n Pagina <strong>{{ pageIndex }}</strong> di <strong>{{ totalPages }}</strong>\n <span class=\"wuic-sf-page-total\">({{ totalRecords }} record)</span>\n </span>\n <button type=\"button\" class=\"wuic-sf-page-btn\"\n [disabled]=\"pageIndex >= totalPages\"\n (click)=\"isServerSide ? handleServerPageChange(pageIndex + 1, pageSize) : setClientPage(pageIndex + 1)\"\n title=\"Pagina successiva\">\n <i class=\"pi pi-angle-right\"></i>\n </button>\n <button type=\"button\" class=\"wuic-sf-page-btn\"\n [disabled]=\"pageIndex >= totalPages\"\n (click)=\"isServerSide ? handleServerPageChange(totalPages, pageSize) : setClientPage(totalPages)\"\n title=\"Ultima pagina\">\n <i class=\"pi pi-angle-double-right\"></i>\n </button>\n <select class=\"wuic-sf-page-size\" [value]=\"pageSize\"\n (change)=\"setPageSize($any($event.target).value)\"\n title=\"Record per pagina\">\n <option [value]=\"10\">10</option>\n <option [value]=\"25\">25</option>\n <option [value]=\"50\">50</option>\n <option [value]=\"100\">100</option>\n </select>\n </div>\n }\n\n</div>\n\n@if (!hardcodedRoute) {\n <wuic-data-source #lookupSource [autoload]=\"true\" [routeFromRouting]=\"false\"\n [route]=\"currentRoute\" [parentRecord]=\"currentRecord\"\n [parentMetaInfo]=\"metaInfo\"></wuic-data-source>\n}\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}.wuic-sf-spreadsheet-wrapper{display:flex;flex-direction:column;width:100%;height:100%;min-height:0;overflow:hidden}.wuic-sf-caption-bar{flex:0 0 auto;padding:5px}.grid-caption-left{display:flex;align-items:stretch;gap:.5rem;flex-wrap:nowrap;min-height:2.25rem;height:2.25rem}.wuic-sf-spreadsheet-host{flex:1 1 auto;min-height:0;width:100%;position:relative;overflow:visible}::ng-deep .e-dialog.e-popup-open,::ng-deep .e-excelfilter,::ng-deep .e-filter-popup{z-index:10010!important;min-width:240px}::ng-deep .e-excelfilter .e-footer-content,::ng-deep .e-filter-popup .e-footer-content{display:flex!important;justify-content:flex-end;gap:6px;padding:8px 12px!important}.wuic-sf-spreadsheet-host ejs-spreadsheet{display:block;width:100%;height:100%}:host ::ng-deep .e-spreadsheet .e-column-header .e-header-cell.wuic-sf-colname-header .e-header-cell-div{font-weight:700!important;text-align:left!important;padding-left:6px!important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wuic-sf-pagination{display:flex;gap:6px;align-items:center;justify-content:flex-end;padding:6px 10px;background-color:var(--wuic-surface-a, #ffffff);border-top:1px solid var(--wuic-surface-border, #e5e7eb);flex:0 0 auto;font-size:13px}.wuic-sf-page-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;padding:0;border:1px solid var(--wuic-surface-border, #e5e7eb);border-radius:4px;background:transparent;cursor:pointer;color:var(--wuic-text-color, #1f2937);transition:background-color .12s ease,border-color .12s ease}.wuic-sf-page-btn:hover:not(:disabled){background-color:var(--wuic-hover-bg, #f3f4f6);border-color:var(--wuic-primary-color, #6366f1)}.wuic-sf-page-btn:disabled{opacity:.35;cursor:not-allowed}.wuic-sf-page-info{margin:0 8px;white-space:nowrap;color:var(--wuic-text-muted, #6b7280)}.wuic-sf-page-info strong{color:var(--wuic-text-color, #1f2937)}.wuic-sf-page-total{margin-left:6px;font-size:12px;color:var(--wuic-text-muted, #6b7280)}.wuic-sf-page-size{margin-left:8px;height:30px;padding:0 8px;border:1px solid var(--wuic-surface-border, #e5e7eb);border-radius:4px;background:transparent;color:var(--wuic-text-color, #1f2937);cursor:pointer}:host-context(.theme-dark) .wuic-sf-pagination,:host-context([data-theme=\"dark\"]) .wuic-sf-pagination{background-color:var(--wuic-surface-a-dark, #1f2937);border-color:var(--wuic-surface-border-dark, #374151)}:host-context(.theme-dark) .wuic-sf-page-btn,:host-context([data-theme=\"dark\"]) .wuic-sf-page-btn,:host-context(.theme-dark) .wuic-sf-page-size,:host-context([data-theme=\"dark\"]) .wuic-sf-page-size{color:#f3f4f6;border-color:var(--wuic-surface-border-dark, #374151)}:host-context(.theme-dark) .wuic-sf-page-btn:hover:not(:disabled),:host-context([data-theme=\"dark\"]) .wuic-sf-page-btn:hover:not(:disabled){background-color:#374151}:host-context(.theme-dark) .wuic-sf-page-info,:host-context([data-theme=\"dark\"]) .wuic-sf-page-info{color:#9ca3af}:host-context(.theme-dark) .wuic-sf-page-info strong,:host-context([data-theme=\"dark\"]) .wuic-sf-page-info strong{color:#f3f4f6}:host-context(.theme-dark) .wuic-sf-page-total,:host-context([data-theme=\"dark\"]) .wuic-sf-page-total{color:#9ca3af}:host ::ng-deep .e-spreadsheet{font-family:var(--wuic-font-family, inherit)}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-column-header .e-header-cell.wuic-sf-colname-header{background-color:#111827!important;color:#e5e7eb!important}:host ::ng-deep .e-spreadsheet .e-sheet-content .e-filter-btn{opacity:0!important;pointer-events:none!important;width:0!important;height:0!important;min-width:0!important;padding:0!important;margin:0!important;overflow:hidden!important;position:absolute!important;right:0;top:0}:host ::ng-deep .e-spreadsheet .e-column-header .e-header-cell.wuic-sf-colname-header{position:relative!important}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-header-filter-btn{position:absolute;right:2px;top:50%;transform:translateY(-50%);display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;background:transparent;border:none;border-radius:3px;cursor:pointer;color:#475569;flex-shrink:0;transition:background-color .12s,color .12s;z-index:2}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-header-filter-btn:hover{background-color:#e2e8f0;color:#1f2937}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-header-filter-btn svg{display:block;pointer-events:none}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-header-filter-btn svg *{pointer-events:none!important}:host ::ng-deep .e-spreadsheet svg,:host ::ng-deep .e-spreadsheet svg *{pointer-events:none!important}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-header-filter-btn.wuic-filtered{color:#2563eb}:host ::ng-deep .e-spreadsheet .e-column-header .wuic-sf-colname-header .e-header-cell-div{padding-right:22px!important}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-column-header .wuic-sf-header-filter-btn{color:#cbd5e1}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-column-header .wuic-sf-header-filter-btn:hover{background-color:#334155;color:#f3f4f6}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-column-header .wuic-sf-header-filter-btn.wuic-filtered{color:#60a5fa}:host ::ng-deep .e-spreadsheet .e-sheet-panel{background-color:var(--wuic-surface-a, #ffffff)}:host-context(.theme-dark) ::ng-deep .e-spreadsheet,:host-context([data-theme=\"dark\"]) ::ng-deep .e-spreadsheet,:host ::ng-deep ejs-spreadsheet.wuic-sf-dark{background-color:var(--wuic-surface-a-dark, #1f2937);color:#f3f4f6}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-sheet-panel,:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-main-panel{background-color:var(--wuic-surface-a-dark, #1f2937);color:#f3f4f6}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-cell,:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-header-cell{background-color:var(--wuic-surface-a-dark, #1f2937);border-color:var(--wuic-surface-border-dark, #374151);color:#f3f4f6}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-header-row .e-header-cell,:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-row-header .e-header-cell{background-color:#111827!important;color:#e5e7eb!important}:host ::ng-deep ejs-spreadsheet.wuic-sf-dark .e-cell.row-danger{background-color:#7f1d1d!important;color:#fecaca!important}:host ::ng-deep .e-cell.row-danger{background-color:#fee2e2!important}:host ::ng-deep .e-cell.row-warning{background-color:#fef3c7!important}:host ::ng-deep .e-cell.row-success{background-color:#d1fae5!important}::ng-deep .wuic-sf-filter-popup{position:fixed;z-index:99999;min-width:260px;max-width:340px;background:#fff;color:#111827;border:1px solid #d1d5db;border-radius:6px;box-shadow:0 8px 24px #0000002e;font-family:inherit;font-size:13px;display:flex;flex-direction:column;overflow:hidden;-webkit-user-select:none;user-select:none}::ng-deep .wuic-sf-filter-popup-header{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:#f3f4f6;border-bottom:1px solid #e5e7eb;font-weight:600}::ng-deep .wuic-sf-filter-popup-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .wuic-sf-filter-popup-close{background:transparent;border:none;cursor:pointer;font-size:18px;line-height:1;padding:0 4px;color:#6b7280}::ng-deep .wuic-sf-filter-popup-close:hover{color:#111827}::ng-deep .wuic-sf-filter-popup-sort{display:flex;flex-direction:column;border-bottom:1px solid #e5e7eb}::ng-deep .wuic-sf-filter-popup-sort-btn{background:transparent;border:none;text-align:left;padding:6px 12px;cursor:pointer;font-size:13px;color:#111827;display:flex;align-items:center;gap:6px}::ng-deep .wuic-sf-filter-popup-sort-btn:hover{background:#f3f4f6}::ng-deep .wuic-sf-filter-popup-sort-icon{font-size:10px;color:#6b7280}::ng-deep .wuic-sf-filter-popup-clear{border-bottom:1px solid #e5e7eb}::ng-deep .wuic-sf-filter-popup-clear-btn{width:100%;background:transparent;border:none;text-align:left;padding:6px 12px;cursor:pointer;font-size:13px;color:#2563eb}::ng-deep .wuic-sf-filter-popup-clear-btn:hover:not(:disabled){background:#eff6ff}::ng-deep .wuic-sf-filter-popup-clear-btn:disabled{color:#9ca3af;cursor:not-allowed}::ng-deep .wuic-sf-filter-popup-search{padding:8px 12px;border-bottom:1px solid #e5e7eb}::ng-deep .wuic-sf-filter-popup-search-input{width:100%;padding:4px 8px;border:1px solid #d1d5db;border-radius:4px;font-size:13px;outline:none;box-sizing:border-box}::ng-deep .wuic-sf-filter-popup-search-input:focus{border-color:#2563eb;box-shadow:0 0 0 2px #2563eb33}::ng-deep .wuic-sf-filter-popup-list-wrap{display:flex;flex-direction:column;max-height:260px;overflow:hidden}::ng-deep .wuic-sf-filter-popup-selectall{padding:4px 12px;border-bottom:1px solid #e5e7eb;background:#f9fafb;font-weight:500}::ng-deep .wuic-sf-filter-popup-list{flex:1 1 auto;overflow-y:auto;max-height:220px}::ng-deep .wuic-sf-filter-popup-item{display:flex;align-items:center;gap:6px;padding:4px 12px;cursor:pointer}::ng-deep .wuic-sf-filter-popup-item:hover{background:#f3f4f6}::ng-deep .wuic-sf-filter-popup-item input[type=checkbox]{margin:0;flex:0 0 auto}::ng-deep .wuic-sf-filter-popup-item span{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .wuic-sf-filter-popup-footer{display:flex;justify-content:flex-end;gap:8px;padding:8px 12px;border-top:1px solid #e5e7eb;background:#f9fafb}::ng-deep .wuic-sf-filter-popup-ok,::ng-deep .wuic-sf-filter-popup-cancel{padding:4px 14px;border:1px solid #d1d5db;border-radius:4px;background:#fff;cursor:pointer;font-size:13px}::ng-deep .wuic-sf-filter-popup-ok{background:#2563eb;color:#fff;border-color:#2563eb}::ng-deep .wuic-sf-filter-popup-ok:hover{background:#1d4ed8}::ng-deep .wuic-sf-filter-popup-cancel:hover{background:#f3f4f6}:host ::ng-deep .wuic-sf-header-filter-btn.wuic-sf-header-filter-btn--active{color:#2563eb}:host ::ng-deep .wuic-sf-header-filter-btn.wuic-sf-header-filter-btn--active svg{fill:#2563eb}::ng-deep .wuic-sf-filter-popup.wuic-sf-filter-popup--dark{background:#1f2937;color:#f3f4f6;border-color:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-header,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-footer,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-selectall{background:#111827;border-color:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-sort,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-clear,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-search{border-color:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-sort-btn,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-cancel{color:#f3f4f6;background:transparent;border-color:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-cancel{background:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-sort-btn:hover,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-item:hover,::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-cancel:hover{background:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-search-input{background:#111827;color:#f3f4f6;border-color:#374151}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-close{color:#9ca3af}::ng-deep .wuic-sf-filter-popup--dark .wuic-sf-filter-popup-close:hover{color:#f3f4f6}::ng-deep .wuic-sf-cell-editor{box-sizing:border-box;padding:2px 6px;border:2px solid #2563eb;background:#fff;color:#111827;font-family:inherit;font-size:13px;outline:none;box-shadow:0 2px 8px #00000026;border-radius:2px}::ng-deep .wuic-sf-cell-editor:focus{border-color:#1d4ed8;box-shadow:0 0 0 2px #2563eb40}::ng-deep select.wuic-sf-cell-editor{cursor:pointer}::ng-deep .wuic-sf-cell-editor.wuic-sf-cell-editor--dark{background:#1f2937;color:#f3f4f6;border-color:#2563eb}::ng-deep .wuic-sf-cell-editor.wuic-sf-cell-editor--dark option{background:#1f2937;color:#f3f4f6}\n"], dependencies: [{ kind: "component", type: DataSourceComponent, selector: "wuic-data-source", inputs: ["route", "routeFromRouting", "hardcodedRoute", "autoload", "loading", "changeTracking", "parentRecord", "parentMetaInfo", "parentDatasource", "useComboEndpoint", "comboFormulaLookup", "comboMcId", "comboField", "comboExtraFields", "comboCurrentRecord", "componentRef"] }, { kind: "ngmodule", type: SpreadsheetModule }, { kind: "component", type: i7.SpreadsheetComponent, selector: "ejs-spreadsheet", inputs: ["activeSheetIndex", "allowAutoFill", "allowCellFormatting", "allowChart", "allowConditionalFormat", "allowDataValidation", "allowDelete", "allowEditing", "allowFiltering", "allowFindAndReplace", "allowFreezePane", "allowHyperlink", "allowImage", "allowInsert", "allowMerge", "allowNumberFormatting", "allowOpen", "allowPrint", "allowResizing", "allowSave", "allowScrolling", "allowSorting", "allowUndoRedo", "allowWrap", "author", "autoFillSettings", "calculationMode", "cellStyle", "cssClass", "currencyCode", "definedNames", "enableClipboard", "enableContextMenu", "enableKeyboardNavigation", "enableKeyboardShortcut", "enableNotes", "enablePersistence", "enableRtl", "height", "isProtected", "listSeparator", "locale", "openSettings", "openUrl", "password", "saveUrl", "scrollSettings", "selectionSettings", "sheets", "showAggregate", "showCommentsPane", "showFormulaBar", "showRibbon", "showSheetTabs", "width"], outputs: ["actionBegin", "actionComplete", "afterHyperlinkClick", "afterHyperlinkCreate", "beforeCellFormat", "beforeCellRender", "beforeCellSave", "beforeCellUpdate", "beforeConditionalFormat", "beforeDataBound", "beforeHyperlinkClick", "beforeHyperlinkCreate", "beforeOpen", "beforeSave", "beforeSelect", "beforeSort", "cellEdit", "cellEdited", "cellEditing", "cellSave", "contextMenuBeforeClose", "contextMenuBeforeOpen", "contextMenuItemSelect", "created", "dataBound", "dataSourceChanged", "dialogBeforeOpen", "fileMenuBeforeClose", "fileMenuBeforeOpen", "fileMenuItemSelect", "openComplete", "openFailure", "queryCellInfo", "saveComplete", "select", "sortComplete"] }, { kind: "component", type: ImportExportButtonComponent, selector: "wuic-import-export-button", inputs: ["routeName", "tableMetadata", "filterInfoProvider"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: SyncfusionStylesBootstrapComponent, selector: "wuic-syncfusion-styles-bootstrap" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
4291
4332
  }
4292
4333
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SpreadsheetListSfComponent, decorators: [{
4293
4334
  type: Component,
@@ -4353,4 +4394,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
4353
4394
  }] } });
4354
4395
 
4355
4396
  export { SpreadsheetListSfComponent };
4356
- //# sourceMappingURL=wuic-framework-lib-spreadsheet-list-sf.component-CrS6fOGj.mjs.map
4397
+ //# sourceMappingURL=wuic-framework-lib-spreadsheet-list-sf.component-C1U7JPiq.mjs.map