@acorex-platform/module-software-management-client 0.0.46
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-software-management-client-accept-software-suggestion.command-DVcM5TTv.mjs +83 -0
- package/fesm2022/acorex-platform-module-software-management-client-accept-software-suggestion.command-DVcM5TTv.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-complete-software-phase.activity-C56HhK20.mjs +182 -0
- package/fesm2022/acorex-platform-module-software-management-client-complete-software-phase.activity-C56HhK20.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-contracts.mjs +1196 -0
- package/fesm2022/acorex-platform-module-software-management-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-discovery-kickoff.commands-gB0_htfF.mjs +162 -0
- package/fesm2022/acorex-platform-module-software-management-client-discovery-kickoff.commands-gB0_htfF.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-discovery-report.commands-D2ricLpq.mjs +278 -0
- package/fesm2022/acorex-platform-module-software-management-client-discovery-report.commands-D2ricLpq.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-introduction-exit-message.util-DShFM8MY.mjs +71 -0
- package/fesm2022/acorex-platform-module-software-management-client-introduction-exit-message.util-DShFM8MY.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-introduction-task.activities-BOsJbeJe.mjs +158 -0
- package/fesm2022/acorex-platform-module-software-management-client-introduction-task.activities-BOsJbeJe.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-software-command.util-BsoKQCX5.mjs +9 -0
- package/fesm2022/acorex-platform-module-software-management-client-software-command.util-BsoKQCX5.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client-start-software-definition-flow.command-B0YCgv2V.mjs +124 -0
- package/fesm2022/acorex-platform-module-software-management-client-start-software-definition-flow.command-B0YCgv2V.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-software-management-client.mjs +260 -0
- package/fesm2022/acorex-platform-module-software-management-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-module-software-management-client-contracts.d.ts +547 -0
- package/types/acorex-platform-module-software-management-client.d.ts +9 -0
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { AXToastService } from '@acorex/components/toast';
|
|
2
|
+
import { AXTranslationService } from '@acorex/core/translation';
|
|
3
|
+
import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
|
|
4
|
+
import { AXPLayoutBuilderService } from '@acorex-platform/framework-client/layout/builder';
|
|
5
|
+
import { AXPCommandExecutor } from '@acorex-platform/framework-client/runtime';
|
|
6
|
+
import { resolveMultiLanguageString, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';
|
|
7
|
+
import { resolveEntityActionRef } from '@acorex-platform/framework-shared/runtime';
|
|
8
|
+
import { AXPSoftwareManagementCommandKeys, kickoffText, RootConfig, kickoffPlainTextFromVersion } from '@acorex-platform/module-software-management-client/contracts';
|
|
9
|
+
import * as i0 from '@angular/core';
|
|
10
|
+
import { inject, Injectable } from '@angular/core';
|
|
11
|
+
import { r as resolveSoftwareText } from './acorex-platform-module-software-management-client-software-command.util-BsoKQCX5.mjs';
|
|
12
|
+
|
|
13
|
+
//#region ----- Imports -----
|
|
14
|
+
//#endregion
|
|
15
|
+
//#region ----- Helpers -----
|
|
16
|
+
function resolveSoftwareId(input) {
|
|
17
|
+
const resolved = resolveEntityActionRef(input);
|
|
18
|
+
const fromRef = resolveSoftwareText(resolved?.refId);
|
|
19
|
+
if (fromRef) {
|
|
20
|
+
return fromRef;
|
|
21
|
+
}
|
|
22
|
+
if (!input || typeof input !== 'object') {
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
const row = input;
|
|
26
|
+
return resolveSoftwareText(row['softwareId']) || resolveSoftwareText(row['id']);
|
|
27
|
+
}
|
|
28
|
+
function messageText(result) {
|
|
29
|
+
return resolveMultiLanguageString(result?.message?.text, 'en-US').trim();
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region ----- Remote report commands -----
|
|
33
|
+
class DiscoveryReportRemoteCommand {
|
|
34
|
+
constructor() {
|
|
35
|
+
this.executor = inject(AXPCommandExecutor);
|
|
36
|
+
this.toast = inject(AXToastService);
|
|
37
|
+
this.i18n = inject(AXTranslationService);
|
|
38
|
+
}
|
|
39
|
+
async execute(input) {
|
|
40
|
+
const softwareId = resolveSoftwareId(input);
|
|
41
|
+
if (!softwareId) {
|
|
42
|
+
const text = await this.i18n.translateAsync('@software-management:messages.kickoff.id-required');
|
|
43
|
+
this.toast.show({ color: 'warning', title: text, content: text, closeButton: true, timeOut: 5000 });
|
|
44
|
+
return { success: false, message: { text } };
|
|
45
|
+
}
|
|
46
|
+
const extra = await this.extraInput();
|
|
47
|
+
if (!extra) {
|
|
48
|
+
return { success: false };
|
|
49
|
+
}
|
|
50
|
+
const result = await this.executor.executeRemote(this.commandKey, {
|
|
51
|
+
softwareId,
|
|
52
|
+
...extra,
|
|
53
|
+
});
|
|
54
|
+
const text = await this.translateMessage(messageText(result));
|
|
55
|
+
if (!result?.success) {
|
|
56
|
+
this.toast.show({ color: 'warning', title: text, content: text, closeButton: true, timeOut: 6000 });
|
|
57
|
+
return { success: false, message: { text } };
|
|
58
|
+
}
|
|
59
|
+
await this.afterSuccess(runtimeCommandPayloadData(result) ?? undefined);
|
|
60
|
+
this.toast.show({ color: 'success', title: text, content: text, closeButton: true, timeOut: 6000 });
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
async extraInput() {
|
|
64
|
+
return {};
|
|
65
|
+
}
|
|
66
|
+
async afterSuccess(data) {
|
|
67
|
+
void data;
|
|
68
|
+
}
|
|
69
|
+
async translateMessage(text) {
|
|
70
|
+
if (!text) {
|
|
71
|
+
return this.i18n.translateAsync('@software-management:messages.discovery.failed');
|
|
72
|
+
}
|
|
73
|
+
if (text.startsWith('@')) {
|
|
74
|
+
return this.i18n.translateAsync(text);
|
|
75
|
+
}
|
|
76
|
+
return text;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
class GenerateDiscoveryReportCommand extends DiscoveryReportRemoteCommand {
|
|
80
|
+
constructor() {
|
|
81
|
+
super(...arguments);
|
|
82
|
+
this.commandKey = AXPSoftwareManagementCommandKeys.Software.GenerateDiscoveryReport;
|
|
83
|
+
}
|
|
84
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: GenerateDiscoveryReportCommand, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
85
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: GenerateDiscoveryReportCommand, providedIn: 'root' }); }
|
|
86
|
+
}
|
|
87
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: GenerateDiscoveryReportCommand, decorators: [{
|
|
88
|
+
type: Injectable,
|
|
89
|
+
args: [{ providedIn: 'root' }]
|
|
90
|
+
}] });
|
|
91
|
+
class SubmitDiscoveryReportCommand extends DiscoveryReportRemoteCommand {
|
|
92
|
+
constructor() {
|
|
93
|
+
super(...arguments);
|
|
94
|
+
this.commandKey = AXPSoftwareManagementCommandKeys.Software.SubmitDiscoveryReport;
|
|
95
|
+
}
|
|
96
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SubmitDiscoveryReportCommand, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
97
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SubmitDiscoveryReportCommand, providedIn: 'root' }); }
|
|
98
|
+
}
|
|
99
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SubmitDiscoveryReportCommand, decorators: [{
|
|
100
|
+
type: Injectable,
|
|
101
|
+
args: [{ providedIn: 'root' }]
|
|
102
|
+
}] });
|
|
103
|
+
class ExportDiscoveryReportPdfCommand extends DiscoveryReportRemoteCommand {
|
|
104
|
+
constructor() {
|
|
105
|
+
super(...arguments);
|
|
106
|
+
this.commandKey = AXPSoftwareManagementCommandKeys.Software.ExportDiscoveryReportPdf;
|
|
107
|
+
}
|
|
108
|
+
async afterSuccess(data) {
|
|
109
|
+
const base64 = kickoffText(data?.['base64']);
|
|
110
|
+
if (!base64 || typeof document === 'undefined') {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const binary = atob(base64);
|
|
114
|
+
const bytes = new Uint8Array(binary.length);
|
|
115
|
+
for (let index = 0; index < binary.length; index += 1) {
|
|
116
|
+
bytes[index] = binary.charCodeAt(index);
|
|
117
|
+
}
|
|
118
|
+
const blob = new Blob([bytes], { type: 'application/pdf' });
|
|
119
|
+
const url = URL.createObjectURL(blob);
|
|
120
|
+
const anchor = document.createElement('a');
|
|
121
|
+
anchor.href = url;
|
|
122
|
+
anchor.download = kickoffText(data?.['filename']) || 'discovery-report.pdf';
|
|
123
|
+
anchor.click();
|
|
124
|
+
URL.revokeObjectURL(url);
|
|
125
|
+
}
|
|
126
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExportDiscoveryReportPdfCommand, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
127
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExportDiscoveryReportPdfCommand, providedIn: 'root' }); }
|
|
128
|
+
}
|
|
129
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ExportDiscoveryReportPdfCommand, decorators: [{
|
|
130
|
+
type: Injectable,
|
|
131
|
+
args: [{ providedIn: 'root' }]
|
|
132
|
+
}] });
|
|
133
|
+
class LinkDiscoveryQuestionnaireCommand extends DiscoveryReportRemoteCommand {
|
|
134
|
+
constructor() {
|
|
135
|
+
super(...arguments);
|
|
136
|
+
this.layoutBuilder = inject(AXPLayoutBuilderService);
|
|
137
|
+
this.commandKey = AXPSoftwareManagementCommandKeys.Software.LinkDiscoveryQuestionnaire;
|
|
138
|
+
}
|
|
139
|
+
async extraInput() {
|
|
140
|
+
const picked = await this.layoutBuilder
|
|
141
|
+
.create()
|
|
142
|
+
.dialog((dialog) => {
|
|
143
|
+
dialog
|
|
144
|
+
.setTitle('@software-management:actions.link-discovery-questionnaire.title')
|
|
145
|
+
.setSize('md')
|
|
146
|
+
.setCloseButton(true)
|
|
147
|
+
.setContext({ questionnaireId: null })
|
|
148
|
+
.content((flex) => {
|
|
149
|
+
flex
|
|
150
|
+
.setDirection('column')
|
|
151
|
+
.setGap('12px')
|
|
152
|
+
.formField('@software-management:actions.link-discovery-questionnaire.title', (field) => {
|
|
153
|
+
field.path('questionnaireId');
|
|
154
|
+
field.lookupBox({
|
|
155
|
+
entity: 'AssessmentManagement.Questionnaire',
|
|
156
|
+
multiple: false,
|
|
157
|
+
look: 'select',
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
})
|
|
161
|
+
.setActions((actions) => {
|
|
162
|
+
actions.cancel('@general:actions.cancel.title');
|
|
163
|
+
actions.submit('@general:actions.save.title');
|
|
164
|
+
})
|
|
165
|
+
.onAction(async (dialogRef) => {
|
|
166
|
+
if (dialogRef.action() === 'cancel') {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
const context = dialogRef.context();
|
|
170
|
+
const questionnaireId = kickoffText(context.questionnaireId && typeof context.questionnaireId === 'object'
|
|
171
|
+
? context.questionnaireId.id
|
|
172
|
+
: context.questionnaireId);
|
|
173
|
+
if (!questionnaireId) {
|
|
174
|
+
throw new Error('@software-management:messages.discovery.questionnaire-required');
|
|
175
|
+
}
|
|
176
|
+
return { questionnaireId };
|
|
177
|
+
});
|
|
178
|
+
})
|
|
179
|
+
.show();
|
|
180
|
+
if (!picked?.questionnaireId) {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
return { questionnaireId: picked.questionnaireId };
|
|
184
|
+
}
|
|
185
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LinkDiscoveryQuestionnaireCommand, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
186
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LinkDiscoveryQuestionnaireCommand, providedIn: 'root' }); }
|
|
187
|
+
}
|
|
188
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LinkDiscoveryQuestionnaireCommand, decorators: [{
|
|
189
|
+
type: Injectable,
|
|
190
|
+
args: [{ providedIn: 'root' }]
|
|
191
|
+
}] });
|
|
192
|
+
//#endregion
|
|
193
|
+
//#region ----- Read the pinned kickoff and open the report -----
|
|
194
|
+
class ViewPinnedKickoffCommand {
|
|
195
|
+
constructor() {
|
|
196
|
+
this.entityService = inject(AXPEntityService);
|
|
197
|
+
this.layoutBuilder = inject(AXPLayoutBuilderService);
|
|
198
|
+
this.toast = inject(AXToastService);
|
|
199
|
+
this.i18n = inject(AXTranslationService);
|
|
200
|
+
}
|
|
201
|
+
async execute(input) {
|
|
202
|
+
const softwareId = resolveSoftwareId(input);
|
|
203
|
+
const software = softwareId
|
|
204
|
+
? (await this.entityService
|
|
205
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.software.name)
|
|
206
|
+
.data()
|
|
207
|
+
.byKey(softwareId))
|
|
208
|
+
: null;
|
|
209
|
+
const versionId = kickoffText(software?.kickoffApprovedVersionId);
|
|
210
|
+
if (!versionId) {
|
|
211
|
+
const text = await this.i18n.translateAsync('@software-management:messages.discovery.pinned-kickoff-missing');
|
|
212
|
+
this.toast.show({ color: 'warning', title: text, content: text, closeButton: true, timeOut: 5000 });
|
|
213
|
+
return { success: false, message: { text } };
|
|
214
|
+
}
|
|
215
|
+
const version = (await this.entityService
|
|
216
|
+
.withEntity('DocumentManagement', 'DocumentVersion')
|
|
217
|
+
.data()
|
|
218
|
+
.byKey(versionId));
|
|
219
|
+
const text = kickoffPlainTextFromVersion(version);
|
|
220
|
+
await this.layoutBuilder
|
|
221
|
+
.create()
|
|
222
|
+
.dialog((dialog) => {
|
|
223
|
+
dialog
|
|
224
|
+
.setTitle('@software-management:actions.view-pinned-kickoff.title')
|
|
225
|
+
.setSize('lg')
|
|
226
|
+
.setCloseButton(true)
|
|
227
|
+
.setContext({ text })
|
|
228
|
+
.content((flex) => {
|
|
229
|
+
flex.customWidget('text-block-layout', { content: text || versionId });
|
|
230
|
+
})
|
|
231
|
+
.setActions((actions) => {
|
|
232
|
+
actions.cancel('@general:actions.cancel.title');
|
|
233
|
+
});
|
|
234
|
+
})
|
|
235
|
+
.show();
|
|
236
|
+
return { success: true, kind: 'object', data: { versionId } };
|
|
237
|
+
}
|
|
238
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ViewPinnedKickoffCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
239
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ViewPinnedKickoffCommand, providedIn: 'root' }); }
|
|
240
|
+
}
|
|
241
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ViewPinnedKickoffCommand, decorators: [{
|
|
242
|
+
type: Injectable,
|
|
243
|
+
args: [{ providedIn: 'root' }]
|
|
244
|
+
}] });
|
|
245
|
+
class OpenDiscoveryReportCommand {
|
|
246
|
+
constructor() {
|
|
247
|
+
this.entityService = inject(AXPEntityService);
|
|
248
|
+
this.executor = inject(AXPCommandExecutor);
|
|
249
|
+
this.toast = inject(AXToastService);
|
|
250
|
+
this.i18n = inject(AXTranslationService);
|
|
251
|
+
}
|
|
252
|
+
async execute(input) {
|
|
253
|
+
const softwareId = resolveSoftwareId(input);
|
|
254
|
+
const software = softwareId
|
|
255
|
+
? (await this.entityService
|
|
256
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.software.name)
|
|
257
|
+
.data()
|
|
258
|
+
.byKey(softwareId))
|
|
259
|
+
: null;
|
|
260
|
+
const documentId = kickoffText(software?.discoveryReportDocumentId);
|
|
261
|
+
if (!documentId) {
|
|
262
|
+
const text = await this.i18n.translateAsync('@software-management:messages.discovery.missing-report');
|
|
263
|
+
this.toast.show({ color: 'warning', title: text, content: text, closeButton: true, timeOut: 5000 });
|
|
264
|
+
return { success: false, message: { text } };
|
|
265
|
+
}
|
|
266
|
+
await this.executor.execute('DocumentManagement.Document:Open', { documentId });
|
|
267
|
+
return { success: true, kind: 'object', data: { documentId } };
|
|
268
|
+
}
|
|
269
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: OpenDiscoveryReportCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
270
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: OpenDiscoveryReportCommand, providedIn: 'root' }); }
|
|
271
|
+
}
|
|
272
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: OpenDiscoveryReportCommand, decorators: [{
|
|
273
|
+
type: Injectable,
|
|
274
|
+
args: [{ providedIn: 'root' }]
|
|
275
|
+
}] });
|
|
276
|
+
|
|
277
|
+
export { ExportDiscoveryReportPdfCommand, GenerateDiscoveryReportCommand, LinkDiscoveryQuestionnaireCommand, OpenDiscoveryReportCommand, SubmitDiscoveryReportCommand, ViewPinnedKickoffCommand };
|
|
278
|
+
//# sourceMappingURL=acorex-platform-module-software-management-client-discovery-report.commands-D2ricLpq.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-software-management-client-discovery-report.commands-D2ricLpq.mjs","sources":["../../../../libs/modules/software-management/client/src/lib/commands/discovery-report.commands.ts"],"sourcesContent":["//#region ----- Imports -----\n\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPLayoutBuilderService } from '@acorex-platform/framework-client/layout/builder';\nimport { AXPCommandExecutor } from '@acorex-platform/framework-client/runtime';\nimport { resolveMultiLanguageString, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport {\n AXPCommand,\n resolveEntityActionRef,\n type AXPCommandExecuteResultPromise,\n} from '@acorex-platform/framework-shared/runtime';\nimport {\n AXPSoftwareManagementCommandKeys,\n kickoffPlainTextFromVersion,\n kickoffText,\n RootConfig,\n type AXMSoftwareManagementSoftwareEntityModel,\n} from '@acorex-platform/module-software-management-client/contracts';\nimport { inject, Injectable } from '@angular/core';\n\nimport { resolveSoftwareText } from './software-command.util';\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction resolveSoftwareId(input: unknown): string {\n const resolved = resolveEntityActionRef(input);\n const fromRef = resolveSoftwareText(resolved?.refId);\n if (fromRef) {\n return fromRef;\n }\n if (!input || typeof input !== 'object') {\n return '';\n }\n const row = input as Record<string, unknown>;\n return resolveSoftwareText(row['softwareId']) || resolveSoftwareText(row['id']);\n}\n\nfunction messageText(result: { message?: { text?: unknown } } | null | undefined): string {\n return resolveMultiLanguageString(result?.message?.text, 'en-US').trim();\n}\n\n//#endregion\n\n//#region ----- Remote report commands -----\n\nabstract class DiscoveryReportRemoteCommand implements AXPCommand<unknown, unknown> {\n protected readonly executor = inject(AXPCommandExecutor);\n protected readonly toast = inject(AXToastService);\n protected readonly i18n = inject(AXTranslationService);\n\n protected abstract readonly commandKey: string;\n\n async execute(input: unknown): AXPCommandExecuteResultPromise<unknown> {\n const softwareId = resolveSoftwareId(input);\n if (!softwareId) {\n const text = await this.i18n.translateAsync('@software-management:messages.kickoff.id-required');\n this.toast.show({ color: 'warning', title: text, content: text, closeButton: true, timeOut: 5000 });\n return { success: false, message: { text } };\n }\n\n const extra = await this.extraInput();\n if (!extra) {\n return { success: false };\n }\n const result = await this.executor.executeRemote<unknown, Record<string, unknown>>(this.commandKey, {\n softwareId,\n ...extra,\n });\n const text = await this.translateMessage(messageText(result));\n if (!result?.success) {\n this.toast.show({ color: 'warning', title: text, content: text, closeButton: true, timeOut: 6000 });\n return { success: false, message: { text } };\n }\n await this.afterSuccess(runtimeCommandPayloadData(result) ?? undefined);\n this.toast.show({ color: 'success', title: text, content: text, closeButton: true, timeOut: 6000 });\n return result;\n }\n\n protected async extraInput(): Promise<Record<string, unknown> | null> {\n return {};\n }\n\n protected async afterSuccess(data?: Record<string, unknown>): Promise<void> {\n void data;\n }\n\n private async translateMessage(text: string): Promise<string> {\n if (!text) {\n return this.i18n.translateAsync('@software-management:messages.discovery.failed');\n }\n if (text.startsWith('@')) {\n return this.i18n.translateAsync(text);\n }\n return text;\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class GenerateDiscoveryReportCommand extends DiscoveryReportRemoteCommand {\n protected readonly commandKey = AXPSoftwareManagementCommandKeys.Software.GenerateDiscoveryReport;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SubmitDiscoveryReportCommand extends DiscoveryReportRemoteCommand {\n protected readonly commandKey = AXPSoftwareManagementCommandKeys.Software.SubmitDiscoveryReport;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ExportDiscoveryReportPdfCommand extends DiscoveryReportRemoteCommand {\n protected readonly commandKey = AXPSoftwareManagementCommandKeys.Software.ExportDiscoveryReportPdf;\n\n protected override async afterSuccess(data: Record<string, unknown> | undefined): Promise<void> {\n const base64 = kickoffText(data?.['base64']);\n if (!base64 || typeof document === 'undefined') {\n return;\n }\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n const blob = new Blob([bytes], { type: 'application/pdf' });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = kickoffText(data?.['filename']) || 'discovery-report.pdf';\n anchor.click();\n URL.revokeObjectURL(url);\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LinkDiscoveryQuestionnaireCommand extends DiscoveryReportRemoteCommand {\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n protected readonly commandKey = AXPSoftwareManagementCommandKeys.Software.LinkDiscoveryQuestionnaire;\n\n protected override async extraInput(): Promise<Record<string, unknown> | null> {\n const picked = await this.layoutBuilder\n .create()\n .dialog<{ questionnaireId?: unknown } | null>((dialog) => {\n dialog\n .setTitle('@software-management:actions.link-discovery-questionnaire.title')\n .setSize('md')\n .setCloseButton(true)\n .setContext({ questionnaireId: null })\n .content((flex) => {\n flex\n .setDirection('column')\n .setGap('12px')\n .formField('@software-management:actions.link-discovery-questionnaire.title', (field) => {\n field.path('questionnaireId');\n field.lookupBox({\n entity: 'AssessmentManagement.Questionnaire',\n multiple: false,\n look: 'select',\n });\n });\n })\n .setActions((actions) => {\n actions.cancel('@general:actions.cancel.title');\n actions.submit('@general:actions.save.title');\n })\n .onAction(async (dialogRef) => {\n if (dialogRef.action() === 'cancel') {\n return null;\n }\n const context = dialogRef.context() as { questionnaireId?: unknown };\n const questionnaireId = kickoffText(\n context.questionnaireId && typeof context.questionnaireId === 'object'\n ? (context.questionnaireId as { id?: unknown }).id\n : context.questionnaireId,\n );\n if (!questionnaireId) {\n throw new Error('@software-management:messages.discovery.questionnaire-required');\n }\n return { questionnaireId };\n });\n })\n .show();\n if (!picked?.questionnaireId) {\n return null;\n }\n return { questionnaireId: picked.questionnaireId };\n }\n}\n\n//#endregion\n\n//#region ----- Read the pinned kickoff and open the report -----\n\n@Injectable({ providedIn: 'root' })\nexport class ViewPinnedKickoffCommand implements AXPCommand<unknown, { versionId: string }> {\n private readonly entityService = inject(AXPEntityService);\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly toast = inject(AXToastService);\n private readonly i18n = inject(AXTranslationService);\n\n async execute(input: unknown): AXPCommandExecuteResultPromise<{ versionId: string }> {\n const softwareId = resolveSoftwareId(input);\n const software = softwareId\n ? ((await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.software.name)\n .data()\n .byKey(softwareId)) as AXMSoftwareManagementSoftwareEntityModel | null)\n : null;\n const versionId = kickoffText(software?.kickoffApprovedVersionId);\n if (!versionId) {\n const text = await this.i18n.translateAsync('@software-management:messages.discovery.pinned-kickoff-missing');\n this.toast.show({ color: 'warning', title: text, content: text, closeButton: true, timeOut: 5000 });\n return { success: false, message: { text } };\n }\n const version = (await this.entityService\n .withEntity('DocumentManagement', 'DocumentVersion')\n .data()\n .byKey(versionId)) as { metaDataForm?: unknown } | null;\n const text = kickoffPlainTextFromVersion(version);\n await this.layoutBuilder\n .create()\n .dialog((dialog) => {\n dialog\n .setTitle('@software-management:actions.view-pinned-kickoff.title')\n .setSize('lg')\n .setCloseButton(true)\n .setContext({ text })\n .content((flex) => {\n flex.customWidget('text-block-layout', { content: text || versionId });\n })\n .setActions((actions) => {\n actions.cancel('@general:actions.cancel.title');\n });\n })\n .show();\n return { success: true, kind: 'object', data: { versionId } };\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class OpenDiscoveryReportCommand implements AXPCommand<unknown, { documentId: string }> {\n private readonly entityService = inject(AXPEntityService);\n private readonly executor = inject(AXPCommandExecutor);\n private readonly toast = inject(AXToastService);\n private readonly i18n = inject(AXTranslationService);\n\n async execute(input: unknown): AXPCommandExecuteResultPromise<{ documentId: string }> {\n const softwareId = resolveSoftwareId(input);\n const software = softwareId\n ? ((await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.software.name)\n .data()\n .byKey(softwareId)) as AXMSoftwareManagementSoftwareEntityModel | null)\n : null;\n const documentId = kickoffText(software?.discoveryReportDocumentId);\n if (!documentId) {\n const text = await this.i18n.translateAsync('@software-management:messages.discovery.missing-report');\n this.toast.show({ color: 'warning', title: text, content: text, closeButton: true, timeOut: 5000 });\n return { success: false, message: { text } };\n }\n await this.executor.execute('DocumentManagement.Document:Open', { documentId });\n return { success: true, kind: 'object', data: { documentId } };\n }\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { kickoffText, buildIntroductionKickoffCheck, kickoffFingerprintFromRows, INTRODUCTION_EXIT_MESSAGE } from '@acorex-platform/module-software-management-client/contracts';
|
|
2
|
+
|
|
3
|
+
//#region ----- Imports -----
|
|
4
|
+
//#endregion
|
|
5
|
+
//#region ----- Load -----
|
|
6
|
+
/**
|
|
7
|
+
* Reads the kickoff document the introduction gate needs.
|
|
8
|
+
* An approved host version is included even when the software row has not stored it yet.
|
|
9
|
+
*/
|
|
10
|
+
async function loadIntroductionKickoffCheck(entityService, software) {
|
|
11
|
+
const documentId = kickoffText(software.kickoffDocumentId);
|
|
12
|
+
const pinnedVersionId = kickoffText(software.kickoffApprovedVersionId);
|
|
13
|
+
if (!documentId && !pinnedVersionId) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const document = documentId ? await readRow(entityService, 'Document', documentId) : null;
|
|
17
|
+
const hostVersionId = kickoffText(document?.['versionId']);
|
|
18
|
+
const versionId = hostVersionId || pinnedVersionId;
|
|
19
|
+
const version = versionId ? await readRow(entityService, 'DocumentVersion', versionId) : null;
|
|
20
|
+
return buildIntroductionKickoffCheck({
|
|
21
|
+
statusId: document?.['statusId'],
|
|
22
|
+
status: document?.['status'],
|
|
23
|
+
hostVersionId,
|
|
24
|
+
approvedVersionId: software.kickoffApprovedVersionId,
|
|
25
|
+
approvedFingerprint: software.kickoffApprovedFingerprint,
|
|
26
|
+
versionFingerprint: kickoffFingerprintFromRows(version, document),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async function readRow(entityService, entity, id) {
|
|
30
|
+
try {
|
|
31
|
+
const row = await entityService.withEntity('DocumentManagement', entity).data().byKey(id);
|
|
32
|
+
return row && typeof row === 'object' ? row : null;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
|
|
40
|
+
//#region ----- Imports -----
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region ----- Constants -----
|
|
43
|
+
const INTRODUCTION_FIELD_LABEL = {
|
|
44
|
+
title: '@software-management:entities.software.fields.title.title',
|
|
45
|
+
idea: '@software-management:entities.software.fields.idea.title',
|
|
46
|
+
initialProblem: '@software-management:entities.software.fields.initial-problem.title',
|
|
47
|
+
goal: '@software-management:entities.software.fields.goal.title',
|
|
48
|
+
ownerId: '@software-management:entities.software.fields.owner.title',
|
|
49
|
+
};
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region ----- Message -----
|
|
52
|
+
async function translateIntroductionExit(i18n, decision) {
|
|
53
|
+
const missing = decision.missingFields ?? [];
|
|
54
|
+
if (missing.length) {
|
|
55
|
+
const labels = [];
|
|
56
|
+
for (const field of missing) {
|
|
57
|
+
labels.push(await i18n.translateAsync(INTRODUCTION_FIELD_LABEL[field]));
|
|
58
|
+
}
|
|
59
|
+
const lang = i18n.getActiveLang?.() ?? 'en-US';
|
|
60
|
+
const fields = labels.filter((label) => label.trim().length > 0).join(lang.startsWith('fa') ? '، ' : ', ');
|
|
61
|
+
return i18n.translateAsync(INTRODUCTION_EXIT_MESSAGE.missingFields, { params: { fields } });
|
|
62
|
+
}
|
|
63
|
+
if (decision.message.startsWith('@')) {
|
|
64
|
+
return i18n.translateAsync(decision.message);
|
|
65
|
+
}
|
|
66
|
+
return decision.message;
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
|
|
70
|
+
export { loadIntroductionKickoffCheck as l, translateIntroductionExit as t };
|
|
71
|
+
//# sourceMappingURL=acorex-platform-module-software-management-client-introduction-exit-message.util-DShFM8MY.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-software-management-client-introduction-exit-message.util-DShFM8MY.mjs","sources":["../../../../libs/modules/software-management/client/src/lib/workflows/activities/load-introduction-kickoff-check.ts","../../../../libs/modules/software-management/client/src/lib/workflows/activities/introduction-exit-message.util.ts"],"sourcesContent":["//#region ----- Imports -----\n\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport {\n buildIntroductionKickoffCheck,\n kickoffFingerprintFromRows,\n kickoffText,\n type AXMSoftwareManagementSoftwareEntityModel,\n type IntroductionKickoffCheck,\n} from '@acorex-platform/module-software-management-client/contracts';\n\n//#endregion\n\n//#region ----- Load -----\n\n/**\n * Reads the kickoff document the introduction gate needs.\n * An approved host version is included even when the software row has not stored it yet.\n */\nexport async function loadIntroductionKickoffCheck(\n entityService: AXPEntityService,\n software: AXMSoftwareManagementSoftwareEntityModel,\n): Promise<IntroductionKickoffCheck | null> {\n const documentId = kickoffText(software.kickoffDocumentId);\n const pinnedVersionId = kickoffText(software.kickoffApprovedVersionId);\n if (!documentId && !pinnedVersionId) {\n return null;\n }\n\n const document = documentId ? await readRow(entityService, 'Document', documentId) : null;\n const hostVersionId = kickoffText(document?.['versionId']);\n const versionId = hostVersionId || pinnedVersionId;\n const version = versionId ? await readRow(entityService, 'DocumentVersion', versionId) : null;\n\n return buildIntroductionKickoffCheck({\n statusId: document?.['statusId'],\n status: document?.['status'],\n hostVersionId,\n approvedVersionId: software.kickoffApprovedVersionId,\n approvedFingerprint: software.kickoffApprovedFingerprint,\n versionFingerprint: kickoffFingerprintFromRows(version, document),\n });\n}\n\nasync function readRow(\n entityService: AXPEntityService,\n entity: 'Document' | 'DocumentVersion',\n id: string,\n): Promise<Record<string, unknown> | null> {\n try {\n const row = await entityService.withEntity('DocumentManagement', entity).data().byKey(id);\n return row && typeof row === 'object' ? (row as unknown as Record<string, unknown>) : null;\n } catch {\n return null;\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n INTRODUCTION_EXIT_MESSAGE,\n type IntroductionExitDecision,\n type IntroductionRequiredField,\n} from '@acorex-platform/module-software-management-client/contracts';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst INTRODUCTION_FIELD_LABEL: Record<IntroductionRequiredField, string> = {\n title: '@software-management:entities.software.fields.title.title',\n idea: '@software-management:entities.software.fields.idea.title',\n initialProblem: '@software-management:entities.software.fields.initial-problem.title',\n goal: '@software-management:entities.software.fields.goal.title',\n ownerId: '@software-management:entities.software.fields.owner.title',\n};\n\n//#endregion\n\n//#region ----- Message -----\n\nexport async function translateIntroductionExit(\n i18n: AXTranslationService,\n decision: Pick<IntroductionExitDecision, 'message' | 'missingFields'>,\n): Promise<string> {\n const missing = decision.missingFields ?? [];\n if (missing.length) {\n const labels: string[] = [];\n for (const field of missing) {\n labels.push(await i18n.translateAsync(INTRODUCTION_FIELD_LABEL[field]));\n }\n const lang = i18n.getActiveLang?.() ?? 'en-US';\n const fields = labels.filter((label) => label.trim().length > 0).join(lang.startsWith('fa') ? '، ' : ', ');\n return i18n.translateAsync(INTRODUCTION_EXIT_MESSAGE.missingFields, { params: { fields } });\n }\n if (decision.message.startsWith('@')) {\n return i18n.translateAsync(decision.message);\n }\n return decision.message;\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { AXTranslationService } from '@acorex/core/translation';
|
|
2
|
+
import { AXPSessionService } from '@acorex-platform/framework-client/auth';
|
|
3
|
+
import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
|
|
4
|
+
import { introductionValueText, RootConfig, evaluateIntroductionExit, INTRODUCTION_EXIT_MESSAGE, AXPSoftwareManagementPermissionKeys } from '@acorex-platform/module-software-management-client/contracts';
|
|
5
|
+
import * as i0 from '@angular/core';
|
|
6
|
+
import { inject, Injectable } from '@angular/core';
|
|
7
|
+
import { l as loadIntroductionKickoffCheck, t as translateIntroductionExit } from './acorex-platform-module-software-management-client-introduction-exit-message.util-DShFM8MY.mjs';
|
|
8
|
+
|
|
9
|
+
//#region ----- Imports -----
|
|
10
|
+
//#endregion
|
|
11
|
+
//#region ----- Load -----
|
|
12
|
+
class LoadSoftwareIntroductionActivity {
|
|
13
|
+
constructor() {
|
|
14
|
+
//#region ----- Services & Dependencies -----
|
|
15
|
+
this.entityService = inject(AXPEntityService);
|
|
16
|
+
this.session = inject(AXPSessionService);
|
|
17
|
+
this.i18n = inject(AXTranslationService);
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region ----- Command Implementation -----
|
|
21
|
+
async execute(input) {
|
|
22
|
+
const softwareId = introductionValueText(readInput(input, 'softwareId'));
|
|
23
|
+
if (!softwareId) {
|
|
24
|
+
return this.failure(await this.i18n.translateAsync('@software-management:messages.kickoff.id-required'));
|
|
25
|
+
}
|
|
26
|
+
const software = (await this.entityService
|
|
27
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.software.name)
|
|
28
|
+
.data()
|
|
29
|
+
.byKey(softwareId));
|
|
30
|
+
if (!software) {
|
|
31
|
+
return this.failure(await this.i18n.translateAsync('@software-management:messages.kickoff.not-found'));
|
|
32
|
+
}
|
|
33
|
+
const kickoff = await loadIntroductionKickoffCheck(this.entityService, software);
|
|
34
|
+
const decision = evaluateIntroductionExit(software, kickoff);
|
|
35
|
+
const approvalText = decision.ok
|
|
36
|
+
? await this.i18n.translateAsync(INTRODUCTION_EXIT_MESSAGE.ready)
|
|
37
|
+
: await translateIntroductionExit(this.i18n, decision);
|
|
38
|
+
const canEdit = this.session.authorize(AXPSoftwareManagementPermissionKeys.MaintainSoftwareDefinitions);
|
|
39
|
+
return {
|
|
40
|
+
success: true,
|
|
41
|
+
kind: 'object',
|
|
42
|
+
data: {
|
|
43
|
+
title: introductionValueText(software.title),
|
|
44
|
+
idea: introductionValueText(software.idea),
|
|
45
|
+
initialProblem: introductionValueText(software.initialProblem),
|
|
46
|
+
goal: introductionValueText(software.goal),
|
|
47
|
+
ownerId: introductionValueText(software.ownerId) || introductionValueText(software.owner),
|
|
48
|
+
potentialUsers: introductionValueText(software.potentialUsers),
|
|
49
|
+
openQuestions: introductionValueText(software.openQuestions),
|
|
50
|
+
approvalText,
|
|
51
|
+
},
|
|
52
|
+
metadata: { outcome: canEdit ? 'edit' : 'view' },
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region ----- Helpers -----
|
|
57
|
+
failure(text) {
|
|
58
|
+
return Promise.resolve({
|
|
59
|
+
success: false,
|
|
60
|
+
message: { text, type: 'warning' },
|
|
61
|
+
metadata: { outcome: 'Failed' },
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LoadSoftwareIntroductionActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
65
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LoadSoftwareIntroductionActivity, providedIn: 'root' }); }
|
|
66
|
+
}
|
|
67
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: LoadSoftwareIntroductionActivity, decorators: [{
|
|
68
|
+
type: Injectable,
|
|
69
|
+
args: [{ providedIn: 'root' }]
|
|
70
|
+
}] });
|
|
71
|
+
//#endregion
|
|
72
|
+
//#region ----- Save -----
|
|
73
|
+
class SaveSoftwareIntroductionActivity {
|
|
74
|
+
constructor() {
|
|
75
|
+
//#region ----- Services & Dependencies -----
|
|
76
|
+
this.entityService = inject(AXPEntityService);
|
|
77
|
+
this.session = inject(AXPSessionService);
|
|
78
|
+
this.i18n = inject(AXTranslationService);
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
//#region ----- Command Implementation -----
|
|
82
|
+
async execute(input) {
|
|
83
|
+
if (!this.session.authorize(AXPSoftwareManagementPermissionKeys.MaintainSoftwareDefinitions)) {
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
message: {
|
|
87
|
+
text: await this.i18n.translateAsync('@software-management:messages.introduction.save-forbidden'),
|
|
88
|
+
type: 'warning',
|
|
89
|
+
},
|
|
90
|
+
metadata: { outcome: 'Failed' },
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const softwareId = introductionValueText(input?.softwareId);
|
|
94
|
+
if (!softwareId || softwareId.includes('{{')) {
|
|
95
|
+
return {
|
|
96
|
+
success: false,
|
|
97
|
+
message: {
|
|
98
|
+
text: await this.i18n.translateAsync('@software-management:messages.kickoff.id-required'),
|
|
99
|
+
type: 'warning',
|
|
100
|
+
},
|
|
101
|
+
metadata: { outcome: 'Failed' },
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const patch = {
|
|
105
|
+
title: introductionValueText(input?.title),
|
|
106
|
+
idea: introductionValueText(input?.idea),
|
|
107
|
+
initialProblem: introductionValueText(input?.initialProblem),
|
|
108
|
+
goal: introductionValueText(input?.goal),
|
|
109
|
+
ownerId: introductionValueText(input?.ownerId),
|
|
110
|
+
potentialUsers: introductionValueText(input?.potentialUsers),
|
|
111
|
+
openQuestions: introductionValueText(input?.openQuestions),
|
|
112
|
+
};
|
|
113
|
+
try {
|
|
114
|
+
await this.entityService
|
|
115
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.software.name)
|
|
116
|
+
.data()
|
|
117
|
+
.update(softwareId, patch);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
const raw = error instanceof Error ? error.message : '';
|
|
121
|
+
const text = raw.startsWith('@')
|
|
122
|
+
? await this.i18n.translateAsync(raw)
|
|
123
|
+
: raw || (await this.i18n.translateAsync('@software-management:messages.introduction.save-failed'));
|
|
124
|
+
return {
|
|
125
|
+
success: false,
|
|
126
|
+
message: { text, type: 'warning' },
|
|
127
|
+
metadata: { outcome: 'Failed' },
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
success: true,
|
|
132
|
+
kind: 'object',
|
|
133
|
+
data: { saved: true },
|
|
134
|
+
message: {
|
|
135
|
+
text: await this.i18n.translateAsync(INTRODUCTION_EXIT_MESSAGE.saved),
|
|
136
|
+
type: 'success',
|
|
137
|
+
},
|
|
138
|
+
metadata: { outcome: 'Done' },
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SaveSoftwareIntroductionActivity, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
142
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SaveSoftwareIntroductionActivity, providedIn: 'root' }); }
|
|
143
|
+
}
|
|
144
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SaveSoftwareIntroductionActivity, decorators: [{
|
|
145
|
+
type: Injectable,
|
|
146
|
+
args: [{ providedIn: 'root' }]
|
|
147
|
+
}] });
|
|
148
|
+
//#endregion
|
|
149
|
+
//#region ----- Helpers -----
|
|
150
|
+
function readInput(input, key) {
|
|
151
|
+
if (!input || typeof input !== 'object') {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
return input[key];
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export { LoadSoftwareIntroductionActivity, SaveSoftwareIntroductionActivity };
|
|
158
|
+
//# sourceMappingURL=acorex-platform-module-software-management-client-introduction-task.activities-BOsJbeJe.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-software-management-client-introduction-task.activities-BOsJbeJe.mjs","sources":["../../../../libs/modules/software-management/client/src/lib/workflows/activities/introduction-task.activities.ts"],"sourcesContent":["//#region ----- Imports -----\n\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport {\n AXPSoftwareManagementPermissionKeys,\n evaluateIntroductionExit,\n INTRODUCTION_EXIT_MESSAGE,\n introductionValueText,\n RootConfig,\n type AXMSoftwareManagementSoftwareEntityModel,\n} from '@acorex-platform/module-software-management-client/contracts';\nimport { inject, Injectable } from '@angular/core';\n\nimport { translateIntroductionExit } from './introduction-exit-message.util';\nimport { loadIntroductionKickoffCheck } from './load-introduction-kickoff-check';\n\n//#endregion\n\n//#region ----- Types -----\n\ninterface IntroductionDialogData {\n title: string;\n idea: string;\n initialProblem: string;\n goal: string;\n ownerId: string;\n potentialUsers: string;\n openQuestions: string;\n approvalText: string;\n}\n\ninterface SaveIntroductionInput {\n softwareId?: unknown;\n title?: unknown;\n idea?: unknown;\n initialProblem?: unknown;\n goal?: unknown;\n ownerId?: unknown;\n potentialUsers?: unknown;\n openQuestions?: unknown;\n}\n\n//#endregion\n\n//#region ----- Load -----\n\n@Injectable({ providedIn: 'root' })\nexport class LoadSoftwareIntroductionActivity implements AXPCommand<unknown, IntroductionDialogData> {\n //#region ----- Services & Dependencies -----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly session = inject(AXPSessionService);\n private readonly i18n = inject(AXTranslationService);\n\n //#endregion\n\n //#region ----- Command Implementation -----\n\n async execute(input: unknown): AXPCommandExecuteResultPromise<IntroductionDialogData> {\n const softwareId = introductionValueText(readInput(input, 'softwareId'));\n if (!softwareId) {\n return this.failure(await this.i18n.translateAsync('@software-management:messages.kickoff.id-required'));\n }\n\n const software = (await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.software.name)\n .data()\n .byKey(softwareId)) as AXMSoftwareManagementSoftwareEntityModel | null;\n if (!software) {\n return this.failure(await this.i18n.translateAsync('@software-management:messages.kickoff.not-found'));\n }\n\n const kickoff = await loadIntroductionKickoffCheck(this.entityService, software);\n const decision = evaluateIntroductionExit(software, kickoff);\n const approvalText = decision.ok\n ? await this.i18n.translateAsync(INTRODUCTION_EXIT_MESSAGE.ready)\n : await translateIntroductionExit(this.i18n, decision);\n const canEdit = this.session.authorize(AXPSoftwareManagementPermissionKeys.MaintainSoftwareDefinitions);\n\n return {\n success: true,\n kind: 'object',\n data: {\n title: introductionValueText(software.title),\n idea: introductionValueText(software.idea),\n initialProblem: introductionValueText(software.initialProblem),\n goal: introductionValueText(software.goal),\n ownerId: introductionValueText(software.ownerId) || introductionValueText(software.owner),\n potentialUsers: introductionValueText(software.potentialUsers),\n openQuestions: introductionValueText(software.openQuestions),\n approvalText,\n },\n metadata: { outcome: canEdit ? 'edit' : 'view' },\n };\n }\n\n //#endregion\n\n //#region ----- Helpers -----\n\n private failure(text: string): AXPCommandExecuteResultPromise<IntroductionDialogData> {\n return Promise.resolve({\n success: false,\n message: { text, type: 'warning' },\n metadata: { outcome: 'Failed' },\n });\n }\n\n //#endregion\n}\n\n//#endregion\n\n//#region ----- Save -----\n\n@Injectable({ providedIn: 'root' })\nexport class SaveSoftwareIntroductionActivity implements AXPCommand<SaveIntroductionInput, { saved: boolean }> {\n //#region ----- Services & Dependencies -----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly session = inject(AXPSessionService);\n private readonly i18n = inject(AXTranslationService);\n\n //#endregion\n\n //#region ----- Command Implementation -----\n\n async execute(input: SaveIntroductionInput): AXPCommandExecuteResultPromise<{ saved: boolean }> {\n if (!this.session.authorize(AXPSoftwareManagementPermissionKeys.MaintainSoftwareDefinitions)) {\n return {\n success: false,\n message: {\n text: await this.i18n.translateAsync('@software-management:messages.introduction.save-forbidden'),\n type: 'warning',\n },\n metadata: { outcome: 'Failed' },\n };\n }\n\n const softwareId = introductionValueText(input?.softwareId);\n if (!softwareId || softwareId.includes('{{')) {\n return {\n success: false,\n message: {\n text: await this.i18n.translateAsync('@software-management:messages.kickoff.id-required'),\n type: 'warning',\n },\n metadata: { outcome: 'Failed' },\n };\n }\n\n const patch = {\n title: introductionValueText(input?.title),\n idea: introductionValueText(input?.idea),\n initialProblem: introductionValueText(input?.initialProblem),\n goal: introductionValueText(input?.goal),\n ownerId: introductionValueText(input?.ownerId),\n potentialUsers: introductionValueText(input?.potentialUsers),\n openQuestions: introductionValueText(input?.openQuestions),\n };\n\n try {\n await this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.software.name)\n .data()\n .update(softwareId, patch as never);\n } catch (error: unknown) {\n const raw = error instanceof Error ? error.message : '';\n const text = raw.startsWith('@')\n ? await this.i18n.translateAsync(raw)\n : raw || (await this.i18n.translateAsync('@software-management:messages.introduction.save-failed'));\n return {\n success: false,\n message: { text, type: 'warning' },\n metadata: { outcome: 'Failed' },\n };\n }\n\n return {\n success: true,\n kind: 'object',\n data: { saved: true },\n message: {\n text: await this.i18n.translateAsync(INTRODUCTION_EXIT_MESSAGE.saved),\n type: 'success',\n },\n metadata: { outcome: 'Done' },\n };\n }\n\n //#endregion\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction readInput(input: unknown, key: string): unknown {\n if (!input || typeof input !== 'object') {\n return undefined;\n }\n return (input as Record<string, unknown>)[key];\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
function resolveSoftwareText(value) {
|
|
2
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
3
|
+
}
|
|
4
|
+
function asSoftwareRecord(value) {
|
|
5
|
+
return value && typeof value === 'object' ? value : null;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export { resolveSoftwareText as r };
|
|
9
|
+
//# sourceMappingURL=acorex-platform-module-software-management-client-software-command.util-BsoKQCX5.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-software-management-client-software-command.util-BsoKQCX5.mjs","sources":["../../../../libs/modules/software-management/client/src/lib/commands/software-command.util.ts"],"sourcesContent":["export function resolveSoftwareText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nexport function asSoftwareRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : null;\n}\n"],"names":[],"mappings":"AAAM,SAAU,mBAAmB,CAAC,KAAc,EAAA;AAChD,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE;AACtD;AAEM,SAAU,gBAAgB,CAAC,KAAc,EAAA;AAC7C,IAAA,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,GAAI,KAAiC,GAAG,IAAI;AACvF;;"}
|