@masterteam/system-settings 0.0.20 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/i18n/ar.json +3 -2
- package/assets/i18n/en.json +2 -1
- package/assets/system-settings.css +1 -1
- package/fesm2022/{masterteam-system-settings-email-delivery-shell-CBPKuYXr.mjs → masterteam-system-settings-email-delivery-shell-CR2wsIif.mjs} +13 -11
- package/fesm2022/masterteam-system-settings-email-delivery-shell-CR2wsIif.mjs.map +1 -0
- package/fesm2022/{masterteam-system-settings-masterteam-system-settings-DbsjQ7c7.mjs → masterteam-system-settings-masterteam-system-settings-DBy-LQB0.mjs} +25 -7
- package/fesm2022/masterteam-system-settings-masterteam-system-settings-DBy-LQB0.mjs.map +1 -0
- package/fesm2022/masterteam-system-settings.mjs +1 -1
- package/package.json +3 -3
- package/types/masterteam-system-settings.d.ts +7 -0
- package/fesm2022/masterteam-system-settings-email-delivery-shell-CBPKuYXr.mjs.map +0 -1
- package/fesm2022/masterteam-system-settings-masterteam-system-settings-DbsjQ7c7.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-system-settings-email-delivery-shell-CBPKuYXr.mjs","sources":["../../../../packages/masterteam/system-settings/src/lib/email-delivery/dialogs/operator-reason/email-operator-reason-dialog.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/dialogs/operator-reason/email-operator-reason-dialog.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/dialogs/attempt-details/email-attempt-details.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/dialogs/attempt-details/email-attempt-details.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-delivery.ui.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/attempts/email-delivery-attempts.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/attempts/email-delivery-attempts.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/host-evidence/email-delivery-host-evidence.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/host-evidence/email-delivery-host-evidence.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/quarantine/email-delivery-quarantine.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/quarantine/email-delivery-quarantine.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/activity/email-delivery-activity.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/activity/email-delivery-activity.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/dialogs/controlled-test/email-controlled-test-dialog.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/dialogs/controlled-test/email-controlled-test-dialog.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-delivery-descriptor.utils.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/connection-editor/email-connection-editor.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/connection-editor/email-connection-editor.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/connection-details/email-connection-details.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/connection-details/email-connection-details.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/connections/email-delivery-connections.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/pages/connections/email-delivery-connections.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/shell/email-delivery-shell.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/shell/email-delivery-shell.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { TextareaField } from '@masterteam/components/textarea-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { inject } from '@angular/core';\r\n\r\nexport interface EmailOperatorDecision {\r\n reason: string;\r\n exceptionalOverride: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-email-operator-reason-dialog',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n Button,\r\n TextareaField,\r\n ToggleField,\r\n ],\r\n templateUrl: './email-operator-reason-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailOperatorReasonDialog {\r\n readonly itemName = input.required<string>();\r\n readonly consequence = input.required<string>();\r\n readonly showExceptionalOverride = input(false);\r\n readonly confirmLabel = input<string | null>(null);\r\n\r\n private readonly ref = inject(ModalRef);\r\n protected readonly modal = inject(ModalService);\r\n protected readonly reason = new FormControl('', {\r\n nonNullable: true,\r\n validators: [Validators.required, Validators.maxLength(500)],\r\n });\r\n protected readonly exceptionalOverride = new FormControl(false, {\r\n nonNullable: true,\r\n });\r\n\r\n protected cancel(): void {\r\n this.ref.close();\r\n }\r\n\r\n protected confirm(): void {\r\n this.reason.markAsTouched();\r\n this.exceptionalOverride.markAsTouched();\r\n if (!this.canConfirm()) return;\r\n this.ref.close({\r\n reason: this.reason.getRawValue().trim(),\r\n exceptionalOverride: this.exceptionalOverride.getRawValue(),\r\n } satisfies EmailOperatorDecision);\r\n }\r\n\r\n protected canConfirm(): boolean {\r\n return (\r\n this.reason.valid &&\r\n (!this.showExceptionalOverride() ||\r\n this.exceptionalOverride.getRawValue())\r\n );\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery'\">\r\n <form\r\n [class]=\"'space-y-5 p-4 sm:p-5 ' + modal.contentClass\"\r\n (ngSubmit)=\"confirm()\"\r\n >\r\n <div\r\n class=\"rounded-md border border-amber-200 bg-amber-50 p-4 text-sm text-amber-950\"\r\n role=\"note\"\r\n >\r\n <p class=\"m-0 break-words font-semibold\">{{ itemName() }}</p>\r\n <p class=\"mb-0 mt-1\">{{ consequence() }}</p>\r\n </div>\r\n\r\n <mt-textarea-field\r\n [formControl]=\"reason\"\r\n [label]=\"t('operator-reason')\"\r\n [hint]=\"t('operator-reason-hint')\"\r\n [required]=\"true\"\r\n [maxLength]=\"500\"\r\n rows=\"4\"\r\n />\r\n\r\n @if (showExceptionalOverride()) {\r\n <div class=\"flex flex-col gap-1\">\r\n <mt-toggle-field\r\n [formControl]=\"exceptionalOverride\"\r\n [label]=\"t('exceptional-override')\"\r\n />\r\n <!-- mt-toggle-field has no hint input, so the consequence of an\r\n exceptional replay is rendered here instead of silently dropped. -->\r\n <p class=\"m-0 text-xs text-muted-color\">\r\n {{ t(\"exceptional-override-hint\") }}\r\n </p>\r\n </div>\r\n }\r\n </form>\r\n\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n type=\"button\"\r\n [label]=\"t('cancel')\"\r\n variant=\"outlined\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"cancel()\"\r\n />\r\n <mt-button\r\n type=\"button\"\r\n severity=\"warn\"\r\n [label]=\"confirmLabel() || t('confirm-action')\"\r\n [disabled]=\"!canConfirm()\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"confirm()\"\r\n />\r\n </div>\r\n</ng-container>\r\n","import { DatePipe } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { take } from 'rxjs';\r\nimport { EmailDeliveryStatus } from '../../components/email-delivery-status/email-delivery-status';\r\nimport {\r\n EmailOperatorReasonDialog,\r\n type EmailOperatorDecision,\r\n} from '../operator-reason/email-operator-reason-dialog';\r\nimport { EmailDeliveryFacade } from '../../email-delivery.facade';\r\nimport {\r\n isConnectionTestAttempt,\r\n type EmailDeliveryAttempt,\r\n} from '../../email-delivery.model';\r\n\r\n@Component({\r\n selector: 'mt-email-attempt-details',\r\n imports: [DatePipe, TranslocoDirective, Button, EmailDeliveryStatus],\r\n templateUrl: './email-attempt-details.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailAttemptDetails {\r\n readonly attempt = input.required<EmailDeliveryAttempt>();\r\n\r\n private readonly ref = inject(ModalRef);\r\n private readonly transloco = inject(TranslocoService);\r\n protected readonly modal = inject(ModalService);\r\n protected readonly facade = inject(EmailDeliveryFacade);\r\n\r\n protected isConnectionTest(): boolean {\r\n return isConnectionTestAttempt(this.attempt());\r\n }\r\n\r\n /**\r\n * A controlled test is an operator action against one connection, not product\r\n * work the platform owes anyone — replaying it would send a second real email\r\n * nobody asked for, so the backend's test rows are never replayable.\r\n */\r\n protected canReplay(): boolean {\r\n if (this.isConnectionTest()) return false;\r\n return [\r\n 'Blocked',\r\n 'RetryScheduled',\r\n 'Accepted',\r\n 'FailedPermanent',\r\n 'DeadLettered',\r\n 'OutcomeUnknown',\r\n ].includes(this.attempt().status);\r\n }\r\n\r\n protected providerLabel(providerKey: string | null | undefined): string {\r\n return (\r\n this.facade.providerByKey(providerKey)?.displayName ?? providerKey ?? '—'\r\n );\r\n }\r\n\r\n protected replay(): void {\r\n const attempt = this.attempt();\r\n const dialog = this.modal.openModal(EmailOperatorReasonDialog, 'dialog', {\r\n header: this.t('replay-attempt'),\r\n styleClass: '!w-[36rem] max-w-[96vw]',\r\n dismissible: true,\r\n inputValues: {\r\n itemName: attempt.id,\r\n consequence: isExceptionalReplay(attempt.status)\r\n ? this.t('replay-exceptional-warning')\r\n : this.t('replay-warning'),\r\n showExceptionalOverride: isExceptionalReplay(attempt.status),\r\n confirmLabel: this.t('replay-attempt'),\r\n },\r\n });\r\n dialog.onClose\r\n .pipe(take(1))\r\n .subscribe((decision: EmailOperatorDecision) => {\r\n if (!decision) return;\r\n this.facade\r\n .replayAttempt(attempt, {\r\n concurrencyToken: attempt.concurrencyToken,\r\n exceptionalOverride: decision.exceptionalOverride,\r\n reason: decision.reason,\r\n })\r\n .subscribe({\r\n next: (result) => this.ref.close(result.attempt),\r\n error: (error) => this.facade.showError(error),\r\n });\r\n });\r\n }\r\n\r\n protected close(): void {\r\n this.ref.close();\r\n }\r\n\r\n private t(key: string): string {\r\n return this.transloco.translate(`email-delivery.${key}`);\r\n }\r\n}\r\n\r\nfunction isExceptionalReplay(status: string): boolean {\r\n return status === 'Accepted' || status === 'OutcomeUnknown';\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery'\">\r\n @if (attempt(); as item) {\r\n <div [class]=\"'min-h-0 overflow-y-auto p-4 sm:p-5 ' + modal.contentClass\">\r\n <div class=\"grid w-full gap-5\">\r\n <div\r\n class=\"rounded-md border px-4 py-3 text-sm\"\r\n [class.border-amber-200]=\"item.status === 'OutcomeUnknown'\"\r\n [class.bg-amber-50]=\"item.status === 'OutcomeUnknown'\"\r\n [class.border-blue-200]=\"item.status !== 'OutcomeUnknown'\"\r\n [class.bg-blue-50]=\"item.status !== 'OutcomeUnknown'\"\r\n role=\"status\"\r\n >\r\n @if (item.status === \"OutcomeUnknown\") {\r\n {{ t(\"outcome-unknown-copy\") }}\r\n } @else if (item.outcome === \"Accepted\") {\r\n {{ t(\"accepted-copy\") }}\r\n } @else {\r\n {{ facade.describeCode(item.resultCode) }}\r\n }\r\n </div>\r\n\r\n <!-- Same section shape the connection form uses (mt-client-form section\r\n mode): header strip on a bordered, flat, rounded-md container. -->\r\n <section\r\n class=\"flex flex-col gap-0 overflow-hidden rounded-md border border-surface-200 bg-surface-0\"\r\n >\r\n <h3\r\n class=\"m-0 border-b border-surface-200 bg-surface-50 px-4 py-3 text-lg font-semibold text-color\"\r\n >\r\n {{ t(\"delivery-summary\") }}\r\n </h3>\r\n <dl class=\"grid gap-3 p-4 sm:grid-cols-2\">\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"attempt.operation\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 break-words font-medium text-color\">\r\n {{\r\n isConnectionTest()\r\n ? t(\"operation.connection-test\")\r\n : item.operationKind\r\n }}\r\n </dd>\r\n </div>\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"attempt.status\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-2\">\r\n <mt-email-delivery-status\r\n kind=\"attempt\"\r\n [value]=\"item.status\"\r\n />\r\n </dd>\r\n </div>\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"attempt.outcome\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-2\">\r\n @if (item.outcome) {\r\n <mt-email-delivery-status\r\n kind=\"attempt\"\r\n [value]=\"item.outcome\"\r\n />\r\n } @else {\r\n <span class=\"font-medium text-color\">—</span>\r\n }\r\n </dd>\r\n </div>\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"attempt.provider\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 break-words font-medium text-color\">\r\n {{ providerLabel(item.providerKey) }}\r\n </dd>\r\n </div>\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"attempt.created\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 font-medium text-color\">\r\n <time [attr.datetime]=\"item.createdAtUtc\">{{\r\n item.createdAtUtc | date: \"medium\"\r\n }}</time>\r\n </dd>\r\n </div>\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"attempt.count\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 font-medium text-color\">\r\n {{ item.attemptCount }}\r\n </dd>\r\n </div>\r\n </dl>\r\n </section>\r\n\r\n <section\r\n class=\"flex flex-col gap-0 overflow-hidden rounded-md border border-surface-200 bg-surface-0\"\r\n >\r\n <h3\r\n class=\"m-0 border-b border-surface-200 bg-surface-50 px-4 py-3 text-lg font-semibold text-color\"\r\n >\r\n {{ t(\"technical-identifiers\") }}\r\n </h3>\r\n <dl class=\"grid gap-3 p-4 sm:grid-cols-2\">\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"recipient-fingerprint\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 break-all font-mono text-sm text-color\">\r\n {{ item.recipientFingerprint }}\r\n </dd>\r\n <p class=\"mt-2 text-xs text-muted-color\">\r\n {{ t(\"recipient-fingerprint-hint\") }}\r\n </p>\r\n </div>\r\n @if (item.testRequestId) {\r\n <div\r\n class=\"rounded-md border border-surface-200 bg-surface-50 p-3\"\r\n >\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"test-request-id\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 break-all font-mono text-sm text-color\">\r\n {{ item.testRequestId }}\r\n </dd>\r\n </div>\r\n }\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">{{ t(\"attempt.id\") }}</dt>\r\n <dd class=\"mb-0 mt-1 break-all font-mono text-sm text-color\">\r\n {{ item.id }}\r\n </dd>\r\n </div>\r\n @if (item.correlationId) {\r\n <div\r\n class=\"rounded-md border border-surface-200 bg-surface-50 p-3\"\r\n >\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"correlation-id\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 break-all font-mono text-sm text-color\">\r\n {{ item.correlationId }}\r\n </dd>\r\n </div>\r\n }\r\n @if (item.providerRequestId) {\r\n <div\r\n class=\"rounded-md border border-surface-200 bg-surface-50 p-3\"\r\n >\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"provider-request-id\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 break-all font-mono text-sm text-color\">\r\n {{ item.providerRequestId }}\r\n </dd>\r\n </div>\r\n }\r\n </dl>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"t('close')\"\r\n variant=\"outlined\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"close()\"\r\n />\r\n @if (canReplay()) {\r\n <mt-button\r\n severity=\"warn\"\r\n icon=\"arrow.refresh-cw-01\"\r\n [label]=\"t('replay-attempt')\"\r\n [disabled]=\"!facade.managementAvailable()\"\r\n [loading]=\"facade.mutationLoading() === 'replay-' + item.id\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"replay()\"\r\n />\r\n }\r\n </div>\r\n }\r\n</ng-container>\r\n","/**\r\n * Shared chrome for the Email Delivery overlays.\r\n *\r\n * Every drawer on this page opens over the page content (`appendTo:\r\n * 'page-content'`), so it is positioned absolutely and drops its own shadow.\r\n * It takes the full width only while there is no room to spare — from `lg` up\r\n * it settles at half the page so the table stays readable behind it, which is\r\n * also what keeps the forms and callouts inside from stretching into\r\n * unreadably long lines.\r\n */\r\nexport const EMAIL_DELIVERY_DRAWER_STYLE_CLASS =\r\n '!absolute !shadow-none !w-full !max-w-full md:!w-[70%] lg:!w-[50%]';\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport {\r\n Table,\r\n type ColumnDef,\r\n type TableAction,\r\n type TableFilters,\r\n} from '@masterteam/components/table';\r\nimport { take } from 'rxjs';\r\nimport { getEmailDeliveryStatusMap } from '../../components/email-delivery-status/email-delivery-status';\r\nimport { EmailAttemptDetails } from '../../dialogs/attempt-details/email-attempt-details';\r\nimport { EmailDeliveryFacade } from '../../email-delivery.facade';\r\nimport { EMAIL_DELIVERY_DRAWER_STYLE_CLASS } from '../../email-delivery.ui';\r\nimport {\r\n EMAIL_DELIVERY_ATTEMPT_STATUSES,\r\n isConnectionTestAttempt,\r\n type EmailDeliveryAttempt,\r\n} from '../../email-delivery.model';\r\n\r\n@Component({\r\n selector: 'mt-email-delivery-attempts',\r\n imports: [TranslocoDirective, Button, Table],\r\n templateUrl: './email-delivery-attempts.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailDeliveryAttempts implements OnInit {\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n protected readonly facade = inject(EmailDeliveryFacade);\r\n private readonly activeLanguage = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n\r\n /**\r\n * Status is the one filter the backend understands (`?status=`), so it is\r\n * held here and round-tripped into the query; every other column filters the\r\n * rows already loaded.\r\n */\r\n protected readonly tableFilters = signal<TableFilters>({});\r\n\r\n /**\r\n * Activity mixes product sends with the operator's own controlled tests. The\r\n * table renders plain fields, so the labels are projected onto the row here;\r\n * the extra properties are inert everywhere the raw attempt is used.\r\n */\r\n protected readonly rows = computed<AttemptRow[]>(() => {\r\n this.activeLanguage();\r\n return this.facade.attempts().map((attempt) => ({\r\n ...attempt,\r\n operationLabel: this.operationLabel(attempt),\r\n providerLabel:\r\n this.facade.providerByKey(attempt.providerKey)?.displayName ??\r\n attempt.providerKey ??\r\n '—',\r\n resultLabel: attempt.resultCode\r\n ? this.facade.describeCode(attempt.resultCode)\r\n : '—',\r\n recipientFingerprintShort: shortenFingerprint(\r\n attempt.recipientFingerprint,\r\n ),\r\n }));\r\n });\r\n protected readonly columns = computed<ColumnDef[]>(() => {\r\n this.activeLanguage();\r\n const statusMap = getEmailDeliveryStatusMap(\r\n 'attempt',\r\n this.transloco.translate.bind(this.transloco),\r\n );\r\n return [\r\n {\r\n key: 'status',\r\n label: this.t('attempt.status'),\r\n type: 'status',\r\n width: '15rem',\r\n statusMap,\r\n filterConfig: {\r\n type: 'select',\r\n multiple: false,\r\n options: EMAIL_DELIVERY_ATTEMPT_STATUSES.map((value) => ({\r\n label: statusMap[value]?.display ?? value,\r\n value,\r\n })),\r\n },\r\n },\r\n {\r\n key: 'operationLabel',\r\n label: this.t('attempt.operation'),\r\n width: '14rem',\r\n filterConfig: {\r\n type: 'select',\r\n options: this.distinctOptions((row) => row.operationLabel),\r\n },\r\n },\r\n {\r\n key: 'providerLabel',\r\n label: this.t('attempt.provider'),\r\n width: '15rem',\r\n filterConfig: {\r\n type: 'select',\r\n options: this.distinctOptions((row) => row.providerLabel),\r\n },\r\n },\r\n {\r\n key: 'resultLabel',\r\n label: this.t('attempt.result'),\r\n filterConfig: { type: 'text' },\r\n },\r\n {\r\n key: 'recipientFingerprintShort',\r\n label: this.t('recipient-fingerprint'),\r\n width: '15rem',\r\n filterable: false,\r\n },\r\n {\r\n key: 'createdAtUtc',\r\n label: this.t('attempt.created'),\r\n type: 'dateTime',\r\n width: '10rem',\r\n filterConfig: { type: 'date' },\r\n },\r\n {\r\n key: 'attemptCount',\r\n label: this.t('attempt.count'),\r\n type: 'number',\r\n width: '7rem',\r\n },\r\n ];\r\n });\r\n protected readonly actions = computed<TableAction[]>(() => {\r\n this.activeLanguage();\r\n return [\r\n {\r\n icon: 'general.eye',\r\n label: this.t('view-details'),\r\n action: (row) => this.openDetails(row as EmailDeliveryAttempt),\r\n },\r\n ];\r\n });\r\n\r\n ngOnInit(): void {\r\n this.load(true);\r\n }\r\n\r\n /**\r\n * Only the status filter reaches the backend; the rest narrow the rows the\r\n * table already holds, so nothing else needs a round trip.\r\n */\r\n protected onFiltersChange(filters: TableFilters): void {\r\n this.tableFilters.set(filters);\r\n const status = readStatusFilter(filters['status']);\r\n if (status === this.facade.attemptStatusFilter()) return;\r\n this.load(true, status);\r\n }\r\n\r\n protected refresh(): void {\r\n this.load(true);\r\n }\r\n\r\n protected loadMore(): void {\r\n this.load(false);\r\n }\r\n\r\n protected openDetails(attempt: EmailDeliveryAttempt): void {\r\n const ref = this.modal.openModal(EmailAttemptDetails, 'drawer', {\r\n header: this.t('attempt-details'),\r\n styleClass: EMAIL_DELIVERY_DRAWER_STYLE_CLASS,\r\n position: 'end',\r\n appendTo: 'page-content',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { attempt },\r\n });\r\n ref.onClose.pipe(take(1)).subscribe((updated: EmailDeliveryAttempt) => {\r\n if (updated) this.load(true);\r\n });\r\n }\r\n\r\n private load(\r\n reset: boolean,\r\n status = this.facade.attemptStatusFilter(),\r\n ): void {\r\n this.facade.loadAttempts(reset, status).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n });\r\n }\r\n\r\n /**\r\n * Select filters over locally-filtered columns only offer values that are\r\n * actually present, so the operator never picks an option that empties the\r\n * table.\r\n */\r\n private distinctOptions(\r\n select: (row: AttemptRow) => string,\r\n ): { label: string; value: string }[] {\r\n const values = new Set(this.rows().map(select).filter(Boolean));\r\n return Array.from(values)\r\n .sort((left, right) => left.localeCompare(right))\r\n .map((value) => ({ label: value, value }));\r\n }\r\n\r\n /**\r\n * Controlled tests are always shown as \"Connection test\"; anything else falls\r\n * back to the backend's own operation kind rather than a guessed label.\r\n */\r\n private operationLabel(attempt: EmailDeliveryAttempt): string {\r\n return isConnectionTestAttempt(attempt)\r\n ? this.t('operation.connection-test')\r\n : attempt.operationKind;\r\n }\r\n\r\n private t(key: string): string {\r\n return this.transloco.translate(`email-delivery.${key}`);\r\n }\r\n}\r\n\r\ninterface AttemptRow extends EmailDeliveryAttempt {\r\n operationLabel: string;\r\n providerLabel: string;\r\n resultLabel: string;\r\n recipientFingerprintShort: string;\r\n}\r\n\r\n/**\r\n * The status column is a single-select, so its stored value is the raw status.\r\n * An empty selection clears the backend filter rather than sending a blank.\r\n */\r\nfunction readStatusFilter(value: unknown): string | null {\r\n const raw = Array.isArray(value) ? value[0] : value;\r\n return typeof raw === 'string' && raw.trim() !== '' ? raw : null;\r\n}\r\n\r\nconst FINGERPRINT_PREFIX_LENGTH = 12;\r\n\r\n/**\r\n * A 64-character hash has nowhere to wrap, so rendering it whole pushed its\r\n * column far past the width the table asked for. The list only needs enough of\r\n * it to tell two recipients apart; the drawer still shows the value in full.\r\n */\r\nfunction shortenFingerprint(value: string | null): string {\r\n if (!value) return '—';\r\n return value.length > FINGERPRINT_PREFIX_LENGTH\r\n ? value.slice(0, FINGERPRINT_PREFIX_LENGTH) + '…'\r\n : value;\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery'\">\r\n <section class=\"space-y-4\" aria-label=\"{{ t('activity-title') }}\">\r\n <mt-table\r\n [data]=\"rows()\"\r\n [columns]=\"columns()\"\r\n [rowActions]=\"actions()\"\r\n [filters]=\"tableFilters()\"\r\n [loading]=\"facade.attemptsLoading()\"\r\n [generalSearch]=\"true\"\r\n [showFilters]=\"true\"\r\n [emptyTitle]=\"t('no-attempts-title')\"\r\n [emptyDescription]=\"t('no-attempts-description')\"\r\n filterMode=\"column\"\r\n dataKey=\"id\"\r\n actionShape=\"popover\"\r\n [clickableRows]=\"true\"\r\n storageKey=\"email-delivery-attempts\"\r\n (filtersChange)=\"onFiltersChange($event)\"\r\n (rowClick)=\"openDetails($event)\"\r\n >\r\n <ng-template #captionEnd>\r\n <mt-button\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n icon=\"arrow.refresh-cw-01\"\r\n [label]=\"t('refresh')\"\r\n [loading]=\"facade.attemptsLoading()\"\r\n (onClick)=\"refresh()\"\r\n />\r\n </ng-template>\r\n </mt-table>\r\n\r\n @if (facade.attemptsNextCursor()) {\r\n <div class=\"flex justify-center\">\r\n <mt-button\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [label]=\"t('load-more')\"\r\n [loading]=\"facade.attemptsLoading()\"\r\n (onClick)=\"loadMore()\"\r\n />\r\n </div>\r\n }\r\n </section>\r\n</ng-container>\r\n","import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport type { EntityData } from '@masterteam/components/entities';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport {\r\n Table,\r\n type ColumnDef,\r\n type TableAction,\r\n} from '@masterteam/components/table';\r\nimport { take } from 'rxjs';\r\nimport { getEmailDeliveryStatusMap } from '../../components/email-delivery-status/email-delivery-status';\r\nimport {\r\n EmailOperatorReasonDialog,\r\n type EmailOperatorDecision,\r\n} from '../../dialogs/operator-reason/email-operator-reason-dialog';\r\nimport { EmailDeliveryFacade } from '../../email-delivery.facade';\r\nimport type { EmailHostEvidenceItem } from '../../email-delivery.model';\r\n\r\n@Component({\r\n selector: 'mt-email-delivery-host-evidence',\r\n imports: [TranslocoDirective, Button, Table],\r\n templateUrl: './email-delivery-host-evidence.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailDeliveryHostEvidence implements OnInit {\r\n private readonly document = inject(DOCUMENT);\r\n private readonly modal = inject(ModalService);\r\n private readonly confirmation = inject(ConfirmationService);\r\n private readonly transloco = inject(TranslocoService);\r\n protected readonly facade = inject(EmailDeliveryFacade);\r\n private readonly activeLanguage = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n protected readonly rows = computed(() =>\r\n this.facade.hostEvidence().map((item) => ({\r\n ...item,\r\n evidenceRowId: item.evidenceOccurrenceId ?? item.itemId,\r\n evidenceKindLabel: humanizeIdentifier(item.evidenceKind),\r\n evidenceOccurrenceIdentity: identifierEntity(item.evidenceOccurrenceId),\r\n errorLabel: this.facade.describeCode(item.errorCode),\r\n })),\r\n );\r\n protected readonly columns = computed<ColumnDef[]>(() => {\r\n this.activeLanguage();\r\n const statusMap = getEmailDeliveryStatusMap(\r\n 'support',\r\n this.transloco.translate.bind(this.transloco),\r\n );\r\n return [\r\n {\r\n key: 'evidenceKindLabel',\r\n label: this.t('evidence-kind'),\r\n width: '11rem',\r\n },\r\n {\r\n key: 'resolutionState',\r\n label: this.t('resolution-state'),\r\n type: 'status',\r\n width: '12rem',\r\n statusMap,\r\n },\r\n {\r\n key: 'ownershipState',\r\n label: this.t('ownership-state'),\r\n type: 'status',\r\n width: '11rem',\r\n statusMap,\r\n },\r\n {\r\n key: 'detectedAtUtc',\r\n label: this.t('detected'),\r\n type: 'dateTime',\r\n width: '10rem',\r\n },\r\n { key: 'errorLabel', label: this.t('issue') },\r\n {\r\n key: 'evidenceOccurrenceIdentity',\r\n label: this.t('evidence-occurrence-id'),\r\n type: 'entity',\r\n width: '15rem',\r\n shrink: true,\r\n },\r\n ];\r\n });\r\n protected readonly actions = computed<TableAction[]>(() => {\r\n this.activeLanguage();\r\n return [\r\n {\r\n icon: 'general.download-01',\r\n label: this.t('export'),\r\n hidden: (row) => {\r\n const item = row as EmailHostEvidenceItem;\r\n return !item.canExport || !item.evidenceOccurrenceId;\r\n },\r\n action: (row) => this.export(row as EmailHostEvidenceItem),\r\n },\r\n {\r\n icon: 'general.tool-02',\r\n label: this.t('repair'),\r\n hidden: (row) =>\r\n !this.facade.managementAvailable() ||\r\n !(row as EmailHostEvidenceItem).canRepair ||\r\n !(row as EmailHostEvidenceItem).evidenceOccurrenceId ||\r\n !(row as EmailHostEvidenceItem).decisionToken,\r\n action: (row) => this.decide(row as EmailHostEvidenceItem, 'repair'),\r\n },\r\n {\r\n icon: 'general.check-circle',\r\n label: this.t('acknowledge'),\r\n color: 'danger',\r\n hidden: (row) =>\r\n !this.facade.managementAvailable() ||\r\n !(row as EmailHostEvidenceItem).evidenceOccurrenceId ||\r\n !(row as EmailHostEvidenceItem).decisionToken,\r\n action: (row) =>\r\n this.decide(row as EmailHostEvidenceItem, 'acknowledge'),\r\n },\r\n ];\r\n });\r\n\r\n ngOnInit(): void {\r\n if (this.facade.hostEvidence().length === 0) this.load(true);\r\n }\r\n\r\n protected export(item: EmailHostEvidenceItem): void {\r\n if (!item.evidenceOccurrenceId) return;\r\n this.facade.exportHostEvidence(item.evidenceOccurrenceId).subscribe({\r\n next: (download) => {\r\n const url = URL.createObjectURL(download.blob);\r\n const anchor = this.document.createElement('a');\r\n anchor.href = url;\r\n anchor.download = download.fileName;\r\n anchor.rel = 'noopener';\r\n anchor.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n error: (error) => this.facade.showError(error),\r\n });\r\n }\r\n\r\n protected decide(\r\n item: EmailHostEvidenceItem,\r\n action: 'repair' | 'acknowledge',\r\n ): void {\r\n if (!item.evidenceOccurrenceId || !item.decisionToken) return;\r\n const dialog = this.modal.openModal(EmailOperatorReasonDialog, 'dialog', {\r\n header: this.t(\r\n action === 'repair' ? 'repair-evidence' : 'acknowledge-evidence',\r\n ),\r\n styleClass: '!w-[36rem] max-w-[96vw]',\r\n dismissible: true,\r\n inputValues: {\r\n itemName: item.evidenceOccurrenceId,\r\n consequence: this.t(\r\n action === 'repair'\r\n ? 'evidence-repair-warning'\r\n : 'evidence-acknowledge-warning',\r\n ),\r\n confirmLabel: this.t(action),\r\n },\r\n });\r\n dialog.onClose\r\n .pipe(take(1))\r\n .subscribe((decision: EmailOperatorDecision) => {\r\n if (!decision) return;\r\n this.facade\r\n .decideHostEvidence(item, action, decision.reason)\r\n .subscribe({\r\n error: (error) => {\r\n this.facade.showError(error);\r\n this.load(true);\r\n },\r\n });\r\n });\r\n }\r\n\r\n protected confirmRebuild(): void {\r\n this.confirmation.confirm({\r\n type: 'dialog',\r\n header: this.t('rebuild-evidence-index'),\r\n message: this.t('rebuild-evidence-warning'),\r\n accept: () =>\r\n this.facade.rebuildEvidenceIndex(200).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n }),\r\n });\r\n }\r\n\r\n protected loadMore(): void {\r\n this.load(false);\r\n }\r\n\r\n private load(reset: boolean): void {\r\n this.facade.loadHostEvidence(reset).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n });\r\n }\r\n\r\n private t(key: string): string {\r\n return this.transloco.translate(`email-delivery.${key}`);\r\n }\r\n}\r\n\r\nfunction identifierEntity(value: string | null): EntityData {\r\n return {\r\n name: '',\r\n viewType: 'Text',\r\n value: value ?? '—',\r\n configuration: { hideName: true },\r\n };\r\n}\r\n\r\nfunction humanizeIdentifier(value: string): string {\r\n return value\r\n .replace(/[._-]+/g, ' ')\r\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\r\n .replace(/\\s+/g, ' ')\r\n .trim()\r\n .replace(/^./, (character) => character.toUpperCase())\r\n .replace(/\\bSmtp\\b/g, 'SMTP')\r\n .replace(/\\bTls\\b/g, 'TLS')\r\n .replace(/\\bOauth2?\\b/gi, 'OAuth2')\r\n .replace(/\\bHttp\\b/g, 'HTTP')\r\n .replace(/\\bApi\\b/g, 'API');\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery'\">\r\n <section class=\"space-y-3\" aria-labelledby=\"host-evidence-heading\">\r\n <div\r\n class=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\"\r\n >\r\n <div>\r\n <h3 id=\"host-evidence-heading\" class=\"font-semibold text-color\">\r\n {{ t(\"host-evidence-title\") }}\r\n </h3>\r\n <p class=\"mt-1 text-sm text-muted-color\">\r\n {{ t(\"host-evidence-description\") }}\r\n </p>\r\n </div>\r\n <mt-button\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n icon=\"arrow.refresh-cw-01\"\r\n [label]=\"t('rebuild-evidence-index')\"\r\n [disabled]=\"!facade.managementAvailable()\"\r\n [loading]=\"facade.mutationLoading() === 'rebuild-evidence'\"\r\n (onClick)=\"confirmRebuild()\"\r\n />\r\n </div>\r\n\r\n @if (facade.hostEvidenceScanBudgetExhausted()) {\r\n <div\r\n class=\"rounded-md border border-amber-200 bg-amber-50 p-3 text-sm text-amber-950\"\r\n role=\"status\"\r\n >\r\n {{ t(\"scan-budget-exhausted\") }}\r\n </div>\r\n }\r\n\r\n <mt-table\r\n [data]=\"rows()\"\r\n [columns]=\"columns()\"\r\n [rowActions]=\"actions()\"\r\n [loading]=\"facade.hostEvidenceLoading()\"\r\n [generalSearch]=\"true\"\r\n [showFilters]=\"true\"\r\n [emptyTitle]=\"t('no-evidence-title')\"\r\n [emptyDescription]=\"t('no-evidence-description')\"\r\n filterMode=\"column\"\r\n actionShape=\"popover\"\r\n dataKey=\"evidenceRowId\"\r\n storageKey=\"email-delivery-host-evidence\"\r\n />\r\n\r\n @if (facade.hostEvidenceNextCursor()) {\r\n <div class=\"flex justify-center\">\r\n <mt-button\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [label]=\"t('load-more')\"\r\n [loading]=\"facade.hostEvidenceLoading()\"\r\n (onClick)=\"loadMore()\"\r\n />\r\n </div>\r\n }\r\n </section>\r\n</ng-container>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport type { EntityData } from '@masterteam/components/entities';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport {\r\n Table,\r\n type ColumnDef,\r\n type TableAction,\r\n} from '@masterteam/components/table';\r\nimport { take } from 'rxjs';\r\nimport { getEmailDeliveryStatusMap } from '../../components/email-delivery-status/email-delivery-status';\r\nimport {\r\n EmailOperatorReasonDialog,\r\n type EmailOperatorDecision,\r\n} from '../../dialogs/operator-reason/email-operator-reason-dialog';\r\nimport { EmailDeliveryFacade } from '../../email-delivery.facade';\r\nimport type { EmailFinalizationQuarantineItem } from '../../email-delivery.model';\r\n\r\n@Component({\r\n selector: 'mt-email-delivery-quarantine',\r\n imports: [TranslocoDirective, Button, Table],\r\n templateUrl: './email-delivery-quarantine.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailDeliveryQuarantine implements OnInit {\r\n private readonly modal = inject(ModalService);\r\n private readonly transloco = inject(TranslocoService);\r\n protected readonly facade = inject(EmailDeliveryFacade);\r\n private readonly activeLanguage = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n protected readonly rows = computed(() =>\r\n this.facade.quarantine().map((item) => ({\r\n ...item,\r\n attemptIdentity: identifierEntity(item.attemptId),\r\n errorLabel: this.facade.describeCode(item.errorCode),\r\n })),\r\n );\r\n protected readonly columns = computed<ColumnDef[]>(() => {\r\n this.activeLanguage();\r\n return [\r\n {\r\n key: 'attemptIdentity',\r\n label: this.t('attempt.id'),\r\n type: 'entity',\r\n width: '15rem',\r\n shrink: true,\r\n },\r\n {\r\n key: 'recoveryClassification',\r\n label: this.t('recovery-classification'),\r\n type: 'status',\r\n width: '12rem',\r\n statusMap: getEmailDeliveryStatusMap(\r\n 'support',\r\n this.transloco.translate.bind(this.transloco),\r\n ),\r\n },\r\n { key: 'errorLabel', label: this.t('issue') },\r\n {\r\n key: 'quarantinedAtUtc',\r\n label: this.t('detected'),\r\n type: 'dateTime',\r\n width: '10rem',\r\n },\r\n ];\r\n });\r\n protected readonly actions = computed<TableAction[]>(() => {\r\n this.activeLanguage();\r\n return [\r\n {\r\n icon: 'arrow.refresh-cw-01',\r\n label: this.t('retry'),\r\n hidden: (row) =>\r\n !this.facade.managementAvailable() ||\r\n (row as EmailFinalizationQuarantineItem).recoveryClassification !==\r\n 'retryable-after-upgrade',\r\n action: (row) =>\r\n this.decide(row as EmailFinalizationQuarantineItem, 'retry'),\r\n },\r\n {\r\n icon: 'general.check-circle',\r\n label: this.t('acknowledge'),\r\n color: 'danger',\r\n hidden: () => !this.facade.managementAvailable(),\r\n action: (row) =>\r\n this.decide(row as EmailFinalizationQuarantineItem, 'acknowledge'),\r\n },\r\n ];\r\n });\r\n\r\n ngOnInit(): void {\r\n if (this.facade.quarantine().length === 0) this.load(true);\r\n }\r\n\r\n protected decide(\r\n item: EmailFinalizationQuarantineItem,\r\n action: 'retry' | 'acknowledge',\r\n ): void {\r\n const dialog = this.modal.openModal(EmailOperatorReasonDialog, 'dialog', {\r\n header: this.t(\r\n action === 'retry' ? 'retry-quarantine' : 'acknowledge-quarantine',\r\n ),\r\n styleClass: '!w-[36rem] max-w-[96vw]',\r\n dismissible: true,\r\n inputValues: {\r\n itemName: item.itemId,\r\n consequence: this.t(\r\n action === 'retry'\r\n ? 'quarantine-retry-warning'\r\n : 'quarantine-acknowledge-warning',\r\n ),\r\n confirmLabel: this.t(action),\r\n },\r\n });\r\n dialog.onClose\r\n .pipe(take(1))\r\n .subscribe((decision: EmailOperatorDecision) => {\r\n if (!decision) return;\r\n this.facade.decideQuarantine(item, action, decision.reason).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n });\r\n });\r\n }\r\n\r\n protected loadMore(): void {\r\n this.load(false);\r\n }\r\n\r\n private load(reset: boolean): void {\r\n this.facade.loadQuarantine(reset).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n });\r\n }\r\n\r\n private t(key: string): string {\r\n return this.transloco.translate(`email-delivery.${key}`);\r\n }\r\n}\r\n\r\nfunction identifierEntity(value: string | null): EntityData {\r\n return {\r\n name: '',\r\n viewType: 'Text',\r\n value: value ?? '—',\r\n configuration: { hideName: true },\r\n };\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery'\">\r\n <section class=\"space-y-3\" aria-labelledby=\"quarantine-heading\">\r\n <div>\r\n <h3 id=\"quarantine-heading\" class=\"font-semibold text-color\">\r\n {{ t(\"quarantine-title\") }}\r\n </h3>\r\n <p class=\"mt-1 text-sm text-muted-color\">\r\n {{ t(\"quarantine-description\") }}\r\n </p>\r\n </div>\r\n\r\n <mt-table\r\n [data]=\"rows()\"\r\n [columns]=\"columns()\"\r\n [rowActions]=\"actions()\"\r\n [loading]=\"facade.quarantineLoading()\"\r\n [generalSearch]=\"true\"\r\n [showFilters]=\"true\"\r\n [emptyTitle]=\"t('no-quarantine-title')\"\r\n [emptyDescription]=\"t('no-quarantine-description')\"\r\n filterMode=\"column\"\r\n actionShape=\"popover\"\r\n dataKey=\"itemId\"\r\n storageKey=\"email-delivery-quarantine\"\r\n />\r\n\r\n @if (facade.quarantineNextCursor()) {\r\n <div class=\"flex justify-center\">\r\n <mt-button\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [label]=\"t('load-more')\"\r\n [loading]=\"facade.quarantineLoading()\"\r\n (onClick)=\"loadMore()\"\r\n />\r\n </div>\r\n }\r\n </section>\r\n</ng-container>\r\n","import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { EmailDeliveryAttempts } from '../attempts/email-delivery-attempts';\r\nimport { EmailDeliveryHostEvidence } from '../host-evidence/email-delivery-host-evidence';\r\nimport { EmailDeliveryQuarantine } from '../quarantine/email-delivery-quarantine';\r\n\r\n@Component({\r\n selector: 'mt-email-delivery-activity',\r\n imports: [\r\n TranslocoDirective,\r\n Icon,\r\n EmailDeliveryAttempts,\r\n EmailDeliveryQuarantine,\r\n EmailDeliveryHostEvidence,\r\n ],\r\n templateUrl: './email-delivery-activity.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailDeliveryActivity {\r\n protected readonly advancedExpanded = signal(false);\r\n\r\n protected onAdvancedToggle(event: Event): void {\r\n this.advancedExpanded.set((event.currentTarget as HTMLDetailsElement).open);\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery'\">\r\n <div class=\"grid gap-5\">\r\n <mt-email-delivery-attempts class=\"block min-w-0\" />\r\n\r\n <!-- Operator recovery tools. Kept collapsed and visually quieter than the\r\n Activity table above it: they are for incident work, not daily use. -->\r\n <details\r\n class=\"group overflow-hidden rounded-md border border-surface-200 bg-surface-0\"\r\n (toggle)=\"onAdvancedToggle($event)\"\r\n >\r\n <summary\r\n class=\"flex cursor-pointer list-none items-center gap-3 p-4 focus-visible:outline-2 focus-visible:outline-offset-2\"\r\n >\r\n <span\r\n class=\"inline-flex size-9 shrink-0 items-center justify-center rounded-md bg-surface-100 text-muted-color\"\r\n >\r\n <mt-icon icon=\"general.tool-02\" aria-hidden=\"true\" />\r\n </span>\r\n <span class=\"min-w-0 flex-1\">\r\n <span class=\"block font-semibold text-color\">\r\n {{ t(\"advanced-support\") }}\r\n </span>\r\n <span class=\"mt-0.5 block text-sm font-normal text-muted-color\">\r\n {{ t(\"advanced-support-description\") }}\r\n </span>\r\n </span>\r\n <mt-icon\r\n icon=\"arrow.chevron-down\"\r\n aria-hidden=\"true\"\r\n class=\"shrink-0 text-base text-muted-color transition-transform group-open:rotate-180\"\r\n />\r\n </summary>\r\n @if (advancedExpanded()) {\r\n <div\r\n class=\"grid gap-4 border-t border-surface-200 bg-surface-50/60 p-4 sm:p-5\"\r\n >\r\n <mt-email-delivery-quarantine class=\"block min-w-0\" />\r\n <mt-email-delivery-host-evidence class=\"block min-w-0\" />\r\n </div>\r\n }\r\n </details>\r\n </div>\r\n</ng-container>\r\n","import { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n DestroyRef,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n DynamicFormConfig,\r\n TextareaFieldConfig,\r\n TextFieldConfig,\r\n ToggleFieldConfig,\r\n ValidatorConfig,\r\n} from '@masterteam/components';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\r\nimport { timer } from 'rxjs';\r\nimport { EmailDeliveryStatus } from '../../components/email-delivery-status/email-delivery-status';\r\nimport { EmailDeliveryFacade } from '../../email-delivery.facade';\r\nimport type { EmailSendResult } from '../../email-delivery.model';\r\nimport {\r\n areEmailTestRecipientsValid,\r\n createEmailTestRequestId,\r\n isEmailTestRequestPending,\r\n parseEmailTestRecipients,\r\n} from '../../email-test.utils';\r\n\r\ninterface ControlledTestFormValue {\r\n recipients: string | null;\r\n subject: string | null;\r\n body: string | null;\r\n isHtml: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-email-controlled-test-dialog',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n DynamicForm,\r\n Button,\r\n EmailDeliveryStatus,\r\n ],\r\n templateUrl: './email-controlled-test-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailControlledTestDialog {\r\n readonly connectionId = input.required<string>();\r\n readonly connectionName = input.required<string>();\r\n\r\n protected readonly modal = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly transloco = inject(TranslocoService);\r\n protected readonly facade = inject(EmailDeliveryFacade);\r\n protected readonly testRequestId = signal(createEmailTestRequestId());\r\n protected readonly timedOut = signal(false);\r\n protected readonly polling = signal(false);\r\n protected readonly result = signal<EmailSendResult | null>(null);\r\n private pollIndex = 0;\r\n\r\n protected readonly form = new FormControl<ControlledTestFormValue>(\r\n {\r\n recipients: null,\r\n subject: 'Pplus email delivery test',\r\n body: 'This is a controlled test.',\r\n isHtml: false,\r\n },\r\n { nonNullable: true },\r\n );\r\n private readonly formStatus = toSignal(this.form.statusChanges, {\r\n initialValue: this.form.status,\r\n });\r\n protected readonly canSubmit = computed(\r\n () =>\r\n this.formStatus() === 'VALID' &&\r\n !this.facade.mutationLoading() &&\r\n !this.result(),\r\n );\r\n\r\n protected readonly formConfig = computed<DynamicFormConfig>(() => ({\r\n sections: [\r\n {\r\n key: 'controlled-test',\r\n type: 'none',\r\n columns: 12,\r\n fields: [\r\n new TextareaFieldConfig({\r\n key: 'recipients',\r\n label: this.t('test.recipients'),\r\n placeholder: this.t('test.recipients-placeholder'),\r\n hint: this.t('test.recipients-hint'),\r\n colSpan: 12,\r\n rows: 3,\r\n validators: [\r\n ValidatorConfig.required(),\r\n ValidatorConfig.custom(\r\n (value) => areEmailTestRecipientsValid(value, 100, 320),\r\n this.t('test.recipients-invalid'),\r\n ),\r\n ],\r\n }),\r\n new TextFieldConfig({\r\n key: 'subject',\r\n label: this.t('test.subject'),\r\n colSpan: 12,\r\n validators: [\r\n ValidatorConfig.required(),\r\n ValidatorConfig.maxLength(998),\r\n ValidatorConfig.pattern('^[^\\\\r\\\\n]*$'),\r\n ],\r\n }),\r\n new TextareaFieldConfig({\r\n key: 'body',\r\n label: this.t('test.body'),\r\n colSpan: 12,\r\n rows: 8,\r\n validators: [ValidatorConfig.maxLength(2_000_000)],\r\n }),\r\n new ToggleFieldConfig({\r\n key: 'isHtml',\r\n label: this.t('test.html'),\r\n colSpan: 12,\r\n }),\r\n ],\r\n },\r\n ],\r\n }));\r\n\r\n /**\r\n * The provider-acceptance caveat is shown once. When the backend already\r\n * answers with the accepted-delivery-unconfirmed code, the code message\r\n * above carries that sentence and the extra line would just repeat it.\r\n */\r\n protected showsAcceptedCaveat(result: EmailSendResult): boolean {\r\n return (\r\n result.outcome === 'Accepted' &&\r\n result.code !== ACCEPTED_DELIVERY_UNCONFIRMED_CODE\r\n );\r\n }\r\n\r\n protected submit(): void {\r\n if (!this.canSubmit()) {\r\n this.form.markAllAsTouched();\r\n return;\r\n }\r\n const value = this.form.getRawValue();\r\n this.facade\r\n .sendConnectionTest(this.connectionId(), {\r\n testRequestId: this.testRequestId(),\r\n recipients: parseEmailTestRecipients(value.recipients),\r\n subject: value.subject?.trim() ?? '',\r\n body: value.body ?? '',\r\n isHtml: value.isHtml,\r\n })\r\n .subscribe({\r\n next: (result) => {\r\n this.result.set(result);\r\n this.timedOut.set(false);\r\n },\r\n error: (error) => {\r\n if (\r\n isAmbiguousTimeout(error) ||\r\n this.facade.errorAction(error) === 'poll_status'\r\n ) {\r\n this.startPolling();\r\n return;\r\n }\r\n this.facade.showError(error);\r\n // The backend rejected this GUID because it already stands for a\r\n // different send. Retrieving it would return someone else's test and\r\n // reusing it can never succeed, so the dialog mints a fresh one and\r\n // waits for the operator to press Send again — it never resends.\r\n if (isTestRequestConflict(error)) {\r\n this.testRequestId.set(createEmailTestRequestId());\r\n }\r\n },\r\n });\r\n }\r\n\r\n protected retrieve(): void {\r\n if (this.polling()) return;\r\n this.retrieveStoredResult(false);\r\n }\r\n\r\n private retrieveStoredResult(fromPoll: boolean): void {\r\n this.facade\r\n .retrieveConnectionTest(this.connectionId(), this.testRequestId())\r\n .subscribe({\r\n next: (stored) => {\r\n if (stored.result) {\r\n this.result.set(stored.result);\r\n this.timedOut.set(false);\r\n this.polling.set(false);\r\n return;\r\n }\r\n\r\n if (fromPoll && isEmailTestRequestPending(stored.requestState)) {\r\n this.schedulePoll();\r\n } else {\r\n this.polling.set(false);\r\n this.timedOut.set(true);\r\n }\r\n },\r\n error: (error) => {\r\n if (fromPoll && this.facade.errorAction(error) === 'poll_status') {\r\n this.schedulePoll();\r\n return;\r\n }\r\n this.polling.set(false);\r\n this.timedOut.set(true);\r\n this.facade.showError(error);\r\n },\r\n });\r\n }\r\n\r\n private startPolling(): void {\r\n if (this.polling()) return;\r\n this.timedOut.set(true);\r\n this.polling.set(true);\r\n this.pollIndex = 0;\r\n this.schedulePoll();\r\n }\r\n\r\n private schedulePoll(): void {\r\n const delay = POLL_DELAYS_MS[this.pollIndex++];\r\n if (delay === undefined) {\r\n this.polling.set(false);\r\n return;\r\n }\r\n\r\n timer(delay)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.retrieveStoredResult(true));\r\n }\r\n\r\n protected close(): void {\r\n this.ref.close(this.result());\r\n }\r\n\r\n private t(key: string): string {\r\n return this.transloco.translate(`email-delivery.${key}`);\r\n }\r\n}\r\n\r\nconst ACCEPTED_DELIVERY_UNCONFIRMED_CODE =\r\n 'email.accepted_delivery_unconfirmed';\r\n\r\nconst TEST_REQUEST_CONFLICT_CODE = 'email.delivery_test_request_conflict';\r\n\r\nfunction isTestRequestConflict(error: unknown): boolean {\r\n const body = error instanceof HttpErrorResponse ? error.error : error;\r\n return (\r\n typeof body === 'object' &&\r\n body !== null &&\r\n (body as { code?: unknown }).code === TEST_REQUEST_CONFLICT_CODE\r\n );\r\n}\r\n\r\nconst POLL_DELAYS_MS = [1_000, 2_000, 4_000, 5_000, 5_000, 5_000] as const;\r\n\r\nfunction isAmbiguousTimeout(error: unknown): boolean {\r\n return (\r\n error instanceof HttpErrorResponse &&\r\n (error.status === 0 || error.status === 408 || error.status === 504)\r\n );\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery'\">\r\n <div [class]=\"modal.contentClass + ' p-4 sm:p-5'\">\r\n <div\r\n class=\"mb-4 rounded-md border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-950\"\r\n role=\"note\"\r\n >\r\n <strong>{{ t(\"test.real-email-warning-title\") }}</strong>\r\n {{ t(\"test.real-email-warning\") }}\r\n </div>\r\n\r\n <!-- The GUID this dialog will keep for the whole exchange. It is what a\r\n lost response is retrieved with, so the operator can record it before\r\n sending rather than reconstructing it afterwards. -->\r\n <p class=\"mb-4 text-xs text-muted-color\">\r\n {{ t(\"test-request-id\") }}:\r\n <span class=\"break-all font-mono\">{{ testRequestId() }}</span>\r\n </p>\r\n\r\n @if (!result()) {\r\n <mt-dynamic-form [formConfig]=\"formConfig()\" [formControl]=\"form\" />\r\n }\r\n\r\n @if (timedOut()) {\r\n <div\r\n class=\"mt-4 rounded-md border border-orange-200 bg-orange-50 px-4 py-3\"\r\n role=\"alert\"\r\n >\r\n <p class=\"font-semibold text-orange-950\">\r\n {{ t(\"test.timeout-title\") }}\r\n </p>\r\n <p class=\"mt-1 text-sm text-orange-900\">\r\n {{ t(\"test.timeout-description\") }}\r\n </p>\r\n </div>\r\n }\r\n\r\n @if (result(); as testResult) {\r\n <div\r\n class=\"rounded-md border border-surface-200 bg-surface-50 px-4 py-4\"\r\n aria-live=\"polite\"\r\n >\r\n <mt-email-delivery-status kind=\"attempt\" [value]=\"testResult.outcome\" />\r\n <p class=\"mt-1 text-sm text-muted-color\">\r\n {{ facade.describeCode(testResult.code) }}\r\n </p>\r\n @if (showsAcceptedCaveat(testResult)) {\r\n <p class=\"mt-3 text-sm font-medium text-amber-800\">\r\n {{ t(\"accepted-unconfirmed\") }}\r\n </p>\r\n }\r\n @if (testResult.outcome === \"OutcomeUnknown\") {\r\n <p class=\"mt-3 text-sm font-medium text-red-700\">\r\n {{ t(\"outcome-unknown-warning\") }}\r\n </p>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n [label]=\"t('close')\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"close()\"\r\n />\r\n @if (timedOut()) {\r\n <mt-button\r\n [label]=\"t('test.retrieve')\"\r\n icon=\"arrow.refresh-cw-01\"\r\n [disabled]=\"polling()\"\r\n [loading]=\"polling() || facade.mutationLoading() === 'retrieve-test'\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"retrieve()\"\r\n />\r\n } @else if (!result()) {\r\n <mt-button\r\n [label]=\"t('test.send')\"\r\n icon=\"communication.send-01\"\r\n [disabled]=\"!canSubmit()\"\r\n [loading]=\"facade.mutationLoading() === 'test'\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"submit()\"\r\n />\r\n }\r\n </div>\r\n</ng-container>\r\n","import {\r\n type EmailConnectionCreateRequest,\r\n type EmailConnectionUpdateRequest,\r\n type EmailCredentialMutation,\r\n type EmailCredentialOperation,\r\n type EmailCredentialStorageKind,\r\n type EmailProviderActionDescriptor,\r\n type EmailProviderDescriptor,\r\n type EmailProviderFieldDescriptor,\r\n} from './email-delivery.model';\r\n\r\nexport interface EmailConnectionEditorValue extends Record<string, unknown> {\r\n name: string | null;\r\n providerKey: string | null;\r\n authenticationMode: string | null;\r\n senderAddress: string | null;\r\n senderDisplayName: string | null;\r\n}\r\n\r\nexport function getApplicableProviderFields(\r\n provider: EmailProviderDescriptor | null | undefined,\r\n authenticationMode: string | null | undefined,\r\n): EmailProviderFieldDescriptor[] {\r\n if (!provider || !authenticationMode) {\r\n return [];\r\n }\r\n\r\n return provider.fields.filter(\r\n (field) =>\r\n field.authenticationModes.length === 0 ||\r\n field.authenticationModes.includes(authenticationMode),\r\n );\r\n}\r\n\r\nexport function getApplicableProviderActions(\r\n provider: EmailProviderDescriptor | null | undefined,\r\n authenticationMode: string | null | undefined,\r\n authorizationModel?: string | null,\r\n): EmailProviderActionDescriptor[] {\r\n if (!provider || !authenticationMode) {\r\n return [];\r\n }\r\n\r\n return (provider.actions ?? []).filter((action) => {\r\n if (!action.isExecutable) {\r\n return false;\r\n }\r\n\r\n if (\r\n action.authenticationModes.length > 0 &&\r\n !action.authenticationModes.includes(authenticationMode)\r\n ) {\r\n return false;\r\n }\r\n\r\n return (\r\n !action.authorizationModels?.length ||\r\n (!!authorizationModel &&\r\n action.authorizationModels.includes(authorizationModel))\r\n );\r\n });\r\n}\r\n\r\nexport function parseProviderCapabilities(value: string): string[] {\r\n return value\r\n .split(',')\r\n .map((item) => item.trim())\r\n .filter(Boolean);\r\n}\r\n\r\nexport function providerFieldControlKey(index: number): string {\r\n return `providerField${index}`;\r\n}\r\n\r\nexport function credentialOperationControlKey(index: number): string {\r\n return `credentialOperation${index}`;\r\n}\r\n\r\nexport function credentialStorageControlKey(index: number): string {\r\n return `credentialStorage${index}`;\r\n}\r\n\r\nexport function credentialValueControlKey(index: number): string {\r\n return `credentialValue${index}`;\r\n}\r\n\r\nexport function credentialReferenceControlKey(index: number): string {\r\n return `credentialReference${index}`;\r\n}\r\n\r\nexport function buildConnectionRequest(\r\n value: EmailConnectionEditorValue,\r\n provider: EmailProviderDescriptor,\r\n existingConcurrencyToken?: string,\r\n): EmailConnectionCreateRequest | EmailConnectionUpdateRequest {\r\n const mode = requiredTrimmed(value.authenticationMode);\r\n const publicConfiguration: Record<string, string> = {};\r\n const credentials: EmailCredentialMutation[] = [];\r\n\r\n provider.fields.forEach((field, index) => {\r\n if (\r\n field.authenticationModes.length > 0 &&\r\n !field.authenticationModes.includes(mode)\r\n ) {\r\n return;\r\n }\r\n\r\n if (field.isSecret) {\r\n const operation = value[\r\n credentialOperationControlKey(index)\r\n ] as EmailCredentialOperation | null;\r\n\r\n if (!operation || operation === 'omitted') {\r\n return;\r\n }\r\n\r\n const storageKind = (value[credentialStorageControlKey(index)] ??\r\n 'protected-value') as EmailCredentialStorageKind;\r\n\r\n credentials.push({\r\n key: field.key,\r\n operation,\r\n storageKind,\r\n value:\r\n operation === 'replace' && storageKind === 'protected-value'\r\n ? optionalTrimmed(value[credentialValueControlKey(index)])\r\n : null,\r\n externalReference:\r\n operation === 'replace' && storageKind === 'external-reference'\r\n ? optionalTrimmed(value[credentialReferenceControlKey(index)])\r\n : null,\r\n });\r\n return;\r\n }\r\n\r\n const fieldValue = value[providerFieldControlKey(index)];\r\n if (fieldValue === null || fieldValue === undefined || fieldValue === '') {\r\n return;\r\n }\r\n\r\n publicConfiguration[field.key] =\r\n typeof fieldValue === 'boolean' ? String(fieldValue) : String(fieldValue);\r\n });\r\n\r\n const request: EmailConnectionCreateRequest = {\r\n name: requiredTrimmed(value.name),\r\n providerKey: provider.key,\r\n authenticationMode: mode,\r\n senderAddress: requiredTrimmed(value.senderAddress),\r\n senderDisplayName: optionalTrimmed(value.senderDisplayName),\r\n publicConfiguration,\r\n credentials,\r\n };\r\n\r\n return existingConcurrencyToken\r\n ? { ...request, concurrencyToken: existingConcurrencyToken }\r\n : request;\r\n}\r\n\r\nfunction requiredTrimmed(value: unknown): string {\r\n return String(value ?? '').trim();\r\n}\r\n\r\nfunction optionalTrimmed(value: unknown): string | null {\r\n const normalized = String(value ?? '').trim();\r\n return normalized || null;\r\n}\r\n","import { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n type BaseFieldConfig,\r\n DynamicFormConfig,\r\n NumberFieldConfig,\r\n RadioButtonFieldConfig,\r\n type SectionConfig,\r\n SelectFieldConfig,\r\n TextFieldConfig,\r\n ToggleFieldConfig,\r\n ValidatorConfig,\r\n} from '@masterteam/components';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { finalize, map, of, switchMap } from 'rxjs';\r\nimport {\r\n buildConnectionRequest,\r\n credentialOperationControlKey,\r\n credentialReferenceControlKey,\r\n credentialStorageControlKey,\r\n credentialValueControlKey,\r\n getApplicableProviderFields,\r\n providerFieldControlKey,\r\n type EmailConnectionEditorValue,\r\n} from '../../email-delivery-descriptor.utils';\r\nimport { EmailDeliveryFacade } from '../../email-delivery.facade';\r\nimport type {\r\n EmailConnectionDetails,\r\n EmailConnectionUpdateRequest,\r\n EmailCredentialOperation,\r\n EmailCredentialStorageKind,\r\n EmailProviderDescriptor,\r\n EmailProviderFieldDescriptor,\r\n} from '../../email-delivery.model';\r\n\r\n@Component({\r\n selector: 'mt-email-connection-editor',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n SkeletonModule,\r\n DynamicForm,\r\n Button,\r\n ],\r\n templateUrl: './email-connection-editor.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailConnectionEditor implements OnInit, OnDestroy {\r\n readonly editorConnectionId = input<string | null>(null);\r\n\r\n private readonly ref = inject(ModalRef);\r\n private readonly transloco = inject(TranslocoService);\r\n protected readonly modal = inject(ModalService);\r\n protected readonly facade = inject(EmailDeliveryFacade);\r\n\r\n protected readonly connectionId = signal<string | null>(null);\r\n protected readonly existingDetails = signal<EmailConnectionDetails | null>(\r\n null,\r\n );\r\n protected readonly editorLoading = signal(true);\r\n protected readonly formGeneration = signal(0);\r\n protected readonly formValue =\r\n signal<EmailConnectionEditorValue>(emptyEditorValue());\r\n protected readonly form = new FormControl<EmailConnectionEditorValue>(\r\n emptyEditorValue(),\r\n { nonNullable: true },\r\n );\r\n private readonly formStatus = toSignal(this.form.statusChanges, {\r\n initialValue: this.form.status,\r\n });\r\n private previousProviderKey: string | null = null;\r\n private previousAuthenticationMode: string | null = null;\r\n private structureSignature = '';\r\n\r\n protected readonly isEdit = computed(() => !!this.connectionId());\r\n protected readonly selectedProvider = computed(() =>\r\n this.facade.providerByKey(this.formValue().providerKey),\r\n );\r\n protected readonly selectedMode = computed(\r\n () => this.formValue().authenticationMode,\r\n );\r\n protected readonly applicableFields = computed(() =>\r\n getApplicableProviderFields(this.selectedProvider(), this.selectedMode()),\r\n );\r\n protected readonly canSave = computed(\r\n () =>\r\n !this.editorLoading() &&\r\n this.formStatus() === 'VALID' &&\r\n !this.facade.mutationLoading(),\r\n );\r\n protected readonly configurationFields = computed(() =>\r\n this.buildConfigurationFields(),\r\n );\r\n /**\r\n * Empty whenever the selected mode authenticates without a stored secret —\r\n * an anonymous QC-test SMTP endpoint, for instance. That is a valid provider\r\n * descriptor, not a load failure.\r\n */\r\n protected readonly credentialFields = computed(() =>\r\n this.buildCredentialFields(),\r\n );\r\n /**\r\n * A section header over an empty body reads as something that failed to\r\n * load, so a section with no applicable fields is not rendered at all.\r\n */\r\n protected readonly formConfig = computed<DynamicFormConfig>(() => ({\r\n layout: SECTION_MODE_LAYOUT,\r\n sections: [\r\n this.section('basics', this.buildBasicFields()),\r\n this.section('configuration', this.configurationFields()),\r\n this.section('credentials', this.credentialFields()),\r\n ].filter((section) => section.fields.length > 0),\r\n }));\r\n\r\n constructor() {\r\n this.form.valueChanges.pipe(takeUntilDestroyed()).subscribe((value) => {\r\n this.handleFormValue(value);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n const id = this.editorConnectionId();\r\n this.connectionId.set(id);\r\n\r\n const catalog$ = this.facade.providers().length\r\n ? of(undefined)\r\n : this.facade.loadCatalog().pipe(map(() => undefined));\r\n catalog$\r\n .pipe(\r\n switchMap(() => (id ? this.facade.loadConnection(id) : of(null))),\r\n finalize(() => this.editorLoading.set(false)),\r\n )\r\n .subscribe({\r\n next: (details: EmailConnectionDetails | null) => {\r\n this.existingDetails.set(details);\r\n this.seedForm(details);\r\n },\r\n error: (error: unknown) => this.facade.showError(error),\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearSecretControls();\r\n }\r\n\r\n protected save(): void {\r\n if (!this.canSave()) {\r\n this.form.markAllAsTouched();\r\n return;\r\n }\r\n const provider = this.selectedProvider();\r\n if (!provider) return;\r\n\r\n const id = this.connectionId();\r\n const request = buildConnectionRequest(\r\n this.form.getRawValue(),\r\n provider,\r\n this.existingDetails()?.connection.concurrencyToken,\r\n );\r\n const operation = id\r\n ? this.facade.updateConnection(\r\n id,\r\n request as EmailConnectionUpdateRequest,\r\n )\r\n : this.facade.createConnection(request);\r\n\r\n operation.pipe(finalize(() => this.clearSecretControls())).subscribe({\r\n next: () => {\r\n this.ref.close(true);\r\n },\r\n error: (error) => this.handleSaveError(error),\r\n });\r\n }\r\n\r\n protected cancel(): void {\r\n this.clearSecretControls();\r\n this.ref.close(false);\r\n }\r\n\r\n private seedForm(details: EmailConnectionDetails | null): void {\r\n const provider = details\r\n ? this.facade.providerByKey(details.connection.providerKey)\r\n : (this.facade.providers()[0] ?? null);\r\n const mode = details\r\n ? details.connection.authenticationMode\r\n : (provider?.authenticationModes[0]?.key ?? null);\r\n const value: EmailConnectionEditorValue = {\r\n name: details?.connection.name ?? null,\r\n providerKey: provider?.key ?? null,\r\n authenticationMode: mode,\r\n senderAddress: details?.connection.senderAddress ?? null,\r\n senderDisplayName: details?.connection.senderDisplayName ?? null,\r\n };\r\n\r\n provider?.fields.forEach((field, index) => {\r\n if (!isApplicable(field, mode)) return;\r\n if (field.isSecret) {\r\n const status = details?.credentials.find(\r\n (credential) => credential.key === field.key,\r\n );\r\n value[credentialOperationControlKey(index)] = details\r\n ? 'omitted'\r\n : 'replace';\r\n value[credentialStorageControlKey(index)] =\r\n status?.storageKind === 'ExternalReference'\r\n ? 'external-reference'\r\n : 'protected-value';\r\n value[credentialValueControlKey(index)] = null;\r\n value[credentialReferenceControlKey(index)] = null;\r\n return;\r\n }\r\n\r\n const rawValue =\r\n details?.connection.publicConfiguration[field.key] ??\r\n field.defaultValue;\r\n value[providerFieldControlKey(index)] = toEditorFieldValue(\r\n field,\r\n rawValue,\r\n );\r\n });\r\n\r\n this.previousProviderKey = provider?.key ?? null;\r\n this.previousAuthenticationMode = mode;\r\n this.formValue.set(value);\r\n this.form.setValue(value, { emitEvent: false });\r\n this.structureSignature = this.getStructureSignature(value, provider);\r\n this.formGeneration.update((generation) => generation + 1);\r\n }\r\n\r\n private handleFormValue(value: EmailConnectionEditorValue): void {\r\n let provider = this.facade.providerByKey(value.providerKey);\r\n const providerChanged = value.providerKey !== this.previousProviderKey;\r\n let mode = value.authenticationMode;\r\n if (\r\n provider &&\r\n !provider.authenticationModes.some((item) => item.key === mode)\r\n ) {\r\n mode = provider.authenticationModes[0]?.key ?? null;\r\n }\r\n const modeChanged = mode !== this.previousAuthenticationMode;\r\n\r\n if (providerChanged || modeChanged) {\r\n const reset = this.resetProviderValues(value, provider, mode);\r\n this.previousProviderKey = provider?.key ?? null;\r\n this.previousAuthenticationMode = mode;\r\n this.formValue.set(reset);\r\n this.form.setValue(reset, { emitEvent: false });\r\n this.structureSignature = this.getStructureSignature(reset, provider);\r\n this.formGeneration.update((generation) => generation + 1);\r\n return;\r\n }\r\n\r\n provider = this.facade.providerByKey(value.providerKey);\r\n this.formValue.set(value);\r\n const signature = this.getStructureSignature(value, provider);\r\n if (signature !== this.structureSignature) {\r\n this.structureSignature = signature;\r\n this.formGeneration.update((generation) => generation + 1);\r\n }\r\n }\r\n\r\n private resetProviderValues(\r\n value: EmailConnectionEditorValue,\r\n provider: EmailProviderDescriptor | null,\r\n mode: string | null,\r\n ): EmailConnectionEditorValue {\r\n const reset: EmailConnectionEditorValue = {\r\n name: value.name,\r\n providerKey: provider?.key ?? null,\r\n authenticationMode: mode,\r\n senderAddress: value.senderAddress,\r\n senderDisplayName: value.senderDisplayName,\r\n };\r\n\r\n provider?.fields.forEach((field, index) => {\r\n if (!isApplicable(field, mode)) return;\r\n if (field.isSecret) {\r\n reset[credentialOperationControlKey(index)] = 'replace';\r\n reset[credentialStorageControlKey(index)] = 'protected-value';\r\n reset[credentialValueControlKey(index)] = null;\r\n reset[credentialReferenceControlKey(index)] = null;\r\n } else {\r\n reset[providerFieldControlKey(index)] = toEditorFieldValue(\r\n field,\r\n field.defaultValue,\r\n );\r\n }\r\n });\r\n return reset;\r\n }\r\n\r\n /**\r\n * Every section wears the same shell mt-client-form gives its sections — a\r\n * bordered, flat, rounded-md card with a header strip — so the connection\r\n * form reads like the runtime forms in the rest of the product.\r\n */\r\n private section(\r\n key: 'basics' | 'configuration' | 'credentials',\r\n fields: BaseFieldConfig[],\r\n ): SectionConfig {\r\n return {\r\n key,\r\n label: this.t(`editor.${key}`),\r\n type: 'header',\r\n columns: 12,\r\n headerClass: SECTION_MODE_HEADER_CLASS,\r\n bodyClass: SECTION_MODE_BODY_CLASS,\r\n fields,\r\n };\r\n }\r\n\r\n private buildBasicFields(): BaseFieldConfig[] {\r\n const provider = this.selectedProvider();\r\n return [\r\n new TextFieldConfig({\r\n key: 'name',\r\n label: this.t('connection.name'),\r\n colSpan: 12,\r\n validators: [\r\n ValidatorConfig.required(),\r\n ValidatorConfig.maxLength(150),\r\n ],\r\n }),\r\n new SelectFieldConfig({\r\n key: 'providerKey',\r\n label: this.t('connection.provider'),\r\n options: this.facade.providers().map((item) => ({\r\n label: item.displayName,\r\n value: item.key,\r\n })),\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n colSpan: 6,\r\n validators: [ValidatorConfig.required()],\r\n }),\r\n new SelectFieldConfig({\r\n key: 'authenticationMode',\r\n label: this.t('connection.authentication-mode'),\r\n options:\r\n provider?.authenticationModes.map((item) => ({\r\n label: item.displayName,\r\n value: item.key,\r\n })) ?? [],\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n colSpan: 6,\r\n validators: [ValidatorConfig.required()],\r\n }),\r\n new TextFieldConfig({\r\n key: 'senderAddress',\r\n label: this.t('connection.sender-address'),\r\n inputType: 'email',\r\n colSpan: 6,\r\n validators: [ValidatorConfig.required(), ValidatorConfig.email()],\r\n }),\r\n new TextFieldConfig({\r\n key: 'senderDisplayName',\r\n label: this.t('connection.sender-display-name'),\r\n colSpan: 6,\r\n validators: [ValidatorConfig.maxLength(200)],\r\n }),\r\n ];\r\n }\r\n\r\n private buildConfigurationFields(): BaseFieldConfig[] {\r\n const provider = this.selectedProvider();\r\n if (!provider) return [];\r\n return provider.fields.flatMap((field, index) => {\r\n if (field.isSecret || !isApplicable(field, this.selectedMode())) {\r\n return [];\r\n }\r\n return [this.toProviderFieldConfig(field, index)];\r\n });\r\n }\r\n\r\n private buildCredentialFields(): BaseFieldConfig[] {\r\n const provider = this.selectedProvider();\r\n if (!provider) return [];\r\n return provider.fields.flatMap((field, index) => {\r\n if (!field.isSecret || !isApplicable(field, this.selectedMode())) {\r\n return [];\r\n }\r\n\r\n const operationKey = credentialOperationControlKey(index);\r\n const storageKey = credentialStorageControlKey(index);\r\n const operation = (this.formValue()[operationKey] ??\r\n (this.isEdit() ? 'omitted' : 'replace')) as EmailCredentialOperation;\r\n const storageKind = (this.formValue()[storageKey] ??\r\n 'protected-value') as EmailCredentialStorageKind;\r\n const operationOptions = [\r\n ...(this.isEdit()\r\n ? [{ label: this.t('credential.keep'), value: 'omitted' }]\r\n : []),\r\n { label: this.t('credential.replace'), value: 'replace' },\r\n ...(!field.required && this.isEdit()\r\n ? [{ label: this.t('credential.clear'), value: 'clear' }]\r\n : []),\r\n ];\r\n const fields: BaseFieldConfig[] = [\r\n new SelectFieldConfig({\r\n key: operationKey,\r\n label: `${field.displayName} — ${this.t('credential.operation')}`,\r\n options: operationOptions,\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n colSpan: 6,\r\n validators: [ValidatorConfig.required()],\r\n }),\r\n ];\r\n\r\n if (operation !== 'replace') return fields;\r\n fields.push(\r\n new RadioButtonFieldConfig({\r\n key: storageKey,\r\n label: this.t('credential.storage-choice'),\r\n options: [\r\n {\r\n label: this.t('credential.protected-value'),\r\n value: 'protected-value',\r\n },\r\n {\r\n label: this.t('credential.external-reference'),\r\n value: 'external-reference',\r\n },\r\n ],\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n orientation: 'vertical',\r\n colSpan: 6,\r\n validators: [ValidatorConfig.required()],\r\n }),\r\n );\r\n\r\n fields.push(\r\n storageKind === 'external-reference'\r\n ? new TextFieldConfig({\r\n key: credentialReferenceControlKey(index),\r\n label: this.t('credential.external-reference'),\r\n hint: this.t('credential.external-reference-hint'),\r\n colSpan: 12,\r\n validators: [\r\n ValidatorConfig.required(),\r\n ValidatorConfig.maxLength(500),\r\n ValidatorConfig.pattern('^EmailSecrets:[A-Za-z0-9_.-]{1,100}$'),\r\n ],\r\n })\r\n : new TextFieldConfig({\r\n key: credentialValueControlKey(index),\r\n label: field.displayName,\r\n inputType: 'password',\r\n hint: this.t('credential.protected-value-hint'),\r\n colSpan: 12,\r\n validators: [\r\n ValidatorConfig.required(),\r\n ...(field.maximumLength\r\n ? [ValidatorConfig.maxLength(field.maximumLength)]\r\n : []),\r\n ],\r\n }),\r\n );\r\n return fields;\r\n });\r\n }\r\n\r\n private toProviderFieldConfig(\r\n field: EmailProviderFieldDescriptor,\r\n index: number,\r\n ): BaseFieldConfig {\r\n const config = {\r\n key: providerFieldControlKey(index),\r\n label: field.displayName,\r\n colSpan: 6,\r\n readonly:\r\n !!this.existingDetails()?.authorizationState &&\r\n !field.editableAfterAuthorization,\r\n validators: providerFieldValidators(field, this.t.bind(this)),\r\n };\r\n\r\n if (field.dataType === 'Boolean') {\r\n return new ToggleFieldConfig(config);\r\n }\r\n if (field.dataType === 'Integer' || field.dataType === 'Port') {\r\n return new NumberFieldConfig({\r\n ...config,\r\n min: field.dataType === 'Port' ? 1 : undefined,\r\n max: field.dataType === 'Port' ? 65_535 : undefined,\r\n useGrouping: false,\r\n });\r\n }\r\n if (field.dataType === 'Choice') {\r\n return new SelectFieldConfig({\r\n ...config,\r\n options: (field.allowedValues ?? []).map((value) => ({\r\n label: value,\r\n value,\r\n })),\r\n optionLabel: 'label',\r\n optionValue: 'value',\r\n });\r\n }\r\n return new TextFieldConfig({\r\n ...config,\r\n inputType: field.dataType === 'Email' ? 'email' : 'text',\r\n });\r\n }\r\n\r\n private getStructureSignature(\r\n value: EmailConnectionEditorValue,\r\n provider: EmailProviderDescriptor | null,\r\n ): string {\r\n const credentials = provider?.fields.flatMap((field, index) =>\r\n field.isSecret && isApplicable(field, value.authenticationMode)\r\n ? [\r\n `${value[credentialOperationControlKey(index)] ?? ''}:${\r\n value[credentialStorageControlKey(index)] ?? ''\r\n }`,\r\n ]\r\n : [],\r\n );\r\n return `${value.providerKey ?? ''}|${value.authenticationMode ?? ''}|${\r\n credentials?.join('|') ?? ''\r\n }`;\r\n }\r\n\r\n private clearSecretControls(): void {\r\n const provider = this.selectedProvider();\r\n if (!provider) return;\r\n const value = { ...this.form.getRawValue() };\r\n provider.fields.forEach((field, index) => {\r\n if (!field.isSecret) return;\r\n value[credentialValueControlKey(index)] = null;\r\n value[credentialReferenceControlKey(index)] = null;\r\n });\r\n this.formValue.set(value);\r\n this.form.setValue(value, { emitEvent: false });\r\n this.formGeneration.update((generation) => generation + 1);\r\n }\r\n\r\n private handleSaveError(error: unknown): void {\r\n this.facade.showError(error);\r\n const id = this.connectionId();\r\n if (!(error instanceof HttpErrorResponse) || error.status !== 409 || !id) {\r\n return;\r\n }\r\n this.editorLoading.set(true);\r\n this.facade\r\n .loadConnection(id)\r\n .pipe(finalize(() => this.editorLoading.set(false)))\r\n .subscribe({\r\n next: (details) => {\r\n this.existingDetails.set(details);\r\n this.seedForm(details);\r\n },\r\n error: (loadError) => this.facade.showError(loadError),\r\n });\r\n }\r\n\r\n private t(key: string): string {\r\n return this.transloco.translate(`email-delivery.${key}`);\r\n }\r\n}\r\n\r\n// Mirrors the section-mode styling mt-client-form applies to its own sections.\r\nconst SECTION_MODE_LAYOUT: NonNullable<DynamicFormConfig['layout']> = {\r\n sectionClass:\r\n 'flex flex-col gap-0 overflow-hidden rounded-md border border-surface-200 bg-surface-0',\r\n};\r\n\r\nconst SECTION_MODE_HEADER_CLASS =\r\n 'm-0 border-b border-surface-200 bg-surface-50 px-4 py-3 text-lg font-semibold text-color';\r\n\r\nconst SECTION_MODE_BODY_CLASS =\r\n '@container grid grid-cols-12 gap-4 items-start p-4';\r\n\r\nfunction emptyEditorValue(): EmailConnectionEditorValue {\r\n return {\r\n name: null,\r\n providerKey: null,\r\n authenticationMode: null,\r\n senderAddress: null,\r\n senderDisplayName: null,\r\n };\r\n}\r\n\r\nfunction isApplicable(\r\n field: EmailProviderFieldDescriptor,\r\n mode: string | null,\r\n): boolean {\r\n return (\r\n !!mode &&\r\n (field.authenticationModes.length === 0 ||\r\n field.authenticationModes.includes(mode))\r\n );\r\n}\r\n\r\nfunction toEditorFieldValue(\r\n field: EmailProviderFieldDescriptor,\r\n value: string | null | undefined,\r\n): string | number | boolean | null {\r\n if (value === null || value === undefined || value === '') return null;\r\n if (field.dataType === 'Boolean') return value.toLowerCase() === 'true';\r\n if (field.dataType === 'Integer' || field.dataType === 'Port') {\r\n const numberValue = Number(value);\r\n return Number.isFinite(numberValue) ? numberValue : null;\r\n }\r\n return value;\r\n}\r\n\r\nfunction providerFieldValidators(\r\n field: EmailProviderFieldDescriptor,\r\n translate: (key: string) => string,\r\n): ValidatorConfig[] {\r\n const validators: ValidatorConfig[] = [];\r\n if (field.required) validators.push(ValidatorConfig.required());\r\n if (field.maximumLength) {\r\n validators.push(ValidatorConfig.maxLength(field.maximumLength));\r\n }\r\n if (field.dataType === 'Email') validators.push(ValidatorConfig.email());\r\n if (field.dataType === 'Text') {\r\n validators.push(ValidatorConfig.pattern('^[^\\\\r\\\\n\\\\u0000]*$'));\r\n }\r\n if (field.dataType === 'Identifier') {\r\n validators.push(ValidatorConfig.pattern('^[A-Za-z0-9._-]+$'));\r\n }\r\n if (field.dataType === 'Host') {\r\n validators.push(\r\n ValidatorConfig.custom(\r\n (value) => validHost(value),\r\n translate('validation.host'),\r\n ),\r\n );\r\n }\r\n if (field.dataType === 'Url') {\r\n validators.push(\r\n ValidatorConfig.custom(\r\n (value) => validHttpsUrl(value),\r\n translate('validation.https-url'),\r\n ),\r\n );\r\n }\r\n if (field.dataType === 'HeaderName') {\r\n validators.push(ValidatorConfig.pattern('^X-[A-Za-z0-9-]+$'));\r\n }\r\n return validators;\r\n}\r\n\r\nfunction validHost(value: unknown): boolean {\r\n const host = String(value ?? '')\r\n .trim()\r\n .toLowerCase();\r\n return (\r\n !!host &&\r\n host !== 'localhost' &&\r\n !/^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(host) &&\r\n /^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)+[a-z0-9][a-z0-9-]{0,62}$/.test(\r\n host,\r\n )\r\n );\r\n}\r\n\r\nfunction validHttpsUrl(value: unknown): boolean {\r\n try {\r\n const url = new URL(String(value ?? ''));\r\n return (\r\n url.protocol === 'https:' &&\r\n !url.username &&\r\n !url.password &&\r\n !url.hash &&\r\n url.hostname.toLowerCase() !== 'localhost'\r\n );\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery'\">\r\n <div\r\n [class]=\"\r\n 'flex min-h-0 flex-col gap-5 overflow-y-auto p-4 sm:p-5 ' +\r\n modal.contentClass\r\n \"\r\n >\r\n @if (editorLoading()) {\r\n <div\r\n class=\"flex flex-col gap-5\"\r\n role=\"status\"\r\n [attr.aria-label]=\"t('loading')\"\r\n >\r\n @for (section of [1, 2, 3]; track section) {\r\n <div class=\"overflow-hidden rounded-md border border-surface-200\">\r\n <div class=\"border-b border-surface-200 bg-surface-50 px-4 py-3\">\r\n <p-skeleton\r\n width=\"10rem\"\r\n height=\"1.25rem\"\r\n borderRadius=\"0.375rem\"\r\n />\r\n </div>\r\n <div class=\"grid gap-4 p-4 sm:grid-cols-2\">\r\n @for (field of [1, 2, 3, 4]; track field) {\r\n <p-skeleton height=\"3.25rem\" borderRadius=\"0.375rem\" />\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n @if (selectedProvider(); as provider) {\r\n @if (provider.warnings.length > 0) {\r\n <section\r\n class=\"rounded-md border border-amber-200 bg-amber-50 p-4\"\r\n role=\"note\"\r\n aria-labelledby=\"provider-warnings-heading\"\r\n >\r\n <h2\r\n id=\"provider-warnings-heading\"\r\n class=\"m-0 text-sm font-semibold text-amber-950\"\r\n >\r\n {{ t(\"provider-warnings\") }}\r\n </h2>\r\n <ul\r\n class=\"mb-0 mt-2.5 list-disc space-y-2 ps-5 text-sm leading-relaxed text-amber-900\"\r\n >\r\n @for (warning of provider.warnings; track warning) {\r\n <li class=\"ps-1\">{{ warning }}</li>\r\n }\r\n </ul>\r\n </section>\r\n }\r\n }\r\n\r\n @if (isEdit()) {\r\n <div\r\n class=\"rounded-md border border-blue-200 bg-blue-50 px-4 py-3 text-sm text-blue-950\"\r\n role=\"note\"\r\n >\r\n {{ t(\"editor.update-invalidates-proof\") }}\r\n </div>\r\n }\r\n\r\n @for (generation of [formGeneration()]; track generation) {\r\n <mt-dynamic-form [formConfig]=\"formConfig()\" [formControl]=\"form\" />\r\n }\r\n\r\n @if (applicableFields().length === 0) {\r\n <div\r\n class=\"rounded-md border border-surface-200 bg-surface-50 px-4 py-3 text-sm text-muted-color\"\r\n >\r\n {{ t(\"editor.select-provider-mode\") }}\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"t('cancel')\"\r\n variant=\"outlined\"\r\n [disabled]=\"!!facade.mutationLoading()\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"cancel()\"\r\n />\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-01\"\r\n [disabled]=\"!canSave()\"\r\n [loading]=\"facade.mutationLoading() === (isEdit() ? 'update' : 'create')\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"save()\"\r\n />\r\n </div>\r\n</ng-container>\r\n","import { DatePipe, DOCUMENT } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { EmptyState } from '@masterteam/components/empty-state';\r\nimport { Menu, type MTMenuItem } from '@masterteam/components/menu';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { take } from 'rxjs';\r\nimport { EmailDeliveryStatus } from '../../components/email-delivery-status/email-delivery-status';\r\nimport { EmailControlledTestDialog } from '../../dialogs/controlled-test/email-controlled-test-dialog';\r\nimport { getApplicableProviderActions } from '../../email-delivery-descriptor.utils';\r\nimport { EmailDeliveryFacade } from '../../email-delivery.facade';\r\nimport { EMAIL_DELIVERY_DRAWER_STYLE_CLASS } from '../../email-delivery.ui';\r\nimport type {\r\n EmailProviderActionDescriptor,\r\n EmailProviderFieldDescriptor,\r\n} from '../../email-delivery.model';\r\nimport { EmailConnectionEditor } from '../connection-editor/email-connection-editor';\r\n\r\ninterface EmailConfigurationViewItem {\r\n key: string;\r\n label: string;\r\n value: string;\r\n}\r\n\r\ninterface EmailCredentialViewItem {\r\n key: string;\r\n label: string;\r\n configured: boolean;\r\n storageLabel: string;\r\n lastRotatedAtUtc: string | null;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-email-connection-details',\r\n imports: [\r\n DatePipe,\r\n TranslocoDirective,\r\n SkeletonModule,\r\n Button,\r\n EmptyState,\r\n Menu,\r\n EmailDeliveryStatus,\r\n ],\r\n templateUrl: './email-connection-details.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailConnectionDetailsPage implements OnInit {\r\n readonly connectionId = input.required<string>();\r\n\r\n private readonly document = inject(DOCUMENT);\r\n private readonly ref = inject(ModalRef);\r\n private readonly confirmation = inject(ConfirmationService);\r\n private readonly transloco = inject(TranslocoService);\r\n protected readonly modal = inject(ModalService);\r\n protected readonly facade = inject(EmailDeliveryFacade);\r\n private readonly activeLanguage = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n\r\n protected readonly actions = computed(() => {\r\n const details = this.facade.selectedConnection();\r\n if (!details || details.connection.id !== this.connectionId()) return [];\r\n return getApplicableProviderActions(\r\n this.facade.providerByKey(details.connection.providerKey),\r\n details.connection.authenticationMode,\r\n details.connection.publicConfiguration['AuthorizationModel'],\r\n );\r\n });\r\n protected readonly provider = computed(() => {\r\n const details = this.facade.selectedConnection();\r\n return details\r\n ? this.facade.providerByKey(details.connection.providerKey)\r\n : null;\r\n });\r\n /**\r\n * The provider descriptor's own warnings, shown here and not only while\r\n * editing: a connection whose mode carries a standing caveat — the QC SMTP\r\n * endpoint that runs without TLS or authentication, for instance — must\r\n * still say so to whoever opens it later.\r\n */\r\n protected readonly providerWarnings = computed<string[]>(\r\n () => this.provider()?.warnings ?? [],\r\n );\r\n /**\r\n * The contract assigns each connection state one next step. Saying it in\r\n * words means the chip is not the only place the operator can read what to\r\n * do, which is also what keeps the state legible without relying on color.\r\n */\r\n protected readonly stateGuidance = computed(() => {\r\n this.activeLanguage();\r\n const details = this.facade.selectedConnection();\r\n if (!details) return '';\r\n return this.optionalT(\r\n `state-guidance.${toKebabCase(details.connection.state)}`,\r\n );\r\n });\r\n /**\r\n * The last validation code, so an invalid connection shows the reason rather\r\n * than only a chip that says something went wrong.\r\n */\r\n protected readonly lastValidationMessage = computed(() => {\r\n this.activeLanguage();\r\n const code =\r\n this.facade.selectedConnection()?.connection.lastValidationCode;\r\n return code ? this.facade.describeCode(code) : '';\r\n });\r\n protected readonly authenticationModeLabel = computed(() => {\r\n const details = this.facade.selectedConnection();\r\n if (!details) return '';\r\n return (\r\n this.provider()?.authenticationModes.find(\r\n (mode) => mode.key === details.connection.authenticationMode,\r\n )?.displayName ?? details.connection.authenticationMode\r\n );\r\n });\r\n protected readonly publicConfiguration = computed<\r\n EmailConfigurationViewItem[]\r\n >(() => {\r\n this.activeLanguage();\r\n const details = this.facade.selectedConnection();\r\n if (!details) return [];\r\n const fields = this.provider()?.fields ?? [];\r\n const fieldOrder = new Map(\r\n fields.map((field, index) => [field.key.toLowerCase(), index]),\r\n );\r\n\r\n return Object.entries(details.connection.publicConfiguration)\r\n .filter(([, value]) => value !== '')\r\n .sort(\r\n ([left], [right]) =>\r\n (fieldOrder.get(left.toLowerCase()) ?? Number.MAX_SAFE_INTEGER) -\r\n (fieldOrder.get(right.toLowerCase()) ?? Number.MAX_SAFE_INTEGER),\r\n )\r\n .map(([key, value]) => {\r\n const field = fields.find(\r\n (candidate) => candidate.key.toLowerCase() === key.toLowerCase(),\r\n );\r\n return {\r\n key,\r\n label: field?.displayName ?? humanizeIdentifier(key),\r\n value: this.configurationValueLabel(value, field),\r\n };\r\n });\r\n });\r\n protected readonly credentialItems = computed<EmailCredentialViewItem[]>(\r\n () => {\r\n this.activeLanguage();\r\n const details = this.facade.selectedConnection();\r\n if (!details) return [];\r\n const fields = this.provider()?.fields ?? [];\r\n\r\n return details.credentials.map((credential) => ({\r\n key: credential.key,\r\n label:\r\n fields.find(\r\n (field) => field.key.toLowerCase() === credential.key.toLowerCase(),\r\n )?.displayName ?? humanizeIdentifier(credential.key),\r\n configured: credential.configured,\r\n storageLabel: this.credentialStorageLabel(credential.storageKind),\r\n lastRotatedAtUtc: credential.lastRotatedAtUtc,\r\n }));\r\n },\r\n );\r\n protected readonly actionMenuItems = computed<MTMenuItem[]>(() => {\r\n this.activeLanguage();\r\n const details = this.facade.selectedConnection();\r\n if (!details || !this.facade.managementAvailable()) return [];\r\n\r\n const items: MTMenuItem[] = this.interactiveActions().map((action) => ({\r\n id: action.key,\r\n label: action.displayName,\r\n icon: 'security.lock-unlocked-01',\r\n command: () => this.authorize(action),\r\n }));\r\n\r\n if (this.hasAction('validate')) {\r\n items.push({\r\n id: 'validate',\r\n label: this.t('validate'),\r\n icon: 'general.check-circle',\r\n command: () => this.validate(),\r\n });\r\n }\r\n if (this.hasAction('test-send')) {\r\n items.push({\r\n id: 'test-send',\r\n label: this.t('test-send'),\r\n icon: 'communication.send-01',\r\n command: () => this.test(),\r\n });\r\n }\r\n if (\r\n details.connection.state === 'Ready' &&\r\n !details.bindings.includes('notifications')\r\n ) {\r\n items.push({\r\n id: 'bind',\r\n label: this.t('use-for-notifications'),\r\n icon: 'general.link-01',\r\n command: () => this.bind(),\r\n });\r\n }\r\n if (details.bindings.includes('notifications')) {\r\n items.push({\r\n id: 'unbind',\r\n label: this.t('stop-using'),\r\n icon: 'general.link-broken-01',\r\n severity: 'warn',\r\n command: () => this.unbind(),\r\n });\r\n }\r\n if (details.authorizationState) {\r\n items.push({\r\n id: 'revoke',\r\n label: this.t('revoke'),\r\n icon: 'security.lock-01',\r\n severity: 'warn',\r\n command: () => this.revoke(),\r\n });\r\n }\r\n if (details.bindings.length === 0) {\r\n items.push(\r\n { id: 'destructive-separator', separator: true },\r\n {\r\n id: 'delete',\r\n label: this.t('delete'),\r\n icon: 'general.trash-01',\r\n severity: 'danger',\r\n command: () => this.delete(),\r\n },\r\n );\r\n }\r\n\r\n return items;\r\n });\r\n\r\n ngOnInit(): void {\r\n this.reload();\r\n }\r\n\r\n protected edit(): void {\r\n const drawer = this.modal.openModal(EmailConnectionEditor, 'drawer', {\r\n header: this.t('editor.edit-title'),\r\n styleClass: EMAIL_DELIVERY_DRAWER_STYLE_CLASS,\r\n position: 'end',\r\n appendTo: 'page-content',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { editorConnectionId: this.connectionId() },\r\n });\r\n drawer.onClose.pipe(take(1)).subscribe((saved: boolean) => {\r\n if (saved) this.reload();\r\n });\r\n }\r\n\r\n protected validate(): void {\r\n this.facade.validateConnection(this.connectionId()).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n });\r\n }\r\n\r\n protected test(): void {\r\n const details = this.facade.selectedConnection();\r\n if (!details) return;\r\n const dialog = this.modal.openModal(EmailControlledTestDialog, 'dialog', {\r\n header: this.t('test.title'),\r\n styleClass: '!w-[42rem] max-w-[96vw]',\r\n dismissible: true,\r\n inputValues: {\r\n connectionId: details.connection.id,\r\n connectionName: details.connection.name,\r\n },\r\n });\r\n dialog.onClose.pipe(take(1)).subscribe(() => this.reload());\r\n }\r\n\r\n protected authorize(action: EmailProviderActionDescriptor): void {\r\n const kind = action.key === 'authorize' ? 'delegated' : 'admin-consent';\r\n this.facade.startAuthorization(this.connectionId(), kind).subscribe({\r\n next: (result) => this.document.location.assign(result.authorizationUrl),\r\n error: (error) => this.facade.showError(error),\r\n });\r\n }\r\n\r\n protected revoke(): void {\r\n const details = this.facade.selectedConnection();\r\n if (!details) return;\r\n this.confirmation.confirm({\r\n type: 'dialog',\r\n header: this.t('revoke'),\r\n message: this.t('confirm.revoke'),\r\n accept: () =>\r\n this.facade.revokeAuthorization(this.connectionId()).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n }),\r\n });\r\n }\r\n\r\n protected bind(): void {\r\n this.facade.bindConnection(this.connectionId()).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n });\r\n }\r\n\r\n protected unbind(): void {\r\n this.confirmation.confirm({\r\n type: 'dialog',\r\n header: this.t('stop-using'),\r\n message: this.t('confirm.unbind'),\r\n accept: () =>\r\n this.facade.unbindConnection(this.connectionId()).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n }),\r\n });\r\n }\r\n\r\n protected delete(): void {\r\n const details = this.facade.selectedConnection();\r\n if (!details) return;\r\n this.confirmation.confirmDelete({\r\n type: 'dialog',\r\n message: this.t('confirm.delete'),\r\n accept: () =>\r\n this.facade\r\n .deleteConnection(\r\n this.connectionId(),\r\n details.connection.concurrencyToken,\r\n )\r\n .subscribe({\r\n next: () => this.ref.close(true),\r\n error: (error) => this.facade.showError(error),\r\n }),\r\n });\r\n }\r\n\r\n protected hasAction(key: string): boolean {\r\n return this.actions().some((action) => action.key === key);\r\n }\r\n\r\n protected interactiveActions(): EmailProviderActionDescriptor[] {\r\n return this.actions().filter((action) => action.isInteractive);\r\n }\r\n\r\n protected close(): void {\r\n this.ref.close();\r\n }\r\n\r\n private reload(): void {\r\n this.facade.loadConnection(this.connectionId()).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n });\r\n }\r\n\r\n private t(key: string): string {\r\n return this.transloco.translate(`email-delivery.${key}`);\r\n }\r\n\r\n /** Empty rather than the raw key when a state has no guidance sentence. */\r\n private optionalT(key: string): string {\r\n const fullKey = `email-delivery.${key}`;\r\n const translated = this.transloco.translate(fullKey);\r\n return translated === fullKey ? '' : translated;\r\n }\r\n\r\n private credentialStorageLabel(storageKind: string): string {\r\n switch (storageKind.replace(/[-_\\s]/g, '').toLowerCase()) {\r\n case 'externalreference':\r\n return this.t('credential.external-reference');\r\n case 'protectedvalue':\r\n return this.t('credential.protected-value');\r\n default:\r\n return humanizeIdentifier(storageKind);\r\n }\r\n }\r\n\r\n private configurationValueLabel(\r\n value: string,\r\n field?: EmailProviderFieldDescriptor,\r\n ): string {\r\n if (value.toLowerCase() === 'true') return this.t('yes');\r\n if (value.toLowerCase() === 'false') return this.t('no');\r\n return field?.dataType === 'Choice' ? humanizeIdentifier(value) : value;\r\n }\r\n}\r\n\r\nfunction toKebabCase(value: string): string {\r\n return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\r\n}\r\n\r\nfunction humanizeIdentifier(value: string): string {\r\n return value\r\n .replace(/[._-]+/g, ' ')\r\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\r\n .replace(/\\s+/g, ' ')\r\n .trim()\r\n .replace(/^./, (character) => character.toUpperCase())\r\n .replace(/\\bSmtp\\b/g, 'SMTP')\r\n .replace(/\\bTls\\b/g, 'TLS')\r\n .replace(/\\bOauth2?\\b/gi, 'OAuth2')\r\n .replace(/\\bHttp\\b/g, 'HTTP')\r\n .replace(/\\bApi\\b/g, 'API');\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery'\">\r\n @if (facade.detailsLoading()) {\r\n <div\r\n [class]=\"'min-h-0 overflow-y-auto p-4 sm:p-5 ' + modal.contentClass\"\r\n role=\"status\"\r\n [attr.aria-label]=\"t('loading')\"\r\n >\r\n <div class=\"grid w-full gap-5\">\r\n <p-skeleton height=\"5rem\" borderRadius=\"0.375rem\" />\r\n @for (section of [1, 2, 3]; track section) {\r\n <div class=\"overflow-hidden rounded-md border border-surface-200\">\r\n <div class=\"border-b border-surface-200 bg-surface-50 px-4 py-3\">\r\n <p-skeleton\r\n width=\"12rem\"\r\n height=\"1.25rem\"\r\n borderRadius=\"0.375rem\"\r\n />\r\n </div>\r\n <div class=\"grid gap-3 p-4 sm:grid-cols-2 xl:grid-cols-3\">\r\n @for (tile of [1, 2, 3]; track tile) {\r\n <p-skeleton height=\"4rem\" borderRadius=\"0.375rem\" />\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n } @else if (facade.selectedConnection(); as details) {\r\n <div [class]=\"'min-h-0 overflow-y-auto p-4 sm:p-5 ' + modal.contentClass\">\r\n <div class=\"grid w-full gap-5\">\r\n <section\r\n class=\"flex flex-col gap-3 rounded-md border border-surface-200 bg-surface-0 p-4 sm:flex-row sm:items-center sm:justify-between\"\r\n >\r\n <div class=\"min-w-0\">\r\n <h2 class=\"m-0 truncate text-lg font-semibold text-color\">\r\n {{ details.connection.name }}\r\n </h2>\r\n <p class=\"mb-0 mt-1 break-all text-sm text-muted-color\">\r\n {{ details.connection.senderAddress }}\r\n </p>\r\n <!-- The next step in words, so the state is never carried by the\r\n chip's color alone. -->\r\n @if (stateGuidance(); as guidance) {\r\n <p class=\"mb-0 mt-2 text-sm text-color\">{{ guidance }}</p>\r\n }\r\n @if (lastValidationMessage(); as lastResult) {\r\n <p class=\"mb-0 mt-1 text-sm text-muted-color\">\r\n {{ t(\"last-result\") }}: {{ lastResult }}\r\n </p>\r\n }\r\n </div>\r\n <mt-email-delivery-status\r\n class=\"shrink-0 self-start\"\r\n kind=\"connection\"\r\n [value]=\"details.connection.state\"\r\n />\r\n </section>\r\n\r\n <!-- The descriptor's standing caveats for this provider and mode. The\r\n editor shows them while configuring; they belong here too, because\r\n whoever opens an existing connection is the one deciding whether\r\n it may carry production notification email. -->\r\n @if (providerWarnings().length > 0) {\r\n <section\r\n class=\"rounded-md border border-amber-200 bg-amber-50 p-4\"\r\n role=\"note\"\r\n aria-labelledby=\"connection-provider-warnings-heading\"\r\n >\r\n <h3\r\n id=\"connection-provider-warnings-heading\"\r\n class=\"m-0 text-sm font-semibold text-amber-950\"\r\n >\r\n {{ t(\"provider-warnings\") }}\r\n </h3>\r\n <ul\r\n class=\"mb-0 mt-2.5 list-disc space-y-2 ps-5 text-sm leading-relaxed text-amber-900\"\r\n >\r\n @for (warning of providerWarnings(); track warning) {\r\n <li class=\"ps-1\">{{ warning }}</li>\r\n }\r\n </ul>\r\n </section>\r\n }\r\n\r\n <!-- Same section shape the connection form uses (mt-client-form section\r\n mode): header strip on a bordered, flat, rounded-md container. -->\r\n <section\r\n class=\"flex flex-col gap-0 overflow-hidden rounded-md border border-surface-200 bg-surface-0\"\r\n >\r\n <h3\r\n class=\"m-0 border-b border-surface-200 bg-surface-50 px-4 py-3 text-lg font-semibold text-color\"\r\n >\r\n {{ t(\"connection-overview\") }}\r\n </h3>\r\n <dl class=\"grid gap-3 p-4 sm:grid-cols-2 xl:grid-cols-3\">\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"connection.provider\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 break-words font-medium text-color\">\r\n {{ provider()?.displayName || details.connection.providerKey }}\r\n </dd>\r\n </div>\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"connection.authentication-mode\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 break-words font-medium text-color\">\r\n {{ authenticationModeLabel() }}\r\n </dd>\r\n </div>\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"used-for-notifications\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 font-medium text-color\">\r\n {{\r\n details.bindings.includes(\"notifications\")\r\n ? t(\"yes\")\r\n : t(\"no\")\r\n }}\r\n </dd>\r\n </div>\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"connection.last-validation\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 font-medium text-color\">\r\n {{\r\n details.connection.lastValidatedAtUtc\r\n ? (details.connection.lastValidatedAtUtc | date: \"medium\")\r\n : \"—\"\r\n }}\r\n </dd>\r\n </div>\r\n <div class=\"rounded-md border border-surface-200 bg-surface-50 p-3\">\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"authorization-state\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 break-words font-medium text-color\">\r\n {{ details.authorizationState || \"—\" }}\r\n </dd>\r\n </div>\r\n @if (details.connection.senderDisplayName) {\r\n <div\r\n class=\"rounded-md border border-surface-200 bg-surface-50 p-3\"\r\n >\r\n <dt class=\"text-xs text-muted-color\">\r\n {{ t(\"connection.sender-display-name\") }}\r\n </dt>\r\n <dd class=\"mb-0 mt-1 break-words font-medium text-color\">\r\n {{ details.connection.senderDisplayName }}\r\n </dd>\r\n </div>\r\n }\r\n </dl>\r\n </section>\r\n\r\n @if (publicConfiguration().length > 0) {\r\n <section\r\n class=\"flex flex-col gap-0 overflow-hidden rounded-md border border-surface-200 bg-surface-0\"\r\n >\r\n <h3\r\n class=\"m-0 border-b border-surface-200 bg-surface-50 px-4 py-3 text-lg font-semibold text-color\"\r\n >\r\n {{ t(\"provider-settings\") }}\r\n </h3>\r\n <dl class=\"grid gap-3 p-4 sm:grid-cols-2 xl:grid-cols-3\">\r\n @for (entry of publicConfiguration(); track entry.key) {\r\n <div\r\n class=\"rounded-md border border-surface-200 bg-surface-50 p-3\"\r\n >\r\n <dt class=\"text-xs text-muted-color\">{{ entry.label }}</dt>\r\n <dd class=\"mb-0 mt-1 break-words font-medium text-color\">\r\n {{ entry.value }}\r\n </dd>\r\n </div>\r\n }\r\n </dl>\r\n </section>\r\n }\r\n\r\n <section\r\n class=\"flex flex-col gap-0 overflow-hidden rounded-md border border-surface-200 bg-surface-0\"\r\n >\r\n <h3\r\n class=\"m-0 border-b border-surface-200 bg-surface-50 px-4 py-3 text-lg font-semibold text-color\"\r\n >\r\n {{ t(\"credential-status\") }}\r\n </h3>\r\n <div class=\"grid gap-3 p-4\">\r\n @for (credential of credentialItems(); track credential.key) {\r\n <div\r\n class=\"grid gap-3 rounded-md border border-surface-200 bg-surface-50 p-3 sm:grid-cols-3 sm:items-center\"\r\n >\r\n <div class=\"min-w-0\">\r\n <p class=\"m-0 break-words font-medium text-color\">\r\n {{ credential.label }}\r\n </p>\r\n <p class=\"mb-0 mt-1 text-xs text-muted-color\">\r\n {{ credential.key }}\r\n </p>\r\n </div>\r\n <div class=\"min-w-0\">\r\n <p class=\"m-0 text-sm font-medium text-color\">\r\n {{ credential.storageLabel }}\r\n </p>\r\n <p class=\"mb-0 mt-1 text-xs text-muted-color\">\r\n @if (credential.lastRotatedAtUtc) {\r\n {{ t(\"last-rotated\") }} ·\r\n {{ credential.lastRotatedAtUtc | date: \"medium\" }}\r\n } @else {\r\n {{ t(\"last-rotated\") }} · —\r\n }\r\n </p>\r\n </div>\r\n <mt-email-delivery-status\r\n class=\"shrink-0 sm:justify-self-end\"\r\n kind=\"support\"\r\n [value]=\"\r\n credential.configured ? 'configured' : 'not-configured'\r\n \"\r\n />\r\n </div>\r\n } @empty {\r\n <p class=\"m-0 text-sm text-muted-color\">\r\n {{ t(\"no-credentials\") }}\r\n </p>\r\n }\r\n </div>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button\r\n [label]=\"t('close')\"\r\n variant=\"outlined\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"close()\"\r\n />\r\n @if (actionMenuItems().length > 0) {\r\n <mt-button\r\n [label]=\"t('actions')\"\r\n icon=\"general.dots-vertical\"\r\n severity=\"secondary\"\r\n variant=\"outlined\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"actionMenu.toggle($event)\"\r\n />\r\n <mt-menu\r\n #actionMenu\r\n [model]=\"actionMenuItems()\"\r\n appendTo=\"body\"\r\n [ariaLabel]=\"t('actions')\"\r\n />\r\n }\r\n <mt-button\r\n [label]=\"t('edit')\"\r\n icon=\"general.edit-01\"\r\n [disabled]=\"!facade.managementAvailable()\"\r\n styleClass=\"w-full sm:w-auto\"\r\n (onClick)=\"edit()\"\r\n />\r\n </div>\r\n } @else {\r\n <div [class]=\"modal.contentClass + ' p-4 sm:p-5'\">\r\n <mt-empty-state illustration=\"none\" [title]=\"t('connection-not-found')\" />\r\n </div>\r\n <div [class]=\"modal.footerClass\">\r\n <mt-button [label]=\"t('close')\" variant=\"outlined\" (onClick)=\"close()\" />\r\n </div>\r\n }\r\n</ng-container>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { EmptyState } from '@masterteam/components/empty-state';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport {\r\n Table,\r\n type ColumnDef,\r\n type TableAction,\r\n} from '@masterteam/components/table';\r\nimport { EmailControlledTestDialog } from '../../dialogs/controlled-test/email-controlled-test-dialog';\r\nimport { getEmailDeliveryStatusMap } from '../../components/email-delivery-status/email-delivery-status';\r\nimport { getApplicableProviderActions } from '../../email-delivery-descriptor.utils';\r\nimport { EmailDeliveryFacade } from '../../email-delivery.facade';\r\nimport { EMAIL_DELIVERY_DRAWER_STYLE_CLASS } from '../../email-delivery.ui';\r\nimport {\r\n EMAIL_DELIVERY_PERMISSIONS,\r\n type EmailConnectionSummary,\r\n} from '../../email-delivery.model';\r\nimport { EmailConnectionDetailsPage } from '../connection-details/email-connection-details';\r\nimport { EmailConnectionEditor } from '../connection-editor/email-connection-editor';\r\n\r\ninterface EmailConnectionTableRow extends EmailConnectionSummary {\r\n providerLabel: string;\r\n usedForNotifications: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-email-delivery-connections',\r\n imports: [TranslocoDirective, Button, EmptyState, Table],\r\n templateUrl: './email-delivery-connections.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailDeliveryConnections {\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly modal = inject(ModalService);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n protected readonly facade = inject(EmailDeliveryFacade);\r\n private readonly activeLanguage = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n\r\n protected readonly canConfigure = computed(() =>\r\n this.facade.hasPermission(EMAIL_DELIVERY_PERMISSIONS.controlPanel),\r\n );\r\n /** One rule for both the caption action and the empty-state action. */\r\n protected readonly canCreate = computed(\r\n () =>\r\n this.canConfigure() &&\r\n this.facade.managementAvailable() &&\r\n this.facade.providers().length > 0,\r\n );\r\n protected readonly rows = computed<EmailConnectionTableRow[]>(() =>\r\n this.facade.connections().map((connection) => ({\r\n ...connection,\r\n providerLabel:\r\n this.facade.providerByKey(connection.providerKey)?.displayName ??\r\n connection.providerKey,\r\n usedForNotifications: connection.bindings.includes('notifications'),\r\n })),\r\n );\r\n protected readonly columns = computed<ColumnDef[]>(() => {\r\n this.activeLanguage();\r\n return [\r\n {\r\n key: 'name',\r\n label: this.t('connection.name'),\r\n sortable: true,\r\n filterConfig: { type: 'text' },\r\n },\r\n {\r\n key: 'providerLabel',\r\n label: this.t('connection.provider'),\r\n width: '18rem',\r\n filterConfig: {\r\n type: 'select',\r\n options: this.facade.providers().map((provider) => ({\r\n label: provider.displayName,\r\n value: provider.displayName,\r\n })),\r\n },\r\n },\r\n {\r\n key: 'senderAddress',\r\n label: this.t('connection.sender'),\r\n width: '18rem',\r\n filterConfig: { type: 'text' },\r\n },\r\n {\r\n key: 'state',\r\n label: this.t('connection.state'),\r\n type: 'status',\r\n width: '15rem',\r\n filterConfig: {\r\n type: 'select',\r\n options: connectionStates.map((state) => ({\r\n label: this.t(`status.connection.${toKebabCase(state)}`),\r\n value: state,\r\n })),\r\n },\r\n statusMap: getEmailDeliveryStatusMap(\r\n 'connection',\r\n this.transloco.translate.bind(this.transloco),\r\n ),\r\n },\r\n {\r\n key: 'usedForNotifications',\r\n label: this.t('in-use'),\r\n type: 'boolean',\r\n width: '10rem',\r\n readonly: true,\r\n filterConfig: { type: 'boolean' },\r\n },\r\n {\r\n key: 'lastValidatedAtUtc',\r\n label: this.t('connection.last-validation'),\r\n type: 'dateTime',\r\n width: '15rem',\r\n },\r\n ];\r\n });\r\n protected readonly rowActions = computed<TableAction[]>(() => {\r\n this.activeLanguage();\r\n return [\r\n {\r\n icon: 'general.eye',\r\n label: this.t('details'),\r\n action: (row) => this.openDetails(row as EmailConnectionSummary),\r\n },\r\n {\r\n icon: 'general.edit-01',\r\n label: this.t('edit'),\r\n hidden: () => !this.canMutate(),\r\n action: (row) => this.openEdit(row as EmailConnectionSummary),\r\n },\r\n {\r\n icon: 'general.check-circle',\r\n label: this.t('validate'),\r\n hidden: (row) =>\r\n !this.canMutate() ||\r\n !this.hasAction(row as EmailConnectionSummary, 'validate'),\r\n loading: () => this.facade.mutationLoading() === 'validate',\r\n action: (row) => this.validate(row as EmailConnectionSummary),\r\n },\r\n {\r\n icon: 'communication.send-01',\r\n label: this.t('test-send'),\r\n hidden: (row) =>\r\n !this.canMutate() ||\r\n !this.hasAction(row as EmailConnectionSummary, 'test-send'),\r\n action: (row) => this.openTest(row as EmailConnectionSummary),\r\n },\r\n {\r\n icon: 'general.link-01',\r\n label: this.t('bind'),\r\n hidden: (row) => {\r\n const connection = row as EmailConnectionSummary;\r\n return (\r\n !this.canMutate() ||\r\n connection.state !== 'Ready' ||\r\n connection.bindings.includes('notifications')\r\n );\r\n },\r\n action: (row) => this.bind(row as EmailConnectionSummary),\r\n },\r\n {\r\n icon: 'general.link-broken-01',\r\n label: this.t('unbind'),\r\n color: 'warn',\r\n hidden: (row) =>\r\n !this.canMutate() ||\r\n !(row as EmailConnectionSummary).bindings.includes('notifications'),\r\n action: (row) => this.confirmUnbind(row as EmailConnectionSummary),\r\n },\r\n {\r\n icon: 'general.trash-01',\r\n label: this.t('delete'),\r\n color: 'danger',\r\n hidden: (row) =>\r\n !this.canMutate() ||\r\n (row as EmailConnectionSummary).bindings.length > 0,\r\n action: (row) => this.confirmDelete(row as EmailConnectionSummary),\r\n },\r\n ];\r\n });\r\n\r\n protected createConnection(): void {\r\n this.openEditor(null);\r\n }\r\n\r\n protected openDetails(connection: EmailConnectionSummary): void {\r\n const drawer = this.modal.openModal(EmailConnectionDetailsPage, 'drawer', {\r\n header: this.t('connection-details'),\r\n styleClass: EMAIL_DELIVERY_DRAWER_STYLE_CLASS,\r\n position: 'end',\r\n appendTo: 'page-content',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { connectionId: connection.id },\r\n });\r\n drawer.onClose.subscribe(() => {\r\n this.facade.loadConnections().subscribe({\r\n error: (error) => this.facade.showError(error),\r\n });\r\n });\r\n }\r\n\r\n protected openEdit(connection: EmailConnectionSummary): void {\r\n this.openEditor(connection.id);\r\n }\r\n\r\n private validate(connection: EmailConnectionSummary): void {\r\n this.facade.validateConnection(connection.id).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n });\r\n }\r\n\r\n private openTest(connection: EmailConnectionSummary): void {\r\n this.modal.openModal(EmailControlledTestDialog, 'dialog', {\r\n header: this.t('test.title'),\r\n styleClass: '!w-[42rem] max-w-[96vw]',\r\n dismissible: true,\r\n inputValues: {\r\n connectionId: connection.id,\r\n connectionName: connection.name,\r\n },\r\n });\r\n }\r\n\r\n private bind(connection: EmailConnectionSummary): void {\r\n this.facade.bindConnection(connection.id).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n });\r\n }\r\n\r\n private confirmUnbind(connection: EmailConnectionSummary): void {\r\n this.confirmationService.confirm({\r\n type: 'dialog',\r\n header: this.t('unbind'),\r\n message: this.t('confirm.unbind'),\r\n accept: () =>\r\n this.facade.unbindConnection(connection.id).subscribe({\r\n error: (error) => this.facade.showError(error),\r\n }),\r\n });\r\n }\r\n\r\n private confirmDelete(connection: EmailConnectionSummary): void {\r\n this.confirmationService.confirmDelete({\r\n type: 'dialog',\r\n message: this.t('confirm.delete'),\r\n accept: () =>\r\n this.facade\r\n .deleteConnection(connection.id, connection.concurrencyToken)\r\n .subscribe({ error: (error) => this.facade.showError(error) }),\r\n });\r\n }\r\n\r\n private canMutate(): boolean {\r\n return this.canConfigure() && this.facade.managementAvailable();\r\n }\r\n\r\n private openEditor(connectionId: string | null): void {\r\n const drawer = this.modal.openModal(EmailConnectionEditor, 'drawer', {\r\n header: this.t(\r\n connectionId ? 'editor.edit-title' : 'editor.create-title',\r\n ),\r\n styleClass: EMAIL_DELIVERY_DRAWER_STYLE_CLASS,\r\n position: 'end',\r\n appendTo: 'page-content',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: { editorConnectionId: connectionId },\r\n });\r\n drawer.onClose.subscribe((saved: boolean) => {\r\n if (!saved) return;\r\n this.facade.loadConnections().subscribe({\r\n error: (error) => this.facade.showError(error),\r\n });\r\n });\r\n }\r\n\r\n private hasAction(\r\n connection: EmailConnectionSummary,\r\n actionKey: string,\r\n ): boolean {\r\n return getApplicableProviderActions(\r\n this.facade.providerByKey(connection.providerKey),\r\n connection.authenticationMode,\r\n ).some((action) => action.key === actionKey);\r\n }\r\n\r\n private t(key: string): string {\r\n return this.transloco.translate(`email-delivery.${key}`);\r\n }\r\n}\r\n\r\nconst connectionStates = [\r\n 'Draft',\r\n 'PendingAuthorization',\r\n 'PendingValidation',\r\n 'Ready',\r\n 'ReauthorizationRequired',\r\n 'ConditionalAccessRequired',\r\n 'Disabled',\r\n 'Invalid',\r\n];\r\n\r\nfunction toKebabCase(value: string): string {\r\n return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery'\">\r\n <section class=\"space-y-4\" aria-label=\"{{ t('connections-title') }}\">\r\n @if (\r\n !facade.statusLoading() &&\r\n !facade.catalogLoading() &&\r\n facade.providers().length === 0\r\n ) {\r\n <mt-empty-state\r\n illustration=\"none\"\r\n [title]=\"t('no-providers-title')\"\r\n [description]=\"t('no-providers-description')\"\r\n />\r\n } @else {\r\n <mt-table\r\n [data]=\"rows()\"\r\n [columns]=\"columns()\"\r\n [rowActions]=\"rowActions()\"\r\n [loading]=\"\r\n facade.statusLoading() ||\r\n facade.connectionsLoading() ||\r\n facade.catalogLoading()\r\n \"\r\n [generalSearch]=\"true\"\r\n [showFilters]=\"true\"\r\n [emptyTitle]=\"t('no-connections-title')\"\r\n [emptyDescription]=\"t('no-connections-description')\"\r\n [emptyActionLabel]=\"canCreate() ? t('create-connection') : undefined\"\r\n emptyActionIcon=\"general.plus\"\r\n filterMode=\"column\"\r\n actionShape=\"popover\"\r\n [clickableRows]=\"true\"\r\n dataKey=\"id\"\r\n storageKey=\"email-delivery-connections\"\r\n (emptyAction)=\"createConnection()\"\r\n (rowClick)=\"openDetails($event)\"\r\n >\r\n <ng-template #captionEnd>\r\n @if (canCreate()) {\r\n <mt-button\r\n [label]=\"t('create-connection')\"\r\n icon=\"general.plus\"\r\n (onClick)=\"createConnection()\"\r\n />\r\n }\r\n </ng-template>\r\n </mt-table>\r\n }\r\n </section>\r\n</ng-container>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n Breadcrumb,\r\n type BreadcrumbItem,\r\n} from '@masterteam/components/breadcrumb';\r\nimport { EmptyState } from '@masterteam/components/empty-state';\r\nimport { Page } from '@masterteam/components/page';\r\nimport type { PageHeaderTab } from '@masterteam/components/page-header';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { Tooltip } from '@masterteam/components/tooltip';\r\nimport { EmailDeliveryStatus } from '../components/email-delivery-status/email-delivery-status';\r\nimport { EmailDeliveryFacade } from '../email-delivery.facade';\r\nimport { EMAIL_DELIVERY_PERMISSIONS } from '../email-delivery.model';\r\nimport { EmailDeliveryActivity } from '../pages/activity/email-delivery-activity';\r\nimport { EmailDeliveryConnections } from '../pages/connections/email-delivery-connections';\r\n\r\ntype EmailDeliveryTab = 'connections' | 'activity';\r\n\r\n@Component({\r\n selector: 'mt-email-delivery-shell',\r\n imports: [\r\n Page,\r\n TranslocoDirective,\r\n Breadcrumb,\r\n EmptyState,\r\n Tooltip,\r\n EmailDeliveryStatus,\r\n EmailDeliveryConnections,\r\n EmailDeliveryActivity,\r\n ],\r\n templateUrl: './email-delivery-shell.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailDeliveryShell implements OnInit {\r\n private readonly route = inject(ActivatedRoute);\r\n private readonly router = inject(Router);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly toast = inject(ToastService);\r\n protected readonly facade = inject(EmailDeliveryFacade);\r\n\r\n private readonly activeLanguage = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n protected readonly activeTab = signal<EmailDeliveryTab>('connections');\r\n protected readonly canView = computed(() =>\r\n this.facade.hasPermission(EMAIL_DELIVERY_PERMISSIONS.controlPanel),\r\n );\r\n protected readonly tabs = computed<PageHeaderTab[]>(() => {\r\n this.activeLanguage();\r\n return [\r\n { label: this.t('tabs.connections'), value: 'connections' },\r\n { label: this.t('tabs.activity'), value: 'activity' },\r\n ];\r\n });\r\n /**\r\n * Same trail the sibling control-panel pages render, so Email Delivery reads\r\n * as part of Product Settings rather than a standalone screen.\r\n */\r\n protected readonly breadcrumbItems = computed<BreadcrumbItem[]>(() => {\r\n this.activeLanguage();\r\n return [\r\n {\r\n label: '',\r\n icon: 'general.home-line',\r\n routerLink: '/control-panel/workspaces',\r\n },\r\n {\r\n label: this.t('breadcrumb.product-settings'),\r\n routerLink: PRODUCT_SETTINGS_ROUTE,\r\n },\r\n { label: this.t('title') },\r\n ];\r\n });\r\n /**\r\n * Readiness moved out of a page-wide banner and onto a chip beside the title.\r\n * The banner's explanation survives as the chip's tooltip, so the reason is\r\n * still one hover away without a block of text above every tab.\r\n */\r\n protected readonly readiness = computed<\r\n 'ready' | 'needs-setup' | 'unavailable' | null\r\n >(() => {\r\n const status = this.facade.status();\r\n if (!status) return null;\r\n if (!status.managementEnabled) return 'unavailable';\r\n return status.isReady ? 'ready' : 'needs-setup';\r\n });\r\n protected readonly readinessHint = computed(() => {\r\n this.activeLanguage();\r\n const status = this.facade.status();\r\n return status ? this.facade.describeCode(status.code) : '';\r\n });\r\n\r\n constructor() {\r\n this.route.queryParamMap.pipe(takeUntilDestroyed()).subscribe((params) => {\r\n this.activeTab.set(\r\n params.get('tab') === 'activity' ? 'activity' : 'connections',\r\n );\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.resolveAccess();\r\n }\r\n\r\n protected retryPermissions(): void {\r\n if (this.facade.permissionsLoading()) return;\r\n this.resolveAccess();\r\n }\r\n\r\n private resolveAccess(): void {\r\n this.facade.loadPermissions(true).subscribe({\r\n next: () => {\r\n if (!this.canView()) return;\r\n this.facade.initialize();\r\n this.syncTabFromUrl();\r\n this.handleAuthorizationCallback();\r\n },\r\n // The error is already on the facade; the template turns it into the\r\n // retryable state rather than the access-denied one.\r\n error: () => undefined,\r\n });\r\n }\r\n\r\n protected onTabChange(value: string | number): void {\r\n if (value !== 'connections' && value !== 'activity') return;\r\n void this.router.navigate([], {\r\n relativeTo: this.route,\r\n queryParams: { tab: value === 'connections' ? null : value },\r\n queryParamsHandling: 'merge',\r\n });\r\n }\r\n\r\n protected goBack(): void {\r\n void this.router.navigate([PRODUCT_SETTINGS_ROUTE]);\r\n }\r\n\r\n private syncTabFromUrl(): void {\r\n this.activeTab.set(\r\n this.route.snapshot.queryParamMap.get('tab') === 'activity'\r\n ? 'activity'\r\n : 'connections',\r\n );\r\n }\r\n\r\n private handleAuthorizationCallback(): void {\r\n const query = this.route.snapshot.queryParamMap;\r\n const authorization = query.get('authorization');\r\n const code = query.get('code');\r\n if (!authorization && !code) return;\r\n\r\n const message = this.facade.describeCode(code);\r\n if (authorization === 'completed') {\r\n this.toast.success(message);\r\n } else {\r\n this.toast.error(message);\r\n }\r\n\r\n const pendingConnectionId =\r\n this.facade.takePendingAuthorizationConnection();\r\n void this.router\r\n .navigate([], {\r\n relativeTo: this.route,\r\n queryParams: { authorization: null, code: null },\r\n queryParamsHandling: 'merge',\r\n replaceUrl: true,\r\n })\r\n .then(() => {\r\n if (!pendingConnectionId) return;\r\n this.facade.loadConnection(pendingConnectionId).subscribe({\r\n next: () => this.facade.loadConnections().subscribe(),\r\n error: (error) => this.facade.showError(error),\r\n });\r\n });\r\n }\r\n\r\n private t(key: string): string {\r\n return this.transloco.translate(`email-delivery.${key}`);\r\n }\r\n}\r\n\r\nconst PRODUCT_SETTINGS_ROUTE = '/control-panel/product-settings';\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery'\">\r\n <mt-page\r\n [title]=\"t('title')\"\r\n avatarIcon=\"communication.mail-01\"\r\n [avatarStyle]=\"{\r\n '--p-avatar-background': 'var(--p-blue-100)',\r\n '--p-avatar-color': 'var(--p-blue-700)',\r\n }\"\r\n [tabs]=\"canView() ? tabs() : []\"\r\n [activeTab]=\"activeTab()\"\r\n contentClass=\"min-h-0 max-[1025px]:p-4 max-[640px]:p-3\"\r\n backButton\r\n (backButtonClick)=\"goBack()\"\r\n (tabChange)=\"onTabChange($event)\"\r\n >\r\n <!-- Declared unconditionally: a content query cannot reach a template that\r\n only exists inside a control-flow block, so the condition lives here. -->\r\n <ng-template #titleEnd>\r\n @if (canView() && readiness(); as state) {\r\n <span class=\"shrink-0\" [mtTooltip]=\"readinessHint()\">\r\n <mt-email-delivery-status kind=\"readiness\" [value]=\"state\" />\r\n </span>\r\n }\r\n </ng-template>\r\n\r\n @if (facade.permissionsLoading()) {\r\n <div class=\"p-6 text-sm text-muted-color\" aria-live=\"polite\">\r\n {{ t(\"access-checking\") }}\r\n </div>\r\n } @else if (canView()) {\r\n <div\r\n class=\"flex min-h-0 flex-col gap-4 [&_.mt-actions-column]:w-[5rem] [&_mt-card]:rounded-md [&_mt-table_:has(>.p-datatable)]:rounded-md\"\r\n >\r\n <mt-breadcrumb\r\n [items]=\"breadcrumbItems()\"\r\n styleClass=\"mx-1 flex justify-start\"\r\n />\r\n\r\n @if (activeTab() === \"activity\") {\r\n <mt-email-delivery-activity />\r\n } @else {\r\n <mt-email-delivery-connections />\r\n }\r\n </div>\r\n } @else if (facade.permissionsError()) {\r\n <!-- A failed access read is not a denial; say so and offer the retry,\r\n otherwise a transient 500 reads as \"you do not have access\". -->\r\n <mt-empty-state\r\n illustration=\"none\"\r\n [title]=\"t('access-error-title')\"\r\n [description]=\"t('access-error-description')\"\r\n [actionLabel]=\"t('access-retry')\"\r\n actionIcon=\"arrow.refresh-cw-01\"\r\n (actionClick)=\"retryPermissions()\"\r\n />\r\n } @else {\r\n <mt-empty-state\r\n illustration=\"none\"\r\n [title]=\"t('access-denied-title')\"\r\n [description]=\"t('access-denied-description')\"\r\n />\r\n }\r\n </mt-page>\r\n</ng-container>\r\n"],"names":["humanizeIdentifier","identifierEntity","i2","toKebabCase","i1"],"mappings":"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"}
|