fixed material numbers in new dialog

This commit is contained in:
VLE2FE 2020-08-10 16:15:17 +02:00
parent c2f5aaff8d
commit c0b410c483
13 changed files with 163 additions and 20 deletions

View File

@ -8,6 +8,7 @@ import {DocumentationComponent} from './documentation/documentation.component';
import {TemplatesComponent} from './templates/templates.component';
import {SettingsComponent} from './settings/settings.component';
import {UsersComponent} from './users/users.component';
import {ChangelogComponent} from './changelog/changelog.component';
const routes: Routes = [
@ -17,6 +18,7 @@ const routes: Routes = [
{path: 'samples/new', component: SampleComponent, canActivate: [LoginService]},
{path: 'samples/edit/:id', component: SampleComponent, canActivate: [LoginService]},
{path: 'templates', component: TemplatesComponent, canActivate: [LoginService]},
{path: 'changelog', component: ChangelogComponent, canActivate: [LoginService]},
{path: 'users', component: UsersComponent, canActivate: [LoginService]},
{path: 'settings', component: SettingsComponent, canActivate: [LoginService]},
{path: 'documentation', component: DocumentationComponent},

View File

@ -5,6 +5,7 @@
<a routerLink="/templates" routerLinkActive="active" rbLoadingLink *ngIf="login.isLevel.dev">
Templates
</a>
<a routerLink="/changelog" routerLinkActive="active" rbLoadingLink *ngIf="login.isLevel.dev">Changelog</a>
<a routerLink="/users" routerLinkActive="active" rbLoadingLink *ngIf="login.isLevel.admin">Users</a>
<a routerLink="/documentation" routerLinkActive="active" rbLoadingLink>Documentation</a>
</nav>

View File

@ -25,6 +25,7 @@ import { TemplatesComponent } from './templates/templates.component';
import { ParametersPipe } from './parameters.pipe';
import { SettingsComponent } from './settings/settings.component';
import { UsersComponent } from './users/users.component';
import { ChangelogComponent } from './changelog/changelog.component';
@NgModule({
declarations: [
@ -42,7 +43,8 @@ import { UsersComponent } from './users/users.component';
TemplatesComponent,
ParametersPipe,
SettingsComponent,
UsersComponent
UsersComponent,
ChangelogComponent
],
imports: [
LocalStorageModule.forRoot({

View File

@ -0,0 +1,35 @@
<h2>Changelog</h2>
<div class="header">
<rb-form-date-input name="dateInput" label="older than" [options]="{enableTime: true}"
[(ngModel)]="timestamp" (ngModelChange)="loadChangelog()">
</rb-form-date-input>
<rb-form-select name="pageSizeSelection" label="page size" [(ngModel)]="pageSize" (ngModelChange)="loadChangelog()">
<option value="3">3</option>
<option value="10">10</option>
<option value="25">25</option>
<option value="50">50</option>
<option value="100">100</option>
<option value="250">250</option>
<option value="500">500</option>
</rb-form-select>
<button class="rb-btn rb-link" type="button" (click)="loadChangelog(1)">
next page
<span class="rb-ic rb-ic-forward-right"></span>
</button>
</div>
<rb-table>
<tr>
<th>Date</th>
<th>Action</th>
<th>Data</th>
</tr>
<tr *ngFor="let entry of changelog">
<td>{{entry.date}}</td>
<td>{{entry.action}}</td>
<td>{{entry.data | json}}</td>
</tr>
</rb-table>

View File

@ -0,0 +1,10 @@
.header {
& > * {
float: left;
}
button {
float: right;
}
}

View File

@ -0,0 +1,25 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ChangelogComponent } from './changelog.component';
describe('ChangelogComponent', () => {
let component: ChangelogComponent;
let fixture: ComponentFixture<ChangelogComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ChangelogComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ChangelogComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@ -0,0 +1,32 @@
import { Component, OnInit } from '@angular/core';
import {ChangelogModel} from '../models/changelog.model';
import {ApiService} from '../services/api.service';
@Component({
selector: 'app-changelog',
templateUrl: './changelog.component.html',
styleUrls: ['./changelog.component.scss']
})
export class ChangelogComponent implements OnInit {
timestamp = new Date();
pageSize = 25;
changelog: ChangelogModel[] = [];
constructor(
private api: ApiService
) { }
ngOnInit(): void {
this.loadChangelog();
}
loadChangelog(page = 0) {
this.api.get<ChangelogModel[]>(`/changelog/${this.timestamp.toISOString()}/${page}/${this.pageSize}`, data => {
this.changelog = data.map(e => new ChangelogModel().deserialize(e));
this.timestamp = new Date(this.changelog[0].date);
console.log(this.changelog);
});
}
}

View File

@ -0,0 +1,7 @@
import { ChangelogModel } from './changelog.model';
describe('ChangelogModel', () => {
it('should create an instance', () => {
expect(new ChangelogModel()).toBeTruthy();
});
});

View File

@ -0,0 +1,9 @@
import {BaseModel} from './base.model';
export class ChangelogModel extends BaseModel {
date: Date;
action: string;
collection: string;
conditions: {[key: string]: any};
data: {[key: string]: any};
}

View File

@ -45,7 +45,7 @@
</rb-array-input>
<rb-form-select name="conditionSelect" label="Type"
[(ngModel)]="material.properties.material_template">
<option *ngFor="let m of d.arr.materialTemplates" [value]="m._id">{{m.name}}</option>
<option *ngFor="let m of d.latest.materialTemplates" [value]="m._id">{{m.name}}</option>
</rb-form-select>
<rb-form-input *ngFor="let parameter of d.id.materialTemplates[material.properties.material_template].parameters;
index as i" [name]="'materialParameter' + i"
@ -158,7 +158,7 @@
<div *ngIf="gSample.condition.condition_template" [@inOut]>
<rb-form-select name="conditionSelect" label="Condition"
[(ngModel)]="gSample.condition.condition_template">
<option *ngFor="let c of d.arr.conditionTemplates" [value]="c._id">{{c.name}}</option>
<option *ngFor="let c of d.latest.conditionTemplates" [value]="c._id">{{c.name}}</option>
</rb-form-select>
<ng-container *ngFor="let parameter of
@ -187,7 +187,7 @@
<rb-form-select [name]="'measurementTemplateSelect-' + gIndex + '-' + mIndex" label="Template"
[(ngModel)]="measurement.measurement_template"
(ngModelChange)="clearMeasurement(gIndex, mIndex)">
<option *ngFor="let m of d.arr.measurementTemplates" [value]="m._id">{{m.name}}</option>
<option *ngFor="let m of d.latest.measurementTemplates" [value]="m._id">{{m.name}}</option>
</rb-form-select>
<div *ngFor="let parameter of d.id.measurementTemplates[measurement.measurement_template].parameters;

View File

@ -139,7 +139,7 @@ export class SampleComponent implements OnInit, AfterContentChecked {
});
this.d.load('materialTemplates', () => {
if (!this.material.properties.material_template) {
this.material.properties.material_template = this.d.arr.materialTemplates.filter(e => e.name === 'plastic').reverse()[0]._id;
this.material.properties.material_template = this.d.latest.materialTemplates.find(e => e.name === 'plastic')._id;
}
this.loading--;
});
@ -270,6 +270,8 @@ export class SampleComponent implements OnInit, AfterContentChecked {
}
new Promise<void>(resolve => {
if (this.newMaterial) { // save material first if new one exists
console.log(this.material);
this.material.numbers = this.material.numbers.filter(e => e !== '');
this.api.post<MaterialModel>('/material/new', this.material.sendFormat(), data => {
this.d.arr.materials.push(data); // add material to data
this.material = data;
@ -348,7 +350,7 @@ export class SampleComponent implements OnInit, AfterContentChecked {
else { // no matching material found
if (this.sample.material_id !== null) { // reset previous match
this.material = new MaterialModel();
this.material.properties.material_template = this.d.arr.materialTemplates.filter(e => e.name === 'plastic').reverse()[0]._id;
this.material.properties.material_template = this.d.latest.materialTemplates.find(e => e.name === 'plastic')._id;
}
this.sample.material_id = null;
}
@ -376,9 +378,9 @@ export class SampleComponent implements OnInit, AfterContentChecked {
// add a new measurement for generated sample at index
addMeasurement(gIndex) {
this.generatedSamples[gIndex].measurements.push(
new MeasurementModel(this.d.arr.measurementTemplates.filter(e => e.name === 'spectrum').reverse()[0]._id)
new MeasurementModel(this.d.latest.measurementTemplates.find(e => e.name === 'spectrum')._id)
);
this.generatedSamples[gIndex].measurements[this.generatedSamples[gIndex].measurements.length - 1].values.device = this.defaultDevice;
console.log(this.d.latest.measurementTemplates.find(e => e.name === 'spectrum'));
if (!this.charts[gIndex]) { // add array if there are no charts yet
this.charts[gIndex] = [];
}
@ -411,6 +413,8 @@ export class SampleComponent implements OnInit, AfterContentChecked {
this.addMeasurement(gIndex);
index = this.generatedSamples[gIndex].measurements.length - 1;
}
this.generatedSamples[gIndex].measurements[index].values.device =
this.generatedSamples[gIndex].measurements[mIndex].values.device;
this.generatedSamples[gIndex].measurements[index].values.filename = files[i].name;
this.generatedSamples[gIndex].measurements[index].values[parameter] =
fileReader.result.toString().split('\r\n').map(e => e.split(','));
@ -430,7 +434,7 @@ export class SampleComponent implements OnInit, AfterContentChecked {
sample.condition.condition_template = null;
}
else {
sample.condition.condition_template = this.d.arr.conditionTemplates[0]._id;
sample.condition.condition_template = this.d.latest.conditionTemplates[0]._id;
}
}

View File

@ -15,19 +15,20 @@ export class DataService {
) { }
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}
materials: {path: '/materials?status=all', model: MaterialModel, type: 'array'},
materialSuppliers: {path: '/material/suppliers', model: null, type: 'array'},
materialGroups: {path: '/material/groups', model: null, type: 'array'},
materialTemplates: {path: '/template/materials', model: TemplateModel, type: 'template'},
measurementTemplates: {path: '/template/measurements', model: TemplateModel, type: 'template'},
conditionTemplates: {path: '/template/conditions', model: TemplateModel, type: 'template'},
sampleNotesFields: {path: '/sample/notes/fields', model: TemplateModel, type: 'array'},
users: {path: '/users', model: UserModel, type: 'array'},
user: {path: '/user', model: UserModel, type: 'string'},
userKey: {path: '/user/key', model: BaseModel, type: 'string'}
};
arr: {[key: string]: any[]} = {}; // array of data
latest: {[key: string]: any[]} = {}; // array of latest template versions
id: {[key: string]: {[id: string]: any}} = {}; // data in format _id: data
d: {[key: string]: any} = {}; // data not in array format
@ -37,10 +38,24 @@ export class DataService {
}
else { // load data
this.api.get<any>(this.collectionMap[collection].path, data => {
if (this.collectionMap[collection].array) { // array data
if (this.collectionMap[collection].type !== 'string') { // array data
this.arr[collection] = data
.map(e => this.collectionMap[collection].model ? new this.collectionMap[collection].model().deserialize(e) : e);
this.idReload(collection);
if (this.collectionMap[collection].type === 'template') {
const tmpTemplates = {};
this.arr[collection].forEach(template => {
if (tmpTemplates[template.first_id]) { // already found another version
if (template.version > tmpTemplates[template.first_id].version) {
tmpTemplates[template.first_id] = template;
}
}
else {
tmpTemplates[template.first_id] = template;
}
});
this.latest[collection] = Object.values(tmpTemplates);
}
}
else { // not array data
this.d[collection] = new this.collectionMap[collection].model().deserialize(data);

View File

@ -11,6 +11,7 @@ export class LoginService implements CanActivate {
private pathPermissions = [
{path: 'templates', permission: 'dev'},
{path: 'changelog', permission: 'dev'},
{path: 'users', permission: 'admin'}
];
readonly levels = [