wuic-framework-lib 1.7.1 → 1.7.3

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 (23) hide show
  1. package/fesm2022/{wuic-framework-lib-chart-list.component-Dq9IEKsY.mjs → wuic-framework-lib-chart-list.component-B7d2AQ3G.mjs} +4 -4
  2. package/fesm2022/{wuic-framework-lib-code-editor.component-B6IpTSo8.mjs → wuic-framework-lib-code-editor.component-Bx_fV1X1.mjs} +6 -6
  3. package/fesm2022/{wuic-framework-lib-designer.component-D6cbqNFg.mjs → wuic-framework-lib-designer.component-CohHkalb.mjs} +12 -12
  4. package/fesm2022/{wuic-framework-lib-first-run-wizard.component-D1ZQUl-q.mjs → wuic-framework-lib-first-run-wizard.component-BoP77ip9.mjs} +2 -2
  5. package/fesm2022/{wuic-framework-lib-framework-docs.component-C_o5r7pg.mjs → wuic-framework-lib-framework-docs.component-CcyeNUzz.mjs} +10 -10
  6. package/fesm2022/{wuic-framework-lib-pivot-builder.component-DkWGzJpr.mjs → wuic-framework-lib-pivot-builder.component-BUkGGFaw.mjs} +164 -164
  7. package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-D29go5yA.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-DPapKCIE.mjs} +28 -28
  8. package/fesm2022/{wuic-framework-lib-report-designer.component-DcpCWghx.mjs → wuic-framework-lib-report-designer.component-A6_tmp6z.mjs} +2 -2
  9. package/fesm2022/{wuic-framework-lib-report-scaffold-dialog.component-CgUjG7Bi.mjs → wuic-framework-lib-report-scaffold-dialog.component-Dbrx9bSq.mjs} +246 -246
  10. package/fesm2022/{wuic-framework-lib-report-viewer.component-C4Opgl_M.mjs → wuic-framework-lib-report-viewer.component-CYl77DcU.mjs} +4 -4
  11. package/fesm2022/{wuic-framework-lib-scene3d-designer.component-8l3vsyEb.mjs → wuic-framework-lib-scene3d-designer.component-DyVwOmXa.mjs} +20 -20
  12. package/fesm2022/{wuic-framework-lib-scene3d-light-baker-gpu-C1w-8Aai.mjs → wuic-framework-lib-scene3d-light-baker-gpu-DEGIR8lh.mjs} +2 -2
  13. package/fesm2022/{wuic-framework-lib-scene3d-shader-effect-DjHyCAFK.mjs → wuic-framework-lib-scene3d-shader-effect-gBEFKNvi.mjs} +18 -18
  14. package/fesm2022/{wuic-framework-lib-scene3d-viewer.component-nMSl5jbe.mjs → wuic-framework-lib-scene3d-viewer.component-G_ykpDDF.mjs} +5 -5
  15. package/fesm2022/{wuic-framework-lib-scheduler-list.component-Cvk3Zg0Q.mjs → wuic-framework-lib-scheduler-list.component-C_1YjS3c.mjs} +4 -4
  16. package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-C1U7JPiq.mjs → wuic-framework-lib-spreadsheet-list-sf.component-BKtu4edX.mjs} +47 -47
  17. package/fesm2022/{wuic-framework-lib-timeline-list.component-cZbPgNh1.mjs → wuic-framework-lib-timeline-list.component-Dcosb8Zx.mjs} +6 -6
  18. package/fesm2022/{wuic-framework-lib-workflow-designer.component-C_4RQGa0.mjs → wuic-framework-lib-workflow-designer.component-BXnoS_ts.mjs} +6 -6
  19. package/fesm2022/{wuic-framework-lib-wuic-framework-lib-BZZwta8b.mjs → wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs} +838 -823
  20. package/fesm2022/wuic-framework-lib.mjs +1 -1
  21. package/package.json +1 -1
  22. package/styles/_wuic-tokens.scss +82 -82
  23. package/types/wuic-framework-lib.d.ts +15 -2
@@ -1,5 +1,5 @@
1
1
  import * as THREE from 'three';
2
- import { i as isBakeableMesh, W as WUIC_BAKED_FLAG } from './wuic-framework-lib-scene3d-designer.component-8l3vsyEb.mjs';
2
+ import { i as isBakeableMesh, W as WUIC_BAKED_FLAG } from './wuic-framework-lib-scene3d-designer.component-DyVwOmXa.mjs';
3
3
 
