First pass at a Hanging Protocol implementation and editor (LT-131)
This commit is contained in:
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);
|
||||
});
|
||||
@@ -15,8 +15,7 @@ Object.keys(ViewerData).forEach(function(contentId) {
|
||||
|
||||
Router.configure({
|
||||
layoutTemplate: 'lesionTrackerLayout',
|
||||
loadingTemplate: 'lesionTrackerLayout',
|
||||
notFoundTemplate: 'notFound'
|
||||
loadingTemplate: 'lesionTrackerLayout'
|
||||
});
|
||||
|
||||
Router.onBeforeAction('loading');
|
||||
|
||||
Reference in new issue
Block a user