@masterteam/notification 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { Avatar } from '@masterteam/components/avatar';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, input, Component, Injectable, signal, computed, effect, untracked, ChangeDetectionStrategy } from '@angular/core';
3
+ import { inject, input, Component, Injectable, computed, signal, effect, untracked, ChangeDetectionStrategy } from '@angular/core';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i1 from '@angular/forms';
6
6
  import { FormControl, Validators, ReactiveFormsModule, FormGroup } from '@angular/forms';
@@ -21,7 +21,7 @@ import { Skeleton } from 'primeng/skeleton';
21
21
  import { ModalRef } from '@masterteam/components/dialog';
22
22
  import { HttpClient } from '@angular/common/http';
23
23
  import { Action, Selector, State, Store, select } from '@ngxs/store';
24
- import { CrudStateBase, handleApiRequest, BaseFacade } from '@masterteam/components';
24
+ import { CrudStateBase, handleApiRequest } from '@masterteam/components';
25
25
 
26
26
  class AddTemplateDialog {
27
27
  modalService = inject(ModalService);
@@ -680,11 +680,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
680
680
  type: Injectable
681
681
  }], propDecorators: { setModuleInfo: [], resetState: [], getEvents: [], getReceivers: [], getProperties: [], setActionMode: [], getActionReceivers: [], getActionProperties: [], selectEvent: [], selectTemplate: [], addReceivers: [], deleteReceiver: [], addTemplate: [], updateTemplate: [], deleteTemplate: [] } });
682
682
 