4
4
  /**
5
5
  * Lightmap baking su COMPUTE SHADER (WebGPU) — stessa semantica del baker CPU
@@ -300,4 +300,4 @@ function applyBakeResults(ranges, packedColors) {
300
300
  }
301
301
 
302
302
  export { bakeVertexLightingGpu };
303
- //# sourceMappingURL=wuic-framework-lib-scene3d-light-baker-gpu-C1w-8Aai.mjs.map
303
+ //# sourceMappingURL=wuic-framework-lib-scene3d-light-baker-gpu-DEGIR8lh.mjs.map
@@ -2674,15 +2674,15 @@ function buildEffectShaderMaterial(effect) {
2674
2674
  const displaceLine = effect.displacement && amp > 0
2675
2675
  ? `p += normal * (${fnum(amp)} * sin(position.y * ${fnum(freq)} + uTime * ${fnum(dspd)}));`
2676
2676
  : '';
2677
- const vertexShader = `varying vec2 vUv;
2678
- varying vec3 vNormal;
2679
- uniform float uTime;
2680
- void main() {
2681
- vUv = uv;
2682
- vNormal = normalize(normalMatrix * normal);
2683
- vec3 p = position;
2684
- ${displaceLine}
2685
- gl_Position = projectionMatrix * modelViewMatrix * vec4(p, 1.0);
2677
+ const vertexShader = `varying vec2 vUv;
2678
+ varying vec3 vNormal;
2679
+ uniform float uTime;
2680
+ void main() {
2681
+ vUv = uv;
2682
+ vNormal = normalize(normalMatrix * normal);
2683
+ vec3 p = position;
2684
+ ${displaceLine}
2685
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(p, 1.0);
2686
2686
  }`;
2687
2687
  const pMin = Number(effect.pulse?.min ?? 0.5);
2688
2688
  const pMax = Number(effect.pulse?.max ?? 1);
@@ -2711,14 +2711,14 @@ void main() {
2711
2711
  ? `float light = ${fnum(ambient)} + ${fnum(1 - ambient)} * max(dot(vNormal, normalize(vec3(${fnum(dir[0])}, ${fnum(dir[1])}, ${fnum(dir[2])}))), 0.0);`
2712
2712
  : 'float light = 1.0;';
2713
2713
  const opacity = Number(effect.opacity ?? 1);
2714
- const fragmentShader = `uniform float uTime;
2715
- varying vec2 vUv;
2716
- varying vec3 vNormal;
2717
- void main() {
2718
- ${factorLine}
2719
- ${baseLine}
2720
- ${lightLine}
2721
- gl_FragColor = vec4(base * light, ${fnum(opacity)});
2714
+ const fragmentShader = `uniform float uTime;
2715
+ varying vec2 vUv;
2716
+ varying vec3 vNormal;
2717
+ void main() {
2718
+ ${factorLine}
2719
+ ${baseLine}
2720
+ ${lightLine}
2721
+ gl_FragColor = vec4(base * light, ${fnum(opacity)});
2722
2722
  }`;
2723
2723
  const material = new THREE.ShaderMaterial({
2724
2724
  uniforms: { uTime: { value: 0 } },
@@ -2804,4 +2804,4 @@ function swapNodeEffectMaterialsForSerialization(root) {
2804
2804
  }
2805
2805
 
2806
2806
  export { buildUploadTextureResolver as A, applyRepeaterTextureTo as B, CarouselController as C, defaultRepeaterTextureApply as D, regenerateRepeater as E, getPhysicsDef as F, createPhysicsWorld as G, WUIC_PHYSICS_KEY as H, WUIC_OBJECT_TYPE_KEY as I, carouselArrowDir as J, WUIC_REPEATER_RECORD as K, runRepeaterCallback as L, closeItemPopup as M, showItemPopup as N, WUIC_BINDING_KEY as O, swapNodeEffectMaterialsForSerialization as P, serializeScene as Q, deserializeScene as R, SCENE3D_SHADER_EFFECT_DEFAULT as S, WUIC_TRANSIENT_FLAG as W, defaultRepeaterAxisDir as a, defaultCarouselConfig as b, defaultChartConfig as c, defaultMeshRepeaterConfig as d, defaultSurfaceConfig as e, defaultGaugeConfig as f, defaultGraphConfig as g, defaultMapConfig as h, isWebGpuSupported as i, defaultWarehouseConfig as j, defaultKanbanConfig as k, defaultCalendarConfig as l, defaultStackedConfig as m, createScene3dRenderer as n, WUIC_SHADER_EFFECT_KEY as o, makeTextSpriteMesh as p, WUIC_MESH_REPEATER_KEY as q, addRepeaterPlaceholder as r, resolveAssetFormat as s, parseShaderEffect as t, SCENE3D_SHADER_EFFECT_SCHEMA as u, buildEffectNodeMaterial as v, buildEffectShaderMaterial as w, getMeshRepeaterConfig as x, WUIC_REPEATER_CHILD as y, normalizeAssetToUnit as z };
2807
- //# sourceMappingURL=wuic-framework-lib-scene3d-shader-effect-DjHyCAFK.mjs.map
2807
+ //# sourceMappingURL=wuic-framework-lib-scene3d-shader-effect-gBEFKNvi.mjs.map
@@ -2,8 +2,8 @@ import * as i0 from '@angular/core';
2
2
  import { Input, ViewChild, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import * as THREE from 'three';
4
4
  import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
5
- import { W as WtoolboxService, h as DataProviderService, M as MetadataProviderService } from './wuic-framework-lib-wuic-framework-lib-BZZwta8b.mjs';
6
- import { R as deserializeScene, i as isWebGpuSupported, n as createScene3dRenderer, o as WUIC_SHADER_EFFECT_KEY, t as parseShaderEffect, v as buildEffectNodeMaterial, w as buildEffectShaderMaterial, x as getMeshRepeaterConfig, E as regenerateRepeater, y as WUIC_REPEATER_CHILD, C as CarouselController, b as defaultCarouselConfig, A as buildUploadTextureResolver, p as makeTextSpriteMesh, s as resolveAssetFormat, z as normalizeAssetToUnit, B as applyRepeaterTextureTo, G as createPhysicsWorld, F as getPhysicsDef, O as WUIC_BINDING_KEY, J as carouselArrowDir, K as WUIC_REPEATER_RECORD, M as closeItemPopup, N as showItemPopup, L as runRepeaterCallback } from './wuic-framework-lib-scene3d-shader-effect-DjHyCAFK.mjs';
5
+ import { W as WtoolboxService, h as DataProviderService, M as MetadataProviderService } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
6
+ import { R as deserializeScene, i as isWebGpuSupported, n as createScene3dRenderer, o as WUIC_SHADER_EFFECT_KEY, t as parseShaderEffect, v as buildEffectNodeMaterial, w as buildEffectShaderMaterial, x as getMeshRepeaterConfig, E as regenerateRepeater, y as WUIC_REPEATER_CHILD, C as CarouselController, b as defaultCarouselConfig, A as buildUploadTextureResolver, p as makeTextSpriteMesh, s as resolveAssetFormat, z as normalizeAssetToUnit, B as applyRepeaterTextureTo, G as createPhysicsWorld, F as getPhysicsDef, O as WUIC_BINDING_KEY, J as carouselArrowDir, K as WUIC_REPEATER_RECORD, M as closeItemPopup, N as showItemPopup, L as runRepeaterCallback } from './wuic-framework-lib-scene3d-shader-effect-gBEFKNvi.mjs';
7
7
  import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
8
8
  import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';
9
9
  import { STLLoader } from 'three/examples/jsm/loaders/STLLoader.js';
@@ -1112,11 +1112,11 @@ class Scene3dViewerComponent {
1112
1112
  return undefined;
1113
1113
  }
1114
1114
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: Scene3dViewerComponent, deps: [{ token: DataProviderService }, { token: MetadataProviderService }, { token: i1.ActivatedRoute }, { token: i1.Router }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
1115
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: Scene3dViewerComponent, isStandalone: true, selector: "wuic-scene3d-viewer", inputs: { sceneKey: "sceneKey", cameraId: "cameraId" }, viewQueries: [{ propertyName: "viewportContainer", first: true, predicate: ["viewportContainer"], descendants: true }], ngImport: i0, template: "<!-- F7: viewer WebGL read-only (canvas three.js). NO palette, NO gizmo,\n NO property panel: solo viewport + overlay stato (loading / errore). -->\n<div class=\"scene3d-viewer-shell\">\n\n <!-- Viewport (canvas three.js) -->\n <div #viewportContainer class=\"scene3d-viewer-viewport\"></div>\n\n <!-- Overlay stato: loading -->\n @if (loading) {\n <div class=\"scene3d-viewer-overlay\">\n <i class=\"pi pi-spin pi-spinner scene3d-viewer-spinner\"></i>\n <span>Caricamento scena...</span>\n </div>\n }\n\n <!-- Overlay stato: errore -->\n @if (!loading && errorMessage) {\n <div class=\"scene3d-viewer-overlay scene3d-viewer-error\">\n <i class=\"pi pi-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n }\n\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}.scene3d-viewer-shell{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:480px}.scene3d-viewer-viewport{flex:1 1 auto;min-width:0;min-height:0;position:relative;overflow:hidden;background:#1e1e28}.scene3d-viewer-viewport canvas{display:block;width:100%;height:100%}.scene3d-viewer-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.6rem;font-size:.9rem;color:#e8e8f0;background:#1e1e288c;pointer-events:none}.scene3d-viewer-spinner{font-size:1.6rem}.scene3d-viewer-error{color:#ffb4b4}.scene3d-viewer-error i{font-size:1.6rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1115
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: Scene3dViewerComponent, isStandalone: true, selector: "wuic-scene3d-viewer", inputs: { sceneKey: "sceneKey", cameraId: "cameraId" }, viewQueries: [{ propertyName: "viewportContainer", first: true, predicate: ["viewportContainer"], descendants: true }], ngImport: i0, template: "<!-- F7: viewer WebGL read-only (canvas three.js). NO palette, NO gizmo,\r\n NO property panel: solo viewport + overlay stato (loading / errore). -->\r\n<div class=\"scene3d-viewer-shell\">\r\n\r\n <!-- Viewport (canvas three.js) -->\r\n <div #viewportContainer class=\"scene3d-viewer-viewport\"></div>\r\n\r\n <!-- Overlay stato: loading -->\r\n @if (loading) {\r\n <div class=\"scene3d-viewer-overlay\">\r\n <i class=\"pi pi-spin pi-spinner scene3d-viewer-spinner\"></i>\r\n <span>Caricamento scena...</span>\r\n </div>\r\n }\r\n\r\n <!-- Overlay stato: errore -->\r\n @if (!loading && errorMessage) {\r\n <div class=\"scene3d-viewer-overlay scene3d-viewer-error\">\r\n <i class=\"pi pi-exclamation-triangle\"></i>\r\n <span>{{ errorMessage }}</span>\r\n </div>\r\n }\r\n\r\n</div>\r\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}.scene3d-viewer-shell{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:480px}.scene3d-viewer-viewport{flex:1 1 auto;min-width:0;min-height:0;position:relative;overflow:hidden;background:#1e1e28}.scene3d-viewer-viewport canvas{display:block;width:100%;height:100%}.scene3d-viewer-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.6rem;font-size:.9rem;color:#e8e8f0;background:#1e1e288c;pointer-events:none}.scene3d-viewer-spinner{font-size:1.6rem}.scene3d-viewer-error{color:#ffb4b4}.scene3d-viewer-error i{font-size:1.6rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1116
1116
  }
1117
1117
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: Scene3dViewerComponent, decorators: [{
1118
1118
  type: Component,
1119
- args: [{ selector: 'wuic-scene3d-viewer', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- F7: viewer WebGL read-only (canvas three.js). NO palette, NO gizmo,\n NO property panel: solo viewport + overlay stato (loading / errore). -->\n<div class=\"scene3d-viewer-shell\">\n\n <!-- Viewport (canvas three.js) -->\n <div #viewportContainer class=\"scene3d-viewer-viewport\"></div>\n\n <!-- Overlay stato: loading -->\n @if (loading) {\n <div class=\"scene3d-viewer-overlay\">\n <i class=\"pi pi-spin pi-spinner scene3d-viewer-spinner\"></i>\n <span>Caricamento scena...</span>\n </div>\n }\n\n <!-- Overlay stato: errore -->\n @if (!loading && errorMessage) {\n <div class=\"scene3d-viewer-overlay scene3d-viewer-error\">\n <i class=\"pi pi-exclamation-triangle\"></i>\n <span>{{ errorMessage }}</span>\n </div>\n }\n\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}.scene3d-viewer-shell{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:480px}.scene3d-viewer-viewport{flex:1 1 auto;min-width:0;min-height:0;position:relative;overflow:hidden;background:#1e1e28}.scene3d-viewer-viewport canvas{display:block;width:100%;height:100%}.scene3d-viewer-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.6rem;font-size:.9rem;color:#e8e8f0;background:#1e1e288c;pointer-events:none}.scene3d-viewer-spinner{font-size:1.6rem}.scene3d-viewer-error{color:#ffb4b4}.scene3d-viewer-error i{font-size:1.6rem}\n"] }]
1119
+ args: [{ selector: 'wuic-scene3d-viewer', standalone: true, imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- F7: viewer WebGL read-only (canvas three.js). NO palette, NO gizmo,\r\n NO property panel: solo viewport + overlay stato (loading / errore). -->\r\n<div class=\"scene3d-viewer-shell\">\r\n\r\n <!-- Viewport (canvas three.js) -->\r\n <div #viewportContainer class=\"scene3d-viewer-viewport\"></div>\r\n\r\n <!-- Overlay stato: loading -->\r\n @if (loading) {\r\n <div class=\"scene3d-viewer-overlay\">\r\n <i class=\"pi pi-spin pi-spinner scene3d-viewer-spinner\"></i>\r\n <span>Caricamento scena...</span>\r\n </div>\r\n }\r\n\r\n <!-- Overlay stato: errore -->\r\n @if (!loading && errorMessage) {\r\n <div class=\"scene3d-viewer-overlay scene3d-viewer-error\">\r\n <i class=\"pi pi-exclamation-triangle\"></i>\r\n <span>{{ errorMessage }}</span>\r\n </div>\r\n }\r\n\r\n</div>\r\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}.scene3d-viewer-shell{position:relative;display:flex;flex-direction:column;width:100%;height:100%;min-height:480px}.scene3d-viewer-viewport{flex:1 1 auto;min-width:0;min-height:0;position:relative;overflow:hidden;background:#1e1e28}.scene3d-viewer-viewport canvas{display:block;width:100%;height:100%}.scene3d-viewer-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.6rem;font-size:.9rem;color:#e8e8f0;background:#1e1e288c;pointer-events:none}.scene3d-viewer-spinner{font-size:1.6rem}.scene3d-viewer-error{color:#ffb4b4}.scene3d-viewer-error i{font-size:1.6rem}\n"] }]
1120
1120
  }], ctorParameters: () => [{ type: DataProviderService }, { type: MetadataProviderService }, { type: i1.ActivatedRoute }, { type: i1.Router }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }], propDecorators: { viewportContainer: [{
1121
1121
  type: ViewChild,
1122
1122
  args: ['viewportContainer', { static: false }]
@@ -1127,4 +1127,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1127
1127
  }] } });
1128
1128
 
1129
1129
  export { Scene3dViewerComponent };
1130
- //# sourceMappingURL=wuic-framework-lib-scene3d-viewer.component-nMSl5jbe.mjs.map
1130
+ //# sourceMappingURL=wuic-framework-lib-scene3d-viewer.component-G_ykpDDF.mjs.map
@@ -12,7 +12,7 @@ import interactionPlugin from '@fullcalendar/interaction';
12
12
  import timeGridPlugin from '@fullcalendar/timegrid';
13
13
  import * as i1 from '@angular/platform-browser';
14
14
  import { Title } from '@angular/platform-browser';
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';
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-54sySY_p.mjs';
16
16
  import { BehaviorSubject } from 'rxjs';
17
17
 
18
18
  // https://fullcalendar.io/docs/initialize-globals#premium-bundle -
@@ -713,11 +713,11 @@ class SchedulerListComponent {
713
713
  this.langChangeSub = null;
714
714
  }
715
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 });
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"] }] });
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) {\r\n<full-calendar #calendar [options]=\"calendarOptions\" [events]=\"data\">\r\n <ng-template #eventContent let-arg>\r\n <ng-container\r\n *ngComponentOutlet=\"itemTemplate; inputs: { record: arg.event, rowData: arg.event, metaInfo: metaInfo, datasource: datasource }\"></ng-container>\r\n </ng-template>\r\n</full-calendar>\r\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"] }] });
717
717
  }
718
718
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SchedulerListComponent, decorators: [{
719
719
  type: Component,
720
- args: [{ selector: 'wuic-scheduler-list', imports: [FullCalendarModule, NgComponentOutlet], providers: [Title], 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"] }]
720
+ args: [{ selector: 'wuic-scheduler-list', imports: [FullCalendarModule, NgComponentOutlet], providers: [Title], template: "@if (calendarOptions) {\r\n<full-calendar #calendar [options]=\"calendarOptions\" [events]=\"data\">\r\n <ng-template #eventContent let-arg>\r\n <ng-container\r\n *ngComponentOutlet=\"itemTemplate; inputs: { record: arg.event, rowData: arg.event, metaInfo: metaInfo, datasource: datasource }\"></ng-container>\r\n </ng-template>\r\n</full-calendar>\r\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"] }]
721
721
  }], ctorParameters: () => [{ type: i1.Title }, { type: i0.ChangeDetectorRef }, { type: TranslationManagerService }], propDecorators: { eventContent: [{
722
722
  type: ViewChild,
723
723
  args: ["fcEventContent"]
@@ -756,4 +756,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
756
756
  }] } });
757
757
 
758
758
  export { SchedulerListComponent };
759
- //# sourceMappingURL=wuic-framework-lib-scheduler-list.component-Cvk3Zg0Q.mjs.map
759
+ //# sourceMappingURL=wuic-framework-lib-scheduler-list.component-C_1YjS3c.mjs.map
@@ -7,7 +7,7 @@ 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-BZZwta8b.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-54sySY_p.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';
@@ -1748,42 +1748,42 @@ class SpreadsheetListSfComponent {
1748
1748
  // Retro-compat: valore assente / null / false → sort abilitato.
1749
1749
  const sortAllowed = col?.mc_disable_sorting !== true;
1750
1750
  const sortSectionHtml = sortAllowed
1751
- ? `<div class="wuic-sf-filter-popup-sort">
1752
- <button type="button" class="wuic-sf-filter-popup-sort-btn" data-sort="asc">
1753
- <span class="wuic-sf-filter-popup-sort-icon">&#9650;</span> Ordina crescente
1754
- </button>
1755
- <button type="button" class="wuic-sf-filter-popup-sort-btn" data-sort="desc">
1756
- <span class="wuic-sf-filter-popup-sort-icon">&#9660;</span> Ordina decrescente
1757
- </button>
1751
+ ? `<div class="wuic-sf-filter-popup-sort">
1752
+ <button type="button" class="wuic-sf-filter-popup-sort-btn" data-sort="asc">
1753
+ <span class="wuic-sf-filter-popup-sort-icon">&#9650;</span> Ordina crescente
1754
+ </button>
1755
+ <button type="button" class="wuic-sf-filter-popup-sort-btn" data-sort="desc">
1756
+ <span class="wuic-sf-filter-popup-sort-icon">&#9660;</span> Ordina decrescente
1757
+ </button>
1758
1758
  </div>`
1759
1759
  : '';
1760
- popup.innerHTML = `
1761
- <div class="wuic-sf-filter-popup-header">
1762
- <span class="wuic-sf-filter-popup-title">Filtra: ${this.escapeHtml(colDisplayName)}</span>
1763
- <button type="button" class="wuic-sf-filter-popup-close" title="Chiudi">&times;</button>
1764
- </div>
1765
- ${sortSectionHtml}
1766
- <div class="wuic-sf-filter-popup-clear">
1767
- <button type="button" class="wuic-sf-filter-popup-clear-btn"
1768
- ${currentFilter ? '' : 'disabled'}>
1769
- Rimuovi filtro su "${this.escapeHtml(colDisplayName)}"
1770
- </button>
1771
- </div>
1772
- <div class="wuic-sf-filter-popup-search">
1773
- <input type="text" class="wuic-sf-filter-popup-search-input"
1774
- placeholder="Cerca..." />
1775
- </div>
1776
- <div class="wuic-sf-filter-popup-list-wrap">
1777
- <label class="wuic-sf-filter-popup-item wuic-sf-filter-popup-selectall">
1778
- <input type="checkbox" class="wuic-sf-filter-popup-selectall-cb" />
1779
- <span>(Seleziona tutto)</span>
1780
- </label>
1781
- <div class="wuic-sf-filter-popup-list" role="listbox"></div>
1782
- </div>
1783
- <div class="wuic-sf-filter-popup-footer">
1784
- <button type="button" class="wuic-sf-filter-popup-ok">OK</button>
1785
- <button type="button" class="wuic-sf-filter-popup-cancel">Annulla</button>
1786
- </div>
1760
+ popup.innerHTML = `
1761
+ <div class="wuic-sf-filter-popup-header">
1762
+ <span class="wuic-sf-filter-popup-title">Filtra: ${this.escapeHtml(colDisplayName)}</span>
1763
+ <button type="button" class="wuic-sf-filter-popup-close" title="Chiudi">&times;</button>
1764
+ </div>
1765
+ ${sortSectionHtml}
1766
+ <div class="wuic-sf-filter-popup-clear">
1767
+ <button type="button" class="wuic-sf-filter-popup-clear-btn"
1768
+ ${currentFilter ? '' : 'disabled'}>
1769
+ Rimuovi filtro su "${this.escapeHtml(colDisplayName)}"
1770
+ </button>
1771
+ </div>
1772
+ <div class="wuic-sf-filter-popup-search">
1773
+ <input type="text" class="wuic-sf-filter-popup-search-input"
1774
+ placeholder="Cerca..." />
1775
+ </div>
1776
+ <div class="wuic-sf-filter-popup-list-wrap">
1777
+ <label class="wuic-sf-filter-popup-item wuic-sf-filter-popup-selectall">
1778
+ <input type="checkbox" class="wuic-sf-filter-popup-selectall-cb" />
1779
+ <span>(Seleziona tutto)</span>
1780
+ </label>
1781
+ <div class="wuic-sf-filter-popup-list" role="listbox"></div>
1782
+ </div>
1783
+ <div class="wuic-sf-filter-popup-footer">
1784
+ <button type="button" class="wuic-sf-filter-popup-ok">OK</button>
1785
+ <button type="button" class="wuic-sf-filter-popup-cancel">Annulla</button>
1786
+ </div>
1787
1787
  `;
1788
1788
  // Render list items
1789
1789
  const listEl = popup.querySelector('.wuic-sf-filter-popup-list');
@@ -2588,21 +2588,21 @@ class SpreadsheetListSfComponent {
2588
2588
  * Pattern identico a DynamicRowTemplateComponent.buildTableStylePredicate.
2589
2589
  */
