@acorex/modules 20.3.0-next.4 → 20.3.0-next.5

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 (86) hide show
  1. package/fesm2022/acorex-modules-content-management.mjs.map +1 -1
  2. package/fesm2022/{acorex-modules-document-management-acorex-modules-document-management-DDriJFmP.mjs → acorex-modules-document-management-acorex-modules-document-management-DhEDQZru.mjs} +122 -80
  3. package/fesm2022/{acorex-modules-document-management-acorex-modules-document-management-DDriJFmP.mjs.map → acorex-modules-document-management-acorex-modules-document-management-DhEDQZru.mjs.map} +1 -1
  4. package/fesm2022/{acorex-modules-document-management-attachment-widget.component-OYJu4IJz.mjs → acorex-modules-document-management-attachment-widget.component-Bx2Ps7uX.mjs} +2 -2
  5. package/fesm2022/{acorex-modules-document-management-attachment-widget.component-OYJu4IJz.mjs.map → acorex-modules-document-management-attachment-widget.component-Bx2Ps7uX.mjs.map} +1 -1
  6. package/fesm2022/{acorex-modules-document-management-create-folder-dialog.component-CZzlGMcu.mjs → acorex-modules-document-management-create-folder-dialog.component-B26m8qWj.mjs} +2 -2
  7. package/fesm2022/{acorex-modules-document-management-create-folder-dialog.component-CZzlGMcu.mjs.map → acorex-modules-document-management-create-folder-dialog.component-B26m8qWj.mjs.map} +1 -1
  8. package/fesm2022/{acorex-modules-document-management-details-view.component-VdV7xGPS.mjs → acorex-modules-document-management-details-view.component-3DmulyK_.mjs} +2 -2
  9. package/fesm2022/{acorex-modules-document-management-details-view.component-VdV7xGPS.mjs.map → acorex-modules-document-management-details-view.component-3DmulyK_.mjs.map} +1 -1
  10. package/fesm2022/{acorex-modules-document-management-document-signature-popup.component-Gi0_m0oe.mjs → acorex-modules-document-management-document-signature-popup.component-DmR6gFdD.mjs} +2 -2
  11. package/fesm2022/{acorex-modules-document-management-document-signature-popup.component-Gi0_m0oe.mjs.map → acorex-modules-document-management-document-signature-popup.component-DmR6gFdD.mjs.map} +1 -1
  12. package/fesm2022/{acorex-modules-document-management-drive-choose.component-BgRZ_nhs.mjs → acorex-modules-document-management-drive-choose.component-BNyPOrzl.mjs} +2 -2
  13. package/fesm2022/{acorex-modules-document-management-drive-choose.component-BgRZ_nhs.mjs.map → acorex-modules-document-management-drive-choose.component-BNyPOrzl.mjs.map} +1 -1
  14. package/fesm2022/{acorex-modules-document-management-drive.component-BRCGsnuI.mjs → acorex-modules-document-management-drive.component-D5X_bI5D.mjs} +2 -2
  15. package/fesm2022/{acorex-modules-document-management-drive.component-BRCGsnuI.mjs.map → acorex-modules-document-management-drive.component-D5X_bI5D.mjs.map} +1 -1
  16. package/fesm2022/{acorex-modules-document-management-large-icons-view.component-CnsPx3K3.mjs → acorex-modules-document-management-large-icons-view.component-AzDtXQqt.mjs} +2 -2
  17. package/fesm2022/{acorex-modules-document-management-large-icons-view.component-CnsPx3K3.mjs.map → acorex-modules-document-management-large-icons-view.component-AzDtXQqt.mjs.map} +1 -1
  18. package/fesm2022/{acorex-modules-document-management-large-tiles-view.component-D4OUme1W.mjs → acorex-modules-document-management-large-tiles-view.component-DCG_v9JT.mjs} +2 -2
  19. package/fesm2022/{acorex-modules-document-management-large-tiles-view.component-D4OUme1W.mjs.map → acorex-modules-document-management-large-tiles-view.component-DCG_v9JT.mjs.map} +1 -1
  20. package/fesm2022/{acorex-modules-document-management-list-view.component-C7i4jI9h.mjs → acorex-modules-document-management-list-view.component-Cb2OVElN.mjs} +2 -2
  21. package/fesm2022/{acorex-modules-document-management-list-view.component-C7i4jI9h.mjs.map → acorex-modules-document-management-list-view.component-Cb2OVElN.mjs.map} +1 -1
  22. package/fesm2022/{acorex-modules-document-management-rename-node-dialog.component-DHVn7RIv.mjs → acorex-modules-document-management-rename-node-dialog.component-B7gcoDDb.mjs} +2 -2
  23. package/fesm2022/{acorex-modules-document-management-rename-node-dialog.component-DHVn7RIv.mjs.map → acorex-modules-document-management-rename-node-dialog.component-B7gcoDDb.mjs.map} +1 -1
  24. package/fesm2022/{acorex-modules-document-management-small-icons-view.component-By36moe5.mjs → acorex-modules-document-management-small-icons-view.component-EN4ttbvx.mjs} +2 -2
  25. package/fesm2022/{acorex-modules-document-management-small-icons-view.component-By36moe5.mjs.map → acorex-modules-document-management-small-icons-view.component-EN4ttbvx.mjs.map} +1 -1
  26. package/fesm2022/{acorex-modules-document-management-small-tiles-view.component-CO6MfsEU.mjs → acorex-modules-document-management-small-tiles-view.component-C-HjbNwe.mjs} +2 -2
  27. package/fesm2022/{acorex-modules-document-management-small-tiles-view.component-CO6MfsEU.mjs.map → acorex-modules-document-management-small-tiles-view.component-C-HjbNwe.mjs.map} +1 -1
  28. package/fesm2022/acorex-modules-document-management.mjs +1 -1
  29. package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-WkDn4mpE.mjs → acorex-modules-human-capital-management-acorex-modules-human-capital-management-BQ_KNd7M.mjs} +23 -12
  30. package/fesm2022/{acorex-modules-human-capital-management-acorex-modules-human-capital-management-WkDn4mpE.mjs.map → acorex-modules-human-capital-management-acorex-modules-human-capital-management-BQ_KNd7M.mjs.map} +1 -1
  31. package/fesm2022/{acorex-modules-human-capital-management-employee-skill.entity-DsUYujPr.mjs → acorex-modules-human-capital-management-employee-skill.entity-3wofaUXu.mjs} +2 -2
  32. package/fesm2022/{acorex-modules-human-capital-management-employee-skill.entity-DsUYujPr.mjs.map → acorex-modules-human-capital-management-employee-skill.entity-3wofaUXu.mjs.map} +1 -1
  33. package/fesm2022/{acorex-modules-human-capital-management-employee.entity-CC-LIIki.mjs → acorex-modules-human-capital-management-employee.entity-1fVathnk.mjs} +10 -8
  34. package/fesm2022/acorex-modules-human-capital-management-employee.entity-1fVathnk.mjs.map +1 -0
  35. package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-Mgkdm2vo.mjs → acorex-modules-human-capital-management-employment-type.entity-BWrwli0P.mjs} +2 -2
  36. package/fesm2022/{acorex-modules-human-capital-management-employment-type.entity-Mgkdm2vo.mjs.map → acorex-modules-human-capital-management-employment-type.entity-BWrwli0P.mjs.map} +1 -1
  37. package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-BJyciZGL.mjs → acorex-modules-human-capital-management-leave-request.entity-4ddc6R_K.mjs} +2 -2
  38. package/fesm2022/{acorex-modules-human-capital-management-leave-request.entity-BJyciZGL.mjs.map → acorex-modules-human-capital-management-leave-request.entity-4ddc6R_K.mjs.map} +1 -1
  39. package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-IewYlMLV.mjs → acorex-modules-human-capital-management-leave-type.entity-DYYJVRju.mjs} +2 -2
  40. package/fesm2022/{acorex-modules-human-capital-management-leave-type.entity-IewYlMLV.mjs.map → acorex-modules-human-capital-management-leave-type.entity-DYYJVRju.mjs.map} +1 -1
  41. package/fesm2022/{acorex-modules-human-capital-management-position-assignment.entity-BlKFRnO0.mjs → acorex-modules-human-capital-management-position-assignment.entity-DIqdhqk4.mjs} +7 -53
  42. package/fesm2022/acorex-modules-human-capital-management-position-assignment.entity-DIqdhqk4.mjs.map +1 -0
  43. package/fesm2022/{acorex-modules-human-capital-management-skill-level.entity-De1qKpcU.mjs → acorex-modules-human-capital-management-skill-level.entity-BN67pBaa.mjs} +2 -2
  44. package/fesm2022/{acorex-modules-human-capital-management-skill-level.entity-De1qKpcU.mjs.map → acorex-modules-human-capital-management-skill-level.entity-BN67pBaa.mjs.map} +1 -1
  45. package/fesm2022/{acorex-modules-human-capital-management-skill.entity-RrnBU0M5.mjs → acorex-modules-human-capital-management-skill.entity-D4CglCC7.mjs} +2 -2
  46. package/fesm2022/{acorex-modules-human-capital-management-skill.entity-RrnBU0M5.mjs.map → acorex-modules-human-capital-management-skill.entity-D4CglCC7.mjs.map} +1 -1
  47. package/fesm2022/acorex-modules-human-capital-management.mjs +1 -1
  48. package/fesm2022/acorex-modules-organization-management-org-chart.page-keZ4Gk7y.mjs +544 -0
  49. package/fesm2022/acorex-modules-organization-management-org-chart.page-keZ4Gk7y.mjs.map +1 -0
  50. package/fesm2022/{acorex-modules-organization-management-position.entity-DK-i78ck.mjs → acorex-modules-organization-management-position.entity-CzBbuApR.mjs} +47 -1
  51. package/fesm2022/acorex-modules-organization-management-position.entity-CzBbuApR.mjs.map +1 -0
  52. package/fesm2022/{acorex-modules-organization-management-settings.provider-feVwZnkw.mjs → acorex-modules-organization-management-settings.provider-BvOAb0jb.mjs} +21 -2
  53. package/fesm2022/acorex-modules-organization-management-settings.provider-BvOAb0jb.mjs.map +1 -0
  54. package/fesm2022/acorex-modules-organization-management.mjs +358 -240
  55. package/fesm2022/acorex-modules-organization-management.mjs.map +1 -1
  56. package/fesm2022/acorex-modules-report-management.mjs +76 -16
  57. package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
  58. package/fesm2022/{acorex-modules-settings-management-setting-page.component-Y-liTcuX.mjs → acorex-modules-settings-management-setting-page.component-IG1o_0Dp.mjs} +17 -14
  59. package/fesm2022/acorex-modules-settings-management-setting-page.component-IG1o_0Dp.mjs.map +1 -0
  60. package/fesm2022/acorex-modules-settings-management.mjs +1 -1
  61. package/fesm2022/acorex-modules-settings-management.mjs.map +1 -1
  62. package/organization-management/README.md +98 -2
  63. package/organization-management/index.d.ts +44 -123
  64. package/package.json +1 -1
  65. package/report-management/index.d.ts +31 -3
  66. package/fesm2022/acorex-modules-human-capital-management-employee.entity-CC-LIIki.mjs.map +0 -1
  67. package/fesm2022/acorex-modules-human-capital-management-position-assignment.entity-BlKFRnO0.mjs.map +0 -1
  68. package/fesm2022/acorex-modules-organization-management-add-item.component-CtuULLkY.mjs +0 -89
  69. package/fesm2022/acorex-modules-organization-management-add-item.component-CtuULLkY.mjs.map +0 -1
  70. package/fesm2022/acorex-modules-organization-management-branch.entity-C4Le6Kv6.mjs +0 -317
  71. package/fesm2022/acorex-modules-organization-management-branch.entity-C4Le6Kv6.mjs.map +0 -1
  72. package/fesm2022/acorex-modules-organization-management-department.entity-BkEbajpN.mjs +0 -288
  73. package/fesm2022/acorex-modules-organization-management-department.entity-BkEbajpN.mjs.map +0 -1
  74. package/fesm2022/acorex-modules-organization-management-division.entity-Cds8jkR5.mjs +0 -515
  75. package/fesm2022/acorex-modules-organization-management-division.entity-Cds8jkR5.mjs.map +0 -1
  76. package/fesm2022/acorex-modules-organization-management-org-chart-configuration.page-DfwjhVRX.mjs +0 -116
  77. package/fesm2022/acorex-modules-organization-management-org-chart-configuration.page-DfwjhVRX.mjs.map +0 -1
  78. package/fesm2022/acorex-modules-organization-management-org-chart-configuration.service-D7NlQXp2.mjs +0 -147
  79. package/fesm2022/acorex-modules-organization-management-org-chart-configuration.service-D7NlQXp2.mjs.map +0 -1
  80. package/fesm2022/acorex-modules-organization-management-org-chart.page-DeqD7PyH.mjs +0 -989
  81. package/fesm2022/acorex-modules-organization-management-org-chart.page-DeqD7PyH.mjs.map +0 -1
  82. package/fesm2022/acorex-modules-organization-management-position.entity-DK-i78ck.mjs.map +0 -1
  83. package/fesm2022/acorex-modules-organization-management-settings.keys-B3cgSi_S.mjs +0 -22
  84. package/fesm2022/acorex-modules-organization-management-settings.keys-B3cgSi_S.mjs.map +0 -1
  85. package/fesm2022/acorex-modules-organization-management-settings.provider-feVwZnkw.mjs.map +0 -1
  86. package/fesm2022/acorex-modules-settings-management-setting-page.component-Y-liTcuX.mjs.map +0 -1
