| @@ -1,14 +1,5 @@ | |||||
| import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||
| type Role = 'Officer'|'Investigator'|'Hod'|'Panel'|'Customer'; | |||||
| interface Notification { | |||||
| text: string, | |||||
| timeStamp: string, | |||||
| roles: Array<Role>, | |||||
| description?: string, | |||||
| redirectionUrl?: string, | |||||
| } | |||||
| import { Notification, NotificationService } from 'src/app/services/notification.service'; | |||||
| @Component({ | @Component({ | ||||
| selector: 'app-notifications', | selector: 'app-notifications', | ||||
| @@ -16,76 +7,10 @@ interface Notification { | |||||
| styleUrls: ['./notifications.component.scss'] | styleUrls: ['./notifications.component.scss'] | ||||
| }) | }) | ||||
| export class NotificationsComponent implements OnInit { | export class NotificationsComponent implements OnInit { | ||||
| loginRole: Role; | |||||
| notifications: Array<Notification> = [{ | |||||
| text: 'New name application has been submitted', | |||||
| description: 'A new Applicant in the company name Kimao has applied for an appeal', | |||||
| roles: ['Officer'], | |||||
| timeStamp: '1 hour ago', | |||||
| }, { | |||||
| text: 'Entity Corp. flagged for investigation', | |||||
| roles: ['Investigator'], | |||||
| timeStamp: '2 days ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'Request to create a panel', | |||||
| roles: ['Hod'], | |||||
| timeStamp: '1 day ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'Review non-compliance for Entity Corp.', | |||||
| roles: ['Investigator'], | |||||
| timeStamp: '4 hours ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'Concur non-compliance for Entity Corp.', | |||||
| roles: ['Panel'], | |||||
| timeStamp: '2 hours ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'Prepare preliminary letter', | |||||
| roles: ['Investigator'], | |||||
| timeStamp: '2 hours ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'Investigation complete', | |||||
| roles: ['Investigator'], | |||||
| timeStamp: '1 hours ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'New name application has been submitted', | |||||
| roles: ['Officer'], | |||||
| description: 'A new Applicant in the company name Kimao has applied for an appeal', | |||||
| timeStamp: '1 hour ago', | |||||
| }, { | |||||
| text: 'Request to create a new Committee', | |||||
| roles: ['Officer'], | |||||
| timeStamp: '2 hours ago', | |||||
| }, { | |||||
| text: 'Respond to non-compliance preliminary letter', | |||||
| roles: ['Customer'], | |||||
| timeStamp: '1 hour ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }]; | |||||
| allowedNotifications: Array<Notification> = []; | allowedNotifications: Array<Notification> = []; | ||||
| constructor() { | |||||
| const loginEmail = localStorage.getItem('loginEmail'); | |||||
| if (loginEmail && loginEmail.toLocaleLowerCase().startsWith('hod')) { | |||||
| this.loginRole = 'Hod'; | |||||
| } else if (loginEmail && loginEmail.toLocaleLowerCase().startsWith('panel')) { | |||||
| this.loginRole = 'Panel'; | |||||
| } else if (loginEmail && loginEmail.toLocaleLowerCase().startsWith('customer')) { | |||||
| this.loginRole = 'Customer'; | |||||
| } else if (loginEmail && loginEmail.toLocaleLowerCase().startsWith('investigator')) { | |||||
| this.loginRole = 'Investigator'; | |||||
| } else { | |||||
| this.loginRole = 'Officer'; | |||||
| } | |||||
| this.allowedNotifications = this.notifications.filter(notification => notification.roles.includes(this.loginRole)); | |||||
| constructor(notificationService: NotificationService) { | |||||
| this.allowedNotifications = notificationService.getAllowedNotifications(); | |||||
| } | } | ||||
| ngOnInit(): void { | ngOnInit(): void { | ||||
| @@ -17,13 +17,13 @@ | |||||
| [ngClass]="{'active' : showNotifications}"> | [ngClass]="{'active' : showNotifications}"> | ||||
| <img src="assets/icons/bell.svg" alt="bell icon"> | <img src="assets/icons/bell.svg" alt="bell icon"> | ||||
| <span class="badge"> 9+ </span> | |||||
| <span class="badge"> {{ notificationsCount }} </span> | |||||
| </button> | </button> | ||||
| <section class="profile-actions" (mouseover)="showLogout=true" (mouseout)="showLogout=false"> | <section class="profile-actions" (mouseover)="showLogout=true" (mouseout)="showLogout=false"> | ||||
| <ng-container *ngIf="!showLogout"> | <ng-container *ngIf="!showLogout"> | ||||
| <img src="assets/icons/user.svg" alt="user icon"> | <img src="assets/icons/user.svg" alt="user icon"> | ||||
| <span> Hi, Joe Ghatto </span> | |||||
| <span> Hi, {{ loginName }} </span> | |||||
| <img src="assets/icons/chevron-down.svg" alt="chevron down image"> | <img src="assets/icons/chevron-down.svg" alt="chevron down image"> | ||||
| </ng-container> | </ng-container> | ||||
| <ng-container *ngIf="showLogout"> | <ng-container *ngIf="showLogout"> | ||||
| @@ -1,4 +1,6 @@ | |||||
| import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||
| import { LoginService } from 'src/app/services/login.service'; | |||||
| import { NotificationService } from 'src/app/services/notification.service'; | |||||
| @Component({ | @Component({ | ||||
| selector: 'app-tabs', | selector: 'app-tabs', | ||||
| @@ -9,7 +11,12 @@ export class TabsComponent implements OnInit { | |||||
| showNotifications: boolean = false; | showNotifications: boolean = false; | ||||
| showLogout: boolean = false; | showLogout: boolean = false; | ||||
| constructor() { | |||||
| loginName: string = ''; | |||||
| notificationsCount: number = 0; | |||||
| constructor(loginService: LoginService, notificationService: NotificationService) { | |||||
| this.loginName = loginService.getLoginName(); | |||||
| this.notificationsCount = notificationService.getAllowedNotifications().length; | |||||
| } | } | ||||
| ngOnInit(): void { | ngOnInit(): void { | ||||
| @@ -0,0 +1,16 @@ | |||||
| import { TestBed } from '@angular/core/testing'; | |||||
| import { LoginService } from './login.service'; | |||||
| describe('LoginService', () => { | |||||
| let service: LoginService; | |||||
| beforeEach(() => { | |||||
| TestBed.configureTestingModule({}); | |||||
| service = TestBed.inject(LoginService); | |||||
| }); | |||||
| it('should be created', () => { | |||||
| expect(service).toBeTruthy(); | |||||
| }); | |||||
| }); | |||||
| @@ -0,0 +1,40 @@ | |||||
| import { Injectable } from '@angular/core'; | |||||
| export type Role = 'Officer'|'Investigator'|'Hod'|'Panel'|'Customer'; | |||||
| @Injectable({ | |||||
| providedIn: 'root' | |||||
| }) | |||||
| export class LoginService { | |||||
| private loginRole: Role; | |||||
| constructor() { | |||||
| const loginEmail = localStorage.getItem('loginEmail'); | |||||
| if (loginEmail && loginEmail.toLocaleLowerCase().startsWith('hod')) { | |||||
| this.loginRole = 'Hod'; | |||||
| } else if (loginEmail && loginEmail.toLocaleLowerCase().startsWith('panel')) { | |||||
| this.loginRole = 'Panel'; | |||||
| } else if (loginEmail && loginEmail.toLocaleLowerCase().startsWith('customer')) { | |||||
| this.loginRole = 'Customer'; | |||||
| } else if (loginEmail && loginEmail.toLocaleLowerCase().startsWith('investigator')) { | |||||
| this.loginRole = 'Investigator'; | |||||
| } else { | |||||
| this.loginRole = 'Officer'; | |||||
| } | |||||
| } | |||||
| getLoginName() { | |||||
| const loginEmail = localStorage.getItem('loginEmail'); | |||||
| if (loginEmail && loginEmail.includes('@')) { | |||||
| const name = loginEmail.substring(0, loginEmail.indexOf('@')); | |||||
| return name[0].toUpperCase() + name.substring(1); | |||||
| } else { | |||||
| return 'Joe Ghatto'; | |||||
| } | |||||
| } | |||||
| getLoginRole() { | |||||
| return this.loginRole; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,16 @@ | |||||
| import { TestBed } from '@angular/core/testing'; | |||||
| import { NotificationService } from './notification.service'; | |||||
| describe('NotificationService', () => { | |||||
| let service: NotificationService; | |||||
| beforeEach(() => { | |||||
| TestBed.configureTestingModule({}); | |||||
| service = TestBed.inject(NotificationService); | |||||
| }); | |||||
| it('should be created', () => { | |||||
| expect(service).toBeTruthy(); | |||||
| }); | |||||
| }); | |||||
| @@ -0,0 +1,78 @@ | |||||
| import { Injectable } from '@angular/core'; | |||||
| import { LoginService, Role } from './login.service'; | |||||
| export interface Notification { | |||||
| text: string, | |||||
| timeStamp: string, | |||||
| roles: Array<Role>, | |||||
| description?: string, | |||||
| redirectionUrl?: string, | |||||
| } | |||||
| @Injectable({ | |||||
| providedIn: 'root' | |||||
| }) | |||||
| export class NotificationService { | |||||
| private notifications: Array<Notification> = [{ | |||||
| text: 'New name application has been submitted', | |||||
| description: 'A new Applicant in the company name Kimao has applied for an appeal', | |||||
| roles: ['Officer'], | |||||
| timeStamp: '1 hour ago', | |||||
| }, { | |||||
| text: 'Entity Corp. flagged for investigation', | |||||
| roles: ['Investigator'], | |||||
| timeStamp: '2 days ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'Request to create a panel', | |||||
| roles: ['Hod'], | |||||
| timeStamp: '1 day ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'Review non-compliance for Entity Corp.', | |||||
| roles: ['Investigator'], | |||||
| timeStamp: '4 hours ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'Concur non-compliance for Entity Corp.', | |||||
| roles: ['Panel'], | |||||
| timeStamp: '2 hours ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'Prepare preliminary letter', | |||||
| roles: ['Investigator'], | |||||
| timeStamp: '2 hours ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'Investigation complete', | |||||
| roles: ['Investigator'], | |||||
| timeStamp: '1 hours ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }, { | |||||
| text: 'New name application has been submitted', | |||||
| roles: ['Officer'], | |||||
| description: 'A new Applicant in the company name Kimao has applied for an appeal', | |||||
| timeStamp: '1 hour ago', | |||||
| }, { | |||||
| text: 'Request to create a new Committee', | |||||
| roles: ['Officer'], | |||||
| timeStamp: '2 hours ago', | |||||
| }, { | |||||
| text: 'Respond to non-compliance preliminary letter', | |||||
| roles: ['Customer'], | |||||
| timeStamp: '1 hour ago', | |||||
| redirectionUrl: '/tabs/investigate-business-entities-and-individuals', | |||||
| }]; | |||||
| private allowedNotifications: Array<Notification> = []; | |||||
| constructor(loginService: LoginService) { | |||||
| const loginRole = loginService.getLoginRole(); | |||||
| this.allowedNotifications = this.notifications.filter(notification => notification.roles.includes(loginRole)); | |||||
| } | |||||
| getAllowedNotifications() { | |||||
| return this.allowedNotifications; | |||||
| } | |||||
| } | |||||