@acorex/platform 20.6.0-next.9 → 21.0.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/auth/index.d.ts +91 -12
  2. package/common/index.d.ts +615 -44
  3. package/core/index.d.ts +718 -422
  4. package/fesm2022/acorex-platform-auth.mjs +152 -39
  5. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  6. package/fesm2022/acorex-platform-common.mjs +1009 -112
  7. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  8. package/fesm2022/acorex-platform-core.mjs +887 -408
  9. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  10. package/fesm2022/acorex-platform-domain.mjs +99 -11
  11. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  12. package/fesm2022/acorex-platform-layout-builder.mjs +555 -492
  13. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  14. package/fesm2022/acorex-platform-layout-components.mjs +2446 -2733
  15. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  16. package/fesm2022/acorex-platform-layout-designer.mjs +9 -9
  17. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  18. package/fesm2022/acorex-platform-layout-entity.mjs +9708 -4721
  19. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  20. package/fesm2022/acorex-platform-layout-views.mjs +32 -26
  21. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  22. package/fesm2022/acorex-platform-layout-widget-core.mjs +252 -182
  23. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  24. package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-D0y-9nE5.mjs → acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs} +2 -2
  25. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs.map +1 -0
  26. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs +30 -0
  27. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs.map +1 -0
  28. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-C1l2KSDa.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs} +2 -2
  29. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs.map +1 -0
  30. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-D-31ej0C.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs} +2 -2
  31. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs.map +1 -0
  32. package/fesm2022/acorex-platform-layout-widgets.mjs +9791 -6928
  33. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  34. package/fesm2022/acorex-platform-runtime.mjs +79 -3
  35. package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
  36. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs +157 -0
  37. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs.map +1 -0
  38. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs +1542 -0
  39. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs.map +1 -0
  40. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs +101 -0
  41. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs.map +1 -0
  42. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-B_P0a5KW.mjs → acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs} +3 -3
  43. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs.map +1 -0
  44. package/fesm2022/acorex-platform-themes-default.mjs +282 -43
  45. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  46. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs +55 -0
  47. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs.map +1 -0
  48. package/fesm2022/acorex-platform-themes-shared.mjs +42 -137
  49. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  50. package/fesm2022/acorex-platform-workflow.mjs +658 -45
  51. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  52. package/layout/builder/index.d.ts +10 -34
  53. package/layout/components/index.d.ts +694 -375
  54. package/layout/designer/index.d.ts +4 -4
  55. package/layout/entity/index.d.ts +802 -183
  56. package/layout/views/index.d.ts +5 -58
  57. package/layout/widget-core/index.d.ts +63 -75
  58. package/layout/widgets/README.md +0 -1
  59. package/layout/widgets/index.d.ts +493 -129
  60. package/package.json +5 -5
  61. package/runtime/index.d.ts +36 -8
  62. package/themes/default/index.d.ts +44 -75
  63. package/themes/shared/index.d.ts +11 -49
  64. package/workflow/index.d.ts +401 -90
  65. package/fesm2022/acorex-platform-layout-entity-create-entity.command-DGeylNSY.mjs +0 -52
  66. package/fesm2022/acorex-platform-layout-entity-create-entity.command-DGeylNSY.mjs.map +0 -1
  67. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-fhhZOWul.mjs +0 -50
  68. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-fhhZOWul.mjs.map +0 -1
  69. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-C3Qbs0fz.mjs +0 -42
  70. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-C3Qbs0fz.mjs.map +0 -1
  71. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-CngQBUlN.mjs +0 -55
  72. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-CngQBUlN.mjs.map +0 -1
  73. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-view.component-DSNo9e4W.mjs +0 -50
  74. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-view.component-DSNo9e4W.mjs.map +0 -1
  75. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-edit.component-CL0CwEHX.mjs +0 -48
  76. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-edit.component-CL0CwEHX.mjs.map +0 -1
  77. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-view.component-B6Fi0xTw.mjs +0 -42
  78. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-view.component-B6Fi0xTw.mjs.map +0 -1
  79. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-D0y-9nE5.mjs.map +0 -1
  80. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-C1l2KSDa.mjs.map +0 -1
  81. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-D-31ej0C.mjs.map +0 -1
  82. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-WbPPqDON.mjs +0 -115
  83. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-WbPPqDON.mjs.map +0 -1
  84. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-CD7rJIMh.mjs +0 -803
  85. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-CD7rJIMh.mjs.map +0 -1
  86. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BTA6h7Xd.mjs +0 -101
  87. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BTA6h7Xd.mjs.map +0 -1
  88. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-B_P0a5KW.mjs.map +0 -1
