diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 70ed351..f91d91b 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -30,6 +30,7 @@ export class MyApp { this.pages = [ {title: 'page.profile', component: 'ProfilePage'}, {title: 'page.regiobed.title', component: 'RegiobedPage'}, + {title: 'Patients', component: 'PatientsPage'}, {title: 'page.beds.list', component: 'BedsPage'}, {title: 'page.logout', component: 'LoginPage', method: 'logout'} ]; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index d51a2ae..3cefe96 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -8,6 +8,7 @@ import {AuthHttp, AuthConfig} from 'angular2-jwt'; import {Storage} from '@ionic/storage'; import {AuthService} from '../providers/auth-service'; import {BedsService} from '../providers/beds-service'; +import {PatientsService} from '../providers/patients-service'; import {TranslateModule, TranslateLoader} from '@ngx-translate/core'; import {TranslateHttpLoader} from '@ngx-translate/http-loader'; @@ -64,6 +65,7 @@ export function createTranslateLoader(http: Http) { }, AuthService, BedsService, + PatientsService, DistoreProvider, CryptoProvider, MockstoreProvider, diff --git a/src/app/config.ts b/src/app/config.ts index 2c09cf2..039bfbc 100644 --- a/src/app/config.ts +++ b/src/app/config.ts @@ -5,5 +5,6 @@ export let cfg = { register: '/auth/signup', login: '/auth/login' }, - beds: '/beds' + beds: '/beds', + patients: '/patients' }; diff --git a/src/models/patient.model.ts b/src/models/patient.model.ts new file mode 100644 index 0000000..0d4190c --- /dev/null +++ b/src/models/patient.model.ts @@ -0,0 +1,10 @@ +export class PatientModel { + public id?: number; + public name: string; + public date_of_birth: string; + + constructor(){ + this.name = "Annie"; + this.date_of_birth = "2017/12/12"; + } +} diff --git a/src/pages/patient-add-page/patient-add-page.html b/src/pages/patient-add-page/patient-add-page.html new file mode 100644 index 0000000..1173891 --- /dev/null +++ b/src/pages/patient-add-page/patient-add-page.html @@ -0,0 +1,41 @@ + + + + + {{ 'page.patient.add' | translate }} + + + + + + + + + + +
+ + {{ 'label.name' | translate }}: + + + + + Date of Birth: + + + + + +
+ +
+ +
+ + + +
+ +
diff --git a/src/pages/patient-add-page/patient-add-page.module.ts b/src/pages/patient-add-page/patient-add-page.module.ts new file mode 100644 index 0000000..651a00f --- /dev/null +++ b/src/pages/patient-add-page/patient-add-page.module.ts @@ -0,0 +1,18 @@ +import {NgModule} from '@angular/core'; +import {IonicPageModule} from 'ionic-angular'; +import {PatientAddPage} from './patient-add-page'; +import {TranslateModule} from '@ngx-translate/core'; + +@NgModule({ + declarations: [ + PatientAddPage, + ], + imports: [ + IonicPageModule.forChild(PatientAddPage), + TranslateModule.forChild() + ], + exports: [ + PatientAddPage + ] +}) +export class PatientAddPageModule {} diff --git a/src/pages/patient-add-page/patient-add-page.scss b/src/pages/patient-add-page/patient-add-page.scss new file mode 100644 index 0000000..f495196 --- /dev/null +++ b/src/pages/patient-add-page/patient-add-page.scss @@ -0,0 +1,3 @@ +page-patient-add-page { + +} diff --git a/src/pages/patient-add-page/patient-add-page.ts b/src/pages/patient-add-page/patient-add-page.ts new file mode 100644 index 0000000..c3a9823 --- /dev/null +++ b/src/pages/patient-add-page/patient-add-page.ts @@ -0,0 +1,65 @@ +import {Component} from '@angular/core'; +import {IonicPage, NavController, NavParams, MenuController} from 'ionic-angular'; +import {ToastController} from 'ionic-angular'; +import {ProtectedPage} from '../protected-page/protected-page'; +import {Storage} from '@ionic/storage'; +import {Validators, FormBuilder, FormGroup} from '@angular/forms'; +import {PatientsService} from '../../providers/patients-service'; +import {PatientModel} from '../../models/patient.model'; +import {AutoriteitProvider} from '../../providers/autoriteit/autoriteit' + + + +@IonicPage() +@Component({ + selector: 'page-patient-add-page', + templateUrl: 'patient-add-page.html', +}) +export class PatientAddPage extends ProtectedPage { + + private patientData: FormGroup; + + constructor( + public navCtrl: NavController, + public navParams: NavParams, + public toastCtrl: ToastController, + public menuCtrl: MenuController, + public storage: Storage, + public formBuilder: FormBuilder, + public au: AutoriteitProvider, + public patientsService: PatientsService) { + + super(navCtrl, navParams, storage); + + this.patientData = this.formBuilder.group({ + id: [Math.floor(Math.random() * 10)], + name: ['', Validators.required], + date_of_birth: ['', Validators.required], + }); + } + + showToastWithCloseButton() { + const toast = this.toastCtrl.create({ + message: 'Patient was succesfully added!', + showCloseButton: true, + duration: 2000, + cssClass: 'succes', + closeButtonText: 'Ok' + }); + toast.present(); + } + + process() { + let patient: PatientModel; + patient = new PatientModel(); + let newpatient = Object.assign(patient, this.patientData.value); + this.patientsService.add(newpatient); + this.navCtrl.pop(); + this.showToastWithCloseButton(); + /* this.PatientsService.add(this.patientData.value) + .then(() => this.navCtrl.push('patientsPage')) + .catch((e) => console.log("add patient error", e)); */ + } + + +} diff --git a/src/pages/patient-edit-page/patient-edit-page.html b/src/pages/patient-edit-page/patient-edit-page.html new file mode 100644 index 0000000..6d39b4c --- /dev/null +++ b/src/pages/patient-edit-page/patient-edit-page.html @@ -0,0 +1,42 @@ + + + + + Edit Patient + + + + + + + + + + +
+ + {{ 'label.name' | translate }}: + + + + + Date of Birth: + + + + + + +
+ +
+ +
+ + + +
+ +
diff --git a/src/pages/patient-edit-page/patient-edit-page.module.ts b/src/pages/patient-edit-page/patient-edit-page.module.ts new file mode 100644 index 0000000..51ed017 --- /dev/null +++ b/src/pages/patient-edit-page/patient-edit-page.module.ts @@ -0,0 +1,18 @@ +import {NgModule} from '@angular/core'; +import {IonicPageModule} from 'ionic-angular'; +import {PatientEditPage} from './patient-edit-page'; +import {TranslateModule} from '@ngx-translate/core'; + +@NgModule({ + declarations: [ + PatientEditPage, + ], + imports: [ + IonicPageModule.forChild(PatientEditPage), + TranslateModule.forChild() + ], + exports: [ + PatientEditPage + ] +}) +export class PatientEditPageModule {} diff --git a/src/pages/patient-edit-page/patient-edit-page.scss b/src/pages/patient-edit-page/patient-edit-page.scss new file mode 100644 index 0000000..f495196 --- /dev/null +++ b/src/pages/patient-edit-page/patient-edit-page.scss @@ -0,0 +1,3 @@ +page-patient-add-page { + +} diff --git a/src/pages/patient-edit-page/patient-edit-page.ts b/src/pages/patient-edit-page/patient-edit-page.ts new file mode 100644 index 0000000..a99aa6f --- /dev/null +++ b/src/pages/patient-edit-page/patient-edit-page.ts @@ -0,0 +1,52 @@ +import {Component} from '@angular/core'; +import {IonicPage, NavController, NavParams, MenuController} from 'ionic-angular'; +import {ProtectedPage} from '../protected-page/protected-page'; +import {Storage} from '@ionic/storage'; +import {Validators, FormBuilder, FormGroup} from '@angular/forms'; +import {PatientsService} from '../../providers/patients-service'; +import {PatientModel} from '../../models/patient.model'; +import {AutoriteitProvider} from '../../providers/autoriteit/autoriteit' + +@IonicPage() +@Component({ + selector: 'page-patient-edit-page', + templateUrl: 'patient-edit-page.html', +}) +export class PatientEditPage extends ProtectedPage { + + private patientData: FormGroup; + private patient: PatientModel; + + constructor( + public navCtrl: NavController, + public navParams: NavParams, + public menuCtrl: MenuController, + public storage: Storage, + public au: AutoriteitProvider, + public formBuilder: FormBuilder, + public patientsService: PatientsService) { + + super(navCtrl, navParams, storage); + + this.patient = navParams.get('patient'); + + + this.patientData = this.formBuilder.group({ + name: [this.patient.name, Validators.required], + date_of_birth: [this.patient.date_of_birth, Validators.required] + }); + } + + process() { + + let updatedPatient = Object.assign(this.patient, this.patientData.value); + + this.patientsService.update(updatedPatient); + this.navCtrl.pop(); + /* this.bedsService.update(updatedBed) + .then(() => this.navCtrl.pop()) + .catch((e) => console.log("add bed error", e)); */ + } + + +} diff --git a/src/pages/patient-info-page/patient-info-page.html b/src/pages/patient-info-page/patient-info-page.html new file mode 100644 index 0000000..96cae88 --- /dev/null +++ b/src/pages/patient-info-page/patient-info-page.html @@ -0,0 +1,42 @@ + + + + + Patient + + + + + + + + + +

