@acorex-platform/module-report-management-client 0.0.18 → 0.0.24

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 (19) hide show
  1. package/fesm2022/acorex-platform-module-report-management-client-acorex-platform-module-report-management-client-BDCuhd5O.mjs +4232 -0
  2. package/fesm2022/acorex-platform-module-report-management-client-acorex-platform-module-report-management-client-BDCuhd5O.mjs.map +1 -0
  3. package/fesm2022/acorex-platform-module-report-management-client-contracts.mjs +85 -149
  4. package/fesm2022/acorex-platform-module-report-management-client-contracts.mjs.map +1 -1
  5. package/fesm2022/acorex-platform-module-report-management-client-entity-reports-page-component.provider-C6tJPxri.mjs +24 -0
  6. package/fesm2022/acorex-platform-module-report-management-client-entity-reports-page-component.provider-C6tJPxri.mjs.map +1 -0
  7. package/fesm2022/acorex-platform-module-report-management-client-entity-reports-page.component-fBftKdQW.mjs +166 -0
  8. package/fesm2022/acorex-platform-module-report-management-client-entity-reports-page.component-fBftKdQW.mjs.map +1 -0
  9. package/fesm2022/acorex-platform-module-report-management-client-report-popup-viewer.component-B9msMMod.mjs +113 -0
  10. package/fesm2022/acorex-platform-module-report-management-client-report-popup-viewer.component-B9msMMod.mjs.map +1 -0
  11. package/fesm2022/acorex-platform-module-report-management-client.mjs +1 -3584
  12. package/fesm2022/acorex-platform-module-report-management-client.mjs.map +1 -1
  13. package/package.json +1 -1
  14. package/types/acorex-platform-module-report-management-client-contracts.d.ts +280 -120
  15. package/types/acorex-platform-module-report-management-client.d.ts +256 -206
  16. package/fesm2022/acorex-platform-module-report-management-client-report-drill-popup.component-BdZPBD7t.mjs +0 -59
  17. package/fesm2022/acorex-platform-module-report-management-client-report-drill-popup.component-BdZPBD7t.mjs.map +0 -1
  18. package/fesm2022/acorex-platform-module-report-management-client-report-runner-root-page.component-CVG3HiJX.mjs +0 -504
  19. package/fesm2022/acorex-platform-module-report-management-client-report-runner-root-page.component-CVG3HiJX.mjs.map +0 -1
