@acorex-platform/module-platform-management-client 0.0.21

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 (45) hide show
  1. package/fesm2022/acorex-platform-module-platform-management-client-acorex-platform-module-platform-management-client-V_ao4WVM.mjs +4599 -0
  2. package/fesm2022/acorex-platform-module-platform-management-client-acorex-platform-module-platform-management-client-V_ao4WVM.mjs.map +1 -0
  3. package/fesm2022/acorex-platform-module-platform-management-client-contracts.mjs +179 -0
  4. package/fesm2022/acorex-platform-module-platform-management-client-contracts.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-module-platform-management-client-create-user-query.command-2Qu7aoCp.mjs +1542 -0
  6. package/fesm2022/acorex-platform-module-platform-management-client-create-user-query.command-2Qu7aoCp.mjs.map +1 -0
  7. package/fesm2022/acorex-platform-module-platform-management-client-create-user-query.types-DdygAori.mjs +71 -0
  8. package/fesm2022/acorex-platform-module-platform-management-client-create-user-query.types-DdygAori.mjs.map +1 -0
  9. package/fesm2022/acorex-platform-module-platform-management-client-customize-menu.command-2319iHsD.mjs +231 -0
  10. package/fesm2022/acorex-platform-module-platform-management-client-customize-menu.command-2319iHsD.mjs.map +1 -0
  11. package/fesm2022/acorex-platform-module-platform-management-client-data-list-pick-entity-item.command-CJVpqPmY.mjs +52 -0
  12. package/fesm2022/acorex-platform-module-platform-management-client-data-list-pick-entity-item.command-CJVpqPmY.mjs.map +1 -0
  13. package/fesm2022/acorex-platform-module-platform-management-client-entity-master-actions-for-ai.util-DmGyoy9o.mjs +55 -0
  14. package/fesm2022/acorex-platform-module-platform-management-client-entity-master-actions-for-ai.util-DmGyoy9o.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-module-platform-management-client-execute-token.command-DNuHR-0y.mjs +152 -0
  16. package/fesm2022/acorex-platform-module-platform-management-client-execute-token.command-DNuHR-0y.mjs.map +1 -0
  17. package/fesm2022/acorex-platform-module-platform-management-client-list-catalog-scopes.query-ByhDTWE6.mjs +71 -0
  18. package/fesm2022/acorex-platform-module-platform-management-client-list-catalog-scopes.query-ByhDTWE6.mjs.map +1 -0
  19. package/fesm2022/acorex-platform-module-platform-management-client-list-editor-widgets.query-DITPMmbw.mjs +68 -0
  20. package/fesm2022/acorex-platform-module-platform-management-client-list-editor-widgets.query-DITPMmbw.mjs.map +1 -0
  21. package/fesm2022/acorex-platform-module-platform-management-client-list-platform-navigation-for-ai.query-2oHMITw-.mjs +194 -0
  22. package/fesm2022/acorex-platform-module-platform-management-client-list-platform-navigation-for-ai.query-2oHMITw-.mjs.map +1 -0
  23. package/fesm2022/acorex-platform-module-platform-management-client-list-registered-entities.query-DjStd3a8.mjs +136 -0
  24. package/fesm2022/acorex-platform-module-platform-management-client-list-registered-entities.query-DjStd3a8.mjs.map +1 -0
  25. package/fesm2022/acorex-platform-module-platform-management-client-list-registered-queries.query-C-IfkTel.mjs +122 -0
  26. package/fesm2022/acorex-platform-module-platform-management-client-list-registered-queries.query-C-IfkTel.mjs.map +1 -0
  27. package/fesm2022/acorex-platform-module-platform-management-client-menu-list.component-C5HH5-Dw.mjs +524 -0
  28. package/fesm2022/acorex-platform-module-platform-management-client-menu-list.component-C5HH5-Dw.mjs.map +1 -0
  29. package/fesm2022/acorex-platform-module-platform-management-client-platform-console-charts.queries-CQ34R13-.mjs +216 -0
  30. package/fesm2022/acorex-platform-module-platform-management-client-platform-console-charts.queries-CQ34R13-.mjs.map +1 -0
  31. package/fesm2022/acorex-platform-module-platform-management-client-platform-console-data.util-BIkULtKk.mjs +81 -0
  32. package/fesm2022/acorex-platform-module-platform-management-client-platform-console-data.util-BIkULtKk.mjs.map +1 -0
  33. package/fesm2022/acorex-platform-module-platform-management-client-platform-console-kpi.queries-BkPdhVq_.mjs +137 -0
  34. package/fesm2022/acorex-platform-module-platform-management-client-platform-console-kpi.queries-BkPdhVq_.mjs.map +1 -0
  35. package/fesm2022/acorex-platform-module-platform-management-client-rest-api-generator-widget-column.component-CYb2zOSj.mjs +45 -0
  36. package/fesm2022/acorex-platform-module-platform-management-client-rest-api-generator-widget-column.component-CYb2zOSj.mjs.map +1 -0
  37. package/fesm2022/acorex-platform-module-platform-management-client-rest-api-generator-widget-edit.component-BBwrzcXa.mjs +178 -0
  38. package/fesm2022/acorex-platform-module-platform-management-client-rest-api-generator-widget-edit.component-BBwrzcXa.mjs.map +1 -0
  39. package/fesm2022/acorex-platform-module-platform-management-client-rest-api-generator-widget-view.component-DBlZVz6u.mjs +45 -0
  40. package/fesm2022/acorex-platform-module-platform-management-client-rest-api-generator-widget-view.component-DBlZVz6u.mjs.map +1 -0
  41. package/fesm2022/acorex-platform-module-platform-management-client.mjs +2 -0
  42. package/fesm2022/acorex-platform-module-platform-management-client.mjs.map +1 -0
  43. package/package.json +28 -0
  44. package/types/acorex-platform-module-platform-management-client-contracts.d.ts +258 -0
  45. package/types/acorex-platform-module-platform-management-client.d.ts +548 -0
