@acorex-platform/module-communication-management-client 0.0.30 → 0.0.33

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 (43) hide show
  1. package/fesm2022/{acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-09UhY2Rc.mjs → acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-G4wzzccx.mjs} +357 -121
  2. package/fesm2022/acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-G4wzzccx.mjs.map +1 -0
  3. package/fesm2022/{acorex-platform-module-communication-management-client-communication-email-send.command-wuqLiY8s.mjs → acorex-platform-module-communication-management-client-communication-email-send.command-De8K6vIB.mjs} +2 -2
  4. package/fesm2022/{acorex-platform-module-communication-management-client-communication-email-send.command-wuqLiY8s.mjs.map → acorex-platform-module-communication-management-client-communication-email-send.command-De8K6vIB.mjs.map} +1 -1
  5. package/fesm2022/{acorex-platform-module-communication-management-client-communication-email-show-dialog.command-CP0zAEe4.mjs → acorex-platform-module-communication-management-client-communication-email-show-dialog.command-NuJLiYs_.mjs} +5 -9
  6. package/fesm2022/acorex-platform-module-communication-management-client-communication-email-show-dialog.command-NuJLiYs_.mjs.map +1 -0
  7. package/fesm2022/{acorex-platform-module-communication-management-client-communication-in-app-inbox-page.component-b7ZqkMTt.mjs → acorex-platform-module-communication-management-client-communication-in-app-inbox-page.component-BjJjqWja.mjs} +2 -2
  8. package/fesm2022/{acorex-platform-module-communication-management-client-communication-in-app-inbox-page.component-b7ZqkMTt.mjs.map → acorex-platform-module-communication-management-client-communication-in-app-inbox-page.component-BjJjqWja.mjs.map} +1 -1
  9. package/fesm2022/{acorex-platform-module-communication-management-client-communication-send.command-D7_MmGQe.mjs → acorex-platform-module-communication-management-client-communication-send.command-NEXrsogP.mjs} +3 -2
  10. package/fesm2022/acorex-platform-module-communication-management-client-communication-send.command-NEXrsogP.mjs.map +1 -0
  11. package/fesm2022/{acorex-platform-module-communication-management-client-communication-show-sent-message.command-D8125Jxi.mjs → acorex-platform-module-communication-management-client-communication-show-sent-message.command-D9KRxkdp.mjs} +21 -13
  12. package/fesm2022/acorex-platform-module-communication-management-client-communication-show-sent-message.command-D9KRxkdp.mjs.map +1 -0
  13. package/fesm2022/{acorex-platform-module-communication-management-client-communication-test-smtp.command-BySmN1Lz.mjs → acorex-platform-module-communication-management-client-communication-test-smtp.command-Cp5fHOh4.mjs} +2 -2
  14. package/fesm2022/{acorex-platform-module-communication-management-client-communication-test-smtp.command-BySmN1Lz.mjs.map → acorex-platform-module-communication-management-client-communication-test-smtp.command-Cp5fHOh4.mjs.map} +1 -1
  15. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entities-communication-delivery.mjs +235 -0
  16. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entities-communication-delivery.mjs.map +1 -0
  17. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entities-communication.mjs +254 -0
  18. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entities-communication.mjs.map +1 -0
  19. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entity-catalog-acorex-platform-module-communication-management-client-contracts-entity-catalog-BvLoGDK5.mjs +60 -0
  20. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entity-catalog-acorex-platform-module-communication-management-client-contracts-entity-catalog-BvLoGDK5.mjs.map +1 -0
  21. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entity-catalog-communication-delivery.entity-DPCU8P32.mjs +183 -0
  22. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entity-catalog-communication-delivery.entity-DPCU8P32.mjs.map +1 -0
  23. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entity-catalog-communication.entity-DGj9OD3Z.mjs +202 -0
  24. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entity-catalog-communication.entity-DGj9OD3Z.mjs.map +1 -0
  25. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entity-catalog-status.keys-JESc4HlO.mjs +15 -0
  26. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entity-catalog-status.keys-JESc4HlO.mjs.map +1 -0
  27. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entity-catalog.mjs +2 -0
  28. package/fesm2022/acorex-platform-module-communication-management-client-contracts-entity-catalog.mjs.map +1 -0
  29. package/fesm2022/acorex-platform-module-communication-management-client-contracts.mjs.map +1 -1
  30. package/fesm2022/acorex-platform-module-communication-management-client-local-entities.mjs +30 -0
  31. package/fesm2022/acorex-platform-module-communication-management-client-local-entities.mjs.map +1 -0
  32. package/fesm2022/acorex-platform-module-communication-management-client.mjs +1 -1
  33. package/package.json +19 -3
  34. package/types/acorex-platform-module-communication-management-client-contracts-entities-communication-delivery.d.ts +5 -0
  35. package/types/acorex-platform-module-communication-management-client-contracts-entities-communication.d.ts +5 -0
  36. package/types/acorex-platform-module-communication-management-client-contracts-entity-catalog.d.ts +10 -0
  37. package/types/acorex-platform-module-communication-management-client-contracts.d.ts +6 -1
  38. package/types/acorex-platform-module-communication-management-client-local-entities.d.ts +12 -0
  39. package/types/acorex-platform-module-communication-management-client.d.ts +102 -1
  40. package/fesm2022/acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-09UhY2Rc.mjs.map +0 -1
  41. package/fesm2022/acorex-platform-module-communication-management-client-communication-email-show-dialog.command-CP0zAEe4.mjs.map +0 -1
  42. package/fesm2022/acorex-platform-module-communication-management-client-communication-send.command-D7_MmGQe.mjs.map +0 -1
  43. package/fesm2022/acorex-platform-module-communication-management-client-communication-show-sent-message.command-D8125Jxi.mjs.map +0 -1
@@ -22,15 +22,11 @@ function normalizeTextTemplateId(value) {
22
22
  }
23
23
  return undefined;
24
24
  }
25
- function parseMergeRecord(value) {
25
+ function parseDataRecord(value) {
26
26
  if (value == null)
27
27
  return {};
28
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;
29
+ return { ...value };
34
30
  }
35
31
  return {};
36
32
  }
@@ -78,7 +74,7 @@ class AXMCommunicationEmailComposerService {
78
74
  * entity data selector ({@link AXPEntityDataSelectorService}) runs first; the compose dialog has no template field.
79
75
  */
80
76
  async openSendEmailDialog(input) {
81
- const merge = parseMergeRecord(input.merge);
77
+ const data = parseDataRecord(input.data);
82
78
  let textTemplateId = input.textTemplateId?.trim() ?? '';
83
79
  if (!textTemplateId) {
84
80
  const picked = await this.openTextTemplatePickerDialog();
@@ -93,7 +89,7 @@ class AXMCommunicationEmailComposerService {
93
89
  const rendered = await this.commandService.execute(AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY, {
94
90
  textTemplateId,
95
91
  channel: 'email',
96
- merge,
92
+ data,
97
93
  locale: this.translationService.getActiveLang() ?? 'en-US',
98
94
  });
99
95
  const __single_rendered = runtimeCommandPayloadData(rendered);
@@ -282,4 +278,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
282
278
  }] });
283
279
 
284
280
  export { CommunicationManagementEmailShowDialogCommand };
285
- //# sourceMappingURL=acorex-platform-module-communication-management-client-communication-email-show-dialog.command-CP0zAEe4.mjs.map
281
+ //# sourceMappingURL=acorex-platform-module-communication-management-client-communication-email-show-dialog.command-NuJLiYs_.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-communication-management-client-communication-email-show-dialog.command-NuJLiYs_.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 parseDataRecord(value: unknown): Record<string, unknown> {\n if (value == null) return {};\n if (typeof value === 'object' && !Array.isArray(value)) {\n return { ...(value as Record<string, unknown>) };\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(/&nbsp;/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 data = parseDataRecord(input.data);\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; data: Record<string, unknown>; locale?: string },\n { subject?: string; body: string }\n >(AXC_TEXT_TEMPLATE_RENDER_COMMAND_KEY, {\n textTemplateId,\n channel: 'email',\n data,\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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"}
@@ -23,7 +23,7 @@ import * as i1 from '@angular/common';
23
23
  import { CommonModule } from '@angular/common';
24
24
  import * as i0 from '@angular/core';
25
25
  import { inject, computed, signal, viewChild, ChangeDetectionStrategy, Component } from '@angular/core';
26
- import { A as AXPInAppInboxConnectorService, a as AXPInAppInboxActionService, b as AXP_IN_APP_INBOX_I18N, c as AXPInAppInboxItemComponent } from './acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-09UhY2Rc.mjs';
26
+ import { A as AXPInAppInboxConnectorService, a as AXPInAppInboxActionService, b as AXP_IN_APP_INBOX_I18N, c as AXPInAppInboxItemComponent } from './acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-G4wzzccx.mjs';
27
27
 
28
28
  //#region ---- Communication in-app inbox page ----
29
29
  class AXMCommunicationInAppInboxPageComponent extends AXPPageLayoutBaseComponent {
@@ -511,4 +511,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
511
511
  }], propDecorators: { contextMenu: [{ type: i0.ViewChild, args: ['contextMenu', { isSignal: true }] }] } });
512
512
 
513
513
  export { AXMCommunicationInAppInboxPageComponent };
