@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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"masterteam-system-settings-masterteam-system-settings-DBy-LQB0.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-delivery.routes.ts","../../../../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 GLOBAL_WORKING_HOURS_HOURS_PER_DAY_VALIDATORS,\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 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\nconst GLOBAL_WORKING_HOURS_HOURS_PER_DAY_VALIDATORS = [\r\n Validators.required,\r\n Validators.min(0),\r\n Validators.max(24),\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 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: Object.fromEntries(\r\n this.metadataControls().map(({ key, control }) => [key, control.value]),\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 {{ t(\"real-email-warning\") }}\r\n </div>\r\n\r\n @if (sourceLabel()) {\r\n <p class=\"mb-2 text-sm font-medium\">{{ sourceLabel() }}</p>\r\n }\r\n <p class=\"mb-4 text-xs text-muted-color\">\r\n {{ t(\"test-request-id\") }}:\r\n <span class=\"break-all font-mono\">{{ testRequestId() }}</span>\r\n </p>\r\n\r\n @if (!result()) {\r\n <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 (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 <p class=\"mt-1 mb-0 text-sm text-muted-color\">\r\n {{ t(\"request-state\") }}: {{ dispatch.requestState }}\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 type { Routes } from '@angular/router';\r\n\r\nexport const EMAIL_DELIVERY_ROUTES: Routes = [\r\n {\r\n path: '',\r\n loadComponent: () =>\r\n import('./shell/email-delivery-shell').then(\r\n (module) => module.EmailDeliveryShell,\r\n ),\r\n },\r\n { path: '**', redirectTo: '' },\r\n];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}