@@ -0,0 +1,166 @@
1
+ import { AXPPageLayoutBaseComponent, AXPPageLayoutBase } from '@acorex-platform/framework-client/layout/views';
2
+ import { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';
3
+ import { AXPCommandService } from '@acorex-platform/framework-client/runtime';
4
+ import * as i1 from '@acorex/components/button';
5
+ import { AXButtonModule } from '@acorex/components/button';
6
+ import * as i2 from '@acorex/components/decorators';
7
+ import { AXDecoratorModule } from '@acorex/components/decorators';
8
+ import * as i3 from '@acorex/components/skeleton';
9
+ import { AXSkeletonModule } from '@acorex/components/skeleton';
10
+ import * as i1$1 from '@acorex/core/translation';
11
+ import { AXTranslationModule } from '@acorex/core/translation';
12
+ import { AsyncPipe } from '@angular/common';
13
+ import * as i0 from '@angular/core';
14
+ import { input, inject, signal, computed, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
15
+ import { ActivatedRoute } from '@angular/router';
16
+ import { g as AXPReportViewerService, h as bindingShowsOnPage, O as OPEN_REPORT_IN_POPUP_COMMAND, j as buildOpenInPopupCommandOptions, k as resolveBindingTitle, l as resolveBindingDescription } from './acorex-platform-module-report-management-client-acorex-platform-module-report-management-client-BDCuhd5O.mjs';
17
+
18
+ //#region ----- Persisted entity id -----
19
+ /**
20
+ * Resolves the persisted record id from entity detail page root context.
21
+ */
22
+ function resolvePersistedEntityId(ctx) {
23
+ if (!ctx) {
24
+ return undefined;
25
+ }
26
+ const raw = ctx['id'] ?? ctx['_id'];
27
+ if (typeof raw === 'string' && raw.length > 0) {
28
+ return raw;
29
+ }
30
+ if (typeof raw === 'number' && !Number.isNaN(raw)) {
31
+ return String(raw);
32
+ }
33
+ return undefined;
34
+ }
35
+ //#endregion
36
+
37
+ //#region ----- Imports -----
38
+ //#endregion
39
+ //#region ----- Component -----
40
+ class AXMEntityReportsPageComponent extends AXPPageLayoutBaseComponent {
41
+ //#endregion
42
+ //#region ----- Lifecycle -----
43
+ constructor() {
44
+ super();
45
+ //#region ----- Inputs -----
46
+ this.rootContext = input({}, /* @ts-ignore */
47
+ ...(ngDevMode ? [{ debugName: "rootContext" }] : /* istanbul ignore next */ []));
48
+ this.pageConfig = input(/* @ts-ignore */
49
+ ...(ngDevMode ? [undefined, { debugName: "pageConfig" }] : /* istanbul ignore next */ []));
50
+ this.options = input({}, /* @ts-ignore */
51
+ ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
52
+ //#endregion
53
+ //#region ----- Services & Dependencies -----
54
+ this.reportViewerService = inject(AXPReportViewerService);
55
+ this.commandService = inject(AXPCommandService);
56
+ this.route = inject(ActivatedRoute);
57
+ //#endregion
58
+ //#region ----- State Signals -----
59
+ this.isLoading = signal(true, /* @ts-ignore */
60
+ ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
61
+ this.boundReports = signal([], /* @ts-ignore */
62
+ ...(ngDevMode ? [{ debugName: "boundReports" }] : /* istanbul ignore next */ []));
63
+ //#endregion
64
+ //#region ----- Computed Properties -----
65
+ this.entityId = computed(() => resolvePersistedEntityId(this.rootContext()), /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "entityId" }] : /* istanbul ignore next */ []));
67
+ this.entityType = computed(() => this.resolveEntityType(), /* @ts-ignore */
68
+ ...(ngDevMode ? [{ debugName: "entityType" }] : /* istanbul ignore next */ []));
69
+ this.pageReports = computed(() => this.boundReports().filter(({ binding }) => bindingShowsOnPage(binding)), /* @ts-ignore */
70
+ ...(ngDevMode ? [{ debugName: "pageReports" }] : /* istanbul ignore next */ []));
71
+ effect(() => {
72
+ const entityType = this.entityType();
73
+ untracked(() => {
74
+ void this.loadBoundReports(entityType);
75
+ });
76
+ });
77
+ }
78
+ //#endregion
79
+ //#region ----- Event Handlers -----
80
+ async openReport(item) {
81
+ const entityId = this.entityId();
82
+ if (!entityId) {
83
+ return;
84
+ }
85
+ await this.commandService.execute(OPEN_REPORT_IN_POPUP_COMMAND, {
86
+ data: this.rootContext() ?? { id: entityId },
87
+ options: buildOpenInPopupCommandOptions(item.report, item.binding),
88
+ });
89
+ }
90
+ reportTitle(item) {
91
+ return resolveBindingTitle(item.report, item.binding);
92
+ }
93
+ reportDescription(item) {
94
+ return resolveBindingDescription(item.report, item.binding);
95
+ }
96
+ //#endregion
97
+ //#region ----- Data Loading -----
98
+ resolveEntityType() {
99
+ const fromOptions = this.options()?.['entityType'];
100
+ if (typeof fromOptions === 'string' && fromOptions.trim()) {
101
+ return fromOptions.trim();
102
+ }
103
+ const fromConfig = this.pageConfig()?.['entityType'];
104
+ if (typeof fromConfig === 'string' && fromConfig.trim()) {
105
+ return fromConfig.trim();
106
+ }
107
+ const ctx = this.rootContext() ?? {};
108
+ const moduleName = typeof ctx['moduleName'] === 'string' ? ctx['moduleName'] : null;
109
+ const entityName = typeof ctx['entityName'] === 'string' ? ctx['entityName'] : null;
110
+ if (moduleName && entityName) {
111
+ return `${moduleName}.${entityName}`;
112
+ }
113
+ const module = this.route.snapshot.parent?.paramMap.get('module');
114
+ const entity = this.route.snapshot.paramMap.get('entity');
115
+ if (module && entity) {
116
+ return `${module}.${entity}`;
117
+ }
118
+ return '';
119
+ }
120
+ async loadBoundReports(entityType) {
121
+ if (!entityType) {
122
+ this.boundReports.set([]);
123
+ this.isLoading.set(false);
124
+ return;
125
+ }
126
+ this.isLoading.set(true);
127
+ try {
128
+ const reports = await this.reportViewerService.getReportsByEntityType(entityType);
129
+ this.boundReports.set(reports);
130
+ }
131
+ catch {
132
+ this.boundReports.set([]);
133
+ }
134
+ finally {
135
+ this.isLoading.set(false);
136
+ }
137
+ }
138
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMEntityReportsPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
139
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMEntityReportsPageComponent, isStandalone: true, selector: "axm-entity-reports-page", inputs: { rootContext: { classPropertyName: "rootContext", publicName: "rootContext", isSignal: true, isRequired: false, transformFunction: null }, pageConfig: { classPropertyName: "pageConfig", publicName: "pageConfig", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "flex h-full min-h-0 flex-1 flex-col overflow-hidden" }, providers: [
140
+ {
141
+ provide: AXPPageLayoutBase,
142
+ useExisting: AXMEntityReportsPageComponent,
143
+ },
144
+ ], usesInheritance: true, ngImport: i0, template: "@if (isLoading()) {\n <!-- ----- Skeleton while entity-bound reports load ----- -->\n <div class=\"flex h-full min-h-0 flex-1 flex-col gap-3 overflow-auto p-4\" aria-hidden=\"true\">\n @for (widthClass of ['w-2/3', 'w-1/2', 'w-3/5']; track $index) {\n <div class=\"flex items-center gap-4 rounded-lg border border-default bg-lightest p-4\">\n <div class=\"h-10 w-10 shrink-0 rounded-md overflow-hidden\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n <div class=\"min-w-0 flex-1 flex flex-col gap-2\">\n <div class=\"h-4 max-w-full rounded-md overflow-hidden\" [class]=\"widthClass\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n <div class=\"h-3 w-4/5 rounded-md overflow-hidden\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n </div>\n </div>\n }\n </div>\n}\n<!-- ----- Record must be saved before reports can use its id ----- -->\n@else if (!entityId()) {\n <div class=\"flex h-full min-h-[20rem] items-center justify-center p-6\">\n <axp-state-message\n [title]=\"'@report-management:entity-reports.messages.save-record-first.title'\"\n [description]=\"'@report-management:entity-reports.messages.save-record-first.description'\"\n ></axp-state-message>\n </div>\n}\n<!-- ----- No report definitions bound to this entity type ----- -->\n@else if (pageReports().length === 0) {\n <div class=\"flex h-full min-h-[20rem] items-center justify-center p-6\">\n <axp-state-message\n [title]=\"'@report-management:entity-reports.messages.empty.title'\"\n [description]=\"'@report-management:entity-reports.messages.empty.description'\"\n ></axp-state-message>\n </div>\n}\n<!-- ----- Bound reports list ----- -->\n@else {\n <div class=\"flex h-full min-h-0 flex-1 flex-col gap-3 overflow-auto p-4\">\n <p class=\"text-sm opacity-70\">\n {{ '@report-management:entity-reports.page.description' | translate | async }}\n </p>\n @for (item of pageReports(); track item.report.id) {\n <div class=\"flex items-center gap-4 rounded-lg border border-default bg-lightest p-4\">\n <div\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-primary/10 text-primary text-lg\"\n aria-hidden=\"true\"\n >\n <ax-icon class=\"fa-light fa-file-chart-column\"></ax-icon>\n </div>\n <div class=\"min-w-0 flex-1 flex flex-col gap-1\">\n <span class=\"font-medium truncate\">\n {{ reportTitle(item) | translate | async }}\n </span>\n @if (reportDescription(item); as description) {\n <!-- ----- Optional report description under the title ----- -->\n <span class=\"text-sm opacity-70 line-clamp-2\">\n {{ description | translate | async }}\n </span>\n }\n </div>\n <ax-button\n look=\"solid\"\n color=\"secondary\"\n [text]=\"'@report-management:entity-reports.actions.open.title' | translate | async\"\n (onClick)=\"openReport(item)\">\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-arrow-right\"></ax-icon>\n </ax-suffix>\n </ax-button>\n </div>\n }\n </div>\n}\n", dependencies: [{ kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i1$1.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
145
+ }
146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMEntityReportsPageComponent, decorators: [{
147
+ type: Component,
148
+ args: [{ selector: 'axm-entity-reports-page', standalone: true, imports: [
149
+ AXPStateMessageComponent,
150
+ AXButtonModule,
151
+ AXDecoratorModule,
152
+ AXSkeletonModule,
153
+ AXTranslationModule,
154
+ AsyncPipe,
155
+ ], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
156
+ {
157
+ provide: AXPPageLayoutBase,
158
+ useExisting: AXMEntityReportsPageComponent,
159
+ },
160
+ ], host: {
161
+ class: 'flex h-full min-h-0 flex-1 flex-col overflow-hidden',
162
+ }, template: "@if (isLoading()) {\n <!-- ----- Skeleton while entity-bound reports load ----- -->\n <div class=\"flex h-full min-h-0 flex-1 flex-col gap-3 overflow-auto p-4\" aria-hidden=\"true\">\n @for (widthClass of ['w-2/3', 'w-1/2', 'w-3/5']; track $index) {\n <div class=\"flex items-center gap-4 rounded-lg border border-default bg-lightest p-4\">\n <div class=\"h-10 w-10 shrink-0 rounded-md overflow-hidden\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n <div class=\"min-w-0 flex-1 flex flex-col gap-2\">\n <div class=\"h-4 max-w-full rounded-md overflow-hidden\" [class]=\"widthClass\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n <div class=\"h-3 w-4/5 rounded-md overflow-hidden\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n </div>\n </div>\n }\n </div>\n}\n<!-- ----- Record must be saved before reports can use its id ----- -->\n@else if (!entityId()) {\n <div class=\"flex h-full min-h-[20rem] items-center justify-center p-6\">\n <axp-state-message\n [title]=\"'@report-management:entity-reports.messages.save-record-first.title'\"\n [description]=\"'@report-management:entity-reports.messages.save-record-first.description'\"\n ></axp-state-message>\n </div>\n}\n<!-- ----- No report definitions bound to this entity type ----- -->\n@else if (pageReports().length === 0) {\n <div class=\"flex h-full min-h-[20rem] items-center justify-center p-6\">\n <axp-state-message\n [title]=\"'@report-management:entity-reports.messages.empty.title'\"\n [description]=\"'@report-management:entity-reports.messages.empty.description'\"\n ></axp-state-message>\n </div>\n}\n<!-- ----- Bound reports list ----- -->\n@else {\n <div class=\"flex h-full min-h-0 flex-1 flex-col gap-3 overflow-auto p-4\">\n <p class=\"text-sm opacity-70\">\n {{ '@report-management:entity-reports.page.description' | translate | async }}\n </p>\n @for (item of pageReports(); track item.report.id) {\n <div class=\"flex items-center gap-4 rounded-lg border border-default bg-lightest p-4\">\n <div\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-primary/10 text-primary text-lg\"\n aria-hidden=\"true\"\n >\n <ax-icon class=\"fa-light fa-file-chart-column\"></ax-icon>\n </div>\n <div class=\"min-w-0 flex-1 flex flex-col gap-1\">\n <span class=\"font-medium truncate\">\n {{ reportTitle(item) | translate | async }}\n </span>\n @if (reportDescription(item); as description) {\n <!-- ----- Optional report description under the title ----- -->\n <span class=\"text-sm opacity-70 line-clamp-2\">\n {{ description | translate | async }}\n </span>\n }\n </div>\n <ax-button\n look=\"solid\"\n color=\"secondary\"\n [text]=\"'@report-management:entity-reports.actions.open.title' | translate | async\"\n (onClick)=\"openReport(item)\">\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-arrow-right\"></ax-icon>\n </ax-suffix>\n </ax-button>\n </div>\n }\n </div>\n}\n" }]
163
+ }], ctorParameters: () => [], propDecorators: { rootContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootContext", required: false }] }], pageConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageConfig", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }] } });
164
+
165
+ export { AXMEntityReportsPageComponent };
166
+ //# sourceMappingURL=acorex-platform-module-report-management-client-entity-reports-page.component-fBftKdQW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-report-management-client-entity-reports-page.component-fBftKdQW.mjs","sources":["../../../../libs/modules/report-management/client/src/lib/features/entity-reports/resolve-entity-record-id.util.ts","../../../../libs/modules/report-management/client/src/lib/features/entity-reports/entity-reports-page.component.ts","../../../../libs/modules/report-management/client/src/lib/features/entity-reports/entity-reports-page.component.html"],"sourcesContent":["//#region ----- Persisted entity id -----\n\n/**\n * Resolves the persisted record id from entity detail page root context.\n */\nexport function resolvePersistedEntityId(\n ctx: Record<string, unknown> | null | undefined,\n): string | undefined {\n if (!ctx) {\n return undefined;\n }\n const raw = ctx['id'] ?? ctx['_id'];\n if (typeof raw === 'string' && raw.length > 0) {\n return raw;\n }\n if (typeof raw === 'number' && !Number.isNaN(raw)) {\n return String(raw);\n }\n return undefined;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPPageLayoutBase, AXPPageLayoutBaseComponent } from '@acorex-platform/framework-client/layout/views';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { AXPReportViewerService } from '../../reports/report-viewer.service';\nimport {\n bindingShowsOnPage,\n buildOpenInPopupCommandOptions,\n OPEN_REPORT_IN_POPUP_COMMAND,\n resolveBindingDescription,\n resolveBindingTitle,\n type AXPEntityBoundReport,\n} from './entity-reports.util';\nimport { resolvePersistedEntityId } from './resolve-entity-record-id.util';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axm-entity-reports-page',\n standalone: true,\n imports: [\n AXPStateMessageComponent,\n AXButtonModule,\n AXDecoratorModule,\n AXSkeletonModule,\n AXTranslationModule,\n AsyncPipe,\n ],\n templateUrl: './entity-reports-page.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMEntityReportsPageComponent,\n },\n ],\n host: {\n class: 'flex h-full min-h-0 flex-1 flex-col overflow-hidden',\n },\n})\nexport class AXMEntityReportsPageComponent extends AXPPageLayoutBaseComponent {\n //#region ----- Inputs -----\n\n rootContext = input<Record<string, unknown>>({});\n pageConfig = input<Record<string, unknown>>();\n options = input<Record<string, unknown>>({});\n\n //#endregion\n\n //#region ----- Services & Dependencies -----\n\n private readonly reportViewerService = inject(AXPReportViewerService);\n private readonly commandService = inject(AXPCommandService);\n private readonly route = inject(ActivatedRoute);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly isLoading = signal(true);\n protected readonly boundReports = signal<AXPEntityBoundReport[]>([]);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly entityId = computed(() => resolvePersistedEntityId(this.rootContext()));\n\n protected readonly entityType = computed(() => this.resolveEntityType());\n\n protected readonly pageReports = computed(() =>\n this.boundReports().filter(({ binding }) => bindingShowsOnPage(binding)),\n );\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n super();\n effect(() => {\n const entityType = this.entityType();\n untracked(() => {\n void this.loadBoundReports(entityType);\n });\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected async openReport(item: AXPEntityBoundReport): Promise<void> {\n const entityId = this.entityId();\n if (!entityId) {\n return;\n }\n\n await this.commandService.execute(OPEN_REPORT_IN_POPUP_COMMAND, {\n data: this.rootContext() ?? { id: entityId },\n options: buildOpenInPopupCommandOptions(item.report, item.binding),\n });\n }\n\n protected reportTitle(item: AXPEntityBoundReport): AXPMultiLanguageString {\n return resolveBindingTitle(item.report, item.binding);\n }\n\n protected reportDescription(item: AXPEntityBoundReport): AXPMultiLanguageString | undefined {\n return resolveBindingDescription(item.report, item.binding);\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private resolveEntityType(): string {\n const fromOptions = this.options()?.['entityType'];\n if (typeof fromOptions === 'string' && fromOptions.trim()) {\n return fromOptions.trim();\n }\n const fromConfig = this.pageConfig()?.['entityType'];\n if (typeof fromConfig === 'string' && fromConfig.trim()) {\n return fromConfig.trim();\n }\n\n const ctx = this.rootContext() ?? {};\n const moduleName = typeof ctx['moduleName'] === 'string' ? ctx['moduleName'] : null;\n const entityName = typeof ctx['entityName'] === 'string' ? ctx['entityName'] : null;\n if (moduleName && entityName) {\n return `${moduleName}.${entityName}`;\n }\n\n const module = this.route.snapshot.parent?.paramMap.get('module');\n const entity = this.route.snapshot.paramMap.get('entity');\n if (module && entity) {\n return `${module}.${entity}`;\n }\n\n return '';\n }\n\n private async loadBoundReports(entityType: string): Promise<void> {\n if (!entityType) {\n this.boundReports.set([]);\n this.isLoading.set(false);\n return;\n }\n\n this.isLoading.set(true);\n try {\n const reports = await this.reportViewerService.getReportsByEntityType(entityType);\n this.boundReports.set(reports);\n } catch {\n this.boundReports.set([]);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","@if (isLoading()) {\n <!-- ----- Skeleton while entity-bound reports load ----- -->\n <div class=\"flex h-full min-h-0 flex-1 flex-col gap-3 overflow-auto p-4\" aria-hidden=\"true\">\n @for (widthClass of ['w-2/3', 'w-1/2', 'w-3/5']; track $index) {\n <div class=\"flex items-center gap-4 rounded-lg border border-default bg-lightest p-4\">\n <div class=\"h-10 w-10 shrink-0 rounded-md overflow-hidden\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n <div class=\"min-w-0 flex-1 flex flex-col gap-2\">\n <div class=\"h-4 max-w-full rounded-md overflow-hidden\" [class]=\"widthClass\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n <div class=\"h-3 w-4/5 rounded-md overflow-hidden\">\n <ax-skeleton\n [animated]=\"true\"\n style=\"display: block; width: 100%; height: 100%\"\n ></ax-skeleton>\n </div>\n </div>\n </div>\n }\n </div>\n}\n<!-- ----- Record must be saved before reports can use its id ----- -->\n@else if (!entityId()) {\n <div class=\"flex h-full min-h-[20rem] items-center justify-center p-6\">\n <axp-state-message\n [title]=\"'@report-management:entity-reports.messages.save-record-first.title'\"\n [description]=\"'@report-management:entity-reports.messages.save-record-first.description'\"\n ></axp-state-message>\n </div>\n}\n<!-- ----- No report definitions bound to this entity type ----- -->\n@else if (pageReports().length === 0) {\n <div class=\"flex h-full min-h-[20rem] items-center justify-center p-6\">\n <axp-state-message\n [title]=\"'@report-management:entity-reports.messages.empty.title'\"\n [description]=\"'@report-management:entity-reports.messages.empty.description'\"\n ></axp-state-message>\n </div>\n}\n<!-- ----- Bound reports list ----- -->\n@else {\n <div class=\"flex h-full min-h-0 flex-1 flex-col gap-3 overflow-auto p-4\">\n <p class=\"text-sm opacity-70\">\n {{ '@report-management:entity-reports.page.description' | translate | async }}\n </p>\n @for (item of pageReports(); track item.report.id) {\n <div class=\"flex items-center gap-4 rounded-lg border border-default bg-lightest p-4\">\n <div\n class=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-primary/10 text-primary text-lg\"\n aria-hidden=\"true\"\n >\n <ax-icon class=\"fa-light fa-file-chart-column\"></ax-icon>\n </div>\n <div class=\"min-w-0 flex-1 flex flex-col gap-1\">\n <span class=\"font-medium truncate\">\n {{ reportTitle(item) | translate | async }}\n </span>\n @if (reportDescription(item); as description) {\n <!-- ----- Optional report description under the title ----- -->\n <span class=\"text-sm opacity-70 line-clamp-2\">\n {{ description | translate | async }}\n </span>\n }\n </div>\n <ax-button\n look=\"solid\"\n color=\"secondary\"\n [text]=\"'@report-management:entity-reports.actions.open.title' | translate | async\"\n (onClick)=\"openReport(item)\">\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-arrow-right\"></ax-icon>\n </ax-suffix>\n </ax-button>\n </div>\n }\n </div>\n}\n"],"names":["i4"],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ import * as i1 from '@acorex/components/button';
2
+ import { AXButtonModule } from '@acorex/components/button';
3
+ import * as i2 from '@acorex/components/decorators';
4
+ import { AXDecoratorModule } from '@acorex/components/decorators';
5
+ import { AXLoadingModule } from '@acorex/components/loading';
6
+ import { AXBasePageComponent } from '@acorex/components/page';
7
+ import * as i3 from '@acorex/components/tabs';
8
+ import { AXTabsModule } from '@acorex/components/tabs';
9
+ import * as i1$1 from '@acorex/core/translation';
10
+ import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
11
+ import { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';
12
+ import * as i2$1 from '@angular/common';
13
+ import { CommonModule } from '@angular/common';
14
+ import * as i0 from '@angular/core';
15
+ import { inject, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
16
+ import { A as AXPReportViewerViewModel, a as AXPOpenReportViewerCommand, r as reportLayoutPageIcon, b as resolveReportFilterDefaultValue, i as isDistinctLayoutTitle, c as reportLayoutTitleKey, d as AXPReportTableViewComponent, e as AXPReportChartViewComponent, f as AXPReportPdfViewComponent } from './acorex-platform-module-report-management-client-acorex-platform-module-report-management-client-BDCuhd5O.mjs';
17
+
18
+ //#region ----- Imports -----
19
+ //#endregion
20
+ //#region ----- Component -----
21
+ class AXPReportPopupViewerComponent extends AXBasePageComponent {
22
+ constructor() {
23
+ super(...arguments);
24
+ this.parameters = {};
25
+ this.hideColumnFields = [];
26
+ //#endregion
27
+ //#region ----- Services & Dependencies -----
28
+ this.vm = inject(AXPReportViewerViewModel);
29
+ this.openViewer = inject(AXPOpenReportViewerCommand);
30
+ this.translateService = inject(AXTranslationService);
31
+ this.layoutPageIcon = reportLayoutPageIcon;
32
+ }
33
+ //#endregion
34
+ //#region ----- Lifecycle -----
35
+ async ngOnInit() {
36
+ await super.ngOnInit();
37
+ const runId = this.runId?.trim();
38
+ if (runId) {
39
+ await this.vm.loadFrozenRun(runId);
40
+ // Table mounts after this tick; nudge so the grid refresh effect sees a ready view child.
41
+ setTimeout(() => this.vm.nudgeFetch());
42
+ return;
43
+ }
44
+ await this.vm.loadReport(this.reportId);
45
+ if (this.layoutId) {
46
+ this.vm.switchLayout(this.layoutId);
47
+ }
48
+ if (this.hideColumnFields.length > 0) {
49
+ this.vm.applyDrillView({ hideColumnFields: this.hideColumnFields });
50
+ }
51
+ if (this.parameters && Object.keys(this.parameters).length > 0) {
52
+ const resolvedParameters = Object.fromEntries(Object.entries(this.parameters).map(([key, value]) => [key, resolveReportFilterDefaultValue(value)]));
53
+ this.vm.updateFilterContext(resolvedParameters);
54
+ }
55
+ await this.vm.executeReport();
56
+ }
57
+ //#endregion
58
+ //#region ----- Event Handlers -----
59
+ async openInFullViewer() {
60
+ if (!this.reportId) {
61
+ return;
62
+ }
63
+ const runId = this.runId?.trim() || this.vm.runId()?.trim();
64
+ await this.openViewer.execute({
65
+ reportId: this.reportId,
66
+ ...(runId ? { runId } : {}),
67
+ });
68
+ this.close();
69
+ }
70
+ getLayoutSwitcherLabel(layout) {
71
+ const locale = this.translateService.getActiveLang() || 'en-US';
72
+ const reportTitle = this.vm.reportDefinition()?.title;
73
+ if (isDistinctLayoutTitle(layout.title, reportTitle, locale)) {
74
+ return layout.title ?? reportLayoutTitleKey(layout);
75
+ }
76
+ return reportLayoutTitleKey(layout);
77
+ }
78
+ handleLayoutSwitch(layoutId) {
79
+ if (this.vm.activeLayoutId() === layoutId) {
80
+ return;
81
+ }
82
+ this.vm.switchLayout(layoutId);
83
+ this.vm.nudgeFetch();
84
+ }
85
+ handleLayoutTabChanged(event) {
86
+ const layout = this.vm.availableLayouts()[event.index];
87
+ if (layout) {
88
+ this.handleLayoutSwitch(layout.id);
89
+ }
90
+ }
91
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPReportPopupViewerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
92
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPReportPopupViewerComponent, isStandalone: true, selector: "axp-report-popup-viewer", host: { classAttribute: "axp-report-popup-viewer flex h-full min-h-0 flex-1 flex-col overflow-hidden" }, providers: [AXPReportViewerViewModel], usesInheritance: true, ngImport: i0, template: "<ax-content class=\"flex min-h-0 flex-1 flex-col overflow-hidden\" *translate=\"let t\">\n <div class=\"__popup-content\">\n <!-- ----- Layout switcher for multi-layout reports ----- -->\n @if (vm.hasMultipleLayouts() && vm.canSwitchLayout()) {\n <div class=\"__layout-switcher mb-3\">\n <ax-tabs\n class=\"__layout-tabs\"\n [look]=\"'with-line'\"\n [location]=\"'bottom'\"\n [fitParent]=\"false\"\n (onActiveTabChanged)=\"handleLayoutTabChanged($event)\"\n >\n @for (layout of vm.availableLayouts(); track layout.id) {\n <ax-tab-item\n [key]=\"layout.id\"\n [text]=\"(getLayoutSwitcherLabel(layout) | translate | async) ?? ''\"\n [active]=\"vm.activeLayoutId() === layout.id\"\n >\n <ax-prefix>\n <ax-icon [icon]=\"layoutPageIcon(layout.icon, layout)\"></ax-icon>\n </ax-prefix>\n </ax-tab-item>\n }\n </ax-tabs>\n </div>\n }\n <!-- ----- Error or results ----- -->\n @if (vm.hasError()) {\n <axp-state-message\n icon=\"fa-light fa-exclamation-triangle\"\n [title]=\"'@report-management:report-viewer.messages.error.fetch-title'\"\n [description]=\"vm.error() || '@report-management:report-viewer.messages.error.unexpected'\"\n >\n </axp-state-message>\n }\n <!-- ----- Table layout results ----- -->\n @else if (vm.isTableLayout()) {\n <axp-report-table-view class=\"__popup-view\"></axp-report-table-view>\n }\n <!-- ----- Chart layout results ----- -->\n @else if (vm.isChartLayout()) {\n <axp-report-chart-view class=\"__popup-view\"></axp-report-chart-view>\n }\n <!-- ----- PDF layout results ----- -->\n @else if (vm.isPdfLayout()) {\n <axp-report-pdf-view class=\"__popup-view\"></axp-report-pdf-view>\n }\n <!-- ----- Unsupported layout types ----- -->\n @else {\n <axp-state-message\n icon=\"fa-light fa-chart-line\"\n [title]=\"'@report-management:report-viewer.components.report-popup-viewer.unsupported-layout.title'\"\n [description]=\"'@report-management:report-viewer.components.report-popup-viewer.unsupported-layout.description'\"\n >\n </axp-state-message>\n }\n </div>\n</ax-content>\n<ax-footer class=\"__popup-footer\">\n <ax-prefix>\n <ax-button\n look=\"outline\"\n color=\"secondary\"\n [text]=\"'@report-management:report-viewer.actions.open-in-report-viewer.title' | translate | async\"\n (onClick)=\"openInFullViewer()\"\n >\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-file-chart-column\"></ax-icon>\n </ax-suffix>\n </ax-button>\n </ax-prefix>\n <ax-suffix>\n <ax-button\n [text]=\"'@general:actions.close.title' | translate | async\"\n look=\"solid\"\n color=\"default\"\n (onClick)=\"close()\"\n >\n </ax-button>\n </ax-suffix>\n</ax-footer>\n", styles: [".axp-report-popup-viewer{display:flex;height:100%;min-height:0px;flex:1;flex-direction:column;overflow:hidden}.__popup-content{display:flex;min-height:0px;flex:1;flex-direction:column;overflow:hidden;padding:calc(var(--spacing, .25rem) * 4)}.__popup-view{display:flex;height:100%;max-height:100%;min-height:20rem;width:100%;min-width:0px;flex:1;flex-direction:column;overflow:hidden}.__popup-view ax-data-table{display:flex;height:100%;max-height:100%;min-height:0px;flex:1;flex-direction:column;overflow:hidden}.__popup-view.axp-report-chart-view,.__popup-view.axp-report-pdf-view{min-height:20rem}.__layout-switcher{flex-shrink:0}.__layout-tabs{width:100%}.ax-popup:has(axp-report-popup-viewer){display:flex;flex-direction:column;overflow:hidden;height:80vh;max-height:80vh}.ax-popup:has(axp-report-popup-viewer) .ax-popup-header-container .ax-popup-header{padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3)}.ax-popup:has(axp-report-popup-viewer) .ax-popup-main-container{display:flex;min-height:0px;flex:1;flex-direction:column;overflow:hidden;flex:1 1 auto}.ax-popup:has(axp-report-popup-viewer) .ax-popup-body-container{display:flex;min-height:0px;flex:1;flex-direction:column;overflow:hidden;flex:1 1 auto;overflow:hidden!important}.ax-popup:has(axp-report-popup-viewer) .ax-popup-body-container>ng-component,.ax-popup:has(axp-report-popup-viewer) .ax-popup-body-container>*{display:flex;height:100%;min-height:0px;flex:1;flex-direction:column;overflow:hidden}.ax-popup:has(axp-report-popup-viewer) .ax-popup-footer-container{flex-shrink:0}.ax-popup:has(axp-report-popup-viewer) ax-footer{padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3)}@media(min-width:320px)and (max-width:640px){.ax-popup.ax-popup-sm:has(axp-report-popup-viewer),.ax-popup.ax-popup-md:has(axp-report-popup-viewer),.ax-popup.ax-popup-lg:has(axp-report-popup-viewer){height:90vh!important;max-height:90vh!important}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXTabsModule }, { kind: "component", type: i3.AXTabsComponent, selector: "ax-tabs", inputs: ["look", "location", "fitParent", "minWidth", "content"], outputs: ["onActiveTabChanged"] }, { kind: "component", type: i3.AXTabItemComponent, selector: "ax-tab-item", inputs: ["disabled", "text", "key", "headerTemplate", "active"], outputs: ["disabledChange", "onClick", "onBlur", "onFocus", "activeChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i1$1.AXTranslatorDirective, selector: "[translate]" }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "component", type: AXPReportTableViewComponent, selector: "axp-report-table-view" }, { kind: "component", type: AXPReportChartViewComponent, selector: "axp-report-chart-view" }, { kind: "component", type: AXPReportPdfViewComponent, selector: "axp-report-pdf-view" }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
93
+ }
94
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPReportPopupViewerComponent, decorators: [{
95
+ type: Component,
96
+ args: [{ selector: 'axp-report-popup-viewer', imports: [
97
+ CommonModule,
98
+ AXButtonModule,
99
+ AXDecoratorModule,
100
+ AXLoadingModule,
101
+ AXTabsModule,
102
+ AXTranslationModule,
103
+ AXPStateMessageComponent,
104
+ AXPReportTableViewComponent,
105
+ AXPReportChartViewComponent,
106
+ AXPReportPdfViewComponent,
107
+ ], providers: [AXPReportViewerViewModel], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
108
+ class: 'axp-report-popup-viewer flex h-full min-h-0 flex-1 flex-col overflow-hidden',
109
+ }, template: "<ax-content class=\"flex min-h-0 flex-1 flex-col overflow-hidden\" *translate=\"let t\">\n <div class=\"__popup-content\">\n <!-- ----- Layout switcher for multi-layout reports ----- -->\n @if (vm.hasMultipleLayouts() && vm.canSwitchLayout()) {\n <div class=\"__layout-switcher mb-3\">\n <ax-tabs\n class=\"__layout-tabs\"\n [look]=\"'with-line'\"\n [location]=\"'bottom'\"\n [fitParent]=\"false\"\n (onActiveTabChanged)=\"handleLayoutTabChanged($event)\"\n >\n @for (layout of vm.availableLayouts(); track layout.id) {\n <ax-tab-item\n [key]=\"layout.id\"\n [text]=\"(getLayoutSwitcherLabel(layout) | translate | async) ?? ''\"\n [active]=\"vm.activeLayoutId() === layout.id\"\n >\n <ax-prefix>\n <ax-icon [icon]=\"layoutPageIcon(layout.icon, layout)\"></ax-icon>\n </ax-prefix>\n </ax-tab-item>\n }\n </ax-tabs>\n </div>\n }\n <!-- ----- Error or results ----- -->\n @if (vm.hasError()) {\n <axp-state-message\n icon=\"fa-light fa-exclamation-triangle\"\n [title]=\"'@report-management:report-viewer.messages.error.fetch-title'\"\n [description]=\"vm.error() || '@report-management:report-viewer.messages.error.unexpected'\"\n >\n </axp-state-message>\n }\n <!-- ----- Table layout results ----- -->\n @else if (vm.isTableLayout()) {\n <axp-report-table-view class=\"__popup-view\"></axp-report-table-view>\n }\n <!-- ----- Chart layout results ----- -->\n @else if (vm.isChartLayout()) {\n <axp-report-chart-view class=\"__popup-view\"></axp-report-chart-view>\n }\n <!-- ----- PDF layout results ----- -->\n @else if (vm.isPdfLayout()) {\n <axp-report-pdf-view class=\"__popup-view\"></axp-report-pdf-view>\n }\n <!-- ----- Unsupported layout types ----- -->\n @else {\n <axp-state-message\n icon=\"fa-light fa-chart-line\"\n [title]=\"'@report-management:report-viewer.components.report-popup-viewer.unsupported-layout.title'\"\n [description]=\"'@report-management:report-viewer.components.report-popup-viewer.unsupported-layout.description'\"\n >\n </axp-state-message>\n }\n </div>\n</ax-content>\n<ax-footer class=\"__popup-footer\">\n <ax-prefix>\n <ax-button\n look=\"outline\"\n color=\"secondary\"\n [text]=\"'@report-management:report-viewer.actions.open-in-report-viewer.title' | translate | async\"\n (onClick)=\"openInFullViewer()\"\n >\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-file-chart-column\"></ax-icon>\n </ax-suffix>\n </ax-button>\n </ax-prefix>\n <ax-suffix>\n <ax-button\n [text]=\"'@general:actions.close.title' | translate | async\"\n look=\"solid\"\n color=\"default\"\n (onClick)=\"close()\"\n >\n </ax-button>\n </ax-suffix>\n</ax-footer>\n", styles: [".axp-report-popup-viewer{display:flex;height:100%;min-height:0px;flex:1;flex-direction:column;overflow:hidden}.__popup-content{display:flex;min-height:0px;flex:1;flex-direction:column;overflow:hidden;padding:calc(var(--spacing, .25rem) * 4)}.__popup-view{display:flex;height:100%;max-height:100%;min-height:20rem;width:100%;min-width:0px;flex:1;flex-direction:column;overflow:hidden}.__popup-view ax-data-table{display:flex;height:100%;max-height:100%;min-height:0px;flex:1;flex-direction:column;overflow:hidden}.__popup-view.axp-report-chart-view,.__popup-view.axp-report-pdf-view{min-height:20rem}.__layout-switcher{flex-shrink:0}.__layout-tabs{width:100%}.ax-popup:has(axp-report-popup-viewer){display:flex;flex-direction:column;overflow:hidden;height:80vh;max-height:80vh}.ax-popup:has(axp-report-popup-viewer) .ax-popup-header-container .ax-popup-header{padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3)}.ax-popup:has(axp-report-popup-viewer) .ax-popup-main-container{display:flex;min-height:0px;flex:1;flex-direction:column;overflow:hidden;flex:1 1 auto}.ax-popup:has(axp-report-popup-viewer) .ax-popup-body-container{display:flex;min-height:0px;flex:1;flex-direction:column;overflow:hidden;flex:1 1 auto;overflow:hidden!important}.ax-popup:has(axp-report-popup-viewer) .ax-popup-body-container>ng-component,.ax-popup:has(axp-report-popup-viewer) .ax-popup-body-container>*{display:flex;height:100%;min-height:0px;flex:1;flex-direction:column;overflow:hidden}.ax-popup:has(axp-report-popup-viewer) .ax-popup-footer-container{flex-shrink:0}.ax-popup:has(axp-report-popup-viewer) ax-footer{padding-inline:calc(var(--spacing, .25rem) * 4);padding-block:calc(var(--spacing, .25rem) * 3)}@media(min-width:320px)and (max-width:640px){.ax-popup.ax-popup-sm:has(axp-report-popup-viewer),.ax-popup.ax-popup-md:has(axp-report-popup-viewer),.ax-popup.ax-popup-lg:has(axp-report-popup-viewer){height:90vh!important;max-height:90vh!important}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
110
+ }] });
111
+
112
+ export { AXPReportPopupViewerComponent };
113
+ //# sourceMappingURL=acorex-platform-module-report-management-client-report-popup-viewer.component-B9msMMod.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-report-management-client-report-popup-viewer.component-B9msMMod.mjs","sources":["../../../../libs/modules/report-management/client/src/lib/features/report-viewer/report-popup-viewer/report-popup-viewer.component.ts","../../../../libs/modules/report-management/client/src/lib/features/report-viewer/report-popup-viewer/report-popup-viewer.component.html"],"sourcesContent":["//#region ----- Imports -----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXTabsModule, type AXTabStripChangedEvent } from '@acorex/components/tabs';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport type { AXPLayoutSwitcherOption } from '@acorex-platform/module-report-management-client/contracts';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n ViewEncapsulation,\n} from '@angular/core';\nimport { AXPOpenReportViewerCommand } from '../../../commands/open-report-viewer.command';\nimport { resolveReportFilterDefaultValue } from '../../../reports/report-parameter.util';\nimport {\n isDistinctLayoutTitle,\n reportLayoutPageIcon,\n reportLayoutTitleKey,\n} from '../report-layout-switcher.util';\nimport { AXPReportViewerViewModel } from '../report-viewer.viewmodel';\nimport { AXPReportChartViewComponent } from '../views/report-chart-view/report-chart-view.component';\nimport { AXPReportPdfViewComponent } from '../views/report-pdf-view/report-pdf-view.component';\nimport { AXPReportTableViewComponent } from '../views/report-table-view/report-table-view.component';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axp-report-popup-viewer',\n templateUrl: './report-popup-viewer.component.html',\n styleUrl: './report-popup-viewer.component.css',\n imports: [\n CommonModule,\n AXButtonModule,\n AXDecoratorModule,\n AXLoadingModule,\n AXTabsModule,\n AXTranslationModule,\n AXPStateMessageComponent,\n AXPReportTableViewComponent,\n AXPReportChartViewComponent,\n AXPReportPdfViewComponent,\n ],\n providers: [AXPReportViewerViewModel],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'axp-report-popup-viewer flex h-full min-h-0 flex-1 flex-col overflow-hidden',\n },\n})\nexport class AXPReportPopupViewerComponent extends AXBasePageComponent {\n //#region ----- Popup Data -----\n\n reportId!: string;\n layoutId?: string;\n runId?: string;\n parameters: Record<string, unknown> = {};\n hideColumnFields: string[] = [];\n\n //#endregion\n\n //#region ----- Services & Dependencies -----\n\n protected readonly vm = inject(AXPReportViewerViewModel);\n private readonly openViewer = inject(AXPOpenReportViewerCommand);\n private readonly translateService = inject(AXTranslationService);\n protected readonly layoutPageIcon = reportLayoutPageIcon;\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n const runId = this.runId?.trim();\n if (runId) {\n await this.vm.loadFrozenRun(runId);\n // Table mounts after this tick; nudge so the grid refresh effect sees a ready view child.\n setTimeout(() => this.vm.nudgeFetch());\n return;\n }\n\n await this.vm.loadReport(this.reportId);\n\n if (this.layoutId) {\n this.vm.switchLayout(this.layoutId);\n }\n\n if (this.hideColumnFields.length > 0) {\n this.vm.applyDrillView({ hideColumnFields: this.hideColumnFields });\n }\n\n if (this.parameters && Object.keys(this.parameters).length > 0) {\n const resolvedParameters = Object.fromEntries(\n Object.entries(this.parameters).map(([key, value]) => [key, resolveReportFilterDefaultValue(value)]),\n );\n this.vm.updateFilterContext(resolvedParameters);\n }\n\n await this.vm.executeReport();\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected async openInFullViewer(): Promise<void> {\n if (!this.reportId) {\n return;\n }\n\n const runId = this.runId?.trim() || this.vm.runId()?.trim();\n await this.openViewer.execute({\n reportId: this.reportId,\n ...(runId ? { runId } : {}),\n });\n this.close();\n }\n\n protected getLayoutSwitcherLabel(layout: AXPLayoutSwitcherOption): AXPMultiLanguageString {\n const locale = this.translateService.getActiveLang() || 'en-US';\n const reportTitle = this.vm.reportDefinition()?.title;\n if (isDistinctLayoutTitle(layout.title, reportTitle, locale)) {\n return layout.title ?? reportLayoutTitleKey(layout);\n }\n return reportLayoutTitleKey(layout);\n }\n\n protected handleLayoutSwitch(layoutId: string): void {\n if (this.vm.activeLayoutId() === layoutId) {\n return;\n }\n this.vm.switchLayout(layoutId);\n this.vm.nudgeFetch();\n }\n\n protected handleLayoutTabChanged(event: AXTabStripChangedEvent): void {\n const layout = this.vm.availableLayouts()[event.index];\n if (layout) {\n this.handleLayoutSwitch(layout.id);\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","<ax-content class=\"flex min-h-0 flex-1 flex-col overflow-hidden\" *translate=\"let t\">\n <div class=\"__popup-content\">\n <!-- ----- Layout switcher for multi-layout reports ----- -->\n @if (vm.hasMultipleLayouts() && vm.canSwitchLayout()) {\n <div class=\"__layout-switcher mb-3\">\n <ax-tabs\n class=\"__layout-tabs\"\n [look]=\"'with-line'\"\n [location]=\"'bottom'\"\n [fitParent]=\"false\"\n (onActiveTabChanged)=\"handleLayoutTabChanged($event)\"\n >\n @for (layout of vm.availableLayouts(); track layout.id) {\n <ax-tab-item\n [key]=\"layout.id\"\n [text]=\"(getLayoutSwitcherLabel(layout) | translate | async) ?? ''\"\n [active]=\"vm.activeLayoutId() === layout.id\"\n >\n <ax-prefix>\n <ax-icon [icon]=\"layoutPageIcon(layout.icon, layout)\"></ax-icon>\n </ax-prefix>\n </ax-tab-item>\n }\n </ax-tabs>\n </div>\n }\n <!-- ----- Error or results ----- -->\n @if (vm.hasError()) {\n <axp-state-message\n icon=\"fa-light fa-exclamation-triangle\"\n [title]=\"'@report-management:report-viewer.messages.error.fetch-title'\"\n [description]=\"vm.error() || '@report-management:report-viewer.messages.error.unexpected'\"\n >\n </axp-state-message>\n }\n <!-- ----- Table layout results ----- -->\n @else if (vm.isTableLayout()) {\n <axp-report-table-view class=\"__popup-view\"></axp-report-table-view>\n }\n <!-- ----- Chart layout results ----- -->\n @else if (vm.isChartLayout()) {\n <axp-report-chart-view class=\"__popup-view\"></axp-report-chart-view>\n }\n <!-- ----- PDF layout results ----- -->\n @else if (vm.isPdfLayout()) {\n <axp-report-pdf-view class=\"__popup-view\"></axp-report-pdf-view>\n }\n <!-- ----- Unsupported layout types ----- -->\n @else {\n <axp-state-message\n icon=\"fa-light fa-chart-line\"\n [title]=\"'@report-management:report-viewer.components.report-popup-viewer.unsupported-layout.title'\"\n [description]=\"'@report-management:report-viewer.components.report-popup-viewer.unsupported-layout.description'\"\n >\n </axp-state-message>\n }\n </div>\n</ax-content>\n<ax-footer class=\"__popup-footer\">\n <ax-prefix>\n <ax-button\n look=\"outline\"\n color=\"secondary\"\n [text]=\"'@report-management:report-viewer.actions.open-in-report-viewer.title' | translate | async\"\n (onClick)=\"openInFullViewer()\"\n >\n <ax-suffix>\n <ax-icon icon=\"fa-light fa-file-chart-column\"></ax-icon>\n </ax-suffix>\n </ax-button>\n </ax-prefix>\n <ax-suffix>\n <ax-button\n [text]=\"'@general:actions.close.title' | translate | async\"\n look=\"solid\"\n color=\"default\"\n (onClick)=\"close()\"\n >\n </ax-button>\n </ax-suffix>\n</ax-footer>\n"],"names":["i4","i5"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AA8BA;AAEA;AAyBM,MAAO,6BAA8B,SAAQ,mBAAmB,CAAA;AAvBtE,IAAA,WAAA,GAAA;;QA6BE,IAAA,CAAA,UAAU,GAA4B,EAAE;QACxC,IAAA,CAAA,gBAAgB,GAAa,EAAE;;;AAMZ,QAAA,IAAA,CAAA,EAAE,GAAG,MAAM,CAAC,wBAAwB,CAAC;AACvC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,0BAA0B,CAAC;AAC/C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAC7C,IAAA,CAAA,cAAc,GAAG,oBAAoB;AA8EzD,IAAA;;;AAxEU,IAAA,MAAM,QAAQ,GAAA;AACrB,QAAA,MAAM,KAAK,CAAC,QAAQ,EAAE;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QAChC,IAAI,KAAK,EAAE;YACT,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;;YAElC,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;YACtC;QACF;QAEA,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;AAEvC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;QACrC;QAEA,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;AACpC,YAAA,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACrE;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9D,YAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,WAAW,CAC3C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,+BAA+B,CAAC,KAAK,CAAC,CAAC,CAAC,CACrG;AACD,YAAA,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,kBAAkB,CAAC;QACjD;AAEA,QAAA,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE;IAC/B;;;AAMU,IAAA,MAAM,gBAAgB,GAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB;QACF;AAEA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE;AAC3D,QAAA,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,YAAA,IAAI,KAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC5B,SAAA,CAAC;QACF,IAAI,CAAC,KAAK,EAAE;IACd;AAEU,IAAA,sBAAsB,CAAC,MAA+B,EAAA;QAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,OAAO;QAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,EAAE,KAAK;QACrD,IAAI,qBAAqB,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE;YAC5D,OAAO,MAAM,CAAC,KAAK,IAAI,oBAAoB,CAAC,MAAM,CAAC;QACrD;AACA,QAAA,OAAO,oBAAoB,CAAC,MAAM,CAAC;IACrC;AAEU,IAAA,kBAAkB,CAAC,QAAgB,EAAA;QAC3C,IAAI,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,QAAQ,EAAE;YACzC;QACF;AACA,QAAA,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC;AAC9B,QAAA,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE;IACtB;AAEU,IAAA,sBAAsB,CAAC,KAA6B,EAAA;AAC5D,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QACtD,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC;IACF;8GA3FW,6BAA6B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,6EAAA,EAAA,EAAA,SAAA,EAP7B,CAAC,wBAAwB,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClDvC,w7FAiFA,EAAA,MAAA,EAAA,CAAA,ogEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1CI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,iBAAiB,sVACjB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,2BAA2B,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAShB,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAvBzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,yBAAyB,EAAA,OAAA,EAG1B;wBACP,YAAY;wBACZ,cAAc;wBACd,iBAAiB;wBACjB,eAAe;wBACf,YAAY;wBACZ,mBAAmB;wBACnB,wBAAwB;wBACxB,2BAA2B;wBAC3B,2BAA2B;wBAC3B,yBAAyB;qBAC1B,EAAA,SAAA,EACU,CAAC,wBAAwB,CAAC,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,KAAK,EAAE,6EAA6E;AACrF,qBAAA,EAAA,QAAA,EAAA,w7FAAA,EAAA,MAAA,EAAA,CAAA,ogEAAA,CAAA,EAAA;;;;;"}