bug button, data service, user level adjustments, multiple sample support for edit dialog, validation functionality
This commit is contained in:
16
src/app/services/data.service.spec.ts
Normal file
16
src/app/services/data.service.spec.ts
Normal file
@ -0,0 +1,16 @@
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
|
||||
import { DataService } from './data.service';
|
||||
|
||||
describe('DataService', () => {
|
||||
let service: DataService;
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({});
|
||||
service = TestBed.inject(DataService);
|
||||
});
|
||||
|
||||
it('should be created', () => {
|
||||
expect(service).toBeTruthy();
|
||||
});
|
||||
});
|
52
src/app/services/data.service.ts
Normal file
52
src/app/services/data.service.ts
Normal file
@ -0,0 +1,52 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import {TemplateModel} from '../models/template.model';
|
||||
import {ApiService} from './api.service';
|
||||
import {MaterialModel} from '../models/material.model';
|
||||
import {BaseModel} from '../models/base.model';
|
||||
import {UserModel} from '../models/user.model';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class DataService {
|
||||
|
||||
constructor(
|
||||
private api: ApiService
|
||||
) { }
|
||||
|
||||
private collectionMap = {
|
||||
materials: {path: '/materials?status=all', model: MaterialModel, array: true},
|
||||
materialSuppliers: {path: '/material/suppliers', model: null, array: true},
|
||||
materialGroups: {path: '/material/groups', model: null, array: true},
|
||||
materialTemplates: {path: '/template/materials', model: TemplateModel, array: true},
|
||||
measurementTemplates: {path: '/template/measurements', model: TemplateModel, array: true},
|
||||
conditionTemplates: {path: '/template/conditions', model: TemplateModel, array: true},
|
||||
sampleNotesFields: {path: '/sample/notes/fields', model: TemplateModel, array: true},
|
||||
users: {path: '/users', model: UserModel, array: true},
|
||||
user: {path: '/user', model: UserModel, array: false},
|
||||
userKey: {path: '/user/key', model: BaseModel, array: false}
|
||||
};
|
||||
|
||||
arr: {[key: string]: any[]} = {}; // array of data
|
||||
id: {[key: string]: {[id: string]: any}} = {}; // data in format _id: data
|
||||
d: {[key: string]: any} = {}; // data not in array format
|
||||
|
||||
load(collection, f = () => {}) { // load data
|
||||
if (this.arr[collection]) { // data already loaded
|
||||
f();
|
||||
}
|
||||
else { // load data
|
||||
this.api.get<any>(this.collectionMap[collection].path, data => {
|
||||
if (this.collectionMap[collection].array) { // array data
|
||||
this.arr[collection] = data
|
||||
.map(e => this.collectionMap[collection].model ? new this.collectionMap[collection].model().deserialize(e) : e);
|
||||
this.id[collection] = this.arr[collection].reduce((s, e) => {s[e._id] = e; return s; }, {});
|
||||
}
|
||||
else { // not array data
|
||||
this.d[collection] = new this.collectionMap[collection].model().deserialize(data);
|
||||
}
|
||||
f();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@ -10,19 +10,19 @@ import {Observable} from 'rxjs';
|
||||
export class LoginService implements CanActivate {
|
||||
|
||||
private pathPermissions = [
|
||||
{path: 'templates', permission: 'maintain'},
|
||||
{path: 'templates', permission: 'dev'},
|
||||
{path: 'users', permission: 'admin'}
|
||||
];
|
||||
readonly levels = [
|
||||
'read',
|
||||
'write',
|
||||
'maintain',
|
||||
'dev',
|
||||
'admin'
|
||||
];
|
||||
isLevel: {[level: string]: boolean} = {};
|
||||
userId = '';
|
||||
|
||||
private loggedIn;
|
||||
private level;
|
||||
|
||||
constructor(
|
||||
private api: ApiService,
|
||||
@ -57,7 +57,10 @@ export class LoginService implements CanActivate {
|
||||
if (!error) {
|
||||
if (data.status === 'Authorization successful') {
|
||||
this.loggedIn = true;
|
||||
this.level = data.level;
|
||||
this.levels.forEach(level => {
|
||||
this.isLevel[level] = this.levels.indexOf(data.level) >= this.levels.indexOf(level);
|
||||
});
|
||||
this.userId = data.user_id;
|
||||
resolve(true);
|
||||
} else {
|
||||
this.loggedIn = false;
|
||||
@ -91,7 +94,7 @@ export class LoginService implements CanActivate {
|
||||
}
|
||||
}).then(res => {
|
||||
const pathPermission = this.pathPermissions.find(e => e.path.indexOf(route.url[0].path) >= 0);
|
||||
const ok = res && !pathPermission || this.is(pathPermission.permission); // check if level is permitted for path
|
||||
const ok = res && (!pathPermission || this.isLevel[pathPermission.permission]); // check if level is permitted for path
|
||||
observer.next(ok);
|
||||
observer.complete();
|
||||
if (!ok) {
|
||||
@ -105,10 +108,6 @@ export class LoginService implements CanActivate {
|
||||
return this.loggedIn;
|
||||
}
|
||||
|
||||
is(level) {
|
||||
return this.levels.indexOf(this.level) >= this.levels.indexOf(level);
|
||||
}
|
||||
|
||||
get username() {
|
||||
return atob(this.storage.get('basicAuth')).split(':')[0];
|
||||
}
|
||||
|
Reference in New Issue
Block a user