514
- //# sourceMappingURL=acorex-platform-module-communication-management-client-communication-in-app-inbox-page.component-b7ZqkMTt.mjs.map
514
+ //# sourceMappingURL=acorex-platform-module-communication-management-client-communication-in-app-inbox-page.component-BjJjqWja.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-communication-management-client-communication-in-app-inbox-page.component-b7ZqkMTt.mjs","sources":["../../../../libs/modules/communication-management/client/src/lib/features/in-app/communication-in-app-inbox-page.component.ts","../../../../libs/modules/communication-management/client/src/lib/features/in-app/communication-in-app-inbox-page.component.html"],"sourcesContent":["import { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXCheckBoxModule } from '@acorex/components/check-box';\nimport { AXDataPagerChangedEvent, AXDataPagerMode, AXDataPagerModule } from '@acorex/components/data-pager';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelModule } from '@acorex/components/label';\nimport {\n AXContextMenuComponent,\n AXContextMenuItemsClickEvent,\n AXContextMenuOpeningEvent,\n} from '@acorex/components/menu';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXSlidingItemModule } from '@acorex/components/sliding-item';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPDeviceService } from '@acorex-platform/framework-client/core';\nimport {\n AXPQueryFiltersComponent,\n AXPStateMessageComponent,\n AXPThemeLayoutBlockComponent,\n} from '@acorex-platform/framework-client/layout/components';\nimport {\n AXPPageLayoutBase,\n AXPPageLayoutBaseComponent,\n AXPPageLayoutComponent,\n} from '@acorex-platform/framework-client/layout/views';\nimport { AXPActionMenuItem, AXPExecuteCommand, AXPFilterDefinition, AXPFilterQuery, AXP_QUERY_QUICK_SEARCH_FIELD } from '@acorex-platform/framework-shared/core';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, OnInit, signal, viewChild } from '@angular/core';\nimport {\n AXPInAppInboxConnectorService,\n AXPInAppInboxItemComponent,\n AXP_IN_APP_INBOX_I18N,\n type AXPInAppInboxItem,\n} from './inbox';\nimport { AXPInAppInboxActionService } from './inbox/in-app-inbox-action.service';\n\n//#region ---- Communication in-app inbox page ----\n\n@Component({\n selector: 'axm-communication-in-app-inbox-page',\n templateUrl: './communication-in-app-inbox-page.component.html',\n styleUrls: ['./communication-in-app-inbox-page.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: AXPPageLayoutBase, useExisting: AXMCommunicationInAppInboxPageComponent }],\n host: {\n class: 'axm-communication-in-app-inbox-page',\n '(document:keydown.escape)': 'deselectAll()',\n },\n imports: [\n CommonModule,\n AXButtonModule,\n AXDecoratorModule,\n AXSkeletonModule,\n AXTranslationModule,\n AXCheckBoxModule,\n AXLabelModule,\n AXSlidingItemModule,\n AXDataPagerModule,\n AXContextMenuComponent,\n AXPPageLayoutComponent,\n AXPThemeLayoutBlockComponent,\n AXPStateMessageComponent,\n AXPQueryFiltersComponent,\n AXPInAppInboxItemComponent,\n ],\n})\nexport class AXMCommunicationInAppInboxPageComponent extends AXPPageLayoutBaseComponent implements OnInit {\n private static readonly DEFAULT_PAGE_SIZE = 10;\n\n private readonly connector = inject(AXPInAppInboxConnectorService);\n private readonly inboxActions = inject(AXPInAppInboxActionService);\n protected readonly i18n = inject(AXP_IN_APP_INBOX_I18N);\n protected readonly deviceService = inject(AXPDeviceService);\n\n protected readonly pageLoading = this.connector.pageLoadingState;\n protected readonly pageItems = this.connector.pagedInboxList;\n protected readonly pageTotal = this.connector.pagedTotal;\n protected readonly unreadCount = this.connector.unreadCount;\n protected readonly totalCount = this.connector.total;\n protected readonly showPin = computed(() => this.connector.capabilities.pinSupport);\n\n protected readonly filterDefinitions = signal<AXPFilterDefinition[]>([]);\n protected readonly panelInitialFilters = signal<AXPFilterQuery[]>([]);\n protected readonly queryFiltersKey = signal(0);\n private readonly activeFilters = signal<AXPFilterQuery[]>([]);\n protected readonly pageIndex = signal(0);\n protected readonly pageSize = signal(AXMCommunicationInAppInboxPageComponent.DEFAULT_PAGE_SIZE);\n protected isEditing = signal(false);\n protected contextMenu = viewChild<AXContextMenuComponent>('contextMenu');\n protected contextItem = signal<AXPInAppInboxItem | null>(null);\n\n private readonly selectedIds = signal<Set<string>>(new Set<string>());\n selectedCount = computed(() => this.selectedIds().size);\n\n protected readonly pagerDisplayMode = computed(\n (): AXDataPagerMode => (this.deviceService.isSmall() ? 'compact' : 'full'),\n );\n\n protected readonly skeletonPlaceholders = computed(() =>\n Array.from({ length: Math.max(this.pageSize(), 1) }, (_, index) => index),\n );\n\n readonly hasActiveFilters = computed(() =>\n this.activeFilters().some((filter) => {\n if (filter.field === 'readStatus' && (!filter.value || filter.value === 'all')) {\n return false;\n }\n return filter.value != null && String(filter.value).trim() !== '';\n }),\n );\n\n private readonly searchText = computed(() => {\n const searchFilter = this.activeFilters().find(\n (f) => f.field === 'all' || f.field === AXP_QUERY_QUICK_SEARCH_FIELD,\n );\n return searchFilter?.value != null ? String(searchFilter.value).trim().toLowerCase() : '';\n });\n\n private readonly isUnreadFilterActive = computed(() => {\n const readFilter = this.activeFilters().find((f) => f.field === 'readStatus');\n return readFilter?.value === 'unread';\n });\n\n protected readonly highlightUnreadBackground = computed(() => !this.isUnreadFilterActive());\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadFilterDefinitions();\n await this.connector.ensureReady();\n await this.loadPage();\n await this.connector.markUnseenAsSeen();\n }\n\n override async getPageTitle(): Promise<string> {\n return this.translateService.translateAsync(this.i18n.pageTitle);\n }\n\n override async getPageDescription(): Promise<string> {\n const unread = this.unreadCount();\n const total = this.totalCount();\n if (!total) {\n return this.translateService.translateAsync(this.i18n.pageDescriptionNone);\n }\n if (unread > 0) {\n return this.translateService.translateAsync(this.i18n.pageDescriptionUnread, {\n params: { unread, total },\n });\n }\n return this.translateService.translateAsync(this.i18n.pageDescriptionAllRead, { params: { total } });\n }\n\n override async getPrimaryMenuItems(): Promise<AXPActionMenuItem[]> {\n if (this.selectedCount() === 0) {\n return [];\n }\n\n return [\n {\n title: await this.translateService.translateAsync(this.i18n.delete),\n icon: 'fa-light fa-trash',\n command: { name: 'delete-selected' },\n color: 'danger',\n },\n {\n title: await this.translateService.translateAsync(this.i18n.archive),\n icon: 'fa-light fa-box-archive',\n command: { name: 'archive-selected' },\n },\n {\n title: await this.translateService.translateAsync(this.i18n.markAsRead),\n icon: 'fa-light fa-envelopes-bulk',\n command: { name: 'mark-selected-as-read' },\n color: 'primary',\n },\n ];\n }\n\n override async getSecondaryMenuItems(): Promise<AXPActionMenuItem[]> {\n if (this.selectedCount() > 0) {\n return [];\n }\n\n return [\n {\n title: await this.translateService.translateAsync(this.i18n.refresh),\n icon: 'fa-light fa-rotate',\n command: { name: 'refresh' },\n },\n {\n title: await this.translateService.translateAsync(this.i18n.markAllAsRead),\n icon: 'fa-light fa-envelopes-bulk',\n command: { name: 'mark-all-read' },\n disabled: this.unreadCount() === 0,\n },\n {\n title: await this.translateService.translateAsync(this.i18n.selectItems),\n icon: 'fa-light fa-pen',\n command: { name: 'edit-mode' },\n color: 'primary',\n },\n ];\n }\n\n override async execute(command: AXPExecuteCommand): Promise<void> {\n switch (command.name) {\n case 'refresh':\n await this.onRefresh();\n this.exitEditModeIfNeeded();\n break;\n case 'delete-selected':\n await this.deleteSelected();\n this.exitEditModeIfNeeded();\n break;\n case 'archive-selected':\n await this.archiveSelected();\n this.exitEditModeIfNeeded();\n break;\n case 'mark-selected-as-read':\n await this.markSelectedAsRead();\n this.exitEditModeIfNeeded();\n break;\n case 'mark-all-read':\n await this.onMarkAllAsRead();\n this.exitEditModeIfNeeded();\n break;\n case 'edit-mode':\n if (this.isEditing()) {\n this.deselectAll();\n } else {\n this.isEditing.set(true);\n }\n this.recompute();\n break;\n }\n }\n\n protected handleFiltersChanged(filters: AXPFilterQuery[]): void {\n this.activeFilters.set(filters);\n this.pageIndex.set(0);\n void this.loadPage();\n }\n\n protected clearFilters(): void {\n this.activeFilters.set([]);\n this.panelInitialFilters.set([]);\n this.pageIndex.set(0);\n this.queryFiltersKey.update((key) => key + 1);\n void this.loadPage();\n }\n\n protected onPageChanged(event: AXDataPagerChangedEvent): void {\n if (!event.isUserInteraction) {\n return;\n }\n\n const nextIndex = Math.floor(event.skip / event.take);\n if (nextIndex === this.pageIndex() && event.take === this.pageSize()) {\n return;\n }\n\n this.pageSize.set(event.take);\n this.pageIndex.set(nextIndex);\n void this.loadPage();\n }\n\n protected async onItemPress(id: string): Promise<void> {\n if (this.isEditing()) {\n this.toggleSelectionById(id);\n return;\n }\n if (this.selectedCount() > 0) {\n return;\n }\n await this.inboxActions.openItem(id);\n }\n\n protected async onTogglePin(id: string): Promise<void> {\n await this.connector.togglePin(id);\n }\n\n protected async onDismissUnread(id: string): Promise<void> {\n await this.connector.markAsRead([id]);\n this.recompute();\n }\n\n protected isSelected(id: string): boolean {\n return this.selectedIds().has(id);\n }\n\n protected toggleSelectionWithModel(id: string, event: AXValueChangedEvent<boolean>): void {\n const checked = Boolean(event.value);\n const next = new Set(this.selectedIds());\n if (checked) {\n next.add(id);\n } else {\n next.delete(id);\n }\n this.selectedIds.set(next);\n this.recompute();\n }\n\n protected deselectAll(): void {\n if (this.selectedCount() > 0) {\n this.selectedIds.set(new Set());\n }\n if (this.isEditing()) {\n this.isEditing.set(false);\n }\n this.recompute();\n }\n\n protected slidingItemsHandler(item: AXPInAppInboxItem, action: 'mark-as-read' | 'delete' | 'archive'): void {\n switch (action) {\n case 'mark-as-read':\n void this.markSelectedAsRead(item);\n break;\n case 'delete':\n void this.deleteSelected(item);\n break;\n case 'archive':\n void this.archiveSelected(item);\n break;\n }\n }\n\n protected openContextMenu(event: MouseEvent, item: AXPInAppInboxItem): void {\n if (this.isEditing() || this.selectedCount() > 0) {\n return;\n }\n event.preventDefault();\n this.contextItem.set(item);\n this.contextMenu()?.showAt({ x: event.clientX, y: event.clientY });\n }\n\n protected async handleContextMenuOpening(event: AXContextMenuOpeningEvent): Promise<void> {\n const item = this.contextItem();\n const isPinned = item?.isPinned ?? false;\n\n event.items = [\n {\n name: isPinned ? 'unpin' : 'pin',\n text: await this.translateService.translateAsync(isPinned ? this.i18n.unpin : this.i18n.pin),\n icon: isPinned ? 'fa-light fa-thumbtack-slash' : 'fa-light fa-thumbtack',\n },\n {\n name: 'mark-as-read',\n text: await this.translateService.translateAsync(this.i18n.markAsRead),\n icon: 'fa-light fa-envelopes-bulk',\n color: 'primary',\n },\n {\n name: 'archive',\n text: await this.translateService.translateAsync(this.i18n.archive),\n icon: 'fa-light fa-box-archive',\n },\n {\n name: 'delete',\n text: await this.translateService.translateAsync(this.i18n.delete),\n icon: 'fa-light fa-trash-can',\n color: 'danger',\n },\n ];\n }\n\n protected handleContextMenuItemClick(event: AXContextMenuItemsClickEvent): void {\n const item = this.contextItem();\n if (!item) {\n return;\n }\n\n switch (event.item.name) {\n case 'mark-as-read':\n void this.markSelectedAsRead(item);\n break;\n case 'pin':\n case 'unpin':\n void this.onTogglePin(item.id);\n break;\n case 'archive':\n void this.archiveSelected(item);\n break;\n case 'delete':\n void this.deleteSelected(item);\n break;\n }\n }\n\n protected getEmptyIcon(): string {\n if (this.searchText()) {\n return 'fa-solid fa-magnifying-glass';\n }\n if (this.isUnreadFilterActive()) {\n return 'fa-solid fa-check-circle';\n }\n return 'fa-solid fa-bell';\n }\n\n protected getEmptyTitle(): string {\n if (this.hasActiveFilters()) {\n return '@communication-management:in-app.state.no-results.title';\n }\n if (this.isUnreadFilterActive()) {\n return '@communication-management:in-app.state.all-caught-up.title';\n }\n return this.i18n.emptyTitle;\n }\n\n protected getEmptyDescription(): string {\n if (this.hasActiveFilters()) {\n return '@communication-management:in-app.state.no-results.description';\n }\n if (this.isUnreadFilterActive()) {\n return '@communication-management:in-app.state.all-caught-up.description';\n }\n return this.i18n.emptyDescription;\n }\n\n private async onRefresh(): Promise<void> {\n await this.connector.refresh();\n await this.loadPage();\n }\n\n private async onMarkAllAsRead(): Promise<void> {\n await this.connector.markAllAsRead();\n }\n\n private async markSelectedAsRead(item?: AXPInAppInboxItem): Promise<void> {\n const ids = item ? [item.id] : Array.from(this.selectedIds());\n if (ids.length === 0) {\n return;\n }\n await this.connector.markAsRead(ids);\n this.selectedIds.set(new Set());\n this.recompute();\n }\n\n private async deleteSelected(item?: AXPInAppInboxItem): Promise<void> {\n const ids = item ? [item.id] : Array.from(this.selectedIds());\n for (const id of ids) {\n await this.connector.deleteOne(id);\n }\n this.selectedIds.set(new Set());\n this.recompute();\n }\n\n private async archiveSelected(item?: AXPInAppInboxItem): Promise<void> {\n const ids = item ? [item.id] : Array.from(this.selectedIds());\n if (ids.length === 0) {\n return;\n }\n await this.connector.archive(ids);\n this.selectedIds.set(new Set());\n this.recompute();\n }\n\n private toggleSelectionById(id: string): void {\n const next = new Set(this.selectedIds());\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n this.selectedIds.set(next);\n this.recompute();\n }\n\n private exitEditModeIfNeeded(): void {\n if (this.isEditing()) {\n this.isEditing.set(false);\n }\n }\n\n private async loadPage(): Promise<void> {\n await this.connector.loadPage(this.activeFilters(), this.pageIndex() * this.pageSize(), this.pageSize());\n }\n\n private async loadFilterDefinitions(): Promise<void> {\n const [allLabel, unreadLabel, inboxLabel, archiveLabel, warningLabel, dangerLabel, noticeLabel] =\n await Promise.all([\n this.translateService.translateAsync(this.i18n.all),\n this.translateService.translateAsync(this.i18n.unread),\n this.translateService.translateAsync('@communication-management:in-app.filters.category.options.inbox'),\n this.translateService.translateAsync('@communication-management:in-app.filters.category.options.archive'),\n this.translateService.translateAsync('@communication-management:in-app.filters.priority.options.warning'),\n this.translateService.translateAsync('@communication-management:in-app.filters.priority.options.danger'),\n this.translateService.translateAsync('@communication-management:in-app.filters.priority.options.notice'),\n ]);\n\n this.filterDefinitions.set([\n {\n field: 'all',\n title: '@communication-management:in-app.filters.search.title',\n icon: 'fa-light fa-magnifying-glass',\n widget: { type: 'string-filter' },\n filterType: { inline: true, advance: false },\n },\n {\n field: 'readStatus',\n operator: { type: 'equal' },\n title: '@communication-management:in-app.filters.read-status.title',\n icon: 'fa-light fa-envelope-open-text',\n widget: {\n type: 'select-filter',\n options: {\n dataSource: [\n { id: 'all', title: allLabel },\n { id: 'unread', title: unreadLabel },\n ],\n valueField: 'id',\n textField: 'title',\n allowClear: true,\n },\n },\n filterType: { advance: true, inline: false },\n },\n {\n field: 'priority',\n operator: { type: 'equal' },\n title: '@communication-management:in-app.filters.priority.title',\n icon: 'fa-light fa-flag',\n widget: {\n type: 'select-filter',\n options: {\n dataSource: [\n { id: 'Warning', title: warningLabel },\n { id: 'Danger', title: dangerLabel },\n { id: 'Notice', title: noticeLabel },\n ],\n valueField: 'id',\n textField: 'title',\n allowClear: true,\n },\n },\n filterType: { advance: true, inline: false },\n },\n {\n field: 'category',\n operator: { type: 'equal' },\n title: '@communication-management:in-app.filters.category.title',\n icon: 'fa-light fa-inbox',\n widget: {\n type: 'select-filter',\n options: {\n dataSource: [\n { id: 'Inbox', title: inboxLabel },\n { id: 'Archive', title: archiveLabel },\n ],\n valueField: 'id',\n textField: 'title',\n allowClear: true,\n },\n },\n filterType: { advance: true, inline: false },\n },\n ]);\n }\n}\n\n//#endregion\n","<axp-page-layout>\n <axp-page-toolbar>\n <div class=\"w-full flex items-center\">\n <axp-layout-prefix class=\"w-full\">\n @if (selectedCount() > 0 || isEditing()) {\n <!-- ----- Bulk selection bar ----- -->\n <div class=\"axm-communication-in-app-inbox-page__selection-bar\">\n <span class=\"axm-communication-in-app-inbox-page__selection-count\">\n {{ selectedCount() }} {{ '@general:terms.items-selected' | translate | async }}\n </span>\n <button type=\"button\" class=\"axm-communication-in-app-inbox-page__unselect\" (click)=\"deselectAll()\">\n {{ '@general:actions.unselect.title' | translate | async }}\n </button>\n </div>\n } @else {\n @for (_k of [queryFiltersKey()]; track _k) {\n <axp-query-filters\n [filtersDefinitions]=\"filterDefinitions()\"\n [initialFilters]=\"panelInitialFilters()\"\n [quickSearch]=\"true\"\n (onFiltersChanged)=\"handleFiltersChanged($event)\"\n />\n }\n }\n </axp-layout-prefix>\n </div>\n </axp-page-toolbar>\n\n <axp-page-content class=\"axm-communication-in-app-inbox-page__content\">\n <div class=\"axm-communication-in-app-inbox-page__panel\">\n @if (pageLoading()) {\n <!-- ----- Loading skeleton list ----- -->\n <div class=\"axm-communication-in-app-inbox-page__list axm-communication-in-app-inbox-page__list--loading\">\n @for (_ of skeletonPlaceholders(); track $index) {\n <div class=\"axm-communication-in-app-inbox-page__skeleton\">\n <ax-skeleton [animated]=\"true\" class=\"axm-communication-in-app-inbox-page__skeleton-avatar\"></ax-skeleton>\n <div class=\"axm-communication-in-app-inbox-page__skeleton-body\">\n <ax-skeleton [animated]=\"true\" class=\"axm-communication-in-app-inbox-page__skeleton-line --wide\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"axm-communication-in-app-inbox-page__skeleton-line\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n } @else if (pageTotal() === 0) {\n <axp-state-message\n mode=\"empty\"\n [icon]=\"getEmptyIcon()\"\n [title]=\"getEmptyTitle()\"\n [description]=\"getEmptyDescription()\"\n >\n @if (hasActiveFilters()) {\n <ax-button\n slot=\"actions\"\n look=\"outline\"\n [text]=\"((i18n.clearFilters | translate | async) ?? '')\"\n (onClick)=\"clearFilters()\"\n />\n }\n </axp-state-message>\n } @else {\n <div class=\"axm-communication-in-app-inbox-page__list\">\n @for (item of pageItems(); track item.id) {\n @if (deviceService.isMobileDevice()) {\n <ng-container [ngTemplateOutlet]=\"mobile\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n } @else {\n <ng-container [ngTemplateOutlet]=\"desktop\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n }\n }\n </div>\n }\n </div>\n </axp-page-content>\n\n @if (!pageLoading() && pageTotal() > 0) {\n <!-- ----- Pagination pinned to page footer ----- -->\n <axp-page-footer\n class=\"axm-communication-in-app-inbox-page__footer\"\n [class.axm-communication-in-app-inbox-page__footer--compact]=\"deviceService.isSmall()\"\n >\n <ax-data-pager\n [displayMode]=\"pagerDisplayMode()\"\n [total]=\"pageTotal()\"\n [size]=\"pageSize()\"\n [value]=\"pageIndex() + 1\"\n (onChanged)=\"onPageChanged($event)\"\n />\n </axp-page-footer>\n }\n</axp-page-layout>\n\n<ng-template #mobile let-item>\n <ax-sliding-item class=\"axm-communication-in-app-inbox-page__sliding-item\">\n <ax-content class=\"p-0!\">\n <div\n class=\"axm-communication-in-app-inbox-page__row\"\n [class.--selected]=\"isSelected(item.id)\"\n (contextmenu)=\"openContextMenu($event, item)\"\n >\n @if (isEditing()) {\n <ax-check-box\n class=\"axm-communication-in-app-inbox-page__checkbox\"\n [value]=\"isSelected(item.id)\"\n (onValueChanged)=\"toggleSelectionWithModel(item.id, $event)\"\n >\n <ax-label></ax-label>\n </ax-check-box>\n }\n <axp-in-app-inbox-item\n class=\"flex-1 min-w-0\"\n [data]=\"item\"\n [highlightUnreadBackground]=\"highlightUnreadBackground()\"\n [showPin]=\"showPin()\"\n [pinLabelKey]=\"i18n.pin\"\n [unpinLabelKey]=\"i18n.unpin\"\n [markAsReadLabelKey]=\"i18n.markAsRead\"\n (itemPress)=\"onItemPress($event)\"\n (markAsRead)=\"onDismissUnread($event)\"\n (togglePin)=\"onTogglePin($event)\"\n />\n </div>\n </ax-content>\n\n <ax-sliding-item-suffix (onClick)=\"slidingItemsHandler(item, 'mark-as-read')\" color=\"primary\">\n <ax-icon class=\"fa-light fa-envelopes-bulk fa-xl\"></ax-icon>\n </ax-sliding-item-suffix>\n\n <ax-sliding-item-suffix (onClick)=\"slidingItemsHandler(item, 'archive')\" color=\"default\">\n <ax-icon class=\"fa-light fa-box-archive fa-xl\"></ax-icon>\n </ax-sliding-item-suffix>\n\n <ax-sliding-item-suffix (onClick)=\"slidingItemsHandler(item, 'delete')\" color=\"danger\">\n <ax-icon class=\"fa-light fa-trash-can fa-xl\"></ax-icon>\n </ax-sliding-item-suffix>\n </ax-sliding-item>\n</ng-template>\n\n<ng-template #desktop let-item>\n <div\n class=\"axm-communication-in-app-inbox-page__row\"\n [class.--selected]=\"isSelected(item.id)\"\n (contextmenu)=\"openContextMenu($event, item)\"\n >\n @if (isEditing()) {\n <ax-check-box\n class=\"axm-communication-in-app-inbox-page__checkbox\"\n [value]=\"isSelected(item.id)\"\n (onValueChanged)=\"toggleSelectionWithModel(item.id, $event)\"\n >\n <ax-label></ax-label>\n </ax-check-box>\n }\n <axp-in-app-inbox-item\n class=\"flex-1 min-w-0\"\n [data]=\"item\"\n [highlightUnreadBackground]=\"highlightUnreadBackground()\"\n [showPin]=\"showPin()\"\n [pinLabelKey]=\"i18n.pin\"\n [unpinLabelKey]=\"i18n.unpin\"\n [markAsReadLabelKey]=\"i18n.markAsRead\"\n (itemPress)=\"onItemPress($event)\"\n (markAsRead)=\"onDismissUnread($event)\"\n (togglePin)=\"onTogglePin($event)\"\n />\n </div>\n</ng-template>\n\n<ax-context-menu\n #contextMenu\n [openOn]=\"'click'\"\n [closeOn]=\"'click'\"\n [orientation]=\"'horizontal'\"\n (onOpening)=\"handleContextMenuOpening($event)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n/>\n"],"names":["i9"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA;AA8BM,MAAO,uCAAwC,SAAQ,0BAA0B,CAAA;AA5BvF,IAAA,WAAA,GAAA;;AA+BmB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,6BAA6B,CAAC;AACjD,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,0BAA0B,CAAC;AAC/C,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACpC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAExC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB;AAC7C,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc;AACzC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU;AACrC,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW;AACxC,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK;AACjC,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU;oFAAC;QAEhE,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAwB,EAAE;8FAAC;QACrD,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAmB,EAAE;gGAAC;QAClD,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,CAAC;4FAAC;QAC7B,IAAA,CAAA,aAAa,GAAG,MAAM,CAAmB,EAAE;0FAAC;QAC1C,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,CAAC;sFAAC;AACrB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,uCAAuC,CAAC,iBAAiB;qFAAC;QACrF,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,KAAK;sFAAC;QACzB,IAAA,CAAA,WAAW,GAAG,SAAS,CAAyB,aAAa;wFAAC;QAC9D,IAAA,CAAA,WAAW,GAAG,MAAM,CAA2B,IAAI;wFAAC;AAE7C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAc,IAAI,GAAG,EAAU;wFAAC;QACrE,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI;0FAAC;QAEpC,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAC5C,OAAwB,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC;6FAC3E;AAEkB,QAAA,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CAAC,MACjD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC;iGAC1E;AAEQ,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MACnC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,KAAI;AACnC,YAAA,IAAI,MAAM,CAAC,KAAK,KAAK,YAAY,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE;AAC9E,gBAAA,OAAO,KAAK;YACd;AACA,YAAA,OAAO,MAAM,CAAC,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;AACnE,QAAA,CAAC,CAAC;6FACH;AAEgB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;YAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAC5C,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,4BAA4B,CACrE;YACD,OAAO,YAAY,EAAE,KAAK,IAAI,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;QAC3F,CAAC;uFAAC;AAEe,QAAA,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;YACpD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC;AAC7E,YAAA,OAAO,UAAU,EAAE,KAAK,KAAK,QAAQ;QACvC,CAAC;iGAAC;QAEiB,IAAA,CAAA,yBAAyB,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;sGAAC;AAib5F,IAAA;aAzeyB,IAAA,CAAA,iBAAiB,GAAG,EAAH,CAAM;AA0DtC,IAAA,MAAM,QAAQ,GAAA;QACrB,KAAK,CAAC,QAAQ,EAAE;AAChB,QAAA,MAAM,IAAI,CAAC,qBAAqB,EAAE;AAClC,QAAA,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AAClC,QAAA,MAAM,IAAI,CAAC,QAAQ,EAAE;AACrB,QAAA,MAAM,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE;IACzC;AAES,IAAA,MAAM,YAAY,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IAClE;AAES,IAAA,MAAM,kBAAkB,GAAA;AAC/B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;AACjC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;QAC/B,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAC5E;AACA,QAAA,IAAI,MAAM,GAAG,CAAC,EAAE;YACd,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;AAC3E,gBAAA,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;AAC1B,aAAA,CAAC;QACJ;QACA,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;IACtG;AAES,IAAA,MAAM,mBAAmB,GAAA;AAChC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE;AAC9B,YAAA,OAAO,EAAE;QACX;QAEA,OAAO;AACL,YAAA;AACE,gBAAA,KAAK,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AACnE,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;AACpC,gBAAA,KAAK,EAAE,QAAQ;AAChB,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACpE,gBAAA,IAAI,EAAE,yBAAyB;AAC/B,gBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;AACtC,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AACvE,gBAAA,IAAI,EAAE,4BAA4B;AAClC,gBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE;AAC1C,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA;SACF;IACH;AAES,IAAA,MAAM,qBAAqB,GAAA;AAClC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE;AAC5B,YAAA,OAAO,EAAE;QACX;QAEA,OAAO;AACL,YAAA;AACE,gBAAA,KAAK,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACpE,gBAAA,IAAI,EAAE,oBAAoB;AAC1B,gBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;AAC7B,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AAC1E,gBAAA,IAAI,EAAE,4BAA4B;AAClC,gBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;AAClC,gBAAA,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;AACnC,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;AACxE,gBAAA,IAAI,EAAE,iBAAiB;AACvB,gBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;AAC9B,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA;SACF;IACH;IAES,MAAM,OAAO,CAAC,OAA0B,EAAA;AAC/C,QAAA,QAAQ,OAAO,CAAC,IAAI;AAClB,YAAA,KAAK,SAAS;AACZ,gBAAA,MAAM,IAAI,CAAC,SAAS,EAAE;gBACtB,IAAI,CAAC,oBAAoB,EAAE;gBAC3B;AACF,YAAA,KAAK,iBAAiB;AACpB,gBAAA,MAAM,IAAI,CAAC,cAAc,EAAE;gBAC3B,IAAI,CAAC,oBAAoB,EAAE;gBAC3B;AACF,YAAA,KAAK,kBAAkB;AACrB,gBAAA,MAAM,IAAI,CAAC,eAAe,EAAE;gBAC5B,IAAI,CAAC,oBAAoB,EAAE;gBAC3B;AACF,YAAA,KAAK,uBAAuB;AAC1B,gBAAA,MAAM,IAAI,CAAC,kBAAkB,EAAE;gBAC/B,IAAI,CAAC,oBAAoB,EAAE;gBAC3B;AACF,YAAA,KAAK,eAAe;AAClB,gBAAA,MAAM,IAAI,CAAC,eAAe,EAAE;gBAC5B,IAAI,CAAC,oBAAoB,EAAE;gBAC3B;AACF,YAAA,KAAK,WAAW;AACd,gBAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;oBACpB,IAAI,CAAC,WAAW,EAAE;gBACpB;qBAAO;AACL,oBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC1B;gBACA,IAAI,CAAC,SAAS,EAAE;gBAChB;;IAEN;AAEU,IAAA,oBAAoB,CAAC,OAAyB,EAAA;AACtD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;AAC/B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AACrB,QAAA,KAAK,IAAI,CAAC,QAAQ,EAAE;IACtB;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;AAChC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AACrB,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;AAC7C,QAAA,KAAK,IAAI,CAAC,QAAQ,EAAE;IACtB;AAEU,IAAA,aAAa,CAAC,KAA8B,EAAA;AACpD,QAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;YAC5B;QACF;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;AACrD,QAAA,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE;YACpE;QACF;QAEA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC7B,QAAA,KAAK,IAAI,CAAC,QAAQ,EAAE;IACtB;IAEU,MAAM,WAAW,CAAC,EAAU,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC5B;QACF;AACA,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE;YAC5B;QACF;QACA,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;IACtC;IAEU,MAAM,WAAW,CAAC,EAAU,EAAA;QACpC,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;IACpC;IAEU,MAAM,eAAe,CAAC,EAAU,EAAA;QACxC,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,EAAE;IAClB;AAEU,IAAA,UAAU,CAAC,EAAU,EAAA;QAC7B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACnC;IAEU,wBAAwB,CAAC,EAAU,EAAE,KAAmC,EAAA;QAChF,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACxC,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACd;aAAO;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjB;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,SAAS,EAAE;IAClB;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE;YAC5B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QACjC;AACA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;QACA,IAAI,CAAC,SAAS,EAAE;IAClB;IAEU,mBAAmB,CAAC,IAAuB,EAAE,MAA6C,EAAA;QAClG,QAAQ,MAAM;AACZ,YAAA,KAAK,cAAc;AACjB,gBAAA,KAAK,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;gBAClC;AACF,YAAA,KAAK,QAAQ;AACX,gBAAA,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;gBAC9B;AACF,YAAA,KAAK,SAAS;AACZ,gBAAA,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;gBAC/B;;IAEN;IAEU,eAAe,CAAC,KAAiB,EAAE,IAAuB,EAAA;AAClE,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE;YAChD;QACF;QACA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IACpE;IAEU,MAAM,wBAAwB,CAAC,KAAgC,EAAA;AACvE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;AAC/B,QAAA,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,KAAK;QAExC,KAAK,CAAC,KAAK,GAAG;AACZ,YAAA;gBACE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK;gBAChC,IAAI,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC5F,IAAI,EAAE,QAAQ,GAAG,6BAA6B,GAAG,uBAAuB;AACzE,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,IAAI,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AACtE,gBAAA,IAAI,EAAE,4BAA4B;AAClC,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,IAAI,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AACnE,gBAAA,IAAI,EAAE,yBAAyB;AAChC,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,IAAI,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AAClE,gBAAA,IAAI,EAAE,uBAAuB;AAC7B,gBAAA,KAAK,EAAE,QAAQ;AAChB,aAAA;SACF;IACH;AAEU,IAAA,0BAA0B,CAAC,KAAmC,EAAA;AACtE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,IAAI,CAAC,IAAI,EAAE;YACT;QACF;AAEA,QAAA,QAAQ,KAAK,CAAC,IAAI,CAAC,IAAI;AACrB,YAAA,KAAK,cAAc;AACjB,gBAAA,KAAK,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;gBAClC;AACF,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,OAAO;gBACV,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B;AACF,YAAA,KAAK,SAAS;AACZ,gBAAA,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;gBAC/B;AACF,YAAA,KAAK,QAAQ;AACX,gBAAA,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;gBAC9B;;IAEN;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,YAAA,OAAO,8BAA8B;QACvC;AACA,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC/B,YAAA,OAAO,0BAA0B;QACnC;AACA,QAAA,OAAO,kBAAkB;IAC3B;IAEU,aAAa,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AAC3B,YAAA,OAAO,yDAAyD;QAClE;AACA,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC/B,YAAA,OAAO,4DAA4D;QACrE;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU;IAC7B;IAEU,mBAAmB,GAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AAC3B,YAAA,OAAO,+DAA+D;QACxE;AACA,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC/B,YAAA,OAAO,kEAAkE;QAC3E;AACA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB;IACnC;AAEQ,IAAA,MAAM,SAAS,GAAA;AACrB,QAAA,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;AAC9B,QAAA,MAAM,IAAI,CAAC,QAAQ,EAAE;IACvB;AAEQ,IAAA,MAAM,eAAe,GAAA;AAC3B,QAAA,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;IACtC;IAEQ,MAAM,kBAAkB,CAAC,IAAwB,EAAA;QACvD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC7D,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;YACpB;QACF;QACA,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,EAAE;IAClB;IAEQ,MAAM,cAAc,CAAC,IAAwB,EAAA;QACnD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC7D,QAAA,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;YACpB,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC;QACA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,EAAE;IAClB;IAEQ,MAAM,eAAe,CAAC,IAAwB,EAAA;QACpD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC7D,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;YACpB;QACF;QACA,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,EAAE;IAClB;AAEQ,IAAA,mBAAmB,CAAC,EAAU,EAAA;QACpC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AACxC,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAChB,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjB;aAAO;AACL,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACd;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,SAAS,EAAE;IAClB;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEQ,IAAA,MAAM,QAAQ,GAAA;QACpB,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC1G;AAEQ,IAAA,MAAM,qBAAqB,GAAA;QACjC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,CAAC,GAC7F,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACnD,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AACtD,YAAA,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,iEAAiE,CAAC;AACvG,YAAA,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,mEAAmE,CAAC;AACzG,YAAA,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,mEAAmE,CAAC;AACzG,YAAA,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,kEAAkE,CAAC;AACxG,YAAA,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,kEAAkE,CAAC;AACzG,SAAA,CAAC;AAEJ,QAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;AACzB,YAAA;AACE,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,KAAK,EAAE,uDAAuD;AAC9D,gBAAA,IAAI,EAAE,8BAA8B;AACpC,gBAAA,MAAM,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;gBACjC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;AAC7C,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,YAAY;AACnB,gBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;AAC3B,gBAAA,KAAK,EAAE,4DAA4D;AACnE,gBAAA,IAAI,EAAE,gCAAgC;AACtC,gBAAA,MAAM,EAAE;AACN,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,OAAO,EAAE;AACP,wBAAA,UAAU,EAAE;AACV,4BAAA,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;AAC9B,4BAAA,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE;AACrC,yBAAA;AACD,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,SAAS,EAAE,OAAO;AAClB,wBAAA,UAAU,EAAE,IAAI;AACjB,qBAAA;AACF,iBAAA;gBACD,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;AAC7C,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;AAC3B,gBAAA,KAAK,EAAE,yDAAyD;AAChE,gBAAA,IAAI,EAAE,kBAAkB;AACxB,gBAAA,MAAM,EAAE;AACN,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,OAAO,EAAE;AACP,wBAAA,UAAU,EAAE;AACV,4BAAA,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE;AACtC,4BAAA,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE;AACpC,4BAAA,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE;AACrC,yBAAA;AACD,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,SAAS,EAAE,OAAO;AAClB,wBAAA,UAAU,EAAE,IAAI;AACjB,qBAAA;AACF,iBAAA;gBACD,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;AAC7C,aAAA;AACD,YAAA;AACE,gBAAA,KAAK,EAAE,UAAU;AACjB,gBAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;AAC3B,gBAAA,KAAK,EAAE,yDAAyD;AAChE,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,MAAM,EAAE;AACN,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,OAAO,EAAE;AACP,wBAAA,UAAU,EAAE;AACV,4BAAA,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE;AAClC,4BAAA,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE;AACvC,yBAAA;AACD,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,SAAS,EAAE,OAAO;AAClB,wBAAA,UAAU,EAAE,IAAI;AACjB,qBAAA;AACF,iBAAA;gBACD,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE;AAC7C,aAAA;AACF,SAAA,CAAC;IACJ;8GAzeW,uCAAuC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uCAAuC,8MAvBvC,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,uCAAuC,EAAE,CAAC,6KC3CnG,0sNA8KA,EAAA,MAAA,EAAA,CAAA,+6GAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7HI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,+XACd,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,mBAAmB,8BACnB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,WAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,KAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,mBAAmB,sQACnB,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,WAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,sBAAsB,4DACtB,4BAA4B,EAAA,QAAA,EAAA,qfAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,wBAAwB,8JACxB,0BAA0B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,eAAA,EAAA,2BAAA,EAAA,mBAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,YAAA,EAAA,WAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAGjB,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBA5BnD,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qCAAqC,EAAA,eAAA,EAG9B,uBAAuB,CAAC,MAAM,aACpC,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAA,uCAAyC,EAAE,CAAC,EAAA,IAAA,EAC3F;AACJ,wBAAA,KAAK,EAAE,qCAAqC;AAC5C,wBAAA,2BAA2B,EAAE,eAAe;qBAC7C,EAAA,OAAA,EACQ;wBACP,YAAY;wBACZ,cAAc;wBACd,iBAAiB;wBACjB,gBAAgB;wBAChB,mBAAmB;wBACnB,gBAAgB;wBAChB,aAAa;wBACb,mBAAmB;wBACnB,iBAAiB;wBACjB,sBAAsB;wBACtB,sBAAsB;wBACtB,4BAA4B;wBAC5B,wBAAwB;wBACxB,wBAAwB;wBACxB,0BAA0B;AAC3B,qBAAA,EAAA,QAAA,EAAA,0sNAAA,EAAA,MAAA,EAAA,CAAA,+6GAAA,CAAA,EAAA;yEAwByD,aAAa,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;;;"}
1
+ {"version":3,"file":"acorex-platform-module-communication-management-client-communication-in-app-inbox-page.component-BjJjqWja.mjs","sources":["../../../../libs/modules/communication-management/client/src/lib/features/in-app/communication-in-app-inbox-page.component.ts","../../../../libs/modules/communication-management/client/src/lib/features/in-app/communication-in-app-inbox-page.component.html"],"sourcesContent":["import { AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXCheckBoxModule } from '@acorex/components/check-box';\nimport { AXDataPagerChangedEvent, AXDataPagerMode, AXDataPagerModule } from '@acorex/components/data-pager';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelModule } from '@acorex/components/label';\nimport {\n AXContextMenuComponent,\n AXContextMenuItemsClickEvent,\n AXContextMenuOpeningEvent,\n} from '@acorex/components/menu';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXSlidingItemModule } from '@acorex/components/sliding-item';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPDeviceService } from '@acorex-platform/framework-client/core';\nimport {\n AXPQueryFiltersComponent,\n AXPStateMessageComponent,\n AXPThemeLayoutBlockComponent,\n} from '@acorex-platform/framework-client/layout/components';\nimport {\n AXPPageLayoutBase,\n AXPPageLayoutBaseComponent,\n AXPPageLayoutComponent,\n} from '@acorex-platform/framework-client/layout/views';\nimport { AXPActionMenuItem, AXPExecuteCommand, AXPFilterDefinition, AXPFilterQuery, AXP_QUERY_QUICK_SEARCH_FIELD } from '@acorex-platform/framework-shared/core';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, OnInit, signal, viewChild } from '@angular/core';\nimport {\n AXPInAppInboxConnectorService,\n AXPInAppInboxItemComponent,\n AXP_IN_APP_INBOX_I18N,\n type AXPInAppInboxItem,\n} from './inbox';\nimport { AXPInAppInboxActionService } from './inbox/in-app-inbox-action.service';\n\n//#region ---- Communication in-app inbox page ----\n\n@Component({\n selector: 'axm-communication-in-app-inbox-page',\n templateUrl: './communication-in-app-inbox-page.component.html',\n styleUrls: ['./communication-in-app-inbox-page.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: AXPPageLayoutBase, useExisting: AXMCommunicationInAppInboxPageComponent }],\n host: {\n class: 'axm-communication-in-app-inbox-page',\n '(document:keydown.escape)': 'deselectAll()',\n },\n imports: [\n CommonModule,\n AXButtonModule,\n AXDecoratorModule,\n AXSkeletonModule,\n AXTranslationModule,\n AXCheckBoxModule,\n AXLabelModule,\n AXSlidingItemModule,\n AXDataPagerModule,\n AXContextMenuComponent,\n AXPPageLayoutComponent,\n AXPThemeLayoutBlockComponent,\n AXPStateMessageComponent,\n AXPQueryFiltersComponent,\n AXPInAppInboxItemComponent,\n ],\n})\nexport class AXMCommunicationInAppInboxPageComponent extends AXPPageLayoutBaseComponent implements OnInit {\n private static readonly DEFAULT_PAGE_SIZE = 10;\n\n private readonly connector = inject(AXPInAppInboxConnectorService);\n private readonly inboxActions = inject(AXPInAppInboxActionService);\n protected readonly i18n = inject(AXP_IN_APP_INBOX_I18N);\n protected readonly deviceService = inject(AXPDeviceService);\n\n protected readonly pageLoading = this.connector.pageLoadingState;\n protected readonly pageItems = this.connector.pagedInboxList;\n protected readonly pageTotal = this.connector.pagedTotal;\n protected readonly unreadCount = this.connector.unreadCount;\n protected readonly totalCount = this.connector.total;\n protected readonly showPin = computed(() => this.connector.capabilities.pinSupport);\n\n protected readonly filterDefinitions = signal<AXPFilterDefinition[]>([]);\n protected readonly panelInitialFilters = signal<AXPFilterQuery[]>([]);\n protected readonly queryFiltersKey = signal(0);\n private readonly activeFilters = signal<AXPFilterQuery[]>([]);\n protected readonly pageIndex = signal(0);\n protected readonly pageSize = signal(AXMCommunicationInAppInboxPageComponent.DEFAULT_PAGE_SIZE);\n protected isEditing = signal(false);\n protected contextMenu = viewChild<AXContextMenuComponent>('contextMenu');\n protected contextItem = signal<AXPInAppInboxItem | null>(null);\n\n private readonly selectedIds = signal<Set<string>>(new Set<string>());\n selectedCount = computed(() => this.selectedIds().size);\n\n protected readonly pagerDisplayMode = computed(\n (): AXDataPagerMode => (this.deviceService.isSmall() ? 'compact' : 'full'),\n );\n\n protected readonly skeletonPlaceholders = computed(() =>\n Array.from({ length: Math.max(this.pageSize(), 1) }, (_, index) => index),\n );\n\n readonly hasActiveFilters = computed(() =>\n this.activeFilters().some((filter) => {\n if (filter.field === 'readStatus' && (!filter.value || filter.value === 'all')) {\n return false;\n }\n return filter.value != null && String(filter.value).trim() !== '';\n }),\n );\n\n private readonly searchText = computed(() => {\n const searchFilter = this.activeFilters().find(\n (f) => f.field === 'all' || f.field === AXP_QUERY_QUICK_SEARCH_FIELD,\n );\n return searchFilter?.value != null ? String(searchFilter.value).trim().toLowerCase() : '';\n });\n\n private readonly isUnreadFilterActive = computed(() => {\n const readFilter = this.activeFilters().find((f) => f.field === 'readStatus');\n return readFilter?.value === 'unread';\n });\n\n protected readonly highlightUnreadBackground = computed(() => !this.isUnreadFilterActive());\n\n override async ngOnInit(): Promise<void> {\n super.ngOnInit();\n await this.loadFilterDefinitions();\n await this.connector.ensureReady();\n await this.loadPage();\n await this.connector.markUnseenAsSeen();\n }\n\n override async getPageTitle(): Promise<string> {\n return this.translateService.translateAsync(this.i18n.pageTitle);\n }\n\n override async getPageDescription(): Promise<string> {\n const unread = this.unreadCount();\n const total = this.totalCount();\n if (!total) {\n return this.translateService.translateAsync(this.i18n.pageDescriptionNone);\n }\n if (unread > 0) {\n return this.translateService.translateAsync(this.i18n.pageDescriptionUnread, {\n params: { unread, total },\n });\n }\n return this.translateService.translateAsync(this.i18n.pageDescriptionAllRead, { params: { total } });\n }\n\n override async getPrimaryMenuItems(): Promise<AXPActionMenuItem[]> {\n if (this.selectedCount() === 0) {\n return [];\n }\n\n return [\n {\n title: await this.translateService.translateAsync(this.i18n.delete),\n icon: 'fa-light fa-trash',\n command: { name: 'delete-selected' },\n color: 'danger',\n },\n {\n title: await this.translateService.translateAsync(this.i18n.archive),\n icon: 'fa-light fa-box-archive',\n command: { name: 'archive-selected' },\n },\n {\n title: await this.translateService.translateAsync(this.i18n.markAsRead),\n icon: 'fa-light fa-envelopes-bulk',\n command: { name: 'mark-selected-as-read' },\n color: 'primary',\n },\n ];\n }\n\n override async getSecondaryMenuItems(): Promise<AXPActionMenuItem[]> {\n if (this.selectedCount() > 0) {\n return [];\n }\n\n return [\n {\n title: await this.translateService.translateAsync(this.i18n.refresh),\n icon: 'fa-light fa-rotate',\n command: { name: 'refresh' },\n },\n {\n title: await this.translateService.translateAsync(this.i18n.markAllAsRead),\n icon: 'fa-light fa-envelopes-bulk',\n command: { name: 'mark-all-read' },\n disabled: this.unreadCount() === 0,\n },\n {\n title: await this.translateService.translateAsync(this.i18n.selectItems),\n icon: 'fa-light fa-pen',\n command: { name: 'edit-mode' },\n color: 'primary',\n },\n ];\n }\n\n override async execute(command: AXPExecuteCommand): Promise<void> {\n switch (command.name) {\n case 'refresh':\n await this.onRefresh();\n this.exitEditModeIfNeeded();\n break;\n case 'delete-selected':\n await this.deleteSelected();\n this.exitEditModeIfNeeded();\n break;\n case 'archive-selected':\n await this.archiveSelected();\n this.exitEditModeIfNeeded();\n break;\n case 'mark-selected-as-read':\n await this.markSelectedAsRead();\n this.exitEditModeIfNeeded();\n break;\n case 'mark-all-read':\n await this.onMarkAllAsRead();\n this.exitEditModeIfNeeded();\n break;\n case 'edit-mode':\n if (this.isEditing()) {\n this.deselectAll();\n } else {\n this.isEditing.set(true);\n }\n this.recompute();\n break;\n }\n }\n\n protected handleFiltersChanged(filters: AXPFilterQuery[]): void {\n this.activeFilters.set(filters);\n this.pageIndex.set(0);\n void this.loadPage();\n }\n\n protected clearFilters(): void {\n this.activeFilters.set([]);\n this.panelInitialFilters.set([]);\n this.pageIndex.set(0);\n this.queryFiltersKey.update((key) => key + 1);\n void this.loadPage();\n }\n\n protected onPageChanged(event: AXDataPagerChangedEvent): void {\n if (!event.isUserInteraction) {\n return;\n }\n\n const nextIndex = Math.floor(event.skip / event.take);\n if (nextIndex === this.pageIndex() && event.take === this.pageSize()) {\n return;\n }\n\n this.pageSize.set(event.take);\n this.pageIndex.set(nextIndex);\n void this.loadPage();\n }\n\n protected async onItemPress(id: string): Promise<void> {\n if (this.isEditing()) {\n this.toggleSelectionById(id);\n return;\n }\n if (this.selectedCount() > 0) {\n return;\n }\n await this.inboxActions.openItem(id);\n }\n\n protected async onTogglePin(id: string): Promise<void> {\n await this.connector.togglePin(id);\n }\n\n protected async onDismissUnread(id: string): Promise<void> {\n await this.connector.markAsRead([id]);\n this.recompute();\n }\n\n protected isSelected(id: string): boolean {\n return this.selectedIds().has(id);\n }\n\n protected toggleSelectionWithModel(id: string, event: AXValueChangedEvent<boolean>): void {\n const checked = Boolean(event.value);\n const next = new Set(this.selectedIds());\n if (checked) {\n next.add(id);\n } else {\n next.delete(id);\n }\n this.selectedIds.set(next);\n this.recompute();\n }\n\n protected deselectAll(): void {\n if (this.selectedCount() > 0) {\n this.selectedIds.set(new Set());\n }\n if (this.isEditing()) {\n this.isEditing.set(false);\n }\n this.recompute();\n }\n\n protected slidingItemsHandler(item: AXPInAppInboxItem, action: 'mark-as-read' | 'delete' | 'archive'): void {\n switch (action) {\n case 'mark-as-read':\n void this.markSelectedAsRead(item);\n break;\n case 'delete':\n void this.deleteSelected(item);\n break;\n case 'archive':\n void this.archiveSelected(item);\n break;\n }\n }\n\n protected openContextMenu(event: MouseEvent, item: AXPInAppInboxItem): void {\n if (this.isEditing() || this.selectedCount() > 0) {\n return;\n }\n event.preventDefault();\n this.contextItem.set(item);\n this.contextMenu()?.showAt({ x: event.clientX, y: event.clientY });\n }\n\n protected async handleContextMenuOpening(event: AXContextMenuOpeningEvent): Promise<void> {\n const item = this.contextItem();\n const isPinned = item?.isPinned ?? false;\n\n event.items = [\n {\n name: isPinned ? 'unpin' : 'pin',\n text: await this.translateService.translateAsync(isPinned ? this.i18n.unpin : this.i18n.pin),\n icon: isPinned ? 'fa-light fa-thumbtack-slash' : 'fa-light fa-thumbtack',\n },\n {\n name: 'mark-as-read',\n text: await this.translateService.translateAsync(this.i18n.markAsRead),\n icon: 'fa-light fa-envelopes-bulk',\n color: 'primary',\n },\n {\n name: 'archive',\n text: await this.translateService.translateAsync(this.i18n.archive),\n icon: 'fa-light fa-box-archive',\n },\n {\n name: 'delete',\n text: await this.translateService.translateAsync(this.i18n.delete),\n icon: 'fa-light fa-trash-can',\n color: 'danger',\n },\n ];\n }\n\n protected handleContextMenuItemClick(event: AXContextMenuItemsClickEvent): void {\n const item = this.contextItem();\n if (!item) {\n return;\n }\n\n switch (event.item.name) {\n case 'mark-as-read':\n void this.markSelectedAsRead(item);\n break;\n case 'pin':\n case 'unpin':\n void this.onTogglePin(item.id);\n break;\n case 'archive':\n void this.archiveSelected(item);\n break;\n case 'delete':\n void this.deleteSelected(item);\n break;\n }\n }\n\n protected getEmptyIcon(): string {\n if (this.searchText()) {\n return 'fa-solid fa-magnifying-glass';\n }\n if (this.isUnreadFilterActive()) {\n return 'fa-solid fa-check-circle';\n }\n return 'fa-solid fa-bell';\n }\n\n protected getEmptyTitle(): string {\n if (this.hasActiveFilters()) {\n return '@communication-management:in-app.state.no-results.title';\n }\n if (this.isUnreadFilterActive()) {\n return '@communication-management:in-app.state.all-caught-up.title';\n }\n return this.i18n.emptyTitle;\n }\n\n protected getEmptyDescription(): string {\n if (this.hasActiveFilters()) {\n return '@communication-management:in-app.state.no-results.description';\n }\n if (this.isUnreadFilterActive()) {\n return '@communication-management:in-app.state.all-caught-up.description';\n }\n return this.i18n.emptyDescription;\n }\n\n private async onRefresh(): Promise<void> {\n await this.connector.refresh();\n await this.loadPage();\n }\n\n private async onMarkAllAsRead(): Promise<void> {\n await this.connector.markAllAsRead();\n }\n\n private async markSelectedAsRead(item?: AXPInAppInboxItem): Promise<void> {\n const ids = item ? [item.id] : Array.from(this.selectedIds());\n if (ids.length === 0) {\n return;\n }\n await this.connector.markAsRead(ids);\n this.selectedIds.set(new Set());\n this.recompute();\n }\n\n private async deleteSelected(item?: AXPInAppInboxItem): Promise<void> {\n const ids = item ? [item.id] : Array.from(this.selectedIds());\n for (const id of ids) {\n await this.connector.deleteOne(id);\n }\n this.selectedIds.set(new Set());\n this.recompute();\n }\n\n private async archiveSelected(item?: AXPInAppInboxItem): Promise<void> {\n const ids = item ? [item.id] : Array.from(this.selectedIds());\n if (ids.length === 0) {\n return;\n }\n await this.connector.archive(ids);\n this.selectedIds.set(new Set());\n this.recompute();\n }\n\n private toggleSelectionById(id: string): void {\n const next = new Set(this.selectedIds());\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n this.selectedIds.set(next);\n this.recompute();\n }\n\n private exitEditModeIfNeeded(): void {\n if (this.isEditing()) {\n this.isEditing.set(false);\n }\n }\n\n private async loadPage(): Promise<void> {\n await this.connector.loadPage(this.activeFilters(), this.pageIndex() * this.pageSize(), this.pageSize());\n }\n\n private async loadFilterDefinitions(): Promise<void> {\n const [allLabel, unreadLabel, inboxLabel, archiveLabel, warningLabel, dangerLabel, noticeLabel] =\n await Promise.all([\n this.translateService.translateAsync(this.i18n.all),\n this.translateService.translateAsync(this.i18n.unread),\n this.translateService.translateAsync('@communication-management:in-app.filters.category.options.inbox'),\n this.translateService.translateAsync('@communication-management:in-app.filters.category.options.archive'),\n this.translateService.translateAsync('@communication-management:in-app.filters.priority.options.warning'),\n this.translateService.translateAsync('@communication-management:in-app.filters.priority.options.danger'),\n this.translateService.translateAsync('@communication-management:in-app.filters.priority.options.notice'),\n ]);\n\n this.filterDefinitions.set([\n {\n field: 'all',\n title: '@communication-management:in-app.filters.search.title',\n icon: 'fa-light fa-magnifying-glass',\n widget: { type: 'string-filter' },\n filterType: { inline: true, advance: false },\n },\n {\n field: 'readStatus',\n operator: { type: 'equal' },\n title: '@communication-management:in-app.filters.read-status.title',\n icon: 'fa-light fa-envelope-open-text',\n widget: {\n type: 'select-filter',\n options: {\n dataSource: [\n { id: 'all', title: allLabel },\n { id: 'unread', title: unreadLabel },\n ],\n valueField: 'id',\n textField: 'title',\n allowClear: true,\n },\n },\n filterType: { advance: true, inline: false },\n },\n {\n field: 'priority',\n operator: { type: 'equal' },\n title: '@communication-management:in-app.filters.priority.title',\n icon: 'fa-light fa-flag',\n widget: {\n type: 'select-filter',\n options: {\n dataSource: [\n { id: 'Warning', title: warningLabel },\n { id: 'Danger', title: dangerLabel },\n { id: 'Notice', title: noticeLabel },\n ],\n valueField: 'id',\n textField: 'title',\n allowClear: true,\n },\n },\n filterType: { advance: true, inline: false },\n },\n {\n field: 'category',\n operator: { type: 'equal' },\n title: '@communication-management:in-app.filters.category.title',\n icon: 'fa-light fa-inbox',\n widget: {\n type: 'select-filter',\n options: {\n dataSource: [\n { id: 'Inbox', title: inboxLabel },\n { id: 'Archive', title: archiveLabel },\n ],\n valueField: 'id',\n textField: 'title',\n allowClear: true,\n },\n },\n filterType: { advance: true, inline: false },\n },\n ]);\n }\n}\n\n//#endregion\n","<axp-page-layout>\n <axp-page-toolbar>\n <div class=\"w-full flex items-center\">\n <axp-layout-prefix class=\"w-full\">\n @if (selectedCount() > 0 || isEditing()) {\n <!-- ----- Bulk selection bar ----- -->\n <div class=\"axm-communication-in-app-inbox-page__selection-bar\">\n <span class=\"axm-communication-in-app-inbox-page__selection-count\">\n {{ selectedCount() }} {{ '@general:terms.items-selected' | translate | async }}\n </span>\n <button type=\"button\" class=\"axm-communication-in-app-inbox-page__unselect\" (click)=\"deselectAll()\">\n {{ '@general:actions.unselect.title' | translate | async }}\n </button>\n </div>\n } @else {\n @for (_k of [queryFiltersKey()]; track _k) {\n <axp-query-filters\n [filtersDefinitions]=\"filterDefinitions()\"\n [initialFilters]=\"panelInitialFilters()\"\n [quickSearch]=\"true\"\n (onFiltersChanged)=\"handleFiltersChanged($event)\"\n />\n }\n }\n </axp-layout-prefix>\n </div>\n </axp-page-toolbar>\n\n <axp-page-content class=\"axm-communication-in-app-inbox-page__content\">\n <div class=\"axm-communication-in-app-inbox-page__panel\">\n @if (pageLoading()) {\n <!-- ----- Loading skeleton list ----- -->\n <div class=\"axm-communication-in-app-inbox-page__list axm-communication-in-app-inbox-page__list--loading\">\n @for (_ of skeletonPlaceholders(); track $index) {\n <div class=\"axm-communication-in-app-inbox-page__skeleton\">\n <ax-skeleton [animated]=\"true\" class=\"axm-communication-in-app-inbox-page__skeleton-avatar\"></ax-skeleton>\n <div class=\"axm-communication-in-app-inbox-page__skeleton-body\">\n <ax-skeleton [animated]=\"true\" class=\"axm-communication-in-app-inbox-page__skeleton-line --wide\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"axm-communication-in-app-inbox-page__skeleton-line\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n } @else if (pageTotal() === 0) {\n <axp-state-message\n mode=\"empty\"\n [icon]=\"getEmptyIcon()\"\n [title]=\"getEmptyTitle()\"\n [description]=\"getEmptyDescription()\"\n >\n @if (hasActiveFilters()) {\n <ax-button\n slot=\"actions\"\n look=\"outline\"\n [text]=\"((i18n.clearFilters | translate | async) ?? '')\"\n (onClick)=\"clearFilters()\"\n />\n }\n </axp-state-message>\n } @else {\n <div class=\"axm-communication-in-app-inbox-page__list\">\n @for (item of pageItems(); track item.id) {\n @if (deviceService.isMobileDevice()) {\n <ng-container [ngTemplateOutlet]=\"mobile\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n } @else {\n <ng-container [ngTemplateOutlet]=\"desktop\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n }\n }\n </div>\n }\n </div>\n </axp-page-content>\n\n @if (!pageLoading() && pageTotal() > 0) {\n <!-- ----- Pagination pinned to page footer ----- -->\n <axp-page-footer\n class=\"axm-communication-in-app-inbox-page__footer\"\n [class.axm-communication-in-app-inbox-page__footer--compact]=\"deviceService.isSmall()\"\n >\n <ax-data-pager\n [displayMode]=\"pagerDisplayMode()\"\n [total]=\"pageTotal()\"\n [size]=\"pageSize()\"\n [value]=\"pageIndex() + 1\"\n (onChanged)=\"onPageChanged($event)\"\n />\n </axp-page-footer>\n }\n</axp-page-layout>\n\n<ng-template #mobile let-item>\n <ax-sliding-item class=\"axm-communication-in-app-inbox-page__sliding-item\">\n <ax-content class=\"p-0!\">\n <div\n class=\"axm-communication-in-app-inbox-page__row\"\n [class.--selected]=\"isSelected(item.id)\"\n (contextmenu)=\"openContextMenu($event, item)\"\n >\n @if (isEditing()) {\n <ax-check-box\n class=\"axm-communication-in-app-inbox-page__checkbox\"\n [value]=\"isSelected(item.id)\"\n (onValueChanged)=\"toggleSelectionWithModel(item.id, $event)\"\n >\n <ax-label></ax-label>\n </ax-check-box>\n }\n <axp-in-app-inbox-item\n class=\"flex-1 min-w-0\"\n [data]=\"item\"\n [highlightUnreadBackground]=\"highlightUnreadBackground()\"\n [showPin]=\"showPin()\"\n [pinLabelKey]=\"i18n.pin\"\n [unpinLabelKey]=\"i18n.unpin\"\n [markAsReadLabelKey]=\"i18n.markAsRead\"\n (itemPress)=\"onItemPress($event)\"\n (markAsRead)=\"onDismissUnread($event)\"\n (togglePin)=\"onTogglePin($event)\"\n />\n </div>\n </ax-content>\n\n <ax-sliding-item-suffix (onClick)=\"slidingItemsHandler(item, 'mark-as-read')\" color=\"primary\">\n <ax-icon class=\"fa-light fa-envelopes-bulk fa-xl\"></ax-icon>\n </ax-sliding-item-suffix>\n\n <ax-sliding-item-suffix (onClick)=\"slidingItemsHandler(item, 'archive')\" color=\"default\">\n <ax-icon class=\"fa-light fa-box-archive fa-xl\"></ax-icon>\n </ax-sliding-item-suffix>\n\n <ax-sliding-item-suffix (onClick)=\"slidingItemsHandler(item, 'delete')\" color=\"danger\">\n <ax-icon class=\"fa-light fa-trash-can fa-xl\"></ax-icon>\n </ax-sliding-item-suffix>\n </ax-sliding-item>\n</ng-template>\n\n<ng-template #desktop let-item>\n <div\n class=\"axm-communication-in-app-inbox-page__row\"\n [class.--selected]=\"isSelected(item.id)\"\n (contextmenu)=\"openContextMenu($event, item)\"\n >\n @if (isEditing()) {\n <ax-check-box\n class=\"axm-communication-in-app-inbox-page__checkbox\"\n [value]=\"isSelected(item.id)\"\n (onValueChanged)=\"toggleSelectionWithModel(item.id, $event)\"\n >\n <ax-label></ax-label>\n </ax-check-box>\n }\n <axp-in-app-inbox-item\n class=\"flex-1 min-w-0\"\n [data]=\"item\"\n [highlightUnreadBackground]=\"highlightUnreadBackground()\"\n [showPin]=\"showPin()\"\n [pinLabelKey]=\"i18n.pin\"\n [unpinLabelKey]=\"i18n.unpin\"\n [markAsReadLabelKey]=\"i18n.markAsRead\"\n (itemPress)=\"onItemPress($event)\"\n (markAsRead)=\"onDismissUnread($event)\"\n (togglePin)=\"onTogglePin($event)\"\n />\n </div>\n</ng-template>\n\n<ax-context-menu\n #contextMenu\n [openOn]=\"'click'\"\n [closeOn]=\"'click'\"\n [orientation]=\"'horizontal'\"\n (onOpening)=\"handleContextMenuOpening($event)\"\n (onItemClick)=\"handleContextMenuItemClick($event)\"\n/>\n"],"names":["i9"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { AXToastService } from '@acorex/components/toast';
2
2
  import * as i0 from '@angular/core';
3
3
  import { inject, Injectable } from '@angular/core';
4
- import { d as AXPCommunicationManagementClient, e as AXPInAppInboxRealtimeService } from './acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-09UhY2Rc.mjs';
4
+ import { d as AXPCommunicationManagementClient, e as AXPInAppInboxRealtimeService } from './acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-G4wzzccx.mjs';
5
5
 
6
6
  function parseMessage(raw) {
7
7
  if (raw == null || typeof raw !== 'object' || Array.isArray(raw)) {
@@ -41,6 +41,7 @@ function parseSendInput(raw) {
41
41
  definitionKey: typeof obj['definitionKey'] === 'string' ? obj['definitionKey'].trim() : undefined,
42
42
  correlationId: typeof obj['correlationId'] === 'string' ? obj['correlationId'].trim() : undefined,
43
43
  idempotencyKey: typeof obj['idempotencyKey'] === 'string' ? obj['idempotencyKey'].trim() : undefined,
44
+ bypassDebugRedirect: obj['bypassDebugRedirect'] === true,
44
45
  actions: Array.isArray(obj['actions'])
45
46
  ? obj['actions']
46
47
  : undefined,
@@ -82,4 +83,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
82
83
  }] });
83
84
 
84
85
  export { CommunicationSendCommand };
85
- //# sourceMappingURL=acorex-platform-module-communication-management-client-communication-send.command-D7_MmGQe.mjs.map
86
+ //# sourceMappingURL=acorex-platform-module-communication-management-client-communication-send.command-NEXrsogP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-communication-management-client-communication-send.command-NEXrsogP.mjs","sources":["../../../../libs/modules/communication-management/client/src/lib/commands/communication-send.command.ts"],"sourcesContent":["import { AXToastService } from '@acorex/components/toast';\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\nimport type {\n CommunicationMessage,\n CommunicationSendInput,\n CommunicationSendResult,\n} from '@acorex-platform/module-communication-management-client/contracts';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { inject, Injectable } from '@angular/core';\nimport { AXPCommunicationManagementClient } from '../communication-management-client.port';\nimport { AXPInAppInboxRealtimeService } from '../features/in-app/inbox/in-app-inbox-realtime.service';\n\nfunction parseMessage(raw: unknown): CommunicationMessage | null {\n if (raw == null || typeof raw !== 'object' || Array.isArray(raw)) {\n return null;\n }\n\n const message = raw as Record<string, unknown>;\n const subject = typeof message['subject'] === 'string' ? message['subject'].trim() : '';\n const body = typeof message['body'] === 'string' ? message['body'].trim() : '';\n if (!subject || !body) {\n return null;\n }\n\n return { subject, body };\n}\n\nfunction parseSendInput(\n raw: unknown,\n): { ok: true; value: CommunicationSendInput } | { ok: false; error: string } {\n const obj =\n raw != null && typeof raw === 'object' && !Array.isArray(raw) ? (raw as Record<string, unknown>) : null;\n if (!obj) {\n return { ok: false, error: 'Invalid arguments: expected an object.' };\n }\n\n const title = typeof obj['title'] === 'string' ? obj['title'].trim() : '';\n const message = parseMessage(obj['message']);\n const channel = typeof obj['channel'] === 'string' ? obj['channel'].trim() : '';\n\n if (!title || !message || !channel) {\n return {\n ok: false,\n error: 'Invalid arguments: \"title\", \"message\" (with subject and body), and \"channel\" are required.',\n };\n }\n\n return {\n ok: true,\n value: {\n title,\n message,\n channel,\n recipientUserId: typeof obj['recipientUserId'] === 'string' ? obj['recipientUserId'].trim() : undefined,\n recipientAddress: typeof obj['recipientAddress'] === 'string' ? obj['recipientAddress'].trim() : undefined,\n recipientName: typeof obj['recipientName'] === 'string' ? obj['recipientName'].trim() : undefined,\n definitionKey: typeof obj['definitionKey'] === 'string' ? obj['definitionKey'].trim() : undefined,\n correlationId: typeof obj['correlationId'] === 'string' ? obj['correlationId'].trim() : undefined,\n idempotencyKey: typeof obj['idempotencyKey'] === 'string' ? obj['idempotencyKey'].trim() : undefined,\n bypassDebugRedirect: obj['bypassDebugRedirect'] === true,\n actions: Array.isArray(obj['actions'])\n ? (obj['actions'] as CommunicationSendInput['actions'])\n : undefined,\n },\n };\n}\n\n@Injectable()\nexport class CommunicationSendCommand implements AXPCommand<CommunicationSendInput, CommunicationSendResult> {\n private readonly client = inject(AXPCommunicationManagementClient);\n private readonly toastService = inject(AXToastService);\n private readonly realtime = inject(AXPInAppInboxRealtimeService);\n\n async execute(input: CommunicationSendInput): AXPCommandExecuteResultPromise<CommunicationSendResult> {\n const parsed = parseSendInput(input);\n if (!parsed.ok) {\n return { success: false, message: { text: parsed.error } };\n }\n\n try {\n const data = await this.client.send(parsed.value);\n this.realtime.notifyChanged({ type: 'refresh' });\n this.toastService.show({\n color: 'success',\n title: 'Communication queued',\n content: `Communication ${data.communicationId} created with delivery ${data.deliveryId}.`,\n });\n return { success: true, kind: 'object', data };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Communication send failed.';\n this.toastService.show({ color: 'danger', title: 'Send failed', content: message });\n return { success: false, message: { text: message } };\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -48,9 +48,6 @@ class CommunicationShowSentMessageCommand {
48
48
  flex.mode('view').setDirection('column').setGap('16px').customWidget('text-block-layout', {
49
49
  content: resolved.body || '',
50
50
  });
51
- })
52
- .setActions((actions) => {
53
- actions.cancel('@general:actions.close.title');
54
51
  });