@@ -0,0 +1,544 @@
1
+ import { AXPanViewDirective } from '@acorex/cdk/pan-view';
2
+ import { AXBadgeModule } from '@acorex/components/badge';
3
+ import { AXBreadcrumbsModule } from '@acorex/components/breadcrumbs';
4
+ import * as i2 from '@acorex/components/button';
5
+ import { AXButtonModule } from '@acorex/components/button';
6
+ import * as i4 from '@acorex/components/decorators';
7
+ import { AXDecoratorModule } from '@acorex/components/decorators';
8
+ import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
9
+ import { AXLoadingModule } from '@acorex/components/loading';
10
+ import { AXContextMenuComponent, AXMenuModule } from '@acorex/components/menu';
11
+ import * as i3 from '@acorex/core/translation';
12
+ import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
13
+ import { AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPageLayoutBase } from '@acorex/platform/layout/views';
14
+ import { AXPThemeLayoutBlockComponent } from '@acorex/platform/layout/components';
15
+ import * as i1 from '@angular/common';
16
+ import { CommonModule } from '@angular/common';
17
+ import * as i0 from '@angular/core';
18
+ import { inject, signal, Injectable, viewChild, NgZone, ViewContainerRef, afterNextRender, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
19
+ import { RouterModule } from '@angular/router';
20
+ import set from 'lodash-es/set';
21
+ import { AXMOrganizationManagementChartEntityService, RootConfig, AXMOrgChartNodeType, AXMOrgChartCategory } from './acorex-modules-organization-management.mjs';
22
+ import { AXLoadingDialogService } from '@acorex/components/loading-dialog';
23
+ import { AXPExportService } from '@acorex/platform/common';
24
+ import { AXPCommandService } from '@acorex/platform/runtime';
25
+ import { AXPSessionService } from '@acorex/platform/auth';
26
+ import { AXPDataGenerator } from '@acorex/platform/core';
27
+
28
+ class AXMOrgChartService {
29
+ constructor() {
30
+ // Employee moved to HCM; resolve via runtime query mapping instead of direct service
31
+ this.chartService = inject(AXMOrganizationManagementChartEntityService);
32
+ this.sessionService = inject(AXPSessionService);
33
+ this.loadingDialog = inject(AXLoadingDialogService);
34
+ this.exportService = inject(AXPExportService);
35
+ this.translationService = inject(AXTranslationService);
36
+ this.commandService = inject(AXPCommandService);
37
+ this._rootNode = signal({ id: AXPDataGenerator.uuid(), title: 'Company' }, ...(ngDevMode ? [{ debugName: "_rootNode" }] : []));
38
+ this.rootNode = this._rootNode.asReadonly();
39
+ }
40
+ async load() {
41
+ const first = (await this.chartService.query({
42
+ skip: 0,
43
+ take: 1,
44
+ sort: [{ field: 'version', dir: 'desc' }],
45
+ })).items[0];
46
+ //
47
+ if (first && first.data) {
48
+ const data = first.data;
49
+ this._rootNode.set(data);
50
+ }
51
+ else {
52
+ await this.createNew();
53
+ await this.load();
54
+ }
55
+ }
56
+ async createNew() {
57
+ // Prefer generating a fresh chart via mock command when available
58
+ await this.commandService.execute('organization.chart.generate', {
59
+ includeEmployees: true,
60
+ preferPrimary: true,
61
+ });
62
+ return;
63
+ }
64
+ //#region ---- Printing ----
65
+ async printChart(element) {
66
+ const d = this.loadingDialog.show({
67
+ title: 'Printing Organization Chart...',
68
+ mode: 'determinate',
69
+ progressColor: 'primary',
70
+ progressValue: 0,
71
+ status: '0/10',
72
+ text: 'Initializing print process...',
73
+ buttons: [
74
+ { text: 'Cancel', color: 'danger', onClick: () => d.close() }
75
+ ],
76
+ });
77
+ try {
78
+ await this.updateStep(d, await this.translate('preparing-document'), 10, '1/10');
79
+ const chartElement = element;
80
+ const { originalStyles, modifiedStyles } = this.expandChart(chartElement);
81
+ await this.updateStep(d, await this.translate('rendering-chart-image'), 25, '2.5/10');
82
+ const blob = await this.exportService.generateBlobFromElement(chartElement, {
83
+ popup: true,
84
+ filter: (node) => !(node instanceof Element && node.classList.contains('--toggle')),
85
+ bgcolor: 'transparent',
86
+ scale: 2,
87
+ quality: 1,
88
+ height: Number.parseInt(modifiedStyles.modifiedHeight),
89
+ width: Number.parseInt(modifiedStyles.modifiedWidth),
90
+ });
91
+ await this.updateStep(d, await this.translate('finalizing-image-processing'), 50, '5/10');
92
+ this.restoreChartStyles(chartElement, originalStyles);
93
+ await this.updateStep(d, await this.translate('downloading-image'), 75, '7.5/10');
94
+ this.exportService.download(blob, 'org-chart.png');
95
+ await this.updateStep(d, await this.translate('process-complete'), 100, '10/10');
96
+ setTimeout(() => d.close(), 1500);
97
+ }
98
+ catch (err) {
99
+ console.error('Error capturing chart:', err);
100
+ await this.updateStep(d, await this.translate('failed-to-generate-chart-image'), 100, 'Error', 'danger');
101
+ d.close();
102
+ }
103
+ }
104
+ expandChart(chartElement) {
105
+ const originalStyles = {
106
+ originalOverflow: chartElement.style.overflow,
107
+ originalWidth: chartElement.style.width,
108
+ originalHeight: chartElement.style.height,
109
+ };
110
+ const modifiedStyles = {
111
+ modifiedOverflow: 'visible',
112
+ modifiedWidth: `${chartElement.scrollWidth}px`,
113
+ modifiedHeight: `${chartElement.scrollHeight}px`,
114
+ };
115
+ chartElement.style.overflow = modifiedStyles.modifiedOverflow;
116
+ chartElement.style.width = modifiedStyles.modifiedWidth;
117
+ chartElement.style.height = modifiedStyles.modifiedHeight;
118
+ return { originalStyles, modifiedStyles };
119
+ }
120
+ restoreChartStyles(chartElement, originalStyles) {
121
+ chartElement.style.overflow = originalStyles.originalOverflow;
122
+ chartElement.style.width = originalStyles.originalWidth;
123
+ chartElement.style.height = originalStyles.originalHeight;
124
+ }
125
+ async updateStep(dialog, text, progress, status, color = 'primary') {
126
+ return new Promise((resolve) => {
127
+ dialog.setProgressColor(color);
128
+ dialog.setProgressText(text);
129
+ dialog.setProgressValue(progress);
130
+ dialog.setProgressStatus(status);
131
+ resolve();
132
+ });
133
+ }
134
+ async translate(key) {
135
+ return (await this.translationService.translateAsync(key, { scope: 'organization-management' })) + '...';
136
+ }
137
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXMOrgChartService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
138
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXMOrgChartService }); }
139
+ }
140
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXMOrgChartService, decorators: [{
141
+ type: Injectable
142
+ }] });
143
+
144
+ /**
145
+ * Component for displaying and interacting with an organizational chart.
146
+ */
147
+ class AXMOrgChartPage extends AXPPageLayoutBaseComponent {
148
+ constructor() {
149
+ super(...arguments);
150
+ this.rootConfig = RootConfig;
151
+ this.nodeTemplate = viewChild.required('nodeTemplate');
152
+ this.treeContainer = viewChild.required('chart');
153
+ this.parent = viewChild.required('parent');
154
+ this.contextMenu = viewChild(AXContextMenuComponent, ...(ngDevMode ? [{ debugName: "contextMenu" }] : []));
155
+ this.panView = viewChild(AXPanViewDirective, ...(ngDevMode ? [{ debugName: "panView" }] : []));
156
+ this.ngzone = inject(NgZone);
157
+ this.viewContainerRef = inject(ViewContainerRef);
158
+ // printing is handled by service itself
159
+ this.chartService = inject(AXMOrgChartService);
160
+ this.NODE_STROKE_COLOR = 'rgba(var(--ax-sys-color-primary-400))';
161
+ this.LINK_STROKE_WIDTH = 1;
162
+ this.NodeTypes = AXMOrgChartNodeType;
163
+ this.isFullscreen = signal(false, ...(ngDevMode ? [{ debugName: "isFullscreen" }] : []));
164
+ this.panX = signal(0, ...(ngDevMode ? [{ debugName: "panX" }] : []));
165
+ this.panY = signal(0, ...(ngDevMode ? [{ debugName: "panY" }] : []));
166
+ this.panZoomLevel = signal(100, ...(ngDevMode ? [{ debugName: "panZoomLevel" }] : []));
167
+ this.isChartRendered = false;
168
+ this.nodeTypes = [
169
+ { title: 'Company', color: 'primary', icon: 'fal fa-building', category: AXMOrgChartCategory.Company },
170
+ { title: 'Location', color: 'accent1', icon: 'fal fa-globe', category: AXMOrgChartCategory.Location },
171
+ { title: 'Business Unit', color: 'accent2', icon: 'fal fa-sitemap', category: AXMOrgChartCategory.BusinessUnit },
172
+ { title: 'Position', color: 'accent3', icon: 'fal fa-user-tie', category: AXMOrgChartCategory.Position },
173
+ { title: 'Employee', color: 'surface', icon: 'fal fa-address-card', category: AXMOrgChartCategory.Employee },
174
+ ];
175
+ this.#initialize = afterNextRender(async () => {
176
+ this.d3 = await import('d3');
177
+ await this.chartService.load();
178
+ await this.refreshChart();
179
+ });
180
+ }
181
+ #initialize;
182
+ /**
183
+ * Zooms in the chart.
184
+ */
185
+ zoomIn() {
186
+ this.panView()?.zoomIn();
187
+ }
188
+ /**
189
+ * Zooms out the chart.
190
+ */
191
+ zoomOut() {
192
+ this.panView()?.zoomOut();
193
+ }
194
+ /**
195
+ * Resets the zoom level and pan position of the chart.
196
+ */
197
+ zoomReset() {
198
+ this.panView()?.resetPosition();
199
+ }
200
+ /**
201
+ * Toggles fullscreen mode for the chart.
202
+ */
203
+ toggleFullscreen() {
204
+ if (this.isFullscreen()) {
205
+ document.exitFullscreen();
206
+ this.isFullscreen.set(false);
207
+ }
208
+ else {
209
+ this.parent().nativeElement.requestFullscreen();
210
+ this.isFullscreen.set(true);
211
+ }
212
+ document.querySelector(`foreignObject[node="node-${this.chartService.rootNode().id}"]`)?.scrollIntoView({
213
+ behavior: 'smooth',
214
+ block: 'start',
215
+ inline: 'center',
216
+ });
217
+ }
218
+ /**
219
+ * Calculates the maximum depth of the organizational chart.
220
+ * @param node - The root node of the chart.
221
+ * @returns The maximum depth of the chart.
222
+ */
223
+ calculateMaxDepth(node) {
224
+ if (!node.children || node.children.length === 0 || node.isExpanded === false) {
225
+ return 1;
226
+ }
227
+ return 1 + Math.max(...node.children.map((child) => this.calculateMaxDepth(child)));
228
+ }
229
+ /**
230
+ * Calculates the maximum breadth of the organizational chart.
231
+ * @param node - The root node of the chart.
232
+ * @returns The maximum breadth of the chart.
233
+ */
234
+ calculateMaxBreadth(node) {
235
+ if (!node.children || node.children.length === 0 || node.isExpanded === false) {
236
+ return 1;
237
+ }
238
+ return node.children.reduce((acc, child) => acc + this.calculateMaxBreadth(child), 0);
239
+ }
240
+ /**
241
+ * Creates and renders the organizational chart.
242
+ * @param el - The container element for the chart.
243
+ * @param data - The root node of the organizational chart.
244
+ */
245
+ createChart(el, data) {
246
+ if (!this.d3) {
247
+ return;
248
+ }
249
+ this.ngzone.runOutsideAngular(() => {
250
+ const NODE_WIDTH_BASE = 260;
251
+ const NODE_HEIGHT_BASE = 180;
252
+ const HORIZONTAL_SPACING = 20;
253
+ const VERTICAL_SPACING = 40;
254
+ this.clearChart(el);
255
+ const newSvg = this.d3.select(el).append('svg');
256
+ const root = this.d3.hierarchy(data);
257
+ root.descendants().forEach((node) => {
258
+ if (node.data.isExpanded === false) {
259
+ node.children = undefined;
260
+ }
261
+ });
262
+ const treeLayout = this.d3
263
+ .tree()
264
+ .nodeSize([NODE_WIDTH_BASE + HORIZONTAL_SPACING, NODE_HEIGHT_BASE + VERTICAL_SPACING]);
265
+ treeLayout(root);
266
+ let minX = Infinity, maxX = -Infinity, minY = Infinity, maxY = -Infinity;
267
+ root.descendants().forEach((d) => {
268
+ if (d.x < minX)
269
+ minX = d.x;
270
+ if (d.x > maxX)
271
+ maxX = d.x;
272
+ if (d.y < minY)
273
+ minY = d.y;
274
+ if (d.y > maxY)
275
+ maxY = d.y;
276
+ });
277
+ const CONTAINER_WIDTH = maxX - minX + NODE_WIDTH_BASE + 2 * HORIZONTAL_SPACING;
278
+ const CONTAINER_HEIGHT = maxY - minY + NODE_HEIGHT_BASE + 2 * VERTICAL_SPACING;
279
+ newSvg.attr('width', CONTAINER_WIDTH).attr('height', CONTAINER_HEIGHT);
280
+ const g = newSvg
281
+ .append('g')
282
+ .attr('transform', `translate(${-minX + NODE_WIDTH_BASE / 2 + HORIZONTAL_SPACING / 2}, ${-minY + NODE_HEIGHT_BASE / 2 + VERTICAL_SPACING / 2})`);
283
+ const link = g
284
+ .selectAll('.link')
285
+ .data(root.links())
286
+ .enter()
287
+ .append('path')
288
+ .attr('class', 'link')
289
+ .attr('d', (d) => {
290
+ const source = d.source;
291
+ const target = d.target;
292
+ return `M${source.x},${source.y}V${(source.y + target.y) / 2}H${target.x}V${target.y - 10}`;
293
+ })
294
+ .attr('fill', 'none')
295
+ .attr('stroke', this.NODE_STROKE_COLOR)
296
+ .attr('stroke-width', this.LINK_STROKE_WIDTH)
297
+ .attr('from', (d) => `node-${d.source.data.id}`)
298
+ .attr('to', (d) => `node-${d.target.data.id}`);
299
+ const node = g
300
+ .selectAll('.axp-chart-node')
301
+ .data(root.descendants())
302
+ .enter()
303
+ .append('foreignObject')
304
+ .attr('class', 'axp-chart-node')
305
+ .attr('node', (d) => `node-${d.data.id}`)
306
+ .attr('x', (d) => d.x - NODE_WIDTH_BASE / 2)
307
+ .attr('y', (d) => d.y - NODE_HEIGHT_BASE / 2 + 10)
308
+ .attr('width', NODE_WIDTH_BASE)
309
+ .attr('height', NODE_HEIGHT_BASE)
310
+ .each((d) => this.renderNodeTemplate(d.data, d.x, d.y));
311
+ this.contextMenu()?.refresh();
312
+ });
313
+ if (!this.isChartRendered) {
314
+ // document.querySelector(`foreignObject[node="node-${data.id}"] .--heading-container`)?.scrollIntoView({
315
+ // behavior: 'smooth',
316
+ // block: 'center',
317
+ // inline: 'center',
318
+ // });
319
+ this.isChartRendered = true;
320
+ this.panView()?.resetPosition();
321
+ }
322
+ }
323
+ /**
324
+ * Renders the node template for a given organizational node.
325
+ * @param data - The node data.
326
+ * @param x - The x-coordinate of the node.
327
+ * @param y - The y-coordinate of the node.
328
+ */
329
+ renderNodeTemplate(data, x, y) {
330
+ // Find the key that matches the node type
331
+ // category is the same as type in simplified structure
332
+ set(data, 'category', data.type);
333
+ const viewRef = this.viewContainerRef.createEmbeddedView(this.nodeTemplate(), {
334
+ $implicit: data,
335
+ });
336
+ const nodeElement = this.d3.select(this.treeContainer().nativeElement).select(`[node="node-${data.id}"]`);
337
+ const element = nodeElement.node();
338
+ if (element) {
339
+ element.appendChild(viewRef.rootNodes[0]);
340
+ }
341
+ }
342
+ /**
343
+ * Toggles the expansion state of a node.
344
+ * @param data - The node data.
345
+ * @param el - The HTML element representing the node.
346
+ */
347
+ toggleNode(data, el) {
348
+ data.isExpanded = data.isExpanded === undefined ? false : !data.isExpanded;
349
+ this.createChart(this.treeContainer().nativeElement, this.chartService.rootNode());
350
+ // el.scrollIntoView({
351
+ // behavior: 'smooth',
352
+ // });
353
+ }
354
+ /**
355
+ * Clears the chart from the container element.
356
+ * @param el - The container element.
357
+ */
358
+ clearChart(el) {
359
+ if (this.d3) {
360
+ this.d3.select(el).select('svg').remove();
361
+ this.viewContainerRef.clear();
362
+ }
363
+ }
364
+ async refreshChart() {
365
+ if (this.d3) {
366
+ this.createChart(this.treeContainer().nativeElement, this.chartService.rootNode());
367
+ }
368
+ }
369
+ //#region Context Menu
370
+ // protected async handleContextMenuOnOpening(e: AXContextMenuOpeningEvent) {
371
+ // const node = get(e.targetElement, '__data__.data') as any as AXMOrganizationNode;
372
+ // const allowedAddItems = await this.chartService.getAllowedAddMenuItems(node);
373
+ // const allowDelete = node.type != AXMOrganizationNodeType.Company;
374
+ // const isPasteAvailable = await this.chartService.isPasteAvailable();
375
+ // const allowPaste = await this.chartService.allowPaste(node);
376
+ // //
377
+ // if (allowedAddItems.length) {
378
+ // e.items.push({
379
+ // text: 'Add New',
380
+ // icon: 'fa-light fa-plus',
381
+ // items: allowedAddItems,
382
+ // break: allowDelete,
383
+ // });
384
+ // }
385
+ // //
386
+ // if (allowDelete) {
387
+ // e.items.push({
388
+ // name: 'cut',
389
+ // text: 'Cut',
390
+ // icon: 'fa-light fa-cut',
391
+ // data: node,
392
+ // });
393
+ // e.items.push({
394
+ // name: 'copy',
395
+ // text: 'Copy',
396
+ // icon: 'fa-light fa-copy',
397
+ // data: node,
398
+ // break: !isPasteAvailable,
399
+ // });
400
+ // }
401
+ // if (isPasteAvailable) {
402
+ // e.items.push({
403
+ // name: 'paste',
404
+ // text: 'Paste',
405
+ // icon: 'fa-light fa-paste',
406
+ // data: node,
407
+ // break: true,
408
+ // disabled: !allowPaste,
409
+ // });
410
+ // }
411
+ // //
412
+ // if (allowDelete) {
413
+ // e.items.push({
414
+ // name: 'remove',
415
+ // text: 'Remove',
416
+ // color: 'danger',
417
+ // icon: 'fa-light fa-trash-can',
418
+ // data: node,
419
+ // });
420
+ // }
421
+ // //
422
+ // if (e.items.length == 0) {
423
+ // e.canceled = true;
424
+ // }
425
+ // }
426
+ async handleContextMenuItemClick(e) {
427
+ }
428
+ //#endregion
429
+ /**
430
+ * Prints the organizational chart.
431
+ */
432
+ async printChart() {
433
+ let [panX, panY, panZoomLevel] = [this.panX(), this.panY(), this.panZoomLevel()];
434
+ this.panX.set(0), this.panY.set(0), this.panZoomLevel.set(100);
435
+ await this.chartService.printChart(this.treeContainer().nativeElement);
436
+ this.panX.set(panX), this.panY.set(panY), this.panZoomLevel.set(panZoomLevel);
437
+ }
438
+ /**
439
+ * Gets the node colors based on the provided color.
440
+ * @param color - The color to use for the node.
441
+ * @returns An object containing the node's background, text, and border colors.
442
+ */
443
+ getNodeColors(color) {
444
+ if (color.includes('surface')) {
445
+ return {
446
+ '--node-bg-color': `var(--ax-sys-color-${color})`,
447
+ '--node-text-color': `var(--ax-sys-color-on-${color})`,
448
+ '--node-border-color': `var(--ax-sys-color-border-${color})`,
449
+ };
450
+ }
451
+ return {
452
+ '--node-bg-color': `var(--ax-sys-color-${color}-surface)`,
453
+ '--node-text-color': `var(--ax-sys-color-on-${color}-surface)`,
454
+ '--node-border-color': `var(--ax-sys-color-border-${color}-surface)`,
455
+ };
456
+ }
457
+ updateVar(oldValue, newValue) {
458
+ oldValue.cat = newValue;
459
+ }
460
+ async getPageTitle() {
461
+ return await this.translateService.translateAsync('chart.page-title', { scope: this.rootConfig.config.i18n });
462
+ }
463
+ async getPageDescription() {
464
+ return await this.translateService.translateAsync('chart.page-description', { scope: this.rootConfig.config.i18n });
465
+ }
466
+ async getSecondaryMenuItems() {
467
+ return [
468
+ {
469
+ title: await this.translateService.translateAsync('chart.actions.print', { scope: this.rootConfig.config.i18n }),
470
+ icon: 'fa-light fa-print',
471
+ color: 'primary',
472
+ name: 'print',
473
+ command: {
474
+ name: 'print',
475
+ },
476
+ },
477
+ {
478
+ title: await this.translateService.translateAsync('chart.actions.generate', { scope: this.rootConfig.config.i18n }),
479
+ icon: 'fa-light fa-generate',
480
+ color: 'primary',
481
+ name: 'generate',
482
+ command: {
483
+ name: 'organization.chart.generate',
484
+ },
485
+ }
486
+ ];
487
+ }
488
+ async getPageBreadcrumbs() {
489
+ return [
490
+ {
491
+ title: await this.translateService.translateAsync('root-menu', { scope: this.rootConfig.config.i18n })
492
+ },
493
+ ];
494
+ }
495
+ async execute(command) {
496
+ if (command.name == 'print') {
497
+ await this.printChart();
498
+ }
499
+ }
500
+ ngOnDestroy() {
501
+ this.clearChart(this.treeContainer().nativeElement);
502
+ }
503
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXMOrgChartPage, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
504
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.8", type: AXMOrgChartPage, isStandalone: true, selector: "ng-component", providers: [
505
+ AXMOrgChartService,
506
+ {
507
+ provide: AXPPageLayoutBase,
508
+ useExisting: AXMOrgChartPage
509
+ }
510
+ ], 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 }], usesInheritance: true, ngImport: i0, template: "<axp-page-layout *translate=\"let t\">\n <axp-page-content class=\"ax-overflow-hidden\">\n <div class=\"ax-h-[calc(100vh-290px)]\" #parent id=\"parent\">\n <div\n #chart\n axPanView\n [(panX)]=\"panX\"\n [(panY)]=\"panY\"\n [freeMode]=\"true\"\n [(zoom)]=\"panZoomLevel\"\n [fitContent]=\"true\"\n wrapperClasses=\"h\"\n class=\"ax-light\"\n ></div>\n <!-- <ax-context-menu\n [target]=\"'.axp-chart-node'\"\n [orientation]=\"'vertical'\"\n [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n (onOpening)=\"handleContextMenuOnOpening($event)\"\n >\n </ax-context-menu> -->\n </div>\n </axp-page-content>\n <axp-page-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'}; @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\"></div>\n {{item.title}}\n </div>\n {{updateVar(v, item.category)}} }\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-page-footer>\n</axp-page-layout>\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.Country) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n } @case (NodeTypes.State) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n } @case (NodeTypes.City) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n }\n <!-- BusinessUnit -->\n @case (NodeTypes.Division) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n } @case (NodeTypes.Department) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n } @case (NodeTypes.Branch) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n }\n <!-- Role -->\n @case (NodeTypes.Position) {\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 </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\" [title]=\"data.title\">{{data.title}}</span>\n @if(data.subtitle) {\n <span class=\"--sub-title\" [title]=\"data.subtitle\">{{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 <div class=\"--body-container\">\n <div class=\"--description\" [class.ax-pb-3]=\"data.children && data.children.length > 0\">\n <span>{{data.description}}</span>\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>\n", 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;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}.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: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
511
+ //
512
+ AXMenuModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i3.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { 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: "ngmodule", type: AXBadgeModule }, { kind: "component", type:
513
+ //
514
+ 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: AXPPageLayoutComponent, selector: "axp-page-layout" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
515
+ }
516
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: AXMOrgChartPage, decorators: [{
517
+ type: Component,
518
+ args: [{ imports: [
519
+ CommonModule,
520
+ RouterModule,
521
+ //
522
+ AXMenuModule,
523
+ AXButtonModule,
524
+ AXDropdownButtonModule,
525
+ AXTranslationModule,
526
+ AXDecoratorModule,
527
+ AXPanViewDirective,
528
+ AXLoadingModule,
529
+ AXBreadcrumbsModule,
530
+ AXBadgeModule,
531
+ //
532
+ AXPThemeLayoutBlockComponent,
533
+ AXPPageLayoutComponent,
534
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
535
+ AXMOrgChartService,
536
+ {
537
+ provide: AXPPageLayoutBase,
538
+ useExisting: AXMOrgChartPage
539
+ }
540
+ ], template: "<axp-page-layout *translate=\"let t\">\n <axp-page-content class=\"ax-overflow-hidden\">\n <div class=\"ax-h-[calc(100vh-290px)]\" #parent id=\"parent\">\n <div\n #chart\n axPanView\n [(panX)]=\"panX\"\n [(panY)]=\"panY\"\n [freeMode]=\"true\"\n [(zoom)]=\"panZoomLevel\"\n [fitContent]=\"true\"\n wrapperClasses=\"h\"\n class=\"ax-light\"\n ></div>\n <!-- <ax-context-menu\n [target]=\"'.axp-chart-node'\"\n [orientation]=\"'vertical'\"\n [closeOn]=\"'leave'\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n (onOpening)=\"handleContextMenuOnOpening($event)\"\n >\n </ax-context-menu> -->\n </div>\n </axp-page-content>\n <axp-page-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'}; @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\"></div>\n {{item.title}}\n </div>\n {{updateVar(v, item.category)}} }\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-page-footer>\n</axp-page-layout>\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.Country) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n } @case (NodeTypes.State) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n } @case (NodeTypes.City) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent1' }\"></ng-container>\n }\n <!-- BusinessUnit -->\n @case (NodeTypes.Division) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n } @case (NodeTypes.Department) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n } @case (NodeTypes.Branch) {\n <ng-container *ngTemplateOutlet=\"generalTemplate; context: { data,color:'accent2' }\"></ng-container>\n }\n <!-- Role -->\n @case (NodeTypes.Position) {\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 </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\" [title]=\"data.title\">{{data.title}}</span>\n @if(data.subtitle) {\n <span class=\"--sub-title\" [title]=\"data.subtitle\">{{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 <div class=\"--body-container\">\n <div class=\"--description\" [class.ax-pb-3]=\"data.children && data.children.length > 0\">\n <span>{{data.description}}</span>\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>\n", 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;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}.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"] }]
541
+ }] });
542
+
543
+ export { AXMOrgChartPage };
544
+ //# sourceMappingURL=acorex-modules-organization-management-org-chart.page-keZ4Gk7y.mjs.map