diff --git a/apps/red-ui/src/app/modules/account/account-routing.module.ts b/apps/red-ui/src/app/modules/account/account-routing.module.ts index d0e896a3c..777b82c0c 100644 --- a/apps/red-ui/src/app/modules/account/account-routing.module.ts +++ b/apps/red-ui/src/app/modules/account/account-routing.module.ts @@ -4,27 +4,28 @@ import { CompositeRouteGuard } from '@iqser/common-ui'; import { AuthGuard } from '../auth/auth.guard'; import { RedRoleGuard } from '../auth/red-role.guard'; import { AppStateGuard } from '../../state/app-state.guard'; -import { NotificationsScreenComponent } from './screens/notifications/notifications-screen.component'; -import { UserProfileScreenComponent } from './screens/user-profile/user-profile-screen.component'; +import { BaseAccountScreenComponent } from './base-account-screen/base-account-screen-component'; const routes = [ { path: '', redirectTo: 'user-profile', pathMatch: 'full' }, { path: 'user-profile', - component: UserProfileScreenComponent, + component: BaseAccountScreenComponent, canActivate: [CompositeRouteGuard], data: { routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard], requiredRoles: ['RED_USER'], }, + loadChildren: () => import('./screens/user-profile/user-profile.module').then(m => m.UserProfileModule), }, { path: 'notifications', - component: NotificationsScreenComponent, + component: BaseAccountScreenComponent, canActivate: [CompositeRouteGuard], data: { routeGuards: [AuthGuard, RedRoleGuard, AppStateGuard], }, + loadChildren: () => import('./screens/notifications/notifications.module').then(m => m.NotificationsModule), }, ]; diff --git a/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts b/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts index ee4d86e53..f4cf007ae 100644 --- a/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts +++ b/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts @@ -1,5 +1,5 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { Component } from '@angular/core'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; interface NavItem { readonly label: string; @@ -10,6 +10,7 @@ interface NavItem { selector: 'redaction-account-side-nav', templateUrl: './account-side-nav.component.html', styleUrls: ['./account-side-nav.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class AccountSideNavComponent { readonly items: NavItem[] = [ diff --git a/apps/red-ui/src/app/modules/account/account.module.ts b/apps/red-ui/src/app/modules/account/account.module.ts index bc2e1c527..28b2ee431 100644 --- a/apps/red-ui/src/app/modules/account/account.module.ts +++ b/apps/red-ui/src/app/modules/account/account.module.ts @@ -3,16 +3,12 @@ import { CommonModule } from '@angular/common'; import { SharedModule } from '../shared/shared.module'; import { AccountRoutingModule } from './account-routing.module'; import { AccountSideNavComponent } from './account-side-nav/account-side-nav.component'; -import { NotificationsScreenComponent } from './screens/notifications/notifications-screen.component'; -import { UserProfileScreenComponent } from './screens/user-profile/user-profile-screen.component'; - -const screens = [NotificationsScreenComponent, UserProfileScreenComponent]; - -const components = [AccountSideNavComponent, ...screens]; +import { BaseAccountScreenComponent } from './base-account-screen/base-account-screen-component'; +import { NotificationPreferencesService } from './services/notification-preferences.service'; @NgModule({ - declarations: [components], - providers: [], + declarations: [AccountSideNavComponent, BaseAccountScreenComponent], imports: [CommonModule, SharedModule, AccountRoutingModule], + providers: [NotificationPreferencesService], }) export class AccountModule {} diff --git a/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.html b/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.html new file mode 100644 index 000000000..1597a1874 --- /dev/null +++ b/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.html @@ -0,0 +1,20 @@ +
+
+ + + +
+
+
+
+
+
+
+
+ + +
+
+
+
+
diff --git a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen.component.scss b/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.scss similarity index 64% rename from apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen.component.scss rename to apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.scss index e145e5430..fd508d3c9 100644 --- a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen.component.scss +++ b/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.scss @@ -1,15 +1,16 @@ -@use 'variables'; -@use 'common-mixins'; - -.dialog { - min-height: unset; -} +@use 'apps/red-ui/src/assets/styles/variables'; +@use 'libs/common-ui/src/assets/styles/common-mixins'; .content-container { background-color: variables.$grey-2; justify-content: center; @include common-mixins.scroll-bar; overflow: auto; + + .dialog { + width: var(--width); + min-height: unset; + } } .full-height { @@ -21,7 +22,3 @@ height: calc(100% + 50px); z-index: 1; } - -a { - color: black; -} diff --git a/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.ts b/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.ts new file mode 100644 index 000000000..c87363a82 --- /dev/null +++ b/apps/red-ui/src/app/modules/account/base-account-screen/base-account-screen-component.ts @@ -0,0 +1,27 @@ +import { ChangeDetectionStrategy, Component, OnInit, ViewContainerRef } from '@angular/core'; +import { Router } from '@angular/router'; +import { notificationsTranslations } from '../translations/notifications-translations'; + +@Component({ + selector: 'redaction-base-account-screen', + templateUrl: './base-account-screen-component.html', + styleUrls: ['./base-account-screen-component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class BaseAccountScreenComponent implements OnInit { + readonly translations = notificationsTranslations; + path: string; + + constructor(private readonly _router: Router, private readonly _hostRef: ViewContainerRef) { + this.path = this._router.url.split('/').pop(); + } + + ngOnInit(): void { + this._setDialogWidth(); + } + + private _setDialogWidth() { + const element = this._hostRef.element.nativeElement as HTMLElement; + element.style.setProperty('--width', this.path === 'user-profile' ? 'unset' : '100%'); + } +} diff --git a/apps/red-ui/src/app/modules/account/screens/notifications/constants.ts b/apps/red-ui/src/app/modules/account/screens/notifications/constants.ts new file mode 100644 index 000000000..9f2eb7f6b --- /dev/null +++ b/apps/red-ui/src/app/modules/account/screens/notifications/constants.ts @@ -0,0 +1,47 @@ +export const EmailNotificationScheduleTypes = { + INSTANT: 'INSTANT', + DAILY: 'DAILY', + WEEKLY: 'WEEKLY', +} as const; + +export type EmailNotificationScheduleType = keyof typeof EmailNotificationScheduleTypes; +export const EmailNotificationScheduleTypesValues = Object.values(EmailNotificationScheduleTypes); + +export const NotificationCategories = { + inAppNotifications: 'inAppNotifications', + emailNotifications: 'emailNotifications', +} as const; + +export const NotificationCategoriesValues = Object.values(NotificationCategories); + +export const OwnDossiersNotificationsTypes = { + dossierStatusChanges: 'dossierStatusChanges', + requestToJoinTheDossier: 'requestToJoinTheDossier', + documentStatusChanges: 'documentStatusChanges', + documentIsSentForApproval: 'documentIsSentForApproval', +} as const; + +export const OwnDossiersNotificationsTypesValues = Object.values(OwnDossiersNotificationsTypes); + +export const ReviewerOnDossiersNotificationsTypes = { + whenIAmAssignedOnADocument: 'whenIAmAssignedOnADocument', + whenIAmUnassignedFromADocument: 'whenIAmUnassignedFromADocument', + whenADocumentIsApproved: 'whenADocumentIsApproved', +} as const; + +export const ReviewerOnDossiersNotificationsTypesValues = Object.values(ReviewerOnDossiersNotificationsTypes); + +export const ApproverOnDossiersNotificationsTypes = { + whenADocumentIsSentForApproval: 'whenADocumentIsSentForApproval', + whenADocumentIsAssignedToAReviewer: 'whenADocumentIsAssignedToAReviewer', + whenAReviewerIsUnassignedFromADocument: 'whenAReviewerIsUnassignedFromADocument', +} as const; + +export const ApproverOnDossiersNotificationsTypesValues = Object.values(ApproverOnDossiersNotificationsTypes); + +export const NotificationGroupsKeys = ['own', 'reviewer', 'approver']; +export const NotificationGroupsValues = [ + OwnDossiersNotificationsTypesValues, + ReviewerOnDossiersNotificationsTypesValues, + ApproverOnDossiersNotificationsTypesValues, +]; diff --git a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen.component.html b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen.component.html deleted file mode 100644 index 059169d07..000000000 --- a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen.component.html +++ /dev/null @@ -1,64 +0,0 @@ -
-
- - - -
-
-
-
-
-
-
-
-
-
-
-
- {{ - translations[category] | translate - }} -
- -
-
-
- - - {{ translations[type.toLocaleLowerCase()] | translate }} -
-
- -
- -
-
-
- - {{ translations[preference] | translate }} - -
-
-
-
-
- -
- -
-
-
-
-
-
-
diff --git a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen.component.scss b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen.component.scss deleted file mode 100644 index e541ddbed..000000000 --- a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen.component.scss +++ /dev/null @@ -1,73 +0,0 @@ -@use 'variables'; -@use 'common-mixins'; - -.content-container { - background-color: variables.$grey-2; - justify-content: center; - @include common-mixins.scroll-bar; - overflow: auto; - - .dialog { - width: 100%; - min-height: unset; - - .dialog-content { - flex-direction: column; - - .header { - grid-column: span 2; - padding: 10px 10px; - margin-bottom: -1px; - border-top: 1px solid variables.$separator; - border-bottom: 1px solid variables.$separator; - } - - .options-content { - padding: 10px 48px; - - .statement { - opacity: 0.7; - color: variables.$grey-1; - font-weight: 500; - padding: 10px 0; - } - - .radio-container { - display: flex; - padding: 10px 0 10px; - .radio-button { - display: flex; - align-items: center; - padding-right: 30px; - iqser-round-checkbox { - margin-right: 8px; - } - } - } - - .group { - padding: 10px 0; - - .group-title { - color: variables.$grey-1; - font-weight: 600; - } - - .iqser-input-group { - margin-top: 5px; - } - } - } - } - } -} - -.full-height { - display: flex; - flex-direction: row; - position: absolute; - bottom: 0; - width: 100%; - height: calc(100% + 50px); - z-index: 1; -} diff --git a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.html b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.html new file mode 100644 index 000000000..8c76795dc --- /dev/null +++ b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.html @@ -0,0 +1,43 @@ +
+
+
+
+ {{ + translations[category] | translate + }} +
+ +
+
+
+ + + {{ translations[type.toLocaleLowerCase()] | translate }} +
+
+ +
+ +
+
+
+ + {{ translations[preference] | translate }} + +
+
+
+
+
+ +
+ +
+
diff --git a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.scss b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.scss new file mode 100644 index 000000000..0556bd0c0 --- /dev/null +++ b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.scss @@ -0,0 +1,51 @@ +@use 'apps/red-ui/src/assets/styles/variables'; +@use 'libs/common-ui/src/assets/styles/common-mixins'; + +.dialog-content { + flex-direction: column; + + .header { + grid-column: span 2; + padding: 10px 10px; + margin-bottom: -1px; + border-top: 1px solid variables.$separator; + border-bottom: 1px solid variables.$separator; + } + + .options-content { + padding: 10px 48px; + + .statement { + opacity: 0.7; + color: variables.$grey-1; + font-weight: 500; + padding: 10px 0; + } + + .radio-container { + display: flex; + padding: 10px 0 10px; + .radio-button { + display: flex; + align-items: center; + padding-right: 30px; + iqser-round-checkbox { + margin-right: 8px; + } + } + } + + .group { + padding: 10px 0; + + .group-title { + color: variables.$grey-1; + font-weight: 600; + } + + .iqser-input-group { + margin-top: 5px; + } + } + } +} diff --git a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen.component.ts b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.ts similarity index 64% rename from apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen.component.ts rename to apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.ts index b0ea86c3c..0c810a54e 100644 --- a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen.component.ts +++ b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.ts @@ -1,24 +1,27 @@ -import { Component, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup } from '@angular/forms'; -import { notificationsTranslations } from '../../translations/notifications-translations'; -import { NotificationPreferencesService } from '../../../../services/notification-preferences.service'; +import { notificationsTranslations } from '../../../translations/notifications-translations'; +import { NotificationPreferencesService } from '../../../services/notification-preferences.service'; import { LoadingService, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { + EmailNotificationScheduleTypesValues, + NotificationCategoriesValues, + NotificationGroupsKeys, + NotificationGroupsValues, +} from '../constants'; @Component({ selector: 'redaction-notifications-screen', templateUrl: './notifications-screen.component.html', styleUrls: ['./notifications-screen.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class NotificationsScreenComponent implements OnInit { - readonly emailNotificationTypes: string[] = ['INSTANT', 'DAILY', 'WEEKLY']; - readonly notificationCategories: string[] = ['inAppNotifications', 'emailNotifications']; - readonly notificationGroupsKeys: string[] = ['own', 'reviewer', 'approver']; - readonly notificationGroupsValues: string[][] = [ - ['dossierStatusChanges', 'requestToJoinTheDossier', 'documentStatusChanges', 'documentIsSentForApproval'], - ['whenIAmAssignedOnADocument', 'whenIAmUnassignedFromADocument', 'whenADocumentIsApproved'], - ['whenADocumentIsSentForApproval', 'whenADocumentIsAssignedToAReviewer', 'whenAReviewerIsUnassignedFromADocument'], - ]; + readonly emailNotificationScheduleTypes = EmailNotificationScheduleTypesValues; + readonly notificationCategories = NotificationCategoriesValues; + readonly notificationGroupsKeys = NotificationGroupsKeys; + readonly notificationGroupsValues = NotificationGroupsValues; readonly translations = notificationsTranslations; formGroup: FormGroup; @@ -28,7 +31,15 @@ export class NotificationsScreenComponent implements OnInit { private readonly _formBuilder: FormBuilder, private readonly _loadingService: LoadingService, private readonly _notificationPreferencesService: NotificationPreferencesService, - ) {} + ) { + this.formGroup = this._formBuilder.group({ + inAppNotificationsEnabled: [undefined], + emailNotificationsEnabled: [undefined], + emailNotificationType: [undefined], + emailNotifications: [undefined], + inAppNotifications: [undefined], + }); + } async ngOnInit(): Promise { await this._initializeForm(); @@ -75,13 +86,7 @@ export class NotificationsScreenComponent implements OnInit { this._loadingService.start(); const notificationPreferences = await this._notificationPreferencesService.getNotificationPreferences().toPromise(); - this.formGroup = this._formBuilder.group({ - inAppNotificationsEnabled: [notificationPreferences.inAppNotificationsEnabled], - emailNotificationsEnabled: [notificationPreferences.emailNotificationsEnabled], - emailNotificationType: [notificationPreferences.emailNotificationType], - emailNotifications: [notificationPreferences.emailNotifications], - inAppNotifications: [notificationPreferences.inAppNotifications], - }); + this.formGroup.patchValue(notificationPreferences); this._loadingService.stop(); } diff --git a/apps/red-ui/src/app/modules/account/screens/notifications/notifications.module.ts b/apps/red-ui/src/app/modules/account/screens/notifications/notifications.module.ts new file mode 100644 index 000000000..bc6d3f30a --- /dev/null +++ b/apps/red-ui/src/app/modules/account/screens/notifications/notifications.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { SharedModule } from '../../../shared/shared.module'; +import { NotificationsScreenComponent } from './notifications-screen/notifications-screen.component'; + +const routes = [{ path: '', component: NotificationsScreenComponent }]; + +@NgModule({ + declarations: [NotificationsScreenComponent], + imports: [RouterModule.forChild(routes), CommonModule, SharedModule], +}) +export class NotificationsModule {} diff --git a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen.component.html b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen.component.html deleted file mode 100644 index aa7945a3f..000000000 --- a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen.component.html +++ /dev/null @@ -1,62 +0,0 @@ -
-
- - - -
-
-
-
-
-
-
-
-
-
-
-
- - -
- -
- - -
- -
- - -
-
- - - - {{ translations[language] | translate }} - - -
- -
-
- -
- -
-
-
-
-
-
-
diff --git a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.html b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.html new file mode 100644 index 000000000..25d5a5a44 --- /dev/null +++ b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.html @@ -0,0 +1,37 @@ +
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+
+ + + + {{ translations[language] | translate }} + + +
+ +
+
+ +
+ +
+
diff --git a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.scss b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.scss new file mode 100644 index 000000000..e1573c569 --- /dev/null +++ b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.scss @@ -0,0 +1,3 @@ +a { + color: black; +} diff --git a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen.component.ts b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.ts similarity index 87% rename from apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen.component.ts rename to apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.ts index f43f3db3b..f1a23936a 100644 --- a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen.component.ts +++ b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile-screen/user-profile-screen.component.ts @@ -1,19 +1,20 @@ -import { Component, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { languagesTranslations } from '../../translations/languages-translations'; -import { UserService } from '../../../../services/user.service'; -import { PermissionsService } from '../../../../services/permissions.service'; -import { ConfigService } from '../../../../services/config.service'; -import { LanguageService } from '../../../../i18n/language.service'; import { DomSanitizer } from '@angular/platform-browser'; import { TranslateService } from '@ngx-translate/core'; import { LoadingService } from '@iqser/common-ui'; import { IProfile } from '@red/domain'; +import { languagesTranslations } from '../../../translations/languages-translations'; +import { PermissionsService } from '../../../../../services/permissions.service'; +import { UserService } from '../../../../../services/user.service'; +import { ConfigService } from '../../../../../services/config.service'; +import { LanguageService } from '../../../../../i18n/language.service'; @Component({ selector: 'redaction-user-profile-screen', templateUrl: './user-profile-screen.component.html', styleUrls: ['./user-profile-screen.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class UserProfileScreenComponent implements OnInit { formGroup: FormGroup; diff --git a/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile.module.ts b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile.module.ts new file mode 100644 index 000000000..928581695 --- /dev/null +++ b/apps/red-ui/src/app/modules/account/screens/user-profile/user-profile.module.ts @@ -0,0 +1,13 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { SharedModule } from '../../../shared/shared.module'; +import { UserProfileScreenComponent } from './user-profile-screen/user-profile-screen.component'; + +const routes = [{ path: '', component: UserProfileScreenComponent }]; + +@NgModule({ + declarations: [UserProfileScreenComponent], + imports: [RouterModule.forChild(routes), CommonModule, SharedModule], +}) +export class UserProfileModule {} diff --git a/apps/red-ui/src/app/services/notification-preferences.service.ts b/apps/red-ui/src/app/modules/account/services/notification-preferences.service.ts similarity index 72% rename from apps/red-ui/src/app/services/notification-preferences.service.ts rename to apps/red-ui/src/app/modules/account/services/notification-preferences.service.ts index ecd17e5ae..d4d44a9d5 100644 --- a/apps/red-ui/src/app/services/notification-preferences.service.ts +++ b/apps/red-ui/src/app/modules/account/services/notification-preferences.service.ts @@ -1,9 +1,10 @@ import { Injectable, Injector } from '@angular/core'; import { GenericService } from '@iqser/common-ui'; import { Observable, of } from 'rxjs'; -import { UserService } from './user.service'; +import { UserService } from '../../../services/user.service'; import { INotificationPreferences } from '@red/domain'; -import { catchError, map } from 'rxjs/operators'; +import { catchError } from 'rxjs/operators'; +import { EmailNotificationScheduleTypes } from '../screens/notifications/constants'; @Injectable({ providedIn: 'root', @@ -14,10 +15,7 @@ export class NotificationPreferencesService extends GenericService { - return super.get().pipe( - map(notificationPreferences => (Array.isArray(notificationPreferences) ? notificationPreferences[0] : notificationPreferences)), - catchError(() => of(this._defaultPreferences)), - ); + return super.get().pipe(catchError(() => of(this._defaultPreferences))); } updateNotificationPreferences(notificationPreferences: INotificationPreferences): Observable { @@ -26,7 +24,7 @@ export class NotificationPreferencesService extends GenericService