55
52
  })
56
53
  .show();
@@ -71,18 +68,29 @@ class CommunicationShowSentMessageCommand {
71
68
  !Array.isArray(raw.data)
72
69
  ? raw.data
73
70
  : null;
74
- // Prefer the Communications list row payload when it already includes the message.
75
- if (data && (data['message'] != null || data['title'] != null || data['subject'] != null)) {
71
+ const communicationId = this.resolveCommunicationId(raw, data);
72
+ if (communicationId) {
73
+ const communicationData = this.entityService
74
+ .withEntity(RootConfig.module.name, RootConfig.entities.communication.name)
75
+ .data();
76
+ const loaded = await communicationData.byKey(communicationId);
77
+ if (loaded) {
78
+ return loaded;
79
+ }
80
+ }
81
+ // List rows include title but not message.body — only reuse the row when a body is present.
82
+ if (data && this.hasPreviewableBody(data)) {
76
83
  return data;
77
84
  }
78
- const communicationId = this.resolveCommunicationId(raw, data);
79
- if (!communicationId) {
80
- return null;
85
+ return null;
86
+ }
87
+ hasPreviewableBody(data) {
88
+ const message = data['message'];
89
+ if (message != null && typeof message === 'object' && !Array.isArray(message)) {
90
+ const body = message['body'];
91
+ return typeof body === 'string' && body.trim().length > 0;
81
92
  }
82
- const communicationData = this.entityService
83
- .withEntity(RootConfig.module.name, RootConfig.entities.communication.name)
84
- .data();
85
- return (await communicationData.byKey(communicationId)) ?? null;
93
+ return typeof data['body'] === 'string' && data['body'].trim().length > 0;
86
94
  }
87
95
  resolveCommunicationId(raw, data) {
88
96
  const candidates = [
@@ -108,4 +116,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
108
116
  }] });
