@masterteam/system-settings 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -1
- package/assets/i18n/ar.json +4 -2
- package/assets/i18n/en.json +3 -1
- package/assets/system-settings.css +1 -1
- package/fesm2022/{masterteam-system-settings-email-delivery-shell-Bf6EXLD2.mjs → masterteam-system-settings-email-delivery-shell-CR2wsIif.mjs} +13 -11
- package/fesm2022/masterteam-system-settings-email-delivery-shell-CR2wsIif.mjs.map +1 -0
- package/fesm2022/{masterteam-system-settings-masterteam-system-settings-BjftcBn5.mjs → masterteam-system-settings-masterteam-system-settings-DBy-LQB0.mjs} +244 -68
- package/fesm2022/masterteam-system-settings-masterteam-system-settings-DBy-LQB0.mjs.map +1 -0
- package/fesm2022/masterteam-system-settings.mjs +1 -1
- package/package.json +3 -3
- package/types/masterteam-system-settings.d.ts +71 -6
- package/fesm2022/masterteam-system-settings-email-delivery-shell-Bf6EXLD2.mjs.map +0 -1
- package/fesm2022/masterteam-system-settings-masterteam-system-settings-BjftcBn5.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-system-settings-masterteam-system-settings-BjftcBn5.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","<ng-container *transloco=\"let t; prefix: 'system-settings'\">\r\n <div class=\"grid gap-6 xl:grid-cols-2 mb-6\">\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 <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';\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] 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 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 readonly apiBasePath = input('settings');\r\n readonly backRoute = input<string | null>('/control-panel/product-settings');\r\n readonly formatSchema = input<SystemSettingsFormatSchema | null>(null);\r\n\r\n readonly breadcrumbItems: {\r\n label?: string;\r\n routerLink?: string;\r\n icon?: string;\r\n }[] = [\r\n {\r\n label: '',\r\n icon: 'general.home-line',\r\n routerLink: '/control-panel/workspaces',\r\n },\r\n {\r\n label: this.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 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 Validators.required,\r\n ),\r\n maxDailyHours: new FormControl<number | null>(24, [\r\n Validators.required,\r\n Validators.min(1),\r\n Validators.max(24),\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>(3, [\r\n Validators.required,\r\n Validators.min(0),\r\n Validators.max(90),\r\n ]),\r\n }),\r\n globalWorkingHours: new FormGroup({\r\n timeZoneId: new FormControl<string | null>(null, Validators.required),\r\n workingDays: new FormControl<number[]>([0, 1, 2, 3, 4], {\r\n nonNullable: true,\r\n validators: [Validators.required],\r\n }),\r\n hoursPerDay: new FormControl<number | null>(8, [\r\n Validators.required,\r\n Validators.min(0),\r\n Validators.max(24),\r\n ]),\r\n holidaysCsv: new FormControl('', { nonNullable: true }),\r\n }),\r\n },\r\n maxDailyHoursGteHoursPerDay,\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 readonly exploreDefaultViewOptions = computed<IconSelectOption[]>(() => {\r\n this.activeLang();\r\n\r\n return EXPLORE_DEFAULT_VIEW_OPTIONS.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 !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 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 styleClass: '!w-[30rem] !absolute !shadow-none',\r\n position: 'end',\r\n appendTo: 'page-content',\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.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: 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: 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: normalizeExploreDefaultView(value.defaultExploreView),\r\n showDesignSwitcher: normalizeShowDesignSwitcher(value.showDesignSwitcher),\r\n };\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 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',\r\n h: 'format-token-hour',\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 { id: '{0:N3}', name: `1,000 N3 ${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 normalizeExploreDefaultView(value: unknown): ExploreDefaultView {\r\n return EXPLORE_DEFAULT_VIEW_OPTIONS.some((option) => option.id === value)\r\n ? (value as ExploreDefaultView)\r\n : DEFAULT_GENERAL_CONFIGURATION.defaultExploreView;\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\nfunction maxDailyHoursGteHoursPerDay(\r\n group: AbstractControl,\r\n): ValidationErrors | null {\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\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 />\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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"}
|