@masterteam/notification 0.0.27 → 0.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/i18n/ar.json +236 -45
- package/assets/i18n/en.json +236 -45
- package/assets/notification.css +1 -1
- package/fesm2022/masterteam-notification.mjs +1983 -848
- package/fesm2022/masterteam-notification.mjs.map +1 -1
- package/package.json +5 -3
- package/types/masterteam-notification.d.ts +790 -304
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"masterteam-notification.mjs","sources":["../../../../packages/masterteam/notification/src/lib/add-template-dialog/add-template-dialog.ts","../../../../packages/masterteam/notification/src/lib/add-template-dialog/add-template-dialog.html","../../../../packages/masterteam/notification/src/store/notification/notification.model.ts","../../../../packages/masterteam/notification/src/store/notification/notification.actions.ts","../../../../packages/masterteam/notification/src/store/notification/notification.state.ts","../../../../packages/masterteam/notification/src/store/notification/notification.facade.ts","../../../../packages/masterteam/notification/src/lib/notification-template/notification-template.ts","../../../../packages/masterteam/notification/src/lib/notification-template/notification-template.html","../../../../packages/masterteam/notification/src/store/app.state.ts","../../../../packages/masterteam/notification/src/masterteam-notification.ts"],"sourcesContent":["import { Component, inject, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { Button } from '@masterteam/components/button';\r\n\r\n@Component({\r\n selector: 'mt-add-template-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n TranslocoModule,\r\n TextField,\r\n Button,\r\n ],\r\n templateUrl: './add-template-dialog.html',\r\n})\r\nexport class AddTemplateDialog {\r\n readonly modalService = inject(ModalService);\r\n private readonly ref = inject(ModalRef);\r\n\r\n data = input<any>(null);\r\n\r\n templateNameControl = new FormControl<string>('', [Validators.required]);\r\n\r\n onSave(): void {\r\n if (this.templateNameControl.valid) {\r\n this.ref.close({ name: this.templateNameControl.value?.trim() });\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.ref.close();\r\n }\r\n}\r\n","<div [class]=\"modalService.contentClass\" class=\"p-4\">\r\n <mt-text-field\r\n [formControl]=\"templateNameControl\"\r\n [label]=\"'notification.templateName' | transloco\"\r\n [placeholder]=\"'notification.enterTemplateName' | transloco\"\r\n [required]=\"true\"\r\n />\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"'notification.cancel' | transloco\"\r\n variant=\"outlined\"\r\n (onClick)=\"onCancel()\"\r\n />\r\n <mt-button\r\n [label]=\"'notification.save' | transloco\"\r\n [disabled]=\"!templateNameControl.valid\"\r\n (onClick)=\"onSave()\"\r\n />\r\n</div>\r\n","import type { LoadingStateShape } from '@masterteam/components';\r\n\r\n// ============================================================================\r\n// Action Keys Enum\r\n// ============================================================================\r\nexport enum NotificationActionKey {\r\n GetEvents = 'getEvents',\r\n GetReceivers = 'getReceivers',\r\n GetProperties = 'getProperties',\r\n AddReceivers = 'addReceivers',\r\n DeleteReceiver = 'deleteReceiver',\r\n AddTemplate = 'addTemplate',\r\n UpdateTemplate = 'updateTemplate',\r\n DeleteTemplate = 'deleteTemplate',\r\n}\r\n\r\n// ============================================================================\r\n// Channel Types\r\n// ============================================================================\r\nexport type NotificationChannel = 'email' | 'sms' | 'app';\r\n\r\nexport interface ChannelConfig {\r\n key: NotificationChannel;\r\n labelKey: string;\r\n /** Whether this channel supports bilingual content */\r\n supportsBilingual: boolean;\r\n /** Whether bilingual is optional (true = show toggle) */\r\n bilingualOptional: boolean;\r\n /** Whether this channel uses rich text editor (false = textarea) */\r\n useRichEditor: boolean;\r\n /** Payload key for non-bilingual template (string value) */\r\n templateKey?: string;\r\n /** Payload key for bilingual template (object with en/ar) */\r\n translatableKey?: string;\r\n}\r\n\r\nexport const CHANNEL_CONFIGS: ChannelConfig[] = [\r\n {\r\n key: 'email',\r\n labelKey: 'notification.channel.email',\r\n supportsBilingual: false,\r\n bilingualOptional: false,\r\n useRichEditor: true,\r\n templateKey: 'emailTemplate',\r\n },\r\n {\r\n key: 'sms',\r\n labelKey: 'notification.channel.sms',\r\n supportsBilingual: false,\r\n bilingualOptional: false,\r\n useRichEditor: false,\r\n templateKey: 'smsTemplate',\r\n },\r\n {\r\n key: 'app',\r\n labelKey: 'notification.channel.app',\r\n supportsBilingual: true,\r\n bilingualOptional: false,\r\n useRichEditor: true,\r\n translatableKey: 'appTemplate',\r\n },\r\n];\r\n\r\n/** Helper to get channel config by key */\r\nexport function getChannelConfig(key: NotificationChannel): ChannelConfig {\r\n return CHANNEL_CONFIGS.find((c) => c.key === key) ?? CHANNEL_CONFIGS[0];\r\n}\r\n\r\n/** Build form control name for a channel field */\r\nexport function getFormControlName(\r\n ch: ChannelConfig,\r\n type: 'single' | 'en' | 'ar',\r\n): string | null {\r\n if (type === 'single') return ch.templateKey ?? null;\r\n if (!ch.translatableKey) return null;\r\n return type === 'en'\r\n ? `${ch.translatableKey}.en`\r\n : `${ch.translatableKey}.ar`;\r\n}\r\n\r\n// ============================================================================\r\n// Translatable Content\r\n// ============================================================================\r\nexport interface TranslatableContent {\r\n en: string;\r\n ar: string;\r\n}\r\n\r\n// ============================================================================\r\n// Receiver Types\r\n// ============================================================================\r\nexport interface ReceiverItem {\r\n id: string | number;\r\n identifier: string;\r\n name: any;\r\n type: string;\r\n isSystem?: boolean;\r\n}\r\n\r\nexport interface ReceiverGroup {\r\n groupName: string;\r\n items: ReceiverItem[] | ReceiverSubGroup[];\r\n}\r\n\r\nexport interface ReceiverSubGroup {\r\n subGroupName: string;\r\n items: ReceiverItem[];\r\n}\r\n\r\nexport interface ReceiverOptionGroup {\r\n groupName: string;\r\n items: ReceiverItem[];\r\n}\r\n\r\n// ============================================================================\r\n// Property Types\r\n// ============================================================================\r\nexport interface NotificationProperty {\r\n key: string;\r\n name: string;\r\n groupName?: string;\r\n}\r\n\r\nexport interface PropertyGroup {\r\n groupName: string;\r\n properties: NotificationProperty[];\r\n}\r\n\r\n// ============================================================================\r\n// Template Types\r\n// ============================================================================\r\nexport interface NotificationTemplateItem {\r\n id: string | number;\r\n eventId: string | number; // Link to parent event\r\n name: string;\r\n isSystem: boolean;\r\n channel: NotificationChannel;\r\n receivers: ReceiverItem[];\r\n emailTemplate: string;\r\n emailContentTranslatable: TranslatableContent;\r\n smsTemplate: string;\r\n appTemplate: TranslatableContent;\r\n conditionFormula?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Event Types\r\n// ============================================================================\r\nexport interface NotificationEvent {\r\n id: string | number;\r\n eventName: string;\r\n name: string;\r\n}\r\n\r\n// ============================================================================\r\n// Action Types (Workflow)\r\n// ============================================================================\r\nexport interface NotificationAction {\r\n id: string | number;\r\n name: string;\r\n type: string;\r\n}\r\n\r\nexport interface ActionGroup {\r\n activity: string;\r\n items: NotificationAction[];\r\n}\r\n\r\n// ============================================================================\r\n// Payloads\r\n// ============================================================================\r\nexport interface ReceiverPayloadItem {\r\n id: string | number;\r\n type: string;\r\n}\r\n\r\nexport interface AddReceiversPayload {\r\n receivers: ReceiverPayloadItem[];\r\n}\r\n\r\nexport interface AddTemplatePayload {\r\n name: string;\r\n channel: NotificationChannel;\r\n}\r\n\r\nexport interface UpdateTemplatePayload {\r\n title: string;\r\n emailTemplate?: string;\r\n emailContentTranslatable?: TranslatableContent;\r\n smsTemplate?: string;\r\n appTemplate?: TranslatableContent;\r\n conditionFormula?: string;\r\n}\r\n\r\n// ============================================================================\r\n// State Model\r\n// ============================================================================\r\nexport interface NotificationStateModel extends LoadingStateShape<NotificationActionKey> {\r\n // Module configuration\r\n moduleType: string | null;\r\n moduleId: string | number | null;\r\n parentModuleType: string | null;\r\n parentModuleId: string | number | null;\r\n parentPath: string;\r\n\r\n // Action mode (for workflow)\r\n isActionMode: boolean;\r\n selectedActionId: string | number | null;\r\n\r\n // Data collections\r\n events: NotificationEvent[];\r\n templates: NotificationTemplateItem[]; // Flattened templates\r\n actions: NotificationAction[];\r\n receivers: ReceiverItem[];\r\n receiverGroups: ReceiverOptionGroup[];\r\n propertyGroups: PropertyGroup[];\r\n\r\n // Selection state\r\n selectedEventName: string | null;\r\n selectedTemplateId: string | number | null;\r\n}\r\n","import type {\r\n AddReceiversPayload,\r\n AddTemplatePayload,\r\n UpdateTemplatePayload,\r\n} from './notification.model';\r\n\r\n// ============================================================================\r\n// Module Configuration\r\n// ============================================================================\r\nexport class SetModuleInfo {\r\n static readonly type = '[Notification] Set Module Info';\r\n constructor(\r\n public moduleType: string,\r\n public moduleId: string | number,\r\n public parentModuleType?: string,\r\n public parentModuleId?: string | number,\r\n public parentPath?: string,\r\n ) {}\r\n}\r\n\r\n// ============================================================================\r\n// Data Loading Actions\r\n// ============================================================================\r\nexport class GetEvents {\r\n static readonly type = '[Notification] Get Events';\r\n}\r\n\r\nexport class GetReceivers {\r\n static readonly type = '[Notification] Get Receivers';\r\n}\r\n\r\nexport class GetProperties {\r\n static readonly type = '[Notification] Get Properties';\r\n constructor(public isMultiLang?: boolean) {}\r\n}\r\n\r\n// ============================================================================\r\n// Action Mode (Workflow)\r\n// ============================================================================\r\nexport class SetActionMode {\r\n static readonly type = '[Notification] Set Action Mode';\r\n constructor(public actionId: string | number | null) {}\r\n}\r\n\r\nexport class GetActionReceivers {\r\n static readonly type = '[Notification] Get Action Receivers';\r\n constructor(public actionId: string | number) {}\r\n}\r\n\r\nexport class GetActionProperties {\r\n static readonly type = '[Notification] Get Action Properties';\r\n constructor(\r\n public actionId: string | number,\r\n public isMultiLang?: boolean,\r\n ) {}\r\n}\r\n\r\n// ============================================================================\r\n// Selection Actions\r\n// ============================================================================\r\nexport class SelectEvent {\r\n static readonly type = '[Notification] Select Event';\r\n constructor(public eventName: string) {}\r\n}\r\n\r\nexport class SelectTemplate {\r\n static readonly type = '[Notification] Select Template';\r\n constructor(public templateId: string | number) {}\r\n}\r\n\r\n// ============================================================================\r\n// Receiver CRUD\r\n// ============================================================================\r\nexport class AddReceivers {\r\n static readonly type = '[Notification] Add Receivers';\r\n constructor(\r\n public templateId: string | number,\r\n public payload: AddReceiversPayload,\r\n ) {}\r\n}\r\n\r\nexport class DeleteReceiver {\r\n static readonly type = '[Notification] Delete Receiver';\r\n constructor(public receiverId: string | number) {}\r\n}\r\n\r\n// ============================================================================\r\n// Template CRUD\r\n// ============================================================================\r\nexport class AddTemplate {\r\n static readonly type = '[Notification] Add Template';\r\n constructor(\r\n public eventId: string | number,\r\n public payload: AddTemplatePayload,\r\n ) {}\r\n}\r\n\r\nexport class UpdateTemplate {\r\n static readonly type = '[Notification] Update Template';\r\n constructor(\r\n public templateId: string | number,\r\n public payload: UpdateTemplatePayload,\r\n ) {}\r\n}\r\n\r\nexport class DeleteTemplate {\r\n static readonly type = '[Notification] Delete Template';\r\n constructor(public templateId: string | number) {}\r\n}\r\n\r\n// ============================================================================\r\n// Reset State\r\n// ============================================================================\r\nexport class ResetNotificationState {\r\n static readonly type = '[Notification] Reset State';\r\n}\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\r\nimport {\r\n CrudStateBase,\r\n handleApiRequest,\r\n Response,\r\n} from '@masterteam/components';\r\n\r\nimport {\r\n NotificationActionKey,\r\n NotificationStateModel,\r\n NotificationEvent,\r\n NotificationTemplateItem,\r\n ReceiverItem,\r\n ReceiverGroup,\r\n ReceiverOptionGroup,\r\n ReceiverSubGroup,\r\n PropertyGroup,\r\n} from './notification.model';\r\nimport {\r\n AddReceivers,\r\n AddTemplate,\r\n DeleteReceiver,\r\n DeleteTemplate,\r\n GetActionProperties,\r\n GetActionReceivers,\r\n GetEvents,\r\n GetProperties,\r\n GetReceivers,\r\n ResetNotificationState,\r\n SelectEvent,\r\n SelectTemplate,\r\n SetActionMode,\r\n SetModuleInfo,\r\n UpdateTemplate,\r\n} from './notification.actions';\r\n\r\n// Default State\r\n\r\nconst DEFAULT_STATE: NotificationStateModel = {\r\n // Module configuration\r\n moduleType: null,\r\n moduleId: null,\r\n parentModuleType: null,\r\n parentModuleId: null,\r\n parentPath: '',\r\n\r\n // Action mode\r\n isActionMode: false,\r\n selectedActionId: null,\r\n\r\n // Data collections\r\n events: [],\r\n templates: [], // Flattened templates\r\n actions: [],\r\n receivers: [],\r\n receiverGroups: [],\r\n propertyGroups: [],\r\n\r\n // Selection state\r\n selectedEventName: null,\r\n selectedTemplateId: null,\r\n\r\n // Loading state (from LoadingStateShape)\r\n loadingActive: [],\r\n errors: {},\r\n};\r\n\r\n// State Definition\r\n\r\n@State<NotificationStateModel>({\r\n name: 'notification',\r\n defaults: DEFAULT_STATE,\r\n})\r\n@Injectable()\r\nexport class NotificationState extends CrudStateBase<\r\n NotificationTemplateItem,\r\n NotificationStateModel,\r\n NotificationActionKey\r\n> {\r\n private readonly http = inject(HttpClient);\r\n private readonly baseUrl = 'notifications';\r\n\r\n // Selectors - Individual selectors for fine-grained reactivity\r\n @Selector()\r\n static getState(state: NotificationStateModel): NotificationStateModel {\r\n return state;\r\n }\r\n\r\n @Selector()\r\n static getEvents(state: NotificationStateModel): NotificationEvent[] {\r\n return state.events;\r\n }\r\n\r\n @Selector()\r\n static getTemplates(\r\n state: NotificationStateModel,\r\n ): NotificationTemplateItem[] {\r\n return state.templates;\r\n }\r\n\r\n @Selector()\r\n static getReceivers(state: NotificationStateModel): ReceiverItem[] {\r\n return state.receivers;\r\n }\r\n\r\n @Selector()\r\n static getReceiverGroups(\r\n state: NotificationStateModel,\r\n ): ReceiverOptionGroup[] {\r\n return state.receiverGroups;\r\n }\r\n\r\n @Selector()\r\n static getPropertyGroups(state: NotificationStateModel): PropertyGroup[] {\r\n return state.propertyGroups;\r\n }\r\n\r\n @Selector()\r\n static getSelectedEventName(state: NotificationStateModel): string | null {\r\n return state.selectedEventName;\r\n }\r\n\r\n @Selector()\r\n static getSelectedTemplateId(\r\n state: NotificationStateModel,\r\n ): string | number | null {\r\n return state.selectedTemplateId;\r\n }\r\n\r\n @Selector()\r\n static getLoadingActive(state: NotificationStateModel): string[] {\r\n return state.loadingActive;\r\n }\r\n\r\n @Selector()\r\n static getErrors(\r\n state: NotificationStateModel,\r\n ): Record<string, string | null> {\r\n return state.errors;\r\n }\r\n\r\n // Derived selectors\r\n @Selector([\r\n NotificationState.getEvents,\r\n NotificationState.getSelectedEventName,\r\n ])\r\n static getSelectedEvent(\r\n events: NotificationEvent[],\r\n selectedEventName: string | null,\r\n ): NotificationEvent | null {\r\n return events.find((e) => e.eventName === selectedEventName) ?? null;\r\n }\r\n\r\n @Selector([\r\n NotificationState.getTemplates,\r\n NotificationState.getSelectedEvent,\r\n ])\r\n static getEventTemplates(\r\n templates: NotificationTemplateItem[],\r\n selectedEvent: NotificationEvent | null,\r\n ): NotificationTemplateItem[] {\r\n if (!selectedEvent) return [];\r\n return templates.filter((t) => t.eventId === selectedEvent.id);\r\n }\r\n\r\n @Selector([\r\n NotificationState.getTemplates,\r\n NotificationState.getSelectedTemplateId,\r\n ])\r\n static getSelectedTemplate(\r\n templates: NotificationTemplateItem[],\r\n selectedTemplateId: string | number | null,\r\n ): NotificationTemplateItem | null {\r\n return templates.find((t) => t.id === selectedTemplateId) ?? null;\r\n }\r\n\r\n @Selector([\r\n NotificationState.getReceivers,\r\n NotificationState.getSelectedTemplate,\r\n ])\r\n static getAvailableReceivers(\r\n receivers: ReceiverItem[],\r\n selectedTemplate: NotificationTemplateItem | null,\r\n ): ReceiverItem[] {\r\n if (!selectedTemplate) return receivers;\r\n const templateReceivers = selectedTemplate.receivers ?? [];\r\n const assignedIds = new Set(templateReceivers.map((r) => r.identifier));\r\n return receivers.filter((r) => !assignedIds.has(String(r.id)));\r\n }\r\n\r\n @Selector([\r\n NotificationState.getReceiverGroups,\r\n NotificationState.getSelectedTemplate,\r\n ])\r\n static getAvailableReceiverGroups(\r\n receiverGroups: ReceiverOptionGroup[],\r\n selectedTemplate: NotificationTemplateItem | null,\r\n ): ReceiverOptionGroup[] {\r\n if (!selectedTemplate) return receiverGroups;\r\n\r\n const assignedIds = new Set(\r\n (selectedTemplate.receivers ?? []).map((r) => r.identifier),\r\n );\r\n\r\n return receiverGroups\r\n .map((group) => ({\r\n ...group,\r\n items: group.items.filter((item) => !assignedIds.has(String(item.id))),\r\n }))\r\n .filter((group) => group.items.length > 0);\r\n }\r\n\r\n // Helper Methods\r\n\r\n /** API returns events with nested templates - we flatten for state */\r\n private flattenEventsResponse(\r\n eventsWithTemplates: Array<\r\n NotificationEvent & { templates: NotificationTemplateItem[] }\r\n >,\r\n ): { events: NotificationEvent[]; templates: NotificationTemplateItem[] } {\r\n const events: NotificationEvent[] = [];\r\n const templates: NotificationTemplateItem[] = [];\r\n\r\n for (const event of eventsWithTemplates) {\r\n const { templates: eventTemplates, ...eventData } = event;\r\n events.push(eventData);\r\n templates.push(\r\n ...eventTemplates.map((t) => ({ ...t, eventId: event.id })),\r\n );\r\n }\r\n\r\n return { events, templates };\r\n }\r\n\r\n private normalizeReceiverGroups(\r\n groups: ReceiverGroup[],\r\n ): ReceiverOptionGroup[] {\r\n return groups\r\n .map((group) => ({\r\n groupName: group.groupName,\r\n items: this.flattenReceiverItems(group.items),\r\n }))\r\n .filter((group) => group.items.length > 0);\r\n }\r\n\r\n private flattenReceiverItems(\r\n items: Array<ReceiverItem | ReceiverSubGroup> | null | undefined,\r\n parentLabel?: string,\r\n ): ReceiverItem[] {\r\n if (!Array.isArray(items)) {\r\n return [];\r\n }\r\n\r\n return items.flatMap((item) => {\r\n const subGroupItems = (item as ReceiverSubGroup).items;\r\n if (Array.isArray(subGroupItems)) {\r\n const subGroupName = (item as ReceiverSubGroup).subGroupName;\r\n const nextLabel = subGroupName\r\n ? parentLabel\r\n ? `${parentLabel} - ${subGroupName}`\r\n : subGroupName\r\n : parentLabel;\r\n\r\n return this.flattenReceiverItems(subGroupItems, nextLabel);\r\n }\r\n\r\n const receiver = item as ReceiverItem;\r\n if (receiver.id == null || !receiver.name) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n ...receiver,\r\n name: parentLabel\r\n ? `${parentLabel} - ${receiver.name}`\r\n : receiver.name,\r\n },\r\n ];\r\n });\r\n }\r\n\r\n private hasOwnField<T extends object>(\r\n value: T,\r\n field: keyof NotificationTemplateItem,\r\n ): boolean {\r\n return Object.prototype.hasOwnProperty.call(value, field);\r\n }\r\n\r\n private mergeUpdatedTemplate(\r\n existingTemplate: NotificationTemplateItem,\r\n updatedTemplate: Partial<NotificationTemplateItem>,\r\n ): NotificationTemplateItem {\r\n const mergedTemplate: NotificationTemplateItem = {\r\n ...existingTemplate,\r\n name: updatedTemplate.name ?? existingTemplate.name,\r\n };\r\n\r\n if (this.hasOwnField(updatedTemplate, 'emailTemplate')) {\r\n mergedTemplate.emailTemplate = updatedTemplate.emailTemplate ?? '';\r\n }\r\n\r\n if (\r\n this.hasOwnField(updatedTemplate, 'emailContentTranslatable') &&\r\n updatedTemplate.emailContentTranslatable\r\n ) {\r\n mergedTemplate.emailContentTranslatable = {\r\n ...existingTemplate.emailContentTranslatable,\r\n ...updatedTemplate.emailContentTranslatable,\r\n };\r\n }\r\n\r\n if (this.hasOwnField(updatedTemplate, 'smsTemplate')) {\r\n mergedTemplate.smsTemplate = updatedTemplate.smsTemplate ?? '';\r\n }\r\n\r\n if (\r\n this.hasOwnField(updatedTemplate, 'appTemplate') &&\r\n updatedTemplate.appTemplate\r\n ) {\r\n mergedTemplate.appTemplate = {\r\n ...existingTemplate.appTemplate,\r\n ...updatedTemplate.appTemplate,\r\n };\r\n }\r\n\r\n if (this.hasOwnField(updatedTemplate, 'conditionFormula')) {\r\n mergedTemplate.conditionFormula = updatedTemplate.conditionFormula;\r\n }\r\n\r\n return mergedTemplate;\r\n }\r\n\r\n // Module Configuration\r\n\r\n @Action(SetModuleInfo)\r\n setModuleInfo(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: SetModuleInfo,\r\n ) {\r\n let parentPath = '';\r\n if (action.parentModuleType && action.parentModuleId) {\r\n parentPath = `/${action.parentModuleType}/${action.parentModuleId}`;\r\n } else if (action.parentPath) {\r\n parentPath = action.parentPath;\r\n }\r\n\r\n ctx.patchState({\r\n moduleType: action.moduleType,\r\n moduleId: action.moduleId,\r\n parentModuleType: action.parentModuleType ?? null,\r\n parentModuleId: action.parentModuleId ?? null,\r\n parentPath,\r\n isActionMode: action.moduleType === 'workflow',\r\n });\r\n }\r\n\r\n @Action(ResetNotificationState)\r\n resetState(ctx: StateContext<NotificationStateModel>) {\r\n ctx.setState(DEFAULT_STATE);\r\n }\r\n\r\n // Data Loading Actions (Normal Mode)\r\n\r\n @Action(GetEvents)\r\n getEvents(ctx: StateContext<NotificationStateModel>) {\r\n const { moduleType, moduleId, parentPath } = ctx.getState();\r\n // API returns events with nested templates\r\n type EventWithTemplates = NotificationEvent & {\r\n templates: NotificationTemplateItem[];\r\n };\r\n const req$ = this.http.get<Response<EventWithTemplates[]>>(\r\n `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/events`,\r\n );\r\n\r\n return this.load(ctx, {\r\n key: NotificationActionKey.GetEvents,\r\n request$: req$,\r\n updateState: (_state, data) => {\r\n const { events, templates } = this.flattenEventsResponse(data ?? []);\r\n const firstEvent = events[0];\r\n const firstTemplate = templates.find(\r\n (t) => t.eventId === firstEvent?.id,\r\n );\r\n return {\r\n events,\r\n templates,\r\n selectedEventName: firstEvent?.eventName ?? null,\r\n selectedTemplateId: firstTemplate?.id ?? null,\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(GetReceivers)\r\n getReceivers(ctx: StateContext<NotificationStateModel>) {\r\n const { parentPath, moduleType, moduleId } = ctx.getState();\r\n const req$ = this.http.get<Response<ReceiverGroup[]>>(\r\n `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/receivers`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetReceivers,\r\n request$: req$,\r\n onSuccess: (response) => {\r\n const receiverGroups = this.normalizeReceiverGroups(\r\n response.data ?? [],\r\n );\r\n return {\r\n receiverGroups,\r\n receivers: receiverGroups.flatMap((group) => group.items),\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(GetProperties)\r\n getProperties(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: GetProperties,\r\n ) {\r\n const { moduleType, moduleId, parentPath } = ctx.getState();\r\n const url = `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/properties?IsMultiLanguageEnabled=${action.isMultiLang ? 'true' : 'false'}`;\r\n\r\n const req$ = this.http.get<Response<PropertyGroup[]>>(url);\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetProperties,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n propertyGroups:\r\n response.data?.map((group) => ({\r\n ...group,\r\n icon: 'custom.list-cards',\r\n })) ?? [],\r\n }),\r\n });\r\n }\r\n\r\n // Action Mode (Workflow)\r\n\r\n @Action(SetActionMode)\r\n setActionMode(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: SetActionMode,\r\n ) {\r\n ctx.patchState({\r\n selectedActionId: action.actionId,\r\n });\r\n }\r\n\r\n @Action(GetActionReceivers)\r\n getActionReceivers(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: GetActionReceivers,\r\n ) {\r\n const req$ = this.http.get<Response<ReceiverGroup[]>>(\r\n `${this.baseUrl}/action/${action.actionId}/receivers`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetReceivers,\r\n request$: req$,\r\n onSuccess: (response) => {\r\n const receiverGroups = this.normalizeReceiverGroups(\r\n response.data ?? [],\r\n );\r\n return {\r\n receiverGroups,\r\n receivers: receiverGroups.flatMap((group) => group.items),\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(GetActionProperties)\r\n getActionProperties(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: GetActionProperties,\r\n ) {\r\n const url = `${this.baseUrl}/action/${action.actionId}/properties?IsMultiLanguageEnabled=${action.isMultiLang ? 'true' : 'false'}`;\r\n\r\n const req$ = this.http.get<Response<PropertyGroup[]>>(url);\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.GetProperties,\r\n request$: req$,\r\n onSuccess: (response) => ({\r\n propertyGroups: response.data ?? [],\r\n }),\r\n });\r\n }\r\n\r\n // Selection Actions\r\n\r\n @Action(SelectEvent)\r\n selectEvent(ctx: StateContext<NotificationStateModel>, action: SelectEvent) {\r\n const state = ctx.getState();\r\n const event = state.events.find((e) => e.eventName === action.eventName);\r\n const eventTemplates = state.templates.filter(\r\n (t) => t.eventId === event?.id,\r\n );\r\n ctx.patchState({\r\n selectedEventName: action.eventName,\r\n selectedTemplateId: eventTemplates[0]?.id ?? null,\r\n });\r\n }\r\n\r\n @Action(SelectTemplate)\r\n selectTemplate(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: SelectTemplate,\r\n ) {\r\n ctx.patchState({ selectedTemplateId: action.templateId });\r\n }\r\n\r\n // Receiver CRUD\r\n @Action(AddReceivers)\r\n addReceivers(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: AddReceivers,\r\n ) {\r\n const req$ = this.http.post<Response<ReceiverItem[]>>(\r\n `${this.baseUrl}/templates/${action.templateId}`,\r\n action.payload,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.AddReceivers,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const newReceivers = response.data ?? [];\r\n const templates = this.adapter.updateOne(\r\n state.templates,\r\n action.templateId,\r\n {\r\n receivers: [\r\n ...(state.templates.find((t) => t.id === action.templateId)\r\n ?.receivers ?? []),\r\n ...newReceivers,\r\n ],\r\n },\r\n 'id',\r\n );\r\n return { templates };\r\n },\r\n });\r\n }\r\n\r\n @Action(DeleteReceiver)\r\n deleteReceiver(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: DeleteReceiver,\r\n ) {\r\n const state = ctx.getState();\r\n const template = this.getSelectedTemplate(state);\r\n\r\n if (!template) {\r\n return;\r\n }\r\n\r\n const req$ = this.http.delete<Response<void>>(\r\n `${this.baseUrl}/receivers/${action.receiverId}`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.DeleteReceiver,\r\n request$: req$,\r\n onSuccess: (_, currentState) => {\r\n const templates = this.adapter.updateOne(\r\n currentState.templates,\r\n template.id,\r\n {\r\n receivers: template.receivers.filter(\r\n (r) => r.id !== action.receiverId,\r\n ),\r\n },\r\n 'id',\r\n );\r\n return { templates };\r\n },\r\n });\r\n }\r\n\r\n // Template CRUD\r\n @Action(AddTemplate)\r\n addTemplate(ctx: StateContext<NotificationStateModel>, action: AddTemplate) {\r\n const req$ = this.http.post<Response<NotificationTemplateItem>>(\r\n `${this.baseUrl}/events/${action.eventId}`,\r\n action.payload,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.AddTemplate,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const newTemplate = response.data;\r\n if (!newTemplate) return {};\r\n\r\n return {\r\n templates: this.adapter.addOne(state.templates, {\r\n ...newTemplate,\r\n eventId: action.eventId,\r\n }),\r\n selectedTemplateId: newTemplate.id,\r\n };\r\n },\r\n });\r\n }\r\n\r\n @Action(UpdateTemplate)\r\n updateTemplate(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: UpdateTemplate,\r\n ) {\r\n const req$ = this.http.put<Response<Partial<NotificationTemplateItem>>>(\r\n `${this.baseUrl}/templates/${action.templateId}`,\r\n action.payload,\r\n {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json',\r\n }),\r\n },\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.UpdateTemplate,\r\n request$: req$,\r\n onSuccess: (response, state) => {\r\n const updatedTemplate = response.data;\r\n if (!updatedTemplate) return {};\r\n\r\n // Preserve existing fields that API may not return or shouldn't change\r\n const existingTemplate = state.templates.find(\r\n (t) => t.id === action.templateId,\r\n );\r\n\r\n if (!existingTemplate) return {};\r\n\r\n // Only update name and content fields, preserve channel/eventId/receivers\r\n const templates = this.adapter.upsertOne(\r\n state.templates,\r\n this.mergeUpdatedTemplate(existingTemplate, updatedTemplate),\r\n 'id',\r\n );\r\n return { templates };\r\n },\r\n });\r\n }\r\n\r\n @Action(DeleteTemplate)\r\n deleteTemplate(\r\n ctx: StateContext<NotificationStateModel>,\r\n action: DeleteTemplate,\r\n ) {\r\n const req$ = this.http.delete<Response<void>>(\r\n `${this.baseUrl}/templates/${action.templateId}`,\r\n );\r\n\r\n return handleApiRequest({\r\n ctx,\r\n key: NotificationActionKey.DeleteTemplate,\r\n request$: req$,\r\n onSuccess: (_, state) => {\r\n const templates = this.adapter.removeOne(\r\n state.templates,\r\n action.templateId,\r\n 'id',\r\n );\r\n\r\n // Select first template of current event after deletion\r\n const currentEvent = state.events.find(\r\n (e) => e.eventName === state.selectedEventName,\r\n );\r\n const eventTemplates = templates.filter(\r\n (t) => t.eventId === currentEvent?.id,\r\n );\r\n const systemTemplate = eventTemplates.find((t) => t.isSystem);\r\n\r\n return {\r\n templates,\r\n selectedTemplateId:\r\n systemTemplate?.id ?? eventTemplates[0]?.id ?? null,\r\n };\r\n },\r\n });\r\n }\r\n\r\n // Private Helpers\r\n private getSelectedTemplate(\r\n state: NotificationStateModel,\r\n ): NotificationTemplateItem | null {\r\n return (\r\n state.templates.find((t) => t.id === state.selectedTemplateId) ?? null\r\n );\r\n }\r\n}\r\n","import { Injectable, computed, inject } from '@angular/core';\r\nimport { Store, select } from '@ngxs/store';\r\n\r\nimport {\r\n NotificationActionKey,\r\n AddReceiversPayload,\r\n AddTemplatePayload,\r\n UpdateTemplatePayload,\r\n} from './notification.model';\r\nimport {\r\n AddReceivers,\r\n AddTemplate,\r\n DeleteReceiver,\r\n DeleteTemplate,\r\n GetActionProperties,\r\n GetActionReceivers,\r\n GetEvents,\r\n GetProperties,\r\n GetReceivers,\r\n ResetNotificationState,\r\n SelectEvent,\r\n SelectTemplate,\r\n SetActionMode,\r\n SetModuleInfo,\r\n UpdateTemplate,\r\n} from './notification.actions';\r\nimport { NotificationState } from './notification.state';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NotificationFacade {\r\n private readonly store = inject(Store);\r\n\r\n // ============================================================================\r\n // Data Selectors - Memoized by NGXS (fine-grained reactivity)\r\n // ============================================================================\r\n readonly events = select(NotificationState.getEvents);\r\n readonly templates = select(NotificationState.getEventTemplates);\r\n readonly receivers = select(NotificationState.getReceivers);\r\n readonly receiverGroups = select(NotificationState.getReceiverGroups);\r\n readonly propertyGroups = select(NotificationState.getPropertyGroups);\r\n\r\n // Selection selectors\r\n readonly selectedEventName = select(NotificationState.getSelectedEventName);\r\n readonly selectedTemplateId = select(NotificationState.getSelectedTemplateId);\r\n readonly selectedEvent = select(NotificationState.getSelectedEvent);\r\n readonly selectedTemplate = select(NotificationState.getSelectedTemplate);\r\n readonly availableReceivers = select(NotificationState.getAvailableReceivers);\r\n readonly availableReceiverGroups = select(\r\n NotificationState.getAvailableReceiverGroups,\r\n );\r\n\r\n // ============================================================================\r\n // Loading/Error Slices - Memoized by NGXS\r\n // ============================================================================\r\n private readonly loadingActive = select(NotificationState.getLoadingActive);\r\n private readonly errors = select(NotificationState.getErrors);\r\n\r\n // ============================================================================\r\n // Loading Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly isLoadingEvents = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.GetEvents),\r\n );\r\n readonly isLoadingReceivers = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.GetReceivers),\r\n );\r\n readonly isLoadingProperties = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.GetProperties),\r\n );\r\n readonly isAddingReceivers = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.AddReceivers),\r\n );\r\n readonly isDeletingReceiver = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.DeleteReceiver),\r\n );\r\n readonly isAddingTemplate = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.AddTemplate),\r\n );\r\n readonly isUpdatingTemplate = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.UpdateTemplate),\r\n );\r\n readonly isDeletingTemplate = computed(() =>\r\n this.loadingActive().includes(NotificationActionKey.DeleteTemplate),\r\n );\r\n\r\n // ============================================================================\r\n // Error Signals - Computed from slice (minimal reactivity)\r\n // ============================================================================\r\n readonly eventsError = computed(\r\n () => this.errors()[NotificationActionKey.GetEvents] ?? null,\r\n );\r\n readonly receiversError = computed(\r\n () => this.errors()[NotificationActionKey.GetReceivers] ?? null,\r\n );\r\n readonly propertiesError = computed(\r\n () => this.errors()[NotificationActionKey.GetProperties] ?? null,\r\n );\r\n\r\n // Action Dispatchers - Configuration\r\n\r\n /**\r\n * Scopes this (shared, singleton) state to a module/event context.\r\n *\r\n * This only patches the scope fields — it does NOT clear previously\r\n * loaded events/templates/selection from whatever context was active\r\n * before. Every caller that rescopes (switching component, tab, or\r\n * selected step/node) MUST call {@link resetState} immediately before\r\n * this, so there is no window where the new context reads stale data\r\n * from the old one. See `workflow-builder.ts` / `escalation-builder.ts`\r\n * for the reference call sites.\r\n */\r\n setModuleInfo(\r\n moduleType: string,\r\n moduleId: string | number,\r\n parentModuleType?: string,\r\n parentModuleId?: string | number,\r\n parentPath?: string,\r\n ) {\r\n return this.store.dispatch(\r\n new SetModuleInfo(\r\n moduleType,\r\n moduleId,\r\n parentModuleType,\r\n parentModuleId,\r\n parentPath,\r\n ),\r\n );\r\n }\r\n\r\n resetState() {\r\n return this.store.dispatch(new ResetNotificationState());\r\n }\r\n\r\n // Action Dispatchers - Data Loading\r\n loadEvents() {\r\n return this.store.dispatch(new GetEvents());\r\n }\r\n\r\n loadReceivers() {\r\n return this.store.dispatch(new GetReceivers());\r\n }\r\n\r\n loadProperties(isMultiLang?: boolean) {\r\n return this.store.dispatch(new GetProperties(isMultiLang));\r\n }\r\n\r\n loadPropertiesForCurrentContext(isMultiLang?: boolean) {\r\n const state = this.store.selectSnapshot(NotificationState.getState);\r\n\r\n if (state.isActionMode && state.selectedActionId != null) {\r\n return this.store.dispatch(\r\n new GetActionProperties(state.selectedActionId, isMultiLang),\r\n );\r\n }\r\n\r\n return this.store.dispatch(new GetProperties(isMultiLang));\r\n }\r\n\r\n // Action Dispatchers - Action Mode (Workflow)\r\n setActionMode(actionId: string | number | null) {\r\n return this.store.dispatch(new SetActionMode(actionId));\r\n }\r\n\r\n loadActionReceivers(actionId: string | number) {\r\n return this.store.dispatch(new GetActionReceivers(actionId));\r\n }\r\n\r\n loadActionProperties(actionId: string | number, isMultiLang?: boolean) {\r\n return this.store.dispatch(new GetActionProperties(actionId, isMultiLang));\r\n }\r\n\r\n // Action Dispatchers - Selection\r\n selectEvent(eventName: string) {\r\n return this.store.dispatch(new SelectEvent(eventName));\r\n }\r\n\r\n selectTemplate(templateId: string | number) {\r\n return this.store.dispatch(new SelectTemplate(templateId));\r\n }\r\n\r\n // Action Dispatchers - Receiver CRUD\r\n addReceivers(templateId: string | number, payload: AddReceiversPayload) {\r\n return this.store.dispatch(new AddReceivers(templateId, payload));\r\n }\r\n\r\n deleteReceiver(receiverId: string | number) {\r\n return this.store.dispatch(new DeleteReceiver(receiverId));\r\n }\r\n\r\n // Action Dispatchers - Template CRUD\r\n\r\n addTemplate(eventId: string | number, payload: AddTemplatePayload) {\r\n return this.store.dispatch(new AddTemplate(eventId, payload));\r\n }\r\n\r\n updateTemplate(templateId: string | number, payload: UpdateTemplatePayload) {\r\n return this.store.dispatch(new UpdateTemplate(templateId, payload));\r\n }\r\n\r\n deleteTemplate(templateId: string | number) {\r\n return this.store.dispatch(new DeleteTemplate(templateId));\r\n }\r\n\r\n loadBaseData() {\r\n this.loadEvents();\r\n this.loadReceivers();\r\n }\r\n\r\n /**\r\n * Load all data for normal mode (non-workflow)\r\n */\r\n loadAllData(isMultiLang = true) {\r\n this.loadEvents();\r\n this.loadReceivers();\r\n this.loadPropertiesForCurrentContext(isMultiLang);\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n inject,\r\n signal,\r\n computed,\r\n effect,\r\n untracked,\r\n} from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoModule, TranslocoService } from '@jsverse/transloco';\r\n\r\n// Components\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { SelectField } from '@masterteam/components/select-field';\r\nimport { TextField } from '@masterteam/components/text-field';\r\nimport { TextareaField } from '@masterteam/components/textarea-field';\r\nimport { EditorField } from '@masterteam/components/editor-field';\r\nimport { ToggleField } from '@masterteam/components/toggle-field';\r\nimport { Tabs } from '@masterteam/components/tabs';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { ConfirmationService } from '@masterteam/components/confirmation';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { Skeleton } from 'primeng/skeleton';\r\n\r\n// Dialog\r\nimport { AddTemplateDialog } from '../add-template-dialog/add-template-dialog';\r\n\r\n// Store\r\nimport {\r\n NotificationFacade,\r\n NotificationChannel,\r\n NotificationTemplateItem,\r\n ReceiverItem,\r\n UpdateTemplatePayload,\r\n CHANNEL_CONFIGS,\r\n ChannelConfig,\r\n getChannelConfig,\r\n} from '../../store/notification';\r\n\r\n@Component({\r\n selector: 'mt-notification-template',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n TranslocoModule,\r\n Card,\r\n Button,\r\n SelectField,\r\n TextField,\r\n TextareaField,\r\n EditorField,\r\n ToggleField,\r\n Tabs,\r\n Icon,\r\n Skeleton,\r\n ],\r\n templateUrl: './notification-template.html',\r\n styleUrl: './notification-template.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NotificationTemplate {\r\n private readonly facade = inject(NotificationFacade);\r\n private readonly transloco = inject(TranslocoService);\r\n private readonly confirmationService = inject(ConfirmationService);\r\n private readonly modalService = inject(ModalService);\r\n\r\n // ============================================================================\r\n // Data Signals from Facade\r\n // ============================================================================\r\n readonly events = this.facade.events;\r\n readonly templates = this.facade.templates;\r\n readonly receivers = this.facade.receivers;\r\n readonly propertyGroups = this.facade.propertyGroups;\r\n\r\n // Selection Signals\r\n readonly selectedEventName = this.facade.selectedEventName;\r\n readonly selectedTemplateId = this.facade.selectedTemplateId;\r\n readonly selectedEvent = this.facade.selectedEvent;\r\n readonly selectedTemplate = this.facade.selectedTemplate;\r\n readonly availableReceivers = this.facade.availableReceivers;\r\n readonly availableReceiverGroups = this.facade.availableReceiverGroups;\r\n\r\n // ============================================================================\r\n // Loading States from Facade\r\n // ============================================================================\r\n readonly isLoadingEvents = this.facade.isLoadingEvents;\r\n readonly isLoadingReceivers = this.facade.isLoadingReceivers;\r\n readonly isLoadingProperties = this.facade.isLoadingProperties;\r\n readonly isUpdatingTemplate = this.facade.isUpdatingTemplate;\r\n readonly isDeletingTemplate = this.facade.isDeletingTemplate;\r\n readonly isAddingTemplate = this.facade.isAddingTemplate;\r\n\r\n // ============================================================================\r\n // Error States from Facade\r\n // ============================================================================\r\n readonly eventsError = this.facade.eventsError;\r\n readonly propertiesError = this.facade.propertiesError;\r\n\r\n // ============================================================================\r\n // Local State\r\n // ============================================================================\r\n readonly deletingReceiverIds = signal<(string | number)[]>([]);\r\n readonly addingReceiverIds = signal<(string | number)[]>([]);\r\n\r\n // ============================================================================\r\n // Form - Dynamic controls based on CHANNEL_CONFIGS\r\n // ============================================================================\r\n readonly form = this.buildForm();\r\n readonly propertyPickerControl = new FormControl<string | null>(null);\r\n readonly receiverPickerControl = new FormControl<string | number | null>(\r\n null,\r\n );\r\n private readonly channelControl = this.form.controls[\r\n 'channel'\r\n ] as FormControl<NotificationChannel>;\r\n readonly channelSignal = toSignal(this.channelControl.valueChanges, {\r\n initialValue: this.channelControl.value,\r\n });\r\n private buildForm(): FormGroup {\r\n const fc = (v = '') => new FormControl<string>(v, { nonNullable: true });\r\n const controls: Record<string, FormControl | FormGroup> = {\r\n event: new FormControl<string | null>(null),\r\n name: fc(),\r\n channel: new FormControl<NotificationChannel>('email', {\r\n nonNullable: true,\r\n }),\r\n };\r\n\r\n for (const ch of CHANNEL_CONFIGS) {\r\n if (ch.templateKey) controls[ch.templateKey] = fc();\r\n if (ch.translatableKey) {\r\n // Nested FormGroup to match payload structure { en: '', ar: '' }\r\n controls[ch.translatableKey] = new FormGroup({\r\n en: fc(),\r\n ar: fc(),\r\n });\r\n }\r\n if (ch.bilingualOptional) {\r\n controls[`${ch.key}Bilingual`] = new FormControl<boolean>(false, {\r\n nonNullable: true,\r\n });\r\n }\r\n }\r\n return new FormGroup(controls);\r\n }\r\n\r\n // ============================================================================\r\n // Computed\r\n // ============================================================================\r\n readonly channelConfigs = CHANNEL_CONFIGS;\r\n\r\n /** Check if channel should show bilingual fields - reads from form */\r\n isBilingual(ch: ChannelConfig): boolean {\r\n if (!ch.supportsBilingual) return false;\r\n if (!ch.bilingualOptional) return true; // forced bilingual (app)\r\n return this.form.controls[`${ch.key}Bilingual`]?.value ?? false;\r\n }\r\n\r\n readonly channelOptions = computed(() =>\r\n CHANNEL_CONFIGS.map((c) => ({\r\n ...c,\r\n name: this.transloco.translate(c.labelKey),\r\n })),\r\n );\r\n\r\n /** Templates of the selected event, rendered as tabs. */\r\n readonly templateTabs = computed(() =>\r\n this.templates().map((t) => ({\r\n label: t.name,\r\n value: t.id,\r\n isSystem: t.isSystem,\r\n })),\r\n );\r\n\r\n readonly activeChannel = computed<NotificationChannel>(\r\n () => this.selectedTemplate()?.channel ?? this.channelSignal(),\r\n );\r\n\r\n readonly shouldUseMultilingualProperties = computed(\r\n () => this.activeChannel() !== 'app',\r\n );\r\n\r\n readonly isFormInvalid = computed(\r\n () => !this.form.controls['name'].value?.trim(),\r\n );\r\n\r\n /**\r\n * Snapshot of the form's default shape, captured before any context ever\r\n * patches it. Used by {@link resetTemplateFields} to clear the form when the\r\n * selected template resolves to nothing, so a component switching context\r\n * never keeps displaying a previous context's values (see\r\n * `ResetNotificationState` for the store-level counterpart of this reset).\r\n */\r\n private readonly emptyFormValue = this.form.getRawValue();\r\n\r\n constructor() {\r\n effect(() => {\r\n const eventName = this.selectedEventName();\r\n if (eventName) {\r\n if (this.form.controls['event'].value !== eventName) {\r\n this.form.controls['event'].setValue(eventName, {\r\n emitEvent: false,\r\n });\r\n }\r\n } else {\r\n this.form.controls['event'].setValue(null, { emitEvent: false });\r\n }\r\n });\r\n\r\n effect(() => {\r\n this.selectedTemplateId(); // depend on selected template id\r\n const template = untracked(this.selectedTemplate);\r\n if (template) {\r\n this.patchForm(template);\r\n } else {\r\n this.resetTemplateFields();\r\n }\r\n });\r\n\r\n effect(() => {\r\n const template = this.selectedTemplate();\r\n if (!template) {\r\n return;\r\n }\r\n\r\n this.facade.loadPropertiesForCurrentContext(\r\n this.shouldUseMultilingualProperties(),\r\n );\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Event Handlers\r\n // ============================================================================\r\n onEventChange(eventName: string): void {\r\n if (eventName) this.facade.selectEvent(eventName);\r\n }\r\n\r\n onTemplateTabChange(templateId: string | number): void {\r\n this.facade.selectTemplate(templateId);\r\n }\r\n\r\n // Channel is fixed per template - set on creation only\r\n\r\n onAddProperty(propertyKey: string): void {\r\n if (!propertyKey) return;\r\n\r\n const tag = `{{${propertyKey}}}`;\r\n const ch = getChannelConfig(this.form.controls['channel'].value);\r\n\r\n if (this.isBilingual(ch) && ch.translatableKey) {\r\n const group = this.form.get(ch.translatableKey) as FormGroup;\r\n if (group) {\r\n const enCtrl = group.get('en') as FormControl<string>;\r\n const arCtrl = group.get('ar') as FormControl<string>;\r\n enCtrl?.setValue(`${enCtrl.value ?? ''} ${tag}`);\r\n arCtrl?.setValue(`${arCtrl.value ?? ''} ${tag}`);\r\n }\r\n } else if (ch.templateKey) {\r\n this.appendToControl(ch.templateKey, tag);\r\n }\r\n\r\n setTimeout(() => {\r\n this.propertyPickerControl.reset();\r\n }, 0);\r\n }\r\n\r\n onAddReceiver(receiverId: string | number): void {\r\n const template = this.selectedTemplate();\r\n if (!receiverId || !template) {\r\n setTimeout(() => this.receiverPickerControl.reset(), 0);\r\n return;\r\n }\r\n if (this.addingReceiverIds().includes(receiverId)) {\r\n setTimeout(() => this.receiverPickerControl.reset(), 0);\r\n return;\r\n }\r\n const selectedReceiver = this.availableReceivers().find(\r\n (r) => r.id === receiverId,\r\n );\r\n if (!selectedReceiver) {\r\n setTimeout(() => this.receiverPickerControl.reset(), 0);\r\n return;\r\n }\r\n this.addingReceiverIds.update((ids) => [...ids, receiverId]);\r\n this.facade\r\n .addReceivers(template.id, {\r\n receivers: [\r\n {\r\n id: selectedReceiver.id,\r\n type: selectedReceiver.type,\r\n },\r\n ],\r\n })\r\n .subscribe({\r\n complete: () =>\r\n this.addingReceiverIds.update((ids) =>\r\n ids.filter((id) => id !== receiverId),\r\n ),\r\n error: () =>\r\n this.addingReceiverIds.update((ids) =>\r\n ids.filter((id) => id !== receiverId),\r\n ),\r\n });\r\n setTimeout(() => this.receiverPickerControl.reset(), 0);\r\n }\r\n\r\n onDeleteReceiver(receiver: ReceiverItem): void {\r\n this.confirmationService.confirmDelete({\r\n type: 'dialog',\r\n accept: () => {\r\n this.deletingReceiverIds.update((ids) => [...ids, receiver.id]);\r\n this.facade.deleteReceiver(receiver.id).subscribe({\r\n complete: () => {\r\n this.deletingReceiverIds.update((ids) =>\r\n ids.filter((id) => id !== receiver.id),\r\n );\r\n },\r\n error: () => {\r\n this.deletingReceiverIds.update((ids) =>\r\n ids.filter((id) => id !== receiver.id),\r\n );\r\n },\r\n });\r\n },\r\n });\r\n }\r\n\r\n isReceiverDeleting(receiverId: string | number): boolean {\r\n return this.deletingReceiverIds().includes(receiverId);\r\n }\r\n\r\n onSaveTemplate(): void {\r\n const template = this.selectedTemplate();\r\n if (!template || this.isFormInvalid()) {\r\n this.form.markAllAsTouched();\r\n return;\r\n }\r\n\r\n // Build payload dynamically from all channel controls\r\n const payload = this.buildUpdatePayload(template);\r\n this.facade.updateTemplate(template.id, payload);\r\n }\r\n\r\n onDeleteTemplate(): void {\r\n const template = this.selectedTemplate();\r\n if (!template || template.isSystem) return;\r\n\r\n this.confirmationService.confirm({\r\n type: 'dialog',\r\n message: this.transloco.translate('notification.deleteTemplateMessage'),\r\n icon: 'general.trash-01',\r\n acceptButton: { severity: 'danger' },\r\n accept: () => this.facade.deleteTemplate(template.id),\r\n });\r\n }\r\n\r\n onAddTemplateClick(): void {\r\n const event = this.selectedEvent();\r\n if (!event) return;\r\n\r\n const ref = this.modalService.openModal(AddTemplateDialog, 'dialog', {\r\n header: this.transloco.translate('notification.addTemplate'),\r\n styleClass: '!w-[25rem]',\r\n });\r\n\r\n ref.onClose.subscribe((result: { name: string } | undefined) => {\r\n if (result?.name) {\r\n this.facade.addTemplate(event.id, {\r\n name: result.name,\r\n channel: this.form.controls['channel'].value,\r\n });\r\n }\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // Private Methods\r\n // ============================================================================\r\n\r\n /**\r\n * Clears every template-owned control back to the captured empty shape.\r\n *\r\n * `event` is deliberately excluded, so `patchValue` leaves whatever the event\r\n * effect (or the user's own pick) put in that control. An event with no\r\n * templates yet — a brand-new one, or one whose last template was just\r\n * deleted — resolves `selectedTemplate` to null, and this effect runs after\r\n * the event effect in the same flush: resetting the whole group there would\r\n * blank the event picker the user just used, while `selectedEvent()` stays\r\n * truthy and keeps the tabs/add-template row visible. Leaving the control\r\n * alone also keeps the two effects ordering-independent — on a full\r\n * `ResetNotificationState` the event effect has already nulled it, and that\r\n * null is carried through.\r\n *\r\n * `channel` is restored through {@link channelControl} with events enabled\r\n * because `channelSignal` is a `toSignal` of its `valueChanges` and is the\r\n * only consumer of them on this form — a silent reset would leave\r\n * `activeChannel()` reporting the previous template's channel.\r\n */\r\n private resetTemplateFields(): void {\r\n const { event: _event, channel, ...templateFields } = this.emptyFormValue;\r\n this.form.patchValue(templateFields, { emitEvent: false });\r\n this.channelControl.setValue(channel);\r\n this.form.markAsPristine();\r\n this.form.markAsUntouched();\r\n }\r\n\r\n private appendToControl(key: string, value: string): void {\r\n const ctrl = this.form.controls[key] as FormControl<string>;\r\n ctrl?.setValue(`${ctrl.value ?? ''} ${value}`);\r\n }\r\n\r\n private patchForm(template: NotificationTemplateItem): void {\r\n const channel = template.channel || 'email';\r\n\r\n this.form.patchValue({\r\n name: template.name,\r\n channel: channel,\r\n });\r\n\r\n // Patch all channel controls dynamically\r\n const t = template as unknown as Record<string, unknown>;\r\n for (const ch of CHANNEL_CONFIGS) {\r\n if (ch.templateKey) {\r\n this.form\r\n .get(ch.templateKey)\r\n ?.setValue((t[ch.templateKey] as string) ?? '');\r\n }\r\n if (ch.translatableKey) {\r\n const trans =\r\n (t[ch.translatableKey] as { en?: string; ar?: string }) ?? {};\r\n this.form.get(ch.translatableKey)?.patchValue({\r\n en: trans.en ?? '',\r\n ar: trans.ar ?? '',\r\n });\r\n }\r\n }\r\n }\r\n\r\n private buildUpdatePayload(\r\n template: NotificationTemplateItem,\r\n ): UpdateTemplatePayload {\r\n const title = this.form.controls['name'].value?.trim() || template.name;\r\n\r\n // The backend treats this PUT as a full replace: any channel template\r\n // omitted from the payload is nulled out. Always send email/sms/app\r\n // together — patchForm() populates every channel control from the loaded\r\n // template, so channels not edited this session keep their values.\r\n const payload: UpdateTemplatePayload = { title };\r\n const target = payload as unknown as Record<string, unknown>;\r\n\r\n for (const ch of CHANNEL_CONFIGS) {\r\n if (ch.templateKey) {\r\n target[ch.templateKey] = this.getTemplateControlValue(ch.templateKey);\r\n }\r\n if (ch.translatableKey) {\r\n target[ch.translatableKey] = this.getTranslatableControlValue(\r\n ch.translatableKey,\r\n );\r\n }\r\n }\r\n\r\n return payload;\r\n }\r\n\r\n private getTemplateControlValue(controlName: string): string {\r\n const control = this.form.get(controlName) as FormControl<string> | null;\r\n return control?.value ?? '';\r\n }\r\n\r\n private getTranslatableControlValue(controlName: string): {\r\n en: string;\r\n ar: string;\r\n } {\r\n const group = this.form.get(controlName) as FormGroup | null;\r\n const value = group?.getRawValue() as\r\n | { en?: string | null; ar?: string | null }\r\n | undefined;\r\n\r\n return {\r\n en: value?.en ?? '',\r\n ar: value?.ar ?? '',\r\n };\r\n }\r\n}\r\n\r\nexport default NotificationTemplate;\r\n","<div class=\"flex flex-col gap-4 p-4\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (isLoadingEvents()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <div class=\"w-1/2\">\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div class=\"flex items-center justify-between\">\r\n <div class=\"flex gap-2\">\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <p-skeleton width=\"8rem\" height=\"2.25rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"6rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"6rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else if (events().length === 0) {\r\n <!-- Empty State -->\r\n <mt-card>\r\n <div\r\n class=\"flex flex-col items-center justify-center py-12 text-slate-500\"\r\n >\r\n <mt-icon icon=\"alert.alert-circle\" class=\"mb-2 h-12 w-12\" />\r\n <p>{{ \"notification.noEventsFound\" | transloco }}</p>\r\n </div>\r\n </mt-card>\r\n } @else {\r\n <!-- Event Selector -->\r\n <div class=\"w-1/2\">\r\n <mt-select-field\r\n formControlName=\"event\"\r\n [options]=\"events()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'eventName'\"\r\n [label]=\"'notification.events' | transloco\"\r\n [placeholder]=\"'notification.selectEvent' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n (onChange)=\"onEventChange($event)\"\r\n />\r\n </div>\r\n\r\n @if (selectedEvent()) {\r\n <!-- Template Tabs + Add notification -->\r\n <div class=\"flex items-center justify-between gap-2\">\r\n <mt-tabs\r\n [active]=\"selectedTemplateId()\"\r\n [options]=\"templateTabs()\"\r\n (activeChange)=\"onTemplateTabChange($event)\"\r\n />\r\n <mt-button\r\n icon=\"general.plus\"\r\n [label]=\"'notification.addNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\r\n\r\n <!-- Template Content -->\r\n @if (selectedTemplate(); as template) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Name -->\r\n <div class=\"w-full\">\r\n <mt-text-field\r\n formControlName=\"name\"\r\n [label]=\"'notification.name' | transloco\"\r\n [placeholder]=\"'notification.enterName' | transloco\"\r\n [required]=\"true\"\r\n />\r\n </div>\r\n <!-- Channel & Properties Picker -->\r\n <div class=\"flex flex-col gap-4\">\r\n <mt-select-field\r\n formControlName=\"channel\"\r\n [options]=\"channelOptions()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [label]=\"'notification.channel.label' | transloco\"\r\n [placeholder]=\"'notification.selectChannel' | transloco\"\r\n [required]=\"true\"\r\n [filter]=\"false\"\r\n [disabled]=\"true\"\r\n />\r\n <mt-select-field\r\n [options]=\"propertyGroups()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'key'\"\r\n [group]=\"true\"\r\n [optionGroupLabel]=\"'groupName'\"\r\n [optionGroupChildren]=\"'properties'\"\r\n [label]=\"'notification.propertiesList' | transloco\"\r\n [placeholder]=\"'notification.selectProperty' | transloco\"\r\n [hasPlaceholderPrefix]=\"false\"\r\n [filter]=\"true\"\r\n [filterBy]=\"'name'\"\r\n [loading]=\"isLoadingProperties()\"\r\n [formControl]=\"propertyPickerControl\"\r\n (onChange)=\"onAddProperty($event)\"\r\n />\r\n </div>\r\n <!-- Channel Content Editors -->\r\n @for (ch of channelConfigs; track ch.key) {\r\n @if (form.controls[\"channel\"].value === ch.key) {\r\n <!-- Bilingual Content Fields -->\r\n @if (isBilingual(ch) && ch.translatableKey) {\r\n <ng-container [formGroupName]=\"ch.translatableKey\">\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n dir=\"ltr\"\r\n />\r\n <mt-editor-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n dir=\"rtl\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n formControlName=\"en\"\r\n [label]=\"'notification.english' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"ltr\"\r\n />\r\n <mt-textarea-field\r\n formControlName=\"ar\"\r\n [label]=\"'notification.arabic' | transloco\"\r\n [rows]=\"'6'\"\r\n dir=\"rtl\"\r\n />\r\n }\r\n </ng-container>\r\n } @else if (ch.templateKey) {\r\n <!-- Non-Bilingual Content Field -->\r\n @if (ch.useRichEditor) {\r\n <mt-editor-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n />\r\n } @else {\r\n <mt-textarea-field\r\n [formControlName]=\"ch.templateKey\"\r\n [label]=\"'notification.notificationBody' | transloco\"\r\n [rows]=\"'6'\"\r\n />\r\n }\r\n }\r\n <!-- Bilingual Toggle -->\r\n @if (ch.bilingualOptional) {\r\n <mt-toggle-field\r\n [formControlName]=\"ch.key + 'Bilingual'\"\r\n [label]=\"'notification.bilingual' | transloco\"\r\n />\r\n }\r\n }\r\n }\r\n <!-- Receivers -->\r\n <div class=\"w-full\">\r\n <mt-select-field\r\n [options]=\"availableReceiverGroups()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [group]=\"true\"\r\n [optionGroupLabel]=\"'groupName'\"\r\n [optionGroupChildren]=\"'items'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [filterBy]=\"'name'\"\r\n [loading]=\"isLoadingReceivers()\"\r\n [formControl]=\"receiverPickerControl\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"flex w-full flex-wrap gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center gap-2 rounded-full border border-surface bg-surface-50 py-1 pe-2 ps-3 text-sm transition-colors hover:bg-surface-100\"\r\n >\r\n <mt-icon\r\n icon=\"user.user-01\"\r\n class=\"h-4 w-4 shrink-0 text-slate-500\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name?.display }}</span>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\r\n size=\"small\"\r\n [text]=\"true\"\r\n [loading]=\"isReceiverDeleting(receiver.id)\"\r\n (onClick)=\"onDeleteReceiver(receiver)\"\r\n />\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n <!-- Actions -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n @if (!template.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n [label]=\"'notification.delete' | transloco\"\r\n severity=\"danger\"\r\n [loading]=\"isDeletingTemplate()\"\r\n [disabled]=\"isUpdatingTemplate()\"\r\n (onClick)=\"onDeleteTemplate()\"\r\n />\r\n }\r\n <mt-button\r\n icon=\"general.save-01\"\r\n [label]=\"'notification.save' | transloco\"\r\n [loading]=\"isUpdatingTemplate()\"\r\n [disabled]=\"isDeletingTemplate() || isFormInvalid()\"\r\n (onClick)=\"onSaveTemplate()\"\r\n />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- No template selected -->\r\n <div\r\n class=\"flex flex-col items-center justify-center py-12 text-slate-500\"\r\n >\r\n <mt-icon icon=\"alert.bell-01\" class=\"mb-2 h-12 w-12\" />\r\n <p>{{ \"notification.selectTemplatePrompt\" | transloco }}</p>\r\n </div>\r\n }\r\n }\r\n }\r\n</div>\r\n","import { NotificationState } from './notification/notification.state';\r\n\r\nexport const APP_STATES = [NotificationState];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"masterteam-notification.mjs","sources":["../../../../packages/masterteam/notification/src/store/notification/notification.model.ts","../../../../packages/masterteam/notification/src/store/notification/notification.actions.ts","../../../../packages/masterteam/notification/src/store/notification/notification.api.ts","../../../../packages/masterteam/notification/src/store/notification/notification.errors.ts","../../../../packages/masterteam/notification/src/store/notification/notification.utils.ts","../../../../packages/masterteam/notification/src/store/notification/notification.state.ts","../../../../packages/masterteam/notification/src/store/notification/notification.facade.ts","../../../../packages/masterteam/notification/src/lib/shared/notification-messages.ts","../../../../packages/masterteam/notification/src/lib/add-template-dialog/add-template-dialog.ts","../../../../packages/masterteam/notification/src/lib/add-template-dialog/add-template-dialog.html","../../../../packages/masterteam/notification/src/lib/shared/notification-content-preview.ts","../../../../packages/masterteam/notification/src/lib/shared/notification-content-preview.html","../../../../packages/masterteam/notification/src/lib/shared/notification-preview-runner.ts","../../../../packages/masterteam/notification/src/lib/template-history-drawer/template-history-drawer.ts","../../../../packages/masterteam/notification/src/lib/template-history-drawer/template-history-drawer.html","../../../../packages/masterteam/notification/src/lib/template-review-dialog/template-review-dialog.ts","../../../../packages/masterteam/notification/src/lib/template-review-dialog/template-review-dialog.html","../../../../packages/masterteam/notification/src/lib/notification-template/notification-template.ts","../../../../packages/masterteam/notification/src/lib/notification-template/notification-template.html","../../../../packages/masterteam/notification/src/store/app.state.ts","../../../../packages/masterteam/notification/src/masterteam-notification.ts"],"sourcesContent":["import type { LoadingStateShape } from '@masterteam/components';\n\n// ============================================================================\n// Action Keys\n// ============================================================================\nexport enum NotificationActionKey {\n GetEvents = 'getEvents',\n GetContext = 'getContext',\n GetDefaults = 'getDefaults',\n GetPublications = 'getPublications',\n CreateTemplate = 'createTemplate',\n SaveTemplate = 'saveTemplate',\n AddReceivers = 'addReceivers',\n DeleteReceiver = 'deleteReceiver',\n DeleteTemplate = 'deleteTemplate',\n PublishTemplate = 'publishTemplate',\n SetActivation = 'setActivation',\n RestorePublication = 'restorePublication',\n InitializeDefaults = 'initializeDefaults',\n RestoreDefault = 'restoreDefault',\n}\n\n/** Writes that must never run twice at once (the contract forbids double submits). */\nexport const NOTIFICATION_MUTATION_KEYS: readonly NotificationActionKey[] = [\n NotificationActionKey.CreateTemplate,\n NotificationActionKey.SaveTemplate,\n NotificationActionKey.AddReceivers,\n NotificationActionKey.DeleteReceiver,\n NotificationActionKey.DeleteTemplate,\n NotificationActionKey.PublishTemplate,\n NotificationActionKey.SetActivation,\n NotificationActionKey.RestorePublication,\n NotificationActionKey.InitializeDefaults,\n NotificationActionKey.RestoreDefault,\n];\n\n// ============================================================================\n// Backend contract (Pplus5.BE feature/notification-templates)\n// ============================================================================\nexport type NotificationChannel = 'App' | 'Email' | 'Sms';\nexport type NotificationReceiverType = 'Actor' | 'Role' | 'Group';\n\nexport const NOTIFICATION_CHANNELS: readonly NotificationChannel[] = [\n 'App',\n 'Email',\n 'Sms',\n];\n\nexport interface TranslatableContent {\n en: string;\n ar: string;\n}\n\nexport interface NotificationReceiver {\n /** Saved recipient row id — the id used to remove it. */\n id: number;\n /** Catalog actor / role / group id. */\n identifier: string | null;\n type: NotificationReceiverType;\n templateId: number;\n isSystem: boolean;\n name: { display: string | null; en: string | null; ar: string | null };\n}\n\nexport interface NotificationTemplateItem {\n id: number;\n eventId: number;\n channel: NotificationChannel;\n name: string | null;\n subject: string | null;\n emailTemplate: string | null;\n smsTemplate: string | null;\n appTemplate: TranslatableContent | null;\n conditionFormula: string | null;\n /** Aggregate concurrency token for every write on this template. */\n revision: number;\n draftRevision: number;\n publishedRevision: number | null;\n publishedHash: string | null;\n isEnabled: boolean;\n isSystem: boolean;\n receivers: NotificationReceiver[];\n auditState: string | null;\n auditCode: string | null;\n}\n\nexport interface NotificationEvent {\n id: number;\n name: string;\n eventName: string;\n moduleId: number;\n}\n\nexport interface NotificationEventWithTemplates extends NotificationEvent {\n templates: NotificationTemplateItem[];\n}\n\nexport interface NotificationProperty {\n key: string;\n name: string;\n nameEn: string;\n nameAr: string;\n}\n\nexport interface NotificationPropertyGroup {\n groupName: string;\n properties: NotificationProperty[];\n}\n\n/** A recipient catalog node: a subgroup when `items` is an array, otherwise a leaf. */\nexport interface NotificationRecipientNode {\n subGroupName?: string | null;\n items?: NotificationRecipientNode[] | null;\n id?: string | null;\n name?: string | null;\n nameEn?: string | null;\n nameAr?: string | null;\n type?: NotificationReceiverType | null;\n}\n\nexport interface NotificationRecipientGroup {\n groupName: string;\n items: NotificationRecipientNode[];\n}\n\nexport interface NotificationAuthoringContext {\n eventId: number;\n channels: NotificationChannel[];\n properties: NotificationPropertyGroup[];\n conditionProperties: NotificationProperty[];\n recipients: NotificationRecipientGroup[];\n publicationHistoryLimit: number;\n}\n\nexport interface NotificationPublishedRecipient {\n identifier: string;\n name: string;\n type: NotificationReceiverType;\n isSystem: boolean;\n}\n\nexport interface NotificationPublishedContent {\n formatVersion: number;\n channel: NotificationChannel;\n sourceDraftRevision: number;\n name: string;\n subject: string | null;\n emailContent: string | null;\n smsContent: string | null;\n /** Serialized `{ en, ar }` JSON — parse it, never render it as HTML. */\n appContent: string | null;\n conditionFormula: string | null;\n receivers: NotificationPublishedRecipient[];\n}\n\nexport interface NotificationPublication {\n revision: number;\n sourceDraftRevision: number;\n hash: string;\n publishedAtUtc: string;\n publishedBy: string;\n content: NotificationPublishedContent;\n}\n\nexport type NotificationRecipeCoverage =\n | 'Ready'\n | 'SafeGeneric'\n | 'NeedsReview';\n\nexport interface NotificationDefaultSlot {\n eventId: number;\n channel: NotificationChannel;\n /** Null means the default was intentionally removed — never recreate it silently. */\n templateId: number | null;\n recipeKey: string;\n recipeVersion: number;\n recipeHash: string;\n revision: number;\n}\n\nexport interface NotificationDefaultRecipe {\n key: string;\n version: number;\n channel: NotificationChannel;\n coverage: NotificationRecipeCoverage;\n languageReviewRequired: boolean;\n recipientReviewRequired: boolean;\n autoPublishApp: boolean;\n recipeHash: string;\n /** Unsaved proposal in template shape (`id: 0`). */\n draft: NotificationTemplateItem;\n}\n\nexport interface NotificationDefaults {\n eventId: number;\n slots: NotificationDefaultSlot[];\n adoptions: Partial<Record<NotificationChannel, number>>;\n recipes: NotificationDefaultRecipe[];\n}\n\nexport interface NotificationInitializeDefaultsResult {\n defaults: NotificationDefaults;\n createdTemplates: NotificationTemplateItem[];\n auditProjectionFailures: number[];\n}\n\nexport interface NotificationDiagnostic {\n code: string;\n severity: string;\n path: string;\n}\n\n// ============================================================================\n// Preview\n// ============================================================================\nexport interface NotificationPreviewRequest {\n channel: NotificationChannel;\n subject?: string | null;\n emailTemplate?: string | null;\n smsTemplate?: string | null;\n appTemplate?: TranslatableContent | null;\n samples?: Record<string, string>;\n}\n\nexport interface NotificationFragmentPreview {\n html: string;\n text: string;\n bodyHash: string;\n layoutHash: string;\n diagnostics: NotificationDiagnostic[];\n}\n\nexport interface NotificationEmailPreview {\n channel: 'Email';\n subject: string | null;\n html: string;\n text: string;\n sanitizedBody: string;\n layoutRevision: number;\n layoutSource: string;\n layoutHash: string;\n contentHash: string;\n diagnostics: NotificationDiagnostic[];\n approvedImageOrigins: string[];\n fidelity: 'browser';\n}\n\nexport interface NotificationAppPreview {\n channel: 'App';\n english: NotificationFragmentPreview;\n arabic: NotificationFragmentPreview;\n sanitizedBody: TranslatableContent;\n approvedImageOrigins: string[];\n fidelity: 'browser';\n}\n\nexport interface NotificationSmsPreview {\n channel: 'Sms';\n text: string;\n sanitizedBody: string;\n diagnostics: NotificationDiagnostic[];\n fidelity: 'text';\n}\n\nexport type NotificationPreview =\n | NotificationEmailPreview\n | NotificationAppPreview\n | NotificationSmsPreview;\n\n// ============================================================================\n// Request payloads\n// ============================================================================\nexport interface NotificationReceiverRef {\n type: NotificationReceiverType;\n id: string;\n}\n\nexport interface CreateNotificationTemplatePayload {\n channel: NotificationChannel;\n name: string;\n subject: string | null;\n emailTemplate: string | null;\n smsTemplate: string | null;\n appTemplate: TranslatableContent | null;\n conditionFormula: string | null;\n receivers: NotificationReceiverRef[];\n}\n\n/** Replacement, not a patch: a null field clears its value. */\nexport interface SaveNotificationTemplatePayload {\n expectedRevision: number;\n name: string;\n subject: string | null;\n emailTemplate: string | null;\n smsTemplate: string | null;\n appTemplate: TranslatableContent | null;\n conditionFormula: string | null;\n}\n\nexport interface NotificationReviewFlags {\n recipientsReviewed: boolean;\n languageReviewed: boolean;\n}\n\nexport interface RestoreNotificationDefaultPayload {\n channel: NotificationChannel;\n expectedSlotRevision: number;\n recipeHash: string;\n}\n\n// ============================================================================\n// State\n// ============================================================================\nexport interface NotificationStateModel extends LoadingStateShape<NotificationActionKey> {\n // Scope\n moduleType: string | null;\n moduleId: string | number | null;\n parentModuleType: string | null;\n parentModuleId: string | number | null;\n parentPath: string;\n\n // Data\n events: NotificationEvent[];\n templates: NotificationTemplateItem[];\n context: NotificationAuthoringContext | null;\n defaults: NotificationDefaults | null;\n publications: NotificationPublication[];\n publicationsTemplateId: number | null;\n\n // Selection\n selectedEventId: number | null;\n selectedTemplateId: number | null;\n}\n","import type {\n CreateNotificationTemplatePayload,\n NotificationReceiverRef,\n NotificationReviewFlags,\n RestoreNotificationDefaultPayload,\n SaveNotificationTemplatePayload,\n} from './notification.model';\n\n// ============================================================================\n// Scope\n// ============================================================================\nexport class SetModuleInfo {\n static readonly type = '[Notification] Set Module Info';\n constructor(\n public moduleType: string,\n public moduleId: string | number,\n public parentModuleType?: string,\n public parentModuleId?: string | number,\n public parentPath?: string,\n ) {}\n}\n\nexport class ResetNotificationState {\n static readonly type = '[Notification] Reset State';\n}\n\n// ============================================================================\n// Loading\n// ============================================================================\n/** Loads (or re-reads) the scope's events, keeping the current selection when it still exists. */\nexport class GetEvents {\n static readonly type = '[Notification] Get Events';\n}\n\nexport class GetAuthoringContext {\n static readonly type = '[Notification] Get Authoring Context';\n constructor(public eventId: number) {}\n}\n\nexport class GetDefaultRecipes {\n static readonly type = '[Notification] Get Default Recipes';\n constructor(public eventId: number) {}\n}\n\nexport class GetPublications {\n static readonly type = '[Notification] Get Publications';\n constructor(public templateId: number) {}\n}\n\n// ============================================================================\n// Selection\n// ============================================================================\nexport class SelectEvent {\n static readonly type = '[Notification] Select Event';\n constructor(public eventId: number) {}\n}\n\nexport class SelectTemplate {\n static readonly type = '[Notification] Select Template';\n constructor(public templateId: number) {}\n}\n\n// ============================================================================\n// Template writes\n// ============================================================================\nexport class CreateTemplate {\n static readonly type = '[Notification] Create Template';\n constructor(\n public eventId: number,\n public payload: CreateNotificationTemplatePayload,\n ) {}\n}\n\nexport class SaveTemplate {\n static readonly type = '[Notification] Save Template';\n constructor(\n public templateId: number,\n public payload: SaveNotificationTemplatePayload,\n ) {}\n}\n\nexport class DeleteTemplate {\n static readonly type = '[Notification] Delete Template';\n constructor(\n public templateId: number,\n public expectedRevision: number,\n ) {}\n}\n\nexport class AddReceivers {\n static readonly type = '[Notification] Add Receivers';\n constructor(\n public templateId: number,\n public expectedRevision: number,\n public receivers: NotificationReceiverRef[],\n ) {}\n}\n\nexport class DeleteReceiver {\n static readonly type = '[Notification] Delete Receiver';\n constructor(\n public receiverId: number,\n public expectedRevision: number,\n ) {}\n}\n\n// ============================================================================\n// Lifecycle\n// ============================================================================\nexport class PublishTemplate {\n static readonly type = '[Notification] Publish Template';\n constructor(\n public templateId: number,\n public expectedRevision: number,\n public reviews: NotificationReviewFlags,\n ) {}\n}\n\nexport class SetTemplateActivation {\n static readonly type = '[Notification] Set Template Activation';\n constructor(\n public templateId: number,\n public expectedRevision: number,\n public enabled: boolean,\n public reviews: NotificationReviewFlags | null,\n ) {}\n}\n\nexport class RestorePublication {\n static readonly type = '[Notification] Restore Publication';\n constructor(\n public templateId: number,\n public expectedRevision: number,\n public publicationRevision: number,\n public reviews: NotificationReviewFlags,\n ) {}\n}\n\n// ============================================================================\n// Defaults\n// ============================================================================\nexport class InitializeDefaults {\n static readonly type = '[Notification] Initialize Defaults';\n constructor(public eventId: number) {}\n}\n\nexport class RestoreDefault {\n static readonly type = '[Notification] Restore Default';\n constructor(\n public eventId: number,\n public payload: RestoreNotificationDefaultPayload,\n ) {}\n}\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { map, type Observable } from 'rxjs';\nimport type { Response } from '@masterteam/components';\n\nimport type {\n CreateNotificationTemplatePayload,\n NotificationAuthoringContext,\n NotificationDefaults,\n NotificationEventWithTemplates,\n NotificationInitializeDefaultsResult,\n NotificationPreview,\n NotificationPreviewRequest,\n NotificationPublication,\n NotificationReceiverRef,\n NotificationReviewFlags,\n NotificationTemplateItem,\n RestoreNotificationDefaultPayload,\n SaveNotificationTemplatePayload,\n} from './notification.model';\n\n/**\n * Notification authoring endpoints. Every call is marked `noMessage`: the\n * backend answers failures with a bare stable code (`NOTIFICATION_*`) as the\n * message, so the host's message interceptor would toast that raw code. The\n * editor translates the code itself (see `notification.errors.ts`).\n */\n@Injectable({ providedIn: 'root' })\nexport class NotificationTemplateApi {\n private readonly http = inject(HttpClient);\n private readonly baseUrl = 'notifications';\n private readonly headers = new HttpHeaders({ noMessage: 'true' });\n\n getEvents(scopePath: string): Observable<NotificationEventWithTemplates[]> {\n return this.get(`${scopePath}/events`);\n }\n\n getContext(eventId: number): Observable<NotificationAuthoringContext> {\n return this.get(`/events/${eventId}/authoring-context`);\n }\n\n getDefaults(eventId: number): Observable<NotificationDefaults> {\n return this.get(`/events/${eventId}/default-recipes`);\n }\n\n initializeDefaults(\n eventId: number,\n ): Observable<NotificationInitializeDefaultsResult> {\n return this.post(`/events/${eventId}/defaults`, null);\n }\n\n restoreDefault(\n eventId: number,\n payload: RestoreNotificationDefaultPayload,\n ): Observable<NotificationTemplateItem> {\n return this.post(`/events/${eventId}/defaults/restore`, payload);\n }\n\n preview(\n eventId: number,\n request: NotificationPreviewRequest,\n ): Observable<NotificationPreview> {\n return this.post(`/events/${eventId}/preview`, request);\n }\n\n createTemplate(\n eventId: number,\n payload: CreateNotificationTemplatePayload,\n ): Observable<NotificationTemplateItem> {\n return this.post(`/events/${eventId}`, payload);\n }\n\n saveTemplate(\n templateId: number,\n payload: SaveNotificationTemplatePayload,\n ): Observable<NotificationTemplateItem> {\n return this.http\n .put<\n Response<NotificationTemplateItem>\n >(this.url(`/templates/${templateId}`), payload, { headers: this.headers })\n .pipe(map((response) => response.data));\n }\n\n addReceivers(\n templateId: number,\n expectedRevision: number,\n receivers: NotificationReceiverRef[],\n ): Observable<NotificationTemplateItem> {\n return this.post(`/templates/${templateId}`, {\n expectedRevision,\n receivers,\n });\n }\n\n deleteReceiver(\n receiverId: number,\n expectedRevision: number,\n ): Observable<NotificationTemplateItem> {\n return this.delete(`/receivers/${receiverId}`, expectedRevision);\n }\n\n deleteTemplate(\n templateId: number,\n expectedRevision: number,\n ): Observable<unknown> {\n return this.delete(`/templates/${templateId}`, expectedRevision);\n }\n\n getPublications(templateId: number): Observable<NotificationPublication[]> {\n return this.get(`/templates/${templateId}/publications`);\n }\n\n publish(\n templateId: number,\n expectedRevision: number,\n reviews: NotificationReviewFlags,\n ): Observable<NotificationTemplateItem> {\n return this.post(`/templates/${templateId}/publish`, {\n expectedRevision,\n ...reviews,\n });\n }\n\n setActivation(\n templateId: number,\n expectedRevision: number,\n enabled: boolean,\n reviews: NotificationReviewFlags | null,\n ): Observable<NotificationTemplateItem> {\n // Turning off needs no review; the flags are only sent when turning on.\n const body = enabled\n ? { expectedRevision, enabled, ...reviews }\n : { expectedRevision, enabled };\n return this.http\n .put<\n Response<NotificationTemplateItem>\n >(this.url(`/templates/${templateId}/activation`), body, { headers: this.headers })\n .pipe(map((response) => response.data));\n }\n\n restorePublication(\n templateId: number,\n expectedRevision: number,\n publicationRevision: number,\n reviews: NotificationReviewFlags,\n ): Observable<NotificationTemplateItem> {\n return this.post(`/templates/${templateId}/restore`, {\n expectedRevision,\n publicationRevision,\n ...reviews,\n });\n }\n\n private get<T>(path: string): Observable<T> {\n return this.http\n .get<Response<T>>(this.url(path), { headers: this.headers })\n .pipe(map((response) => response.data));\n }\n\n private post<T>(path: string, body: unknown): Observable<T> {\n return this.http\n .post<Response<T>>(this.url(path), body, { headers: this.headers })\n .pipe(map((response) => response.data));\n }\n\n private delete<T>(path: string, expectedRevision: number): Observable<T> {\n return this.http\n .delete<Response<T>>(this.url(path), {\n headers: this.headers,\n params: { expectedRevision },\n })\n .pipe(map((response) => response.data));\n }\n\n private url(path: string): string {\n return `${this.baseUrl}${path}`;\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\n\nimport type { NotificationDiagnostic } from './notification.model';\n\nexport interface NotificationFailure {\n /** Stable domain code (`NOTIFICATION_*` / `EMAIL_*`), or null for transport failures. */\n code: string | null;\n status: number | null;\n diagnostics: NotificationDiagnostic[];\n}\n\n/**\n * Reads the stable code out of a failed notification request.\n *\n * Domain failures arrive as `errors: { code, message, details }`. Command\n * endpoints can wrap the domain code in `errors.details.code` under an outer\n * validation code (e.g. `VAL_002`), so the nested code wins when present.\n * Display text is never matched — only codes.\n */\nexport function readNotificationFailure(error: unknown): NotificationFailure {\n const status = error instanceof HttpErrorResponse ? error.status : null;\n const body = error instanceof HttpErrorResponse ? error.error : error;\n const errors = (body as { errors?: unknown } | null)?.errors as\n | { code?: unknown; details?: unknown }\n | null\n | undefined;\n\n const details = errors?.details;\n const nestedCode =\n details && typeof details === 'object' && !Array.isArray(details)\n ? (details as { code?: unknown }).code\n : undefined;\n const code =\n typeof nestedCode === 'string'\n ? nestedCode\n : typeof errors?.code === 'string'\n ? errors.code\n : null;\n\n return {\n code,\n status,\n diagnostics: Array.isArray(details) ? toDiagnostics(details) : [],\n };\n}\n\nexport function isRevisionConflict(failure: NotificationFailure): boolean {\n return (\n failure.status === 409 ||\n failure.code === 'NOTIFICATION_REVISION_CONFLICT' ||\n failure.code === 'EMAIL_REVISION_CONFLICT'\n );\n}\n\nfunction toDiagnostics(values: unknown[]): NotificationDiagnostic[] {\n return values.filter(\n (value): value is NotificationDiagnostic =>\n typeof value === 'object' &&\n value !== null &&\n typeof (value as NotificationDiagnostic).code === 'string',\n );\n}\n","import type {\n NotificationChannel,\n NotificationDefaults,\n NotificationPreviewRequest,\n NotificationPropertyGroup,\n NotificationPublication,\n NotificationPublishedContent,\n NotificationReceiverType,\n NotificationRecipientGroup,\n NotificationRecipientNode,\n NotificationTemplateItem,\n TranslatableContent,\n} from './notification.model';\n\nexport interface NotificationRecipientOption {\n /** `${type}:${id}` — selections are keyed by type and id, never id alone. */\n key: string;\n id: string;\n type: NotificationReceiverType;\n name: string;\n}\n\nexport interface NotificationRecipientOptionGroup {\n groupName: string;\n items: NotificationRecipientOption[];\n}\n\nexport type NotificationTemplateStatus = 'on' | 'off' | 'draft';\n\nexport function recipientKey(\n type: NotificationReceiverType | null | undefined,\n id: string | null | undefined,\n): string {\n return `${type ?? ''}:${id ?? ''}`;\n}\n\n/**\n * Flattens the recipient catalog into select-ready groups. A node is a\n * subgroup only when its `items` is an array — leaves carry `items: null` —\n * and subgroup names are kept as a prefix so two \"Manager\" roles from\n * different levels stay distinguishable.\n */\nexport function flattenRecipientCatalog(\n groups: NotificationRecipientGroup[],\n lang: string,\n): NotificationRecipientOptionGroup[] {\n return groups\n .map((group) => ({\n groupName: group.groupName,\n items: flattenNodes(group.items, lang),\n }))\n .filter((group) => group.items.length > 0);\n}\n\nfunction flattenNodes(\n nodes: NotificationRecipientNode[] | null | undefined,\n lang: string,\n prefix?: string,\n): NotificationRecipientOption[] {\n return (nodes ?? []).flatMap((node) => {\n if (Array.isArray(node.items)) {\n const label = node.subGroupName\n ? prefix\n ? `${prefix} - ${node.subGroupName}`\n : node.subGroupName\n : prefix;\n return flattenNodes(node.items, lang, label);\n }\n if (!node.id || !node.type) return [];\n const name =\n (lang === 'ar' ? node.nameAr : node.nameEn) || node.name || node.id;\n return [\n {\n key: recipientKey(node.type, node.id),\n id: node.id,\n type: node.type,\n name: prefix ? `${prefix} - ${name}` : name,\n },\n ];\n });\n}\n\nexport function templateStatus(\n template: NotificationTemplateItem,\n): NotificationTemplateStatus {\n if (template.publishedRevision == null) return 'draft';\n return template.isEnabled ? 'on' : 'off';\n}\n\n/** The retained publication that is live right now, if it is in the loaded history. */\nexport function currentPublication(\n template: NotificationTemplateItem,\n publications: NotificationPublication[],\n): NotificationPublication | null {\n if (template.publishedRevision == null) return null;\n return (\n publications.find(\n (publication) => publication.revision === template.publishedRevision,\n ) ?? null\n );\n}\n\n/**\n * Whether the saved draft differs from what is published. Comparing\n * `draftRevision` to `publishedRevision` is wrong (they count different\n * things); the contract compares the draft against the `sourceDraftRevision`\n * of the current publication. Null when that cannot be known yet.\n */\nexport function hasUnpublishedChanges(\n template: NotificationTemplateItem,\n publications: NotificationPublication[],\n): boolean | null {\n if (template.publishedRevision == null) return null;\n const publication = currentPublication(template, publications);\n if (!publication) return null;\n return template.draftRevision !== publication.sourceDraftRevision;\n}\n\n/** The default slot that owns this template, if any (owned defaults need a language review). */\nexport function isDefaultOwned(\n template: NotificationTemplateItem,\n defaults: NotificationDefaults | null,\n): boolean {\n return (defaults?.slots ?? []).some(\n (slot) => slot.templateId === template.id,\n );\n}\n\n/** Channels with a recipe but no slot at all — the only ones \"Add defaults\" may create. */\nexport function missingDefaultChannels(\n defaults: NotificationDefaults | null,\n): NotificationChannel[] {\n if (!defaults) return [];\n const slotted = new Set(defaults.slots.map((slot) => slot.channel));\n return defaults.recipes\n .map((recipe) => recipe.channel)\n .filter((channel) => !slotted.has(channel));\n}\n\nexport function parseAppContent(\n value: string | null | undefined,\n): TranslatableContent {\n if (!value) return { en: '', ar: '' };\n try {\n const parsed = JSON.parse(value) as Partial<TranslatableContent> | null;\n return {\n en: typeof parsed?.en === 'string' ? parsed.en : '',\n ar: typeof parsed?.ar === 'string' ? parsed.ar : '',\n };\n } catch {\n return { en: '', ar: '' };\n }\n}\n\n/** Maps retained publication content onto the event preview request. */\nexport function publicationPreviewRequest(\n content: NotificationPublishedContent,\n): NotificationPreviewRequest {\n return contentPreviewRequest({\n channel: content.channel,\n subject: content.subject,\n emailTemplate: content.emailContent,\n smsTemplate: content.smsContent,\n appTemplate: parseAppContent(content.appContent),\n });\n}\n\nexport function templatePreviewRequest(\n template: Pick<\n NotificationTemplateItem,\n 'channel' | 'subject' | 'emailTemplate' | 'smsTemplate' | 'appTemplate'\n >,\n): NotificationPreviewRequest {\n return contentPreviewRequest(template);\n}\n\nfunction contentPreviewRequest(content: {\n channel: NotificationChannel;\n subject: string | null;\n emailTemplate: string | null;\n smsTemplate: string | null;\n appTemplate: TranslatableContent | null;\n}): NotificationPreviewRequest {\n switch (content.channel) {\n case 'Email':\n return {\n channel: 'Email',\n subject: content.subject ?? '',\n emailTemplate: content.emailTemplate ?? '',\n };\n case 'Sms':\n return { channel: 'Sms', smsTemplate: content.smsTemplate ?? '' };\n case 'App':\n return {\n channel: 'App',\n appTemplate: {\n en: content.appTemplate?.en ?? '',\n ar: content.appTemplate?.ar ?? '',\n },\n };\n }\n}\n\nconst PREVIEW_TOKEN = /\\{\\{\\s*([A-Za-z0-9_.]+)\\s*\\}\\}/g;\nconst MAX_PREVIEW_SAMPLES = 100;\n/** Sample for the record link: resolved by the server against its client base URL. */\nconst SAMPLE_WEB_URL = '/';\n\n/**\n * Readable sample values for a preview: every field the content uses shows as\n * its own name in brackets (`[Item name]`) instead of the server's \"-\", and the\n * record link resolves. Only keys in the event's catalog are sent — the server\n * rejects any other sample key — and never more than the server's limit.\n */\nexport function previewSamples(\n request: NotificationPreviewRequest,\n properties: readonly NotificationPropertyGroup[],\n lang: string,\n): Record<string, string> {\n const catalog = new Map(\n properties\n .flatMap((group) => group.properties)\n .map((property) => [property.key.toLowerCase(), property]),\n );\n const text = [\n request.emailTemplate,\n request.smsTemplate,\n request.appTemplate?.en,\n request.appTemplate?.ar,\n ]\n .filter((value): value is string => !!value)\n .join(' ');\n\n const samples: Record<string, string> = {};\n for (const match of text.matchAll(PREVIEW_TOKEN)) {\n if (Object.keys(samples).length >= MAX_PREVIEW_SAMPLES) break;\n const property = catalog.get(match[1].toLowerCase());\n if (!property || property.key in samples) continue;\n if (property.key.toLowerCase() === 'weburl') {\n samples[property.key] = SAMPLE_WEB_URL;\n continue;\n }\n if (property.key.toLowerCase() === 'mobileuri') continue;\n const label =\n (lang === 'ar' ? property.nameAr : property.nameEn) || property.name;\n samples[property.key] = `[${label}]`;\n }\n return samples;\n}\n\nexport function withPreviewSamples(\n request: NotificationPreviewRequest,\n properties: readonly NotificationPropertyGroup[],\n lang: string,\n): NotificationPreviewRequest {\n const samples = previewSamples(request, properties, lang);\n return Object.keys(samples).length > 0 ? { ...request, samples } : request;\n}\n\n/** The system principal that publishes generated App defaults. */\nexport const DEFAULTS_PUBLISHER = 'system:notification-defaults';\n","import { Injectable, inject } from '@angular/core';\nimport { Action, Selector, State, StateContext } from '@ngxs/store';\nimport { handleApiRequest } from '@masterteam/components';\nimport { tap } from 'rxjs';\n\nimport {\n NotificationActionKey,\n type NotificationAuthoringContext,\n type NotificationDefaults,\n type NotificationEvent,\n type NotificationEventWithTemplates,\n type NotificationPublication,\n type NotificationStateModel,\n type NotificationTemplateItem,\n} from './notification.model';\nimport {\n AddReceivers,\n CreateTemplate,\n DeleteReceiver,\n DeleteTemplate,\n GetAuthoringContext,\n GetDefaultRecipes,\n GetEvents,\n GetPublications,\n InitializeDefaults,\n PublishTemplate,\n ResetNotificationState,\n RestoreDefault,\n RestorePublication,\n SaveTemplate,\n SelectEvent,\n SelectTemplate,\n SetModuleInfo,\n SetTemplateActivation,\n} from './notification.actions';\nimport { NotificationTemplateApi } from './notification.api';\n\nconst DEFAULT_STATE: NotificationStateModel = {\n moduleType: null,\n moduleId: null,\n parentModuleType: null,\n parentModuleId: null,\n parentPath: '',\n\n events: [],\n templates: [],\n context: null,\n defaults: null,\n publications: [],\n publicationsTemplateId: null,\n\n selectedEventId: null,\n selectedTemplateId: null,\n\n loadingActive: [],\n errors: {},\n};\n\n@State<NotificationStateModel>({\n name: 'notification',\n defaults: DEFAULT_STATE,\n})\n@Injectable()\nexport class NotificationState {\n private readonly api = inject(NotificationTemplateApi);\n\n // ==========================================================================\n // Slice selectors\n // ==========================================================================\n @Selector()\n static getEvents(state: NotificationStateModel): NotificationEvent[] {\n return state.events;\n }\n\n @Selector()\n static getTemplates(\n state: NotificationStateModel,\n ): NotificationTemplateItem[] {\n return state.templates;\n }\n\n @Selector()\n static getSelectedEventId(state: NotificationStateModel): number | null {\n return state.selectedEventId;\n }\n\n @Selector()\n static getSelectedTemplateId(state: NotificationStateModel): number | null {\n return state.selectedTemplateId;\n }\n\n @Selector()\n static getContext(\n state: NotificationStateModel,\n ): NotificationAuthoringContext | null {\n return state.context;\n }\n\n @Selector()\n static getDefaults(\n state: NotificationStateModel,\n ): NotificationDefaults | null {\n return state.defaults;\n }\n\n @Selector()\n static getPublicationsSlice(state: NotificationStateModel): {\n templateId: number | null;\n items: NotificationPublication[];\n } {\n return {\n templateId: state.publicationsTemplateId,\n items: state.publications,\n };\n }\n\n @Selector()\n static getLoadingActive(state: NotificationStateModel): string[] {\n return state.loadingActive;\n }\n\n @Selector()\n static getErrors(\n state: NotificationStateModel,\n ): Record<string, string | null> {\n return state.errors;\n }\n\n // ==========================================================================\n // Derived selectors\n // ==========================================================================\n @Selector([NotificationState.getEvents, NotificationState.getSelectedEventId])\n static getSelectedEvent(\n events: NotificationEvent[],\n selectedEventId: number | null,\n ): NotificationEvent | null {\n return events.find((event) => event.id === selectedEventId) ?? null;\n }\n\n @Selector([\n NotificationState.getTemplates,\n NotificationState.getSelectedEventId,\n ])\n static getEventTemplates(\n templates: NotificationTemplateItem[],\n selectedEventId: number | null,\n ): NotificationTemplateItem[] {\n if (selectedEventId == null) return [];\n return templates.filter((template) => template.eventId === selectedEventId);\n }\n\n @Selector([\n NotificationState.getTemplates,\n NotificationState.getSelectedTemplateId,\n ])\n static getSelectedTemplate(\n templates: NotificationTemplateItem[],\n selectedTemplateId: number | null,\n ): NotificationTemplateItem | null {\n return (\n templates.find((template) => template.id === selectedTemplateId) ?? null\n );\n }\n\n @Selector([\n NotificationState.getPublicationsSlice,\n NotificationState.getSelectedTemplateId,\n ])\n static getPublications(\n slice: { templateId: number | null; items: NotificationPublication[] },\n selectedTemplateId: number | null,\n ): NotificationPublication[] {\n return slice.templateId === selectedTemplateId ? slice.items : [];\n }\n\n // ==========================================================================\n // Scope\n // ==========================================================================\n @Action(SetModuleInfo)\n setModuleInfo(\n ctx: StateContext<NotificationStateModel>,\n action: SetModuleInfo,\n ) {\n let parentPath = '';\n if (action.parentModuleType && action.parentModuleId) {\n parentPath = `/${action.parentModuleType}/${action.parentModuleId}`;\n } else if (action.parentPath) {\n parentPath = action.parentPath;\n }\n\n ctx.patchState({\n moduleType: action.moduleType,\n moduleId: action.moduleId,\n parentModuleType: action.parentModuleType ?? null,\n parentModuleId: action.parentModuleId ?? null,\n parentPath,\n });\n }\n\n @Action(ResetNotificationState)\n resetState(ctx: StateContext<NotificationStateModel>) {\n ctx.setState(DEFAULT_STATE);\n }\n\n // ==========================================================================\n // Loading\n // ==========================================================================\n @Action(GetEvents, { cancelUncompleted: true })\n getEvents(ctx: StateContext<NotificationStateModel>) {\n const scope = scopePathOf(ctx.getState());\n if (!scope) return;\n const previousEventId = ctx.getState().selectedEventId;\n\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.GetEvents,\n request$: this.api.getEvents(scope),\n onSuccess: (data, state) => {\n // A late answer for a scope the host already left must not land.\n if (scopePathOf(state) !== scope) return;\n const { events, templates } = flattenEvents(data ?? []);\n const selectedEventId = events.some(\n (event) => event.id === state.selectedEventId,\n )\n ? state.selectedEventId\n : (events[0]?.id ?? null);\n const eventTemplates = templates.filter(\n (template) => template.eventId === selectedEventId,\n );\n const selectedTemplateId = eventTemplates.some(\n (template) => template.id === state.selectedTemplateId,\n )\n ? state.selectedTemplateId\n : (eventTemplates[0]?.id ?? null);\n\n return { events, templates, selectedEventId, selectedTemplateId };\n },\n }).pipe(\n tap(() => {\n const state = ctx.getState();\n if (scopePathOf(state) !== scope) return;\n const eventId = state.selectedEventId;\n if (\n eventId != null &&\n (eventId !== previousEventId || state.context?.eventId !== eventId)\n ) {\n ctx.patchState({ context: null, defaults: null });\n ctx.dispatch([\n new GetAuthoringContext(eventId),\n new GetDefaultRecipes(eventId),\n ]);\n }\n if (state.selectedTemplateId != null) {\n ctx.dispatch(new GetPublications(state.selectedTemplateId));\n }\n }),\n );\n }\n\n @Action(GetAuthoringContext, { cancelUncompleted: true })\n getAuthoringContext(\n ctx: StateContext<NotificationStateModel>,\n action: GetAuthoringContext,\n ) {\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.GetContext,\n request$: this.api.getContext(action.eventId),\n onSuccess: (context, state) =>\n state.selectedEventId === action.eventId ? { context } : undefined,\n });\n }\n\n @Action(GetDefaultRecipes, { cancelUncompleted: true })\n getDefaultRecipes(\n ctx: StateContext<NotificationStateModel>,\n action: GetDefaultRecipes,\n ) {\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.GetDefaults,\n request$: this.api.getDefaults(action.eventId),\n onSuccess: (defaults, state) =>\n state.selectedEventId === action.eventId ? { defaults } : undefined,\n });\n }\n\n @Action(GetPublications, { cancelUncompleted: true })\n getPublications(\n ctx: StateContext<NotificationStateModel>,\n action: GetPublications,\n ) {\n const template = ctx\n .getState()\n .templates.find((item) => item.id === action.templateId);\n // A template that was never published has no history to read.\n if (template?.publishedRevision == null) {\n ctx.patchState({\n publications: [],\n publicationsTemplateId: action.templateId,\n });\n return;\n }\n\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.GetPublications,\n request$: this.api.getPublications(action.templateId),\n onSuccess: (publications, state) =>\n state.selectedTemplateId === action.templateId\n ? { publications, publicationsTemplateId: action.templateId }\n : undefined,\n });\n }\n\n // ==========================================================================\n // Selection\n // ==========================================================================\n @Action(SelectEvent)\n selectEvent(ctx: StateContext<NotificationStateModel>, action: SelectEvent) {\n const state = ctx.getState();\n if (state.selectedEventId === action.eventId) return;\n const firstTemplate = state.templates.find(\n (template) => template.eventId === action.eventId,\n );\n ctx.patchState({\n selectedEventId: action.eventId,\n selectedTemplateId: firstTemplate?.id ?? null,\n context: null,\n defaults: null,\n publications: [],\n publicationsTemplateId: null,\n });\n const loads: object[] = [\n new GetAuthoringContext(action.eventId),\n new GetDefaultRecipes(action.eventId),\n ];\n if (firstTemplate) loads.push(new GetPublications(firstTemplate.id));\n return ctx.dispatch(loads);\n }\n\n @Action(SelectTemplate)\n selectTemplate(\n ctx: StateContext<NotificationStateModel>,\n action: SelectTemplate,\n ) {\n if (ctx.getState().selectedTemplateId === action.templateId) return;\n ctx.patchState({\n selectedTemplateId: action.templateId,\n publications: [],\n publicationsTemplateId: null,\n });\n return ctx.dispatch(new GetPublications(action.templateId));\n }\n\n // ==========================================================================\n // Template writes — every one returns the whole template DTO, which becomes\n // the new server baseline (its `revision` is the next expectedRevision).\n // ==========================================================================\n @Action(CreateTemplate)\n createTemplate(\n ctx: StateContext<NotificationStateModel>,\n action: CreateTemplate,\n ) {\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.CreateTemplate,\n request$: this.api.createTemplate(action.eventId, action.payload),\n onSuccess: (template, state) => ({\n templates: upsertTemplate(state.templates, template),\n ...(state.selectedEventId === action.eventId\n ? {\n selectedTemplateId: template.id,\n publications: [],\n publicationsTemplateId: template.id,\n }\n : {}),\n }),\n });\n }\n\n @Action(SaveTemplate)\n saveTemplate(\n ctx: StateContext<NotificationStateModel>,\n action: SaveTemplate,\n ) {\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.SaveTemplate,\n request$: this.api.saveTemplate(action.templateId, action.payload),\n onSuccess: (template, state) => ({\n templates: upsertTemplate(state.templates, template),\n }),\n });\n }\n\n @Action(AddReceivers)\n addReceivers(\n ctx: StateContext<NotificationStateModel>,\n action: AddReceivers,\n ) {\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.AddReceivers,\n request$: this.api.addReceivers(\n action.templateId,\n action.expectedRevision,\n action.receivers,\n ),\n onSuccess: (template, state) => ({\n templates: upsertTemplate(state.templates, template),\n }),\n });\n }\n\n @Action(DeleteReceiver)\n deleteReceiver(\n ctx: StateContext<NotificationStateModel>,\n action: DeleteReceiver,\n ) {\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.DeleteReceiver,\n request$: this.api.deleteReceiver(\n action.receiverId,\n action.expectedRevision,\n ),\n onSuccess: (template, state) => ({\n templates: upsertTemplate(state.templates, template),\n }),\n });\n }\n\n @Action(DeleteTemplate)\n deleteTemplate(\n ctx: StateContext<NotificationStateModel>,\n action: DeleteTemplate,\n ) {\n const eventId = ctx\n .getState()\n .templates.find((template) => template.id === action.templateId)?.eventId;\n\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.DeleteTemplate,\n request$: this.api.deleteTemplate(\n action.templateId,\n action.expectedRevision,\n ),\n onSuccess: (_, state) => {\n const templates = state.templates.filter(\n (template) => template.id !== action.templateId,\n );\n const next = templates.find(\n (template) => template.eventId === state.selectedEventId,\n );\n return {\n templates,\n selectedTemplateId:\n state.selectedTemplateId === action.templateId\n ? (next?.id ?? null)\n : state.selectedTemplateId,\n publications: [],\n publicationsTemplateId: null,\n };\n },\n }).pipe(\n tap(() => {\n // Deleting a default leaves its slot behind as \"intentionally removed\".\n if (eventId != null) ctx.dispatch(new GetDefaultRecipes(eventId));\n const selected = ctx.getState().selectedTemplateId;\n if (selected != null) ctx.dispatch(new GetPublications(selected));\n }),\n );\n }\n\n // ==========================================================================\n // Lifecycle\n // ==========================================================================\n @Action(PublishTemplate)\n publishTemplate(\n ctx: StateContext<NotificationStateModel>,\n action: PublishTemplate,\n ) {\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.PublishTemplate,\n request$: this.api.publish(\n action.templateId,\n action.expectedRevision,\n action.reviews,\n ),\n onSuccess: (template, state) => ({\n templates: upsertTemplate(state.templates, template),\n }),\n }).pipe(tap(() => ctx.dispatch(new GetPublications(action.templateId))));\n }\n\n @Action(SetTemplateActivation)\n setTemplateActivation(\n ctx: StateContext<NotificationStateModel>,\n action: SetTemplateActivation,\n ) {\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.SetActivation,\n request$: this.api.setActivation(\n action.templateId,\n action.expectedRevision,\n action.enabled,\n action.reviews,\n ),\n onSuccess: (template, state) => ({\n templates: upsertTemplate(state.templates, template),\n }),\n });\n }\n\n @Action(RestorePublication)\n restorePublication(\n ctx: StateContext<NotificationStateModel>,\n action: RestorePublication,\n ) {\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.RestorePublication,\n request$: this.api.restorePublication(\n action.templateId,\n action.expectedRevision,\n action.publicationRevision,\n action.reviews,\n ),\n onSuccess: (template, state) => ({\n templates: upsertTemplate(state.templates, template),\n }),\n }).pipe(tap(() => ctx.dispatch(new GetPublications(action.templateId))));\n }\n\n // ==========================================================================\n // Defaults\n // ==========================================================================\n @Action(InitializeDefaults)\n initializeDefaults(\n ctx: StateContext<NotificationStateModel>,\n action: InitializeDefaults,\n ) {\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.InitializeDefaults,\n request$: this.api.initializeDefaults(action.eventId),\n onSuccess: (result, state) =>\n state.selectedEventId === action.eventId\n ? { defaults: result.defaults }\n : undefined,\n }).pipe(\n // `createdTemplates` omits a template whose audit projection failed even\n // though it was committed, so the event list is re-read instead.\n tap(() => ctx.dispatch(new GetEvents())),\n );\n }\n\n @Action(RestoreDefault)\n restoreDefault(\n ctx: StateContext<NotificationStateModel>,\n action: RestoreDefault,\n ) {\n return handleApiRequest({\n ctx,\n key: NotificationActionKey.RestoreDefault,\n request$: this.api.restoreDefault(action.eventId, action.payload),\n onSuccess: (template, state) => ({\n templates: upsertTemplate(state.templates, template),\n ...(state.selectedEventId === action.eventId\n ? {\n selectedTemplateId: template.id,\n publications: [],\n publicationsTemplateId: template.id,\n }\n : {}),\n }),\n }).pipe(tap(() => ctx.dispatch(new GetDefaultRecipes(action.eventId))));\n }\n}\n\nfunction scopePathOf(state: NotificationStateModel): string | null {\n if (!state.moduleType || state.moduleId == null || state.moduleId === '') {\n return null;\n }\n return `${state.parentPath}/${state.moduleType}/${state.moduleId}`;\n}\n\nfunction flattenEvents(data: NotificationEventWithTemplates[]): {\n events: NotificationEvent[];\n templates: NotificationTemplateItem[];\n} {\n const events: NotificationEvent[] = [];\n const templates: NotificationTemplateItem[] = [];\n for (const { templates: eventTemplates, ...event } of data) {\n events.push(event);\n templates.push(\n ...(eventTemplates ?? []).map((template) => ({\n ...template,\n eventId: event.id,\n })),\n );\n }\n return { events, templates };\n}\n\nfunction upsertTemplate(\n templates: NotificationTemplateItem[],\n template: NotificationTemplateItem,\n): NotificationTemplateItem[] {\n const index = templates.findIndex((item) => item.id === template.id);\n if (index === -1) return [...templates, template];\n const next = [...templates];\n next[index] = template;\n return next;\n}\n","import { Injectable, computed, inject } from '@angular/core';\nimport { Store, select } from '@ngxs/store';\nimport type { Observable } from 'rxjs';\n\nimport {\n NOTIFICATION_MUTATION_KEYS,\n NotificationActionKey,\n type CreateNotificationTemplatePayload,\n type NotificationPreview,\n type NotificationPreviewRequest,\n type NotificationReceiverRef,\n type NotificationReviewFlags,\n type RestoreNotificationDefaultPayload,\n type SaveNotificationTemplatePayload,\n} from './notification.model';\nimport {\n AddReceivers,\n CreateTemplate,\n DeleteReceiver,\n DeleteTemplate,\n GetDefaultRecipes,\n GetEvents,\n InitializeDefaults,\n PublishTemplate,\n ResetNotificationState,\n RestoreDefault,\n RestorePublication,\n SaveTemplate,\n SelectEvent,\n SelectTemplate,\n SetModuleInfo,\n SetTemplateActivation,\n} from './notification.actions';\nimport { NotificationTemplateApi } from './notification.api';\nimport { NotificationState } from './notification.state';\n\n@Injectable({ providedIn: 'root' })\nexport class NotificationFacade {\n private readonly store = inject(Store);\n private readonly api = inject(NotificationTemplateApi);\n\n // ==========================================================================\n // Data\n // ==========================================================================\n readonly events = select(NotificationState.getEvents);\n /** Templates of the selected event. */\n readonly templates = select(NotificationState.getEventTemplates);\n readonly selectedEventId = select(NotificationState.getSelectedEventId);\n readonly selectedTemplateId = select(NotificationState.getSelectedTemplateId);\n readonly selectedEvent = select(NotificationState.getSelectedEvent);\n readonly selectedTemplate = select(NotificationState.getSelectedTemplate);\n readonly context = select(NotificationState.getContext);\n readonly defaults = select(NotificationState.getDefaults);\n readonly publications = select(NotificationState.getPublications);\n\n // ==========================================================================\n // Loading / errors\n // ==========================================================================\n private readonly loadingActive = select(NotificationState.getLoadingActive);\n private readonly errors = select(NotificationState.getErrors);\n\n readonly isLoadingEvents = computed(() =>\n this.loadingActive().includes(NotificationActionKey.GetEvents),\n );\n readonly isLoadingContext = computed(() =>\n this.loadingActive().includes(NotificationActionKey.GetContext),\n );\n readonly isLoadingDefaults = computed(() =>\n this.loadingActive().includes(NotificationActionKey.GetDefaults),\n );\n readonly isLoadingPublications = computed(() =>\n this.loadingActive().includes(NotificationActionKey.GetPublications),\n );\n /** True while any write is in flight — every write control disables on it. */\n readonly isMutating = computed(() =>\n this.loadingActive().some((key) =>\n NOTIFICATION_MUTATION_KEYS.includes(key as NotificationActionKey),\n ),\n );\n\n readonly eventsError = computed(\n () => this.errors()[NotificationActionKey.GetEvents] ?? null,\n );\n readonly contextError = computed(\n () => this.errors()[NotificationActionKey.GetContext] ?? null,\n );\n readonly defaultsError = computed(\n () => this.errors()[NotificationActionKey.GetDefaults] ?? null,\n );\n\n /** Accepts the enum or its string value, so templates can name the key. */\n isLoading(key: NotificationActionKey | `${NotificationActionKey}`): boolean {\n return this.loadingActive().includes(key);\n }\n\n // ==========================================================================\n // Scope\n // ==========================================================================\n /**\n * Scopes this (shared, singleton) state to a module/event context.\n *\n * This only patches the scope fields — it does NOT clear previously\n * loaded events/templates/selection from whatever context was active\n * before. Every caller that rescopes (switching component, tab, or\n * selected step/node) MUST call {@link resetState} immediately before\n * this, so there is no window where the new context reads stale data\n * from the old one. See `workflow-builder.ts` / `escalation-builder.ts`\n * for the reference call sites.\n */\n setModuleInfo(\n moduleType: string,\n moduleId: string | number,\n parentModuleType?: string,\n parentModuleId?: string | number,\n parentPath?: string,\n ) {\n return this.store.dispatch(\n new SetModuleInfo(\n moduleType,\n moduleId,\n parentModuleType,\n parentModuleId,\n parentPath,\n ),\n );\n }\n\n resetState() {\n return this.store.dispatch(new ResetNotificationState());\n }\n\n /** Loads the scope's events; the selected event's catalog and defaults follow. */\n loadEvents() {\n return this.store.dispatch(new GetEvents());\n }\n\n /** Kept for existing hosts — both load the scope's events and what follows from them. */\n loadBaseData() {\n return this.loadEvents();\n }\n\n loadAllData() {\n return this.loadEvents();\n }\n\n // ==========================================================================\n // Selection\n // ==========================================================================\n selectEvent(eventId: number) {\n return this.store.dispatch(new SelectEvent(eventId));\n }\n\n selectTemplate(templateId: number) {\n return this.store.dispatch(new SelectTemplate(templateId));\n }\n\n reloadDefaults(eventId: number) {\n return this.store.dispatch(new GetDefaultRecipes(eventId));\n }\n\n // ==========================================================================\n // Writes\n // ==========================================================================\n createTemplate(eventId: number, payload: CreateNotificationTemplatePayload) {\n return this.store.dispatch(new CreateTemplate(eventId, payload));\n }\n\n saveTemplate(templateId: number, payload: SaveNotificationTemplatePayload) {\n return this.store.dispatch(new SaveTemplate(templateId, payload));\n }\n\n deleteTemplate(templateId: number, expectedRevision: number) {\n return this.store.dispatch(\n new DeleteTemplate(templateId, expectedRevision),\n );\n }\n\n addReceivers(\n templateId: number,\n expectedRevision: number,\n receivers: NotificationReceiverRef[],\n ) {\n return this.store.dispatch(\n new AddReceivers(templateId, expectedRevision, receivers),\n );\n }\n\n deleteReceiver(receiverId: number, expectedRevision: number) {\n return this.store.dispatch(\n new DeleteReceiver(receiverId, expectedRevision),\n );\n }\n\n publish(\n templateId: number,\n expectedRevision: number,\n reviews: NotificationReviewFlags,\n ) {\n return this.store.dispatch(\n new PublishTemplate(templateId, expectedRevision, reviews),\n );\n }\n\n turnOn(\n templateId: number,\n expectedRevision: number,\n reviews: NotificationReviewFlags,\n ) {\n return this.store.dispatch(\n new SetTemplateActivation(templateId, expectedRevision, true, reviews),\n );\n }\n\n turnOff(templateId: number, expectedRevision: number) {\n return this.store.dispatch(\n new SetTemplateActivation(templateId, expectedRevision, false, null),\n );\n }\n\n restorePublication(\n templateId: number,\n expectedRevision: number,\n publicationRevision: number,\n reviews: NotificationReviewFlags,\n ) {\n return this.store.dispatch(\n new RestorePublication(\n templateId,\n expectedRevision,\n publicationRevision,\n reviews,\n ),\n );\n }\n\n initializeDefaults(eventId: number) {\n return this.store.dispatch(new InitializeDefaults(eventId));\n }\n\n restoreDefault(eventId: number, payload: RestoreNotificationDefaultPayload) {\n return this.store.dispatch(new RestoreDefault(eventId, payload));\n }\n\n // ==========================================================================\n // Preview — render-only, never stored: it saves, publishes and sends nothing.\n // ==========================================================================\n preview(\n eventId: number,\n request: NotificationPreviewRequest,\n ): Observable<NotificationPreview> {\n return this.api.preview(eventId, request);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\n\nimport type {\n NotificationChannel,\n NotificationDiagnostic,\n} from '../../store/notification';\n\n/**\n * Turns the backend's stable codes into translated sentences. Codes are the\n * contract; display text from the server is never matched or shown raw.\n */\n@Injectable({ providedIn: 'root' })\nexport class NotificationMessages {\n private readonly transloco = inject(TranslocoService);\n\n code(code: string | null): string {\n if (code) {\n // EMAIL_* codes are shared with the Email design tab. The loaded keys\n // are checked first: a translate() miss logs a missing-key warning.\n const loaded = this.transloco.getTranslation(\n this.transloco.getActiveLang(),\n );\n for (const key of [\n `notification.codes.${code}`,\n `email-delivery.design.codes.${code}`,\n ]) {\n if (Object.prototype.hasOwnProperty.call(loaded, key)) {\n return this.transloco.translate(key);\n }\n }\n }\n return this.transloco.translate('notification.codes.generic', {\n code: code ?? '—',\n });\n }\n\n diagnostic(diagnostic: NotificationDiagnostic): string {\n const message = this.code(diagnostic.code);\n return diagnostic.path ? `${message} (${diagnostic.path})` : message;\n }\n\n channel(channel: NotificationChannel): string {\n return this.transloco.translate(`notification.channel.${channel}`);\n }\n\n t(key: string, params?: Record<string, unknown>): string {\n return this.transloco.translate(`notification.${key}`, params);\n }\n}\n\nexport const CHANNEL_ICONS = {\n App: 'alert.bell-01',\n Email: 'communication.mail-01',\n Sms: 'communication.message-text-square-01',\n} as const satisfies Record<NotificationChannel, string>;\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport {\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { ModalService } from '@masterteam/components/modal';\nimport { RadioCardsField } from '@masterteam/components/radio-cards-field';\nimport { TextField } from '@masterteam/components/text-field';\n\nimport {\n NOTIFICATION_CHANNELS,\n type NotificationChannel,\n} from '../../store/notification';\nimport { CHANNEL_ICONS } from '../shared/notification-messages';\n\nexport interface AddTemplateDialogResult {\n name: string;\n channel: NotificationChannel;\n}\n\n/** A template's channel is chosen once, here — it cannot change afterwards. */\n@Component({\n selector: 'mt-add-template-dialog',\n imports: [\n ReactiveFormsModule,\n TranslocoDirective,\n TextField,\n RadioCardsField,\n Button,\n ],\n templateUrl: './add-template-dialog.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AddTemplateDialog {\n readonly modalService = inject(ModalService);\n private readonly ref = inject(ModalRef);\n private readonly transloco = inject(TranslocoService);\n\n /** Channels the event's authoring context allows. */\n readonly channels = input<readonly NotificationChannel[]>(\n NOTIFICATION_CHANNELS,\n );\n\n readonly form = new FormGroup({\n name: new FormControl('', {\n nonNullable: true,\n validators: [Validators.required, Validators.maxLength(250)],\n }),\n channel: new FormControl<NotificationChannel | null>(null, {\n validators: [Validators.required],\n }),\n });\n\n protected readonly channelOptions = computed(() =>\n this.channels().map((channel) => ({\n id: channel,\n name: this.transloco.translate(`notification.channel.${channel}`),\n description: this.transloco.translate(\n `notification.channel-description.${channel}`,\n ),\n icon: CHANNEL_ICONS[channel],\n })),\n );\n\n onSave(): void {\n const { name, channel } = this.form.getRawValue();\n if (this.form.invalid || !channel || !name.trim()) {\n this.form.markAllAsTouched();\n return;\n }\n const result: AddTemplateDialogResult = { name: name.trim(), channel };\n this.ref.close(result);\n }\n\n onCancel(): void {\n this.ref.close();\n }\n}\n","<ng-container *transloco=\"let t; prefix: 'notification'\">\n <div\n [class]=\"modalService.contentClass\"\n class=\"flex flex-col gap-4 p-4\"\n [formGroup]=\"form\"\n >\n <mt-text-field\n formControlName=\"name\"\n [label]=\"t('name')\"\n [placeholder]=\"t('enterName')\"\n [required]=\"true\"\n />\n <mt-radio-cards-field\n formControlName=\"channel\"\n [options]=\"channelOptions()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [label]=\"t('channel.label')\"\n [hint]=\"t('channel.fixed-hint')\"\n [required]=\"true\"\n />\n </div>\n\n <div [class]=\"modalService.footerClass\">\n <mt-button\n [label]=\"t('cancel')\"\n severity=\"secondary\"\n variant=\"outlined\"\n (onClick)=\"onCancel()\"\n />\n <mt-button\n [label]=\"t('create')\"\n [disabled]=\"form.invalid\"\n (onClick)=\"onSave()\"\n />\n </div>\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { ToggleField } from '@masterteam/components/toggle-field';\nimport { EmailHtmlPreview } from '@masterteam/system-settings';\nimport { Skeleton } from 'primeng/skeleton';\n\nimport type {\n NotificationDiagnostic,\n NotificationPreview,\n} from '../../store/notification';\nimport { NotificationMessages } from './notification-messages';\nimport type { NotificationPreviewStatus } from './notification-preview-runner';\n\n/**\n * Renders a notification preview the way it will be read: Email inside the\n * shared design, App as its English and Arabic messages, SMS as plain text.\n * HTML only ever goes into the sandboxed `mt-email-html-preview` frame.\n * Images always show: the server strips every image outside\n * `approvedImageOrigins`, and the frame's CSP allows only those origins.\n */\n@Component({\n selector: 'mt-notification-content-preview',\n imports: [\n TranslocoDirective,\n ReactiveFormsModule,\n Button,\n ToggleField,\n EmailHtmlPreview,\n Skeleton,\n ],\n templateUrl: './notification-content-preview.html',\n host: { class: 'flex min-w-0 flex-col', '[class.flex-1]': 'fill()' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NotificationContentPreview {\n private readonly messages = inject(NotificationMessages);\n\n readonly preview = input<NotificationPreview | null>(null);\n readonly status = input<NotificationPreviewStatus>('idle');\n readonly errorCode = input<string | null>(null);\n /** The shown render is from an older version of the content. */\n readonly stale = input(false);\n readonly height = input('26rem');\n /**\n * Stretch the rendered frames to the height the host gives this preview\n * (beside the editor), with `height` as the minimum.\n */\n readonly fill = input(false);\n /** Off beside the editor, where the Subject field is in view. */\n readonly showSubject = input(true);\n readonly retry = output<void>();\n\n protected readonly narrow = new FormControl(false, { nonNullable: true });\n protected readonly narrowValue = signal(false);\n\n protected readonly email = computed(() => {\n const preview = this.preview();\n return preview?.channel === 'Email' ? preview : null;\n });\n protected readonly app = computed(() => {\n const preview = this.preview();\n return preview?.channel === 'App' ? preview : null;\n });\n protected readonly sms = computed(() => {\n const preview = this.preview();\n return preview?.channel === 'Sms' ? preview : null;\n });\n protected readonly diagnostics = computed<NotificationDiagnostic[]>(() => {\n const preview = this.preview();\n if (!preview) return [];\n if (preview.channel === 'App') {\n return [...preview.english.diagnostics, ...preview.arabic.diagnostics];\n }\n return preview.diagnostics;\n });\n\n constructor() {\n this.narrow.valueChanges\n .pipe(takeUntilDestroyed())\n .subscribe((value) => this.narrowValue.set(value));\n }\n\n protected describe(diagnostic: NotificationDiagnostic): string {\n return this.messages.diagnostic(diagnostic);\n }\n\n protected describeCode(code: string | null): string {\n return this.messages.code(code);\n }\n}\n","<ng-container *transloco=\"let t; prefix: 'notification.preview'\">\n <div class=\"flex min-w-0 flex-1 flex-col gap-3\">\n <!-- The dimmed render already shows an update in progress; this only\n announces it. -->\n <span class=\"sr-only\" aria-live=\"polite\">{{\n status() === \"updating\" ? t(\"updating\") : \"\"\n }}</span>\n @if (email()) {\n <div class=\"flex justify-end\">\n <mt-toggle-field [formControl]=\"narrow\" [label]=\"t('narrow')\" />\n </div>\n }\n\n @if (status() === \"error\") {\n <div\n class=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700\"\n role=\"alert\"\n >\n <span>{{ describeCode(errorCode()) }}</span>\n <mt-button\n [label]=\"t('retry')\"\n size=\"small\"\n severity=\"secondary\"\n variant=\"outlined\"\n (onClick)=\"retry.emit()\"\n />\n </div>\n }\n\n @if (preview()) {\n <div\n class=\"flex min-w-0 flex-1 flex-col gap-3 transition-opacity\"\n [class.opacity-60]=\"stale() || status() === 'updating'\"\n >\n @if (email(); as email) {\n @if (showSubject()) {\n <div\n class=\"rounded-md border border-surface bg-surface-50 px-3 py-2 text-sm\"\n >\n <span class=\"text-muted-color\">{{ t(\"subject\") }}:</span>\n <span class=\"ms-1 font-medium\">{{ email.subject || \"—\" }}</span>\n </div>\n }\n <div\n class=\"mx-auto w-full overflow-hidden rounded-md border border-surface\"\n [class.max-w-[375px]]=\"narrowValue()\"\n [class.relative]=\"fill()\"\n [class.flex-1]=\"fill()\"\n [style.min-height]=\"fill() ? height() : null\"\n >\n <mt-email-html-preview\n [class.absolute]=\"fill()\"\n [class.inset-0]=\"fill()\"\n [html]=\"email.html\"\n [showImages]=\"true\"\n [approvedImageOrigins]=\"email.approvedImageOrigins\"\n [title]=\"t('email-title')\"\n [height]=\"fill() ? '100%' : height()\"\n />\n </div>\n }\n @if (app(); as app) {\n <div class=\"flex min-w-0 flex-1 flex-col gap-3\">\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span class=\"text-xs font-medium text-muted-color\">{{\n t(\"english\")\n }}</span>\n <div\n class=\"overflow-hidden rounded-md border border-surface\"\n [class.relative]=\"fill()\"\n [class.flex-1]=\"fill()\"\n [class.min-h-48]=\"fill()\"\n >\n <mt-email-html-preview\n [class.absolute]=\"fill()\"\n [class.inset-0]=\"fill()\"\n [html]=\"app.english.html\"\n [fragment]=\"true\"\n direction=\"ltr\"\n [showImages]=\"true\"\n [approvedImageOrigins]=\"app.approvedImageOrigins\"\n [title]=\"t('english')\"\n [height]=\"fill() ? '100%' : '12rem'\"\n />\n </div>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col gap-1\">\n <span class=\"text-xs font-medium text-muted-color\">{{\n t(\"arabic\")\n }}</span>\n <div\n class=\"overflow-hidden rounded-md border border-surface\"\n [class.relative]=\"fill()\"\n [class.flex-1]=\"fill()\"\n [class.min-h-48]=\"fill()\"\n >\n <mt-email-html-preview\n [class.absolute]=\"fill()\"\n [class.inset-0]=\"fill()\"\n [html]=\"app.arabic.html\"\n [fragment]=\"true\"\n direction=\"rtl\"\n [showImages]=\"true\"\n [approvedImageOrigins]=\"app.approvedImageOrigins\"\n [title]=\"t('arabic')\"\n [height]=\"fill() ? '100%' : '12rem'\"\n />\n </div>\n </div>\n </div>\n }\n @if (sms(); as sms) {\n <div\n class=\"whitespace-pre-wrap break-words rounded-md border border-surface bg-surface-50 px-4 py-3 text-sm\"\n dir=\"auto\"\n >\n {{ sms.text }}\n </div>\n <span class=\"text-xs text-muted-color\">{{\n t(\"sms-length\", { count: sms.text.length })\n }}</span>\n }\n\n @if (diagnostics().length > 0) {\n <ul class=\"list-disc ps-5 text-sm text-amber-700\">\n @for (diagnostic of diagnostics(); track $index) {\n <li>{{ describe(diagnostic) }}</li>\n }\n </ul>\n }\n </div>\n } @else if (status() !== \"error\") {\n <p-skeleton width=\"100%\" [height]=\"height()\" borderRadius=\"0.375rem\" />\n }\n </div>\n</ng-container>\n","import { DestroyRef, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n catchError,\n debounceTime,\n filter,\n map,\n merge,\n of,\n startWith,\n Subject,\n switchMap,\n} from 'rxjs';\n\nimport {\n readNotificationFailure,\n type NotificationFacade,\n type NotificationPreview,\n type NotificationPreviewRequest,\n} from '../../store/notification';\n\nexport type NotificationPreviewStatus = 'idle' | 'updating' | 'ready' | 'error';\n\ninterface PreviewJob {\n eventId: number;\n request: NotificationPreviewRequest;\n key: string;\n}\n\ninterface ScheduledJob extends PreviewJob {\n seq: number;\n}\n\n/**\n * One preview pipeline per editor. A new request cancels the one in flight,\n * a late answer for an older draft is dropped (`switchMap`), and Retry\n * re-renders the exact request that failed — so retrying a history preview\n * keeps the selected publication instead of falling back to the draft.\n * Previews never save, publish, enable or send anything.\n */\nexport class NotificationPreviewRunner {\n readonly status = signal<NotificationPreviewStatus>('idle');\n /** Last successful render — kept on screen while the next one runs. */\n readonly result = signal<NotificationPreview | null>(null);\n readonly errorCode = signal<string | null>(null);\n /** Identity of the request `result` was rendered from. */\n readonly resultKey = signal<string | null>(null);\n\n private readonly immediate$ = new Subject<PreviewJob | null>();\n private readonly debounced$ = new Subject<ScheduledJob>();\n private readonly retry$ = new Subject<void>();\n private lastJob: PreviewJob | null = null;\n /** Bumped by every request, so a pending debounced one can tell it was overtaken. */\n private seq = 0;\n\n constructor(\n facade: NotificationFacade,\n destroyRef: DestroyRef,\n debounceMs = 600,\n ) {\n merge(\n this.immediate$,\n this.debounced$.pipe(\n debounceTime(debounceMs),\n filter((job) => job.seq === this.seq),\n ),\n this.retry$.pipe(map(() => this.lastJob)),\n )\n .pipe(\n switchMap((job) => {\n this.lastJob = job;\n if (!job) {\n return of({ status: 'idle' as const });\n }\n return facade.preview(job.eventId, job.request).pipe(\n map((preview) => ({ status: 'ready' as const, preview, job })),\n catchError((error: unknown) =>\n of({\n status: 'error' as const,\n code: readNotificationFailure(error).code,\n }),\n ),\n startWith({ status: 'updating' as const }),\n );\n }),\n takeUntilDestroyed(destroyRef),\n )\n .subscribe((state) => {\n this.status.set(state.status);\n if (state.status === 'ready') {\n this.result.set(state.preview);\n this.resultKey.set(state.job.key);\n this.errorCode.set(null);\n } else if (state.status === 'error') {\n this.errorCode.set(state.code);\n } else if (state.status === 'idle') {\n this.result.set(null);\n this.resultKey.set(null);\n this.errorCode.set(null);\n }\n });\n }\n\n /** Render now (opening a review, selecting a history entry). */\n run(eventId: number, request: NotificationPreviewRequest): void {\n this.seq++;\n this.immediate$.next(toJob(eventId, request));\n }\n\n /** Render after a typing pause. */\n schedule(eventId: number, request: NotificationPreviewRequest): void {\n this.debounced$.next({ ...toJob(eventId, request), seq: ++this.seq });\n }\n\n retry(): void {\n this.retry$.next();\n }\n\n clear(): void {\n this.seq++;\n this.immediate$.next(null);\n }\n\n isCurrent(eventId: number, request: NotificationPreviewRequest): boolean {\n return (\n this.status() === 'ready' &&\n this.resultKey() === toJob(eventId, request).key\n );\n }\n}\n\nfunction toJob(\n eventId: number,\n request: NotificationPreviewRequest,\n): PreviewJob {\n return { eventId, request, key: `${eventId}:${JSON.stringify(request)}` };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { ModalService } from '@masterteam/components/modal';\nimport { Skeleton } from 'primeng/skeleton';\n\nimport {\n DEFAULTS_PUBLISHER,\n NotificationFacade,\n flattenRecipientCatalog,\n publicationPreviewRequest,\n recipientKey,\n withPreviewSamples,\n type NotificationPublication,\n type NotificationPublishedRecipient,\n} from '../../store/notification';\nimport { NotificationContentPreview } from '../shared/notification-content-preview';\nimport { NotificationPreviewRunner } from '../shared/notification-preview-runner';\n\nexport interface NotificationHistoryRestoreRequest {\n publication: NotificationPublication;\n}\n\n/**\n * Retained publications of one template, newest first. Selecting a version\n * previews that version's own content and recipients — never the draft's.\n * \"Restore\" hands the chosen version back to the editor, which runs the\n * review before anything is written.\n */\n@Component({\n selector: 'mt-notification-template-history-drawer',\n imports: [\n TranslocoDirective,\n DatePipe,\n Button,\n Skeleton,\n NotificationContentPreview,\n ],\n templateUrl: './template-history-drawer.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TemplateHistoryDrawer {\n protected readonly modalService = inject(ModalService);\n private readonly ref = inject(ModalRef);\n protected readonly facade = inject(NotificationFacade);\n private readonly destroyRef = inject(DestroyRef);\n private readonly transloco = inject(TranslocoService);\n\n readonly eventId = input.required<number>();\n /** Restoring is blocked while the editor holds unsaved edits. */\n readonly draftDirty = input(false);\n readonly historyLimit = input<number | null>(null);\n\n protected readonly runner = new NotificationPreviewRunner(\n this.facade,\n this.destroyRef,\n );\n protected readonly publications = this.facade.publications;\n protected readonly template = this.facade.selectedTemplate;\n protected readonly selectedRevision = signal<number | null>(null);\n protected readonly selected = computed(\n () =>\n this.publications().find(\n (publication) => publication.revision === this.selectedRevision(),\n ) ?? null,\n );\n protected readonly defaultsPublisher = DEFAULTS_PUBLISHER;\n private readonly receiverLabels = computed(\n () =>\n new Map(\n flattenRecipientCatalog(\n this.facade.context()?.recipients ?? [],\n this.transloco.getActiveLang(),\n )\n .flatMap((group) => group.items)\n .map((item) => [item.key.toLowerCase(), item.name]),\n ),\n );\n\n constructor() {\n // Open on the live version once the history arrives.\n effect(() => {\n const publications = this.publications();\n const live = this.template()?.publishedRevision ?? null;\n untracked(() => {\n if (this.selectedRevision() !== null || publications.length === 0) {\n return;\n }\n this.select(\n publications.find((item) => item.revision === live) ??\n publications[0],\n );\n });\n });\n }\n\n protected select(publication: NotificationPublication): void {\n this.selectedRevision.set(publication.revision);\n this.runner.run(\n this.eventId(),\n withPreviewSamples(\n publicationPreviewRequest(publication.content),\n this.facade.context()?.properties ?? [],\n this.transloco.getActiveLang(),\n ),\n );\n }\n\n /** The catalog's (localized) name; the snapshot keeps whatever was saved. */\n protected recipientName(recipient: NotificationPublishedRecipient): string {\n return (\n this.receiverLabels().get(\n recipientKey(recipient.type, recipient.identifier).toLowerCase(),\n ) ??\n (recipient.name || recipient.identifier)\n );\n }\n\n protected restore(): void {\n const publication = this.selected();\n if (!publication || this.draftDirty()) return;\n const result: NotificationHistoryRestoreRequest = { publication };\n this.ref.close(result);\n }\n\n protected close(): void {\n this.ref.close();\n }\n}\n","<ng-container *transloco=\"let t; prefix: 'notification.history'\">\n <div\n [class]=\"modalService.contentClass\"\n class=\"flex min-h-0 flex-col gap-4 p-4\"\n >\n @if (facade.isLoadingPublications() && publications().length === 0) {\n <div class=\"flex flex-col gap-2\">\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.375rem\" />\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.375rem\" />\n <p-skeleton width=\"100%\" height=\"20rem\" borderRadius=\"0.375rem\" />\n </div>\n } @else if (publications().length === 0) {\n <p class=\"text-sm text-muted-color\">{{ t(\"empty\") }}</p>\n } @else {\n @if (historyLimit(); as limit) {\n <p class=\"text-xs text-muted-color\">\n {{ t(\"limit\", { limit: limit }) }}\n </p>\n }\n <ul\n class=\"flex flex-col gap-2\"\n role=\"listbox\"\n [attr.aria-label]=\"t('title')\"\n >\n @for (publication of publications(); track publication.revision) {\n <li>\n <button\n type=\"button\"\n role=\"option\"\n [attr.aria-selected]=\"publication.revision === selectedRevision()\"\n class=\"flex w-full flex-wrap items-center justify-between gap-2 rounded-md border px-3 py-2 text-start text-sm transition-colors\"\n [class]=\"\n publication.revision === selectedRevision()\n ? 'border-primary bg-primary-50'\n : 'border-surface bg-content hover:bg-surface-50'\n \"\n (click)=\"select(publication)\"\n >\n <span class=\"flex items-center gap-2\">\n <span class=\"font-medium\">{{\n t(\"version\", { revision: publication.revision })\n }}</span>\n @if (publication.revision === template()?.publishedRevision) {\n <span\n class=\"rounded-md border border-green-200 bg-green-50 px-1.5 py-0.5 text-xs text-green-700\"\n >{{ t(\"live\") }}</span\n >\n }\n </span>\n <span class=\"text-xs text-muted-color\">\n {{ publication.publishedAtUtc | date: \"medium\" }}\n ·\n {{\n publication.publishedBy === defaultsPublisher\n ? t(\"by-system\")\n : t(\"by-user\")\n }}\n </span>\n </button>\n </li>\n }\n </ul>\n\n @if (selected(); as selected) {\n <section class=\"flex flex-col gap-3 border-t border-surface pt-4\">\n <h4 class=\"text-sm font-semibold\">\n {{ t(\"version\", { revision: selected.revision }) }} —\n {{ selected.content.name }}\n </h4>\n <mt-notification-content-preview\n [preview]=\"runner.result()\"\n [status]=\"runner.status()\"\n [errorCode]=\"runner.errorCode()\"\n height=\"22rem\"\n (retry)=\"runner.retry()\"\n />\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-xs font-medium text-muted-color\">{{\n t(\"recipients\")\n }}</span>\n @if (selected.content.receivers.length > 0) {\n <ul class=\"flex flex-wrap gap-2\">\n @for (recipient of selected.content.receivers; track $index) {\n <li\n class=\"rounded-md border border-surface bg-surface-50 px-2 py-1 text-sm\"\n >\n {{ recipientName(recipient) }}\n </li>\n }\n </ul>\n } @else {\n <span class=\"text-sm text-muted-color\">{{\n t(\"no-recipients\")\n }}</span>\n }\n </div>\n @if (selected.content.conditionFormula; as condition) {\n <div class=\"flex flex-col gap-1\">\n <span class=\"text-xs font-medium text-muted-color\">{{\n t(\"condition\")\n }}</span>\n <code\n class=\"block break-all rounded-md border border-surface bg-surface-50 px-3 py-2 text-xs\"\n dir=\"ltr\"\n >{{ condition }}</code\n >\n </div>\n }\n </section>\n }\n }\n </div>\n\n <div [class]=\"modalService.footerClass\">\n <mt-button\n [label]=\"t('close')\"\n severity=\"secondary\"\n variant=\"outlined\"\n (onClick)=\"close()\"\n />\n <mt-button\n icon=\"time.clock-rewind\"\n [label]=\"t('restore')\"\n [tooltip]=\"draftDirty() ? t('restore-blocked') : ''\"\n [disabled]=\"!selected() || draftDirty()\"\n (onClick)=\"restore()\"\n />\n </div>\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n computed,\n inject,\n input,\n OnInit,\n} from '@angular/core';\nimport { TranslocoDirective } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { ModalService } from '@masterteam/components/modal';\n\nimport {\n NotificationFacade,\n type NotificationPreviewRequest,\n type NotificationReceiverType,\n type NotificationReviewFlags,\n} from '../../store/notification';\nimport { NotificationContentPreview } from '../shared/notification-content-preview';\nimport { NotificationPreviewRunner } from '../shared/notification-preview-runner';\n\nexport type NotificationReviewMode =\n | 'publish'\n | 'enable'\n | 'restore'\n | 'restoreDefault';\n\nexport interface NotificationReviewRecipient {\n name: string;\n type: NotificationReceiverType;\n}\n\n/**\n * The explicit review before a write changes what is sent: the actual content\n * (rendered by the server) and the actual receivers of the version being\n * published / turned on / restored — never the working draft's.\n *\n * The review flags are not separate tick boxes (product decision, 2026-10-27):\n * confirming this dialog, which only enables once the server preview has\n * rendered, is the acknowledgement. They are sent only from that confirmation,\n * never as defaults elsewhere.\n */\n@Component({\n selector: 'mt-notification-template-review-dialog',\n imports: [TranslocoDirective, Button, NotificationContentPreview],\n templateUrl: './template-review-dialog.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TemplateReviewDialog implements OnInit {\n protected readonly modalService = inject(ModalService);\n private readonly ref = inject(ModalRef);\n private readonly facade = inject(NotificationFacade);\n private readonly destroyRef = inject(DestroyRef);\n\n readonly mode = input.required<NotificationReviewMode>();\n readonly eventId = input.required<number>();\n readonly request = input.required<NotificationPreviewRequest>();\n readonly recipients = input<NotificationReviewRecipient[]>([]);\n readonly condition = input<string | null>(null);\n /** Templates a ready-made slot owns also need `languageReviewed`. */\n readonly requireLanguageReview = input(false);\n /** Publishing an enabled template changes live sending at once. */\n readonly isEnabled = input(false);\n\n protected readonly runner = new NotificationPreviewRunner(\n this.facade,\n this.destroyRef,\n );\n\n protected readonly previewReady = computed(\n () => this.runner.status() === 'ready',\n );\n\n ngOnInit(): void {\n this.runner.run(this.eventId(), this.request());\n }\n\n protected confirm(): void {\n if (!this.previewReady()) return;\n const reviewed = this.mode() !== 'restoreDefault';\n const result: NotificationReviewFlags = {\n recipientsReviewed: reviewed,\n languageReviewed: reviewed && this.requireLanguageReview(),\n };\n this.ref.close(result);\n }\n\n protected cancel(): void {\n this.ref.close();\n }\n}\n","<ng-container *transloco=\"let t; prefix: 'notification.review'\">\n <div [class]=\"modalService.contentClass\" class=\"flex flex-col gap-4 p-4\">\n <div\n class=\"rounded-md border px-4 py-3 text-sm\"\n [class]=\"\n mode() === 'publish' && isEnabled()\n ? 'border-amber-200 bg-amber-50 text-amber-700'\n : 'border-surface bg-surface-50'\n \"\n >\n {{\n t(\n \"intro.\" +\n mode() +\n (mode() === \"publish\" && isEnabled() ? \"-live\" : \"\")\n )\n }}\n </div>\n\n <section class=\"flex flex-col gap-2\">\n <h4 class=\"text-sm font-semibold\">{{ t(\"recipients\") }}</h4>\n @if (recipients().length > 0) {\n <ul class=\"flex flex-wrap gap-2\">\n @for (recipient of recipients(); track $index) {\n <li\n class=\"rounded-md border border-surface bg-surface-50 px-2 py-1 text-sm\"\n >\n <span class=\"font-medium\">{{ recipient.name }}</span>\n <span class=\"ms-1 text-xs text-muted-color\">{{\n t(\"recipient-type.\" + recipient.type)\n }}</span>\n </li>\n }\n </ul>\n } @else {\n <p class=\"text-sm text-amber-700\">{{ t(\"no-recipients\") }}</p>\n }\n </section>\n\n <section class=\"flex flex-col gap-2\">\n <h4 class=\"text-sm font-semibold\">{{ t(\"condition\") }}</h4>\n @if (condition(); as condition) {\n <code\n class=\"block break-all rounded-md border border-surface bg-surface-50 px-3 py-2 text-xs\"\n dir=\"ltr\"\n >{{ condition }}</code\n >\n } @else {\n <p class=\"text-sm text-muted-color\">{{ t(\"always\") }}</p>\n }\n </section>\n\n <section class=\"flex flex-col gap-2\">\n <h4 class=\"text-sm font-semibold\">{{ t(\"content\") }}</h4>\n <mt-notification-content-preview\n [preview]=\"runner.result()\"\n [status]=\"runner.status()\"\n [errorCode]=\"runner.errorCode()\"\n height=\"20rem\"\n (retry)=\"runner.retry()\"\n />\n </section>\n </div>\n\n <div [class]=\"modalService.footerClass\">\n <div class=\"flex w-full justify-end gap-2\">\n <mt-button\n [label]=\"t('cancel')\"\n severity=\"secondary\"\n variant=\"outlined\"\n (onClick)=\"cancel()\"\n />\n <mt-button\n [label]=\"t('confirm.' + mode())\"\n [tooltip]=\"previewReady() ? '' : t('waiting-preview')\"\n [disabled]=\"!previewReady()\"\n (onClick)=\"confirm()\"\n />\n </div>\n </div>\n</ng-container>\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n computed,\n effect,\n inject,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport {\n FormControl,\n FormGroup,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { TranslocoDirective, TranslocoService } from '@jsverse/transloco';\nimport { Button } from '@masterteam/components/button';\nimport { ConfirmationService } from '@masterteam/components/confirmation';\nimport { EmptyState } from '@masterteam/components/empty-state';\nimport { ModalService } from '@masterteam/components/modal';\nimport { SelectField } from '@masterteam/components/select-field';\nimport { Tabs } from '@masterteam/components/tabs';\nimport { TextField } from '@masterteam/components/text-field';\nimport { TextareaField } from '@masterteam/components/textarea-field';\nimport { ToastService } from '@masterteam/components/toast';\nimport { Tooltip } from '@masterteam/components/tooltip';\nimport { FormulaBuilder } from '@masterteam/formula-builder';\nimport { Icon } from '@masterteam/icons';\nimport {\n EmailUserTestDialog,\n EmailVisualEditor,\n} from '@masterteam/system-settings';\nimport { Skeleton } from 'primeng/skeleton';\nimport { Observable, filter, map, of } from 'rxjs';\n\nimport {\n NOTIFICATION_CHANNELS,\n NotificationFacade,\n currentPublication,\n flattenRecipientCatalog,\n hasUnpublishedChanges,\n isDefaultOwned,\n isRevisionConflict,\n missingDefaultChannels,\n previewSamples,\n publicationPreviewRequest,\n readNotificationFailure,\n recipientKey,\n templatePreviewRequest,\n templateStatus,\n withPreviewSamples,\n type NotificationChannel,\n type NotificationDefaultRecipe,\n type NotificationDefaultSlot,\n type NotificationDiagnostic,\n type NotificationPreviewRequest,\n type NotificationPublication,\n type NotificationPublishedRecipient,\n type NotificationReceiver,\n type NotificationReviewFlags,\n type NotificationTemplateItem,\n type SaveNotificationTemplatePayload,\n} from '../../store/notification';\nimport {\n AddTemplateDialog,\n type AddTemplateDialogResult,\n} from '../add-template-dialog/add-template-dialog';\nimport { NotificationContentPreview } from '../shared/notification-content-preview';\nimport {\n CHANNEL_ICONS,\n NotificationMessages,\n} from '../shared/notification-messages';\nimport { NotificationPreviewRunner } from '../shared/notification-preview-runner';\nimport {\n TemplateHistoryDrawer,\n type NotificationHistoryRestoreRequest,\n} from '../template-history-drawer/template-history-drawer';\nimport {\n TemplateReviewDialog,\n type NotificationReviewMode,\n type NotificationReviewRecipient,\n} from '../template-review-dialog/template-review-dialog';\n\ntype ContentField = 'emailTemplate' | 'smsTemplate' | 'appEn' | 'appAr';\n\ninterface EditorValue {\n name: string;\n subject: string;\n emailTemplate: string;\n smsTemplate: string;\n appEn: string;\n appAr: string;\n conditionFormula: string;\n}\n\nconst WIDE_LAYOUT_MIN_WIDTH = 960;\n\nconst DRAWER_STYLE_CLASS =\n '!shadow-none !w-full !max-w-full md:!w-[70%] lg:!w-[50%]';\n\n/**\n * Control Panel notification templates for one scope (Level, Module,\n * LevelModule, Request/Step, EscalationRequest/Step, Delegation).\n *\n * Saving and previewing a draft never changes what is sent: only Publish\n * (snapshot the saved draft) and Turn on/off do, and both go through an\n * explicit review of the actual content and recipients first. Every write\n * carries the last revision read; a conflict keeps the user's edits.\n */\n@Component({\n selector: 'mt-notification-template',\n imports: [\n ReactiveFormsModule,\n TranslocoDirective,\n Button,\n EmptyState,\n SelectField,\n Tabs,\n TextField,\n TextareaField,\n Tooltip,\n FormulaBuilder,\n EmailVisualEditor,\n Icon,\n Skeleton,\n NotificationContentPreview,\n ],\n templateUrl: './notification-template.html',\n styleUrl: './notification-template.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NotificationTemplate {\n protected readonly facade = inject(NotificationFacade);\n private readonly messages = inject(NotificationMessages);\n private readonly transloco = inject(TranslocoService);\n private readonly confirmation = inject(ConfirmationService);\n private readonly modal = inject(ModalService);\n private readonly toast = inject(ToastService);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly lang = toSignal(this.transloco.langChanges$, {\n initialValue: this.transloco.getActiveLang(),\n });\n\n // ==========================================================================\n // Store\n // ==========================================================================\n protected readonly events = this.facade.events;\n protected readonly templates = this.facade.templates;\n protected readonly selectedEvent = this.facade.selectedEvent;\n protected readonly selectedEventId = this.facade.selectedEventId;\n protected readonly selectedTemplateId = this.facade.selectedTemplateId;\n protected readonly template = this.facade.selectedTemplate;\n protected readonly context = this.facade.context;\n protected readonly defaults = this.facade.defaults;\n protected readonly publications = this.facade.publications;\n protected readonly isMutating = this.facade.isMutating;\n\n // ==========================================================================\n // Controls\n // ==========================================================================\n protected readonly eventControl = new FormControl<number | null>(null);\n protected readonly placeholderControl = new FormControl<string | null>(null);\n protected readonly recipientControl = new FormControl<string | null>(null);\n protected readonly form = new FormGroup({\n name: new FormControl('', {\n nonNullable: true,\n validators: [Validators.required, Validators.maxLength(250)],\n }),\n subject: new FormControl('', {\n nonNullable: true,\n validators: [Validators.maxLength(250)],\n }),\n emailTemplate: new FormControl('', { nonNullable: true }),\n smsTemplate: new FormControl('', {\n nonNullable: true,\n validators: [Validators.maxLength(4000)],\n }),\n appEn: new FormControl('', { nonNullable: true }),\n appAr: new FormControl('', { nonNullable: true }),\n conditionFormula: new FormControl('', { nonNullable: true }),\n });\n private readonly formValue = signal<EditorValue>(this.form.getRawValue());\n\n /** Mirrors the tabs' own `active` model so a cancelled switch can snap back. */\n protected readonly activeTab = signal<number | null>(null);\n protected readonly activeField = signal<ContentField>('emailTemplate');\n protected readonly channelIcons = CHANNEL_ICONS;\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n /** Editor and preview side by side; see the ResizeObserver in the constructor. */\n protected readonly wide = signal(false);\n protected readonly conflict = signal(false);\n protected readonly writeDiagnostics = signal<NotificationDiagnostic[]>([]);\n protected readonly preview = new NotificationPreviewRunner(\n this.facade,\n this.destroyRef,\n );\n /** A newly opened template renders at once instead of after the typing pause. */\n private renderPreviewNow = false;\n\n private readonly emailEditor = viewChild('emailEditor', {\n read: EmailVisualEditor,\n });\n private readonly appEnEditor = viewChild('appEnEditor', {\n read: EmailVisualEditor,\n });\n private readonly appArEditor = viewChild('appArEditor', {\n read: EmailVisualEditor,\n });\n private readonly smsSource = viewChild<ElementRef<HTMLElement>>('smsSource');\n\n // ==========================================================================\n // Derived state\n // ==========================================================================\n protected readonly channel = computed(() => this.template()?.channel ?? null);\n protected readonly status = computed(() => {\n const template = this.template();\n return template ? templateStatus(template) : null;\n });\n protected readonly unpublishedChanges = computed(() => {\n const template = this.template();\n return template\n ? hasUnpublishedChanges(template, this.publications())\n : null;\n });\n protected readonly defaultOwned = computed(() => {\n const template = this.template();\n return !!template && isDefaultOwned(template, this.defaults());\n });\n\n /** Unsaved edits, measured against the server baseline rather than control flags. */\n protected readonly dirty = computed(() => {\n const template = this.template();\n if (!template) return false;\n const value = this.formValue();\n const same = (current: string, saved: string | null | undefined) =>\n current === (saved ?? '');\n if (!same(value.name, template.name)) return true;\n if (\n value.conditionFormula.trim() !== (template.conditionFormula ?? '').trim()\n ) {\n return true;\n }\n switch (template.channel) {\n case 'Email':\n return (\n !same(value.subject, template.subject) ||\n !same(value.emailTemplate, template.emailTemplate)\n );\n case 'Sms':\n return !same(value.smsTemplate, template.smsTemplate);\n case 'App':\n return (\n !same(value.appEn, template.appTemplate?.en) ||\n !same(value.appAr, template.appTemplate?.ar)\n );\n }\n });\n protected readonly nameValid = computed(\n () =>\n this.formValue().name.trim().length > 0 &&\n this.formValue().name.length <= 250,\n );\n protected readonly canSave = computed(\n () => this.dirty() && this.nameValid() && !this.isMutating(),\n );\n protected readonly canPublish = computed(\n () => !!this.template() && !this.dirty() && !this.isMutating(),\n );\n protected readonly canTurnOn = computed(() => {\n const template = this.template();\n return (\n !!template &&\n template.publishedRevision != null &&\n !!currentPublication(template, this.publications()) &&\n !this.isMutating()\n );\n });\n\n protected readonly templateTabs = computed(() =>\n this.templates().map((template) => ({\n label: template.name || this.messages.t('untitled'),\n value: template.id,\n icon: CHANNEL_ICONS[template.channel],\n })),\n );\n protected readonly placeholderGroups = computed(() => {\n const ar = this.lang() === 'ar';\n return (this.context()?.properties ?? []).map((group) => ({\n groupName: group.groupName,\n properties: group.properties.map((property) => ({\n key: property.key,\n label: (ar ? property.nameAr : property.nameEn) || property.name,\n })),\n }));\n });\n /** Image hosts the server accepts, as reported by the latest email preview. */\n protected readonly emailImageOrigins = computed(() => {\n const result = this.preview.result();\n return result?.channel === 'Email' ? result.approvedImageOrigins : [];\n });\n /** Image hosts the server accepts in App messages, from the latest App preview. */\n protected readonly appImageOrigins = computed(() => {\n const result = this.preview.result();\n return result?.channel === 'App' ? result.approvedImageOrigins : [];\n });\n /** Catalog names by `type:id`, so saved receivers read as the catalog does. */\n private readonly receiverLabels = computed(\n () =>\n new Map(\n flattenRecipientCatalog(this.context()?.recipients ?? [], this.lang())\n .flatMap((group) => group.items)\n .map((item) => [item.key.toLowerCase(), item.name]),\n ),\n );\n /** Field labels for the email editor's placeholder chips. */\n protected readonly placeholderOptions = computed(() =>\n this.placeholderGroups().flatMap((group) => group.properties),\n );\n protected readonly recipientGroups = computed(() => {\n const assigned = new Set(\n (this.template()?.receivers ?? []).map((receiver) =>\n recipientKey(receiver.type, receiver.identifier),\n ),\n );\n return flattenRecipientCatalog(\n this.context()?.recipients ?? [],\n this.lang(),\n )\n .map((group) => ({\n ...group,\n items: group.items.filter((item) => !assigned.has(item.key)),\n }))\n .filter((group) => group.items.length > 0);\n });\n protected readonly conditionPropertiesByPath = computed(() => {\n const ar = this.lang() === 'ar';\n return {\n Current: (this.context()?.conditionProperties ?? []).map((property) => ({\n key: property.key,\n name: (ar ? property.nameAr : property.nameEn) || property.name,\n })),\n };\n });\n protected readonly conditionKeys = computed(() =>\n (this.context()?.conditionProperties ?? []).map((property) => property.key),\n );\n\n protected readonly missingDefaults = computed(() =>\n missingDefaultChannels(this.defaults()),\n );\n protected readonly removedDefaults = computed(() => {\n const defaults = this.defaults();\n if (!defaults) return [];\n return defaults.slots\n .filter((slot) => slot.templateId == null)\n .map((slot) => ({\n slot,\n recipe:\n defaults.recipes.find((recipe) => recipe.channel === slot.channel) ??\n null,\n }))\n .filter(\n (\n item,\n ): item is {\n slot: NotificationDefaultSlot;\n recipe: NotificationDefaultRecipe;\n } => item.recipe !== null,\n );\n });\n\n /** What the live preview renders: the editor's current, unsaved values. */\n private readonly previewRequest = computed<NotificationPreviewRequest | null>(\n () => {\n const template = this.template();\n if (!template) return null;\n const value = this.formValue();\n return this.withSamples(\n templatePreviewRequest({\n channel: template.channel,\n subject: value.subject,\n emailTemplate: value.emailTemplate,\n smsTemplate: value.smsTemplate,\n appTemplate: { en: value.appEn, ar: value.appAr },\n }),\n );\n },\n );\n protected readonly previewStale = computed(() => {\n const eventId = this.selectedEventId();\n const request = this.previewRequest();\n return (\n eventId == null ||\n request == null ||\n !this.preview.isCurrent(eventId, request)\n );\n });\n\n constructor() {\n this.form.valueChanges\n .pipe(takeUntilDestroyed())\n .subscribe(() => this.formValue.set(this.form.getRawValue()));\n\n effect(() => {\n const eventId = this.selectedEventId();\n untracked(() => {\n if (this.eventControl.value !== eventId) {\n this.eventControl.setValue(eventId, { emitEvent: false });\n }\n });\n });\n\n // A newly selected template replaces the editor; a write on the same\n // template (recipients, publish, activation) never touches unsaved edits.\n effect(() => {\n const templateId = this.selectedTemplateId();\n this.activeTab.set(templateId);\n untracked(() => {\n this.conflict.set(false);\n this.writeDiagnostics.set([]);\n // Never leave the previous template's render (possibly another\n // channel) on screen under the new one.\n this.preview.clear();\n this.renderPreviewNow = true;\n const template = this.template();\n if (template) {\n this.patchFromTemplate(template);\n this.activeField.set(defaultField(template.channel));\n } else {\n this.form.reset();\n }\n });\n });\n\n effect(() => {\n const eventId = this.selectedEventId();\n const request = this.previewRequest();\n // The field catalog supplies the preview's sample values; rendering\n // before it arrives shows \"-\" and a warning per field for a moment. A\n // failed catalog load still previews, just without samples. (Not keyed\n // on the loading flag: a reload cancels and restarts the catalog read.)\n if (\n eventId != null &&\n this.context()?.eventId !== eventId &&\n this.facade.contextError() == null\n ) {\n return;\n }\n untracked(() => {\n if (eventId == null || request == null) {\n this.preview.clear();\n } else if (this.renderPreviewNow) {\n this.renderPreviewNow = false;\n this.preview.run(eventId, request);\n } else {\n this.preview.schedule(eventId, request);\n }\n });\n });\n\n // Two columns only when the editor itself is wide enough. Hosts range from\n // a full page to a builder drawer, so the viewport says little; a\n // ResizeObserver is used rather than container queries, which re-parent\n // PrimeNG's in-place overlays.\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver(([entry]) =>\n this.wide.set(entry.contentRect.width >= WIDE_LAYOUT_MIN_WIDTH),\n );\n observer.observe(this.host.nativeElement);\n this.destroyRef.onDestroy(() => observer.disconnect());\n }\n }\n\n @HostListener('window:beforeunload', ['$event'])\n protected onBeforeUnload(event: BeforeUnloadEvent): void {\n if (this.dirty() || this.isMutating()) event.preventDefault();\n }\n\n // ==========================================================================\n // Selection\n // ==========================================================================\n protected onEventChange(eventId: number | null): void {\n if (eventId == null) {\n // Clearing the picker is not a selection; keep showing the current event.\n this.eventControl.setValue(this.selectedEventId(), { emitEvent: false });\n return;\n }\n if (eventId === this.selectedEventId()) return;\n this.confirmDiscard().subscribe((discard) => {\n if (discard) {\n this.facade.selectEvent(eventId);\n } else {\n this.eventControl.setValue(this.selectedEventId(), {\n emitEvent: false,\n });\n }\n });\n }\n\n protected onTemplateTabChange(templateId: number): void {\n const current = this.selectedTemplateId();\n if (templateId === current) return;\n this.activeTab.set(templateId);\n this.confirmDiscard().subscribe((discard) => {\n if (discard) {\n this.facade.selectTemplate(templateId);\n } else {\n this.activeTab.set(current);\n }\n });\n }\n\n protected retryLoad(): void {\n const eventId = this.selectedEventId();\n if (this.facade.eventsError() || eventId == null) {\n this.facade.loadEvents();\n return;\n }\n this.facade.reloadDefaults(eventId);\n this.facade.loadEvents();\n }\n\n // ==========================================================================\n // Content editing\n // ==========================================================================\n protected setActiveField(field: ContentField): void {\n this.activeField.set(field);\n }\n\n protected onInsertPlaceholder(key: string | null): void {\n if (!key) return;\n // After the select has finished applying its own pick, or the reset is overwritten.\n setTimeout(() => this.placeholderControl.reset());\n const field = this.activeField();\n const label = this.placeholderOptions().find(\n (item) => item.key === key,\n )?.label;\n const editor =\n field === 'emailTemplate'\n ? this.emailEditor()\n : field === 'appEn'\n ? this.appEnEditor()\n : field === 'appAr'\n ? this.appArEditor()\n : undefined;\n if (editor) {\n editor.insertToken(key, label);\n return;\n }\n\n // SMS: plain text at the caret.\n const token = `{{${key}}}`;\n const control = this.form.controls.smsTemplate;\n const textarea = this.smsSource()?.nativeElement.querySelector('textarea');\n const start = textarea?.selectionStart ?? control.value.length;\n const end = textarea?.selectionEnd ?? start;\n control.setValue(\n control.value.slice(0, start) + token + control.value.slice(end),\n );\n const caret = start + token.length;\n // ngModel writes the new value into the textarea asynchronously, which\n // moves the caret to the end; restore it after that write.\n setTimeout(() => {\n textarea?.focus();\n textarea?.setSelectionRange(caret, caret);\n });\n }\n\n protected onSave(): void {\n const template = this.template();\n if (!template || !this.canSave()) {\n this.form.markAllAsTouched();\n return;\n }\n this.facade\n .saveTemplate(template.id, this.buildSavePayload(template))\n .subscribe({\n next: () => {\n const saved = this.template();\n // Show exactly what the server stored (it sanitizes on save).\n if (saved) this.patchFromTemplate(saved);\n this.afterWrite('saved');\n },\n error: (error: unknown) => this.onWriteError(error),\n });\n }\n\n protected onDiscard(): void {\n // Discarded edits cannot be brought back, so ask first (as switching does).\n this.confirmDiscard().subscribe((discard) => {\n const template = this.template();\n if (discard && template) this.patchFromTemplate(template);\n });\n }\n\n // ==========================================================================\n // Recipients\n // ==========================================================================\n protected onAddRecipient(key: string | null): void {\n const template = this.template();\n setTimeout(() => this.recipientControl.reset());\n if (!key || !template || this.isMutating()) return;\n const option = this.recipientGroups()\n .flatMap((group) => group.items)\n .find((item) => item.key === key);\n if (!option) return;\n this.facade\n .addReceivers(template.id, template.revision, [\n { type: option.type, id: option.id },\n ])\n .subscribe({\n next: () => this.afterWrite(null),\n error: (error: unknown) => this.onWriteError(error),\n });\n }\n\n protected onRemoveRecipient(receiver: NotificationReceiver): void {\n const template = this.template();\n if (!template || receiver.isSystem || this.isMutating()) return;\n this.confirmation.confirmDelete({\n type: 'dialog',\n message: this.messages.t('recipients.remove-message', {\n name: this.receiverName(receiver),\n }),\n accept: () =>\n this.facade.deleteReceiver(receiver.id, template.revision).subscribe({\n next: () => this.afterWrite(null),\n error: (error: unknown) => this.onWriteError(error),\n }),\n });\n }\n\n /**\n * The catalog's name first: ready-made templates come back with the raw\n * identifier as their saved name (`creator`), while the catalog has the\n * localized label.\n */\n protected receiverName(receiver: {\n type: NotificationReceiver['type'];\n identifier: string | null;\n name?: NotificationReceiver['name'] | string | null;\n }): string {\n const fromCatalog = this.receiverLabels().get(\n recipientKey(receiver.type, receiver.identifier).toLowerCase(),\n );\n if (fromCatalog) return fromCatalog;\n const name = receiver.name;\n if (typeof name === 'string') return name || receiver.identifier || '';\n const ar = this.lang() === 'ar';\n return (\n (ar ? name?.ar : name?.en) || name?.display || receiver.identifier || ''\n );\n }\n\n // ==========================================================================\n // Lifecycle\n // ==========================================================================\n protected onPublish(): void {\n const template = this.template();\n if (!template || !this.canPublish()) return;\n const revision = template.revision;\n this.review('publish', {\n request: templatePreviewRequest(template),\n recipients: template.receivers.map((receiver) => ({\n name: this.receiverName(receiver),\n type: receiver.type,\n })),\n condition: template.conditionFormula,\n isEnabled: template.isEnabled,\n }).subscribe((reviews) =>\n this.facade.publish(template.id, revision, reviews).subscribe({\n next: () => this.afterWrite('published'),\n error: (error: unknown) => this.onWriteError(error),\n }),\n );\n }\n\n protected onTurnOn(): void {\n const template = this.template();\n if (!template || !this.canTurnOn()) return;\n const publication = currentPublication(template, this.publications());\n if (!publication) return;\n const revision = template.revision;\n // Turning on sends the *published* version — review that, not the draft.\n this.review(\n 'enable',\n publicationReview(publication, (receiver) => this.receiverName(receiver)),\n ).subscribe((reviews) =>\n this.facade.turnOn(template.id, revision, reviews).subscribe({\n next: () => this.afterWrite('turned-on'),\n error: (error: unknown) => this.onWriteError(error),\n }),\n );\n }\n\n protected onTurnOff(): void {\n const template = this.template();\n if (!template || this.isMutating()) return;\n const revision = template.revision;\n this.confirmation.confirm({\n type: 'dialog',\n header: this.messages.t('turn-off.header'),\n message: this.messages.t('turn-off.message'),\n icon: 'general.toggle-01-left',\n acceptLabel: this.messages.t('actions.turn-off'),\n acceptButton: { severity: 'danger' },\n accept: () =>\n this.facade.turnOff(template.id, revision).subscribe({\n next: () => this.afterWrite('turned-off'),\n error: (error: unknown) => this.onWriteError(error),\n }),\n });\n }\n\n protected onOpenHistory(): void {\n const eventId = this.selectedEventId();\n if (eventId == null) return;\n const ref = this.modal.openModal(TemplateHistoryDrawer, 'drawer', {\n header: this.messages.t('history.title'),\n styleClass: DRAWER_STYLE_CLASS,\n position: 'end',\n dismissableMask: true,\n dismissible: true,\n inputValues: {\n eventId,\n draftDirty: this.dirty(),\n historyLimit: this.context()?.publicationHistoryLimit ?? null,\n },\n });\n ref.onClose.subscribe((result?: NotificationHistoryRestoreRequest) => {\n if (result?.publication) this.restoreVersion(result.publication);\n });\n }\n\n private restoreVersion(publication: NotificationPublication): void {\n const template = this.template();\n if (!template || this.dirty() || this.isMutating()) return;\n const revision = template.revision;\n this.review('restore', {\n ...publicationReview(publication, (receiver) =>\n this.receiverName(receiver),\n ),\n isEnabled: template.isEnabled,\n }).subscribe((reviews) =>\n this.facade\n .restorePublication(\n template.id,\n revision,\n publication.revision,\n reviews,\n )\n .subscribe({\n next: () => {\n const restored = this.template();\n if (restored) this.patchFromTemplate(restored);\n this.afterWrite('restored');\n },\n error: (error: unknown) => this.onWriteError(error),\n }),\n );\n }\n\n protected onDelete(): void {\n const template = this.template();\n if (!template || template.isSystem || this.isMutating()) return;\n this.confirmation.confirmDelete({\n type: 'dialog',\n message: this.messages.t(\n this.defaultOwned() ? 'delete.default-message' : 'delete.message',\n ),\n accept: () =>\n this.facade.deleteTemplate(template.id, template.revision).subscribe({\n next: () => this.toast.success(this.messages.t('toast.deleted')),\n error: (error: unknown) => this.onWriteError(error),\n }),\n });\n }\n\n protected onAddTemplate(): void {\n const event = this.selectedEvent();\n if (!event || this.isMutating()) return;\n this.confirmDiscard().subscribe((discard) => {\n if (!discard) return;\n const ref = this.modal.openModal(AddTemplateDialog, 'dialog', {\n header: this.messages.t('addTemplate'),\n styleClass: '!w-[34rem] max-w-[96vw]',\n dismissible: true,\n inputValues: {\n channels: this.context()?.channels ?? NOTIFICATION_CHANNELS,\n },\n });\n ref.onClose.subscribe((result?: AddTemplateDialogResult) => {\n if (!result) return;\n this.facade\n .createTemplate(event.id, {\n channel: result.channel,\n name: result.name,\n subject: null,\n emailTemplate: null,\n smsTemplate: null,\n appTemplate: null,\n conditionFormula: null,\n receivers: [],\n })\n .subscribe({\n next: () => this.afterWrite('created'),\n error: (error: unknown) => this.onWriteError(error),\n });\n });\n });\n }\n\n protected onTestEmail(): void {\n const event = this.selectedEvent();\n const template = this.template();\n if (!event || !template || template.channel !== 'Email') return;\n if (this.dirty()) {\n this.toast.warn(this.messages.t('saveBeforeEmailTest'));\n return;\n }\n // Sends the saved draft — never the editor's unsaved values.\n this.modal.openModal(EmailUserTestDialog, 'dialog', {\n header: this.messages.t('testEmail'),\n styleClass: '!w-[96vw] sm:!w-[38rem]',\n inputValues: {\n kind: 'template',\n eventId: event.id,\n templateId: template.id,\n sourceLabel: `${event.name} — ${template.name ?? ''}`,\n // The same readable values as the preview, instead of a field per\n // placeholder.\n sampleValues: previewSamples(\n {\n channel: 'Email',\n subject: template.subject,\n emailTemplate: template.emailTemplate,\n },\n this.context()?.properties ?? [],\n this.transloco.getActiveLang(),\n ),\n },\n });\n }\n\n // ==========================================================================\n // Defaults\n // ==========================================================================\n protected onInitializeDefaults(): void {\n const eventId = this.selectedEventId();\n if (eventId == null || this.isMutating()) return;\n const autoApp = (this.defaults()?.recipes ?? []).some(\n (recipe) =>\n recipe.autoPublishApp &&\n this.missingDefaults().includes(recipe.channel),\n );\n this.facade.initializeDefaults(eventId).subscribe({\n next: () =>\n this.toast.success(\n this.messages.t(autoApp ? 'defaults.added-app-on' : 'defaults.added'),\n ),\n error: (error: unknown) => this.onWriteError(error),\n });\n }\n\n protected onRestoreDefault(channel: NotificationChannel): void {\n const eventId = this.selectedEventId();\n if (eventId == null || this.isMutating()) return;\n // Review the catalog as it is now, not as it was when the page loaded.\n this.facade.reloadDefaults(eventId).subscribe(() => {\n const defaults = this.defaults();\n const slot = defaults?.slots.find(\n (item) => item.channel === channel && item.templateId == null,\n );\n const recipe = defaults?.recipes.find((item) => item.channel === channel);\n if (!slot || !recipe) return;\n this.review('restoreDefault', {\n request: templatePreviewRequest(recipe.draft),\n recipients: recipe.draft.receivers.map((receiver) => ({\n name: this.receiverName(receiver),\n type: receiver.type,\n })),\n condition: recipe.draft.conditionFormula,\n }).subscribe(() =>\n this.facade\n .restoreDefault(eventId, {\n channel,\n expectedSlotRevision: slot.revision,\n recipeHash: recipe.recipeHash,\n })\n .subscribe({\n next: () => this.afterWrite('default-restored'),\n error: (error: unknown) => this.onWriteError(error),\n }),\n );\n });\n }\n\n // ==========================================================================\n // Conflicts and errors\n // ==========================================================================\n /**\n * After a revision conflict: re-read the latest version, then either keep\n * the user's edits on top of it (the next Save applies them deliberately)\n * or replace them with what is saved.\n */\n protected resolveConflict(keepMine: boolean): void {\n this.facade.loadEvents().subscribe(() => {\n if (!keepMine) {\n const template = this.template();\n if (template) this.patchFromTemplate(template);\n }\n this.conflict.set(false);\n });\n }\n\n protected describeDiagnostic(diagnostic: NotificationDiagnostic): string {\n return this.messages.diagnostic(diagnostic);\n }\n\n protected channelLabel(channel: NotificationChannel): string {\n return this.messages.channel(channel);\n }\n\n private afterWrite(toastKey: string | null): void {\n this.writeDiagnostics.set([]);\n const template = this.template();\n // The write committed even when its audit record did not; never repeat it.\n if (template?.auditState === 'Failed') {\n this.toast.warn(this.messages.t('toast.audit-warning'));\n return;\n }\n if (toastKey) this.toast.success(this.messages.t(`toast.${toastKey}`));\n }\n\n private onWriteError(error: unknown): void {\n const failure = readNotificationFailure(error);\n if (isRevisionConflict(failure)) {\n this.conflict.set(true);\n return;\n }\n this.writeDiagnostics.set(failure.diagnostics);\n this.toast.error(this.messages.code(failure.code));\n\n const eventId = this.selectedEventId();\n if (\n eventId != null &&\n (failure.code === 'NOTIFICATION_RECIPE_CHANGED' ||\n failure.code === 'NOTIFICATION_DEFAULT_ALREADY_PRESENT' ||\n failure.code === 'NOTIFICATION_DEFAULT_ADOPTION_AMBIGUOUS')\n ) {\n this.facade.reloadDefaults(eventId);\n } else if (failure.code?.endsWith('_NOT_FOUND')) {\n this.facade.loadEvents();\n }\n }\n\n // ==========================================================================\n // Helpers\n // ==========================================================================\n private review(\n mode: NotificationReviewMode,\n content: {\n request: NotificationPreviewRequest;\n recipients: NotificationReviewRecipient[];\n condition: string | null;\n isEnabled?: boolean;\n },\n ): Observable<NotificationReviewFlags> {\n const eventId = this.selectedEventId();\n if (eventId == null) return of();\n const ref = this.modal.openModal(TemplateReviewDialog, 'dialog', {\n header: this.messages.t(`review.title.${mode}`),\n styleClass: '!w-[96vw] lg:!w-[52rem]',\n dismissible: true,\n inputValues: {\n mode,\n eventId,\n request: this.withSamples(content.request),\n recipients: content.recipients,\n condition: content.condition,\n requireLanguageReview: mode !== 'restoreDefault' && this.defaultOwned(),\n isEnabled: content.isEnabled ?? false,\n },\n });\n return ref.onClose.pipe(\n filter((result): result is NotificationReviewFlags => !!result),\n map((result) => result),\n );\n }\n\n /** Readable sample values for every field the previewed content uses. */\n private withSamples(\n request: NotificationPreviewRequest,\n ): NotificationPreviewRequest {\n return withPreviewSamples(\n request,\n this.context()?.properties ?? [],\n this.lang(),\n );\n }\n\n private confirmDiscard(): Observable<boolean> {\n if (!this.dirty()) return of(true);\n return new Observable<boolean>((subscriber) => {\n this.confirmation.confirm({\n type: 'dialog',\n header: this.messages.t('unsaved.header'),\n message: this.messages.t('unsaved.message'),\n acceptLabel: this.messages.t('unsaved.discard'),\n rejectLabel: this.messages.t('unsaved.stay'),\n acceptButton: { severity: 'danger' },\n accept: () => {\n subscriber.next(true);\n subscriber.complete();\n },\n reject: () => {\n subscriber.next(false);\n subscriber.complete();\n },\n });\n });\n }\n\n private patchFromTemplate(template: NotificationTemplateItem): void {\n this.form.reset({\n name: template.name ?? '',\n subject: template.subject ?? '',\n emailTemplate: template.emailTemplate ?? '',\n smsTemplate: template.smsTemplate ?? '',\n appEn: template.appTemplate?.en ?? '',\n appAr: template.appTemplate?.ar ?? '',\n conditionFormula: template.conditionFormula ?? '',\n });\n this.formValue.set(this.form.getRawValue());\n }\n\n /** Replacement semantics: only the template's own channel field is sent. */\n private buildSavePayload(\n template: NotificationTemplateItem,\n ): SaveNotificationTemplatePayload {\n const value = this.form.getRawValue();\n const condition = value.conditionFormula.trim();\n return {\n expectedRevision: template.revision,\n name: value.name.trim(),\n subject:\n template.channel === 'Email' ? value.subject.trim() || null : null,\n emailTemplate: template.channel === 'Email' ? value.emailTemplate : null,\n smsTemplate: template.channel === 'Sms' ? value.smsTemplate : null,\n appTemplate:\n template.channel === 'App'\n ? { en: value.appEn, ar: value.appAr }\n : null,\n conditionFormula: condition || null,\n };\n }\n}\n\nexport default NotificationTemplate;\n\nfunction defaultField(channel: NotificationChannel): ContentField {\n switch (channel) {\n case 'Email':\n return 'emailTemplate';\n case 'Sms':\n return 'smsTemplate';\n case 'App':\n return 'appEn';\n }\n}\n\nfunction publicationReview(\n publication: NotificationPublication,\n nameOf: (receiver: NotificationPublishedRecipient) => string,\n): {\n request: NotificationPreviewRequest;\n recipients: NotificationReviewRecipient[];\n condition: string | null;\n} {\n return {\n request: publicationPreviewRequest(publication.content),\n recipients: publication.content.receivers.map((receiver) => ({\n name: nameOf(receiver),\n type: receiver.type,\n })),\n condition: publication.content.conditionFormula,\n };\n}\n","<ng-container *transloco=\"let t; prefix: 'notification'\">\n <div class=\"flex min-w-0 flex-col gap-4 p-4\">\n @if (facade.isLoadingEvents() && events().length === 0) {\n <div class=\"flex flex-col gap-4\" aria-live=\"polite\">\n <p-skeleton width=\"50%\" height=\"2.5rem\" borderRadius=\"0.375rem\" />\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.375rem\" />\n <p-skeleton width=\"100%\" height=\"16rem\" borderRadius=\"0.375rem\" />\n </div>\n } @else if (facade.eventsError() && events().length === 0) {\n <mt-empty-state\n illustration=\"none\"\n [title]=\"t('load-error')\"\n [actionLabel]=\"t('actions.retry')\"\n actionIcon=\"arrow.refresh-cw-01\"\n (actionClick)=\"retryLoad()\"\n />\n } @else if (events().length === 0) {\n <mt-empty-state illustration=\"none\" [title]=\"t('noEventsFound')\" />\n } @else {\n <!-- Event -->\n <div class=\"w-full md:w-1/2\">\n <mt-select-field\n [formControl]=\"eventControl\"\n [options]=\"events()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [label]=\"t('events')\"\n [placeholder]=\"t('selectEvent')\"\n [filter]=\"events().length > 8\"\n filterBy=\"name\"\n [showClear]=\"false\"\n (onChange)=\"onEventChange($event)\"\n />\n </div>\n\n @if (selectedEvent(); as event) {\n <!-- Ready-made defaults -->\n @if (missingDefaults().length > 0 || removedDefaults().length > 0) {\n <div\n class=\"flex flex-col gap-2 rounded-md border border-surface bg-surface-50 px-4 py-3 text-sm\"\n >\n @if (missingDefaults().length > 0) {\n <div class=\"flex flex-wrap items-center justify-between gap-2\">\n <span class=\"flex items-center gap-2\">\n <mt-icon\n icon=\"general.zap\"\n class=\"size-4 shrink-0 text-primary\"\n />\n {{ t(\"defaults.missing\") }}\n </span>\n <mt-button\n size=\"small\"\n [label]=\"t('defaults.add')\"\n [loading]=\"facade.isLoading('initializeDefaults')\"\n [disabled]=\"isMutating()\"\n (onClick)=\"onInitializeDefaults()\"\n />\n </div>\n }\n @for (item of removedDefaults(); track item.slot.channel) {\n <div class=\"flex flex-wrap items-center justify-between gap-2\">\n <span>{{\n t(\"defaults.removed\", {\n channel: channelLabel(item.slot.channel),\n })\n }}</span>\n <mt-button\n size=\"small\"\n severity=\"secondary\"\n variant=\"outlined\"\n [label]=\"t('defaults.restore')\"\n [disabled]=\"isMutating()\"\n (onClick)=\"onRestoreDefault(item.slot.channel)\"\n />\n </div>\n }\n </div>\n }\n\n <!-- Templates of the event -->\n <div class=\"flex flex-wrap items-center justify-between gap-2\">\n @if (templates().length > 0) {\n <mt-tabs\n class=\"min-w-0 flex-1\"\n mode=\"underline\"\n [active]=\"activeTab()\"\n [options]=\"templateTabs()\"\n (activeChange)=\"onTemplateTabChange($event)\"\n />\n } @else {\n <span class=\"text-sm text-muted-color\">{{\n t(\"no-templates\")\n }}</span>\n }\n <mt-button\n icon=\"general.plus\"\n [label]=\"t('addNotification')\"\n size=\"small\"\n [disabled]=\"isMutating() || !context()\"\n (onClick)=\"onAddTemplate()\"\n />\n </div>\n\n @if (facade.contextError() && !context()) {\n <div\n class=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700\"\n role=\"alert\"\n >\n <span>{{ t(\"context-error\") }}</span>\n <mt-button\n size=\"small\"\n severity=\"secondary\"\n variant=\"outlined\"\n [label]=\"t('actions.retry')\"\n (onClick)=\"retryLoad()\"\n />\n </div>\n }\n\n @if (template(); as template) {\n @if (!context()) {\n <div class=\"flex flex-col gap-3\">\n <p-skeleton\n width=\"100%\"\n height=\"3.5rem\"\n borderRadius=\"0.375rem\"\n />\n <p-skeleton width=\"100%\" height=\"20rem\" borderRadius=\"0.375rem\" />\n </div>\n } @else {\n <!-- Status and actions -->\n <div\n class=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-surface bg-content px-4 py-3\"\n >\n <div class=\"flex min-w-0 flex-wrap items-center gap-2 text-sm\">\n <span\n class=\"inline-flex items-center gap-1 rounded-md border border-surface bg-surface-50 px-2 py-0.5\"\n >\n <mt-icon\n [icon]=\"channelIcons[template.channel]\"\n class=\"size-4\"\n />\n {{ channelLabel(template.channel) }}\n </span>\n @switch (status()) {\n @case (\"on\") {\n <span\n class=\"rounded-md border border-green-200 bg-green-50 px-2 py-0.5 font-medium text-green-700\"\n [mtTooltip]=\"t('status.on-hint')\"\n >{{ t(\"status.on\") }}</span\n >\n }\n @case (\"off\") {\n <span\n class=\"rounded-md border border-surface bg-surface-50 px-2 py-0.5 font-medium text-muted-color\"\n [mtTooltip]=\"t('status.off-hint')\"\n >{{ t(\"status.off\") }}</span\n >\n }\n @case (\"draft\") {\n <span\n class=\"rounded-md border border-amber-200 bg-amber-50 px-2 py-0.5 font-medium text-amber-700\"\n [mtTooltip]=\"t('status.draft-hint')\"\n >{{ t(\"status.draft\") }}</span\n >\n }\n }\n @if (unpublishedChanges()) {\n <span\n class=\"rounded-md border border-amber-200 bg-amber-50 px-2 py-0.5 text-amber-700\"\n [mtTooltip]=\"t('status.unpublished-hint')\"\n >{{ t(\"status.unpublished\") }}</span\n >\n }\n @if (defaultOwned()) {\n <span\n class=\"rounded-md border border-surface bg-surface-50 px-2 py-0.5 text-muted-color\"\n >{{ t(\"status.default\") }}</span\n >\n }\n @if (dirty()) {\n <span\n class=\"rounded-md border border-amber-200 bg-amber-50 px-2 py-0.5 text-amber-700\"\n >{{ t(\"status.unsaved\") }}</span\n >\n }\n </div>\n\n <div class=\"flex flex-wrap items-center gap-2\">\n <mt-button\n icon=\"time.clock-rewind\"\n severity=\"secondary\"\n variant=\"text\"\n [tooltip]=\"t('actions.history')\"\n [ariaLabel]=\"t('actions.history')\"\n [disabled]=\"template.publishedRevision === null\"\n (onClick)=\"onOpenHistory()\"\n />\n @if (template.channel === \"Email\") {\n <mt-button\n icon=\"communication.send-01\"\n severity=\"secondary\"\n variant=\"text\"\n [tooltip]=\"\n dirty() ? t('saveBeforeEmailTest') : t('testEmail')\n \"\n [ariaLabel]=\"t('testEmail')\"\n [disabled]=\"dirty() || isMutating()\"\n (onClick)=\"onTestEmail()\"\n />\n }\n @if (!template.isSystem) {\n <mt-button\n icon=\"general.trash-01\"\n severity=\"danger\"\n variant=\"text\"\n [tooltip]=\"t('actions.delete')\"\n [ariaLabel]=\"t('actions.delete')\"\n [loading]=\"facade.isLoading('deleteTemplate')\"\n [disabled]=\"isMutating()\"\n (onClick)=\"onDelete()\"\n />\n }\n @if (status() === \"on\") {\n <mt-button\n icon=\"general.toggle-01-left\"\n severity=\"secondary\"\n variant=\"outlined\"\n [label]=\"t('actions.turn-off')\"\n [loading]=\"facade.isLoading('setActivation')\"\n [disabled]=\"isMutating()\"\n (onClick)=\"onTurnOff()\"\n />\n } @else {\n <mt-button\n icon=\"general.toggle-01-right\"\n severity=\"secondary\"\n variant=\"outlined\"\n [label]=\"t('actions.turn-on')\"\n [tooltip]=\"\n template.publishedRevision === null\n ? t('actions.turn-on-blocked')\n : ''\n \"\n [loading]=\"facade.isLoading('setActivation')\"\n [disabled]=\"!canTurnOn()\"\n (onClick)=\"onTurnOn()\"\n />\n }\n <mt-button\n icon=\"general.check\"\n severity=\"secondary\"\n variant=\"outlined\"\n [label]=\"t('actions.publish')\"\n [tooltip]=\"dirty() ? t('actions.save-first') : ''\"\n [loading]=\"facade.isLoading('publishTemplate')\"\n [disabled]=\"!canPublish()\"\n (onClick)=\"onPublish()\"\n />\n @if (dirty()) {\n <mt-button\n severity=\"secondary\"\n variant=\"text\"\n [label]=\"t('actions.discard')\"\n [disabled]=\"isMutating()\"\n (onClick)=\"onDiscard()\"\n />\n }\n <mt-button\n icon=\"general.save-01\"\n [label]=\"t('save')\"\n [loading]=\"facade.isLoading('saveTemplate')\"\n [disabled]=\"!canSave()\"\n (onClick)=\"onSave()\"\n />\n </div>\n </div>\n\n @if (conflict()) {\n <div\n class=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-700\"\n role=\"alert\"\n >\n <span>{{ t(\"conflict.message\") }}</span>\n <div class=\"flex flex-wrap gap-2\">\n <mt-button\n size=\"small\"\n severity=\"secondary\"\n variant=\"outlined\"\n [label]=\"t('conflict.keep-mine')\"\n (onClick)=\"resolveConflict(true)\"\n />\n <mt-button\n size=\"small\"\n severity=\"secondary\"\n [label]=\"t('conflict.load-latest')\"\n (onClick)=\"resolveConflict(false)\"\n />\n </div>\n </div>\n }\n\n @if (writeDiagnostics().length > 0) {\n <ul\n class=\"list-disc rounded-md border border-red-200 bg-red-50 py-3 pe-4 ps-8 text-sm text-red-700\"\n role=\"alert\"\n >\n @for (diagnostic of writeDiagnostics(); track $index) {\n <li>{{ describeDiagnostic(diagnostic) }}</li>\n }\n </ul>\n }\n\n <div\n class=\"grid min-w-0 gap-4\"\n [class]=\"wide() ? 'grid-cols-2' : 'grid-cols-1'\"\n [formGroup]=\"form\"\n >\n <!-- Content -->\n <section\n class=\"flex min-w-0 flex-col overflow-hidden rounded-md border border-surface bg-content\"\n >\n <header\n class=\"border-b border-surface bg-surface-50 px-4 py-2.5 text-sm font-semibold\"\n >\n {{ t(\"sections.content\") }}\n </header>\n <div class=\"flex min-w-0 flex-col gap-4 p-4\">\n <mt-text-field\n formControlName=\"name\"\n [label]=\"t('name')\"\n [placeholder]=\"t('enterName')\"\n [required]=\"true\"\n />\n @if (template.channel === \"Email\") {\n <mt-text-field\n formControlName=\"subject\"\n [label]=\"t('subject')\"\n [hint]=\"t('subject-hint')\"\n />\n }\n <mt-select-field\n [formControl]=\"placeholderControl\"\n [options]=\"placeholderGroups()\"\n optionLabel=\"label\"\n optionValue=\"key\"\n [group]=\"true\"\n optionGroupLabel=\"groupName\"\n optionGroupChildren=\"properties\"\n [label]=\"t('placeholders.label')\"\n [hint]=\"t('placeholders.hint')\"\n [placeholder]=\"t('placeholders.placeholder')\"\n [hasPlaceholderPrefix]=\"false\"\n [filter]=\"true\"\n filterBy=\"label\"\n (onChange)=\"onInsertPlaceholder($event)\"\n />\n @switch (template.channel) {\n @case (\"Email\") {\n <mt-email-visual-editor\n #emailEditor\n formControlName=\"emailTemplate\"\n [label]=\"t('email-body')\"\n [hint]=\"t('email-body-hint')\"\n [placeholders]=\"placeholderOptions()\"\n [approvedImageOrigins]=\"emailImageOrigins()\"\n height=\"26rem\"\n />\n }\n @case (\"Sms\") {\n <div #smsSource (focusin)=\"setActiveField('smsTemplate')\">\n <mt-textarea-field\n dir=\"auto\"\n formControlName=\"smsTemplate\"\n [label]=\"t('sms-body')\"\n [hint]=\"t('sms-body-hint')\"\n rows=\"6\"\n />\n </div>\n }\n @case (\"App\") {\n <mt-email-visual-editor\n #appEnEditor\n formControlName=\"appEn\"\n [label]=\"t('english')\"\n direction=\"ltr\"\n [starter]=\"false\"\n [placeholders]=\"placeholderOptions()\"\n [approvedImageOrigins]=\"appImageOrigins()\"\n height=\"12rem\"\n (focused)=\"setActiveField('appEn')\"\n />\n <mt-email-visual-editor\n #appArEditor\n formControlName=\"appAr\"\n [label]=\"t('arabic')\"\n direction=\"rtl\"\n [starter]=\"false\"\n [placeholders]=\"placeholderOptions()\"\n [approvedImageOrigins]=\"appImageOrigins()\"\n height=\"12rem\"\n (focused)=\"setActiveField('appAr')\"\n />\n }\n }\n </div>\n </section>\n\n <!-- Live preview -->\n <section\n class=\"flex min-w-0 flex-col overflow-hidden rounded-md border border-surface bg-content\"\n >\n <header\n class=\"border-b border-surface bg-surface-50 px-4 py-2.5 text-sm font-semibold\"\n >\n {{ t(\"sections.preview\") }}\n </header>\n <div class=\"flex flex-1 flex-col p-4\">\n <mt-notification-content-preview\n [preview]=\"preview.result()\"\n [status]=\"preview.status()\"\n [errorCode]=\"preview.errorCode()\"\n [stale]=\"previewStale()\"\n [fill]=\"true\"\n [showSubject]=\"false\"\n (retry)=\"preview.retry()\"\n />\n </div>\n </section>\n\n <!-- Recipients -->\n <section\n class=\"flex min-w-0 flex-col overflow-hidden rounded-md border border-surface bg-content\"\n >\n <header\n class=\"border-b border-surface bg-surface-50 px-4 py-2.5 text-sm font-semibold\"\n >\n {{ t(\"sections.recipients\") }}\n </header>\n <div class=\"flex min-w-0 flex-col gap-3 p-4\">\n <mt-select-field\n [formControl]=\"recipientControl\"\n [options]=\"recipientGroups()\"\n optionLabel=\"name\"\n optionValue=\"key\"\n [group]=\"true\"\n optionGroupLabel=\"groupName\"\n optionGroupChildren=\"items\"\n [label]=\"t('recipients.add')\"\n [hint]=\"t('recipients.hint')\"\n [placeholder]=\"t('recipients.placeholder')\"\n [filter]=\"true\"\n filterBy=\"name\"\n [loading]=\"facade.isLoading('addReceivers')\"\n (onChange)=\"onAddRecipient($event)\"\n />\n @if (template.receivers.length > 0) {\n <ul class=\"flex flex-wrap gap-2\">\n @for (receiver of template.receivers; track receiver.id) {\n <li\n class=\"flex items-center gap-2 rounded-md border border-surface bg-surface-50 py-1 pe-1 ps-3 text-sm\"\n >\n <span class=\"font-medium\">{{\n receiverName(receiver)\n }}</span>\n <span class=\"text-xs text-muted-color\">{{\n t(\"recipient-type.\" + receiver.type)\n }}</span>\n @if (!receiver.isSystem) {\n <mt-button\n icon=\"general.x-close\"\n severity=\"secondary\"\n size=\"small\"\n [text]=\"true\"\n [ariaLabel]=\"t('recipients.remove')\"\n [disabled]=\"isMutating()\"\n (onClick)=\"onRemoveRecipient(receiver)\"\n />\n }\n </li>\n }\n </ul>\n } @else {\n <p class=\"text-sm text-amber-700\">\n {{ t(\"recipients.empty\") }}\n </p>\n }\n </div>\n </section>\n\n <!-- Send only when -->\n <section\n class=\"flex min-w-0 flex-col overflow-hidden rounded-md border border-surface bg-content\"\n >\n <header\n class=\"border-b border-surface bg-surface-50 px-4 py-2.5 text-sm font-semibold\"\n >\n {{ t(\"sections.condition\") }}\n </header>\n <div class=\"flex min-w-0 flex-col gap-2 p-4\">\n <p class=\"text-sm text-muted-color\">\n {{ t(\"condition.hint\") }}\n </p>\n <mt-formula-builder\n formControlName=\"conditionFormula\"\n valueMode=\"expression\"\n [isProcessBuilder]=\"true\"\n [propertiesByPath]=\"conditionPropertiesByPath()\"\n [knownProperties]=\"conditionKeys()\"\n [placeholder]=\"t('condition.placeholder')\"\n />\n </div>\n </section>\n </div>\n }\n } @else if (templates().length > 0) {\n <p class=\"py-8 text-center text-sm text-muted-color\">\n {{ t(\"selectTemplatePrompt\") }}\n </p>\n }\n }\n }\n </div>\n</ng-container>\n","import { NotificationState } from './notification/notification.state';\r\n\r\nexport const APP_STATES = [NotificationState];\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|