@@ -0,0 +1,524 @@
1
+ import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';
2
+ import * as i4 from '@acorex/components/badge';
3
+ import { AXBadgeModule } from '@acorex/components/badge';
4
+ import * as i1 from '@acorex/components/button';
5
+ import { AXButtonModule } from '@acorex/components/button';
6
+ import * as i2 from '@acorex/components/decorators';
7
+ import { AXDecoratorModule } from '@acorex/components/decorators';
8
+ import { AXDialogService } from '@acorex/components/dialog';
9
+ import * as i3 from '@acorex/components/dropdown';
10
+ import { AXDropdownModule } from '@acorex/components/dropdown';
11
+ import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
12
+ import { AXToastService } from '@acorex/components/toast';
13
+ import { AXTreeViewComponent } from '@acorex/components/tree-view';
14
+ import * as i5 from '@acorex/core/translation';
15
+ import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
16
+ import { AXPLayoutBuilderService } from '@acorex-platform/framework-client/layout/builder';
17
+ import { AXPThemeLayoutBlockComponent, AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';
18
+ import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPageLayoutBase } from '@acorex-platform/framework-client/layout/views';
19
+ import * as i1$1 from '@angular/common';
20
+ import { CommonModule } from '@angular/common';
21
+ import * as i0 from '@angular/core';
22
+ import { inject, viewChild, signal, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
23
+ import { ActivatedRoute } from '@angular/router';
24
+ import { Subject, takeUntil } from 'rxjs';
25
+ import { A as AXPMenuManagementService } from './acorex-platform-module-platform-management-client-acorex-platform-module-platform-management-client-V_ao4WVM.mjs';
26
+
27
+ //#region ---- Menu List Component ----
28
+ class AXMMenuListComponent extends AXPPageLayoutBaseComponent {
29
+ constructor() {
30
+ super(...arguments);
31
+ //#region ---- Dependencies ----
32
+ this.menuManagementService = inject(AXPMenuManagementService);
33
+ this.layoutBuilder = inject(AXPLayoutBuilderService);
34
+ this.dialogService = inject(AXDialogService);
35
+ this.toastService = inject(AXToastService);
36
+ this.translationService = inject(AXTranslationService);
37
+ this.route = inject(ActivatedRoute);
38
+ //#endregion
39
+ //#region ---- Component State ----
40
+ this.tree = viewChild(AXTreeViewComponent, /* @ts-ignore */
41
+ ...(ngDevMode ? [{ debugName: "tree" }] : /* istanbul ignore next */ []));
42
+ this.treeNodes = signal([], /* @ts-ignore */
43
+ ...(ngDevMode ? [{ debugName: "treeNodes" }] : /* istanbul ignore next */ []));
44
+ this.isLoading = signal(false, /* @ts-ignore */
45
+ ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
46
+ this.error = signal('', /* @ts-ignore */
47
+ ...(ngDevMode ? [{ debugName: "error" }] : /* istanbul ignore next */ []));
48
+ this.currentScope = signal(AXPPlatformScope.User, /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "currentScope" }] : /* istanbul ignore next */ []));
50
+ this.isSyncing = false; // Prevent concurrent sync operations
51
+ this.destroy$ = new Subject(); // For subscription cleanup
52
+ }
53
+ //#endregion
54
+ //#region ---- Lifecycle ----
55
+ async ngOnInit() {
56
+ await super.ngOnInit();
57
+ // Get scope from route (with memory leak prevention)
58
+ this.route.params.pipe(takeUntil(this.destroy$)).subscribe(async (params) => {
59
+ const scope = params['scope'];
60
+ if (scope) {
61
+ this.currentScope.set(scope);
62
+ await this.loadMenuItems();
63
+ this.recompute(); // Update page header after loading
64
+ }
65
+ });
66
+ }
67
+ ngOnDestroy() {
68
+ this.destroy$.next();
69
+ this.destroy$.complete();
70
+ }
71
+ //#endregion
72
+ //#region ---- Event Handlers ----
73
+ /**
74
+ * Handle before drop validation
75
+ */
76
+ async handleBeforeDrop(e) {
77
+ console.log('[handleBeforeDrop] Event triggered!', {
78
+ movedNode: e.movedNode?.['id'],
79
+ previousParent: e.previousParent?.['id'],
80
+ currentParent: e.currentParent?.['id'],
81
+ previousIndex: e.previousIndex,
82
+ currentIndex: e.currentIndex,
83
+ });
84
+ const targetParent = e.currentParent?.['data'] || null;
85
+ // Prevent dropping into items with paths (leaf nodes)
86
+ if (targetParent?.menuItem?.path) {
87
+ e.canceled = true;
88
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.messages.error.move');
89
+ this.toastService.warning(message);
90
+ return;
91
+ }
92
+ // Note: Circular reference validation is handled by the tree component itself
93
+ // Additional validation can be added here if needed based on business rules
94
+ }
95
+ /**
96
+ * Handle after drop event to sync changes
97
+ * The event contains information about the moved node and its new position
98
+ */
99
+ async handleAfterDrop(event) {
100
+ console.log('[handleAfterDrop] Event triggered!', {
101
+ movedNode: event.node?.['id'],
102
+ movedNodeData: event.node?.['data'],
103
+ previousParent: event.previousParent?.['id'],
104
+ currentParent: event.currentParent?.['id'],
105
+ previousIndex: event.previousIndex,
106
+ currentIndex: event.currentIndex,
107
+ });
108
+ // Check what the tree component has
109
+ const treeComp = this.tree();
110
+ if (treeComp) {
111
+ console.log('[handleAfterDrop] Tree component datasource:', treeComp.datasource);
112
+ }
113
+ // Check our signal
114
+ console.log('[handleAfterDrop] Our treeNodes signal:', this.treeNodes());
115
+ await this.syncTreeChanges();
116
+ }
117
+ //#endregion
118
+ //#region ---- Data Loading ----
119
+ /**
120
+ * Load menu tree for current scope
121
+ */
122
+ async loadMenuItems() {
123
+ try {
124
+ this.isLoading.set(true);
125
+ this.error.set('');
126
+ const treeNodes = await this.menuManagementService.getMenuTreeByScope(this.currentScope());
127
+ this.treeNodes.set(treeNodes);
128
+ this.recompute();
129
+ }
130
+ catch (error) {
131
+ this.error.set(error instanceof Error ? error.message : 'Failed to load menu items');
132
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.messages.error.load');
133
+ this.toastService.danger(message);
134
+ }
135
+ finally {
136
+ this.isLoading.set(false);
137
+ }
138
+ }
139
+ /**
140
+ * Sync tree changes to backend
141
+ */
142
+ async syncTreeChanges() {
143
+ // Prevent concurrent sync operations
144
+ if (this.isSyncing) {
145
+ return;
146
+ }
147
+ try {
148
+ this.isSyncing = true;
149
+ const scope = this.currentScope();
150
+ // Get nodes from signal - the tree component mutates the array in place
151
+ // so this.treeNodes() will have the updated structure after drag-drop
152
+ const nodes = this.treeNodes();
153
+ console.log('[syncTreeChanges] nodes count:', nodes?.length);
154
+ // Log detailed node structure
155
+ const logNode = (n, level = 0) => ({
156
+ id: n['id'],
157
+ title: n['title'],
158
+ level,
159
+ childrenCount: n['children']?.length ?? 0,
160
+ children: n['children']?.map((c) => logNode(c, level + 1)) ?? [],
161
+ });
162
+ console.log('[syncTreeChanges] Full tree structure:', JSON.stringify(nodes?.map(n => logNode(n)), null, 2));
163
+ if (!nodes || nodes.length === 0) {
164
+ console.log('[syncTreeChanges] No nodes to sync');
165
+ return;
166
+ }
167
+ await this.menuManagementService.syncTreeChangesByScope(scope, nodes);
168
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.messages.success.reorder');
169
+ this.toastService.success(message);
170
+ }
171
+ catch (error) {
172
+ console.error('Failed to sync tree changes:', error);
173
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.messages.error.sync');
174
+ this.toastService.danger(message);
175
+ }
176
+ finally {
177
+ this.isSyncing = false;
178
+ }
179
+ }
180
+ //#endregion
181
+ //#region ---- Page Layout Interface ----
182
+ /**
183
+ * Get page title
184
+ */
185
+ async getPageTitle() {
186
+ const scopeName = this.currentScope();
187
+ const scopeKey = scopeName === AXPPlatformScope.User ? 'user' : 'tenant';
188
+ return this.translationService.translateAsync(`@platform-management:menu-management.menus.${scopeKey}.title`);
189
+ }
190
+ /**
191
+ * Get page description
192
+ */
193
+ async getPageDescription() {
194
+ return this.translationService.translateAsync('@platform-management:menu-management.components.menu-list.description');
195
+ }
196
+ /**
197
+ * Get primary menu items (actions)
198
+ */
199
+ async getPrimaryMenuItems() {
200
+ return [
201
+ {
202
+ title: await this.translationService.translateAsync('@platform-management:menu-management.actions.add-root.title'),
203
+ icon: 'fa-light fa-plus',
204
+ color: 'primary',
205
+ command: { name: 'add-root' },
206
+ },
207
+ ];
208
+ }
209
+ /**
210
+ * Get secondary menu items
211
+ */
212
+ async getSecondaryMenuItems() {
213
+ return [
214
+ {
215
+ title: await this.translationService.translateAsync('@platform-management:menu-management.actions.collapse.title'),
216
+ icon: 'fa-light fa-minus-square',
217
+ command: { name: 'collapse' },
218
+ },
219
+ {
220
+ title: await this.translationService.translateAsync('@platform-management:menu-management.actions.expand.title'),
221
+ icon: 'fa-light fa-plus-square',
222
+ command: { name: 'expand' },
223
+ break: true,
224
+ },
225
+ {
226
+ title: await this.translationService.translateAsync('@platform-management:menu-management.actions.reset.title'),
227
+ icon: 'fa-light fa-rotate-left',
228
+ color: 'danger',
229
+ command: { name: 'reset' },
230
+ },
231
+ ];
232
+ }
233
+ /**
234
+ * Execute commands from page actions
235
+ */
236
+ async execute(command) {
237
+ switch (command.name) {
238
+ case 'add-root':
239
+ await this.addRootMenuItem();
240
+ break;
241
+ case 'collapse':
242
+ this.tree()?.collapseAll();
243
+ break;
244
+ case 'expand':
245
+ this.tree()?.expandAll();
246
+ break;
247
+ case 'reset':
248
+ await this.resetCustomizations();
249
+ break;
250
+ }
251
+ }
252
+ //#endregion
253
+ //#region ---- Action Handlers ----
254
+ /**
255
+ * Handle menu item action
256
+ */
257
+ async onAction(action, nodeData) {
258
+ switch (action) {
259
+ case 'show':
260
+ await this.showMenuItem(nodeData);
261
+ break;
262
+ case 'hide':
263
+ await this.hideMenuItem(nodeData);
264
+ break;
265
+ case 'edit':
266
+ await this.editMenuItem(nodeData);
267
+ break;
268
+ case 'delete':
269
+ await this.deleteMenuItem(nodeData);
270
+ break;
271
+ case 'add-child':
272
+ await this.addChildMenuItem(nodeData);
273
+ break;
274
+ }
275
+ }
276
+ /**
277
+ * Add new root menu item
278
+ */
279
+ async addRootMenuItem() {
280
+ await this.showMenuItemDialog(null, null);
281
+ }
282
+ /**
283
+ * Add new child menu item
284
+ */
285
+ async addChildMenuItem(parentNodeData) {
286
+ await this.showMenuItemDialog(null, parentNodeData.menuItem.name);
287
+ }
288
+ /**
289
+ * Reset customizations
290
+ */
291
+ async resetCustomizations() {
292
+ const title = await this.translationService.translateAsync('@platform-management:menu-management.actions.reset.confirm.title');
293
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.actions.reset.confirm.message');
294
+ const confirmed = await this.dialogService.confirm(title, message);
295
+ if (!confirmed)
296
+ return;
297
+ try {
298
+ // Reset customizations for current scope
299
+ await this.menuManagementService.resetCustomizationsByScope(this.currentScope());
300
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.messages.success.reset');
301
+ this.toastService.success(message);
302
+ }
303
+ catch (error) {
304
+ console.error('Failed to reset customizations:', error);
305
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.messages.error.reset');
306
+ this.toastService.danger(message);
307
+ }
308
+ finally {
309
+ // Reload anyway to show current state
310
+ await this.loadMenuItems();
311
+ }
312
+ }
313
+ //#endregion
314
+ //#region ---- Menu Item Actions ----
315
+ /**
316
+ * Show menu item
317
+ */
318
+ async showMenuItem(nodeData) {
319
+ await this.executeMenuAction(() => this.menuManagementService.showMenuItemByScope(this.currentScope(), nodeData.menuItem.name), '@platform-management:menu-management.messages.success.show', '@platform-management:menu-management.messages.error.show');
320
+ }
321
+ /**
322
+ * Hide menu item
323
+ */
324
+ async hideMenuItem(nodeData) {
325
+ await this.executeMenuAction(() => this.menuManagementService.hideMenuItemByScope(this.currentScope(), nodeData.menuItem.name), '@platform-management:menu-management.messages.success.hide', '@platform-management:menu-management.messages.error.hide');
326
+ }
327
+ /**
328
+ * Edit menu item
329
+ */
330
+ async editMenuItem(nodeData) {
331
+ await this.showMenuItemDialog(nodeData);
332
+ }
333
+ /**
334
+ * Delete custom menu item
335
+ */
336
+ async deleteMenuItem(nodeData) {
337
+ const title = await this.translationService.translateAsync('@general:actions.delete.title');
338
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.actions.delete.confirm.message');
339
+ const confirmed = await this.dialogService.confirm(title, message);
340
+ if (!confirmed)
341
+ return;
342
+ try {
343
+ const item = nodeData.menuItem;
344
+ if (!item.name)
345
+ return;
346
+ await this.menuManagementService.deleteCustomMenuItemByScope(this.currentScope(), item.name);
347
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.messages.success.delete');
348
+ this.toastService.success(message);
349
+ await this.loadMenuItems();
350
+ }
351
+ catch (error) {
352
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.messages.error.delete');
353
+ this.toastService.danger(message);
354
+ }
355
+ }
356
+ //#endregion
357
+ //#region ---- Dialog Helpers ----
358
+ /**
359
+ * Show menu item dialog (add/edit)
360
+ */
361
+ async showMenuItemDialog(nodeData, parentName = null) {
362
+ const item = nodeData?.menuItem;
363
+ const isEdit = !!item;
364
+ const title = isEdit
365
+ ? '@platform-management:menu-management.components.edit-dialog.title'
366
+ : '@platform-management:menu-management.components.add-dialog.title';
367
+ const context = {
368
+ name: item?.name || '',
369
+ text: item?.text || '',
370
+ type: item?.type || 'menu',
371
+ icon: item?.icon || '',
372
+ path: item?.path || '',
373
+ priority: item?.priority || 0,
374
+ description: item?.description || '',
375
+ };
376
+ const dialogRef = await this.layoutBuilder
377
+ .create()
378
+ .dialog((dialog) => {
379
+ dialog
380
+ .setTitle(title)
381
+ .setContext(context)
382
+ .content((flex) => {
383
+ flex
384
+ .setDirection('column')
385
+ .formField('@platform-management:menu-management.fields.name', (field) => {
386
+ field.path('name');
387
+ field.textBox({
388
+ placeholder: '@platform-management:menu-management.fields.name',
389
+ validations: [{ rule: 'required' }],
390
+ disabled: isEdit && nodeData?.metadata?.isBuiltIn,
391
+ });
392
+ })
393
+ .formField('@platform-management:menu-management.fields.text', (field) => {
394
+ field.path('text');
395
+ field.textBox({
396
+ placeholder: '@platform-management:menu-management.fields.text',
397
+ validations: [{ rule: 'required' }],
398
+ });
399
+ })
400
+ .formField('@platform-management:menu-management.fields.icon', (field) => {
401
+ field.path('icon');
402
+ field.customWidget('icon-chooser', {});
403
+ })
404
+ .formField('@platform-management:menu-management.fields.path', (field) => {
405
+ field.path('path');
406
+ field.textBox({
407
+ placeholder: '@platform-management:menu-management.fields.path',
408
+ disabled: isEdit && nodeData?.metadata?.isBuiltIn,
409
+ });
410
+ })
411
+ .formField('@platform-management:menu-management.fields.priority', (field) => {
412
+ field.path('priority');
413
+ field.numberBox({
414
+ placeholder: '@platform-management:menu-management.fields.priority',
415
+ step: 10,
416
+ });
417
+ })
418
+ .formField('@platform-management:menu-management.fields.description', (field) => {
419
+ field.path('description');
420
+ field.largeTextBox({
421
+ placeholder: '@platform-management:menu-management.fields.description',
422
+ rows: 3,
423
+ });
424
+ });
425
+ })
426
+ .setActions((actions) => {
427
+ actions.cancel('@general:actions.cancel.title').submit('@general:actions.save.title');
428
+ });
429
+ })
430
+ .show();
431
+ const action = dialogRef.action();
432
+ if (action === 'cancel') {
433
+ dialogRef.close();
434
+ return;
435
+ }
436
+ const formData = dialogRef.context();
437
+ try {
438
+ if (isEdit && item?.name) {
439
+ // Update existing item
440
+ if (nodeData?.metadata?.isCustom) {
441
+ await this.menuManagementService.updateCustomMenuItemByScope(this.currentScope(), item.name, formData);
442
+ }
443
+ else {
444
+ await this.menuManagementService.updateMenuPropertiesByScope(this.currentScope(), item.name, formData);
445
+ }
446
+ }
447
+ else {
448
+ // Add new custom item
449
+ const newItem = {
450
+ name: formData.name,
451
+ text: formData.text,
452
+ icon: formData.icon,
453
+ path: formData.path,
454
+ priority: formData.priority,
455
+ description: formData.description,
456
+ };
457
+ // If parent is specified, add as child
458
+ if (parentName) {
459
+ // Add custom item as child of parent
460
+ await this.menuManagementService.addCustomMenuItemByScope(this.currentScope(), newItem, parentName);
461
+ }
462
+ else {
463
+ // Add as root level item
464
+ await this.menuManagementService.addCustomMenuItemByScope(this.currentScope(), newItem, null);
465
+ }
466
+ }
467
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.messages.success.save');
468
+ this.toastService.success(message);
469
+ await this.loadMenuItems();
470
+ dialogRef.close();
471
+ }
472
+ catch (error) {
473
+ const message = await this.translationService.translateAsync('@platform-management:menu-management.messages.error.save');
474
+ this.toastService.danger(message);
475
+ }
476
+ }
477
+ /**
478
+ * Execute a menu action with common error handling
479
+ */
480
+ async executeMenuAction(action, successMessageKey, errorMessageKey) {
481
+ try {
482
+ await action();
483
+ const message = await this.translationService.translateAsync(successMessageKey);
484
+ this.toastService.success(message);
485
+ await this.loadMenuItems();
486
+ }
487
+ catch (error) {
488
+ console.error('Menu action failed:', error);
489
+ const message = await this.translationService.translateAsync(errorMessageKey);
490
+ this.toastService.danger(message);
491
+ }
492
+ }
493
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMMenuListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
494
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMMenuListComponent, isStandalone: true, selector: "axm-menu-list", host: { classAttribute: "axm-menu-list-page" }, providers: [
495
+ {
496
+ provide: AXPPageLayoutBase,
497
+ useExisting: AXMMenuListComponent,
498
+ },
499
+ ], viewQueries: [{ propertyName: "tree", first: true, predicate: AXTreeViewComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout>\n <axp-page-content>\n @if (isLoading()) {\n <!-- Loading State -->\n <axp-state-message\n mode=\"loading\"\n icon=\"fa-light fa-spinner-third fa-spin\"\n [title]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.loading.title' | translate | async)!\n \"\n [description]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.loading.description'\n | translate\n | async)!\n \"\n />\n } @else if (error()) {\n <!-- Error State -->\n <axp-state-message\n mode=\"error\"\n icon=\"fa-light fa-circle-exclamation\"\n [title]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.error.title' | translate | async)!\n \"\n [description]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.error.description'\n | translate\n | async)!\n \"\n >\n <ax-button\n slot=\"actions\"\n [text]=\"'@general:actions.retry.title' | translate | async\"\n [look]=\"'outline'\"\n [color]=\"'primary'\"\n (onClick)=\"loadMenuItems()\"\n >\n <i class=\"fa-light fa-rotate-left\"></i>\n </ax-button>\n </axp-state-message>\n } @else if (treeNodes().length === 0) {\n <!-- Empty State -->\n <axp-state-message\n mode=\"empty\"\n icon=\"fa-light fa-bars\"\n [title]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.no-data.title' | translate | async)!\n \"\n [description]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.no-data.description'\n | translate\n | async)!\n \"\n >\n <ax-button\n slot=\"actions\"\n [text]=\"'@platform-management:menu-management.actions.add-root.title' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n (onClick)=\"addRootMenuItem()\"\n >\n <i class=\"fa-light fa-plus\"></i>\n </ax-button>\n </axp-state-message>\n } @else {\n <!-- Menu Tree Content -->\n <div class=\"axm-menu-list__container\">\n <!-- Menu Tree -->\n <div class=\"axm-menu-list__tree\">\n <ax-tree-view\n [(datasource)]=\"treeNodes\"\n [look]=\"'default'\"\n [nodeTemplate]=\"itemTemplate\"\n [selectMode]=\"'none'\"\n [showIcons]=\"false\"\n [showChildrenBadge]=\"false\"\n [dragBehavior]=\"'move'\"\n [dragArea]=\"'handler'\"\n (onBeforeDrop)=\"handleBeforeDrop($event)\"\n (onItemsChange)=\"handleAfterDrop($event)\"\n ></ax-tree-view>\n </div>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<!-- Custom Item Template -->\n<ng-template #itemTemplate let-node=\"node\" let-level=\"level\">\n @let nodeData = node['data'];\n @let item = nodeData.menuItem;\n @let metadata = nodeData.metadata;\n <div\n class=\"axm-menu-tree-item__wrapper\"\n [class.axm-menu-tree-item__wrapper--hidden]=\"metadata.isHidden\"\n [class.axm-menu-tree-item__wrapper--custom]=\"metadata.isCustom\"\n [class.axm-menu-tree-item__wrapper--group]=\"item.type === 'group'\"\n >\n <!-- Icon (hidden for groups) -->\n @if (item.icon && item.type !== 'group') {\n <i class=\"axm-menu-tree-item__icon\" [class]=\"item.icon\"></i>\n }\n\n <!-- Text or Info -->\n @if (item.type === 'group') {\n <!-- Group Heading -->\n <span class=\"axm-menu-tree-item__group\">\n <i class=\"fa-light fa-layer-group\"></i>\n {{ item.text | translate | async }}\n </span>\n } @else if (item.type === 'break') {\n <!-- Divider -->\n <span class=\"axm-menu-tree-item__divider\">\n <i class=\"fa-light fa-minus\"></i>\n {{ '@platform-management:menu-management.states.divider' | translate | async }}\n </span>\n } @else if (item.text) {\n <!-- Regular Menu Item -->\n <span class=\"axm-menu-tree-item__text\">\n {{ item.text | translate | async }}\n </span>\n } @else if (item.path) {\n <!-- Path-only Item -->\n <span class=\"axm-menu-tree-item__path\">\n <i class=\"fa-light fa-link\"></i>\n {{ item.path }}\n </span>\n }\n\n <!-- Menu Name/Key -->\n @if (item.name) {\n <code class=\"axm-menu-tree-item__name\">{{ item.name }}</code>\n }\n\n <!-- Status Badges -->\n @if (metadata.isHidden) {\n <ax-badge\n [text]=\"('@platform-management:menu-management.states.hidden' | translate | async)!\"\n color=\"danger\"\n ></ax-badge>\n } @else if (metadata.isCustom) {\n <ax-badge\n [text]=\"('@platform-management:menu-management.states.custom' | translate | async)!\"\n color=\"success\"\n ></ax-badge>\n } @else if (metadata.isBuiltIn) {\n <ax-badge\n [text]=\"('@platform-management:menu-management.states.built-in' | translate | async)!\"\n color=\"primary\"\n ></ax-badge>\n }\n\n <!-- Actions Dropdown -->\n <ax-button class=\"axm-menu-tree-item__actions\" [look]=\"'blank'\" [size]=\"'sm'\" [iconOnly]=\"true\">\n <ax-prefix>\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n </ax-prefix>\n\n <ax-dropdown-panel #panel>\n <ax-button-item-list>\n <!-- Edit (only for items with names) -->\n @if (item.name) {\n <ax-button-item\n [text]=\"('@general:actions.edit.title' | translate | async)!\"\n (onClick)=\"onAction('edit', nodeData); panel.close()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-edit\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n\n <!-- Show/Hide (only for items with names) -->\n @if (item.name && metadata.isBuiltIn) {\n @if (metadata.isHidden) {\n <ax-button-item\n [text]=\"('@platform-management:menu-management.actions.show.title' | translate | async)!\"\n (onClick)=\"onAction('show', nodeData); panel.close()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-eye\"></i>\n </ax-prefix>\n </ax-button-item>\n } @else {\n <ax-button-item\n [text]=\"('@platform-management:menu-management.actions.hide.title' | translate | async)!\"\n (onClick)=\"onAction('hide', nodeData); panel.close()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-eye-slash\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n }\n\n @if (!item.path && (item.type === 'menu' || !item.type)) {\n <!-- Add Child -->\n <ax-button-item\n [text]=\"('@platform-management:menu-management.actions.add-child.title' | translate | async)!\"\n (onClick)=\"onAction('add-child', nodeData); panel.close()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-plus\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n\n <!-- Delete (only for custom items with names) -->\n @if (item.name && metadata.isCustom) {\n <ax-divider></ax-divider>\n <ax-button-item\n [color]=\"'danger'\"\n [text]=\"('@general:actions.delete.title' | translate | async)!\"\n (onClick)=\"onAction('delete', nodeData); panel.close()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-trash\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n\n <!-- Info message for items without names -->\n @if (!item.name) {\n <ax-divider></ax-divider>\n <div class=\"p-2 text-xs text-neutral-500 italic\">\n {{ '@platform-management:menu-management.messages.info.no-name' | translate | async }}\n </div>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n </div>\n</ng-template>\n", styles: ["@layer properties;.axm-menu-list-page .axm-menu-list__container{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 4);padding:calc(var(--spacing, .25rem) * 6)}.axm-menu-list-page .axm-menu-list__tree{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}.axm-menu-list-page .axm-menu-tree-item__wrapper{display:flex;flex:1;align-items:center;gap:calc(var(--spacing, .25rem) * 4);border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:1px;background-color:var(--color-lightest);color:var(--color-on-lightest);border-color:var(--color-border-lightest);padding:calc(var(--spacing, .25rem) * 2);transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s))}.axm-menu-list-page .axm-menu-tree-item__wrapper:hover{background-color:var(--color-lighter);color:var(--color-on-lighter);border-color:var(--color-border-lighter)}.axm-menu-list-page .axm-menu-tree-item__wrapper--hidden{opacity:50%}.axm-menu-list-page .axm-menu-tree-item__wrapper--custom{border-color:rgba(var(--ax-sys-color-primary-surface))}.axm-menu-list-page .axm-menu-tree-item__wrapper--group{padding-block:calc(var(--spacing, .25rem) * 3)}.axm-menu-list-page .axm-menu-tree-item__icon{display:flex;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);align-items:center;justify-content:center;color:rgba(var(--ax-sys-color-primary-surface))}.axm-menu-list-page .axm-menu-tree-item__text{flex:1;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}.axm-menu-list-page .axm-menu-tree-item__group,.axm-menu-list-page .axm-menu-tree-item__divider,.axm-menu-list-page .axm-menu-tree-item__path{display:flex;flex:1;align-items:center;gap:calc(var(--spacing, .25rem) * 2);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:var(--color-neutral-500, oklch(55.6% 0 none));font-style:italic}:is(.axm-menu-list-page .axm-menu-tree-item__divider,.axm-menu-list-page .axm-menu-tree-item__path) i{color:var(--color-neutral-400, oklch(70.8% 0 none))}.axm-menu-list-page .axm-menu-tree-item__name{display:flex;align-items:center;border-radius:.25rem;border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-neutral-200, oklch(92.2% 0 none));background-color:var(--color-neutral-100, oklch(97% 0 none));padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:var(--spacing, .25rem);font-family:var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);white-space:nowrap;color:var(--color-neutral-700, oklch(37.1% 0 none));-webkit-user-select:all;user-select:all}.axm-menu-list-page .axm-menu-tree-item__actions{margin-left:calc(var(--spacing, .25rem) * 2)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { 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: AXDropdownButtonModule }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i3.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXTreeViewComponent, selector: "ax-tree-view", inputs: ["datasource", "selectMode", "selectionBehavior", "dragArea", "dragBehavior", "showIcons", "showChildrenBadge", "expandedIcon", "collapsedIcon", "indentSize", "look", "nodeTemplate", "idField", "titleField", "tooltipField", "iconField", "expandedField", "selectedField", "indeterminateField", "disabledField", "hiddenField", "childrenField", "childrenCountField", "dataField", "inheritDisabled", "expandOnDoubleClick", "doubleClickDuration", "tooltipDelay", "controlledSelection", "selectedIds"], outputs: ["datasourceChange", "selectedIdsChange", "onBeforeDrop", "onNodeToggle", "onNodeSelect", "onNodeDoubleClick", "onNodeClick", "onSelectionChange", "onOrderChange", "onMoveChange", "onItemsChange"] }, { kind: "component", type: 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: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "ngmodule", type: AXBadgeModule }, { kind: "component", type: i4.AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
500
+ }
501
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMMenuListComponent, decorators: [{
502
+ type: Component,
503
+ args: [{ selector: 'axm-menu-list', imports: [
504
+ CommonModule,
505
+ AXButtonModule,
506
+ AXDecoratorModule,
507
+ AXDropdownButtonModule,
508
+ AXDropdownModule,
509
+ AXTranslationModule,
510
+ AXTreeViewComponent,
511
+ AXPPageLayoutComponent,
512
+ AXPThemeLayoutBlockComponent,
513
+ AXPStateMessageComponent,
514
+ AXBadgeModule,
515
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
516
+ {
517
+ provide: AXPPageLayoutBase,
518
+ useExisting: AXMMenuListComponent,
519
+ },
520
+ ], host: { class: 'axm-menu-list-page' }, template: "<axp-page-layout>\n <axp-page-content>\n @if (isLoading()) {\n <!-- Loading State -->\n <axp-state-message\n mode=\"loading\"\n icon=\"fa-light fa-spinner-third fa-spin\"\n [title]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.loading.title' | translate | async)!\n \"\n [description]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.loading.description'\n | translate\n | async)!\n \"\n />\n } @else if (error()) {\n <!-- Error State -->\n <axp-state-message\n mode=\"error\"\n icon=\"fa-light fa-circle-exclamation\"\n [title]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.error.title' | translate | async)!\n \"\n [description]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.error.description'\n | translate\n | async)!\n \"\n >\n <ax-button\n slot=\"actions\"\n [text]=\"'@general:actions.retry.title' | translate | async\"\n [look]=\"'outline'\"\n [color]=\"'primary'\"\n (onClick)=\"loadMenuItems()\"\n >\n <i class=\"fa-light fa-rotate-left\"></i>\n </ax-button>\n </axp-state-message>\n } @else if (treeNodes().length === 0) {\n <!-- Empty State -->\n <axp-state-message\n mode=\"empty\"\n icon=\"fa-light fa-bars\"\n [title]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.no-data.title' | translate | async)!\n \"\n [description]=\"\n ('@platform-management:menu-management.components.menu-list.empty-states.no-data.description'\n | translate\n | async)!\n \"\n >\n <ax-button\n slot=\"actions\"\n [text]=\"'@platform-management:menu-management.actions.add-root.title' | translate | async\"\n [look]=\"'solid'\"\n [color]=\"'primary'\"\n (onClick)=\"addRootMenuItem()\"\n >\n <i class=\"fa-light fa-plus\"></i>\n </ax-button>\n </axp-state-message>\n } @else {\n <!-- Menu Tree Content -->\n <div class=\"axm-menu-list__container\">\n <!-- Menu Tree -->\n <div class=\"axm-menu-list__tree\">\n <ax-tree-view\n [(datasource)]=\"treeNodes\"\n [look]=\"'default'\"\n [nodeTemplate]=\"itemTemplate\"\n [selectMode]=\"'none'\"\n [showIcons]=\"false\"\n [showChildrenBadge]=\"false\"\n [dragBehavior]=\"'move'\"\n [dragArea]=\"'handler'\"\n (onBeforeDrop)=\"handleBeforeDrop($event)\"\n (onItemsChange)=\"handleAfterDrop($event)\"\n ></ax-tree-view>\n </div>\n </div>\n }\n </axp-page-content>\n</axp-page-layout>\n\n<!-- Custom Item Template -->\n<ng-template #itemTemplate let-node=\"node\" let-level=\"level\">\n @let nodeData = node['data'];\n @let item = nodeData.menuItem;\n @let metadata = nodeData.metadata;\n <div\n class=\"axm-menu-tree-item__wrapper\"\n [class.axm-menu-tree-item__wrapper--hidden]=\"metadata.isHidden\"\n [class.axm-menu-tree-item__wrapper--custom]=\"metadata.isCustom\"\n [class.axm-menu-tree-item__wrapper--group]=\"item.type === 'group'\"\n >\n <!-- Icon (hidden for groups) -->\n @if (item.icon && item.type !== 'group') {\n <i class=\"axm-menu-tree-item__icon\" [class]=\"item.icon\"></i>\n }\n\n <!-- Text or Info -->\n @if (item.type === 'group') {\n <!-- Group Heading -->\n <span class=\"axm-menu-tree-item__group\">\n <i class=\"fa-light fa-layer-group\"></i>\n {{ item.text | translate | async }}\n </span>\n } @else if (item.type === 'break') {\n <!-- Divider -->\n <span class=\"axm-menu-tree-item__divider\">\n <i class=\"fa-light fa-minus\"></i>\n {{ '@platform-management:menu-management.states.divider' | translate | async }}\n </span>\n } @else if (item.text) {\n <!-- Regular Menu Item -->\n <span class=\"axm-menu-tree-item__text\">\n {{ item.text | translate | async }}\n </span>\n } @else if (item.path) {\n <!-- Path-only Item -->\n <span class=\"axm-menu-tree-item__path\">\n <i class=\"fa-light fa-link\"></i>\n {{ item.path }}\n </span>\n }\n\n <!-- Menu Name/Key -->\n @if (item.name) {\n <code class=\"axm-menu-tree-item__name\">{{ item.name }}</code>\n }\n\n <!-- Status Badges -->\n @if (metadata.isHidden) {\n <ax-badge\n [text]=\"('@platform-management:menu-management.states.hidden' | translate | async)!\"\n color=\"danger\"\n ></ax-badge>\n } @else if (metadata.isCustom) {\n <ax-badge\n [text]=\"('@platform-management:menu-management.states.custom' | translate | async)!\"\n color=\"success\"\n ></ax-badge>\n } @else if (metadata.isBuiltIn) {\n <ax-badge\n [text]=\"('@platform-management:menu-management.states.built-in' | translate | async)!\"\n color=\"primary\"\n ></ax-badge>\n }\n\n <!-- Actions Dropdown -->\n <ax-button class=\"axm-menu-tree-item__actions\" [look]=\"'blank'\" [size]=\"'sm'\" [iconOnly]=\"true\">\n <ax-prefix>\n <i class=\"fa-light fa-ellipsis-vertical\"></i>\n </ax-prefix>\n\n <ax-dropdown-panel #panel>\n <ax-button-item-list>\n <!-- Edit (only for items with names) -->\n @if (item.name) {\n <ax-button-item\n [text]=\"('@general:actions.edit.title' | translate | async)!\"\n (onClick)=\"onAction('edit', nodeData); panel.close()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-edit\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n\n <!-- Show/Hide (only for items with names) -->\n @if (item.name && metadata.isBuiltIn) {\n @if (metadata.isHidden) {\n <ax-button-item\n [text]=\"('@platform-management:menu-management.actions.show.title' | translate | async)!\"\n (onClick)=\"onAction('show', nodeData); panel.close()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-eye\"></i>\n </ax-prefix>\n </ax-button-item>\n } @else {\n <ax-button-item\n [text]=\"('@platform-management:menu-management.actions.hide.title' | translate | async)!\"\n (onClick)=\"onAction('hide', nodeData); panel.close()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-eye-slash\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n }\n\n @if (!item.path && (item.type === 'menu' || !item.type)) {\n <!-- Add Child -->\n <ax-button-item\n [text]=\"('@platform-management:menu-management.actions.add-child.title' | translate | async)!\"\n (onClick)=\"onAction('add-child', nodeData); panel.close()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-plus\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n\n <!-- Delete (only for custom items with names) -->\n @if (item.name && metadata.isCustom) {\n <ax-divider></ax-divider>\n <ax-button-item\n [color]=\"'danger'\"\n [text]=\"('@general:actions.delete.title' | translate | async)!\"\n (onClick)=\"onAction('delete', nodeData); panel.close()\"\n >\n <ax-prefix>\n <i class=\"fa-light fa-trash\"></i>\n </ax-prefix>\n </ax-button-item>\n }\n\n <!-- Info message for items without names -->\n @if (!item.name) {\n <ax-divider></ax-divider>\n <div class=\"p-2 text-xs text-neutral-500 italic\">\n {{ '@platform-management:menu-management.messages.info.no-name' | translate | async }}\n </div>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n </div>\n</ng-template>\n", styles: ["@layer properties;.axm-menu-list-page .axm-menu-list__container{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 4);padding:calc(var(--spacing, .25rem) * 6)}.axm-menu-list-page .axm-menu-list__tree{display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2)}.axm-menu-list-page .axm-menu-tree-item__wrapper{display:flex;flex:1;align-items:center;gap:calc(var(--spacing, .25rem) * 4);border-radius:var(--radius-md, .375rem);border-style:var(--tw-border-style);border-width:1px;background-color:var(--color-lightest);color:var(--color-on-lightest);border-color:var(--color-border-lightest);padding:calc(var(--spacing, .25rem) * 2);transition-property:all;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function, cubic-bezier(.4, 0, .2, 1)));transition-duration:var(--tw-duration, var(--default-transition-duration, .15s))}.axm-menu-list-page .axm-menu-tree-item__wrapper:hover{background-color:var(--color-lighter);color:var(--color-on-lighter);border-color:var(--color-border-lighter)}.axm-menu-list-page .axm-menu-tree-item__wrapper--hidden{opacity:50%}.axm-menu-list-page .axm-menu-tree-item__wrapper--custom{border-color:rgba(var(--ax-sys-color-primary-surface))}.axm-menu-list-page .axm-menu-tree-item__wrapper--group{padding-block:calc(var(--spacing, .25rem) * 3)}.axm-menu-list-page .axm-menu-tree-item__icon{display:flex;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);align-items:center;justify-content:center;color:rgba(var(--ax-sys-color-primary-surface))}.axm-menu-list-page .axm-menu-tree-item__text{flex:1;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}.axm-menu-list-page .axm-menu-tree-item__group,.axm-menu-list-page .axm-menu-tree-item__divider,.axm-menu-list-page .axm-menu-tree-item__path{display:flex;flex:1;align-items:center;gap:calc(var(--spacing, .25rem) * 2);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:var(--color-neutral-500, oklch(55.6% 0 none));font-style:italic}:is(.axm-menu-list-page .axm-menu-tree-item__divider,.axm-menu-list-page .axm-menu-tree-item__path) i{color:var(--color-neutral-400, oklch(70.8% 0 none))}.axm-menu-list-page .axm-menu-tree-item__name{display:flex;align-items:center;border-radius:.25rem;border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-neutral-200, oklch(92.2% 0 none));background-color:var(--color-neutral-100, oklch(97% 0 none));padding-inline:calc(var(--spacing, .25rem) * 2);padding-block:var(--spacing, .25rem);font-family:var(--font-mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);white-space:nowrap;color:var(--color-neutral-700, oklch(37.1% 0 none));-webkit-user-select:all;user-select:all}.axm-menu-list-page .axm-menu-tree-item__actions{margin-left:calc(var(--spacing, .25rem) * 2)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
521
+ }], propDecorators: { tree: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXTreeViewComponent), { isSignal: true }] }] } });
522
+
523
+ export { AXMMenuListComponent };
524
+ //# sourceMappingURL=acorex-platform-module-platform-management-client-menu-list.component-C5HH5-Dw.mjs.map