LT-92: Adding max targets label again
This commit is contained in:
parent
efa18aeb1d
commit
5f338c6711
@ -9,7 +9,7 @@
|
|||||||
{{/if}}
|
{{/if}}
|
||||||
<div class="type">{{measurementType.name}}</div>
|
<div class="type">{{measurementType.name}}</div>
|
||||||
<div class="max {{#if gt numberOfMeasurements maxNumMeasurements}}warning{{/if}}">
|
<div class="max {{#if gt numberOfMeasurements maxNumMeasurements}}warning{{/if}}">
|
||||||
{{#if maxNumMeasurements}}
|
{{#if and maxNumMeasurements (eq measurementType.id 'targets')}}
|
||||||
<p class="maxNumMeasurements">Max {{maxNumMeasurements}}</p>
|
<p class="maxNumMeasurements">Max {{maxNumMeasurements}}</p>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,48 +1,5 @@
|
|||||||
Template.measurementTableHeaderRow.onCreated(() => {
|
import { Template } from 'meteor/templating';
|
||||||
const instance = Template.instance();
|
import { OHIF } from 'meteor/ohif:core';
|
||||||
instance.maxNumMeasurements = new ReactiveVar();
|
|
||||||
|
|
||||||
if (!instance.data.timepointApi) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the current timepoint
|
|
||||||
const current = instance.data.timepointApi.current();
|
|
||||||
|
|
||||||
// Stop here if no timepoint was found
|
|
||||||
if (!current) {
|
|
||||||
console.warn('No current timepoint found?');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const timepointType = current.timepointType;
|
|
||||||
|
|
||||||
// TODO: Check if we have criteria where maximum limits are applied to
|
|
||||||
// Non-Targets and/or New Lesions
|
|
||||||
if (timepointType === 'baseline' && instance.data.id === 'target') {
|
|
||||||
instance.autorun(() => {
|
|
||||||
// Identify which Trial Conformance Criteria are currently being used
|
|
||||||
// Note that there may be more than one.
|
|
||||||
const criteriaTypes = TrialCriteriaTypes.find({
|
|
||||||
selected: true
|
|
||||||
}).map(function(criteria) {
|
|
||||||
return criteria.id;
|
|
||||||
});
|
|
||||||
|
|
||||||
const currentConstraints = OHIF.lesiontracker.getTrialCriteriaConstraints(criteriaTypes);
|
|
||||||
if (!currentConstraints) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Fix Trial Conformance Criteria, it appears that totalNumberOfLesions
|
|
||||||
// is applied to both Targets and Non-Targets, when it should typically only be
|
|
||||||
// for Targets
|
|
||||||
const criteria = currentConstraints[timepointType];
|
|
||||||
const maxNumMeasurements = criteria.group.totalNumberOfLesions.numericality.lessThanOrEqualTo;
|
|
||||||
instance.maxNumMeasurements.set(maxNumMeasurements);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Template.measurementTableHeaderRow.helpers({
|
Template.measurementTableHeaderRow.helpers({
|
||||||
numberOfMeasurements() {
|
numberOfMeasurements() {
|
||||||
@ -50,15 +7,17 @@ Template.measurementTableHeaderRow.helpers({
|
|||||||
if (!instance.data.measurements) {
|
if (!instance.data.measurements) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return instance.data.measurements.length;
|
return instance.data.measurements.length;
|
||||||
},
|
},
|
||||||
|
|
||||||
maxNumMeasurements() {
|
maxNumMeasurements() {
|
||||||
const instance = Template.instance();
|
const instance = Template.instance();
|
||||||
if (!instance.data.measurements) {
|
if (!instance.data.conformanceCriteria) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
return instance.maxNumMeasurements.get();
|
|
||||||
|
return instance.data.conformanceCriteria.maxTargets.get();
|
||||||
},
|
},
|
||||||
|
|
||||||
anyUnmarkedLesionsLeft() {
|
anyUnmarkedLesionsLeft() {
|
||||||
@ -75,8 +34,8 @@ Template.measurementTableHeaderRow.helpers({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const timepointApi = instance.data.timepointApi;
|
const timepointApi = instance.data.timepointApi;
|
||||||
const current = instance.data.timepointApi.current();
|
const current = timepointApi.current();
|
||||||
const prior = instance.data.timepointApi.prior();
|
const prior = timepointApi.prior();
|
||||||
if (!prior) {
|
if (!prior) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,7 @@ class ConformanceCriteria {
|
|||||||
this.timepointApi = timepointApi;
|
this.timepointApi = timepointApi;
|
||||||
this.nonconformities = new ReactiveVar();
|
this.nonconformities = new ReactiveVar();
|
||||||
this.groupedNonConformities = new ReactiveVar();
|
this.groupedNonConformities = new ReactiveVar();
|
||||||
|
this.maxTargets = new ReactiveVar(null);
|
||||||
|
|
||||||
const validate = _.debounce(trialCriteriaType => {
|
const validate = _.debounce(trialCriteriaType => {
|
||||||
this.validate(trialCriteriaType);
|
this.validate(trialCriteriaType);
|
||||||
@ -32,6 +33,7 @@ class ConformanceCriteria {
|
|||||||
mergedData.targets = mergedData.targets.concat(followupData.targets);
|
mergedData.targets = mergedData.targets.concat(followupData.targets);
|
||||||
mergedData.nonTargets = mergedData.nonTargets.concat(followupData.nonTargets);
|
mergedData.nonTargets = mergedData.nonTargets.concat(followupData.nonTargets);
|
||||||
|
|
||||||
|
this.maxTargets.set(null);
|
||||||
const resultBoth = this.validateTimepoint('both', trialCriteriaType, mergedData);
|
const resultBoth = this.validateTimepoint('both', trialCriteriaType, mergedData);
|
||||||
const resultBaseline = this.validateTimepoint('baseline', trialCriteriaType, baselineData);
|
const resultBaseline = this.validateTimepoint('baseline', trialCriteriaType, baselineData);
|
||||||
const resultFollowup = this.validateTimepoint('followup', trialCriteriaType, followupData);
|
const resultFollowup = this.validateTimepoint('followup', trialCriteriaType, followupData);
|
||||||
@ -86,6 +88,11 @@ class ConformanceCriteria {
|
|||||||
let nonconformities = [];
|
let nonconformities = [];
|
||||||
|
|
||||||
evaluators.forEach(evaluator => {
|
evaluators.forEach(evaluator => {
|
||||||
|
const maxTargets = evaluator.getMaxTargets();
|
||||||
|
if (maxTargets) {
|
||||||
|
this.maxTargets.set(maxTargets);
|
||||||
|
}
|
||||||
|
|
||||||
const result = evaluator.evaluate(data);
|
const result = evaluator.evaluate(data);
|
||||||
nonconformities = nonconformities.concat(result);
|
nonconformities = nonconformities.concat(result);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -24,8 +24,18 @@ export class CriteriaEvaluator {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getMaxTargets() {
|
||||||
|
let result;
|
||||||
|
_.each(this.criteria, criterion => {
|
||||||
|
if (criterion instanceof Criteria.MaxTargetsCriterion) {
|
||||||
|
result = criterion.options.limit;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
getCriteriaValidator() {
|
getCriteriaValidator() {
|
||||||
if(CriteriaEvaluator.criteriaValidator) {
|
if (CriteriaEvaluator.criteriaValidator) {
|
||||||
return CriteriaEvaluator.criteriaValidator;
|
return CriteriaEvaluator.criteriaValidator;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,8 +63,9 @@ export class CriteriaEvaluator {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return CriteriaEvaluator.criteriaValidator = new Ajv().compile(schema);
|
CriteriaEvaluator.criteriaValidator = new Ajv().compile(schema);
|
||||||
|
return CriteriaEvaluator.criteriaValidator;
|
||||||
}
|
}
|
||||||
|
|
||||||
evaluate(data) {
|
evaluate(data) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user