683
- class NotificationFacade extends BaseFacade {
683
+ class NotificationFacade {
684
684
  store = inject(Store);
685
- // Selectors - Direct signals from state (fine-grained reactivity)
686
- stateSignal = select(NotificationState.getState);
687
- // Data selectors
685
+ // ============================================================================
686
+ // Data Selectors - Memoized by NGXS (fine-grained reactivity)
687
+ // ============================================================================
688
688
  events = select(NotificationState.getEvents);
689
689
  templates = select(NotificationState.getEventTemplates);
690
690
  receivers = select(NotificationState.getReceivers);
@@ -695,20 +695,28 @@ class NotificationFacade extends BaseFacade {
695
695
  selectedEvent = select(NotificationState.getSelectedEvent);
696
696
  selectedTemplate = select(NotificationState.getSelectedTemplate);
697
697
  availableReceivers = select(NotificationState.getAvailableReceivers);
698
- // Required by BaseFacade
699
- state() {
700
- return this.stateSignal;
701
- }
702
- // Query Pattern (data + loading + error combined)
703
- eventsQuery = this.query(NotificationActionKey.GetEvents, (state) => state.events);
704
- receiversQuery = this.query(NotificationActionKey.GetReceivers, (state) => state.receivers);
705
- propertyGroupsQuery = this.query(NotificationActionKey.GetProperties, (state) => state.propertyGroups);
706
- // Loading/Error for CRUD operations (not covered by queries)
707
- isAddingReceivers = this.loading(NotificationActionKey.AddReceivers);
708
- isDeletingReceiver = this.loading(NotificationActionKey.DeleteReceiver);
709
- isAddingTemplate = this.loading(NotificationActionKey.AddTemplate);
710
- isUpdatingTemplate = this.loading(NotificationActionKey.UpdateTemplate);
711
- isDeletingTemplate = this.loading(NotificationActionKey.DeleteTemplate);
698
+ // ============================================================================
699
+ // Loading/Error Slices - Memoized by NGXS
700
+ // ============================================================================
701
+ loadingActive = select(NotificationState.getLoadingActive);
702
+ errors = select(NotificationState.getErrors);
703
+ // ============================================================================
704
+ // Loading Signals - Computed from slice (minimal reactivity)
705
+ // ============================================================================
706
+ isLoadingEvents = computed(() => this.loadingActive().includes(NotificationActionKey.GetEvents), ...(ngDevMode ? [{ debugName: "isLoadingEvents" }] : []));
707
+ isLoadingReceivers = computed(() => this.loadingActive().includes(NotificationActionKey.GetReceivers), ...(ngDevMode ? [{ debugName: "isLoadingReceivers" }] : []));
708
+ isLoadingProperties = computed(() => this.loadingActive().includes(NotificationActionKey.GetProperties), ...(ngDevMode ? [{ debugName: "isLoadingProperties" }] : []));
709
+ isAddingReceivers = computed(() => this.loadingActive().includes(NotificationActionKey.AddReceivers), ...(ngDevMode ? [{ debugName: "isAddingReceivers" }] : []));
710
+ isDeletingReceiver = computed(() => this.loadingActive().includes(NotificationActionKey.DeleteReceiver), ...(ngDevMode ? [{ debugName: "isDeletingReceiver" }] : []));
711
+ isAddingTemplate = computed(() => this.loadingActive().includes(NotificationActionKey.AddTemplate), ...(ngDevMode ? [{ debugName: "isAddingTemplate" }] : []));
712
+ isUpdatingTemplate = computed(() => this.loadingActive().includes(NotificationActionKey.UpdateTemplate), ...(ngDevMode ? [{ debugName: "isUpdatingTemplate" }] : []));
713
+ isDeletingTemplate = computed(() => this.loadingActive().includes(NotificationActionKey.DeleteTemplate), ...(ngDevMode ? [{ debugName: "isDeletingTemplate" }] : []));
714
+ // ============================================================================
715
+ // Error Signals - Computed from slice (minimal reactivity)
716
+ // ============================================================================
717
+ eventsError = computed(() => this.errors()[NotificationActionKey.GetEvents] ?? null, ...(ngDevMode ? [{ debugName: "eventsError" }] : []));
718
+ receiversError = computed(() => this.errors()[NotificationActionKey.GetReceivers] ?? null, ...(ngDevMode ? [{ debugName: "receiversError" }] : []));
719
+ propertiesError = computed(() => this.errors()[NotificationActionKey.GetProperties] ?? null, ...(ngDevMode ? [{ debugName: "propertiesError" }] : []));
712
720
  // Action Dispatchers - Configuration
713
721
  setModuleInfo(moduleType, moduleId, parentModuleType, parentModuleId, parentPath) {
714
722
  return this.store.dispatch(new SetModuleInfo(moduleType, moduleId, parentModuleType, parentModuleId, parentPath));
@@ -768,7 +776,7 @@ class NotificationFacade extends BaseFacade {
768
776
  this.loadReceivers();
769
777
  this.loadProperties(isMultiLang);
770
778
  }
771
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NotificationFacade, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
779
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NotificationFacade, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
772
780
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NotificationFacade, providedIn: 'root' });
773
781
  }
774
782
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NotificationFacade, decorators: [{
@@ -782,25 +790,33 @@ class NotificationTemplate {
782
790
  confirmationService = inject(ConfirmationService);
783
791
  modalService = inject(ModalService);
784
792
  // ============================================================================
785
- // Queries from Facade
786
- // ============================================================================
787
- eventsQuery = this.facade.eventsQuery;
788
- propertyGroupsQuery = this.facade.propertyGroupsQuery;
789
- receiversQuery = this.facade.receiversQuery;
790
- // ============================================================================
791
- // Derived State from Facade
793
+ // Data Signals from Facade
792
794
  // ============================================================================
795
+ events = this.facade.events;
796
+ templates = this.facade.templates;
797
+ receivers = this.facade.receivers;
798
+ propertyGroups = this.facade.propertyGroups;
799
+ // Selection Signals
793
800
  selectedEventName = this.facade.selectedEventName;
794
801
  selectedTemplateId = this.facade.selectedTemplateId;
795
802
  selectedEvent = this.facade.selectedEvent;
796
803
  selectedTemplate = this.facade.selectedTemplate;
797
- templates = this.facade.templates;
798
804
  availableReceivers = this.facade.availableReceivers;
799
- // Loading States
805
+ // ============================================================================
806
+ // Loading States from Facade
807
+ // ============================================================================
808
+ isLoadingEvents = this.facade.isLoadingEvents;
809
+ isLoadingReceivers = this.facade.isLoadingReceivers;
810
+ isLoadingProperties = this.facade.isLoadingProperties;
800
811
  isUpdatingTemplate = this.facade.isUpdatingTemplate;
801
812
  isDeletingTemplate = this.facade.isDeletingTemplate;
802
813
  isAddingTemplate = this.facade.isAddingTemplate;
803
814
  // ============================================================================
815
+ // Error States from Facade
816
+ // ============================================================================
817
+ eventsError = this.facade.eventsError;
818
+ propertiesError = this.facade.propertiesError;
819
+ // ============================================================================
804
820
  // Local State
805
821
  // ============================================================================
806
822
  deletingReceiverIds = signal([], ...(ngDevMode ? [{ debugName: "deletingReceiverIds" }] : []));
@@ -1023,7 +1039,7 @@ class NotificationTemplate {
1023
1039
  return payload;
1024
1040
  }
1025
1041
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NotificationTemplate, deps: [], target: i0.ɵɵFactoryTarget.Component });
1026
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: NotificationTemplate, isStandalone: true, selector: "mt-notification-template", ngImport: i0, template: "<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (eventsQuery.isPending()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\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 <!-- Tabs Skeleton -->\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 <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\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>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events Selector -->\r\n <div class=\"w-1/2\">\r\n <mt-select-field\r\n formControlName=\"event\"\r\n [options]=\"eventsQuery.data() ?? []\"\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 @if ((eventsQuery.data() ?? []).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 if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\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.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\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=\"grid grid-cols-2 gap-4\">\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 Row -->\r\n <div class=\"grid grid-cols-2 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]=\"propertyGroupsQuery.data() ?? []\"\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]=\"propertyGroupsQuery.isPending()\"\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=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceivers()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [loading]=\"receiversQuery.isPending()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\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 </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 [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 [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 }\r\n }\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: SelectField, selector: "mt-select-field", inputs: ["field", "label", "placeholder", "hasPlaceholderPrefix", "class", "readonly", "pInputs", "options", "optionValue", "optionLabel", "filter", "filterBy", "dataKey", "showClear", "clearAfterSelect", "required", "group", "optionGroupLabel", "optionGroupChildren", "loading"], outputs: ["onChange"] }, { kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "required", "icon", "iconPosition"] }, { kind: "component", type: TextareaField, selector: "mt-textarea-field", inputs: ["field", "label", "placeholder", "class", "readonly", "noErrorStyle", "pInputs", "rows", "required"] }, { kind: "component", type: EditorField, selector: "mt-editor-field", inputs: ["label", "placeholder", "readonly", "theme", "height", "dir", "modules", "required"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "pipe", type: i2.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1042
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: NotificationTemplate, isStandalone: true, selector: "mt-notification-template", ngImport: i0, template: "<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (isLoadingEvents()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\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 <!-- Tabs Skeleton -->\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 <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\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>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events 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 @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 if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\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.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\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=\"grid grid-cols-2 gap-4\">\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 Row -->\r\n <div class=\"grid grid-cols-2 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=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceivers()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [loading]=\"isLoadingReceivers()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\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 </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 [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 [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 }\r\n }\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: SelectField, selector: "mt-select-field", inputs: ["field", "label", "placeholder", "hasPlaceholderPrefix", "class", "readonly", "pInputs", "options", "optionValue", "optionLabel", "filter", "filterBy", "dataKey", "showClear", "clearAfterSelect", "required", "group", "size", "optionGroupLabel", "optionGroupChildren", "loading"], outputs: ["onChange"] }, { kind: "component", type: TextField, selector: "mt-text-field", inputs: ["field", "hint", "label", "placeholder", "class", "type", "readonly", "pInputs", "required", "icon", "iconPosition"] }, { kind: "component", type: TextareaField, selector: "mt-textarea-field", inputs: ["field", "label", "placeholder", "class", "readonly", "noErrorStyle", "pInputs", "rows", "required"] }, { kind: "component", type: EditorField, selector: "mt-editor-field", inputs: ["label", "placeholder", "readonly", "theme", "height", "dir", "modules", "required"] }, { kind: "component", type: ToggleField, selector: "mt-toggle-field", inputs: ["label", "labelPosition", "placeholder", "readonly", "pInputs", "required", "toggleShape", "size", "icon", "descriptionCard"], outputs: ["onChange"] }, { kind: "component", type: Tabs, selector: "mt-tabs", inputs: ["options", "optionLabel", "optionValue", "active", "size", "fluid", "disabled"], outputs: ["activeChange", "onChange"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: Avatar, selector: "mt-avatar", inputs: ["label", "icon", "image", "styleClass", "size", "shape", "badge", "badgeSize", "badgeSeverity"], outputs: ["onImageError"] }, { kind: "pipe", type: i2.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1027
1043
  }
1028
1044
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NotificationTemplate, decorators: [{
1029
1045
  type: Component,
@@ -1042,7 +1058,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
1042
1058
  Icon,
1043
1059
  Skeleton,
1044
1060
  Avatar,
1045
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (eventsQuery.isPending()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\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 <!-- Tabs Skeleton -->\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 <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\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>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events Selector -->\r\n <div class=\"w-1/2\">\r\n <mt-select-field\r\n formControlName=\"event\"\r\n [options]=\"eventsQuery.data() ?? []\"\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 @if ((eventsQuery.data() ?? []).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 if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\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.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\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=\"grid grid-cols-2 gap-4\">\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 Row -->\r\n <div class=\"grid grid-cols-2 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]=\"propertyGroupsQuery.data() ?? []\"\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]=\"propertyGroupsQuery.isPending()\"\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=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceivers()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [loading]=\"receiversQuery.isPending()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\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 </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 [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 [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 }\r\n }\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;height:100%}\n"] }]
1061
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (isLoadingEvents()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\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 <!-- Tabs Skeleton -->\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 <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\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>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events 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 @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 if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\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.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\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=\"grid grid-cols-2 gap-4\">\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 Row -->\r\n <div class=\"grid grid-cols-2 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=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceivers()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [loading]=\"isLoadingReceivers()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\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 </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 [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 [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 }\r\n }\r\n }\r\n</div>\r\n", styles: [":host{display:block;width:100%;height:100%}\n"] }]
1046
1062
  }], ctorParameters: () => [] });
