@acorex/modules 20.0.21 → 20.0.22

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.
@@ -1,11 +1,11 @@
1
1
  import { AXPSessionService, AXPAuthGuard } from '@acorex/platform/auth';
2
2
  import { AXP_REPORT_DEFINITION_PROVIDER, AXP_REPORT_CATEGORY_PROVIDER, createAllQueryView, AXPEntityCommandScope, AXPEntityQueryType, AXPLockService, AXP_MENU_PROVIDER, AXPReportDefinitionService } from '@acorex/platform/common';
3
3
  import { AXPDomainModule, provideEntity } from '@acorex/platform/domain';
4
- import { AXPQueryService, provideCommandSetups } from '@acorex/platform/runtime';
5
4
  import { AXPRootLayoutComponent } from '@acorex/platform/themes/default';
6
5
  import * as i0 from '@angular/core';
7
- import { inject, Injectable, NgModule, computed, input, output, ChangeDetectionStrategy, Component, viewChild, ViewEncapsulation } from '@angular/core';
6
+ import { inject, Injectable, NgModule, computed, output, ViewEncapsulation, ChangeDetectionStrategy, Component, input, viewChild } from '@angular/core';
8
7
  import { ROUTES, ActivatedRoute, Router } from '@angular/router';
8
+ import { AXPQueryService, AXPCommandService } from '@acorex/platform/runtime';
9
9
  import { AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER } from '@acorex/platform/core';
10
10
  import * as i1 from '@acorex/platform/workflow';
11
11
  import { AXPWorkflowAction, AXPWorkflowModule } from '@acorex/platform/workflow';
@@ -25,7 +25,7 @@ import { AXDecoratorModule } from '@acorex/components/decorators';
25
25
  import * as i3 from '@acorex/components/loading';
26
26
  import { AXLoadingModule } from '@acorex/components/loading';
27
27
  import { AXUnsubscriber } from '@acorex/core/utils';
28
- import { AXPDynamicFormComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutBlockComponent } from '@acorex/platform/layout/components';
28
+ import { AXPDynamicFormComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutFooterComponent } from '@acorex/platform/layout/components';
29
29
  import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPageLayoutBase } from '@acorex/platform/layout/views';
30
30
  import { AXPLayoutThemeService } from '@acorex/platform/themes/shared';
31
31
  import * as i1$1 from '@angular/common';
@@ -1044,7 +1044,7 @@ function routesFacory() {
1044
1044
  children: [
1045
1045
  {
1046
1046
  path: '**',
1047
- loadComponent: () => import('./acorex-modules-report-management-report-runner-root-page.component-S8qyvs79.mjs').then((c) => c.AXMReportRunnerRootPageComponent),
1047
+ loadComponent: () => import('./acorex-modules-report-management-report-runner-root-page.component-C3UP9Jsi.mjs').then((c) => c.AXMReportRunnerRootPageComponent),
1048
1048
  data: { reuse: true },
1049
1049
  },
1050
1050
  ],
@@ -1082,16 +1082,6 @@ class AXMReportManagementModule {
1082
1082
  multi: true,
1083
1083
  useFactory: routesFacory,
1084
1084
  },
1085
- provideCommandSetups([
1086
- {
1087
- key: `${RootConfig.entities.report.fullName}:Run`,
1088
- command: () => import('./acorex-modules-report-management-run.command-DHPmdkSZ.mjs').then((c) => c.AXMReportRunCommand),
1089
- },
1090
- {
1091
- key: `${RootConfig.entities.report.fullName}:Execute`,
1092
- command: () => Promise.resolve().then(function () { return execute_command; }).then((c) => c.AXMReportExecuteCommand),
1093
- },
1094
- ]),
1095
1085
  provideEntity([RootConfig.entities.report.fullName, RootConfig.entities.category.fullName]),
1096
1086
  {
1097
1087
  provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
@@ -1151,16 +1141,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImpor
1151
1141
  multi: true,
1152
1142
  useFactory: routesFacory,
1153
1143
  },
1154
- provideCommandSetups([
1155
- {
1156
- key: `${RootConfig.entities.report.fullName}:Run`,
1157
- command: () => import('./acorex-modules-report-management-run.command-DHPmdkSZ.mjs').then((c) => c.AXMReportRunCommand),
1158
- },
1159
- {
1160
- key: `${RootConfig.entities.report.fullName}:Execute`,
1161
- command: () => Promise.resolve().then(function () { return execute_command; }).then((c) => c.AXMReportExecuteCommand),
1162
- },
1163
- ]),
1164
1144
  provideEntity([RootConfig.entities.report.fullName, RootConfig.entities.category.fullName]),
1165
1145
  {
1166
1146
  provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
@@ -1171,57 +1151,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImpor
1171
1151
  }]
1172
1152
  }] });
1173
1153
 
