@acorex/connectivity 21.0.0-next.5 → 21.0.0-next.51

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 (110) hide show
  1. package/fesm2022/{acorex-connectivity-api-execute.command-SGNBLcOi.mjs → acorex-connectivity-api-execute.command-CiBl7z_H.mjs} +6 -6
  2. package/fesm2022/acorex-connectivity-api-execute.command-CiBl7z_H.mjs.map +1 -0
  3. package/fesm2022/acorex-connectivity-api.mjs +190 -188
  4. package/fesm2022/acorex-connectivity-api.mjs.map +1 -1
  5. package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-D2T8rLl4.mjs +78673 -0
  6. package/fesm2022/acorex-connectivity-mock-acorex-connectivity-mock-D2T8rLl4.mjs.map +1 -0
  7. package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-DcsMxP4h.mjs +288 -0
  8. package/fesm2022/acorex-connectivity-mock-assign-to-manager.activity-DcsMxP4h.mjs.map +1 -0
  9. package/fesm2022/acorex-connectivity-mock-category-metadata-inheritance.query-CWRL1dTa.mjs +198 -0
  10. package/fesm2022/acorex-connectivity-mock-category-metadata-inheritance.query-CWRL1dTa.mjs.map +1 -0
  11. package/fesm2022/{acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs → acorex-connectivity-mock-category-with-items.query-Cj6FWu7S.mjs} +4 -4
  12. package/fesm2022/acorex-connectivity-mock-category-with-items.query-Cj6FWu7S.mjs.map +1 -0
  13. package/fesm2022/acorex-connectivity-mock-chat-generate-image.command-ihYQR4Wt.mjs +108 -0
  14. package/fesm2022/acorex-connectivity-mock-chat-generate-image.command-ihYQR4Wt.mjs.map +1 -0
  15. package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-HWKR08gj.mjs +130 -0
  16. package/fesm2022/acorex-connectivity-mock-chat-synthesize-speech.command-HWKR08gj.mjs.map +1 -0
  17. package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-BrFX59uP.mjs +110 -0
  18. package/fesm2022/acorex-connectivity-mock-chat-transcribe-speech.command-BrFX59uP.mjs.map +1 -0
  19. package/fesm2022/acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs +45 -0
  20. package/fesm2022/acorex-connectivity-mock-check-permission.activity-vr3OHtjC.mjs.map +1 -0
  21. package/fesm2022/acorex-connectivity-mock-complete-signature-process.activity-BO-IFsHT.mjs +56 -0
  22. package/fesm2022/acorex-connectivity-mock-complete-signature-process.activity-BO-IFsHT.mjs.map +1 -0
  23. package/fesm2022/acorex-connectivity-mock-contact-core.module-5TLCGWOR.mjs +968 -0
  24. package/fesm2022/acorex-connectivity-mock-contact-core.module-5TLCGWOR.mjs.map +1 -0
  25. package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs +16 -0
  26. package/fesm2022/acorex-connectivity-mock-content-management.module-GQdqKsPB.mjs.map +1 -0
  27. package/fesm2022/{acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs → acorex-connectivity-mock-distribution-record.activity-DuNluOzA.mjs} +18 -6
  28. package/fesm2022/acorex-connectivity-mock-distribution-record.activity-DuNluOzA.mjs.map +1 -0
  29. package/fesm2022/acorex-connectivity-mock-entity-create.activity-Ca19tIj4.mjs +60 -0
  30. package/fesm2022/acorex-connectivity-mock-entity-create.activity-Ca19tIj4.mjs.map +1 -0
  31. package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs +60 -0
  32. package/fesm2022/acorex-connectivity-mock-entity-delete.activity-ErEN1c24.mjs.map +1 -0
  33. package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs +67 -0
  34. package/fesm2022/acorex-connectivity-mock-entity-read.activity-1fJW8gVe.mjs.map +1 -0
  35. package/fesm2022/acorex-connectivity-mock-entity-update.activity-06HTKiQQ.mjs +68 -0
  36. package/fesm2022/acorex-connectivity-mock-entity-update.activity-06HTKiQQ.mjs.map +1 -0
  37. package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs +64 -0
  38. package/fesm2022/acorex-connectivity-mock-extract-document-text.command-nGfUTSf6.mjs.map +1 -0
  39. package/fesm2022/{acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs → acorex-connectivity-mock-get-application-versions-chart-data.query-DwVuYuKx.mjs} +4 -4
  40. package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-DwVuYuKx.mjs.map +1 -0
  41. package/fesm2022/{acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs → acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs} +4 -4
  42. package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-sFKYynZA.mjs.map +1 -0
  43. package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-CsmxwXsM.mjs +39 -0
  44. package/fesm2022/acorex-connectivity-mock-get-current-session-user.activity-CsmxwXsM.mjs.map +1 -0
  45. package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs +69 -0
  46. package/fesm2022/acorex-connectivity-mock-get-current-user-manager.activity-C1mj2bgB.mjs.map +1 -0
  47. package/fesm2022/acorex-connectivity-mock-get-employee-list.query-DifHwuqH.mjs +213 -0
  48. package/fesm2022/acorex-connectivity-mock-get-employee-list.query-DifHwuqH.mjs.map +1 -0
  49. package/fesm2022/acorex-connectivity-mock-get-location-list.query-bMjkZnzq.mjs +209 -0
  50. package/fesm2022/acorex-connectivity-mock-get-location-list.query-bMjkZnzq.mjs.map +1 -0
  51. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs +186 -0
  52. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-D7DBzLT-.mjs.map +1 -0
  53. package/fesm2022/{acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs → acorex-connectivity-mock-get-product-list.query-f-mTj4ah.mjs} +107 -11
  54. package/fesm2022/acorex-connectivity-mock-get-product-list.query-f-mTj4ah.mjs.map +1 -0
  55. package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-Co1V52c4.mjs +192 -0
  56. package/fesm2022/acorex-connectivity-mock-get-product-pdf-data.query-Co1V52c4.mjs.map +1 -0
  57. package/fesm2022/{acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs → acorex-connectivity-mock-get-subscriptions-chart-data.query-BQT5a_hn.mjs} +5 -5
  58. package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-BQT5a_hn.mjs.map +1 -0
  59. package/fesm2022/{acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs → acorex-connectivity-mock-get-subscriptions-timeline.query-D4qfDfeV.mjs} +91 -13
  60. package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-D4qfDfeV.mjs.map +1 -0
  61. package/fesm2022/{acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs → acorex-connectivity-mock-get-tenant-application-access.query-n1_Azada.mjs} +91 -13
  62. package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-n1_Azada.mjs.map +1 -0
  63. package/fesm2022/{acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs → acorex-connectivity-mock-get-tenant-registration-chart-data.query-Cg4ykZU2.mjs} +5 -5
  64. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-Cg4ykZU2.mjs.map +1 -0
  65. package/fesm2022/{acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs → acorex-connectivity-mock-get-tenant-registration-timeline.query-0sCBtdbp.mjs} +91 -13
  66. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-0sCBtdbp.mjs.map +1 -0
  67. package/fesm2022/{acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs → acorex-connectivity-mock-get-tenant-user-distribution.query-rD811gtM.mjs} +91 -13
  68. package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-rD811gtM.mjs.map +1 -0
  69. package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs +35 -0
  70. package/fesm2022/acorex-connectivity-mock-if.activity-DvzuhItL.mjs.map +1 -0
  71. package/fesm2022/acorex-connectivity-mock-notification-management-email-send.command-DAQfIWoD.mjs +73 -0
  72. package/fesm2022/acorex-connectivity-mock-notification-management-email-send.command-DAQfIWoD.mjs.map +1 -0
  73. package/fesm2022/acorex-connectivity-mock-notify-signers.activity-Dg0sKGip.mjs +49 -0
  74. package/fesm2022/acorex-connectivity-mock-notify-signers.activity-Dg0sKGip.mjs.map +1 -0
  75. package/fesm2022/acorex-connectivity-mock-request-signature.activity-CoRT_H2u.mjs +60 -0
  76. package/fesm2022/acorex-connectivity-mock-request-signature.activity-CoRT_H2u.mjs.map +1 -0
  77. package/fesm2022/{acorex-connectivity-mock-sample.command-CkH5bmEs.mjs → acorex-connectivity-mock-sample.command-CJmDL4pL.mjs} +4 -4
  78. package/fesm2022/acorex-connectivity-mock-sample.command-CJmDL4pL.mjs.map +1 -0
  79. package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs +38 -0
  80. package/fesm2022/acorex-connectivity-mock-structured-text-completion.command-l31pjl9-.mjs.map +1 -0
  81. package/fesm2022/acorex-connectivity-mock-user-roles-for-list-column.query-Ch--rL7K.mjs +30 -0
  82. package/fesm2022/acorex-connectivity-mock-user-roles-for-list-column.query-Ch--rL7K.mjs.map +1 -0
  83. package/fesm2022/acorex-connectivity-mock-validate-all-signatures.activity-JuHjNFFS.mjs +61 -0
  84. package/fesm2022/acorex-connectivity-mock-validate-all-signatures.activity-JuHjNFFS.mjs.map +1 -0
  85. package/fesm2022/acorex-connectivity-mock.mjs +2 -49588
  86. package/fesm2022/acorex-connectivity-mock.mjs.map +1 -1
  87. package/fesm2022/acorex-connectivity-utils.mjs +7 -7
  88. package/fesm2022/acorex-connectivity-utils.mjs.map +1 -1
  89. package/fesm2022/acorex-connectivity.mjs.map +1 -1
  90. package/package.json +8 -7
  91. package/{api/index.d.ts → types/acorex-connectivity-api.d.ts} +13 -60
  92. package/types/acorex-connectivity-mock.d.ts +4133 -0
  93. package/fesm2022/acorex-connectivity-api-execute.command-SGNBLcOi.mjs.map +0 -1
  94. package/fesm2022/acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs.map +0 -1
  95. package/fesm2022/acorex-connectivity-mock-distribution-record.command-DRiDwlqN.mjs.map +0 -1
  96. package/fesm2022/acorex-connectivity-mock-get-application-versions-chart-data.query-C3eQfF0A.mjs.map +0 -1
  97. package/fesm2022/acorex-connectivity-mock-get-application-versions-timeline.query-CLzDz9ob.mjs.map +0 -1
  98. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs +0 -97
  99. package/fesm2022/acorex-connectivity-mock-get-product-chart-data.query-DDVVFeYN.mjs.map +0 -1
  100. package/fesm2022/acorex-connectivity-mock-get-product-list.query-ChtYlSTt.mjs.map +0 -1
  101. package/fesm2022/acorex-connectivity-mock-get-subscriptions-chart-data.query-HxX_bCT8.mjs.map +0 -1
  102. package/fesm2022/acorex-connectivity-mock-get-subscriptions-timeline.query-dp08JqLP.mjs.map +0 -1
  103. package/fesm2022/acorex-connectivity-mock-get-tenant-application-access.query-IATTXcAV.mjs.map +0 -1
  104. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-chart-data.query-DlXi4Rcg.mjs.map +0 -1
  105. package/fesm2022/acorex-connectivity-mock-get-tenant-registration-timeline.query-hskw8Ioa.mjs.map +0 -1
  106. package/fesm2022/acorex-connectivity-mock-get-tenant-user-distribution.query-Bs5U5tze.mjs.map +0 -1
  107. package/fesm2022/acorex-connectivity-mock-sample.command-CkH5bmEs.mjs.map +0 -1
  108. package/mock/index.d.ts +0 -2557
  109. /package/{utils/index.d.ts → types/acorex-connectivity-utils.d.ts} +0 -0
  110. /package/{index.d.ts → types/acorex-connectivity.d.ts} +0 -0
