snap-report-viewer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/components/chart-renderer/chart-renderer.component.mjs +75 -0
  3. package/esm2022/lib/components/complex-table-renderer/complex-table-renderer.component.mjs +155 -0
  4. package/esm2022/lib/components/component-renderer/component-renderer.component.mjs +158 -0
  5. package/esm2022/lib/components/container-renderer/container-renderer.component.mjs +53 -0
  6. package/esm2022/lib/components/image-renderer/image-renderer.component.mjs +67 -0
  7. package/esm2022/lib/components/line-renderer/line-renderer.component.mjs +94 -0
  8. package/esm2022/lib/components/list-renderer/list-renderer.component.mjs +96 -0
  9. package/esm2022/lib/components/qrcode-renderer/qrcode-renderer.component.mjs +67 -0
  10. package/esm2022/lib/components/shape-renderer/shape-renderer.component.mjs +133 -0
  11. package/esm2022/lib/components/table-renderer/table-renderer.component.mjs +148 -0
  12. package/esm2022/lib/components/text-renderer/text-renderer.component.mjs +33 -0
  13. package/esm2022/lib/constants/page-sizes.mjs +3 -0
  14. package/esm2022/lib/constants/report-tokens.mjs +21 -0
  15. package/esm2022/lib/layout/report-band.component.mjs +33 -0
  16. package/esm2022/lib/layout/report-page.component.mjs +159 -0
  17. package/esm2022/lib/models/component.model.mjs +3 -0
  18. package/esm2022/lib/models/report-template.model.mjs +19 -0
  19. package/esm2022/lib/page-container/page-container.component.mjs +248 -0
  20. package/esm2022/lib/report-viewer.component.mjs +393 -0
  21. package/esm2022/lib/services/chart-options-builder.service.mjs +749 -0
  22. package/esm2022/lib/services/data-resolver.service.mjs +385 -0
  23. package/esm2022/lib/services/export.service.mjs +82 -0
  24. package/esm2022/lib/services/formatting.service.mjs +59 -0
  25. package/esm2022/lib/services/print.service.mjs +133 -0
  26. package/esm2022/lib/services/search.service.mjs +117 -0
  27. package/esm2022/lib/services/style-mapper.service.mjs +247 -0
  28. package/esm2022/lib/services/template-normalizer.service.mjs +213 -0
  29. package/esm2022/lib/services/template-validator.service.mjs +293 -0
  30. package/esm2022/lib/services/token-resolver.service.mjs +14 -0
  31. package/esm2022/lib/services/viewer-state.service.mjs +155 -0
  32. package/esm2022/lib/sidebar/sidebar-container.component.mjs +86 -0
  33. package/esm2022/lib/sidebar/thumbnail-sidebar.component.mjs +110 -0
  34. package/esm2022/lib/sidebar/toc-sidebar.component.mjs +155 -0
  35. package/esm2022/lib/toolbar/viewer-toolbar.component.mjs +486 -0
  36. package/esm2022/public-api.mjs +43 -0
  37. package/esm2022/snap-report-viewer.mjs +5 -0
  38. package/fesm2022/snap-report-viewer.mjs +5110 -0
  39. package/fesm2022/snap-report-viewer.mjs.map +1 -0
  40. package/index.d.ts +5 -0
  41. package/lib/components/chart-renderer/chart-renderer.component.d.ts +14 -0
  42. package/lib/components/complex-table-renderer/complex-table-renderer.component.d.ts +17 -0
  43. package/lib/components/component-renderer/component-renderer.component.d.ts +14 -0
  44. package/lib/components/container-renderer/container-renderer.component.d.ts +11 -0
  45. package/lib/components/image-renderer/image-renderer.component.d.ts +14 -0
  46. package/lib/components/line-renderer/line-renderer.component.d.ts +10 -0
  47. package/lib/components/list-renderer/list-renderer.component.d.ts +16 -0
  48. package/lib/components/qrcode-renderer/qrcode-renderer.component.d.ts +16 -0
  49. package/lib/components/shape-renderer/shape-renderer.component.d.ts +11 -0
  50. package/lib/components/table-renderer/table-renderer.component.d.ts +20 -0
  51. package/lib/components/text-renderer/text-renderer.component.d.ts +13 -0
  52. package/lib/constants/page-sizes.d.ts +2 -0
  53. package/lib/constants/report-tokens.d.ts +8 -0
  54. package/lib/layout/report-band.component.d.ts +10 -0
  55. package/lib/layout/report-page.component.d.ts +21 -0
  56. package/lib/models/component.model.d.ts +315 -0
  57. package/lib/models/report-template.model.d.ts +122 -0
  58. package/lib/page-container/page-container.component.d.ts +29 -0
  59. package/lib/report-viewer.component.d.ts +51 -0
  60. package/lib/services/chart-options-builder.service.d.ts +31 -0
  61. package/lib/services/data-resolver.service.d.ts +27 -0
  62. package/lib/services/export.service.d.ts +11 -0
  63. package/lib/services/formatting.service.d.ts +10 -0
  64. package/lib/services/print.service.d.ts +12 -0
  65. package/lib/services/search.service.d.ts +13 -0
  66. package/lib/services/style-mapper.service.d.ts +14 -0
  67. package/lib/services/template-normalizer.service.d.ts +24 -0
  68. package/lib/services/template-validator.service.d.ts +19 -0
  69. package/lib/services/token-resolver.service.d.ts +6 -0
  70. package/lib/services/viewer-state.service.d.ts +49 -0
  71. package/lib/sidebar/sidebar-container.component.d.ts +8 -0
  72. package/lib/sidebar/thumbnail-sidebar.component.d.ts +15 -0
  73. package/lib/sidebar/toc-sidebar.component.d.ts +17 -0
  74. package/lib/toolbar/viewer-toolbar.component.d.ts +17 -0
  75. package/package.json +43 -0
  76. package/public-api.d.ts +35 -0