1047
1063
 
1048
1064
  const APP_STATES = [NotificationState];
@@ -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 severity=\"secondary\"\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: true,\r\n bilingualOptional: true,\r\n useRichEditor: true,\r\n templateKey: 'emailTemplate',\r\n translatableKey: 'emailContentTranslatable',\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: string;\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\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}\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 name: string;\r\n [key: string]: string | TranslatableContent | undefined;\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 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 } 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 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 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 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 // 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 flattenReceivers(groups: ReceiverGroup[]): ReceiverItem[] {\r\n const result: ReceiverItem[] = [];\r\n for (const group of groups) {\r\n for (const item of group.items) {\r\n if ('subGroupName' in item) {\r\n // Handle subgroups (role-based receivers)\r\n const subGroup = item as ReceiverSubGroup;\r\n result.push(\r\n ...subGroup.items.map((r) => ({\r\n ...r,\r\n name: `${subGroup.subGroupName} - ${r.name}`,\r\n })),\r\n );\r\n } else {\r\n result.push(item as ReceiverItem);\r\n }\r\n }\r\n }\r\n return result;\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 firstTemplate = templates[0];\r\n const firstEvent = events.find((e) => e.id === firstTemplate?.eventId);\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 receivers: this.flattenReceivers(response.data ?? []),\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 = action.isMultiLang\r\n ? `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/properties?IsMultiLanguageEnabled=true`\r\n : `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/properties`;\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 // 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 receivers: this.flattenReceivers(response.data ?? []),\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 = action.isMultiLang\r\n ? `${this.baseUrl}/action/${action.actionId}/properties?IsMultiLanguageEnabled=true`\r\n : `${this.baseUrl}/action/${action.actionId}/properties`;\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<NotificationTemplateItem>>(\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.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 {\r\n ...existingTemplate,\r\n name: updatedTemplate.name,\r\n emailTemplate: updatedTemplate.emailTemplate,\r\n emailContentTranslatable: updatedTemplate.emailContentTranslatable,\r\n smsTemplate: updatedTemplate.smsTemplate,\r\n appTemplate: updatedTemplate.appTemplate,\r\n },\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, Signal, inject } from '@angular/core';\r\nimport { Store, select } from '@ngxs/store';\r\nimport { BaseFacade } from '@masterteam/components';\r\n\r\nimport {\r\n NotificationActionKey,\r\n NotificationStateModel,\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 extends BaseFacade<\r\n NotificationStateModel,\r\n NotificationActionKey\r\n> {\r\n private readonly store = inject(Store);\r\n\r\n // Selectors - Direct signals from state (fine-grained reactivity)\r\n private readonly stateSignal = select(NotificationState.getState);\r\n\r\n // Data selectors\r\n readonly events = select(NotificationState.getEvents);\r\n readonly templates = select(NotificationState.getEventTemplates);\r\n readonly receivers = select(NotificationState.getReceivers);\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\r\n // Required by BaseFacade\r\n protected state(): Signal<NotificationStateModel> {\r\n return this.stateSignal;\r\n }\r\n\r\n // Query Pattern (data + loading + error combined)\r\n readonly eventsQuery = this.query(\r\n NotificationActionKey.GetEvents,\r\n (state) => state.events,\r\n );\r\n\r\n readonly receiversQuery = this.query(\r\n NotificationActionKey.GetReceivers,\r\n (state) => state.receivers,\r\n );\r\n\r\n readonly propertyGroupsQuery = this.query(\r\n NotificationActionKey.GetProperties,\r\n (state) => state.propertyGroups,\r\n );\r\n\r\n // Loading/Error for CRUD operations (not covered by queries)\r\n readonly isAddingReceivers = this.loading(NotificationActionKey.AddReceivers);\r\n readonly isDeletingReceiver = this.loading(\r\n NotificationActionKey.DeleteReceiver,\r\n );\r\n readonly isAddingTemplate = this.loading(NotificationActionKey.AddTemplate);\r\n readonly isUpdatingTemplate = this.loading(\r\n NotificationActionKey.UpdateTemplate,\r\n );\r\n readonly isDeletingTemplate = this.loading(\r\n NotificationActionKey.DeleteTemplate,\r\n );\r\n\r\n // Action Dispatchers - Configuration\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 // 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 /**\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.loadProperties(isMultiLang);\r\n }\r\n}\r\n","import { Avatar } from '@masterteam/components/avatar';\r\nimport {\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 { 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 Avatar,\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 // Queries from Facade\r\n // ============================================================================\r\n readonly eventsQuery = this.facade.eventsQuery;\r\n readonly propertyGroupsQuery = this.facade.propertyGroupsQuery;\r\n readonly receiversQuery = this.facade.receiversQuery;\r\n\r\n // ============================================================================\r\n // Derived State from Facade\r\n // ============================================================================\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 templates = this.facade.templates;\r\n readonly availableReceivers = this.facade.availableReceivers;\r\n\r\n // Loading States\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 // Local State\r\n // ============================================================================\r\n readonly deletingReceiverIds = 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 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 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 isFormInvalid = computed(\r\n () => !this.form.controls['name'].value?.trim(),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n const eventName = this.selectedEventName();\r\n if (eventName && this.form.controls['event'].value !== eventName) {\r\n this.form.controls['event'].setValue(eventName, { 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) this.patchForm(template);\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): 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) return;\r\n const selectedReceiver = this.availableReceivers().find(\r\n (r) => r.id === receiverId,\r\n );\r\n if (!selectedReceiver) return;\r\n this.facade.addReceivers(template.id, { receivers: [selectedReceiver] });\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 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 // Set email bilingual based on whether translatable content exists\r\n emailBilingual: !!template.emailContentTranslatable?.en,\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 v = this.form.getRawValue();\r\n return {\r\n name: v['name'] || template.name,\r\n ...this.extractChannelPayload(v),\r\n };\r\n }\r\n\r\n private extractChannelPayload(\r\n formValue: Record<string, unknown>,\r\n ): Record<string, unknown> {\r\n const payload: Record<string, unknown> = {};\r\n\r\n for (const ch of CHANNEL_CONFIGS) {\r\n if (ch.templateKey && formValue[ch.templateKey] !== undefined) {\r\n payload[ch.templateKey] = formValue[ch.templateKey] || '';\r\n }\r\n if (ch.translatableKey && formValue[ch.translatableKey] !== undefined) {\r\n payload[ch.translatableKey] = formValue[ch.translatableKey];\r\n }\r\n }\r\n\r\n return payload;\r\n }\r\n}\r\n\r\nexport default NotificationTemplate;\r\n","<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (eventsQuery.isPending()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\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 <!-- Tabs Skeleton -->\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 <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\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>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events Selector -->\r\n <div class=\"w-1/2\">\r\n <mt-select-field\r\n formControlName=\"event\"\r\n [options]=\"eventsQuery.data() ?? []\"\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 @if ((eventsQuery.data() ?? []).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 if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\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.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\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=\"grid grid-cols-2 gap-4\">\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 Row -->\r\n <div class=\"grid grid-cols-2 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]=\"propertyGroupsQuery.data() ?? []\"\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]=\"propertyGroupsQuery.isPending()\"\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=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceivers()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [loading]=\"receiversQuery.isPending()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\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 </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 [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 [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 }\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/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 severity=\"secondary\"\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: true,\r\n bilingualOptional: true,\r\n useRichEditor: true,\r\n templateKey: 'emailTemplate',\r\n translatableKey: 'emailContentTranslatable',\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: string;\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\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}\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 name: string;\r\n [key: string]: string | TranslatableContent | undefined;\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 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 } 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 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 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 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 // 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 flattenReceivers(groups: ReceiverGroup[]): ReceiverItem[] {\r\n const result: ReceiverItem[] = [];\r\n for (const group of groups) {\r\n for (const item of group.items) {\r\n if ('subGroupName' in item) {\r\n // Handle subgroups (role-based receivers)\r\n const subGroup = item as ReceiverSubGroup;\r\n result.push(\r\n ...subGroup.items.map((r) => ({\r\n ...r,\r\n name: `${subGroup.subGroupName} - ${r.name}`,\r\n })),\r\n );\r\n } else {\r\n result.push(item as ReceiverItem);\r\n }\r\n }\r\n }\r\n return result;\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 firstTemplate = templates[0];\r\n const firstEvent = events.find((e) => e.id === firstTemplate?.eventId);\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 receivers: this.flattenReceivers(response.data ?? []),\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 = action.isMultiLang\r\n ? `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/properties?IsMultiLanguageEnabled=true`\r\n : `${this.baseUrl}${parentPath}/${moduleType}/${moduleId}/properties`;\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 // 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 receivers: this.flattenReceivers(response.data ?? []),\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 = action.isMultiLang\r\n ? `${this.baseUrl}/action/${action.actionId}/properties?IsMultiLanguageEnabled=true`\r\n : `${this.baseUrl}/action/${action.actionId}/properties`;\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<NotificationTemplateItem>>(\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.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 {\r\n ...existingTemplate,\r\n name: updatedTemplate.name,\r\n emailTemplate: updatedTemplate.emailTemplate,\r\n emailContentTranslatable: updatedTemplate.emailContentTranslatable,\r\n smsTemplate: updatedTemplate.smsTemplate,\r\n appTemplate: updatedTemplate.appTemplate,\r\n },\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 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\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 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 // 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 /**\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.loadProperties(isMultiLang);\r\n }\r\n}\r\n","import { Avatar } from '@masterteam/components/avatar';\r\nimport {\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 { 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 Avatar,\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\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\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 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 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 isFormInvalid = computed(\r\n () => !this.form.controls['name'].value?.trim(),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n const eventName = this.selectedEventName();\r\n if (eventName && this.form.controls['event'].value !== eventName) {\r\n this.form.controls['event'].setValue(eventName, { 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) this.patchForm(template);\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): 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) return;\r\n const selectedReceiver = this.availableReceivers().find(\r\n (r) => r.id === receiverId,\r\n );\r\n if (!selectedReceiver) return;\r\n this.facade.addReceivers(template.id, { receivers: [selectedReceiver] });\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 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 // Set email bilingual based on whether translatable content exists\r\n emailBilingual: !!template.emailContentTranslatable?.en,\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 v = this.form.getRawValue();\r\n return {\r\n name: v['name'] || template.name,\r\n ...this.extractChannelPayload(v),\r\n };\r\n }\r\n\r\n private extractChannelPayload(\r\n formValue: Record<string, unknown>,\r\n ): Record<string, unknown> {\r\n const payload: Record<string, unknown> = {};\r\n\r\n for (const ch of CHANNEL_CONFIGS) {\r\n if (ch.templateKey && formValue[ch.templateKey] !== undefined) {\r\n payload[ch.templateKey] = formValue[ch.templateKey] || '';\r\n }\r\n if (ch.translatableKey && formValue[ch.translatableKey] !== undefined) {\r\n payload[ch.translatableKey] = formValue[ch.translatableKey];\r\n }\r\n }\r\n\r\n return payload;\r\n }\r\n}\r\n\r\nexport default NotificationTemplate;\r\n","<div class=\"flex flex-col gap-4 p-2\" [formGroup]=\"form\">\r\n <!-- Loading State -->\r\n @if (isLoadingEvents()) {\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Event Selector Skeleton -->\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 <!-- Tabs Skeleton -->\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 <!-- Name Field Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"3rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Channel & Properties Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\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>\r\n <p-skeleton width=\"6rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Content Editor Skeleton -->\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <div>\r\n <p-skeleton width=\"4rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"8rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n <!-- Receivers Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div>\r\n <p-skeleton width=\"5rem\" height=\"1rem\" styleClass=\"mb-2\" />\r\n <p-skeleton width=\"100%\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Receiver Items Skeleton -->\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"100%\" height=\"3rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n <!-- Actions Skeleton -->\r\n <div class=\"flex justify-end gap-2 pt-4\">\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n <p-skeleton width=\"5rem\" height=\"2.5rem\" borderRadius=\"0.5rem\" />\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Events 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 @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 if (selectedEvent()) {\r\n <!-- Template Tabs -->\r\n <div class=\"flex items-center justify-between\">\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.newNotification' | transloco\"\r\n size=\"small\"\r\n [loading]=\"isAddingTemplate()\"\r\n (onClick)=\"onAddTemplateClick()\"\r\n />\r\n </div>\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=\"grid grid-cols-2 gap-4\">\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 Row -->\r\n <div class=\"grid grid-cols-2 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=\"grid grid-cols-2 gap-4\">\r\n <mt-select-field\r\n [options]=\"availableReceivers()\"\r\n [optionLabel]=\"'name'\"\r\n [optionValue]=\"'id'\"\r\n [label]=\"'notification.receivers' | transloco\"\r\n [placeholder]=\"'notification.selectReceiver' | transloco\"\r\n [filter]=\"true\"\r\n [loading]=\"isLoadingReceivers()\"\r\n (onChange)=\"onAddReceiver($event)\"\r\n />\r\n </div>\r\n @if ((template.receivers ?? []).length > 0) {\r\n <div class=\"grid grid-cols-2 gap-4\">\r\n <div class=\"flex flex-col gap-2\">\r\n @for (receiver of template.receivers; track receiver.id) {\r\n <div\r\n class=\"flex items-center justify-between rounded-lg border border-surface bg-surface-50 p-1 transition-colors hover:bg-surface-100\"\r\n >\r\n <div class=\"flex items-center gap-3\">\r\n <mt-avatar\r\n icon=\"user.user-01\"\r\n shape=\"square\"\r\n size=\"small\"\r\n />\r\n <span class=\"font-medium\">{{ receiver.name }}</span>\r\n </div>\r\n @if (!receiver.isSystem) {\r\n <mt-button\r\n icon=\"general.trash-01\"\r\n severity=\"danger\"\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 </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 [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 [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 }\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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masterteam/notification",
3
- "version": "0.0.8",
3
+ "version": "0.0.9",
4
4
  "publishConfig": {
5
5
  "directory": "../../../dist/masterteam/notification",
6
6
  "linkDirectory": false,
@@ -19,9 +19,9 @@
19
19
  "tailwindcss": "^4.1.17",
20
20
  "tailwindcss-primeui": "^0.6.1",
21
21
  "@ngxs/store": "^20.1.0",
22
- "@masterteam/forms": "^0.0.33",
23
- "@masterteam/icons": "^0.0.12",
24
- "@masterteam/components": "^0.0.78"
22
+ "@masterteam/components": "^0.0.84",
23
+ "@masterteam/forms": "^0.0.35",
24
+ "@masterteam/icons": "^0.0.12"
25
25
  },
