ohif-viewer/Packages/ohif-measurements/client/components/association/associationModal/studyAssociationTable/studyAssociationTable.js
2016-11-15 08:24:01 +01:00

141 lines
3.9 KiB
JavaScript

import { Template } from 'meteor/templating';
import { moment } from 'meteor/momentjs:moment';
import { OHIF } from 'meteor/ohif:core';
/**
* Finds related studies within defined time window of =/- 14 days of selected studies
* @param selectedStudies
* @param range Object
*/
function getDateRange(selectedStudies, range) {
if (range === undefined) {
range = {
days: 14
};
}
if (!selectedStudies.length) {
return;
}
const earliestStudy = selectedStudies[0];
const latestStudy = selectedStudies[selectedStudies.length - 1];
const earliestDate = moment(earliestStudy.studyDate, 'YYYYMMDD');
earliestDate.subtract(range);
const latestDate = moment(latestStudy.studyDate, 'YYYYMMDD');
latestDate.add(range);
return {
earliestDate: earliestDate,
latestDate: latestDate
};
}
/**
* Selects all studies related to the currently input studies,
* based on various criteria. Returns the entire array of related studies.
*
* (at the moment, this is only the date range +/- 14 days, with a matching patientId)
*
* @param selectedStudies A user-selected list of studies
* @returns {*} The entire array of related studies
*/
function autoSelectStudies(selectedStudies) {
if (!selectedStudies.length) {
return;
}
const range = getDateRange(selectedStudies);
// Fetch autoselected studies based on the date range
// Note that we used MongoDB's fetch here so we have a mutable array,
// rather than a Cursor
const autoselected = StudyListStudies.find({
studyDate: {
$gte: range.earliestDate.format('YYYYMMDD'),
$lte: range.latestDate.format('YYYYMMDD')
}
}, {
sort: {
studyDate: 1
}
}).fetch();
// Make an array of studyInstanceUids in selectedStudies
const studyInstanceUids = selectedStudies.map(selectedStudy => selectedStudy.studyInstanceUid);
autoselected.forEach(study => {
const exists = studyInstanceUids.indexOf(study.studyInstanceUid);
if (exists > -1) {
study.autoselected = false;
return;
}
study.autoselected = true;
});
return autoselected;
}
Template.studyAssociationTable.helpers({
/**
* This helpers includes the user-selected and autoselected studies
* to be associated.
*
* @returns {Array.<T>}
*/
relevantStudies() {
const selectedStudies = OHIF.studylist.getSelectedStudies();
return autoSelectStudies(selectedStudies);
},
/**
* This helper returns the list of Timepoint types the user can set for this study
*
* @returns {Array.<T>}
*/
timepointOptions() {
return [{
value: 'baseline',
name: 'Baseline',
checked: true
}, {
value: 'followup',
name: 'Follow-up',
checked: false
}];
},
earliestDate() {
const selectedStudies = OHIF.studylist.getSelectedStudies();
const range = getDateRange(selectedStudies);
if (range) {
return range.earliestDate;
}
},
latestDate() {
const selectedStudies = OHIF.studylist.getSelectedStudies();
const range = getDateRange(selectedStudies);
if (range) {
return range.latestDate;
}
}
});
Template.studyAssociationTable.events({
'change input.includeStudy'(event, instance) {
const checkbox = event.currentTarget;
const studyDataCells = $(checkbox).parents('tr').find('td.studyDataCell');
if (checkbox.checked === true) {
studyDataCells.removeClass('disabled');
studyDataCells.find('input').attr('disabled', false);
} else {
studyDataCells.addClass('disabled');
studyDataCells.find('input').attr('disabled', true);
}
}
});