2590
2590
  buildConditionalStylePredicate(conditionCode) {
2591
- const expressionWrapper = `
2592
- const dataItem = record;
2593
- const rowData = record;
2594
- return (${conditionCode});
2591
+ const expressionWrapper = `
2592
+ const dataItem = record;
2593
+ const rowData = record;
2594
+ return (${conditionCode});
2595
2595
  `;
2596
2596
  let compiled = null;
2597
2597
  try {
2598
2598
  compiled = new Function('metaInfo', 'record', 'wtoolbox', expressionWrapper);
2599
2599
  }
2600
2600
  catch {
2601
- const blockWrapper = `
2602
- const dataItem = record;
2603
- const rowData = record;
2604
- ${conditionCode}
2605
- return true;
2601
+ const blockWrapper = `
2602
+ const dataItem = record;
2603
+ const rowData = record;
2604
+ ${conditionCode}
2605
+ return true;
2606
2606
  `;
2607
2607
  try {
2608
2608
  compiled = new Function('metaInfo', 'record', 'wtoolbox', blockWrapper);
@@ -4328,7 +4328,7 @@ class SpreadsheetListSfComponent {
4328
4328
  }
4329
4329
  }
4330
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 });
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" }] });
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: "<!--\r\n Layout root wrapper:\r\n 1. Toolbar WUIC custom (insert / save batch / export / refresh)\r\n 2. Syncfusion Spreadsheet host\r\n 3. Pagination custom (Syncfusion non ha pagination built-in, quindi la\r\n rendiamo sotto il foglio con nav + page-size dropdown)\r\n 4. Lookup datasource (invisibile, pattern identico al vecchio componente)\r\n-->\r\n\r\n<!-- Bootstrap CSS Syncfusion (~500 KiB): si monta solo quando questo\r\n componente lazy \u00E8 istanziato \u2192 CSS NON nel bundle iniziale globale,\r\n risparmia ~500 KiB su tutte le pagine che non aprono spreadsheet. -->\r\n<wuic-syncfusion-styles-bootstrap></wuic-syncfusion-styles-bootstrap>\r\n\r\n<div class=\"wuic-sf-spreadsheet-wrapper\">\r\n\r\n @if (!hideToolbar && metaInfo) {\r\n <!-- Stile allineato a <wuic-list-grid>: stessa caption-bar, stessi p-button\r\n PrimeNG con icona + label, stesso componente import/export. -->\r\n <div class=\"grid-caption-bar wuic-sf-caption-bar\" role=\"toolbar\" aria-label=\"Spreadsheet toolbar\">\r\n <div class=\"grid-caption-left\">\r\n @if (!metaInfo.tableMetadata.md_hide_refresh) {\r\n <p-button icon=\"pi pi-refresh\" label=\"{{'refresh_grid' | translate}}\"\r\n (onClick)=\"onToolbarRefresh()\" />\r\n }\r\n @if (canInsertRows()) {\r\n <p-button icon=\"pi pi-plus\" label=\"{{'add_grid' | translate}}\"\r\n (onClick)=\"onToolbarInsert()\" />\r\n }\r\n @if (!metaInfo.tableMetadata.md_hide_export_xls) {\r\n <!-- Include dialog con progress bar + bottoni \"Stoppa e salva\r\n parziale\" / \"Stoppa\" / \"Continua in background\". -->\r\n <wuic-import-export-button\r\n [routeName]=\"metaInfo.tableMetadata.md_route_name\"\r\n [tableMetadata]=\"metaInfo.tableMetadata\"\r\n [filterInfoProvider]=\"getCurrentFilterInfoForExport\"></wuic-import-export-button>\r\n }\r\n @if (isBatchSaveEnabled()) {\r\n <p-button icon=\"pi pi-save\" label=\"{{'list_grid.save_changes' | translate}}\"\r\n (onClick)=\"onToolbarSaveBatch()\" />\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"wuic-sf-spreadsheet-host\">\r\n @if (metaInfo && sfSheets.length > 0) {\r\n <ejs-spreadsheet #sfSpreadsheet\r\n [sheets]=\"sfSheets\"\r\n [height]=\"sfHeight\"\r\n [width]=\"sfWidth\"\r\n [scrollSettings]=\"sfScrollSettings\"\r\n [showRibbon]=\"showRibbon\"\r\n [showFormulaBar]=\"showFormulaBar\"\r\n [showSheetTabs]=\"false\"\r\n [allowEditing]=\"true\"\r\n [allowSorting]=\"true\"\r\n [allowFiltering]=\"false\"\r\n [allowResizing]=\"true\"\r\n [allowInsert]=\"canInsertRows()\"\r\n [allowDelete]=\"canDeleteRows()\"\r\n [enableContextMenu]=\"true\"\r\n [enableKeyboardNavigation]=\"true\"\r\n [enableClipboard]=\"true\"\r\n (created)=\"onSyncfusionCreated()\"\r\n (dataBound)=\"onSyncfusionDataBound()\"\r\n (cellSave)=\"onSyncfusionCellSave($event)\"\r\n (beforeCellSave)=\"onSyncfusionBeforeCellSave($event)\"\r\n (beforeCellRender)=\"onSyncfusionBeforeCellRender($event)\"\r\n (cellEdit)=\"onSyncfusionCellEdit($event)\"\r\n (contextMenuBeforeOpen)=\"onSyncfusionContextMenuBeforeOpen($event)\"\r\n (contextMenuItemSelect)=\"onSyncfusionContextMenuItemSelect($event)\"\r\n (actionBegin)=\"onSyncfusionActionBegin($event)\"\r\n (actionComplete)=\"onSyncfusionActionComplete($event)\"\r\n (dialogBeforeOpen)=\"onSyncfusionDialogBeforeOpen($event)\">\r\n </ejs-spreadsheet>\r\n }\r\n </div>\r\n\r\n @if (totalPages > 1 || totalRecords > pageSize) {\r\n <div class=\"wuic-sf-pagination\" role=\"navigation\" aria-label=\"Paginazione\">\r\n <button type=\"button\" class=\"wuic-sf-page-btn\"\r\n [disabled]=\"pageIndex <= 1\"\r\n (click)=\"isServerSide ? handleServerPageChange(1, pageSize) : setClientPage(1)\"\r\n title=\"Prima pagina\">\r\n <i class=\"pi pi-angle-double-left\"></i>\r\n </button>\r\n <button type=\"button\" class=\"wuic-sf-page-btn\"\r\n [disabled]=\"pageIndex <= 1\"\r\n (click)=\"isServerSide ? handleServerPageChange(pageIndex - 1, pageSize) : setClientPage(pageIndex - 1)\"\r\n title=\"Pagina precedente\">\r\n <i class=\"pi pi-angle-left\"></i>\r\n </button>\r\n <span class=\"wuic-sf-page-info\">\r\n Pagina <strong>{{ pageIndex }}</strong> di <strong>{{ totalPages }}</strong>\r\n <span class=\"wuic-sf-page-total\">({{ totalRecords }} record)</span>\r\n </span>\r\n <button type=\"button\" class=\"wuic-sf-page-btn\"\r\n [disabled]=\"pageIndex >= totalPages\"\r\n (click)=\"isServerSide ? handleServerPageChange(pageIndex + 1, pageSize) : setClientPage(pageIndex + 1)\"\r\n title=\"Pagina successiva\">\r\n <i class=\"pi pi-angle-right\"></i>\r\n </button>\r\n <button type=\"button\" class=\"wuic-sf-page-btn\"\r\n [disabled]=\"pageIndex >= totalPages\"\r\n (click)=\"isServerSide ? handleServerPageChange(totalPages, pageSize) : setClientPage(totalPages)\"\r\n title=\"Ultima pagina\">\r\n <i class=\"pi pi-angle-double-right\"></i>\r\n </button>\r\n <select class=\"wuic-sf-page-size\" [value]=\"pageSize\"\r\n (change)=\"setPageSize($any($event.target).value)\"\r\n title=\"Record per pagina\">\r\n <option [value]=\"10\">10</option>\r\n <option [value]=\"25\">25</option>\r\n <option [value]=\"50\">50</option>\r\n <option [value]=\"100\">100</option>\r\n </select>\r\n </div>\r\n }\r\n\r\n</div>\r\n\r\n@if (!hardcodedRoute) {\r\n <wuic-data-source #lookupSource [autoload]=\"true\" [routeFromRouting]=\"false\"\r\n [route]=\"currentRoute\" [parentRecord]=\"currentRecord\"\r\n [parentMetaInfo]=\"metaInfo\"></wuic-data-source>\r\n}\r\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" }] });
4332
4332
  }
