@acorex/modules 20.0.5 → 20.0.6

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 (66) hide show
  1. package/conversation/index.d.ts +157 -217
  2. package/fesm2022/{acorex-modules-application-management-module-designer.component-CvFiEI1a.mjs → acorex-modules-application-management-module-designer.component-oGgCaUDu.mjs} +2 -2
  3. package/fesm2022/{acorex-modules-application-management-module-designer.component-CvFiEI1a.mjs.map → acorex-modules-application-management-module-designer.component-oGgCaUDu.mjs.map} +1 -1
  4. package/fesm2022/acorex-modules-application-management.mjs +1 -1
  5. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-B10cRw3M.mjs → acorex-modules-auth-acorex-modules-auth-Cj4td3eM.mjs} +9 -9
  6. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-B10cRw3M.mjs.map → acorex-modules-auth-acorex-modules-auth-Cj4td3eM.mjs.map} +1 -1
  7. package/fesm2022/{acorex-modules-auth-app-chooser.component-C-HPf2jz.mjs → acorex-modules-auth-app-chooser.component-C60idNYx.mjs} +2 -2
  8. package/fesm2022/{acorex-modules-auth-app-chooser.component-C-HPf2jz.mjs.map → acorex-modules-auth-app-chooser.component-C60idNYx.mjs.map} +1 -1
  9. package/fesm2022/{acorex-modules-auth-login.module-eC1_ukrb.mjs → acorex-modules-auth-login.module-siRdi16m.mjs} +4 -4
  10. package/fesm2022/{acorex-modules-auth-login.module-eC1_ukrb.mjs.map → acorex-modules-auth-login.module-siRdi16m.mjs.map} +1 -1
  11. package/fesm2022/{acorex-modules-auth-master.layout-DpfqRgAl.mjs → acorex-modules-auth-master.layout-BJCAe5Ai.mjs} +2 -2
  12. package/fesm2022/{acorex-modules-auth-master.layout-DpfqRgAl.mjs.map → acorex-modules-auth-master.layout-BJCAe5Ai.mjs.map} +1 -1
  13. package/fesm2022/{acorex-modules-auth-password.component-DAB9dWB8.mjs → acorex-modules-auth-password.component-6-EEsfc2.mjs} +2 -2
  14. package/fesm2022/{acorex-modules-auth-password.component-DAB9dWB8.mjs.map → acorex-modules-auth-password.component-6-EEsfc2.mjs.map} +1 -1
  15. package/fesm2022/{acorex-modules-auth-password.component-rE9yrcGW.mjs → acorex-modules-auth-password.component-VhDUmkMc.mjs} +3 -3
  16. package/fesm2022/acorex-modules-auth-password.component-VhDUmkMc.mjs.map +1 -0
  17. package/fesm2022/{acorex-modules-auth-routes-EGvejNu9.mjs → acorex-modules-auth-routes-BwBn4o81.mjs} +2 -2
  18. package/fesm2022/{acorex-modules-auth-routes-EGvejNu9.mjs.map → acorex-modules-auth-routes-BwBn4o81.mjs.map} +1 -1
  19. package/fesm2022/{acorex-modules-auth-two-factor.module-DF3_fgzH.mjs → acorex-modules-auth-two-factor.module-D7NgZHmC.mjs} +2 -2
  20. package/fesm2022/{acorex-modules-auth-two-factor.module-DF3_fgzH.mjs.map → acorex-modules-auth-two-factor.module-D7NgZHmC.mjs.map} +1 -1
  21. package/fesm2022/{acorex-modules-auth-user-sessions.component-BPb-WS4k.mjs → acorex-modules-auth-user-sessions.component-DhlBCxly.mjs} +2 -2
  22. package/fesm2022/{acorex-modules-auth-user-sessions.component-BPb-WS4k.mjs.map → acorex-modules-auth-user-sessions.component-DhlBCxly.mjs.map} +1 -1
  23. package/fesm2022/acorex-modules-auth.mjs +1 -1
  24. package/fesm2022/acorex-modules-conversation.mjs +1762 -1568
  25. package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
  26. package/fesm2022/acorex-modules-dashboard-management.mjs +9 -9
  27. package/fesm2022/acorex-modules-dashboard-management.mjs.map +1 -1
  28. package/fesm2022/acorex-modules-notification-management.mjs +3 -3
  29. package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
  30. package/fesm2022/acorex-modules-organization-management-role.entity-BDErzNv-.mjs.map +1 -1
  31. package/fesm2022/{acorex-modules-platform-management-acorex-modules-platform-management-DqpAYmHM.mjs → acorex-modules-platform-management-acorex-modules-platform-management-Dfux0tkB.mjs} +6 -6
  32. package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-Dfux0tkB.mjs.map +1 -0
  33. package/fesm2022/{acorex-modules-platform-management-list-version.component-DidjxkmH.mjs → acorex-modules-platform-management-list-version.component-CSNKxghv.mjs} +2 -2
  34. package/fesm2022/{acorex-modules-platform-management-list-version.component-DidjxkmH.mjs.map → acorex-modules-platform-management-list-version.component-CSNKxghv.mjs.map} +1 -1
  35. package/fesm2022/{acorex-modules-platform-management-settings.provider-DcHKHrSK.mjs → acorex-modules-platform-management-settings.provider-C4RaOgkr.mjs} +35 -25
  36. package/fesm2022/acorex-modules-platform-management-settings.provider-C4RaOgkr.mjs.map +1 -0
  37. package/fesm2022/acorex-modules-platform-management.mjs +1 -1
  38. package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-CtEDcg_B.mjs +589 -0
  39. package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-CtEDcg_B.mjs.map +1 -0
  40. package/fesm2022/acorex-modules-report-management.mjs +208 -0
  41. package/fesm2022/acorex-modules-report-management.mjs.map +1 -0
  42. package/fesm2022/acorex-modules-security-management.mjs +582 -72
  43. package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
  44. package/fesm2022/{acorex-modules-workflow-management-task-board.page-R4x5Rq-D.mjs → acorex-modules-workflow-management-task-board.page-Bugxqd0W.mjs} +2 -2
  45. package/fesm2022/acorex-modules-workflow-management-task-board.page-Bugxqd0W.mjs.map +1 -0
  46. package/fesm2022/acorex-modules-workflow-management.mjs +1 -1
  47. package/package.json +5 -1
  48. package/report-management/README.md +356 -0
  49. package/report-management/index.d.ts +39 -0
  50. package/security-management/index.d.ts +162 -2
  51. package/fesm2022/acorex-modules-auth-password.component-rE9yrcGW.mjs.map +0 -1
  52. package/fesm2022/acorex-modules-platform-management-acorex-modules-platform-management-DqpAYmHM.mjs.map +0 -1
  53. package/fesm2022/acorex-modules-platform-management-settings.provider-DcHKHrSK.mjs.map +0 -1
  54. package/fesm2022/acorex-modules-security-management-permissions-editor.component-B4TdyHtv.mjs +0 -218
  55. package/fesm2022/acorex-modules-security-management-permissions-editor.component-B4TdyHtv.mjs.map +0 -1
  56. package/fesm2022/acorex-modules-security-management-permissions-widget-column.component-DTMj6gxb.mjs +0 -41
  57. package/fesm2022/acorex-modules-security-management-permissions-widget-column.component-DTMj6gxb.mjs.map +0 -1
  58. package/fesm2022/acorex-modules-security-management-permissions-widget-designer.component-BJdbKpRQ.mjs +0 -20
  59. package/fesm2022/acorex-modules-security-management-permissions-widget-designer.component-BJdbKpRQ.mjs.map +0 -1
  60. package/fesm2022/acorex-modules-security-management-permissions-widget-edit.component-GTmDlgWW.mjs +0 -51
  61. package/fesm2022/acorex-modules-security-management-permissions-widget-edit.component-GTmDlgWW.mjs.map +0 -1
  62. package/fesm2022/acorex-modules-security-management-permissions-widget-print.component-BZ75aI18.mjs +0 -21
  63. package/fesm2022/acorex-modules-security-management-permissions-widget-print.component-BZ75aI18.mjs.map +0 -1
  64. package/fesm2022/acorex-modules-security-management-permissions-widget-view.component-CYQqerAX.mjs +0 -20
  65. package/fesm2022/acorex-modules-security-management-permissions-widget-view.component-CYQqerAX.mjs.map +0 -1
  66. package/fesm2022/acorex-modules-workflow-management-task-board.page-R4x5Rq-D.mjs.map +0 -1
