@acorex/modules 19.2.7 → 19.2.9

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 (107) hide show
  1. package/application-management/lib/layouts/module-entity-detail-view/module-entity-detail-view.component.d.ts +3 -0
  2. package/conversation/lib/entities/chat/chat.module.d.ts +2 -3
  3. package/fesm2022/acorex-modules-application-management.mjs +15 -2
  4. package/fesm2022/acorex-modules-application-management.mjs.map +1 -1
  5. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-HwJJs-3A.mjs → acorex-modules-auth-acorex-modules-auth-D1qxdECo.mjs} +8 -8
  6. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-HwJJs-3A.mjs.map → acorex-modules-auth-acorex-modules-auth-D1qxdECo.mjs.map} +1 -1
  7. package/fesm2022/{acorex-modules-auth-app-chooser.component-BvxMkXPp.mjs → acorex-modules-auth-app-chooser.component-8GCTwtb2.mjs} +2 -2
  8. package/fesm2022/{acorex-modules-auth-app-chooser.component-BvxMkXPp.mjs.map → acorex-modules-auth-app-chooser.component-8GCTwtb2.mjs.map} +1 -1
  9. package/fesm2022/{acorex-modules-auth-login.module-CDvLUxls.mjs → acorex-modules-auth-login.module-DR3QLEM-.mjs} +4 -4
  10. package/fesm2022/{acorex-modules-auth-login.module-CDvLUxls.mjs.map → acorex-modules-auth-login.module-DR3QLEM-.mjs.map} +1 -1
  11. package/fesm2022/{acorex-modules-auth-master.layout-CnKBnl8W.mjs → acorex-modules-auth-master.layout-BMJ5mW63.mjs} +4 -4
  12. package/fesm2022/{acorex-modules-auth-master.layout-CnKBnl8W.mjs.map → acorex-modules-auth-master.layout-BMJ5mW63.mjs.map} +1 -1
  13. package/fesm2022/{acorex-modules-auth-password.component-C16jeHuJ.mjs → acorex-modules-auth-password.component-EXWlXGez.mjs} +2 -2
  14. package/fesm2022/{acorex-modules-auth-password.component-C16jeHuJ.mjs.map → acorex-modules-auth-password.component-EXWlXGez.mjs.map} +1 -1
  15. package/fesm2022/{acorex-modules-auth-password.component-1FnIjiZ8.mjs → acorex-modules-auth-password.component-avrMwyr8.mjs} +2 -2
  16. package/fesm2022/{acorex-modules-auth-password.component-1FnIjiZ8.mjs.map → acorex-modules-auth-password.component-avrMwyr8.mjs.map} +1 -1
  17. package/fesm2022/{acorex-modules-auth-routes-ZDDUhAWd.mjs → acorex-modules-auth-routes-BPYBFOxg.mjs} +2 -2
  18. package/fesm2022/{acorex-modules-auth-routes-ZDDUhAWd.mjs.map → acorex-modules-auth-routes-BPYBFOxg.mjs.map} +1 -1
  19. package/fesm2022/{acorex-modules-auth-two-factor.module-C32MVGby.mjs → acorex-modules-auth-two-factor.module-B_V_nQN_.mjs} +2 -2
  20. package/fesm2022/{acorex-modules-auth-two-factor.module-C32MVGby.mjs.map → acorex-modules-auth-two-factor.module-B_V_nQN_.mjs.map} +1 -1
  21. package/fesm2022/acorex-modules-auth.mjs +1 -1
  22. package/fesm2022/acorex-modules-conversation.mjs +3 -8
  23. package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
  24. package/fesm2022/{acorex-modules-form-template-management-acorex-modules-form-template-management-DGGKoVbL.mjs → acorex-modules-form-template-management-acorex-modules-form-template-management-gE7jDpjq.mjs} +99 -7
  25. package/fesm2022/acorex-modules-form-template-management-acorex-modules-form-template-management-gE7jDpjq.mjs.map +1 -0
  26. package/fesm2022/{acorex-modules-form-template-management-category.entity-B1X2QyYV.mjs → acorex-modules-form-template-management-category.entity-BaX5yaK9.mjs} +2 -2
  27. package/fesm2022/{acorex-modules-form-template-management-category.entity-B1X2QyYV.mjs.map → acorex-modules-form-template-management-category.entity-BaX5yaK9.mjs.map} +1 -1
  28. package/fesm2022/{acorex-modules-form-template-management-setting.provider-D-HyCbH7.mjs → acorex-modules-form-template-management-setting.provider-h3v_4sR9.mjs} +2 -2
  29. package/fesm2022/{acorex-modules-form-template-management-setting.provider-D-HyCbH7.mjs.map → acorex-modules-form-template-management-setting.provider-h3v_4sR9.mjs.map} +1 -1
  30. package/fesm2022/{acorex-modules-form-template-management-template-widget-edit.component-CyZLM6M9.mjs → acorex-modules-form-template-management-template-widget-edit.component-GxCDqH9d.mjs} +2 -2
  31. package/fesm2022/{acorex-modules-form-template-management-template-widget-edit.component-CyZLM6M9.mjs.map → acorex-modules-form-template-management-template-widget-edit.component-GxCDqH9d.mjs.map} +1 -1
  32. package/fesm2022/{acorex-modules-form-template-management-template.entity-DXIhxJeU.mjs → acorex-modules-form-template-management-template.entity-CzmbpLj_.mjs} +33 -2
  33. package/fesm2022/acorex-modules-form-template-management-template.entity-CzmbpLj_.mjs.map +1 -0
  34. package/fesm2022/acorex-modules-form-template-management-viewer-popup.component-CJKcMi8Q.mjs +93 -0
  35. package/fesm2022/acorex-modules-form-template-management-viewer-popup.component-CJKcMi8Q.mjs.map +1 -0
  36. package/fesm2022/acorex-modules-form-template-management.mjs +1 -1
  37. package/fesm2022/{acorex-modules-organization-management-add-item.component-D0tN7Se4.mjs → acorex-modules-organization-management-add-item.component-PhQRBTtI.mjs} +22 -16
  38. package/fesm2022/acorex-modules-organization-management-add-item.component-PhQRBTtI.mjs.map +1 -0
  39. package/fesm2022/{acorex-modules-organization-management-branch.entity-CbmnpHl2.mjs → acorex-modules-organization-management-branch.entity-CxxFiBPd.mjs} +48 -4
  40. package/fesm2022/acorex-modules-organization-management-branch.entity-CxxFiBPd.mjs.map +1 -0
  41. package/fesm2022/{acorex-modules-organization-management-department.entity-Dl7y4Rva.mjs → acorex-modules-organization-management-department.entity-BxyeK3lU.mjs} +48 -4
  42. package/fesm2022/acorex-modules-organization-management-department.entity-BxyeK3lU.mjs.map +1 -0
  43. package/fesm2022/{acorex-modules-organization-management-division.entity-Ckmu2Tj9.mjs → acorex-modules-organization-management-division.entity-Dh54R4es.mjs} +48 -4
  44. package/fesm2022/acorex-modules-organization-management-division.entity-Dh54R4es.mjs.map +1 -0
  45. package/fesm2022/{acorex-modules-organization-management-employment-type.entity-9aOaYT_-.mjs → acorex-modules-organization-management-employment-type.entity-aNkt-l_e.mjs} +48 -4
  46. package/fesm2022/acorex-modules-organization-management-employment-type.entity-aNkt-l_e.mjs.map +1 -0
  47. package/fesm2022/{acorex-modules-organization-management-org-chart-configuration.page-BzjTyYyS.mjs → acorex-modules-organization-management-org-chart-configuration.page-DjzqBdaS.mjs} +4 -4
  48. package/fesm2022/acorex-modules-organization-management-org-chart-configuration.page-DjzqBdaS.mjs.map +1 -0
  49. package/fesm2022/{acorex-modules-organization-management-org-chart-configuration.service-DObuNZKQ.mjs → acorex-modules-organization-management-org-chart-configuration.service-QLdDEdqL.mjs} +4 -3
  50. package/fesm2022/acorex-modules-organization-management-org-chart-configuration.service-QLdDEdqL.mjs.map +1 -0
  51. package/fesm2022/{acorex-modules-organization-management-org-chart.page-Cz4ENQRa.mjs → acorex-modules-organization-management-org-chart.page-BSh18amn.mjs} +181 -110
  52. package/fesm2022/acorex-modules-organization-management-org-chart.page-BSh18amn.mjs.map +1 -0
  53. package/fesm2022/{acorex-modules-organization-management-position.entity-DDkiBefn.mjs → acorex-modules-organization-management-position.entity-B7ceEEbu.mjs} +49 -5
  54. package/fesm2022/acorex-modules-organization-management-position.entity-B7ceEEbu.mjs.map +1 -0
  55. package/fesm2022/acorex-modules-organization-management.mjs +8 -15
  56. package/fesm2022/acorex-modules-organization-management.mjs.map +1 -1
  57. package/fesm2022/acorex-modules-platform-management.mjs +476 -245
  58. package/fesm2022/acorex-modules-platform-management.mjs.map +1 -1
  59. package/fesm2022/acorex-modules-security-management.mjs +3 -3
  60. package/fesm2022/acorex-modules-security-management.mjs.map +1 -1
  61. package/form-template-management/lib/features/viewer/viewer-connector.service.d.ts +12 -0
  62. package/form-template-management/lib/features/viewer/viewer-popup.component.d.ts +23 -0
  63. package/form-template-management/lib/features/viewer/workflows/open-template.workflow.d.ts +9 -0
  64. package/organization-management/lib/entities/branch/branch.types.d.ts +1 -0
  65. package/organization-management/lib/entities/department/department.types.d.ts +1 -0
  66. package/organization-management/lib/entities/division/division.types.d.ts +1 -0
  67. package/organization-management/lib/entities/employment-type/employment-type.types.d.ts +1 -0
  68. package/organization-management/lib/entities/position/position.types.d.ts +1 -0
  69. package/organization-management/lib/features/organization-chart/add-item/add-item.component.d.ts +5 -3
  70. package/organization-management/lib/features/organization-chart/org-chart-configuration.page.d.ts +3 -0
  71. package/organization-management/lib/features/organization-chart/org-chart-configuration.service.d.ts +2 -6
  72. package/organization-management/lib/features/organization-chart/org-chart.page.d.ts +3 -0
  73. package/organization-management/lib/features/organization-chart/org-chart.service.d.ts +16 -13
  74. package/organization-management/lib/features/organization-chart/org-chart.type.d.ts +5 -5
  75. package/package.json +5 -5
  76. package/platform-management/lib/common/index.d.ts +1 -0
  77. package/platform-management/lib/common/regional/index.d.ts +1 -0
  78. package/platform-management/lib/common/regional/language-slot/language-slot.component.d.ts +1 -1
  79. package/platform-management/lib/entities/check-version.d.ts +1 -0
  80. package/platform-management/lib/entities/data-source/coulmn-def.widget.d.ts +11 -0
  81. package/platform-management/lib/entities/data-source/data-source.types.d.ts +2 -1
  82. package/platform-management/lib/entities/data-source/datasource-provider.dynamic.d.ts +2 -0
  83. package/fesm2022/acorex-modules-form-template-management-acorex-modules-form-template-management-DGGKoVbL.mjs.map +0 -1
  84. package/fesm2022/acorex-modules-form-template-management-template.entity-DXIhxJeU.mjs.map +0 -1
  85. package/fesm2022/acorex-modules-organization-management-add-item.component-D0tN7Se4.mjs.map +0 -1
  86. package/fesm2022/acorex-modules-organization-management-branch.entity-CbmnpHl2.mjs.map +0 -1
  87. package/fesm2022/acorex-modules-organization-management-department.entity-Dl7y4Rva.mjs.map +0 -1
  88. package/fesm2022/acorex-modules-organization-management-division.entity-Ckmu2Tj9.mjs.map +0 -1
  89. package/fesm2022/acorex-modules-organization-management-employment-type.entity-9aOaYT_-.mjs.map +0 -1
  90. package/fesm2022/acorex-modules-organization-management-org-chart-configuration.page-BzjTyYyS.mjs.map +0 -1
  91. package/fesm2022/acorex-modules-organization-management-org-chart-configuration.service-DObuNZKQ.mjs.map +0 -1
  92. package/fesm2022/acorex-modules-organization-management-org-chart.page-Cz4ENQRa.mjs.map +0 -1
  93. package/fesm2022/acorex-modules-organization-management-position.entity-DDkiBefn.mjs.map +0 -1
  94. package/fesm2022/acorex-modules-platform-management-countries-CuJVdPLt.mjs +0 -19
  95. package/fesm2022/acorex-modules-platform-management-countries-CuJVdPLt.mjs.map +0 -1
  96. package/fesm2022/acorex-modules-platform-management-currencies-vgPg4Hj3.mjs +0 -13
  97. package/fesm2022/acorex-modules-platform-management-currencies-vgPg4Hj3.mjs.map +0 -1
  98. package/fesm2022/acorex-modules-platform-management-regional-formats-BaHofjWg.mjs +0 -14
  99. package/fesm2022/acorex-modules-platform-management-regional-formats-BaHofjWg.mjs.map +0 -1
  100. package/fesm2022/acorex-modules-platform-management-timezones-BoScbn0h.mjs +0 -15
  101. package/fesm2022/acorex-modules-platform-management-timezones-BoScbn0h.mjs.map +0 -1
  102. package/platform-management/lib/common/regional/data/countries.d.ts +0 -2
  103. package/platform-management/lib/common/regional/data/currencies.d.ts +0 -2
  104. package/platform-management/lib/common/regional/data/regional-formats.d.ts +0 -2
  105. package/platform-management/lib/common/regional/data/timezones.d.ts +0 -2
  106. package/platform-management/lib/common/regional/regional-util.service.d.ts +0 -12
  107. package/platform-management/lib/common/regional/regional.types.d.ts +0 -37
