Merge branch 'DEVELOP_FE' of ssh://git.eclipse.org/gitroot/elogbook/elogbookFE into DEVELOP_FE_MESSAGE_BANNER_REFAC
# Conflicts:
# src/app/app.component.ts
# src/app/app.module.ts
# src/app/services/base-http.service.ts
# src/app/services/import.service.ts
diff --git a/src/app/app.component.html b/src/app/app.component.html
index a955391..9fe58de 100644
--- a/src/app/app.component.html
+++ b/src/app/app.component.html
@@ -1,6 +1,3 @@
-<app-main-navigation *ngIf="router.url !== '/login'">
-
-</app-main-navigation>
-<router-outlet>
-
-</router-outlet>
\ No newline at end of file
+<app-main-navigation *ngIf="router.url !== '/login'"></app-main-navigation>
+<app-message-banner *ngIf="router.url !== '/login'" ></app-message-banner>
+<router-outlet></router-outlet>
\ No newline at end of file
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index a1ef894..d4c2335 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -11,7 +11,10 @@
import { BaseDataLoaderService } from './services/jobs/base-data-loader.service';
import { ReminderCallerJobService } from './services/jobs/reminder-caller-job.service';
import { ImportFileCallerService } from './services/jobs/import-file-caller.service';
+import { HttpResponseInterceptorService } from './services/http-response-interceptor.service';
+import { BannerMessage } from './common/banner-message';
+import { BannerMessageStatusEn } from './common/enums';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
@@ -20,9 +23,11 @@
export class AppComponent implements OnInit {
title = 'app works!';
+ private bannerMessageStatus = BannerMessageStatusEn;
constructor(private http: Http, public router: Router,
public baseDataLoader: BaseDataLoaderService,
+ public httpInterceptor: HttpResponseInterceptorService,
private sessionContext: SessionContext,
public reminderCallerJobService: ReminderCallerJobService,
public importFileCallerService: ImportFileCallerService) {
@@ -46,8 +51,7 @@
return '';
};
- */
- }
+*/ }
private onRcFromHttpService(rc: number): void {
if (rc === 401) {
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 397b168..1cc3e9f 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -56,7 +56,8 @@
import { LoadingSpinnerComponent } from './dialogs/loading-spinner/loading-spinner.component';
import { SortingComponent } from './lists/sorting/sorting.component';
import { ImportService } from './services/import.service';
-import { FileImportComponent } from './dialogs/file-import/file-import.component';
+import { FileImportComponent } from './dialogs/file-import/file-import.component';import { HttpResponseInterceptorService } from './services/http-response-interceptor.service';
+import { MessageBannerComponent } from './common-components/message-banner/message-banner.component';
@NgModule({
declarations: [
@@ -85,13 +86,14 @@
AutocompleteComponent,
MainNavigationComponent,
ReminderComponent,
- ShiftChangeOverviewComponent ,
+ ShiftChangeOverviewComponent,
HistoricalShiftChangesComponent,
CurrentRemindersComponent,
FilterComponent,
LoadingSpinnerComponent,
SortingComponent,
- FileImportComponent
+ FileImportComponent,
+ MessageBannerComponent
],
imports: [
BrowserAnimationsModule,
@@ -128,8 +130,8 @@
ImportFileCallerService,
MessageService,
BaseDataLoaderService,
- ImportService
- ],
+ ImportService,
+ HttpResponseInterceptorService ],
bootstrap: [AppComponent]
})
export class AppModule { }
diff --git a/src/app/common-components/autocomplete/autocomplete.component.spec.ts b/src/app/common-components/autocomplete/autocomplete.component.spec.ts
index 170a0be..82c1b93 100644
--- a/src/app/common-components/autocomplete/autocomplete.component.spec.ts
+++ b/src/app/common-components/autocomplete/autocomplete.component.spec.ts
@@ -6,6 +6,7 @@
import { By } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { click, focus, newEvent, pressKey } from '../../testing/index';
+import { MessageService } from '../../services/message.service';
describe('AutocompleteComponent', () => {
let component: AutocompleteComponent;
@@ -19,14 +20,18 @@
}
}
let mockService;
+ let messageService;
beforeEach(async(() => {
mockService = new MockBtbService();
+ messageService = new MessageService();
TestBed.configureTestingModule({
imports: [FormsModule],
declarations: [AutocompleteComponent],
- providers: [{ provide: NotificationService, useValue: mockService }]
+ providers: [
+ { provide: NotificationService, useValue: mockService },
+ { provide: MessageService, useValue: messageService }]
})
.compileComponents();
}));
@@ -65,7 +70,7 @@
}));
- it('test2.1: should call setAssignedUserSuggestion on focus an return an error', async(() => {
+ it('test2.1: should call setAssignedUserSuggestion on focus and return an error', async(() => {
spyOn(component, 'createItemList').and.callThrough();
const userSuggestionsList = ['User1', 'TestUser1', 'TestUser2', 'User2', 'User3'];
mockService.error = 'MOCKERROR';
diff --git a/src/app/common-components/autocomplete/autocomplete.component.ts b/src/app/common-components/autocomplete/autocomplete.component.ts
index dd56355..2f3b9d4 100644
--- a/src/app/common-components/autocomplete/autocomplete.component.ts
+++ b/src/app/common-components/autocomplete/autocomplete.component.ts
@@ -1,6 +1,7 @@
import { Component, OnInit, ElementRef, EventEmitter, Input, Output, HostListener } from '@angular/core';
import { NotificationService } from '../../services/notification.service';
-import { BannerMessageStatusEn } from '../../common/enums';
+import { BannerMessageStatusEn, ErrorType } from '../../common/enums';
+import { MessageService, MessageDefines } from '../../services/message.service';
@Component({
selector: 'app-autocomplete',
@@ -20,6 +21,7 @@
position: number = -1;
constructor(autoCompleteElement: ElementRef,
+ private messageService: MessageService,
private notificationService: NotificationService) {
this.elementRef = autoCompleteElement;
}
@@ -37,7 +39,9 @@
this.inputElementList = res;
this.createItemList();
},
- error => { console.log(error); }
+ error => {
+ this.messageService.emitError('Benutzervoschlag', ErrorType.retrieve);
+ }
);
}
diff --git a/src/app/common-components/main-navigation/main-navigation.component.spec.ts b/src/app/common-components/main-navigation/main-navigation.component.spec.ts
index 88660db..678a533 100644
--- a/src/app/common-components/main-navigation/main-navigation.component.spec.ts
+++ b/src/app/common-components/main-navigation/main-navigation.component.spec.ts
@@ -66,8 +66,9 @@
expect(routerStub.navigate).toHaveBeenCalledWith(['/overview']);
});
- xit('should open the filter on click on the filter button', () => {
+ it('should open the filter on click on the filter button', () => {
//WIP
+ /*
component.goToOverview();
fixture.detectChanges(); // update view with array
@@ -76,6 +77,7 @@
const des = fixture.debugElement.queryAll(By.css('button'));
click(des[0]);
});
+ */
});
it('should navigate to search on search-button click', () => {
diff --git a/src/app/common-components/message-banner/message-banner.component.css b/src/app/common-components/message-banner/message-banner.component.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/app/common-components/message-banner/message-banner.component.css
diff --git a/src/app/common-components/message-banner/message-banner.component.html b/src/app/common-components/message-banner/message-banner.component.html
new file mode 100644
index 0000000..e331543
--- /dev/null
+++ b/src/app/common-components/message-banner/message-banner.component.html
@@ -0,0 +1,10 @@
+<div style="width:100%;">
+ <div style="margin: 36px 10px 0px 10px;" *ngIf="sessionContext.bannerMessage.isActive" [ngClass]="{'alert':true,
+ 'alert-danger':sessionContext.bannerMessage.status===bannerMessageStatus.error,
+ 'alert-info':sessionContext.bannerMessage.status===bannerMessageStatus.info,
+ 'alert-warning':sessionContext.bannerMessage.status===bannerMessageStatus.warning,
+ 'alert-success':sessionContext.bannerMessage.status===bannerMessageStatus.success}">
+ <div class="close" (click)="sessionContext.bannerMessage.hide()">x</div>
+ {{sessionContext.bannerMessage.text}}
+ </div>
+</div>
\ No newline at end of file
diff --git a/src/app/common-components/message-banner/message-banner.component.spec.ts b/src/app/common-components/message-banner/message-banner.component.spec.ts
new file mode 100644
index 0000000..4046152
--- /dev/null
+++ b/src/app/common-components/message-banner/message-banner.component.spec.ts
@@ -0,0 +1,25 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { MessageBannerComponent } from './message-banner.component';
+
+describe('MessageBannerComponent', () => {
+ let component: MessageBannerComponent;
+ let fixture: ComponentFixture<MessageBannerComponent>;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ declarations: [ MessageBannerComponent ]
+ })
+ .compileComponents();
+ }));
+
+ beforeEach(() => {
+ fixture = TestBed.createComponent(MessageBannerComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ // it('should be created', () => {
+ // expect(component).toBeTruthy();
+ // });
+});
diff --git a/src/app/common-components/message-banner/message-banner.component.ts b/src/app/common-components/message-banner/message-banner.component.ts
new file mode 100644
index 0000000..1f4f1c5
--- /dev/null
+++ b/src/app/common-components/message-banner/message-banner.component.ts
@@ -0,0 +1,22 @@
+import { Component, OnInit, Input } from '@angular/core';
+import { BannerMessageStatusEn } from '../../common/enums';
+import { SessionContext } from '../../common/session-context';
+
+@Component({
+ selector: 'app-message-banner',
+ templateUrl: './message-banner.component.html',
+ styleUrls: ['./message-banner.component.css']
+})
+export class MessageBannerComponent implements OnInit {
+
+
+
+ bannerMessageStatus = BannerMessageStatusEn;
+
+
+ constructor(public sessionContext: SessionContext) { }
+
+ ngOnInit() {
+ }
+
+}
diff --git a/src/app/common/banner-message.ts b/src/app/common/banner-message.ts
index 498388d..d2bce32 100644
--- a/src/app/common/banner-message.ts
+++ b/src/app/common/banner-message.ts
@@ -1,9 +1,11 @@
import { Component, Optional, OnInit } from '@angular/core';
+import { ErrorType } from '../common/enums';
export class BannerMessage {
status: number;
text: string;
isActive = false;
+ errorType: ErrorType ;
public hide() {
- this.isActive = false;
+ this.isActive = false;
}
}
\ No newline at end of file
diff --git a/src/app/common/enums.ts b/src/app/common/enums.ts
index 17fb751..52fec04 100644
--- a/src/app/common/enums.ts
+++ b/src/app/common/enums.ts
@@ -5,9 +5,16 @@
closed = 4
}
+export enum ErrorType {
+ create = 1,
+ update = 2,
+ delete = 3,
+ retrieve = 4,
+ authentication = 5
+}
export enum BannerMessageStatusEn {
warning = 1,
success = 2,
error = 3,
info = 4
-}
+}
\ No newline at end of file
diff --git a/src/app/common/session-context.ts b/src/app/common/session-context.ts
index f84b2df..3aac155 100644
--- a/src/app/common/session-context.ts
+++ b/src/app/common/session-context.ts
@@ -34,7 +34,11 @@
getCurrSessionId(): string { return localStorage.getItem(Globals.LOCALSTORAGE_SESSION_ID); }
setCurrSessionId(sid: string): void { localStorage.setItem(Globals.LOCALSTORAGE_SESSION_ID, sid); }
+ initBannerMessage(){
+ this.bannerMessage = new BannerMessage();
+ }
clearStorage() {
+ this.initBannerMessage();
localStorage.clear();
}
diff --git a/src/app/dialogs/entry/entry.component.spec.ts b/src/app/dialogs/entry/entry.component.spec.ts
index d0cf9b6..45e4b56 100644
--- a/src/app/dialogs/entry/entry.component.spec.ts
+++ b/src/app/dialogs/entry/entry.component.spec.ts
@@ -26,9 +26,10 @@
import { FILTER_MATRIX_UNIQUE_BRANCH } from '../../test-data/filter-matrix';
import { FILTER_MATRIX_UNIQUE_GRIDTERRITORY } from '../../test-data/filter-matrix';
+import { MessageService } from '../../services/message.service';
describe('EntryComponent', () => {
- let component: EntryComponent;
- let fixture: ComponentFixture<EntryComponent>;
+let component: EntryComponent;
+let fixture: ComponentFixture<EntryComponent>;
let sessionContext: SessionContext;
class MockDialogRef extends AbstractMockObservableService {
@@ -52,8 +53,10 @@
}
}
let mockNotificationService;
+ let messageService;
beforeEach(async(() => {
+ messageService = new MessageService();
sessionContext = new SessionContext();
sessionContext.setBranches(BRANCHES);
sessionContext.setGridTerritories(GRIDTERRITORIES);
@@ -77,6 +80,7 @@
{ provide: MdDialogRef, useClass: MockDialogRef },
{ provide: NotificationService, useValue: mockNotificationService },
{ provide: SessionContext, useClass: SessionContext },
+ { provide: MessageService, useValue: messageService },
DaterangepickerConfig,
Daterangepicker
]
@@ -96,69 +100,69 @@
component.gridTerritories = GRIDTERRITORIES;
});
- it('should change the Version and set the according notification', async(() => {
+ it('should change the Version and set the according notification', async(() => {
component.notificationVersions = NOTIFICATION_VERSIONS;
component.notification = NOTIFICATION_VERSIONS[0];
component.isReadOnlyDialog = true;
fixture.detectChanges();
fixture.whenStable().then(() => {
- fixture.detectChanges();
- const select = fixture.debugElement.query(By.css('select[name=notificationSelection]'));
- select.nativeElement.value = '3';
+ fixture.detectChanges();
+ const select = fixture.debugElement.query(By.css('select[name=notificationSelection]'));
+ select.nativeElement.value = '3';
select.nativeElement.dispatchEvent(newEvent('change'));
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
- expect(component.notification.version).toBe(NOTIFICATION_VERSIONS[2].version);
+ expect(component.notification.version).toBe(NOTIFICATION_VERSIONS[2].version);
});
- });
+ });
}));
- it('should call statusChanged on changing the status (inWork)', async(() => {
+ it('should call statusChanged on changing the status (inWork)', async(() => {
spyOn(component, 'statusChanged').and.callThrough();
component.sessionContext.setStatuses(STATUSES);
- const currNotification: Notification = NOTIFICATION_VERSIONS[0];
- component.notification = currNotification;
+ const currNotification: Notification = NOTIFICATION_VERSIONS[0];
+ component.notification = currNotification;
fixture.detectChanges();
fixture.whenStable().then(() => {
- expect(component.notification.fkRefNotificationStatus).toBe(NOTIFICATION_VERSIONS[0].fkRefNotificationStatus);
-
- const select = fixture.debugElement.query(By.css('select[name=statusSelection]'));
+ expect(component.notification.fkRefNotificationStatus).toBe(NOTIFICATION_VERSIONS[0].fkRefNotificationStatus);
+
+ const select = fixture.debugElement.query(By.css('select[name=statusSelection]'));
select.nativeElement.value = StatusEn.inWork;
select.nativeElement.dispatchEvent(newEvent('change'));
fixture.detectChanges();
fixture.whenStable().then(() => {
- expect(component.statusChanged).toHaveBeenCalledWith(StatusEn.inWork.toString(), currNotification);
+ expect(component.statusChanged).toHaveBeenCalledWith(StatusEn.inWork.toString(), currNotification);
});
- });
+ });
}));
- it('should call statusChanged on changing the status (done)', async(() => {
+ it('should call statusChanged on changing the status (done)', async(() => {
spyOn(component, 'statusChanged').and.callThrough();
component.sessionContext.setStatuses(STATUSES);
- const currNotification: Notification = NOTIFICATION_VERSIONS[0];
- component.notification = currNotification;
+ const currNotification: Notification = NOTIFICATION_VERSIONS[0];
+ component.notification = currNotification;
fixture.detectChanges();
fixture.whenStable().then(() => {
- expect(component.notification.fkRefNotificationStatus).toBe(NOTIFICATION_VERSIONS[0].fkRefNotificationStatus);
-
- const select = fixture.debugElement.query(By.css('select[name=statusSelection]'));
+ expect(component.notification.fkRefNotificationStatus).toBe(NOTIFICATION_VERSIONS[0].fkRefNotificationStatus);
+
+ const select = fixture.debugElement.query(By.css('select[name=statusSelection]'));
select.nativeElement.value = StatusEn.done;
select.nativeElement.dispatchEvent(newEvent('change'));
fixture.detectChanges();
fixture.whenStable().then(() => {
- expect(component.statusChanged).toHaveBeenCalledWith(StatusEn.done.toString(), currNotification);
+ expect(component.statusChanged).toHaveBeenCalledWith(StatusEn.done.toString(), currNotification);
});
- });
+ });
}));
it('should call setNotification service methode and return an error', async(() => {
@@ -252,12 +256,15 @@
}));
it('should call add on click button "Hinzufügen" and return an error', async(() => {
+ let hasBeenCalled = false;
spyOn(component, 'add').and.callThrough();
component.isInstructionDialog = true;
mockNotificationService.error = 'ADD_CLICK_ERROR';
component.notification.notificationText = 'TestContentChanged';
component.notification.fkRefNotificationStatus = 1;
+
+ messageService.errorOccured$.subscribe( msg => hasBeenCalled = true);
fixture.detectChanges();
const de = fixture.debugElement.query(By.css('.btn-success'));
@@ -265,7 +272,7 @@
fixture.whenStable().then(() => {
expect(component.add).toHaveBeenCalled();
- expect(component.sessionContext.bannerMessage.text).toEqual('Fehler bei der Erstellung eines Eintrags.');
+ expect(hasBeenCalled).toBeTruthy();
});
}));
@@ -289,6 +296,7 @@
}));
it('should call edit on click button "Ändern" and return an error', async(() => {
+ let hasBeenCalled = false;
spyOn(component, 'edit').and.callThrough();
component.isInstructionDialog = true;
component.isEditDialog = true;
@@ -296,6 +304,7 @@
component.notification.notificationText = 'TestContentChanged';
component.notification.fkRefNotificationStatus = 1;
+ messageService.errorOccured$.subscribe( msg => hasBeenCalled = true);
fixture.detectChanges();
const de = fixture.debugElement.query(By.css('.btn-success'));
@@ -303,7 +312,7 @@
fixture.whenStable().then(() => {
expect(component.edit).toHaveBeenCalled();
- expect(component.sessionContext.bannerMessage.text).toEqual('Fehler beim Ändern eines Eintrags.');
+ expect(hasBeenCalled).toBeTruthy();
});
}));
@@ -325,7 +334,7 @@
returnBranchName = component.getUniqueBranchNameForUser(FILTER_MATRIX_NONE_SELECTED.responsibilityContainerMatrix, 'max');
expect(returnBranchName).toBe('');
- });
+});
it('should return a branch name for a given user if it is unique', () => {
component.sessionContext.setGridTerritories(GRIDTERRITORIES);
diff --git a/src/app/dialogs/entry/entry.component.ts b/src/app/dialogs/entry/entry.component.ts
index 241bf88..b7fd69d 100644
--- a/src/app/dialogs/entry/entry.component.ts
+++ b/src/app/dialogs/entry/entry.component.ts
@@ -12,9 +12,9 @@
import { AbstractListComponent } from '../../lists/abstract-list/abstract-list.component';
import { SessionContext } from '../../common/session-context';
import { BannerMessage } from '../../common/banner-message';
-import { StatusEn, BannerMessageStatusEn } from '../../common/enums';
+import { StatusEn, BannerMessageStatusEn,ErrorType } from '../../common/enums';
import { FormattedTimestampPipe } from '../../common-components/pipes/formatted-timestamp.pipe';
-
+import { MessageService } from '../../services/message.service';
@Component({
selector: 'app-entry',
templateUrl: './entry.component.html',
@@ -41,7 +41,8 @@
public dialogRef: MdDialogRef<EntryComponent>,
private daterangepickerConfig: DaterangepickerConfig,
private notificationService: NotificationService,
- public sessionContext: SessionContext) {
+ public sessionContext: SessionContext,
+ private messageService: MessageService) {
}
ngOnInit() {
@@ -112,10 +113,7 @@
this.notificationService.getNotificationVersions(notification.incidentId).subscribe(notes => this.notificationVersions = notes,
error => {
- this.sessionContext.setBannerMessage(
- BannerMessageStatusEn.error,
- 'Fehler beim Lesen der Versionen von der Datenbank.',
- true);
+ this.messageService.emitError('Versionen', ErrorType.retrieve);
this.dialogRef.close();
}
);
@@ -128,10 +126,7 @@
this.notificationService.updateNotification(notificationClone).subscribe(result => this.dialogRef.close(),
error => {
- this.sessionContext.setBannerMessage(
- BannerMessageStatusEn.error,
- 'Fehler beim Ändern eines Eintrags.',
- true);
+ this.messageService.emitError('Eintrag', ErrorType.update);
this.dialogRef.close();
});
}
@@ -141,10 +136,7 @@
this.notification.adminFlag = adminFlag;
this.notificationService.createNotification(this.notification).subscribe(result => this.dialogRef.close(),
error => {
- this.sessionContext.setBannerMessage(
- BannerMessageStatusEn.error,
- 'Fehler bei der Erstellung eines Eintrags.',
- true);
+ this.messageService.emitError('Eintrags', ErrorType.create);
this.dialogRef.close();
});
}
diff --git a/src/app/dialogs/responsibility/responsibility.component.html b/src/app/dialogs/responsibility/responsibility.component.html
index 002fa9b..692f0d8 100644
--- a/src/app/dialogs/responsibility/responsibility.component.html
+++ b/src/app/dialogs/responsibility/responsibility.component.html
@@ -4,16 +4,7 @@
Zuständigkeit
</h4>
</div>
- <div style="width:100%;">
- <div *ngIf="bannerMessage.isActive" [ngClass]="{'alert':true,
- 'alert-danger':bannerMessage.status===bannerMessageStatus.error,
- 'alert-info':bannerMessage.status===bannerMessageStatus.info,
- 'alert-warning':bannerMessage.status===bannerMessageStatus.warning,
- 'alert-success':bannerMessage.status===bannerMessageStatus.success}">
- <div class="close" (click)="bannerMessage.hide()">x</div>
- {{bannerMessage.text}}
- </div>
- </div>
+
<div class="panel-body">
<table class="table table-bordered responsibility-column-striped">
<thead>
diff --git a/src/app/dialogs/responsibility/responsibility.component.spec.ts b/src/app/dialogs/responsibility/responsibility.component.spec.ts
index 803a6f2..cfbf3cc 100644
--- a/src/app/dialogs/responsibility/responsibility.component.spec.ts
+++ b/src/app/dialogs/responsibility/responsibility.component.spec.ts
@@ -24,7 +24,7 @@
import { OverviewComponent } from '../../pages/overview/overview.component';
import { MessageService } from '../../services/message.service';
import { Router } from '@angular/router';
-
+import { SessionContext } from '../../common/session-context';
let component: ResponsibilityComponent;
let responsibilityFixture: ComponentFixture<ResponsibilityComponent>;
let respPage: ResponsilityPage;
@@ -69,6 +69,7 @@
{ provide: ResponsibilityService, useValue: mockService },
{ provide: MdDialogRef, useValue: MdDialogRef },
{ provide: MessageService, useClass: MessageService },
+ { provide: SessionContext, useClass: SessionContext },
{ provide: DaterangepickerConfig, useClass: DaterangepickerConfig }
]
})
diff --git a/src/app/dialogs/responsibility/responsibility.component.ts b/src/app/dialogs/responsibility/responsibility.component.ts
index ac7d325..20b27ff 100644
--- a/src/app/dialogs/responsibility/responsibility.component.ts
+++ b/src/app/dialogs/responsibility/responsibility.component.ts
@@ -4,8 +4,9 @@
import { MessageService } from '../../services/message.service';
import { ResponsibilityService } from '../../services/responsibility.service';
import { BannerMessage } from '../../common/banner-message';
-import { BannerMessageStatusEn } from '../../common/enums';
+import { BannerMessageStatusEn, ErrorType } from '../../common/enums';
import { ShiftChangeProtocolComponent } from '../shift-change-protocol/shift-change-protocol.component';
+import { SessionContext } from '../../common/session-context';
@Component({
selector: 'app-responsibility',
@@ -21,40 +22,41 @@
@Input()
withNames = false;
- bannerMessage: BannerMessage = new BannerMessage();
bannerMessageStatus = BannerMessageStatusEn;
constructor(
@Optional() public dialogRef: MdDialogRef<ShiftChangeProtocolComponent>,
private messageService: MessageService,
+ private sessionContext: SessionContext,
private responsibilityService: ResponsibilityService
) { }
ngAfterViewInit() {
- this.responsibilitiesSelectionChanged();
+ this.responsibilitiesSelectionChanged();
}
confirm(): void {
- const self = this;
- this.responsibilityService.confirmResponsibilities(this.responsiblitySelection).subscribe(resps => setResp(resps),
+ this.responsibilityService.confirmResponsibilities(this.responsiblitySelection).subscribe((resps: TerritoryResponsibility[]) => {
+ if (resps['ret'] && resps['ret'] === 'OK') {
+ this.responsiblitySelection = [];
+ this.messageService.deactivateMessage();
+ this.dialogRef.close();
+ } else {
+ const message = 'Ihre Verantwortlichkeiten haben sich geändert. ' +
+ 'Bitte prüfen Sie Ihre Eingaben und versuchen Sie es erneut.';
+ this.messageService.emitWarning(message);
+ this.responsiblitySelection = resps;
+ }
+ },
error => {
- self.setError(error);
+ this.dialogRef.close();
+ this.messageService.emitError('Verantwortlichkeiten', ErrorType.update);
}
);
function setResp(respCs: TerritoryResponsibility[]): void {
- if (respCs['ret'] && respCs['ret'] === 'OK') {
- self.responsiblitySelection = [];
- self.dialogRef.close();
- } else {
- self.bannerMessage.isActive = true;
- self.bannerMessage.status = BannerMessageStatusEn.info;
- self.bannerMessage.text = 'Ihre Verantwortlichkeiten haben sich geändert. ' +
- 'Bitte prüfen Sie Ihre Eingaben und versuchen Sie es erneut.';
- self.responsiblitySelection = respCs;
- }
- }
+ }
}
responsibilitiesSelectionChanged() {
@@ -96,11 +98,4 @@
this.responsibilitiesSelectionChanged();
}
- private setError(errorMessage: string) {
- this.bannerMessage.isActive = true;
- this.bannerMessage.status = BannerMessageStatusEn.error;
- this.bannerMessage.text = 'Es ist ein Fehler aufgetreten. Bitte kontaktieren Sie den Administrator';
- console.log(errorMessage);
- }
-
}
diff --git a/src/app/dialogs/shift-change-protocol/shift-change-protocol.component.html b/src/app/dialogs/shift-change-protocol/shift-change-protocol.component.html
index 61c5579..6ca27fc 100644
--- a/src/app/dialogs/shift-change-protocol/shift-change-protocol.component.html
+++ b/src/app/dialogs/shift-change-protocol/shift-change-protocol.component.html
@@ -6,6 +6,7 @@
<div id="print-section" class="dialog">
<div class="panel panel-default margin-zero">
+ <app-message-banner></app-message-banner>
<div class="panel-body shift-change-protocol-panel-body">
<app-responsibility #respCompVar [responsiblitySelection]="responsibilitiesContainer"></app-responsibility>
<app-future-notifications [withCheckboxes]="true" [withEditButtons]="false" [isCollapsible]="false" [stayHidden]="false"></app-future-notifications>
@@ -17,6 +18,6 @@
<div class="margin-top">
<button class="btn btn-primary btn-sm" (click)="respCompVar.confirm()" autofocus>Übernehmen</button>
- <button class="btn btn-primary btn-sm" (click)="dialogRef.close()">Abbrechen</button>
+ <button class="btn btn-primary btn-sm" (click)="close()">Abbrechen</button>
<button class="btn btn-primary btn-sm pull-right" (click)="print()">Drucken</button>
</div>
\ No newline at end of file
diff --git a/src/app/dialogs/shift-change-protocol/shift-change-protocol.component.ts b/src/app/dialogs/shift-change-protocol/shift-change-protocol.component.ts
index b30935f..82ed5c3 100644
--- a/src/app/dialogs/shift-change-protocol/shift-change-protocol.component.ts
+++ b/src/app/dialogs/shift-change-protocol/shift-change-protocol.component.ts
@@ -5,6 +5,7 @@
import { BannerMessage } from '../../common/banner-message';
import { BannerMessageStatusEn } from '../../common/enums';
import { NotificationService } from '../../services/notification.service';
+import { MessageService } from '../../services/message.service';
@Component({
selector: 'app-shift-change-protocol',
@@ -17,12 +18,17 @@
notificationService: NotificationService;
constructor(
@Optional() public dialogRef: MdDialogRef<ShiftChangeProtocolComponent>,
- private responsibilityService: ResponsibilityService) { }
+ private responsibilityService: ResponsibilityService,
+ public messageService: MessageService) { }
setResponsibilitiesContainer(responsibilitiesContainer: TerritoryResponsibility[]) {
this.responsibilitiesContainer = responsibilitiesContainer;
}
-
+
+ close() {
+ this.dialogRef.close();
+ this.messageService.deactivateMessage();
+ }
print() {
let printContents, popupWin;
diff --git a/src/app/dialogs/shift-change/shift-change.component.spec.ts b/src/app/dialogs/shift-change/shift-change.component.spec.ts
index 80de12d..1d2a3dd 100644
--- a/src/app/dialogs/shift-change/shift-change.component.spec.ts
+++ b/src/app/dialogs/shift-change/shift-change.component.spec.ts
@@ -15,6 +15,7 @@
import { RESPONSIBILITIES } from '../../test-data/responsibilities';
import { USERS } from '../../test-data/users';
import { AngularMultiSelectComponent } from '../../common-components/multiselect-dropdown/multiselect.component';
+import { MessageService } from '../../services/message.service';
let component: ShiftChangeComponent;
let fixture: ComponentFixture<ShiftChangeComponent>;
@@ -38,11 +39,13 @@
}
let mockService: MockResponsibilityService;
let sessionContext: SessionContext;
+ let messageService: MessageService;
beforeEach(async(() => {
mockUserService = new MockUserService();
mockService = new MockResponsibilityService();
sessionContext = new SessionContext();
+ messageService = new MessageService();
TestBed.configureTestingModule({
imports: [FormsModule],
@@ -50,6 +53,7 @@
MockComponent({ selector: 'multiselect', inputs: ['data', 'settings'] })],
providers: [{ provide: UserService, useValue: mockUserService },
{ provide: ResponsibilityService, useValue: mockService },
+ { provide: MessageService, useValue: messageService },
{ provide: SessionContext, useValue: sessionContext }],
}).compileComponents();
@@ -58,6 +62,8 @@
component = fixture.componentInstance;
}));
it('should show banner info when confirmResponsibilities clicked but responsibilities changed meanwhile from other user', async(() => {
+ let hasBeenCalled = false;
+ messageService.errorOccured$.subscribe( msg => hasBeenCalled = true);
fixture.componentInstance.responsibilityContainers = RESPONSIBILITIES;
page = new Page();
page.addPageElements();
@@ -65,12 +71,8 @@
mockService.content = [];
fixture.detectChanges();
fixture.whenStable().then(() => {
- let des: DebugElement[];
fixture.detectChanges();
- des = fixture.debugElement.queryAll(By.css('.alert-info'));
-
- expect(des.length).toBe(1);
-
+ expect(hasBeenCalled).toBeTruthy();
});
});
click(page.confirmBtn);
diff --git a/src/app/dialogs/shift-change/shift-change.component.ts b/src/app/dialogs/shift-change/shift-change.component.ts
index 229dbea..534efee 100644
--- a/src/app/dialogs/shift-change/shift-change.component.ts
+++ b/src/app/dialogs/shift-change/shift-change.component.ts
@@ -6,8 +6,8 @@
import { UserService } from '../../services/user.service';
import { BannerMessage } from '../../common/banner-message';
import { User } from '../../model/user';
-import { BannerMessageStatusEn } from '../../common/enums';
-
+import { BannerMessageStatusEn, ErrorType } from '../../common/enums';
+import { MessageService, MessageDefines } from '../../services/message.service';
@Component({
selector: 'app-shift-change',
templateUrl: './shift-change.component.html',
@@ -29,6 +29,7 @@
constructor(
@Optional() public dialogRef: MdDialogRef<ShiftChangeComponent>,
private responsibilityService: ResponsibilityService,
+ private messageService:MessageService,
private userService: UserService,
private sessionContext: SessionContext) { }
@@ -121,10 +122,7 @@
const self = this;
this.responsibilityService.planResponsibilities(this.responsibilityContainers).subscribe(resps => setResp(resps),
error => {
- this.sessionContext.setBannerMessage(
- BannerMessageStatusEn.error,
- 'Fehler bei Schichtübergabe.',
- true);
+ this.messageService.emitError('Schichtübergabe', ErrorType.update);
this.dialogRef.close();
}
);
@@ -132,10 +130,9 @@
if (respCs['ret'] && respCs['ret'] === 'OK') {
self.dialogRef.close();
} else {
- self.bannerMessage.isActive = true;
- self.bannerMessage.status = BannerMessageStatusEn.info;
- self.bannerMessage.text = 'Ihre Verantwortlichkeiten haben sich geändert. ' +
+ const text = 'Ihre Verantwortlichkeiten haben sich geändert. ' +
'Bitte prüfen Sie Ihre Eingaben und versuchen Sie es erneut.';
+ self.messageService.emitInfo(text);
self.responsibilityContainers = respCs;
}
}
diff --git a/src/app/filter/filter.component.spec.ts b/src/app/filter/filter.component.spec.ts
index 99bbd9d..2aab8f7 100644
--- a/src/app/filter/filter.component.spec.ts
+++ b/src/app/filter/filter.component.spec.ts
@@ -92,7 +92,9 @@
}));
it('should show an error message on the banner when an error occurs while running "initFilterMatrixWithDefaults"', async(() => {
+ let hasBeenCalled = false;
mockService.error = 'initFilterMatrixWithDefaults_ERROR';
+ messageService.errorOccured$.subscribe( msg => hasBeenCalled = true);
fixture.detectChanges();
component.ngOnChanges({
@@ -100,7 +102,7 @@
});
fixture.whenStable().then(() => {
- expect(component.bannerMessage.text).toEqual('Es ist ein Fehler aufgetreten. Bitte kontaktieren Sie den Administrator');
+ expect(hasBeenCalled).toBeTruthy();
});
}));
diff --git a/src/app/filter/filter.component.ts b/src/app/filter/filter.component.ts
index a8045dc..cc4a49e 100644
--- a/src/app/filter/filter.component.ts
+++ b/src/app/filter/filter.component.ts
@@ -7,7 +7,7 @@
import { ResponsibilityService } from '../services/responsibility.service';
import { RESPONSIBILITIES } from '../test-data/responsibilities';
import { BannerMessage } from '../common/banner-message';
-import { BannerMessageStatusEn } from '../common/enums';
+import { BannerMessageStatusEn, ErrorType } from '../common/enums';
import { SessionContext } from '../common/session-context';
import { Notification } from '../model/notification';
import { FilterSelection } from '../model/filter-selection';
@@ -78,8 +78,7 @@
this.responsibilitiesSelectionChanged();
},
error => {
- console.log(error);
- this.setError(error);
+ this.messageService.emitError('Filtermatrix', ErrorType.retrieve);
});
}
}
@@ -119,8 +118,7 @@
this.messageService.matrixFilterChanged$.emit(filterMatrix.getNumFilterList());
},
error => {
- console.log(error);
- this.setError(error);
+ this.messageService.emitError('Filtermatrix', ErrorType.retrieve);
}
);
}
@@ -142,14 +140,7 @@
}
this.responsibilitiesSelectionChanged();
}
-
- private setError(errorMessage: string) {
- this.bannerMessage.isActive = true;
- this.bannerMessage.status = BannerMessageStatusEn.error;
- this.bannerMessage.text = 'Es ist ein Fehler aufgetreten. Bitte kontaktieren Sie den Administrator';
- console.log(errorMessage);
- }
-
+
responsibilitiesSelectionChanged() {
const filterMatrix: FilterMatrix = new FilterMatrix(this.responsibilityContainerMatrix);
this.sessionContext.setfilterMatrix(filterMatrix);
diff --git a/src/app/lists/abstract-list/abstract-list.component.spec.ts b/src/app/lists/abstract-list/abstract-list.component.spec.ts
index 3d60a0e..7c349c7 100644
--- a/src/app/lists/abstract-list/abstract-list.component.spec.ts
+++ b/src/app/lists/abstract-list/abstract-list.component.spec.ts
@@ -56,11 +56,14 @@
let sessionContext;
let mockReminderService;
let mockService;
+ let messageService;
beforeEach(async(() => {
sessionContext = new SessionContext();
mockService = new MockNotificationService();
mockReminderService = new MockReminderService();
+ messageService = new MessageService();
+
TestBed.configureTestingModule({
imports: [FormsModule],
declarations: [
@@ -71,7 +74,7 @@
MockComponent({ selector: 'input', inputs: ['options'] })
],
providers: [
- { provide: MessageService, useClass: MessageService },
+ { provide: MessageService, useValue: messageService },
{ provide: NotificationService, useValue: mockService },
{ provide: ReminderService, useValue: mockReminderService },
{ provide: SessionContext, useClass: SessionContext },
@@ -126,15 +129,16 @@
}));
it('should set error on retrieveNotificationVersions failure', async(() => {
- const anyComp: any = component;
- spyOn(anyComp, 'setError');
+ let hasBeenCalled = false;
+ messageService.errorOccured$.subscribe( msg => hasBeenCalled = true);
+
mockService.error = 'VERSION_ERROR';
component.retrieveNotificationVersions(DUMMY_NOTIFICATION);
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
+ expect(hasBeenCalled).toBeTruthy();
- expect(anyComp.setError).toHaveBeenCalled();
});
}));
diff --git a/src/app/lists/abstract-list/abstract-list.component.ts b/src/app/lists/abstract-list/abstract-list.component.ts
index 3238750..77f1e60 100644
--- a/src/app/lists/abstract-list/abstract-list.component.ts
+++ b/src/app/lists/abstract-list/abstract-list.component.ts
@@ -6,7 +6,7 @@
import { SessionContext } from '../../common/session-context';
import { DaterangepickerConfig } from 'ng2-daterangepicker';
import { Router } from '@angular/router';
-import { StatusEn } from '../../common/enums';
+import { StatusEn, BannerMessageStatusEn, ErrorType } from '../../common/enums';
import { Globals } from '../../common/globals';
import { TerritoryResponsibility } from '../../model/territory-responsibility';
import { NotificationSearchFilter } from '../../model/notification-search-filter';
@@ -15,7 +15,7 @@
import { ResponsibilityService } from '../../services/responsibility.service';
import { User } from '../../model/user';
import { MessageService, MessageDefines } from '../../services/message.service';
-
+import { BannerMessage } from '../../common/banner-message';
declare var $: any;
declare var toastr: any;
@@ -37,7 +37,7 @@
@Input() withDatePicker = true;
@Input() withEditButtons = true;
@Input() isCollapsible = true;
- @Input() stayHidden = true;
+ @Input() stayHidden = true;
@Input() gridId: string;
showSpinner = false;
globals = Globals;
@@ -91,7 +91,7 @@
if (oldStayHiddenVal != null) {
this.stayHidden = oldStayHiddenVal;
}
-
+
//Subscriptions
let subscription: any;
this.subscriptions = new Array<any>();
@@ -110,7 +110,7 @@
this.subscriptions.push(subscription);
subscription = this.reminderService.itemChanged$.subscribe(item => this.onItemChanged(item));
- this.subscriptions.push(subscription);
+ this.subscriptions.push(subscription);
//Daterangepicker Config
this.daterangepickerConfig.settings = {
@@ -181,8 +181,7 @@
newNotificationsVersions.filter(notificationsVersion => notificationsVersion.id !== notification.id);
}
- protected setError(showErr: boolean) {
- }
+
getNotifications(): void {
@@ -196,7 +195,7 @@
nots => this.setNotificationVersions(nots, notification),
error => {
console.log(error);
- this.setError(error);
+ this.messageService.emitError('Meldungsversionen', ErrorType.retrieve);
}
);
}
@@ -291,7 +290,7 @@
const a1 = this.getColumnValue(this.sortingState.column, a);
const b1 = this.getColumnValue(this.sortingState.column, b);
- if ( a1 == null) {
+ if (a1 == null) {
return 1 * direction;
}
if (b1 == null) {
diff --git a/src/app/lists/current-reminders/current-reminders.component.ts b/src/app/lists/current-reminders/current-reminders.component.ts
index 10c1d3a..411d03b 100644
--- a/src/app/lists/current-reminders/current-reminders.component.ts
+++ b/src/app/lists/current-reminders/current-reminders.component.ts
@@ -1,7 +1,7 @@
import { Component, OnInit } from '@angular/core';
import { AbstractListComponent } from '../abstract-list/abstract-list.component';
import { Notification } from '../../model/notification';
-import { StatusEn } from '../../common/enums';
+import { ErrorType } from '../../common/enums';
import { NotificationSearchFilter } from '../../model/notification-search-filter';
import { ReminderSearchFilter } from '../../model/reminder-search-filter';
import * as moment from 'moment';
@@ -42,7 +42,7 @@
},
error => {
console.log(error);
- this.setError(error);
+ this.messageService.emitError('Aktuelle Erinnerungen', ErrorType.retrieve);
}
);
this.showSpinner = true;
diff --git a/src/app/lists/finished-notifications/finished-notifications.component.ts b/src/app/lists/finished-notifications/finished-notifications.component.ts
index 81472c0..8fba337 100644
--- a/src/app/lists/finished-notifications/finished-notifications.component.ts
+++ b/src/app/lists/finished-notifications/finished-notifications.component.ts
@@ -1,7 +1,7 @@
import { Component } from '@angular/core';
import { AbstractListComponent } from '../abstract-list/abstract-list.component';
import { Notification } from '../../model/notification';
-import { StatusEn } from '../../common/enums';
+import { StatusEn, ErrorType } from '../../common/enums';
import { NotificationSearchFilter } from '../../model/notification-search-filter';
import * as moment from 'moment';
import { SortingComponent } from '../../lists/sorting/sorting.component';
@@ -23,7 +23,7 @@
},
error => {
console.log(error);
- this.setError(error);
+ this.messageService.emitError('Geschlossene Meldungen', ErrorType.retrieve);
});
this.showSpinner = true;
}
diff --git a/src/app/lists/future-notifications/future-notifications.component.ts b/src/app/lists/future-notifications/future-notifications.component.ts
index 9594547..2f4eae6 100644
--- a/src/app/lists/future-notifications/future-notifications.component.ts
+++ b/src/app/lists/future-notifications/future-notifications.component.ts
@@ -1,7 +1,7 @@
import { Component, Input } from '@angular/core';
import { AbstractListComponent } from '../abstract-list/abstract-list.component';
import { Notification } from '../../model/notification';
-import { StatusEn } from '../../common/enums';
+import { StatusEn, ErrorType } from '../../common/enums';
import { SortingComponent } from '../../lists/sorting/sorting.component';
import * as moment from 'moment';
import { DateRange } from '../../model/date-range';
@@ -23,7 +23,7 @@
},
error => {
console.log(error);
- this.setError(error);
+ this.messageService.emitError('Zukünftige Meldungen', ErrorType.retrieve);
}
);
this.showSpinner = true;
diff --git a/src/app/lists/open-notifications/open-notifications.component.ts b/src/app/lists/open-notifications/open-notifications.component.ts
index fd3f78d..40d70a1 100644
--- a/src/app/lists/open-notifications/open-notifications.component.ts
+++ b/src/app/lists/open-notifications/open-notifications.component.ts
@@ -3,7 +3,7 @@
import { StringToDatePipe } from '../../common-components/pipes/string-to-date.pipe';
import { FormattedTimestampPipe } from '../../common-components/pipes/formatted-timestamp.pipe';
import { Notification } from '../../model/notification';
-import { StatusEn } from '../../common/enums';
+import { StatusEn, ErrorType } from '../../common/enums';
import { SortingComponent } from '../../lists/sorting/sorting.component';
@@ -23,7 +23,7 @@
},
error => {
console.log(error);
- this.setError(error);
+ this.messageService.emitError('Offene Meldungen', ErrorType.retrieve);
}
);
this.showSpinner = true;
diff --git a/src/app/lists/search-result-list/search-result-list.component.ts b/src/app/lists/search-result-list/search-result-list.component.ts
index 013391e..8e2bd79 100644
--- a/src/app/lists/search-result-list/search-result-list.component.ts
+++ b/src/app/lists/search-result-list/search-result-list.component.ts
@@ -3,7 +3,7 @@
import { StringToDatePipe } from '../../common-components/pipes/string-to-date.pipe';
import { FormattedTimestampPipe } from '../../common-components/pipes/formatted-timestamp.pipe';
import { Notification } from '../../model/notification';
-import { StatusEn } from '../../common/enums';
+import { StatusEn, ErrorType } from '../../common/enums';
import { GlobalSearchFilter } from '../../model/global-search-filter';
import { MessageService, MessageDefines } from '../../services/message.service';
import { SearchResultService } from '../../services/search-result.service';
@@ -54,7 +54,7 @@
error => {
this.showSpinner = false;
console.log(error);
- this.setError(error);
+ this.messageService.emitError('Suchergebnisliste', ErrorType.retrieve);
}
);
this.showSpinner = true;
diff --git a/src/app/pages/overview/overview.component.html b/src/app/pages/overview/overview.component.html
index 586d2cd..b85e193 100644
--- a/src/app/pages/overview/overview.component.html
+++ b/src/app/pages/overview/overview.component.html
@@ -1,14 +1,8 @@
<div class="overview-body" >
<div style="min-width: 1048px; overflow: auto">
- <div *ngIf="sessionContext.bannerMessage.isActive" [ngClass]="{ 'alert':true,
- 'alert-danger': sessionContext.bannerMessage.status === bannerMessageStatus.error,
- 'alert-info': sessionContext.bannerMessage.status === bannerMessageStatus.info,
- 'alert-warning': sessionContext.bannerMessage.status === bannerMessageStatus.warning,
- 'alert-success': bannerMessageStatus.success }">
- <div class="close" (click)="sessionContext.bannerMessage.hide()">x</div>
- {{sessionContext.bannerMessage.text}}
- </div>
+
+
<div class="maincontent" *ngIf="responsiblitiesRetrieveDone">
<div class="row">
<div class="col-xs-3">
diff --git a/src/app/pages/overview/overview.component.spec.ts b/src/app/pages/overview/overview.component.spec.ts
index 0c1dd93..1c1aa32 100644
--- a/src/app/pages/overview/overview.component.spec.ts
+++ b/src/app/pages/overview/overview.component.spec.ts
@@ -34,6 +34,7 @@
import { CurrentRemindersComponent } from '../../lists/current-reminders/current-reminders.component';
import { OPEN_NOTIFICATIONS } from '../../test-data/notifications';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
+import { MessageService } from '../../services/message.service';
class FakeRouter {
navigate(commands: any[]) {
@@ -55,6 +56,7 @@
let router: Router;
let mockNotificationService: MockNotificationService;
let mockRespService: MockResponsibilityService;
+ let messageService: MessageService;
const correctUser: User = {
id: 44, username: 'carlo', password: 'serverPwd'
@@ -102,6 +104,7 @@
mockNotificationService = new MockNotificationService();
mockAuthService = new MockAuthService();
router = new FakeRouter() as any as Router;
+ messageService = new MessageService();
TestBed.overrideModule(BrowserDynamicTestingModule, {
set: {
@@ -161,7 +164,9 @@
selector: 'app-autocomplete',
inputs: ['responsibilityForwarding'],
outputs: ['responsibilityForwarding']
- })
+ }),
+ MockComponent({
+ selector: 'app-message-banner'})
],
providers: [
{ provide: NotificationService, useValue: mockNotificationService },
@@ -171,7 +176,8 @@
{ provide: SessionContext, useValue: sessionContext },
{ provide: DaterangepickerConfig, useClass: DaterangepickerConfig },
{ provide: ResponsibilityService, useValue: mockRespService },
- { provide: ReminderService, useClass: ReminderService }
+ { provide: ReminderService, useClass: ReminderService },
+ { provide: MessageService, useValue: messageService }
],
}).compileComponents();
@@ -293,7 +299,7 @@
});
}));
- it('should open a dialog to view a notification on button click', async(() => {
+ it('should open a dialog to view a notification on button click', async(() => {
let entryOpend = false;
let dialog;
diff --git a/src/app/pages/overview/overview.component.ts b/src/app/pages/overview/overview.component.ts
index dc529f4..cc4c159 100644
--- a/src/app/pages/overview/overview.component.ts
+++ b/src/app/pages/overview/overview.component.ts
@@ -13,12 +13,13 @@
import { FinishedNotificationsComponent } from '../../lists/finished-notifications/finished-notifications.component';
import { FutureNotificationsComponent } from '../../lists/future-notifications/future-notifications.component';
import { OpenNotificationsComponent } from '../../lists/open-notifications/open-notifications.component';
-import { StatusEn, BannerMessageStatusEn } from '../../common/enums';
+import { ErrorType } from '../../common/enums';
+import { StatusEn } from '../../common/enums';
import { BannerMessage } from '../../common/banner-message';
import { TerritoryResponsibility } from '../../model/territory-responsibility';
import { ResponsibilityService } from '../../services/responsibility.service';
import { FilterComponent } from '../../filter/filter.component';
-
+import { MessageService, MessageDefines } from '../../services/message.service';
import { slideInOpacity } from '../../common/router.animations';
@Component({
@@ -34,7 +35,7 @@
return '';
}
private dialogConfig = new MdDialogConfig();
- private bannerMessageStatus = BannerMessageStatusEn;
+
private notifications = null;
@@ -42,7 +43,7 @@
user: User = null;
responsiblitiesRetrieveDone = false;
- bannerMessage: BannerMessage = new BannerMessage();
+
responsibilitiesContainer: TerritoryResponsibility[];
shiftChangeClosed = false;
shiftChangeOpened = false;
@@ -51,7 +52,8 @@
constructor(
public dialog: MdDialog,
public sessionContext: SessionContext,
- private responsibilityService: ResponsibilityService
+ private responsibilityService: ResponsibilityService,
+ private messageService: MessageService
) { }
ngOnInit() {
@@ -73,14 +75,14 @@
},
error => {
console.log(error);
- this.setError(error);
+ this.messageService.emitError('Verantwortlichkeiten', ErrorType.retrieve);
this.responsiblitiesRetrieveDone = true;
});
}
},
error => {
console.log(error);
- this.setError(error);
+ this.messageService.emitError('Verantwortlichkeiten', ErrorType.retrieve);
this.responsiblitiesRetrieveDone = true;
}
);
@@ -190,10 +192,5 @@
return this.user && this.user.specialUser;
}
- private setError(errorMessage: string) {
- this.bannerMessage.isActive = true;
- this.bannerMessage.status = BannerMessageStatusEn.error;
- this.bannerMessage.text = 'Es ist ein Fehler aufgetreten. Bitte kontaktieren Sie den Administrator';
- console.log(errorMessage);
- }
+
}
diff --git a/src/app/pages/reminder/reminder.component.spec.ts b/src/app/pages/reminder/reminder.component.spec.ts
index 2fd80da..66730c0 100644
--- a/src/app/pages/reminder/reminder.component.spec.ts
+++ b/src/app/pages/reminder/reminder.component.spec.ts
@@ -185,6 +185,9 @@
MockComponent({
selector: 'app-future-notifications', inputs: [ 'responsiblitySelection',
'withCheckboxes', 'withEditButtons', 'isCollapsible', 'stayHidden']
+ }),
+ MockComponent({
+ selector: 'app-message-banner'
})
],
providers: [
@@ -241,7 +244,7 @@
});
}));
- it('should open a dialog to view a notification on button click', async(() => {
+ it('should open a dialog to view a notification on button click', async(() => {
let entryOpend = false;
let dialog;
diff --git a/src/app/pages/reminder/reminder.component.ts b/src/app/pages/reminder/reminder.component.ts
index 9ebbe68..1504b71 100644
--- a/src/app/pages/reminder/reminder.component.ts
+++ b/src/app/pages/reminder/reminder.component.ts
@@ -14,7 +14,7 @@
import { FilterComponent } from '../../filter/filter.component';
import 'rxjs/add/observable/throw';
import 'rxjs/add/observable/timer';
-import { slideInOpacity } from '../../common/router.animations';
+import { slideInOpacity } from '../../common/router.animations';
@Component({
selector: 'app-reminder',
@@ -32,7 +32,7 @@
public user: User = null;
responsiblitiesRetrieveDone = false;
public bannerMessage: BannerMessage = new BannerMessage();
- responsibilitiesContainer: TerritoryResponsibility[];
+ responsibilitiesContainer: TerritoryResponsibility[];
shiftChangeClosed = false;
shiftChangeOpened = false;
filterExpanded = false;
@@ -41,7 +41,7 @@
private router: Router,
public dialog: MdDialog,
public sessionContext: SessionContext,
- private responsibilityService: ResponsibilityService
+ private responsibilityService: ResponsibilityService
) { }
ngOnInit() {
@@ -68,12 +68,4 @@
dialogRef.afterClosed().subscribe(result => {
});
}
-
- private setError(errorMessage: string) {
- this.bannerMessage.isActive = true;
- this.bannerMessage.status = BannerMessageStatusEn.error;
- this.bannerMessage.text = 'Es ist ein Fehler aufgetreten. Bitte kontaktieren Sie den Administrator';
- console.log(errorMessage);
- }
-
- }
+}
diff --git a/src/app/pages/search/search.component.spec.ts b/src/app/pages/search/search.component.spec.ts
index cf4c789..92d7a3c 100644
--- a/src/app/pages/search/search.component.spec.ts
+++ b/src/app/pages/search/search.component.spec.ts
@@ -193,6 +193,9 @@
MockComponent({
selector: 'app-future-notifications', inputs: ['responsiblitySelection',
'withCheckboxes', 'withEditButtons', 'isCollapsible', 'stayHidden']
+ }),
+ MockComponent({
+ selector: 'app-message-banner'
})
],
providers: [
@@ -230,7 +233,6 @@
}));
it('should should navigate to Overview after click at homebbutton', (() => {
- //TODO
spyOn(component, 'goToOverview').and.callThrough();
fixture.detectChanges();
@@ -337,7 +339,6 @@
it('should call search function after search button pressed', async(() => {
spyOn(component, 'search').and.callThrough();
fixture.detectChanges();
- //buttons.forEach((button: HTMLButtonElement) => {
fixture.whenStable().then(() => {
const currentSearchFilter: GlobalSearchFilter = new GlobalSearchFilter();
currentSearchFilter.searchString = 'Test';
@@ -353,21 +354,8 @@
let de: DebugElement;
de = fixture.debugElement.queryAll(By.css('form button:not(#deletesearch)'))[1];
- //de.nativeElement.click();
click(de);
fixture.detectChanges();
- /*
- const buttons: DebugElement[] = fixture.debugElement.nativeElement.querySelectorAll('form button:not(#deletesearch');
- //const button[] = fixture.debugElement.nativeElement.querySelectorAll('form button:not(#deletesearch)');
-
- buttons[0].nativeElement.click();
- fixture.detectChanges();
- expect(component.search).toHaveBeenCalled();
-
- //console.log(buttons[1].nativeElement);
- //buttons[1].nativeElement.click();
- */
-
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(component.search).toHaveBeenCalled();
@@ -376,8 +364,5 @@
});
});
-
- //});
-
}));
});
diff --git a/src/app/pages/shift-change-overview/shift-change-overview.component.ts b/src/app/pages/shift-change-overview/shift-change-overview.component.ts
index d0fa14a..9b18592 100644
--- a/src/app/pages/shift-change-overview/shift-change-overview.component.ts
+++ b/src/app/pages/shift-change-overview/shift-change-overview.component.ts
@@ -4,6 +4,9 @@
import { ResponsibilityService } from '../../services/responsibility.service';
import { TerritoryResponsibility } from '../../model/territory-responsibility';
import { slideInOpacity } from '../../common/router.animations';
+import { BannerMessageStatusEn, ErrorType } from '../../common/enums';
+
+import { MessageService, MessageDefines } from '../../services/message.service';
@Component({
selector: 'app-shift-change-overview',
@@ -26,6 +29,7 @@
}
constructor(
+ private messageService: MessageService,
private router: Router,
public sessionContext: SessionContext,
private responsibilityService: ResponsibilityService) { }
@@ -38,7 +42,7 @@
this.responsibilitiesContainer = resp;
},
error => {
- console.log(error);
+ this.messageService.emitError('Verantwortlichkeiten', ErrorType.retrieve);
});
}
diff --git a/src/app/services/authentication.service.spec.ts b/src/app/services/authentication.service.spec.ts
index 26787a6..c64ddc3 100644
--- a/src/app/services/authentication.service.spec.ts
+++ b/src/app/services/authentication.service.spec.ts
@@ -14,21 +14,24 @@
import { User } from '../model/user';
import { SessionContext } from '../common/session-context';
import { Globals } from '../common/globals';
+import { MessageService } from '../services/message.service';
describe('Http-AuthenticationService (mockBackend)', () => {
let sessionContext: SessionContext;
-
+ let messageService: MessageService;
beforeEach( async(() => {
TestBed.configureTestingModule({
imports: [ HttpModule ],
providers: [
AuthenticationService,
{ provide: XHRBackend, useClass: MockBackend },
- SessionContext
+ SessionContext,
+ MessageService
]
})
.compileComponents();
sessionContext = new SessionContext();
+ messageService = new MessageService();
}));
it('can instantiate service when inject service',
@@ -40,7 +43,7 @@
it('can instantiate service with "new"', inject([Http], (http: Http) => {
expect(http).not.toBeNull('http should be provided');
- const service = new AuthenticationService(http, sessionContext );
+ const service = new AuthenticationService(http, messageService, sessionContext );
expect(service instanceof AuthenticationService).toBe(true, 'new service should be ok');
}));
@@ -61,7 +64,7 @@
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new AuthenticationService(http, sessionContext);
+ service = new AuthenticationService(http, messageService, sessionContext);
const successHeaders: Headers = new Headers();
successHeaders.append(Globals.SESSION_TOKEN_TAG, 'SuperVALID!');
const options = new ResponseOptions({status: 200, body: fakeUser, headers: successHeaders} );
@@ -82,7 +85,8 @@
})));
it('should treat 404 as an Observable error', async(inject([], () => {
- const resp = new Response(new ResponseOptions({status: 404}));
+ const resp = new Response(new ResponseOptions({status: 404, body: {} }));
+
backend.connections.subscribe((c: MockConnection) => c.mockRespond(resp));
service.login(fakeCreds)
diff --git a/src/app/services/authentication.service.ts b/src/app/services/authentication.service.ts
index 1621aa7..15990f8 100644
--- a/src/app/services/authentication.service.ts
+++ b/src/app/services/authentication.service.ts
@@ -9,24 +9,28 @@
import { User } from '../model/user';
import { LoginCredentials } from '../model/login-credentials';
+import { MessageService } from './message.service';
+
@Injectable()
export class AuthenticationService extends BaseHttpService {
constructor(
private _http: Http,
- private _sessionContext: SessionContext ) {
- super( );
+ public messageService: MessageService,
+ private _sessionContext: SessionContext) {
+ super(messageService);
}
public login(creds: LoginCredentials): Observable<any> {
const headers = new Headers();
- this.createCommonHeaders(headers, this._sessionContext );
+ this.createCommonHeaders(headers, this._sessionContext);
return this._http.post(super.getBaseUrl() + '/login', creds, { headers: headers })
- .map( res => {
- super.extractSessionId( res.headers, this._sessionContext);
- return super.extractData( res, this._sessionContext );
- } )
- .catch( super.handleErrorPromise );
+ .map(res => {
+ super.extractSessionId(res.headers, this._sessionContext);
+ return super.extractData(res, this._sessionContext);
+ })
+ .catch((error) => {
+ return super.handleErrorPromise(error);
+ });
}
-
}
diff --git a/src/app/services/base-data.service.spec.ts b/src/app/services/base-data.service.spec.ts
index 33c6332..3e98bf9 100644
--- a/src/app/services/base-data.service.spec.ts
+++ b/src/app/services/base-data.service.spec.ts
@@ -18,21 +18,24 @@
import { GRIDTERRITORIES } from '../test-data/gridterritories';
import { SessionContext } from '../common/session-context';
import { Globals } from '../common/globals';
+import { MessageService } from '../services/message.service';
describe('Http-BaseDataService (mockBackend)', () => {
let sessionContext: SessionContext;
-
+let messageService:MessageService;
beforeEach( async(() => {
TestBed.configureTestingModule({
imports: [ HttpModule ],
providers: [
BaseDataService,
{ provide: XHRBackend, useClass: MockBackend },
- SessionContext
+ SessionContext,
+ MessageService
]
})
.compileComponents();
sessionContext = new SessionContext();
+ messageService= new MessageService();
}));
it('can instantiate service when inject service',
@@ -42,7 +45,7 @@
it('can instantiate service with "new"', inject([Http], (http: Http) => {
expect(http).not.toBeNull('http should be provided');
- const service = new BaseDataService(http, sessionContext );
+ const service = new BaseDataService(http, messageService, sessionContext );
expect(service instanceof BaseDataService).toBe(true, 'new service should be ok');
}));
@@ -62,7 +65,7 @@
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new BaseDataService(http, sessionContext);
+ service = new BaseDataService(http, messageService, sessionContext);
fakeBranches = BRANCHES;
const options = new ResponseOptions({status: 200, body: fakeBranches});
response = new Response(options);
@@ -103,7 +106,7 @@
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new BaseDataService(http, sessionContext);
+ service = new BaseDataService(http, messageService, sessionContext);
fakeGridTerritories = GRIDTERRITORIES;
const options = new ResponseOptions({status: 200, body: fakeGridTerritories});
response = new Response(options);
@@ -144,7 +147,7 @@
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new BaseDataService(http, sessionContext);
+ service = new BaseDataService(http, messageService, sessionContext);
fakeStatuses = STATUSES;
const options = new ResponseOptions({status: 200, body: fakeStatuses});
response = new Response(options);
diff --git a/src/app/services/base-data.service.ts b/src/app/services/base-data.service.ts
index 4dac1b2..4d0a6e8 100644
--- a/src/app/services/base-data.service.ts
+++ b/src/app/services/base-data.service.ts
@@ -13,14 +13,16 @@
import { GridTerritory } from '../model/gridterritory';
// import { NotificationHistoryExpansionState } from '../model/notificationhistoryexpansionstate';
import { GRIDTERRITORIES } from '../test-data/gridterritories';
+import { MessageService } from './message.service';
@Injectable()
export class BaseDataService extends BaseHttpService {
constructor(
private _http: Http,
+ public messageService: MessageService,
private _sessionContext: SessionContext) {
- super();
+ super(messageService);
}
public getStatuses(): Observable<Status[]> {
@@ -30,7 +32,7 @@
return this._http.get(url, { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch((error) => { return super.handleErrorPromise(error); });
}
public getBranches(): Observable<Branch[]> {
@@ -40,17 +42,17 @@
return this._http.get(url, { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch((error) => { return super.handleErrorPromise(error); });
}
- public getGridTerritories(): Observable<GridTerritory[]> {
+ public getGridTerritories(): Observable<GridTerritory[]> {
const headers = new Headers();
const url = super.getBaseUrl() + '/gridTerritories/';
this.createCommonHeaders(headers, this._sessionContext);
return this._http.get(url, { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch((error) => { return super.handleErrorPromise(error); });
}
/*
public getNotificationHistoryExpansionStates(): Observable<NotificationHistoryExpansionState[]> {
@@ -59,7 +61,7 @@
this.createCommonHeaders(headers, this._sessionContext);
return this._http.get(url, { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch((error) => { return super.handleErrorPromise(error); });
}
*/
}
diff --git a/src/app/services/base-http.service.spec.ts b/src/app/services/base-http.service.spec.ts
index ac693a5..ad832df 100644
--- a/src/app/services/base-http.service.spec.ts
+++ b/src/app/services/base-http.service.spec.ts
@@ -4,12 +4,12 @@
import { BaseHttpService } from './base-http.service';
import { SessionContext } from '../common/session-context';
import { Globals } from '../common/globals';
-
+import { MessageService } from '../services/message.service';
describe('BaseHttpService', () => {
const _sc: SessionContext = new SessionContext();
class BaseHttpServiceMock extends BaseHttpService {
- public constructor( ) {
- super( );
+ public constructor( public messageService:MessageService ) {
+ super(messageService );
}
public getBaseUrl(): string {
return super.getBaseUrl();
@@ -22,7 +22,7 @@
});
it( 'should deliver the BaseUrl', () => {
- const bhs = new BaseHttpServiceMock();
+ const bhs = new BaseHttpServiceMock(this.messageService);
expect( bhs.getBaseUrl()).toBe(Globals.BASE_URL);
});
});
diff --git a/src/app/services/base-http.service.ts b/src/app/services/base-http.service.ts
index c2b954b..a166310 100644
--- a/src/app/services/base-http.service.ts
+++ b/src/app/services/base-http.service.ts
@@ -7,18 +7,21 @@
import { UUID } from 'angular2-uuid';
import { Globals } from '../common/globals';
import { SessionContext } from '../common/session-context';
+import { MessageService } from './message.service';
+import { BannerMessage } from '../common/banner-message';
+import { ErrorType } from '../common/enums';
@Injectable()
export class BaseHttpService {
- constructor( ) {
- }
+ constructor(protected messageService: MessageService) {
+ }
- protected getBaseUrl(): string {
- return Globals.BASE_URL;
- }
+ protected getBaseUrl(): string {
+ return Globals.BASE_URL;
+ }
- protected createCommonHeaders(headers: Headers, sessionContext: SessionContext) {
+ protected createCommonHeaders(headers: Headers, sessionContext: SessionContext) {
headers.append('Accept', 'application/json');
headers.append('content-Type', 'application/json');
headers.append('Access-Control-Allow-Origin', '*');
@@ -26,12 +29,12 @@
headers.set('Authorization', 'Bearer ' + sessionContext.oauthService.getAccessToken());
}
headers.append('unique-TAN', UUID.UUID());
- if ( sessionContext.getCurrSessionId() !== null ) {
+ if (sessionContext.getCurrSessionId() !== null) {
headers.append(Globals.SESSION_TOKEN_TAG, sessionContext.getCurrSessionId());
}
- }
+ }
- protected extractData(res: Response, _sessContext: SessionContext ) {
+ protected extractData(res: Response, _sessContext: SessionContext) {
// let the interested 'people' know about our result
_sessContext.centralHttpResultCode$.emit( res.status );
@@ -40,29 +43,38 @@
}
const data = res.json();
- return data || { };
+ return data || {};
}
- protected extractSessionId( headers: Headers, sessionContext: SessionContext ) {
- if ( headers != null ) {
- if ( headers.has( Globals.SESSION_TOKEN_TAG ) ) {
- sessionContext.setCurrSessionId(headers.get( Globals.SESSION_TOKEN_TAG ));
+ protected extractSessionId(headers: Headers, sessionContext: SessionContext) {
+ if (headers != null) {
+ if (headers.has(Globals.SESSION_TOKEN_TAG)) {
+ sessionContext.setCurrSessionId(headers.get(Globals.SESSION_TOKEN_TAG));
}
}
- }
+ }
- protected handleErrorPromise(error: any) {
+ protected handleErrorPromise(error: any) {
// In a real world app, we might use a remote logging infrastructure
let errMsg: string;
+ let body = null;
+
if (error instanceof Response) {
- const body = error.json() || '';
+ body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
+
+ if (body !== null && body.errorCode === 401 && this.messageService) {
+ const bannerMessage = new BannerMessage();
+ bannerMessage.errorType = ErrorType.authentication;
+ this.messageService.errorOccured$.emit(bannerMessage);
+ }
+
console.error(errMsg);
return Observable.throw(errMsg);
- }
+ }
}
diff --git a/src/app/services/http-response-interceptor.service.spec.ts b/src/app/services/http-response-interceptor.service.spec.ts
new file mode 100644
index 0000000..51715f8
--- /dev/null
+++ b/src/app/services/http-response-interceptor.service.spec.ts
@@ -0,0 +1,13 @@
+import { TestBed, inject } from '@angular/core/testing';
+
+import { HttpResponseInterceptorService } from './http-response-interceptor.service';
+
+describe('HttpResponseInterceptorService', () => {
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ providers: [HttpResponseInterceptorService]
+ });
+ });
+
+
+});
diff --git a/src/app/services/http-response-interceptor.service.ts b/src/app/services/http-response-interceptor.service.ts
new file mode 100644
index 0000000..0f83ecd
--- /dev/null
+++ b/src/app/services/http-response-interceptor.service.ts
@@ -0,0 +1,30 @@
+import { Injectable } from '@angular/core';
+import { Router } from '@angular/router';
+import { MessageService, MessageDefines } from '../services/message.service';
+import { BannerMessage } from '../common/banner-message';
+import { SessionContext } from '../common/session-context';
+import { BannerMessageStatusEn, ErrorType } from '../common/enums';
+
+@Injectable()
+export class HttpResponseInterceptorService {
+
+ constructor(
+ private messageService: MessageService,
+ private router: Router,
+ private sessionContext: SessionContext) { this.init(); }
+
+ private init(): void {
+ this.subscribeToMessageService();
+ }
+
+ private subscribeToMessageService() {
+ this.messageService.errorOccured$.subscribe((errorMessage: BannerMessage) => {
+ if ((errorMessage.errorType !== ErrorType.authentication)) {
+ this.sessionContext.bannerMessage = errorMessage;
+
+ } else {
+ this.router.navigate(['login']);
+ }
+ });
+ }
+}
diff --git a/src/app/services/import.service.spec.ts b/src/app/services/import.service.spec.ts
index 3652cf5..1ed0130 100644
--- a/src/app/services/import.service.spec.ts
+++ b/src/app/services/import.service.spec.ts
@@ -10,6 +10,7 @@
import 'rxjs/add/operator/toPromise';
import { ImportService } from './import.service';
+import { MessageService } from './message.service';
import { NotificationFileModel } from '../model/file-model';
import { SessionContext } from '../common/session-context';
import { Globals } from '../common/globals';
@@ -17,6 +18,7 @@
describe('Http-ImportService (mockBackend)', () => {
let sessionContext: SessionContext;
+ let messageService: MessageService;
beforeEach(async(() => {
TestBed.configureTestingModule({
@@ -24,7 +26,8 @@
providers: [
ImportService,
{ provide: XHRBackend, useClass: MockBackend },
- SessionContext
+ SessionContext,
+ MessageService
]
})
.compileComponents();
@@ -38,7 +41,7 @@
it('can instantiate service with "new"', inject([Http], (http: Http) => {
expect(http).not.toBeNull('http should be provided');
- const service = new ImportService(http, sessionContext);
+ const service = new ImportService(http, sessionContext, messageService);
expect(service instanceof ImportService).toBe(true, 'new service should be ok');
}));
diff --git a/src/app/services/import.service.ts b/src/app/services/import.service.ts
index dfcebee..92d08d8 100644
--- a/src/app/services/import.service.ts
+++ b/src/app/services/import.service.ts
@@ -10,25 +10,25 @@
import { SessionContext } from '../common/session-context';
import { Globals } from '../common/globals';
import { BaseHttpService } from './base-http.service';
-
+import { MessageService } from './message.service';
import { IMPORT_NOTIFICATION_FILES } from './../test-data/import-notification-files';
import { ONE_IMPORT_NOTIFICATION_FILE } from './../test-data/import-notification-files';
-
@Injectable()
export class ImportService extends BaseHttpService {
constructor(
private _http: Http,
- private _sessionContext: SessionContext) {
- super();
+ private _sessionContext: SessionContext,
+ protected messageService: MessageService) {
+ super(messageService);
}
- public getImportFiles(): Observable<NotificationFileModel[]> {
+ public getImportFiles(): Observable<NotificationFileModel[]> {
const headers = new Headers();
const url = super.getBaseUrl() + '/getImportFiles/';
this.createCommonHeaders(headers, this._sessionContext);
-
+
return this._http.get(url, { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
.catch(super.handleErrorPromise);
diff --git a/src/app/services/jobs/base-data-loader.service.ts b/src/app/services/jobs/base-data-loader.service.ts
index b2f9ff1..94291e7 100644
--- a/src/app/services/jobs/base-data-loader.service.ts
+++ b/src/app/services/jobs/base-data-loader.service.ts
@@ -7,16 +7,17 @@
@Injectable()
export class BaseDataLoaderService {
- constructor(
+ constructor(
private baseDataService: BaseDataService,
private msgService: MessageService,
private sessionContext: SessionContext
) {
- this.msgService.loginLogoff$.subscribe( msg => this.onLoginLogoff( msg ) );
+ this.msgService.loginLogoff$.subscribe(msg => this.onLoginLogoff(msg));
}
- onLoginLogoff( msg: string ): void {
- if ( msg === MessageDefines.MSG_LOG_IN_SUCCEEDED ) {
+ onLoginLogoff(msg: string): void {
+ this.sessionContext.initBannerMessage();
+ if (msg === MessageDefines.MSG_LOG_IN_SUCCEEDED) {
this.loadBaseData();
}
}
diff --git a/src/app/services/message.service.ts b/src/app/services/message.service.ts
index 2091115..acbd35f 100644
--- a/src/app/services/message.service.ts
+++ b/src/app/services/message.service.ts
@@ -1,17 +1,65 @@
import { Injectable, EventEmitter } from '@angular/core';
+import { StatusEn, BannerMessageStatusEn, ErrorType } from '../common/enums';
+
+import { BannerMessage } from '../common/banner-message';
export class MessageDefines {
- static MSG_LOG_IN_SUCCEEDED = 'LOG_IN_SUCCEEDED';
- static MSG_LOG_OFF = 'LOG_OFF';
+ static MSG_LOG_IN_SUCCEEDED = 'LOG_IN_SUCCEEDED';
+ static MSG_LOG_OFF = 'LOG_OFF';
}
-
+
@Injectable()
export class MessageService {
- public loginLogoff$: EventEmitter< string > = new EventEmitter< string >();
+ public loginLogoff$: EventEmitter<string> = new EventEmitter<string>();
- public matrixFilterChanged$: EventEmitter<Number[]> = new EventEmitter< Number[] >();
+ public matrixFilterChanged$: EventEmitter<Number[]> = new EventEmitter<Number[]>();
+ public errorOccured$: EventEmitter<BannerMessage> = new EventEmitter<BannerMessage>();
+ public emitError(location: string, errorType?: ErrorType) {
+ let message = '';
+ switch (errorType) {
+ case ErrorType.create:
+ message = 'Fehler beim Erstellen des Objekts ' + location + '. Bitte kontaktieren Sie den Administrator';
+ break;
+ case ErrorType.update:
+ message = 'Fehler beim Aktualiseren des Objekts ' + location + '. Bitte kontaktieren Sie den Administrator';
+ break;
+
+ case ErrorType.delete:
+ message = 'Fehler beim Löschen des Objekts ' + location + '. Bitte kontaktieren Sie den Administrator';
+ break;
+ case ErrorType.retrieve:
+ message = 'Fehler beim Zugriff auf ' + location + '. Bitte kontaktieren Sie den Administrator';
+
+ break;
+ default:
+ message = 'Es ist ein unbekannter Fehler aufgetreten. Bitte kontaktieren Sie den Administrator';
+ break;
+ }
+ this.emitMessage(message, BannerMessageStatusEn.error);
+ }
+
+ public emitInfo(errorMessage: string) {
+ this.emitMessage(errorMessage, BannerMessageStatusEn.info);
+ }
+
+ public emitWarning(errorMessage: string) {
+ this.emitMessage(errorMessage, BannerMessageStatusEn.warning);
+ }
+ public deactivateMessage() {
+ const bannerMessage: BannerMessage = new BannerMessage();
+ bannerMessage.isActive = false;
+ this.errorOccured$.emit(bannerMessage);
+ }
+ private emitMessage(message: string, status: BannerMessageStatusEn) {
+ const bannerMessage: BannerMessage = new BannerMessage();
+ bannerMessage.isActive = true;
+ bannerMessage.status = status;
+ bannerMessage.text = message;
+ this.errorOccured$.emit(bannerMessage);
+ console.log(message);
+ }
constructor() { }
}
diff --git a/src/app/services/notification.service.spec.ts b/src/app/services/notification.service.spec.ts
index be4d96d..1f3d96d 100644
--- a/src/app/services/notification.service.spec.ts
+++ b/src/app/services/notification.service.spec.ts
@@ -16,32 +16,34 @@
import { DUMMY_CREATED_NOTIFICATION, DUMMY_UPDATED_NOTIFICATION } from '../test-data/notifications';
import { SessionContext } from '../common/session-context';
import { Globals } from '../common/globals';
+import { MessageService } from '../services/message.service';
describe('Http-NotificationService (mockBackend)', () => {
-
+ let messageService: MessageService;
let sessionContext: SessionContext;
beforeEach(async(() => {
+ sessionContext = new SessionContext();
+ messageService = new MessageService();
TestBed.configureTestingModule({
imports: [HttpModule],
providers: [
+ { provide: MessageService, useValue: messageService },
NotificationService,
{ provide: XHRBackend, useClass: MockBackend },
- SessionContext
+
+ SessionContext,
+ MessageService
]
})
.compileComponents();
sessionContext = new SessionContext();
+
}));
- it('can instantiate service when inject service',
- inject([NotificationService], (service: NotificationService) => {
- expect(service instanceof NotificationService).toBe(true);
- }));
-
it('can instantiate service with "new"', inject([Http], (http: Http) => {
expect(http).not.toBeNull('http should be provided');
- const service = new NotificationService(http, sessionContext);
+ const service = new NotificationService(http, sessionContext, messageService);
expect(service instanceof NotificationService).toBe(true, 'new service should be ok');
}));
@@ -62,7 +64,7 @@
const fakeUpdateNotificationResps: Notification = DUMMY_UPDATED_NOTIFICATION;
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new NotificationService(http, sessionContext);
+ service = new NotificationService(http, sessionContext, messageService);
const successHeaders: Headers = new Headers();
successHeaders.append(Globals.SESSION_TOKEN_TAG, 'SuperVALID!');
const updateNotificationOptions = new ResponseOptions({ status: 200, body: fakeUpdateNotificationResps, headers: successHeaders });
@@ -135,7 +137,7 @@
}
}
- const serviceMock = new MockNotificationService(null, null);
+ const serviceMock = new MockNotificationService(null, null, messageService);
serviceMock.getAllNotifications();
expect(serviceMock.lastCall).toBe(NotificationService.ALL);
serviceMock.getCurrentNotifications();
@@ -154,10 +156,10 @@
let service: NotificationService;
let response: Response;
const fakeNotifications: Notification[] = CURRENT_NOTIFICATIONS;
- const fakeNot = fakeNotifications[0];
+ const fakeNot = fakeNotifications[0];
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new NotificationService(http, sessionContext);
+ service = new NotificationService(http, sessionContext, messageService);
const successHeaders: Headers = new Headers();
successHeaders.append(Globals.SESSION_TOKEN_TAG, 'SuperVALID!');
const options = new ResponseOptions({ status: 200, body: fakeNot, headers: successHeaders });
@@ -203,7 +205,7 @@
}
}
- const serviceMock = new MockNotificationService(null, null);
+ const serviceMock = new MockNotificationService(null, null, messageService);
serviceMock.getAllNotifications();
expect(serviceMock.lastCall).toBe(NotificationService.ALL);
serviceMock.getCurrentNotifications();
@@ -215,7 +217,7 @@
serviceMock.getFinishedNotifications(null);
expect(serviceMock.lastCall).toBe(NotificationService.FINISHED);
});
- });
+ });
describe('when getNotificationVersions()', () => {
let backend: MockBackend;
@@ -224,7 +226,7 @@
const fakeNotifications: Notification[] = CURRENT_NOTIFICATIONS;
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new NotificationService(http, sessionContext);
+ service = new NotificationService(http, sessionContext, messageService);
const successHeaders: Headers = new Headers();
successHeaders.append(Globals.SESSION_TOKEN_TAG, 'SuperVALID!');
const options = new ResponseOptions({ status: 200, body: fakeNotifications, headers: successHeaders });
@@ -261,6 +263,6 @@
})
.toPromise();
})));
- });
-
+ });
+
});
diff --git a/src/app/services/notification.service.ts b/src/app/services/notification.service.ts
index 52cc6e6..4836833 100644
--- a/src/app/services/notification.service.ts
+++ b/src/app/services/notification.service.ts
@@ -6,7 +6,7 @@
import 'rxjs/add/observable/throw';
import { NotificationSearchFilter } from '../model/notification-search-filter';
-
+import { MessageService } from './message.service';
import { SessionContext } from '../common/session-context';
import { BaseHttpService } from './base-http.service';
import { Notification } from '../model/notification';
@@ -26,9 +26,10 @@
constructor(
private _http: Http,
- private _sessionContext: SessionContext
+ private _sessionContext: SessionContext,
+ public messageService: MessageService,
) {
- super();
+ super(messageService);
this.itemAdded$ = new EventEmitter();
this.itemChanged$ = new EventEmitter();
@@ -38,10 +39,12 @@
const headers = new Headers();
const url = super.getBaseUrl() + '/notifications/' + notificationType;
const filter = notificationSearchFilter || {};
- this.createCommonHeaders(headers, this._sessionContext);
+ this.createCommonHeaders(headers, this._sessionContext);
return this._http.post(url, JSON.stringify(filter), { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch(error => {
+ return super.handleErrorPromise(error);
+ });
}
public getNotification(notificationId: number): Observable<Notification> {
@@ -50,7 +53,9 @@
this.createCommonHeaders(headers, this._sessionContext);
return this._http.get(url, { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch((error) => {
+ return super.handleErrorPromise(error);
+ });
}
public getAssignedUserSuggestions(): Observable<string[]> {
@@ -58,7 +63,9 @@
this.createCommonHeaders(headers, this._sessionContext);
return this._http.get(super.getBaseUrl() + '/assignedUserSuggestions/', { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch((error) => {
+ return super.handleErrorPromise(error);
+ });
}
public getNotificationVersions(incidetId: number): Observable<Notification[]> {
@@ -66,7 +73,9 @@
this.createCommonHeaders(headers, this._sessionContext);
return this._http.get(super.getBaseUrl() + '/notificationsByIncident/' + incidetId, { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch((error) => {
+ return super.handleErrorPromise(error);
+ });
}
public createNotification(notification: Notification): Observable<Notification> {
@@ -81,7 +90,9 @@
this.itemAdded$.emit(newNotification);
return newNotification;
})
- .catch(super.handleErrorPromise);
+ .catch((error) => {
+ return super.handleErrorPromise(error);
+ });
}
public updateNotification(notification: Notification): Observable<Notification> {
@@ -96,7 +107,9 @@
this.itemChanged$.emit(changedNotification);
return changedNotification;
})
- .catch(super.handleErrorPromise);
+ .catch((error) => {
+ return super.handleErrorPromise(error);
+ });
}
public getAllNotifications(): Observable<Notification[]> {
diff --git a/src/app/services/reminder.service.spec.ts b/src/app/services/reminder.service.spec.ts
index 8433df9..2e822e9 100644
--- a/src/app/services/reminder.service.spec.ts
+++ b/src/app/services/reminder.service.spec.ts
@@ -17,10 +17,12 @@
import { DUMMY_CREATED_NOTIFICATION, DUMMY_UPDATED_NOTIFICATION } from '../test-data/notifications';
import { SessionContext } from '../common/session-context';
import { Globals } from '../common/globals';
+import { MessageService } from '../services/message.service';
-describe('Http-NotificationService (mockBackend)', () => {
+describe('Http-ReminderService (mockBackend)', () => {
let sessionContext: SessionContext;
+ let messageService: MessageService;
beforeEach(async(() => {
TestBed.configureTestingModule({
@@ -28,10 +30,12 @@
providers: [
ReminderService,
{ provide: XHRBackend, useClass: MockBackend },
- SessionContext
+ SessionContext,
+ MessageService
]
})
.compileComponents();
+ messageService = new MessageService();
sessionContext = new SessionContext();
}));
@@ -42,7 +46,7 @@
it('can instantiate service with "new"', inject([Http], (http: Http) => {
expect(http).not.toBeNull('http should be provided');
- const service = new ReminderService(http, sessionContext);
+ const service = new ReminderService(http, sessionContext, messageService);
expect(service instanceof ReminderService).toBe(true, 'new service should be ok');
}));
@@ -52,5 +56,5 @@
expect(backend).not.toBeNull('backend should be provided');
}));
-
+
});
diff --git a/src/app/services/reminder.service.ts b/src/app/services/reminder.service.ts
index cae8b8a..0886e21 100644
--- a/src/app/services/reminder.service.ts
+++ b/src/app/services/reminder.service.ts
@@ -9,6 +9,7 @@
import { BaseHttpService } from './base-http.service';
import { Notification } from '../model/notification';
import { ReminderSearchFilter } from '../model/reminder-search-filter';
+import { MessageService } from './message.service';
@Injectable()
export class ReminderService extends BaseHttpService {
@@ -18,9 +19,10 @@
constructor(
private _http: Http,
- private _sessionContext: SessionContext
+ private _sessionContext: SessionContext,
+ public messageService: MessageService
) {
- super();
+ super(messageService);
this.itemAdded$ = new EventEmitter();
this.itemChanged$ = new EventEmitter();
}
@@ -32,10 +34,10 @@
const filter = reminderSearchFilter || {};
- this.createCommonHeaders(headers, this._sessionContext);
+ this.createCommonHeaders(headers, this._sessionContext);
return this._http.post(url, JSON.stringify(filter), { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch(error => { return super.handleErrorPromise(error); });
}
}
\ No newline at end of file
diff --git a/src/app/services/responsibility.service.spec.ts b/src/app/services/responsibility.service.spec.ts
index 601bb95..f519b8e 100644
--- a/src/app/services/responsibility.service.spec.ts
+++ b/src/app/services/responsibility.service.spec.ts
@@ -14,21 +14,24 @@
import { RESPONSIBILITIES } from '../test-data/responsibilities';
import { SessionContext } from '../common/session-context';
import { Globals } from '../common/globals';
+import { MessageService } from '../services/message.service';
describe('Http-ResponsibilityService (mockBackend)', () => {
let sessionContext: SessionContext;
-
+ let messageService: MessageService;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [HttpModule],
providers: [
ResponsibilityService,
{ provide: XHRBackend, useClass: MockBackend },
- SessionContext
+ SessionContext,
+ MessageService
]
})
.compileComponents();
sessionContext = new SessionContext();
+ messageService = new MessageService();
}));
it('can instantiate service when inject service',
@@ -40,7 +43,7 @@
it('can instantiate service with "new"', inject([Http], (http: Http) => {
expect(http).not.toBeNull('http should be provided');
- const service = new ResponsibilityService(http, sessionContext);
+ const service = new ResponsibilityService(http, sessionContext, messageService);
expect(service instanceof ResponsibilityService).toBe(true, 'new service should be ok');
}));
@@ -60,7 +63,7 @@
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new ResponsibilityService(http, sessionContext);
+ service = new ResponsibilityService(http, sessionContext, messageService);
const successHeaders: Headers = new Headers();
successHeaders.append(Globals.SESSION_TOKEN_TAG, 'SuperVALID!');
const options = new ResponseOptions({ status: 200, body: fakeResps, headers: successHeaders });
@@ -107,7 +110,7 @@
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new ResponsibilityService(http, sessionContext);
+ service = new ResponsibilityService(http, sessionContext, messageService);
const successHeaders: Headers = new Headers();
successHeaders.append(Globals.SESSION_TOKEN_TAG, 'SuperVALID!');
const options = new ResponseOptions({ status: 200, body: fakeResps, headers: successHeaders });
@@ -139,7 +142,7 @@
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new ResponsibilityService(http, sessionContext);
+ service = new ResponsibilityService(http, sessionContext, messageService);
const successHeaders: Headers = new Headers();
successHeaders.append(Globals.SESSION_TOKEN_TAG, 'SuperVALID!');
const options = new ResponseOptions({ status: 200, body: fakeResps, headers: successHeaders });
@@ -162,7 +165,7 @@
});
})));
});
-
+
describe('when confirmResponsibilities()', () => {
let backend: MockBackend;
let service: ResponsibilityService;
@@ -172,7 +175,7 @@
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new ResponsibilityService(http, sessionContext);
+ service = new ResponsibilityService(http, sessionContext, messageService);
const successHeaders: Headers = new Headers();
successHeaders.append(Globals.SESSION_TOKEN_TAG, 'SuperVALID!');
const options = new ResponseOptions({ status: 200, body: fakeResps, headers: successHeaders });
@@ -214,7 +217,7 @@
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new ResponsibilityService(http, sessionContext);
+ service = new ResponsibilityService(http, sessionContext, messageService);
const successHeaders: Headers = new Headers();
successHeaders.append(Globals.SESSION_TOKEN_TAG, 'SuperVALID!');
const options = new ResponseOptions({ status: 200, body: { ret: 'OK' }, headers: successHeaders });
diff --git a/src/app/services/responsibility.service.ts b/src/app/services/responsibility.service.ts
index b1d9d89..741a8cf 100644
--- a/src/app/services/responsibility.service.ts
+++ b/src/app/services/responsibility.service.ts
@@ -10,17 +10,19 @@
import { BaseHttpService } from './base-http.service';
import { TerritoryResponsibility } from '../model/territory-responsibility';
import { NotificationSearchFilter } from '../model/notification-search-filter';
-import {ResponsibilitySearchFilter } from '../model/responsibility-search-filter';
+import { ResponsibilitySearchFilter } from '../model/responsibility-search-filter';
import { HistoricalShiftChanges } from '../model/historical-shift-changes';
import { HistoricalResponsibility } from '../model/historical-responsibility';
+import { MessageService } from './message.service';
@Injectable()
export class ResponsibilityService extends BaseHttpService {
constructor(
private _http: Http,
- private _sessionContext: SessionContext) {
- super();
+ private _sessionContext: SessionContext,
+ public messageService: MessageService) {
+ super(messageService);
}
public getAllResponsibilities(): Observable<TerritoryResponsibility[]> {
@@ -28,7 +30,9 @@
this.createCommonHeaders(headers, this._sessionContext);
return this._http.get(super.getBaseUrl() + '/allResponsibilities', { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch(error => {
+ return super.handleErrorPromise(error);
+ });
}
public getResponsibilities(): Observable<TerritoryResponsibility[]> {
@@ -36,7 +40,7 @@
this.createCommonHeaders(headers, this._sessionContext);
return this._http.get(super.getBaseUrl() + '/currentResponsibilities', { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch(error => { return super.handleErrorPromise(error); });
}
public getPlannedResponsibilities(): Observable<TerritoryResponsibility[]> {
@@ -44,7 +48,7 @@
this.createCommonHeaders(headers, this._sessionContext);
return this._http.get(super.getBaseUrl() + '/plannedResponsibilities', { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch(error => { return super.handleErrorPromise(error); });
}
public planResponsibilities(responsibilities: TerritoryResponsibility[]) {
@@ -53,7 +57,7 @@
this.createCommonHeaders(headers, this._sessionContext);
return this._http.post(url, JSON.stringify(responsibilities), { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch(error => { return super.handleErrorPromise(error); });
}
public confirmResponsibilities(responsibilities: TerritoryResponsibility[]) {
@@ -62,24 +66,24 @@
this.createCommonHeaders(headers, this._sessionContext);
return this._http.post(url, JSON.stringify(responsibilities), { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch(error => { return super.handleErrorPromise(error); });
}
public getHistoricalShiftChangeList(notificationSearchFilter: ResponsibilitySearchFilter): Observable<HistoricalShiftChanges> {
const headers = new Headers();
- const url = super.getBaseUrl() + '/shiftChangeList/';
+ const url = super.getBaseUrl() + '/shiftChangeList/';
this.createCommonHeaders(headers, this._sessionContext);
- return this._http.post(url, JSON.stringify(notificationSearchFilter), {headers: headers})
+ return this._http.post(url, JSON.stringify(notificationSearchFilter), { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch(error => { return super.handleErrorPromise(error); });
}
public getHistoricalResponsibilities(transactionId: number): Observable<TerritoryResponsibility[]> {
const headers = new Headers();
- const url = super.getBaseUrl() + '/historicalResponsibilities/' + transactionId;
+ const url = super.getBaseUrl() + '/historicalResponsibilities/' + transactionId;
this.createCommonHeaders(headers, this._sessionContext);
- return this._http.get(url, {headers: headers})
+ return this._http.get(url, { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch(error => { return super.handleErrorPromise(error); });
}
}
diff --git a/src/app/services/search-result.service.ts b/src/app/services/search-result.service.ts
index 3c4d57e..418172f 100644
--- a/src/app/services/search-result.service.ts
+++ b/src/app/services/search-result.service.ts
@@ -9,13 +9,15 @@
import { BaseHttpService } from './base-http.service';
import { Notification } from '../model/notification';
import { GlobalSearchFilter } from '../model/global-search-filter';
+import { MessageService } from './message.service';
@Injectable()
export class SearchResultService extends BaseHttpService {
constructor(private _http: Http,
- private _sessionContext: SessionContext) {
- super();
+ private _sessionContext: SessionContext,
+ public messageService: MessageService) {
+ super(messageService);
}
public getSearchResults(searchResultFilter?: GlobalSearchFilter): Observable<Notification[]> {
@@ -25,7 +27,7 @@
this.createCommonHeaders(headers, this._sessionContext);
return this._http.post(url, JSON.stringify(globalSearchFilter), { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch(error => { return super.handleErrorPromise(error); });
}
}
diff --git a/src/app/services/user.service.spec.ts b/src/app/services/user.service.spec.ts
index 8c5d760..20784b9 100644
--- a/src/app/services/user.service.spec.ts
+++ b/src/app/services/user.service.spec.ts
@@ -14,20 +14,23 @@
import { USERS } from '../test-data/users';
import { SessionContext } from '../common/session-context';
import { Globals } from '../common/globals';
+import { MessageService } from '../services/message.service';
describe('Http-UserService (mockBackend)', () => {
let sessionContext: SessionContext;
-
+let messageService:MessageService;
beforeEach( async(() => {
TestBed.configureTestingModule({
imports: [ HttpModule ],
providers: [
UserService,
{ provide: XHRBackend, useClass: MockBackend },
- SessionContext
+ SessionContext,
+ MessageService
]
})
.compileComponents();
+ messageService = new MessageService();
sessionContext = new SessionContext();
}));
@@ -40,7 +43,7 @@
it('can instantiate service with "new"', inject([Http], (http: Http) => {
expect(http).not.toBeNull('http should be provided');
- const service = new UserService(http, sessionContext );
+ const service = new UserService(http, messageService, sessionContext );
expect(service instanceof UserService).toBe(true, 'new service should be ok');
}));
@@ -59,7 +62,7 @@
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new UserService(http, sessionContext);
+ service = new UserService(http, messageService, sessionContext);
const successHeaders: Headers = new Headers();
successHeaders.append(Globals.SESSION_TOKEN_TAG, 'SuperVALID!');
const options = new ResponseOptions({status: 200, body: fakeResps, headers: successHeaders} );
diff --git a/src/app/services/user.service.ts b/src/app/services/user.service.ts
index 46934a2..0ba3b2f 100644
--- a/src/app/services/user.service.ts
+++ b/src/app/services/user.service.ts
@@ -10,13 +10,16 @@
import { BaseHttpService } from './base-http.service';
import { User } from '../model/user';
+import { MessageService } from './message.service';
+
@Injectable()
export class UserService extends BaseHttpService {
constructor(
private _http: Http,
+ public messageService: MessageService,
private _sessionContext: SessionContext) {
- super();
+ super(messageService);
}
public getUsers(): Observable<User[]> {
@@ -24,7 +27,9 @@
this.createCommonHeaders(headers, this._sessionContext);
return this._http.get(super.getBaseUrl() + '/users', { headers: headers })
.map(res => super.extractData(res, this._sessionContext))
- .catch(super.handleErrorPromise);
+ .catch(error => {
+ return super.handleErrorPromise(error);
+ });
}
}
diff --git a/src/app/services/version-info.service.spec.ts b/src/app/services/version-info.service.spec.ts
index a6febd8..3ad4872 100644
--- a/src/app/services/version-info.service.spec.ts
+++ b/src/app/services/version-info.service.spec.ts
@@ -17,31 +17,35 @@
import { RESPONSIBILITIES } from '../test-data/responsibilities';
import { SessionContext } from '../common/session-context';
import { Globals } from '../common/globals';
+import { MessageService } from '../services/message.service';
describe('Http-VersionInfoService (mockBackend)', () => {
let sessionContext: SessionContext;
+ let messageService: MessageService;
- beforeEach( async(() => {
+ beforeEach(async(() => {
TestBed.configureTestingModule({
- imports: [ HttpModule ],
+ imports: [HttpModule],
providers: [
VersionInfoService,
{ provide: XHRBackend, useClass: MockBackend },
- SessionContext
+ SessionContext,
+ MessageService
]
})
- .compileComponents();
+ .compileComponents();
+ messageService = new MessageService();
sessionContext = new SessionContext();
}));
it('can instantiate service when inject service',
inject([VersionInfoService], (service: VersionInfoService) => {
expect(service instanceof VersionInfoService).toBe(true);
- }));
+ }));
it('can instantiate service with "new"', inject([Http], (http: Http) => {
expect(http).not.toBeNull('http should be provided');
- const service = new VersionInfoService(http, sessionContext );
+ const service = new VersionInfoService(http, sessionContext, messageService);
expect(service instanceof VersionInfoService).toBe(true, 'new service should be ok');
}));
@@ -49,7 +53,7 @@
it('can provide the mockBackend as XHRBackend',
inject([XHRBackend], (backend: MockBackend) => {
expect(backend).not.toBeNull('backend should be provided');
- }));
+ }));
describe('when loadBackendServerInfo()', () => {
@@ -61,36 +65,36 @@
beforeEach(inject([Http, XHRBackend], (http: Http, be: MockBackend) => {
backend = be;
- service = new VersionInfoService(http, sessionContext);
+ service = new VersionInfoService(http, sessionContext, messageService);
fakeVersion = { backendVersion: '2.2', dbVersion: '3.3' };
- const options = new ResponseOptions({status: 200, body: fakeVersion});
+ const options = new ResponseOptions({ status: 200, body: fakeVersion });
response = new Response(options);
}));
it('should have expected fake versionInfo (then)', async(inject([], () => {
- backend.connections.subscribe((c: MockConnection) => c.mockRespond(response));
+ backend.connections.subscribe((c: MockConnection) => c.mockRespond(response));
- service.loadBackendServerInfo().toPromise()
- .then( versionInfo => {
- const be = versionInfo.backendVersion;
- expect(versionInfo.backendVersion).toBe('2.2');
- });
+ service.loadBackendServerInfo().toPromise()
+ .then(versionInfo => {
+ const be = versionInfo.backendVersion;
+ expect(versionInfo.backendVersion).toBe('2.2');
+ });
})));
it('should treat 404 as an Observable error', async(inject([], () => {
- const resp = new Response(new ResponseOptions({status: 404}));
- backend.connections.subscribe((c: MockConnection) => c.mockRespond(resp));
+ const resp = new Response(new ResponseOptions({ status: 404 }));
+ backend.connections.subscribe((c: MockConnection) => c.mockRespond(resp));
- service.loadBackendServerInfo()
- .do(versionInfo => {
- fail('should not respond with versionInfo');
- })
- .catch(err => {
- const str = err;
- expect(err).toMatch('Bad response status', 'should catch bad response status code');
- return Observable.of(null); // failure is the expected test result
- })
- .toPromise();
- })));
+ service.loadBackendServerInfo()
+ .do(versionInfo => {
+ fail('should not respond with versionInfo');
+ })
+ .catch(err => {
+ const str = err;
+ expect(err).toMatch('Bad response status', 'should catch bad response status code');
+ return Observable.of(null); // failure is the expected test result
+ })
+ .toPromise();
+ })));
});
});
diff --git a/src/app/services/version-info.service.ts b/src/app/services/version-info.service.ts
index 7d5d737..fe75977 100644
--- a/src/app/services/version-info.service.ts
+++ b/src/app/services/version-info.service.ts
@@ -9,20 +9,26 @@
import { BaseHttpService } from './base-http.service';
import { VersionInfo } from '../model/version-info';
+import { MessageService } from './message.service';
+
@Injectable()
export class VersionInfoService extends BaseHttpService {
constructor(
private _http: Http,
- private _sessionContext: SessionContext ) {
- super();
+ private _sessionContext: SessionContext,
+ public messageService: MessageService
+ ) {
+ super(messageService);
}
public loadBackendServerInfo(): Observable<VersionInfo> {
const headers = new Headers();
this.createCommonHeaders(headers, this._sessionContext);
return this._http.get(super.getBaseUrl() + '/versionInfo', { headers: headers })
- .map ( resp => super.extractData( resp, this._sessionContext ) )
- .catch( super.handleErrorPromise );
+ .map(resp => super.extractData(resp, this._sessionContext))
+ .catch(error => {
+ return super.handleErrorPromise(error);
+ });
}
}