@acorex-platform/module-organization-management-client 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-platform-module-organization-management-client-acorex-platform-module-organization-management-client-Dn8Ss1nL.mjs +433 -0
- package/fesm2022/acorex-platform-module-organization-management-client-acorex-platform-module-organization-management-client-Dn8Ss1nL.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-add-business-unit-to-business-unit.command-CA2uZQyC.mjs +161 -0
- package/fesm2022/acorex-platform-module-organization-management-client-add-business-unit-to-business-unit.command-CA2uZQyC.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-add-position-to-business-unit.command-F7jD3jKs.mjs +137 -0
- package/fesm2022/acorex-platform-module-organization-management-client-add-position-to-business-unit.command-F7jD3jKs.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-add-team-to-business-unit.command-BLQFjhS5.mjs +127 -0
- package/fesm2022/acorex-platform-module-organization-management-client-add-team-to-business-unit.command-BLQFjhS5.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-contracts.mjs +468 -0
- package/fesm2022/acorex-platform-module-organization-management-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-feature-definition.provider-BQKtvXOM.mjs +19 -0
- package/fesm2022/acorex-platform-module-organization-management-client-feature-definition.provider-BQKtvXOM.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-generate-org-chart.command-DJnFJKuo.mjs +91 -0
- package/fesm2022/acorex-platform-module-organization-management-client-generate-org-chart.command-DJnFJKuo.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-job-definition-matrix-page.utils-DD3jLujN.mjs +61 -0
- package/fesm2022/acorex-platform-module-organization-management-client-job-definition-matrix-page.utils-DD3jLujN.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-job-definition-pages-component.provider-BNhXJfjr.mjs +28 -0
- package/fesm2022/acorex-platform-module-organization-management-client-job-definition-pages-component.provider-BNhXJfjr.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-job-definition-responsibilities-page.component-BlUzsSy3.mjs +237 -0
- package/fesm2022/acorex-platform-module-organization-management-client-job-definition-responsibilities-page.component-BlUzsSy3.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-job-definition-skills-page.component--pyAaXB4.mjs +233 -0
- package/fesm2022/acorex-platform-module-organization-management-client-job-definition-skills-page.component--pyAaXB4.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-menu.provider-BgRoEC48.mjs +175 -0
- package/fesm2022/acorex-platform-module-organization-management-client-menu.provider-BgRoEC48.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-org-chart-default-node-contribution.provider-BQ0ihb43.mjs +229 -0
- package/fesm2022/acorex-platform-module-organization-management-client-org-chart-default-node-contribution.provider-BQ0ihb43.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-org-chart-employee-flyout-contribution.provider-Bz8nVm04.mjs +179 -0
- package/fesm2022/acorex-platform-module-organization-management-client-org-chart-employee-flyout-contribution.provider-Bz8nVm04.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-org-chart-position-employee-node-contribution.provider-BTicXn9n.mjs +168 -0
- package/fesm2022/acorex-platform-module-organization-management-client-org-chart-position-employee-node-contribution.provider-BTicXn9n.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-org-chart-ux-node-contribution.provider-C5TItnOp.mjs +338 -0
- package/fesm2022/acorex-platform-module-organization-management-client-org-chart-ux-node-contribution.provider-C5TItnOp.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-org-chart.page-g_3oPPH0.mjs +3744 -0
- package/fesm2022/acorex-platform-module-organization-management-client-org-chart.page-g_3oPPH0.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-permission-definition.provider-CiCdTBGo.mjs +43 -0
- package/fesm2022/acorex-platform-module-organization-management-client-permission-definition.provider-CiCdTBGo.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-remove-position-from-business-unit.command-BFQVTpfy.mjs +91 -0
- package/fesm2022/acorex-platform-module-organization-management-client-remove-position-from-business-unit.command-BFQVTpfy.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-replace-position-assignee.command-CSgERqLG.mjs +64 -0
- package/fesm2022/acorex-platform-module-organization-management-client-replace-position-assignee.command-CSgERqLG.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-responsibilities-matrix-widget-edit.component-DHmUxlnu.mjs +143 -0
- package/fesm2022/acorex-platform-module-organization-management-client-responsibilities-matrix-widget-edit.component-DHmUxlnu.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-responsibilities-matrix-widget-view.component-BkLZhXhM.mjs +65 -0
- package/fesm2022/acorex-platform-module-organization-management-client-responsibilities-matrix-widget-view.component-BkLZhXhM.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-responsibilities-matrix.component-DqO6xE2p.mjs +400 -0
- package/fesm2022/acorex-platform-module-organization-management-client-responsibilities-matrix.component-DqO6xE2p.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client-settings.provider-Dnrkq9Ku.mjs +432 -0
- package/fesm2022/acorex-platform-module-organization-management-client-settings.provider-Dnrkq9Ku.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-organization-management-client.mjs +2 -0
- package/fesm2022/acorex-platform-module-organization-management-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-module-organization-management-client-contracts.d.ts +501 -0
- package/types/acorex-platform-module-organization-management-client.d.ts +273 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import * as i1 from '@acorex/components/button';
|
|
2
|
+
import { AXButtonModule } from '@acorex/components/button';
|
|
3
|
+
import * as i2 from '@acorex/components/decorators';
|
|
4
|
+
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
5
|
+
import * as i3$1 from '@acorex/core/translation';
|
|
6
|
+
import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
|
|
7
|
+
import { AXPWidgetsList } from '@acorex-platform/framework-shared/core';
|
|
8
|
+
import { AXPSpreadsheetComponent } from '@acorex-platform/framework-client/layout/components';
|
|
9
|
+
import { AXPEntityService, AXPEntityDataSelectorService, AXPEntityDefinitionRegistryService } from '@acorex-platform/framework-client/layout/entity';
|
|
10
|
+
import * as i3 from '@angular/common';
|
|
11
|
+
import { CommonModule } from '@angular/common';
|
|
12
|
+
import * as i0 from '@angular/core';
|
|
13
|
+
import { inject, input, output, signal, computed, effect, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
|
|
14
|
+
import { RootConfig } from '@acorex-platform/module-organization-management-client/contracts';
|
|
15
|
+
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region ---- Component Definition ----
|
|
18
|
+
class AXMOrganizationManagementResponsibilitiesMatrixComponent {
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region ---- Lifecycle Methods ----
|
|
21
|
+
constructor() {
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region ---- Services & Dependencies ----
|
|
24
|
+
this.entityService = inject(AXPEntityService);
|
|
25
|
+
this.responsibilityLevelDataAccessor = this.entityService
|
|
26
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.responsibilityLevel.name)
|
|
27
|
+
.data();
|
|
28
|
+
this.responsibilityDataAccessor = this.entityService
|
|
29
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.responsibility.name)
|
|
30
|
+
.data();
|
|
31
|
+
this.entityDataSelectorService = inject(AXPEntityDataSelectorService);
|
|
32
|
+
this.entityResolver = inject(AXPEntityDefinitionRegistryService);
|
|
33
|
+
this.multiLanguageResolver = inject(AXTranslationService);
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region ---- Inputs ----
|
|
36
|
+
/**
|
|
37
|
+
* Array of job levels to display as columns (e.g., Junior, Mid-Level, Senior)
|
|
38
|
+
*/
|
|
39
|
+
this.titles = input([], /* @ts-ignore */
|
|
40
|
+
...(ngDevMode ? [{ debugName: "titles" }] : /* istanbul ignore next */ []));
|
|
41
|
+
/**
|
|
42
|
+
* Initial matrix data: { [responsibilityId]: { [title.id]: responsibilityLevelId } }
|
|
43
|
+
*/
|
|
44
|
+
this.value = input({}, /* @ts-ignore */
|
|
45
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
46
|
+
/**
|
|
47
|
+
* Whether the matrix is in readonly mode
|
|
48
|
+
*/
|
|
49
|
+
this.readonly = input(false, /* @ts-ignore */
|
|
50
|
+
...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
|
|
51
|
+
/**
|
|
52
|
+
* Initial responsibility IDs (for syncing with parent entity)
|
|
53
|
+
*/
|
|
54
|
+
this.responsibilityIds = input([], /* @ts-ignore */
|
|
55
|
+
...(ngDevMode ? [{ debugName: "responsibilityIds" }] : /* istanbul ignore next */ []));
|
|
56
|
+
//#endregion
|
|
57
|
+
//#region ---- Outputs ----
|
|
58
|
+
/**
|
|
59
|
+
* Emitted when the matrix value changes
|
|
60
|
+
*/
|
|
61
|
+
this.valueChange = output();
|
|
62
|
+
/**
|
|
63
|
+
* Emitted when a single cell value changes
|
|
64
|
+
*/
|
|
65
|
+
this.cellChange = output();
|
|
66
|
+
/**
|
|
67
|
+
* Emitted when selected responsibilities change (responsibility IDs array)
|
|
68
|
+
*/
|
|
69
|
+
this.responsibilityIdsChange = output();
|
|
70
|
+
//#endregion
|
|
71
|
+
//#region ---- Class Properties ----
|
|
72
|
+
/**
|
|
73
|
+
* Responsibility levels loaded from the service
|
|
74
|
+
*/
|
|
75
|
+
this.responsibilityLevels = signal([], /* @ts-ignore */
|
|
76
|
+
...(ngDevMode ? [{ debugName: "responsibilityLevels" }] : /* istanbul ignore next */ []));
|
|
77
|
+
/**
|
|
78
|
+
* Selected responsibilities (internal state)
|
|
79
|
+
*/
|
|
80
|
+
this.selectedResponsibilities = signal([], /* @ts-ignore */
|
|
81
|
+
...(ngDevMode ? [{ debugName: "selectedResponsibilities" }] : /* istanbul ignore next */ []));
|
|
82
|
+
/**
|
|
83
|
+
* Responsibility entity definition
|
|
84
|
+
*/
|
|
85
|
+
this.responsibilityEntityDef = signal(null, /* @ts-ignore */
|
|
86
|
+
...(ngDevMode ? [{ debugName: "responsibilityEntityDef" }] : /* istanbul ignore next */ []));
|
|
87
|
+
/**
|
|
88
|
+
* Loading state
|
|
89
|
+
*/
|
|
90
|
+
this.isLoading = signal(true, /* @ts-ignore */
|
|
91
|
+
...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
|
|
92
|
+
/**
|
|
93
|
+
* Loading state for responsibility entity
|
|
94
|
+
*/
|
|
95
|
+
this.isLoadingResponsibilityEntity = signal(false, /* @ts-ignore */
|
|
96
|
+
...(ngDevMode ? [{ debugName: "isLoadingResponsibilityEntity" }] : /* istanbul ignore next */ []));
|
|
97
|
+
//#endregion
|
|
98
|
+
//#region ---- Computed Properties ----
|
|
99
|
+
/**
|
|
100
|
+
* Vertical titles (responsibilities) - rows of the matrix
|
|
101
|
+
*/
|
|
102
|
+
this.verticalTitles = computed(() => {
|
|
103
|
+
const responsibilities = this.selectedResponsibilities();
|
|
104
|
+
const resolve = (v) => this.multiLanguageResolver.resolve(v);
|
|
105
|
+
const result = (responsibilities ?? []).map((responsibility) => ({
|
|
106
|
+
id: responsibility.id,
|
|
107
|
+
title: resolve(responsibility.title),
|
|
108
|
+
description: responsibility.description ? resolve(responsibility.description) : undefined,
|
|
109
|
+
}));
|
|
110
|
+
return result;
|
|
111
|
+
}, /* @ts-ignore */
|
|
112
|
+
...(ngDevMode ? [{ debugName: "verticalTitles" }] : /* istanbul ignore next */ []));
|
|
113
|
+
/**
|
|
114
|
+
* Horizontal titles (job levels) - columns of the matrix
|
|
115
|
+
*/
|
|
116
|
+
this.horizontalTitles = computed(() => {
|
|
117
|
+
const titlesInput = this.titles();
|
|
118
|
+
const resolve = (v) => this.multiLanguageResolver.resolve(v);
|
|
119
|
+
const result = (titlesInput ?? []).map((title) => ({
|
|
120
|
+
id: title.id,
|
|
121
|
+
title: resolve(title.title),
|
|
122
|
+
description: title.description ? resolve(title.description) : undefined,
|
|
123
|
+
}));
|
|
124
|
+
return result;
|
|
125
|
+
}, /* @ts-ignore */
|
|
126
|
+
...(ngDevMode ? [{ debugName: "horizontalTitles" }] : /* istanbul ignore next */ []));
|
|
127
|
+
/**
|
|
128
|
+
* Cell options (responsibility levels) - dropdown options for each cell, loaded from service
|
|
129
|
+
*/
|
|
130
|
+
this.cellOptions = computed(() => {
|
|
131
|
+
const levels = this.responsibilityLevels();
|
|
132
|
+
const resolve = (v) => this.multiLanguageResolver.resolve(v);
|
|
133
|
+
const result = (levels ?? []).map((level) => ({
|
|
134
|
+
id: level.id,
|
|
135
|
+
title: resolve(level.title),
|
|
136
|
+
description: level.description ? resolve(level.description) : undefined,
|
|
137
|
+
}));
|
|
138
|
+
return result;
|
|
139
|
+
}, /* @ts-ignore */
|
|
140
|
+
...(ngDevMode ? [{ debugName: "cellOptions" }] : /* istanbul ignore next */ []));
|
|
141
|
+
/**
|
|
142
|
+
* Spreadsheet columns - converted from horizontalTitles (job levels)
|
|
143
|
+
*/
|
|
144
|
+
this.spreadsheetColumns = computed(() => {
|
|
145
|
+
const horizontalTitles = this.horizontalTitles();
|
|
146
|
+
const cellOptions = this.cellOptions();
|
|
147
|
+
// Create SelectBox widget configuration for responsibility levels
|
|
148
|
+
const selectBoxWidget = {
|
|
149
|
+
type: AXPWidgetsList.Editors.SelectBox,
|
|
150
|
+
options: {
|
|
151
|
+
valueField: 'id',
|
|
152
|
+
textField: 'title',
|
|
153
|
+
dataSource: cellOptions.map((option) => ({
|
|
154
|
+
id: option.id,
|
|
155
|
+
title: option.title,
|
|
156
|
+
description: option.description,
|
|
157
|
+
})),
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
// Convert horizontal titles to columns
|
|
161
|
+
return horizontalTitles.map((title) => ({
|
|
162
|
+
name: title.id,
|
|
163
|
+
title: title.title,
|
|
164
|
+
description: title.description,
|
|
165
|
+
path: title.id, // Path to access the value in row object
|
|
166
|
+
widget: selectBoxWidget,
|
|
167
|
+
}));
|
|
168
|
+
}, /* @ts-ignore */
|
|
169
|
+
...(ngDevMode ? [{ debugName: "spreadsheetColumns" }] : /* istanbul ignore next */ []));
|
|
170
|
+
/**
|
|
171
|
+
* Spreadsheet rows - converted from matrix data and vertical titles
|
|
172
|
+
*/
|
|
173
|
+
this.spreadsheetRows = computed(() => {
|
|
174
|
+
const verticalTitles = this.verticalTitles();
|
|
175
|
+
const horizontalTitles = this.horizontalTitles();
|
|
176
|
+
const matrixData = this.value();
|
|
177
|
+
// Convert matrix data to spreadsheet rows
|
|
178
|
+
return verticalTitles.map((responsibility) => {
|
|
179
|
+
const row = {
|
|
180
|
+
name: responsibility.id, // Required for fixed mode row identification
|
|
181
|
+
_responsibilityTitle: responsibility.title, // For row header display
|
|
182
|
+
_responsibilityDescription: responsibility.description, // For row header description
|
|
183
|
+
};
|
|
184
|
+
// Add cell values for each horizontal title (column)
|
|
185
|
+
horizontalTitles.forEach((title) => {
|
|
186
|
+
const cellValue = matrixData[responsibility.id]?.[title.id] ?? null;
|
|
187
|
+
row[title.id] = cellValue;
|
|
188
|
+
});
|
|
189
|
+
return row;
|
|
190
|
+
});
|
|
191
|
+
}, /* @ts-ignore */
|
|
192
|
+
...(ngDevMode ? [{ debugName: "spreadsheetRows" }] : /* istanbul ignore next */ []));
|
|
193
|
+
// Load responsibility levels and responsibility entity definition when component initializes
|
|
194
|
+
this.loadResponsibilityLevels();
|
|
195
|
+
this.loadResponsibilityEntityDef();
|
|
196
|
+
// Watch for responsibilityIds input changes and sync selected responsibilities
|
|
197
|
+
effect(() => {
|
|
198
|
+
const ids = this.responsibilityIds();
|
|
199
|
+
if (ids && ids.length > 0 && this.responsibilityEntityDef()) {
|
|
200
|
+
this.loadResponsibilitiesByIds(ids);
|
|
201
|
+
}
|
|
202
|
+
else if (!ids || ids.length === 0) {
|
|
203
|
+
// Try to extract responsibility IDs from matrix data keys
|
|
204
|
+
const matrixData = this.value();
|
|
205
|
+
const responsibilityIdsFromMatrix = Object.keys(matrixData || {});
|
|
206
|
+
if (responsibilityIdsFromMatrix.length > 0 && this.responsibilityEntityDef()) {
|
|
207
|
+
this.loadResponsibilitiesByIds(responsibilityIdsFromMatrix);
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
this.selectedResponsibilities.set([]);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
// Watch for matrix value changes and extract responsibility IDs
|
|
215
|
+
effect(() => {
|
|
216
|
+
const matrixData = this.value();
|
|
217
|
+
const currentResponsibilityIds = this.selectedResponsibilities().map((r) => r.id);
|
|
218
|
+
const responsibilityIdsFromMatrix = Object.keys(matrixData || {});
|
|
219
|
+
// If matrix has responsibilities that aren't in selectedResponsibilities, load them
|
|
220
|
+
const missingIds = responsibilityIdsFromMatrix.filter((id) => !currentResponsibilityIds.includes(id));
|
|
221
|
+
if (missingIds.length > 0 && this.responsibilityEntityDef()) {
|
|
222
|
+
this.loadResponsibilitiesByIds(missingIds);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
//#endregion
|
|
227
|
+
//#region ---- Data Loading Methods ----
|
|
228
|
+
/**
|
|
229
|
+
* Load responsibility levels from the service
|
|
230
|
+
*/
|
|
231
|
+
async loadResponsibilityLevels() {
|
|
232
|
+
try {
|
|
233
|
+
this.isLoading.set(true);
|
|
234
|
+
const query = {
|
|
235
|
+
skip: 0,
|
|
236
|
+
take: 1000,
|
|
237
|
+
sort: [{ field: 'level', dir: 'asc' }],
|
|
238
|
+
};
|
|
239
|
+
const result = await this.responsibilityLevelDataAccessor.query(query);
|
|
240
|
+
this.responsibilityLevels.set(result.items || []);
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
console.error('Error loading responsibility levels:', error);
|
|
244
|
+
this.responsibilityLevels.set([]);
|
|
245
|
+
}
|
|
246
|
+
finally {
|
|
247
|
+
this.isLoading.set(false);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Load responsibility entity definition
|
|
252
|
+
*/
|
|
253
|
+
async loadResponsibilityEntityDef() {
|
|
254
|
+
try {
|
|
255
|
+
this.isLoadingResponsibilityEntity.set(true);
|
|
256
|
+
const entityDef = await this.entityResolver.resolve(RootConfig.module.name, RootConfig.entities.responsibility.name);
|
|
257
|
+
this.responsibilityEntityDef.set(entityDef);
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
console.error('Error loading responsibility entity definition:', error);
|
|
261
|
+
this.responsibilityEntityDef.set(null);
|
|
262
|
+
}
|
|
263
|
+
finally {
|
|
264
|
+
this.isLoadingResponsibilityEntity.set(false);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Load responsibilities by IDs
|
|
269
|
+
*/
|
|
270
|
+
async loadResponsibilitiesByIds(ids) {
|
|
271
|
+
try {
|
|
272
|
+
const responsibilities = [];
|
|
273
|
+
for (const id of ids) {
|
|
274
|
+
try {
|
|
275
|
+
const responsibility = await this.responsibilityDataAccessor.byKey(id);
|
|
276
|
+
if (responsibility) {
|
|
277
|
+
responsibilities.push(responsibility);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
console.error(`Error loading responsibility ${id}:`, error);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
this.selectedResponsibilities.set(responsibilities);
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
console.error('Error loading responsibilities by IDs:', error);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//#endregion
|
|
291
|
+
//#region ---- Data Transformation Methods ----
|
|
292
|
+
/**
|
|
293
|
+
* Convert spreadsheet rows back to matrix data format
|
|
294
|
+
*/
|
|
295
|
+
convertSpreadsheetRowsToMatrixData(rows) {
|
|
296
|
+
const horizontalTitles = this.horizontalTitles();
|
|
297
|
+
const matrixData = {};
|
|
298
|
+
rows.forEach((row) => {
|
|
299
|
+
const responsibilityId = row['name']; // Row identifier (responsibility ID)
|
|
300
|
+
if (!responsibilityId) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
matrixData[responsibilityId] = {};
|
|
304
|
+
// Extract cell values for each column
|
|
305
|
+
horizontalTitles.forEach((title) => {
|
|
306
|
+
const cellValue = row[title.id] ?? null;
|
|
307
|
+
matrixData[responsibilityId][title.id] = cellValue;
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
return matrixData;
|
|
311
|
+
}
|
|
312
|
+
//#endregion
|
|
313
|
+
//#region ---- Event Handlers ----
|
|
314
|
+
/**
|
|
315
|
+
* Handle spreadsheet change event - convert to matrix format
|
|
316
|
+
*/
|
|
317
|
+
handleSpreadsheetChange(rows) {
|
|
318
|
+
const matrixData = this.convertSpreadsheetRowsToMatrixData(rows);
|
|
319
|
+
this.valueChange.emit(matrixData);
|
|
320
|
+
// Extract responsibility IDs from row names and emit
|
|
321
|
+
const responsibilityIds = rows.map((row) => row['name']).filter((id) => id != null);
|
|
322
|
+
this.responsibilityIdsChange.emit(responsibilityIds);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Handle cell change event from spreadsheet
|
|
326
|
+
*/
|
|
327
|
+
handleCellChange(event) {
|
|
328
|
+
this.cellChange.emit(event);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Open responsibility selector dialog
|
|
332
|
+
*/
|
|
333
|
+
async handleSelectResponsibilities() {
|
|
334
|
+
const entityDef = this.responsibilityEntityDef();
|
|
335
|
+
if (!entityDef) {
|
|
336
|
+
console.error('Responsibility entity definition not loaded');
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
try {
|
|
340
|
+
// Get currently selected responsibility IDs
|
|
341
|
+
const selectedItemIds = this.selectedResponsibilities()
|
|
342
|
+
.map((responsibility) => responsibility.id)
|
|
343
|
+
.filter((id) => id != null);
|
|
344
|
+
const result = await this.entityDataSelectorService.open({
|
|
345
|
+
entity: entityDef,
|
|
346
|
+
title: 'Select Responsibilities',
|
|
347
|
+
allowMultiple: true,
|
|
348
|
+
selectedItemIds: selectedItemIds.length > 0 ? selectedItemIds : undefined,
|
|
349
|
+
});
|
|
350
|
+
if (result && result.items && result.items.length > 0) {
|
|
351
|
+
// Update selected responsibilities
|
|
352
|
+
this.selectedResponsibilities.set(result.items);
|
|
353
|
+
// Emit responsibility IDs change
|
|
354
|
+
const responsibilityIds = result.items.map((item) => item.id).filter((id) => id != null);
|
|
355
|
+
this.responsibilityIdsChange.emit(responsibilityIds);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
console.error('Error opening responsibility selector:', error);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Remove a responsibility from selection
|
|
364
|
+
*/
|
|
365
|
+
handleRemoveResponsibility(responsibilityId) {
|
|
366
|
+
const currentResponsibilities = this.selectedResponsibilities();
|
|
367
|
+
const updatedResponsibilities = currentResponsibilities.filter((responsibility) => responsibility.id !== responsibilityId);
|
|
368
|
+
this.selectedResponsibilities.set(updatedResponsibilities);
|
|
369
|
+
// Remove responsibility data from matrix value
|
|
370
|
+
const currentMatrixData = this.value();
|
|
371
|
+
const updatedMatrixData = { ...currentMatrixData };
|
|
372
|
+
delete updatedMatrixData[responsibilityId];
|
|
373
|
+
// Emit updated matrix data
|
|
374
|
+
this.valueChange.emit(updatedMatrixData);
|
|
375
|
+
// Emit responsibility IDs change
|
|
376
|
+
const responsibilityIds = updatedResponsibilities.map((r) => r.id).filter((id) => id != null);
|
|
377
|
+
this.responsibilityIdsChange.emit(responsibilityIds);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Handle row change event from spreadsheet (add/remove)
|
|
381
|
+
*/
|
|
382
|
+
handleRowChange(event) {
|
|
383
|
+
if (event.type === 'remove') {
|
|
384
|
+
// Remove responsibility from selection
|
|
385
|
+
this.handleRemoveResponsibility(event.rowId);
|
|
386
|
+
}
|
|
387
|
+
// Note: 'add' type shouldn't happen in fixed mode, but if it does, we can handle it here
|
|
388
|
+
}
|
|
389
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMOrganizationManagementResponsibilitiesMatrixComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
390
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMOrganizationManagementResponsibilitiesMatrixComponent, isStandalone: true, selector: "axm-responsibilities-matrix", inputs: { titles: { classPropertyName: "titles", publicName: "titles", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, responsibilityIds: { classPropertyName: "responsibilityIds", publicName: "responsibilityIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", cellChange: "cellChange", responsibilityIdsChange: "responsibilityIdsChange" }, host: { classAttribute: "axm-responsibilities-matrix" }, ngImport: i0, template: "<div class=\"__container\">\n <div class=\"__matrix-section\">\n <div class=\"__matrix-header ax-sm\">\n @if (!readonly()) {\n <ax-button color=\"primary\"\n [text]=\"'@organization-management:job-definitions.components.responsibilities-matrix.actions.choose-responsibilities.title' | translate | async\"\n (onClick)=\"handleSelectResponsibilities()\" [disabled]=\"isLoadingResponsibilityEntity()\">\n <ax-icon icon=\"far fa-plus\"></ax-icon>\n </ax-button>\n }\n </div>\n @if (isLoading()) {\n <div class=\"__loading\">\n <span>{{ '@organization-management:job-definitions.components.responsibilities-matrix.messages.loading-responsibility-levels' | translate | async\n }}</span>\n </div>\n } @else {\n <axp-spreadsheet [title]=\"'Responsibility / Level'\" [columns]=\"spreadsheetColumns()\" [rowsInput]=\"spreadsheetRows()\"\n [rowMode]=\"'fixed'\" [readonly]=\"readonly()\" [allowRemoveRows]=\"true\" [rowTitlePath]=\"'_responsibilityTitle'\"\n [rowDescriptionPath]=\"'_responsibilityDescription'\" (cellChange)=\"handleCellChange($event)\"\n (spreadsheetChange)=\"handleSpreadsheetChange($event)\" (rowChange)=\"handleRowChange($event)\"></axp-spreadsheet>\n }\n </div>\n</div>\n", styles: [".responsibilities-matrix{display:block;height:100%;width:100%}.responsibilities-matrix .__container,.responsibilities-matrix .__matrix-section{display:flex;flex-direction:column}.responsibilities-matrix .__matrix-header{margin-bottom:calc(var(--spacing, .25rem) * 3);display:flex;justify-content:flex-end}.responsibilities-matrix .__loading{display:flex;align-items:center;justify-content:center;padding:calc(var(--spacing, .25rem) * 8);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:var(--color-neutral-600, oklch(43.9% 0 none))}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXPSpreadsheetComponent, selector: "axp-spreadsheet", inputs: ["title", "columns", "rowMode", "rowsInput", "rowsModel", "readonly", "emptyCellPlaceholder", "rowTitlePath", "rowDescriptionPath", "allowAddRows", "allowRemoveRows"], outputs: ["rowsModelChange", "cellChange", "rowChange", "spreadsheetChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
391
|
+
}
|
|
392
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMOrganizationManagementResponsibilitiesMatrixComponent, decorators: [{
|
|
393
|
+
type: Component,
|
|
394
|
+
args: [{ selector: 'axm-responsibilities-matrix', standalone: true, imports: [CommonModule, AXPSpreadsheetComponent, AXButtonModule, AXDecoratorModule, AXTranslationModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: {
|
|
395
|
+
class: 'axm-responsibilities-matrix',
|
|
396
|
+
}, template: "<div class=\"__container\">\n <div class=\"__matrix-section\">\n <div class=\"__matrix-header ax-sm\">\n @if (!readonly()) {\n <ax-button color=\"primary\"\n [text]=\"'@organization-management:job-definitions.components.responsibilities-matrix.actions.choose-responsibilities.title' | translate | async\"\n (onClick)=\"handleSelectResponsibilities()\" [disabled]=\"isLoadingResponsibilityEntity()\">\n <ax-icon icon=\"far fa-plus\"></ax-icon>\n </ax-button>\n }\n </div>\n @if (isLoading()) {\n <div class=\"__loading\">\n <span>{{ '@organization-management:job-definitions.components.responsibilities-matrix.messages.loading-responsibility-levels' | translate | async\n }}</span>\n </div>\n } @else {\n <axp-spreadsheet [title]=\"'Responsibility / Level'\" [columns]=\"spreadsheetColumns()\" [rowsInput]=\"spreadsheetRows()\"\n [rowMode]=\"'fixed'\" [readonly]=\"readonly()\" [allowRemoveRows]=\"true\" [rowTitlePath]=\"'_responsibilityTitle'\"\n [rowDescriptionPath]=\"'_responsibilityDescription'\" (cellChange)=\"handleCellChange($event)\"\n (spreadsheetChange)=\"handleSpreadsheetChange($event)\" (rowChange)=\"handleRowChange($event)\"></axp-spreadsheet>\n }\n </div>\n</div>\n", styles: [".responsibilities-matrix{display:block;height:100%;width:100%}.responsibilities-matrix .__container,.responsibilities-matrix .__matrix-section{display:flex;flex-direction:column}.responsibilities-matrix .__matrix-header{margin-bottom:calc(var(--spacing, .25rem) * 3);display:flex;justify-content:flex-end}.responsibilities-matrix .__loading{display:flex;align-items:center;justify-content:center;padding:calc(var(--spacing, .25rem) * 8);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:var(--color-neutral-600, oklch(43.9% 0 none))}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
|
|
397
|
+
}], ctorParameters: () => [], propDecorators: { titles: [{ type: i0.Input, args: [{ isSignal: true, alias: "titles", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], responsibilityIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "responsibilityIds", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], cellChange: [{ type: i0.Output, args: ["cellChange"] }], responsibilityIdsChange: [{ type: i0.Output, args: ["responsibilityIdsChange"] }] } });
|
|
398
|
+
|
|
399
|
+
export { AXMOrganizationManagementResponsibilitiesMatrixComponent as A };
|
|
400
|
+
//# sourceMappingURL=acorex-platform-module-organization-management-client-responsibilities-matrix.component-DqO6xE2p.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-organization-management-client-responsibilities-matrix.component-DqO6xE2p.mjs","sources":["../../../../libs/modules/organization-management/client/src/lib/features/responsibilities-matrix/responsibilities-matrix.component.ts","../../../../libs/modules/organization-management/client/src/lib/features/responsibilities-matrix/responsibilities-matrix.component.html"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPEntity } from '@acorex-platform/framework-shared/entity';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { type AXPWidgetNode, AXPWidgetsList } from '@acorex-platform/framework-shared/core';\n\nimport {\n AXPSpreadsheetCellChangeEvent,\n AXPSpreadsheetColumn,\n AXPSpreadsheetComponent,\n AXPSpreadsheetData,\n AXPSpreadsheetItem,\n AXPSpreadsheetRowChangeEvent,\n} from '@acorex-platform/framework-client/layout/components';\nimport {\n AXPEntityDataSelectorService,\n AXPEntityDefinitionRegistryService,\n AXPEntityService,\n} from '@acorex-platform/framework-client/layout/entity';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { RootConfig } from '@acorex-platform/module-organization-management-client/contracts';\nimport { AXMOrganizationManagementResponsibilityLevelEntityModel } from '@acorex-platform/module-organization-management-client/contracts';\nimport { AXMOrganizationManagementResponsibilityEntityModel } from '@acorex-platform/module-organization-management-client/contracts';\n\n//#endregion\n\n//#region ---- Component Definition ----\n\n@Component({\n selector: 'axm-responsibilities-matrix',\n standalone: true,\n imports: [CommonModule, AXPSpreadsheetComponent, AXButtonModule, AXDecoratorModule, AXTranslationModule],\n templateUrl: './responsibilities-matrix.component.html',\n styleUrl: './responsibilities-matrix.component.css',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'axm-responsibilities-matrix',\n },\n})\nexport class AXMOrganizationManagementResponsibilitiesMatrixComponent {\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly responsibilityLevelDataAccessor = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.responsibilityLevel.name)\n .data<string, AXMOrganizationManagementResponsibilityLevelEntityModel>();\n private readonly responsibilityDataAccessor = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.responsibility.name)\n .data<string, AXMOrganizationManagementResponsibilityEntityModel>();\n private readonly entityDataSelectorService = inject(AXPEntityDataSelectorService);\n private readonly entityResolver = inject(AXPEntityDefinitionRegistryService);\n private readonly multiLanguageResolver = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Inputs ----\n\n /**\n * Array of job levels to display as columns (e.g., Junior, Mid-Level, Senior)\n */\n titles = input<AXPSpreadsheetItem[]>([]);\n\n /**\n * Initial matrix data: { [responsibilityId]: { [title.id]: responsibilityLevelId } }\n */\n value = input<AXPSpreadsheetData>({});\n\n /**\n * Whether the matrix is in readonly mode\n */\n readonly = input<boolean>(false);\n\n /**\n * Initial responsibility IDs (for syncing with parent entity)\n */\n responsibilityIds = input<string[]>([]);\n\n //#endregion\n\n //#region ---- Outputs ----\n\n /**\n * Emitted when the matrix value changes\n */\n valueChange = output<AXPSpreadsheetData>();\n\n /**\n * Emitted when a single cell value changes\n */\n cellChange = output<AXPSpreadsheetCellChangeEvent>();\n\n /**\n * Emitted when selected responsibilities change (responsibility IDs array)\n */\n responsibilityIdsChange = output<string[]>();\n\n //#endregion\n\n //#region ---- Class Properties ----\n\n /**\n * Responsibility levels loaded from the service\n */\n private responsibilityLevels = signal<AXMOrganizationManagementResponsibilityLevelEntityModel[]>([]);\n\n /**\n * Selected responsibilities (internal state)\n */\n protected selectedResponsibilities = signal<AXMOrganizationManagementResponsibilityEntityModel[]>([]);\n\n /**\n * Responsibility entity definition\n */\n private responsibilityEntityDef = signal<AXPEntity | null>(null);\n\n /**\n * Loading state\n */\n protected isLoading = signal<boolean>(true);\n\n /**\n * Loading state for responsibility entity\n */\n protected isLoadingResponsibilityEntity = signal<boolean>(false);\n\n //#endregion\n\n //#region ---- Computed Properties ----\n\n /**\n * Vertical titles (responsibilities) - rows of the matrix\n */\n protected verticalTitles = computed<AXPSpreadsheetItem[]>(() => {\n const responsibilities = this.selectedResponsibilities();\n const resolve = (v: unknown) => this.multiLanguageResolver.resolve(v as any);\n const result = (responsibilities ?? []).map((responsibility) => ({\n id: responsibility.id,\n title: resolve(responsibility.title),\n description: responsibility.description ? resolve(responsibility.description) : undefined,\n }));\n return result;\n });\n\n /**\n * Horizontal titles (job levels) - columns of the matrix\n */\n protected horizontalTitles = computed<AXPSpreadsheetItem[]>(() => {\n const titlesInput = this.titles();\n const resolve = (v: unknown) => this.multiLanguageResolver.resolve(v as any);\n const result = (titlesInput ?? []).map((title) => ({\n id: title.id,\n title: resolve(title.title),\n description: title.description ? resolve(title.description) : undefined,\n }));\n return result;\n });\n\n /**\n * Cell options (responsibility levels) - dropdown options for each cell, loaded from service\n */\n protected cellOptions = computed<AXPSpreadsheetItem[]>(() => {\n const levels = this.responsibilityLevels();\n const resolve = (v: unknown) => this.multiLanguageResolver.resolve(v as any);\n const result = (levels ?? []).map((level) => ({\n id: level.id,\n title: resolve(level.title),\n description: level.description ? resolve(level.description) : undefined,\n }));\n return result;\n });\n\n /**\n * Spreadsheet columns - converted from horizontalTitles (job levels)\n */\n protected spreadsheetColumns = computed<AXPSpreadsheetColumn[]>(() => {\n const horizontalTitles = this.horizontalTitles();\n const cellOptions = this.cellOptions();\n\n // Create SelectBox widget configuration for responsibility levels\n const selectBoxWidget: AXPWidgetNode = {\n type: AXPWidgetsList.Editors.SelectBox,\n options: {\n valueField: 'id',\n textField: 'title',\n dataSource: cellOptions.map((option) => ({\n id: option.id,\n title: option.title,\n description: option.description,\n })),\n },\n };\n\n // Convert horizontal titles to columns\n return horizontalTitles.map((title) => ({\n name: title.id,\n title: title.title,\n description: title.description,\n path: title.id, // Path to access the value in row object\n widget: selectBoxWidget,\n }));\n });\n\n /**\n * Spreadsheet rows - converted from matrix data and vertical titles\n */\n protected spreadsheetRows = computed<Record<string, any>[]>(() => {\n const verticalTitles = this.verticalTitles();\n const horizontalTitles = this.horizontalTitles();\n const matrixData = this.value();\n\n // Convert matrix data to spreadsheet rows\n return verticalTitles.map((responsibility) => {\n const row: Record<string, any> = {\n name: responsibility.id, // Required for fixed mode row identification\n _responsibilityTitle: responsibility.title, // For row header display\n _responsibilityDescription: responsibility.description, // For row header description\n };\n\n // Add cell values for each horizontal title (column)\n horizontalTitles.forEach((title) => {\n const cellValue = matrixData[responsibility.id]?.[title.id] ?? null;\n row[title.id] = cellValue;\n });\n\n return row;\n });\n });\n\n //#endregion\n\n //#region ---- Lifecycle Methods ----\n\n constructor() {\n // Load responsibility levels and responsibility entity definition when component initializes\n this.loadResponsibilityLevels();\n this.loadResponsibilityEntityDef();\n\n // Watch for responsibilityIds input changes and sync selected responsibilities\n effect(() => {\n const ids = this.responsibilityIds();\n if (ids && ids.length > 0 && this.responsibilityEntityDef()) {\n this.loadResponsibilitiesByIds(ids);\n } else if (!ids || ids.length === 0) {\n // Try to extract responsibility IDs from matrix data keys\n const matrixData = this.value();\n const responsibilityIdsFromMatrix = Object.keys(matrixData || {});\n if (responsibilityIdsFromMatrix.length > 0 && this.responsibilityEntityDef()) {\n this.loadResponsibilitiesByIds(responsibilityIdsFromMatrix);\n } else {\n this.selectedResponsibilities.set([]);\n }\n }\n });\n\n // Watch for matrix value changes and extract responsibility IDs\n effect(() => {\n const matrixData = this.value();\n const currentResponsibilityIds = this.selectedResponsibilities().map((r) => r.id);\n const responsibilityIdsFromMatrix = Object.keys(matrixData || {});\n\n // If matrix has responsibilities that aren't in selectedResponsibilities, load them\n const missingIds = responsibilityIdsFromMatrix.filter((id) => !currentResponsibilityIds.includes(id));\n if (missingIds.length > 0 && this.responsibilityEntityDef()) {\n this.loadResponsibilitiesByIds(missingIds);\n }\n });\n }\n\n //#endregion\n\n //#region ---- Data Loading Methods ----\n\n /**\n * Load responsibility levels from the service\n */\n private async loadResponsibilityLevels(): Promise<void> {\n try {\n this.isLoading.set(true);\n const query = {\n skip: 0,\n take: 1000,\n sort: [{ field: 'level', dir: 'asc' as const }],\n };\n const result = await this.responsibilityLevelDataAccessor.query(query);\n this.responsibilityLevels.set(result.items || []);\n } catch (error) {\n console.error('Error loading responsibility levels:', error);\n this.responsibilityLevels.set([]);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n /**\n * Load responsibility entity definition\n */\n private async loadResponsibilityEntityDef(): Promise<void> {\n try {\n this.isLoadingResponsibilityEntity.set(true);\n const entityDef = await this.entityResolver.resolve(\n RootConfig.module.name,\n RootConfig.entities.responsibility.name,\n );\n this.responsibilityEntityDef.set(entityDef);\n } catch (error) {\n console.error('Error loading responsibility entity definition:', error);\n this.responsibilityEntityDef.set(null);\n } finally {\n this.isLoadingResponsibilityEntity.set(false);\n }\n }\n\n /**\n * Load responsibilities by IDs\n */\n private async loadResponsibilitiesByIds(ids: string[]): Promise<void> {\n try {\n const responsibilities: AXMOrganizationManagementResponsibilityEntityModel[] = [];\n\n for (const id of ids) {\n try {\n const responsibility = await this.responsibilityDataAccessor.byKey(id);\n if (responsibility) {\n responsibilities.push(responsibility);\n }\n } catch (error) {\n console.error(`Error loading responsibility ${id}:`, error);\n }\n }\n\n this.selectedResponsibilities.set(responsibilities);\n } catch (error) {\n console.error('Error loading responsibilities by IDs:', error);\n }\n }\n\n //#endregion\n\n //#region ---- Data Transformation Methods ----\n\n /**\n * Convert spreadsheet rows back to matrix data format\n */\n private convertSpreadsheetRowsToMatrixData(rows: Record<string, any>[]): AXPSpreadsheetData {\n const horizontalTitles = this.horizontalTitles();\n const matrixData: AXPSpreadsheetData = {};\n\n rows.forEach((row) => {\n const responsibilityId = row['name']; // Row identifier (responsibility ID)\n if (!responsibilityId) {\n return;\n }\n\n matrixData[responsibilityId] = {};\n\n // Extract cell values for each column\n horizontalTitles.forEach((title) => {\n const cellValue = row[title.id] ?? null;\n matrixData[responsibilityId][title.id] = cellValue;\n });\n });\n\n return matrixData;\n }\n\n //#endregion\n\n //#region ---- Event Handlers ----\n\n /**\n * Handle spreadsheet change event - convert to matrix format\n */\n protected handleSpreadsheetChange(rows: Record<string, any>[]): void {\n const matrixData = this.convertSpreadsheetRowsToMatrixData(rows);\n this.valueChange.emit(matrixData);\n\n // Extract responsibility IDs from row names and emit\n const responsibilityIds = rows.map((row) => row['name']).filter((id) => id != null);\n this.responsibilityIdsChange.emit(responsibilityIds);\n }\n\n /**\n * Handle cell change event from spreadsheet\n */\n protected handleCellChange(event: AXPSpreadsheetCellChangeEvent): void {\n this.cellChange.emit(event);\n }\n\n /**\n * Open responsibility selector dialog\n */\n protected async handleSelectResponsibilities(): Promise<void> {\n const entityDef = this.responsibilityEntityDef();\n if (!entityDef) {\n console.error('Responsibility entity definition not loaded');\n return;\n }\n\n try {\n // Get currently selected responsibility IDs\n const selectedItemIds = this.selectedResponsibilities()\n .map((responsibility) => responsibility.id)\n .filter((id) => id != null);\n\n const result = await this.entityDataSelectorService.open({\n entity: entityDef,\n title: 'Select Responsibilities',\n allowMultiple: true,\n selectedItemIds: selectedItemIds.length > 0 ? selectedItemIds : undefined,\n });\n\n if (result && result.items && result.items.length > 0) {\n // Update selected responsibilities\n this.selectedResponsibilities.set(result.items);\n // Emit responsibility IDs change\n const responsibilityIds = result.items.map((item) => item.id).filter((id) => id != null);\n this.responsibilityIdsChange.emit(responsibilityIds);\n }\n } catch (error) {\n console.error('Error opening responsibility selector:', error);\n }\n }\n\n /**\n * Remove a responsibility from selection\n */\n protected handleRemoveResponsibility(responsibilityId: string): void {\n const currentResponsibilities = this.selectedResponsibilities();\n const updatedResponsibilities = currentResponsibilities.filter(\n (responsibility) => responsibility.id !== responsibilityId,\n );\n this.selectedResponsibilities.set(updatedResponsibilities);\n\n // Remove responsibility data from matrix value\n const currentMatrixData = this.value();\n const updatedMatrixData = { ...currentMatrixData };\n delete updatedMatrixData[responsibilityId];\n\n // Emit updated matrix data\n this.valueChange.emit(updatedMatrixData);\n\n // Emit responsibility IDs change\n const responsibilityIds = updatedResponsibilities.map((r) => r.id).filter((id) => id != null);\n this.responsibilityIdsChange.emit(responsibilityIds);\n }\n\n /**\n * Handle row change event from spreadsheet (add/remove)\n */\n protected handleRowChange(event: AXPSpreadsheetRowChangeEvent): void {\n if (event.type === 'remove') {\n // Remove responsibility from selection\n this.handleRemoveResponsibility(event.rowId);\n }\n // Note: 'add' type shouldn't happen in fixed mode, but if it does, we can handle it here\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"__container\">\n <div class=\"__matrix-section\">\n <div class=\"__matrix-header ax-sm\">\n @if (!readonly()) {\n <ax-button color=\"primary\"\n [text]=\"'@organization-management:job-definitions.components.responsibilities-matrix.actions.choose-responsibilities.title' | translate | async\"\n (onClick)=\"handleSelectResponsibilities()\" [disabled]=\"isLoadingResponsibilityEntity()\">\n <ax-icon icon=\"far fa-plus\"></ax-icon>\n </ax-button>\n }\n </div>\n @if (isLoading()) {\n <div class=\"__loading\">\n <span>{{ '@organization-management:job-definitions.components.responsibilities-matrix.messages.loading-responsibility-levels' | translate | async\n }}</span>\n </div>\n } @else {\n <axp-spreadsheet [title]=\"'Responsibility / Level'\" [columns]=\"spreadsheetColumns()\" [rowsInput]=\"spreadsheetRows()\"\n [rowMode]=\"'fixed'\" [readonly]=\"readonly()\" [allowRemoveRows]=\"true\" [rowTitlePath]=\"'_responsibilityTitle'\"\n [rowDescriptionPath]=\"'_responsibilityDescription'\" (cellChange)=\"handleCellChange($event)\"\n (spreadsheetChange)=\"handleSpreadsheetChange($event)\" (rowChange)=\"handleRowChange($event)\"></axp-spreadsheet>\n }\n </div>\n</div>\n"],"names":["i4"],"mappings":"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"}
|