@masterteam/system-settings 0.0.21 → 0.0.23

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masterteam-system-settings-masterteam-system-settings-C51hZw-Q.mjs","sources":["../../../../packages/masterteam/system-settings/src/lib/system-settings/components/system-settings-general-config-section/system-settings-general-config-section.ts","../../../../packages/masterteam/system-settings/src/lib/system-settings/components/system-settings-general-config-section/system-settings-general-config-section.html","../../../../packages/masterteam/system-settings/src/lib/system-settings/components/system-settings-general-section/system-settings-general-section.ts","../../../../packages/masterteam/system-settings/src/lib/system-settings/components/system-settings-general-section/system-settings-general-section.html","../../../../packages/masterteam/system-settings/src/lib/system-settings/components/system-settings-holiday-editor/system-settings-holiday-editor.ts","../../../../packages/masterteam/system-settings/src/lib/system-settings/components/system-settings-holiday-editor/system-settings-holiday-editor.html","../../../../packages/masterteam/system-settings/src/lib/system-settings/components/system-settings-holidays-section/system-settings-holidays-section.ts","../../../../packages/masterteam/system-settings/src/lib/system-settings/components/system-settings-holidays-section/system-settings-holidays-section.html","../../../../packages/masterteam/system-settings/src/lib/system-settings/components/system-settings-timesheet-section/system-settings-timesheet-section.ts","../../../../packages/masterteam/system-settings/src/lib/system-settings/components/system-settings-timesheet-section/system-settings-timesheet-section.html","../../../../packages/masterteam/system-settings/src/lib/system-settings/system-settings.model.ts","../../../../packages/masterteam/system-settings/src/lib/system-settings/system-settings.storage.ts","../../../../packages/masterteam/system-settings/src/lib/system-settings/system-settings.ts","../../../../packages/masterteam/system-settings/src/lib/system-settings/system-settings.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-delivery.model.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-delivery.config.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-delivery-access.service.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-test.utils.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/components/email-delivery-status/email-delivery-status.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-delivery.api.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-delivery.http-api.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-delivery.facade.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/dialogs/user-test/email-user-test-dialog.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/dialogs/user-test/email-user-test-dialog.html","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-layout.facade.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-design-leave.guard.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-delivery.routes.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/email-layout.model.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/components/email-html-preview/email-html-preview.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/components/email-visual-editor/email-visual-editor.utils.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/components/email-visual-editor/email-visual-editor.ts","../../../../packages/masterteam/system-settings/src/lib/email-delivery/components/email-visual-editor/email-visual-editor.html","../../../../packages/masterteam/system-settings/src/masterteam-system-settings.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { RadioCardsField } from '@masterteam/components/radio-cards-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport type { IconSelectOption } from '../../system-settings.model';\r\n\r\n/**\r\n * \"Experience & Appearance\" — product-wide application behaviour that is not\r\n * tied to a specific feature area: the explore landing view and whether the\r\n * topbar design switcher is offered. More entries are expected here.\r\n */\r\n@Component({\r\n selector: 'mt-system-settings-general-config-section',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n Card,\r\n RadioCardsField,\r\n ToggleField,\r\n ],\r\n templateUrl: './system-settings-general-config-section.html',\r\n styleUrl: './system-settings-general-config-section.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SystemSettingsGeneralConfigSection {\r\n readonly generalConfigurationForm = input.required<FormGroup>();\r\n readonly exploreDefaultViewOptions = input<IconSelectOption[]>([]);\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'system-settings'\">\r\n <mt-card class=\"block\">\r\n <div [formGroup]=\"generalConfigurationForm()\" class=\"space-y-5\">\r\n <div class=\"space-y-1\">\r\n <h4 class=\"text-base font-semibold text-neutral-900\">\r\n {{ t(\"general-configuration-title\") }}\r\n </h4>\r\n <p class=\"text-sm text-neutral-600\">\r\n {{ t(\"general-configuration-description\") }}\r\n </p>\r\n </div>\r\n\r\n <mt-radio-cards-field\r\n formControlName=\"defaultExploreView\"\r\n [options]=\"exploreDefaultViewOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"t('explore-default-view')\"\r\n [hint]=\"t('explore-default-view-hint')\"\r\n [required]=\"true\"\r\n size=\"small\"\r\n />\r\n\r\n <div class=\"space-y-1\">\r\n <mt-toggle-field\r\n formControlName=\"showDesignSwitcher\"\r\n [label]=\"t('design-switcher')\"\r\n />\r\n <p class=\"text-sm text-neutral-600\">\r\n {{ t(\"design-switcher-hint\") }}\r\n </p>\r\n </div>\r\n </div>\r\n </mt-card>\r\n</ng-container>\r\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport type {\r\n IconSelectOption,\r\n SelectOption,\r\n} from '../../system-settings.model';\r\nimport { SystemSettingsGeneralConfigSection } from '../system-settings-general-config-section/system-settings-general-config-section';\r\n\r\n@Component({\r\n selector: 'mt-system-settings-general-section',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n Card,\r\n SelectField,\r\n SystemSettingsGeneralConfigSection,\r\n ],\r\n templateUrl: './system-settings-general-section.html',\r\n styleUrl: './system-settings-general-section.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SystemSettingsGeneralSection {\r\n readonly generalConfigurationForm = input.required<FormGroup>();\r\n readonly timezoneForm = input.required<FormGroup>();\r\n readonly currencyForm = input.required<FormGroup>();\r\n readonly exploreDefaultViewOptions = input<IconSelectOption[]>([]);\r\n readonly dateFormatOptions = input<SelectOption[]>([]);\r\n readonly timeFormatOptions = input<SelectOption[]>([]);\r\n readonly currencyOptions = input<SelectOption[]>([]);\r\n readonly currencyFormatOptions = input<SelectOption[]>([]);\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'system-settings'\">\r\n <div class=\"grid gap-6 xl:grid-cols-3\">\r\n <mt-card class=\"block\">\r\n <div class=\"space-y-4\">\r\n <div class=\"space-y-1\">\r\n <h4 class=\"text-base font-semibold text-neutral-900\">\r\n {{ t(\"date-time-title\") }}\r\n </h4>\r\n <p class=\"text-sm text-neutral-600\">\r\n {{ t(\"date-time-description\") }}\r\n </p>\r\n </div>\r\n\r\n <div [formGroup]=\"timezoneForm()\" class=\"grid gap-4 md:grid-cols-2\">\r\n <mt-select-field\r\n formControlName=\"dateFormat\"\r\n [options]=\"dateFormatOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"t('date-format')\"\r\n [placeholder]=\"t('date-format-placeholder')\"\r\n [required]=\"true\"\r\n />\r\n\r\n <mt-select-field\r\n formControlName=\"timeFormat\"\r\n [options]=\"timeFormatOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"t('time-format')\"\r\n [placeholder]=\"t('time-format-placeholder')\"\r\n [required]=\"true\"\r\n />\r\n </div>\r\n </div>\r\n </mt-card>\r\n\r\n <mt-card class=\"block\">\r\n <div [formGroup]=\"currencyForm()\" class=\"space-y-4\">\r\n <div class=\"space-y-1\">\r\n <h4 class=\"text-base font-semibold text-neutral-900\">\r\n {{ t(\"currency-title\") }}\r\n </h4>\r\n <p class=\"text-sm text-neutral-600\">\r\n {{ t(\"currency-description\") }}\r\n </p>\r\n </div>\r\n\r\n <mt-select-field\r\n formControlName=\"code\"\r\n [options]=\"currencyOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"t('currency')\"\r\n [placeholder]=\"t('currency-placeholder')\"\r\n [required]=\"true\"\r\n />\r\n\r\n <mt-select-field\r\n formControlName=\"format\"\r\n [options]=\"currencyFormatOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"t('currency-format')\"\r\n [placeholder]=\"t('currency-format-placeholder')\"\r\n [required]=\"true\"\r\n />\r\n </div>\r\n </mt-card>\r\n\r\n <mt-system-settings-general-config-section\r\n class=\"block\"\r\n [generalConfigurationForm]=\"generalConfigurationForm()\"\r\n [exploreDefaultViewOptions]=\"exploreDefaultViewOptions()\"\r\n />\r\n </div>\r\n</ng-container>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n AbstractControl,\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n ValidationErrors,\n ValidatorFn,\n Validators,\n} from '@angular/forms';\nimport type { DatePicker } from 'primeng/datepicker';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { Button } from '@masterteam/components/button';\nimport { DateField } from '@masterteam/components/date-field';\nimport { TextField } from '@masterteam/components/text-field';\nimport type { HolidayItem } from '../../system-settings.model';\nimport { ModalService } from '@masterteam/components/modal';\n\ntype HolidayEditorForm = FormGroup<{\n label: FormControl<string>;\n from: FormControl<Date | null>;\n to: FormControl<Date | null>;\n}>;\n\n@Component({\n selector: 'mt-system-settings-holiday-editor',\n imports: [\n ReactiveFormsModule,\n TranslocoDirective,\n Button,\n DateField,\n TextField,\n ],\n templateUrl: './system-settings-holiday-editor.html',\n styleUrl: './system-settings-holiday-editor.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SystemSettingsHolidayEditor {\n private readonly ref = inject(ModalRef);\n modal = inject(ModalService);\n\n readonly holiday = input<HolidayItem | null>(null);\n readonly isEditMode = input(false);\n\n readonly form: HolidayEditorForm = new FormGroup(\n {\n label: new FormControl('', {\n nonNullable: true,\n validators: [Validators.required],\n }),\n from: new FormControl<Date | null>(null, {\n validators: [Validators.required],\n }),\n to: new FormControl<Date | null>(null, {\n validators: [Validators.required],\n }),\n },\n {\n validators: [holidayRangeValidator()],\n },\n );\n\n readonly actionLabel = computed(() =>\n this.isEditMode() ? 'update-holiday' : 'add-holiday',\n );\n\n private readonly fromValue = toSignal(this.form.controls.from.valueChanges, {\n initialValue: this.form.controls.from.value,\n });\n\n readonly toPickerInputs = computed<Partial<DatePicker>>(() => {\n const from = this.fromValue();\n return from instanceof Date ? { minDate: from } : {};\n });\n\n constructor() {\n effect(() => {\n const holiday = this.holiday();\n this.form.reset(\n {\n label: holiday?.label ?? '',\n from: holiday?.from ?? null,\n to: holiday?.to ?? null,\n },\n { emitEvent: false },\n );\n this.form.markAsPristine();\n this.form.markAsUntouched();\n });\n }\n\n onSave(): void {\n this.form.markAllAsTouched();\n if (this.form.invalid) {\n return;\n }\n\n const value = this.form.getRawValue();\n if (!(value.from instanceof Date) || !(value.to instanceof Date)) {\n return;\n }\n\n this.ref.close({\n label: value.label.trim(),\n from: value.from,\n to: value.to,\n } satisfies HolidayItem);\n }\n\n onCancel(): void {\n this.ref.close(null);\n }\n}\n\nfunction holidayRangeValidator(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const from = control.get('from')?.value;\n const to = control.get('to')?.value;\n\n if (!from || !to) {\n return null;\n }\n\n return from <= to ? null : { invalidRange: true };\n };\n}\n","<ng-container *transloco=\"let t; prefix: 'system-settings'\">\n <div [class]=\"' ' + (modal.contentClass || '')\">\n <form [formGroup]=\"form\" class=\"space-y-4 p-3\" (ngSubmit)=\"onSave()\">\n <mt-text-field\n formControlName=\"label\"\n [label]=\"t('holiday-name')\"\n [placeholder]=\"t('holiday-name-placeholder')\"\n [required]=\"true\"\n />\n\n <div class=\"grid gap-4 md:grid-cols-2\">\n <div class=\"grid gap-1\">\n <mt-date-field\n formControlName=\"from\"\n [label]=\"t('from-date')\"\n [placeholder]=\"t('from-date')\"\n [showIcon]=\"true\"\n [required]=\"true\"\n />\n </div>\n\n <div class=\"grid gap-1\">\n <mt-date-field\n formControlName=\"to\"\n [label]=\"t('to-date')\"\n [placeholder]=\"t('to-date')\"\n [showIcon]=\"true\"\n [required]=\"true\"\n [pInputs]=\"toPickerInputs()\"\n />\n </div>\n </div>\n\n @if (form.errors?.[\"invalidRange\"] && (form.dirty || form.touched)) {\n <div class=\"text-sm text-red-600\">\n {{ t(\"holiday-range-error\") }}\n </div>\n }\n </form>\n </div>\n <div [class]=\"modal.footerClass\">\n <mt-button\n [label]=\"t('cancel')\"\n variant=\"outlined\"\n type=\"button\"\n (onClick)=\"onCancel()\"\n />\n <mt-button [label]=\"t(actionLabel())\" type=\"button\" (onClick)=\"onSave()\" />\n </div>\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { Card } from '@masterteam/components/card';\nimport { ColumnDef, Table, TableAction } from '@masterteam/components/table';\nimport type { HolidayTableRow } from '../../system-settings.model';\n\n@Component({\n selector: 'mt-system-settings-holidays-section',\n imports: [TranslocoDirective, Button, Card, Table],\n templateUrl: './system-settings-holidays-section.html',\n styleUrl: './system-settings-holidays-section.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SystemSettingsHolidaysSection {\n private readonly transloco = inject(TranslocoService);\n\n readonly holidays = input<HolidayTableRow[]>([]);\n readonly addHoliday = output<void>();\n readonly editHoliday = output<number>();\n readonly deleteHoliday = output<number>();\n\n readonly columns = computed<ColumnDef[]>(() => [\n {\n key: 'label',\n label: this.transloco.translate('system-settings.holiday-name'),\n },\n {\n key: 'from',\n label: this.transloco.translate('system-settings.from-date'),\n },\n {\n key: 'to',\n label: this.transloco.translate('system-settings.to-date'),\n },\n ]);\n\n readonly rowActions = computed<TableAction[]>(() => [\n {\n icon: 'general.edit-01',\n tooltip: this.transloco.translate('system-settings.edit-holiday'),\n color: 'secondary',\n variant: 'outlined',\n action: (row) => this.editHoliday.emit(row.rowIndex as number),\n },\n {\n icon: 'general.trash-01',\n tooltip: this.transloco.translate('system-settings.remove-holiday'),\n color: 'danger',\n variant: 'outlined',\n action: (row) => this.deleteHoliday.emit(row.rowIndex as number),\n },\n ]);\n\n readonly hasHolidays = computed(() => this.holidays().length > 0);\n}\n","<ng-container *transloco=\"let t; prefix: 'system-settings'\">\n <mt-card class=\"block\">\n <div class=\"space-y-6\">\n <div\n class=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\"\n >\n <div class=\"space-y-1\">\n <h4 class=\"text-base font-semibold text-neutral-900\">\n {{ t(\"holidays-title\") }}\n </h4>\n <p class=\"text-sm text-neutral-600\">\n {{ t(\"holidays-description\") }}\n </p>\n </div>\n\n <mt-button\n [label]=\"t('add-holiday')\"\n icon=\"general.plus\"\n (onClick)=\"addHoliday.emit()\"\n />\n </div>\n\n @if (hasHolidays()) {\n <mt-table\n noCard\n [data]=\"holidays()\"\n [columns]=\"columns()\"\n [rowActions]=\"rowActions()\"\n [generalSearch]=\"false\"\n [showFilters]=\"false\"\n [dataKey]=\"'rowKey'\"\n storageKey=\"admin-system-settings-holidays-table\"\n >\n </mt-table>\n } @else {\n <div\n class=\"rounded-xl border border-dashed border-neutral-300 bg-neutral-50 px-6 py-10 text-center\"\n >\n <h5 class=\"text-base font-semibold text-neutral-900\">\n {{ t(\"no-holidays-title\") }}\n </h5>\n <p class=\"mt-2 text-sm text-neutral-600\">\n {{ t(\"no-holidays-description\") }}\n </p>\n </div>\n }\n </div>\n </mt-card>\n</ng-container>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\r\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoDirective } from '@jsverse/transloco';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { MultiSelectField } from '@masterteam/components/multi-select-field';\r\nimport { NumberField } from '@masterteam/components/number-field';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport type {\r\n SelectOption,\r\n WeekendDayOption,\r\n} from '../../system-settings.model';\r\n\r\n@Component({\r\n selector: 'mt-system-settings-timesheet-section',\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n Card,\r\n MultiSelectField,\r\n NumberField,\r\n SelectField,\r\n ToggleField,\r\n ],\r\n templateUrl: './system-settings-timesheet-section.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SystemSettingsTimeSheetSection {\r\n readonly policyForm = input.required<FormGroup>();\r\n readonly globalWorkingHoursForm = input.required<FormGroup>();\r\n readonly dayOptions = input<WeekendDayOption[]>([]);\r\n readonly frequencyOptions = input<SelectOption[]>([]);\r\n readonly maxDailyBelowDaily = input<boolean>(false);\r\n /**\r\n * Hides the Timesheet Policy card only. Global Working Hours always\r\n * renders - it is host-relevant on its own (working days/hours feed\r\n * scheduling and calendar logic beyond timesheets), so a host without a\r\n * timesheet feature can still configure it.\r\n */\r\n readonly hidePolicy = input<boolean>(false);\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'system-settings'\">\r\n <div\r\n [class]=\"\r\n hidePolicy() ? 'grid gap-6 mb-6' : 'grid gap-6 xl:grid-cols-2 mb-6'\r\n \"\r\n >\r\n @if (!hidePolicy()) {\r\n <mt-card class=\"block\">\r\n <div [formGroup]=\"policyForm()\" class=\"space-y-5\">\r\n <div class=\"space-y-1\">\r\n <h4 class=\"text-base font-semibold text-neutral-900\">\r\n {{ t(\"general-card-title\") }}\r\n </h4>\r\n <p class=\"text-sm text-neutral-600\">\r\n {{ t(\"general-card-description\") }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"grid gap-4 md:grid-cols-2\">\r\n <mt-select-field\r\n formControlName=\"frequency\"\r\n [options]=\"frequencyOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"t('frequency')\"\r\n [placeholder]=\"t('frequency-placeholder')\"\r\n [required]=\"true\"\r\n />\r\n\r\n <mt-number-field\r\n formControlName=\"maxDailyHours\"\r\n [label]=\"t('max-daily-hours')\"\r\n [placeholder]=\"t('max-daily-hours-placeholder')\"\r\n [min]=\"1\"\r\n [max]=\"24\"\r\n [required]=\"true\"\r\n [hint]=\"maxDailyBelowDaily() ? t('max-daily-below-daily') : ''\"\r\n />\r\n\r\n <mt-number-field\r\n formControlName=\"submissionDeadlineDays\"\r\n [label]=\"t('submission-deadline-days')\"\r\n [placeholder]=\"t('submission-deadline-days-placeholder')\"\r\n [min]=\"0\"\r\n [max]=\"90\"\r\n [required]=\"true\"\r\n [hint]=\"t('submission-deadline-hint')\"\r\n />\r\n </div>\r\n\r\n <div class=\"grid gap-3 md:grid-cols-2\">\r\n <mt-toggle-field\r\n formControlName=\"requireDescription\"\r\n [label]=\"t('require-description')\"\r\n />\r\n <mt-toggle-field\r\n formControlName=\"allowFutureEntry\"\r\n [label]=\"t('allow-future-entry')\"\r\n />\r\n <mt-toggle-field\r\n formControlName=\"allowBackdatedEntry\"\r\n [label]=\"t('allow-backdated-entry')\"\r\n />\r\n <mt-toggle-field\r\n formControlName=\"autoLockOnApprove\"\r\n [label]=\"t('auto-lock-on-approve')\"\r\n />\r\n </div>\r\n </div>\r\n </mt-card>\r\n }\r\n\r\n <mt-card class=\"block\">\r\n <div [formGroup]=\"globalWorkingHoursForm()\" class=\"space-y-5\">\r\n <div class=\"space-y-1\">\r\n <h4 class=\"text-base font-semibold text-neutral-900\">\r\n {{ t(\"working-hours-card-title\") }}\r\n </h4>\r\n <p class=\"text-sm text-neutral-600\">\r\n {{ t(\"working-hours-card-description\") }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"grid gap-4 md:grid-cols-2\">\r\n <mt-multi-select-field\r\n class=\"md:col-span-2\"\r\n formControlName=\"workingDays\"\r\n [options]=\"dayOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'dayNumber'\"\r\n [label]=\"t('working-days')\"\r\n [placeholder]=\"t('working-days-placeholder')\"\r\n [display]=\"'chip'\"\r\n [required]=\"true\"\r\n [showClear]=\"true\"\r\n />\r\n\r\n <mt-number-field\r\n class=\"md:col-span-2\"\r\n formControlName=\"hoursPerDay\"\r\n [label]=\"t('daily-working-hours')\"\r\n [placeholder]=\"t('daily-working-hours-placeholder')\"\r\n [min]=\"0\"\r\n [max]=\"24\"\r\n [required]=\"true\"\r\n />\r\n </div>\r\n </div>\r\n </mt-card>\r\n </div>\r\n</ng-container>\r\n","import { FormControl, FormGroup } from '@angular/forms';\r\n\r\nexport type SystemSettingPrimitive = string | number | boolean | null;\r\nexport type SystemSettingObject = Record<string, unknown>;\r\nexport type SystemSettingValue =\r\n | SystemSettingPrimitive\r\n | SystemSettingObject\r\n | unknown[];\r\n\r\nexport interface SystemSetting {\r\n key: string;\r\n label: string;\r\n description: string;\r\n value: SystemSettingValue;\r\n}\r\n\r\nexport interface UpdateSystemSettingItem<TValue = SystemSettingValue> {\r\n key: string;\r\n value: TValue;\r\n}\r\n\r\nexport interface ApiResponse<TData> {\r\n data: TData;\r\n message?: string | null;\r\n endpoint?: string;\r\n status?: number;\r\n code?: number;\r\n locale?: string;\r\n cacheSession?: string | null;\r\n}\r\n\r\nexport interface FormatSchemaOption {\r\n key: string;\r\n sample: string;\r\n isSelected: boolean;\r\n}\r\n\r\nexport interface SystemSettingsFormatSchema {\r\n dateFormats: FormatSchemaOption[];\r\n timeFormats: FormatSchemaOption[];\r\n}\r\n\r\nexport interface HolidayItem {\r\n label: string;\r\n from: Date;\r\n to: Date;\r\n}\r\n\r\nexport interface HolidaysSettingValue extends SystemSettingObject {\r\n data: HolidayItem[];\r\n}\r\n\r\nexport interface TimezoneRegionOption extends SystemSettingObject {\r\n id: string;\r\n baseUtcOffset: string;\r\n standardName: string;\r\n displayName: string;\r\n daylightName: string;\r\n name?: string;\r\n}\r\n\r\nexport interface TimezoneSettingValue extends SystemSettingObject {\r\n region: TimezoneRegionOption | null;\r\n dateFormat: string | null;\r\n timeFormat: string | null;\r\n}\r\n\r\nexport interface CurrencyUnitLabel extends SystemSettingObject {\r\n en: string;\r\n ar: string;\r\n}\r\n\r\nexport interface CurrencySettingValue extends SystemSettingObject {\r\n name: string;\r\n unit: CurrencyUnitLabel;\r\n format: string | null;\r\n}\r\n\r\nexport interface WeekendSettingValue extends SystemSettingObject {\r\n days: number[];\r\n}\r\n\r\n/** The landing view the app-client explore page opens with. */\r\nexport type ExploreDefaultView = 'cards' | 'timeline' | 'table';\r\n\r\n/**\r\n * General Configuration is persisted **inside the existing `Identity` record**\r\n * (the same record `@masterteam/brand-display` owns), not under a key of its own.\r\n * It is therefore a *slice* of `Identity`: reads pick these fields out, and saves\r\n * must spread the untouched `Identity` value around them so no branding data is\r\n * lost. See `GENERAL_CONFIGURATION_SETTING_KEY`.\r\n */\r\nexport interface GeneralConfigurationSettingValue extends SystemSettingObject {\r\n defaultExploreView: ExploreDefaultView;\r\n /**\r\n * Whether the topbar design switcher (Classic / experimental Masterteam DS)\r\n * is offered to users. Off by default — the DS identity is still a beta, so\r\n * a tenant stays on the classic look until an admin opts it in.\r\n */\r\n showDesignSwitcher: boolean;\r\n}\r\n\r\n/** The settings record General Configuration fields live in. */\r\nexport const GENERAL_CONFIGURATION_SETTING_KEY = 'Identity';\r\n\r\nexport type TimeSheetFrequency = 'Daily' | 'Weekly' | 'BiWeekly' | 'Monthly';\r\n\r\nexport interface TimeSheetPolicySettingValue extends SystemSettingObject {\r\n frequency: TimeSheetFrequency;\r\n maxDailyHours: number;\r\n requireDescription: boolean;\r\n allowFutureEntry: boolean;\r\n allowBackdatedEntry: boolean;\r\n autoLockOnApprove: boolean;\r\n submissionDeadlineDays: number;\r\n}\r\n\r\nexport interface GlobalWorkingHoursSettingValue extends SystemSettingObject {\r\n timeZoneId: string;\r\n workingDays: number[];\r\n hoursPerDay: number;\r\n holidays: string[];\r\n}\r\n\r\nexport interface CurrencyCatalogItem {\r\n code: string;\r\n englishLabel: string;\r\n arabicLabel: string;\r\n unit: CurrencyUnitLabel;\r\n}\r\n\r\nexport interface SelectOption {\r\n id: string;\r\n name: string;\r\n isSelected?: boolean;\r\n}\r\n\r\nexport interface WeekendDayOption extends SelectOption {\r\n dayNumber: number;\r\n}\r\n\r\n/** A `SelectOption` rendered as a radio card, so it carries its own icon. */\r\nexport interface IconSelectOption extends SelectOption {\r\n icon: string;\r\n}\r\n\r\nexport interface ScheduleItemTypeOption extends SelectOption {\r\n itemType: string;\r\n}\r\n\r\nexport interface HolidayTableRow {\r\n rowKey: string;\r\n rowIndex: number;\r\n label: string;\r\n from: string;\r\n to: string;\r\n}\r\n\r\nexport interface SystemSettingsSnapshot {\r\n generalConfiguration: GeneralConfigurationSettingValue;\r\n holidays: HolidaysSettingValue;\r\n timezone: TimezoneSettingValue;\r\n currency: CurrencySettingValue;\r\n weekend: WeekendSettingValue;\r\n timeSheetPolicy: TimeSheetPolicySettingValue;\r\n globalWorkingHours: GlobalWorkingHoursSettingValue;\r\n}\r\n\r\nexport type SystemSettingsForm = FormGroup<{\r\n generalConfiguration: FormGroup<{\r\n defaultExploreView: FormControl<ExploreDefaultView>;\r\n showDesignSwitcher: FormControl<boolean>;\r\n }>;\r\n timezone: FormGroup<{\r\n regionId: FormControl<string | null>;\r\n dateFormat: FormControl<string | null>;\r\n timeFormat: FormControl<string | null>;\r\n }>;\r\n currency: FormGroup<{\r\n code: FormControl<string | null>;\r\n format: FormControl<string | null>;\r\n }>;\r\n weekend: FormGroup<{\r\n days: FormControl<number[]>;\r\n }>;\r\n timeSheetPolicy: FormGroup<{\r\n frequency: FormControl<TimeSheetFrequency | null>;\r\n maxDailyHours: FormControl<number | null>;\r\n requireDescription: FormControl<boolean>;\r\n allowFutureEntry: FormControl<boolean>;\r\n allowBackdatedEntry: FormControl<boolean>;\r\n autoLockOnApprove: FormControl<boolean>;\r\n submissionDeadlineDays: FormControl<number | null>;\r\n }>;\r\n globalWorkingHours: FormGroup<{\r\n timeZoneId: FormControl<string | null>;\r\n workingDays: FormControl<number[]>;\r\n hoursPerDay: FormControl<number | null>;\r\n holidaysCsv: FormControl<string>;\r\n }>;\r\n}>;\r\n\r\nexport const FIXED_CURRENCIES: CurrencyCatalogItem[] = [\r\n {\r\n code: 'SAR',\r\n englishLabel: 'Saudi Riyal (SAR)',\r\n arabicLabel: 'ريال سعودي (SAR)',\r\n unit: {\r\n en: 'SAR',\r\n ar: 'ريال سعودي',\r\n },\r\n },\r\n {\r\n code: 'OMR',\r\n englishLabel: 'Omani Rial (OMR)',\r\n arabicLabel: 'ريال عماني (OMR)',\r\n unit: {\r\n en: 'OMR',\r\n ar: 'ريال عماني',\r\n },\r\n },\r\n {\r\n code: 'AED',\r\n englishLabel: 'UAE Dirham (AED)',\r\n arabicLabel: 'درهم إماراتي (AED)',\r\n unit: {\r\n en: 'AED',\r\n ar: 'درهم إماراتي',\r\n },\r\n },\r\n];\r\n\r\n/**\r\n * Explore landing views, mirroring the app-client explore header switcher\r\n * (same icons) so the configured default reads as the same choice.\r\n */\r\nexport const EXPLORE_DEFAULT_VIEW_OPTIONS = [\r\n {\r\n id: 'cards',\r\n translationKey: 'explore-default-view-cards',\r\n icon: 'layout.grid-01',\r\n },\r\n {\r\n id: 'timeline',\r\n translationKey: 'explore-default-view-timeline',\r\n icon: 'time.clock',\r\n },\r\n {\r\n id: 'table',\r\n translationKey: 'explore-default-view-table',\r\n icon: 'layout.table',\r\n },\r\n] as const;\r\n\r\nexport const DEFAULT_GENERAL_CONFIGURATION: GeneralConfigurationSettingValue = {\r\n defaultExploreView: 'cards',\r\n showDesignSwitcher: false,\r\n};\r\n\r\nexport const DEFAULT_DATE_FORMAT_OPTIONS: FormatSchemaOption[] = [\r\n {\r\n key: 'MM/dd/yyyy',\r\n sample: 'MM/dd/yyyy [01/20/2023]',\r\n isSelected: true,\r\n },\r\n {\r\n key: 'yyyy/MM/dd',\r\n sample: 'yyyy/MM/dd [2023/01/20]',\r\n isSelected: false,\r\n },\r\n {\r\n key: 'dd-MM-yyyy',\r\n sample: 'dd-MM-yyyy [20-01-2023]',\r\n isSelected: false,\r\n },\r\n {\r\n key: 'yyyy-MM-dd',\r\n sample: 'yyyy-MM-dd [2023-01-20]',\r\n isSelected: false,\r\n },\r\n];\r\n\r\nexport const DEFAULT_TIME_FORMAT_OPTIONS: FormatSchemaOption[] = [\r\n {\r\n key: 'hh:mm tt',\r\n sample: 'hh:mm tt [03:00 PM]',\r\n isSelected: true,\r\n },\r\n {\r\n key: 'HH:mm',\r\n sample: 'HH:mm [15:00]',\r\n isSelected: false,\r\n },\r\n {\r\n key: 'H:mm:ss',\r\n sample: 'H:mm:ss [15:00:00]',\r\n isSelected: false,\r\n },\r\n {\r\n key: 'hh:mm:ss',\r\n sample: 'hh:mm:ss [03:00:00]',\r\n isSelected: false,\r\n },\r\n];\r\n\r\nexport const WEEKEND_DAY_DEFINITIONS = [\r\n { dayNumber: 1, translationKey: 'monday' },\r\n { dayNumber: 2, translationKey: 'tuesday' },\r\n { dayNumber: 3, translationKey: 'wednesday' },\r\n { dayNumber: 4, translationKey: 'thursday' },\r\n { dayNumber: 5, translationKey: 'friday' },\r\n { dayNumber: 6, translationKey: 'saturday' },\r\n { dayNumber: 7, translationKey: 'sunday' },\r\n] as const;\r\n\r\nexport const DOTNET_DAY_DEFINITIONS = [\r\n { dayNumber: 0, translationKey: 'sunday' },\r\n { dayNumber: 1, translationKey: 'monday' },\r\n { dayNumber: 2, translationKey: 'tuesday' },\r\n { dayNumber: 3, translationKey: 'wednesday' },\r\n { dayNumber: 4, translationKey: 'thursday' },\r\n { dayNumber: 5, translationKey: 'friday' },\r\n { dayNumber: 6, translationKey: 'saturday' },\r\n] as const;\r\n\r\nexport const TIMESHEET_FREQUENCY_OPTIONS = [\r\n { id: 'Daily', translationKey: 'frequency-daily' },\r\n { id: 'Weekly', translationKey: 'frequency-weekly' },\r\n { id: 'BiWeekly', translationKey: 'frequency-biweekly' },\r\n { id: 'Monthly', translationKey: 'frequency-monthly' },\r\n] as const;\r\n\r\nexport const SCHEDULE_ITEM_TYPE_OPTIONS = [\r\n { itemType: 'Task', translationKey: 'schedule-item-task' },\r\n { itemType: 'Milestone', translationKey: 'schedule-item-milestone' },\r\n { itemType: 'Deliverable', translationKey: 'schedule-item-deliverable' },\r\n] as const;\r\n\r\nexport const RATE_SOURCE_OPTIONS = [\r\n { id: 'UserHourlyRate', translationKey: 'rate-source-user-hourly-rate' },\r\n { id: 'None', translationKey: 'rate-source-none' },\r\n] as const;\r\n","import type { SystemSetting } from './system-settings.model';\n\nexport const SYSTEM_SETTINGS_STORAGE_KEY = 'systemSettings.settings';\n\nexport interface SystemSettingsStorage {\n setItem(key: string, value: string): void;\n}\n\nexport function serializeSystemSettings(\n settings: readonly SystemSetting[],\n): string {\n return JSON.stringify(settings);\n}\n\n/**\n * Persists the canonical settings array consumed by host-level formatters.\n * Storage failures must not turn a successful API request into a UI failure.\n */\nexport function synchronizeSystemSettingsStorage(\n storage: SystemSettingsStorage | null,\n settings: readonly SystemSetting[],\n): boolean {\n if (!storage) {\n return false;\n }\n\n try {\n storage.setItem(\n SYSTEM_SETTINGS_STORAGE_KEY,\n serializeSystemSettings(settings),\n );\n return true;\n } catch {\n return false;\n }\n}\n\nexport function resolveBrowserLocalStorage(): SystemSettingsStorage | null {\n try {\n return globalThis.localStorage ?? null;\n } catch {\n return null;\n }\n}\n","import { CommonModule } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n OnInit,\r\n signal,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport {\r\n AbstractControl,\r\n FormControl,\r\n FormGroup,\r\n ReactiveFormsModule,\r\n ValidationErrors,\r\n ValidatorFn,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\r\nimport { Breadcrumb } from '@masterteam/components/breadcrumb';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Page } from '@masterteam/components/page';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport { SkeletonModule } from 'primeng/skeleton';\r\nimport { SystemSettingsGeneralSection } from './components/system-settings-general-section/system-settings-general-section';\r\nimport { SystemSettingsHolidayEditor } from './components/system-settings-holiday-editor/system-settings-holiday-editor';\r\nimport { SystemSettingsHolidaysSection } from './components/system-settings-holidays-section/system-settings-holidays-section';\r\nimport { SystemSettingsTimeSheetSection } from './components/system-settings-timesheet-section/system-settings-timesheet-section';\r\nimport type {\r\n ApiResponse,\r\n CurrencyCatalogItem,\r\n CurrencySettingValue,\r\n ExploreDefaultView,\r\n FormatSchemaOption,\r\n GeneralConfigurationSettingValue,\r\n GlobalWorkingHoursSettingValue,\r\n HolidayItem,\r\n HolidayTableRow,\r\n HolidaysSettingValue,\r\n IconSelectOption,\r\n SelectOption,\r\n SystemSetting,\r\n SystemSettingObject,\r\n SystemSettingsForm,\r\n SystemSettingsFormatSchema,\r\n SystemSettingsSnapshot,\r\n TimeSheetFrequency,\r\n TimeSheetPolicySettingValue,\r\n TimezoneRegionOption,\r\n TimezoneSettingValue,\r\n UpdateSystemSettingItem,\r\n WeekendDayOption,\r\n WeekendSettingValue,\r\n} from './system-settings.model';\r\nimport {\r\n DEFAULT_DATE_FORMAT_OPTIONS,\r\n DEFAULT_GENERAL_CONFIGURATION,\r\n DEFAULT_TIME_FORMAT_OPTIONS,\r\n DOTNET_DAY_DEFINITIONS,\r\n EXPLORE_DEFAULT_VIEW_OPTIONS,\r\n FIXED_CURRENCIES,\r\n GENERAL_CONFIGURATION_SETTING_KEY,\r\n TIMESHEET_FREQUENCY_OPTIONS,\r\n} from './system-settings.model';\r\nimport {\r\n resolveBrowserLocalStorage,\r\n synchronizeSystemSettingsStorage,\r\n} from './system-settings.storage';\r\n\r\n@Component({\r\n selector: 'mt-system-settings',\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n Page,\r\n Button,\r\n Breadcrumb,\r\n SkeletonModule,\r\n SystemSettingsHolidaysSection,\r\n SystemSettingsGeneralSection,\r\n SystemSettingsTimeSheetSection,\r\n ],\r\n templateUrl: './system-settings.html',\r\n styleUrl: './system-settings.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport default class SystemSettings implements OnInit {\r\n private readonly http = inject(HttpClient);\r\n private readonly router = inject(Router);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly modal = inject(ModalService);\r\n private readonly toast = inject(ToastService);\r\n\r\n /**\r\n * Base path for the settings API. Safe to omit from a route's `data`\r\n * even when the host uses `withComponentInputBinding()` - see\r\n * `defaultWhenUndefined`.\r\n */\r\n readonly apiBasePath = input<string, string | undefined>('settings', {\r\n transform: defaultWhenUndefined('settings'),\r\n });\r\n /**\r\n * Route the page's back button navigates to; falsy (including an\r\n * explicit `null`) disables it - see `goBack()`. Safe to omit from a\r\n * route's `data` even when the host uses `withComponentInputBinding()`\r\n * - see `defaultWhenUndefined`.\r\n */\r\n readonly backRoute = input<string | null, string | null | undefined>(\r\n '/control-panel/product-settings',\r\n {\r\n transform: defaultWhenUndefined<string | null>(\r\n '/control-panel/product-settings',\r\n ),\r\n },\r\n );\r\n readonly formatSchema = input<SystemSettingsFormatSchema | null>(null);\r\n /**\r\n * Breadcrumb \"home\" link. `null` renders the crumb as non-navigable.\r\n * Safe to omit from a route's `data` even when the host uses\r\n * `withComponentInputBinding()` - see `defaultWhenUndefined`.\r\n */\r\n readonly homeRoute = input<string | null, string | null | undefined>(\r\n '/control-panel/workspaces',\r\n {\r\n transform: defaultWhenUndefined<string | null>(\r\n '/control-panel/workspaces',\r\n ),\r\n },\r\n );\r\n /**\r\n * Hides the Timesheet Policy card only - Global Working Hours stays\r\n * visible and required, since it's host-relevant on its own (working\r\n * days/hours feed scheduling and calendar logic beyond timesheets).\r\n * TimeSheetPolicy's fields lose their validators and are excluded from\r\n * save diffing while hidden; GlobalWorkingHours is unaffected.\r\n */\r\n readonly hideTimeSheet = input<boolean>(false);\r\n /**\r\n * Restricts which Explore-default-view options are offered. `null` (the\r\n * default) preserves pplus5's original two options (`'cards'`,\r\n * `'timeline'`) - NOT the full catalog, since the catalog now also\r\n * contains `'table'` (added for splus4) and an unset input must not\r\n * silently surface it to hosts that never opted in. Pass the ids\r\n * explicitly (e.g. `['cards', 'table']`, or all three) to get anything\r\n * else.\r\n */\r\n readonly exploreViewOptions = input<ExploreDefaultView[] | null>(null);\r\n\r\n readonly breadcrumbItems = computed<\r\n { label?: string; routerLink?: string; icon?: string }[]\r\n >(() => {\r\n const homeRoute = this.homeRoute();\r\n return [\r\n {\r\n label: '',\r\n icon: 'general.home-line',\r\n ...(homeRoute ? { routerLink: homeRoute } : {}),\r\n },\r\n {\r\n label: this.transloco.translate('product-settings.product-settings'),\r\n routerLink: '/control-panel/product-settings',\r\n },\r\n {\r\n label: this.transloco.translate('system-settings.page-title'),\r\n },\r\n ];\r\n });\r\n\r\n readonly form: SystemSettingsForm = new FormGroup(\r\n {\r\n generalConfiguration: new FormGroup({\r\n defaultExploreView: new FormControl<ExploreDefaultView>('cards', {\r\n nonNullable: true,\r\n validators: [Validators.required],\r\n }),\r\n showDesignSwitcher: new FormControl<boolean>(false, {\r\n nonNullable: true,\r\n }),\r\n }),\r\n timezone: new FormGroup({\r\n regionId: new FormControl<string | null>(null, Validators.required),\r\n dateFormat: new FormControl<string | null>(null, Validators.required),\r\n timeFormat: new FormControl<string | null>(null, Validators.required),\r\n }),\r\n currency: new FormGroup({\r\n code: new FormControl<string | null>(null, Validators.required),\r\n format: new FormControl<string | null>(null, Validators.required),\r\n }),\r\n weekend: new FormGroup({\r\n days: new FormControl<number[]>([], { nonNullable: true }),\r\n }),\r\n timeSheetPolicy: new FormGroup({\r\n frequency: new FormControl<TimeSheetFrequency | null>(\r\n 'Weekly',\r\n TIME_SHEET_FREQUENCY_VALIDATORS,\r\n ),\r\n maxDailyHours: new FormControl<number | null>(\r\n 24,\r\n TIME_SHEET_MAX_DAILY_HOURS_VALIDATORS,\r\n ),\r\n requireDescription: new FormControl(false, { nonNullable: true }),\r\n allowFutureEntry: new FormControl(false, { nonNullable: true }),\r\n allowBackdatedEntry: new FormControl(true, { nonNullable: true }),\r\n autoLockOnApprove: new FormControl(true, { nonNullable: true }),\r\n submissionDeadlineDays: new FormControl<number | null>(\r\n 3,\r\n TIME_SHEET_SUBMISSION_DEADLINE_VALIDATORS,\r\n ),\r\n }),\r\n globalWorkingHours: new FormGroup({\r\n timeZoneId: new FormControl<string | null>(\r\n null,\r\n GLOBAL_WORKING_HOURS_TIMEZONE_VALIDATORS,\r\n ),\r\n workingDays: new FormControl<number[]>([0, 1, 2, 3, 4], {\r\n nonNullable: true,\r\n validators: GLOBAL_WORKING_HOURS_WORKING_DAYS_VALIDATORS,\r\n }),\r\n hoursPerDay: new FormControl<number | null>(\r\n 8,\r\n this.buildHoursPerDayValidators(),\r\n ),\r\n holidaysCsv: new FormControl('', { nonNullable: true }),\r\n }),\r\n },\r\n maxDailyHoursGteHoursPerDay(() => this.hideTimeSheet()),\r\n );\r\n\r\n readonly settings = signal<SystemSetting[] | null>(null);\r\n readonly settingsLoading = signal(false);\r\n readonly settingsError = signal<string | null>(null);\r\n readonly settingsLastUpdated = signal<string | null>(null);\r\n readonly updating = signal(false);\r\n readonly updateError = signal<string | null>(null);\r\n readonly timezones = signal<TimezoneRegionOption[]>([]);\r\n readonly timezonesLoading = signal(false);\r\n readonly timezonesError = signal<string | null>(null);\r\n readonly holidayItems = signal<HolidayItem[]>([]);\r\n readonly initialSnapshot = signal<SystemSettingsSnapshot | null>(null);\r\n readonly hydrationVersion = signal<string | null>(null);\r\n\r\n readonly activeLang = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n readonly formStatus = toSignal(this.form.statusChanges, {\r\n initialValue: this.form.status,\r\n });\r\n readonly selectedDateFormat = toSignal(\r\n this.form.controls.timezone.controls.dateFormat.valueChanges,\r\n {\r\n initialValue: this.form.controls.timezone.controls.dateFormat.value,\r\n },\r\n );\r\n readonly selectedTimeFormat = toSignal(\r\n this.form.controls.timezone.controls.timeFormat.valueChanges,\r\n {\r\n initialValue: this.form.controls.timezone.controls.timeFormat.value,\r\n },\r\n );\r\n readonly selectedCurrencyCode = toSignal(\r\n this.form.controls.currency.controls.code.valueChanges,\r\n {\r\n initialValue: this.form.controls.currency.controls.code.value,\r\n },\r\n );\r\n readonly formValue = toSignal(this.form.valueChanges, {\r\n initialValue: this.form.getRawValue(),\r\n });\r\n\r\n /**\r\n * The `Identity` record. It is shared with `@masterteam/brand-display`, which\r\n * owns every other field in it — we only read/write the General Configuration\r\n * slice and must preserve the rest verbatim.\r\n */\r\n readonly generalConfigurationSetting = computed(() =>\r\n this.findSettingByKey(GENERAL_CONFIGURATION_SETTING_KEY),\r\n );\r\n readonly holidaysSetting = computed(() => this.findSettingByKey('Holidays'));\r\n readonly timezoneSetting = computed(() => this.findSettingByKey('Timezone'));\r\n readonly currencySetting = computed(() => this.findSettingByKey('Currency'));\r\n readonly weekendSetting = computed(() => this.findSettingByKey('Weekend'));\r\n readonly timeSheetPolicySetting = computed(() =>\r\n this.findSettingByKey('TimeSheetPolicy'),\r\n );\r\n readonly globalWorkingHoursSetting = computed(() =>\r\n this.findSettingByKey('GlobalWorkingHours'),\r\n );\r\n\r\n readonly resolvedFormatSchema = computed<SystemSettingsFormatSchema>(() => {\r\n const schema = this.formatSchema();\r\n return {\r\n dateFormats: schema?.dateFormats ?? DEFAULT_DATE_FORMAT_OPTIONS,\r\n timeFormats: schema?.timeFormats ?? DEFAULT_TIME_FORMAT_OPTIONS,\r\n };\r\n });\r\n\r\n readonly dateFormatOptions = computed(() =>\r\n this.mapFormatOptions(\r\n this.resolvedFormatSchema().dateFormats,\r\n this.selectedDateFormat(),\r\n ),\r\n );\r\n\r\n readonly timeFormatOptions = computed(() =>\r\n this.mapFormatOptions(\r\n this.resolvedFormatSchema().timeFormats,\r\n this.selectedTimeFormat(),\r\n ),\r\n );\r\n\r\n readonly currencyOptions = computed<SelectOption[]>(() => {\r\n const lang = this.activeLang();\r\n return FIXED_CURRENCIES.map((currency) => ({\r\n id: currency.code,\r\n name: lang === 'ar' ? currency.arabicLabel : currency.englishLabel,\r\n }));\r\n });\r\n\r\n readonly currencyFormatOptions = computed(() => {\r\n const currency = FIXED_CURRENCIES.find(\r\n (item) => item.code === this.selectedCurrencyCode(),\r\n );\r\n\r\n return this.buildCurrencyFormatOptions(currency);\r\n });\r\n\r\n readonly dotnetDayOptions = computed<WeekendDayOption[]>(() => {\r\n this.activeLang();\r\n\r\n return DOTNET_DAY_DEFINITIONS.map((day) => ({\r\n id: `${day.dayNumber}`,\r\n dayNumber: day.dayNumber,\r\n name: this.transloco.translate(`system-settings.${day.translationKey}`),\r\n }));\r\n });\r\n\r\n /**\r\n * The Explore-default-view ids actually offered, in the fixed catalog's\r\n * order: `exploreViewOptions()` when the host sets it, else the legacy\r\n * pplus5 pair (`DEFAULT_EXPLORE_VIEW_OPTIONS`) - deliberately NOT the full\r\n * `EXPLORE_DEFAULT_VIEW_OPTIONS` catalog, since that now includes `'table'`\r\n * and an unconfigured host must keep seeing exactly what it saw before.\r\n * Filtered against the catalog either way, so an invalid/unknown id in a\r\n * host's list is silently dropped rather than offered. Always non-empty\r\n * unless a host passes an empty array.\r\n */\r\n readonly allowedExploreDefaultViews = computed<ExploreDefaultView[]>(() => {\r\n const configured =\r\n this.exploreViewOptions() ?? DEFAULT_EXPLORE_VIEW_OPTIONS;\r\n const configuredSet = new Set<ExploreDefaultView>(configured);\r\n return EXPLORE_DEFAULT_VIEW_OPTIONS.map((option) => option.id).filter(\r\n (id) => configuredSet.has(id),\r\n );\r\n });\r\n\r\n readonly exploreDefaultViewOptions = computed<IconSelectOption[]>(() => {\r\n this.activeLang();\r\n\r\n const allowed = new Set(this.allowedExploreDefaultViews());\r\n return EXPLORE_DEFAULT_VIEW_OPTIONS.filter((option) =>\r\n allowed.has(option.id),\r\n ).map((option) => ({\r\n id: option.id,\r\n name: this.transloco.translate(\r\n `system-settings.${option.translationKey}`,\r\n ),\r\n icon: option.icon,\r\n }));\r\n });\r\n\r\n readonly frequencyOptions = computed<SelectOption[]>(() => {\r\n this.activeLang();\r\n\r\n return TIMESHEET_FREQUENCY_OPTIONS.map((item) => ({\r\n id: item.id,\r\n name: this.transloco.translate(`system-settings.${item.translationKey}`),\r\n }));\r\n });\r\n\r\n readonly isReady = computed(\r\n () => this.hydrationVersion() !== null && this.initialSnapshot() !== null,\r\n );\r\n\r\n readonly isLoading = computed(\r\n () => this.settingsLoading() || this.timezonesLoading() || !this.isReady(),\r\n );\r\n\r\n readonly hasChanges = computed(() => {\r\n this.formValue();\r\n this.holidayItems();\r\n\r\n const initial = this.initialSnapshot();\r\n if (!initial) {\r\n return false;\r\n }\r\n\r\n const current = this.buildCurrentSnapshot();\r\n if (!current) {\r\n return false;\r\n }\r\n\r\n return (\r\n !this.areEqual(\r\n initial.generalConfiguration,\r\n current.generalConfiguration,\r\n ) ||\r\n !this.areEqual(initial.holidays, current.holidays) ||\r\n !this.areEqual(initial.timezone, current.timezone) ||\r\n !this.areEqual(initial.currency, current.currency) ||\r\n !this.areEqual(initial.weekend, current.weekend) ||\r\n // Mirrors onSave()'s exclusion below: while Timesheet Policy is\r\n // hidden nothing in the UI can change these fields (the card isn't\r\n // rendered), but keeping this guard symmetric with onSave() means\r\n // hasChanges() and the actual save payload can never disagree.\r\n (!this.hideTimeSheet() &&\r\n !this.areEqual(initial.timeSheetPolicy, current.timeSheetPolicy)) ||\r\n !this.areEqual(initial.globalWorkingHours, current.globalWorkingHours)\r\n );\r\n });\r\n\r\n readonly canSaveSettings = computed(\r\n () =>\r\n !this.isLoading() &&\r\n !this.updating() &&\r\n this.formStatus() === 'VALID' &&\r\n this.hasChanges(),\r\n );\r\n\r\n readonly holidayTableRows = computed<HolidayTableRow[]>(() =>\r\n this.holidayItems().map((holiday, index) => ({\r\n rowKey: `${index}`,\r\n rowIndex: index,\r\n label: holiday.label,\r\n from: formatDateOnly(holiday.from),\r\n to: formatDateOnly(holiday.to),\r\n })),\r\n );\r\n\r\n constructor() {\r\n // Only Timesheet Policy is conditionally hidden - Global Working Hours\r\n // keeps its validators unconditionally (set once at construction, see\r\n // the form below), since that card is always visible.\r\n effect(() => {\r\n const hidden = this.hideTimeSheet();\r\n const timeSheetPolicy = this.form.controls.timeSheetPolicy.controls;\r\n\r\n if (hidden) {\r\n timeSheetPolicy.frequency.clearValidators();\r\n timeSheetPolicy.maxDailyHours.clearValidators();\r\n timeSheetPolicy.submissionDeadlineDays.clearValidators();\r\n } else {\r\n timeSheetPolicy.frequency.setValidators(\r\n TIME_SHEET_FREQUENCY_VALIDATORS,\r\n );\r\n timeSheetPolicy.maxDailyHours.setValidators(\r\n TIME_SHEET_MAX_DAILY_HOURS_VALIDATORS,\r\n );\r\n timeSheetPolicy.submissionDeadlineDays.setValidators(\r\n TIME_SHEET_SUBMISSION_DEADLINE_VALIDATORS,\r\n );\r\n }\r\n\r\n for (const control of [\r\n timeSheetPolicy.frequency,\r\n timeSheetPolicy.maxDailyHours,\r\n timeSheetPolicy.submissionDeadlineDays,\r\n ]) {\r\n control.updateValueAndValidity({ emitEvent: false });\r\n }\r\n });\r\n\r\n effect(() => {\r\n const version = [\r\n this.settingsLastUpdated() ?? 'none',\r\n this.settingsError() ?? 'none',\r\n this.timezonesError() ?? 'none',\r\n String(this.timezones().length),\r\n JSON.stringify(this.resolvedFormatSchema()),\r\n ].join('::');\r\n\r\n if (this.settingsLoading() || this.timezonesLoading()) {\r\n return;\r\n }\r\n\r\n if (version === this.hydrationVersion()) {\r\n return;\r\n }\r\n\r\n this.hydrateForm(\r\n this.generalConfigurationSetting() ??\r\n this.createFallbackSetting(GENERAL_CONFIGURATION_SETTING_KEY),\r\n this.holidaysSetting() ?? this.createFallbackSetting('Holidays'),\r\n this.timezoneSetting() ?? this.createFallbackSetting('Timezone'),\r\n this.currencySetting() ?? this.createFallbackSetting('Currency'),\r\n this.weekendSetting() ?? this.createFallbackSetting('Weekend'),\r\n this.timeSheetPolicySetting() ??\r\n this.createFallbackSetting('TimeSheetPolicy'),\r\n this.globalWorkingHoursSetting() ??\r\n this.createFallbackSetting('GlobalWorkingHours'),\r\n );\r\n\r\n this.hydrationVersion.set(version);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.loadSettings();\r\n this.loadTimezones();\r\n }\r\n\r\n goBack(): void {\r\n const backRoute = this.backRoute();\r\n if (!backRoute) {\r\n return;\r\n }\r\n\r\n this.router.navigateByUrl(backRoute);\r\n }\r\n\r\n openAddHoliday(): void {\r\n const modalRef = this.modal.openModal(\r\n SystemSettingsHolidayEditor,\r\n 'dialog',\r\n {\r\n header: this.transloco.translate('system-settings.add-holiday'),\r\n width: '42rem',\r\n appendTo: 'body',\r\n dismissableMask: true,\r\n dismissible: true,\r\n inputValues: {\r\n holiday: null,\r\n isEditMode: false,\r\n },\r\n },\r\n );\r\n\r\n modalRef.onClose.subscribe((result: HolidayItem | null) => {\r\n if (!result) {\r\n return;\r\n }\r\n\r\n this.holidayItems.update((items) => [...items, result]);\r\n });\r\n }\r\n\r\n editHoliday(index: number): void {\r\n const holiday = this.holidayItems()[index];\r\n if (!holiday) {\r\n return;\r\n }\r\n\r\n const modalRef = this.modal.openModal(\r\n SystemSettingsHolidayEditor,\r\n 'drawer',\r\n {\r\n header: this.transloco.translate('system-settings.edit-holiday'),\r\n // Deliberately viewport-fixed (appendTo defaults to 'body', no\r\n // `!absolute` override) - see DynamicDrawerHost.connect(): appending\r\n // anywhere other than 'body' drops the `position: fixed` override,\r\n // and pairing that with a forced `!absolute` used to anchor this\r\n // drawer to #page-content's document position instead of the\r\n // viewport, so it rendered off-screen as soon as the page scrolled\r\n // past Holidays (a card partway down a long Settings page).\r\n styleClass: '!w-[30rem] !shadow-none',\r\n position: 'end',\r\n dismissible: true,\r\n inputValues: {\r\n holiday,\r\n isEditMode: true,\r\n },\r\n },\r\n );\r\n\r\n modalRef.onClose.subscribe((result: HolidayItem | null) => {\r\n if (!result) {\r\n return;\r\n }\r\n\r\n this.holidayItems.update((items) =>\r\n items.map((item, itemIndex) => (itemIndex === index ? result : item)),\r\n );\r\n });\r\n }\r\n\r\n deleteHoliday(index: number): void {\r\n this.holidayItems.update((items) =>\r\n items.filter((_, itemIndex) => itemIndex !== index),\r\n );\r\n }\r\n\r\n onSave(): void {\r\n this.form.markAllAsTouched();\r\n\r\n const nextSnapshot = this.buildCurrentSnapshot();\r\n const initialSnapshot = this.initialSnapshot();\r\n if (!nextSnapshot || !initialSnapshot) {\r\n return;\r\n }\r\n\r\n const values: UpdateSystemSettingItem[] = [];\r\n\r\n if (\r\n !this.areEqual(\r\n initialSnapshot.generalConfiguration,\r\n nextSnapshot.generalConfiguration,\r\n )\r\n ) {\r\n // `Identity` is shared with brand-display and is saved by full\r\n // replacement, so merge our slice onto the record as last loaded instead\r\n // of sending it alone — sending only our fields would wipe the branding.\r\n values.push({\r\n key: GENERAL_CONFIGURATION_SETTING_KEY,\r\n value: {\r\n ...this.getIdentityRecord(),\r\n ...nextSnapshot.generalConfiguration,\r\n },\r\n });\r\n }\r\n\r\n if (!this.areEqual(initialSnapshot.holidays, nextSnapshot.holidays)) {\r\n values.push({\r\n key: 'Holidays',\r\n value: this.serializeHolidaysValue(nextSnapshot.holidays),\r\n });\r\n }\r\n\r\n if (!this.areEqual(initialSnapshot.timezone, nextSnapshot.timezone)) {\r\n values.push({\r\n key: 'Timezone',\r\n value: nextSnapshot.timezone,\r\n });\r\n }\r\n\r\n if (!this.areEqual(initialSnapshot.currency, nextSnapshot.currency)) {\r\n values.push({\r\n key: 'Currency',\r\n value: nextSnapshot.currency,\r\n });\r\n }\r\n\r\n if (!this.areEqual(initialSnapshot.weekend, nextSnapshot.weekend)) {\r\n values.push({\r\n key: 'Weekend',\r\n value: nextSnapshot.weekend,\r\n });\r\n }\r\n\r\n if (\r\n !this.hideTimeSheet() &&\r\n !this.areEqual(\r\n initialSnapshot.timeSheetPolicy,\r\n nextSnapshot.timeSheetPolicy,\r\n )\r\n ) {\r\n values.push({\r\n key: 'TimeSheetPolicy',\r\n value: nextSnapshot.timeSheetPolicy,\r\n });\r\n }\r\n\r\n if (\r\n !this.areEqual(\r\n initialSnapshot.globalWorkingHours,\r\n nextSnapshot.globalWorkingHours,\r\n )\r\n ) {\r\n values.push({\r\n key: 'GlobalWorkingHours',\r\n value: nextSnapshot.globalWorkingHours,\r\n });\r\n }\r\n\r\n if (!values.length) {\r\n this.toast.info(\r\n this.transloco.translate('system-settings.no-changes-message'),\r\n );\r\n return;\r\n }\r\n\r\n this.updateSettings(values);\r\n }\r\n\r\n private loadSettings(): void {\r\n this.settingsLoading.set(true);\r\n this.settingsError.set(null);\r\n\r\n this.http\r\n .get<\r\n ApiResponse<SystemSetting[]>\r\n >(this.buildEndpoint('getsystemsettings'))\r\n .subscribe({\r\n next: (response) => {\r\n const settings = response.data ?? [];\r\n this.settings.set(settings);\r\n synchronizeSystemSettingsStorage(\r\n resolveBrowserLocalStorage(),\r\n settings,\r\n );\r\n this.settingsLoading.set(false);\r\n this.settingsLastUpdated.set(new Date().toISOString());\r\n },\r\n error: (error) => {\r\n this.settingsLoading.set(false);\r\n this.settingsError.set(\r\n error?.message ?? 'Failed to load system settings',\r\n );\r\n this.settingsLastUpdated.set(new Date().toISOString());\r\n },\r\n });\r\n }\r\n\r\n private loadTimezones(): void {\r\n this.timezonesLoading.set(true);\r\n this.timezonesError.set(null);\r\n\r\n this.http\r\n .get<ApiResponse<TimezoneRegionOption[]>>(this.buildEndpoint('timezones'))\r\n .subscribe({\r\n next: (response) => {\r\n this.timezones.set(response.data ?? []);\r\n this.timezonesLoading.set(false);\r\n },\r\n error: (error) => {\r\n this.timezonesLoading.set(false);\r\n this.timezonesError.set(\r\n error?.message ?? 'Failed to load timezone options',\r\n );\r\n },\r\n });\r\n }\r\n\r\n private updateSettings(values: UpdateSystemSettingItem[]): void {\r\n this.updating.set(true);\r\n this.updateError.set(null);\r\n\r\n this.http\r\n .put<ApiResponse<boolean>>(this.buildEndpoint('updatesystemsettings'), {\r\n values,\r\n })\r\n .subscribe({\r\n next: () => {\r\n const nextSettings = this.applyUpdatedSettings(\r\n this.settings() ?? [],\r\n values,\r\n );\r\n this.settings.set(nextSettings);\r\n synchronizeSystemSettingsStorage(\r\n resolveBrowserLocalStorage(),\r\n nextSettings,\r\n );\r\n this.updating.set(false);\r\n this.updateError.set(null);\r\n this.settingsLastUpdated.set(new Date().toISOString());\r\n },\r\n error: (error) => {\r\n this.updating.set(false);\r\n this.updateError.set(\r\n error?.message ?? 'Failed to update system settings',\r\n );\r\n },\r\n });\r\n }\r\n\r\n private hydrateForm(\r\n generalConfigurationSetting: SystemSetting,\r\n holidaysSetting: SystemSetting,\r\n timezoneSetting: SystemSetting,\r\n currencySetting: SystemSetting,\r\n weekendSetting: SystemSetting,\r\n timeSheetPolicySetting: SystemSetting,\r\n globalWorkingHoursSetting: SystemSetting,\r\n ): void {\r\n const generalConfiguration = this.normalizeGeneralConfigurationSnapshot(\r\n this.extractGeneralConfigurationValue(generalConfigurationSetting),\r\n );\r\n const holidays = this.extractHolidaysValue(holidaysSetting);\r\n const timezone = this.normalizeTimezoneSnapshot(\r\n this.extractTimezoneValue(timezoneSetting),\r\n );\r\n const currency = this.normalizeCurrencySnapshot(\r\n this.extractCurrencyValue(currencySetting),\r\n );\r\n const weekend = this.normalizeWeekendSnapshot(\r\n this.extractWeekendValue(weekendSetting),\r\n );\r\n const globalWorkingHours = this.normalizeGlobalWorkingHoursSnapshot(\r\n this.extractGlobalWorkingHoursValue(globalWorkingHoursSetting),\r\n );\r\n const timeSheetPolicy = this.normalizeTimeSheetPolicySnapshot(\r\n this.extractTimeSheetPolicyValue(timeSheetPolicySetting),\r\n globalWorkingHours.hoursPerDay,\r\n );\r\n\r\n this.holidayItems.set(holidays.data);\r\n this.form.controls.generalConfiguration.setValue({\r\n defaultExploreView: generalConfiguration.defaultExploreView,\r\n showDesignSwitcher: generalConfiguration.showDesignSwitcher,\r\n });\r\n this.form.controls.timezone.setValue({\r\n regionId: timezone.region?.id ?? null,\r\n dateFormat: timezone.dateFormat,\r\n timeFormat: timezone.timeFormat,\r\n });\r\n this.form.controls.currency.setValue({\r\n code: this.resolveCurrencyCode(currency),\r\n format: currency.format,\r\n });\r\n this.form.controls.weekend.setValue({\r\n days: weekend.days,\r\n });\r\n this.form.controls.timeSheetPolicy.setValue({\r\n frequency: timeSheetPolicy.frequency,\r\n maxDailyHours: timeSheetPolicy.maxDailyHours,\r\n requireDescription: timeSheetPolicy.requireDescription,\r\n allowFutureEntry: timeSheetPolicy.allowFutureEntry,\r\n allowBackdatedEntry: timeSheetPolicy.allowBackdatedEntry,\r\n autoLockOnApprove: timeSheetPolicy.autoLockOnApprove,\r\n submissionDeadlineDays: timeSheetPolicy.submissionDeadlineDays,\r\n });\r\n this.form.controls.globalWorkingHours.setValue({\r\n timeZoneId: globalWorkingHours.timeZoneId,\r\n workingDays: globalWorkingHours.workingDays,\r\n hoursPerDay: globalWorkingHours.hoursPerDay,\r\n holidaysCsv: globalWorkingHours.holidays.join(', '),\r\n });\r\n\r\n this.form.markAsPristine();\r\n this.form.markAsUntouched();\r\n this.initialSnapshot.set({\r\n generalConfiguration,\r\n holidays,\r\n timezone,\r\n currency,\r\n weekend,\r\n timeSheetPolicy,\r\n globalWorkingHours,\r\n });\r\n }\r\n\r\n private buildCurrentSnapshot(): SystemSettingsSnapshot | null {\r\n const timezone = this.buildTimezoneValue();\r\n const currency = this.buildCurrencyValue();\r\n if (!timezone || !currency || this.form.invalid) {\r\n return null;\r\n }\r\n\r\n return {\r\n generalConfiguration: this.buildGeneralConfigurationValue(),\r\n holidays: {\r\n data: this.holidayItems().map((item) => ({\r\n label: item.label.trim(),\r\n from: item.from,\r\n to: item.to,\r\n })),\r\n },\r\n timezone,\r\n currency,\r\n weekend: this.buildWeekendValue(),\r\n timeSheetPolicy: this.buildTimeSheetPolicyValue(),\r\n globalWorkingHours: this.buildGlobalWorkingHoursValue(),\r\n };\r\n }\r\n\r\n private buildTimezoneValue(): TimezoneSettingValue | null {\r\n const timezoneForm = this.form.controls.timezone.getRawValue();\r\n if (\r\n !timezoneForm.regionId ||\r\n !timezoneForm.dateFormat ||\r\n !timezoneForm.timeFormat\r\n ) {\r\n return null;\r\n }\r\n\r\n const region = this.timezones().find(\r\n (item) => item.id === timezoneForm.regionId,\r\n );\r\n if (!region) {\r\n return null;\r\n }\r\n\r\n return {\r\n region: {\r\n ...region,\r\n name: region.name ?? region.displayName,\r\n },\r\n dateFormat: timezoneForm.dateFormat,\r\n timeFormat: timezoneForm.timeFormat,\r\n };\r\n }\r\n\r\n private buildCurrencyValue(): CurrencySettingValue | null {\r\n const currencyForm = this.form.controls.currency.getRawValue();\r\n if (!currencyForm.code || !currencyForm.format) {\r\n return null;\r\n }\r\n\r\n const currency = FIXED_CURRENCIES.find(\r\n (item) => item.code === currencyForm.code,\r\n );\r\n if (!currency) {\r\n return null;\r\n }\r\n\r\n return {\r\n name: currency.code,\r\n unit: currency.unit,\r\n format: currencyForm.format,\r\n };\r\n }\r\n\r\n /**\r\n * The `Identity` value exactly as last returned by the API (or written by a\r\n * previous save in this session), used as the base every save merges onto so\r\n * branding fields this page does not model survive round-trips.\r\n */\r\n private getIdentityRecord(): SystemSettingObject {\r\n const value = this.generalConfigurationSetting()?.value;\r\n return isRecord(value) ? value : {};\r\n }\r\n\r\n private buildGeneralConfigurationValue(): GeneralConfigurationSettingValue {\r\n return {\r\n defaultExploreView: this.normalizeExploreDefaultView(\r\n this.form.controls.generalConfiguration.controls.defaultExploreView\r\n .value,\r\n ),\r\n showDesignSwitcher:\r\n this.form.controls.generalConfiguration.controls.showDesignSwitcher\r\n .value === true,\r\n };\r\n }\r\n\r\n private buildWeekendValue(): WeekendSettingValue {\r\n return {\r\n days: normalizeWeekendDays(\r\n this.form.controls.weekend.controls.days.value,\r\n ),\r\n };\r\n }\r\n\r\n private buildTimeSheetPolicyValue(): TimeSheetPolicySettingValue {\r\n const policyForm = this.form.controls.timeSheetPolicy.getRawValue();\r\n const hoursPerDay = clampNumber(\r\n this.form.controls.globalWorkingHours.controls.hoursPerDay.value ?? 8,\r\n 0,\r\n 24,\r\n );\r\n return {\r\n frequency: normalizeFrequency(policyForm.frequency),\r\n maxDailyHours: Math.max(\r\n hoursPerDay,\r\n clampNumber(policyForm.maxDailyHours ?? 24, 1, 24),\r\n ),\r\n requireDescription: policyForm.requireDescription,\r\n allowFutureEntry: policyForm.allowFutureEntry,\r\n allowBackdatedEntry: policyForm.allowBackdatedEntry,\r\n autoLockOnApprove: policyForm.autoLockOnApprove,\r\n submissionDeadlineDays: clampNumber(\r\n policyForm.submissionDeadlineDays ?? 0,\r\n 0,\r\n 90,\r\n ),\r\n };\r\n }\r\n\r\n private buildGlobalWorkingHoursValue(): GlobalWorkingHoursSettingValue {\r\n const globalForm = this.form.controls.globalWorkingHours.getRawValue();\r\n return {\r\n timeZoneId: globalForm.timeZoneId ?? 'UTC',\r\n workingDays: normalizeDotnetDays(globalForm.workingDays),\r\n hoursPerDay: clampNumber(globalForm.hoursPerDay ?? 8, 0, 24),\r\n holidays: parseCsv(globalForm.holidaysCsv),\r\n };\r\n }\r\n\r\n /**\r\n * Built via a method (not a module-level constant like the other\r\n * GlobalWorkingHours/TimeSheet validator arrays) because\r\n * `greaterThanZeroValidator` needs `this.transloco` to resolve its message\r\n * - safe to call from the `form` field initializer since `transloco` is\r\n * declared and `inject()`-ed earlier in the class body and field\r\n * initializers run in declaration order.\r\n */\r\n private buildHoursPerDayValidators(): ValidatorFn[] {\r\n return [\r\n Validators.required,\r\n greaterThanZeroValidator(() =>\r\n this.transloco.translate(\r\n 'system-settings.daily-working-hours-min-message',\r\n ),\r\n ),\r\n Validators.max(24),\r\n ];\r\n }\r\n\r\n private findSettingByKey(key: string): SystemSetting | null {\r\n const normalizedKey = key.trim().toLowerCase();\r\n return (\r\n this.settings()?.find(\r\n (setting) => setting.key.trim().toLowerCase() === normalizedKey,\r\n ) ?? null\r\n );\r\n }\r\n\r\n private extractGeneralConfigurationValue(\r\n setting: SystemSetting,\r\n ): GeneralConfigurationSettingValue {\r\n if (!isRecord(setting.value)) {\r\n return { ...DEFAULT_GENERAL_CONFIGURATION };\r\n }\r\n\r\n return {\r\n defaultExploreView: this.normalizeExploreDefaultView(\r\n setting.value['defaultExploreView'] ??\r\n setting.value['DefaultExploreView'],\r\n ),\r\n showDesignSwitcher: normalizeShowDesignSwitcher(\r\n setting.value['showDesignSwitcher'] ??\r\n setting.value['ShowDesignSwitcher'],\r\n ),\r\n };\r\n }\r\n\r\n private extractHolidaysValue(setting: SystemSetting): HolidaysSettingValue {\r\n if (!isRecord(setting.value)) {\r\n return { data: [] };\r\n }\r\n\r\n const rawData = setting.value['data'];\r\n if (!Array.isArray(rawData)) {\r\n return { data: [] };\r\n }\r\n\r\n return {\r\n data: rawData\r\n .map((item) => this.normalizeHolidayItem(item))\r\n .filter((item): item is HolidayItem => item !== null),\r\n };\r\n }\r\n\r\n private extractTimezoneValue(setting: SystemSetting): TimezoneSettingValue {\r\n if (!isRecord(setting.value)) {\r\n return {\r\n region: null,\r\n dateFormat: null,\r\n timeFormat: null,\r\n };\r\n }\r\n\r\n return {\r\n region: this.normalizeTimezoneRegion(\r\n setting.value['region'] ?? setting.value['Region'],\r\n ),\r\n dateFormat: getNullableString(\r\n setting.value['dateFormat'] ??\r\n setting.value['DateFormat'] ??\r\n setting.value['dateformat'],\r\n ),\r\n timeFormat: getNullableString(\r\n setting.value['timeFormat'] ??\r\n setting.value['TimeFormat'] ??\r\n setting.value['timeformat'],\r\n ),\r\n };\r\n }\r\n\r\n private extractCurrencyValue(setting: SystemSetting): CurrencySettingValue {\r\n if (!isRecord(setting.value)) {\r\n return this.getDefaultCurrencyValue();\r\n }\r\n\r\n return {\r\n name: getString(setting.value['name']) ?? FIXED_CURRENCIES[0].code,\r\n unit: this.normalizeCurrencyUnit(setting.value['unit']),\r\n format: getNullableString(setting.value['format']),\r\n };\r\n }\r\n\r\n private extractWeekendValue(setting: SystemSetting): WeekendSettingValue {\r\n if (!isRecord(setting.value)) {\r\n return { days: [] };\r\n }\r\n\r\n return {\r\n days: normalizeWeekendDays(\r\n setting.value['days'] ?? setting.value['Days'],\r\n ),\r\n };\r\n }\r\n\r\n private extractTimeSheetPolicyValue(\r\n setting: SystemSetting,\r\n ): TimeSheetPolicySettingValue {\r\n if (!isRecord(setting.value)) {\r\n return this.getDefaultTimeSheetPolicyValue();\r\n }\r\n\r\n const value = setting.value;\r\n const defaults = this.getDefaultTimeSheetPolicyValue();\r\n return {\r\n frequency: normalizeFrequency(value['frequency'] ?? value['Frequency']),\r\n maxDailyHours:\r\n getNumber(value['maxDailyHours'] ?? value['MaxDailyHours']) ??\r\n defaults.maxDailyHours,\r\n requireDescription:\r\n getBoolean(\r\n value['requireDescription'] ?? value['RequireDescription'],\r\n ) ?? defaults.requireDescription,\r\n allowFutureEntry:\r\n getBoolean(value['allowFutureEntry'] ?? value['AllowFutureEntry']) ??\r\n defaults.allowFutureEntry,\r\n allowBackdatedEntry:\r\n getBoolean(\r\n value['allowBackdatedEntry'] ?? value['AllowBackdatedEntry'],\r\n ) ?? defaults.allowBackdatedEntry,\r\n autoLockOnApprove:\r\n getBoolean(value['autoLockOnApprove'] ?? value['AutoLockOnApprove']) ??\r\n defaults.autoLockOnApprove,\r\n submissionDeadlineDays:\r\n getNumber(\r\n value['submissionDeadlineDays'] ?? value['SubmissionDeadlineDays'],\r\n ) ?? defaults.submissionDeadlineDays,\r\n };\r\n }\r\n\r\n private extractGlobalWorkingHoursValue(\r\n setting: SystemSetting,\r\n ): GlobalWorkingHoursSettingValue {\r\n if (!isRecord(setting.value)) {\r\n return this.getDefaultGlobalWorkingHoursValue();\r\n }\r\n\r\n const value = setting.value;\r\n const defaults = this.getDefaultGlobalWorkingHoursValue();\r\n return {\r\n timeZoneId:\r\n getString(value['timeZoneId'] ?? value['TimeZoneId']) ??\r\n defaults.timeZoneId,\r\n workingDays:\r\n getNumberArray(value['workingDays'] ?? value['WorkingDays']) ??\r\n defaults.workingDays,\r\n hoursPerDay:\r\n getNumber(value['hoursPerDay'] ?? value['HoursPerDay']) ??\r\n defaults.hoursPerDay,\r\n holidays:\r\n getStringArray(value['holidays'] ?? value['Holidays']) ??\r\n defaults.holidays,\r\n };\r\n }\r\n\r\n private normalizeHolidayItem(value: unknown): HolidayItem | null {\r\n if (!isRecord(value)) {\r\n return null;\r\n }\r\n\r\n const label = getString(value['label'] ?? value['name']);\r\n const from = normalizeDateInput(value['from']);\r\n const to = normalizeDateInput(value['to']);\r\n if (!label || !from || !to) {\r\n return null;\r\n }\r\n\r\n return { label, from, to };\r\n }\r\n\r\n private normalizeTimezoneRegion(value: unknown): TimezoneRegionOption | null {\r\n if (typeof value === 'string' && value.trim()) {\r\n const normalizedValue = value.trim().toLowerCase();\r\n const region =\r\n this.timezones().find(\r\n (item) => item.id.trim().toLowerCase() === normalizedValue,\r\n ) ?? null;\r\n\r\n return region\r\n ? {\r\n ...region,\r\n name: region.name ?? region.displayName,\r\n }\r\n : null;\r\n }\r\n\r\n if (!isRecord(value)) {\r\n return null;\r\n }\r\n\r\n const id = getString(value['id'] ?? value['Id']);\r\n if (!id) {\r\n return null;\r\n }\r\n\r\n const matchedRegion = this.timezones().find(\r\n (item) => item.id.trim().toLowerCase() === id.trim().toLowerCase(),\r\n );\r\n\r\n if (matchedRegion) {\r\n return {\r\n ...matchedRegion,\r\n name:\r\n getString(value['name'] ?? value['Name']) ??\r\n matchedRegion.name ??\r\n matchedRegion.displayName,\r\n };\r\n }\r\n\r\n const standardName =\r\n getString(value['standardName'] ?? value['StandardName']) ?? id;\r\n const displayName =\r\n getString(value['displayName'] ?? value['DisplayName']) ?? id;\r\n\r\n return {\r\n id,\r\n baseUtcOffset:\r\n getString(value['baseUtcOffset'] ?? value['BaseUtcOffset']) ?? '',\r\n standardName,\r\n displayName,\r\n daylightName:\r\n getString(value['daylightName'] ?? value['DaylightName']) ??\r\n standardName,\r\n name: getString(value['name'] ?? value['Name']) ?? displayName,\r\n };\r\n }\r\n\r\n private normalizeCurrencyUnit(value: unknown): CurrencySettingValue['unit'] {\r\n if (!isRecord(value)) {\r\n return FIXED_CURRENCIES[0].unit;\r\n }\r\n\r\n return {\r\n en: getString(value['en']) ?? FIXED_CURRENCIES[0].unit.en,\r\n ar: getString(value['ar']) ?? FIXED_CURRENCIES[0].unit.ar,\r\n };\r\n }\r\n\r\n private normalizeGeneralConfigurationSnapshot(\r\n value: GeneralConfigurationSettingValue,\r\n ): GeneralConfigurationSettingValue {\r\n return {\r\n defaultExploreView: this.normalizeExploreDefaultView(\r\n value.defaultExploreView,\r\n ),\r\n showDesignSwitcher: normalizeShowDesignSwitcher(value.showDesignSwitcher),\r\n };\r\n }\r\n\r\n /**\r\n * Resolves a stored/incoming value against the currently allowed Explore\r\n * views (`allowedExploreDefaultViews()`), not the full static catalog, so a\r\n * host-restricted `exploreViewOptions` is enforced on both hydration and\r\n * save. Falls back to the first allowed option - not a hardcoded 'cards' -\r\n * since a host may configure a subset that excludes it.\r\n */\r\n private normalizeExploreDefaultView(value: unknown): ExploreDefaultView {\r\n const allowed = this.allowedExploreDefaultViews();\r\n if (allowed.some((id) => id === value)) {\r\n return value as ExploreDefaultView;\r\n }\r\n\r\n return allowed[0] ?? DEFAULT_GENERAL_CONFIGURATION.defaultExploreView;\r\n }\r\n\r\n private normalizeTimezoneSnapshot(\r\n value: TimezoneSettingValue,\r\n ): TimezoneSettingValue {\r\n const defaults = this.getDefaultTimezoneValue();\r\n return {\r\n region: value.region ?? defaults.region,\r\n dateFormat: value.dateFormat ?? defaults.dateFormat,\r\n timeFormat: value.timeFormat ?? defaults.timeFormat,\r\n };\r\n }\r\n\r\n private normalizeCurrencySnapshot(\r\n value: CurrencySettingValue,\r\n ): CurrencySettingValue {\r\n const code = this.resolveCurrencyCode(value);\r\n const currency =\r\n FIXED_CURRENCIES.find((item) => item.code === code) ??\r\n FIXED_CURRENCIES[0];\r\n const defaultFormat =\r\n this.buildCurrencyFormatOptions(currency)[0]?.id ?? null;\r\n\r\n return {\r\n name: currency.code,\r\n unit: currency.unit,\r\n format: value.format ?? defaultFormat,\r\n };\r\n }\r\n\r\n private normalizeWeekendSnapshot(\r\n value: WeekendSettingValue,\r\n ): WeekendSettingValue {\r\n return {\r\n days: normalizeWeekendDays(value.days),\r\n };\r\n }\r\n\r\n private normalizeTimeSheetPolicySnapshot(\r\n value: TimeSheetPolicySettingValue,\r\n hoursPerDay: number,\r\n ): TimeSheetPolicySettingValue {\r\n return {\r\n frequency: normalizeFrequency(value.frequency),\r\n maxDailyHours: Math.max(\r\n clampNumber(hoursPerDay, 0, 24),\r\n clampNumber(value.maxDailyHours, 1, 24),\r\n ),\r\n requireDescription: value.requireDescription,\r\n allowFutureEntry: value.allowFutureEntry,\r\n allowBackdatedEntry: value.allowBackdatedEntry,\r\n autoLockOnApprove: value.autoLockOnApprove,\r\n submissionDeadlineDays: clampNumber(value.submissionDeadlineDays, 0, 90),\r\n };\r\n }\r\n\r\n private normalizeGlobalWorkingHoursSnapshot(\r\n value: GlobalWorkingHoursSettingValue,\r\n ): GlobalWorkingHoursSettingValue {\r\n const defaults = this.getDefaultGlobalWorkingHoursValue();\r\n return {\r\n timeZoneId: value.timeZoneId || defaults.timeZoneId,\r\n workingDays: normalizeDotnetDays(value.workingDays),\r\n hoursPerDay: clampNumber(value.hoursPerDay, 0, 24),\r\n holidays: value.holidays,\r\n };\r\n }\r\n\r\n private createFallbackSetting(\r\n key:\r\n | 'Identity'\r\n | 'Holidays'\r\n | 'Timezone'\r\n | 'Currency'\r\n | 'Weekend'\r\n | 'TimeSheetPolicy'\r\n | 'GlobalWorkingHours',\r\n ): SystemSetting {\r\n switch (key) {\r\n case 'Identity':\r\n return {\r\n key,\r\n label: key,\r\n description: key,\r\n value: { ...DEFAULT_GENERAL_CONFIGURATION },\r\n };\r\n case 'Holidays':\r\n return { key, label: key, description: key, value: { data: [] } };\r\n case 'Timezone':\r\n return {\r\n key,\r\n label: key,\r\n description: key,\r\n value: this.getDefaultTimezoneValue(),\r\n };\r\n case 'Currency':\r\n return {\r\n key,\r\n label: key,\r\n description: key,\r\n value: this.getDefaultCurrencyValue(),\r\n };\r\n case 'Weekend':\r\n return { key, label: key, description: key, value: { days: [] } };\r\n case 'TimeSheetPolicy':\r\n return {\r\n key,\r\n label: key,\r\n description: key,\r\n value: this.getDefaultTimeSheetPolicyValue(),\r\n };\r\n case 'GlobalWorkingHours':\r\n return {\r\n key,\r\n label: key,\r\n description: key,\r\n value: this.getDefaultGlobalWorkingHoursValue(),\r\n };\r\n }\r\n }\r\n\r\n private getDefaultTimezoneValue(): TimezoneSettingValue {\r\n const region = this.timezones()[0] ?? null;\r\n const defaultDateFormat =\r\n this.dateFormatOptions().find((option) => option.isSelected)?.id ??\r\n this.dateFormatOptions()[0]?.id ??\r\n null;\r\n const defaultTimeFormat =\r\n this.timeFormatOptions().find((option) => option.isSelected)?.id ??\r\n this.timeFormatOptions()[0]?.id ??\r\n null;\r\n\r\n return {\r\n region: region\r\n ? {\r\n ...region,\r\n name: region.name ?? region.displayName,\r\n }\r\n : null,\r\n dateFormat: defaultDateFormat,\r\n timeFormat: defaultTimeFormat,\r\n };\r\n }\r\n\r\n private getDefaultCurrencyValue(): CurrencySettingValue {\r\n const currency = FIXED_CURRENCIES[0];\r\n return {\r\n name: currency.code,\r\n unit: currency.unit,\r\n format: this.buildCurrencyFormatOptions(currency)[0]?.id ?? null,\r\n };\r\n }\r\n\r\n private getDefaultTimeSheetPolicyValue(): TimeSheetPolicySettingValue {\r\n return {\r\n frequency: 'Weekly',\r\n maxDailyHours: 24,\r\n requireDescription: false,\r\n allowFutureEntry: false,\r\n allowBackdatedEntry: true,\r\n autoLockOnApprove: true,\r\n submissionDeadlineDays: 3,\r\n };\r\n }\r\n\r\n private getDefaultGlobalWorkingHoursValue(): GlobalWorkingHoursSettingValue {\r\n return {\r\n timeZoneId: this.timezones()[0]?.id ?? 'UTC',\r\n workingDays: [0, 1, 2, 3, 4],\r\n hoursPerDay: 8,\r\n holidays: [],\r\n };\r\n }\r\n\r\n private resolveCurrencyCode(value: CurrencySettingValue): string {\r\n const candidates = [value.name, value.unit.en, value.unit.ar].filter(\r\n (candidate): candidate is string => !!candidate,\r\n );\r\n\r\n for (const candidate of candidates) {\r\n const normalizedCandidate = candidate.trim().toLowerCase();\r\n const extractedCode =\r\n candidate.match(/\\(([A-Za-z]{3})\\)/)?.[1]?.toUpperCase() ?? null;\r\n if (extractedCode) {\r\n const directCodeMatch = FIXED_CURRENCIES.find(\r\n (item) => item.code === extractedCode,\r\n );\r\n\r\n if (directCodeMatch) {\r\n return directCodeMatch.code;\r\n }\r\n }\r\n\r\n const match = FIXED_CURRENCIES.find(\r\n (item) =>\r\n item.code.toLowerCase() === normalizedCandidate ||\r\n item.englishLabel.toLowerCase() === normalizedCandidate ||\r\n item.arabicLabel.toLowerCase() === normalizedCandidate ||\r\n item.unit.en.toLowerCase() === normalizedCandidate ||\r\n item.unit.ar.toLowerCase() === normalizedCandidate,\r\n );\r\n\r\n if (match) {\r\n return match.code;\r\n }\r\n }\r\n\r\n return FIXED_CURRENCIES[0].code;\r\n }\r\n\r\n private mapFormatOptions(\r\n options: FormatSchemaOption[],\r\n selectedKey: string | null,\r\n ): SelectOption[] {\r\n // Read active language so the label re-translates on language switch.\r\n this.activeLang();\r\n return options.map((option) => ({\r\n id: option.key,\r\n name: this.formatOptionLabel(option.key),\r\n isSelected: selectedKey ? option.key === selectedKey : option.isSelected,\r\n }));\r\n }\r\n\r\n /**\r\n * Builds a localized, human-readable label for a date/time format key by\r\n * translating each format token (e.g. `dd-MM-yyyy` → `يوم-شهر-سنة`) while\r\n * preserving the original separators. Unknown characters are left as-is.\r\n *\r\n * `H` (24-hour) and `h` (12-hour) map to distinct translation keys -\r\n * NOT the same `format-token-hour` key. They used to share one key, which\r\n * made 'H:mm:ss' and 'hh:mm:ss' render as the identical label\r\n * \"Hour:Minute:Second\" despite submitting genuinely different backend\r\n * values (`H:mm:ss` vs `hh:mm:ss`), so an admin had no way to tell the two\r\n * Time Format options apart before selecting one.\r\n */\r\n private formatOptionLabel(formatKey: string): string {\r\n const tokenKeyByLetter: Record<string, string> = {\r\n y: 'format-token-year',\r\n M: 'format-token-month',\r\n d: 'format-token-day',\r\n H: 'format-token-hour-24',\r\n h: 'format-token-hour-12',\r\n m: 'format-token-minute',\r\n s: 'format-token-second',\r\n t: 'format-token-period',\r\n };\r\n\r\n return formatKey.replace(/y+|M+|d+|H+|h+|m+|s+|t+/g, (token) => {\r\n const translationKey = tokenKeyByLetter[token[0]];\r\n return translationKey\r\n ? this.transloco.translate(`system-settings.${translationKey}`)\r\n : token;\r\n });\r\n }\r\n\r\n private serializeHolidaysValue(value: HolidaysSettingValue): {\r\n data: Array<{ label: string; from: string; to: string }>;\r\n } {\r\n return {\r\n data: value.data.map((item) => ({\r\n label: item.label,\r\n from: formatDateOnly(item.from),\r\n to: formatDateOnly(item.to),\r\n })),\r\n };\r\n }\r\n\r\n private buildCurrencyFormatOptions(\r\n currency: CurrencyCatalogItem | undefined,\r\n ): SelectOption[] {\r\n const unitLabel = this.getCurrencyFormatLabel(currency);\r\n\r\n return [\r\n { id: '{0:0}', name: `1000 ${unitLabel}` },\r\n { id: '{0:0.0}', name: `1000.0 ${unitLabel}` },\r\n { id: '{0:0.00}', name: `1000.00 ${unitLabel}` },\r\n { id: '{0:#,0}', name: `1,000 ${unitLabel}` },\r\n { id: '{0:#,0.0}', name: `1,000.0 ${unitLabel}` },\r\n { id: '{0:#,0.00}', name: `1,000.00 ${unitLabel}` },\r\n { id: '{0:#,0, K}', name: `1 K ${unitLabel}` },\r\n // Was `1,000 N3 ${unitLabel}` - a leftover placeholder that pasted the\r\n // .NET format specifier itself into the label instead of what it\r\n // renders. N3 = thousands-separated with 3 decimal places, matching\r\n // the `{0:#,0.00}` entry above's convention of writing out the actual\r\n // formatted example rather than the format code.\r\n { id: '{0:N3}', name: `1,000.000 ${unitLabel}` },\r\n ];\r\n }\r\n\r\n private getCurrencyFormatLabel(\r\n currency: CurrencyCatalogItem | undefined,\r\n ): string {\r\n if (!currency) {\r\n return '';\r\n }\r\n\r\n return this.activeLang() === 'ar' ? currency.unit.ar : currency.unit.en;\r\n }\r\n\r\n private buildEndpoint(path: string): string {\r\n return `${this.apiBasePath().replace(/\\/$/, '')}/${path}`;\r\n }\r\n\r\n private applyUpdatedSettings(\r\n settings: SystemSetting[],\r\n values: UpdateSystemSettingItem[],\r\n ): SystemSetting[] {\r\n const valueMap = new Map(values.map((item) => [item.key, item.value]));\r\n const nextSettings: SystemSetting[] = settings.map((setting) => {\r\n if (!valueMap.has(setting.key)) {\r\n return setting;\r\n }\r\n\r\n return {\r\n ...setting,\r\n value: valueMap.get(setting.key)!,\r\n };\r\n });\r\n\r\n const existingKeys = new Set(nextSettings.map((setting) => setting.key));\r\n\r\n for (const item of values) {\r\n if (existingKeys.has(item.key)) {\r\n continue;\r\n }\r\n\r\n nextSettings.push({\r\n key: item.key,\r\n label: item.key,\r\n description: item.key,\r\n value: item.value,\r\n });\r\n }\r\n\r\n return nextSettings.sort((left, right) =>\r\n left.key.localeCompare(right.key),\r\n );\r\n }\r\n\r\n private areEqual(left: unknown, right: unknown): boolean {\r\n return JSON.stringify(left) === JSON.stringify(right);\r\n }\r\n}\r\n\r\nfunction isRecord(value: unknown): value is SystemSettingObject {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction getString(value: unknown): string | null {\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n const normalizedValue = value.trim();\r\n return normalizedValue ? normalizedValue : null;\r\n}\r\n\r\nfunction getNullableString(value: unknown): string | null {\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n return value.trim() || null;\r\n}\r\n\r\nfunction getNullableNumber(value: unknown): number | null {\r\n if (typeof value === 'number' && !Number.isNaN(value)) {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string' && value.trim()) {\r\n const parsedValue = Number(value);\r\n return Number.isNaN(parsedValue) ? null : parsedValue;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction getNumber(value: unknown): number | null {\r\n return getNullableNumber(value);\r\n}\r\n\r\nfunction getBoolean(value: unknown): boolean | null {\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n\r\n if (typeof value === 'string') {\r\n const normalizedValue = value.trim().toLowerCase();\r\n if (normalizedValue === 'true') {\r\n return true;\r\n }\r\n if (normalizedValue === 'false') {\r\n return false;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction getStringArray(value: unknown): string[] | null {\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n\r\n return value\r\n .map((item) => (typeof item === 'string' ? item.trim() : ''))\r\n .filter(Boolean);\r\n}\r\n\r\nfunction getNumberArray(value: unknown): number[] | null {\r\n if (!Array.isArray(value)) {\r\n return null;\r\n }\r\n\r\n return value\r\n .map((item) => (typeof item === 'number' ? item : Number(item)))\r\n .filter((item) => Number.isInteger(item));\r\n}\r\n\r\n/**\r\n * The design switcher is opt-in, so anything that is not an explicit `true`\r\n * (or the string a settings record may round-trip it as) reads as hidden.\r\n */\r\nfunction normalizeShowDesignSwitcher(value: unknown): boolean {\r\n return value === true || value === 'true' || value === 'True';\r\n}\r\n\r\nfunction normalizeWeekendDays(value: unknown): number[] {\r\n if (!Array.isArray(value)) {\r\n return [];\r\n }\r\n\r\n return value\r\n .map((item) => (typeof item === 'number' ? item : Number(item)))\r\n .filter((item) => Number.isInteger(item) && item >= 1 && item <= 7)\r\n .sort((left, right) => left - right);\r\n}\r\n\r\nfunction normalizeDotnetDays(value: unknown): number[] {\r\n if (!Array.isArray(value)) {\r\n return [];\r\n }\r\n\r\n return Array.from(\r\n new Set(\r\n value\r\n .map((item) => (typeof item === 'number' ? item : Number(item)))\r\n .filter((item) => Number.isInteger(item) && item >= 0 && item <= 6),\r\n ),\r\n ).sort((left, right) => left - right);\r\n}\r\n\r\nfunction clampNumber(value: number, min: number, max: number): number {\r\n if (!Number.isFinite(value)) {\r\n return min;\r\n }\r\n\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nconst TIMESHEET_FREQUENCIES: readonly TimeSheetFrequency[] = [\r\n 'Daily',\r\n 'Weekly',\r\n 'BiWeekly',\r\n 'Monthly',\r\n];\r\n\r\nfunction normalizeFrequency(value: unknown): TimeSheetFrequency {\r\n return typeof value === 'string' &&\r\n (TIMESHEET_FREQUENCIES as readonly string[]).includes(value)\r\n ? (value as TimeSheetFrequency)\r\n : 'Weekly';\r\n}\r\n\r\n/**\r\n * Restores an input's own default when the router's `withComponentInputBinding()`\r\n * wipes it. That feature calls `setInput(name, data[name])` for every\r\n * declared input on every route activation - including inputs a route's\r\n * `data` doesn't mention at all, which writes `undefined` and permanently\r\n * overwrites the `input()`'s own default the moment the route activates\r\n * (see `RoutedComponentInputBinder` in `@angular/router`). This substitutes\r\n * the fallback only for that specific \"the router didn't supply it\" case.\r\n *\r\n * Deliberately narrower than `delegations-list.ts`'s `defaultRouteInput`,\r\n * which also collapses an explicit `null` into the fallback: `homeRoute`'s\r\n * `null` is a meaningful, tested value (\"non-navigable crumb\"), not merely\r\n * \"unset\", so this only special-cases `undefined` and passes every other\r\n * value - including `null` - through untouched.\r\n */\r\nfunction defaultWhenUndefined<T>(fallback: T): (value: T | undefined) => T {\r\n return (value) => (value === undefined ? fallback : value);\r\n}\r\n\r\n/**\r\n * pplus5's original Explore-default-view offering, before `'table'` was\r\n * added to the catalog for splus4. This - not the full catalog - is what an\r\n * unset `exploreViewOptions` input resolves to, so existing hosts keep\r\n * seeing exactly the two options they always have.\r\n */\r\nconst DEFAULT_EXPLORE_VIEW_OPTIONS: readonly ExploreDefaultView[] = [\r\n 'cards',\r\n 'timeline',\r\n];\r\n\r\n/**\r\n * Named validator sets for the six Timesheet/GlobalWorkingHours fields, kept\r\n * as constants so `hideTimeSheet` can restore the exact original validators\r\n * on toggle-back rather than re-declaring them inline in two places.\r\n */\r\nconst TIME_SHEET_FREQUENCY_VALIDATORS = [Validators.required];\r\nconst TIME_SHEET_MAX_DAILY_HOURS_VALIDATORS = [\r\n Validators.required,\r\n Validators.min(1),\r\n Validators.max(24),\r\n];\r\nconst TIME_SHEET_SUBMISSION_DEADLINE_VALIDATORS = [\r\n Validators.required,\r\n Validators.min(0),\r\n Validators.max(90),\r\n];\r\nconst GLOBAL_WORKING_HOURS_TIMEZONE_VALIDATORS = [Validators.required];\r\nconst GLOBAL_WORKING_HOURS_WORKING_DAYS_VALIDATORS = [Validators.required];\r\n\r\n/**\r\n * `hoursPerDay` (\"Daily Working Hours\") needs an *exclusive* lower bound -\r\n * `0` itself must be rejected, unlike every other range on this page which\r\n * uses Angular's inclusive `Validators.min`. There's no built-in \"greater\r\n * than\" validator, and reusing `Validators.min(0)`'s error would render the\r\n * wrong message (\"must be at least 0\" on a control that just rejected 0), so\r\n * this returns a distinct `dailyWorkingHoursMin` error carrying its own\r\n * pre-translated `.message` - `ErrorMessagePipe` prefers a `.message` on the\r\n * error object over its generic per-key translations (see\r\n * `field-validation/error-message.pipe.ts`), so no changes are needed there\r\n * or to its shared i18n keys.\r\n *\r\n * Mirrors `Validators.min`'s own null-handling: an empty control is left to\r\n * `Validators.required` rather than also failing this check.\r\n */\r\nfunction greaterThanZeroValidator(message: () => string): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const value = control.value;\r\n if (value === null || value === undefined || value === '') {\r\n return null;\r\n }\r\n\r\n return typeof value === 'number' && value > 0\r\n ? null\r\n : { dailyWorkingHoursMin: { min: 0, message: message() } };\r\n };\r\n}\r\n\r\n/**\r\n * Cross-field validator comparing `timeSheetPolicy.maxDailyHours` against\r\n * `globalWorkingHours.hoursPerDay`. Takes the `hideTimeSheet` input as a\r\n * thunk (rather than reading it directly) so it stays a plain module-level\r\n * function while still skipping the comparison when Timesheet Policy is\r\n * hidden - Global Working Hours stays visible/editable on its own even\r\n * then, and a visible `hoursPerDay` must never be blocked by a comparison\r\n * against a `maxDailyHours` the user can no longer see or change.\r\n */\r\nfunction maxDailyHoursGteHoursPerDay(\r\n isTimeSheetHidden: () => boolean,\r\n): ValidatorFn {\r\n return (group: AbstractControl): ValidationErrors | null => {\r\n if (isTimeSheetHidden()) {\r\n return null;\r\n }\r\n\r\n const maxDailyHours = group.get('timeSheetPolicy.maxDailyHours')?.value;\r\n const hoursPerDay = group.get('globalWorkingHours.hoursPerDay')?.value;\r\n\r\n if (\r\n typeof maxDailyHours === 'number' &&\r\n typeof hoursPerDay === 'number' &&\r\n maxDailyHours < hoursPerDay\r\n ) {\r\n return { maxDailyBelowDaily: true };\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n\r\nfunction parseCsv(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\nfunction normalizeDateInput(value: unknown): Date | null {\r\n if (value instanceof Date) {\r\n if (Number.isNaN(value.getTime())) {\r\n return null;\r\n }\r\n\r\n return createLocalDate(\r\n value.getFullYear(),\r\n value.getMonth() + 1,\r\n value.getDate(),\r\n );\r\n }\r\n\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n\r\n const normalizedValue = value.trim();\r\n if (!normalizedValue) {\r\n return null;\r\n }\r\n\r\n const dateOnlyMatch = normalizedValue.match(/^(\\d{4})[-/](\\d{2})[-/](\\d{2})/);\r\n if (dateOnlyMatch) {\r\n const [, year, month, day] = dateOnlyMatch;\r\n return createLocalDate(Number(year), Number(month), Number(day));\r\n }\r\n\r\n const parsedDate = new Date(normalizedValue);\r\n if (Number.isNaN(parsedDate.getTime())) {\r\n return null;\r\n }\r\n\r\n return createLocalDate(\r\n parsedDate.getFullYear(),\r\n parsedDate.getMonth() + 1,\r\n parsedDate.getDate(),\r\n );\r\n}\r\n\r\nfunction createLocalDate(year: number, month: number, day: number): Date {\r\n return new Date(year, month - 1, day, 12, 0, 0, 0);\r\n}\r\n\r\nfunction formatDateOnly(value: Date): string {\r\n const year = value.getFullYear();\r\n const month = String(value.getMonth() + 1).padStart(2, '0');\r\n const day = String(value.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'system-settings'\">\r\n <mt-page\r\n [title]=\"t('page-title')\"\r\n [avatarIcon]=\"'general.settings-02'\"\r\n [avatarStyle]=\"{\r\n '--p-avatar-background': 'var(--p-emerald-100)',\r\n '--p-avatar-color': 'var(--p-emerald-700)',\r\n }\"\r\n (backButtonClick)=\"goBack()\"\r\n backButton\r\n >\r\n <div class=\"flex flex-col gap-3\">\r\n <div\r\n class=\"flex flex-col gap-4 md:flex-row md:items-end md:justify-between\"\r\n >\r\n <div>\r\n <h3 class=\"text-lg font-bold text-neutral-900\">\r\n {{ t(\"page-title\") }}\r\n </h3>\r\n <mt-breadcrumb\r\n [items]=\"breadcrumbItems()\"\r\n [styleClass]=\"'flex justify-start mx-1'\"\r\n />\r\n </div>\r\n\r\n <mt-button\r\n [label]=\"t('save')\"\r\n icon=\"general.save-01\"\r\n [tooltip]=\"t('save-tooltip')\"\r\n [badge]=\"hasChanges() ? '!' : ''\"\r\n badgeSeverity=\"warn\"\r\n [loading]=\"updating()\"\r\n [disabled]=\"!canSaveSettings()\"\r\n (onClick)=\"onSave()\"\r\n />\r\n </div>\r\n\r\n @if (isLoading()) {\r\n <div class=\"space-y-4\">\r\n <p-skeleton width=\"100%\" height=\"12rem\" borderRadius=\"0.75rem\" />\r\n <p-skeleton width=\"100%\" height=\"18rem\" borderRadius=\"0.75rem\" />\r\n <p-skeleton width=\"100%\" height=\"14rem\" borderRadius=\"0.75rem\" />\r\n </div>\r\n } @else {\r\n <!--\r\n BE/HTTP errors (timezonesError, settingsError, updateError) are already\r\n surfaced as toasts by the HTTP interceptor, so they are intentionally\r\n not rendered as top-of-page banners here to avoid duplicate messaging.\r\n -->\r\n <div class=\"space-y-6\">\r\n <mt-system-settings-general-section\r\n [generalConfigurationForm]=\"form.controls.generalConfiguration\"\r\n [timezoneForm]=\"form.controls.timezone\"\r\n [currencyForm]=\"form.controls.currency\"\r\n [exploreDefaultViewOptions]=\"exploreDefaultViewOptions()\"\r\n [dateFormatOptions]=\"dateFormatOptions()\"\r\n [timeFormatOptions]=\"timeFormatOptions()\"\r\n [currencyOptions]=\"currencyOptions()\"\r\n [currencyFormatOptions]=\"currencyFormatOptions()\"\r\n />\r\n\r\n <mt-system-settings-timesheet-section\r\n [policyForm]=\"form.controls.timeSheetPolicy\"\r\n [globalWorkingHoursForm]=\"form.controls.globalWorkingHours\"\r\n [dayOptions]=\"dotnetDayOptions()\"\r\n [frequencyOptions]=\"frequencyOptions()\"\r\n [maxDailyBelowDaily]=\"form.errors?.['maxDailyBelowDaily'] ?? false\"\r\n [hidePolicy]=\"hideTimeSheet()\"\r\n />\r\n\r\n <mt-system-settings-holidays-section\r\n [holidays]=\"holidayTableRows()\"\r\n (addHoliday)=\"openAddHoliday()\"\r\n (editHoliday)=\"editHoliday($event)\"\r\n (deleteHoliday)=\"deleteHoliday($event)\"\r\n />\r\n </div>\r\n }\r\n </div>\r\n </mt-page>\r\n</ng-container>\r\n","export const EMAIL_DELIVERY_PERMISSIONS = {\r\n controlPanel: 'CONTROL_PANEL',\r\n} as const;\r\n\r\nexport type EmailDeliveryPermission =\r\n (typeof EMAIL_DELIVERY_PERMISSIONS)[keyof typeof EMAIL_DELIVERY_PERMISSIONS];\r\n\r\nexport interface EmailDeliveryOptions {\r\n apiBasePath: string;\r\n notificationApiBasePath: string;\r\n currentUserAccessibilitiesApiPath: string;\r\n permissionKeys: readonly string[];\r\n}\r\n\r\nexport interface EmailDeliveryAccessibility {\r\n moduleKey: string;\r\n}\r\n\r\nexport interface EmailProviderAuthenticationModeDescriptor {\r\n key: string;\r\n displayName: string;\r\n requiredPermissionKeys: string[];\r\n requiresInteractiveAuthorization: boolean;\r\n requiresAdministratorConsent: boolean;\r\n}\r\n\r\nexport interface EmailProviderFieldDescriptor {\r\n key: string;\r\n displayName: string;\r\n dataType: string;\r\n maximumLength: number;\r\n required: boolean;\r\n isSecret: boolean;\r\n authenticationModes: string[];\r\n storageClass: string;\r\n allowedValues: string[] | null;\r\n editableAfterAuthorization: boolean;\r\n changeRevokesAuthorization: boolean;\r\n defaultValue: string | null;\r\n}\r\n\r\nexport interface EmailProviderActionDescriptor {\r\n key: string;\r\n displayName: string;\r\n authenticationModes: string[];\r\n authorizationModels: string[] | null;\r\n isInteractive: boolean;\r\n isExecutable: boolean;\r\n}\r\n\r\nexport interface EmailProviderDescriptor {\r\n key: string;\r\n displayName: string;\r\n category: string;\r\n authenticationModes: EmailProviderAuthenticationModeDescriptor[];\r\n fields: EmailProviderFieldDescriptor[];\r\n capabilities: string;\r\n warnings: string[];\r\n contractVersion: number;\r\n actions: EmailProviderActionDescriptor[] | null;\r\n}\r\n\r\nexport interface EmailErrorCatalogEntry {\r\n code: string;\r\n category: string;\r\n httpStatus: number;\r\n retryable: boolean;\r\n readinessImpact: string;\r\n frontendAction: string;\r\n auditClassification: string;\r\n}\r\n\r\nexport interface EmailDeliveryProblem {\r\n code: string;\r\n category: string;\r\n retryable: boolean;\r\n action: string;\r\n readinessImpact: string;\r\n correlationId: string;\r\n retryAfterSeconds: number | null;\r\n}\r\n\r\nexport interface EmailDeliveryStatus {\r\n enabled: boolean;\r\n configurationMode: string;\r\n managementEnabled: boolean;\r\n purpose: string;\r\n isReady: boolean;\r\n code: string;\r\n contractVersion: number;\r\n}\r\n\r\nexport interface EmailConnectionSummary {\r\n id: string;\r\n name: string;\r\n providerKey: string;\r\n authenticationMode: string;\r\n senderAddress: string;\r\n state: string;\r\n bindings: string[];\r\n lastValidationCode: string | null;\r\n lastValidatedAtUtc: string | null;\r\n concurrencyToken: string;\r\n}\r\n\r\nexport interface EmailConnectionRecord {\r\n id: string;\r\n scope: { value: string };\r\n name: string;\r\n providerKey: string;\r\n authenticationMode: string;\r\n senderAddress: string;\r\n senderDisplayName: string | null;\r\n publicConfiguration: Record<string, string>;\r\n state: string;\r\n lastValidationCode: string | null;\r\n lastValidatedAtUtc: string | null;\r\n lastSuccessfulSendAtUtc: string | null;\r\n concurrencyToken: string;\r\n version: number;\r\n lastSuccessfulTestAtUtc: string | null;\r\n lastSuccessfulTestFingerprint: string | null;\r\n}\r\n\r\nexport interface EmailCredentialStatus {\r\n key: string;\r\n configured: boolean;\r\n storageKind: string;\r\n lastRotatedAtUtc: string | null;\r\n fingerprint: string | null;\r\n}\r\n\r\nexport interface EmailConnectionDetails {\r\n connection: EmailConnectionRecord;\r\n bindings: string[];\r\n credentials: EmailCredentialStatus[];\r\n authorizationState: string | null;\r\n verifiedProviderUserId: string | null;\r\n verifiedAuthorizedMailbox: string | null;\r\n}\r\n\r\nexport type EmailCredentialOperation = 'omitted' | 'replace' | 'clear';\r\nexport type EmailCredentialStorageKind =\r\n | 'protected-value'\r\n | 'external-reference';\r\n\r\nexport interface EmailCredentialMutation {\r\n key: string;\r\n operation: EmailCredentialOperation;\r\n storageKind: EmailCredentialStorageKind;\r\n value: string | null;\r\n externalReference: string | null;\r\n}\r\n\r\nexport interface EmailConnectionCreateRequest {\r\n name: string;\r\n providerKey: string;\r\n authenticationMode: string;\r\n senderAddress: string;\r\n senderDisplayName: string | null;\r\n publicConfiguration: Record<string, string>;\r\n credentials: EmailCredentialMutation[];\r\n}\r\n\r\nexport interface EmailConnectionUpdateRequest extends EmailConnectionCreateRequest {\r\n concurrencyToken: string;\r\n}\r\n\r\nexport interface EmailConnectionValidationResult {\r\n isValid: boolean;\r\n code: string;\r\n requiresReauthorization: boolean;\r\n diagnostics: EmailSafeDiagnostic[] | null;\r\n}\r\n\r\nexport interface EmailSafeDiagnostic {\r\n code: string;\r\n safeValue: string | null;\r\n}\r\n\r\nexport interface EmailConnectionTestRequest {\r\n testRequestId: string;\r\n recipients: string[];\r\n subject: string;\r\n body: string;\r\n isHtml: boolean;\r\n}\r\n\r\nexport interface EmailSendResult {\r\n outcome: string;\r\n providerKey: string;\r\n code: string;\r\n canRetrySafely: boolean;\r\n retryAfter: string | null;\r\n providerRequestId: string | null;\r\n providerMessageId: string | null;\r\n diagnostics: EmailSafeDiagnostic[] | null;\r\n readinessUpdated: boolean | null;\r\n readinessCode: string | null;\r\n}\r\n\r\nexport interface EmailConnectionTestResult {\r\n testRequestId: string;\r\n connectionId: string;\r\n requestState: string;\r\n result: EmailSendResult | null;\r\n}\r\n\r\nexport interface EmailAuthorizationStartResult {\r\n authorizationUrl: string;\r\n expiresAtUtc: string;\r\n code: string;\r\n}\r\n\r\nexport interface EmailDeliveryAttempt {\r\n id: string;\r\n operationKey: string;\r\n correlationId: string;\r\n scope: { value: string };\r\n purpose: { value: string };\r\n templateId: number;\r\n recipientFingerprint: string;\r\n status: string;\r\n attemptCount: number;\r\n outcome: string | null;\r\n resultCode: string | null;\r\n providerRequestId: string | null;\r\n canRetrySafely: boolean | null;\r\n providerRetryAfterUtc: string | null;\r\n providerInvocationStarted: boolean;\r\n nextAttemptAtUtc: string | null;\r\n leaseId: string | null;\r\n leaseExpiresAtUtc: string | null;\r\n createdAtUtc: string;\r\n updatedAtUtc: string;\r\n concurrencyToken: string;\r\n invocationSequence: number;\r\n providerResultCapturedAtUtc: string | null;\r\n resultReconciliationUntilUtc: string | null;\r\n outcomeInferred: boolean;\r\n replayGeneration: number;\r\n operationKind: string;\r\n hostWorkReference: {\r\n hostKey: string;\r\n workId: string;\r\n sourceId: string | null;\r\n } | null;\r\n rescheduleSequence: number;\r\n testRequestId: string | null;\r\n providerKey: string | null;\r\n providerMessageId: string | null;\r\n diagnostics: EmailSafeDiagnostic[] | null;\r\n providerRetryAfterSeconds: number | null;\r\n hasQuarantinedResultEvidence: boolean;\r\n quarantinedResultItemId: string | null;\r\n resultQuarantinedAtUtc: string | null;\r\n resultQuarantineErrorCode: string | null;\r\n acknowledgedResultItemId: string | null;\r\n resultAcknowledgedAtUtc: string | null;\r\n}\r\n\r\nexport interface EmailAttemptPage {\r\n items: EmailDeliveryAttempt[];\r\n nextCursor: string | null;\r\n}\r\n\r\nexport interface EmailAttemptReplayRequest {\r\n concurrencyToken: string;\r\n exceptionalOverride: boolean;\r\n reason: string | null;\r\n}\r\n\r\nexport interface EmailAttemptReplayResult {\r\n attempt: EmailDeliveryAttempt;\r\n workSchedulingState: string;\r\n auditState: string;\r\n workCommandId: string;\r\n auditCommandId: string;\r\n}\r\n\r\nexport interface EmailFinalizationQuarantineItem {\r\n itemId: string;\r\n attemptId: string | null;\r\n leaseId: string | null;\r\n invocationSequence: number | null;\r\n capturedAtUtc: string;\r\n quarantinedAtUtc: string;\r\n schemaVersion: number | null;\r\n errorCode: string;\r\n recoveryClassification: string;\r\n scope: string | null;\r\n purpose: string | null;\r\n cursor: string | null;\r\n evidenceOccurrenceId: string | null;\r\n}\r\n\r\nexport interface EmailFinalizationQuarantinePage {\r\n items: EmailFinalizationQuarantineItem[];\r\n hasMore: boolean;\r\n nextCursor: string | null;\r\n}\r\n\r\nexport interface EmailHostEvidenceItem {\r\n itemId: string;\r\n evidenceKind: string;\r\n errorCode: string;\r\n detectedAtUtc: string;\r\n attemptId: string | null;\r\n scope: string | null;\r\n purpose: string | null;\r\n canRepair: boolean;\r\n canExport: boolean;\r\n leaseId: string | null;\r\n invocationSequence: number | null;\r\n resolutionState: string;\r\n reconciliationAttempts: number;\r\n lastReconciliationAtUtc: string | null;\r\n cursor: string | null;\r\n ownershipState: string | null;\r\n storedScope: string | null;\r\n storedPurpose: string | null;\r\n storedLeaseId: string | null;\r\n storedInvocationSequence: number | null;\r\n storedStatus: string | null;\r\n storedQuarantinedItemId: string | null;\r\n evidenceOccurrenceId: string | null;\r\n decisionToken: string | null;\r\n}\r\n\r\nexport interface EmailHostEvidencePage {\r\n items: EmailHostEvidenceItem[];\r\n hasMore: boolean;\r\n nextCursor: string | null;\r\n scanBudgetExhausted: boolean;\r\n}\r\n\r\nexport interface EmailEvidenceDecisionRequest {\r\n reason: string;\r\n decisionToken: string;\r\n}\r\n\r\nexport interface EmailEvidenceRebuildResult {\r\n scanBudget: number;\r\n pendingBefore: number;\r\n pendingAfter: number;\r\n corruptBefore: number;\r\n corruptAfter: number;\r\n completedAtUtc: string;\r\n}\r\n\r\nexport interface EmailEvidenceDownload {\r\n blob: Blob;\r\n fileName: string;\r\n contentType: string;\r\n}\r\n\r\nexport interface EmailUserTestDispatchResult {\r\n testRequestId: string;\r\n results: EmailSendResult[];\r\n completions: Array<{\r\n status: string;\r\n owningWorkShouldRetry: boolean;\r\n retryAfter: string | null;\r\n code: string;\r\n }> | null;\r\n auditState: string;\r\n auditCode: string | null;\r\n requestState: string;\r\n expectedRecipientCount: number | null;\r\n allAccepted: boolean;\r\n}\r\n\r\nexport interface AppResponse<T> {\r\n endpoint: string;\r\n status: number;\r\n code: number;\r\n locale: string;\r\n message: string | null;\r\n errors: unknown | null;\r\n data: T;\r\n cacheSession: string | null;\r\n correlationId: string | null;\r\n}\r\n\r\nexport const EMAIL_DELIVERY_ATTEMPT_STATUSES = [\r\n 'Reserved',\r\n 'ProviderInvocationStarted',\r\n 'ProviderInvocationDefinitivelyNotAccepted',\r\n 'ProviderResultReconciliation',\r\n 'ProviderResultPending',\r\n 'Blocked',\r\n 'RetryScheduled',\r\n 'Accepted',\r\n 'OutcomeUnknown',\r\n 'FailedPermanent',\r\n 'DeadLettered',\r\n] as const;\r\n\r\n/**\r\n * Activity rows the backend writes for an operator-run controlled test. They\r\n * carry `templateId: 0`, the caller's original `testRequestId`, and a\r\n * non-reversible recipient fingerprint instead of any real address. They are\r\n * presented as \"Connection test\" and are never replayable — resending a test is\r\n * an explicit operator action from the connection, not a replay.\r\n */\r\nexport const EMAIL_USER_INITIATED_TEST_OPERATION_KIND = 'UserInitiatedTest';\r\n\r\nexport function isConnectionTestAttempt(\r\n attempt: Pick<EmailDeliveryAttempt, 'operationKind'>,\r\n): boolean {\r\n return attempt.operationKind === EMAIL_USER_INITIATED_TEST_OPERATION_KIND;\r\n}\r\n","import {\r\n InjectionToken,\r\n makeEnvironmentProviders,\r\n type EnvironmentProviders,\r\n} from '@angular/core';\r\nimport {\r\n EMAIL_DELIVERY_PERMISSIONS,\r\n type EmailDeliveryOptions,\r\n} from './email-delivery.model';\r\n\r\nexport const DEFAULT_EMAIL_DELIVERY_OPTIONS: EmailDeliveryOptions = {\r\n apiBasePath: 'control-panel/email-delivery',\r\n notificationApiBasePath: 'Notifications',\r\n currentUserAccessibilitiesApiPath: 'identity/users/me/accessibilities',\r\n permissionKeys: [EMAIL_DELIVERY_PERMISSIONS.controlPanel],\r\n};\r\n\r\nexport const EMAIL_DELIVERY_OPTIONS = new InjectionToken<EmailDeliveryOptions>(\r\n 'EMAIL_DELIVERY_OPTIONS',\r\n {\r\n providedIn: 'root',\r\n factory: () => DEFAULT_EMAIL_DELIVERY_OPTIONS,\r\n },\r\n);\r\n\r\nexport function provideEmailDelivery(\r\n options: Partial<EmailDeliveryOptions> = {},\r\n): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n {\r\n provide: EMAIL_DELIVERY_OPTIONS,\r\n useValue: { ...DEFAULT_EMAIL_DELIVERY_OPTIONS, ...options },\r\n },\r\n ]);\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable, signal } from '@angular/core';\r\nimport {\r\n catchError,\r\n finalize,\r\n map,\r\n Observable,\r\n of,\r\n shareReplay,\r\n tap,\r\n throwError,\r\n} from 'rxjs';\r\nimport { EMAIL_DELIVERY_OPTIONS } from './email-delivery.config';\r\nimport type {\r\n AppResponse,\r\n EmailDeliveryAccessibility,\r\n EmailDeliveryPermission,\r\n} from './email-delivery.model';\r\n\r\n/**\r\n * Resolves the signed-in user's real application accessibilities.\r\n *\r\n * `permissionKeys` describes which accessibility the feature requires; it is\r\n * never a list of permissions granted to the user. The grant comes only from\r\n * the authenticated `me/accessibilities` endpoint used by the host backend.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class EmailDeliveryAccessService {\r\n private readonly http = inject(HttpClient);\r\n private readonly options = inject(EMAIL_DELIVERY_OPTIONS);\r\n private request$: Observable<readonly string[]> | null = null;\r\n\r\n readonly keys = signal<readonly string[]>([]);\r\n readonly loading = signal(false);\r\n readonly loaded = signal(false);\r\n readonly error = signal<unknown | null>(null);\r\n\r\n hasPermission(permission: EmailDeliveryPermission): boolean {\r\n return (\r\n this.options.permissionKeys.includes(permission) &&\r\n this.keys().includes(permission)\r\n );\r\n }\r\n\r\n load(force = false): Observable<readonly string[]> {\r\n if (this.request$) {\r\n return this.request$;\r\n }\r\n if (!force && this.loaded()) {\r\n return of(this.keys());\r\n }\r\n\r\n this.loading.set(true);\r\n this.error.set(null);\r\n const request = this.http\r\n .get<\r\n AppResponse<EmailDeliveryAccessibility[]>\r\n >(this.options.currentUserAccessibilitiesApiPath, { headers: { noMessage: 'true' } })\r\n .pipe(\r\n map((response) =>\r\n Array.from(\r\n new Set(\r\n (response.data ?? [])\r\n .map((item) => item.moduleKey?.trim())\r\n .filter((key): key is string => !!key),\r\n ),\r\n ),\r\n ),\r\n tap((keys) => {\r\n this.keys.set(keys);\r\n this.loaded.set(true);\r\n }),\r\n // A failed read is not an authorization decision, so `loaded` stays\r\n // false: caching it would turn one 500 into a permanent, silent \"no\r\n // access\" for the rest of the session, indistinguishable from a real\r\n // denial. The next `load()` retries instead.\r\n catchError((error: unknown) => {\r\n this.keys.set([]);\r\n this.error.set(error);\r\n return throwError(() => error);\r\n }),\r\n finalize(() => {\r\n this.loading.set(false);\r\n if (this.request$ === request) {\r\n this.request$ = null;\r\n }\r\n }),\r\n shareReplay({ bufferSize: 1, refCount: false }),\r\n );\r\n\r\n this.request$ = request;\r\n return request;\r\n }\r\n}\r\n","export function createEmailTestRequestId(): string {\r\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) {\r\n return crypto.randomUUID();\r\n }\r\n\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(\r\n /[xy]/g,\r\n (character) => {\r\n const random = Math.floor(Math.random() * 16);\r\n const value = character === 'x' ? random : (random & 0x3) | 0x8;\r\n return value.toString(16);\r\n },\r\n );\r\n}\r\n\r\nexport function parseEmailTestRecipients(value: string | null): string[] {\r\n const recipients = new Map<string, string>();\r\n for (const recipient of (value ?? '')\r\n .split(/[\\s,;]+/)\r\n .map((item) => item.trim())\r\n .filter(Boolean)) {\r\n const key = recipient.toLowerCase();\r\n if (!recipients.has(key)) recipients.set(key, recipient);\r\n }\r\n return Array.from(recipients.values());\r\n}\r\n\r\nexport function areEmailTestRecipientsValid(\r\n value: unknown,\r\n maximumRecipients = 10,\r\n maximumAddressLength = 256,\r\n): boolean {\r\n const recipients = parseEmailTestRecipients(String(value ?? ''));\r\n return (\r\n recipients.length >= 1 &&\r\n recipients.length <= maximumRecipients &&\r\n recipients.every(\r\n (recipient) =>\r\n recipient.length <= maximumAddressLength &&\r\n /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(recipient),\r\n )\r\n );\r\n}\r\n\r\nexport function collectEmailTemplatePlaceholders(\r\n ...templates: Array<string | null | undefined>\r\n): string[] {\r\n const keys = new Set<string>();\r\n for (const template of templates) {\r\n for (const match of template?.matchAll(/\\{\\{\\s*([^{}]+?)\\s*\\}\\}/g) ?? []) {\r\n const key = match[1]?.trim();\r\n if (key) keys.add(key);\r\n }\r\n }\r\n return Array.from(keys).sort((left, right) => left.localeCompare(right));\r\n}\r\n\r\nexport interface EmailTemplatePlaceholderProperty {\r\n key: string;\r\n name?: string | null;\r\n nameEn?: string | null;\r\n nameAr?: string | null;\r\n}\r\n\r\nexport interface EmailTemplatePlaceholderField {\r\n key: string;\r\n label: string;\r\n}\r\n\r\n/**\r\n * Maps saved template keys to the localized labels returned by the property\r\n * catalog while preserving the original keys used in test metadata.\r\n */\r\nexport function buildEmailTemplatePlaceholderFields(\r\n keys: readonly string[],\r\n properties: readonly EmailTemplatePlaceholderProperty[],\r\n language = 'en',\r\n): EmailTemplatePlaceholderField[] {\r\n const catalog = new Map(\r\n properties\r\n .map((property) => [property.key.trim(), property] as const)\r\n .filter(([key]) => !!key),\r\n );\r\n const isArabic = language.trim().toLowerCase().startsWith('ar');\r\n\r\n return Array.from(new Set(keys.map((key) => key.trim()).filter(Boolean)))\r\n .map((key) => {\r\n const exactProperty = catalog.get(key);\r\n const languageVariant = key.match(/_(en|ar)$/i)?.[1]?.toLowerCase();\r\n const property =\r\n exactProperty ??\r\n (languageVariant ? catalog.get(key.slice(0, -3)) : undefined);\r\n const candidates = isArabic\r\n ? [property?.nameAr, property?.name, property?.nameEn]\r\n : [property?.nameEn, property?.name, property?.nameAr];\r\n const baseLabel =\r\n candidates.find((value) => value?.trim())?.trim() ?? key;\r\n const variantLabel = languageVariant\r\n ? isArabic\r\n ? languageVariant === 'ar'\r\n ? 'العربية'\r\n : 'الإنجليزية'\r\n : languageVariant === 'ar'\r\n ? 'Arabic'\r\n : 'English'\r\n : null;\r\n const label =\r\n !exactProperty && property && variantLabel\r\n ? `${baseLabel} — ${variantLabel}`\r\n : baseLabel;\r\n return { key, label };\r\n })\r\n .sort(\r\n (left, right) =>\r\n left.label.localeCompare(right.label, language) ||\r\n left.key.localeCompare(right.key),\r\n );\r\n}\r\n\r\n/**\r\n * Terminal request states. `Abandoned` is what retention stamps on a test that\r\n * was still in progress when it aged out, so it ends the poll like any other\r\n * settled state — without it the dialog polls its whole budget and then reports\r\n * a timeout for a request the backend has already closed.\r\n */\r\nconst TERMINAL_EMAIL_TEST_REQUEST_STATES = [\r\n 'Completed',\r\n 'Failed',\r\n 'Cancelled',\r\n 'Canceled',\r\n 'Abandoned',\r\n];\r\n\r\nexport function isEmailTestRequestPending(state: string): boolean {\r\n return !TERMINAL_EMAIL_TEST_REQUEST_STATES.includes(state);\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport {\r\n EntityStatus,\r\n type EntityData,\r\n type EntityStatusValue,\r\n} from '@masterteam/components/entities';\r\nimport type { ColumnDef } from '@masterteam/components/table';\r\n\r\nexport type EmailDeliveryStatusKind =\r\n | 'readiness'\r\n | 'connection'\r\n | 'attempt'\r\n | 'support';\r\n\r\ninterface EmailDeliveryStatusDefinition {\r\n color: string;\r\n translationKey: string;\r\n}\r\n\r\ntype EmailDeliveryStatusMap = NonNullable<ColumnDef['statusMap']>;\r\n\r\nconst STATUS_DEFINITIONS: Record<\r\n EmailDeliveryStatusKind,\r\n Record<string, EmailDeliveryStatusDefinition>\r\n> = {\r\n // Page-level readiness, shown as a chip beside the page title instead of the\r\n // banner that used to sit above every tab.\r\n readiness: {\r\n ready: status('#059669', 'readiness.ready'),\r\n 'needs-setup': status('#D97706', 'readiness.needs-setup'),\r\n unavailable: status('#64748B', 'readiness.unavailable'),\r\n },\r\n connection: {\r\n Draft: status('#64748B', 'connection.draft'),\r\n PendingAuthorization: status('#D97706', 'connection.pending-authorization'),\r\n PendingValidation: status('#0284C7', 'connection.pending-validation'),\r\n Ready: status('#059669', 'connection.ready'),\r\n ReauthorizationRequired: status(\r\n '#EA580C',\r\n 'connection.reauthorization-required',\r\n ),\r\n ConditionalAccessRequired: status(\r\n '#EA580C',\r\n 'connection.conditional-access-required',\r\n ),\r\n Disabled: status('#64748B', 'connection.disabled'),\r\n Invalid: status('#DC2626', 'connection.invalid'),\r\n },\r\n attempt: {\r\n Reserved: status('#64748B', 'attempt.reserved'),\r\n ProviderInvocationStarted: status(\r\n '#0284C7',\r\n 'attempt.provider-invocation-started',\r\n ),\r\n ProviderInvocationDefinitivelyNotAccepted: status(\r\n '#DC2626',\r\n 'attempt.provider-not-accepted',\r\n ),\r\n ProviderResultReconciliation: status('#7C3AED', 'attempt.reconciling'),\r\n ProviderResultPending: status('#0284C7', 'attempt.pending'),\r\n Blocked: status('#DC2626', 'attempt.blocked'),\r\n RetryScheduled: status('#D97706', 'attempt.retry-scheduled'),\r\n Accepted: status('#059669', 'attempt.accepted'),\r\n OutcomeUnknown: status('#EA580C', 'attempt.outcome-unknown'),\r\n FailedPermanent: status('#DC2626', 'attempt.failed-permanent'),\r\n DeadLettered: status('#BE123C', 'attempt.dead-lettered'),\r\n },\r\n support: {\r\n active: status('#D97706', 'support.active'),\r\n 'repair-pending': status('#0284C7', 'support.repair-pending'),\r\n repaired: status('#059669', 'support.repaired'),\r\n 'acknowledgement-pending': status(\r\n '#0284C7',\r\n 'support.acknowledgement-pending',\r\n ),\r\n acknowledged: status('#64748B', 'support.acknowledged'),\r\n Owned: status('#059669', 'support.owned'),\r\n owned: status('#059669', 'support.owned'),\r\n Missing: status('#D97706', 'support.missing'),\r\n missing: status('#D97706', 'support.missing'),\r\n Conflict: status('#DC2626', 'support.conflict'),\r\n conflict: status('#DC2626', 'support.conflict'),\r\n IdentityIncomplete: status('#EA580C', 'support.identity-incomplete'),\r\n identityincomplete: status('#EA580C', 'support.identity-incomplete'),\r\n 'retryable-after-upgrade': status(\r\n '#0284C7',\r\n 'support.retryable-after-upgrade',\r\n ),\r\n 'repair-required': status('#EA580C', 'support.repair-required'),\r\n 'acknowledge-only': status('#64748B', 'support.acknowledge-only'),\r\n configured: status('#059669', 'support.configured'),\r\n 'not-configured': status('#64748B', 'support.not-configured'),\r\n },\r\n};\r\n\r\n@Component({\r\n selector: 'mt-email-delivery-status',\r\n imports: [EntityStatus],\r\n template: `<mt-entity-status [data]=\"statusData()\" />`,\r\n host: { class: 'inline-flex' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailDeliveryStatus {\r\n readonly value = input.required<string>();\r\n readonly kind = input<EmailDeliveryStatusKind>('support');\r\n\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly activeLanguage = toSignal(this.transloco.langChanges$, {\r\n initialValue: this.transloco.getActiveLang(),\r\n });\r\n\r\n protected readonly statusData = computed<EntityData>(() => {\r\n this.activeLanguage();\r\n return {\r\n name: '',\r\n viewType: 'Status',\r\n value: getEmailDeliveryStatusValue(this.kind(), this.value(), (key) =>\r\n this.transloco.translate(key),\r\n ),\r\n configuration: { hideName: true },\r\n };\r\n });\r\n}\r\n\r\nexport function getEmailDeliveryStatusMap(\r\n kind: EmailDeliveryStatusKind,\r\n translate: (key: string) => string,\r\n): EmailDeliveryStatusMap {\r\n return Object.fromEntries(\r\n Object.entries(STATUS_DEFINITIONS[kind]).map(([key, definition]) => [\r\n key,\r\n {\r\n color: definition.color,\r\n display: translate(\r\n `email-delivery.status.${definition.translationKey}`,\r\n ),\r\n },\r\n ]),\r\n );\r\n}\r\n\r\nfunction getEmailDeliveryStatusValue(\r\n kind: EmailDeliveryStatusKind,\r\n value: string,\r\n translate: (key: string) => string,\r\n): EntityStatusValue {\r\n const definition = STATUS_DEFINITIONS[kind][value];\r\n return {\r\n key: value,\r\n display: definition\r\n ? translate(`email-delivery.status.${definition.translationKey}`)\r\n : value,\r\n color: definition?.color ?? '#64748B',\r\n };\r\n}\r\n\r\nfunction status(\r\n color: string,\r\n translationKey: string,\r\n): EmailDeliveryStatusDefinition {\r\n return { color, translationKey };\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport type { Observable } from 'rxjs';\r\nimport type {\r\n EmailAttemptPage,\r\n EmailAttemptReplayRequest,\r\n EmailAttemptReplayResult,\r\n EmailAuthorizationStartResult,\r\n EmailConnectionCreateRequest,\r\n EmailConnectionDetails,\r\n EmailConnectionSummary,\r\n EmailConnectionTestRequest,\r\n EmailConnectionTestResult,\r\n EmailConnectionUpdateRequest,\r\n EmailConnectionValidationResult,\r\n EmailDeliveryStatus,\r\n EmailErrorCatalogEntry,\r\n EmailEvidenceDecisionRequest,\r\n EmailEvidenceDownload,\r\n EmailEvidenceRebuildResult,\r\n EmailFinalizationQuarantineItem,\r\n EmailFinalizationQuarantinePage,\r\n EmailHostEvidenceItem,\r\n EmailHostEvidencePage,\r\n EmailProviderDescriptor,\r\n EmailSendResult,\r\n EmailUserTestDispatchResult,\r\n} from './email-delivery.model';\r\n\r\n@Injectable()\r\nexport abstract class EmailDeliveryApi {\r\n abstract getStatus(): Observable<EmailDeliveryStatus>;\r\n abstract getProviders(): Observable<EmailProviderDescriptor[]>;\r\n abstract getErrorCatalog(): Observable<EmailErrorCatalogEntry[]>;\r\n abstract getConnections(): Observable<EmailConnectionSummary[]>;\r\n abstract getConnection(id: string): Observable<EmailConnectionDetails>;\r\n abstract createConnection(\r\n request: EmailConnectionCreateRequest,\r\n ): Observable<EmailConnectionDetails>;\r\n abstract updateConnection(\r\n id: string,\r\n request: EmailConnectionUpdateRequest,\r\n ): Observable<EmailConnectionDetails>;\r\n abstract deleteConnection(\r\n id: string,\r\n concurrencyToken: string,\r\n ): Observable<void>;\r\n abstract bindConnection(\r\n purpose: string,\r\n connectionId: string,\r\n ): Observable<void>;\r\n abstract unbindConnection(purpose: string): Observable<void>;\r\n abstract validateConnection(\r\n id: string,\r\n ): Observable<EmailConnectionValidationResult>;\r\n abstract sendConnectionTest(\r\n id: string,\r\n request: EmailConnectionTestRequest,\r\n ): Observable<EmailSendResult>;\r\n abstract getConnectionTest(\r\n connectionId: string,\r\n testRequestId: string,\r\n ): Observable<EmailConnectionTestResult>;\r\n abstract startDelegatedAuthorization(\r\n id: string,\r\n ): Observable<EmailAuthorizationStartResult>;\r\n abstract startAdminConsent(\r\n id: string,\r\n ): Observable<EmailAuthorizationStartResult>;\r\n abstract revokeAuthorization(id: string): Observable<void>;\r\n abstract getAttempts(\r\n status: string | null,\r\n cursor: string | null,\r\n take: number,\r\n ): Observable<EmailAttemptPage>;\r\n abstract replayAttempt(\r\n id: string,\r\n request: EmailAttemptReplayRequest,\r\n ): Observable<EmailAttemptReplayResult>;\r\n abstract getTestRequest(\r\n testRequestId: string,\r\n ): Observable<EmailUserTestDispatchResult>;\r\n abstract sendTemplateTest(\r\n eventId: number,\r\n templateId: number,\r\n request: {\r\n testRequestId: string;\r\n emails: string[];\r\n metadata: Record<string, string>;\r\n },\r\n ): Observable<EmailUserTestDispatchResult>;\r\n abstract sendAlertTest(\r\n alertId: number,\r\n request: {\r\n testRequestId: string;\r\n emails: string[];\r\n metadata: Record<string, string>;\r\n },\r\n ): Observable<EmailUserTestDispatchResult>;\r\n abstract getFinalizationQuarantine(\r\n cursor: string | null,\r\n take: number,\r\n ): Observable<EmailFinalizationQuarantinePage>;\r\n abstract retryFinalizationQuarantine(\r\n itemId: string,\r\n reason: string,\r\n ): Observable<EmailFinalizationQuarantineItem>;\r\n abstract acknowledgeFinalizationQuarantine(\r\n itemId: string,\r\n reason: string,\r\n ): Observable<EmailFinalizationQuarantineItem>;\r\n abstract getHostEvidence(\r\n cursor: string | null,\r\n take: number,\r\n ): Observable<EmailHostEvidencePage>;\r\n abstract exportHostEvidence(\r\n evidenceOccurrenceId: string,\r\n ): Observable<EmailEvidenceDownload>;\r\n abstract repairHostEvidence(\r\n evidenceOccurrenceId: string,\r\n request: EmailEvidenceDecisionRequest,\r\n ): Observable<EmailHostEvidenceItem>;\r\n abstract acknowledgeHostEvidence(\r\n evidenceOccurrenceId: string,\r\n request: EmailEvidenceDecisionRequest,\r\n ): Observable<EmailHostEvidenceItem>;\r\n abstract rebuildEvidenceIndex(\r\n take: number,\r\n ): Observable<EmailEvidenceRebuildResult>;\r\n}\r\n","import {\r\n HttpClient,\r\n HttpErrorResponse,\r\n type HttpResponse,\r\n} from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { catchError, map, mergeMap, of, throwError } from 'rxjs';\r\nimport { EMAIL_DELIVERY_OPTIONS } from './email-delivery.config';\r\nimport { EmailDeliveryApi } from './email-delivery.api';\r\nimport type {\r\n AppResponse,\r\n EmailAttemptPage,\r\n EmailAttemptReplayRequest,\r\n EmailAttemptReplayResult,\r\n EmailAuthorizationStartResult,\r\n EmailConnectionCreateRequest,\r\n EmailConnectionDetails,\r\n EmailConnectionSummary,\r\n EmailConnectionTestRequest,\r\n EmailConnectionTestResult,\r\n EmailConnectionUpdateRequest,\r\n EmailConnectionValidationResult,\r\n EmailDeliveryStatus,\r\n EmailDeliveryProblem,\r\n EmailErrorCatalogEntry,\r\n EmailEvidenceDecisionRequest,\r\n EmailEvidenceDownload,\r\n EmailEvidenceRebuildResult,\r\n EmailFinalizationQuarantineItem,\r\n EmailFinalizationQuarantinePage,\r\n EmailHostEvidenceItem,\r\n EmailHostEvidencePage,\r\n EmailProviderDescriptor,\r\n EmailSendResult,\r\n EmailUserTestDispatchResult,\r\n} from './email-delivery.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class EmailDeliveryHttpApi extends EmailDeliveryApi {\r\n private readonly http = inject(HttpClient);\r\n private readonly options = inject(EMAIL_DELIVERY_OPTIONS);\r\n\r\n getStatus() {\r\n return this.http.get<EmailDeliveryStatus>(this.url('status'));\r\n }\r\n\r\n getProviders() {\r\n return this.http.get<EmailProviderDescriptor[]>(this.url('providers'));\r\n }\r\n\r\n getErrorCatalog() {\r\n return this.http.get<EmailErrorCatalogEntry[]>(this.url('error-catalog'));\r\n }\r\n\r\n getConnections() {\r\n return this.http.get<EmailConnectionSummary[]>(this.url('connections'));\r\n }\r\n\r\n getConnection(id: string) {\r\n return this.http.get<EmailConnectionDetails>(\r\n this.url(`connections/${encodeURIComponent(id)}`),\r\n );\r\n }\r\n\r\n createConnection(request: EmailConnectionCreateRequest) {\r\n return this.http.post<EmailConnectionDetails>(\r\n this.url('connections'),\r\n request,\r\n );\r\n }\r\n\r\n updateConnection(id: string, request: EmailConnectionUpdateRequest) {\r\n return this.http.put<EmailConnectionDetails>(\r\n this.url(`connections/${encodeURIComponent(id)}`),\r\n request,\r\n );\r\n }\r\n\r\n deleteConnection(id: string, concurrencyToken: string) {\r\n return this.http.delete<void>(\r\n this.url(`connections/${encodeURIComponent(id)}`),\r\n { params: { concurrencyToken } },\r\n );\r\n }\r\n\r\n bindConnection(purpose: string, connectionId: string) {\r\n return this.http.put<void>(\r\n this.url(`bindings/${encodeURIComponent(purpose)}`),\r\n { connectionId },\r\n );\r\n }\r\n\r\n unbindConnection(purpose: string) {\r\n return this.http.delete<void>(\r\n this.url(`bindings/${encodeURIComponent(purpose)}`),\r\n );\r\n }\r\n\r\n validateConnection(id: string) {\r\n return this.http.post<EmailConnectionValidationResult>(\r\n this.url(`connections/${encodeURIComponent(id)}/validate`),\r\n null,\r\n );\r\n }\r\n\r\n sendConnectionTest(id: string, request: EmailConnectionTestRequest) {\r\n return this.http\r\n .post<\r\n EmailSendResult | EmailDeliveryProblem\r\n >(this.url(`connections/${encodeURIComponent(id)}/test`), request, { observe: 'response' })\r\n .pipe(\r\n mergeMap((response) => {\r\n const body = response.body;\r\n if (isEmailSendResult(body)) return of(body);\r\n // 202 means the send was accepted without a result on this response.\r\n // The caller must read the outcome back with the same testRequestId;\r\n // posting again would deliver a second real email.\r\n if (response.status === 202) {\r\n return throwError(() => body ?? PENDING_CONTROLLED_TEST);\r\n }\r\n return throwError(() => body);\r\n }),\r\n catchError((error: unknown) => {\r\n const body = error instanceof HttpErrorResponse ? error.error : error;\r\n return isEmailSendResult(body) ? of(body) : throwError(() => error);\r\n }),\r\n );\r\n }\r\n\r\n getConnectionTest(connectionId: string, testRequestId: string) {\r\n return this.http.get<EmailConnectionTestResult>(\r\n this.url(\r\n `connections/${encodeURIComponent(connectionId)}/test-requests/${encodeURIComponent(testRequestId)}`,\r\n ),\r\n );\r\n }\r\n\r\n startDelegatedAuthorization(id: string) {\r\n return this.http.post<EmailAuthorizationStartResult>(\r\n this.url(\r\n `connections/${encodeURIComponent(id)}/authorization/delegated/start`,\r\n ),\r\n null,\r\n );\r\n }\r\n\r\n startAdminConsent(id: string) {\r\n return this.http.post<EmailAuthorizationStartResult>(\r\n this.url(\r\n `connections/${encodeURIComponent(id)}/authorization/admin-consent/start`,\r\n ),\r\n null,\r\n );\r\n }\r\n\r\n revokeAuthorization(id: string) {\r\n return this.http.post<void>(\r\n this.url(`connections/${encodeURIComponent(id)}/authorization/revoke`),\r\n null,\r\n );\r\n }\r\n\r\n getAttempts(status: string | null, cursor: string | null, take: number) {\r\n return this.http.get<EmailAttemptPage>(this.url('attempts'), {\r\n params: withoutNulls({ status, cursor, take }),\r\n });\r\n }\r\n\r\n replayAttempt(id: string, request: EmailAttemptReplayRequest) {\r\n return this.http.post<EmailAttemptReplayResult>(\r\n this.url(`attempts/${encodeURIComponent(id)}/replay`),\r\n request,\r\n );\r\n }\r\n\r\n getTestRequest(testRequestId: string) {\r\n return this.http.get<EmailUserTestDispatchResult>(\r\n this.url(`test-requests/${encodeURIComponent(testRequestId)}`),\r\n );\r\n }\r\n\r\n sendTemplateTest(\r\n eventId: number,\r\n templateId: number,\r\n request: {\r\n testRequestId: string;\r\n emails: string[];\r\n metadata: Record<string, string>;\r\n },\r\n ) {\r\n return this.sendUserTest(\r\n this.notificationUrl(\r\n `events/${eventId}/templates/${templateId}/test-email`,\r\n ),\r\n request,\r\n );\r\n }\r\n\r\n sendAlertTest(\r\n alertId: number,\r\n request: {\r\n testRequestId: string;\r\n emails: string[];\r\n metadata: Record<string, string>;\r\n },\r\n ) {\r\n return this.sendUserTest(\r\n this.notificationUrl(`alerts/${alertId}/test`),\r\n request,\r\n );\r\n }\r\n\r\n private sendUserTest(\r\n url: string,\r\n request: {\r\n testRequestId: string;\r\n emails: string[];\r\n metadata: Record<string, string>;\r\n },\r\n ) {\r\n return this.http\r\n .post<AppResponse<EmailUserTestDispatchResult>>(url, request, {\r\n observe: 'response',\r\n })\r\n .pipe(\r\n mergeMap((response) => {\r\n if (response.body?.data) return of(response.body.data);\r\n if (response.status === 202) {\r\n return throwError(() => PENDING_CONTROLLED_TEST);\r\n }\r\n return throwError(() => response.body);\r\n }),\r\n );\r\n }\r\n\r\n getFinalizationQuarantine(cursor: string | null, take: number) {\r\n return this.http.get<EmailFinalizationQuarantinePage>(\r\n this.url('finalization-quarantine'),\r\n { params: withoutNulls({ cursor, take }) },\r\n );\r\n }\r\n\r\n retryFinalizationQuarantine(itemId: string, reason: string) {\r\n return this.http.post<EmailFinalizationQuarantineItem>(\r\n this.url(`finalization-quarantine/${encodeURIComponent(itemId)}/retry`),\r\n { reason },\r\n );\r\n }\r\n\r\n acknowledgeFinalizationQuarantine(itemId: string, reason: string) {\r\n return this.http.post<EmailFinalizationQuarantineItem>(\r\n this.url(\r\n `finalization-quarantine/${encodeURIComponent(itemId)}/acknowledge`,\r\n ),\r\n { reason },\r\n );\r\n }\r\n\r\n getHostEvidence(cursor: string | null, take: number) {\r\n return this.http.get<EmailHostEvidencePage>(this.url('orphan-evidence'), {\r\n params: withoutNulls({ cursor, take }),\r\n });\r\n }\r\n\r\n exportHostEvidence(evidenceOccurrenceId: string) {\r\n return this.http\r\n .get(\r\n this.url(\r\n `orphan-evidence/${encodeURIComponent(evidenceOccurrenceId)}/export`,\r\n ),\r\n {\r\n observe: 'response',\r\n responseType: 'blob',\r\n },\r\n )\r\n .pipe(map((response) => toEvidenceDownload(response)));\r\n }\r\n\r\n repairHostEvidence(\r\n evidenceOccurrenceId: string,\r\n request: EmailEvidenceDecisionRequest,\r\n ) {\r\n return this.http.post<EmailHostEvidenceItem>(\r\n this.url(\r\n `orphan-evidence/${encodeURIComponent(evidenceOccurrenceId)}/repair`,\r\n ),\r\n request,\r\n );\r\n }\r\n\r\n acknowledgeHostEvidence(\r\n evidenceOccurrenceId: string,\r\n request: EmailEvidenceDecisionRequest,\r\n ) {\r\n return this.http.post<EmailHostEvidenceItem>(\r\n this.url(\r\n `orphan-evidence/${encodeURIComponent(evidenceOccurrenceId)}/acknowledge`,\r\n ),\r\n request,\r\n );\r\n }\r\n\r\n rebuildEvidenceIndex(take: number) {\r\n return this.http.post<EmailEvidenceRebuildResult>(\r\n this.url('orphan-evidence/rebuild-index'),\r\n null,\r\n { params: { take } },\r\n );\r\n }\r\n\r\n private url(path: string): string {\r\n return joinPath(this.options.apiBasePath, path);\r\n }\r\n\r\n private notificationUrl(path: string): string {\r\n return joinPath(this.options.notificationApiBasePath, path);\r\n }\r\n}\r\n\r\n/**\r\n * Stand-in problem for a bare `202 Accepted` that carries no body of its own —\r\n * it routes the dialog to retrieval by GUID, the same as the catalog problem\r\n * the backend normally returns for an in-flight test.\r\n */\r\nconst PENDING_CONTROLLED_TEST: EmailDeliveryProblem = {\r\n code: 'email.delivery_test_request_in_progress',\r\n category: 'pending',\r\n retryable: true,\r\n action: 'poll_status',\r\n readinessImpact: 'unchanged',\r\n correlationId: '',\r\n retryAfterSeconds: null,\r\n};\r\n\r\nfunction isEmailSendResult(value: unknown): value is EmailSendResult {\r\n return (\r\n typeof value === 'object' &&\r\n value !== null &&\r\n typeof (value as EmailSendResult).outcome === 'string' &&\r\n typeof (value as EmailSendResult).code === 'string'\r\n );\r\n}\r\n\r\nfunction withoutNulls(\r\n values: Record<string, string | number | null>,\r\n): Record<string, string | number> {\r\n return Object.fromEntries(\r\n Object.entries(values).filter(\r\n (entry): entry is [string, string | number] => entry[1] !== null,\r\n ),\r\n );\r\n}\r\n\r\nfunction joinPath(base: string, path: string): string {\r\n return `${base.replace(/\\/$/, '')}/${path.replace(/^\\//, '')}`;\r\n}\r\n\r\nfunction toEvidenceDownload(\r\n response: HttpResponse<Blob>,\r\n): EmailEvidenceDownload {\r\n const contentDisposition = response.headers.get('content-disposition') ?? '';\r\n const fileNameMatch = /filename\\*?=(?:UTF-8''|\\\")?([^\\\";]+)/i.exec(\r\n contentDisposition,\r\n );\r\n\r\n return {\r\n blob: response.body ?? new Blob(),\r\n fileName: fileNameMatch\r\n ? decodeURIComponent(fileNameMatch[1].replace(/\\\"$/, ''))\r\n : 'email-delivery-evidence.json',\r\n contentType:\r\n response.headers.get('content-type') ?? 'application/octet-stream',\r\n };\r\n}\r\n","import { HttpErrorResponse } from '@angular/common/http';\r\nimport { computed, inject, Injectable, signal } from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { ToastService } from '@masterteam/components/toast';\r\nimport {\r\n catchError,\r\n finalize,\r\n forkJoin,\r\n map,\r\n MonoTypeOperatorFunction,\r\n Observable,\r\n switchMap,\r\n tap,\r\n throwError,\r\n} from 'rxjs';\r\nimport { EmailDeliveryAccessService } from './email-delivery-access.service';\r\nimport { EmailDeliveryHttpApi } from './email-delivery.http-api';\r\nimport type {\r\n EmailAttemptReplayRequest,\r\n EmailAttemptReplayResult,\r\n EmailAuthorizationStartResult,\r\n EmailConnectionCreateRequest,\r\n EmailConnectionDetails,\r\n EmailConnectionSummary,\r\n EmailConnectionTestRequest,\r\n EmailConnectionTestResult,\r\n EmailConnectionUpdateRequest,\r\n EmailConnectionValidationResult,\r\n EmailDeliveryAttempt,\r\n EmailDeliveryPermission,\r\n EmailDeliveryProblem,\r\n EmailDeliveryStatus,\r\n EmailErrorCatalogEntry,\r\n EmailEvidenceDecisionRequest,\r\n EmailEvidenceDownload,\r\n EmailEvidenceRebuildResult,\r\n EmailFinalizationQuarantineItem,\r\n EmailHostEvidenceItem,\r\n EmailProviderDescriptor,\r\n EmailSendResult,\r\n EmailUserTestDispatchResult,\r\n} from './email-delivery.model';\r\n\r\nconst PENDING_AUTHORIZATION_STORAGE_KEY =\r\n 'mt.email-delivery.pending-authorization-connection';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class EmailDeliveryFacade {\r\n private readonly access = inject(EmailDeliveryAccessService);\r\n private readonly api = inject(EmailDeliveryHttpApi);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly toast = inject(ToastService);\r\n private initialized = false;\r\n private attemptsLoaded = false;\r\n\r\n readonly status = signal<EmailDeliveryStatus | null>(null);\r\n readonly providers = signal<EmailProviderDescriptor[]>([]);\r\n readonly errorCatalog = signal<EmailErrorCatalogEntry[]>([]);\r\n readonly connections = signal<EmailConnectionSummary[]>([]);\r\n readonly selectedConnection = signal<EmailConnectionDetails | null>(null);\r\n readonly attempts = signal<EmailDeliveryAttempt[]>([]);\r\n readonly attemptsNextCursor = signal<string | null>(null);\r\n readonly attemptStatusFilter = signal<string | null>(null);\r\n readonly quarantine = signal<EmailFinalizationQuarantineItem[]>([]);\r\n readonly quarantineNextCursor = signal<string | null>(null);\r\n readonly hostEvidence = signal<EmailHostEvidenceItem[]>([]);\r\n readonly hostEvidenceNextCursor = signal<string | null>(null);\r\n readonly hostEvidenceScanBudgetExhausted = signal(false);\r\n\r\n readonly statusLoading = signal(false);\r\n readonly catalogLoading = signal(false);\r\n readonly connectionsLoading = signal(false);\r\n readonly detailsLoading = signal(false);\r\n readonly attemptsLoading = signal(false);\r\n readonly quarantineLoading = signal(false);\r\n readonly hostEvidenceLoading = signal(false);\r\n readonly mutationLoading = signal<string | null>(null);\r\n readonly lastConnectionTest = signal<EmailSendResult | null>(null);\r\n readonly lastConnectionTestRequestId = signal<string | null>(null);\r\n readonly permissionsLoading = this.access.loading;\r\n readonly permissionsLoaded = this.access.loaded;\r\n readonly permissionsError = this.access.error;\r\n\r\n readonly activeConnection = computed(() =>\r\n this.connections().find((connection) =>\r\n connection.bindings.includes('notifications'),\r\n ),\r\n );\r\n readonly managementAvailable = computed(\r\n () => this.status()?.managementEnabled === true,\r\n );\r\n\r\n initialize(): void {\r\n if (this.initialized) return;\r\n this.initialized = true;\r\n this.loadStatus()\r\n .pipe(\r\n switchMap(() =>\r\n forkJoin({\r\n catalog: this.loadCatalog(),\r\n connections: this.loadConnections(),\r\n }),\r\n ),\r\n )\r\n .subscribe({ error: (error) => this.showError(error) });\r\n }\r\n\r\n hasPermission(permission: EmailDeliveryPermission): boolean {\r\n return this.access.hasPermission(permission);\r\n }\r\n\r\n loadPermissions(force = false): Observable<readonly string[]> {\r\n return this.access.load(force);\r\n }\r\n\r\n loadStatus(): Observable<EmailDeliveryStatus> {\r\n this.statusLoading.set(true);\r\n return this.api.getStatus().pipe(\r\n tap((status) => this.status.set(status)),\r\n finalize(() => this.statusLoading.set(false)),\r\n );\r\n }\r\n\r\n loadCatalog(): Observable<{\r\n providers: EmailProviderDescriptor[];\r\n errors: EmailErrorCatalogEntry[];\r\n }> {\r\n this.catalogLoading.set(true);\r\n return forkJoin({\r\n providers: this.api.getProviders(),\r\n errors: this.api.getErrorCatalog(),\r\n }).pipe(\r\n tap(({ providers, errors }) => {\r\n this.providers.set(providers);\r\n this.errorCatalog.set(errors);\r\n }),\r\n finalize(() => this.catalogLoading.set(false)),\r\n );\r\n }\r\n\r\n loadConnections(): Observable<EmailConnectionSummary[]> {\r\n this.connectionsLoading.set(true);\r\n return this.api.getConnections().pipe(\r\n tap((connections) => this.connections.set(connections)),\r\n finalize(() => this.connectionsLoading.set(false)),\r\n );\r\n }\r\n\r\n loadConnection(id: string): Observable<EmailConnectionDetails> {\r\n this.detailsLoading.set(true);\r\n return this.api.getConnection(id).pipe(\r\n tap((details) => this.selectedConnection.set(details)),\r\n finalize(() => this.detailsLoading.set(false)),\r\n );\r\n }\r\n\r\n createConnection(\r\n request: EmailConnectionCreateRequest,\r\n ): Observable<EmailConnectionDetails> {\r\n this.mutationLoading.set('create');\r\n return this.api.createConnection(request).pipe(\r\n switchMap((details) => this.refreshConnection(details.connection.id)),\r\n tap(() => this.showSuccess('connection-created')),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n updateConnection(\r\n id: string,\r\n request: EmailConnectionUpdateRequest,\r\n ): Observable<EmailConnectionDetails> {\r\n this.mutationLoading.set('update');\r\n return this.api.updateConnection(id, request).pipe(\r\n this.reloadOnConflict<EmailConnectionDetails>(id),\r\n switchMap(() => this.refreshConnection(id)),\r\n tap(() => this.showSuccess('connection-updated')),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n deleteConnection(id: string, concurrencyToken: string): Observable<void> {\r\n this.mutationLoading.set('delete');\r\n return this.api.deleteConnection(id, concurrencyToken).pipe(\r\n this.reloadOnConflict<void>(id),\r\n switchMap(() =>\r\n forkJoin({\r\n connections: this.loadConnections(),\r\n status: this.loadStatus(),\r\n }),\r\n ),\r\n tap(() => {\r\n this.selectedConnection.set(null);\r\n this.showSuccess('connection-deleted');\r\n }),\r\n map(() => undefined),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n validateConnection(id: string): Observable<EmailConnectionValidationResult> {\r\n this.mutationLoading.set('validate');\r\n return this.api.validateConnection(id).pipe(\r\n this.reloadOnConflict<EmailConnectionValidationResult>(id),\r\n switchMap((result) => this.refreshConnection(id).pipe(map(() => result))),\r\n tap((result) =>\r\n result.isValid\r\n ? this.toast.success(this.describeCode(result.code))\r\n : this.toast.warn(this.describeCode(result.code)),\r\n ),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n sendConnectionTest(\r\n id: string,\r\n request: EmailConnectionTestRequest,\r\n ): Observable<EmailSendResult> {\r\n this.mutationLoading.set('test');\r\n this.lastConnectionTestRequestId.set(request.testRequestId);\r\n return this.api.sendConnectionTest(id, request).pipe(\r\n tap((result) => {\r\n this.lastConnectionTest.set(result);\r\n this.refreshActivity();\r\n }),\r\n switchMap((result) => this.refreshConnection(id).pipe(map(() => result))),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n retrieveConnectionTest(\r\n connectionId: string,\r\n testRequestId: string,\r\n ): Observable<EmailConnectionTestResult> {\r\n this.mutationLoading.set('retrieve-test');\r\n return this.api.getConnectionTest(connectionId, testRequestId).pipe(\r\n tap((stored) => {\r\n this.lastConnectionTest.set(stored.result);\r\n if (stored.result) this.refreshActivity();\r\n }),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n sendTemplateTest(\r\n eventId: number,\r\n templateId: number,\r\n request: {\r\n testRequestId: string;\r\n emails: string[];\r\n metadata: Record<string, string>;\r\n },\r\n ): Observable<EmailUserTestDispatchResult> {\r\n this.mutationLoading.set('template-test');\r\n return this.api\r\n .sendTemplateTest(eventId, templateId, request)\r\n .pipe(finalize(() => this.mutationLoading.set(null)));\r\n }\r\n\r\n sendAlertTest(\r\n alertId: number,\r\n request: {\r\n testRequestId: string;\r\n emails: string[];\r\n metadata: Record<string, string>;\r\n },\r\n ): Observable<EmailUserTestDispatchResult> {\r\n this.mutationLoading.set('alert-test');\r\n return this.api\r\n .sendAlertTest(alertId, request)\r\n .pipe(finalize(() => this.mutationLoading.set(null)));\r\n }\r\n\r\n retrieveUserTest(\r\n testRequestId: string,\r\n ): Observable<EmailUserTestDispatchResult> {\r\n this.mutationLoading.set('retrieve-user-test');\r\n return this.api\r\n .getTestRequest(testRequestId)\r\n .pipe(finalize(() => this.mutationLoading.set(null)));\r\n }\r\n\r\n bindConnection(id: string, purpose = 'notifications'): Observable<void> {\r\n this.mutationLoading.set('bind');\r\n return this.api.bindConnection(purpose, id).pipe(\r\n this.reloadOnConflict<void>(id),\r\n switchMap(() => this.refreshConnection(id)),\r\n tap(() => this.showSuccess('connection-bound')),\r\n map(() => undefined),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n unbindConnection(id: string, purpose = 'notifications'): Observable<void> {\r\n this.mutationLoading.set('unbind');\r\n return this.api.unbindConnection(purpose).pipe(\r\n this.reloadOnConflict<void>(id),\r\n switchMap(() => this.refreshConnection(id)),\r\n tap(() => this.showSuccess('connection-unbound')),\r\n map(() => undefined),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n startAuthorization(\r\n id: string,\r\n kind: 'delegated' | 'admin-consent',\r\n ): Observable<EmailAuthorizationStartResult> {\r\n this.mutationLoading.set(kind);\r\n const request =\r\n kind === 'delegated'\r\n ? this.api.startDelegatedAuthorization(id)\r\n : this.api.startAdminConsent(id);\r\n return request.pipe(\r\n tap(() => this.rememberAuthorizationConnection(id)),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n revokeAuthorization(id: string): Observable<void> {\r\n this.mutationLoading.set('revoke');\r\n return this.api.revokeAuthorization(id).pipe(\r\n this.reloadOnConflict<void>(id),\r\n switchMap(() => this.refreshConnection(id)),\r\n tap(() => this.showSuccess('authorization-revoked')),\r\n map(() => undefined),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n loadAttempts(reset = true, status = this.attemptStatusFilter()) {\r\n this.attemptsLoading.set(true);\r\n const cursor = reset ? null : this.attemptsNextCursor();\r\n if (reset) this.attemptStatusFilter.set(status);\r\n return this.api.getAttempts(status, cursor, 50).pipe(\r\n tap((page) => {\r\n this.attemptsLoaded = true;\r\n this.attempts.set(\r\n reset ? page.items : mergeById(this.attempts(), page.items, 'id'),\r\n );\r\n this.attemptsNextCursor.set(page.nextCursor);\r\n }),\r\n finalize(() => this.attemptsLoading.set(false)),\r\n );\r\n }\r\n\r\n replayAttempt(\r\n attempt: EmailDeliveryAttempt,\r\n request: EmailAttemptReplayRequest,\r\n ): Observable<EmailAttemptReplayResult> {\r\n this.mutationLoading.set(`replay-${attempt.id}`);\r\n return this.api.replayAttempt(attempt.id, request).pipe(\r\n tap((result) => {\r\n this.attempts.update((items) =>\r\n replaceById(items, result.attempt, 'id'),\r\n );\r\n this.showSuccess('attempt-replay-scheduled');\r\n }),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n loadQuarantine(reset = true) {\r\n this.quarantineLoading.set(true);\r\n const cursor = reset ? null : this.quarantineNextCursor();\r\n return this.api.getFinalizationQuarantine(cursor, 100).pipe(\r\n tap((page) => {\r\n this.quarantine.set(\r\n reset\r\n ? page.items\r\n : mergeById(this.quarantine(), page.items, 'itemId'),\r\n );\r\n this.quarantineNextCursor.set(page.nextCursor);\r\n }),\r\n finalize(() => this.quarantineLoading.set(false)),\r\n );\r\n }\r\n\r\n decideQuarantine(\r\n item: EmailFinalizationQuarantineItem,\r\n action: 'retry' | 'acknowledge',\r\n reason: string,\r\n ): Observable<EmailFinalizationQuarantineItem> {\r\n this.mutationLoading.set(`${action}-${item.itemId}`);\r\n const request =\r\n action === 'retry'\r\n ? this.api.retryFinalizationQuarantine(item.itemId, reason)\r\n : this.api.acknowledgeFinalizationQuarantine(item.itemId, reason);\r\n return request.pipe(\r\n switchMap((updated) =>\r\n this.loadQuarantine(true).pipe(map(() => updated)),\r\n ),\r\n tap(() => {\r\n this.showSuccess(\r\n action === 'retry'\r\n ? 'quarantine-retry-submitted'\r\n : 'quarantine-acknowledged',\r\n );\r\n }),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n loadHostEvidence(reset = true) {\r\n this.hostEvidenceLoading.set(true);\r\n const cursor = reset ? null : this.hostEvidenceNextCursor();\r\n return this.api.getHostEvidence(cursor, 100).pipe(\r\n tap((page) => {\r\n this.hostEvidence.set(\r\n reset\r\n ? page.items\r\n : mergeHostEvidence(this.hostEvidence(), page.items),\r\n );\r\n this.hostEvidenceNextCursor.set(page.nextCursor);\r\n this.hostEvidenceScanBudgetExhausted.set(page.scanBudgetExhausted);\r\n }),\r\n finalize(() => this.hostEvidenceLoading.set(false)),\r\n );\r\n }\r\n\r\n exportHostEvidence(\r\n evidenceOccurrenceId: string,\r\n ): Observable<EmailEvidenceDownload> {\r\n this.mutationLoading.set(`export-${evidenceOccurrenceId}`);\r\n return this.api\r\n .exportHostEvidence(evidenceOccurrenceId)\r\n .pipe(finalize(() => this.mutationLoading.set(null)));\r\n }\r\n\r\n decideHostEvidence(\r\n item: EmailHostEvidenceItem,\r\n action: 'repair' | 'acknowledge',\r\n reason: string,\r\n ): Observable<EmailHostEvidenceItem> {\r\n if (!item.evidenceOccurrenceId || !item.decisionToken) {\r\n return throwError(() => new Error('Incomplete evidence identity'));\r\n }\r\n this.mutationLoading.set(`${action}-${item.evidenceOccurrenceId}`);\r\n const request: EmailEvidenceDecisionRequest = {\r\n reason,\r\n decisionToken: item.decisionToken,\r\n };\r\n const operation =\r\n action === 'repair'\r\n ? this.api.repairHostEvidence(item.evidenceOccurrenceId, request)\r\n : this.api.acknowledgeHostEvidence(item.evidenceOccurrenceId, request);\r\n return operation.pipe(\r\n switchMap((updated) =>\r\n this.loadHostEvidence(true).pipe(map(() => updated)),\r\n ),\r\n tap(() => {\r\n this.showSuccess(\r\n action === 'repair' ? 'evidence-repaired' : 'evidence-acknowledged',\r\n );\r\n }),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n rebuildEvidenceIndex(take: number): Observable<EmailEvidenceRebuildResult> {\r\n this.mutationLoading.set('rebuild-evidence');\r\n return this.api.rebuildEvidenceIndex(take).pipe(\r\n switchMap((result) =>\r\n this.loadHostEvidence(true).pipe(map(() => result)),\r\n ),\r\n tap(() => this.showSuccess('evidence-index-rebuilt')),\r\n finalize(() => this.mutationLoading.set(null)),\r\n );\r\n }\r\n\r\n providerByKey(\r\n key: string | null | undefined,\r\n ): EmailProviderDescriptor | null {\r\n return this.providers().find((provider) => provider.key === key) ?? null;\r\n }\r\n\r\n describeCode(code: string | null | undefined): string {\r\n if (!code) return this.transloco.translate('email-delivery.unknown-code');\r\n const key = `email-delivery.codes.${code}`;\r\n const translated = this.transloco.translate(key);\r\n if (translated !== key) return translated;\r\n\r\n const contract = this.errorCatalog().find((entry) => entry.code === code);\r\n if (!contract || contract.frontendAction === 'none') return code;\r\n\r\n const actionKey = `email-delivery.error-actions.${contract.frontendAction}`;\r\n const action = this.transloco.translate(actionKey);\r\n return action === actionKey ? code : `${action} (${code})`;\r\n }\r\n\r\n /**\r\n * The one sentence every failure path shows. It prefers the backend's stable\r\n * code, falls back to the transport status the contract assigns a required\r\n * behaviour to (401/403/409/422/428/429/503), and always appends the\r\n * correlation ID when one is available — that identifier is what support asks\r\n * for, and it is the only part of a failure this page is allowed to keep.\r\n */\r\n describeError(error: unknown): string {\r\n const failure = extractFailure(error);\r\n const parts = [this.describeFailure(failure)];\r\n\r\n if (failure.retryAfterSeconds !== null) {\r\n parts.push(\r\n this.transloco.translate('email-delivery.retry-after', {\r\n seconds: failure.retryAfterSeconds,\r\n }),\r\n );\r\n }\r\n if (failure.correlationId) {\r\n parts.push(\r\n `${this.transloco.translate('email-delivery.correlation-id')}: ${failure.correlationId}`,\r\n );\r\n }\r\n return parts.join(' ');\r\n }\r\n\r\n errorAction(error: unknown): string | null {\r\n const failure = extractFailure(error);\r\n return (\r\n failure.action ||\r\n this.errorCatalog().find((entry) => entry.code === failure.code)\r\n ?.frontendAction ||\r\n statusAction(failure.status)\r\n );\r\n }\r\n\r\n showError(error: unknown): void {\r\n this.toast.error(this.describeError(error));\r\n }\r\n\r\n /**\r\n * A `409` means the server state moved under this page. The contract requires\r\n * reloading it rather than re-submitting over it, so every mutation that can\r\n * conflict routes through here: the latest connection, list and readiness are\r\n * pulled back before the caller sees the rejection.\r\n */\r\n private reloadOnConflict<T>(id: string | null): MonoTypeOperatorFunction<T> {\r\n return catchError((error: unknown) => {\r\n if (statusOf(error) !== 409) return throwError(() => error);\r\n const reload = id\r\n ? this.refreshConnection(id).pipe(map(() => undefined))\r\n : forkJoin({\r\n connections: this.loadConnections(),\r\n status: this.loadStatus(),\r\n }).pipe(map(() => undefined));\r\n reload.subscribe({ error: () => undefined });\r\n return throwError(() => error);\r\n });\r\n }\r\n\r\n private describeFailure(failure: EmailDeliveryFailure): string {\r\n const translated = failure.code ? this.translateCode(failure.code) : null;\r\n if (translated) return translated;\r\n\r\n const statusMessage = this.translateStatus(failure.status);\r\n if (statusMessage) {\r\n return failure.code\r\n ? `${statusMessage} (${failure.code})`\r\n : statusMessage;\r\n }\r\n return this.describeCode(failure.code);\r\n }\r\n\r\n private translateCode(code: string): string | null {\r\n const key = `email-delivery.codes.${code}`;\r\n const translated = this.transloco.translate(key);\r\n return translated === key ? null : translated;\r\n }\r\n\r\n private translateStatus(status: number | null): string | null {\r\n const key = status === null ? null : HTTP_STATUS_KEYS[status];\r\n if (!key) return null;\r\n const fullKey = `email-delivery.http.${key}`;\r\n const translated = this.transloco.translate(fullKey);\r\n return translated === fullKey ? null : translated;\r\n }\r\n\r\n takePendingAuthorizationConnection(): string | null {\r\n if (typeof sessionStorage === 'undefined') return null;\r\n const id = sessionStorage.getItem(PENDING_AUTHORIZATION_STORAGE_KEY);\r\n sessionStorage.removeItem(PENDING_AUTHORIZATION_STORAGE_KEY);\r\n return id;\r\n }\r\n\r\n /**\r\n * A completed controlled test writes its own Activity row, so the loaded\r\n * Activity list is stale the moment the test returns. Only refresh once\r\n * Activity has been opened — before that its own load covers it, and the\r\n * status filter in effect there is preserved.\r\n */\r\n private refreshActivity(): void {\r\n if (!this.attemptsLoaded) return;\r\n this.loadAttempts(true).subscribe({ error: () => undefined });\r\n }\r\n\r\n private refreshConnection(id: string): Observable<EmailConnectionDetails> {\r\n return forkJoin({\r\n details: this.api.getConnection(id),\r\n connections: this.api.getConnections(),\r\n status: this.api.getStatus(),\r\n }).pipe(\r\n tap(({ details, connections, status }) => {\r\n this.selectedConnection.set(details);\r\n this.connections.set(connections);\r\n this.status.set(status);\r\n }),\r\n map(({ details }) => details),\r\n );\r\n }\r\n\r\n private rememberAuthorizationConnection(id: string): void {\r\n if (typeof sessionStorage === 'undefined') return;\r\n sessionStorage.setItem(PENDING_AUTHORIZATION_STORAGE_KEY, id);\r\n }\r\n\r\n private showSuccess(key: string): void {\r\n this.toast.success(this.transloco.translate(`email-delivery.${key}`));\r\n }\r\n}\r\n\r\n/**\r\n * What this page can safely learn about a failure: the stable code, the action\r\n * the contract assigns to it, the correlation ID support asks for, and the\r\n * transport status. Never the response body, the recipients, or any secret.\r\n */\r\ninterface EmailDeliveryFailure {\r\n code: string | null;\r\n action: string | null;\r\n correlationId: string | null;\r\n retryAfterSeconds: number | null;\r\n status: number | null;\r\n}\r\n\r\nconst HTTP_STATUS_KEYS: Record<number, string> = {\r\n 401: 'unauthorized',\r\n 403: 'forbidden',\r\n 409: 'conflict',\r\n 422: 'unprocessable',\r\n 428: 'authorization-required',\r\n 429: 'too-many-requests',\r\n 503: 'unavailable',\r\n};\r\n\r\nconst HTTP_STATUS_ACTIONS: Record<number, string> = {\r\n 403: 'request_permission',\r\n 409: 'refresh',\r\n 422: 'correct_configuration',\r\n 428: 'authorize',\r\n 429: 'retry_later',\r\n 503: 'retry_later',\r\n};\r\n\r\nfunction statusAction(status: number | null): string | null {\r\n return status === null ? null : (HTTP_STATUS_ACTIONS[status] ?? null);\r\n}\r\n\r\nfunction statusOf(error: unknown): number | null {\r\n return error instanceof HttpErrorResponse ? error.status : null;\r\n}\r\n\r\nfunction extractFailure(error: unknown): EmailDeliveryFailure {\r\n const body = error instanceof HttpErrorResponse ? error.error : error;\r\n const problem = readProblem(body);\r\n const headers = error instanceof HttpErrorResponse ? error.headers : null;\r\n\r\n return {\r\n code: problem?.code ?? null,\r\n action: problem?.action || null,\r\n correlationId:\r\n problem?.correlationId ||\r\n headers?.get('x-correlation-id') ||\r\n headers?.get('correlation-id') ||\r\n null,\r\n retryAfterSeconds:\r\n problem?.retryAfterSeconds ??\r\n parseRetryAfter(headers?.get('retry-after') ?? null),\r\n status: statusOf(error),\r\n };\r\n}\r\n\r\n/**\r\n * Two envelopes reach this page. The email contract answers with the problem\r\n * shape itself; Gateway rejects a request before it ever gets there and answers\r\n * with `{ errors: { code, message } }` — that is how `REQ_001` arrives, and\r\n * reading only the first shape lost it.\r\n */\r\nfunction readProblem(body: unknown): Partial<EmailDeliveryProblem> | null {\r\n if (typeof body !== 'object' || body === null) return null;\r\n\r\n const problem = body as Partial<EmailDeliveryProblem> & {\r\n errors?: { code?: unknown } | null;\r\n };\r\n if (typeof problem.code === 'string') return problem;\r\n\r\n const gatewayCode = problem.errors?.code;\r\n if (typeof gatewayCode === 'string') {\r\n return { ...problem, code: gatewayCode };\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * `Retry-After` is either a delay in seconds or an HTTP date. Both become a\r\n * whole number of seconds so the message can say when to try again; anything\r\n * unparseable or already in the past is simply not offered.\r\n */\r\nfunction parseRetryAfter(value: string | null): number | null {\r\n if (!value) return null;\r\n\r\n const seconds = Number(value);\r\n if (Number.isFinite(seconds)) {\r\n return seconds > 0 ? Math.ceil(seconds) : null;\r\n }\r\n\r\n const date = Date.parse(value);\r\n if (Number.isNaN(date)) return null;\r\n const delta = Math.ceil((date - Date.now()) / 1000);\r\n return delta > 0 ? delta : null;\r\n}\r\n\r\nfunction mergeById<T extends Record<K, string>, K extends keyof T>(\r\n current: T[],\r\n incoming: T[],\r\n key: K,\r\n): T[] {\r\n const values = new Map(current.map((item) => [item[key], item]));\r\n incoming.forEach((item) => values.set(item[key], item));\r\n return Array.from(values.values());\r\n}\r\n\r\nfunction replaceById<T extends Record<K, string>, K extends keyof T>(\r\n current: T[],\r\n replacement: T,\r\n key: K,\r\n): T[] {\r\n return current.map((item) =>\r\n item[key] === replacement[key] ? replacement : item,\r\n );\r\n}\r\n\r\nfunction mergeHostEvidence(\r\n current: EmailHostEvidenceItem[],\r\n incoming: EmailHostEvidenceItem[],\r\n): EmailHostEvidenceItem[] {\r\n const identity = (item: EmailHostEvidenceItem) =>\r\n item.evidenceOccurrenceId ?? item.itemId;\r\n const values = new Map(current.map((item) => [identity(item), item]));\r\n incoming.forEach((item) => values.set(identity(item), item));\r\n return Array.from(values.values());\r\n}\r\n","import { HttpErrorResponse } from '@angular/common/http';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n DestroyRef,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\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 { TextareaField } from '@masterteam/components/textarea-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { timer, type Observable } from 'rxjs';\r\nimport { EmailDeliveryStatus } from '../../components/email-delivery-status/email-delivery-status';\r\nimport { EmailDeliveryFacade } from '../../email-delivery.facade';\r\nimport type { EmailUserTestDispatchResult } from '../../email-delivery.model';\r\nimport {\r\n areEmailTestRecipientsValid,\r\n createEmailTestRequestId,\r\n type EmailTemplatePlaceholderField,\r\n isEmailTestRequestPending,\r\n parseEmailTestRecipients,\r\n} from '../../email-test.utils';\r\n\r\nexport type EmailUserTestKind = 'template' | 'alert';\r\n\r\ninterface MetadataControl {\r\n key: string;\r\n label: string;\r\n control: FormControl<string>;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-email-user-test-dialog',\r\n standalone: true,\r\n imports: [\r\n ReactiveFormsModule,\r\n TranslocoDirective,\r\n Button,\r\n TextareaField,\r\n TextField,\r\n EmailDeliveryStatus,\r\n ],\r\n templateUrl: './email-user-test-dialog.html',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class EmailUserTestDialog {\r\n readonly kind = input.required<EmailUserTestKind>();\r\n readonly eventId = input<number | null>(null);\r\n readonly templateId = input<number | null>(null);\r\n readonly alertId = input<number | null>(null);\r\n readonly sourceLabel = input('');\r\n readonly placeholderKeys = input<readonly string[]>([]);\r\n readonly placeholderFields = input<readonly EmailTemplatePlaceholderField[]>(\r\n [],\r\n );\r\n /**\r\n * When given, these values fill the placeholders and the per-placeholder\r\n * fields are not shown (the notification editor sends the same readable\r\n * samples as its preview).\r\n */\r\n readonly sampleValues = input<Readonly<Record<string, string>> | null>(null);\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\r\n // `mt-field-validation` renders whichever error carries a `message`; a bare\r\n // `true` falls through to the generic \"invalid <key>\" fallback, which is how\r\n // a mistyped address ends up disabling Send with nothing said about why. The\r\n // message is read at validation time so it follows the active language.\r\n protected readonly recipients = new FormControl('', {\r\n nonNullable: true,\r\n validators: [\r\n Validators.required,\r\n (control) =>\r\n !String(control.value ?? '').trim() ||\r\n areEmailTestRecipientsValid(control.value)\r\n ? null\r\n : { invalidRecipients: { message: this.t('recipients-invalid') } },\r\n ],\r\n });\r\n protected readonly metadataControls = signal<MetadataControl[]>([]);\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<EmailUserTestDispatchResult | null>(null);\r\n private pollIndex = 0;\r\n\r\n constructor() {\r\n effect(() => {\r\n const current = new Map(\r\n this.metadataControls().map((item) => [item.key, item.control.value]),\r\n );\r\n const fields = new Map<string, EmailTemplatePlaceholderField>();\r\n for (const field of this.placeholderFields()) {\r\n const key = field.key.trim();\r\n if (!key || fields.has(key)) continue;\r\n fields.set(key, {\r\n key,\r\n label: field.label.trim() || key,\r\n });\r\n }\r\n for (const rawKey of this.placeholderKeys()) {\r\n const key = rawKey.trim();\r\n if (key && !fields.has(key)) fields.set(key, { key, label: key });\r\n }\r\n const placeholders = Array.from(fields.values()).sort(\r\n (left, right) =>\r\n left.label.localeCompare(right.label) ||\r\n left.key.localeCompare(right.key),\r\n );\r\n\r\n if (\r\n placeholders.length === this.metadataControls().length &&\r\n placeholders.every((field, index) => {\r\n const currentField = this.metadataControls()[index];\r\n return (\r\n currentField?.key === field.key &&\r\n currentField.label === field.label\r\n );\r\n })\r\n ) {\r\n return;\r\n }\r\n\r\n this.metadataControls.set(\r\n placeholders.map(({ key, label }) => ({\r\n key,\r\n label,\r\n control: new FormControl(current.get(key) ?? '', {\r\n nonNullable: true,\r\n }),\r\n })),\r\n );\r\n });\r\n }\r\n\r\n protected canSubmit(): boolean {\r\n return (\r\n this.recipients.valid &&\r\n !this.result() &&\r\n !this.polling() &&\r\n this.facade.mutationLoading() === null &&\r\n this.hasValidTarget()\r\n );\r\n }\r\n\r\n protected submit(): void {\r\n this.recipients.markAsTouched();\r\n if (!this.canSubmit()) return;\r\n\r\n const request = {\r\n testRequestId: this.testRequestId(),\r\n emails: parseEmailTestRecipients(this.recipients.value),\r\n metadata:\r\n this.sampleValues() ??\r\n Object.fromEntries(\r\n this.metadataControls().map(({ key, control }) => [\r\n key,\r\n control.value,\r\n ]),\r\n ),\r\n };\r\n const operation = this.operation(request);\r\n if (!operation) return;\r\n\r\n operation.subscribe({\r\n next: (result) => this.acceptResult(result),\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 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 protected close(): void {\r\n this.ref.close(this.result());\r\n }\r\n\r\n private operation(request: {\r\n testRequestId: string;\r\n emails: string[];\r\n metadata: Record<string, string>;\r\n }): Observable<EmailUserTestDispatchResult> | null {\r\n if (this.kind() === 'template') {\r\n const eventId = this.eventId();\r\n const templateId = this.templateId();\r\n return eventId != null && templateId != null\r\n ? this.facade.sendTemplateTest(eventId, templateId, request)\r\n : null;\r\n }\r\n\r\n const alertId = this.alertId();\r\n return alertId != null ? this.facade.sendAlertTest(alertId, request) : null;\r\n }\r\n\r\n private hasValidTarget(): boolean {\r\n return this.kind() === 'template'\r\n ? this.eventId() != null && this.templateId() != null\r\n : this.alertId() != null;\r\n }\r\n\r\n private acceptResult(result: EmailUserTestDispatchResult): void {\r\n if (isEmailTestRequestPending(result.requestState)) {\r\n this.startPolling();\r\n return;\r\n }\r\n this.result.set(result);\r\n this.timedOut.set(false);\r\n this.polling.set(false);\r\n }\r\n\r\n /**\r\n * Retrieval in progress is not the same thing as a lost result. A `202` and a\r\n * pending request state are the normal accepted path, so they only raise\r\n * `polling`; `timedOut` is reserved for the poll budget running out or a\r\n * retrieval that failed, which are the states that actually ask the operator\r\n * to act.\r\n */\r\n private startPolling(): void {\r\n if (this.polling()) return;\r\n this.timedOut.set(false);\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 this.timedOut.set(true);\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 private retrieveStoredResult(fromPoll: boolean): void {\r\n this.facade.retrieveUserTest(this.testRequestId()).subscribe({\r\n next: (result) => {\r\n if (fromPoll && isEmailTestRequestPending(result.requestState)) {\r\n this.schedulePoll();\r\n return;\r\n }\r\n this.acceptResult(result);\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 protected t(key: string): string {\r\n return this.transloco.translate(`email-delivery.user-test.${key}`);\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\nconst TEST_REQUEST_CONFLICT_CODE = 'email.delivery_test_request_conflict';\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\r\nfunction isTestRequestConflict(error: unknown): boolean {\r\n const body = error instanceof HttpErrorResponse ? error.error : error;\r\n if (typeof body !== 'object' || body === null) return false;\r\n const value = body as {\r\n code?: unknown;\r\n errors?: { code?: unknown } | null;\r\n };\r\n return (\r\n value.code === TEST_REQUEST_CONFLICT_CODE ||\r\n value.errors?.code === TEST_REQUEST_CONFLICT_CODE\r\n );\r\n}\r\n","<ng-container *transloco=\"let t; prefix: 'email-delivery.user-test'\">\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(\"real-email-warning-title\") }}</strong>\r\n {{\r\n t(sampleValues() ? \"real-email-warning-samples\" : \"real-email-warning\")\r\n }}\r\n </div>\r\n\r\n <!-- The test request ID is still generated and sent (it makes a retry\r\n safe); it is not something the user acts on, so it is not shown. -->\r\n @if (sourceLabel()) {\r\n <p class=\"mb-4 text-sm font-medium\">{{ sourceLabel() }}</p>\r\n }\r\n\r\n @if (!result()) {\r\n <div class=\"grid gap-4\">\r\n <mt-textarea-field\r\n [formControl]=\"recipients\"\r\n [label]=\"t('recipients')\"\r\n [placeholder]=\"t('recipients-placeholder')\"\r\n [hint]=\"t('recipients-hint')\"\r\n rows=\"3\"\r\n [required]=\"true\"\r\n />\r\n\r\n @if (sampleValues()) {\r\n <!-- The host fills the placeholders with sample values. -->\r\n } @else if (metadataControls().length > 0) {\r\n <div class=\"rounded-md border border-surface-200 p-4\">\r\n <p class=\"m-0 text-sm font-semibold\">\r\n {{ t(\"placeholder-values\") }}\r\n </p>\r\n <p class=\"mt-1 mb-4 text-xs text-muted-color\">\r\n {{ t(\"placeholder-values-hint\") }}\r\n </p>\r\n <div class=\"grid gap-4 md:grid-cols-2\">\r\n @for (item of metadataControls(); track item.key) {\r\n <mt-text-field\r\n [formControl]=\"item.control\"\r\n [label]=\"item.label\"\r\n [placeholder]=\"t('placeholder-value')\"\r\n />\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <p class=\"m-0 text-sm text-muted-color\">\r\n {{ t(\"no-placeholders\") }}\r\n </p>\r\n }\r\n </div>\r\n }\r\n\r\n @if (polling() && !result()) {\r\n <div\r\n class=\"mt-4 rounded-md border border-surface-200 bg-surface-50 px-4 py-3\"\r\n aria-live=\"polite\"\r\n >\r\n <p class=\"m-0 font-semibold\">\r\n {{ t(\"pending-title\") }}\r\n </p>\r\n <p class=\"mt-1 mb-0 text-sm text-muted-color\">\r\n {{ t(\"pending-description\") }}\r\n </p>\r\n </div>\r\n } @else if (timedOut() && !result()) {\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=\"m-0 font-semibold text-orange-950\">\r\n {{ t(\"timeout-title\") }}\r\n </p>\r\n <p class=\"mt-1 mb-0 text-sm text-orange-900\">\r\n {{ t(\"timeout-description\") }}\r\n </p>\r\n </div>\r\n }\r\n\r\n @if (result(); as dispatch) {\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 <p class=\"m-0 font-semibold\">\r\n {{ dispatch.allAccepted ? t(\"accepted\") : t(\"not-accepted\") }}\r\n </p>\r\n @if (dispatch.expectedRecipientCount !== null) {\r\n <p class=\"mt-1 mb-0 text-sm text-muted-color\">\r\n {{ t(\"recipient-count\") }}: {{ dispatch.expectedRecipientCount }}\r\n </p>\r\n }\r\n @if (dispatch.allAccepted) {\r\n <p class=\"mt-3 mb-0 text-sm font-medium text-amber-800\">\r\n {{ t(\"accepted-unconfirmed\") }}\r\n </p>\r\n }\r\n\r\n @for (item of dispatch.results; track $index) {\r\n <div\r\n class=\"mt-3 rounded-md border border-surface-200 bg-surface-0 p-3\"\r\n >\r\n <mt-email-delivery-status kind=\"attempt\" [value]=\"item.outcome\" />\r\n <p class=\"mt-1 mb-0 text-xs text-muted-color\">\r\n {{ facade.describeCode(item.code) }}\r\n </p>\r\n </div>\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 ((polling() || timedOut()) && !result()) {\r\n <mt-button\r\n [label]=\"t('retrieve')\"\r\n icon=\"arrow.refresh-cw-01\"\r\n [disabled]=\"polling()\"\r\n [loading]=\"\r\n polling() || facade.mutationLoading() === 'retrieve-user-test'\r\n \"\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('send')\"\r\n icon=\"communication.send-01\"\r\n [disabled]=\"!canSubmit()\"\r\n [loading]=\"\r\n facade.mutationLoading() === 'template-test' ||\r\n facade.mutationLoading() === 'alert-test'\r\n \"\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 {\n HttpClient,\n HttpErrorResponse,\n HttpHeaders,\n} from '@angular/common/http';\nimport { computed, inject, Injectable, signal } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport {\n catchError,\n finalize,\n map,\n type Observable,\n tap,\n throwError,\n} from 'rxjs';\nimport { EMAIL_DELIVERY_OPTIONS } from './email-delivery.config';\nimport type { AppResponse } from './email-delivery.model';\nimport type {\n EmailLayoutDiagnostic,\n EmailLayoutPreview,\n EmailLayoutSnapshot,\n} from './email-layout.model';\n\n/**\n * State for the Email design tab. The working draft lives here rather than in\n * the tab so switching between Connections / Activity / Email design keeps\n * unsaved edits; leaving the page asks first (`emailDesignLeaveGuard`).\n *\n * There is no server-side draft: the base is only ever previewed (render-only)\n * or published with the revision it was read at.\n */\n@Injectable({ providedIn: 'root' })\nexport class EmailLayoutFacade {\n private readonly http = inject(HttpClient);\n private readonly options = inject(EMAIL_DELIVERY_OPTIONS);\n private readonly transloco = inject(TranslocoService);\n // Failures arrive as a bare stable code; the tab translates it itself.\n private readonly headers = new HttpHeaders({ noMessage: 'true' });\n\n readonly snapshot = signal<EmailLayoutSnapshot | null>(null);\n readonly draft = signal('');\n readonly loading = signal(false);\n readonly loadErrorCode = signal<string | null>(null);\n readonly loadFailed = signal(false);\n readonly saving = signal<'publish' | 'restore' | null>(null);\n /** Someone else published since this draft's baseline was read. */\n readonly conflict = signal(false);\n\n readonly dirty = computed(() => {\n const snapshot = this.snapshot();\n return snapshot !== null && this.draft() !== snapshot.body;\n });\n\n load(): Observable<EmailLayoutSnapshot> {\n this.loading.set(true);\n this.loadFailed.set(false);\n this.loadErrorCode.set(null);\n return this.http\n .get<\n AppResponse<EmailLayoutSnapshot>\n >(this.url(), { headers: this.headers })\n .pipe(\n map((response) => response.data),\n tap((snapshot) => {\n // Never overwrite edits the user has not saved yet.\n if (!this.dirty()) this.draft.set(snapshot.body);\n this.snapshot.set(snapshot);\n }),\n catchError((error: unknown) => {\n this.loadFailed.set(true);\n this.loadErrorCode.set(readLayoutErrorCode(error));\n return throwError(() => error);\n }),\n finalize(() => this.loading.set(false)),\n );\n }\n\n /** Render-only: the server supplies a fixed bilingual sample; nothing is saved or sent. */\n preview(body: string): Observable<EmailLayoutPreview> {\n return this.http\n .post<\n AppResponse<EmailLayoutPreview>\n >(this.url('preview'), { body }, { headers: this.headers })\n .pipe(map((response) => response.data));\n }\n\n publish(): Observable<EmailLayoutSnapshot> {\n const snapshot = this.snapshot();\n if (!snapshot) return throwError(() => new Error('Layout not loaded'));\n this.saving.set('publish');\n return this.http\n .put<\n AppResponse<EmailLayoutSnapshot>\n >(this.url(), { body: this.draft(), expectedRevision: snapshot.revision }, { headers: this.headers })\n .pipe(\n map((response) => response.data),\n tap((published) => this.adopt(published)),\n catchError((error: unknown) => this.onWriteError(error)),\n finalize(() => this.saving.set(null)),\n );\n }\n\n restorePrevious(): Observable<EmailLayoutSnapshot> {\n const snapshot = this.snapshot();\n if (!snapshot) return throwError(() => new Error('Layout not loaded'));\n this.saving.set('restore');\n return this.http\n .post<\n AppResponse<EmailLayoutSnapshot>\n >(this.url('restore'), { expectedRevision: snapshot.revision }, { headers: this.headers })\n .pipe(\n map((response) => response.data),\n tap((restored) => this.adopt(restored)),\n catchError((error: unknown) => this.onWriteError(error)),\n finalize(() => this.saving.set(null)),\n );\n }\n\n /**\n * Re-reads the live design after a conflict. `keepDraft` keeps the user's\n * edits on top of the newer baseline, so the next publish applies them\n * deliberately; otherwise the draft is replaced by what is live.\n */\n reloadLatest(keepDraft: boolean): Observable<EmailLayoutSnapshot> {\n const draft = this.draft();\n return this.load().pipe(\n tap((snapshot) => {\n this.draft.set(keepDraft ? draft : snapshot.body);\n this.conflict.set(false);\n }),\n );\n }\n\n discard(): void {\n const snapshot = this.snapshot();\n if (snapshot) this.draft.set(snapshot.body);\n }\n\n describeCode(code: string | null): string {\n if (code) {\n const key = `email-delivery.design.codes.${code}`;\n const translated = this.transloco.translate(key);\n if (translated !== key) return translated;\n }\n return this.transloco.translate('email-delivery.design.codes.generic', {\n code: code ?? '—',\n });\n }\n\n describeDiagnostic(diagnostic: EmailLayoutDiagnostic): string {\n const key = `email-delivery.design.codes.${diagnostic.code}`;\n const translated = this.transloco.translate(key);\n const message = translated === key ? diagnostic.code : translated;\n return diagnostic.path ? `${message} (${diagnostic.path})` : message;\n }\n\n readErrorCode(error: unknown): string | null {\n return readLayoutErrorCode(error);\n }\n\n private adopt(snapshot: EmailLayoutSnapshot): void {\n // The server returns the sanitized body it stored; show exactly that.\n this.snapshot.set(snapshot);\n this.draft.set(snapshot.body);\n this.conflict.set(false);\n }\n\n private onWriteError(error: unknown): Observable<never> {\n if (\n (error instanceof HttpErrorResponse && error.status === 409) ||\n readLayoutErrorCode(error) === 'EMAIL_REVISION_CONFLICT'\n ) {\n this.conflict.set(true);\n }\n return throwError(() => error);\n }\n\n private url(path = ''): string {\n const base = this.options.notificationApiBasePath.replace(/\\/$/, '');\n return path ? `${base}/email-layout/${path}` : `${base}/email-layout`;\n }\n}\n\nfunction readLayoutErrorCode(error: unknown): string | null {\n const body = error instanceof HttpErrorResponse ? error.error : error;\n const code = (body as { errors?: { code?: unknown } } | null)?.errors?.code;\n return typeof code === 'string' ? code : null;\n}\n\nexport function readLayoutErrorDiagnostics(\n error: unknown,\n): EmailLayoutDiagnostic[] {\n const body = error instanceof HttpErrorResponse ? error.error : error;\n const details = (body as { errors?: { details?: unknown } } | null)?.errors\n ?.details;\n return Array.isArray(details)\n ? details.filter(\n (item): item is EmailLayoutDiagnostic =>\n typeof item === 'object' &&\n item !== null &&\n typeof (item as EmailLayoutDiagnostic).code === 'string',\n )\n : [];\n}\n","import { inject } from '@angular/core';\nimport type { CanDeactivateFn } from '@angular/router';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { ConfirmationService } from '@masterteam/components/confirmation';\nimport { Observable } from 'rxjs';\nimport { EmailLayoutFacade } from './email-layout.facade';\n\n/**\n * Leaving the Email page with an unpublished design draft asks once. Switching\n * tabs inside the page is not a navigation away — the draft lives in\n * `EmailLayoutFacade` and is still there when the tab is reopened.\n */\nexport const emailDesignLeaveGuard: CanDeactivateFn<unknown> = () => {\n const facade = inject(EmailLayoutFacade);\n if (facade.saving()) return false;\n if (!facade.dirty()) return true;\n\n const confirmation = inject(ConfirmationService);\n const transloco = inject(TranslocoService);\n const t = (key: string) =>\n transloco.translate(`email-delivery.design.leave.${key}`);\n\n return new Observable<boolean>((subscriber) => {\n confirmation.confirm({\n header: t('header'),\n message: t('message'),\n icon: 'alert.alert-triangle',\n acceptLabel: t('discard'),\n rejectLabel: t('stay'),\n acceptButton: { severity: 'danger' },\n accept: () => {\n facade.discard();\n subscriber.next(true);\n subscriber.complete();\n },\n reject: () => {\n subscriber.next(false);\n subscriber.complete();\n },\n });\n });\n};\n","import type { Routes } from '@angular/router';\nimport { emailDesignLeaveGuard } from './email-design-leave.guard';\n\nexport const EMAIL_DELIVERY_ROUTES: Routes = [\n {\n path: '',\n canDeactivate: [emailDesignLeaveGuard],\n loadComponent: () =>\n import('./shell/email-delivery-shell').then(\n (module) => module.EmailDeliveryShell,\n ),\n },\n { path: '**', redirectTo: '' },\n];\n","/**\n * Shared notification email design (Pplus5.BE `NotificationEmailLayoutController`,\n * `api/notifications/email-layout`). One published base wraps every newly\n * prepared notification email; event templates hold business content only.\n */\nexport type EmailLayoutSource = 'published' | 'configured' | 'recommended';\n\nexport interface EmailLayoutDiagnostic {\n code: string;\n severity: string;\n path: string;\n}\n\nexport interface EmailLayoutSnapshot {\n body: string;\n source: EmailLayoutSource;\n /** `0` before the first publication — submit exactly that for the first publish. */\n revision: number;\n hash: string;\n clientBaseUrl: string;\n canRestore: boolean;\n diagnostics: EmailLayoutDiagnostic[];\n approvedImageOrigins: string[];\n}\n\nexport interface EmailLayoutPreview {\n html: string;\n text: string;\n sanitizedBody: string;\n layoutHash: string;\n contentHash: string;\n /** The live revision when the preview ran; differs from the baseline after someone else publishes. */\n effectiveRevision: number;\n fidelity: 'browser';\n approvedImageOrigins: string[];\n diagnostics: EmailLayoutDiagnostic[];\n}\n\n/** The one literal slot every base must contain exactly once. */\nexport const EMAIL_LAYOUT_CONTENT_SLOT = '{content}';\n\n/** UTF-8 byte limit for the base HTML. */\nexport const EMAIL_LAYOUT_MAX_BYTES = 128 * 1024;\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n effect,\n input,\n viewChild,\n} from '@angular/core';\n\nexport interface EmailPreviewDocumentOptions {\n showImages: boolean;\n approvedImageOrigins: readonly string[];\n /** Wrap a content fragment (an App message) in a minimal document. */\n fragment: boolean;\n direction: 'ltr' | 'rtl' | null;\n}\n\n/**\n * Renders server-composed notification HTML without letting it touch the app.\n *\n * The frame is an opaque origin (`sandbox=\"\"`: no scripts, forms, popups,\n * same-origin or top navigation), sends no referrer, and the document carries\n * its own CSP: nothing loads except inline styles, and images only from the\n * approved origins once the viewer opts in. Links are stripped from this\n * preview-only copy so a click cannot navigate the frame; scrolling and\n * keyboard focus still work. The source is never injected into the app DOM.\n */\n@Component({\n selector: 'mt-email-html-preview',\n template: `<iframe\n #frame\n sandbox=\"\"\n referrerpolicy=\"no-referrer\"\n [attr.title]=\"title()\"\n class=\"block w-full border-0 bg-white\"\n [style.height]=\"height()\"\n ></iframe>`,\n host: { class: 'block min-w-0' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EmailHtmlPreview {\n readonly html = input<string>('');\n readonly showImages = input(false);\n readonly approvedImageOrigins = input<readonly string[]>([]);\n readonly fragment = input(false);\n readonly direction = input<'ltr' | 'rtl' | null>(null);\n readonly title = input('');\n readonly height = input('28rem');\n\n private readonly frame =\n viewChild.required<ElementRef<HTMLIFrameElement>>('frame');\n\n constructor() {\n effect(() => {\n this.frame().nativeElement.srcdoc = buildEmailPreviewDocument(\n this.html(),\n {\n showImages: this.showImages(),\n approvedImageOrigins: this.approvedImageOrigins(),\n fragment: this.fragment(),\n direction: this.direction(),\n },\n );\n });\n }\n}\n\nconst BLOCKED_ELEMENTS =\n 'script, iframe, frame, object, embed, form, link, base, meta';\nconst ORIGIN_PATTERN = /^https:\\/\\/[a-z0-9.-]+(:\\d{1,5})?$/i;\n\nexport function buildEmailPreviewDocument(\n html: string,\n options: EmailPreviewDocumentOptions,\n): string {\n const source = options.fragment\n ? `<!doctype html><html><head></head><body>${html}</body></html>`\n : html;\n const doc = new DOMParser().parseFromString(source, 'text/html');\n\n doc.querySelectorAll(BLOCKED_ELEMENTS).forEach((node) => node.remove());\n doc.querySelectorAll('*').forEach((element) => {\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.name.toLowerCase().startsWith('on')) {\n element.removeAttribute(attribute.name);\n }\n }\n });\n doc.querySelectorAll('a').forEach((anchor) => {\n anchor.removeAttribute('href');\n anchor.removeAttribute('target');\n anchor.setAttribute('aria-disabled', 'true');\n });\n\n const origins = options.approvedImageOrigins.filter((origin) =>\n ORIGIN_PATTERN.test(origin),\n );\n const imageSources =\n options.showImages && origins.length > 0 ? origins.join(' ') : \"'none'\";\n\n const csp = doc.createElement('meta');\n csp.setAttribute('http-equiv', 'Content-Security-Policy');\n csp.setAttribute(\n 'content',\n `default-src 'none'; style-src 'unsafe-inline'; img-src ${imageSources}; font-src 'none'; form-action 'none'`,\n );\n const referrer = doc.createElement('meta');\n referrer.setAttribute('name', 'referrer');\n referrer.setAttribute('content', 'no-referrer');\n doc.head.prepend(csp, referrer);\n\n if (options.fragment) {\n const style = doc.createElement('style');\n style.textContent =\n 'body{margin:16px;font-family:Tahoma,Arial,sans-serif;font-size:14px;line-height:1.6;color:#1f2937;background:#fff}';\n doc.head.append(style);\n if (options.direction) {\n doc.body.setAttribute('dir', options.direction);\n }\n }\n\n return `<!doctype html>${doc.documentElement.outerHTML}`;\n}\n","/**\n * Pure helpers for `mt-email-visual-editor`: building the editing document and\n * turning it back into the exact source format the backend expects.\n *\n * In the canvas, `{{token}}` placeholders and the layout's `{content}` slot are\n * shown as non-editable chips; serialization turns every chip back into its\n * literal text, so the stored HTML never contains editor markup.\n */\n\nimport { EMAIL_LAYOUT_CONTENT_SLOT as CONTENT_SLOT } from '../../email-layout.model';\n\nexport interface EmailEditorPlaceholder {\n key: string;\n label: string;\n}\n\nexport const TOKEN_PATTERN = /\\{\\{\\s*([A-Za-z0-9_.]+)\\s*\\}\\}/g;\n\n/** Canvas-only highlight of the image being edited; never serialized. */\nexport const SELECTED_CLASS = 'mt-selected';\nconst TOKEN_ATTRIBUTE = 'data-mt-token';\nconst SLOT_ATTRIBUTE = 'data-mt-slot';\nconst STRIPPED_ELEMENTS =\n 'script, iframe, frame, object, embed, form, link, base, meta, style';\n\n/** A full HTML document cannot round-trip through a body-only canvas. */\nexport function isFullDocument(source: string): boolean {\n return /<\\s*(html|head|body)\\b/i.test(source);\n}\n\n/**\n * Images load in the canvas only from the origins the server approves (the\n * same ones an email may use); anything else stays a sized placeholder box.\n */\nexport function buildEditingDocument(\n source: string,\n editable: boolean,\n direction: 'ltr' | 'rtl' | null = null,\n imageOrigins: readonly string[] = [],\n): string {\n const dir = direction ? ` dir=\"${direction}\"` : '';\n const origins = canvasImageOrigins(imageOrigins);\n const imgSrc = origins.length > 0 ? origins.join(' ') : \"'none'\";\n const loaded = origins.map((origin) => `img[src^=\"${origin}/\"]`).join(',');\n const style = loaded\n ? `${CANVAS_STYLE}${loaded}{background:none;outline:none}${CANVAS_IMAGE_STATE_STYLE}`\n : `${CANVAS_STYLE}${CANVAS_IMAGE_STATE_STYLE}`;\n return `<!doctype html><html${dir}><head><meta charset=\"utf-8\"><meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; style-src 'unsafe-inline'; img-src ${imgSrc}; font-src 'none'; form-action 'none'\"><style>${style}</style></head><body contenteditable=\"${editable}\" spellcheck=\"true\">${source}</body></html>`;\n}\n\n/** Only well-formed HTTPS origins reach the canvas CSP and style. */\nfunction canvasImageOrigins(origins: readonly string[]): string[] {\n const result: string[] = [];\n for (const origin of origins) {\n try {\n const url = new URL(origin.trim());\n if (url.protocol === 'https:' && !result.includes(url.origin)) {\n result.push(url.origin);\n }\n } catch {\n // Not an origin; leave its images blocked.\n }\n }\n return result;\n}\n\n/** Strips anything active and turns tokens / the slot into chips. */\nexport function decorateCanvas(\n doc: Document,\n placeholders: readonly EmailEditorPlaceholder[],\n slotLabel: string,\n): void {\n doc.body.querySelectorAll(STRIPPED_ELEMENTS).forEach((node) => node.remove());\n doc.body.querySelectorAll('*').forEach((element) => {\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.name.toLowerCase().startsWith('on')) {\n element.removeAttribute(attribute.name);\n }\n }\n });\n\n const labels = new Map(placeholders.map((item) => [item.key, item.label]));\n const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_TEXT);\n const textNodes: Text[] = [];\n while (walker.nextNode()) textNodes.push(walker.currentNode as Text);\n\n for (const node of textNodes) {\n const text = node.data;\n if (!text.includes('{')) continue;\n const pattern = new RegExp(\n `${TOKEN_PATTERN.source}|${escapeRegExp(CONTENT_SLOT)}`,\n 'g',\n );\n if (!pattern.test(text)) continue;\n pattern.lastIndex = 0;\n\n const fragment = doc.createDocumentFragment();\n let last = 0;\n for (const match of text.matchAll(pattern)) {\n const index = match.index ?? 0;\n if (index > last) fragment.append(text.slice(last, index));\n fragment.append(\n match[0] === CONTENT_SLOT\n ? createSlotChip(doc, slotLabel)\n : createTokenChip(doc, match[1], labels.get(match[1]) ?? match[1]),\n );\n last = index + match[0].length;\n }\n if (last < text.length) fragment.append(text.slice(last));\n node.replaceWith(fragment);\n }\n}\n\nexport function createTokenChip(\n doc: Document,\n key: string,\n label: string,\n): HTMLElement {\n const chip = doc.createElement('span');\n chip.setAttribute(TOKEN_ATTRIBUTE, key);\n chip.setAttribute('contenteditable', 'false');\n chip.className = 'mt-token';\n chip.textContent = label;\n return chip;\n}\n\nfunction createSlotChip(doc: Document, label: string): HTMLElement {\n const chip = doc.createElement('span');\n chip.setAttribute(SLOT_ATTRIBUTE, '');\n chip.setAttribute('contenteditable', 'false');\n chip.className = 'mt-slot';\n chip.textContent = label;\n return chip;\n}\n\n/** The canvas body back to source: chips become their literal text again. */\nexport function serializeCanvas(body: HTMLElement): string {\n const clone = body.cloneNode(true) as HTMLElement;\n const doc = body.ownerDocument;\n clone.querySelectorAll(`[${TOKEN_ATTRIBUTE}]`).forEach((chip) => {\n chip.replaceWith(\n doc.createTextNode(`{{${chip.getAttribute(TOKEN_ATTRIBUTE)}}}`),\n );\n });\n clone.querySelectorAll(`[${SLOT_ATTRIBUTE}]`).forEach((chip) => {\n chip.replaceWith(doc.createTextNode(CONTENT_SLOT));\n });\n clone.querySelectorAll(`.${SELECTED_CLASS}`).forEach((element) => {\n element.classList.remove(SELECTED_CLASS);\n if (element.classList.length === 0) element.removeAttribute('class');\n });\n return clone.innerHTML;\n}\n\n/** Static links must be HTTPS; the only dynamic link is the whole `{{webUrl}}`. */\nexport function isAllowedLink(value: string): boolean {\n const trimmed = value.trim();\n if (/^\\{\\{\\s*webUrl\\s*\\}\\}$/i.test(trimmed)) return true;\n try {\n return new URL(trimmed).protocol === 'https:';\n } catch {\n return false;\n }\n}\n\nexport interface EmailImageDraft {\n src: string;\n alt: string;\n width: number | null;\n height: number | null;\n}\n\nexport type EmailImageError = 'no-origins' | 'url' | 'origin' | 'alt' | 'size';\n\nexport const EMAIL_IMAGE_MIN_SIZE = 16;\nexport const EMAIL_IMAGE_MAX_SIZE = 1200;\n\n/**\n * The backend image policy, checked before insertion so the user is told why\n * instead of seeing the image silently removed on save: an approved HTTPS\n * origin, no query or fragment, descriptive alt text, and explicit width and\n * height between 16 and 1200. Inline image styles are never written.\n */\nexport function validateEmailImage(\n image: EmailImageDraft,\n approvedOrigins: readonly string[],\n): EmailImageError | null {\n if (approvedOrigins.length === 0) return 'no-origins';\n let url: URL;\n try {\n url = new URL(image.src.trim());\n } catch {\n return 'url';\n }\n if (url.protocol !== 'https:' || url.search || url.hash) return 'url';\n const approved = approvedOrigins.some(\n (origin) =>\n origin.replace(/\\/$/, '').toLowerCase() === url.origin.toLowerCase(),\n );\n if (!approved) return 'origin';\n if (!image.alt.trim()) return 'alt';\n const inRange = (value: number | null) =>\n value !== null &&\n Number.isInteger(value) &&\n value >= EMAIL_IMAGE_MIN_SIZE &&\n value <= EMAIL_IMAGE_MAX_SIZE;\n if (!inRange(image.width) || !inRange(image.height)) return 'size';\n return null;\n}\n\nexport function buildEmailImage(\n doc: Document,\n image: EmailImageDraft,\n): HTMLImageElement {\n const element = doc.createElement('img');\n applyEmailImage(element, image);\n return element;\n}\n\nexport function applyEmailImage(\n element: HTMLImageElement,\n image: EmailImageDraft,\n): void {\n element.setAttribute('src', image.src.trim());\n element.setAttribute('alt', image.alt.trim());\n element.setAttribute('width', String(image.width));\n element.setAttribute('height', String(image.height));\n element.removeAttribute('style');\n}\n\n/**\n * Formatting the email policy keeps: inline `color`, `background-color` and\n * `font-size` on spans, and `text-align` on blocks. Classes (how Quill applies\n * alignment, size and font) are stripped, so everything here is an inline style.\n */\nexport interface EditorSwatch {\n key: string;\n value: string;\n}\n\nexport const TEXT_COLORS: readonly EditorSwatch[] = [\n { key: 'black', value: '#111827' },\n { key: 'gray', value: '#6b7280' },\n { key: 'red', value: '#b91c1c' },\n { key: 'orange', value: '#c2410c' },\n { key: 'amber', value: '#a16207' },\n { key: 'green', value: '#15803d' },\n { key: 'teal', value: '#0f766e' },\n { key: 'blue', value: '#1d4ed8' },\n { key: 'purple', value: '#6d28d9' },\n { key: 'pink', value: '#be185d' },\n];\n\nexport const HIGHLIGHT_COLORS: readonly EditorSwatch[] = [\n { key: 'yellow', value: '#fef08a' },\n { key: 'green', value: '#bbf7d0' },\n { key: 'teal', value: '#99f6e4' },\n { key: 'blue', value: '#bfdbfe' },\n { key: 'purple', value: '#e9d5ff' },\n { key: 'pink', value: '#fbcfe8' },\n { key: 'red', value: '#fecaca' },\n { key: 'orange', value: '#fed7aa' },\n { key: 'gray', value: '#e5e7eb' },\n];\n\nexport type EditorTextSize = 'small' | 'normal' | 'large' | 'huge';\n\n/** `normal` clears the size, so the text follows the shared design. */\nexport const TEXT_SIZES: readonly { key: EditorTextSize; px: number | null }[] =\n [\n { key: 'small', px: 13 },\n { key: 'normal', px: null },\n { key: 'large', px: 20 },\n { key: 'huge', px: 26 },\n ];\n\n/**\n * `execCommand('fontSize')` can only write `<font size>`, which the policy\n * strips; the editor applies it with a marker size and swaps each marker for a\n * span with a pixel size.\n */\nexport const FONT_SIZE_MARKER = '7';\n\nexport function replaceFontSizeMarkers(doc: Document, px: number): void {\n doc.body\n .querySelectorAll(`font[size=\"${FONT_SIZE_MARKER}\"]`)\n .forEach((font) => {\n const span = doc.createElement('span');\n span.style.fontSize = `${px}px`;\n while (font.firstChild) span.append(font.firstChild);\n // The new size replaces any size already applied inside the selection.\n span.querySelectorAll('span').forEach((inner) => {\n const element = inner as HTMLElement;\n element.style.removeProperty('font-size');\n unwrapIfBare(element);\n });\n font.replaceWith(span);\n });\n}\n\n/**\n * The browser writes strikethrough as `<strike>` (or, with CSS, as\n * `text-decoration-line`); the policy keeps neither, but keeps `<s>`.\n */\nexport function replaceStrikeTags(doc: Document): void {\n doc.body.querySelectorAll('strike').forEach((strike) => {\n const s = doc.createElement('s');\n while (strike.firstChild) s.append(strike.firstChild);\n strike.replaceWith(s);\n });\n}\n\n/**\n * Removes one inline style (`color`, `background-color`, `font-size`) from the\n * spans the range touches; a span left with no attributes is unwrapped.\n */\nexport function clearInlineStyle(\n doc: Document,\n range: Range,\n property: 'color' | 'background-color' | 'font-size',\n): void {\n const touched = Array.from(doc.body.querySelectorAll('span, font')).filter(\n (element) => range.intersectsNode(element),\n );\n for (const element of touched) {\n const html = element as HTMLElement;\n html.style.removeProperty(property);\n if (property === 'color' && element.tagName === 'FONT') {\n element.removeAttribute('color');\n }\n unwrapIfBare(html);\n }\n}\n\nfunction unwrapIfBare(element: HTMLElement): void {\n // Removing the last style property leaves `style=\"\"` behind.\n if (element.getAttribute('style')?.trim() === '') {\n element.removeAttribute('style');\n }\n if (element.attributes.length > 0 || !element.parentNode) return;\n if (element.tagName !== 'SPAN' && element.tagName !== 'FONT') return;\n element.replaceWith(...Array.from(element.childNodes));\n}\n\nexport const BILINGUAL_STARTER =\n '<div lang=\"en\" dir=\"ltr\"><p><br></p></div><div lang=\"ar\" dir=\"rtl\"><p><br></p></div>';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nconst CANVAS_STYLE = [\n 'html{background:#fff}',\n 'body{margin:0;padding:16px 20px;min-height:calc(100vh - 32px);font-family:Tahoma,Arial,sans-serif;font-size:15px;line-height:1.7;color:#1f2937;outline:none;overflow-wrap:anywhere}',\n 'h1{font-size:24px;margin:0 0 12px}h2{font-size:20px;margin:0 0 12px}h3{font-size:17px;margin:0 0 10px}',\n 'p{margin:0 0 12px}ul,ol{margin:0 0 12px;padding-inline-start:24px}',\n 'a{color:#1d4ed8;text-decoration:underline;cursor:text}',\n // Cell outlines only on hover: always-on outlines made layouts look broken.\n 'table{border-collapse:collapse}td:hover,th:hover{outline:1px dashed #cbd5e1;outline-offset:-1px}',\n // An image from an origin that is not approved never loads (CSP); it shows\n // as a sized box with its description.\n 'img{display:inline-block;max-width:100%;background:#f1f5f9;outline:1px dashed #94a3b8;outline-offset:-1px;color:#475569;font:12px/1.4 system-ui,sans-serif;cursor:pointer}',\n '.mt-token{display:inline-block;margin:0 1px;padding:0 6px;border:1px solid #c7d2fe;border-radius:4px;background:#eef2ff;color:#3730a3;font:12px/1.7 system-ui,sans-serif;white-space:nowrap;vertical-align:baseline;user-select:all}',\n '.mt-slot{display:block;margin:4px 0;padding:14px;border:1px dashed #94a3b8;border-radius:6px;background:#f8fafc;color:#475569;font:13px/1.5 system-ui,sans-serif;text-align:center;user-select:none}',\n].join('');\n\n/** After the per-origin rules, so hover and selection always show. */\nconst CANVAS_IMAGE_STATE_STYLE =\n 'img:hover{outline:1px dashed #94a3b8}img.mt-selected{outline:2px solid #2563eb}';\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n computed,\n effect,\n forwardRef,\n inject,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n FormControl,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n type ControlValueAccessor,\n} from '@angular/forms';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { Tabs } from '@masterteam/components/tabs';\nimport { TextField } from '@masterteam/components/text-field';\nimport { Tooltip } from '@masterteam/components/tooltip';\nimport { Icon, type MTIcon } from '@masterteam/icons';\n\nimport { NumberField } from '@masterteam/components/number-field';\n\nimport {\n BILINGUAL_STARTER,\n EMAIL_IMAGE_MAX_SIZE,\n FONT_SIZE_MARKER,\n HIGHLIGHT_COLORS,\n TEXT_COLORS,\n TEXT_SIZES,\n clearInlineStyle,\n replaceFontSizeMarkers,\n replaceStrikeTags,\n type EditorSwatch,\n type EditorTextSize,\n EMAIL_IMAGE_MIN_SIZE,\n SELECTED_CLASS,\n applyEmailImage,\n buildEditingDocument,\n buildEmailImage,\n createTokenChip,\n decorateCanvas,\n isAllowedLink,\n isFullDocument,\n serializeCanvas,\n validateEmailImage,\n type EmailEditorPlaceholder,\n type EmailImageError,\n} from './email-visual-editor.utils';\n\ntype EditorMode = 'design' | 'html';\ntype StylePanel = 'color' | 'highlight' | 'size';\n\ninterface ToolbarAction {\n key: string;\n icon?: MTIcon;\n text?: string;\n run: () => void;\n}\n\n/**\n * Visual editor for notification email HTML (event content and the shared\n * base layout), with an HTML tab for the exact source.\n *\n * The canvas is a sandboxed, script-free iframe (`sandbox=\"allow-same-origin\"`\n * so the host can edit it; nothing inside it can run) with its own CSP —\n * images and network stay blocked, as the contract asks. The browser's editing\n * DOM keeps tables, inline styles and `lang` / `dir`; `{{tokens}}` and the\n * layout's `{content}` slot are shown as chips and written back as literal\n * text. Opening content, or switching between Visual and HTML, never emits a\n * value: only a real edit does, so nothing is rewritten or marked unsaved just\n * by looking at it.\n */\n@Component({\n selector: 'mt-email-visual-editor',\n imports: [\n NgTemplateOutlet,\n TranslocoDirective,\n ReactiveFormsModule,\n Button,\n Tabs,\n TextField,\n NumberField,\n Tooltip,\n Icon,\n ],\n templateUrl: './email-visual-editor.html',\n host: { class: 'block min-w-0' },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => EmailVisualEditor),\n multi: true,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EmailVisualEditor implements ControlValueAccessor {\n private readonly transloco = inject(TranslocoService);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly label = input<string>();\n readonly hint = input<string>();\n /** Placeholders the content may use; their labels name the chips. */\n readonly placeholders = input<readonly EmailEditorPlaceholder[]>([]);\n /** Editing the shared base layout: `{content}` is shown as a protected slot. */\n readonly layout = input(false);\n readonly height = input('24rem');\n /** Reading direction of the whole canvas (a single-language field). */\n readonly direction = input<'ltr' | 'rtl' | null>(null);\n /** Offer the English + Arabic starter on an empty email. */\n readonly starter = input(true);\n /** The canvas or the HTML source received focus. */\n readonly focused = output<void>();\n /**\n * HTTPS origins the server accepts images from (`approvedImageOrigins` on the\n * layout read / preview). Empty means images are not allowed at all.\n */\n readonly approvedImageOrigins = input<readonly string[]>([]);\n\n protected readonly imageOpen = signal(false);\n protected readonly imageError = signal<EmailImageError | null>(null);\n protected readonly editingImage = signal<HTMLImageElement | null>(null);\n protected readonly imageForm = {\n src: new FormControl('', { nonNullable: true }),\n alt: new FormControl('', { nonNullable: true }),\n width: new FormControl<number | null>(null),\n height: new FormControl<number | null>(null),\n };\n protected readonly imageMin = EMAIL_IMAGE_MIN_SIZE;\n protected readonly imageMax = EMAIL_IMAGE_MAX_SIZE;\n protected readonly imageOriginsLabel = computed(() =>\n this.approvedImageOrigins().join(', '),\n );\n protected readonly imageErrorText = computed(() => {\n const error = this.imageError();\n if (!error) return '';\n this.lang();\n return this.transloco.translate(\n `email-delivery.editor.image.errors.${error}`,\n {\n origins: this.imageOriginsLabel(),\n min: EMAIL_IMAGE_MIN_SIZE,\n max: EMAIL_IMAGE_MAX_SIZE,\n },\n );\n });\n\n protected readonly mode = signal<EditorMode>('design');\n protected readonly value = signal('');\n protected readonly disabled = signal(false);\n protected readonly linkOpen = signal(false);\n /** The colour / size row under the toolbar. */\n protected readonly stylePanel = signal<StylePanel | null>(null);\n protected readonly textColors = TEXT_COLORS;\n protected readonly highlightColors = HIGHLIGHT_COLORS;\n protected readonly textSizes = TEXT_SIZES;\n protected readonly linkError = signal(false);\n protected readonly linkControl = new FormControl('', { nonNullable: true });\n protected readonly sourceControl = new FormControl('', { nonNullable: true });\n\n protected readonly designBlocked = computed(() =>\n isFullDocument(this.value()),\n );\n protected readonly effectiveMode = computed<EditorMode>(() =>\n this.designBlocked() ? 'html' : this.mode(),\n );\n protected readonly isEmpty = computed(\n () => this.value().replace(/<[^>]*>|&nbsp;|\\s/g, '') === '',\n );\n protected readonly modeOptions = computed<\n { label: string; value: EditorMode; icon: MTIcon }[]\n >(() => {\n this.lang();\n return [\n { label: this.t('design'), value: 'design', icon: 'editor.pencil-01' },\n { label: this.t('html'), value: 'html', icon: 'dev.code-02' },\n ];\n });\n\n protected readonly blockActions: ToolbarAction[] = [\n {\n key: 'paragraph',\n icon: 'editor.pilcrow-01',\n run: () => this.formatBlock('p'),\n },\n { key: 'heading', text: 'H2', run: () => this.formatBlock('h2') },\n { key: 'subheading', text: 'H3', run: () => this.formatBlock('h3') },\n { key: 'quote', text: '“', run: () => this.formatBlock('blockquote') },\n ];\n protected readonly inlineActions: ToolbarAction[] = [\n { key: 'bold', icon: 'editor.bold-01', run: () => this.exec('bold') },\n { key: 'italic', icon: 'editor.italic-01', run: () => this.exec('italic') },\n {\n key: 'underline',\n icon: 'editor.underline-01',\n run: () => this.exec('underline'),\n },\n {\n key: 'strike',\n icon: 'editor.strikethrough-01',\n run: () => this.strike(),\n },\n ];\n protected readonly styleActions: ToolbarAction[] = [\n {\n key: 'text-color',\n icon: 'editor.palette',\n run: () => this.toggleStylePanel('color'),\n },\n {\n key: 'highlight',\n icon: 'editor.roller-brush',\n run: () => this.toggleStylePanel('highlight'),\n },\n {\n key: 'size',\n icon: 'editor.type-01',\n run: () => this.toggleStylePanel('size'),\n },\n ];\n protected readonly alignActions: ToolbarAction[] = [\n {\n key: 'align-left',\n icon: 'editor.align-left',\n run: () => this.execWithCss('justifyLeft'),\n },\n {\n key: 'align-center',\n icon: 'editor.align-center',\n run: () => this.execWithCss('justifyCenter'),\n },\n {\n key: 'align-right',\n icon: 'editor.align-right',\n run: () => this.execWithCss('justifyRight'),\n },\n ];\n protected readonly listActions: ToolbarAction[] = [\n {\n key: 'bullets',\n icon: 'editor.dotpoints-01',\n run: () => this.exec('insertUnorderedList'),\n },\n {\n key: 'numbers',\n icon: 'layout.list',\n run: () => this.exec('insertOrderedList'),\n },\n {\n key: 'divider',\n icon: 'general.minus',\n run: () => this.exec('insertHorizontalRule'),\n },\n ];\n protected readonly directionActions: ToolbarAction[] = [\n { key: 'ltr', text: 'EN', run: () => this.setDirection('ltr') },\n { key: 'rtl', text: 'ع', run: () => this.setDirection('rtl') },\n ];\n protected readonly historyActions: ToolbarAction[] = [\n {\n key: 'clear',\n icon: 'editor.eraser',\n run: () => this.exec('removeFormat'),\n },\n { key: 'undo', icon: 'arrow.flip-backward', run: () => this.exec('undo') },\n { key: 'redo', icon: 'arrow.flip-forward', run: () => this.exec('redo') },\n ];\n\n private readonly frame = viewChild<ElementRef<HTMLIFrameElement>>('frame');\n private readonly sourceHost =\n viewChild<ElementRef<HTMLElement>>('sourceHost');\n private readonly lang = signal(this.transloco.getActiveLang());\n /** The last value this editor emitted — writes of it are not re-rendered. */\n private lastEmitted: string | null = null;\n private renderedFrame: HTMLIFrameElement | null = null;\n private renderedKey = '';\n private savedRange: Range | null = null;\n /** Set while a multi-step command runs, so it emits once at the end. */\n private batching = false;\n private onChange: (value: string) => void = () => undefined;\n private onTouched: () => void = () => undefined;\n private detachCanvas: (() => void) | null = null;\n\n constructor() {\n const langSub = this.transloco.langChanges$.subscribe((lang) =>\n this.lang.set(lang),\n );\n this.destroyRef.onDestroy(() => {\n langSub.unsubscribe();\n this.detachCanvas?.();\n });\n\n // (Re)build the canvas for a new frame, when the chip labels change (the\n // field catalog arrives after the content, or the language switches) and\n // when the approved image origins arrive.\n effect(() => {\n const frame = this.frame()?.nativeElement ?? null;\n if (!frame || this.effectiveMode() !== 'design') return;\n const renderKey = `${this.lang()}|${this.placeholders()\n .map((item) => `${item.key}=${item.label}`)\n .join(',')}|${this.approvedImageOrigins().join(',')}`;\n untracked(() => {\n if (frame !== this.renderedFrame || renderKey !== this.renderedKey) {\n this.renderedKey = renderKey;\n this.renderCanvas(frame);\n }\n });\n });\n\n this.sourceControl.valueChanges\n .pipe(takeUntilDestroyed())\n .subscribe((value) => this.emit(value));\n }\n\n // ==========================================================================\n // ControlValueAccessor\n // ==========================================================================\n writeValue(value: string | null): void {\n const next = value ?? '';\n this.value.set(next);\n if (this.sourceControl.value !== next) {\n this.sourceControl.setValue(next, { emitEvent: false });\n }\n if (next === this.lastEmitted) return;\n this.lastEmitted = null;\n const frame = this.frame()?.nativeElement;\n if (frame && this.effectiveMode() === 'design') this.renderCanvas(frame);\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(disabled: boolean): void {\n this.disabled.set(disabled);\n const body = this.renderedFrame?.contentDocument?.body;\n if (body) body.contentEditable = String(!disabled);\n if (disabled) {\n this.sourceControl.disable({ emitEvent: false });\n } else {\n this.sourceControl.enable({ emitEvent: false });\n }\n }\n\n // ==========================================================================\n // Public API\n // ==========================================================================\n /** Inserts `{{key}}` where the cursor is (as a chip in Visual, as text in HTML). */\n insertToken(key: string, label?: string): void {\n if (this.disabled()) return;\n const text = `{{${key}}}`;\n if (this.effectiveMode() === 'html') {\n const textarea =\n this.sourceHost()?.nativeElement.querySelector('textarea');\n const current = this.sourceControl.value;\n const start = textarea?.selectionStart ?? current.length;\n const end = textarea?.selectionEnd ?? start;\n this.sourceControl.setValue(\n current.slice(0, start) + text + current.slice(end),\n );\n setTimeout(() => {\n textarea?.focus();\n textarea?.setSelectionRange(start + text.length, start + text.length);\n });\n return;\n }\n const doc = this.canvasDocument();\n if (!doc) return;\n const chip = createTokenChip(\n doc,\n key,\n label ??\n this.placeholders().find((item) => item.key === key)?.label ??\n key,\n );\n this.restoreSelection();\n doc.execCommand('insertHTML', false, `${chip.outerHTML}&nbsp;`);\n }\n\n // ==========================================================================\n // Toolbar\n // ==========================================================================\n protected onModeChange(mode: string | number): void {\n if (mode !== 'design' && mode !== 'html') return;\n if (mode === this.mode()) return;\n this.mode.set(mode);\n // A fresh frame is created for Visual; the effect renders it.\n this.renderedFrame = null;\n }\n\n protected startBilingual(): void {\n const doc = this.canvasDocument();\n if (!doc) return;\n doc.body.innerHTML = BILINGUAL_STARTER;\n this.placeCaret(doc, doc.body.querySelector('p'));\n this.emitFromCanvas();\n }\n\n protected toggleStylePanel(panel: StylePanel): void {\n this.linkOpen.set(false);\n this.imageOpen.set(false);\n this.stylePanel.update((open) => (open === panel ? null : panel));\n }\n\n protected applyColor(swatch: EditorSwatch): void {\n const panel = this.stylePanel();\n this.execWithCss(\n panel === 'highlight' ? 'hiliteColor' : 'foreColor',\n swatch.value,\n );\n this.stylePanel.set(null);\n }\n\n protected removeColor(): void {\n const property =\n this.stylePanel() === 'highlight' ? 'background-color' : 'color';\n this.clearStyle(property);\n this.stylePanel.set(null);\n }\n\n protected applySize(size: EditorTextSize): void {\n const px = this.textSizes.find((item) => item.key === size)?.px ?? null;\n if (px === null) {\n this.clearStyle('font-size');\n } else {\n const doc = this.canvasDocument();\n if (!doc || this.disabled()) return;\n this.restoreSelection();\n this.batching = true;\n try {\n doc.execCommand('styleWithCSS', false, 'false');\n doc.execCommand('fontSize', false, FONT_SIZE_MARKER);\n replaceFontSizeMarkers(doc, px);\n } finally {\n this.batching = false;\n }\n this.emitFromCanvas();\n }\n this.stylePanel.set(null);\n }\n\n protected swatchLabel(swatch: EditorSwatch): string {\n return this.t(`style.colors.${swatch.key}`);\n }\n\n protected toggleLink(): void {\n this.stylePanel.set(null);\n this.imageOpen.set(false);\n this.linkError.set(false);\n this.linkControl.setValue('');\n this.linkOpen.update((open) => !open);\n }\n\n protected useRecordLink(): void {\n this.linkControl.setValue('{{webUrl}}');\n this.applyLink();\n }\n\n protected applyLink(): void {\n const url = this.linkControl.value.trim();\n if (!isAllowedLink(url)) {\n this.linkError.set(true);\n return;\n }\n const canonical = /^\\{\\{\\s*webUrl\\s*\\}\\}$/i.test(url) ? '{{webUrl}}' : url;\n this.exec('createLink', canonical);\n this.linkOpen.set(false);\n }\n\n protected removeLink(): void {\n this.exec('unlink');\n this.linkOpen.set(false);\n }\n\n /**\n * Opens the image row: for the image selected in the canvas (to change it),\n * otherwise for a new image at the cursor.\n */\n protected toggleImage(): void {\n if (this.imageOpen()) {\n this.imageOpen.set(false);\n return;\n }\n this.linkOpen.set(false);\n this.stylePanel.set(null);\n this.imageError.set(\n this.approvedImageOrigins().length === 0 ? 'no-origins' : null,\n );\n const image = this.editingImage();\n this.imageForm.src.setValue(image?.getAttribute('src') ?? '');\n this.imageForm.alt.setValue(image?.getAttribute('alt') ?? '');\n this.imageForm.width.setValue(numberAttribute(image, 'width'));\n this.imageForm.height.setValue(numberAttribute(image, 'height'));\n this.imageOpen.set(true);\n }\n\n protected applyImage(): void {\n const draft = {\n src: this.imageForm.src.value,\n alt: this.imageForm.alt.value,\n width: this.imageForm.width.value,\n height: this.imageForm.height.value,\n };\n const error = validateEmailImage(draft, this.approvedImageOrigins());\n this.imageError.set(error);\n if (error) return;\n\n const doc = this.canvasDocument();\n if (!doc) return;\n const editing = this.editingImage();\n if (editing && doc.body.contains(editing)) {\n applyEmailImage(editing, draft);\n this.emitFromCanvas();\n } else {\n this.restoreSelection();\n doc.execCommand(\n 'insertHTML',\n false,\n buildEmailImage(doc, draft).outerHTML,\n );\n }\n this.closeImage();\n }\n\n protected removeImage(): void {\n const editing = this.editingImage();\n if (editing) {\n editing.remove();\n this.emitFromCanvas();\n }\n this.closeImage();\n }\n\n protected closeImage(): void {\n this.imageOpen.set(false);\n this.selectImage(null);\n }\n\n protected actionLabel(key: string): string {\n return this.t(`actions.${key}`);\n }\n\n // ==========================================================================\n // Canvas\n // ==========================================================================\n private renderCanvas(frame: HTMLIFrameElement): void {\n this.detachCanvas?.();\n this.detachCanvas = null;\n this.renderedFrame = frame;\n this.savedRange = null;\n // Elements of the previous canvas document are gone.\n this.editingImage.set(null);\n this.imageOpen.set(false);\n this.stylePanel.set(null);\n const onLoad = () => this.attachCanvas(frame);\n frame.addEventListener('load', onLoad, { once: true });\n frame.srcdoc = buildEditingDocument(\n this.value(),\n !this.disabled(),\n this.direction(),\n this.approvedImageOrigins(),\n );\n }\n\n private attachCanvas(frame: HTMLIFrameElement): void {\n const doc = frame.contentDocument;\n if (!doc || frame !== this.renderedFrame) return;\n decorateCanvas(doc, this.placeholders(), this.t('slot'));\n doc.execCommand('defaultParagraphSeparator', false, 'p');\n\n const onInput = () => {\n if (!this.batching) this.emitFromCanvas();\n };\n const onSelection = () => this.saveSelection();\n const onBlur = () => this.onTouched();\n const onFocus = () => this.focused.emit();\n const onClick = (event: MouseEvent) => {\n const target = event.target as Element | null;\n // A link in the canvas is text being edited, never a navigation.\n if (target?.closest('a')) event.preventDefault();\n // Clicking an image selects it, so the Image button edits it. Canvas\n // nodes live in the iframe's realm, so `instanceof` would never match.\n this.selectImage(\n target?.tagName === 'IMG' ? (target as HTMLImageElement) : null,\n );\n };\n const onPaste = (event: ClipboardEvent) => {\n // Pasted documents bring foreign styles; keep plain text only.\n event.preventDefault();\n const text = event.clipboardData?.getData('text/plain') ?? '';\n doc.execCommand('insertText', false, text);\n };\n doc.addEventListener('input', onInput);\n doc.addEventListener('selectionchange', onSelection);\n doc.addEventListener('click', onClick);\n doc.addEventListener('paste', onPaste);\n doc.body.addEventListener('blur', onBlur);\n doc.addEventListener('focusin', onFocus);\n this.detachCanvas = () => {\n doc.removeEventListener('input', onInput);\n doc.removeEventListener('selectionchange', onSelection);\n doc.removeEventListener('click', onClick);\n doc.removeEventListener('paste', onPaste);\n doc.body.removeEventListener('blur', onBlur);\n doc.removeEventListener('focusin', onFocus);\n };\n }\n\n private emitFromCanvas(): void {\n const doc = this.canvasDocument();\n if (!doc) return;\n const html = serializeCanvas(doc.body);\n this.sourceControl.setValue(html, { emitEvent: false });\n this.emit(html);\n }\n\n private emit(value: string): void {\n if (value === this.value()) return;\n this.lastEmitted = value;\n this.value.set(value);\n this.onChange(value);\n }\n\n private exec(command: string, argument?: string): void {\n const doc = this.canvasDocument();\n if (!doc || this.disabled()) return;\n this.restoreSelection();\n doc.execCommand(command, false, argument);\n }\n\n /** Commands whose CSS form survives the email policy (spans with styles). */\n private execWithCss(command: string, argument?: string): void {\n const doc = this.canvasDocument();\n if (!doc || this.disabled()) return;\n this.restoreSelection();\n doc.execCommand('styleWithCSS', false, 'true');\n try {\n doc.execCommand(command, false, argument);\n } finally {\n doc.execCommand('styleWithCSS', false, 'false');\n }\n }\n\n /** Written as `<s>`: the policy strips `<strike>` and `text-decoration-line`. */\n private strike(): void {\n const doc = this.canvasDocument();\n if (!doc || this.disabled()) return;\n this.restoreSelection();\n this.batching = true;\n try {\n doc.execCommand('strikeThrough');\n replaceStrikeTags(doc);\n } finally {\n this.batching = false;\n }\n this.emitFromCanvas();\n }\n\n private clearStyle(\n property: 'color' | 'background-color' | 'font-size',\n ): void {\n const doc = this.canvasDocument();\n if (!doc || this.disabled()) return;\n this.restoreSelection();\n const selection = doc.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n clearInlineStyle(doc, selection.getRangeAt(0), property);\n this.emitFromCanvas();\n }\n\n private formatBlock(tag: 'p' | 'h2' | 'h3' | 'blockquote'): void {\n this.exec('formatBlock', tag);\n }\n\n /** Sets the reading direction (and language) of the block under the cursor. */\n private setDirection(direction: 'ltr' | 'rtl'): void {\n const doc = this.canvasDocument();\n if (!doc || this.disabled()) return;\n this.restoreSelection();\n const anchor = doc.getSelection()?.anchorNode ?? null;\n // nodeType, not `instanceof`: canvas nodes belong to the iframe's realm.\n const start =\n anchor?.nodeType === Node.ELEMENT_NODE\n ? (anchor as Element)\n : (anchor?.parentElement ?? null);\n const block = start?.closest('p, h1, h2, h3, li, td, th, div');\n if (!block || block === doc.body || !doc.body.contains(block)) return;\n block.setAttribute('dir', direction);\n block.setAttribute('lang', direction === 'rtl' ? 'ar' : 'en');\n this.emitFromCanvas();\n }\n\n /** Highlights (canvas-only class, never serialized) and selects one image. */\n private selectImage(image: HTMLImageElement | null): void {\n const previous = this.editingImage();\n if (previous && previous !== image) {\n previous.classList.remove(SELECTED_CLASS);\n if (previous.classList.length === 0) previous.removeAttribute('class');\n }\n this.editingImage.set(image);\n if (!image) return;\n image.classList.add(SELECTED_CLASS);\n const doc = image.ownerDocument;\n const range = doc.createRange();\n range.selectNode(image);\n const selection = doc.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n this.savedRange = range.cloneRange();\n }\n\n private saveSelection(): void {\n const doc = this.canvasDocument();\n const selection = doc?.getSelection();\n if (!doc || !selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n if (doc.body.contains(range.commonAncestorContainer)) {\n this.savedRange = range.cloneRange();\n }\n }\n\n private restoreSelection(): void {\n const frame = this.renderedFrame;\n const doc = this.canvasDocument();\n if (!frame || !doc) return;\n frame.contentWindow?.focus();\n doc.body.focus();\n if (!this.savedRange) return;\n const selection = doc.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(this.savedRange);\n }\n\n private placeCaret(doc: Document, element: Element | null): void {\n if (!element) return;\n const range = doc.createRange();\n range.selectNodeContents(element);\n range.collapse(true);\n const selection = doc.getSelection();\n selection?.removeAllRanges();\n selection?.addRange(range);\n this.savedRange = range.cloneRange();\n }\n\n private canvasDocument(): Document | null {\n return this.effectiveMode() === 'design'\n ? (this.renderedFrame?.contentDocument ?? null)\n : null;\n }\n\n private t(key: string): string {\n return this.transloco.translate(`email-delivery.editor.${key}`);\n }\n}\n\nfunction numberAttribute(element: Element | null, name: string): number | null {\n const value = Number(element?.getAttribute(name));\n return Number.isFinite(value) && value > 0 ? value : null;\n}\n","<ng-container *transloco=\"let t; prefix: 'email-delivery.editor'\">\n <div class=\"flex min-w-0 flex-col gap-1\">\n @if (label() || hint()) {\n <div class=\"flex items-center gap-1 text-sm\">\n @if (label()) {\n <span class=\"font-medium\">{{ label() }}</span>\n }\n @if (hint()) {\n <span class=\"inline-flex text-surface-400\" [mtTooltip]=\"hint()\">\n <mt-icon icon=\"general.help-circle\" />\n </span>\n }\n </div>\n }\n\n <div\n class=\"flex min-w-0 flex-col overflow-hidden rounded-md border border-surface bg-content\"\n >\n <!-- Toolbar -->\n <div\n class=\"flex flex-wrap items-center justify-between gap-2 border-b border-surface bg-surface-50 px-2 py-1.5\"\n >\n <div\n class=\"flex min-w-0 flex-wrap items-center gap-0.5\"\n role=\"toolbar\"\n [attr.aria-label]=\"t('toolbar')\"\n >\n @if (effectiveMode() === \"design\") {\n @for (action of blockActions; track action.key) {\n <ng-container\n [ngTemplateOutlet]=\"toolbarButton\"\n [ngTemplateOutletContext]=\"{ $implicit: action }\"\n />\n }\n <span\n class=\"mx-1 h-5 w-px bg-surface-200\"\n aria-hidden=\"true\"\n ></span>\n @for (action of inlineActions; track action.key) {\n <ng-container\n [ngTemplateOutlet]=\"toolbarButton\"\n [ngTemplateOutletContext]=\"{ $implicit: action }\"\n />\n }\n <span\n class=\"mx-1 h-5 w-px bg-surface-200\"\n aria-hidden=\"true\"\n ></span>\n @for (action of styleActions; track action.key) {\n <ng-container\n [ngTemplateOutlet]=\"toolbarButton\"\n [ngTemplateOutletContext]=\"{ $implicit: action }\"\n />\n }\n <span\n class=\"mx-1 h-5 w-px bg-surface-200\"\n aria-hidden=\"true\"\n ></span>\n @for (action of alignActions; track action.key) {\n <ng-container\n [ngTemplateOutlet]=\"toolbarButton\"\n [ngTemplateOutletContext]=\"{ $implicit: action }\"\n />\n }\n <span\n class=\"mx-1 h-5 w-px bg-surface-200\"\n aria-hidden=\"true\"\n ></span>\n @for (action of listActions; track action.key) {\n <ng-container\n [ngTemplateOutlet]=\"toolbarButton\"\n [ngTemplateOutletContext]=\"{ $implicit: action }\"\n />\n }\n <mt-button\n icon=\"general.link-01\"\n severity=\"secondary\"\n variant=\"text\"\n size=\"small\"\n [tooltip]=\"t('actions.link')\"\n [ariaLabel]=\"t('actions.link')\"\n [disabled]=\"disabled()\"\n (onClick)=\"toggleLink()\"\n />\n <mt-button\n icon=\"image.image-01\"\n severity=\"secondary\"\n variant=\"text\"\n size=\"small\"\n [tooltip]=\"\n editingImage() ? t('actions.image-edit') : t('actions.image')\n \"\n [ariaLabel]=\"t('actions.image')\"\n [disabled]=\"disabled()\"\n (onClick)=\"toggleImage()\"\n />\n <span\n class=\"mx-1 h-5 w-px bg-surface-200\"\n aria-hidden=\"true\"\n ></span>\n @for (action of directionActions; track action.key) {\n <ng-container\n [ngTemplateOutlet]=\"toolbarButton\"\n [ngTemplateOutletContext]=\"{ $implicit: action }\"\n />\n }\n <span\n class=\"mx-1 h-5 w-px bg-surface-200\"\n aria-hidden=\"true\"\n ></span>\n @for (action of historyActions; track action.key) {\n <ng-container\n [ngTemplateOutlet]=\"toolbarButton\"\n [ngTemplateOutletContext]=\"{ $implicit: action }\"\n />\n }\n }\n </div>\n @if (!designBlocked()) {\n <!-- ms-auto keeps the switch at the end when the toolbar wraps. -->\n <mt-tabs\n class=\"ms-auto\"\n size=\"small\"\n [options]=\"modeOptions()\"\n [active]=\"mode()\"\n (activeChange)=\"onModeChange($event)\"\n />\n }\n </div>\n\n @if (stylePanel() && effectiveMode() === \"design\") {\n <div\n class=\"flex flex-wrap items-center gap-2 border-b border-surface px-3 py-2\"\n role=\"group\"\n [attr.aria-label]=\"\n t(\n 'style.' +\n (stylePanel() === 'color' ? 'text-color' : stylePanel())\n )\n \"\n >\n <span class=\"text-xs font-medium text-muted-color\">{{\n t(\n \"style.\" +\n (stylePanel() === \"color\" ? \"text-color\" : stylePanel())\n )\n }}</span>\n @if (stylePanel() === \"size\") {\n @for (size of textSizes; track size.key) {\n <mt-button\n size=\"small\"\n severity=\"secondary\"\n variant=\"outlined\"\n [label]=\"t('style.sizes.' + size.key)\"\n (onClick)=\"applySize(size.key)\"\n />\n }\n } @else {\n <div class=\"flex flex-wrap items-center gap-1\">\n @for (\n swatch of stylePanel() === \"highlight\"\n ? highlightColors\n : textColors;\n track swatch.key\n ) {\n <!-- The swatch colour is data, not a theme token. -->\n <button\n type=\"button\"\n class=\"size-6 rounded-md border border-surface outline-offset-2 hover:scale-110 focus-visible:outline-2 focus-visible:outline-primary\"\n [style.background-color]=\"swatch.value\"\n [attr.aria-label]=\"swatchLabel(swatch)\"\n [mtTooltip]=\"swatchLabel(swatch)\"\n (click)=\"applyColor(swatch)\"\n ></button>\n }\n </div>\n <mt-button\n size=\"small\"\n severity=\"secondary\"\n variant=\"text\"\n icon=\"general.x-close\"\n [label]=\"t('style.remove-color')\"\n (onClick)=\"removeColor()\"\n />\n }\n </div>\n }\n\n @if (imageOpen() && effectiveMode() === \"design\") {\n <div\n class=\"flex flex-col gap-2 border-b border-surface px-3 py-2\"\n [attr.aria-label]=\"t('actions.image')\"\n >\n <div class=\"grid grid-cols-1 gap-2 md:grid-cols-2\">\n <mt-text-field\n [formControl]=\"imageForm.src\"\n [label]=\"t('image.src')\"\n placeholder=\"https://\"\n dir=\"ltr\"\n />\n <mt-text-field\n [formControl]=\"imageForm.alt\"\n [label]=\"t('image.alt')\"\n [hint]=\"t('image.alt-hint')\"\n />\n <mt-number-field\n [formControl]=\"imageForm.width\"\n [label]=\"t('image.width')\"\n [min]=\"imageMin\"\n [max]=\"imageMax\"\n [maxFractionDigits]=\"0\"\n />\n <mt-number-field\n [formControl]=\"imageForm.height\"\n [label]=\"t('image.height')\"\n [min]=\"imageMin\"\n [max]=\"imageMax\"\n [maxFractionDigits]=\"0\"\n />\n </div>\n @if (imageError(); as error) {\n <p\n class=\"rounded-md border px-3 py-2 text-xs\"\n [class]=\"\n error === 'no-origins'\n ? 'border-amber-200 bg-amber-50 text-amber-700'\n : 'border-red-200 bg-red-50 text-red-700'\n \"\n role=\"alert\"\n >\n {{ imageErrorText() }}\n </p>\n } @else {\n <p class=\"text-xs text-muted-color\">\n {{ t(\"image.hint\", { origins: imageOriginsLabel() }) }}\n </p>\n }\n <div class=\"flex flex-wrap gap-2\">\n <mt-button\n size=\"small\"\n [label]=\"editingImage() ? t('image.update') : t('image.insert')\"\n [disabled]=\"imageError() === 'no-origins'\"\n (onClick)=\"applyImage()\"\n />\n @if (editingImage()) {\n <mt-button\n size=\"small\"\n severity=\"danger\"\n variant=\"text\"\n [label]=\"t('image.remove')\"\n (onClick)=\"removeImage()\"\n />\n }\n <mt-button\n size=\"small\"\n severity=\"secondary\"\n variant=\"text\"\n [label]=\"t('image.cancel')\"\n (onClick)=\"closeImage()\"\n />\n </div>\n </div>\n }\n\n @if (linkOpen() && effectiveMode() === \"design\") {\n <div\n class=\"flex flex-wrap items-start gap-2 border-b border-surface px-3 py-2\"\n >\n <mt-text-field\n class=\"min-w-0 flex-1\"\n [formControl]=\"linkControl\"\n [placeholder]=\"t('link.placeholder')\"\n dir=\"ltr\"\n />\n <mt-button\n size=\"small\"\n [label]=\"t('link.apply')\"\n (onClick)=\"applyLink()\"\n />\n <mt-button\n size=\"small\"\n severity=\"secondary\"\n variant=\"outlined\"\n [label]=\"t('link.record')\"\n (onClick)=\"useRecordLink()\"\n />\n <mt-button\n size=\"small\"\n severity=\"secondary\"\n variant=\"text\"\n [label]=\"t('link.remove')\"\n (onClick)=\"removeLink()\"\n />\n @if (linkError()) {\n <p class=\"w-full text-xs text-red-600\" role=\"alert\">\n {{ t(\"link.invalid\") }}\n </p>\n }\n </div>\n }\n\n @if (designBlocked()) {\n <p\n class=\"border-b border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-700\"\n >\n {{ t(\"design-blocked\") }}\n </p>\n }\n\n @if (effectiveMode() === \"design\") {\n @if (starter() && isEmpty() && !disabled()) {\n <div\n class=\"flex items-center justify-between gap-2 border-b border-surface px-3 py-2 text-xs text-muted-color\"\n >\n <span>{{ t(\"empty\") }}</span>\n <mt-button\n size=\"small\"\n severity=\"secondary\"\n variant=\"outlined\"\n [label]=\"t('bilingual')\"\n (onClick)=\"startBilingual()\"\n />\n </div>\n }\n <iframe\n #frame\n sandbox=\"allow-same-origin\"\n referrerpolicy=\"no-referrer\"\n [attr.title]=\"label() || t('canvas')\"\n class=\"block w-full border-0 bg-white\"\n [style.height]=\"height()\"\n ></iframe>\n } @else {\n <div #sourceHost class=\"p-2\" dir=\"ltr\">\n <textarea\n class=\"block w-full resize-y rounded-md border border-surface bg-content p-2 font-mono text-xs leading-5 outline-none focus:border-primary\"\n (focus)=\"focused.emit()\"\n [style.height]=\"height()\"\n [formControl]=\"sourceControl\"\n [attr.aria-label]=\"label() || t('html')\"\n spellcheck=\"false\"\n ></textarea>\n </div>\n }\n </div>\n </div>\n\n <ng-template #toolbarButton let-action>\n <mt-button\n [icon]=\"action.icon\"\n [label]=\"action.text\"\n severity=\"secondary\"\n variant=\"text\"\n size=\"small\"\n [tooltip]=\"actionLabel(action.key)\"\n [ariaLabel]=\"actionLabel(action.key)\"\n [disabled]=\"disabled()\"\n (onClick)=\"action.run()\"\n />\n </ng-template>\n</ng-container>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["CONTENT_SLOT"],"mappings":"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"}