@@ -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; | |||||
} | |||||
} |