@@ -21,12 +21,14 @@ import { inject, Injectable, signal, viewChild, NgZone, ViewContainerRef, afterN
21
21
  import { RouterModule } from '@angular/router';
22
22
  import get from 'lodash-es/get';
23
23
  import { AXMOrganizationManagementDepartmentEntityService, AXMOrganizationManagementDivisionEntityService, AXMOrganizationManagementBranchEntityService, AXMOrganizationManagementEmployeeEntityService, AXMOrganizationManagementPositionEntityService, AXMOrganizationManagementChartEntityService, AXMOrganizationNodeType, AXM_ORG_CHART_NODE_TYPE_ENTITY_MAPPINGS, RootConfig, AXMOrganizationNodeTypeCategory } from './acorex-modules-organization-management.mjs';
24
- import { A as AXMOrgChartConfigService } from './acorex-modules-organization-management-org-chart-configuration.service-DObuNZKQ.mjs';
24
+ import { A as AXMOrgChartConfigService } from './acorex-modules-organization-management-org-chart-configuration.service-QLdDEdqL.mjs';
25
25
  import { AXLoadingDialogService } from '@acorex/components/loading-dialog';
26
- import { AXPExportService, AXPDataGenerator } from '@acorex/platform/common';
26
+ import { AXPExportService, AXPRegionalService, AXPDataGenerator } from '@acorex/platform/common';
27
+ import { AXDialogService } from '@acorex/components/dialog';
28
+ import { AXPopupService } from '@acorex/components/popup';
27
29
  import { AXPSessionService } from '@acorex/platform/auth';
30
+ import { applyFilterArray } from '@acorex/platform/core';
28
31
  import { cloneDeep } from 'lodash-es';
29
- import { AXPopupService } from '@acorex/components/popup';
30
32
  import set from 'lodash-es/set';
31
33
 
32
34
  /**
@@ -169,7 +171,10 @@ class AXMOrgChartService {
169
171
  this.configService = inject(AXMOrgChartConfigService);
170
172
  this.popupService = inject(AXPopupService);
171
173
  this.layoutService = inject(AXPLayoutThemeService);
172
- this._rootNode = signal({ id: AXPDataGenerator.uuid(), title: "Company" });
174
+ this.regionalService = inject(AXPRegionalService);
175
+ this.dialogService = inject(AXDialogService);
176
+ this.translateService = inject(AXTranslationService);
177
+ this._rootNode = signal({ id: AXPDataGenerator.uuid(), title: 'Company' });
173
178
  this.rootNode = this._rootNode.asReadonly();
174
179
  // The clipboard holds the node being cut or copied.
175
180
  this.clipboard = signal(null);
@@ -179,9 +184,7 @@ class AXMOrgChartService {
179
184
  const first = (await this.chartService.query({
180
185
  skip: 0,
181
186
  take: 1,
182
- sort: [
183
- { field: 'version', dir: 'desc' }
184
- ]
187
+ sort: [{ field: 'version', dir: 'desc' }],
185
188
  })).items[0];
186
189
  //
187
190
  if (first) {
@@ -208,19 +211,23 @@ class AXMOrgChartService {
208
211
  id: tenant.id,
209
212
  source: 'tenant',
210
213
  },
211
- children: []
214
+ children: [],
212
215
  },
213
216
  };
214
217
  await this.chartService.insertOne({ data: record.data, version: record.version });
215
218
  }
216
219
  async save() {
217
220
  const first = (await this.chartService.query()).items[0];
218
- await this.chartService.updateOne(first.id, { version: first.version, data: this._rootNode(), updateAt: new Date() });
221
+ await this.chartService.updateOne(first.id, {
222
+ version: first.version,
223
+ data: this._rootNode(),
224
+ updateAt: new Date(),
225
+ });
219
226
  }
220
227
  //#endregion
221
228
  //#region Context Menu
222
229
  async getAllowedAddMenuItems(node) {
223
- const allowedCategories = await this.getAllowedChildCategoriesForParent(node);
230
+ const allowedTypes = await this.getAllowedChildCategoriesForParent(node);
224
231
  const allowedMenuItems = [];
225
232
  // Group items by category for visual breaks.
226
233
  const groupedMenuItems = {
@@ -228,10 +235,10 @@ class AXMOrgChartService {
228
235
  Location: [],
229
236
  BusinessUnit: [],
230
237
  Role: [],
231
- Employee: []
238
+ Employee: [],
232
239
  };
233
240
  Object.entries(AXM_ORG_CHART_NODE_TYPE_ENTITY_MAPPINGS).forEach(([entitySource, config]) => {
234
- if (allowedCategories.includes(config.category)) {
241
+ if (allowedTypes.includes(config.type)) {
235
242
  groupedMenuItems[config.category].push({
236
243
  name: 'add',
237
244
  text: `${config.title}`,
@@ -239,12 +246,12 @@ class AXMOrgChartService {
239
246
  data: {
240
247
  node,
241
248
  config,
242
- source: entitySource
249
+ source: entitySource,
243
250
  },
244
251
  });
245
252
  }
246
253
  });
247
- Object.values(groupedMenuItems).forEach(group => {
254
+ Object.values(groupedMenuItems).forEach((group) => {
248
255
  if (group.length > 0) {
249
256
  allowedMenuItems.push(...group);
250
257
  group[group.length - 1].break = true;
@@ -256,27 +263,32 @@ class AXMOrgChartService {
256
263
  return allowedMenuItems;
257
264
  }
258
265
  //#endregion
259
- //#region Check Permission
266
+ //#region Check Permission
260
267
  async getAllowedChildCategoriesForParent(parent) {
261
268
  await this.configService.load();
262
- const types = this.configService.types; // e.g. ['Company', 'Location', 'BusinessUnit', 'Role', 'Employee']
263
- const currentType = get(parent, 'category');
269
+ const types = this.configService.types;
270
+ const currentType = parent.type;
264
271
  if (!parent || !currentType) {
265
272
  return [];
266
273
  }
267
- const allowedCategories = new Set();
274
+ const allowedTypes = new Set();
268
275
  Object.entries(AXM_ORG_CHART_NODE_TYPE_ENTITY_MAPPINGS).forEach(([entitySource, config]) => {
269
- if (this.configService.isAllowed(currentType, config.category) && types.includes(config.category)) {
270
- allowedCategories.add(config.category);
276
+ if (this.configService.isAllowed(currentType, config.type) && types.includes(config.type)) {
277
+ allowedTypes.add(config.type);
271
278
  }
272
279
  });
273
- return Array.from(allowedCategories);
280
+ return Array.from(allowedTypes);
274
281
  }
275
- //#endregion
282
+ //#endregion
276
283
  //#region Remove/Cut/Copy/Past
277
284
  async removeNode(id) {
278
- this._rootNode.update((node) => this.removeNodeRecursively(node, id));
279
- await this.save();
285
+ const title = await this.translateService.translateAsync('dialogs.delete.title');
286
+ const message = await this.translateService.translateAsync('dialogs.delete.message');
287
+ const dialogResult = await this.dialogService.confirm(title, message, 'danger', 'horizontal');
288
+ if (dialogResult.result) {
289
+ this._rootNode.update((node) => this.removeNodeRecursively(node, id));
290
+ await this.save();
291
+ }
280
292
  }
281
293
  removeNodeRecursively(node, id) {
282
294
  // If the node itself is the one to be deleted, return null
@@ -285,8 +297,9 @@ class AXMOrgChartService {
285
297
  }
286
298
  // Otherwise, recursively check children
287
299
  if (node.children) {
288
- node.children = node.children.filter(child => child.id !== id)
289
- .map(child => {
300
+ node.children = node.children
301
+ .filter((child) => child.id !== id)
302
+ .map((child) => {
290
303
  return { ...child, children: this.removeNodeRecursively(child, id)?.children };
291
304
  });
292
305
  }
@@ -299,23 +312,23 @@ class AXMOrgChartService {
299
312
  if (!this.isPasteAvailable()) {
300
313
  return false;
301
314
  }
302
- const allowedCategories = await this.getAllowedChildCategoriesForParent(target);
315
+ const allowedTypes = await this.getAllowedChildCategoriesForParent(target);
303
316
  // Compare using the clipboard node's category.
304
- return allowedCategories.includes(get(this.clipboard()?.node, 'category'));
317
+ return allowedTypes.includes(this.clipboard()?.node.type);
305
318
  }
306
319
  /**
307
- * Cuts the node with the given id.
308
- * The node is removed from the tree and stored in the clipboard.
309
- * Cutting the root node is not allowed.
310
- */
320
+ * Cuts the node with the given id.
321
+ * The node is removed from the tree and stored in the clipboard.
322
+ * Cutting the root node is not allowed.
323
+ */
311
324
  async cutNode(id) {
312
325
  const tree = this._rootNode();
313
326
  if (tree.id === id) {
314
- throw new Error("Cannot cut the root node.");
327
+ throw new Error('Cannot cut the root node.');
315
328
  }
316
329
  const result = this.findNodeAndParent(tree, id);
317
330
  if (!result) {
318
- throw new Error("Node not found.");
331
+ throw new Error('Node not found.');
319
332
  }
320
333
  // Set the clipboard signal with mode 'cut'
321
334
  this.clipboard.set({ mode: 'cut', node: result.node });
@@ -325,32 +338,32 @@ class AXMOrgChartService {
325
338
  await this.save();
326
339
  }
327
340
  /**
328
- * Copies the node with the given id.
329
- * A deep clone of the node is stored in the clipboard.
330
- */
341
+ * Copies the node with the given id.
342
+ * A deep clone of the node is stored in the clipboard.
343
+ */
331
344
  copyNode(id) {
332
345
  const tree = this._rootNode();
333
346
  const result = this.findNodeAndParent(tree, id);
334
347
  if (!result) {
335
- throw new Error("Node not found.");
348
+ throw new Error('Node not found.');
336
349
  }
337
350
  // Use lodash's cloneDeep to create a deep clone.
338
351
  const copiedNode = cloneDeep(result.node);
339
352
  this.clipboard.set({ mode: 'copy', node: copiedNode });
340
353
  }
341
354
  /**
342
- * Pastes the node in the clipboard as a child of the node with the given parentId.
343
- * For a cut, the node is moved; for a copy, new IDs are generated so the pasted node is unique.
344
- */
355
+ * Pastes the node in the clipboard as a child of the node with the given parentId.
356
+ * For a cut, the node is moved; for a copy, new IDs are generated so the pasted node is unique.
357
+ */
345
358
  async pasteNode(parentId) {
346
359
  const clipboardValue = this.clipboard();
347
360
  if (!clipboardValue) {
348
- throw new Error("Clipboard is empty.");
361
+ throw new Error('Clipboard is empty.');
349
362
  }
350
363
  const tree = this._rootNode();
351
364
  const parentResult = this.findNodeAndParent(tree, parentId);
352
365
  if (!parentResult) {
353
- throw new Error("Parent node not found.");
366
+ throw new Error('Parent node not found.');
354
367
  }
355
368
  let nodeToPaste;
356
369
  if (clipboardValue.mode === 'cut') {
@@ -366,9 +379,9 @@ class AXMOrgChartService {
366
379
  await this.save();
367
380
  }
368
381
  /**
369
- * Recursively searches the tree for the node with the given id,
370
- * returning both the node and its parent.
371
- */
382
+ * Recursively searches the tree for the node with the given id,
383
+ * returning both the node and its parent.
384
+ */
372
385
  findNodeAndParent(node, id, parent = null) {
373
386
  if (node.id === id) {
374
387
  return { node, parent };
@@ -399,7 +412,7 @@ class AXMOrgChartService {
399
412
  assignNewIds(node) {
400
413
  node.id = AXPDataGenerator.uuid();
401
414
  if (node.children) {
402
- node.children.forEach(child => this.assignNewIds(child));
415
+ node.children.forEach((child) => this.assignNewIds(child));
403
416
  }
404
417
  }
405
418
  /**
@@ -413,7 +426,7 @@ class AXMOrgChartService {
413
426
  if (node.children) {
414
427
  return {
415
428
  ...node,
416
- children: node.children.map(child => this.insertNodeRecursively(child, parentId, newNode))
429
+ children: node.children.map((child) => this.insertNodeRecursively(child, parentId, newNode)),
417
430
  };
418
431
  }
419
432
  return node;
@@ -421,61 +434,124 @@ class AXMOrgChartService {
421
434
  //#endregion
422
435
  //#region Add Node
423
436
  async addNode(data) {
424
- console.log(data);
425
437
  this.layoutService.setNavigationLoading(true);
426
- const comp = (await import('./acorex-modules-organization-management-add-item.component-D0tN7Se4.mjs')).AddItemComponent;
427
- const node = get(data, 'node');
428
- const type = get(data, 'config.type');
429
- const source = get(data, 'source');
430
- let query;
431
- switch (type) {
432
- case AXMOrganizationNodeType.Department:
433
- query = this.departmentService.query.bind(this.departmentService);
434
- break;
435
- case AXMOrganizationNodeType.Division:
436
- query = this.divisionService.query.bind(this.divisionService);
437
- break;
438
- case AXMOrganizationNodeType.Branch:
439
- query = this.branchService.query.bind(this.branchService);
440
- break;
441
- case AXMOrganizationNodeType.Position:
442
- query = this.positionService.query.bind(this.positionService);
443
- break;
444
- case AXMOrganizationNodeType.Employee:
445
- query = this.employmentService.query.bind(this.employmentService);
446
- break;
447
- default:
448
- break;
449
- }
450
- const result = await this.popupService.open(comp, {
451
- title: `Add ${get(data, 'config.title')}`,
452
- size: 'md',
453
- data: {
454
- config: {
455
- valueField: 'id',
456
- textField: 'title',
457
- query: query
438
+ try {
439
+ const component = (await import('./acorex-modules-organization-management-add-item.component-PhQRBTtI.mjs')).AddItemComponent;
440
+ const node = get(data, 'node');
441
+ const type = get(data, 'config.type');
442
+ const icon = get(data, 'config.icon');
443
+ const source = get(data, 'source');
444
+ let query;
445
+ const countrySource = async (request) => {
446
+ let list = await this.regionalService.getCountries();
447
+ if (request.filter) {
448
+ list = applyFilterArray(list, [request.filter]);
449
+ }
450
+ const items = list.map((c) => ({
451
+ id: c.code,
452
+ title: c.title,
453
+ }));
454
+ return { items, total: items.length };
455
+ };
456
+ const provinceSource = async (request) => {
457
+ let list = await this.regionalService.getProvinces(node.type === AXMOrganizationNodeType.Country ? node.entity?.id : undefined);
458
+ if (request.filter) {
459
+ list = applyFilterArray(list, [request.filter]);
460
+ }
461
+ const items = list.map((c) => ({
462
+ id: c.code,
463
+ title: c.title,
464
+ }));
465
+ return { items, total: items.length };
466
+ };
467
+ const citySource = async (request) => {
468
+ let filter = {};
469
+ if (node.type === AXMOrganizationNodeType.Country) {
470
+ filter.countryId = node.entity?.id;
471
+ }
472
+ else if (node.type === AXMOrganizationNodeType.State) {
473
+ filter.provinceId = node.entity?.id;
458
474
  }
475
+ let list = await this.regionalService.getCities(filter);
476
+ if (request.filter) {
477
+ list = applyFilterArray(list, [request.filter]);
478
+ }
479
+ const items = list.map((c) => ({
480
+ id: c.code,
481
+ title: c.title,
482
+ }));
483
+ return { items, total: items.length };
484
+ };
485
+ const valueField = 'id';
486
+ const titleField = 'title';
487
+ const subtitleField = null;
488
+ const descriptionField = 'description';
489
+ switch (type) {
490
+ case AXMOrganizationNodeType.Country:
491
+ query = countrySource;
492
+ break;
493
+ case AXMOrganizationNodeType.State:
494
+ query = provinceSource;
495
+ break;
496
+ case AXMOrganizationNodeType.City:
497
+ query = citySource;
498
+ break;
499
+ case AXMOrganizationNodeType.Department:
500
+ query = this.departmentService.query.bind(this.departmentService);
501
+ break;
502
+ case AXMOrganizationNodeType.Division:
503
+ query = this.divisionService.query.bind(this.divisionService);
504
+ break;
505
+ case AXMOrganizationNodeType.Branch:
506
+ query = this.branchService.query.bind(this.branchService);
507
+ break;
508
+ case AXMOrganizationNodeType.Position:
509
+ query = this.positionService.query.bind(this.positionService);
510
+ break;
511
+ case AXMOrganizationNodeType.Employee:
512
+ query = this.employmentService.query.bind(this.employmentService);
513
+ break;
514
+ default:
515
+ throw new Error(`Unsupported node type: ${type}`);
459
516
  }
460
- });
461
- const newNode = {
462
- id: AXPDataGenerator.uuid(),
463
- title: result.data.title,
464
- description: result.data.description,
465
- subtitle: result.data.subtitle,
466
- type: type,
467
- parentId: node.id,
468
- entity: {
469
- id: result.data.id,
470
- source: source
517
+ const result = await this.popupService.open(component, {
518
+ title: `Add ${get(data, 'config.title')}`,
519
+ size: 'md',
520
+ data: {
521
+ config: {
522
+ valueField,
523
+ titleField,
524
+ subtitleField,
525
+ descriptionField,
526
+ query: query,
527
+ },
528
+ },
529
+ });
530
+ if (!result.data) {
531
+ return false;
471
532
  }
472
- };
473
- const tree = this._rootNode();
474
- const newTree = this.insertNodeRecursively(tree, node.id, newNode);
475
- this._rootNode.set(newTree);
476
- await this.save();
477
- this.layoutService.setNavigationLoading(false);
478
- return result.data != null;
533
+ const newNode = {
534
+ id: AXPDataGenerator.uuid(),
535
+ title: result.data.title,
536
+ description: result.data.description,
537
+ subtitle: result.data.subtitle,
538
+ type: type,
539
+ parentId: node.id,
540
+ icon,
541
+ entity: {
542
+ id: result.data.id,
543
+ source: source,
544
+ },
545
+ };
546
+ const tree = this._rootNode();
547
+ const newTree = this.insertNodeRecursively(tree, node.id, newNode);
548
+ this._rootNode.set(newTree);
549
+ await this.save();
550
+ return true;
551
+ }
552
+ finally {
553
+ this.layoutService.setNavigationLoading(false);
554
+ }
479
555
  }
480
556
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
481
557
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartService }); }
@@ -525,13 +601,13 @@ class AXMOrgChartPage {
525
601
  * Zooms in the chart.
526
602
  */
527
603
  zoomIn() {
528
- this.panZoomLevel.update((prev) => prev + 5);
604
+ this.panView()?.zoomIn();
529
605
  }
530
606
  /**
531
607
  * Zooms out the chart.
532
608
  */
533
609
  zoomOut() {
534
- this.panZoomLevel.update((prev) => prev - 5);
610
+ this.panView()?.zoomOut();
535
611
  }
536
612
  /**
537
613
  * Resets the zoom level and pan position of the chart.
@@ -833,7 +909,7 @@ class AXMOrgChartPage {
833
909
  this.clearChart(this.treeContainer().nativeElement);
834
910
  }
835
911
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartPage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
836
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.3", type: AXMOrgChartPage, isStandalone: true, selector: "ng-component", providers: [AXMOrgChartConfigService, AXMOrgChartService, AXMOrgChartPrintService], viewQueries: [{ propertyName: "nodeTemplate", first: true, predicate: ["nodeTemplate"], descendants: true, isSignal: true }, { propertyName: "treeContainer", first: true, predicate: ["chart"], descendants: true, isSignal: true }, { propertyName: "parent", first: true, predicate: ["parent"], descendants: true, isSignal: true }, { propertyName: "contextMenu", first: true, predicate: AXContextMenuComponent, descendants: true, isSignal: true }, { propertyName: "panView", first: true, predicate: AXPanViewDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<axp-layout-simple-page *translate=\"let t\">\n <axp-layout-header>\n <axp-layout-title> {{t(rootConfig.entities.chart.title) | async}} </axp-layout-title>\n\n <axp-layout-description> Clear and dynamic view of your organization's structure </axp-layout-description>\n\n <axp-layout-actions>\n <axp-layout-actions-primary> </axp-layout-actions-primary>\n\n <axp-layout-actions-secondary>\n <ax-button-item [text]=\"(t('print') | async)!\" (onClick)=\"printChart()\">\n <ax-prefix>\n <ax-icon [icon]=\"'fa-solid fa-print'\"> </ax-icon>\n </ax-prefix>\n </ax-button-item>\n </axp-layout-actions-secondary>\n </axp-layout-actions>\n\n <axp-layout-breadcrumbs>\n <ax-breadcrumbs [class.ax-hidden]=\"layout.isSmall()\">\n <ng-template #divider>\n <i class=\"fa-regular fa-slash-forward\"></i>\n </ng-template>\n <ax-breadcrumbs-item> {{(t('home') | async)}} </ax-breadcrumbs-item>\n <ax-breadcrumbs-item> Organization </ax-breadcrumbs-item>\n </ax-breadcrumbs>\n </axp-layout-breadcrumbs>\n </axp-layout-header>\n\n <axp-layout-content class=\"ax-overflow-hidden\">\n <div class=\"ax-h-[calc(100vh-290px)]\" #parent id=\"parent\">\n <div #chart axPanView [(panX)]=\"panX\" [(panY)]=\"panY\" [(zoom)]=\"panZoomLevel\" [fitContent]=\"true\"\n wrapperClasses=\"h\" class=\"ax-light\"></div>\n <ax-context-menu [target]=\"'.axp-chart-node'\" [orientation]=\"'vertical'\" [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\" (onOpening)=\"handleContextMenuOnOpening($event)\">\n </ax-context-menu>\n </div>\n </axp-layout-content>\n <axp-layout-footer>\n <axp-layout-prefix>\n <div class=\"ax-flex ax-gap-1 ax-light ax-flex-wrap ax-justify-center\">\n @let v = {cat:'Company'};\n @for (item of nodeTypes; track $index) {\n <div class=\"axp-node-hint\" [style]=\"getNodeColors(item.color)\" [class.ax-ms-4]=\"v.cat!=item.category\">\n <div class=\"--badge\">\n </div>\n {{item.title}}\n </div>\n {{updateVar(v,item.category)}}\n }\n </div>\n </axp-layout-prefix>\n <axp-layout-suffix>\n <div class=\"ax-flex ax-gap-2 \">\n <ax-button (onClick)=\"zoomOut()\">\n <ax-icon class=\"fa-solid fa-minus\"> </ax-icon>\n </ax-button>\n <ax-button [text]=\"panZoomLevel()\" (onClick)=\"zoomReset()\"></ax-button>\n <ax-button (onClick)=\"zoomIn()\">\n <ax-icon class=\"fa-solid fa-add\"> </ax-icon>\n </ax-button>\n <ax-button (onClick)=\"toggleFullscreen()\">\n <ax-icon>\n <i class=\"fa-solid\" [class]=\"isFullscreen()? 'fa-compress' : 'fa-expand'\"></i>\n </ax-icon>\n </ax-button>\n </div>\n </axp-layout-suffix>\n </axp-layout-footer>\n</axp-layout-simple-page>\n\n<ng-template #nodeTemplate let-data>\n <div>\n @switch (data.category) {\n <!-- Company -->\n @case (NodeTypes.Company) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'primary' }\"></ng-container>\n }\n <!-- Location -->\n @case (NodeTypes.Location) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n }\n <!-- BusinessUnit -->\n @case (NodeTypes.BusinessUnit) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n }\n <!-- Role -->\n @case (NodeTypes.Role) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent3' }\"></ng-container>\n }\n <!-- Employee -->\n @case (NodeTypes.Employee) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'surface' }\"></ng-container>\n }\n }\n </div>\n</ng-template>\n\n<!----------------------------------- General Node Template ----------------------------------->\n<ng-template #generalTemplate let-data=\"data\" let-color=\"color\">\n <div #node class=\"--node-container\" [style]=\"getNodeColors(color)\">\n <div class=\"--container\">\n <div class=\"--heading-container\">\n <div class=\"--content\">\n <div class=\"--icon\">\n <i class=\"fa-light fa-xl fa-fw\" [class]=\"data.icon\"></i>\n </div>\n <div class=\"--titles\">\n <span class=\"--title\">{{data.title}}</span>\n <span class=\"--sub-title\">{{data.subtitle}}</span>\n </div>\n @if(data?.children?.length){\n <div class=\"--badge\">\n <span>{{data?.children?.length ?? 0}}</span>\n </div>\n }\n </div>\n </div>\n <div class=\"--body-container\">\n <div class=\"--description\" [class.ax-pb-3]=\"data.children && data.children.length > 0\">\n {{data.description}}\n </div>\n </div>\n @if(data.children && data.children.length > 0){\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"toggleNode(data,node)\">\n <ax-icon icon=\"fa-solid\" [class]=\"data.isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n</ng-template>", styles: [".axp-node-hint{display:flex;align-items:center;justify-content:center;gap:.25rem;font-size:.75rem;line-height:1rem}.axp-node-hint>div.--badge{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));display:flex;width:.75rem;height:.75rem;align-items:center;justify-content:center;border-radius:.125rem}.axp-chart-node{display:flex;align-items:center;justify-content:center}.axp-chart-node .--node-container{position:relative;cursor:pointer;--node-bg-color: var(--ax-sys-color-primary-surface);--node-text-color: var(--ax-sys-color-on-primary-surface);--node-border-color: var(--ax-sys-color-border-primary-surface)}.axp-chart-node .--node-container .--container{display:flex;max-height:100%;width:100%;flex-direction:column;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);border-color:rgba(var(--node-border-color))}.axp-chart-node .--node-container .--container .--heading-container{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));width:100%;padding:.5rem .75rem}.axp-chart-node .--node-container .--container .--heading-container .--content{display:flex;width:100%;align-items:center;justify-content:center;gap:.5rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--icon{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:2.75rem;height:2.75rem;flex:none;align-items:center;justify-content:center;border-radius:.5rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:1.5rem;height:1.5rem;flex:none;align-items:center;justify-content:center;border-radius:.375rem;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge>span{font-size:.75rem;line-height:1rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles{display:flex;width:100%;flex:1 1 0%;flex-direction:column;gap:.25rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1.125rem;line-height:1.75rem;font-weight:600;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--sub-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--body-container{width:100%;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lightest-surface),var(--tw-bg-opacity, 1));padding:.5rem .75rem;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1))}.axp-chart-node .--node-container .--container .--body-container .--description{text-align:center;font-size:.875rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--toggle{position:absolute;left:0;right:0;bottom:-.75rem;display:flex;width:100%;-webkit-user-select:none;-moz-user-select:-moz-none;user-select:none;align-items:center;justify-content:center}#parent:fullscreen{background-color:rgba(var(--axp-brand-color))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "component", type: AXPSimplePageLayout, selector: "axp-layout-simple-page" }, { kind: "component", type: AXPThemeLayoutBlockComponent, selector: " axp-layout-content, axp-layout-header-container, axp-layout-side-container, axp-layout-sections, axp-layout-section-container, axp-layout-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title, axp-layout-nav-button, axp-layout-description, axp-layout-toolbar, axp-layout-title-bar, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPThemeLayoutHeaderTemplateComponent, selector: "axp-layout-header" }, { kind: "component", type: AXPThemeLayoutActionsComponent, selector: "axp-layout-actions" }, { kind: "component", type: AXPThemeLayoutPageSecondaryActionsComponent, selector: "axp-layout-actions-secondary" }, { kind: "component", type: AXPThemeLayoutPagePrimaryActionsComponent, selector: "axp-layout-actions-primary" }, { kind: "component", type: AXPThemeLayoutFooterComponent, selector: "axp-layout-footer" }, { kind: "ngmodule", type: AXMenuModule }, { kind: "component", type: i2.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i3.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i4.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i5.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i5.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: "directive", type: AXPanViewDirective, selector: "[axPanView]", inputs: ["zoomStep", "minZoom", "maxZoom", "fitContent", "disablePan", "disableZoom", "wrapperClasses", "panX", "panY", "zoom"], outputs: ["panXChange", "panYChange", "zoomChange", "positionChange"], exportAs: ["axPanView"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "component", type: i6.AXBreadCrumbsComponent, selector: "ax-breadcrumbs" }, { kind: "component", type: i6.AXBreadCrumbsItemComponent, selector: "ax-breadcrumbs-item", inputs: ["disabled", "active"] }, { kind: "ngmodule", type: AXBadgeModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
912
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.3", type: AXMOrgChartPage, isStandalone: true, selector: "ng-component", providers: [AXMOrgChartConfigService, AXMOrgChartService, AXMOrgChartPrintService], viewQueries: [{ propertyName: "nodeTemplate", first: true, predicate: ["nodeTemplate"], descendants: true, isSignal: true }, { propertyName: "treeContainer", first: true, predicate: ["chart"], descendants: true, isSignal: true }, { propertyName: "parent", first: true, predicate: ["parent"], descendants: true, isSignal: true }, { propertyName: "contextMenu", first: true, predicate: AXContextMenuComponent, descendants: true, isSignal: true }, { propertyName: "panView", first: true, predicate: AXPanViewDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<axp-layout-simple-page *translate=\"let t\">\n <axp-layout-header>\n <axp-layout-title> {{t(rootConfig.entities.chart.title) | async}} </axp-layout-title>\n\n <axp-layout-description> Clear and dynamic view of your organization's structure </axp-layout-description>\n\n <axp-layout-actions>\n <axp-layout-actions-primary> </axp-layout-actions-primary>\n\n <axp-layout-actions-secondary>\n <ax-button-item [text]=\"(t('print') | async)!\" (onClick)=\"printChart()\">\n <ax-prefix>\n <ax-icon [icon]=\"'fa-solid fa-print'\"> </ax-icon>\n </ax-prefix>\n </ax-button-item>\n </axp-layout-actions-secondary>\n </axp-layout-actions>\n\n <axp-layout-breadcrumbs>\n <ax-breadcrumbs [class.ax-hidden]=\"layout.isSmall()\">\n <ng-template #divider>\n <i class=\"fa-regular fa-slash-forward\"></i>\n </ng-template>\n <ax-breadcrumbs-item> {{(t('home') | async)}} </ax-breadcrumbs-item>\n <ax-breadcrumbs-item> Organization </ax-breadcrumbs-item>\n </ax-breadcrumbs>\n </axp-layout-breadcrumbs>\n </axp-layout-header>\n\n <axp-layout-content class=\"ax-overflow-hidden\">\n <div class=\"ax-h-[calc(100vh-290px)]\" #parent id=\"parent\">\n <div #chart axPanView [(panX)]=\"panX\" [(panY)]=\"panY\" [freeMode]=\"true\" [(zoom)]=\"panZoomLevel\"\n [fitContent]=\"true\" wrapperClasses=\"h\" class=\"ax-light\"></div>\n <ax-context-menu [target]=\"'.axp-chart-node'\" [orientation]=\"'vertical'\" [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\" (onOpening)=\"handleContextMenuOnOpening($event)\">\n </ax-context-menu>\n </div>\n </axp-layout-content>\n <axp-layout-footer>\n <axp-layout-prefix>\n <div class=\"ax-flex ax-gap-1 ax-light ax-flex-wrap ax-justify-center\">\n @let v = {cat:'Company'};\n @for (item of nodeTypes; track $index) {\n <div class=\"axp-node-hint\" [style]=\"getNodeColors(item.color)\" [class.ax-ms-4]=\"v.cat!=item.category\">\n <div class=\"--badge\">\n </div>\n {{item.title}}\n </div>\n {{updateVar(v,item.category)}}\n }\n </div>\n </axp-layout-prefix>\n <axp-layout-suffix>\n <div class=\"ax-flex ax-gap-2 \">\n <ax-button (onClick)=\"zoomOut()\">\n <ax-icon class=\"fa-solid fa-minus\"> </ax-icon>\n </ax-button>\n <ax-button [text]=\"panZoomLevel()\" (onClick)=\"zoomReset()\"></ax-button>\n <ax-button (onClick)=\"zoomIn()\">\n <ax-icon class=\"fa-solid fa-add\"> </ax-icon>\n </ax-button>\n <ax-button (onClick)=\"toggleFullscreen()\">\n <ax-icon>\n <i class=\"fa-solid\" [class]=\"isFullscreen()? 'fa-compress' : 'fa-expand'\"></i>\n </ax-icon>\n </ax-button>\n </div>\n </axp-layout-suffix>\n </axp-layout-footer>\n</axp-layout-simple-page>\n\n<ng-template #nodeTemplate let-data>\n <div>\n @switch (data.category) {\n <!-- Company -->\n @case (NodeTypes.Company) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'primary' }\"></ng-container>\n }\n <!-- Location -->\n @case (NodeTypes.Location) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n }\n <!-- BusinessUnit -->\n @case (NodeTypes.BusinessUnit) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n }\n <!-- Role -->\n @case (NodeTypes.Role) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent3' }\"></ng-container>\n }\n <!-- Employee -->\n @case (NodeTypes.Employee) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'surface' }\"></ng-container>\n }\n }\n </div>\n</ng-template>\n\n<!----------------------------------- General Node Template ----------------------------------->\n<ng-template #generalTemplate let-data=\"data\" let-color=\"color\">\n <div #node class=\"--node-container\" [style]=\"getNodeColors(color)\">\n <div class=\"--container\">\n <div class=\"--heading-container\">\n <div class=\"--content\">\n <div class=\"--icon\">\n <i class=\"fa-light fa-xl fa-fw\" [class]=\"data.icon\"></i>\n </div>\n <div class=\"--titles\">\n <span class=\"--title\">{{data.title}}</span>\n @if(data.subtitle)\n {\n <span class=\"--sub-title\">{{data.subtitle}}</span>\n }\n </div>\n @if(data?.children?.length){\n <div class=\"--badge\">\n <span>{{data?.children?.length ?? 0}}</span>\n </div>\n }\n </div>\n </div>\n @if(data.description)\n {\n <div class=\"--body-container\">\n <div class=\"--description\" [class.ax-pb-3]=\"data.children && data.children.length > 0\">\n {{data.description}}\n </div>\n </div>\n }\n @if(data.children && data.children.length > 0){\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"toggleNode(data,node)\">\n <ax-icon icon=\"fa-solid\" [class]=\"data.isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n</ng-template>", styles: [".axp-node-hint{display:flex;align-items:center;justify-content:center;gap:.25rem;font-size:.75rem;line-height:1rem}.axp-node-hint>div.--badge{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));display:flex;width:.75rem;height:.75rem;align-items:center;justify-content:center;border-radius:.125rem}.axp-chart-node{display:flex;align-items:center;justify-content:center}.axp-chart-node .--node-container{position:relative;cursor:pointer;--node-bg-color: var(--ax-sys-color-primary-surface);--node-text-color: var(--ax-sys-color-on-primary-surface);--node-border-color: var(--ax-sys-color-border-primary-surface)}.axp-chart-node .--node-container .--container{display:flex;max-height:100%;width:100%;flex-direction:column;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);border-color:rgba(var(--node-border-color))}.axp-chart-node .--node-container .--container .--heading-container{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));width:100%;padding:.5rem .75rem}.axp-chart-node .--node-container .--container .--heading-container .--content{display:flex;width:100%;align-items:center;justify-content:center;gap:.5rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--icon{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:2.75rem;height:2.75rem;flex:none;align-items:center;justify-content:center;border-radius:.5rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:1.5rem;height:1.5rem;flex:none;align-items:center;justify-content:center;border-radius:.375rem;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge>span{font-size:.75rem;line-height:1rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles{display:flex;width:100%;flex:1 1 0%;flex-direction:column;gap:.25rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1.125rem;line-height:1.75rem;font-weight:600;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--sub-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--body-container{width:100%;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lightest-surface),var(--tw-bg-opacity, 1));padding:.5rem .75rem;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1))}.axp-chart-node .--node-container .--container .--body-container .--description{text-align:center;font-size:.875rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--toggle{position:absolute;left:0;right:0;bottom:-.75rem;display:flex;width:100%;-webkit-user-select:none;-moz-user-select:-moz-none;user-select:none;align-items:center;justify-content:center}#parent:fullscreen{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "component", type: AXPSimplePageLayout, selector: "axp-layout-simple-page" }, { kind: "component", type: AXPThemeLayoutBlockComponent, selector: " axp-layout-content, axp-layout-header-container, axp-layout-side-container, axp-layout-sections, axp-layout-section-container, axp-layout-body, axp-layout-prefix, axp-layout-suffix, axp-layout-title, axp-layout-nav-button, axp-layout-description, axp-layout-toolbar, axp-layout-title-bar, axp-layout-breadcrumbs, axp-layout-list-action, " }, { kind: "component", type: AXPThemeLayoutHeaderTemplateComponent, selector: "axp-layout-header" }, { kind: "component", type: AXPThemeLayoutActionsComponent, selector: "axp-layout-actions" }, { kind: "component", type: AXPThemeLayoutPageSecondaryActionsComponent, selector: "axp-layout-actions-secondary" }, { kind: "component", type: AXPThemeLayoutPagePrimaryActionsComponent, selector: "axp-layout-actions-primary" }, { kind: "component", type: AXPThemeLayoutFooterComponent, selector: "axp-layout-footer" }, { kind: "ngmodule", type: AXMenuModule }, { kind: "component", type: i2.AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i3.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i3.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i4.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i5.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i5.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: "directive", type: AXPanViewDirective, selector: "[axPanView]", inputs: ["zoomStep", "minZoom", "maxZoom", "freeMode", "fitContent", "disablePan", "disableZoom", "wrapperClasses", "panX", "panY", "zoom"], outputs: ["panXChange", "panYChange", "zoomChange", "positionChange"], exportAs: ["axPanView"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXBreadcrumbsModule }, { kind: "component", type: i6.AXBreadCrumbsComponent, selector: "ax-breadcrumbs" }, { kind: "component", type: i6.AXBreadCrumbsItemComponent, selector: "ax-breadcrumbs-item", inputs: ["disabled", "active"] }, { kind: "ngmodule", type: AXBadgeModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
837
913
  }
838
914
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImport: i0, type: AXMOrgChartPage, decorators: [{
839
915
  type: Component,
@@ -856,13 +932,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.3", ngImpor
856
932
  AXLoadingModule,
857
933
  AXBreadcrumbsModule,
858
934
  AXBadgeModule,
859
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [AXMOrgChartConfigService, AXMOrgChartService, AXMOrgChartPrintService], template: "<axp-layout-simple-page *translate=\"let t\">\n <axp-layout-header>\n <axp-layout-title> {{t(rootConfig.entities.chart.title) | async}} </axp-layout-title>\n\n <axp-layout-description> Clear and dynamic view of your organization's structure </axp-layout-description>\n\n <axp-layout-actions>\n <axp-layout-actions-primary> </axp-layout-actions-primary>\n\n <axp-layout-actions-secondary>\n <ax-button-item [text]=\"(t('print') | async)!\" (onClick)=\"printChart()\">\n <ax-prefix>\n <ax-icon [icon]=\"'fa-solid fa-print'\"> </ax-icon>\n </ax-prefix>\n </ax-button-item>\n </axp-layout-actions-secondary>\n </axp-layout-actions>\n\n <axp-layout-breadcrumbs>\n <ax-breadcrumbs [class.ax-hidden]=\"layout.isSmall()\">\n <ng-template #divider>\n <i class=\"fa-regular fa-slash-forward\"></i>\n </ng-template>\n <ax-breadcrumbs-item> {{(t('home') | async)}} </ax-breadcrumbs-item>\n <ax-breadcrumbs-item> Organization </ax-breadcrumbs-item>\n </ax-breadcrumbs>\n </axp-layout-breadcrumbs>\n </axp-layout-header>\n\n <axp-layout-content class=\"ax-overflow-hidden\">\n <div class=\"ax-h-[calc(100vh-290px)]\" #parent id=\"parent\">\n <div #chart axPanView [(panX)]=\"panX\" [(panY)]=\"panY\" [(zoom)]=\"panZoomLevel\" [fitContent]=\"true\"\n wrapperClasses=\"h\" class=\"ax-light\"></div>\n <ax-context-menu [target]=\"'.axp-chart-node'\" [orientation]=\"'vertical'\" [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\" (onOpening)=\"handleContextMenuOnOpening($event)\">\n </ax-context-menu>\n </div>\n </axp-layout-content>\n <axp-layout-footer>\n <axp-layout-prefix>\n <div class=\"ax-flex ax-gap-1 ax-light ax-flex-wrap ax-justify-center\">\n @let v = {cat:'Company'};\n @for (item of nodeTypes; track $index) {\n <div class=\"axp-node-hint\" [style]=\"getNodeColors(item.color)\" [class.ax-ms-4]=\"v.cat!=item.category\">\n <div class=\"--badge\">\n </div>\n {{item.title}}\n </div>\n {{updateVar(v,item.category)}}\n }\n </div>\n </axp-layout-prefix>\n <axp-layout-suffix>\n <div class=\"ax-flex ax-gap-2 \">\n <ax-button (onClick)=\"zoomOut()\">\n <ax-icon class=\"fa-solid fa-minus\"> </ax-icon>\n </ax-button>\n <ax-button [text]=\"panZoomLevel()\" (onClick)=\"zoomReset()\"></ax-button>\n <ax-button (onClick)=\"zoomIn()\">\n <ax-icon class=\"fa-solid fa-add\"> </ax-icon>\n </ax-button>\n <ax-button (onClick)=\"toggleFullscreen()\">\n <ax-icon>\n <i class=\"fa-solid\" [class]=\"isFullscreen()? 'fa-compress' : 'fa-expand'\"></i>\n </ax-icon>\n </ax-button>\n </div>\n </axp-layout-suffix>\n </axp-layout-footer>\n</axp-layout-simple-page>\n\n<ng-template #nodeTemplate let-data>\n <div>\n @switch (data.category) {\n <!-- Company -->\n @case (NodeTypes.Company) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'primary' }\"></ng-container>\n }\n <!-- Location -->\n @case (NodeTypes.Location) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n }\n <!-- BusinessUnit -->\n @case (NodeTypes.BusinessUnit) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n }\n <!-- Role -->\n @case (NodeTypes.Role) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent3' }\"></ng-container>\n }\n <!-- Employee -->\n @case (NodeTypes.Employee) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'surface' }\"></ng-container>\n }\n }\n </div>\n</ng-template>\n\n<!----------------------------------- General Node Template ----------------------------------->\n<ng-template #generalTemplate let-data=\"data\" let-color=\"color\">\n <div #node class=\"--node-container\" [style]=\"getNodeColors(color)\">\n <div class=\"--container\">\n <div class=\"--heading-container\">\n <div class=\"--content\">\n <div class=\"--icon\">\n <i class=\"fa-light fa-xl fa-fw\" [class]=\"data.icon\"></i>\n </div>\n <div class=\"--titles\">\n <span class=\"--title\">{{data.title}}</span>\n <span class=\"--sub-title\">{{data.subtitle}}</span>\n </div>\n @if(data?.children?.length){\n <div class=\"--badge\">\n <span>{{data?.children?.length ?? 0}}</span>\n </div>\n }\n </div>\n </div>\n <div class=\"--body-container\">\n <div class=\"--description\" [class.ax-pb-3]=\"data.children && data.children.length > 0\">\n {{data.description}}\n </div>\n </div>\n @if(data.children && data.children.length > 0){\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"toggleNode(data,node)\">\n <ax-icon icon=\"fa-solid\" [class]=\"data.isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n</ng-template>", styles: [".axp-node-hint{display:flex;align-items:center;justify-content:center;gap:.25rem;font-size:.75rem;line-height:1rem}.axp-node-hint>div.--badge{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));display:flex;width:.75rem;height:.75rem;align-items:center;justify-content:center;border-radius:.125rem}.axp-chart-node{display:flex;align-items:center;justify-content:center}.axp-chart-node .--node-container{position:relative;cursor:pointer;--node-bg-color: var(--ax-sys-color-primary-surface);--node-text-color: var(--ax-sys-color-on-primary-surface);--node-border-color: var(--ax-sys-color-border-primary-surface)}.axp-chart-node .--node-container .--container{display:flex;max-height:100%;width:100%;flex-direction:column;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);border-color:rgba(var(--node-border-color))}.axp-chart-node .--node-container .--container .--heading-container{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));width:100%;padding:.5rem .75rem}.axp-chart-node .--node-container .--container .--heading-container .--content{display:flex;width:100%;align-items:center;justify-content:center;gap:.5rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--icon{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:2.75rem;height:2.75rem;flex:none;align-items:center;justify-content:center;border-radius:.5rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:1.5rem;height:1.5rem;flex:none;align-items:center;justify-content:center;border-radius:.375rem;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge>span{font-size:.75rem;line-height:1rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles{display:flex;width:100%;flex:1 1 0%;flex-direction:column;gap:.25rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1.125rem;line-height:1.75rem;font-weight:600;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--sub-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--body-container{width:100%;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lightest-surface),var(--tw-bg-opacity, 1));padding:.5rem .75rem;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1))}.axp-chart-node .--node-container .--container .--body-container .--description{text-align:center;font-size:.875rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--toggle{position:absolute;left:0;right:0;bottom:-.75rem;display:flex;width:100%;-webkit-user-select:none;-moz-user-select:-moz-none;user-select:none;align-items:center;justify-content:center}#parent:fullscreen{background-color:rgba(var(--axp-brand-color))}\n"] }]
935
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [AXMOrgChartConfigService, AXMOrgChartService, AXMOrgChartPrintService], template: "<axp-layout-simple-page *translate=\"let t\">\n <axp-layout-header>\n <axp-layout-title> {{t(rootConfig.entities.chart.title) | async}} </axp-layout-title>\n\n <axp-layout-description> Clear and dynamic view of your organization's structure </axp-layout-description>\n\n <axp-layout-actions>\n <axp-layout-actions-primary> </axp-layout-actions-primary>\n\n <axp-layout-actions-secondary>\n <ax-button-item [text]=\"(t('print') | async)!\" (onClick)=\"printChart()\">\n <ax-prefix>\n <ax-icon [icon]=\"'fa-solid fa-print'\"> </ax-icon>\n </ax-prefix>\n </ax-button-item>\n </axp-layout-actions-secondary>\n </axp-layout-actions>\n\n <axp-layout-breadcrumbs>\n <ax-breadcrumbs [class.ax-hidden]=\"layout.isSmall()\">\n <ng-template #divider>\n <i class=\"fa-regular fa-slash-forward\"></i>\n </ng-template>\n <ax-breadcrumbs-item> {{(t('home') | async)}} </ax-breadcrumbs-item>\n <ax-breadcrumbs-item> Organization </ax-breadcrumbs-item>\n </ax-breadcrumbs>\n </axp-layout-breadcrumbs>\n </axp-layout-header>\n\n <axp-layout-content class=\"ax-overflow-hidden\">\n <div class=\"ax-h-[calc(100vh-290px)]\" #parent id=\"parent\">\n <div #chart axPanView [(panX)]=\"panX\" [(panY)]=\"panY\" [freeMode]=\"true\" [(zoom)]=\"panZoomLevel\"\n [fitContent]=\"true\" wrapperClasses=\"h\" class=\"ax-light\"></div>\n <ax-context-menu [target]=\"'.axp-chart-node'\" [orientation]=\"'vertical'\" [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\" (onOpening)=\"handleContextMenuOnOpening($event)\">\n </ax-context-menu>\n </div>\n </axp-layout-content>\n <axp-layout-footer>\n <axp-layout-prefix>\n <div class=\"ax-flex ax-gap-1 ax-light ax-flex-wrap ax-justify-center\">\n @let v = {cat:'Company'};\n @for (item of nodeTypes; track $index) {\n <div class=\"axp-node-hint\" [style]=\"getNodeColors(item.color)\" [class.ax-ms-4]=\"v.cat!=item.category\">\n <div class=\"--badge\">\n </div>\n {{item.title}}\n </div>\n {{updateVar(v,item.category)}}\n }\n </div>\n </axp-layout-prefix>\n <axp-layout-suffix>\n <div class=\"ax-flex ax-gap-2 \">\n <ax-button (onClick)=\"zoomOut()\">\n <ax-icon class=\"fa-solid fa-minus\"> </ax-icon>\n </ax-button>\n <ax-button [text]=\"panZoomLevel()\" (onClick)=\"zoomReset()\"></ax-button>\n <ax-button (onClick)=\"zoomIn()\">\n <ax-icon class=\"fa-solid fa-add\"> </ax-icon>\n </ax-button>\n <ax-button (onClick)=\"toggleFullscreen()\">\n <ax-icon>\n <i class=\"fa-solid\" [class]=\"isFullscreen()? 'fa-compress' : 'fa-expand'\"></i>\n </ax-icon>\n </ax-button>\n </div>\n </axp-layout-suffix>\n </axp-layout-footer>\n</axp-layout-simple-page>\n\n<ng-template #nodeTemplate let-data>\n <div>\n @switch (data.category) {\n <!-- Company -->\n @case (NodeTypes.Company) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'primary' }\"></ng-container>\n }\n <!-- Location -->\n @case (NodeTypes.Location) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n }\n <!-- BusinessUnit -->\n @case (NodeTypes.BusinessUnit) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n }\n <!-- Role -->\n @case (NodeTypes.Role) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent3' }\"></ng-container>\n }\n <!-- Employee -->\n @case (NodeTypes.Employee) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'surface' }\"></ng-container>\n }\n }\n </div>\n</ng-template>\n\n<!----------------------------------- General Node Template ----------------------------------->\n<ng-template #generalTemplate let-data=\"data\" let-color=\"color\">\n <div #node class=\"--node-container\" [style]=\"getNodeColors(color)\">\n <div class=\"--container\">\n <div class=\"--heading-container\">\n <div class=\"--content\">\n <div class=\"--icon\">\n <i class=\"fa-light fa-xl fa-fw\" [class]=\"data.icon\"></i>\n </div>\n <div class=\"--titles\">\n <span class=\"--title\">{{data.title}}</span>\n @if(data.subtitle)\n {\n <span class=\"--sub-title\">{{data.subtitle}}</span>\n }\n </div>\n @if(data?.children?.length){\n <div class=\"--badge\">\n <span>{{data?.children?.length ?? 0}}</span>\n </div>\n }\n </div>\n </div>\n @if(data.description)\n {\n <div class=\"--body-container\">\n <div class=\"--description\" [class.ax-pb-3]=\"data.children && data.children.length > 0\">\n {{data.description}}\n </div>\n </div>\n }\n @if(data.children && data.children.length > 0){\n <div class=\"--toggle\">\n <ax-button class=\"ax-xs ax-rounded-sm\" (onClick)=\"toggleNode(data,node)\">\n <ax-icon icon=\"fa-solid\" [class]=\"data.isExpanded === false ? 'fa-chevron-down' : 'fa-chevron-up'\"></ax-icon>\n </ax-button>\n </div>\n }\n </div>\n </div>\n</ng-template>", styles: [".axp-node-hint{display:flex;align-items:center;justify-content:center;gap:.25rem;font-size:.75rem;line-height:1rem}.axp-node-hint>div.--badge{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));display:flex;width:.75rem;height:.75rem;align-items:center;justify-content:center;border-radius:.125rem}.axp-chart-node{display:flex;align-items:center;justify-content:center}.axp-chart-node .--node-container{position:relative;cursor:pointer;--node-bg-color: var(--ax-sys-color-primary-surface);--node-text-color: var(--ax-sys-color-on-primary-surface);--node-border-color: var(--ax-sys-color-border-primary-surface)}.axp-chart-node .--node-container .--container{display:flex;max-height:100%;width:100%;flex-direction:column;overflow:hidden;border-radius:.375rem;border-width:1px;--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);border-color:rgba(var(--node-border-color))}.axp-chart-node .--node-container .--container .--heading-container{background-color:rgba(var(--node-bg-color));color:rgba(var(--node-text-color));width:100%;padding:.5rem .75rem}.axp-chart-node .--node-container .--container .--heading-container .--content{display:flex;width:100%;align-items:center;justify-content:center;gap:.5rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--icon{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:2.75rem;height:2.75rem;flex:none;align-items:center;justify-content:center;border-radius:.5rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge{background-color:color-mix(in srgb,rgba(var(--node-bg-color),1) 85%,black);display:flex;width:1.5rem;height:1.5rem;flex:none;align-items:center;justify-content:center;border-radius:.375rem;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--badge>span{font-size:.75rem;line-height:1rem}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles{display:flex;width:100%;flex:1 1 0%;flex-direction:column;gap:.25rem;overflow:hidden}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:1.125rem;line-height:1.75rem;font-weight:600;line-height:1}.axp-chart-node .--node-container .--container .--heading-container .--content .--titles .--sub-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.75rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--body-container{width:100%;--tw-bg-opacity: 1;background-color:rgba(var(--ax-sys-color-lightest-surface),var(--tw-bg-opacity, 1));padding:.5rem .75rem;--tw-text-opacity: 1;color:rgba(var(--ax-sys-color-on-lightest-surface),var(--tw-text-opacity, 1))}.axp-chart-node .--node-container .--container .--body-container .--description{text-align:center;font-size:.875rem;line-height:1rem;opacity:.85}.axp-chart-node .--node-container .--container .--toggle{position:absolute;left:0;right:0;bottom:-.75rem;display:flex;width:100%;-webkit-user-select:none;-moz-user-select:-moz-none;user-select:none;align-items:center;justify-content:center}#parent:fullscreen{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}\n"] }]
860
936
  }] });
861
937
 
862
- var orgChart_page = /*#__PURE__*/Object.freeze({
863
- __proto__: null,
864
- AXMOrgChartPage: AXMOrgChartPage
865
- });
866
-
867
- export { AXMOrgChartService as A, orgChart_page as o };
868
- //# sourceMappingURL=acorex-modules-organization-management-org-chart.page-Cz4ENQRa.mjs.map
938
+ export { AXMOrgChartPage };
939
+ //# sourceMappingURL=acorex-modules-organization-management-org-chart.page-BSh18amn.mjs.map