1174
- class AXMReportExecuteCommand {
1175
- //#region ---- Command Implementation ----
1176
- async execute(input) {
1177
- try {
1178
- // Simulate mock data for now
1179
- const { parameters, page = 1, pageSize = 50 } = input;
1180
- // Mock data generation based on parameters
1181
- const mockData = this.generateMockData(parameters, pageSize);
1182
- return {
1183
- data: mockData,
1184
- total: 150, // Mock total
1185
- page,
1186
- pageSize
1187
- };
1188
- }
1189
- catch (error) {
1190
- console.error('Error executing report:', error);
1191
- throw new Error('Failed to execute report');
1192
- }
1193
- }
1194
- //#endregion
1195
- //#region ---- Mock Data Generation ----
1196
- generateMockData(parameters, pageSize) {
1197
- const data = [];
1198
- for (let i = 0; i < pageSize; i++) {
1199
- data.push({
1200
- id: `report-item-${i + 1}`,
1201
- title: `Report Item ${i + 1}`,
1202
- category: parameters['category'] || 'General',
1203
- createdDate: new Date(Date.now() - Math.random() * 30 * 24 * 60 * 60 * 1000),
1204
- status: ['Active', 'Pending', 'Completed'][Math.floor(Math.random() * 3)],
1205
- value: Math.floor(Math.random() * 1000),
1206
- description: `This is a sample report item ${i + 1} with some description text.`,
1207
- ...(parameters['startDate'] && { filteredByDate: true }),
1208
- ...(parameters['category'] && { categoryFilter: parameters['category'] })
1209
- });
1210
- }
1211
- return data;
1212
- }
1213
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMReportExecuteCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1214
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMReportExecuteCommand }); }
1215
- }
1216
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMReportExecuteCommand, decorators: [{
1217
- type: Injectable
1218
- }] });
1219
-
1220
- var execute_command = /*#__PURE__*/Object.freeze({
1221
- __proto__: null,
1222
- AXMReportExecuteCommand: AXMReportExecuteCommand
1223
- });
1224
-
1225
1154
  const AXPReportViewerViewModel = signalStore(withState(() => ({
1226
1155
  reportDefinition: null,
1227
1156
  reportData: [],
@@ -1231,8 +1160,9 @@ const AXPReportViewerViewModel = signalStore(withState(() => ({
1231
1160
  status: AXPPageStatus.Idle,
1232
1161
  totalRecords: 0,
1233
1162
  currentPage: 1,
1234
- pageSize: 50,
1163
+ pageSize: 10,
1235
1164
  error: null,
1165
+ showResults: false,
1236
1166
  })), withComputed((store) => ({
1237
1167
  //#region ---- Layout Type Detection ----
1238
1168
  layoutType: computed(() => store.reportDefinition()?.layout?.type),
@@ -1274,6 +1204,7 @@ const AXPReportViewerViewModel = signalStore(withState(() => ({
1274
1204
  //#region ---- Data Source ----
1275
1205
  dataSource: computed(() => new AXDataSource({
1276
1206
  load: async () => {
1207
+ debugger;
1277
1208
  const data = store.reportData();
1278
1209
  return {
1279
1210
  items: data,
@@ -1307,7 +1238,7 @@ const AXPReportViewerViewModel = signalStore(withState(() => ({
1307
1238
  }),
1308
1239
  canExecute: computed(() => store.reportDefinition() !== null && !store.isLoading() && !store.isExecuting()),
1309
1240
  //#endregion
1310
- })), withMethods((store, reportDefinitionService = inject(AXPReportDefinitionService), executeCommand = inject(AXMReportExecuteCommand)) => ({
1241
+ })), withMethods((store, reportDefinitionService = inject(AXPReportDefinitionService), commandService = inject(AXPCommandService)) => ({
1311
1242
  //#region ---- Report Loading ----
1312
1243
  async loadReport(reportId) {
1313
1244
  patchState(store, {
@@ -1359,13 +1290,14 @@ const AXPReportViewerViewModel = signalStore(withState(() => ({
1359
1290
  error: null
1360
1291
  });
1361
1292
  try {
1362
- const result = await executeCommand.execute({
1293
+ const result = await commandService.execute('ReportManagement.Report:Execute', {
1363
1294
  reportId: report.id,
1364
1295
  parameters: store.filterContext(),
1365
1296
  page: store.currentPage(),
1366
1297
  pageSize: store.pageSize()
1367
1298
  });
1368
1299
  patchState(store, {
1300
+ showResults: true,
1369
1301
  reportData: result.data || [],
1370
1302
  totalRecords: result.total || 0,
1371
1303
  previousFilterContext: { ...store.filterContext() }
@@ -1373,7 +1305,8 @@ const AXPReportViewerViewModel = signalStore(withState(() => ({
1373
1305
  }
1374
1306
  catch (error) {
1375
1307
  patchState(store, {
1376
- error: 'Failed to execute report'
1308
+ error: 'Failed to execute report',
1309
+ showResults: false,
1377
1310
  });
1378
1311
  console.error('Error executing report:', error);
1379
1312
  }
@@ -1386,9 +1319,8 @@ const AXPReportViewerViewModel = signalStore(withState(() => ({
1386
1319
  //#endregion
1387
1320
  //#region ---- Filter Management ----
1388
1321
  updateFilterContext(context) {
1389
- // Replace context completely instead of merging to fix binding issues
1390
1322
  patchState(store, {
1391
- filterContext: { ...context }
1323
+ filterContext: { ...store.filterContext(), ...context },
1392
1324
  });
1393
1325
  },
1394
1326
  clearFilters() {
@@ -1463,14 +1395,8 @@ const AXPReportViewerViewModel = signalStore(withState(() => ({
1463
1395
 
1464
1396
  class AXPReportTableViewComponent {
1465
1397
  constructor() {
1466
- //#region ---- Inputs ----
1467
- this.dataSource = input.required();
1468
- this.columns = input.required();
1469
- this.isLoading = input(false);
1470
- this.hasError = input(false);
1471
- this.errorMessage = input(null);
1472
- this.hasData = input(false);
1473
- this.paginationEnabled = input(true);
1398
+ //#region ---- Dependencies ----
1399
+ this.vm = inject(AXPReportViewerViewModel);
1474
1400
  //#endregion
1475
1401
  //#region ---- Outputs ----
1476
1402
  this.rowClick = output();
@@ -1493,7 +1419,7 @@ class AXPReportTableViewComponent {
1493
1419
  }
1494
1420
  }
1495
1421
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPReportTableViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1496
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.7", type: AXPReportTableViewComponent, isStandalone: true, selector: "axp-report-table-view", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: true, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, hasError: { classPropertyName: "hasError", publicName: "hasError", isSignal: true, isRequired: false, transformFunction: null }, errorMessage: { classPropertyName: "errorMessage", publicName: "errorMessage", isSignal: true, isRequired: false, transformFunction: null }, hasData: { classPropertyName: "hasData", publicName: "hasData", isSignal: true, isRequired: false, transformFunction: null }, paginationEnabled: { classPropertyName: "paginationEnabled", publicName: "paginationEnabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rowClick: "rowClick", actionClick: "actionClick" }, ngImport: i0, template: "<div class=\"axp-report-table-view\" *translate=\"let t\">\n @if (isLoading()) {\n <!-- Loading State -->\n <div class=\"__loading-state\">\n <ax-loading></ax-loading>\n <p class=\"__loading-text\">\n {{ t('@report-management:features.report-viewer.loading') | async }}\n </p>\n </div>\n } @else if (hasError()) {\n <!-- Error State -->\n <div class=\"__error-state\">\n <div class=\"__error-content\">\n <div class=\"__error-icon\">\n <ax-icon class=\"fa-light fa-exclamation-triangle\"></ax-icon>\n </div>\n <div class=\"__error-message\">\n {{ errorMessage() || (t('@report-management:features.report-viewer.error') | async) }}\n </div>\n </div>\n </div>\n } @else if (!hasData()) {\n <!-- No Data State -->\n <div class=\"__no-data-state\">\n <div class=\"__no-data-content\">\n <div class=\"__no-data-icon\">\n <ax-icon class=\"fa-light fa-table\"></ax-icon>\n </div>\n <div class=\"__no-data-title\">\n {{ t('@report-management:features.report-viewer.no-data.title') | async }}\n </div>\n <div class=\"__no-data-description\">\n {{ t('@report-management:features.report-viewer.no-data.description') | async }}\n </div>\n </div>\n </div>\n } @else {\n <!-- Data Table -->\n <div class=\"__table-container\">\n <ax-data-table\n [dataSource]=\"dataSource()\"\n [paging]=\"paginationEnabled()\"\n [fetchDataMode]=\"'manual'\"\n [loading]=\"{ enabled: true, animation: true }\"\n (onRowClick)=\"handleRowClick($event)\"\n class=\"__data-table\"\n >\n <!-- Dynamic columns based on configuration -->\n @for (column of columns(); track column.field) {\n @if (column.visible) {\n <ax-text-column [dataField]=\"column.field\" [caption]=\"column.title\" [width]=\"column.width\">\n </ax-text-column>\n }\n }\n </ax-data-table>\n </div>\n }\n</div>\n", styles: [".axp-report-table-view{display:flex;height:100%;width:100%;flex-direction:column}.axp-report-table-view .__loading-state{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;gap:1rem;padding:2rem}.axp-report-table-view .__loading-state ax-loading{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__loading-state .__loading-text{max-width:28rem;text-align:center;font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-table-view .__error-state{display:flex;height:100%;align-items:center;justify-content:center;padding:2rem}.axp-report-table-view .__error-state .__error-content{display:flex;max-width:28rem;flex-direction:column;align-items:center;gap:1rem;text-align:center}.axp-report-table-view .__error-state .__error-content .__error-icon{margin-bottom:.5rem;font-size:3rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-danger-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__error-state .__error-content .__error-message{font-weight:500;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-danger-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__no-data-state{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center}.axp-report-table-view .__no-data-state .__no-data-content{max-width:28rem}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-icon{margin-bottom:1rem;font-size:3rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-secondary-500),var(--tw-text-opacity, 1));opacity:.5}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-title{margin-bottom:.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-description{font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-table-view .__table-container{display:flex;flex:1 1 0%;flex-direction:column;overflow:hidden}.axp-report-table-view .__table-container .__data-table{height:100%;width:100%}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table{display:flex;height:100%;flex-direction:column}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table .ax-data-table-container{flex:1 1 0%;overflow:auto}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table .ax-data-table-content{height:100%;overflow:auto}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table .ax-table{min-height:0px}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table .ax-table-body{overflow:auto}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table-footer{flex-shrink:0;border-top-width:1px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i2.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "parentField", "rowTemplate", "emptyTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i2.AXDataTableTextColumnComponent, selector: "ax-text-column", inputs: ["width", "caption", "allowSorting", "allowResizing", "fixed", "customExpandIcon", "customCollapseIcon", "dataField", "expandHandler", "wrapText", "cellTemplate", "footerTemplate", "headerTemplate", "format", "formatOptions"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i3.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXPLayoutBuilderModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1422
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.7", type: AXPReportTableViewComponent, isStandalone: true, selector: "axp-report-table-view", outputs: { rowClick: "rowClick", actionClick: "actionClick" }, host: { classAttribute: "axp-report-table-view" }, ngImport: i0, template: "<ng-container *translate=\"let t\">\n @if (vm.isLoading()) {\n <!-- Loading State -->\n <div class=\"__loading-state\">\n <ax-loading></ax-loading>\n <p class=\"__loading-text\">\n {{ t('@report-management:features.report-viewer.loading') | async }}\n </p>\n </div>\n } @else if (vm.hasError()) {\n <!-- Error State -->\n <div class=\"__error-state\">\n <div class=\"__error-content\">\n <div class=\"__error-icon\">\n <ax-icon class=\"fa-light fa-exclamation-triangle\"></ax-icon>\n </div>\n <div class=\"__error-message\">\n {{ vm.error() || (t('@report-management:features.report-viewer.error') | async) }}\n </div>\n </div>\n </div>\n } @else if (!vm.hasData()) {\n <!-- No Data State -->\n <div class=\"__no-data-state\">\n <div class=\"__no-data-content\">\n <div class=\"__no-data-icon\">\n <ax-icon class=\"fa-light fa-table\"></ax-icon>\n </div>\n <div class=\"__no-data-title\">\n {{ t('@report-management:features.report-viewer.no-data.title') | async }}\n </div>\n <div class=\"__no-data-description\">\n {{ t('@report-management:features.report-viewer.no-data.description') | async }}\n </div>\n </div>\n </div>\n } @else {\n <!-- Data Table -->\n <ax-data-table\n [dataSource]=\"vm.dataSource()\"\n [paging]=\"vm.paginationEnabled()\"\n [loading]=\"{ enabled: true, animation: true }\"\n (onRowClick)=\"handleRowClick($event)\"\n class=\"ax-flex-1\"\n >\n <!-- Dynamic columns based on configuration -->\n @for (column of vm.columns(); track column.field) {\n @if (column.visible) {\n <ax-text-column [dataField]=\"column.field\" [caption]=\"column.title\" [width]=\"column.width\"> </ax-text-column>\n }\n }\n </ax-data-table>\n }\n</ng-container>\n", styles: [".axp-report-table-view{display:flex;height:100%;width:100%;flex:1 1 0%;flex-direction:column;overflow:hidden}.axp-report-table-view .__loading-state{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;gap:1rem;padding:2rem}.axp-report-table-view .__loading-state ax-loading{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__loading-state .__loading-text{max-width:28rem;text-align:center;font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-table-view .__error-state{display:flex;height:100%;align-items:center;justify-content:center;padding:2rem}.axp-report-table-view .__error-state .__error-content{display:flex;max-width:28rem;flex-direction:column;align-items:center;gap:1rem;text-align:center}.axp-report-table-view .__error-state .__error-content .__error-icon{margin-bottom:.5rem;font-size:3rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-danger-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__error-state .__error-content .__error-message{font-weight:500;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-danger-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__no-data-state{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center}.axp-report-table-view .__no-data-state .__no-data-content{max-width:28rem}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-icon{margin-bottom:1rem;font-size:3rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-secondary-500),var(--tw-text-opacity, 1));opacity:.5}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-title{margin-bottom:.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-description{font-size:.875rem;line-height:1.25rem;opacity:.75}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i2.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "parentField", "rowTemplate", "emptyTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i2.AXDataTableTextColumnComponent, selector: "ax-text-column", inputs: ["width", "caption", "allowSorting", "allowResizing", "fixed", "customExpandIcon", "customCollapseIcon", "dataField", "expandHandler", "wrapText", "cellTemplate", "footerTemplate", "headerTemplate", "format", "formatOptions"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i3.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXPLayoutBuilderModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1497
1423
  }
1498
1424
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPReportTableViewComponent, decorators: [{
1499
1425
  type: Component,
@@ -1504,7 +1430,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImpor
1504
1430
  AXDecoratorModule,
1505
1431
  AXTranslationModule,
1506
1432
  AXPLayoutBuilderModule
1507
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axp-report-table-view\" *translate=\"let t\">\n @if (isLoading()) {\n <!-- Loading State -->\n <div class=\"__loading-state\">\n <ax-loading></ax-loading>\n <p class=\"__loading-text\">\n {{ t('@report-management:features.report-viewer.loading') | async }}\n </p>\n </div>\n } @else if (hasError()) {\n <!-- Error State -->\n <div class=\"__error-state\">\n <div class=\"__error-content\">\n <div class=\"__error-icon\">\n <ax-icon class=\"fa-light fa-exclamation-triangle\"></ax-icon>\n </div>\n <div class=\"__error-message\">\n {{ errorMessage() || (t('@report-management:features.report-viewer.error') | async) }}\n </div>\n </div>\n </div>\n } @else if (!hasData()) {\n <!-- No Data State -->\n <div class=\"__no-data-state\">\n <div class=\"__no-data-content\">\n <div class=\"__no-data-icon\">\n <ax-icon class=\"fa-light fa-table\"></ax-icon>\n </div>\n <div class=\"__no-data-title\">\n {{ t('@report-management:features.report-viewer.no-data.title') | async }}\n </div>\n <div class=\"__no-data-description\">\n {{ t('@report-management:features.report-viewer.no-data.description') | async }}\n </div>\n </div>\n </div>\n } @else {\n <!-- Data Table -->\n <div class=\"__table-container\">\n <ax-data-table\n [dataSource]=\"dataSource()\"\n [paging]=\"paginationEnabled()\"\n [fetchDataMode]=\"'manual'\"\n [loading]=\"{ enabled: true, animation: true }\"\n (onRowClick)=\"handleRowClick($event)\"\n class=\"__data-table\"\n >\n <!-- Dynamic columns based on configuration -->\n @for (column of columns(); track column.field) {\n @if (column.visible) {\n <ax-text-column [dataField]=\"column.field\" [caption]=\"column.title\" [width]=\"column.width\">\n </ax-text-column>\n }\n }\n </ax-data-table>\n </div>\n }\n</div>\n", styles: [".axp-report-table-view{display:flex;height:100%;width:100%;flex-direction:column}.axp-report-table-view .__loading-state{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;gap:1rem;padding:2rem}.axp-report-table-view .__loading-state ax-loading{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__loading-state .__loading-text{max-width:28rem;text-align:center;font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-table-view .__error-state{display:flex;height:100%;align-items:center;justify-content:center;padding:2rem}.axp-report-table-view .__error-state .__error-content{display:flex;max-width:28rem;flex-direction:column;align-items:center;gap:1rem;text-align:center}.axp-report-table-view .__error-state .__error-content .__error-icon{margin-bottom:.5rem;font-size:3rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-danger-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__error-state .__error-content .__error-message{font-weight:500;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-danger-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__no-data-state{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center}.axp-report-table-view .__no-data-state .__no-data-content{max-width:28rem}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-icon{margin-bottom:1rem;font-size:3rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-secondary-500),var(--tw-text-opacity, 1));opacity:.5}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-title{margin-bottom:.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-description{font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-table-view .__table-container{display:flex;flex:1 1 0%;flex-direction:column;overflow:hidden}.axp-report-table-view .__table-container .__data-table{height:100%;width:100%}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table{display:flex;height:100%;flex-direction:column}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table .ax-data-table-container{flex:1 1 0%;overflow:auto}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table .ax-data-table-content{height:100%;overflow:auto}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table .ax-table{min-height:0px}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table .ax-table-body{overflow:auto}.axp-report-table-view .__table-container .__data-table ::ng-deep .ax-data-table-footer{flex-shrink:0;border-top-width:1px}\n"] }]
1433
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
1434
+ class: 'axp-report-table-view'
1435
+ }, template: "<ng-container *translate=\"let t\">\n @if (vm.isLoading()) {\n <!-- Loading State -->\n <div class=\"__loading-state\">\n <ax-loading></ax-loading>\n <p class=\"__loading-text\">\n {{ t('@report-management:features.report-viewer.loading') | async }}\n </p>\n </div>\n } @else if (vm.hasError()) {\n <!-- Error State -->\n <div class=\"__error-state\">\n <div class=\"__error-content\">\n <div class=\"__error-icon\">\n <ax-icon class=\"fa-light fa-exclamation-triangle\"></ax-icon>\n </div>\n <div class=\"__error-message\">\n {{ vm.error() || (t('@report-management:features.report-viewer.error') | async) }}\n </div>\n </div>\n </div>\n } @else if (!vm.hasData()) {\n <!-- No Data State -->\n <div class=\"__no-data-state\">\n <div class=\"__no-data-content\">\n <div class=\"__no-data-icon\">\n <ax-icon class=\"fa-light fa-table\"></ax-icon>\n </div>\n <div class=\"__no-data-title\">\n {{ t('@report-management:features.report-viewer.no-data.title') | async }}\n </div>\n <div class=\"__no-data-description\">\n {{ t('@report-management:features.report-viewer.no-data.description') | async }}\n </div>\n </div>\n </div>\n } @else {\n <!-- Data Table -->\n <ax-data-table\n [dataSource]=\"vm.dataSource()\"\n [paging]=\"vm.paginationEnabled()\"\n [loading]=\"{ enabled: true, animation: true }\"\n (onRowClick)=\"handleRowClick($event)\"\n class=\"ax-flex-1\"\n >\n <!-- Dynamic columns based on configuration -->\n @for (column of vm.columns(); track column.field) {\n @if (column.visible) {\n <ax-text-column [dataField]=\"column.field\" [caption]=\"column.title\" [width]=\"column.width\"> </ax-text-column>\n }\n }\n </ax-data-table>\n }\n</ng-container>\n", styles: [".axp-report-table-view{display:flex;height:100%;width:100%;flex:1 1 0%;flex-direction:column;overflow:hidden}.axp-report-table-view .__loading-state{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;gap:1rem;padding:2rem}.axp-report-table-view .__loading-state ax-loading{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__loading-state .__loading-text{max-width:28rem;text-align:center;font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-table-view .__error-state{display:flex;height:100%;align-items:center;justify-content:center;padding:2rem}.axp-report-table-view .__error-state .__error-content{display:flex;max-width:28rem;flex-direction:column;align-items:center;gap:1rem;text-align:center}.axp-report-table-view .__error-state .__error-content .__error-icon{margin-bottom:.5rem;font-size:3rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-danger-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__error-state .__error-content .__error-message{font-weight:500;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-danger-500),var(--tw-text-opacity, 1))}.axp-report-table-view .__no-data-state{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center}.axp-report-table-view .__no-data-state .__no-data-content{max-width:28rem}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-icon{margin-bottom:1rem;font-size:3rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-secondary-500),var(--tw-text-opacity, 1));opacity:.5}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-title{margin-bottom:.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600}.axp-report-table-view .__no-data-state .__no-data-content .__no-data-description{font-size:.875rem;line-height:1.25rem;opacity:.75}\n"] }]
1508
1436
  }] });
1509
1437
 
1510
1438
  class AXPReportViewerPageComponent extends AXPPageLayoutBaseComponent {
@@ -1521,15 +1449,11 @@ class AXPReportViewerPageComponent extends AXPPageLayoutBaseComponent {
1521
1449
  this.reportId = input();
1522
1450
  this.reportParameters = input({});
1523
1451
  //#endregion
1524
- //#region ---- Outputs ----
1525
- this.reportExecuted = output();
1526
- //#endregion
1527
1452
  //#region ---- ViewChildren ----
1528
1453
  this.filtersForm = viewChild('filtersForm');
1529
- this.mobileFiltersForm = viewChild('mobileFiltersForm');
1530
1454
  //#endregion
1531
1455
  //#region ---- ViewModel ----
1532
- this.vm = new AXPReportViewerViewModel();
1456
+ this.vm = inject(AXPReportViewerViewModel);
1533
1457
  //#endregion
1534
1458
  //#region ---- Computed Properties ----
1535
1459
  this.showFiltersPanel = () => this.layoutService.isLarge();
@@ -1556,40 +1480,58 @@ class AXPReportViewerPageComponent extends AXPPageLayoutBaseComponent {
1556
1480
  //#region ---- Lifecycle ----
1557
1481
  async ngOnInit() {
1558
1482
  await super.ngOnInit();
1559
- // Load report from route parameter or input
1483
+ // Subscribe to route parameter changes for dynamic report loading
1484
+ this.unsubscriber.takeUntilDestroy(this.route.paramMap).subscribe(async (params) => {
1485
+ const reportId = params.get('reportId') ||
1486
+ this.route.snapshot.queryParamMap.get('reportId') ||
1487
+ this.reportId();
1488
+ if (reportId) {
1489
+ await this.loadReportAndRefresh(reportId);
1490
+ }
1491
+ });
1492
+ // Initial load if reportId is available
1560
1493
  const reportId = this.route.snapshot.paramMap.get('reportId') ||
1561
1494
  this.route.snapshot.queryParamMap.get('reportId') ||
1562
1495
  this.reportId();
1563
1496
  if (reportId) {
1564
- await this.vm.loadReport(reportId);
1565
- // Extract all query parameters except reportId as initial parameters
1566
- const queryParams = this.route.snapshot.queryParams;
1567
- const initialParams = { ...queryParams };
1568
- delete initialParams['reportId']; // Remove reportId from parameters
1569
- // Merge with component input parameters
1570
- const allParams = { ...initialParams, ...this.reportParameters() };
1571
- if (Object.keys(allParams).length > 0) {
1572
- console.log('Applying initial parameters:', allParams);
1573
- this.vm.updateFilterContext(allParams);
1574
- // Auto-execute if parameters are provided
1575
- setTimeout(async () => {
1576
- await this.vm.executeReport();
1577
- }, 500); // Small delay to ensure form is ready
1578
- }
1497
+ await this.loadReportAndRefresh(reportId);
1498
+ }
1499
+ }
1500
+ //#endregion
1501
+ //#region ---- Helper Methods ----
1502
+ async loadReportAndRefresh(reportId) {
1503
+ await this.vm.loadReport(reportId);
1504
+ // Force refresh of page layout (breadcrumbs, title, etc.) after report loads
1505
+ this.recompute();
1506
+ // Handle initial parameters from query string
1507
+ const queryParams = this.route.snapshot.queryParams;
1508
+ const initialParams = { ...queryParams };
1509
+ delete initialParams['reportId']; // Remove reportId from parameters
1510
+ // Merge with component input parameters
1511
+ const allParams = { ...initialParams, ...this.reportParameters() };
1512
+ if (Object.keys(allParams).length > 0) {
1513
+ console.log('Applying initial parameters:', allParams);
1514
+ this.vm.updateFilterContext(allParams);
1515
+ // Auto-execute if parameters are provided
1516
+ setTimeout(async () => {
1517
+ await this.vm.executeReport();
1518
+ }, 500); // Small delay to ensure form is ready
1579
1519
  }
1580
1520
  }
1581
1521
  //#endregion
1582
1522
  //#region ---- Event Handlers ----
1583
1523
  handleFiltersChange(event) {
1584
- this.vm.updateFilterContext(event.data);
1524
+ this.vm.updateFilterContext(event);
1585
1525
  }
1586
1526
  handleFiltersInitiated(event) {
1587
- this.vm.updateFilterContext(event.data);
1527
+ this.vm.updateFilterContext(event);
1588
1528
  }
1589
1529
  async handleExecuteReport() {
1590
- console.log('Executing report with context:', this.vm.filterContext());
1530
+ const isValid = await this.filtersForm()?.validate();
1531
+ if (!isValid) {
1532
+ return;
1533
+ }
1591
1534
  await this.vm.executeReport();
1592
- this.reportExecuted.emit(this.vm.reportData());
1593
1535
  }
1594
1536
  handleRefresh() {
1595
1537
  this.vm.refresh();
@@ -1597,7 +1539,7 @@ class AXPReportViewerPageComponent extends AXPPageLayoutBaseComponent {
1597
1539
  handleClearFilters() {
1598
1540
  this.vm.clearFilters();
1599
1541
  // Reset form if available
1600
- const form = this.filtersForm() || this.mobileFiltersForm();
1542
+ const form = this.filtersForm();
1601
1543
  if (form) {
1602
1544
  form.resetErrors();
1603
1545
  }
@@ -1616,7 +1558,7 @@ class AXPReportViewerPageComponent extends AXPPageLayoutBaseComponent {
1616
1558
  const breadcrumbs = [
1617
1559
  {
1618
1560
  name: 'reports',
1619
- title: await this.translateService.translateAsync('@report-management:features.report-runner.menu-title'),
1561
+ title: await this.translateService.translateAsync('@report-management:root-menu'),
1620
1562
  command: {
1621
1563
  name: 'navigate-to-reports',
1622
1564
  },
@@ -1751,14 +1693,16 @@ class AXPReportViewerPageComponent extends AXPPageLayoutBaseComponent {
1751
1693
  }
1752
1694
  }
1753
1695
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPReportViewerPageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1754
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.7", type: AXPReportViewerPageComponent, isStandalone: true, selector: "axp-report-viewer-page", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, reportParameters: { classPropertyName: "reportParameters", publicName: "reportParameters", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { reportExecuted: "reportExecuted" }, host: { classAttribute: "axp-report-viewer-page" }, providers: [
1696
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.7", type: AXPReportViewerPageComponent, isStandalone: true, selector: "axp-report-viewer-page", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: false, transformFunction: null }, reportParameters: { classPropertyName: "reportParameters", publicName: "reportParameters", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "axp-report-viewer-page" }, providers: [
1755
1697
  AXUnsubscriber,
1756
- AXMReportExecuteCommand,
1698
+ AXPReportViewerViewModel,
1757
1699
  {
1758
1700
  provide: AXPPageLayoutBase,
1759
1701
  useExisting: AXPReportViewerPageComponent,
1760
1702
  },
1761
- ], viewQueries: [{ propertyName: "filtersForm", first: true, predicate: ["filtersForm"], descendants: true, isSignal: true }, { propertyName: "mobileFiltersForm", first: true, predicate: ["mobileFiltersForm"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <!-- Left Panel: Filters (Always visible for desktop) -->\n @if (showFiltersPanel()) {\n <axp-layout-start-side>\n <axp-layout-header>\n <axp-layout-title>\n {{ t('@report-management:features.report-viewer.filters.title') | async }}\n </axp-layout-title>\n </axp-layout-header>\n <axp-layout-content>\n <div class=\"__filters-container\">\n <axp-dynamic-form #filtersForm [formDefinition]=\"vm.formDefinition()\" [context]=\"vm.filterContext()\"\n [layoutConfig]=\"defaultLayout()\" [layoutStyle]=\"'compact'\" (contextChange)=\"handleFiltersChange($event)\"\n (contextInitiated)=\"handleFiltersInitiated($event)\">\n </axp-dynamic-form>\n </div>\n </axp-layout-content>\n </axp-layout-start-side>\n }\n\n <!-- Main Content: Report Display -->\n <axp-page-content>\n <!-- Mobile Filters (Collapsed) -->\n @if (!showFiltersPanel() && vm.reportDefinition()) {\n <div class=\"__mobile-filters\">\n <axp-dynamic-form #mobileFiltersForm [formDefinition]=\"vm.formDefinition()\" [context]=\"vm.filterContext()\"\n [layoutConfig]=\"compactLayout()\" [layoutStyle]=\"'compact'\" (contextChange)=\"handleFiltersChange($event)\"\n (contextInitiated)=\"handleFiltersInitiated($event)\">\n </axp-dynamic-form>\n </div>\n }\n\n @if (!vm.reportDefinition()) {\n <!-- No Report Selected State -->\n <div class=\"__no-report\">\n <div class=\"__no-report-icon\">\n <ax-icon class=\"fa-light fa-chart-line\"></ax-icon>\n </div>\n <div class=\"__no-report-content\">\n <h3 class=\"__no-report-title\">\n {{ t('@report-management:features.report-viewer.no-report.title') | async }}\n </h3>\n <p class=\"__no-report-description\">\n {{ t('@report-management:features.report-viewer.no-report.description') | async }}\n </p>\n <div class=\"__no-report-actions\">\n <ax-button look=\"outline\" color=\"primary\"\n [text]=\"t('@report-management:features.report-viewer.no-report.browse-reports') | async\">\n <ax-prefix>\n <ax-icon class=\"fa-light fa-folder-open\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n </div>\n } @else {\n <!-- Report Display Area -->\n @if (vm.isTableLayout()) {\n <axp-report-table-view [dataSource]=\"vm.dataSource()\" [columns]=\"vm.columns()\" [isLoading]=\"vm.isLoading()\"\n [hasError]=\"vm.hasError()\" [errorMessage]=\"vm.error()\" [hasData]=\"vm.hasData()\"\n [paginationEnabled]=\"vm.paginationEnabled()\" (rowClick)=\"handleRowClick($event)\"\n (actionClick)=\"handleActionClick($event)\">\n </axp-report-table-view>\n } @else if (vm.isChartLayout()) {\n <!-- Chart View Placeholder -->\n <div class=\"__chart-placeholder\">\n <div class=\"__placeholder-icon\">\n <ax-icon class=\"fa-light fa-chart-column\"></ax-icon>\n </div>\n <div class=\"__placeholder-content\">\n <h4 class=\"__placeholder-title\">Chart View</h4>\n <p class=\"__placeholder-description\">Chart visualization will be implemented here</p>\n </div>\n </div>\n } @else if (vm.isCardsLayout()) {\n <!-- Cards View Placeholder -->\n <div class=\"__cards-placeholder\">\n <div class=\"__placeholder-icon\">\n <ax-icon class=\"fa-light fa-table-cells\"></ax-icon>\n </div>\n <div class=\"__placeholder-content\">\n <h4 class=\"__placeholder-title\">Cards View</h4>\n <p class=\"__placeholder-description\">Card-based layout will be implemented here</p>\n </div>\n </div>\n } @else {\n <!-- Custom Layout Placeholder -->\n <div class=\"__custom-placeholder\">\n <div class=\"__placeholder-icon\">\n <ax-icon class=\"fa-light fa-layout-grid\"></ax-icon>\n </div>\n <div class=\"__placeholder-content\">\n <h4 class=\"__placeholder-title\">Custom Layout</h4>\n <p class=\"__placeholder-description\">Custom report layout will be implemented here</p>\n </div>\n </div>\n }\n }\n </axp-page-content>\n\n <!-- Footer: Execute Button -->\n <axp-page-footer class=\"--animated\">\n <axp-layout-suffix>\n <ax-button [class.ax-sm]=\"layoutService.isSmall()\"\n [text]=\"t('@report-management:features.report-viewer.actions.execute') | async\" [color]=\"'primary'\"\n (onClick)=\"execute({ name: 'execute-report' })\">\n <ax-prefix>\n <ax-icon class=\"fa-light fa-play\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </axp-layout-suffix>\n </axp-page-footer>\n</axp-page-layout>", styles: [".axp-report-viewer-page{display:flex;height:100%;width:100%;flex-direction:column}.axp-report-viewer-page axp-layout-start-side{height:100%;width:20rem;border-inline-end-width:1px;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}@media (min-width: 1920px){.axp-report-viewer-page axp-layout-start-side{width:24rem}}.axp-report-viewer-page axp-layout-start-side axp-layout-content{overflow-x:auto}.axp-report-viewer-page axp-layout-start-side .__filters-container{padding:1rem}.axp-report-viewer-page .__mobile-filters{flex-shrink:0;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));padding:1rem;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-report-viewer-page axp-page-content{display:flex;height:100%;flex-direction:column}.axp-report-viewer-page .__no-report{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center}.axp-report-viewer-page .__no-report .__no-report-icon{margin-bottom:1rem;font-size:3.75rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1));opacity:.5}.axp-report-viewer-page .__no-report .__no-report-content{max-width:28rem}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-title{margin-bottom:.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:600}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-description{margin-bottom:1.5rem;font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-actions{display:flex;justify-content:center}.axp-report-viewer-page axp-report-table-view{flex:1 1 0%;overflow:hidden}.axp-report-viewer-page .__chart-placeholder,.axp-report-viewer-page .__cards-placeholder,.axp-report-viewer-page .__custom-placeholder{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;margin:1.5rem;border-radius:.5rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-report-viewer-page .__chart-placeholder .__placeholder-icon,.axp-report-viewer-page .__cards-placeholder .__placeholder-icon,.axp-report-viewer-page .__custom-placeholder .__placeholder-icon{margin-bottom:1rem;font-size:3rem;line-height:1;opacity:.5}.axp-report-viewer-page .__chart-placeholder .__placeholder-content,.axp-report-viewer-page .__cards-placeholder .__placeholder-content,.axp-report-viewer-page .__custom-placeholder .__placeholder-content{max-width:28rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-title{margin-bottom:.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-description{font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-viewer-page .__chart-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-viewer-page .__cards-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-secondary-500),var(--tw-text-opacity, 1))}.axp-report-viewer-page .__custom-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-accent1-500),var(--tw-text-opacity, 1))}@media (max-width: 768px){.axp-report-viewer-page .__chart-placeholder,.axp-report-viewer-page .__cards-placeholder,.axp-report-viewer-page .__custom-placeholder{margin:1rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-title{font-size:1rem;line-height:1.5rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-description{font-size:.75rem;line-height:1rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2$1.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: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i4.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: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "component", type: AXPDynamicFormComponent, selector: "axp-dynamic-form", inputs: ["formDefinition", "context", "layoutStyle", "layoutConfig"], outputs: ["contextChange", "contextInitiated", "validityChange"] }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "component", type: AXPThemeLayoutHeaderComponent, selector: "axp-layout-header" }, { kind: "component", type: AXPThemeLayoutBlockComponent, selector: " axp-page-content, axp-page-footer-container, axp-page-footer, axp-page-header, axp-page-header-container, axp-page-toolbar, axp-layout-content, axp-layout-page-content, axp-layout-sections, axp-layout-body, axp-layout-page-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title-bar, axp-layout-title, axp-layout-title-actions, axp-layout-nav-button, axp-layout-description, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPReportTableViewComponent, selector: "axp-report-table-view", inputs: ["dataSource", "columns", "isLoading", "hasError", "errorMessage", "hasData", "paginationEnabled"], outputs: ["rowClick", "actionClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1703
+ ], viewQueries: [{ propertyName: "filtersForm", first: true, predicate: ["filtersForm"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <!-- Left Panel: Filters (Always visible for desktop) -->\n @if (showFiltersPanel()) {\n <axp-layout-start-side>\n <axp-layout-header>\n <axp-layout-title>\n {{ t('@report-management:features.report-viewer.filters.title') | async }}\n </axp-layout-title>\n </axp-layout-header>\n <axp-layout-content>\n <div class=\"__filters-container\">\n <axp-dynamic-form\n #filtersForm\n [formDefinition]=\"vm.formDefinition()\"\n [context]=\"vm.filterContext()\"\n [layoutConfig]=\"defaultLayout()\"\n [layoutStyle]=\"'compact'\"\n (contextChange)=\"handleFiltersChange($event)\"\n (contextInitiated)=\"handleFiltersInitiated($event)\"\n >\n </axp-dynamic-form>\n </div>\n </axp-layout-content>\n <axp-layout-footer class=\"ax-p-4 ax-border-t\">\n <ax-button\n [class.ax-sm]=\"layoutService.isSmall()\"\n class=\"ax-w-full\"\n [text]=\"t('@report-management:features.report-viewer.actions.execute') | async\"\n [color]=\"'primary'\"\n (onClick)=\"execute({ name: 'execute-report' })\"\n >\n <ax-prefix>\n <ax-icon class=\"fa-light fa-play\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </axp-layout-footer>\n </axp-layout-start-side>\n }\n <!-- Main Content: Report Display -->\n <axp-page-content>\n @if (!vm.reportDefinition()) {\n <ng-container *ngTemplateOutlet=\"noReport\"></ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"reportDisplay\"></ng-container>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<!-- Report Display Area -->\n<ng-template #reportDisplay>\n @if (vm.isTableLayout()) {\n <axp-report-table-view (rowClick)=\"handleRowClick($event)\" (actionClick)=\"handleActionClick($event)\">\n </axp-report-table-view>\n } @else if (vm.isChartLayout()) {\n <!-- Chart View Placeholder -->\n <div class=\"__chart-placeholder\">\n <div class=\"__placeholder-icon\">\n <ax-icon class=\"fa-light fa-chart-column\"></ax-icon>\n </div>\n <div class=\"__placeholder-content\">\n <h4 class=\"__placeholder-title\">Chart View</h4>\n <p class=\"__placeholder-description\">Chart visualization will be implemented here</p>\n </div>\n </div>\n } @else {\n <!-- Custom Layout Placeholder -->\n <div class=\"__custom-placeholder\">\n <div class=\"__placeholder-icon\">\n <ax-icon class=\"fa-light fa-layout-grid\"></ax-icon>\n </div>\n <div class=\"__placeholder-content\">\n <h4 class=\"__placeholder-title\">Custom Layout</h4>\n <p class=\"__placeholder-description\">Custom report layout will be implemented here</p>\n </div>\n </div>\n }\n</ng-template>\n\n<!-- No Report Selected State -->\n<ng-template #noReport>\n <div class=\"__no-report\" *translate=\"let t\">\n <div class=\"__no-report-icon\">\n <ax-icon class=\"fa-light fa-chart-line\"></ax-icon>\n </div>\n <div class=\"__no-report-content\">\n <h3 class=\"__no-report-title\">\n {{ t('@report-management:features.report-viewer.no-report.title') | async }}\n </h3>\n <p class=\"__no-report-description\">\n {{ t('@report-management:features.report-viewer.no-report.description') | async }}\n </p>\n <div class=\"__no-report-actions\">\n <ax-button\n look=\"outline\"\n color=\"primary\"\n [text]=\"t('@report-management:features.report-viewer.no-report.browse-reports') | async\"\n >\n <ax-prefix>\n <ax-icon class=\"fa-light fa-folder-open\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".axp-report-viewer-page{display:flex;height:100%;width:100%;flex-direction:column}.axp-report-viewer-page axp-layout-container{overflow:hidden}.axp-report-viewer-page axp-layout-start-side{height:100%;width:20rem;border-inline-end-width:1px;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}@media (min-width: 1920px){.axp-report-viewer-page axp-layout-start-side{width:24rem}}.axp-report-viewer-page axp-layout-start-side>axp-layout-header{height:73px;border-bottom-width:1px}.axp-report-viewer-page axp-layout-start-side axp-layout-content{overflow-x:auto;padding:.5rem}.axp-report-viewer-page axp-layout-start-side axp-layout-content .__filters-container axp-layout-sections{gap:0px!important}.axp-report-viewer-page axp-layout-start-side axp-layout-content .__filters-container axp-layout-sections axp-layout-section{border-style:none!important;padding:0!important;--tw-shadow: 0 0 #0000 !important;--tw-shadow-colored: 0 0 #0000 !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.axp-report-viewer-page .__mobile-filters{flex-shrink:0;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));padding:1rem;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-report-viewer-page axp-page-content{display:flex;height:100%;flex-direction:column}.axp-report-viewer-page .__no-report{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center}.axp-report-viewer-page .__no-report .__no-report-icon{margin-bottom:1rem;font-size:3.75rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1));opacity:.5}.axp-report-viewer-page .__no-report .__no-report-content{max-width:28rem}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-title{margin-bottom:.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:600}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-description{margin-bottom:1.5rem;font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-actions{display:flex;justify-content:center}.axp-report-viewer-page axp-report-table-view{flex:1 1 0%;overflow:hidden}.axp-report-viewer-page .__chart-placeholder,.axp-report-viewer-page .__cards-placeholder,.axp-report-viewer-page .__custom-placeholder{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;margin:1.5rem;border-radius:.5rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-report-viewer-page .__chart-placeholder .__placeholder-icon,.axp-report-viewer-page .__cards-placeholder .__placeholder-icon,.axp-report-viewer-page .__custom-placeholder .__placeholder-icon{margin-bottom:1rem;font-size:3rem;line-height:1;opacity:.5}.axp-report-viewer-page .__chart-placeholder .__placeholder-content,.axp-report-viewer-page .__cards-placeholder .__placeholder-content,.axp-report-viewer-page .__custom-placeholder .__placeholder-content{max-width:28rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-title{margin-bottom:.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-description{font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-viewer-page .__chart-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-viewer-page .__cards-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-secondary-500),var(--tw-text-opacity, 1))}.axp-report-viewer-page .__custom-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-accent1-500),var(--tw-text-opacity, 1))}@media (max-width: 768px){.axp-report-viewer-page .__chart-placeholder,.axp-report-viewer-page .__cards-placeholder,.axp-report-viewer-page .__custom-placeholder{margin:1rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-title{font-size:1rem;line-height:1.5rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-description{font-size:.75rem;line-height:1rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2$1.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: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i4.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: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "component", type:
1704
+ //
1705
+ AXPDynamicFormComponent, selector: "axp-dynamic-form", inputs: ["formDefinition", "context", "layoutStyle", "layoutConfig"], outputs: ["contextChange", "contextInitiated", "validityChange"] }, { kind: "component", type: AXPPageLayoutComponent, selector: "axp-page-layout" }, { kind: "component", type: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "component", type: AXPThemeLayoutHeaderComponent, selector: "axp-layout-header" }, { kind: "component", type: AXPThemeLayoutBlockComponent, selector: " axp-page-content, axp-page-footer-container, axp-page-footer, axp-page-header, axp-page-header-container, axp-page-toolbar, axp-layout-content, axp-layout-page-content, axp-layout-sections, axp-layout-body, axp-layout-page-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title-bar, axp-layout-title, axp-layout-title-actions, axp-layout-nav-button, axp-layout-description, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPReportTableViewComponent, selector: "axp-report-table-view", outputs: ["rowClick", "actionClick"] }, { kind: "component", type: AXPThemeLayoutFooterComponent, selector: "axp-layout-footer, axp-layout-page-footer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1762
1706
  }
1763
1707
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPReportViewerPageComponent, decorators: [{
1764
1708
  type: Component,
@@ -1768,20 +1712,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImpor
1768
1712
  AXDecoratorModule,
1769
1713
  AXLoadingModule,
1770
1714
  AXTranslationModule,
1715
+ //
1771
1716
  AXPDynamicFormComponent,
1772
1717
  AXPPageLayoutComponent,
1773
1718
  AXPThemeLayoutStartSideComponent,
1774
1719
  AXPThemeLayoutHeaderComponent,
1775
1720
  AXPThemeLayoutBlockComponent,
1776
- AXPReportTableViewComponent
1721
+ AXPReportTableViewComponent,
1722
+ AXPThemeLayoutFooterComponent
1777
1723
  ], providers: [
1778
1724
  AXUnsubscriber,
1779
- AXMReportExecuteCommand,
1725
+ AXPReportViewerViewModel,
1780
1726
  {
1781
1727
  provide: AXPPageLayoutBase,
1782
1728
  useExisting: AXPReportViewerPageComponent,
1783
1729
  },
1784
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'axp-report-viewer-page' }, template: "<axp-page-layout *translate=\"let t\">\n <!-- Left Panel: Filters (Always visible for desktop) -->\n @if (showFiltersPanel()) {\n <axp-layout-start-side>\n <axp-layout-header>\n <axp-layout-title>\n {{ t('@report-management:features.report-viewer.filters.title') | async }}\n </axp-layout-title>\n </axp-layout-header>\n <axp-layout-content>\n <div class=\"__filters-container\">\n <axp-dynamic-form #filtersForm [formDefinition]=\"vm.formDefinition()\" [context]=\"vm.filterContext()\"\n [layoutConfig]=\"defaultLayout()\" [layoutStyle]=\"'compact'\" (contextChange)=\"handleFiltersChange($event)\"\n (contextInitiated)=\"handleFiltersInitiated($event)\">\n </axp-dynamic-form>\n </div>\n </axp-layout-content>\n </axp-layout-start-side>\n }\n\n <!-- Main Content: Report Display -->\n <axp-page-content>\n <!-- Mobile Filters (Collapsed) -->\n @if (!showFiltersPanel() && vm.reportDefinition()) {\n <div class=\"__mobile-filters\">\n <axp-dynamic-form #mobileFiltersForm [formDefinition]=\"vm.formDefinition()\" [context]=\"vm.filterContext()\"\n [layoutConfig]=\"compactLayout()\" [layoutStyle]=\"'compact'\" (contextChange)=\"handleFiltersChange($event)\"\n (contextInitiated)=\"handleFiltersInitiated($event)\">\n </axp-dynamic-form>\n </div>\n }\n\n @if (!vm.reportDefinition()) {\n <!-- No Report Selected State -->\n <div class=\"__no-report\">\n <div class=\"__no-report-icon\">\n <ax-icon class=\"fa-light fa-chart-line\"></ax-icon>\n </div>\n <div class=\"__no-report-content\">\n <h3 class=\"__no-report-title\">\n {{ t('@report-management:features.report-viewer.no-report.title') | async }}\n </h3>\n <p class=\"__no-report-description\">\n {{ t('@report-management:features.report-viewer.no-report.description') | async }}\n </p>\n <div class=\"__no-report-actions\">\n <ax-button look=\"outline\" color=\"primary\"\n [text]=\"t('@report-management:features.report-viewer.no-report.browse-reports') | async\">\n <ax-prefix>\n <ax-icon class=\"fa-light fa-folder-open\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n </div>\n } @else {\n <!-- Report Display Area -->\n @if (vm.isTableLayout()) {\n <axp-report-table-view [dataSource]=\"vm.dataSource()\" [columns]=\"vm.columns()\" [isLoading]=\"vm.isLoading()\"\n [hasError]=\"vm.hasError()\" [errorMessage]=\"vm.error()\" [hasData]=\"vm.hasData()\"\n [paginationEnabled]=\"vm.paginationEnabled()\" (rowClick)=\"handleRowClick($event)\"\n (actionClick)=\"handleActionClick($event)\">\n </axp-report-table-view>\n } @else if (vm.isChartLayout()) {\n <!-- Chart View Placeholder -->\n <div class=\"__chart-placeholder\">\n <div class=\"__placeholder-icon\">\n <ax-icon class=\"fa-light fa-chart-column\"></ax-icon>\n </div>\n <div class=\"__placeholder-content\">\n <h4 class=\"__placeholder-title\">Chart View</h4>\n <p class=\"__placeholder-description\">Chart visualization will be implemented here</p>\n </div>\n </div>\n } @else if (vm.isCardsLayout()) {\n <!-- Cards View Placeholder -->\n <div class=\"__cards-placeholder\">\n <div class=\"__placeholder-icon\">\n <ax-icon class=\"fa-light fa-table-cells\"></ax-icon>\n </div>\n <div class=\"__placeholder-content\">\n <h4 class=\"__placeholder-title\">Cards View</h4>\n <p class=\"__placeholder-description\">Card-based layout will be implemented here</p>\n </div>\n </div>\n } @else {\n <!-- Custom Layout Placeholder -->\n <div class=\"__custom-placeholder\">\n <div class=\"__placeholder-icon\">\n <ax-icon class=\"fa-light fa-layout-grid\"></ax-icon>\n </div>\n <div class=\"__placeholder-content\">\n <h4 class=\"__placeholder-title\">Custom Layout</h4>\n <p class=\"__placeholder-description\">Custom report layout will be implemented here</p>\n </div>\n </div>\n }\n }\n </axp-page-content>\n\n <!-- Footer: Execute Button -->\n <axp-page-footer class=\"--animated\">\n <axp-layout-suffix>\n <ax-button [class.ax-sm]=\"layoutService.isSmall()\"\n [text]=\"t('@report-management:features.report-viewer.actions.execute') | async\" [color]=\"'primary'\"\n (onClick)=\"execute({ name: 'execute-report' })\">\n <ax-prefix>\n <ax-icon class=\"fa-light fa-play\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </axp-layout-suffix>\n </axp-page-footer>\n</axp-page-layout>", styles: [".axp-report-viewer-page{display:flex;height:100%;width:100%;flex-direction:column}.axp-report-viewer-page axp-layout-start-side{height:100%;width:20rem;border-inline-end-width:1px;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}@media (min-width: 1920px){.axp-report-viewer-page axp-layout-start-side{width:24rem}}.axp-report-viewer-page axp-layout-start-side axp-layout-content{overflow-x:auto}.axp-report-viewer-page axp-layout-start-side .__filters-container{padding:1rem}.axp-report-viewer-page .__mobile-filters{flex-shrink:0;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));padding:1rem;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-report-viewer-page axp-page-content{display:flex;height:100%;flex-direction:column}.axp-report-viewer-page .__no-report{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center}.axp-report-viewer-page .__no-report .__no-report-icon{margin-bottom:1rem;font-size:3.75rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1));opacity:.5}.axp-report-viewer-page .__no-report .__no-report-content{max-width:28rem}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-title{margin-bottom:.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:600}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-description{margin-bottom:1.5rem;font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-actions{display:flex;justify-content:center}.axp-report-viewer-page axp-report-table-view{flex:1 1 0%;overflow:hidden}.axp-report-viewer-page .__chart-placeholder,.axp-report-viewer-page .__cards-placeholder,.axp-report-viewer-page .__custom-placeholder{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;margin:1.5rem;border-radius:.5rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-report-viewer-page .__chart-placeholder .__placeholder-icon,.axp-report-viewer-page .__cards-placeholder .__placeholder-icon,.axp-report-viewer-page .__custom-placeholder .__placeholder-icon{margin-bottom:1rem;font-size:3rem;line-height:1;opacity:.5}.axp-report-viewer-page .__chart-placeholder .__placeholder-content,.axp-report-viewer-page .__cards-placeholder .__placeholder-content,.axp-report-viewer-page .__custom-placeholder .__placeholder-content{max-width:28rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-title{margin-bottom:.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-description{font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-viewer-page .__chart-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-viewer-page .__cards-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-secondary-500),var(--tw-text-opacity, 1))}.axp-report-viewer-page .__custom-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-accent1-500),var(--tw-text-opacity, 1))}@media (max-width: 768px){.axp-report-viewer-page .__chart-placeholder,.axp-report-viewer-page .__cards-placeholder,.axp-report-viewer-page .__custom-placeholder{margin:1rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-title{font-size:1rem;line-height:1.5rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-description{font-size:.75rem;line-height:1rem}}\n"] }]
1730
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'axp-report-viewer-page' }, template: "<axp-page-layout *translate=\"let t\">\n <!-- Left Panel: Filters (Always visible for desktop) -->\n @if (showFiltersPanel()) {\n <axp-layout-start-side>\n <axp-layout-header>\n <axp-layout-title>\n {{ t('@report-management:features.report-viewer.filters.title') | async }}\n </axp-layout-title>\n </axp-layout-header>\n <axp-layout-content>\n <div class=\"__filters-container\">\n <axp-dynamic-form\n #filtersForm\n [formDefinition]=\"vm.formDefinition()\"\n [context]=\"vm.filterContext()\"\n [layoutConfig]=\"defaultLayout()\"\n [layoutStyle]=\"'compact'\"\n (contextChange)=\"handleFiltersChange($event)\"\n (contextInitiated)=\"handleFiltersInitiated($event)\"\n >\n </axp-dynamic-form>\n </div>\n </axp-layout-content>\n <axp-layout-footer class=\"ax-p-4 ax-border-t\">\n <ax-button\n [class.ax-sm]=\"layoutService.isSmall()\"\n class=\"ax-w-full\"\n [text]=\"t('@report-management:features.report-viewer.actions.execute') | async\"\n [color]=\"'primary'\"\n (onClick)=\"execute({ name: 'execute-report' })\"\n >\n <ax-prefix>\n <ax-icon class=\"fa-light fa-play\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </axp-layout-footer>\n </axp-layout-start-side>\n }\n <!-- Main Content: Report Display -->\n <axp-page-content>\n @if (!vm.reportDefinition()) {\n <ng-container *ngTemplateOutlet=\"noReport\"></ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"reportDisplay\"></ng-container>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<!-- Report Display Area -->\n<ng-template #reportDisplay>\n @if (vm.isTableLayout()) {\n <axp-report-table-view (rowClick)=\"handleRowClick($event)\" (actionClick)=\"handleActionClick($event)\">\n </axp-report-table-view>\n } @else if (vm.isChartLayout()) {\n <!-- Chart View Placeholder -->\n <div class=\"__chart-placeholder\">\n <div class=\"__placeholder-icon\">\n <ax-icon class=\"fa-light fa-chart-column\"></ax-icon>\n </div>\n <div class=\"__placeholder-content\">\n <h4 class=\"__placeholder-title\">Chart View</h4>\n <p class=\"__placeholder-description\">Chart visualization will be implemented here</p>\n </div>\n </div>\n } @else {\n <!-- Custom Layout Placeholder -->\n <div class=\"__custom-placeholder\">\n <div class=\"__placeholder-icon\">\n <ax-icon class=\"fa-light fa-layout-grid\"></ax-icon>\n </div>\n <div class=\"__placeholder-content\">\n <h4 class=\"__placeholder-title\">Custom Layout</h4>\n <p class=\"__placeholder-description\">Custom report layout will be implemented here</p>\n </div>\n </div>\n }\n</ng-template>\n\n<!-- No Report Selected State -->\n<ng-template #noReport>\n <div class=\"__no-report\" *translate=\"let t\">\n <div class=\"__no-report-icon\">\n <ax-icon class=\"fa-light fa-chart-line\"></ax-icon>\n </div>\n <div class=\"__no-report-content\">\n <h3 class=\"__no-report-title\">\n {{ t('@report-management:features.report-viewer.no-report.title') | async }}\n </h3>\n <p class=\"__no-report-description\">\n {{ t('@report-management:features.report-viewer.no-report.description') | async }}\n </p>\n <div class=\"__no-report-actions\">\n <ax-button\n look=\"outline\"\n color=\"primary\"\n [text]=\"t('@report-management:features.report-viewer.no-report.browse-reports') | async\"\n >\n <ax-prefix>\n <ax-icon class=\"fa-light fa-folder-open\"></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".axp-report-viewer-page{display:flex;height:100%;width:100%;flex-direction:column}.axp-report-viewer-page axp-layout-container{overflow:hidden}.axp-report-viewer-page axp-layout-start-side{height:100%;width:20rem;border-inline-end-width:1px;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}@media (min-width: 1920px){.axp-report-viewer-page axp-layout-start-side{width:24rem}}.axp-report-viewer-page axp-layout-start-side>axp-layout-header{height:73px;border-bottom-width:1px}.axp-report-viewer-page axp-layout-start-side axp-layout-content{overflow-x:auto;padding:.5rem}.axp-report-viewer-page axp-layout-start-side axp-layout-content .__filters-container axp-layout-sections{gap:0px!important}.axp-report-viewer-page axp-layout-start-side axp-layout-content .__filters-container axp-layout-sections axp-layout-section{border-style:none!important;padding:0!important;--tw-shadow: 0 0 #0000 !important;--tw-shadow-colored: 0 0 #0000 !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.axp-report-viewer-page .__mobile-filters{flex-shrink:0;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));padding:1rem;background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-report-viewer-page axp-page-content{display:flex;height:100%;flex-direction:column}.axp-report-viewer-page .__no-report{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center}.axp-report-viewer-page .__no-report .__no-report-icon{margin-bottom:1rem;font-size:3.75rem;line-height:1;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1));opacity:.5}.axp-report-viewer-page .__no-report .__no-report-content{max-width:28rem}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-title{margin-bottom:.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:600}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-description{margin-bottom:1.5rem;font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-viewer-page .__no-report .__no-report-content .__no-report-actions{display:flex;justify-content:center}.axp-report-viewer-page axp-report-table-view{flex:1 1 0%;overflow:hidden}.axp-report-viewer-page .__chart-placeholder,.axp-report-viewer-page .__cards-placeholder,.axp-report-viewer-page .__custom-placeholder{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;margin:1.5rem;border-radius:.5rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));background-color:rgb(var(--ax-sys-color-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface));border-color:rgb(var(--ax-sys-color-border-lightest-surface))}.axp-report-viewer-page .__chart-placeholder .__placeholder-icon,.axp-report-viewer-page .__cards-placeholder .__placeholder-icon,.axp-report-viewer-page .__custom-placeholder .__placeholder-icon{margin-bottom:1rem;font-size:3rem;line-height:1;opacity:.5}.axp-report-viewer-page .__chart-placeholder .__placeholder-content,.axp-report-viewer-page .__cards-placeholder .__placeholder-content,.axp-report-viewer-page .__custom-placeholder .__placeholder-content{max-width:28rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-title{margin-bottom:.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-description{font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-viewer-page .__chart-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-viewer-page .__cards-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-secondary-500),var(--tw-text-opacity, 1))}.axp-report-viewer-page .__custom-placeholder .__placeholder-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-accent1-500),var(--tw-text-opacity, 1))}@media (max-width: 768px){.axp-report-viewer-page .__chart-placeholder,.axp-report-viewer-page .__cards-placeholder,.axp-report-viewer-page .__custom-placeholder{margin:1rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-title,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-title{font-size:1rem;line-height:1.5rem}.axp-report-viewer-page .__chart-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__cards-placeholder .__placeholder-content .__placeholder-description,.axp-report-viewer-page .__custom-placeholder .__placeholder-content .__placeholder-description{font-size:.75rem;line-height:1rem}}\n"] }]
1785
1731
  }] });
1786
1732
 
1787
1733
  var reportViewerPage_component = /*#__PURE__*/Object.freeze({
@@ -1793,5 +1739,5 @@ var reportViewerPage_component = /*#__PURE__*/Object.freeze({
1793
1739
  * Generated bundle index. Do not edit.
1794
1740
  */
1795
1741
 
1796
- export { AXMReportExecuteCommand, AXMReportManagementModule, AXPReportTableViewComponent, AXPReportViewerPageComponent, AXPReportViewerViewModel, RootConfig };
1742
+ export { AXMReportManagementModule, AXPReportTableViewComponent, AXPReportViewerPageComponent, AXPReportViewerViewModel, RootConfig };
1797
1743
  //# sourceMappingURL=acorex-modules-report-management.mjs.map