@acorex-platform/module-communication-management-client 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-09UhY2Rc.mjs +2375 -0
- package/fesm2022/acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-09UhY2Rc.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-email-send.command-wuqLiY8s.mjs +69 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-email-send.command-wuqLiY8s.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-email-show-dialog.command-CP0zAEe4.mjs +285 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-email-show-dialog.command-CP0zAEe4.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-in-app-inbox-page.component-b7ZqkMTt.mjs +514 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-in-app-inbox-page.component-b7ZqkMTt.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-send.command-D7_MmGQe.mjs +85 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-send.command-D7_MmGQe.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-show-sent-message.command-D8125Jxi.mjs +111 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-show-sent-message.command-D8125Jxi.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-test-smtp.command-BySmN1Lz.mjs +155 -0
- package/fesm2022/acorex-platform-module-communication-management-client-communication-test-smtp.command-BySmN1Lz.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-communication-management-client-contracts.mjs +278 -0
- package/fesm2022/acorex-platform-module-communication-management-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-communication-management-client.mjs +2 -0
- package/fesm2022/acorex-platform-module-communication-management-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-module-communication-management-client-contracts.d.ts +330 -0
- package/types/acorex-platform-module-communication-management-client.d.ts +360 -0
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Injectable } from '@angular/core';
|
|
3
|
+
import { AXTranslationService } from '@acorex/core/translation';
|
|
4
|
+
import { AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY } from '@acorex-platform/module-content-management-client';
|
|
5
|
+
import { runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';
|
|
6
|
+
import { AXPLayoutBuilderService } from '@acorex-platform/framework-client/layout/builder';
|
|
7
|
+
import { AXPEntityDataSelectorService, AXPEntityDefinitionRegistryService } from '@acorex-platform/framework-client/layout/entity';
|
|
8
|
+
import { AXPCommandService } from '@acorex-platform/framework-client/runtime';
|
|
9
|
+
import { COMMUNICATION_MANAGEMENT_EMAIL_SEND_COMMAND_KEY } from '@acorex-platform/module-communication-management-client/contracts';
|
|
10
|
+
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region ---- Helpers ----
|
|
13
|
+
function normalizeTextTemplateId(value) {
|
|
14
|
+
if (typeof value === 'string') {
|
|
15
|
+
const t = value.trim();
|
|
16
|
+
return t || undefined;
|
|
17
|
+
}
|
|
18
|
+
if (value != null && typeof value === 'object' && 'id' in value) {
|
|
19
|
+
const id = value.id;
|
|
20
|
+
if (typeof id === 'string' && id.trim())
|
|
21
|
+
return id.trim();
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
function parseMergeRecord(value) {
|
|
26
|
+
if (value == null)
|
|
27
|
+
return {};
|
|
28
|
+
if (typeof value === 'object' && !Array.isArray(value)) {
|
|
29
|
+
const out = {};
|
|
30
|
+
for (const [k, v] of Object.entries(value)) {
|
|
31
|
+
out[k] = v == null ? '' : String(v);
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
return {};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* True when HTML/plain body has no user-visible text (handles empty `<p><br></p>` etc.).
|
|
39
|
+
*/
|
|
40
|
+
function isEffectivelyEmptyRichTextBody(value) {
|
|
41
|
+
const trimmed = value.trim();
|
|
42
|
+
if (!trimmed) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
const withoutTags = trimmed
|
|
46
|
+
.replace(/<[^>]+>/g, ' ')
|
|
47
|
+
.replace(/ /gi, ' ')
|
|
48
|
+
.replace(/\s+/g, ' ')
|
|
49
|
+
.trim();
|
|
50
|
+
return withoutTags.length === 0;
|
|
51
|
+
}
|
|
52
|
+
/** Resolved entity module for the text-template data selector. */
|
|
53
|
+
const TEXT_TEMPLATE_ENTITY_MODULE = 'ContentManagement';
|
|
54
|
+
/** Resolved entity name for the text-template data selector. */
|
|
55
|
+
const TEXT_TEMPLATE_ENTITY_NAME = 'TextTemplate';
|
|
56
|
+
/** List filter: only templates with a non-empty `channels.email.body` (excludes SMS-only rows). */
|
|
57
|
+
const TEXT_TEMPLATE_LIST_EMAIL_BODY_FILTER = {
|
|
58
|
+
field: 'channels.email.body',
|
|
59
|
+
operator: { type: 'isNotEmpty' },
|
|
60
|
+
};
|
|
61
|
+
//#endregion
|
|
62
|
+
//#region ---- Service ----
|
|
63
|
+
/**
|
|
64
|
+
* Opens the send-email dialog built with the layout dialog builder and delegates send to
|
|
65
|
+
* {@link COMMUNICATION_MANAGEMENT_EMAIL_SEND_COMMAND_KEY}.
|
|
66
|
+
*/
|
|
67
|
+
class AXMCommunicationEmailComposerService {
|
|
68
|
+
constructor() {
|
|
69
|
+
this.layoutBuilder = inject(AXPLayoutBuilderService);
|
|
70
|
+
this.translationService = inject(AXTranslationService);
|
|
71
|
+
this.commandService = inject(AXPCommandService);
|
|
72
|
+
this.entityDataSelector = inject(AXPEntityDataSelectorService);
|
|
73
|
+
this.entityRegistry = inject(AXPEntityDefinitionRegistryService);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Shows the compose dialog; on submit runs the send command with the dialog context.
|
|
77
|
+
* When {@link CommunicationManagementEmailShowDialogInput.textTemplateId} is not set, the standard
|
|
78
|
+
* entity data selector ({@link AXPEntityDataSelectorService}) runs first; the compose dialog has no template field.
|
|
79
|
+
*/
|
|
80
|
+
async openSendEmailDialog(input) {
|
|
81
|
+
const merge = parseMergeRecord(input.merge);
|
|
82
|
+
let textTemplateId = input.textTemplateId?.trim() ?? '';
|
|
83
|
+
if (!textTemplateId) {
|
|
84
|
+
const picked = await this.openTextTemplatePickerDialog();
|
|
85
|
+
if (picked === null) {
|
|
86
|
+
return { success: false };
|
|
87
|
+
}
|
|
88
|
+
textTemplateId = picked;
|
|
89
|
+
}
|
|
90
|
+
let subject = input.subject ?? '';
|
|
91
|
+
let body = input.body ?? '';
|
|
92
|
+
if (textTemplateId) {
|
|
93
|
+
const rendered = await this.commandService.execute(AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY, {
|
|
94
|
+
textTemplateId,
|
|
95
|
+
channel: 'email',
|
|
96
|
+
merge,
|
|
97
|
+
locale: this.translationService.getActiveLang() ?? 'en-US',
|
|
98
|
+
});
|
|
99
|
+
const __single_rendered = runtimeCommandPayloadData(rendered);
|
|
100
|
+
if (__single_rendered) {
|
|
101
|
+
subject = __single_rendered.subject ?? subject;
|
|
102
|
+
body = __single_rendered.body ?? body;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const defaultTitle = await this.translationService.translateAsync('@communication-management:email.dialog.title');
|
|
106
|
+
const title = input.dialogTitle?.trim()
|
|
107
|
+
? await this.translationService.translateAsync(input.dialogTitle)
|
|
108
|
+
: defaultTitle;
|
|
109
|
+
try {
|
|
110
|
+
const result = await this.layoutBuilder
|
|
111
|
+
.create()
|
|
112
|
+
.dialog((dialog) => {
|
|
113
|
+
dialog
|
|
114
|
+
.setTitle(title)
|
|
115
|
+
.setSize('lg')
|
|
116
|
+
.setCloseButton(true)
|
|
117
|
+
.setContext({
|
|
118
|
+
to: input.to ?? '',
|
|
119
|
+
cc: input.cc ?? '',
|
|
120
|
+
bcc: input.bcc ?? '',
|
|
121
|
+
subject,
|
|
122
|
+
body,
|
|
123
|
+
textTemplateId,
|
|
124
|
+
})
|
|
125
|
+
.content((flex) => {
|
|
126
|
+
flex
|
|
127
|
+
.setDirection('column')
|
|
128
|
+
.setGap('16px')
|
|
129
|
+
.formField('@communication-management:email.dialog.fields.to.title', (field) => {
|
|
130
|
+
field.path('to');
|
|
131
|
+
field.textBox({
|
|
132
|
+
validations: [{ rule: 'required' }],
|
|
133
|
+
placeholder: '@communication-management:email.dialog.fields.to.placeholder',
|
|
134
|
+
});
|
|
135
|
+
})
|
|
136
|
+
.formField('@communication-management:email.dialog.fields.cc.title', (field) => {
|
|
137
|
+
field.path('cc');
|
|
138
|
+
field.textBox({
|
|
139
|
+
placeholder: '@communication-management:email.dialog.fields.cc.placeholder',
|
|
140
|
+
});
|
|
141
|
+
})
|
|
142
|
+
.formField('@communication-management:email.dialog.fields.bcc.title', (field) => {
|
|
143
|
+
field.path('bcc');
|
|
144
|
+
field.textBox({
|
|
145
|
+
placeholder: '@communication-management:email.dialog.fields.bcc.placeholder',
|
|
146
|
+
});
|
|
147
|
+
})
|
|
148
|
+
.formField('@communication-management:email.dialog.fields.subject.title', (field) => {
|
|
149
|
+
field.path('subject');
|
|
150
|
+
field.textBox({
|
|
151
|
+
validations: [{ rule: 'required' }],
|
|
152
|
+
placeholder: '@communication-management:email.dialog.fields.subject.placeholder',
|
|
153
|
+
});
|
|
154
|
+
})
|
|
155
|
+
.formField('@communication-management:email.dialog.fields.body.title', (field) => {
|
|
156
|
+
field.path('body');
|
|
157
|
+
field.richText({
|
|
158
|
+
validations: [{ rule: 'required' }],
|
|
159
|
+
placeholder: '@communication-management:email.dialog.fields.body.placeholder',
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
})
|
|
163
|
+
.setActions((actions) => {
|
|
164
|
+
actions.cancel('@general:actions.cancel.title').submit('@general:actions.send.title');
|
|
165
|
+
})
|
|
166
|
+
.onAction(async (dialogRef) => {
|
|
167
|
+
const context = dialogRef.context();
|
|
168
|
+
const action = dialogRef.action();
|
|
169
|
+
if (!context || action === 'cancel') {
|
|
170
|
+
return { success: false };
|
|
171
|
+
}
|
|
172
|
+
const to = String(context['to'] ?? '').trim();
|
|
173
|
+
const subjectOut = String(context['subject'] ?? '').trim();
|
|
174
|
+
const bodyOut = String(context['body'] ?? '');
|
|
175
|
+
if (!to || !subjectOut || isEffectivelyEmptyRichTextBody(bodyOut)) {
|
|
176
|
+
return {
|
|
177
|
+
success: false,
|
|
178
|
+
message: {
|
|
179
|
+
text: await this.translationService.translateAsync('@communication-management:email.dialog.messages.required-fields'),
|
|
180
|
+
},
|
|
181
|
+
data: null,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
const sendInput = {
|
|
185
|
+
to,
|
|
186
|
+
cc: String(context['cc'] ?? '').trim() || undefined,
|
|
187
|
+
bcc: String(context['bcc'] ?? '').trim() || undefined,
|
|
188
|
+
subject: subjectOut,
|
|
189
|
+
body: bodyOut.trim(),
|
|
190
|
+
textTemplateId: normalizeTextTemplateId(context['textTemplateId']),
|
|
191
|
+
};
|
|
192
|
+
const sendResult = await this.commandService.execute(COMMUNICATION_MANAGEMENT_EMAIL_SEND_COMMAND_KEY, sendInput);
|
|
193
|
+
return (sendResult ?? {
|
|
194
|
+
success: false,
|
|
195
|
+
message: { text: 'Send command did not return a result.' },
|
|
196
|
+
data: null,
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
})
|
|
200
|
+
.show();
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
return {
|
|
205
|
+
success: false,
|
|
206
|
+
message: {
|
|
207
|
+
text: e instanceof Error ? e.message : 'Failed to open send email dialog.',
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Opens {@link AXPEntityDataSelectorService} for `ContentManagement.TextTemplate`. Returns `null` if
|
|
214
|
+
* the selector is dismissed without applying, `''` if the user applies with no row selected (compose
|
|
215
|
+
* without a template), or the selected template id.
|
|
216
|
+
*/
|
|
217
|
+
async openTextTemplatePickerDialog() {
|
|
218
|
+
const entity = await this.entityRegistry.resolve(TEXT_TEMPLATE_ENTITY_MODULE, TEXT_TEMPLATE_ENTITY_NAME);
|
|
219
|
+
if (!entity) {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
const title = await this.translationService.translateAsync('@communication-management:email.template-picker.title');
|
|
223
|
+
try {
|
|
224
|
+
const result = await this.entityDataSelector.open({
|
|
225
|
+
entity,
|
|
226
|
+
title,
|
|
227
|
+
allowMultiple: false,
|
|
228
|
+
allowCreate: 'none',
|
|
229
|
+
filters: TEXT_TEMPLATE_LIST_EMAIL_BODY_FILTER,
|
|
230
|
+
columns: ['title', 'name'],
|
|
231
|
+
searchFields: ['title', 'name'],
|
|
232
|
+
});
|
|
233
|
+
if (result == null) {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
const items = result.items ?? [];
|
|
237
|
+
if (items.length === 0) {
|
|
238
|
+
return '';
|
|
239
|
+
}
|
|
240
|
+
const rawId = items[0]['id'];
|
|
241
|
+
if (rawId != null && String(rawId).trim() !== '') {
|
|
242
|
+
return String(rawId).trim();
|
|
243
|
+
}
|
|
244
|
+
return '';
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMCommunicationEmailComposerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
251
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMCommunicationEmailComposerService, providedIn: 'root' }); }
|
|
252
|
+
}
|
|
253
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMCommunicationEmailComposerService, decorators: [{
|
|
254
|
+
type: Injectable,
|
|
255
|
+
args: [{
|
|
256
|
+
providedIn: 'root',
|
|
257
|
+
}]
|
|
258
|
+
}] });
|
|
259
|
+
|
|
260
|
+
//#endregion
|
|
261
|
+
//#region ---- Command ----
|
|
262
|
+
class CommunicationManagementEmailShowDialogCommand {
|
|
263
|
+
constructor() {
|
|
264
|
+
this.composer = inject(AXMCommunicationEmailComposerService);
|
|
265
|
+
}
|
|
266
|
+
async execute(input) {
|
|
267
|
+
const raw = input;
|
|
268
|
+
const evaluated = {
|
|
269
|
+
...(raw.options ?? {}),
|
|
270
|
+
...raw,
|
|
271
|
+
};
|
|
272
|
+
return this.composer.openSendEmailDialog(evaluated);
|
|
273
|
+
}
|
|
274
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: CommunicationManagementEmailShowDialogCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
275
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: CommunicationManagementEmailShowDialogCommand, providedIn: 'root' }); }
|
|
276
|
+
}
|
|
277
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: CommunicationManagementEmailShowDialogCommand, decorators: [{
|
|
278
|
+
type: Injectable,
|
|
279
|
+
args: [{
|
|
280
|
+
providedIn: 'root',
|
|
281
|
+
}]
|
|
282
|
+
}] });
|
|
283
|
+
|
|
284
|
+
export { CommunicationManagementEmailShowDialogCommand };
|
|
285
|
+
//# sourceMappingURL=acorex-platform-module-communication-management-client-communication-email-show-dialog.command-CP0zAEe4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-communication-management-client-communication-email-show-dialog.command-CP0zAEe4.mjs","sources":["../../../../libs/modules/communication-management/client/src/lib/features/email/communication-email-composer.service.ts","../../../../libs/modules/communication-management/client/src/lib/features/email/communication-email-show-dialog.command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXDataSourceFilterOption } from '@acorex/cdk/common';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY } from '@acorex-platform/module-content-management-client';\nimport { AXPRuntimeCommandResult, runtimeCommandPayloadData} from '@acorex-platform/framework-shared/core';\nimport { AXPLayoutBuilderService } from '@acorex-platform/framework-client/layout/builder';\nimport { AXPEntityDataSelectorService, AXPEntityDefinitionRegistryService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { Injectable, inject } from '@angular/core';\nimport { COMMUNICATION_MANAGEMENT_EMAIL_SEND_COMMAND_KEY } from '@acorex-platform/module-communication-management-client/contracts';\nimport type { AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport type {\n CommunicationManagementEmailSendInput,\n CommunicationManagementEmailSendResult,\n CommunicationManagementEmailShowDialogInput,\n} from '@acorex-platform/module-communication-management-client/contracts';\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction normalizeTextTemplateId(value: unknown): string | undefined {\n if (typeof value === 'string') {\n const t = value.trim();\n return t || undefined;\n }\n if (value != null && typeof value === 'object' && 'id' in value) {\n const id = (value as { id: unknown }).id;\n if (typeof id === 'string' && id.trim()) return id.trim();\n }\n return undefined;\n}\n\nfunction parseMergeRecord(value: unknown): Record<string, string> {\n if (value == null) return {};\n if (typeof value === 'object' && !Array.isArray(value)) {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = v == null ? '' : String(v);\n }\n return out;\n }\n return {};\n}\n\n/**\n * True when HTML/plain body has no user-visible text (handles empty `<p><br></p>` etc.).\n */\nfunction isEffectivelyEmptyRichTextBody(value: string): boolean {\n const trimmed = value.trim();\n if (!trimmed) {\n return true;\n }\n const withoutTags = trimmed\n .replace(/<[^>]+>/g, ' ')\n .replace(/ /gi, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n return withoutTags.length === 0;\n}\n\n/** Resolved entity module for the text-template data selector. */\nconst TEXT_TEMPLATE_ENTITY_MODULE = 'ContentManagement';\n\n/** Resolved entity name for the text-template data selector. */\nconst TEXT_TEMPLATE_ENTITY_NAME = 'TextTemplate';\n\n/** List filter: only templates with a non-empty `channels.email.body` (excludes SMS-only rows). */\nconst TEXT_TEMPLATE_LIST_EMAIL_BODY_FILTER = {\n field: 'channels.email.body',\n operator: { type: 'isNotEmpty' },\n} as unknown as AXDataSourceFilterOption;\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Opens the send-email dialog built with the layout dialog builder and delegates send to\n * {@link COMMUNICATION_MANAGEMENT_EMAIL_SEND_COMMAND_KEY}.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AXMCommunicationEmailComposerService {\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly translationService = inject(AXTranslationService);\n private readonly commandService = inject(AXPCommandService);\n private readonly entityDataSelector = inject(AXPEntityDataSelectorService);\n private readonly entityRegistry = inject(AXPEntityDefinitionRegistryService);\n\n /**\n * Shows the compose dialog; on submit runs the send command with the dialog context.\n * When {@link CommunicationManagementEmailShowDialogInput.textTemplateId} is not set, the standard\n * entity data selector ({@link AXPEntityDataSelectorService}) runs first; the compose dialog has no template field.\n */\n async openSendEmailDialog(\n input: CommunicationManagementEmailShowDialogInput,\n ): AXPCommandExecuteResultPromise<CommunicationManagementEmailSendResult | null> {\n const merge = parseMergeRecord(input.merge);\n let textTemplateId = input.textTemplateId?.trim() ?? '';\n\n if (!textTemplateId) {\n const picked = await this.openTextTemplatePickerDialog();\n if (picked === null) {\n return { success: false };\n }\n textTemplateId = picked;\n }\n\n let subject = input.subject ?? '';\n let body = input.body ?? '';\n\n if (textTemplateId) {\n const rendered = await this.commandService.execute<\n { textTemplateId: string; channel: string; merge: Record<string, string>; locale?: string },\n { subject?: string; body: string }\n >(AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY, {\n textTemplateId,\n channel: 'email',\n merge,\n locale: this.translationService.getActiveLang() ?? 'en-US',\n });\n const __single_rendered = runtimeCommandPayloadData(rendered);\n if (__single_rendered) {\n subject = __single_rendered.subject ?? subject;\n body = __single_rendered.body ?? body;\n }\n }\n\n const defaultTitle = await this.translationService.translateAsync(\n '@communication-management:email.dialog.title',\n );\n const title = input.dialogTitle?.trim()\n ? await this.translationService.translateAsync(input.dialogTitle)\n : defaultTitle;\n\n try {\n const result = await this.layoutBuilder\n .create()\n .dialog<AXPRuntimeCommandResult<CommunicationManagementEmailSendResult | null>>((dialog) => {\n dialog\n .setTitle(title)\n .setSize('lg')\n .setCloseButton(true)\n .setContext({\n to: input.to ?? '',\n cc: input.cc ?? '',\n bcc: input.bcc ?? '',\n subject,\n body,\n textTemplateId,\n })\n .content((flex) => {\n flex\n .setDirection('column')\n .setGap('16px')\n .formField('@communication-management:email.dialog.fields.to.title', (field) => {\n field.path('to');\n field.textBox({\n validations: [{ rule: 'required' }],\n placeholder: '@communication-management:email.dialog.fields.to.placeholder',\n });\n })\n .formField('@communication-management:email.dialog.fields.cc.title', (field) => {\n field.path('cc');\n field.textBox({\n placeholder: '@communication-management:email.dialog.fields.cc.placeholder',\n });\n })\n .formField('@communication-management:email.dialog.fields.bcc.title', (field) => {\n field.path('bcc');\n field.textBox({\n placeholder: '@communication-management:email.dialog.fields.bcc.placeholder',\n });\n })\n .formField('@communication-management:email.dialog.fields.subject.title', (field) => {\n field.path('subject');\n field.textBox({\n validations: [{ rule: 'required' }],\n placeholder: '@communication-management:email.dialog.fields.subject.placeholder',\n });\n })\n .formField('@communication-management:email.dialog.fields.body.title', (field) => {\n field.path('body');\n field.richText({\n validations: [{ rule: 'required' }],\n placeholder: '@communication-management:email.dialog.fields.body.placeholder',\n });\n });\n })\n .setActions((actions) => {\n actions.cancel('@general:actions.cancel.title').submit('@general:actions.send.title');\n })\n .onAction(async (dialogRef) => {\n const context = dialogRef.context() as Record<string, unknown> | null;\n const action = dialogRef.action();\n if (!context || action === 'cancel') {\n return { success: false };\n }\n const to = String(context['to'] ?? '').trim();\n const subjectOut = String(context['subject'] ?? '').trim();\n const bodyOut = String(context['body'] ?? '');\n if (!to || !subjectOut || isEffectivelyEmptyRichTextBody(bodyOut)) {\n return {\n success: false,\n message: {\n text: await this.translationService.translateAsync(\n '@communication-management:email.dialog.messages.required-fields',\n ),\n },\n data: null,\n };\n }\n const sendInput: CommunicationManagementEmailSendInput = {\n to,\n cc: String(context['cc'] ?? '').trim() || undefined,\n bcc: String(context['bcc'] ?? '').trim() || undefined,\n subject: subjectOut,\n body: bodyOut.trim(),\n textTemplateId: normalizeTextTemplateId(context['textTemplateId']),\n };\n const sendResult = await this.commandService.execute<\n CommunicationManagementEmailSendInput,\n CommunicationManagementEmailSendResult\n >(COMMUNICATION_MANAGEMENT_EMAIL_SEND_COMMAND_KEY, sendInput);\n return (\n sendResult ?? {\n success: false,\n message: { text: 'Send command did not return a result.' },\n data: null,\n }\n );\n });\n })\n .show();\n\n return result;\n } catch (e) {\n return {\n success: false,\n message: {\n text: e instanceof Error ? e.message : 'Failed to open send email dialog.',\n },\n };\n }\n }\n\n /**\n * Opens {@link AXPEntityDataSelectorService} for `ContentManagement.TextTemplate`. Returns `null` if\n * the selector is dismissed without applying, `''` if the user applies with no row selected (compose\n * without a template), or the selected template id.\n */\n private async openTextTemplatePickerDialog(): Promise<string | null> {\n const entity = await this.entityRegistry.resolve(TEXT_TEMPLATE_ENTITY_MODULE, TEXT_TEMPLATE_ENTITY_NAME);\n if (!entity) {\n return null;\n }\n\n const title = await this.translationService.translateAsync(\n '@communication-management:email.template-picker.title',\n );\n\n try {\n const result = await this.entityDataSelector.open({\n entity,\n title,\n allowMultiple: false,\n allowCreate: 'none',\n filters: TEXT_TEMPLATE_LIST_EMAIL_BODY_FILTER,\n columns: ['title', 'name'],\n searchFields: ['title', 'name'],\n });\n if (result == null) {\n return null;\n }\n const items = result.items ?? [];\n if (items.length === 0) {\n return '';\n }\n const rawId = (items[0] as Record<string, unknown>)['id'];\n if (rawId != null && String(rawId).trim() !== '') {\n return String(rawId).trim();\n }\n return '';\n } catch {\n return null;\n }\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\nimport { Injectable, inject } from '@angular/core';\nimport type {\n CommunicationManagementEmailSendResult,\n CommunicationManagementEmailShowDialogInput,\n} from '@acorex-platform/module-communication-management-client/contracts';\nimport { AXMCommunicationEmailComposerService } from './communication-email-composer.service';\n\n//#endregion\n\n//#region ---- Command ----\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CommunicationManagementEmailShowDialogCommand\n implements AXPCommand<CommunicationManagementEmailShowDialogInput, CommunicationManagementEmailSendResult | null>\n{\n private readonly composer = inject(AXMCommunicationEmailComposerService);\n\n async execute(\n input: CommunicationManagementEmailShowDialogInput | unknown,\n ): AXPCommandExecuteResultPromise<CommunicationManagementEmailSendResult | null> {\n const raw = input as { options?: CommunicationManagementEmailShowDialogInput } & Record<string, unknown>;\n const evaluated: CommunicationManagementEmailShowDialogInput = {\n ...(raw.options ?? {}),\n ...(raw as CommunicationManagementEmailShowDialogInput),\n };\n\n return this.composer.openSendEmailDialog(evaluated);\n }\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
|