{{ patient.name }}

+ {{ patient.date_of_birth }} +
+ + + + + + + + + + + + + + +
+ +
diff --git a/src/pages/patient-info-page/patient-info-page.module.ts b/src/pages/patient-info-page/patient-info-page.module.ts new file mode 100644 index 0000000..f632f57 --- /dev/null +++ b/src/pages/patient-info-page/patient-info-page.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { IonicPageModule } from 'ionic-angular'; +import { PatientInfoPage } from './patient-info-page'; +import {TranslateModule} from '@ngx-translate/core'; + +@NgModule({ + declarations: [ + PatientInfoPage, + ], + imports: [ + IonicPageModule.forChild(PatientInfoPage), + TranslateModule.forChild() + ], + exports: [ + PatientInfoPage + ] +}) +export class PatientInfoPageModule {} diff --git a/src/pages/patient-info-page/patient-info-page.ts b/src/pages/patient-info-page/patient-info-page.ts new file mode 100644 index 0000000..c0938bd --- /dev/null +++ b/src/pages/patient-info-page/patient-info-page.ts @@ -0,0 +1,55 @@ +import {Component} from '@angular/core'; +import {IonicPage, NavController, NavParams, MenuController} from 'ionic-angular'; +import {ToastController} from 'ionic-angular'; +import {ProtectedPage} from '../protected-page/protected-page'; +import {Storage} from '@ionic/storage'; +import {PatientsService} from '../../providers/patients-service'; +import {PatientModel} from '../../models/patient.model'; +import {AutoriteitProvider} from '../../providers/autoriteit/autoriteit' + +@IonicPage() +@Component({ + selector: 'page-patient-info-page', + templateUrl: 'patient-info-page.html', +}) +export class PatientInfoPage extends ProtectedPage { + + private patient: PatientModel; + + constructor( + public navCtrl: NavController, + public navParams: NavParams, + public toastCtrl: ToastController, + public menuCtrl: MenuController, + public storage: Storage, + public au: AutoriteitProvider, + public patientsService: PatientsService) { + + super(navCtrl, navParams, storage); + + this.patient = navParams.get('patient'); + + } + + showToastWithCloseButton() { + const toast = this.toastCtrl.create({ + message: 'Patient was succesfully removed!', + showCloseButton: true, + duration: 2000, + cssClass: 'succes', + closeButtonText: 'Ok' + }); + toast.present(); + } + + editPatient(patient: PatientModel) { + this.navCtrl.pop(); + this.navCtrl.push('PatientEditPage', {patient: patient}); + } + + deletePatient(patient: PatientModel) { + this.patientsService.remove(patient); + this.showToastWithCloseButton(); + this.navCtrl.pop(); +} +} diff --git a/src/pages/patients-page/patients-page.html b/src/pages/patients-page/patients-page.html new file mode 100644 index 0000000..a8a5dee --- /dev/null +++ b/src/pages/patients-page/patients-page.html @@ -0,0 +1,30 @@ + + + + + + Patients + + + + + + + + + + {{patient.name}} +
+ {{patient.date_of_birth}} +
+ +
+
+ + + +
diff --git a/src/pages/patients-page/patients-page.module.ts b/src/pages/patients-page/patients-page.module.ts new file mode 100644 index 0000000..a7dcf18 --- /dev/null +++ b/src/pages/patients-page/patients-page.module.ts @@ -0,0 +1,18 @@ +import {NgModule} from '@angular/core'; +import {IonicPageModule} from 'ionic-angular'; +import {PatientsPage} from './patients-page'; +import {TranslateModule} from '@ngx-translate/core'; + +@NgModule({ + declarations: [ + PatientsPage, + ], + imports: [ + IonicPageModule.forChild(PatientsPage), + TranslateModule.forChild() + ], + exports: [ + PatientsPage + ] +}) +export class PatientsPageModule {} diff --git a/src/pages/patients-page/patients-page.scss b/src/pages/patients-page/patients-page.scss new file mode 100644 index 0000000..0874914 --- /dev/null +++ b/src/pages/patients-page/patients-page.scss @@ -0,0 +1,3 @@ +page-patients-page { + +} diff --git a/src/pages/patients-page/patients-page.ts b/src/pages/patients-page/patients-page.ts new file mode 100644 index 0000000..9c94121 --- /dev/null +++ b/src/pages/patients-page/patients-page.ts @@ -0,0 +1,57 @@ +import {Component, OnDestroy} from '@angular/core'; +import {IonicPage, NavController, NavParams, MenuController} from 'ionic-angular'; +import {Subscription} from 'rxjs/Subscription'; +import {AutoriteitProvider} from '../../providers/autoriteit/autoriteit' +import {ProtectedPage} from '../protected-page/protected-page'; +import {Storage} from '@ionic/storage'; +import {PatientsService} from '../../providers/patients-service'; +import {PatientModel} from '../../models/patient.model'; + +@IonicPage() +@Component({ + selector: 'page-patients-page', + templateUrl: 'patients-page.html', +}) +export class PatientsPage extends ProtectedPage implements OnDestroy { + + public patients: any; + subscription: Subscription; + + constructor( + public navCtrl: NavController, + public navParams: NavParams, + public menuCtrl: MenuController, + public au: AutoriteitProvider, + public storage: Storage, + public patientsService: PatientsService) { + + super(navCtrl, navParams, storage); + // subscribe to the messages of the bedsService + this.subscription = patientsService.patientsChanged$.subscribe( + ) + + } + + ionViewWillEnter() { + this.patients = this.patientsService.getAll(); + } + + patientInfo(patient: PatientModel) { + this.navCtrl.push('PatientInfoPage', {patient: patient}); + } + + /** + * Opens a page + * + * @param page string Page name + */ + openPage(page: string) { + this.navCtrl.push(page); + } + + ngOnDestroy() { + // prevent memory leak when component destroyed + this.subscription.unsubscribe(); + } + +} diff --git a/src/providers/autoriteit/autoriteit.ts b/src/providers/autoriteit/autoriteit.ts index b516d5e..339b92f 100644 --- a/src/providers/autoriteit/autoriteit.ts +++ b/src/providers/autoriteit/autoriteit.ts @@ -3,8 +3,10 @@ import { Http } from '@angular/http'; import 'rxjs/add/operator/map'; import { Events } from 'ionic-angular'; import { BedModel } from '../../models/bed.model'; +import { PatientModel } from '../../models/patient.model'; import { MockstoreProvider } from '../mockstore/mockstore'; import { BedsService } from '../beds-service'; +import { PatientsService } from '../patients-service'; /* Generated class for the AutoriteitProvider provider. @@ -17,30 +19,48 @@ export class AutoriteitProvider { constructor( public events: Events, public store: MockstoreProvider, - public bs: BedsService) { - console.log('Hello AutoriteitProvider Provider'); - store.setDefault(bs.getAll()); // fill the storage with default data + public bs: BedsService, + public ps: PatientsService) { + console.log('Hello AutoriteitProvider Provider'); // fill the storage with default data events.subscribe('crud-action:add', (bp_id: number, bed: BedModel) => { + store.setDefault(bs.getAll()); let bp = this.bs.getBedPlace(bp_id); - this.store.add(bp, bed); + this.store.addBed(bp, bed); console.log('AutoriteitProvider - add:', bp_id, bed); } ); events.subscribe('crud-action:update', (bp_id: number, bed: BedModel) => { + store.setDefault(bs.getAll()); let bp = this.bs.getBedPlace(bp_id); - this.store.update(bp, bed); + this.store.updateBed(bp, bed); console.log('AutoriteitProvider - update:', bp_id, bed); } ); events.subscribe('crud-action:remove', (bp_id: number, bed: BedModel)=>{ + store.setDefault(bs.getAll()); let bp = this.bs.getBedPlace(bp_id); - this.store.remove(bp, bed); + this.store.removeBed(bp, bed); console.log('AutoriteitProvider - remove:', bp_id, bed); }); events.subscribe('crud-action:book', (bp_id:number, bed: BedModel, affl: number)=>{ + store.setDefault(bs.getAll()); let bp = this.bs.getBedPlace(bp_id); this.store.book(bp, bed, affl); console.log('AutoriteitProvider - book:', bp_id, bed, affl); }); events.subscribe('crud-action:unbook', this.unbook); + + /* patient */ + events.subscribe('patient-action:add', (patient: PatientModel) => { + store.setDefault(ps.getAll()); + this.store.addPatient(patient); + } ); + events.subscribe('patient-action:update', (patient: PatientModel) => { + store.setDefault(ps.getAll()); + this.store.updatePatient(patient); + } ); + events.subscribe('patient-action:remove', (patient: PatientModel)=>{ + store.setDefault(ps.getAll()); + this.store.removePatient(patient); + }); } unbook = function unbook(bp_id: number, bed: BedModel, affl: number){ diff --git a/src/providers/beds-service.ts b/src/providers/beds-service.ts index c77722c..7dcf435 100644 --- a/src/providers/beds-service.ts +++ b/src/providers/beds-service.ts @@ -133,8 +133,8 @@ export class BedsService { } ] }, - 1: { - "id": 1, + 5: { + "id": 5, "name": "EIGEN PLEKKEN", "description": "Lokaal", "key": "JJDKJDKJFFDKJ", diff --git a/src/providers/mockstore/mockstore.ts b/src/providers/mockstore/mockstore.ts index fac9570..74b932d 100644 --- a/src/providers/mockstore/mockstore.ts +++ b/src/providers/mockstore/mockstore.ts @@ -2,10 +2,11 @@ import { Injectable } from '@angular/core'; import 'rxjs/add/operator/map'; import { BedPlaceModel } from '../../models/bedplace.model'; import { BedModel } from '../../models/bed.model'; +import { PatientModel } from '../../models/patient.model'; import { Events } from 'ionic-angular'; @Injectable() -export class MockstoreProvider implements StorageInterface { +export class MockstoreProvider { private repres: any; @@ -20,7 +21,7 @@ export class MockstoreProvider implements StorageInterface { this.repres = r; } - add(bp: BedPlaceModel, bed: BedModel){ + addBed(bp: BedPlaceModel, bed: BedModel){ this.repres[bp.id].beds.push(bed); console.log("From mockstore adding: ", this.repres); this.events.publish('storage:update', this.repres); @@ -31,12 +32,12 @@ export class MockstoreProvider implements StorageInterface { console.log("From mockstore booking: ", this.repres); } unbook(bp: BedPlaceModel, bed: BedModel, affl: number){} - update(bp: BedPlaceModel, bed: BedModel){ + updateBed(bp: BedPlaceModel, bed: BedModel){ this.repres[bp.id].beds[bed.id] = bed; this.events.publish('storage:update', this.repres); console.log("From mockstore updating: ", this.repres); } - remove(bp: BedPlaceModel, bed: BedModel){ + removeBed(bp: BedPlaceModel, bed: BedModel){ //delete this.repres[bp.id].beds[bed.id]; let index = bed.id-1; if (index> -1){ this.repres[bp.id].beds.splice(index, 1); } @@ -44,4 +45,23 @@ export class MockstoreProvider implements StorageInterface { console.log("From mockstore deleting: ", this.repres); } + /* patienten */ + addPatient(patient: PatientModel){ + this.repres[patient.id].push(patient); + console.log("From mockstore adding: ", this.repres); + this.events.publish('patientStorage:update', this.repres); + } + updatePatient(patient: PatientModel){ + this.repres[patient.id] = patient; + this.events.publish('patientStorage:update', this.repres); + console.log("From mockstore updating: ", this.repres); + } + removePatient(patient: PatientModel){ + //delete this.repres[bp.id].beds[bed.id]; + let index = patient.id-1; + if (index> -1){ this.repres[patient.id].splice(index, 1); } + this.events.publish('patientStorage:update', this.repres); + console.log("From mockstore deleting: ", this.repres); + } + } diff --git a/src/providers/patients-service.ts b/src/providers/patients-service.ts new file mode 100644 index 0000000..0ab13c1 --- /dev/null +++ b/src/providers/patients-service.ts @@ -0,0 +1,106 @@ +import {Injectable} from '@angular/core'; +import {PatientModel} from '../models/patient.model'; +import 'rxjs/add/operator/map'; +import 'rxjs/add/operator/toPromise'; +import {Subject} from 'rxjs/Subject'; +import * as AppConfig from '../app/config'; +//import {AutoriteitProvider} from './autoriteit/autoriteit' +import { Events } from 'ionic-angular'; +/* +vangt events af van de lockers en stuurt en vraagt data +van lockers. representatie van de data voor deze case +weet welke lockers benaderbaar zijn en kan de inhoud ervan +wijzigen. De lockers zelf maken gebruik van de storage provider. + +connectie met 3 lockers +vult de beddenplek objecten +onderhoud per beddenplek een lijst met beddenplek (pushed die naar +de view en ontvangt wijzigingen van de view.) + +komt een event binnen (vraag naar data of update). +in event staat welke locker het is +update de eigen representatie van die locker of haal de data uit de representatie + +*/ + +@Injectable() +export class PatientsService { + + // Create number stream + private patientsChangedSource = new Subject(); + + // Make number stream observable, share patientsChanged$ with receivers + patientsChanged$ = this.patientsChangedSource.asObservable(); + + private cfg: any; + private patientviewmodel: any; + + constructor( public events: Events) { + this.cfg = AppConfig.cfg; + this.patientviewmodel = + { + patients: [ + { + "id": 1, + "name": "Annie", + "date_of_birth": "1923/03/04" + } + ] + }; + //let i = 1200; + //console.log( + // this.patientviewmodel[1], +// ); +//TODO: listen for storage update event +//listen for update(){ +// pas patientviewmodel aan +// changepatients() // trigger view update +this.events.subscribe('patientStorage:update', (x) => { + this.patientviewmodel.patients = x; + }); +//} +} + +getPatient(patient_id: number){ + var result = []; + if (this.patientviewmodel.hasOwnProperty(patient_id)) { //exist the requisted patient? + result = this.patientviewmodel.patients[patient_id]; //return patient + }; + console.log(result); + return result; +} + +getPatientIDs(){ + let result = []; + for (let patient in this.patientviewmodel.patients){ //NB: access *key* not the id in dictionary! + result.push(patient); + } + return result; +} + +getPatientInfo(patient_id: number){ + return { + "id": this.patientviewmodel.patients[patient_id].id, + "name": this.patientviewmodel.patients[patient_id].name, + "date_of_birth": this.patientviewmodel.patients[patient_id].date_of_birth, + } +} + +getAll() { + return this.patientviewmodel.patients; +} + +add(patient: PatientModel) { + // TODO: Build event mechanism to ACL / goedkeuring + //trigger add-or-up event(bedplace = this.getBedPlaceInfo(bp_id) , bed)// acl approval event + patient.id = Math.floor(Math.random() * 10); + this.events.publish('patient-action:add', patient); +} +update(patient: PatientModel){ + this.events.publish('patient-action:update', patient); +} +remove(patient: PatientModel) { + this.events.publish('patient-action:remove', patient); +} + +}