Skip to content

Commit 2de5987

Browse files
authored
Merge pull request #395 from inowas/t15-more-fixes
T15 more fixes
2 parents e6ec165 + 46d92db commit 2de5987

File tree

7 files changed

+67
-121
lines changed

7 files changed

+67
-121
lines changed

src/core/model/qmra/DoseResponse.ts

-19
Original file line numberDiff line numberDiff line change
@@ -87,25 +87,6 @@ class DoseResponse extends GenericObject<IDoseResponse> {
8787
});
8888
}
8989

90-
public static fromDefaults(pathogenId: number) {
91-
return new DoseResponse({
92-
id: uuid.v4(),
93-
pathogenId: pathogenId,
94-
pathogenName: '',
95-
pathogenGroup: '',
96-
bestFitModel: '',
97-
hostType: '',
98-
doseUnits: '',
99-
k: null,
100-
alpha: null,
101-
n50: null,
102-
route: '',
103-
response: '',
104-
reference: '',
105-
link: '',
106-
});
107-
}
108-
10990
public static fromObject(obj: IDoseResponse) {
11091
return new DoseResponse(obj);
11192
}

src/core/model/qmra/DoseResponse.type.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ export default interface IDoseResponse {
44
pathogenName: string;
55
pathogenGroup: string;
66
bestFitModel: string;
7-
k: number;
8-
alpha: number;
9-
n50: number;
7+
k: number | null;
8+
alpha: number | null;
9+
n50: number | null;
1010
hostType: string;
1111
doseUnits: string;
1212
route: string;
@@ -20,9 +20,9 @@ export interface IDoseResponsePayload {
2020
PathogenName: string;
2121
PathogenGroup: string;
2222
'Best fit model*': string;
23-
alpha: number;
24-
k: number;
25-
N50: number;
23+
alpha?: number | null;
24+
k?: number | null;
25+
N50?: number | null;
2626
'Host type': string;
2727
'Dose units': string;
2828
Route: string;

src/core/model/qmra/Qmra.ts

+16-18
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,9 @@ class Qmra extends GenericObject<IQmra> {
237237
}
238238

239239
public fromPayload(obj: IQmraRequest) {
240-
const eventsPerYear = obj.config.exposure.filter((e) => e.name === 'number_of_exposures');
241-
const litresPerEvent = obj.config.exposure.filter((e) => e.name === 'volume_perEvent');
242-
const numberOfRepeatings = obj.config.exposure.filter((e) => e.name === 'number_of_repeatings')
240+
const eventsPerYear = obj.exposure.filter((e) => e.name === 'number_of_exposures');
241+
const litresPerEvent = obj.exposure.filter((e) => e.name === 'volume_perEvent');
242+
const numberOfRepeatings = obj.exposure.filter((e) => e.name === 'number_of_repeatings')
243243

244244
let litresPerEventValue: IValue = {type: 'value', min: 0, max: 1, mode: 1, value: 365};
245245

@@ -275,26 +275,24 @@ class Qmra extends GenericObject<IQmra> {
275275
litresPerEvent: litresPerEventValue
276276
})
277277
];
278-
this.inflow = obj.config.inflow.map((p) => Pathogen.fromPayload(p));
279-
this.treatmentProcesses = obj.config.treatment.processes.map((tp) => TreatmentProcess.fromPayload(tp));
280-
this.treatmentSchemes = obj.config.treatment.schemes.map((ts) => TreatmentScheme.fromPayload(ts));
281-
this.health = obj.config.health.map((h) => Health.fromPayload(h));
282-
this.doseResponse = obj.config.doseresponse.map((dr) => DoseResponse.fromPayload(dr));
278+
this.inflow = obj.inflow.map((p) => Pathogen.fromPayload(p));
279+
this.treatmentProcesses = obj.treatment.processes.map((tp) => TreatmentProcess.fromPayload(tp));
280+
this.treatmentSchemes = obj.treatment.schemes.map((ts) => TreatmentScheme.fromPayload(ts));
281+
this.health = obj.health.map((h) => Health.fromPayload(h));
282+
this.doseResponse = obj.doseresponse.map((dr) => DoseResponse.fromPayload(dr));
283283
return this;
284284
}
285285

