First pass at a Hanging Protocol implementation and editor (LT-131)

This commit is contained in:
Erik Ziegler committed 2016-05-07 12:40:02 +02:00
1 parent dfcb33153f
commit 2e52d9e3c1
157 files changed
+8869 -23585

No files matched your search

@@ -1,6 +1,7 @@
<template name="viewerMain">
<div class="viewerMain">
{{ >toolbar toolbarOptions=toolbarOptions }}
{{ >imageViewerViewports }}
<div id='layoutManagerTarget'>
</div>
</div>
</template>
@@ -86,25 +86,23 @@ Template.viewerMain.helpers({
// CR/UN/EX Tools
var crunexToolsBtns = {
id: 'crunexTools',
tools:[{
tools: [{
id: 'crTool',
title: 'CR Tool',
classes: 'imageViewerTool',
iconClasses: 'fa fa-cr'
},
{
}, {
id: 'unTool',
title: 'UN Tool',
classes: 'imageViewerTool',
iconClasses: 'fa fa-un'
},
{
}, {
id: 'exTool',
title: 'EX Tool',
classes: 'imageViewerTool',
iconClasses: 'fa fa-ex'
}],
title: "CR/UN/EX",
title: 'CR/UN/EX',
groupIcon: 'fa fa-exchange'
};
@@ -118,3 +116,12 @@ Template.viewerMain.helpers({
return toolbarOptions;
}
});
Template.viewerMain.onRendered(function() {
var parentNode = document.getElementById('layoutManagerTarget');
var studies = this.data.studies;
layoutManager = new LayoutManager(parentNode, studies);
ProtocolEngine = new HP.ProtocolEngine(layoutManager, studies);
HP.setEngine(ProtocolEngine);
});
@@ -2,15 +2,22 @@
width: 100%
height: 84%
#layoutManagerTarget
width: 100%
height: calc(100% - 30px)
//font awesome icons
.fa-cr:before
content: 'CR'
font-weight: bold
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif
.fa-un:before
content: 'UN'
font-weight: bold
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif
.fa-ex:before
content: 'EX'
font-weight: bold
font-weight: bold
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif
@@ -0,0 +1,183 @@
// Define Baseline protocol
var proto = new HP.Protocol('LT_Baseline');
proto.locked = true;
var studyDescription = new HP.ProtocolMatchingRule();
studyDescription.required = true;
studyDescription.attribute = 'studyDescription';
studyDescription.constraint = {
contains: {
value: 'CT'
}
};
var isBaseline = new HP.ProtocolMatchingRule();
isBaseline.required = true;
isBaseline.attribute = 'timepointType';
isBaseline.constraint = {
equals: {
value: 'baseline'
}
};
proto.addProtocolMatchingRule(studyDescription);
proto.addProtocolMatchingRule(isBaseline);
var oneByOne = new HP.ViewportStructure('grid', {
rows: 1,
columns: 1
});
// Stage 1
var single = new HP.Viewport();
var baseline = new HP.StudyMatchingRule(true);
baseline.required = true;
baseline.attribute = 'timepointType';
baseline.constraint = {
equals: {
value: 'baseline'
}
};
var body = new HP.SeriesMatchingRule();
body.attribute = 'seriesDescription';
body.weight = 5;
body.constraint = {
contains: {
value: 'Body'
}
};
var chest = new HP.SeriesMatchingRule();
chest.attribute = 'seriesDescription';
chest.constraint = {
contains: {
value: 'CHEST'
}
};
single.studyMatchingRules.push(baseline);
single.seriesMatchingRules.push(body);
single.seriesMatchingRules.push(chest);
var first = new HP.Stage(oneByOne, 'oneByOne');
first.viewports.push(single);
proto.addStage(first);
HP.lesionTrackerBaselineProtocol = proto;
HP.lesionTrackerBaselineProtocol.id = 'lesionTrackerBaselineProtocol';
// Define Followup Protocol
var proto = new HP.Protocol('LT_BaselineFollowup');
proto.locked = true;
var studyDescription = new HP.ProtocolMatchingRule();
studyDescription.required = true;
studyDescription.attribute = 'studyDescription';
studyDescription.constraint = {
contains: {
value: 'CT'
}
};
var isFollowup = new HP.ProtocolMatchingRule();
isFollowup.required = true;
isFollowup.attribute = 'timepointType';
isFollowup.constraint = {
equals: {
value: 'followup'
}
};
proto.addProtocolMatchingRule(studyDescription);
proto.addProtocolMatchingRule(isFollowup);
var oneByTwo = new HP.ViewportStructure('grid', {
rows: 1,
columns: 2
});
// Stage 1
var left = new HP.Viewport();
var right = new HP.Viewport();
var baseline = new HP.StudyMatchingRule(true);
baseline.required = true;
baseline.attribute = 'timepointType';
baseline.constraint = {
equals: {
value: 'baseline'
}
};
var followup = new HP.StudyMatchingRule();
followup.required = true;
followup.attribute = 'timepointType';
followup.constraint = {
equals: {
value: 'followup'
}
};
var body = new HP.SeriesMatchingRule();
body.attribute = 'seriesDescription';
body.weight = 5;
body.constraint = {
contains: {
value: 'Body'
}
};
var chest = new HP.SeriesMatchingRule();
chest.attribute = 'seriesDescription';
chest.constraint = {
contains: {
value: 'CHEST'
}
};
left.studyMatchingRules.push(baseline);
left.seriesMatchingRules.push(body);
left.seriesMatchingRules.push(chest);
right.studyMatchingRules.push(followup);
right.seriesMatchingRules.push(body);
right.seriesMatchingRules.push(chest);
var first = new HP.Stage(oneByTwo, 'oneByTwo');
first.viewports.push(left);
first.viewports.push(right);
proto.addStage(first);
HP.lesionTrackerFollowupProtocol = proto;
HP.lesionTrackerFollowupProtocol.id = 'lesionTrackerFollowupProtocol';
Meteor.call('removeHangingProtocolByID', HP.lesionTrackerBaselineProtocol.id, function() {
HangingProtocols.insert(HP.lesionTrackerBaselineProtocol);
});
Meteor.call('removeHangingProtocolByID', HP.lesionTrackerFollowupProtocol.id, function() {
HangingProtocols.insert(HP.lesionTrackerFollowupProtocol);
});
Meteor.startup(function() {
getTimepointType = function(study) {
var timepoint = Timepoints.findOne({
studyInstanceUids: {
$in: [study.studyInstanceUid]
}
});
if (!timepoint) {
return;
}
return timepoint.timepointType;
};
HP.addCustomAttribute('timepointType', 'Timepoint Type', getTimepointType);
});
+1 -2
View File
@@ -15,8 +15,7 @@ Object.keys(ViewerData).forEach(function(contentId) {
Router.configure({
layoutTemplate: 'lesionTrackerLayout',
loadingTemplate: 'lesionTrackerLayout',
notFoundTemplate: 'notFound'
loadingTemplate: 'lesionTrackerLayout'
});
Router.onBeforeAction('loading');