bug button, data service, user level adjustments, multiple sample support for edit dialog, validation functionality

This commit is contained in:
VLE2FE
2020-08-06 08:18:57 +02:00
parent 72ecdad573
commit e8ad6aaa7a
25 changed files with 841 additions and 402 deletions

View 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();
});
});

View 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();
});
}
}
}

View File

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