286286
public toPayload() {
287287
return {
288-
config: {
289-
exposure: this.generateExposure(),
290-
inflow: this.inflow.map((p) => p.toPayload()),
291-
treatment: {
292-
processes: this.treatmentProcesses.map((p) => p.toPayload()),
293-
schemes: this.treatmentSchemes.map((s) => s.toPayload())
294-
},
295-
doseresponse: this.doseResponse.map((r) => r.toPayload()),
296-
health: this.health.map((h) => h.toPayload())
297-
}
288+
exposure: this.generateExposure(),
289+
inflow: this.inflow.map((p) => p.toPayload()),
290+
treatment: {
291+
processes: this.treatmentProcesses.map((p) => p.toPayload()),
292+
schemes: this.treatmentSchemes.map((s) => s.toPayload())
293+
},
294+
doseresponse: this.doseResponse.map((r) => r.toPayload()),
295+
health: this.health.map((h) => h.toPayload())
298296
};
299297
}
300298

src/core/model/qmra/Qmra.type.ts

+7-9
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,14 @@ interface IQmraData {
2424
}
2525

2626
export interface IQmraRequest {
27-
config: {
28-
exposure: IExposure[];
29-
inflow: IPathogenPayload[];
30-
treatment: {
31-
processes: ITreatmentProcessPayload[];
32-
schemes: ITreatmentSchemePayload[];
33-
};
34-
doseresponse: IDoseResponsePayload[];
35-
health: IHealthPayload[];
27+
exposure: IExposure[];
28+
inflow: IPathogenPayload[];
29+
treatment: {
30+
processes: ITreatmentProcessPayload[];
31+
schemes: ITreatmentSchemePayload[];
3632
};
33+
doseresponse: IDoseResponsePayload[];
34+
health: IHealthPayload[];
3735
}
3836

3937
export default IQmra;

src/scenes/t15/components/DoseResponse/DoseResponseForm.tsx

+6-6
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,16 @@ const DoseResponseForm = ({onChange, readOnly, selectedDoseResponse}: IProps) =>
5353

5454
if (value === 'beta-Poisson') {
5555
cItem.bestFitModel = 'beta-Poisson';
56-
cItem.k = NaN;
56+
cItem.k = null;
5757
cItem.n50 = 0;
5858
cItem.alpha = 0;
5959
}
6060

6161
if (value === 'exponential') {
6262
cItem.bestFitModel = 'exponential';
6363
cItem.k = 0;
64-
cItem.n50 = NaN;
65-
cItem.alpha = NaN;
64+
cItem.n50 = null;
65+
cItem.alpha = null;
6666
}
6767

6868
setElement(cItem);
@@ -100,7 +100,7 @@ const DoseResponseForm = ({onChange, readOnly, selectedDoseResponse}: IProps) =>
100100
placeholder="alpha"
101101
readOnly={readOnly}
102102
type="number"
103-
value={activeInput === 'alpha' ? activeValue : element.alpha}
103+
value={activeInput === 'alpha' ? activeValue : element.alpha || 0}
104104
/>
105105
</Form.Field>
106106
<Form.Field>
@@ -112,7 +112,7 @@ const DoseResponseForm = ({onChange, readOnly, selectedDoseResponse}: IProps) =>
112112
placeholder="N50"
113113
readOnly={readOnly}
114114
type="number"
115-
value={activeInput === 'n50' ? activeValue : element.n50}
115+
value={activeInput === 'n50' ? activeValue : element.n50 || 0}
116116
/>
117117
</Form.Field>
118118
</Form.Group>
@@ -127,7 +127,7 @@ const DoseResponseForm = ({onChange, readOnly, selectedDoseResponse}: IProps) =>
127127
placeholder="k"
128128
readOnly={readOnly}
129129
type="number"
130-
value={activeInput === 'k' ? activeValue : element.k}
130+
value={activeInput === 'k' ? activeValue : element.k || 0}
131131
/>
132132
</Form.Field>
133133
}

src/scenes/t15/components/JsonUpload.tsx

+32-23
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
import { Button, Icon, Message, Modal } from 'semantic-ui-react';
2-
import { JSON_SCHEMA_URL } from '../../../services/api';
1+
import {Button, Icon, Message, Modal} from 'semantic-ui-react';
2+
import {JSON_SCHEMA_URL} from '../../../services/api';
33
import {validate as jsonSchemaValidate} from '../../../services/jsonSchemaValidator';
44
import Qmra from '../../../core/model/qmra/Qmra';
5-
import React, { ChangeEvent, useState } from 'react';
5+
import React, {ChangeEvent, useState} from 'react';
66