@@ -0,0 +1,288 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import { RootConfig } from '@acorex/modules/human-capital-management';
4
+ import { RootConfig as RootConfig$2 } from '@acorex/modules/organization-management';
5
+ import { RootConfig as RootConfig$1 } from '@acorex/modules/person-core';
6
+ import { AXPSessionService } from '@acorex/platform/auth';
7
+ import { AXPEntityStorageService } from '@acorex/platform/layout/entity';
8
+ import { c as axcSyncSingleEmployeeDenormalizedOrgFields } from './acorex-connectivity-mock-acorex-connectivity-mock-D2T8rLl4.mjs';
9
+
10
+ const EMPLOYEE_ENTITY = RootConfig.entities.employee.source;
11
+ const PERSON_ENTITY = `${RootConfig$1.module.name}.${RootConfig$1.entities.person.name}`;
12
+ //#region ---- Helpers ----
13
+ /**
14
+ * Resolves a persisted FK or lookup snapshot to a scalar id (avoids `String([object Object])` from expanded rows).
15
+ */
16
+ function axcScalarEntityId(value) {
17
+ if (value == null || value === '') {
18
+ return null;
19
+ }
20
+ if (typeof value === 'string' || typeof value === 'number') {
21
+ const s = String(value).trim();
22
+ return s.length > 0 ? s : null;
23
+ }
24
+ if (typeof value === 'object' && value !== null && 'id' in value) {
25
+ const id = value.id;
26
+ if (id == null || id === '') {
27
+ return null;
28
+ }
29
+ const s = String(id).trim();
30
+ return s.length > 0 ? s : null;
31
+ }
32
+ return null;
33
+ }
34
+ /** Non-empty trimmed string or undefined (for optional workflow command inputs). */
35
+ function axcOptionalTrimmedString(raw) {
36
+ if (raw == null || raw === '') {
37
+ return undefined;
38
+ }
39
+ const s = typeof raw === 'string' ? raw.trim() : String(raw).trim();
40
+ return s.length > 0 ? s : undefined;
41
+ }
42
+ /**
43
+ * Reads subject employee FK from any aggregate row (leave request, lifecycle process, etc.).
44
+ */
45
+ function axcExtractSubjectEmployeeIdFromRecord(record) {
46
+ const scalarFields = [
47
+ 'employeeId',
48
+ 'assigneeEmployeeId',
49
+ 'subjectEmployeeId',
50
+ 'requesterEmployeeId',
51
+ 'ownerEmployeeId',
52
+ ];
53
+ for (const field of scalarFields) {
54
+ const id = axcScalarEntityId(record[field]);
55
+ if (id) {
56
+ return { subjectEmployeeId: id, nestedEmployeeHint: null, nameHint: undefined };
57
+ }
58
+ }
59
+ const nestedFields = ['employee', 'assignee', 'subject'];
60
+ for (const field of nestedFields) {
61
+ const nested = record[field];
62
+ const id = axcScalarEntityId(nested);
63
+ if (!id) {
64
+ continue;
65
+ }
66
+ let hint = null;
67
+ if (nested !== null && typeof nested === 'object') {
68
+ const o = nested;
69
+ hint = {
70
+ displayName: o.person?.displayName ?? o.displayName ?? '',
71
+ ...o,
72
+ };
73
+ }
74
+ return { subjectEmployeeId: id, nestedEmployeeHint: hint, nameHint: undefined };
75
+ }
76
+ const nameHintRaw = record['employeeName'];
77
+ const nameHint = typeof nameHintRaw === 'string' && nameHintRaw.trim() !== ''
78
+ ? nameHintRaw.trim()
79
+ : typeof nameHintRaw === 'object' &&
80
+ nameHintRaw !== null &&
81
+ 'en-US' in nameHintRaw
82
+ ? String(nameHintRaw['en-US'] ?? '').trim() || undefined
83
+ : undefined;
84
+ return {
85
+ subjectEmployeeId: null,
86
+ nestedEmployeeHint: null,
87
+ nameHint,
88
+ };
89
+ }
90
+ /**
91
+ * Assign To Manager Activity (Backend - Mock)
92
+ *
93
+ * Resolves the line-manager **employee** from org chart storage, then the manager's **login user id**
94
+ * (`Employee.userId` or `Person.userId`). Works for any workflow: pass `employeeId`, or `sourceEntity` + `sourceRecordId`
95
+ * for an aggregate that carries an employee FK / nested employee.
96
+ *
97
+ * Execution Mode: backend
98
+ * Activity Type: workflow-activity:assign-to-manager
99
+ */
100
+ class AssignToManagerActivity {
101
+ constructor() {
102
+ this.entityStorage = inject(AXPEntityStorageService);
103
+ this.sessionService = inject(AXPSessionService);
104
+ }
105
+ //#region ---- Employee / manager resolution ----
106
+ /**
107
+ * Resolves login user id for an employee row (storage may omit `userId` while Person still links the account).
108
+ */
109
+ async resolveLoginUserIdForEmployeeRow(managerEmp) {
110
+ const direct = managerEmp?.userId != null && String(managerEmp.userId).trim() !== '' ? String(managerEmp.userId).trim() : null;
111
+ if (direct) {
112
+ return direct;
113
+ }
114
+ const personId = managerEmp?.personId != null && String(managerEmp.personId).trim() !== ''
115
+ ? String(managerEmp.personId).trim()
116
+ : null;
117
+ if (!personId) {
118
+ return null;
119
+ }
120
+ try {
121
+ const person = (await this.entityStorage.getOne(PERSON_ENTITY, personId));
122
+ const uid = person?.userId != null && String(person.userId).trim() !== '' ? String(person.userId).trim() : null;
123
+ return uid;
124
+ }
125
+ catch {
126
+ return null;
127
+ }
128
+ }
129
+ mapEmployeeRowToOutput(emp) {
130
+ if (!emp) {
131
+ return { displayName: '' };
132
+ }
133
+ return {
134
+ displayName: emp.person?.displayName ?? emp.displayName ?? '',
135
+ ...emp,
136
+ };
137
+ }
138
+ /**
139
+ * Syncs denormalized manager on the subject employee, loads manager employee, returns ids + row shape.
140
+ */
141
+ async resolveManagerDetails(employeeId) {
142
+ await axcSyncSingleEmployeeDenormalizedOrgFields(this.entityStorage, RootConfig$2, RootConfig, String(employeeId), true);
143
+ const emp = (await this.entityStorage.getOne(EMPLOYEE_ENTITY, String(employeeId)));
144
+ const managerEmployeeIdRaw = emp?.managerId != null ? String(emp.managerId).trim() : '';
145
+ if (!managerEmployeeIdRaw) {
146
+ return {
147
+ managerUserId: null,
148
+ managerEmployeeId: null,
149
+ manager: { displayName: '' },
150
+ };
151
+ }
152
+ const managerEmp = (await this.entityStorage.getOne(EMPLOYEE_ENTITY, managerEmployeeIdRaw));
153
+ const managerUserId = await this.resolveLoginUserIdForEmployeeRow(managerEmp);
154
+ return {
155
+ managerUserId,
156
+ managerEmployeeId: managerEmployeeIdRaw,
157
+ manager: this.mapEmployeeRowToOutput(managerEmp),
158
+ };
159
+ }
160
+ async findEmployeeIdByUserId(userId) {
161
+ try {
162
+ const result = await this.entityStorage.query(EMPLOYEE_ENTITY, {
163
+ skip: 0,
164
+ take: 1,
165
+ filter: {
166
+ field: 'userId',
167
+ operator: { type: 'equal' },
168
+ value: userId,
169
+ },
170
+ });
171
+ const row = result.items?.[0];
172
+ return row?.id != null ? String(row.id) : null;
173
+ }
174
+ catch {
175
+ return null;
176
+ }
177
+ }
178
+ async loadSubjectEmployeeOutput(subjectEmployeeId) {
179
+ try {
180
+ const emp = (await this.entityStorage.getOne(EMPLOYEE_ENTITY, subjectEmployeeId));
181
+ return emp ? this.mapEmployeeRowToOutput(emp) : { displayName: '' };
182
+ }
183
+ catch {
184
+ return { displayName: '' };
185
+ }
186
+ }
187
+ //#endregion
188
+ async execute(input) {
189
+ const sourceEntity = axcOptionalTrimmedString(input.sourceEntity);
190
+ const sourceRecordId = axcOptionalTrimmedString(input.sourceRecordId);
191
+ let managerId = null;
192
+ let managerEmployeeId = null;
193
+ let manager = { displayName: '' };
194
+ let employee = { displayName: '' };
195
+ let subjectEmployeeId = null;
196
+ const employeeIdFromInput = axcScalarEntityId(input.employeeId);
197
+ const applyManagerResolution = async (empId) => {
198
+ subjectEmployeeId = empId;
199
+ employee = await this.loadSubjectEmployeeOutput(empId);
200
+ const details = await this.resolveManagerDetails(empId);
201
+ managerId = details.managerUserId;
202
+ managerEmployeeId = details.managerEmployeeId;
203
+ manager = details.manager;
204
+ };
205
+ if (employeeIdFromInput) {
206
+ try {
207
+ await applyManagerResolution(employeeIdFromInput);
208
+ }
209
+ catch {
210
+ // keep defaults
211
+ }
212
+ }
213
+ else if (sourceEntity && sourceRecordId) {
214
+ try {
215
+ const record = (await this.entityStorage.getOne(sourceEntity, sourceRecordId));
216
+ if (record) {
217
+ const { subjectEmployeeId: fromRecord, nestedEmployeeHint, nameHint } = axcExtractSubjectEmployeeIdFromRecord(record);
218
+ if (fromRecord) {
219
+ await applyManagerResolution(fromRecord);
220
+ if (!employee.displayName && nestedEmployeeHint) {
221
+ employee = {
222
+ ...nestedEmployeeHint,
223
+ displayName: nestedEmployeeHint.displayName || employee.displayName,
224
+ };
225
+ }
226
+ }
227
+ if (!employee.displayName && nameHint) {
228
+ employee = {
229
+ ...employee,
230
+ displayName: nameHint,
231
+ };
232
+ }
233
+ }
234
+ }
235
+ catch {
236
+ // keep defaults
237
+ }
238
+ }
239
+ const sessionUserId = this.sessionService.user?.id;
240
+ if (managerId == null && sessionUserId && !subjectEmployeeId) {
241
+ const initiatorEmployeeId = await this.findEmployeeIdByUserId(String(sessionUserId));
242
+ if (initiatorEmployeeId) {
243
+ try {
244
+ await applyManagerResolution(initiatorEmployeeId);
245
+ }
246
+ catch {
247
+ // ignore
248
+ }
249
+ }
250
+ }
251
+ const fallbackUserId = axcScalarEntityId(input.fallbackUserId);
252
+ if (managerId == null && fallbackUserId) {
253
+ managerId = fallbackUserId;
254
+ }
255
+ console.log('[WFM-LifecycleTaskTrace] assign-to-manager', {
256
+ subjectEmployeeId,
257
+ managerEmployeeId,
258
+ managerId,
259
+ fallbackUserId: fallbackUserId ?? null,
260
+ usedSourceRecordPath: !!(sourceEntity && sourceRecordId) && !employeeIdFromInput,
261
+ sourceEntity: sourceEntity ?? null,
262
+ sourceRecordId: sourceRecordId ?? null,
263
+ });
264
+ return {
265
+ success: true,
266
+ data: {
267
+ managerId,
268
+ managerEmployeeId,
269
+ manager,
270
+ employee,
271
+ },
272
+ metadata: {
273
+ outcome: 'done',
274
+ },
275
+ };
276
+ }
277
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AssignToManagerActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
278
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AssignToManagerActivity, providedIn: 'root' }); }
279
+ }
280
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AssignToManagerActivity, decorators: [{
281
+ type: Injectable,
282
+ args: [{
283
+ providedIn: 'root',
284
+ }]
285
+ }] });
286
+
287
+ export { AssignToManagerActivity };
288
+ //# sourceMappingURL=acorex-connectivity-mock-assign-to-manager.activity-DcsMxP4h.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-assign-to-manager.activity-DcsMxP4h.mjs","sources":["../../../../libs/connectivity/mock/src/lib/workflow-management/activities/assign-to-manager.activity.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { RootConfig as HcmRootConfig } from '@acorex/modules/human-capital-management';\nimport { RootConfig as OrgRootConfig } from '@acorex/modules/organization-management';\nimport { RootConfig as PersonRootConfig } from '@acorex/modules/person-core';\nimport { AXPSessionService } from '@acorex/platform/auth';\nimport { AXPExecuteCommandResult } from '@acorex/platform/core';\nimport { AXPEntityStorageService } from '@acorex/platform/layout/entity';\nimport { AXPCommand } from '@acorex/platform/runtime';\nimport { axcSyncSingleEmployeeDenormalizedOrgFields } from '../../organization-management/org-chart/employee-manager-resolution';\n\nconst EMPLOYEE_ENTITY = HcmRootConfig.entities.employee.source;\nconst PERSON_ENTITY = `${PersonRootConfig.module.name}.${PersonRootConfig.entities.person.name}`;\n\n//#region ---- Helpers ----\n\n/**\n * Resolves a persisted FK or lookup snapshot to a scalar id (avoids `String([object Object])` from expanded rows).\n */\nfunction axcScalarEntityId(value: unknown): string | null {\n if (value == null || value === '') {\n return null;\n }\n if (typeof value === 'string' || typeof value === 'number') {\n const s = String(value).trim();\n return s.length > 0 ? s : null;\n }\n if (typeof value === 'object' && value !== null && 'id' in value) {\n const id = (value as { id: unknown }).id;\n if (id == null || id === '') {\n return null;\n }\n const s = String(id).trim();\n return s.length > 0 ? s : null;\n }\n return null;\n}\n\n/** Non-empty trimmed string or undefined (for optional workflow command inputs). */\nfunction axcOptionalTrimmedString(raw: unknown): string | undefined {\n if (raw == null || raw === '') {\n return undefined;\n }\n const s = typeof raw === 'string' ? raw.trim() : String(raw).trim();\n return s.length > 0 ? s : undefined;\n}\n\ntype EmployeeOutputShape = { displayName: string; [key: string]: unknown };\n\n/**\n * Reads subject employee FK from any aggregate row (leave request, lifecycle process, etc.).\n */\nfunction axcExtractSubjectEmployeeIdFromRecord(record: Record<string, unknown>): {\n subjectEmployeeId: string | null;\n nestedEmployeeHint: EmployeeOutputShape | null;\n nameHint: string | undefined;\n} {\n const scalarFields = [\n 'employeeId',\n 'assigneeEmployeeId',\n 'subjectEmployeeId',\n 'requesterEmployeeId',\n 'ownerEmployeeId',\n ] as const;\n\n for (const field of scalarFields) {\n const id = axcScalarEntityId(record[field]);\n if (id) {\n return { subjectEmployeeId: id, nestedEmployeeHint: null, nameHint: undefined };\n }\n }\n\n const nestedFields = ['employee', 'assignee', 'subject'] as const;\n for (const field of nestedFields) {\n const nested = record[field];\n const id = axcScalarEntityId(nested);\n if (!id) {\n continue;\n }\n let hint: EmployeeOutputShape | null = null;\n if (nested !== null && typeof nested === 'object') {\n const o = nested as {\n displayName?: string;\n person?: { displayName?: string };\n [key: string]: unknown;\n };\n hint = {\n displayName: o.person?.displayName ?? o.displayName ?? '',\n ...o,\n };\n }\n return { subjectEmployeeId: id, nestedEmployeeHint: hint, nameHint: undefined };\n }\n\n const nameHintRaw = record['employeeName'];\n const nameHint =\n typeof nameHintRaw === 'string' && nameHintRaw.trim() !== ''\n ? nameHintRaw.trim()\n : typeof nameHintRaw === 'object' &&\n nameHintRaw !== null &&\n 'en-US' in (nameHintRaw as object)\n ? String((nameHintRaw as { 'en-US'?: unknown })['en-US'] ?? '').trim() || undefined\n : undefined;\n\n return {\n subjectEmployeeId: null,\n nestedEmployeeHint: null,\n nameHint,\n };\n}\n\n//#endregion\n\nexport interface AssignToManagerInput {\n /** When set (scalar or `{ id }`), resolves manager for this employee (highest precedence). */\n employeeId?: unknown;\n /**\n * Full entity source key for the workflow aggregate (e.g. `HumanCapitalManagement.LeaveRequest`).\n * Used with `sourceRecordId` when `employeeId` is not set.\n */\n sourceEntity?: unknown;\n /** Primary key of the record under `sourceEntity`. */\n sourceRecordId?: unknown;\n /** When org manager cannot be resolved, this platform user id is returned as `managerId` (e.g. initiator for review fallback). */\n fallbackUserId?: unknown;\n}\n\nexport interface AssignToManagerOutput {\n /** Manager's login **user** id — use for `assignedUserIds` / `candidateUserIds`. */\n managerId: string | null;\n /** HumanCapitalManagement.Employee id for the line manager when resolved from org chart. */\n managerEmployeeId: string | null;\n /** Resolved manager employee row (displayName + stored fields). */\n manager: EmployeeOutputShape;\n /** Subject employee under evaluation (whose manager was resolved). */\n employee: EmployeeOutputShape;\n}\n\n/**\n * Assign To Manager Activity (Backend - Mock)\n *\n * Resolves the line-manager **employee** from org chart storage, then the manager's **login user id**\n * (`Employee.userId` or `Person.userId`). Works for any workflow: pass `employeeId`, or `sourceEntity` + `sourceRecordId`\n * for an aggregate that carries an employee FK / nested employee.\n *\n * Execution Mode: backend\n * Activity Type: workflow-activity:assign-to-manager\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AssignToManagerActivity implements AXPCommand<AssignToManagerInput, AssignToManagerOutput> {\n private readonly entityStorage = inject(AXPEntityStorageService);\n private readonly sessionService = inject(AXPSessionService);\n\n //#region ---- Employee / manager resolution ----\n\n /**\n * Resolves login user id for an employee row (storage may omit `userId` while Person still links the account).\n */\n private async resolveLoginUserIdForEmployeeRow(\n managerEmp: { userId?: string | null; personId?: string | null } | null,\n ): Promise<string | null> {\n const direct =\n managerEmp?.userId != null && String(managerEmp.userId).trim() !== '' ? String(managerEmp.userId).trim() : null;\n if (direct) {\n return direct;\n }\n const personId =\n managerEmp?.personId != null && String(managerEmp.personId).trim() !== ''\n ? String(managerEmp.personId).trim()\n : null;\n if (!personId) {\n return null;\n }\n try {\n const person = (await this.entityStorage.getOne(PERSON_ENTITY, personId)) as { userId?: string | null } | null;\n const uid =\n person?.userId != null && String(person.userId).trim() !== '' ? String(person.userId).trim() : null;\n return uid;\n } catch {\n return null;\n }\n }\n\n private mapEmployeeRowToOutput(\n emp:\n | ({\n displayName?: string;\n person?: { displayName?: string };\n [key: string]: unknown;\n } & { id?: string })\n | null,\n ): EmployeeOutputShape {\n if (!emp) {\n return { displayName: '' };\n }\n return {\n displayName: emp.person?.displayName ?? emp.displayName ?? '',\n ...emp,\n };\n }\n\n /**\n * Syncs denormalized manager on the subject employee, loads manager employee, returns ids + row shape.\n */\n private async resolveManagerDetails(employeeId: string): Promise<{\n managerUserId: string | null;\n managerEmployeeId: string | null;\n manager: EmployeeOutputShape;\n }> {\n await axcSyncSingleEmployeeDenormalizedOrgFields(\n this.entityStorage,\n OrgRootConfig,\n HcmRootConfig,\n String(employeeId),\n true,\n );\n\n const emp = (await this.entityStorage.getOne(EMPLOYEE_ENTITY, String(employeeId))) as {\n managerId?: string | null;\n } | null;\n\n const managerEmployeeIdRaw = emp?.managerId != null ? String(emp.managerId).trim() : '';\n if (!managerEmployeeIdRaw) {\n return {\n managerUserId: null,\n managerEmployeeId: null,\n manager: { displayName: '' },\n };\n }\n\n const managerEmp = (await this.entityStorage.getOne(EMPLOYEE_ENTITY, managerEmployeeIdRaw)) as {\n userId?: string | null;\n personId?: string | null;\n displayName?: string;\n person?: { displayName?: string };\n [key: string]: unknown;\n } | null;\n\n const managerUserId = await this.resolveLoginUserIdForEmployeeRow(managerEmp);\n\n return {\n managerUserId,\n managerEmployeeId: managerEmployeeIdRaw,\n manager: this.mapEmployeeRowToOutput(managerEmp),\n };\n }\n\n private async findEmployeeIdByUserId(userId: string): Promise<string | null> {\n try {\n const result = await this.entityStorage.query(EMPLOYEE_ENTITY, {\n skip: 0,\n take: 1,\n filter: {\n field: 'userId',\n operator: { type: 'equal' },\n value: userId,\n },\n });\n const row = result.items?.[0] as { id?: string } | undefined;\n return row?.id != null ? String(row.id) : null;\n } catch {\n return null;\n }\n }\n\n private async loadSubjectEmployeeOutput(subjectEmployeeId: string): Promise<EmployeeOutputShape> {\n try {\n const emp = (await this.entityStorage.getOne(EMPLOYEE_ENTITY, subjectEmployeeId)) as {\n managerId?: string;\n userId?: string;\n displayName?: string;\n person?: { displayName?: string };\n [key: string]: unknown;\n } | null;\n return emp ? this.mapEmployeeRowToOutput(emp) : { displayName: '' };\n } catch {\n return { displayName: '' };\n }\n }\n\n //#endregion\n\n async execute(input: AssignToManagerInput): Promise<AXPExecuteCommandResult<AssignToManagerOutput>> {\n const sourceEntity = axcOptionalTrimmedString(input.sourceEntity);\n const sourceRecordId = axcOptionalTrimmedString(input.sourceRecordId);\n\n let managerId: string | null = null;\n let managerEmployeeId: string | null = null;\n let manager: EmployeeOutputShape = { displayName: '' };\n let employee: EmployeeOutputShape = { displayName: '' };\n\n let subjectEmployeeId: string | null = null;\n\n const employeeIdFromInput = axcScalarEntityId(input.employeeId);\n\n const applyManagerResolution = async (empId: string): Promise<void> => {\n subjectEmployeeId = empId;\n employee = await this.loadSubjectEmployeeOutput(empId);\n const details = await this.resolveManagerDetails(empId);\n managerId = details.managerUserId;\n managerEmployeeId = details.managerEmployeeId;\n manager = details.manager;\n };\n\n if (employeeIdFromInput) {\n try {\n await applyManagerResolution(employeeIdFromInput);\n } catch {\n // keep defaults\n }\n } else if (sourceEntity && sourceRecordId) {\n try {\n const record = (await this.entityStorage.getOne(sourceEntity, sourceRecordId)) as Record<string, unknown> | null;\n if (record) {\n const { subjectEmployeeId: fromRecord, nestedEmployeeHint, nameHint } =\n axcExtractSubjectEmployeeIdFromRecord(record);\n\n if (fromRecord) {\n await applyManagerResolution(fromRecord);\n if (!employee.displayName && nestedEmployeeHint) {\n employee = {\n ...nestedEmployeeHint,\n displayName: nestedEmployeeHint.displayName || employee.displayName,\n };\n }\n }\n\n if (!employee.displayName && nameHint) {\n employee = {\n ...employee,\n displayName: nameHint,\n };\n }\n }\n } catch {\n // keep defaults\n }\n }\n\n const sessionUserId = this.sessionService.user?.id;\n if (managerId == null && sessionUserId && !subjectEmployeeId) {\n const initiatorEmployeeId = await this.findEmployeeIdByUserId(String(sessionUserId));\n if (initiatorEmployeeId) {\n try {\n await applyManagerResolution(initiatorEmployeeId);\n } catch {\n // ignore\n }\n }\n }\n\n const fallbackUserId = axcScalarEntityId(input.fallbackUserId);\n if (managerId == null && fallbackUserId) {\n managerId = fallbackUserId;\n }\n\n console.log('[WFM-LifecycleTaskTrace] assign-to-manager', {\n subjectEmployeeId,\n managerEmployeeId,\n managerId,\n fallbackUserId: fallbackUserId ?? null,\n usedSourceRecordPath: !!(sourceEntity && sourceRecordId) && !employeeIdFromInput,\n sourceEntity: sourceEntity ?? null,\n sourceRecordId: sourceRecordId ?? null,\n });\n\n return {\n success: true,\n data: {\n managerId,\n managerEmployeeId,\n manager,\n employee,\n },\n metadata: {\n outcome: 'done',\n },\n };\n }\n}\n"],"names":["HcmRootConfig","PersonRootConfig","OrgRootConfig"],"mappings":"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"}
@@ -0,0 +1,198 @@
1
+ import { AXMMetaDataDefinitionService, META_DATA_SELECTOR_FIELD } from '@acorex/modules/data-management';
2
+ import { AXMEntityCrudServiceImpl } from '@acorex/platform/layout/entity';
3
+ import * as i0 from '@angular/core';
4
+ import { inject, Injector, runInInjectionContext, Injectable } from '@angular/core';
5
+ import { get } from 'lodash-es';
6
+
7
+ class AXCQueryCategoryMetadataInheritanceQuery {
8
+ constructor() {
9
+ this.injector = inject(Injector);
10
+ this.metaDataService = inject(AXMMetaDataDefinitionService);
11
+ }
12
+ async fetch(params) {
13
+ const { entityName, categoryId } = params;
14
+ //1a25158a-3e0f-4e9c-bdc2-d6cc0ece86ba
15
+ const service = runInInjectionContext(this.injector, () => new AXMEntityCrudServiceImpl(`${params.entityName}Category`));
16
+ // Find the category by ID
17
+ const category = await this.findCategoryById(categoryId, service);
18
+ if (!category) {
19
+ throw new Error(`Category with ID ${categoryId} not found`);
20
+ }
21
+ // Build the hierarchy (traverse up to root)
22
+ const hierarchy = await this.buildCategoryHierarchy(category, service);
23
+ // Collect and merge groups from all categories in hierarchy
24
+ const mergedGroups = this.mergeMetadataGroupsFromHierarchy(hierarchy);
25
+ return mergedGroups;
26
+ }
27
+ async findCategoryById(categoryId, service) {
28
+ try {
29
+ const result = await service.query({
30
+ filter: {
31
+ logic: 'and',
32
+ filters: [
33
+ {
34
+ field: 'id',
35
+ operator: {
36
+ type: 'equal',
37
+ },
38
+ value: categoryId,
39
+ },
40
+ ],
41
+ },
42
+ take: 1,
43
+ skip: 0,
44
+ });
45
+ return result.items.length > 0 ? result.items[0] : null;
46
+ }
47
+ catch (error) {
48
+ console.error('Error finding category by ID:', error);
49
+ return null;
50
+ }
51
+ }
52
+ async buildCategoryHierarchy(category, service) {
53
+ const hierarchy = [category];
54
+ let currentCategory = category;
55
+ // Traverse up the parent hierarchy
56
+ while (currentCategory.parentId) {
57
+ try {
58
+ const parentResult = await service.query({
59
+ filter: {
60
+ logic: 'and',
61
+ filters: [
62
+ {
63
+ field: 'id',
64
+ operator: {
65
+ type: 'equal',
66
+ },
67
+ value: currentCategory.parentId,
68
+ },
69
+ ],
70
+ },
71
+ take: 1,
72
+ skip: 0,
73
+ });
74
+ if (parentResult.items.length > 0) {
75
+ const parent = parentResult.items[0];
76
+ hierarchy.unshift(parent); // Add to beginning to maintain hierarchy order
77
+ currentCategory = parent;
78
+ }
79
+ else {
80
+ break; // Parent not found, stop traversal
81
+ }
82
+ }
83
+ catch (error) {
84
+ console.error('Error finding parent category:', error);
85
+ break;
86
+ }
87
+ }
88
+ return hierarchy;
89
+ }
90
+ /**
91
+ * Merge metadata groups from category hierarchy, preserving group structure
92
+ * Groups are merged by name, with fields from child categories taking precedence
93
+ */
94
+ mergeMetadataGroupsFromHierarchy(hierarchy) {
95
+ const groupsMap = new Map();
96
+ const seenFieldIds = new Set();
97
+ // Process hierarchy from root to leaf (child categories override parent fields)
98
+ for (const category of hierarchy) {
99
+ // Type: AXMMetaDataBuilderValue from @acorex/modules/data-management
100
+ const metaDataList = get(category, META_DATA_SELECTOR_FIELD);
101
+ if (!metaDataList || !metaDataList.groups || !Array.isArray(metaDataList.groups)) {
102
+ continue;
103
+ }
104
+ // Process each group in the category's metadata
105
+ for (const group of metaDataList.groups) {
106
+ const groupName = group.name || 'default';
107
+ // Get or create group
108
+ if (!groupsMap.has(groupName)) {
109
+ groupsMap.set(groupName, {
110
+ name: groupName,
111
+ title: group.title,
112
+ description: group.description,
113
+ order: group.order ?? 0,
114
+ fields: [],
115
+ });
116
+ }
117
+ const mergedGroup = groupsMap.get(groupName);
118
+ // Process fields in this group
119
+ if (group.fields && Array.isArray(group.fields)) {
120
+ for (const field of group.fields) {
121
+ // Skip if we've already seen this field (child categories override)
122
+ if (seenFieldIds.has(field.id)) {
123
+ // Remove existing field and add new one (child overrides parent)
124
+ mergedGroup.fields = mergedGroup.fields.filter(f => f.id !== field.id);
125
+ }
126
+ // Add field to merged group
127
+ // Ensure title is always present (use name as fallback)
128
+ mergedGroup.fields.push({
129
+ id: field.id,
130
+ name: field.name,
131
+ title: field.title || field.name || 'Untitled Field',
132
+ description: field.description,
133
+ interface: field.interface,
134
+ configuration: field.configuration,
135
+ order: field.order ?? mergedGroup.fields.length,
136
+ });
137
+ seenFieldIds.add(field.id);
138
+ }
139
+ }
140
+ }
141
+ }
142
+ // Convert map to array and sort by order
143
+ const result = Array.from(groupsMap.values())
144
+ .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
145
+ .map(group => ({
146
+ ...group,
147
+ fields: group.fields.sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),
148
+ }));
149
+ return result;
150
+ }
151
+ async collectInheritedMetadata(hierarchy) {
152
+ const allMetadata = [];
153
+ const seenMetadataIds = new Set();
154
+ // Collect metadata from each level in the hierarchy
155
+ for (const category of hierarchy) {
156
+ try {
157
+ const metadataResult = await this.metaDataService.query({
158
+ filter: {
159
+ logic: 'and',
160
+ filters: [
161
+ {
162
+ field: 'categoryIds',
163
+ operator: {
164
+ type: 'contains',
165
+ },
166
+ value: category.id,
167
+ },
168
+ ],
169
+ },
170
+ take: 1000,
171
+ skip: 0,
172
+ });
173
+ // Add metadata fields that haven't been seen before (avoid duplicates)
174
+ for (const metadata of metadataResult.items) {
175
+ if (!seenMetadataIds.has(metadata.id)) {
176
+ allMetadata.push(metadata);
177
+ seenMetadataIds.add(metadata.id);
178
+ }
179
+ }
180
+ }
181
+ catch (error) {
182
+ console.error(`Error collecting metadata for category ${category.id}:`, error);
183
+ }
184
+ }
185
+ return allMetadata;
186
+ }
187
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
188
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, providedIn: 'root' }); }
189
+ }
190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryMetadataInheritanceQuery, decorators: [{
191
+ type: Injectable,
192
+ args: [{
193
+ providedIn: 'root'
194
+ }]
195
+ }] });
196
+
197
+ export { AXCQueryCategoryMetadataInheritanceQuery };
198
+ //# sourceMappingURL=acorex-connectivity-mock-category-metadata-inheritance.query-CWRL1dTa.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-category-metadata-inheritance.query-CWRL1dTa.mjs","sources":["../../../../libs/connectivity/mock/src/lib/data-management/metadata/queries/category-metadata-inheritance.query.ts"],"sourcesContent":["import {\n AXMMetaDataDefinitionEntityModel,\n AXMMetaDataDefinitionService,\n META_DATA_SELECTOR_FIELD,\n RootConfig,\n} from '@acorex/modules/data-management';\nimport { AXPCategoryEntity } from '@acorex/platform/core';\nimport { AXMEntityCrudServiceImpl } from '@acorex/platform/layout/entity';\nimport { AXPQuery } from '@acorex/platform/runtime';\nimport { inject, Injectable, Injector, runInInjectionContext } from '@angular/core';\nimport { get } from 'lodash-es';\n\nexport interface CategoryMetadataInheritanceQueryParams {\n entityName: string;\n categoryId: string;\n}\n\n/**\n * Result structure that preserves groups organization\n */\nexport interface CategoryMetadataInheritanceGroupResult {\n name: string;\n title?: string;\n description?: string;\n order: number;\n fields: Array<{\n id: string;\n name: string;\n title: string;\n description?: string;\n interface: string;\n configuration?: any;\n defaultValue?: any;\n order: number;\n }>;\n}\n\nexport type CategoryMetadataInheritanceResult = CategoryMetadataInheritanceGroupResult[];\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AXCQueryCategoryMetadataInheritanceQuery implements AXPQuery<CategoryMetadataInheritanceQueryParams, CategoryMetadataInheritanceResult> {\n\n private injector = inject(Injector);\n\n private metaDataService = inject(AXMMetaDataDefinitionService);\n\n async fetch(params: CategoryMetadataInheritanceQueryParams): Promise<CategoryMetadataInheritanceResult> {\n const { entityName, categoryId } = params;\n //1a25158a-3e0f-4e9c-bdc2-d6cc0ece86ba\n const service = runInInjectionContext(this.injector, () => new AXMEntityCrudServiceImpl<any, any>(`${params.entityName}Category`));\n // Find the category by ID\n const category = await this.findCategoryById(categoryId, service);\n if (!category) {\n throw new Error(`Category with ID ${categoryId} not found`);\n }\n\n // Build the hierarchy (traverse up to root)\n const hierarchy = await this.buildCategoryHierarchy(category, service);\n\n // Collect and merge groups from all categories in hierarchy\n const mergedGroups = this.mergeMetadataGroupsFromHierarchy(hierarchy);\n return mergedGroups;\n }\n\n private async findCategoryById(categoryId: string, service: any): Promise<AXPCategoryEntity | null> {\n try {\n const result = await service.query({\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'id',\n operator: {\n type: 'equal',\n },\n value: categoryId,\n },\n ],\n },\n take: 1,\n skip: 0,\n });\n\n return result.items.length > 0 ? result.items[0] : null;\n } catch (error) {\n console.error('Error finding category by ID:', error);\n return null;\n }\n }\n\n private async buildCategoryHierarchy(category: AXPCategoryEntity, service: any): Promise<AXPCategoryEntity[]> {\n const hierarchy: AXPCategoryEntity[] = [category];\n let currentCategory = category;\n\n // Traverse up the parent hierarchy\n while (currentCategory.parentId) {\n try {\n const parentResult = await service.query({\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'id',\n operator: {\n type: 'equal',\n },\n value: currentCategory.parentId,\n },\n ],\n },\n take: 1,\n skip: 0,\n });\n\n if (parentResult.items.length > 0) {\n const parent = parentResult.items[0];\n hierarchy.unshift(parent); // Add to beginning to maintain hierarchy order\n currentCategory = parent;\n } else {\n break; // Parent not found, stop traversal\n }\n } catch (error) {\n console.error('Error finding parent category:', error);\n break;\n }\n }\n\n return hierarchy;\n }\n\n /**\n * Merge metadata groups from category hierarchy, preserving group structure\n * Groups are merged by name, with fields from child categories taking precedence\n */\n private mergeMetadataGroupsFromHierarchy(hierarchy: AXPCategoryEntity[]): CategoryMetadataInheritanceResult {\n const groupsMap = new Map<string, CategoryMetadataInheritanceGroupResult>();\n const seenFieldIds = new Set<string>();\n\n // Process hierarchy from root to leaf (child categories override parent fields)\n for (const category of hierarchy) {\n // Type: AXMMetaDataBuilderValue from @acorex/modules/data-management\n const metaDataList = get(category, META_DATA_SELECTOR_FIELD) as {\n groups?: Array<{\n name: string;\n title?: string;\n description?: string;\n order: number;\n fields?: Array<{\n id: string;\n name: string;\n title: string;\n description?: string;\n interface: string;\n configuration?: any;\n order: number;\n }>;\n }>;\n } | undefined;\n\n if (!metaDataList || !metaDataList.groups || !Array.isArray(metaDataList.groups)) {\n continue;\n }\n\n // Process each group in the category's metadata\n for (const group of metaDataList.groups) {\n const groupName = group.name || 'default';\n\n // Get or create group\n if (!groupsMap.has(groupName)) {\n groupsMap.set(groupName, {\n name: groupName,\n title: group.title,\n description: group.description,\n order: group.order ?? 0,\n fields: [],\n });\n }\n\n const mergedGroup = groupsMap.get(groupName)!;\n\n // Process fields in this group\n if (group.fields && Array.isArray(group.fields)) {\n for (const field of group.fields) {\n // Skip if we've already seen this field (child categories override)\n if (seenFieldIds.has(field.id)) {\n // Remove existing field and add new one (child overrides parent)\n mergedGroup.fields = mergedGroup.fields.filter(f => f.id !== field.id);\n }\n\n // Add field to merged group\n // Ensure title is always present (use name as fallback)\n mergedGroup.fields.push({\n id: field.id,\n name: field.name,\n title: field.title || field.name || 'Untitled Field',\n description: field.description,\n interface: field.interface,\n configuration: field.configuration,\n order: field.order ?? mergedGroup.fields.length,\n });\n\n seenFieldIds.add(field.id);\n }\n }\n }\n }\n\n // Convert map to array and sort by order\n const result = Array.from(groupsMap.values())\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n .map(group => ({\n ...group,\n fields: group.fields.sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),\n }));\n\n return result;\n }\n\n private async collectInheritedMetadata(hierarchy: AXPCategoryEntity[]): Promise<AXMMetaDataDefinitionEntityModel[]> {\n const allMetadata: AXMMetaDataDefinitionEntityModel[] = [];\n const seenMetadataIds = new Set<string>();\n\n // Collect metadata from each level in the hierarchy\n for (const category of hierarchy) {\n try {\n const metadataResult = await this.metaDataService.query({\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'categoryIds',\n operator: {\n type: 'contains',\n },\n value: category.id,\n },\n ],\n },\n take: 1000,\n skip: 0,\n });\n\n // Add metadata fields that haven't been seen before (avoid duplicates)\n for (const metadata of metadataResult.items) {\n if (!seenMetadataIds.has(metadata.id)) {\n allMetadata.push(metadata);\n seenMetadataIds.add(metadata.id);\n }\n }\n } catch (error) {\n console.error(`Error collecting metadata for category ${category.id}:`, error);\n }\n }\n\n return allMetadata;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -102,10 +102,10 @@ class AXCQueryCategoryWithItemsQuery {
102
102
  }