@@ -0,0 +1,94 @@
1
+ import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ export class LineRendererComponent {
5
+ get strokeColor() {
6
+ return this.component.lineConfig?.strokeColor || '#000000';
7
+ }
8
+ get arrowSize() {
9
+ return this.component.lineConfig?.arrowSize || 10;
10
+ }
11
+ get dashArray() {
12
+ switch (this.component.lineConfig?.lineType) {
13
+ case 'dashed': return '8,4';
14
+ case 'dotted': return '2,4';
15
+ default: return 'none';
16
+ }
17
+ }
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LineRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: LineRendererComponent, isStandalone: true, selector: "rv-line-renderer", inputs: { component: "component" }, ngImport: i0, template: `
20
+ <svg class="rv-line" width="100%" height="100%" preserveAspectRatio="none">
21
+ <defs>
22
+ @if (component.lineConfig?.endArrow) {
23
+ <marker [attr.id]="'rv-arrow-end-' + component.id"
24
+ [attr.markerWidth]="arrowSize"
25
+ [attr.markerHeight]="arrowSize * 0.7"
26
+ [attr.refX]="arrowSize - 1"
27
+ [attr.refY]="arrowSize * 0.35"
28
+ orient="auto">
29
+ <polygon [attr.points]="'0 0, ' + arrowSize + ' ' + (arrowSize * 0.35) + ', 0 ' + (arrowSize * 0.7)"
30
+ [attr.fill]="strokeColor" />
31
+ </marker>
32
+ }
33
+ @if (component.lineConfig?.startArrow) {
34
+ <marker [attr.id]="'rv-arrow-start-' + component.id"
35
+ [attr.markerWidth]="arrowSize"
36
+ [attr.markerHeight]="arrowSize * 0.7"
37
+ refX="1"
38
+ [attr.refY]="arrowSize * 0.35"
39
+ orient="auto-start-reverse">
40
+ <polygon [attr.points]="'0 0, ' + arrowSize + ' ' + (arrowSize * 0.35) + ', 0 ' + (arrowSize * 0.7)"
41
+ [attr.fill]="strokeColor" />
42
+ </marker>
43
+ }
44
+ </defs>
45
+ <line x1="0" y1="50%" x2="100%" y2="50%"
46
+ [attr.stroke]="strokeColor"
47
+ [attr.stroke-width]="component.lineConfig?.strokeWidth || 1"
48
+ [attr.stroke-dasharray]="dashArray"
49
+ [attr.marker-end]="component.lineConfig?.endArrow ? 'url(#rv-arrow-end-' + component.id + ')' : null"
50
+ [attr.marker-start]="component.lineConfig?.startArrow ? 'url(#rv-arrow-start-' + component.id + ')' : null" />
51
+ </svg>
52
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.rv-line{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
53
+ }
54
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LineRendererComponent, decorators: [{
55
+ type: Component,
56
+ args: [{ selector: 'rv-line-renderer', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
57
+ <svg class="rv-line" width="100%" height="100%" preserveAspectRatio="none">
58
+ <defs>
59
+ @if (component.lineConfig?.endArrow) {
60
+ <marker [attr.id]="'rv-arrow-end-' + component.id"
61
+ [attr.markerWidth]="arrowSize"
62
+ [attr.markerHeight]="arrowSize * 0.7"
63
+ [attr.refX]="arrowSize - 1"
64
+ [attr.refY]="arrowSize * 0.35"
65
+ orient="auto">
66
+ <polygon [attr.points]="'0 0, ' + arrowSize + ' ' + (arrowSize * 0.35) + ', 0 ' + (arrowSize * 0.7)"
67
+ [attr.fill]="strokeColor" />
68
+ </marker>
69
+ }
70
+ @if (component.lineConfig?.startArrow) {
71
+ <marker [attr.id]="'rv-arrow-start-' + component.id"
72
+ [attr.markerWidth]="arrowSize"
73
+ [attr.markerHeight]="arrowSize * 0.7"
74
+ refX="1"
75
+ [attr.refY]="arrowSize * 0.35"
76
+ orient="auto-start-reverse">
77
+ <polygon [attr.points]="'0 0, ' + arrowSize + ' ' + (arrowSize * 0.35) + ', 0 ' + (arrowSize * 0.7)"
78
+ [attr.fill]="strokeColor" />
79
+ </marker>
80
+ }
81
+ </defs>
82
+ <line x1="0" y1="50%" x2="100%" y2="50%"
83
+ [attr.stroke]="strokeColor"
84
+ [attr.stroke-width]="component.lineConfig?.strokeWidth || 1"
85
+ [attr.stroke-dasharray]="dashArray"
86
+ [attr.marker-end]="component.lineConfig?.endArrow ? 'url(#rv-arrow-end-' + component.id + ')' : null"
87
+ [attr.marker-start]="component.lineConfig?.startArrow ? 'url(#rv-arrow-start-' + component.id + ')' : null" />
88
+ </svg>
89
+ `, styles: [":host{display:block;width:100%;height:100%}.rv-line{display:block}\n"] }]
90
+ }], propDecorators: { component: [{
91
+ type: Input,
92
+ args: [{ required: true }]
93
+ }] } });
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnQtdmlld2VyL3NyYy9saWIvY29tcG9uZW50cy9saW5lLXJlbmRlcmVyL2xpbmUtcmVuZGVyZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUErQy9DLE1BQU0sT0FBTyxxQkFBcUI7SUFHaEMsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxXQUFXLElBQUksU0FBUyxDQUFDO0lBQzdELENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDNUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQztZQUM1QixLQUFLLFFBQVEsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDOytHQWpCVSxxQkFBcUI7bUdBQXJCLHFCQUFxQixnSEF2Q3RCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ1QsNklBbkNTLFlBQVk7OzRGQXlDWCxxQkFBcUI7a0JBNUNqQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsbUJBQ04sdUJBQXVCLENBQUMsTUFBTSxZQUNyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNUOzhCQU8wQixTQUFTO3NCQUFuQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50TW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29tcG9uZW50Lm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnYtbGluZS1yZW5kZXJlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3ZnIGNsYXNzPVwicnYtbGluZVwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiPlxuICAgICAgPGRlZnM+XG4gICAgICAgIEBpZiAoY29tcG9uZW50LmxpbmVDb25maWc/LmVuZEFycm93KSB7XG4gICAgICAgICAgPG1hcmtlciBbYXR0ci5pZF09XCIncnYtYXJyb3ctZW5kLScgKyBjb21wb25lbnQuaWRcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIubWFya2VyV2lkdGhdPVwiYXJyb3dTaXplXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLm1hcmtlckhlaWdodF09XCJhcnJvd1NpemUgKiAwLjdcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIucmVmWF09XCJhcnJvd1NpemUgLSAxXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnJlZlldPVwiYXJyb3dTaXplICogMC4zNVwiXG4gICAgICAgICAgICAgICAgICBvcmllbnQ9XCJhdXRvXCI+XG4gICAgICAgICAgICA8cG9seWdvbiBbYXR0ci5wb2ludHNdPVwiJzAgMCwgJyArIGFycm93U2l6ZSArICcgJyArIChhcnJvd1NpemUgKiAwLjM1KSArICcsIDAgJyArIChhcnJvd1NpemUgKiAwLjcpXCJcbiAgICAgICAgICAgICAgICAgICAgIFthdHRyLmZpbGxdPVwic3Ryb2tlQ29sb3JcIiAvPlxuICAgICAgICAgIDwvbWFya2VyPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoY29tcG9uZW50LmxpbmVDb25maWc/LnN0YXJ0QXJyb3cpIHtcbiAgICAgICAgICA8bWFya2VyIFthdHRyLmlkXT1cIidydi1hcnJvdy1zdGFydC0nICsgY29tcG9uZW50LmlkXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLm1hcmtlcldpZHRoXT1cImFycm93U2l6ZVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5tYXJrZXJIZWlnaHRdPVwiYXJyb3dTaXplICogMC43XCJcbiAgICAgICAgICAgICAgICAgIHJlZlg9XCIxXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLnJlZlldPVwiYXJyb3dTaXplICogMC4zNVwiXG4gICAgICAgICAgICAgICAgICBvcmllbnQ9XCJhdXRvLXN0YXJ0LXJldmVyc2VcIj5cbiAgICAgICAgICAgIDxwb2x5Z29uIFthdHRyLnBvaW50c109XCInMCAwLCAnICsgYXJyb3dTaXplICsgJyAnICsgKGFycm93U2l6ZSAqIDAuMzUpICsgJywgMCAnICsgKGFycm93U2l6ZSAqIDAuNylcIlxuICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJzdHJva2VDb2xvclwiIC8+XG4gICAgICAgICAgPC9tYXJrZXI+XG4gICAgICAgIH1cbiAgICAgIDwvZGVmcz5cbiAgICAgIDxsaW5lIHgxPVwiMFwiIHkxPVwiNTAlXCIgeDI9XCIxMDAlXCIgeTI9XCI1MCVcIlxuICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInN0cm9rZUNvbG9yXCJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJjb21wb25lbnQubGluZUNvbmZpZz8uc3Ryb2tlV2lkdGggfHwgMVwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cImRhc2hBcnJheVwiXG4gICAgICAgICAgICBbYXR0ci5tYXJrZXItZW5kXT1cImNvbXBvbmVudC5saW5lQ29uZmlnPy5lbmRBcnJvdyA/ICd1cmwoI3J2LWFycm93LWVuZC0nICsgY29tcG9uZW50LmlkICsgJyknIDogbnVsbFwiXG4gICAgICAgICAgICBbYXR0ci5tYXJrZXItc3RhcnRdPVwiY29tcG9uZW50LmxpbmVDb25maWc/LnN0YXJ0QXJyb3cgPyAndXJsKCNydi1hcnJvdy1zdGFydC0nICsgY29tcG9uZW50LmlkICsgJyknIDogbnVsbFwiIC8+XG4gICAgPC9zdmc+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICA6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyB9XG4gICAgLnJ2LWxpbmUgeyBkaXNwbGF5OiBibG9jazsgfVxuICBgXVxufSlcbmV4cG9ydCBjbGFzcyBMaW5lUmVuZGVyZXJDb21wb25lbnQge1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBjb21wb25lbnQhOiBDb21wb25lbnRNb2RlbDtcblxuICBnZXQgc3Ryb2tlQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQubGluZUNvbmZpZz8uc3Ryb2tlQ29sb3IgfHwgJyMwMDAwMDAnO1xuICB9XG5cbiAgZ2V0IGFycm93U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5saW5lQ29uZmlnPy5hcnJvd1NpemUgfHwgMTA7XG4gIH1cblxuICBnZXQgZGFzaEFycmF5KCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLmNvbXBvbmVudC5saW5lQ29uZmlnPy5saW5lVHlwZSkge1xuICAgICAgY2FzZSAnZGFzaGVkJzogcmV0dXJuICc4LDQnO1xuICAgICAgY2FzZSAnZG90dGVkJzogcmV0dXJuICcyLDQnO1xuICAgICAgZGVmYXVsdDogcmV0dXJuICdub25lJztcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,96 @@
1
+ import { Component, Input, ChangeDetectionStrategy, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { DataResolverService } from '../../services/data-resolver.service';
4
+ import { StyleMapperService } from '../../services/style-mapper.service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class ListRendererComponent {
8
+ constructor() {
9
+ this.dataResolver = inject(DataResolverService);
10
+ this.styleMapper = inject(StyleMapperService);
11
+ }
12
+ get listData() {
13
+ return this.dataResolver.resolveListData(this.component, this.data);
14
+ }
15
+ get listHeader() {
16
+ return this.dataResolver.resolveListHeader(this.component, this.data);
17
+ }
18
+ get headerStyles() {
19
+ const styles = this.component.style;
20
+ const result = {};
21
+ if (styles.fontFamily)
22
+ result['font-family'] = styles.fontFamily;
23
+ if (styles.fontSize)
24
+ result['font-size'] = styles.fontSize;
25
+ if (styles.color)
26
+ result['color'] = styles.color;
27
+ return result;
28
+ }
29
+ get itemStyles() {
30
+ return this.styleMapper.mapComponentStyles(this.component.style);
31
+ }
32
+ getBullet(index) {
33
+ return this.dataResolver.getBulletChar(this.component.listConfig?.bulletStyle, index);
34
+ }
35
+ formatItem(item) {
36
+ return this.dataResolver.formatListItem(item, this.component);
37
+ }
38
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ListRendererComponent, isStandalone: true, selector: "rv-list-renderer", inputs: { component: "component", data: "data" }, ngImport: i0, template: `
40
+ <div class="rv-list-container">
41
+ @if (component.listConfig?.showHeader !== false) {
42
+ <div class="rv-list-header" [ngStyle]="headerStyles">
43
+ {{ listHeader }}
44
+ </div>
45
+ }
46
+ <div class="rv-list-items">
47
+ @for (item of listData; track $index) {
48
+ <div class="rv-list-item"
49
+ [ngStyle]="itemStyles"
50
+ [class.with-bullet]="component.listConfig?.showBullets">
51
+ @if (component.listConfig?.showBullets) {
52
+ <span class="rv-bullet">{{ getBullet($index) }}</span>
53
+ }
54
+ <span class="rv-item-content">{{ formatItem(item) }}</span>
55
+ </div>
56
+ }
57
+ @if (listData.length === 0) {
58
+ <div class="rv-list-empty">No data available</div>
59
+ }
60
+ </div>
61
+ </div>
62
+ `, isInline: true, styles: [".rv-list-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;overflow:hidden}.rv-list-header{padding:6px 8px;font-weight:600;border-bottom:1px solid #e0e0e0;background:#f5f5f5}.rv-list-items{flex:1;overflow:auto}.rv-list-item{padding:4px 8px;border-bottom:1px solid #f0f0f0;font-size:inherit}.rv-list-item.with-bullet{display:flex;align-items:flex-start;gap:8px}.rv-bullet{min-width:16px;color:#666}.rv-item-content{flex:1}.rv-list-item:last-child{border-bottom:none}.rv-list-empty{padding:8px;color:#999;font-style:italic;font-size:11px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ListRendererComponent, decorators: [{
65
+ type: Component,
66
+ args: [{ selector: 'rv-list-renderer', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
67
+ <div class="rv-list-container">
68
+ @if (component.listConfig?.showHeader !== false) {
69
+ <div class="rv-list-header" [ngStyle]="headerStyles">
70
+ {{ listHeader }}
71
+ </div>
72
+ }
73
+ <div class="rv-list-items">
74
+ @for (item of listData; track $index) {
75
+ <div class="rv-list-item"
76
+ [ngStyle]="itemStyles"
77
+ [class.with-bullet]="component.listConfig?.showBullets">
78
+ @if (component.listConfig?.showBullets) {
79
+ <span class="rv-bullet">{{ getBullet($index) }}</span>
80
+ }
81
+ <span class="rv-item-content">{{ formatItem(item) }}</span>
82
+ </div>
83
+ }
84
+ @if (listData.length === 0) {
85
+ <div class="rv-list-empty">No data available</div>
86
+ }
87
+ </div>
88
+ </div>
89
+ `, styles: [".rv-list-container{width:100%;height:100%;display:flex;flex-direction:column;background:#fff;overflow:hidden}.rv-list-header{padding:6px 8px;font-weight:600;border-bottom:1px solid #e0e0e0;background:#f5f5f5}.rv-list-items{flex:1;overflow:auto}.rv-list-item{padding:4px 8px;border-bottom:1px solid #f0f0f0;font-size:inherit}.rv-list-item.with-bullet{display:flex;align-items:flex-start;gap:8px}.rv-bullet{min-width:16px;color:#666}.rv-item-content{flex:1}.rv-list-item:last-child{border-bottom:none}.rv-list-empty{padding:8px;color:#999;font-style:italic;font-size:11px}\n"] }]
90
+ }], propDecorators: { component: [{
91
+ type: Input,
92
+ args: [{ required: true }]
93
+ }], data: [{
94
+ type: Input
95
+ }] } });
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnQtdmlld2VyL3NyYy9saWIvY29tcG9uZW50cy9saXN0LXJlbmRlcmVyL2xpc3QtcmVuZGVyZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7OztBQW9FekUsTUFBTSxPQUFPLHFCQUFxQjtJQWxFbEM7UUFzRVUsaUJBQVksR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMzQyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0tBOEJsRDtJQTVCQyxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3BDLE1BQU0sTUFBTSxHQUEyQixFQUFFLENBQUM7UUFDMUMsSUFBSSxNQUFNLENBQUMsVUFBVTtZQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ2pFLElBQUksTUFBTSxDQUFDLFFBQVE7WUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUMzRCxJQUFJLE1BQU0sQ0FBQyxLQUFLO1lBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDakQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBYTtRQUNyQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7K0dBbENVLHFCQUFxQjttR0FBckIscUJBQXFCLDhIQTdEdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJULHFvQkF6QlMsWUFBWTs7NEZBK0RYLHFCQUFxQjtrQkFsRWpDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBQ2hCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCVDs4QkF1QzBCLFNBQVM7c0JBQW5DLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNoQixJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50TW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7IERhdGFSZXNvbHZlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhLXJlc29sdmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3R5bGVNYXBwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3R5bGUtbWFwcGVyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdydi1saXN0LXJlbmRlcmVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJydi1saXN0LWNvbnRhaW5lclwiPlxuICAgICAgQGlmIChjb21wb25lbnQubGlzdENvbmZpZz8uc2hvd0hlYWRlciAhPT0gZmFsc2UpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWxpc3QtaGVhZGVyXCIgW25nU3R5bGVdPVwiaGVhZGVyU3R5bGVzXCI+XG4gICAgICAgICAge3sgbGlzdEhlYWRlciB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgY2xhc3M9XCJydi1saXN0LWl0ZW1zXCI+XG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgbGlzdERhdGE7IHRyYWNrICRpbmRleCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJydi1saXN0LWl0ZW1cIlxuICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiaXRlbVN0eWxlc1wiXG4gICAgICAgICAgICAgICBbY2xhc3Mud2l0aC1idWxsZXRdPVwiY29tcG9uZW50Lmxpc3RDb25maWc/LnNob3dCdWxsZXRzXCI+XG4gICAgICAgICAgICBAaWYgKGNvbXBvbmVudC5saXN0Q29uZmlnPy5zaG93QnVsbGV0cykge1xuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJ2LWJ1bGxldFwiPnt7IGdldEJ1bGxldCgkaW5kZXgpIH19PC9zcGFuPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJydi1pdGVtLWNvbnRlbnRcIj57eyBmb3JtYXRJdGVtKGl0ZW0pIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAobGlzdERhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJ2LWxpc3QtZW1wdHlcIj5ObyBkYXRhIGF2YWlsYWJsZTwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIC5ydi1saXN0LWNvbnRhaW5lciB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuICAgIC5ydi1saXN0LWhlYWRlciB7XG4gICAgICBwYWRkaW5nOiA2cHggOHB4O1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZTBlMGUwO1xuICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcbiAgICB9XG4gICAgLnJ2LWxpc3QtaXRlbXMgeyBmbGV4OiAxOyBvdmVyZmxvdzogYXV0bzsgfVxuICAgIC5ydi1saXN0LWl0ZW0ge1xuICAgICAgcGFkZGluZzogNHB4IDhweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjBmMGYwO1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIH1cbiAgICAucnYtbGlzdC1pdGVtLndpdGgtYnVsbGV0IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgIGdhcDogOHB4O1xuICAgIH1cbiAgICAucnYtYnVsbGV0IHsgbWluLXdpZHRoOiAxNnB4OyBjb2xvcjogIzY2NjsgfVxuICAgIC5ydi1pdGVtLWNvbnRlbnQgeyBmbGV4OiAxOyB9XG4gICAgLnJ2LWxpc3QtaXRlbTpsYXN0LWNoaWxkIHsgYm9yZGVyLWJvdHRvbTogbm9uZTsgfVxuICAgIC5ydi1saXN0LWVtcHR5IHtcbiAgICAgIHBhZGRpbmc6IDhweDtcbiAgICAgIGNvbG9yOiAjOTk5O1xuICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgTGlzdFJlbmRlcmVyQ29tcG9uZW50IHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgY29tcG9uZW50ITogQ29tcG9uZW50TW9kZWw7XG4gIEBJbnB1dCgpIGRhdGE6IGFueTtcblxuICBwcml2YXRlIGRhdGFSZXNvbHZlciA9IGluamVjdChEYXRhUmVzb2x2ZXJTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBzdHlsZU1hcHBlciA9IGluamVjdChTdHlsZU1hcHBlclNlcnZpY2UpO1xuXG4gIGdldCBsaXN0RGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVJlc29sdmVyLnJlc29sdmVMaXN0RGF0YSh0aGlzLmNvbXBvbmVudCwgdGhpcy5kYXRhKTtcbiAgfVxuXG4gIGdldCBsaXN0SGVhZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVJlc29sdmVyLnJlc29sdmVMaXN0SGVhZGVyKHRoaXMuY29tcG9uZW50LCB0aGlzLmRhdGEpO1xuICB9XG5cbiAgZ2V0IGhlYWRlclN0eWxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzdHlsZXMgPSB0aGlzLmNvbXBvbmVudC5zdHlsZTtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBpZiAoc3R5bGVzLmZvbnRGYW1pbHkpIHJlc3VsdFsnZm9udC1mYW1pbHknXSA9IHN0eWxlcy5mb250RmFtaWx5O1xuICAgIGlmIChzdHlsZXMuZm9udFNpemUpIHJlc3VsdFsnZm9udC1zaXplJ10gPSBzdHlsZXMuZm9udFNpemU7XG4gICAgaWYgKHN0eWxlcy5jb2xvcikgcmVzdWx0Wydjb2xvciddID0gc3R5bGVzLmNvbG9yO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXQgaXRlbVN0eWxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5zdHlsZU1hcHBlci5tYXBDb21wb25lbnRTdHlsZXModGhpcy5jb21wb25lbnQuc3R5bGUpO1xuICB9XG5cbiAgZ2V0QnVsbGV0KGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGFSZXNvbHZlci5nZXRCdWxsZXRDaGFyKHRoaXMuY29tcG9uZW50Lmxpc3RDb25maWc/LmJ1bGxldFN0eWxlLCBpbmRleCk7XG4gIH1cblxuICBmb3JtYXRJdGVtKGl0ZW06IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVJlc29sdmVyLmZvcm1hdExpc3RJdGVtKGl0ZW0sIHRoaXMuY29tcG9uZW50KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,67 @@
1
+ import { Component, Input, ChangeDetectionStrategy, inject, signal } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { DataResolverService } from '../../services/data-resolver.service';
4
+ import QRCode from 'qrcode';
5
+ import * as i0 from "@angular/core";
6
+ export class QrcodeRendererComponent {
7
+ constructor() {
8
+ this.pageNumber = 1;
9
+ this.totalPages = 1;
10
+ this.reportTitle = '';
11
+ this.qrDataUrl = signal('');
12
+ this.dataResolver = inject(DataResolverService);
13
+ }
14
+ ngOnChanges(changes) {
15
+ this.generateQrCode();
16
+ }
17
+ generateQrCode() {
18
+ const content = this.dataResolver.resolveContent(this.component, this.data, this.pageNumber, this.totalPages, this.reportTitle) || 'QR Code';
19
+ QRCode.toDataURL(content, {
20
+ width: 256,
21
+ margin: 1,
22
+ color: { dark: '#000000', light: '#ffffff' },
23
+ }).then(url => {
24
+ this.qrDataUrl.set(url);
25
+ }).catch(() => {
26
+ // Keep placeholder on error
27
+ });
28
+ }
29
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: QrcodeRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: QrcodeRendererComponent, isStandalone: true, selector: "rv-qrcode-renderer", inputs: { component: "component", data: "data", pageNumber: "pageNumber", totalPages: "totalPages", reportTitle: "reportTitle" }, usesOnChanges: true, ngImport: i0, template: `
31
+ @if (qrDataUrl()) {
32
+ <img [src]="qrDataUrl()" alt="QR Code" class="rv-qr-image">
33
+ } @else {
34
+ <div class="rv-qr-placeholder">
35
+ <svg width="48" height="48" viewBox="0 0 24 24" fill="#333">
36
+ <path d="M3 11h8V3H3v8zm2-6h4v4H5V5zM3 21h8v-8H3v8zm2-6h4v4H5v-4zM13 3v8h8V3h-8zm6 6h-4V5h4v4zM13 13h2v2h-2zM15 15h2v2h-2zM13 17h2v2h-2zM17 13h2v2h-2zM19 15h2v2h-2zM17 17h2v2h-2zM15 19h2v2h-2zM19 19h2v2h-2z"/>
37
+ </svg>
38
+ </div>
39
+ }
40
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.rv-qr-image{width:100%;height:100%;object-fit:contain;display:block}.rv-qr-placeholder{display:flex;align-items:center;justify-content:center;width:100%;height:100%;background:#f5f5f5;border:1px solid #ddd}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
41
+ }
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: QrcodeRendererComponent, decorators: [{
43
+ type: Component,
44
+ args: [{ selector: 'rv-qrcode-renderer', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
45
+ @if (qrDataUrl()) {
46
+ <img [src]="qrDataUrl()" alt="QR Code" class="rv-qr-image">
47
+ } @else {
48
+ <div class="rv-qr-placeholder">
49
+ <svg width="48" height="48" viewBox="0 0 24 24" fill="#333">
50
+ <path d="M3 11h8V3H3v8zm2-6h4v4H5V5zM3 21h8v-8H3v8zm2-6h4v4H5v-4zM13 3v8h8V3h-8zm6 6h-4V5h4v4zM13 13h2v2h-2zM15 15h2v2h-2zM13 17h2v2h-2zM17 13h2v2h-2zM19 15h2v2h-2zM17 17h2v2h-2zM15 19h2v2h-2zM19 19h2v2h-2z"/>
51
+ </svg>
52
+ </div>
53
+ }
54
+ `, styles: [":host{display:block;width:100%;height:100%}.rv-qr-image{width:100%;height:100%;object-fit:contain;display:block}.rv-qr-placeholder{display:flex;align-items:center;justify-content:center;width:100%;height:100%;background:#f5f5f5;border:1px solid #ddd}\n"] }]
55
+ }], propDecorators: { component: [{
56
+ type: Input,
57
+ args: [{ required: true }]
58
+ }], data: [{
59
+ type: Input
60
+ }], pageNumber: [{
61
+ type: Input
62
+ }], totalPages: [{
63
+ type: Input
64
+ }], reportTitle: [{
65
+ type: Input
66
+ }] } });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXJjb2RlLXJlbmRlcmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydC12aWV3ZXIvc3JjL2xpYi9jb21wb25lbnRzL3FyY29kZS1yZW5kZXJlci9xcmNvZGUtcmVuZGVyZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUE0QixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7O0FBZ0M1QixNQUFNLE9BQU8sdUJBQXVCO0lBOUJwQztRQWlDVyxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBRTFCLGNBQVMsR0FBRyxNQUFNLENBQVMsRUFBRSxDQUFDLENBQUM7UUFFdkIsaUJBQVksR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztLQXFCcEQ7SUFuQkMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU8sY0FBYztRQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FDOUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUM5RSxJQUFJLFNBQVMsQ0FBQztRQUVmLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQ3hCLEtBQUssRUFBRSxHQUFHO1lBQ1YsTUFBTSxFQUFFLENBQUM7WUFDVCxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7U0FDN0MsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDWiw0QkFBNEI7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQTdCVSx1QkFBdUI7bUdBQXZCLHVCQUF1QixxT0F6QnhCOzs7Ozs7Ozs7O0dBVVQscVVBWlMsWUFBWTs7NEZBMkJYLHVCQUF1QjtrQkE5Qm5DLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7O0dBVVQ7OEJBZ0IwQixTQUFTO3NCQUFuQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDaEIsSUFBSTtzQkFBWixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgRGF0YVJlc29sdmVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2RhdGEtcmVzb2x2ZXIuc2VydmljZSc7XG5pbXBvcnQgUVJDb2RlIGZyb20gJ3FyY29kZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3J2LXFyY29kZS1yZW5kZXJlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKHFyRGF0YVVybCgpKSB7XG4gICAgICA8aW1nIFtzcmNdPVwicXJEYXRhVXJsKClcIiBhbHQ9XCJRUiBDb2RlXCIgY2xhc3M9XCJydi1xci1pbWFnZVwiPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPGRpdiBjbGFzcz1cInJ2LXFyLXBsYWNlaG9sZGVyXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCIjMzMzXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk0zIDExaDhWM0gzdjh6bTItNmg0djRINVY1ek0zIDIxaDh2LThIM3Y4em0yLTZoNHY0SDV2LTR6TTEzIDN2OGg4VjNoLTh6bTYgNmgtNFY1aDR2NHpNMTMgMTNoMnYyaC0yek0xNSAxNWgydjJoLTJ6TTEzIDE3aDJ2MmgtMnpNMTcgMTNoMnYyaC0yek0xOSAxNWgydjJoLTJ6TTE3IDE3aDJ2MmgtMnpNMTUgMTloMnYyaC0yek0xOSAxOWgydjJoLTJ6XCIvPlxuICAgICAgICA8L3N2Zz5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IH1cbiAgICAucnYtcXItaW1hZ2UgeyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyBvYmplY3QtZml0OiBjb250YWluOyBkaXNwbGF5OiBibG9jazsgfVxuICAgIC5ydi1xci1wbGFjZWhvbGRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RkZDtcbiAgICB9XG4gIGBdXG59KVxuZXhwb3J0IGNsYXNzIFFyY29kZVJlbmRlcmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgY29tcG9uZW50ITogQ29tcG9uZW50TW9kZWw7XG4gIEBJbnB1dCgpIGRhdGE6IGFueTtcbiAgQElucHV0KCkgcGFnZU51bWJlciA9IDE7XG4gIEBJbnB1dCgpIHRvdGFsUGFnZXMgPSAxO1xuICBASW5wdXQoKSByZXBvcnRUaXRsZSA9ICcnO1xuXG4gIHFyRGF0YVVybCA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcblxuICBwcml2YXRlIGRhdGFSZXNvbHZlciA9IGluamVjdChEYXRhUmVzb2x2ZXJTZXJ2aWNlKTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgdGhpcy5nZW5lcmF0ZVFyQ29kZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVFyQ29kZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5kYXRhUmVzb2x2ZXIucmVzb2x2ZUNvbnRlbnQoXG4gICAgICB0aGlzLmNvbXBvbmVudCwgdGhpcy5kYXRhLCB0aGlzLnBhZ2VOdW1iZXIsIHRoaXMudG90YWxQYWdlcywgdGhpcy5yZXBvcnRUaXRsZVxuICAgICkgfHwgJ1FSIENvZGUnO1xuXG4gICAgUVJDb2RlLnRvRGF0YVVSTChjb250ZW50LCB7XG4gICAgICB3aWR0aDogMjU2LFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgY29sb3I6IHsgZGFyazogJyMwMDAwMDAnLCBsaWdodDogJyNmZmZmZmYnIH0sXG4gICAgfSkudGhlbih1cmwgPT4ge1xuICAgICAgdGhpcy5xckRhdGFVcmwuc2V0KHVybCk7XG4gICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgLy8gS2VlcCBwbGFjZWhvbGRlciBvbiBlcnJvclxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,133 @@
1
+ import { Component, Input, ChangeDetectionStrategy } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ export class ShapeRendererComponent {
5
+ get fillColor() { return this.component.shapeConfig?.fillColor || '#e3f2fd'; }
6
+ get strokeColor() { return this.component.shapeConfig?.strokeColor || '#1976d2'; }
7
+ get strokeWidth() { return this.component.shapeConfig?.strokeWidth || 2; }
8
+ get opacity() { return this.component.shapeConfig?.opacity || 1; }
9
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ShapeRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
10
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: ShapeRendererComponent, isStandalone: true, selector: "rv-shape-renderer", inputs: { component: "component" }, ngImport: i0, template: `
11
+ <svg class="rv-shape" width="100%" height="100%" viewBox="0 0 100 100" preserveAspectRatio="none">
12
+ @switch (component.shapeConfig?.shapeType) {
13
+ @case ('rectangle') {
14
+ <rect x="2" y="2" width="96" height="96"
15
+ [attr.rx]="component.shapeConfig?.cornerRadius || 0"
16
+ [attr.ry]="component.shapeConfig?.cornerRadius || 0"
17
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
18
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
19
+ }
20
+ @case ('circle') {
21
+ <circle cx="50" cy="50" r="48"
22
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
23
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
24
+ }
25
+ @case ('ellipse') {
26
+ <ellipse cx="50" cy="50" rx="48" ry="48"
27
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
28
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
29
+ }
30
+ @case ('triangle') {
31
+ <polygon points="50,2 98,98 2,98"
32
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
33
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
34
+ }
35
+ @case ('diamond') {
36
+ <polygon points="50,2 98,50 50,98 2,50"
37
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
38
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
39
+ }
40
+ @case ('pentagon') {
41
+ <polygon points="50,2 97,38 79,97 21,97 3,38"
42
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
43
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
44
+ }
45
+ @case ('hexagon') {
46
+ <polygon points="50,2 93,25 93,75 50,98 7,75 7,25"
47
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
48
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
49
+ }
50
+ @case ('star') {
51
+ <polygon points="50,2 61,39 98,39 68,61 79,98 50,75 21,98 32,61 2,39 39,39"
52
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
53
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
54
+ }
55
+ @case ('arrow') {
56
+ <polygon points="2,35 60,35 60,15 98,50 60,85 60,65 2,65"
57
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
58
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
59
+ }
60
+ @default {
61
+ <rect x="2" y="2" width="96" height="96"
62
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
63
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
64
+ }
65
+ }
66
+ </svg>
67
+ `, isInline: true, styles: [":host{display:block;width:100%;height:100%}.rv-shape{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
68
+ }
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ShapeRendererComponent, decorators: [{
70
+ type: Component,
71
+ args: [{ selector: 'rv-shape-renderer', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
72
+ <svg class="rv-shape" width="100%" height="100%" viewBox="0 0 100 100" preserveAspectRatio="none">
73
+ @switch (component.shapeConfig?.shapeType) {
74
+ @case ('rectangle') {
75
+ <rect x="2" y="2" width="96" height="96"
76
+ [attr.rx]="component.shapeConfig?.cornerRadius || 0"
77
+ [attr.ry]="component.shapeConfig?.cornerRadius || 0"
78
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
79
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
80
+ }
81
+ @case ('circle') {
82
+ <circle cx="50" cy="50" r="48"
83
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
84
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
85
+ }
86
+ @case ('ellipse') {
87
+ <ellipse cx="50" cy="50" rx="48" ry="48"
88
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
89
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
90
+ }
91
+ @case ('triangle') {
92
+ <polygon points="50,2 98,98 2,98"
93
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
94
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
95
+ }
96
+ @case ('diamond') {
97
+ <polygon points="50,2 98,50 50,98 2,50"
98
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
99
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
100
+ }
101
+ @case ('pentagon') {
102
+ <polygon points="50,2 97,38 79,97 21,97 3,38"
103
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
104
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
105
+ }
106
+ @case ('hexagon') {
107
+ <polygon points="50,2 93,25 93,75 50,98 7,75 7,25"
108
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
109
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
110
+ }
111
+ @case ('star') {
112
+ <polygon points="50,2 61,39 98,39 68,61 79,98 50,75 21,98 32,61 2,39 39,39"
113
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
114
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
115
+ }
116
+ @case ('arrow') {
117
+ <polygon points="2,35 60,35 60,15 98,50 60,85 60,65 2,65"
118
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
119
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
120
+ }
121
+ @default {
122
+ <rect x="2" y="2" width="96" height="96"
123
+ [attr.fill]="fillColor" [attr.stroke]="strokeColor"
124
+ [attr.stroke-width]="strokeWidth" [attr.opacity]="opacity" />
125
+ }
126
+ }
127
+ </svg>
128
+ `, styles: [":host{display:block;width:100%;height:100%}.rv-shape{display:block}\n"] }]
129
+ }], propDecorators: { component: [{
130
+ type: Input,
131
+ args: [{ required: true }]
132
+ }] } });
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcGUtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0LXZpZXdlci9zcmMvbGliL2NvbXBvbmVudHMvc2hhcGUtcmVuZGVyZXIvc2hhcGUtcmVuZGVyZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUF1RS9DLE1BQU0sT0FBTyxzQkFBc0I7SUFHakMsSUFBSSxTQUFTLEtBQWEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxTQUFTLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN0RixJQUFJLFdBQVcsS0FBYSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFdBQVcsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzFGLElBQUksV0FBVyxLQUFhLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEYsSUFBSSxPQUFPLEtBQWEsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzsrR0FOL0Qsc0JBQXNCO21HQUF0QixzQkFBc0IsaUhBL0R2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURULDhJQTNEUyxZQUFZOzs0RkFpRVgsc0JBQXNCO2tCQXBFbEMsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUNOLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlEVDs4QkFPMEIsU0FBUztzQkFBbkMsS0FBSzt1QkFBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbXBvbmVudC5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3J2LXNoYXBlLXJlbmRlcmVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxzdmcgY2xhc3M9XCJydi1zaGFwZVwiIHdpZHRoPVwiMTAwJVwiIGhlaWdodD1cIjEwMCVcIiB2aWV3Qm94PVwiMCAwIDEwMCAxMDBcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiPlxuICAgICAgQHN3aXRjaCAoY29tcG9uZW50LnNoYXBlQ29uZmlnPy5zaGFwZVR5cGUpIHtcbiAgICAgICAgQGNhc2UgKCdyZWN0YW5nbGUnKSB7XG4gICAgICAgICAgPHJlY3QgeD1cIjJcIiB5PVwiMlwiIHdpZHRoPVwiOTZcIiBoZWlnaHQ9XCI5NlwiXG4gICAgICAgICAgICAgICAgW2F0dHIucnhdPVwiY29tcG9uZW50LnNoYXBlQ29uZmlnPy5jb3JuZXJSYWRpdXMgfHwgMFwiXG4gICAgICAgICAgICAgICAgW2F0dHIucnldPVwiY29tcG9uZW50LnNoYXBlQ29uZmlnPy5jb3JuZXJSYWRpdXMgfHwgMFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJmaWxsQ29sb3JcIiBbYXR0ci5zdHJva2VdPVwic3Ryb2tlQ29sb3JcIlxuICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJzdHJva2VXaWR0aFwiIFthdHRyLm9wYWNpdHldPVwib3BhY2l0eVwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdjaXJjbGUnKSB7XG4gICAgICAgICAgPGNpcmNsZSBjeD1cIjUwXCIgY3k9XCI1MFwiIHI9XCI0OFwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cImZpbGxDb2xvclwiIFthdHRyLnN0cm9rZV09XCJzdHJva2VDb2xvclwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwic3Ryb2tlV2lkdGhcIiBbYXR0ci5vcGFjaXR5XT1cIm9wYWNpdHlcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnZWxsaXBzZScpIHtcbiAgICAgICAgICA8ZWxsaXBzZSBjeD1cIjUwXCIgY3k9XCI1MFwiIHJ4PVwiNDhcIiByeT1cIjQ4XCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cImZpbGxDb2xvclwiIFthdHRyLnN0cm9rZV09XCJzdHJva2VDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLXdpZHRoXT1cInN0cm9rZVdpZHRoXCIgW2F0dHIub3BhY2l0eV09XCJvcGFjaXR5XCIgLz5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoJ3RyaWFuZ2xlJykge1xuICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjUwLDIgOTgsOTggMiw5OFwiXG4gICAgICAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJmaWxsQ29sb3JcIiBbYXR0ci5zdHJva2VdPVwic3Ryb2tlQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJzdHJva2VXaWR0aFwiIFthdHRyLm9wYWNpdHldPVwib3BhY2l0eVwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdkaWFtb25kJykge1xuICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjUwLDIgOTgsNTAgNTAsOTggMiw1MFwiXG4gICAgICAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJmaWxsQ29sb3JcIiBbYXR0ci5zdHJva2VdPVwic3Ryb2tlQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJzdHJva2VXaWR0aFwiIFthdHRyLm9wYWNpdHldPVwib3BhY2l0eVwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdwZW50YWdvbicpIHtcbiAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1MCwyIDk3LDM4IDc5LDk3IDIxLDk3IDMsMzhcIlxuICAgICAgICAgICAgICAgICAgIFthdHRyLmZpbGxdPVwiZmlsbENvbG9yXCIgW2F0dHIuc3Ryb2tlXT1cInN0cm9rZUNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwic3Ryb2tlV2lkdGhcIiBbYXR0ci5vcGFjaXR5XT1cIm9wYWNpdHlcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlICgnaGV4YWdvbicpIHtcbiAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1MCwyIDkzLDI1IDkzLDc1IDUwLDk4IDcsNzUgNywyNVwiXG4gICAgICAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJmaWxsQ29sb3JcIiBbYXR0ci5zdHJva2VdPVwic3Ryb2tlQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJzdHJva2VXaWR0aFwiIFthdHRyLm9wYWNpdHldPVwib3BhY2l0eVwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdzdGFyJykge1xuICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz1cIjUwLDIgNjEsMzkgOTgsMzkgNjgsNjEgNzksOTggNTAsNzUgMjEsOTggMzIsNjEgMiwzOSAzOSwzOVwiXG4gICAgICAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJmaWxsQ29sb3JcIiBbYXR0ci5zdHJva2VdPVwic3Ryb2tlQ29sb3JcIlxuICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJzdHJva2VXaWR0aFwiIFthdHRyLm9wYWNpdHldPVwib3BhY2l0eVwiIC8+XG4gICAgICAgIH1cbiAgICAgICAgQGNhc2UgKCdhcnJvdycpIHtcbiAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCIyLDM1IDYwLDM1IDYwLDE1IDk4LDUwIDYwLDg1IDYwLDY1IDIsNjVcIlxuICAgICAgICAgICAgICAgICAgIFthdHRyLmZpbGxdPVwiZmlsbENvbG9yXCIgW2F0dHIuc3Ryb2tlXT1cInN0cm9rZUNvbG9yXCJcbiAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwic3Ryb2tlV2lkdGhcIiBbYXR0ci5vcGFjaXR5XT1cIm9wYWNpdHlcIiAvPlxuICAgICAgICB9XG4gICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICA8cmVjdCB4PVwiMlwiIHk9XCIyXCIgd2lkdGg9XCI5NlwiIGhlaWdodD1cIjk2XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cImZpbGxDb2xvclwiIFthdHRyLnN0cm9rZV09XCJzdHJva2VDb2xvclwiXG4gICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLXdpZHRoXT1cInN0cm9rZVdpZHRoXCIgW2F0dHIub3BhY2l0eV09XCJvcGFjaXR5XCIgLz5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIDwvc3ZnPlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgfVxuICAgIC5ydi1zaGFwZSB7IGRpc3BsYXk6IGJsb2NrOyB9XG4gIGBdXG59KVxuZXhwb3J0IGNsYXNzIFNoYXBlUmVuZGVyZXJDb21wb25lbnQge1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBjb21wb25lbnQhOiBDb21wb25lbnRNb2RlbDtcblxuICBnZXQgZmlsbENvbG9yKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmNvbXBvbmVudC5zaGFwZUNvbmZpZz8uZmlsbENvbG9yIHx8ICcjZTNmMmZkJzsgfVxuICBnZXQgc3Ryb2tlQ29sb3IoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuY29tcG9uZW50LnNoYXBlQ29uZmlnPy5zdHJva2VDb2xvciB8fCAnIzE5NzZkMic7IH1cbiAgZ2V0IHN0cm9rZVdpZHRoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmNvbXBvbmVudC5zaGFwZUNvbmZpZz8uc3Ryb2tlV2lkdGggfHwgMjsgfVxuICBnZXQgb3BhY2l0eSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5jb21wb25lbnQuc2hhcGVDb25maWc/Lm9wYWNpdHkgfHwgMTsgfVxufVxuIl19
@@ -0,0 +1,148 @@
1
+ import { Component, Input, ChangeDetectionStrategy, inject } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { DataResolverService } from '../../services/data-resolver.service';
4
+ import { StyleMapperService } from '../../services/style-mapper.service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class TableRendererComponent {
8
+ constructor() {
9
+ this.dataResolver = inject(DataResolverService);
10
+ this.styleMapper = inject(StyleMapperService);
11
+ }
12
+ get tableData() {
13
+ return this.dataResolver.resolveTableData(this.component, this.data);
14
+ }
15
+ get isDynamic() {
16
+ return this.dataResolver.shouldShowDynamicTable(this.component, this.data);
17
+ }
18
+ get dynamicHeaders() {
19
+ return this.dataResolver.getDynamicTableHeaders(this.component, this.data);
20
+ }
21
+ get tableStyle() {
22
+ return this.styleMapper.mapTableStyle(this.component);
23
+ }
24
+ getHeaderStyle(colIndex, col) {
25
+ return this.styleMapper.mapHeaderStyle(this.component, colIndex, col);
26
+ }
27
+ getRowStyle(rowIndex) {
28
+ return this.styleMapper.mapRowStyle(this.component, rowIndex, this.tableData.length);
29
+ }
30
+ getBoundCellStyle(colIndex, col) {
31
+ return this.styleMapper.mapCellStyle(this.component, colIndex, col);
32
+ }
33
+ getDynamicCellStyle(colIndex) {
34
+ return this.styleMapper.mapCellStyle(this.component, colIndex);
35
+ }
36
+ formatCell(row, col) {
37
+ return this.dataResolver.formatCellValue(row, col);
38
+ }
39
+ getCellValue(row, field) {
40
+ return this.dataResolver.getDynamicCellValue(row, field);
41
+ }
42
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
43
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: TableRendererComponent, isStandalone: true, selector: "rv-table-renderer", inputs: { component: "component", data: "data" }, ngImport: i0, template: `
44
+ @if (component.columns) {
45
+ @if (isDynamic) {
46
+ <table class="rv-table rv-dynamic-table" [ngStyle]="tableStyle">
47
+ <thead>
48
+ <tr>
49
+ @for (field of dynamicHeaders; track field; let colIdx = $index) {
50
+ <th [ngStyle]="getHeaderStyle(colIdx)">{{ field }}</th>
51
+ }
52
+ </tr>
53
+ </thead>
54
+ <tbody>
55
+ @for (row of tableData; track rowIdx; let rowIdx = $index) {
56
+ <tr [ngStyle]="getRowStyle(rowIdx)">
57
+ @for (field of dynamicHeaders; track field; let colIdx = $index) {
58
+ <td [ngStyle]="getDynamicCellStyle(colIdx)">{{ getCellValue(row, field) }}</td>
59
+ }
60
+ </tr>
61
+ }
62
+ </tbody>
63
+ </table>
64
+ } @else {
65
+ <table class="rv-table" [ngStyle]="tableStyle">
66
+ <thead>
67
+ <tr>
68
+ @for (col of component.columns; track col.id; let colIdx = $index) {
69
+ <th [ngStyle]="getHeaderStyle(colIdx, col)">{{ col.header }}</th>
70
+ }
71
+ </tr>
72
+ </thead>
73
+ <tbody>
74
+ @for (row of tableData; track rowIdx; let rowIdx = $index) {
75
+ <tr [ngStyle]="getRowStyle(rowIdx)">
76
+ @for (col of component.columns; track col.id; let colIdx = $index) {
77
+ <td [ngStyle]="getBoundCellStyle(colIdx, col)">{{ formatCell(row, col) }}</td>
78
+ }
79
+ </tr>
80
+ }
81
+ @if (tableData.length === 0) {
82
+ <tr>
83
+ <td [attr.colspan]="component.columns!.length" class="rv-no-data">No data available</td>
84
+ </tr>
85
+ }
86
+ </tbody>
87
+ </table>
88
+ }
89
+ }
90
+ `, isInline: true, styles: [".rv-table{width:100%;border-collapse:collapse;font-size:inherit}.rv-table th,.rv-table td{border:1px solid #ddd;padding:6px 8px;text-align:left}.rv-table th{background:#f5f5f5;font-weight:600}.rv-no-data{text-align:center;color:#999;font-style:italic;padding:20px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
91
+ }
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TableRendererComponent, decorators: [{
93
+ type: Component,
94
+ args: [{ selector: 'rv-table-renderer', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
95
+ @if (component.columns) {
96
+ @if (isDynamic) {
97
+ <table class="rv-table rv-dynamic-table" [ngStyle]="tableStyle">
98
+ <thead>
99
+ <tr>
100
+ @for (field of dynamicHeaders; track field; let colIdx = $index) {
101
+ <th [ngStyle]="getHeaderStyle(colIdx)">{{ field }}</th>
102
+ }
103
+ </tr>
104
+ </thead>
105
+ <tbody>
106
+ @for (row of tableData; track rowIdx; let rowIdx = $index) {
107
+ <tr [ngStyle]="getRowStyle(rowIdx)">
108
+ @for (field of dynamicHeaders; track field; let colIdx = $index) {
109
+ <td [ngStyle]="getDynamicCellStyle(colIdx)">{{ getCellValue(row, field) }}</td>
110
+ }
111
+ </tr>
112
+ }
113
+ </tbody>
114
+ </table>
115
+ } @else {
116
+ <table class="rv-table" [ngStyle]="tableStyle">
117
+ <thead>
118
+ <tr>
119
+ @for (col of component.columns; track col.id; let colIdx = $index) {
120
+ <th [ngStyle]="getHeaderStyle(colIdx, col)">{{ col.header }}</th>
121
+ }
122
+ </tr>
123
+ </thead>
124
+ <tbody>
125
+ @for (row of tableData; track rowIdx; let rowIdx = $index) {
126
+ <tr [ngStyle]="getRowStyle(rowIdx)">
127
+ @for (col of component.columns; track col.id; let colIdx = $index) {
128
+ <td [ngStyle]="getBoundCellStyle(colIdx, col)">{{ formatCell(row, col) }}</td>
129
+ }
130
+ </tr>
131
+ }
132
+ @if (tableData.length === 0) {
133
+ <tr>
134
+ <td [attr.colspan]="component.columns!.length" class="rv-no-data">No data available</td>
135
+ </tr>
136
+ }
137
+ </tbody>
138
+ </table>
139
+ }
140
+ }
141
+ `, styles: [".rv-table{width:100%;border-collapse:collapse;font-size:inherit}.rv-table th,.rv-table td{border:1px solid #ddd;padding:6px 8px;text-align:left}.rv-table th{background:#f5f5f5;font-weight:600}.rv-no-data{text-align:center;color:#999;font-style:italic;padding:20px}\n"] }]
142
+ }], propDecorators: { component: [{
143
+ type: Input,
144
+ args: [{ required: true }]
145
+ }], data: [{
146
+ type: Input
147
+ }] } });
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcmVuZGVyZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0LXZpZXdlci9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUtcmVuZGVyZXIvdGFibGUtcmVuZGVyZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7OztBQThFekUsTUFBTSxPQUFPLHNCQUFzQjtJQTVFbkM7UUFnRlUsaUJBQVksR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMzQyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0tBeUNsRDtJQXZDQyxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELGNBQWMsQ0FBQyxRQUFnQixFQUFFLEdBQVM7UUFDeEMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQWdCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsaUJBQWlCLENBQUMsUUFBZ0IsRUFBRSxHQUFTO1FBQzNDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELG1CQUFtQixDQUFDLFFBQWdCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQVEsRUFBRSxHQUFRO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCxZQUFZLENBQUMsR0FBUSxFQUFFLEtBQWE7UUFDbEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzRCxDQUFDOytHQTdDVSxzQkFBc0I7bUdBQXRCLHNCQUFzQiwrSEF2RXZCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStDVCxtVkFqRFMsWUFBWTs7NEZBeUVYLHNCQUFzQjtrQkE1RWxDLFNBQVM7K0JBQ0UsbUJBQW1CLGNBQ2pCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFDTix1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStDVDs4QkF5QjBCLFNBQVM7c0JBQW5DLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNoQixJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50TW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7IERhdGFSZXNvbHZlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhLXJlc29sdmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3R5bGVNYXBwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc3R5bGUtbWFwcGVyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdydi10YWJsZS1yZW5kZXJlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKGNvbXBvbmVudC5jb2x1bW5zKSB7XG4gICAgICBAaWYgKGlzRHluYW1pYykge1xuICAgICAgICA8dGFibGUgY2xhc3M9XCJydi10YWJsZSBydi1keW5hbWljLXRhYmxlXCIgW25nU3R5bGVdPVwidGFibGVTdHlsZVwiPlxuICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgQGZvciAoZmllbGQgb2YgZHluYW1pY0hlYWRlcnM7IHRyYWNrIGZpZWxkOyBsZXQgY29sSWR4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPHRoIFtuZ1N0eWxlXT1cImdldEhlYWRlclN0eWxlKGNvbElkeClcIj57eyBmaWVsZCB9fTwvdGg+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICBAZm9yIChyb3cgb2YgdGFibGVEYXRhOyB0cmFjayByb3dJZHg7IGxldCByb3dJZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHRyIFtuZ1N0eWxlXT1cImdldFJvd1N0eWxlKHJvd0lkeClcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChmaWVsZCBvZiBkeW5hbWljSGVhZGVyczsgdHJhY2sgZmllbGQ7IGxldCBjb2xJZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgIDx0ZCBbbmdTdHlsZV09XCJnZXREeW5hbWljQ2VsbFN0eWxlKGNvbElkeClcIj57eyBnZXRDZWxsVmFsdWUocm93LCBmaWVsZCkgfX08L3RkPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInJ2LXRhYmxlXCIgW25nU3R5bGVdPVwidGFibGVTdHlsZVwiPlxuICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgQGZvciAoY29sIG9mIGNvbXBvbmVudC5jb2x1bW5zOyB0cmFjayBjb2wuaWQ7IGxldCBjb2xJZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICA8dGggW25nU3R5bGVdPVwiZ2V0SGVhZGVyU3R5bGUoY29sSWR4LCBjb2wpXCI+e3sgY29sLmhlYWRlciB9fTwvdGg+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICBAZm9yIChyb3cgb2YgdGFibGVEYXRhOyB0cmFjayByb3dJZHg7IGxldCByb3dJZHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHRyIFtuZ1N0eWxlXT1cImdldFJvd1N0eWxlKHJvd0lkeClcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29tcG9uZW50LmNvbHVtbnM7IHRyYWNrIGNvbC5pZDsgbGV0IGNvbElkeCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRkIFtuZ1N0eWxlXT1cImdldEJvdW5kQ2VsbFN0eWxlKGNvbElkeCwgY29sKVwiPnt7IGZvcm1hdENlbGwocm93LCBjb2wpIH19PC90ZD5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKHRhYmxlRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImNvbXBvbmVudC5jb2x1bW5zIS5sZW5ndGhcIiBjbGFzcz1cInJ2LW5vLWRhdGFcIj5ObyBkYXRhIGF2YWlsYWJsZTwvdGQ+XG4gICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgPC90YWJsZT5cbiAgICAgIH1cbiAgICB9XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICAucnYtdGFibGUge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICAgICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIH1cbiAgICAucnYtdGFibGUgdGgsIC5ydi10YWJsZSB0ZCB7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICAgICAgcGFkZGluZzogNnB4IDhweDtcbiAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgfVxuICAgIC5ydi10YWJsZSB0aCB7XG4gICAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1O1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICB9XG4gICAgLnJ2LW5vLWRhdGEge1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgY29sb3I6ICM5OTk7XG4gICAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gICAgICBwYWRkaW5nOiAyMHB4O1xuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgVGFibGVSZW5kZXJlckNvbXBvbmVudCB7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGNvbXBvbmVudCE6IENvbXBvbmVudE1vZGVsO1xuICBASW5wdXQoKSBkYXRhOiBhbnk7XG5cbiAgcHJpdmF0ZSBkYXRhUmVzb2x2ZXIgPSBpbmplY3QoRGF0YVJlc29sdmVyU2VydmljZSk7XG4gIHByaXZhdGUgc3R5bGVNYXBwZXIgPSBpbmplY3QoU3R5bGVNYXBwZXJTZXJ2aWNlKTtcblxuICBnZXQgdGFibGVEYXRhKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhUmVzb2x2ZXIucmVzb2x2ZVRhYmxlRGF0YSh0aGlzLmNvbXBvbmVudCwgdGhpcy5kYXRhKTtcbiAgfVxuXG4gIGdldCBpc0R5bmFtaWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVJlc29sdmVyLnNob3VsZFNob3dEeW5hbWljVGFibGUodGhpcy5jb21wb25lbnQsIHRoaXMuZGF0YSk7XG4gIH1cblxuICBnZXQgZHluYW1pY0hlYWRlcnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmRhdGFSZXNvbHZlci5nZXREeW5hbWljVGFibGVIZWFkZXJzKHRoaXMuY29tcG9uZW50LCB0aGlzLmRhdGEpO1xuICB9XG5cbiAgZ2V0IHRhYmxlU3R5bGUoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3R5bGVNYXBwZXIubWFwVGFibGVTdHlsZSh0aGlzLmNvbXBvbmVudCk7XG4gIH1cblxuICBnZXRIZWFkZXJTdHlsZShjb2xJbmRleDogbnVtYmVyLCBjb2w/OiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5zdHlsZU1hcHBlci5tYXBIZWFkZXJTdHlsZSh0aGlzLmNvbXBvbmVudCwgY29sSW5kZXgsIGNvbCk7XG4gIH1cblxuICBnZXRSb3dTdHlsZShyb3dJbmRleDogbnVtYmVyKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3R5bGVNYXBwZXIubWFwUm93U3R5bGUodGhpcy5jb21wb25lbnQsIHJvd0luZGV4LCB0aGlzLnRhYmxlRGF0YS5sZW5ndGgpO1xuICB9XG5cbiAgZ2V0Qm91bmRDZWxsU3R5bGUoY29sSW5kZXg6IG51bWJlciwgY29sPzogYW55KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3R5bGVNYXBwZXIubWFwQ2VsbFN0eWxlKHRoaXMuY29tcG9uZW50LCBjb2xJbmRleCwgY29sKTtcbiAgfVxuXG4gIGdldER5bmFtaWNDZWxsU3R5bGUoY29sSW5kZXg6IG51bWJlcik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN0eWxlTWFwcGVyLm1hcENlbGxTdHlsZSh0aGlzLmNvbXBvbmVudCwgY29sSW5kZXgpO1xuICB9XG5cbiAgZm9ybWF0Q2VsbChyb3c6IGFueSwgY29sOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGFSZXNvbHZlci5mb3JtYXRDZWxsVmFsdWUocm93LCBjb2wpO1xuICB9XG5cbiAgZ2V0Q2VsbFZhbHVlKHJvdzogYW55LCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhUmVzb2x2ZXIuZ2V0RHluYW1pY0NlbGxWYWx1ZShyb3csIGZpZWxkKTtcbiAgfVxufVxuIl19