77
interface IProps {
88
onChange: (response: Qmra) => void;
99
qmra: Qmra;
1010
}
1111

12-
const JsonUpload = ({ onChange, qmra }: IProps) => {
12+
const JsonUpload = ({onChange, qmra}: IProps) => {
1313
const [data, setData] = useState<any>();
1414
const [errors, setErrors] = useState<string[]>([]);
1515
const [isLoading, setIsLoading] = useState<boolean>(false);
@@ -22,17 +22,23 @@ const JsonUpload = ({ onChange, qmra }: IProps) => {
2222
}
2323
};
2424

25+
const checkFile = (data: any) => Array.isArray(data.inflow) && Array.isArray(data.exposure) &&
26+
Array.isArray(data.doseresponse) && Array.isArray(data.health) && data.treatment &&
27+
Array.isArray(data.treatment.processes) && Array.isArray(data.treatment.schemes);
28+
2529
const handleConfirm = () => {
2630
let q = Qmra.fromDefaults();
27-
if ('config' in data) {
28-
q = qmra.fromPayload(data);
31+
32+
if ('config' in data && checkFile(data.config)) {
33+
q = qmra.fromPayload(data.config);
2934
}
30-
if ('data' in data) {
35+
if ('data' in data && checkFile(data.data)) {
3136
q = Qmra.fromObject(data);
3237
}
33-
if ('inflow' in data) {
38+
if ('inflow' in data && checkFile(data)) {
3439
q = qmra.fromPayload(data);
3540
}
41+
3642
setShowModal(false);
3743
onChange(q);
3844
};
@@ -54,27 +60,30 @@ const JsonUpload = ({ onChange, qmra }: IProps) => {
5460

5561
if (!checkPassed) {
5662
setData(undefined);
63+
setShowModal(true);
5764
e.push('Invalid JSON');
65+
setErrors(e);
5866
}
5967

6068
const d = JSON.parse(text);
6169

62-
// TODO: JSON SCHEME VALIDATION
63-
6470
jsonSchemaValidate(
6571
d,
6672
JSON_SCHEMA_URL + '/qmra/qmra.payload.json'
6773
).then((r) => {
68-
console.log(r);
74+
if (r[0]) {
75+
setErrors([]);
76+
setIsLoading(false);
77+
setShowModal(true);
78+
setData(d);
79+
} else {
80+
if (Array.isArray(r[1]) && 'message' in r[1][0]) {
81+
setErrors(r[1].map((e) => e.message));
82+
}
83+
setIsLoading(false);
84+
setShowModal(true);
85+
}
6986
});
70-
71-
if (checkPassed && e.length === 0) {
72-
setData(d);
73-
}
74-
75-
setErrors(e);
76-
setIsLoading(false);
77-
setShowModal(true);
7887
};
7988

8089
const handleUploadFile = (e: ChangeEvent<HTMLInputElement>) => {
@@ -97,7 +106,7 @@ const JsonUpload = ({ onChange, qmra }: IProps) => {
97106
labelPosition="left"
98107
loading={isLoading}
99108
/>
100-
<input hidden={true} type="file" id="inputField" onChange={handleUploadFile} />
109+
<input hidden={true} type="file" id="inputField" onChange={handleUploadFile}/>
101110
<Modal onClose={handleTriggerModal} open={showModal} size="small">
102111
<Modal.Header>Upload Json</Modal.Header>
103112
<Modal.Content>
@@ -111,17 +120,17 @@ const JsonUpload = ({ onChange, qmra }: IProps) => {
111120
{errors.length > 0 && (
112121
<Modal.Actions>
113122
<Button color="grey" onClick={handleTriggerModal}>
114-
<Icon name="remove" /> Close
123+
<Icon name="remove"/> Close
115124
</Button>
116125
</Modal.Actions>
117126
)}
118127
{errors.length < 1 && (
119128
<Modal.Actions>
120129
<Button color="red" onClick={handleTriggerModal}>
121-
<Icon name="remove" /> No
130+
<Icon name="remove"/> No
122131
</Button>
123132
<Button color="green" onClick={handleConfirm}>
124-
<Icon name="checkmark" /> Yes
133+
<Icon name="checkmark"/> Yes
125134
</Button>
126135
</Modal.Actions>
127136
)}

src/scenes/t15/components/shared/CsvUpload.tsx

-40
This file was deleted.

0 commit comments

Comments
 (0)