103
103
  return node;
104
104
  }
105
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
106
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, providedIn: 'root' }); }
105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
106
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, providedIn: 'root' }); }
107
107
  }
108
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, decorators: [{
108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXCQueryCategoryWithItemsQuery, decorators: [{
109
109
  type: Injectable,
110
110
  args: [{
111
111
  providedIn: 'root'
@@ -113,4 +113,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
113
113
  }] });
114
114
 
115
115
  export { AXCQueryCategoryWithItemsQuery };
116
- //# sourceMappingURL=acorex-connectivity-mock-category-with-items.query-Dsxj98tX.mjs.map
116
+ //# sourceMappingURL=acorex-connectivity-mock-category-with-items.query-Cj6FWu7S.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-connectivity-mock-category-with-items.query-Cj6FWu7S.mjs","sources":["../../../../libs/connectivity/mock/src/lib/data-management/metadata/queries/category-with-items.query.ts"],"sourcesContent":["import { AXMMetaDataDefinitionEntityModel, AXMMetaDataDefinitionService, RootConfig } from '@acorex/modules/data-management';\nimport { AXPCategoryEntityWithItems } from '@acorex/platform/core';\nimport { AXMEntityCrudServiceImpl } from '@acorex/platform/layout/entity';\nimport { AXPQuery } from '@acorex/platform/runtime';\nimport { inject, Injectable, Injector, runInInjectionContext } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AXCQueryCategoryWithItemsQuery implements AXPQuery<void, AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel>[]> {\n\n private injector = inject(Injector);\n private categoryEntityService = runInInjectionContext(this.injector, () => new AXMEntityCrudServiceImpl<any, any>(`${RootConfig.module.name}.${RootConfig.entities.metaDataDefinition.name}Category`));\n private metaDataService = inject(AXMMetaDataDefinitionService);\n\n\n fetch(): Promise<any> {\n return this.getAllWithItems();\n }\n\n private async getAllWithItems(): Promise<AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel>[]> {\n const rootCategories = await this.categoryEntityService.query({\n take: 1000,\n skip: 0,\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'parentId',\n operator: {\n type: 'isNull',\n },\n },\n ],\n },\n });\n\n // Build the tree and prune empty categories (no children and no items)\n const builtRoots = await Promise.all(rootCategories.items.map((category) => this.buildCategoryTree(category)));\n const categories = builtRoots.filter((c): c is AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel> => Boolean(c));\n\n // Aggregate all items across remaining categories\n const allItems: AXMMetaDataDefinitionEntityModel[] = [];\n const collectItems = (nodes: AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel>[]) => {\n for (const node of nodes) {\n if (node.items?.length) {\n allItems.push(...node.items);\n }\n if (node.children?.length) {\n collectItems(node.children);\n }\n }\n };\n collectItems(categories);\n\n // Add synthetic 'All' node at the beginning\n const allNode: AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel> & { categories?: any[] } = {\n id: 'all',\n title: 'All',\n childrenCount: 0,\n items: allItems,\n children: [],\n categories: []\n };\n\n return [allNode, ...categories];\n }\n\n private async buildCategoryTree(category: any): Promise<AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel> | null> {\n const itemsResult = await this.metaDataService.query({\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'categoryIds',\n operator: {\n type: 'contains',\n },\n value: category.id,\n },\n ],\n },\n take: 1000,\n skip: 0,\n });\n\n const childCategoriesResult = await this.categoryEntityService.query({\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'parentId',\n operator: {\n type: 'equal',\n },\n value: category.id,\n },\n ],\n },\n take: 1000,\n skip: 0,\n });\n\n const builtChildren = await Promise.all(childCategoriesResult.items.map((child) => this.buildCategoryTree(child)));\n const children = builtChildren.filter((c): c is AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel> => Boolean(c));\n\n const node: AXPCategoryEntityWithItems<AXMMetaDataDefinitionEntityModel> & { categories?: any[] } = {\n ...category,\n items: itemsResult.items,\n categories: children,\n children: children,\n };\n\n // Prune node if it has no items and no children\n if ((!node.items || node.items.length === 0) && (!node.children || node.children.length === 0)) {\n return null;\n }\n\n return node;\n }\n\n\n\n}"],"names":[],"mappings":"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"}