109
117
 
110
118
  export { CommunicationShowSentMessageCommand };
111
- //# sourceMappingURL=acorex-platform-module-communication-management-client-communication-show-sent-message.command-D8125Jxi.mjs.map
119
+ //# sourceMappingURL=acorex-platform-module-communication-management-client-communication-show-sent-message.command-D9KRxkdp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-communication-management-client-communication-show-sent-message.command-D9KRxkdp.mjs","sources":["../../../../libs/modules/communication-management/client/src/lib/commands/communication-show-sent-message.command.ts"],"sourcesContent":["//#region ----- Imports -----\n\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPLayoutBuilderService } from '@acorex-platform/framework-client/layout/builder';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport {\n resolveCommunicationMessage,\n RootConfig,\n type AXMCommunicationModel,\n} from '@acorex-platform/module-communication-management-client/contracts';\nimport { inject, Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ----- Types -----\n\ntype ShowSentMessageInput = {\n communicationId?: string;\n id?: string;\n data?: Record<string, unknown>;\n options?: { communicationId?: string };\n};\n\n//#endregion\n\n//#region ----- Command -----\n\n/** Opens a read-only dialog previewing the communication body from a Communications list row. */\n@Injectable({ providedIn: 'root' })\nexport class CommunicationShowSentMessageCommand implements AXPCommand {\n //#region ----- Services & Dependencies -----\n\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly entityService = inject(AXPEntityService);\n private readonly translationService = inject(AXTranslationService);\n private readonly toastService = inject(AXToastService);\n\n //#endregion\n\n //#region ----- Command -----\n\n async execute(input: ShowSentMessageInput | unknown): AXPCommandExecuteResultPromise<void> {\n const communication = await this.resolveCommunication(input);\n if (!communication) {\n const message = await this.translationService.translateAsync(\n '@communication-management:entities.communication.actions.preview.messages.not-found',\n );\n this.toastService.show({\n color: 'warning',\n title: await this.translationService.translateAsync(\n '@communication-management:entities.communication.actions.preview.messages.error-title',\n ),\n content: message,\n closeButton: true,\n timeOut: 5000,\n });\n return { success: false, message: { text: message } };\n }\n\n const resolved = resolveCommunicationMessage(communication as unknown as Record<string, unknown>);\n const title =\n (typeof communication.title === 'string' && communication.title.trim()) ||\n resolved.subject ||\n (await this.translationService.translateAsync(\n '@communication-management:entities.communication.actions.preview.dialog.title',\n ));\n\n await this.layoutBuilder\n .create()\n .dialog((dialog) => {\n dialog\n .setTitle(title)\n .setSize('lg')\n .setCloseButton(true)\n .content((flex) => {\n flex.mode('view').setDirection('column').setGap('16px').customWidget('text-block-layout', {\n content: resolved.body || '',\n });\n });\n })\n .show();\n\n // Read-only preview: Close / X must not reload the Communications list.\n return {\n success: true,\n kind: 'object',\n data: undefined,\n metadata: { refresh: false },\n };\n }\n\n //#endregion\n\n //#region ----- Helpers -----\n\n private async resolveCommunication(input: unknown): Promise<AXMCommunicationModel | null> {\n const raw = (input ?? {}) as ShowSentMessageInput;\n const data =\n raw.data != null &&\n typeof raw.data === 'object' &&\n !Array.isArray(raw.data)\n ? (raw.data as Record<string, unknown>)\n : null;\n\n const communicationId = this.resolveCommunicationId(raw, data);\n if (communicationId) {\n const communicationData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.communication.name)\n .data<string, AXMCommunicationModel>();\n const loaded = await communicationData.byKey(communicationId);\n if (loaded) {\n return loaded;\n }\n }\n\n // List rows include title but not message.body — only reuse the row when a body is present.\n if (data && this.hasPreviewableBody(data)) {\n return data as unknown as AXMCommunicationModel;\n }\n\n return null;\n }\n\n private hasPreviewableBody(data: Record<string, unknown>): boolean {\n const message = data['message'];\n if (message != null && typeof message === 'object' && !Array.isArray(message)) {\n const body = (message as Record<string, unknown>)['body'];\n return typeof body === 'string' && body.trim().length > 0;\n }\n return typeof data['body'] === 'string' && data['body'].trim().length > 0;\n }\n\n private resolveCommunicationId(\n raw: ShowSentMessageInput,\n data: Record<string, unknown> | null,\n ): string {\n const candidates = [\n raw.options?.communicationId,\n raw.communicationId,\n raw.id,\n data?.['id'],\n data?.['communicationId'],\n ];\n\n for (const candidate of candidates) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n\n return '';\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import { AXPSettingsService } from '@acorex-platform/framework-client/common';
7
7
  import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';