@@ -0,0 +1,589 @@
1
+ import { AXBadgeModule } from '@acorex/components/badge';
2
+ import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
3
+ import * as i6 from '@acorex/components/button';
4
+ import { AXButtonModule } from '@acorex/components/button';
5
+ import * as i4 from '@acorex/components/decorators';
6
+ import { AXDecoratorModule } from '@acorex/components/decorators';
7
+ import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
8
+ import * as i7 from '@acorex/components/loading';
9
+ import { AXLoadingModule } from '@acorex/components/loading';
10
+ import * as i3 from '@acorex/components/search-box';
11
+ import { AXSearchBoxModule } from '@acorex/components/search-box';
12
+ import { AXTabsModule } from '@acorex/components/tabs';
13
+ import * as i5 from '@acorex/core/translation';
14
+ import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
15
+ import { AXUnsubscriber } from '@acorex/core/utils';
16
+ import { AXPReportDefinitionService } from '@acorex/platform/common';
17
+ import { AXPDynamicFormComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutToolbarComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutStartSideComponent } from '@acorex/platform/layout/components';
18
+ import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPageLayoutBase } from '@acorex/platform/layout/views';
19
+ import { AXPLayoutThemeService } from '@acorex/platform/themes/shared';
20
+ import * as i1 from '@angular/common';
21
+ import { CommonModule } from '@angular/common';
22
+ import * as i0 from '@angular/core';
23
+ import { computed, inject, output, ViewEncapsulation, ChangeDetectionStrategy, Component, viewChild } from '@angular/core';
24
+ import * as i2$1 from '@angular/forms';
25
+ import { FormsModule } from '@angular/forms';
26
+ import { ActivatedRoute, Router, NavigationEnd, RouterModule } from '@angular/router';
27
+ import { merge, filter, startWith, firstValueFrom } from 'rxjs';
28
+ import { AXPPageStatus } from '@acorex/platform/layout/builder';
29
+ import { signalStore, withState, withComputed, withMethods, patchState, withHooks } from '@ngrx/signals';
30
+ import { isNil, isEmpty } from 'lodash-es';
31
+ import { AXLocaleService } from '@acorex/core/locale';
32
+ import { RootConfig } from './acorex-modules-report-management.mjs';
33
+ import * as i2 from '@acorex/components/tree-view';
34
+ import { AXTreeViewModule } from '@acorex/components/tree-view';
35
+
36
+ const AXPReportRunnerRootViewModel = signalStore(withState(() => ({
37
+ activeCategory: undefined,
38
+ categories: [],
39
+ activeReport: undefined,
40
+ reports: [],
41
+ activeCategoriesPath: [],
42
+ //
43
+ searchExpression: null,
44
+ //
45
+ previousContext: {},
46
+ context: {},
47
+ //
48
+ status: AXPPageStatus.Processing,
49
+ form: null,
50
+ })), withComputed((store, layout = inject(AXPLayoutThemeService)) => ({
51
+ searchResults: computed(() => []),
52
+ hasActiveReport: computed(() => store.activeReport() != null),
53
+ hasActiveCategory: computed(() => store.activeCategory() != null),
54
+ showSideMenu: computed(() => layout.isLarge()),
55
+ isSearching: computed(() => store.searchExpression() != null),
56
+ isBusy: computed(() => store.status() == AXPPageStatus.Processing),
57
+ isRunning: computed(() => store.status() == AXPPageStatus.Submitting),
58
+ isLoaded: computed(() => store.activeCategory() != null),
59
+ title: computed(() => store.activeReport() ?
60
+ store.activeReport()?.title :
61
+ store.activeCategory()?.title ?? `@${RootConfig.config.i18n}:features.report-runner.page-title`),
62
+ description: computed(() => store.activeReport() ?
63
+ store.activeReport()?.description :
64
+ store.activeCategory()?.description ?? `@${RootConfig.config.i18n}:features.report-runner.page-description`),
65
+ formDefinition: computed(() => {
66
+ const report = store.activeReport();
67
+ if (!report || !report.parameterGroups) {
68
+ return { groups: [] };
69
+ }
70
+ return {
71
+ groups: report.parameterGroups.map(group => ({
72
+ name: group.name,
73
+ title: group.title,
74
+ description: group.description,
75
+ parameters: group.parameters.map(param => ({
76
+ path: param.path,
77
+ title: param.title,
78
+ description: param.description,
79
+ widget: param.widget
80
+ }))
81
+ }))
82
+ };
83
+ }),
84
+ })), withMethods((store, reportDefinitionService = inject(AXPReportDefinitionService)) => ({
85
+ async loadRootCategories() {
86
+ patchState(store, {
87
+ activeCategory: undefined,
88
+ activeReport: undefined,
89
+ reports: [],
90
+ activeCategoriesPath: [],
91
+ });
92
+ //
93
+ patchState(store, {
94
+ status: AXPPageStatus.Processing,
95
+ });
96
+ patchState(store, {
97
+ categories: await reportDefinitionService.getCategories(),
98
+ });
99
+ patchState(store, {
100
+ status: AXPPageStatus.Idle,
101
+ });
102
+ },
103
+ async getCategories(parentId) {
104
+ patchState(store, {
105
+ status: AXPPageStatus.Processing,
106
+ });
107
+ //
108
+ const result = await reportDefinitionService.getCategories(parentId);
109
+ //
110
+ patchState(store, {
111
+ status: AXPPageStatus.Idle,
112
+ });
113
+ //
114
+ return result;
115
+ },
116
+ async getReports(categoryId) {
117
+ patchState(store, {
118
+ status: AXPPageStatus.Processing,
119
+ });
120
+ //
121
+ const result = await reportDefinitionService.getReportsByCategoryId(categoryId);
122
+ //
123
+ patchState(store, {
124
+ status: AXPPageStatus.Idle,
125
+ });
126
+ //
127
+ return result;
128
+ },
129
+ registerForm(form) {
130
+ patchState(store, {
131
+ form: form,
132
+ });
133
+ },
134
+ updateContext(context) {
135
+ patchState(store, {
136
+ context: { ...store.context(), ...context },
137
+ });
138
+ },
139
+ updatePreviousContext(context) {
140
+ patchState(store, {
141
+ previousContext: { ...store.previousContext(), ...context },
142
+ });
143
+ },
144
+ async setActiveCategory(category) {
145
+ //
146
+ patchState(store, {
147
+ status: AXPPageStatus.Processing,
148
+ });
149
+ //
150
+ patchState(store, {
151
+ activeCategory: category,
152
+ });
153
+ //
154
+ patchState(store, {
155
+ categories: await reportDefinitionService.getCategories(category.id),
156
+ reports: await reportDefinitionService.getReportsByCategoryId(category.id),
157
+ activeCategoriesPath: await reportDefinitionService.getCategoriesPathById(category.id),
158
+ });
159
+ //
160
+ patchState(store, {
161
+ status: AXPPageStatus.Idle,
162
+ });
163
+ },
164
+ async setActiveCategoryById(id) {
165
+ //
166
+ patchState(store, {
167
+ status: AXPPageStatus.Processing,
168
+ });
169
+ //
170
+ const category = await reportDefinitionService.getCategoryById(id);
171
+ if (category) {
172
+ patchState(store, {
173
+ activeCategory: category,
174
+ });
175
+ //
176
+ patchState(store, {
177
+ categories: await reportDefinitionService.getCategories(category.id),
178
+ reports: await reportDefinitionService.getReportsByCategoryId(category.id),
179
+ activeCategoriesPath: await reportDefinitionService.getCategoriesPathById(category.id),
180
+ });
181
+ }
182
+ //
183
+ patchState(store, {
184
+ status: AXPPageStatus.Idle,
185
+ });
186
+ },
187
+ unsetActiveReport() {
188
+ patchState(store, {
189
+ activeReport: undefined,
190
+ });
191
+ },
192
+ async setActivateReportById(id) {
193
+ const report = await reportDefinitionService.getReportById(id);
194
+ if (report) {
195
+ report?.parameterGroups.forEach(group => {
196
+ group.parameters.forEach(param => {
197
+ param.widget.path = param.path;
198
+ });
199
+ });
200
+ patchState(store, {
201
+ activeReport: report,
202
+ });
203
+ }
204
+ },
205
+ //
206
+ async search(expression) {
207
+ if (!isNil(expression) && !isEmpty(expression)) {
208
+ patchState(store, {
209
+ searchExpression: expression,
210
+ });
211
+ }
212
+ else {
213
+ patchState(store, {
214
+ searchExpression: null,
215
+ });
216
+ }
217
+ },
218
+ clearSearch() {
219
+ patchState(store, {
220
+ searchExpression: null,
221
+ });
222
+ },
223
+ async run() {
224
+ patchState(store, {
225
+ status: AXPPageStatus.Submitting,
226
+ });
227
+ //
228
+ console.log('run', store.context());
229
+ await new Promise(resolve => setTimeout(resolve, 1000));
230
+ //
231
+ patchState(store, {
232
+ status: AXPPageStatus.Idle,
233
+ });
234
+ //
235
+ return true;
236
+ },
237
+ async discard() {
238
+ const form = store.form();
239
+ form.resetErrors();
240
+ //
241
+ patchState(store, {
242
+ status: AXPPageStatus.Idle,
243
+ });
244
+ patchState(store, {
245
+ context: store.previousContext(),
246
+ });
247
+ },
248
+ async resetToDefault() {
249
+ },
250
+ })), withHooks((store, translationService = inject(AXTranslationService), localeService = inject(AXLocaleService)) => ({
251
+ async onInit() {
252
+ merge(translationService.langChanges$, localeService.profileChanged$).subscribe(async () => {
253
+ });
254
+ //
255
+ await store.loadRootCategories();
256
+ },
257
+ onDestroy() { },
258
+ })));
259
+
260
+ //#region ---- Imports ----
261
+ //#endregion
262
+ class AXPReportCategoriesTreeComponent {
263
+ constructor() {
264
+ //#region ---- Services & Dependencies ----
265
+ this.reportDefinitionService = inject(AXPReportDefinitionService);
266
+ //#endregion
267
+ //#region ---- Output Events ----
268
+ /**
269
+ * Emitted when a category node is clicked
270
+ */
271
+ this.categoryClick = output();
272
+ /**
273
+ * Emitted when a report node is clicked
274
+ */
275
+ this.reportClick = output();
276
+ //#endregion
277
+ //#region ---- Data Loading Methods ----
278
+ /**
279
+ * Provide lazy loading tree data
280
+ */
281
+ this.provideLazyTreeView = async (selectedItemId) => {
282
+ if (selectedItemId) {
283
+ const categories = (await this.reportDefinitionService.getCategories(selectedItemId)).map((item) => ({
284
+ id: item.id,
285
+ title: item.title,
286
+ hasChild: (item.hasChild || item.hasReport) ?? false,
287
+ item: item,
288
+ type: 'category',
289
+ expanded: isNil(item.parentId) ? true : false,
290
+ }));
291
+ const definitions = (await this.reportDefinitionService.getReportsByCategoryId(selectedItemId)).map((item) => ({
292
+ id: item.id,
293
+ title: item.title,
294
+ hasChild: false,
295
+ item: item,
296
+ type: 'definition',
297
+ expanded: false,
298
+ }));
299
+ return [...categories, ...definitions];
300
+ }
301
+ else {
302
+ const categories = await this.reportDefinitionService.getCategories();
303
+ const items = categories.map((item) => ({
304
+ id: item.id,
305
+ title: item.title,
306
+ hasChild: (item.hasChild || item.hasReport) ?? false,
307
+ item: item,
308
+ type: 'category',
309
+ expanded: false,
310
+ }));
311
+ return items;
312
+ }
313
+ };
314
+ }
315
+ //#endregion
316
+ //#region ---- Event Handlers ----
317
+ /**
318
+ * Handle tree node click events
319
+ */
320
+ async handleNodeClick(event) {
321
+ const node = event.data;
322
+ if (node.type === 'category') {
323
+ this.categoryClick.emit(node.item);
324
+ }
325
+ else if (node.type === 'definition') {
326
+ this.reportClick.emit(node.item);
327
+ }
328
+ }
329
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AXPReportCategoriesTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
330
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: AXPReportCategoriesTreeComponent, isStandalone: true, selector: "axp-report-categories-tree", outputs: { categoryClick: "categoryClick", reportClick: "reportClick" }, host: { classAttribute: "axp-report-categories-tree" }, ngImport: i0, template: "<ax-tree-view\n [showCheckbox]=\"false\"\n [itemTemplate]=\"itemTemplate\"\n [textField]=\"'title'\"\n [hasChildField]=\"'hasChild'\"\n [valueField]=\"'id'\"\n [expandedField]=\"'expanded'\"\n [items]=\"provideLazyTreeView\"\n (onNodeClick)=\"handleNodeClick($event)\"\n>\n</ax-tree-view>\n\n<ng-template #itemTemplate let-item>\n @if (item.type === 'category') {\n <ax-icon class=\"fas ax-text-warning fa-folder\"></ax-icon>\n } @else {\n <ax-icon class=\"fas ax-text-accent1 fa-file-chart-column\"></ax-icon>\n }\n {{ item.title }}\n</ng-template>\n", styles: [".axp-report-categories-tree{height:100%;width:100%}.axp-report-categories-tree .__tree-view .__item{display:flex;align-items:center;gap:.5rem}.axp-report-categories-tree .__tree-view .__item .__icon{flex-shrink:0}.axp-report-categories-tree .__tree-view .__item .__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.axp-report-categories-tree .__tree-view .__item:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTreeViewModule }, { kind: "component", type: i2.AXTreeViewComponent, selector: "ax-tree-view", inputs: ["items", "showCheckbox", "hasCheckboxField", "selectionMode", "selectionBehavior", "selectionScope", "focusNodeEnabled", "valueField", "textField", "visibleField", "disableField", "hasChildField", "selectedField", "expandedField", "tooltipField", "childrenField", "activeField", "indeterminateField", "parentField", "iconField", "toggleIcons", "look", "showEmptyNodeMassage", "itemTemplate", "emptyTemplate", "expandOn"], outputs: ["onSelectionChanged", "onItemSelectedChanged", "onNodeClick", "onCollapsedChanged", "onNodedbClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
331
+ }
332
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AXPReportCategoriesTreeComponent, decorators: [{
333
+ type: Component,
334
+ args: [{ selector: 'axp-report-categories-tree', standalone: true, imports: [
335
+ CommonModule,
336
+ AXDecoratorModule,
337
+ AXTreeViewModule,
338
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'axp-report-categories-tree' }, template: "<ax-tree-view\n [showCheckbox]=\"false\"\n [itemTemplate]=\"itemTemplate\"\n [textField]=\"'title'\"\n [hasChildField]=\"'hasChild'\"\n [valueField]=\"'id'\"\n [expandedField]=\"'expanded'\"\n [items]=\"provideLazyTreeView\"\n (onNodeClick)=\"handleNodeClick($event)\"\n>\n</ax-tree-view>\n\n<ng-template #itemTemplate let-item>\n @if (item.type === 'category') {\n <ax-icon class=\"fas ax-text-warning fa-folder\"></ax-icon>\n } @else {\n <ax-icon class=\"fas ax-text-accent1 fa-file-chart-column\"></ax-icon>\n }\n {{ item.title }}\n</ng-template>\n", styles: [".axp-report-categories-tree{height:100%;width:100%}.axp-report-categories-tree .__tree-view .__item{display:flex;align-items:center;gap:.5rem}.axp-report-categories-tree .__tree-view .__item .__icon{flex-shrink:0}.axp-report-categories-tree .__tree-view .__item .__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.axp-report-categories-tree .__tree-view .__item:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}\n"] }]
339
+ }] });
340
+
341
+ class AXMReportRunnerRootPageComponent extends AXPPageLayoutBaseComponent {
342
+ constructor() {
343
+ super(...arguments);
344
+ this.vm = inject(AXPReportRunnerRootViewModel);
345
+ this.layoutService = inject(AXPLayoutThemeService);
346
+ this.activatedRoute = inject(ActivatedRoute);
347
+ this.unsubscribe = inject(AXUnsubscriber);
348
+ this.reportDefinitionService = inject(AXPReportDefinitionService);
349
+ this.dynamicForm = viewChild(AXPDynamicFormComponent);
350
+ this.router = inject(Router);
351
+ this.baseRoutes = [this.sessionService.application?.name, 'report-management', 'reports'];
352
+ this.defaultLayout = computed(() => {
353
+ return {
354
+ positions: {
355
+ default: { colSpan: 12 },
356
+ md: { colSpan: 8 },
357
+ lg: { colSpan: 6 },
358
+ xl: { colSpan: this.layoutService.isSideMenuOpen() ? 5 : 4 },
359
+ xxl: { colSpan: 4 },
360
+ },
361
+ };
362
+ });
363
+ }
364
+ async ngOnInit() {
365
+ await super.ngOnInit();
366
+ //
367
+ this.router.events
368
+ .pipe(this.unsubscribe.takeUntilDestroy, filter((event) => event instanceof NavigationEnd), startWith(null))
369
+ .subscribe(async () => {
370
+ await this.loadFromRoute();
371
+ });
372
+ }
373
+ ngAfterViewInit() {
374
+ // Register the form from the dynamic form component when available
375
+ const form = this.dynamicForm()?.getForm();
376
+ if (form) {
377
+ this.vm.registerForm(form);
378
+ }
379
+ }
380
+ handleContextChanged(context) {
381
+ this.vm.updateContext(context);
382
+ }
383
+ handleContextInitiated(context) {
384
+ this.vm.updatePreviousContext(context);
385
+ }
386
+ async loadFromRoute() {
387
+ const snapshot = this.activatedRoute.snapshot;
388
+ const segments = await firstValueFrom(this.activatedRoute.url);
389
+ let categoryId = segments[segments.length - 1]?.path ?? null;
390
+ if (categoryId) {
391
+ await this.vm.setActiveCategoryById(categoryId);
392
+ }
393
+ else {
394
+ await this.vm.loadRootCategories();
395
+ return;
396
+ }
397
+ //
398
+ let reportId = snapshot.queryParamMap.get('report') ?? null;
399
+ if (reportId) {
400
+ await this.vm.setActivateReportById(reportId);
401
+ }
402
+ else {
403
+ await this.vm.unsetActiveReport();
404
+ }
405
+ }
406
+ //#region ---- Event Handlers ----
407
+ /**
408
+ * Handle category selection from tree
409
+ */
410
+ async onCategoryClick(category) {
411
+ await this.navigateToCategory(category);
412
+ }
413
+ /**
414
+ * Handle report selection from tree
415
+ */
416
+ async onReportClick(report) {
417
+ await this.navigateToReport(report);
418
+ }
419
+ //#endregion
420
+ async navigateToCategory(category) {
421
+ // Find the path to this category
422
+ const path = await this.reportDefinitionService.getCategoriesPathById(category.id);
423
+ // Find the index of the target category in the path
424
+ let urlParts = [...this.baseRoutes];
425
+ for (const cat of path) {
426
+ urlParts.push(cat.id);
427
+ }
428
+ await this.router.navigate(urlParts);
429
+ }
430
+ async navigateToReport(report) {
431
+ // Use the current category path for the URL
432
+ const path = await this.reportDefinitionService.getCategoriesPathByReportId(report.id);
433
+ let urlParts = [...this.baseRoutes];
434
+ for (const cat of path) {
435
+ urlParts.push(cat.id);
436
+ }
437
+ await this.router.navigate(urlParts, { queryParams: { report: report.id } });
438
+ }
439
+ //#region ---------------- Page Configuration Overrides ----------------
440
+ async getPageBreadcrumbs() {
441
+ const path = this.vm.activeCategoriesPath();
442
+ const report = {
443
+ name: 'reports',
444
+ title: await this.translateService.translateAsync('@report-management:features.report-runner.menu-title'),
445
+ command: {
446
+ name: 'navigate-to-reports-root',
447
+ },
448
+ };
449
+ if (!path || path.length === 0) {
450
+ return [report];
451
+ }
452
+ const breadcrumbs = [report];
453
+ let urlParts = [...this.baseRoutes];
454
+ for (const cat of path) {
455
+ urlParts = [...urlParts, cat.id];
456
+ breadcrumbs.push({
457
+ name: cat.id,
458
+ title: cat.title,
459
+ command: {
460
+ name: 'navigate-to-category',
461
+ options: {
462
+ category: cat,
463
+ },
464
+ },
465
+ });
466
+ }
467
+ return breadcrumbs;
468
+ }
469
+ async getSecondaryMenuItems() {
470
+ if (this.vm.activeCategory()) {
471
+ return [
472
+ {
473
+ title: await this.translateService.translateAsync('actions.restore-defaults.title', { scope: 'settings' }),
474
+ icon: 'fa-light fa-rotate-left',
475
+ color: 'danger',
476
+ command: {
477
+ name: 'restore-defaults',
478
+ },
479
+ },
480
+ ];
481
+ }
482
+ return [];
483
+ }
484
+ async getPageTitle() {
485
+ return this.vm.title();
486
+ }
487
+ async getPageDescription() {
488
+ return this.vm.description();
489
+ }
490
+ async getBackButton() {
491
+ const categoriesPath = this.vm.activeCategoriesPath();
492
+ if (!categoriesPath || categoriesPath.length === 0) {
493
+ // At root level, no back button
494
+ return null;
495
+ }
496
+ if (categoriesPath.length === 1) {
497
+ // At first level category, back to reports root
498
+ return {
499
+ title: await this.translateService.translateAsync('@report-management:features.report-runner.menu-title'),
500
+ };
501
+ }
502
+ // At deeper level, back to parent category
503
+ const parentCategory = categoriesPath[categoriesPath.length - 2];
504
+ return {
505
+ title: parentCategory.title,
506
+ };
507
+ }
508
+ async onBackButtonClick() {
509
+ const categoriesPath = this.vm.activeCategoriesPath();
510
+ if (!categoriesPath || categoriesPath.length <= 1) {
511
+ // Navigate back to reports root
512
+ await this.router.navigate([...this.baseRoutes]);
513
+ }
514
+ else {
515
+ // Navigate to parent category
516
+ const parentCategoriesPath = categoriesPath.slice(0, -1);
517
+ let urlParts = [...this.baseRoutes];
518
+ for (const cat of parentCategoriesPath) {
519
+ urlParts.push(cat.id);
520
+ }
521
+ await this.router.navigate(urlParts);
522
+ }
523
+ }
524
+ async execute(command) {
525
+ switch (command.name) {
526
+ case 'restore-defaults':
527
+ await this.vm.resetToDefault();
528
+ break;
529
+ case 'navigate-to-category':
530
+ await this.navigateToCategory(command.options?.['category']);
531
+ break;
532
+ case 'navigate-to-reports-root':
533
+ await this.router.navigate([...this.baseRoutes]);
534
+ break;
535
+ }
536
+ }
537
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AXMReportRunnerRootPageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
538
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.4", type: AXMReportRunnerRootPageComponent, isStandalone: true, selector: "ng-component", host: { classAttribute: "axp-report-runner-root-page" }, providers: [
539
+ AXUnsubscriber,
540
+ AXPReportRunnerRootViewModel,
541
+ {
542
+ provide: AXPPageLayoutBase,
543
+ useExisting: AXMReportRunnerRootPageComponent,
544
+ },
545
+ ], viewQueries: [{ propertyName: "dynamicForm", first: true, predicate: AXPDynamicFormComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n @if (vm.showSideMenu()) {\n <axp-layout-start-side>\n <axp-layout-header>\n <axp-layout-title>{{ t('@report-management:features.report-runner.menu-title') | async }}</axp-layout-title>\n <axp-layout-toolbar>\n <ax-search-box\n [delayTime]=\"300\"\n [ngModel]=\"vm.searchExpression()\"\n (onValueChanged)=\"vm.search($event.value)\"\n [placeholder]=\"t('search.placeholder') | async\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </axp-layout-toolbar>\n </axp-layout-header>\n <axp-layout-content>\n <axp-report-categories-tree (categoryClick)=\"onCategoryClick($event)\" (reportClick)=\"onReportClick($event)\" />\n </axp-layout-content>\n </axp-layout-start-side>\n }\n\n <axp-page-content>\n @if (vm.showSideMenu()) {\n <!-- Desktop: Show parameters view when report is selected, or grid browser when no report -->\n @if (vm.hasActiveReport()) {\n <div class=\"__parameters-view\">\n <axp-dynamic-form\n [formDefinition]=\"vm.formDefinition()\"\n [context]=\"vm.context()\"\n [layoutConfig]=\"defaultLayout()\"\n (contextChange)=\"handleContextChanged($event)\"\n (contextInitiated)=\"handleContextInitiated($event)\"\n >\n </axp-dynamic-form>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"browser\"> </ng-container>\n }\n } @else {\n <!-- Mobile: Show parameters view when report is selected, or mobile browser for navigation -->\n @if (vm.hasActiveReport()) {\n <div class=\"__parameters-view\">\n <axp-dynamic-form\n [formDefinition]=\"vm.formDefinition()\"\n [context]=\"vm.context()\"\n [layoutConfig]=\"defaultLayout()\"\n (contextChange)=\"handleContextChanged($event)\"\n (contextInitiated)=\"handleContextInitiated($event)\"\n >\n </axp-dynamic-form>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"browser\"> </ng-container>\n }\n }\n </axp-page-content>\n\n <!-- Desktop: Grid-based browser for main content when no report selected -->\n <ng-template #browser>\n <div class=\"__reports-browser __desktop\">\n @if (vm.categories().length > 0) {\n <div class=\"__section\">\n <h3 class=\"__section-title\">Categories</h3>\n <div class=\"__items-grid\">\n @for (category of vm.categories(); track category.id) {\n <div class=\"__item __category\" (click)=\"navigateToCategory(category)\">\n <div class=\"__item-icon\">\n <ax-icon class=\"fa-solid fa-folder\"></ax-icon>\n </div>\n <div class=\"__item-content\">\n <div class=\"__item-title\">{{ category.title }}</div>\n @if (category.description) {\n <div class=\"__item-description\">{{ category.description }}</div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n @if (vm.reports().length > 0) {\n <div class=\"__section\">\n <h3 class=\"__section-title\">Reports</h3>\n <div class=\"__items-grid\">\n @for (report of vm.reports(); track report.id) {\n <div class=\"__item __report\" (click)=\"navigateToReport(report)\">\n <div class=\"__item-icon\">\n <ax-icon class=\"fa-solid fa-file-chart-column\"></ax-icon>\n </div>\n <div class=\"__item-content\">\n <div class=\"__item-title\">{{ report.title }}</div>\n @if (report.description) {\n <div class=\"__item-description\">{{ report.description }}</div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n @if (vm.categories().length === 0 && vm.reports().length === 0) {\n <div class=\"__empty-state\">\n <div class=\"__empty-icon\">\n <ax-icon class=\"fa-light fa-folder-open\"></ax-icon>\n </div>\n <div class=\"__empty-content\">\n <h4>No items found</h4>\n <p>There are no categories or reports available in this location.</p>\n </div>\n </div>\n }\n </div>\n </ng-template>\n\n @if (vm.hasActiveReport()) {\n <axp-page-footer class=\"--animated\">\n <axp-layout-suffix>\n <ax-button\n [class.ax-sm]=\"layoutService.isSmall()\"\n [disabled]=\"vm.isBusy() || vm.isRunning()\"\n [text]=\"t('run') | async\"\n (onClick)=\"vm.run()\"\n [color]=\"'secondary'\"\n >\n @if (vm.isRunning()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </axp-layout-suffix>\n </axp-page-footer>\n }\n</axp-page-layout>\n", styles: [".axp-report-runner-root-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-runner-root-page axp-layout-start-side{width:24rem}}.axp-report-runner-root-page axp-layout-start-side axp-layout-content{overflow-x:auto;padding-left:1rem;padding-right:1rem}.axp-report-runner-root-page .__reports-browser>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.axp-report-runner-root-page .__reports-browser{padding:1.5rem}.axp-report-runner-root-page .__reports-browser.__mobile>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.axp-report-runner-root-page .__reports-browser.__mobile{padding:1rem}.axp-report-runner-root-page .__reports-browser .__section>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.axp-report-runner-root-page .__reports-browser .__section .__section-title{display:flex;align-items:center;gap:.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600}.axp-report-runner-root-page .__reports-browser .__section .__section-title ax-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-runner-root-page .__reports-browser .__section .__items-grid{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));gap:1rem}@media (min-width: 768px){.axp-report-runner-root-page .__reports-browser .__section .__items-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width: 1280px){.axp-report-runner-root-page .__reports-browser .__section .__items-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1536px){.axp-report-runner-root-page .__reports-browser .__section .__items-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 2560px){.axp-report-runner-root-page .__reports-browser .__section .__items-grid{grid-template-columns:repeat(5,minmax(0,1fr))}}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item{cursor:pointer;border-radius:.5rem;border-width:1px;padding:1rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s;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-runner-root-page .__reports-browser .__section .__items-grid .__item:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item{display:flex;align-items:flex-start;gap:.75rem}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item .__item-icon{display:flex;height:2.5rem;width:2.5rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:.25rem;font-size:1.125rem;line-height:1.75rem}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item .__item-content{min-width:0px;flex:1 1 0%}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item .__item-content .__item-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item .__item-content .__item-description{margin-top:.25rem;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__category .__item-icon{background-color:rgba(var(--ax-sys-color-warning-500),.1)}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__category .__item-icon ax-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-warning-500),var(--tw-text-opacity, 1))}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__category:hover{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-warning-500),var(--tw-border-opacity, 1));background-color:rgba(var(--ax-sys-color-warning-500),.05)}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__report .__item-icon{background-color:rgba(var(--ax-sys-color-primary-500),.1)}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__report .__item-icon ax-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__report:hover{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-primary-500),var(--tw-border-opacity, 1));background-color:rgba(var(--ax-sys-color-primary-500),.05)}.axp-report-runner-root-page .__reports-browser.__mobile .__mobile-search{margin-bottom:1.5rem}.axp-report-runner-root-page .__reports-browser.__mobile .__section .__items-grid{grid-template-columns:repeat(1,minmax(0,1fr));gap:.75rem}.axp-report-runner-root-page .__reports-browser.__mobile .__section .__items-grid .__item{padding:.75rem}.axp-report-runner-root-page .__reports-browser.__mobile .__section .__items-grid .__item .__item-icon{height:2rem;width:2rem;font-size:1rem;line-height:1.5rem}.axp-report-runner-root-page .__reports-browser.__mobile .__section .__items-grid .__item .__item-content .__item-title{font-size:1rem;line-height:1.5rem}.axp-report-runner-root-page .__reports-browser.__mobile .__section .__items-grid .__item .__item-content .__item-description{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1;font-size:.75rem;line-height:1rem}.axp-report-runner-root-page .__reports-browser .__empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-top:4rem;padding-bottom:4rem;text-align:center}.axp-report-runner-root-page .__reports-browser .__empty-state .__empty-icon{margin-bottom:1rem;font-size:3.75rem;line-height:1;opacity:.5}.axp-report-runner-root-page .__reports-browser .__empty-state .__empty-content h4{margin-bottom:.5rem;font-size:1.5rem;font-weight:500;line-height:1.5rem}.axp-report-runner-root-page .__reports-browser .__empty-state .__empty-content p{max-width:28rem;opacity:74%;display:block;font-size:1rem;font-weight:400;line-height:1.625rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
546
+ //
547
+ AXSearchBoxModule }, { kind: "component", type: i3.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i4.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i6.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: AXTabsModule }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i7.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "component", type:
548
+ //
549
+ AXPPageLayoutComponent, selector: "axp-page-layout" }, { 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: AXPThemeLayoutToolbarComponent, selector: "axp-layout-toolbar" }, { kind: "component", type: AXPThemeLayoutHeaderComponent, selector: "axp-layout-header" }, { kind: "component", type: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "component", type:
550
+ //
551
+ AXPDynamicFormComponent, selector: "axp-dynamic-form", inputs: ["formDefinition", "context", "layoutConfig"], outputs: ["contextChange", "contextInitiated", "validityChange"] }, { kind: "component", type: AXPReportCategoriesTreeComponent, selector: "axp-report-categories-tree", outputs: ["categoryClick", "reportClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
552
+ }
553
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: AXMReportRunnerRootPageComponent, decorators: [{
554
+ type: Component,
555
+ args: [{ standalone: true, imports: [
556
+ CommonModule,
557
+ FormsModule,
558
+ RouterModule,
559
+ //
560
+ AXSearchBoxModule,
561
+ AXDecoratorModule,
562
+ AXBreadcrumbsModule,
563
+ AXTranslationModule,
564
+ AXButtonModule,
565
+ AXTabsModule,
566
+ AXBadgeModule,
567
+ AXLoadingModule,
568
+ AXDropdownButtonModule,
569
+ //
570
+ AXPPageLayoutComponent,
571
+ AXPThemeLayoutBlockComponent,
572
+ AXPThemeLayoutToolbarComponent,
573
+ AXPThemeLayoutHeaderComponent,
574
+ AXPThemeLayoutStartSideComponent,
575
+ //
576
+ AXPDynamicFormComponent,
577
+ AXPReportCategoriesTreeComponent,
578
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
579
+ AXUnsubscriber,
580
+ AXPReportRunnerRootViewModel,
581
+ {
582
+ provide: AXPPageLayoutBase,
583
+ useExisting: AXMReportRunnerRootPageComponent,
584
+ },
585
+ ], host: { class: 'axp-report-runner-root-page' }, template: "<axp-page-layout *translate=\"let t\">\n @if (vm.showSideMenu()) {\n <axp-layout-start-side>\n <axp-layout-header>\n <axp-layout-title>{{ t('@report-management:features.report-runner.menu-title') | async }}</axp-layout-title>\n <axp-layout-toolbar>\n <ax-search-box\n [delayTime]=\"300\"\n [ngModel]=\"vm.searchExpression()\"\n (onValueChanged)=\"vm.search($event.value)\"\n [placeholder]=\"t('search.placeholder') | async\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </axp-layout-toolbar>\n </axp-layout-header>\n <axp-layout-content>\n <axp-report-categories-tree (categoryClick)=\"onCategoryClick($event)\" (reportClick)=\"onReportClick($event)\" />\n </axp-layout-content>\n </axp-layout-start-side>\n }\n\n <axp-page-content>\n @if (vm.showSideMenu()) {\n <!-- Desktop: Show parameters view when report is selected, or grid browser when no report -->\n @if (vm.hasActiveReport()) {\n <div class=\"__parameters-view\">\n <axp-dynamic-form\n [formDefinition]=\"vm.formDefinition()\"\n [context]=\"vm.context()\"\n [layoutConfig]=\"defaultLayout()\"\n (contextChange)=\"handleContextChanged($event)\"\n (contextInitiated)=\"handleContextInitiated($event)\"\n >\n </axp-dynamic-form>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"browser\"> </ng-container>\n }\n } @else {\n <!-- Mobile: Show parameters view when report is selected, or mobile browser for navigation -->\n @if (vm.hasActiveReport()) {\n <div class=\"__parameters-view\">\n <axp-dynamic-form\n [formDefinition]=\"vm.formDefinition()\"\n [context]=\"vm.context()\"\n [layoutConfig]=\"defaultLayout()\"\n (contextChange)=\"handleContextChanged($event)\"\n (contextInitiated)=\"handleContextInitiated($event)\"\n >\n </axp-dynamic-form>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"browser\"> </ng-container>\n }\n }\n </axp-page-content>\n\n <!-- Desktop: Grid-based browser for main content when no report selected -->\n <ng-template #browser>\n <div class=\"__reports-browser __desktop\">\n @if (vm.categories().length > 0) {\n <div class=\"__section\">\n <h3 class=\"__section-title\">Categories</h3>\n <div class=\"__items-grid\">\n @for (category of vm.categories(); track category.id) {\n <div class=\"__item __category\" (click)=\"navigateToCategory(category)\">\n <div class=\"__item-icon\">\n <ax-icon class=\"fa-solid fa-folder\"></ax-icon>\n </div>\n <div class=\"__item-content\">\n <div class=\"__item-title\">{{ category.title }}</div>\n @if (category.description) {\n <div class=\"__item-description\">{{ category.description }}</div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n @if (vm.reports().length > 0) {\n <div class=\"__section\">\n <h3 class=\"__section-title\">Reports</h3>\n <div class=\"__items-grid\">\n @for (report of vm.reports(); track report.id) {\n <div class=\"__item __report\" (click)=\"navigateToReport(report)\">\n <div class=\"__item-icon\">\n <ax-icon class=\"fa-solid fa-file-chart-column\"></ax-icon>\n </div>\n <div class=\"__item-content\">\n <div class=\"__item-title\">{{ report.title }}</div>\n @if (report.description) {\n <div class=\"__item-description\">{{ report.description }}</div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n @if (vm.categories().length === 0 && vm.reports().length === 0) {\n <div class=\"__empty-state\">\n <div class=\"__empty-icon\">\n <ax-icon class=\"fa-light fa-folder-open\"></ax-icon>\n </div>\n <div class=\"__empty-content\">\n <h4>No items found</h4>\n <p>There are no categories or reports available in this location.</p>\n </div>\n </div>\n }\n </div>\n </ng-template>\n\n @if (vm.hasActiveReport()) {\n <axp-page-footer class=\"--animated\">\n <axp-layout-suffix>\n <ax-button\n [class.ax-sm]=\"layoutService.isSmall()\"\n [disabled]=\"vm.isBusy() || vm.isRunning()\"\n [text]=\"t('run') | async\"\n (onClick)=\"vm.run()\"\n [color]=\"'secondary'\"\n >\n @if (vm.isRunning()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </axp-layout-suffix>\n </axp-page-footer>\n }\n</axp-page-layout>\n", styles: [".axp-report-runner-root-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-runner-root-page axp-layout-start-side{width:24rem}}.axp-report-runner-root-page axp-layout-start-side axp-layout-content{overflow-x:auto;padding-left:1rem;padding-right:1rem}.axp-report-runner-root-page .__reports-browser>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.axp-report-runner-root-page .__reports-browser{padding:1.5rem}.axp-report-runner-root-page .__reports-browser.__mobile>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.axp-report-runner-root-page .__reports-browser.__mobile{padding:1rem}.axp-report-runner-root-page .__reports-browser .__section>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.axp-report-runner-root-page .__reports-browser .__section .__section-title{display:flex;align-items:center;gap:.5rem;font-size:1.125rem;line-height:1.75rem;font-weight:600}.axp-report-runner-root-page .__reports-browser .__section .__section-title ax-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-runner-root-page .__reports-browser .__section .__items-grid{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));gap:1rem}@media (min-width: 768px){.axp-report-runner-root-page .__reports-browser .__section .__items-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width: 1280px){.axp-report-runner-root-page .__reports-browser .__section .__items-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width: 1536px){.axp-report-runner-root-page .__reports-browser .__section .__items-grid{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 2560px){.axp-report-runner-root-page .__reports-browser .__section .__items-grid{grid-template-columns:repeat(5,minmax(0,1fr))}}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item{cursor:pointer;border-radius:.5rem;border-width:1px;padding:1rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s;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-runner-root-page .__reports-browser .__section .__items-grid .__item:is(.ax-dark *){background-color:rgb(var(--ax-sys-color-lighter-surface));color:rgb(var(--ax-sys-color-on-lighter-surface));border-color:rgb(var(--ax-sys-color-border-lighter-surface))}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item{display:flex;align-items:flex-start;gap:.75rem}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item .__item-icon{display:flex;height:2.5rem;width:2.5rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:.25rem;font-size:1.125rem;line-height:1.75rem}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item .__item-content{min-width:0px;flex:1 1 0%}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item .__item-content .__item-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item .__item-content .__item-description{margin-top:.25rem;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;font-size:.875rem;line-height:1.25rem;opacity:.75}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__category .__item-icon{background-color:rgba(var(--ax-sys-color-warning-500),.1)}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__category .__item-icon ax-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-warning-500),var(--tw-text-opacity, 1))}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__category:hover{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-warning-500),var(--tw-border-opacity, 1));background-color:rgba(var(--ax-sys-color-warning-500),.05)}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__report .__item-icon{background-color:rgba(var(--ax-sys-color-primary-500),.1)}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__report .__item-icon ax-icon{--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-primary-500),var(--tw-text-opacity, 1))}.axp-report-runner-root-page .__reports-browser .__section .__items-grid .__item.__report:hover{--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-primary-500),var(--tw-border-opacity, 1));background-color:rgba(var(--ax-sys-color-primary-500),.05)}.axp-report-runner-root-page .__reports-browser.__mobile .__mobile-search{margin-bottom:1.5rem}.axp-report-runner-root-page .__reports-browser.__mobile .__section .__items-grid{grid-template-columns:repeat(1,minmax(0,1fr));gap:.75rem}.axp-report-runner-root-page .__reports-browser.__mobile .__section .__items-grid .__item{padding:.75rem}.axp-report-runner-root-page .__reports-browser.__mobile .__section .__items-grid .__item .__item-icon{height:2rem;width:2rem;font-size:1rem;line-height:1.5rem}.axp-report-runner-root-page .__reports-browser.__mobile .__section .__items-grid .__item .__item-content .__item-title{font-size:1rem;line-height:1.5rem}.axp-report-runner-root-page .__reports-browser.__mobile .__section .__items-grid .__item .__item-content .__item-description{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1;font-size:.75rem;line-height:1rem}.axp-report-runner-root-page .__reports-browser .__empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding-top:4rem;padding-bottom:4rem;text-align:center}.axp-report-runner-root-page .__reports-browser .__empty-state .__empty-icon{margin-bottom:1rem;font-size:3.75rem;line-height:1;opacity:.5}.axp-report-runner-root-page .__reports-browser .__empty-state .__empty-content h4{margin-bottom:.5rem;font-size:1.5rem;font-weight:500;line-height:1.5rem}.axp-report-runner-root-page .__reports-browser .__empty-state .__empty-content p{max-width:28rem;opacity:74%;display:block;font-size:1rem;font-weight:400;line-height:1.625rem}\n"] }]
586
+ }] });
587
+
588
+ export { AXMReportRunnerRootPageComponent };
589
+ //# sourceMappingURL=acorex-modules-report-management-report-runner-root-page.component-CtEDcg_B.mjs.map