import pick from 'lodash/pick'; import cloneDeep from 'lodash/cloneDeep'; import {IdModel} from './id.model'; import {MaterialModel} from './material.model'; import {MeasurementModel} from './measurement.model'; import {BaseModel} from './base.model'; export class SampleModel extends BaseModel { _id: IdModel = null; color = ''; number = ''; type = ''; batch = ''; condition: {condition_template: string, [prop: string]: string} = {condition_template: null}; material_id: IdModel = null; material: MaterialModel; measurements: MeasurementModel[] = []; note_id: IdModel = null; user_id: IdModel = null; selected = false; notes: { comment: string, sample_references: {sample_id: IdModel, relation: string}[], custom_fields: {[prop: string]: string} } = {comment: '', sample_references: [], custom_fields: {}}; status = ''; added: Date = null; deserialize(input: any): this { Object.assign(this, input); if (input.hasOwnProperty('material')) { this.material = new MaterialModel().deserialize(input.material); this.material_id = input.material._id; } if (input.hasOwnProperty('measurements')) { this.measurements = input.measurements.map(e => new MeasurementModel().deserialize(e)); } if (input.hasOwnProperty('added')) { this.added = new Date(input.added); } return this; } sendFormat(pickCondition = true) { const pickFields = ['color', 'type', 'batch', 'material_id', 'notes']; if (pickCondition) { pickFields.push('condition'); } const tmp = pick(this.conditionTemplateCheck(), pickFields); Object.keys(tmp).forEach(key => { if (tmp[key] === undefined) { delete tmp[key]; } }); if (this.material && this.material.name === undefined) { delete tmp.material_id; } return tmp; } private conditionTemplateCheck() { const res = cloneDeep(this); if (res.condition.condition_template === null) { res.condition = {}; } return res; } }