8
8
  import { AXPLayoutBuilderService, resolveLayoutBuilderDialogResult } from '@acorex-platform/framework-client/layout/builder';
9
9
  import { AXPOrganizationManagementSettings } from '@acorex-platform/module-organization-management-client/contracts';
10
- import { d as AXPCommunicationManagementClient } from './acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-09UhY2Rc.mjs';
10
+ import { d as AXPCommunicationManagementClient } from './acorex-platform-module-communication-management-client-acorex-platform-module-communication-management-client-G4wzzccx.mjs';
11
11
 
12
12
  //#endregion
13
13
  //#region ----- SMTP test dialog -----
@@ -152,4 +152,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
152
152
  }] });
153
153
 
154
154
  export { CommunicationTestSmtpCommand };
155
- //# sourceMappingURL=acorex-platform-module-communication-management-client-communication-test-smtp.command-BySmN1Lz.mjs.map
155
+ //# sourceMappingURL=acorex-platform-module-communication-management-client-communication-test-smtp.command-Cp5fHOh4.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-communication-management-client-communication-test-smtp.command-BySmN1Lz.mjs","sources":["../../../../libs/modules/communication-management/client/src/lib/features/smtp/communication-smtp-test-dialog.service.ts","../../../../libs/modules/communication-management/client/src/lib/commands/communication-test-smtp.command.ts"],"sourcesContent":["import { AXTranslationService } from '@acorex/core/translation';\nimport { AXPSessionService, type AXPUser } from '@acorex-platform/framework-client/auth';\nimport { AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport { AXPRuntimeCommandResult, AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport {\n AXPLayoutBuilderService,\n resolveLayoutBuilderDialogResult,\n type AXPDialogRef,\n} from '@acorex-platform/framework-client/layout/builder';\nimport { Injectable, inject } from '@angular/core';\nimport type { CommunicationSmtpTestResult } from '@acorex-platform/module-communication-management-client/contracts';\nimport { AXPOrganizationManagementSettings } from '@acorex-platform/module-organization-management-client/contracts';\nimport { AXPCommunicationManagementClient } from '../../communication-management-client.port';\n\n//#region ----- Types -----\n\ntype SmtpTestDialogResult = AXPRuntimeCommandResult<CommunicationSmtpTestResult> | null;\n\n//#endregion\n\n//#region ----- SMTP test dialog -----\n\nfunction coerceEmailSettingValue(value: unknown): string {\n if (typeof value === 'string' && value.includes('@')) {\n return value.trim();\n }\n\n if (value != null && typeof value === 'object' && 'value' in value) {\n const nested = (value as { value?: unknown }).value;\n if (typeof nested === 'string' && nested.includes('@')) {\n return nested.trim();\n }\n }\n\n return '';\n}\n\nfunction resolveUserRecipientEmail(user: AXPUser | null): string {\n if (!user) {\n return '';\n }\n\n const runtimeEmail = (user as { email?: unknown }).email;\n const fromRuntime = coerceEmailSettingValue(runtimeEmail);\n if (fromRuntime) {\n return fromRuntime;\n }\n\n const candidates = [user.name, user.title];\n for (const candidate of candidates) {\n const email = coerceEmailSettingValue(candidate);\n if (email) {\n return email;\n }\n }\n\n return '';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXMCommunicationSmtpTestDialogService {\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly translationService = inject(AXTranslationService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly settingsService = inject(AXPSettingsService);\n private readonly client = inject(AXPCommunicationManagementClient);\n\n private async resolveDefaultRecipientEmail(): Promise<string> {\n const fromUser = resolveUserRecipientEmail(this.sessionService.user);\n if (fromUser) {\n return fromUser;\n }\n\n const supportEmail = await this.settingsService\n .scope(AXPPlatformScope.Tenant)\n .get(AXPOrganizationManagementSettings.SupportEmail);\n\n return coerceEmailSettingValue(supportEmail);\n }\n\n async openAndSendTestEmail(): Promise<SmtpTestDialogResult> {\n const defaultRecipient = await this.resolveDefaultRecipientEmail();\n\n try {\n const result = await this.layoutBuilder\n .create()\n .dialog<SmtpTestDialogResult>((dialog) => {\n dialog\n .setTitle('@communication-management:settings.communication.smtp.test.dialog.title')\n .setSize('sm')\n .setCloseButton(true)\n .setContext({\n recipientAddress: defaultRecipient,\n })\n .content((flex) => {\n flex\n .setDirection('column')\n .setGap('16px')\n .formField('@communication-management:settings.communication.smtp.test.dialog.fields.recipient.title', (field) => {\n field.path('recipientAddress');\n field.textBox({\n validations: [{ rule: 'required' }, { rule: 'email' }],\n placeholder:\n '@communication-management:settings.communication.smtp.test.dialog.fields.recipient.placeholder',\n });\n });\n })\n .setActions((actions) => {\n actions\n .cancel('@general:actions.cancel.title')\n .submit('@communication-management:settings.communication.smtp.test.dialog.actions.send');\n })\n .onAction(async (dialogRef: AXPDialogRef) => {\n if (dialogRef.action() === 'cancel') {\n return null;\n }\n\n const context = dialogRef.context() as Record<string, unknown> | null;\n const recipientAddress = String(context?.['recipientAddress'] ?? '').trim();\n if (!recipientAddress) {\n throw new Error(\n await this.translationService.translateAsync(\n '@communication-management:settings.communication.smtp.test.messages.recipient-required',\n ),\n );\n }\n\n const data = await this.client.testSmtp({ recipientAddress });\n return { success: true, kind: 'object', data };\n });\n })\n .show();\n\n return resolveLayoutBuilderDialogResult<AXPRuntimeCommandResult<CommunicationSmtpTestResult>>(result);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'SMTP test failed.';\n return {\n success: false,\n message: { text: message },\n };\n }\n }\n}\n\n//#endregion\n","import { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport type { AXPCommand, AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport type { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\nimport type { CommunicationSmtpTestResult } from '@acorex-platform/module-communication-management-client/contracts';\nimport { Injectable, inject } from '@angular/core';\nimport { AXMCommunicationSmtpTestDialogService } from '../features/smtp/communication-smtp-test-dialog.service';\n\n//#region ----- Communication SMTP test command -----\n\n@Injectable()\nexport class CommunicationTestSmtpCommand implements AXPCommand<void, CommunicationSmtpTestResult | null> {\n private readonly dialog = inject(AXMCommunicationSmtpTestDialogService);\n private readonly toastService = inject(AXToastService);\n private readonly translationService = inject(AXTranslationService);\n\n async execute(): AXPCommandExecuteResultPromise<CommunicationSmtpTestResult | null> {\n const result = await this.dialog.openAndSendTestEmail();\n\n // Cancel / header close — not a failure for the integrations panel.\n if (!result) {\n return { success: true, kind: 'object', data: null };\n }\n\n if (result.success) {\n this.toastService.success(\n await this.translationService.translateAsync(\n '@communication-management:settings.communication.smtp.test.messages.success',\n ),\n );\n return result;\n }\n\n if (result.message?.text) {\n const content = await this.translationService.translateAsync(result.message.text);\n this.toastService.show({ color: 'danger', title: 'Test failed', content });\n }\n\n return result;\n }\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-module-communication-management-client-communication-test-smtp.command-Cp5fHOh4.mjs","sources":["../../../../libs/modules/communication-management/client/src/lib/features/smtp/communication-smtp-test-dialog.service.ts","../../../../libs/modules/communication-management/client/src/lib/commands/communication-test-smtp.command.ts"],"sourcesContent":["import { AXTranslationService } from '@acorex/core/translation';\nimport { AXPSessionService, type AXPUser } from '@acorex-platform/framework-client/auth';\nimport { AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport { AXPRuntimeCommandResult, AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport {\n AXPLayoutBuilderService,\n resolveLayoutBuilderDialogResult,\n type AXPDialogRef,\n} from '@acorex-platform/framework-client/layout/builder';\nimport { Injectable, inject } from '@angular/core';\nimport type { CommunicationSmtpTestResult } from '@acorex-platform/module-communication-management-client/contracts';\nimport { AXPOrganizationManagementSettings } from '@acorex-platform/module-organization-management-client/contracts';\nimport { AXPCommunicationManagementClient } from '../../communication-management-client.port';\n\n//#region ----- Types -----\n\ntype SmtpTestDialogResult = AXPRuntimeCommandResult<CommunicationSmtpTestResult> | null;\n\n//#endregion\n\n//#region ----- SMTP test dialog -----\n\nfunction coerceEmailSettingValue(value: unknown): string {\n if (typeof value === 'string' && value.includes('@')) {\n return value.trim();\n }\n\n if (value != null && typeof value === 'object' && 'value' in value) {\n const nested = (value as { value?: unknown }).value;\n if (typeof nested === 'string' && nested.includes('@')) {\n return nested.trim();\n }\n }\n\n return '';\n}\n\nfunction resolveUserRecipientEmail(user: AXPUser | null): string {\n if (!user) {\n return '';\n }\n\n const runtimeEmail = (user as { email?: unknown }).email;\n const fromRuntime = coerceEmailSettingValue(runtimeEmail);\n if (fromRuntime) {\n return fromRuntime;\n }\n\n const candidates = [user.name, user.title];\n for (const candidate of candidates) {\n const email = coerceEmailSettingValue(candidate);\n if (email) {\n return email;\n }\n }\n\n return '';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AXMCommunicationSmtpTestDialogService {\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly translationService = inject(AXTranslationService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly settingsService = inject(AXPSettingsService);\n private readonly client = inject(AXPCommunicationManagementClient);\n\n private async resolveDefaultRecipientEmail(): Promise<string> {\n const fromUser = resolveUserRecipientEmail(this.sessionService.user);\n if (fromUser) {\n return fromUser;\n }\n\n const supportEmail = await this.settingsService\n .scope(AXPPlatformScope.Tenant)\n .get(AXPOrganizationManagementSettings.SupportEmail);\n\n return coerceEmailSettingValue(supportEmail);\n }\n\n async openAndSendTestEmail(): Promise<SmtpTestDialogResult> {\n const defaultRecipient = await this.resolveDefaultRecipientEmail();\n\n try {\n const result = await this.layoutBuilder\n .create()\n .dialog<SmtpTestDialogResult>((dialog) => {\n dialog\n .setTitle('@communication-management:settings.communication.smtp.test.dialog.title')\n .setSize('sm')\n .setCloseButton(true)\n .setContext({\n recipientAddress: defaultRecipient,\n })\n .content((flex) => {\n flex\n .setDirection('column')\n .setGap('16px')\n .formField('@communication-management:settings.communication.smtp.test.dialog.fields.recipient.title', (field) => {\n field.path('recipientAddress');\n field.textBox({\n validations: [{ rule: 'required' }, { rule: 'email' }],\n placeholder:\n '@communication-management:settings.communication.smtp.test.dialog.fields.recipient.placeholder',\n });\n });\n })\n .setActions((actions) => {\n actions\n .cancel('@general:actions.cancel.title')\n .submit('@communication-management:settings.communication.smtp.test.dialog.actions.send');\n })\n .onAction(async (dialogRef: AXPDialogRef) => {\n if (dialogRef.action() === 'cancel') {\n return null;\n }\n\n const context = dialogRef.context() as Record<string, unknown> | null;\n const recipientAddress = String(context?.['recipientAddress'] ?? '').trim();\n if (!recipientAddress) {\n throw new Error(\n await this.translationService.translateAsync(\n '@communication-management:settings.communication.smtp.test.messages.recipient-required',\n ),\n );\n }\n\n const data = await this.client.testSmtp({ recipientAddress });\n return { success: true, kind: 'object', data };\n });\n })\n .show();\n\n return resolveLayoutBuilderDialogResult<AXPRuntimeCommandResult<CommunicationSmtpTestResult>>(result);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'SMTP test failed.';\n return {\n success: false,\n message: { text: message },\n };\n }\n }\n}\n\n//#endregion\n","import { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport type { AXPCommand, AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport type { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\nimport type { CommunicationSmtpTestResult } from '@acorex-platform/module-communication-management-client/contracts';\nimport { Injectable, inject } from '@angular/core';\nimport { AXMCommunicationSmtpTestDialogService } from '../features/smtp/communication-smtp-test-dialog.service';\n\n//#region ----- Communication SMTP test command -----\n\n@Injectable()\nexport class CommunicationTestSmtpCommand implements AXPCommand<void, CommunicationSmtpTestResult | null> {\n private readonly dialog = inject(AXMCommunicationSmtpTestDialogService);\n private readonly toastService = inject(AXToastService);\n private readonly translationService = inject(AXTranslationService);\n\n async execute(): AXPCommandExecuteResultPromise<CommunicationSmtpTestResult | null> {\n const result = await this.dialog.openAndSendTestEmail();\n\n // Cancel / header close — not a failure for the integrations panel.\n if (!result) {\n return { success: true, kind: 'object', data: null };\n }\n\n if (result.success) {\n this.toastService.success(\n await this.translationService.translateAsync(\n '@communication-management:settings.communication.smtp.test.messages.success',\n ),\n );\n return result;\n }\n\n if (result.message?.text) {\n const content = await this.translationService.translateAsync(result.message.text);\n this.toastService.show({ color: 'danger', title: 'Test failed', content });\n }\n\n return result;\n }\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}