4333
4333
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: SpreadsheetListSfComponent, decorators: [{
4334
4334
  type: Component,
@@ -4339,7 +4339,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
4339
4339
  ButtonModule,
4340
4340
  TranslateModule,
4341
4341
  SyncfusionStylesBootstrapComponent
4342
- ], 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"] }]
4342
+ ], template: "<!--\r\n Layout root wrapper:\r\n 1. Toolbar WUIC custom (insert / save batch / export / refresh)\r\n 2. Syncfusion Spreadsheet host\r\n 3. Pagination custom (Syncfusion non ha pagination built-in, quindi la\r\n rendiamo sotto il foglio con nav + page-size dropdown)\r\n 4. Lookup datasource (invisibile, pattern identico al vecchio componente)\r\n-->\r\n\r\n<!-- Bootstrap CSS Syncfusion (~500 KiB): si monta solo quando questo\r\n componente lazy \u00E8 istanziato \u2192 CSS NON nel bundle iniziale globale,\r\n risparmia ~500 KiB su tutte le pagine che non aprono spreadsheet. -->\r\n<wuic-syncfusion-styles-bootstrap></wuic-syncfusion-styles-bootstrap>\r\n\r\n<div class=\"wuic-sf-spreadsheet-wrapper\">\r\n\r\n @if (!hideToolbar && metaInfo) {\r\n <!-- Stile allineato a <wuic-list-grid>: stessa caption-bar, stessi p-button\r\n PrimeNG con icona + label, stesso componente import/export. -->\r\n <div class=\"grid-caption-bar wuic-sf-caption-bar\" role=\"toolbar\" aria-label=\"Spreadsheet toolbar\">\r\n <div class=\"grid-caption-left\">\r\n @if (!metaInfo.tableMetadata.md_hide_refresh) {\r\n <p-button icon=\"pi pi-refresh\" label=\"{{'refresh_grid' | translate}}\"\r\n (onClick)=\"onToolbarRefresh()\" />\r\n }\r\n @if (canInsertRows()) {\r\n <p-button icon=\"pi pi-plus\" label=\"{{'add_grid' | translate}}\"\r\n (onClick)=\"onToolbarInsert()\" />\r\n }\r\n @if (!metaInfo.tableMetadata.md_hide_export_xls) {\r\n <!-- Include dialog con progress bar + bottoni \"Stoppa e salva\r\n parziale\" / \"Stoppa\" / \"Continua in background\". -->\r\n <wuic-import-export-button\r\n [routeName]=\"metaInfo.tableMetadata.md_route_name\"\r\n [tableMetadata]=\"metaInfo.tableMetadata\"\r\n [filterInfoProvider]=\"getCurrentFilterInfoForExport\"></wuic-import-export-button>\r\n }\r\n @if (isBatchSaveEnabled()) {\r\n <p-button icon=\"pi pi-save\" label=\"{{'list_grid.save_changes' | translate}}\"\r\n (onClick)=\"onToolbarSaveBatch()\" />\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"wuic-sf-spreadsheet-host\">\r\n @if (metaInfo && sfSheets.length > 0) {\r\n <ejs-spreadsheet #sfSpreadsheet\r\n [sheets]=\"sfSheets\"\r\n [height]=\"sfHeight\"\r\n [width]=\"sfWidth\"\r\n [scrollSettings]=\"sfScrollSettings\"\r\n [showRibbon]=\"showRibbon\"\r\n [showFormulaBar]=\"showFormulaBar\"\r\n [showSheetTabs]=\"false\"\r\n [allowEditing]=\"true\"\r\n [allowSorting]=\"true\"\r\n [allowFiltering]=\"false\"\r\n [allowResizing]=\"true\"\r\n [allowInsert]=\"canInsertRows()\"\r\n [allowDelete]=\"canDeleteRows()\"\r\n [enableContextMenu]=\"true\"\r\n [enableKeyboardNavigation]=\"true\"\r\n [enableClipboard]=\"true\"\r\n (created)=\"onSyncfusionCreated()\"\r\n (dataBound)=\"onSyncfusionDataBound()\"\r\n (cellSave)=\"onSyncfusionCellSave($event)\"\r\n (beforeCellSave)=\"onSyncfusionBeforeCellSave($event)\"\r\n (beforeCellRender)=\"onSyncfusionBeforeCellRender($event)\"\r\n (cellEdit)=\"onSyncfusionCellEdit($event)\"\r\n (contextMenuBeforeOpen)=\"onSyncfusionContextMenuBeforeOpen($event)\"\r\n (contextMenuItemSelect)=\"onSyncfusionContextMenuItemSelect($event)\"\r\n (actionBegin)=\"onSyncfusionActionBegin($event)\"\r\n (actionComplete)=\"onSyncfusionActionComplete($event)\"\r\n (dialogBeforeOpen)=\"onSyncfusionDialogBeforeOpen($event)\">\r\n </ejs-spreadsheet>\r\n }\r\n </div>\r\n\r\n @if (totalPages > 1 || totalRecords > pageSize) {\r\n <div class=\"wuic-sf-pagination\" role=\"navigation\" aria-label=\"Paginazione\">\r\n <button type=\"button\" class=\"wuic-sf-page-btn\"\r\n [disabled]=\"pageIndex <= 1\"\r\n (click)=\"isServerSide ? handleServerPageChange(1, pageSize) : setClientPage(1)\"\r\n title=\"Prima pagina\">\r\n <i class=\"pi pi-angle-double-left\"></i>\r\n </button>\r\n <button type=\"button\" class=\"wuic-sf-page-btn\"\r\n [disabled]=\"pageIndex <= 1\"\r\n (click)=\"isServerSide ? handleServerPageChange(pageIndex - 1, pageSize) : setClientPage(pageIndex - 1)\"\r\n title=\"Pagina precedente\">\r\n <i class=\"pi pi-angle-left\"></i>\r\n </button>\r\n <span class=\"wuic-sf-page-info\">\r\n Pagina <strong>{{ pageIndex }}</strong> di <strong>{{ totalPages }}</strong>\r\n <span class=\"wuic-sf-page-total\">({{ totalRecords }} record)</span>\r\n </span>\r\n <button type=\"button\" class=\"wuic-sf-page-btn\"\r\n [disabled]=\"pageIndex >= totalPages\"\r\n (click)=\"isServerSide ? handleServerPageChange(pageIndex + 1, pageSize) : setClientPage(pageIndex + 1)\"\r\n title=\"Pagina successiva\">\r\n <i class=\"pi pi-angle-right\"></i>\r\n </button>\r\n <button type=\"button\" class=\"wuic-sf-page-btn\"\r\n [disabled]=\"pageIndex >= totalPages\"\r\n (click)=\"isServerSide ? handleServerPageChange(totalPages, pageSize) : setClientPage(totalPages)\"\r\n title=\"Ultima pagina\">\r\n <i class=\"pi pi-angle-double-right\"></i>\r\n </button>\r\n <select class=\"wuic-sf-page-size\" [value]=\"pageSize\"\r\n (change)=\"setPageSize($any($event.target).value)\"\r\n title=\"Record per pagina\">\r\n <option [value]=\"10\">10</option>\r\n <option [value]=\"25\">25</option>\r\n <option [value]=\"50\">50</option>\r\n <option [value]=\"100\">100</option>\r\n </select>\r\n </div>\r\n }\r\n\r\n</div>\r\n\r\n@if (!hardcodedRoute) {\r\n <wuic-data-source #lookupSource [autoload]=\"true\" [routeFromRouting]=\"false\"\r\n [route]=\"currentRoute\" [parentRecord]=\"currentRecord\"\r\n [parentMetaInfo]=\"metaInfo\"></wuic-data-source>\r\n}\r\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"] }]
4343
4343
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.Title }, { type: i1$1.ActivatedRoute }, { type: i1$2.HttpClient }, { type: WtoolboxService }, { type: MetadataProviderService }, { type: UserInfoService }], propDecorators: { sfSpreadsheet: [{
4344
4344
  type: ViewChild,
4345
4345
  args: ['sfSpreadsheet']
@@ -4394,4 +4394,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
4394
4394
  }] } });
4395
4395
 
4396
4396
  export { SpreadsheetListSfComponent };
4397
- //# sourceMappingURL=wuic-framework-lib-spreadsheet-list-sf.component-C1U7JPiq.mjs.map
4397
+ //# sourceMappingURL=wuic-framework-lib-spreadsheet-list-sf.component-BKtu4edX.mjs.map