@@ -1,803 +0,0 @@
1
- import { AXActionSheetModule } from '@acorex/components/action-sheet';
2
- import * as i7 from '@acorex/components/data-table';
3
- import { AXDataTableModule } from '@acorex/components/data-table';
4
- import { AXDrawerModule } from '@acorex/components/drawer';
5
- import * as i1$1 from '@acorex/core/platform';
6
- import * as i0 from '@angular/core';
7
- import { inject, input, viewChild, signal, ViewEncapsulation, Component, computed, effect, Input, ChangeDetectionStrategy } from '@angular/core';
8
- import { Router, ActivatedRoute, RouterModule } from '@angular/router';
9
- import { AXBadgeModule } from '@acorex/components/badge';
10
- import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
11
- import * as i3$1 from '@acorex/components/button';
12
- import { AXButtonModule } from '@acorex/components/button';
13
- import * as i2 from '@acorex/components/decorators';
14
- import { AXDecoratorModule } from '@acorex/components/decorators';
15
- import { AXDialogModule } from '@acorex/components/dialog';
16
- import * as i5 from '@acorex/components/dropdown';
17
- import { AXDropdownModule } from '@acorex/components/dropdown';
18
- import { AXFormModule } from '@acorex/components/form';
19
- import { AXLoadingModule } from '@acorex/components/loading';
20
- import * as i3$2 from '@acorex/components/popover';
21
- import { AXPopoverModule } from '@acorex/components/popover';
22
- import * as i6 from '@acorex/components/search-box';
23
- import { AXSearchBoxModule } from '@acorex/components/search-box';
24
- import { AXTabsModule } from '@acorex/components/tabs';
25
- import { AXTooltipModule } from '@acorex/components/tooltip';
26
- import * as i10 from '@acorex/core/translation';
27
- import { AXTranslationService, AXTranslationModule, translateSync } from '@acorex/core/translation';
28
- import { AXPAuthModule } from '@acorex/platform/auth';
29
- import { AXPThemeLayoutBlockComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutToolbarComponent, AXPStateMessageComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryViewsComponent, AXPQueryColumnsComponent, AXPThemeLayoutStartSideComponent } from '@acorex/platform/layout/components';
30
- import * as i7$1 from '@acorex/platform/layout/widget-core';
31
- import { AXPWidgetCoreModule } from '@acorex/platform/layout/widget-core';
32
- import { AXPWidgetsModule } from '@acorex/platform/layout/widgets';
33
- import { DragDropModule } from '@angular/cdk/drag-drop';
34
- import * as i1 from '@angular/common';
35
- import { CommonModule } from '@angular/common';
36
- import { FormsModule } from '@angular/forms';
37
- import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
38
- import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPageLayoutBase } from '@acorex/platform/layout/views';
39
- import { AXPLayoutThemeService } from '@acorex/platform/themes/shared';
40
- import * as i3 from '@acorex/components/skeleton';
41
- import { AXSkeletonModule } from '@acorex/components/skeleton';
42
- import * as i2$1 from '@acorex/components/tree-view';
43
- import { AXTreeViewModule } from '@acorex/components/tree-view';
44
- import { AXPWorkflowService } from '@acorex/platform/workflow';
45
- import { AXPEntityResolver, AXPEntityListViewColumnViewModel } from '@acorex/platform/layout/entity';
46
- import { AXPSettingService, AXPCommonSettings } from '@acorex/platform/common';
47
- import { isEqual } from 'lodash-es';
48
-
49
- class AXPEntityCategoryComponent {
50
- constructor() {
51
- this.entityResolver = inject(AXPEntityResolver);
52
- this.translate = inject(AXTranslationService);
53
- this.workflow = inject(AXPWorkflowService);
54
- this.vm = input.required(...(ngDevMode ? [{ debugName: "vm" }] : []));
55
- this.tree = viewChild('tree', ...(ngDevMode ? [{ debugName: "tree" }] : []));
56
- this.searchValue = input('', ...(ngDevMode ? [{ debugName: "searchValue" }] : []));
57
- this.isLoading = signal(true, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
58
- this.loadingTimeoutId = null;
59
- this.LOADING_DELAY = 300; // Show skeleton only if loading takes more than 300ms
60
- this.basicQueryEvent = {
61
- skip: 0,
62
- take: 1000,
63
- };
64
- this.treeItems = signal([
65
- {
66
- expand: true,
67
- children: [],
68
- },
69
- ], ...(ngDevMode ? [{ debugName: "treeItems" }] : []));
70
- }
71
- ngOnInit() {
72
- this.getCategories();
73
- }
74
- async handleCategorySearchChange(e) {
75
- if (this.categoryEntityDef) {
76
- // Set loading state with delay to avoid flickering
77
- this.setLoadingWithDelay(true);
78
- const categoryInlineFilters = this.categoryEntityDef.properties.filter((p) => p.options?.filter?.inline?.enabled);
79
- const event = {
80
- ...this.basicQueryEvent,
81
- filter: {
82
- filters: [
83
- {
84
- filters: categoryInlineFilters.map((cif) => ({
85
- field: cif.name,
86
- operator: {
87
- type: 'contains',
88
- },
89
- value: e.value,
90
- })),
91
- logic: 'or',
92
- },
93
- {
94
- value: true,
95
- field: this.categoryEntityDef.parentKey,
96
- operator: {
97
- type: 'isEmpty',
98
- },
99
- },
100
- ],
101
- logic: 'and',
102
- },
103
- };
104
- const res = await this.categoryEntityQueryFunc(event);
105
- this.treeItems.update((prev) => prev.map((item) => ({ ...item, children: res.items })));
106
- this.clearLoadingState();
107
- }
108
- }
109
- async getCategories() {
110
- // Set loading state with delay to avoid flickering
111
- this.setLoadingWithDelay(true);
112
- this.categoryEntityDef = await this.getCategoryEntityDef();
113
- this.categoryEntityQueryFunc = this.categoryEntityDef?.queries.list?.execute;
114
- const res = await this.categoryEntityQueryFunc(this.basicQueryEvent);
115
- const textField = this.vm().entityDef.category?.textField || 'title';
116
- const valueField = this.vm().entityDef.category?.valueField || 'id';
117
- const updatedItems = {
118
- expand: true,
119
- [textField]: await this.translate.translateAsync('@general:terms.interface.selection.all-items'),
120
- [valueField]: 'all',
121
- children: res.items,
122
- };
123
- this.treeItems.update((prev) => prev.map((_) => updatedItems));
124
- this.clearLoadingState();
125
- }
126
- async handleCollapseChanged(e) {
127
- await this.loadChildrenAtNode(e.data.id);
128
- }
129
- async getCategoryEntityDef() {
130
- const [module, entity] = this.vm().entityDef.category?.entity?.split('.') || [];
131
- return await this.entityResolver.get(module, entity);
132
- }
133
- handleNodeClick(event) {
134
- const filters = this.vm()
135
- .entityDef.category?.applyConditions?.map((f) => {
136
- return event.data[f.value] !== 'all'
137
- ? {
138
- field: f.name,
139
- value: event.data[f.value],
140
- operator: f.operator,
141
- }
142
- : null;
143
- })
144
- .filter((item) => item != null);
145
- const viewFilters = this.vm()
146
- .view()
147
- .conditions.map((i) => ({ ...i, field: i.name }));
148
- const newFilters = [...viewFilters, ...filters];
149
- // this.vm().filterQueries.update((prev) => [...prev, ...filters!]);
150
- this.vm().dataSource.filter({
151
- filters: newFilters,
152
- logic: 'and',
153
- });
154
- this.vm().dataSource.refresh();
155
- }
156
- //#region ---- Utility Methods ----
157
- /** Loads children for a given node id and updates the tree in place. */
158
- async loadChildrenAtNode(targetId) {
159
- this.tree()?.setNodeLoading(targetId, true);
160
- const event = {
161
- ...this.basicQueryEvent,
162
- filter: {
163
- field: this.categoryEntityDef?.parentKey,
164
- value: targetId,
165
- operator: { type: 'equal' },
166
- },
167
- };
168
- const children = await this.categoryEntityQueryFunc(event);
169
- const updateChildrenAtPath = (items, id) => {
170
- return items.map((item) => {
171
- if (item.id === id) {
172
- return { ...item, children: children.items };
173
- }
174
- if (item.children?.length) {
175
- return { ...item, children: updateChildrenAtPath(item.children, id) };
176
- }
177
- return item;
178
- });
179
- };
180
- this.treeItems.update((prev) => prev.map((i) => ({ ...i, children: updateChildrenAtPath(prev[0].children, targetId) })));
181
- this.tree()?.setNodeLoading(targetId, false);
182
- }
183
- /** Returns the module.entity key for the configured category entity. */
184
- getCategoryEntityKey() {
185
- return this.vm().entityDef.category?.entity;
186
- }
187
- /** Refresh tree after CRUD operations. */
188
- async refreshAfterChange(parentId) {
189
- if (parentId) {
190
- await this.loadChildrenAtNode(parentId);
191
- }
192
- else {
193
- await this.getCategories();
194
- }
195
- }
196
- //#endregion
197
- //#region ---- UI Handlers ----
198
- /** Create a new root category node. */
199
- async handleCreateRootClick(e) {
200
- e.nativeEvent.preventDefault();
201
- e.nativeEvent.stopPropagation();
202
- await this.workflow.execute('create-entity', {
203
- entity: this.getCategoryEntityKey(),
204
- options: { process: { redirect: false } },
205
- });
206
- await this.refreshAfterChange();
207
- }
208
- /** Create a new child under the given node. */
209
- async handleCreateChildClick(node, e) {
210
- e.nativeEvent.preventDefault();
211
- e.nativeEvent.stopPropagation();
212
- const parentKey = this.categoryEntityDef?.parentKey;
213
- const data = {};
214
- if (parentKey) {
215
- data[parentKey] = node.id;
216
- }
217
- await this.workflow.execute('create-entity', {
218
- entity: this.getCategoryEntityKey(),
219
- data,
220
- options: { process: { redirect: false, canCreateNewOne: true } },
221
- });
222
- await this.refreshAfterChange(node.id);
223
- }
224
- /** Update the given node. */
225
- async handleEditNodeClick(node, e) {
226
- e.nativeEvent.preventDefault();
227
- e.nativeEvent.stopPropagation();
228
- await this.workflow.execute('quick-modify-entity', {
229
- entity: this.getCategoryEntityKey(),
230
- data: node,
231
- options: { layout: { size: 'md' } },
232
- });
233
- await this.refreshAfterChange(node[this.categoryEntityDef?.parentKey]);
234
- }
235
- /** Delete the given node. */
236
- async handleDeleteNodeClick(node, e) {
237
- e.nativeEvent.preventDefault();
238
- e.nativeEvent.stopPropagation();
239
- await this.workflow.execute('delete-entity', {
240
- entity: this.getCategoryEntityKey(),
241
- data: node,
242
- options: { process: { showResult: true } },
243
- });
244
- await this.refreshAfterChange(node[this.categoryEntityDef?.parentKey]);
245
- }
246
- //#endregion
247
- //#region ---- Loading State Management ----
248
- /**
249
- * Set loading state with delay to avoid flickering for fast responses
250
- */
251
- setLoadingWithDelay(loading) {
252
- if (loading) {
253
- // Clear any existing timeout
254
- if (this.loadingTimeoutId) {
255
- clearTimeout(this.loadingTimeoutId);
256
- }
257
- // Only show skeleton if loading takes more than LOADING_DELAY ms
258
- this.loadingTimeoutId = setTimeout(() => {
259
- this.isLoading.set(true);
260
- this.loadingTimeoutId = null;
261
- }, this.LOADING_DELAY);
262
- }
263
- }
264
- /**
265
- * Clear loading state and cancel any pending timeout
266
- */
267
- clearLoadingState() {
268
- // Cancel the delayed loading state if it hasn't been set yet
269
- if (this.loadingTimeoutId) {
270
- clearTimeout(this.loadingTimeoutId);
271
- this.loadingTimeoutId = null;
272
- }
273
- // Clear the loading state
274
- this.isLoading.set(false);
275
- }
276
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPEntityCategoryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
277
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXPEntityCategoryComponent, isStandalone: true, selector: "axp-entity-category", inputs: { vm: { classPropertyName: "vm", publicName: "vm", isSignal: true, isRequired: true, transformFunction: null }, searchValue: { classPropertyName: "searchValue", publicName: "searchValue", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "tree", first: true, predicate: ["tree"], descendants: true, isSignal: true }], ngImport: i0, template: "<axp-layout-header>\n <axp-layout-title>{{\n vm().entityDef.category?.title || '@general:terms.classification.category' | translate | async\n }}</axp-layout-title>\n <axp-layout-toolbar>\n <ax-search-box\n (onValueChanged)=\"handleCategorySearchChange($event)\"\n [delayTime]=\"300\"\n [placeholder]=\"'@general:terms.interface.category.search.placeholder' | translate | async\"\n >\n </ax-search-box>\n </axp-layout-toolbar>\n</axp-layout-header>\n<axp-layout-content>\n @if (isLoading()) {\n <div class=\"ax-p-4 ax-flex ax-flex-col ax-gap-3\">\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n </div>\n } @else if (treeItems()[0].children.length) {\n <div class=\"ax-px-4 ax-max-h-[calc(100vh-250px)] ax-overflow-auto\">\n <ax-tree-view\n (onNodeClick)=\"handleNodeClick($event)\"\n (onCollapsedChanged)=\"handleCollapseChanged($event)\"\n [showCheckbox]=\"false\"\n [itemTemplate]=\"itemTemplate\"\n #treeRef\n [textField]=\"vm().entityDef.category?.textField || 'title'\"\n [valueField]=\"vm().entityDef.category?.valueField || 'id'\"\n [expandedField]=\"'expand'\"\n [items]=\"treeItems()\"\n #tree\n >\n </ax-tree-view>\n </div>\n } @else {\n <axp-state-message\n icon=\"fa-light fa-folder-open\"\n [title]=\"'@general:terms.interface.category.search.no-records.title'\"\n [description]=\"'@general:terms.interface.category.search.no-records.description'\"\n >\n <ax-button\n slot=\"actions\"\n (onClick)=\"handleCreateRootClick($event)\"\n look=\"solid\"\n color=\"primary\"\n [text]=\"'@general:actions.add-new.title' | translate | async\"\n >\n <ax-icon class=\"fas fa-plus\"></ax-icon>\n </ax-button>\n </axp-state-message>\n }\n\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center ax-justify-between ax-w-full ax-gap-2 ax-overflow-hidden\">\n <div class=\"ax-flex ax-items-center ax-gap-2 ax-min-w-0\">\n <ax-icon class=\"fas ax-text-warning fa-folder\"></ax-icon>\n <span class=\"ax-truncate\">{{ item.title }}</span>\n </div>\n @if (item.id && item.id !== 'all') {\n <div class=\"ax-flex ax-items-center ax-gap-1\">\n <ax-button class=\"ax-xs\" color=\"default\" look=\"blank\" (onClick)=\"$event.nativeEvent.stopPropagation()\">\n <ax-icon class=\"fas fa-ellipsis-v\"></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n (onClick)=\"handleCreateChildClick(item, $event)\"\n look=\"blank\"\n color=\"default\"\n text=\"Add New Child\"\n >\n <ax-icon class=\"fas fa-plus\"></ax-icon>\n </ax-button-item>\n <ax-button-item (onClick)=\"handleEditNodeClick(item, $event)\" look=\"blank\" text=\"Edit\">\n <ax-icon class=\"fas fa-pen\"></ax-icon>\n </ax-button-item>\n <ax-button-item\n (onClick)=\"handleDeleteNodeClick(item, $event)\"\n color=\"danger\"\n look=\"blank\"\n text=\"Delete\"\n >\n <ax-icon class=\"fas fa-trash\"></ax-icon>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n </div>\n } @else if (item.id === 'all') {\n <div class=\"ax-flex ax-items-center ax-gap-1\">\n <ax-button class=\"ax-xs\" (onClick)=\"handleCreateRootClick($event)\" look=\"blank\" color=\"default\">\n <ax-icon class=\"fas fa-plus\"></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </ng-template>\n</axp-layout-content>\n", styles: ["ax-tree-view-item .ax-tree-view-items{width:100%;min-width:0px}ax-tree-view-item .ax-tree-view-items>div{width:100%}ax-tree-view-item .ax-state-tree-view-active{background-color:rgb(var(--ax-sys-color-light-surface))!important;color:rgb(var(--ax-sys-color-on-light-surface))!important;border-color:rgb(var(--ax-sys-color-border-light-surface))!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTreeViewModule }, { kind: "component", type: i2$1.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"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { 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: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i6.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "component", type: AXPThemeLayoutHeaderComponent, selector: "axp-layout-header" }, { kind: "component", type: AXPThemeLayoutToolbarComponent, selector: "axp-layout-toolbar" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$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: "component", type: i3$1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i3$1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i5.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "variant"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.AXTranslatorPipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
278
- }
279
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPEntityCategoryComponent, decorators: [{
280
- type: Component,
281
- args: [{ selector: 'axp-entity-category', standalone: true, encapsulation: ViewEncapsulation.None, imports: [
282
- CommonModule,
283
- AXDecoratorModule,
284
- AXTreeViewModule,
285
- AXSkeletonModule,
286
- AXPThemeLayoutBlockComponent,
287
- AXSearchBoxModule,
288
- AXPThemeLayoutHeaderComponent,
289
- AXPThemeLayoutToolbarComponent,
290
- AXTranslationModule,
291
- AXButtonModule,
292
- AXDropdownModule,
293
- AXPStateMessageComponent
294
- ], template: "<axp-layout-header>\n <axp-layout-title>{{\n vm().entityDef.category?.title || '@general:terms.classification.category' | translate | async\n }}</axp-layout-title>\n <axp-layout-toolbar>\n <ax-search-box\n (onValueChanged)=\"handleCategorySearchChange($event)\"\n [delayTime]=\"300\"\n [placeholder]=\"'@general:terms.interface.category.search.placeholder' | translate | async\"\n >\n </ax-search-box>\n </axp-layout-toolbar>\n</axp-layout-header>\n<axp-layout-content>\n @if (isLoading()) {\n <div class=\"ax-p-4 ax-flex ax-flex-col ax-gap-3\">\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded-md\"></ax-skeleton>\n </div>\n } @else if (treeItems()[0].children.length) {\n <div class=\"ax-px-4 ax-max-h-[calc(100vh-250px)] ax-overflow-auto\">\n <ax-tree-view\n (onNodeClick)=\"handleNodeClick($event)\"\n (onCollapsedChanged)=\"handleCollapseChanged($event)\"\n [showCheckbox]=\"false\"\n [itemTemplate]=\"itemTemplate\"\n #treeRef\n [textField]=\"vm().entityDef.category?.textField || 'title'\"\n [valueField]=\"vm().entityDef.category?.valueField || 'id'\"\n [expandedField]=\"'expand'\"\n [items]=\"treeItems()\"\n #tree\n >\n </ax-tree-view>\n </div>\n } @else {\n <axp-state-message\n icon=\"fa-light fa-folder-open\"\n [title]=\"'@general:terms.interface.category.search.no-records.title'\"\n [description]=\"'@general:terms.interface.category.search.no-records.description'\"\n >\n <ax-button\n slot=\"actions\"\n (onClick)=\"handleCreateRootClick($event)\"\n look=\"solid\"\n color=\"primary\"\n [text]=\"'@general:actions.add-new.title' | translate | async\"\n >\n <ax-icon class=\"fas fa-plus\"></ax-icon>\n </ax-button>\n </axp-state-message>\n }\n\n <ng-template #itemTemplate let-item>\n <div class=\"ax-flex ax-items-center ax-justify-between ax-w-full ax-gap-2 ax-overflow-hidden\">\n <div class=\"ax-flex ax-items-center ax-gap-2 ax-min-w-0\">\n <ax-icon class=\"fas ax-text-warning fa-folder\"></ax-icon>\n <span class=\"ax-truncate\">{{ item.title }}</span>\n </div>\n @if (item.id && item.id !== 'all') {\n <div class=\"ax-flex ax-items-center ax-gap-1\">\n <ax-button class=\"ax-xs\" color=\"default\" look=\"blank\" (onClick)=\"$event.nativeEvent.stopPropagation()\">\n <ax-icon class=\"fas fa-ellipsis-v\"></ax-icon>\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n (onClick)=\"handleCreateChildClick(item, $event)\"\n look=\"blank\"\n color=\"default\"\n text=\"Add New Child\"\n >\n <ax-icon class=\"fas fa-plus\"></ax-icon>\n </ax-button-item>\n <ax-button-item (onClick)=\"handleEditNodeClick(item, $event)\" look=\"blank\" text=\"Edit\">\n <ax-icon class=\"fas fa-pen\"></ax-icon>\n </ax-button-item>\n <ax-button-item\n (onClick)=\"handleDeleteNodeClick(item, $event)\"\n color=\"danger\"\n look=\"blank\"\n text=\"Delete\"\n >\n <ax-icon class=\"fas fa-trash\"></ax-icon>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n </div>\n } @else if (item.id === 'all') {\n <div class=\"ax-flex ax-items-center ax-gap-1\">\n <ax-button class=\"ax-xs\" (onClick)=\"handleCreateRootClick($event)\" look=\"blank\" color=\"default\">\n <ax-icon class=\"fas fa-plus\"></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </ng-template>\n</axp-layout-content>\n", styles: ["ax-tree-view-item .ax-tree-view-items{width:100%;min-width:0px}ax-tree-view-item .ax-tree-view-items>div{width:100%}ax-tree-view-item .ax-state-tree-view-active{background-color:rgb(var(--ax-sys-color-light-surface))!important;color:rgb(var(--ax-sys-color-on-light-surface))!important;border-color:rgb(var(--ax-sys-color-border-light-surface))!important}\n"] }]
295
- }], propDecorators: { vm: [{ type: i0.Input, args: [{ isSignal: true, alias: "vm", required: true }] }], tree: [{ type: i0.ViewChild, args: ['tree', { isSignal: true }] }], searchValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchValue", required: false }] }] } });
296
-
297
- class AXPEntityMasterToolbarViewComponent {
298
- constructor() {
299
- this.layoutService = inject(AXPLayoutThemeService);
300
- this.parent = inject(AXPEntityMasterListViewComponent);
301
- this.router = inject(Router);
302
- this.activeRoute = inject(ActivatedRoute);
303
- this.settingsService = inject(AXPSettingService);
304
- this.isInitializing = false;
305
- this.pendingInitialFilters = true;
306
- this.pendingInitialSorts = true;
307
- this.filterTriggerMode = 'manual';
308
- this.previousFilterQueries = signal([], ...(ngDevMode ? [{ debugName: "previousFilterQueries" }] : []));
309
- this.initialFilters = signal([], ...(ngDevMode ? [{ debugName: "initialFilters" }] : []));
310
- this.filtersDefinitions = signal([], ...(ngDevMode ? [{ debugName: "filtersDefinitions" }] : []));
311
- this.viewQueries = computed(() => this.vm.views().map((v) => ({
312
- name: v.name,
313
- fixed: false,
314
- title: v.title,
315
- columns: v.columns,
316
- conditions: v.conditions.map((c) => ({
317
- field: c.name,
318
- operator: c.operator,
319
- value: c.value,
320
- })),
321
- sorts: v.sorts,
322
- })), ...(ngDevMode ? [{ debugName: "viewQueries" }] : []));
323
- this.selectedViewQuery = computed(() => ({
324
- name: this.vm.view().name,
325
- fixed: false,
326
- title: this.vm.view().title,
327
- columns: this.vm.view().columns,
328
- conditions: this.vm.view().conditions.map((c) => ({
329
- field: c.name,
330
- operator: c.operator,
331
- value: c.value,
332
- })),
333
- sorts: this.vm.view().sorts,
334
- }), ...(ngDevMode ? [{ debugName: "selectedViewQuery" }] : []));
335
- this.isFiltersDirty = computed(() => !isEqual(this.vm.filterQueries(), this.previousFilterQueries()), ...(ngDevMode ? [{ debugName: "isFiltersDirty" }] : []));
336
- // Debounced apply to coalesce multiple UI changes (filters/sorts/columns)
337
- this.applyTimer = null;
338
- this.#effect = effect(() => {
339
- // Keep definitions up to date; initial filters are set explicitly from settings or view
340
- this.filtersDefinitions.set(this.vm.filtersDef);
341
- }, ...(ngDevMode ? [{ debugName: "#effect" }] : []));
342
- this.sortQueries = computed(() => this.vm
343
- .sortedFields()
344
- .filter((s) => !!s.dir)
345
- .map((s) => ({ name: s.name, dir: s.dir })), ...(ngDevMode ? [{ debugName: "sortQueries" }] : []));
346
- this.sortDefinitions = computed(() => this.vm.sortableFields().map((s) => ({
347
- name: s.name,
348
- title: s.title,
349
- dir: s.dir,
350
- })), ...(ngDevMode ? [{ debugName: "sortDefinitions" }] : []));
351
- }
352
- async ngOnInit() {
353
- // Prefer saved settings (view/columns/sorts/filters) if available, then apply
354
- await this.loadSettings();
355
- await this.vm.setView();
356
- this.filtersDefinitions.set(this.vm.filtersDef);
357
- this.isInitializing = true;
358
- // this.pendingInitialFilters = true;
359
- // this.pendingInitialSorts = true;
360
- this.setInitialFiltersFromSettingsOrView();
361
- // Ensure initial load even when filters/sorts are absent
362
- setTimeout(() => {
363
- this.isInitializing = false;
364
- this.scheduleApply();
365
- }, 0);
366
- }
367
- async loadSettings() {
368
- const filterTriggerMode = await this.settingsService.get(AXPCommonSettings.EntityFilterApplyMode);
369
- this.filterTriggerMode = (filterTriggerMode?.value ?? 'auto');
370
- }
371
- scheduleApply() {
372
- clearTimeout(this.applyTimer);
373
- this.applyTimer = setTimeout(() => {
374
- this.vm.applyFilterAndSort();
375
- }, 50);
376
- }
377
- async onViewChanged(view) {
378
- await this.vm.setView(view.name);
379
- // Sync query param immediately on tab change
380
- this.router.navigate([], {
381
- relativeTo: this.activeRoute,
382
- queryParams: { view: view.name },
383
- queryParamsHandling: 'merge',
384
- replaceUrl: true,
385
- });
386
- this.isInitializing = true;
387
- this.pendingInitialFilters = true;
388
- this.pendingInitialSorts = true;
389
- this.setInitialFiltersFromSettingsOrView();
390
- // Ensure initial load after view change
391
- setTimeout(() => {
392
- this.isInitializing = false;
393
- this.scheduleApply();
394
- }, 0);
395
- }
396
- #effect;
397
- setInitialFiltersFromSettingsOrView() {
398
- const saved = this.vm.filterQueries();
399
- this.previousFilterQueries.set(saved);
400
- const viewConditions = this.vm.view().conditions.map((c) => c.name);
401
- if (saved && saved.length) {
402
- this.initialFilters.set(saved.map((s) => ({ ...s, hidden: viewConditions.includes(s.field) })));
403
- return;
404
- }
405
- this.initialFilters.set(this.vm.view().conditions.map((c) => ({
406
- field: c.name,
407
- operator: c.operator,
408
- value: c.value,
409
- hidden: true,
410
- })));
411
- }
412
- onFiltersChanged(filters) {
413
- if (this.isInitializing || this.pendingInitialFilters) {
414
- this.pendingInitialFilters = false;
415
- return;
416
- }
417
- this.vm.filterQueries.set(filters);
418
- if (this.filterTriggerMode === 'auto') {
419
- this.applyFilters();
420
- }
421
- }
422
- applyFilters() {
423
- this.previousFilterQueries.set(this.vm.filterQueries());
424
- this.vm.saveSettings('filters', this.vm.filterQueries());
425
- this.scheduleApply();
426
- }
427
- onSortQueriesChange(e) {
428
- if (this.isInitializing || this.pendingInitialSorts) {
429
- this.pendingInitialSorts = false;
430
- return;
431
- }
432
- this.vm.sortedFields.set(e.map((s) => ({
433
- name: s.name,
434
- title: s.name,
435
- dir: s.dir,
436
- })));
437
- // Persist sorts per module/entity/view
438
- this.vm.saveSettings('sorts', e);
439
- this.scheduleApply();
440
- }
441
- onColumnsChange(columns) {
442
- const keyOf = (c) => c.column?.options?.dataPath ?? c.name;
443
- this.vm.columns.update((prev) => {
444
- const byKey = new Map(prev.map((c) => [keyOf(c), c]));
445
- return columns.map((newColumn) => {
446
- const existing = byKey.get(keyOf(newColumn));
447
- return new AXPEntityListViewColumnViewModel(existing.property, {
448
- ...existing.column,
449
- options: {
450
- ...existing.column.options,
451
- visible: newColumn.visible,
452
- },
453
- });
454
- });
455
- });
456
- // Persist column order/visibility
457
- this.vm.onColumnsChanged(this.vm.columns());
458
- // Use debounced apply to avoid triple refresh when combined with sorts/filters
459
- // this.scheduleApply();
460
- }
461
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPEntityMasterToolbarViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
462
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXPEntityMasterToolbarViewComponent, isStandalone: true, selector: "axp-entity-master-toolbar-view", inputs: { vm: ["viewModel", "vm"] }, host: { classAttribute: "ax-w-full" }, ngImport: i0, template: "<!-- <axp-entity-view-toolbar [viewModel]=\"vm\"></axp-entity-view-toolbar> -->\n<axp-query-views\n id=\"axp-toolbar-view-selector\"\n [views]=\"viewQueries()\"\n [selectedView]=\"selectedViewQuery()\"\n (selectedViewChange)=\"onViewChanged($event)\"\n></axp-query-views>\n<div class=\"ax-flex ax-items-center ax-gap-2 ax-border-b ax-border-light w-full\">\n <!-- <axp-entity-filter-toolbar [viewModel]=\"vm\"></axp-entity-filter-toolbar> -->\n <axp-query-filters\n id=\"axp-toolbar-filters\"\n [filtersDefinitions]=\"filtersDefinitions()\"\n [initialFilters]=\"initialFilters()\"\n (onFiltersChanged)=\"onFiltersChanged($event)\"\n ></axp-query-filters>\n\n <div class=\"ax-flex ax-items-center ax-gap-2 md:ax-gap-2\">\n @if (filterTriggerMode === 'manual' && isFiltersDirty()) {\n <ax-button\n id=\"axp-toolbar-btn-filter\"\n [title]=\"'@general:actions.apply.title'\"\n [iconOnly]=\"true\"\n #filterButton\n [color]=\"'primary'\"\n (onClick)=\"applyFilters()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-search\"></i>\n </ax-prefix>\n </ax-button>\n }\n <div>\n <ax-button id=\"axp-toolbar-btn-columns\" [iconOnly]=\"true\" #columnButton [color]=\"'default'\">\n <i class=\"fa-light fa-table-columns\"></i>\n </ax-button>\n <ax-popover\n id=\"axp-popover-columns\"\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"30\"\n [target]=\"columnButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n #popover\n >\n <div class=\"ax-lightest-surface ax-shadow-md ax-border md:ax-w-72 ax-w-full ax-rounded-md\">\n <ax-header class=\"ax-border-b ax-lighter-surface ax-rounded-t-md ax-p-4 ax-font-bold\">\n {{ '@general:terms.common.columns' | translate | async }}\n </ax-header>\n <div class=\"ax-py-2 ax-px-4\">\n <axp-query-columns [columns]=\"vm.columns()\" (columnsChange)=\"onColumnsChange($event)\"></axp-query-columns>\n <!-- <axp-list-view-option-columns [viewModel]=\"vm\"></axp-list-view-option-columns> -->\n </div>\n </div>\n </ax-popover>\n </div>\n\n @if (vm.canSort()) {\n <div>\n <ax-button id=\"axp-toolbar-btn-sort\" [iconOnly]=\"true\" [text]=\"'Sorts'\" #sortButton [color]=\"'default'\">\n <i class=\"fa-light fa-sort-amount-up\"></i>\n </ax-button>\n <ax-popover\n id=\"axp-popover-sort\"\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"10\"\n [target]=\"sortButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n #popover\n >\n <div class=\"ax-lightest-surface ax-shadow-md ax-border md:ax-w-72 ax-w-full ax-rounded-md\">\n <ax-header class=\"ax-border-b ax-lighter-surface ax-rounded-t-md ax-p-4 ax-font-bold\">\n {{ '@general:terms.common.sorts' | translate | async }}\n </ax-header>\n <div class=\"ax-py-2 ax-px-4\">\n <!-- <axp-list-view-option-sorting [viewModel]=\"vm\"></axp-list-view-option-sorting> -->\n <axp-query-sorts\n [sortDefinitions]=\"sortDefinitions()\"\n (sortQueriesChange)=\"onSortQueriesChange($event)\"\n [initialSortQueries]=\"sortQueries()\"\n ></axp-query-sorts>\n </div>\n </div>\n </ax-popover>\n </div>\n }\n @if (layoutService.isSmall()) {\n <ax-button\n id=\"axp-toolbar-btn-category\"\n (onClick)=\"parent.toggleCategoryDrawer()\"\n [iconOnly]=\"true\"\n [color]=\"'default'\"\n >\n <i class=\"fa-light fa-bars\"></i>\n </ax-button>\n }\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$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: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPQueryFiltersComponent, selector: "axp-query-filters", inputs: ["filtersDefinitions", "initialFilters"], outputs: ["onFiltersChanged"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$2.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXPQuerySortsComponent, selector: "axp-query-sorts", inputs: ["sortDefinitions", "initialSortQueries"], outputs: ["sortDefinitionsChange", "sortQueriesChange"] }, { kind: "component", type: AXPQueryViewsComponent, selector: "axp-query-views", inputs: ["views", "selectedView"], outputs: ["viewsChange", "selectedViewChange"] }, { kind: "component", type: AXPQueryColumnsComponent, selector: "axp-query-columns", inputs: ["columns"], outputs: ["columnsChange"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
463
- }
464
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPEntityMasterToolbarViewComponent, decorators: [{
465
- type: Component,
466
- args: [{ selector: 'axp-entity-master-toolbar-view', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
467
- CommonModule,
468
- AXButtonModule,
469
- AXDecoratorModule,
470
- AXTranslationModule,
471
- AXPQueryFiltersComponent,
472
- AXPopoverModule,
473
- AXPQuerySortsComponent,
474
- AXPQueryViewsComponent,
475
- AXPQueryColumnsComponent,
476
- ], host: {
477
- class: 'ax-w-full',
478
- }, template: "<!-- <axp-entity-view-toolbar [viewModel]=\"vm\"></axp-entity-view-toolbar> -->\n<axp-query-views\n id=\"axp-toolbar-view-selector\"\n [views]=\"viewQueries()\"\n [selectedView]=\"selectedViewQuery()\"\n (selectedViewChange)=\"onViewChanged($event)\"\n></axp-query-views>\n<div class=\"ax-flex ax-items-center ax-gap-2 ax-border-b ax-border-light w-full\">\n <!-- <axp-entity-filter-toolbar [viewModel]=\"vm\"></axp-entity-filter-toolbar> -->\n <axp-query-filters\n id=\"axp-toolbar-filters\"\n [filtersDefinitions]=\"filtersDefinitions()\"\n [initialFilters]=\"initialFilters()\"\n (onFiltersChanged)=\"onFiltersChanged($event)\"\n ></axp-query-filters>\n\n <div class=\"ax-flex ax-items-center ax-gap-2 md:ax-gap-2\">\n @if (filterTriggerMode === 'manual' && isFiltersDirty()) {\n <ax-button\n id=\"axp-toolbar-btn-filter\"\n [title]=\"'@general:actions.apply.title'\"\n [iconOnly]=\"true\"\n #filterButton\n [color]=\"'primary'\"\n (onClick)=\"applyFilters()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-search\"></i>\n </ax-prefix>\n </ax-button>\n }\n <div>\n <ax-button id=\"axp-toolbar-btn-columns\" [iconOnly]=\"true\" #columnButton [color]=\"'default'\">\n <i class=\"fa-light fa-table-columns\"></i>\n </ax-button>\n <ax-popover\n id=\"axp-popover-columns\"\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"30\"\n [target]=\"columnButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n #popover\n >\n <div class=\"ax-lightest-surface ax-shadow-md ax-border md:ax-w-72 ax-w-full ax-rounded-md\">\n <ax-header class=\"ax-border-b ax-lighter-surface ax-rounded-t-md ax-p-4 ax-font-bold\">\n {{ '@general:terms.common.columns' | translate | async }}\n </ax-header>\n <div class=\"ax-py-2 ax-px-4\">\n <axp-query-columns [columns]=\"vm.columns()\" (columnsChange)=\"onColumnsChange($event)\"></axp-query-columns>\n <!-- <axp-list-view-option-columns [viewModel]=\"vm\"></axp-list-view-option-columns> -->\n </div>\n </div>\n </ax-popover>\n </div>\n\n @if (vm.canSort()) {\n <div>\n <ax-button id=\"axp-toolbar-btn-sort\" [iconOnly]=\"true\" [text]=\"'Sorts'\" #sortButton [color]=\"'default'\">\n <i class=\"fa-light fa-sort-amount-up\"></i>\n </ax-button>\n <ax-popover\n id=\"axp-popover-sort\"\n [adaptivityEnabled]=\"true\"\n [offsetY]=\"10\"\n [target]=\"sortButton\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n #popover\n >\n <div class=\"ax-lightest-surface ax-shadow-md ax-border md:ax-w-72 ax-w-full ax-rounded-md\">\n <ax-header class=\"ax-border-b ax-lighter-surface ax-rounded-t-md ax-p-4 ax-font-bold\">\n {{ '@general:terms.common.sorts' | translate | async }}\n </ax-header>\n <div class=\"ax-py-2 ax-px-4\">\n <!-- <axp-list-view-option-sorting [viewModel]=\"vm\"></axp-list-view-option-sorting> -->\n <axp-query-sorts\n [sortDefinitions]=\"sortDefinitions()\"\n (sortQueriesChange)=\"onSortQueriesChange($event)\"\n [initialSortQueries]=\"sortQueries()\"\n ></axp-query-sorts>\n </div>\n </div>\n </ax-popover>\n </div>\n }\n @if (layoutService.isSmall()) {\n <ax-button\n id=\"axp-toolbar-btn-category\"\n (onClick)=\"parent.toggleCategoryDrawer()\"\n [iconOnly]=\"true\"\n [color]=\"'default'\"\n >\n <i class=\"fa-light fa-bars\"></i>\n </ax-button>\n }\n </div>\n</div>\n" }]
479
- }], propDecorators: { vm: [{
480
- type: Input,
481
- args: ['viewModel']
482
- }] } });
483
-
484
- class AXPEntityMasterListViewComponent extends AXPPageLayoutBaseComponent {
485
- constructor(platform) {
486
- super();
487
- this.platform = platform;
488
- this.activeRoute = inject(ActivatedRoute);
489
- this.router = inject(Router);
490
- this.vm = this.activeRoute.snapshot.data['vm'];
491
- //
492
- this.store = inject(AXPLayoutThemeService);
493
- //
494
- this.searchBarShown = signal(true, ...(ngDevMode ? [{ debugName: "searchBarShown" }] : []));
495
- this.activeEndSideView = signal('column', ...(ngDevMode ? [{ debugName: "activeEndSideView" }] : []));
496
- this.categorySearchValue = signal('', ...(ngDevMode ? [{ debugName: "categorySearchValue" }] : []));
497
- // @ViewChild('grid', { static: true}) grid: AXDataTableComponent;
498
- this.grid = viewChild('grid', ...(ngDevMode ? [{ debugName: "grid" }] : []));
499
- this.initializedFromRoute = false;
500
- this.commandRowItems = computed(() => {
501
- return this.vm.primaryRowActions().map((c) => {
502
- return {
503
- icon: c.icon,
504
- name: c.name,
505
- text: translateSync(c.title),
506
- color: c.color,
507
- disabled: c.disabled,
508
- default: c.default,
509
- };
510
- });
511
- }, ...(ngDevMode ? [{ debugName: "commandRowItems" }] : []));
512
- this.getDropdownRowItems = (rowData) => {
513
- return Promise.resolve(this.dropdownRowItems(rowData));
514
- };
515
- this.getCommandRowItems = () => {
516
- return this.commandRowItems();
517
- };
518
- effect(() => {
519
- if (this.grid()) {
520
- this.grid().selectedRows = this.vm.selectedItems();
521
- }
522
- });
523
- //
524
- this.vm.events$.subscribe(async (e) => {
525
- const refreshTargetId = e.meta?.refreshTargetId;
526
- if (e.action == 'refresh') {
527
- if (refreshTargetId) {
528
- this.grid()?.refreshItemChildren(refreshTargetId);
529
- }
530
- else {
531
- this.grid()?.refresh({
532
- reset: false,
533
- });
534
- }
535
- }
536
- });
537
- // Keep URL query param `view` in sync with current vm view
538
- effect(() => {
539
- if (!this.initializedFromRoute) {
540
- return;
541
- }
542
- const currentViewName = this.vm.view().name;
543
- const urlView = this.activeRoute.snapshot.queryParamMap.get('view');
544
- if (currentViewName && currentViewName !== urlView) {
545
- this.router.navigate([], {
546
- relativeTo: this.activeRoute,
547
- queryParams: { view: currentViewName },
548
- queryParamsHandling: 'merge',
549
- replaceUrl: true,
550
- });
551
- }
552
- });
553
- }
554
- async ngOnInit() {
555
- // React to external URL changes (back/forward navigation or deep links)
556
- this.queryParamSub = this.activeRoute.queryParamMap.subscribe(async (qp) => {
557
- const viewFromUrl = qp.get('view');
558
- await this.vm.setView(viewFromUrl);
559
- });
560
- }
561
- async ngAfterViewInit() {
562
- const viewFromUrl = this.activeRoute.snapshot.queryParamMap.get('view');
563
- await this.vm.setView(viewFromUrl);
564
- const resolvedView = this.vm.view().name;
565
- const currentUrlView = this.activeRoute.snapshot.queryParamMap.get('view');
566
- if (currentUrlView !== resolvedView) {
567
- this.router.navigate([], {
568
- relativeTo: this.activeRoute,
569
- queryParams: { view: resolvedView },
570
- queryParamsHandling: 'merge',
571
- replaceUrl: true,
572
- });
573
- }
574
- this.initializedFromRoute = true;
575
- }
576
- onColumnSizeChanged(e) {
577
- if (e.isUserInteraction && e.type === 'end') {
578
- this.vm.saveSettings('columnSizes', e.data);
579
- }
580
- }
581
- onPageChanged(e) {
582
- if (e.isUserInteraction) {
583
- const pageSizeChanged = e.take != this.vm.dataSource.pageSize;
584
- if (pageSizeChanged) {
585
- this.vm.saveSettings('pageSize', e.take);
586
- }
587
- }
588
- }
589
- onColumnsOrderChanged(e) {
590
- if (e.isUserInteraction) {
591
- this.vm.onColumnsOrderChanged(e.data.event);
592
- }
593
- }
594
- async dropdownRowItems(rowData) {
595
- return (await this.vm.secondaryRowActions(rowData)).map((c) => ({
596
- icon: c.icon,
597
- name: c.name,
598
- text: c.title,
599
- color: c.color,
600
- disabled: c.disabled,
601
- default: c.default,
602
- divided: c.separated,
603
- }));
604
- }
605
- async handleRowDbClick(e) {
606
- if (this.grid()?.dataSource.isLoading) {
607
- return;
608
- }
609
- const allItems = [...this.commandRowItems(), ...(await this.dropdownRowItems(e.data))];
610
- // const defaultAction = allItems.find((c) => (c as any).default) || allItems[0];
611
- const defaultAction = allItems.find((c) => {
612
- const commandName = c.name.split('&')[0];
613
- return (c.default || commandName === 'open-entity') && !c.disabled;
614
- });
615
- if (!defaultAction) {
616
- return;
617
- }
618
- const d = {
619
- component: e.component,
620
- name: defaultAction.name,
621
- data: e.data,
622
- };
623
- this.handleRowCommandClick(d);
624
- }
625
- async handleRowCommandClick(e) {
626
- if (this.grid()?.dataSource.isLoading) {
627
- return;
628
- }
629
- this.vm.executeCommand(e.name, e.data);
630
- }
631
- async handleSelectedRowsChange(rows) {
632
- this.vm.selectedItems.set(rows);
633
- }
634
- makeResponsive(value) {
635
- if (this.platform.is('Mobile') || this.platform.is('SM')) {
636
- return '';
637
- }
638
- else {
639
- return value;
640
- }
641
- }
642
- toggleSideBar(sideBar) {
643
- this.toggleEndSide();
644
- if (sideBar) {
645
- this.activeEndSideView.set(sideBar);
646
- }
647
- }
648
- toggleSearchBar() {
649
- this.searchBarShown.update((v) => !v);
650
- }
651
- handleResetClick(sideBar) {
652
- switch (sideBar) {
653
- case 'filter': {
654
- this.vm.resetFilters();
655
- break;
656
- }
657
- case 'sort': {
658
- this.vm.resetSorts();
659
- break;
660
- }
661
- case 'column': {
662
- this.vm.resetColumns();
663
- break;
664
- }
665
- }
666
- }
667
- // protected handleDiscardClick(sideBar: 'filter' | 'sort' | 'column') {
668
- // switch (sideBar) {
669
- // case 'filter': {
670
- // this.vm.discardFilters();
671
- // break;
672
- // }
673
- // case 'sort': {
674
- // this.vm.resetSorts();
675
- // break;
676
- // }
677
- // case 'column': {
678
- // this.vm.resetColumns();
679
- // break;
680
- // }
681
- // }
682
- // }
683
- handleApplyClick(sideBar) {
684
- this.vm.applyFilterAndSort();
685
- this.toggleEndSide();
686
- }
687
- ngOnDestroy() {
688
- this.queryParamSub?.unsubscribe();
689
- this.vm.destroy();
690
- }
691
- toggleCategoryDrawer() {
692
- this.toggleStartSide();
693
- }
694
- getPageTitle() {
695
- return this.vm.title();
696
- }
697
- async getPageDescription() {
698
- const description = this.vm.description();
699
- if (description) {
700
- return this.translateService.translateAsync(description);
701
- }
702
- return '';
703
- }
704
- getPageBreadcrumbs() {
705
- return this.vm.beardcrumbs();
706
- }
707
- async getPrimaryMenuItems() {
708
- return (await this.vm.getPrimaryActions()).map((tr) => ({
709
- name: tr.name,
710
- title: tr.title,
711
- icon: tr.icon,
712
- color: tr.color,
713
- disabled: tr.disabled,
714
- command: {
715
- name: tr.name,
716
- options: tr.options,
717
- metadata: tr.metadata,
718
- },
719
- }));
720
- }
721
- async getSecondaryMenuItems() {
722
- return (await this.vm.getSecondaryActions()).map((tr) => ({
723
- name: tr.name,
724
- title: tr.title,
725
- icon: tr.icon,
726
- color: tr.color,
727
- disabled: tr.disabled,
728
- separated: tr.separated,
729
- command: {
730
- name: tr.name,
731
- options: tr.options,
732
- metadata: tr.metadata,
733
- },
734
- }));
735
- }
736
- async execute(command) {
737
- if (command) {
738
- this.vm.execute(command);
739
- }
740
- }
741
- handleUnselectAll() {
742
- this.vm.selectedItems.set([]);
743
- }
744
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPEntityMasterListViewComponent, deps: [{ token: i1$1.AXPlatform }], target: i0.ɵɵFactoryTarget.Component }); }
745
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXPEntityMasterListViewComponent, isStandalone: true, selector: "axp-entity-master-list", providers: [
746
- {
747
- provide: AXPPageLayoutBase,
748
- useExisting: AXPEntityMasterListViewComponent,
749
- },
750
- ], viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n @if (vm.entityDef.category) {\n <axp-layout-start-side id=\"axp-entity-category-drawer\">\n <axp-entity-category\n id=\"axp-entity-category\"\n class=\"ax-w-80\"\n [vm]=\"vm\"\n [searchValue]=\"categorySearchValue()\"\n ></axp-entity-category>\n </axp-layout-start-side>\n }\n <axp-page-toolbar id=\"axp-entity-toolbar\">\n <axp-entity-master-toolbar-view [viewModel]=\"vm\"></axp-entity-master-toolbar-view>\n </axp-page-toolbar>\n <axp-page-content class=\"ax-overflow-auto ax-pt-0\">\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-1 ax-pb-1\"\n [class.ax-invisible]=\"!grid.selectedRows.length\"\n >\n <span\n >{{ grid.selectedRows.length }}\n <span>{{ '@general:terms.interface.items-selected' | translate | async }}</span>\n </span>\n <ax-button text=\"@general:terms.interface.unselect-all\" class=\"ax-xs\" (onClick)=\"handleUnselectAll()\"></ax-button>\n </div>\n <ax-data-table\n id=\"axp-entity-table\"\n [allowReordering]=\"true\"\n (onColumnsOrderChanged)=\"onColumnsOrderChanged($event)\"\n #grid\n [showFooter]=\"false\"\n class=\"ax-flex-1\"\n [paging]=\"true\"\n [fetchDataMode]=\"'manual'\"\n [parentField]=\"vm.parentKey()\"\n [loading]=\"{ enabled: true, animation: true }\"\n [dataSource]=\"vm.dataSource\"\n (selectedRowsChange)=\"handleSelectedRowsChange($event)\"\n (onRowDbClick)=\"handleRowDbClick($event)\"\n (onColumnSizeChanged)=\"onColumnSizeChanged($event)\"\n (onPageChanged)=\"onPageChanged($event)\"\n >\n @if (vm.view().indexCol === true) {\n <ax-index-column id=\"axp-table-col-index\" fixed=\"start\" [width]=\"'80px'\" [padZero]=\"true\"></ax-index-column>\n }\n @if (vm.selectedScopeActionsCount()) {\n <ax-select-column id=\"axp-table-col-select\" fixed=\"start\" [width]=\"'60px'\"></ax-select-column>\n }\n @for (col of vm.columns(); track col.name) {\n @if (col.visible) {\n <axp-widget-column-renderer\n [attr.id]=\"'axp-table-col-' + col.name\"\n [expandHandler]=\"$index === 0 && vm.parentKey() ? true : false\"\n [caption]=\"(col.title | translate | async)!\"\n [node]=\"col.node()\"\n [customWidth]=\"col.width\"\n ></axp-widget-column-renderer>\n }\n }\n @if (getCommandRowItems().length) {\n <ax-command-column\n id=\"axp-table-col-commands\"\n fixed=\"end\"\n [width]=\"getCommandRowItems().length * 60 + 'px'\"\n [items]=\"getCommandRowItems()\"\n (onItemClick)=\"handleRowCommandClick($event)\"\n ></ax-command-column>\n }\n <ax-dropdown-command-column\n id=\"axp-table-col-dropdown-commands\"\n fixed=\"end\"\n [width]=\"'60px'\"\n [items]=\"getDropdownRowItems\"\n (onItemClick)=\"handleRowCommandClick($event)\"\n ></ax-dropdown-command-column>\n </ax-data-table>\n </axp-page-content>\n</axp-page-layout>\n", styles: ["axp-entity-master-list axp-layout-start-side{min-width:20rem!important;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))}axp-entity-master-list axp-layout-header{padding-bottom:.25rem!important}.cdk-drag-preview{border-radius:.375rem;border-width:1px;--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background:rgba(var(--ax-color-on-surface));padding:.5rem;height:max-content!important}.collapsed-search-box{margin-top:0;height:0px;opacity:0}.view-drawer{width:85vw}@media (min-width: 768px){.view-drawer{width:45vw}}@media (min-width: 1024px){.view-drawer{width:35vw}}@media (min-width: 1536px){.view-drawer{width:20vw}}.view-drawer{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lightest-surface),var(--tw-bg-opacity, 1));border-inline-start-width:1px;border-inline-start-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));border-top-width:1px;--tw-border-opacity: 1;border-top-color:rgba(var(--ax-sys-color-primary-600),var(--tw-border-opacity, 1))}.view-drawer ax-header{display:flex;align-items:center;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lighter-surface),var(--tw-bg-opacity, 1));padding:.5rem 1rem}.view-drawer ax-header h2{font-size:1.25rem;line-height:1.75rem;font-weight:700;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lighter-surface),var(--tw-text-opacity, 1))}.view-drawer ax-footer{position:absolute!important;bottom:0!important;width:100%!important;justify-content:flex-start!important;border-top-width:1px!important;--tw-border-opacity: 1 !important;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1))!important;padding:.5rem 1rem!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3$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: "ngmodule", type: AXBadgeModule }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXActionSheetModule }, { kind: "ngmodule", type: AXDrawerModule }, { kind: "ngmodule", type: AXDialogModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXTabsModule }, { kind: "ngmodule", type: AXTooltipModule }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "ngmodule", type: AXDataTableModule }, { kind: "component", type: i7.AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: i7.AXRowIndexColumnComponent, selector: "ax-index-column", inputs: ["width", "caption", "fixed", "footerTemplate", "padZero"] }, { kind: "component", type: i7.AXRowSelectColumnComponent, selector: "ax-select-column", inputs: ["width", "caption", "fixed"] }, { kind: "component", type: i7.AXRowCommandColumnComponent, selector: "ax-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "items"], outputs: ["onItemClick"] }, { kind: "component", type: i7.AXRowDropdownCommandColumnComponent, selector: "ax-dropdown-command-column", inputs: ["width", "caption", "fixed", "footerTemplate", "emptyStateTemplate", "emptyStateText", "items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i10.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: DragDropModule }, { kind: "ngmodule", type:
751
- //
752
- AXPWidgetCoreModule }, { kind: "component", type: i7$1.AXPWidgetColumnRendererComponent, selector: "axp-widget-column-renderer", inputs: ["caption", "customExpandIcon", "customCollapseIcon", "customWidth", "node", "footerTemplate", "expandHandler", "cellTemplate", "headerTemplate"] }, { kind: "ngmodule", type: AXPWidgetsModule }, { kind: "ngmodule", type: AXPAuthModule }, { kind: "component", type:
753
- //
754
- AXPEntityMasterToolbarViewComponent, selector: "axp-entity-master-toolbar-view", inputs: ["viewModel"] }, { kind: "component", type:
755
- //
756
- 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: AXPThemeLayoutStartSideComponent, selector: "axp-layout-page-start-side, axp-layout-start-side" }, { kind: "component", type: AXPEntityCategoryComponent, selector: "axp-entity-category", inputs: ["vm", "searchValue"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i10.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
757
- }
758
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPEntityMasterListViewComponent, decorators: [{
759
- type: Component,
760
- args: [{ selector: 'axp-entity-master-list', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
761
- CommonModule,
762
- FormsModule,
763
- RouterModule,
764
- AXButtonModule,
765
- AXDecoratorModule,
766
- AXBadgeModule,
767
- AXDropdownModule,
768
- AXPopoverModule,
769
- AXFormModule,
770
- AXActionSheetModule,
771
- AXDrawerModule,
772
- AXDialogModule,
773
- AXLoadingModule,
774
- AXTabsModule,
775
- AXTooltipModule,
776
- AXBreadcrumbsModule,
777
- AXDropdownButtonModule,
778
- AXSearchBoxModule,
779
- AXDataTableModule,
780
- AXTranslationModule,
781
- DragDropModule,
782
- //
783
- AXPWidgetCoreModule,
784
- AXPWidgetsModule,
785
- AXPAuthModule,
786
- //
787
- AXPEntityMasterToolbarViewComponent,
788
- //
789
- AXPPageLayoutComponent,
790
- AXPThemeLayoutBlockComponent,
791
- AXDropdownButtonModule,
792
- AXPThemeLayoutStartSideComponent,
793
- AXPEntityCategoryComponent,
794
- ], providers: [
795
- {
796
- provide: AXPPageLayoutBase,
797
- useExisting: AXPEntityMasterListViewComponent,
798
- },
799
- ], template: "<axp-page-layout *translate=\"let t\">\n @if (vm.entityDef.category) {\n <axp-layout-start-side id=\"axp-entity-category-drawer\">\n <axp-entity-category\n id=\"axp-entity-category\"\n class=\"ax-w-80\"\n [vm]=\"vm\"\n [searchValue]=\"categorySearchValue()\"\n ></axp-entity-category>\n </axp-layout-start-side>\n }\n <axp-page-toolbar id=\"axp-entity-toolbar\">\n <axp-entity-master-toolbar-view [viewModel]=\"vm\"></axp-entity-master-toolbar-view>\n </axp-page-toolbar>\n <axp-page-content class=\"ax-overflow-auto ax-pt-0\">\n <div\n class=\"ax-flex ax-items-center ax-justify-between ax-gap-1 ax-pb-1\"\n [class.ax-invisible]=\"!grid.selectedRows.length\"\n >\n <span\n >{{ grid.selectedRows.length }}\n <span>{{ '@general:terms.interface.items-selected' | translate | async }}</span>\n </span>\n <ax-button text=\"@general:terms.interface.unselect-all\" class=\"ax-xs\" (onClick)=\"handleUnselectAll()\"></ax-button>\n </div>\n <ax-data-table\n id=\"axp-entity-table\"\n [allowReordering]=\"true\"\n (onColumnsOrderChanged)=\"onColumnsOrderChanged($event)\"\n #grid\n [showFooter]=\"false\"\n class=\"ax-flex-1\"\n [paging]=\"true\"\n [fetchDataMode]=\"'manual'\"\n [parentField]=\"vm.parentKey()\"\n [loading]=\"{ enabled: true, animation: true }\"\n [dataSource]=\"vm.dataSource\"\n (selectedRowsChange)=\"handleSelectedRowsChange($event)\"\n (onRowDbClick)=\"handleRowDbClick($event)\"\n (onColumnSizeChanged)=\"onColumnSizeChanged($event)\"\n (onPageChanged)=\"onPageChanged($event)\"\n >\n @if (vm.view().indexCol === true) {\n <ax-index-column id=\"axp-table-col-index\" fixed=\"start\" [width]=\"'80px'\" [padZero]=\"true\"></ax-index-column>\n }\n @if (vm.selectedScopeActionsCount()) {\n <ax-select-column id=\"axp-table-col-select\" fixed=\"start\" [width]=\"'60px'\"></ax-select-column>\n }\n @for (col of vm.columns(); track col.name) {\n @if (col.visible) {\n <axp-widget-column-renderer\n [attr.id]=\"'axp-table-col-' + col.name\"\n [expandHandler]=\"$index === 0 && vm.parentKey() ? true : false\"\n [caption]=\"(col.title | translate | async)!\"\n [node]=\"col.node()\"\n [customWidth]=\"col.width\"\n ></axp-widget-column-renderer>\n }\n }\n @if (getCommandRowItems().length) {\n <ax-command-column\n id=\"axp-table-col-commands\"\n fixed=\"end\"\n [width]=\"getCommandRowItems().length * 60 + 'px'\"\n [items]=\"getCommandRowItems()\"\n (onItemClick)=\"handleRowCommandClick($event)\"\n ></ax-command-column>\n }\n <ax-dropdown-command-column\n id=\"axp-table-col-dropdown-commands\"\n fixed=\"end\"\n [width]=\"'60px'\"\n [items]=\"getDropdownRowItems\"\n (onItemClick)=\"handleRowCommandClick($event)\"\n ></ax-dropdown-command-column>\n </ax-data-table>\n </axp-page-content>\n</axp-page-layout>\n", styles: ["axp-entity-master-list axp-layout-start-side{min-width:20rem!important;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))}axp-entity-master-list axp-layout-header{padding-bottom:.25rem!important}.cdk-drag-preview{border-radius:.375rem;border-width:1px;--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);background:rgba(var(--ax-color-on-surface));padding:.5rem;height:max-content!important}.collapsed-search-box{margin-top:0;height:0px;opacity:0}.view-drawer{width:85vw}@media (min-width: 768px){.view-drawer{width:45vw}}@media (min-width: 1024px){.view-drawer{width:35vw}}@media (min-width: 1536px){.view-drawer{width:20vw}}.view-drawer{--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lightest-surface),var(--tw-bg-opacity, 1));border-inline-start-width:1px;border-inline-start-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));border-top-width:1px;--tw-border-opacity: 1;border-top-color:rgba(var(--ax-sys-color-primary-600),var(--tw-border-opacity, 1))}.view-drawer ax-header{display:flex;align-items:center;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lighter-surface),var(--tw-bg-opacity, 1));padding:.5rem 1rem}.view-drawer ax-header h2{font-size:1.25rem;line-height:1.75rem;font-weight:700;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lighter-surface),var(--tw-text-opacity, 1))}.view-drawer ax-footer{position:absolute!important;bottom:0!important;width:100%!important;justify-content:flex-start!important;border-top-width:1px!important;--tw-border-opacity: 1 !important;border-color:rgba(var(--ax-sys-color-border-lightest-surface),var(--tw-border-opacity, 1))!important;padding:.5rem 1rem!important}\n"] }]
800
- }], ctorParameters: () => [{ type: i1$1.AXPlatform }], propDecorators: { grid: [{ type: i0.ViewChild, args: ['grid', { isSignal: true }] }] } });
801
-
802
- export { AXPEntityMasterListViewComponent };
803
- //# sourceMappingURL=acorex-platform-themes-default-entity-master-list-view.component-CD7rJIMh.mjs.map