26
26
  "sideEffects": false,
27
27
  "exports": {
@@ -1,10 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { Signal } from '@angular/core';
3
- import * as _masterteam_components_types_masterteam_components from '@masterteam/components/types/masterteam-components';
4
2
  import * as _masterteam_notification from '@masterteam/notification';
5
3
  import { FormGroup, FormControl } from '@angular/forms';
6
- import * as _masterteam_components from '@masterteam/components';
7
- import { LoadingStateShape, CrudStateBase, Response, BaseFacade } from '@masterteam/components';
4
+ import { LoadingStateShape, CrudStateBase, Response } from '@masterteam/components';
8
5
  import { ModalService } from '@masterteam/components/modal';
9
6
  import * as rxjs from 'rxjs';
10
7
  import { StateContext } from '@ngxs/store';
@@ -244,27 +241,30 @@ declare class NotificationState extends CrudStateBase<NotificationTemplateItem,
244
241
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<NotificationState>;
245
242
  }
246
243
 
247
- declare class NotificationFacade extends BaseFacade<NotificationStateModel, NotificationActionKey> {
244
+ declare class NotificationFacade {
248
245
  private readonly store;
249
- private readonly stateSignal;
250
- readonly events: Signal<_masterteam_notification.NotificationEvent[]>;
251
- readonly templates: Signal<_masterteam_notification.NotificationTemplateItem[]>;
252
- readonly receivers: Signal<_masterteam_notification.ReceiverItem[]>;
253
- readonly propertyGroups: Signal<_masterteam_notification.PropertyGroup[]>;
254
- readonly selectedEventName: Signal<string | null>;
255
- readonly selectedTemplateId: Signal<string | number | null>;
256
- readonly selectedEvent: Signal<_masterteam_notification.NotificationEvent | null>;
257
- readonly selectedTemplate: Signal<_masterteam_notification.NotificationTemplateItem | null>;
258
- readonly availableReceivers: Signal<_masterteam_notification.ReceiverItem[]>;
259
- protected state(): Signal<NotificationStateModel>;
260
- readonly eventsQuery: _masterteam_components.QueryResult<_masterteam_notification.NotificationEvent[]>;
261
- readonly receiversQuery: _masterteam_components.QueryResult<_masterteam_notification.ReceiverItem[]>;
262
- readonly propertyGroupsQuery: _masterteam_components.QueryResult<_masterteam_notification.PropertyGroup[]>;
263
- readonly isAddingReceivers: Signal<boolean>;
264
- readonly isDeletingReceiver: Signal<boolean>;
265
- readonly isAddingTemplate: Signal<boolean>;
266
- readonly isUpdatingTemplate: Signal<boolean>;
267
- readonly isDeletingTemplate: Signal<boolean>;
246
+ readonly events: _angular_core.Signal<_masterteam_notification.NotificationEvent[]>;
247
+ readonly templates: _angular_core.Signal<_masterteam_notification.NotificationTemplateItem[]>;
248
+ readonly receivers: _angular_core.Signal<_masterteam_notification.ReceiverItem[]>;
249
+ readonly propertyGroups: _angular_core.Signal<_masterteam_notification.PropertyGroup[]>;
250
+ readonly selectedEventName: _angular_core.Signal<string | null>;
251
+ readonly selectedTemplateId: _angular_core.Signal<string | number | null>;
252
+ readonly selectedEvent: _angular_core.Signal<_masterteam_notification.NotificationEvent | null>;
253
+ readonly selectedTemplate: _angular_core.Signal<_masterteam_notification.NotificationTemplateItem | null>;
254
+ readonly availableReceivers: _angular_core.Signal<_masterteam_notification.ReceiverItem[]>;
255
+ private readonly loadingActive;
256
+ private readonly errors;
257
+ readonly isLoadingEvents: _angular_core.Signal<boolean>;
258
+ readonly isLoadingReceivers: _angular_core.Signal<boolean>;
259
+ readonly isLoadingProperties: _angular_core.Signal<boolean>;
260
+ readonly isAddingReceivers: _angular_core.Signal<boolean>;
261
+ readonly isDeletingReceiver: _angular_core.Signal<boolean>;
262
+ readonly isAddingTemplate: _angular_core.Signal<boolean>;
263
+ readonly isUpdatingTemplate: _angular_core.Signal<boolean>;
264
+ readonly isDeletingTemplate: _angular_core.Signal<boolean>;
265
+ readonly eventsError: _angular_core.Signal<string | null>;
266
+ readonly receiversError: _angular_core.Signal<string | null>;
267
+ readonly propertiesError: _angular_core.Signal<string | null>;
268
268
  setModuleInfo(moduleType: string, moduleId: string | number, parentModuleType?: string, parentModuleId?: string | number, parentPath?: string): rxjs.Observable<void>;
269
269
  resetState(): rxjs.Observable<void>;
270
270
  loadEvents(): rxjs.Observable<void>;
@@ -293,18 +293,23 @@ declare class NotificationTemplate {
293
293
  private readonly transloco;
294
294
  private readonly confirmationService;
295
295
  private readonly modalService;
296
- readonly eventsQuery: _masterteam_components_types_masterteam_components.QueryResult<_masterteam_notification.NotificationEvent[]>;
297
- readonly propertyGroupsQuery: _masterteam_components_types_masterteam_components.QueryResult<_masterteam_notification.PropertyGroup[]>;
298
- readonly receiversQuery: _masterteam_components_types_masterteam_components.QueryResult<ReceiverItem[]>;
296
+ readonly events: _angular_core.Signal<_masterteam_notification.NotificationEvent[]>;
297
+ readonly templates: _angular_core.Signal<NotificationTemplateItem[]>;
298
+ readonly receivers: _angular_core.Signal<ReceiverItem[]>;
299
+ readonly propertyGroups: _angular_core.Signal<_masterteam_notification.PropertyGroup[]>;
299
300
  readonly selectedEventName: _angular_core.Signal<string | null>;
300
301
  readonly selectedTemplateId: _angular_core.Signal<string | number | null>;
301
302
  readonly selectedEvent: _angular_core.Signal<_masterteam_notification.NotificationEvent | null>;
302
303
  readonly selectedTemplate: _angular_core.Signal<NotificationTemplateItem | null>;
303
- readonly templates: _angular_core.Signal<NotificationTemplateItem[]>;
304
304
  readonly availableReceivers: _angular_core.Signal<ReceiverItem[]>;
305
+ readonly isLoadingEvents: _angular_core.Signal<boolean>;
306
+ readonly isLoadingReceivers: _angular_core.Signal<boolean>;
307
+ readonly isLoadingProperties: _angular_core.Signal<boolean>;
305
308
  readonly isUpdatingTemplate: _angular_core.Signal<boolean>;
306
309
  readonly isDeletingTemplate: _angular_core.Signal<boolean>;
307
310
  readonly isAddingTemplate: _angular_core.Signal<boolean>;
311
+ readonly eventsError: _angular_core.Signal<string | null>;
312
+ readonly propertiesError: _angular_core.Signal<string | null>;
308
313
  readonly deletingReceiverIds: _angular_core.WritableSignal<(string | number)[]>;
309
314
  readonly form: FormGroup<any>;
310
315
  readonly propertyPickerControl: FormControl<string | null>;