LT-249: Implementing behavior for 'comparison' and 'key timepoints' switch
This commit is contained in:
parent
ef89c3dfd7
commit
048bb3f050
@ -4,13 +4,13 @@
|
|||||||
{{>studyTimepointBrowser}}
|
{{>studyTimepointBrowser}}
|
||||||
</div>
|
</div>
|
||||||
<div class="mainContent {{#if leftSidebarOpen}}sidebar-left-open{{/if}} {{#if rightSidebarOpen}}sidebar-right-open{{/if}}">
|
<div class="mainContent {{#if leftSidebarOpen}}sidebar-left-open{{/if}} {{#if rightSidebarOpen}}sidebar-right-open{{/if}}">
|
||||||
{{>viewerMain }}
|
{{>viewerMain}}
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebarMenu sidebar-right {{#if lesionSidebarOpen}}sidebar-open{{/if}}">
|
<div class="sidebarMenu sidebar-right {{#if lesionSidebarOpen}}sidebar-open{{/if}}">
|
||||||
{{>lesionTable }}
|
{{>lesionTable}}
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebarMenu sidebar-right {{#if additionalMeasurementsSidebarOpen}}sidebar-open{{/if}}">
|
<div class="sidebarMenu sidebar-right {{#if additionalMeasurementsSidebarOpen}}sidebar-open{{/if}}">
|
||||||
{{>additionalMeasurements }}
|
{{>additionalMeasurements}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -4,10 +4,10 @@
|
|||||||
{{>roundedButtonGroup buttonGroupData}}
|
{{>roundedButtonGroup buttonGroupData}}
|
||||||
</div>
|
</div>
|
||||||
<div class="lesionTableTimepointHeaderRow">
|
<div class="lesionTableTimepointHeaderRow">
|
||||||
{{#each timepoints}}
|
{{#each timepoints.get}}
|
||||||
{{>lesionTableTimepointHeader}}
|
{{>lesionTableTimepointHeader}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
{{>lesionTableView}}
|
{{>lesionTableView this}}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -1,48 +1,37 @@
|
|||||||
Template.lesionTable.helpers({
|
Template.lesionTable.onCreated(() => {
|
||||||
timepoints: function() {
|
const instance = Template.instance();
|
||||||
return Timepoints.find({}, {
|
|
||||||
|
instance.data.lesionTableLayout = new ReactiveVar('comparison');
|
||||||
|
instance.data.timepoints = new ReactiveVar([]);
|
||||||
|
|
||||||
|
instance.autorun(() => {
|
||||||
|
// Get the current table layout
|
||||||
|
const tableLayout = instance.data.lesionTableLayout.get();
|
||||||
|
|
||||||
|
// Get all the timepoints
|
||||||
|
const allTimepoints = Timepoints.find({}, {
|
||||||
sort: {
|
sort: {
|
||||||
latestDate: 1
|
latestDate: -1
|
||||||
}
|
}
|
||||||
});
|
}).fetch();
|
||||||
},
|
|
||||||
|
|
||||||
buttonGroupData() {
|
// Get the last 2 timepoints
|
||||||
const instance = Template.instance();
|
let timepoints = allTimepoints.slice(0, 2);
|
||||||
return {
|
|
||||||
value: instance.lesionTableLayout,
|
|
||||||
options: [{
|
|
||||||
value: 'comparison',
|
|
||||||
text: 'Comparison'
|
|
||||||
}, {
|
|
||||||
value: 'key',
|
|
||||||
text: 'Key Timepoints'
|
|
||||||
}]
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Template.lesionTable.events({
|
// Concatenate the baseline if the table layout is for key timepoints
|
||||||
/**
|
if (tableLayout === 'key' && allTimepoints.length > 2) {
|
||||||
* Retrieve the lesion id from the DOM data for this row
|
timepoints = timepoints.concat(_.last(allTimepoints));
|
||||||
*/
|
}
|
||||||
/*'click table#tblLesion tbody tr': function(e, template) {
|
|
||||||
var measurementId = $(e.currentTarget).data('measurementid');
|
// Return key timepoints
|
||||||
activateLesion(measurementId, template.data);
|
instance.data.timepoints.set(timepoints);
|
||||||
},*/
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Temporary until we have a real window manager with events for series/study changed
|
// Temporary until we have a real window manager with events for series/study changed
|
||||||
Session.setDefault('NewSeriesLoaded', false);
|
Session.setDefault('NewSeriesLoaded', false);
|
||||||
|
|
||||||
Template.lesionTable.onCreated(function() {
|
Template.lesionTable.onRendered(() => {
|
||||||
var instance = this;
|
|
||||||
|
|
||||||
instance.lesionTableLayout = new ReactiveVar();
|
|
||||||
instance.lesionTableLayout.set('comparison');
|
|
||||||
});
|
|
||||||
|
|
||||||
Template.lesionTable.onRendered(function() {
|
|
||||||
// Find the first measurement by Lesion Number
|
// Find the first measurement by Lesion Number
|
||||||
var firstLesion = Measurements.findOne({}, {
|
var firstLesion = Measurements.findOne({}, {
|
||||||
sort: {
|
sort: {
|
||||||
@ -60,3 +49,33 @@ Template.lesionTable.onRendered(function() {
|
|||||||
activateLesion(firstLesion._id, templateData);
|
activateLesion(firstLesion._id, templateData);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Template.lesionTable.events({
|
||||||
|
/**
|
||||||
|
* Retrieve the lesion id from the DOM data for this row
|
||||||
|
*/
|
||||||
|
/*'click table#tblLesion tbody tr': function(e, template) {
|
||||||
|
var measurementId = $(e.currentTarget).data('measurementid');
|
||||||
|
activateLesion(measurementId, template.data);
|
||||||
|
},*/
|
||||||
|
});
|
||||||
|
|
||||||
|
Template.lesionTable.helpers({
|
||||||
|
dataContainer() {
|
||||||
|
return {};
|
||||||
|
},
|
||||||
|
|
||||||
|
buttonGroupData() {
|
||||||
|
const instance = Template.instance();
|
||||||
|
return {
|
||||||
|
value: instance.data.lesionTableLayout,
|
||||||
|
options: [{
|
||||||
|
value: 'comparison',
|
||||||
|
text: 'Comparison'
|
||||||
|
}, {
|
||||||
|
value: 'key',
|
||||||
|
text: 'Key Timepoints'
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|||||||
@ -2,16 +2,16 @@
|
|||||||
<div class="lesionTableRow {{#if descriptionRequired}}warning{{/if}}{{#if responseStatus}}response-status{{/if}}" data-measurementid="{{_id}}">
|
<div class="lesionTableRow {{#if descriptionRequired}}warning{{/if}}{{#if responseStatus}}response-status{{/if}}" data-measurementid="{{_id}}">
|
||||||
<div class='lesionRowSidebar'>
|
<div class='lesionRowSidebar'>
|
||||||
<div class="lesionNumber">
|
<div class="lesionNumber">
|
||||||
{{lesionNumberAbsolute}}
|
{{rowItem.lesionNumberAbsolute}}
|
||||||
</div>
|
</div>
|
||||||
{{#if descriptionRequired}}
|
{{#if rowItem.descriptionRequired}}
|
||||||
<div class="warning-icon">
|
<div class="warning-icon">
|
||||||
<svg>
|
<svg>
|
||||||
<use xlink:href=/packages/lesiontracker/assets/icons.svg#icon-ui-warning></use>
|
<use xlink:href=/packages/lesiontracker/assets/icons.svg#icon-ui-warning></use>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
{{#if responseStatus}}
|
{{#if rowItem.responseStatus}}
|
||||||
<div class="response-status-icon">
|
<div class="response-status-icon">
|
||||||
CR
|
CR
|
||||||
</div>
|
</div>
|
||||||
@ -19,17 +19,17 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="lesionDetails">
|
<div class="lesionDetails">
|
||||||
<div class='location'>
|
<div class='location'>
|
||||||
{{ #if location }}
|
{{#if rowItem.location}}
|
||||||
{{location}}
|
{{rowItem.location}}
|
||||||
{{ else }}
|
{{else}}
|
||||||
(No description)
|
(No description)
|
||||||
{{ /if }}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<div class="timepointData">
|
<div class="timepointData">
|
||||||
<!--Each time point as a column-->
|
<!--Each time point as a column-->
|
||||||
{{# each timepoints }}
|
{{#each timepoints.get}}
|
||||||
{{> lesionTableTimepointCell}}
|
{{>lesionTableTimepointCell}}
|
||||||
{{/ each }}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,13 +1,3 @@
|
|||||||
Template.lesionTableRow.helpers({
|
|
||||||
timepoints: function() {
|
|
||||||
return Timepoints.find({}, {
|
|
||||||
sort: {
|
|
||||||
timepointName: 1
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function doneCallback(measurementData, deleteTool) {
|
function doneCallback(measurementData, deleteTool) {
|
||||||
// If a Lesion or Non-Target is removed via a dialog
|
// If a Lesion or Non-Target is removed via a dialog
|
||||||
// opened by the Lesion Table, we should clear the data for
|
// opened by the Lesion Table, we should clear the data for
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
<template name="lesionTableTimepointCell">
|
<template name="lesionTableTimepointCell">
|
||||||
{{ #if hasDataAtThisTimepoint }}
|
{{#if hasDataAtThisTimepoint}}
|
||||||
<div class="lesionTableTimepointCell" tabindex="1">
|
<div class="lesionTableTimepointCell" tabindex="1">
|
||||||
{{displayData}}
|
{{displayData}}
|
||||||
</div>
|
</div>
|
||||||
{{ else }}
|
{{else}}
|
||||||
<div class="lesionTableTimepointCell empty">
|
<div class="lesionTableTimepointCell empty">
|
||||||
...
|
...
|
||||||
</div>
|
</div>
|
||||||
{{ /if }}
|
{{/if}}
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -2,14 +2,14 @@ Template.lesionTableTimepointCell.helpers({
|
|||||||
hasDataAtThisTimepoint: function() {
|
hasDataAtThisTimepoint: function() {
|
||||||
// This simple function just checks whether or not timepoint data
|
// This simple function just checks whether or not timepoint data
|
||||||
// exists for this Measurement at this Timepoint
|
// exists for this Measurement at this Timepoint
|
||||||
var lesionData = Template.parentData(1);
|
var lesionData = Template.parentData(1).rowItem;
|
||||||
return (lesionData &&
|
return (lesionData &&
|
||||||
lesionData.timepoints &&
|
lesionData.timepoints &&
|
||||||
lesionData.timepoints[this.timepointId]);
|
lesionData.timepoints[this.timepointId]);
|
||||||
},
|
},
|
||||||
displayData: function() {
|
displayData: function() {
|
||||||
// Search Measurements by lesion and timepoint
|
// Search Measurements by lesion and timepoint
|
||||||
var lesionData = Template.parentData(1);
|
var lesionData = Template.parentData(1).rowItem;
|
||||||
if (!lesionData ||
|
if (!lesionData ||
|
||||||
!lesionData.timepoints ||
|
!lesionData.timepoints ||
|
||||||
!lesionData.timepoints[this.timepointId]) {
|
!lesionData.timepoints[this.timepointId]) {
|
||||||
@ -49,7 +49,7 @@ Template.lesionTableTimepointCell.helpers({
|
|||||||
},
|
},
|
||||||
|
|
||||||
isBidirectional: function() {
|
isBidirectional: function() {
|
||||||
var lesionData = Template.parentData(1);
|
var lesionData = Template.parentData(1).rowItem;
|
||||||
if (lesionData.toolType === 'bidirectional') {
|
if (lesionData.toolType === 'bidirectional') {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ Template.lesionTableTimepointCell.events({
|
|||||||
'dblclick .lesionTableTimepointCell': function() {
|
'dblclick .lesionTableTimepointCell': function() {
|
||||||
log.info('Double clicked on a timepoint cell');
|
log.info('Double clicked on a timepoint cell');
|
||||||
// Search Measurements by lesion and timepoint
|
// Search Measurements by lesion and timepoint
|
||||||
var currentMeasurement = Template.parentData(1);
|
var currentMeasurement = Template.parentData(1).rowItem;
|
||||||
|
|
||||||
// Create some fake measurement data
|
// Create some fake measurement data
|
||||||
var currentTimepointID = this.timepointId;
|
var currentTimepointID = this.timepointId;
|
||||||
@ -110,7 +110,7 @@ Template.lesionTableTimepointCell.events({
|
|||||||
var keyCode = e.which;
|
var keyCode = e.which;
|
||||||
if (keyCode === keys.DELETE ||
|
if (keyCode === keys.DELETE ||
|
||||||
(keyCode === keys.D && e.ctrlKey === true)) {
|
(keyCode === keys.D && e.ctrlKey === true)) {
|
||||||
var currentMeasurement = Template.parentData(1);
|
var currentMeasurement = Template.parentData(1).rowItem;
|
||||||
var currentTimepointID = this.timepointId;
|
var currentTimepointID = this.timepointId;
|
||||||
|
|
||||||
showConfirmDialog(function() {
|
showConfirmDialog(function() {
|
||||||
|
|||||||
@ -1,18 +1,18 @@
|
|||||||
<template name="lesionTableView">
|
<template name="lesionTableView">
|
||||||
<div class="lesionTableView scrollArea">
|
<div class="lesionTableView scrollArea">
|
||||||
{{ >lesionTableHeaderRow id="target" type="Targets" measurements=targets}}
|
{{>lesionTableHeaderRow id="target" type="Targets" measurements=targets}}
|
||||||
{{ #each targets }}
|
{{#each target in targets}}
|
||||||
{{ >lesionTableRow }}
|
{{>lesionTableRow (extend this rowItem=target)}}
|
||||||
{{ /each }}
|
{{/each}}
|
||||||
|
|
||||||
{{ >lesionTableHeaderRow id="nonTarget" type="Non-targets" measurements=nonTargets}}
|
{{>lesionTableHeaderRow id="nonTarget" type="Non-targets" measurements=nonTargets}}
|
||||||
{{ #each nonTargets }}
|
{{#each nonTarget in nonTargets}}
|
||||||
{{ >lesionTableRow }}
|
{{>lesionTableRow (extend this rowItem=nonTarget)}}
|
||||||
{{ /each }}
|
{{/each}}
|
||||||
|
|
||||||
{{ >lesionTableHeaderRow id="newLesions" type="New lesions" measurements=newLesions}}
|
{{>lesionTableHeaderRow id="newLesions" type="New lesions" measurements=newLesions}}
|
||||||
{{ #each nonTargets }}
|
{{#each newLesion in newLesions}}
|
||||||
{{ >lesionTableRow }}
|
{{>lesionTableRow (extend this rowItem=newLesion)}}
|
||||||
{{ /each }}
|
{{/each}}
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
Template.lesionTableView.helpers({
|
Template.lesionTableView.helpers({
|
||||||
targets: function () {
|
targets() {
|
||||||
// All Targets shall be listed first followed by Non-Targets
|
// All Targets shall be listed first followed by Non-Targets
|
||||||
return Measurements.find({
|
return Measurements.find({
|
||||||
isTarget: true
|
isTarget: true
|
||||||
@ -9,7 +9,7 @@ Template.lesionTableView.helpers({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
nonTargets: function () {
|
nonTargets() {
|
||||||
// All Targets shall be listed first followed by Non-Targets
|
// All Targets shall be listed first followed by Non-Targets
|
||||||
return Measurements.find({
|
return Measurements.find({
|
||||||
isTarget: false
|
isTarget: false
|
||||||
@ -19,7 +19,7 @@ Template.lesionTableView.helpers({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
newLesions: function () {
|
newLesions() {
|
||||||
// All Targets shall be listed first followed by Non-Targets
|
// All Targets shall be listed first followed by Non-Targets
|
||||||
return Measurements.find({
|
return Measurements.find({
|
||||||
saved: false
|
saved: false
|
||||||
@ -29,4 +29,4 @@ Template.lesionTableView.helpers({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
33
Packages/viewerbase/lib/helpers/blaze.js
Normal file
33
Packages/viewerbase/lib/helpers/blaze.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
// Return the current template instance
|
||||||
|
Template.registerHelper('instance', () => {
|
||||||
|
return Template.instance();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create a new object and extends it with the argument objects
|
||||||
|
Template.registerHelper('extend', (...argsArray) => {
|
||||||
|
// Create the resulting object
|
||||||
|
const result = {};
|
||||||
|
|
||||||
|
// Extract the Spacebars kw hash
|
||||||
|
const kwHash = _.last(argsArray).hash;
|
||||||
|
|
||||||
|
// Extract the given objects
|
||||||
|
const objects = _.initial(argsArray);
|
||||||
|
|
||||||
|
// Iterate over the given objects
|
||||||
|
_.each(objects, current => {
|
||||||
|
// Stop here if the current argument is not an object
|
||||||
|
if (typeof current !== 'object') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extend the resulting object with the current argument object
|
||||||
|
_.extend(result, current);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Extend the resulting object with the Spacebars kw hash
|
||||||
|
_.extend(result, kwHash);
|
||||||
|
|
||||||
|
// Return the resulting object
|
||||||
|
return result;
|
||||||
|
});
|
||||||
@ -175,6 +175,7 @@ Package.onUse(function(api) {
|
|||||||
// UI Helpers
|
// UI Helpers
|
||||||
api.addFiles([
|
api.addFiles([
|
||||||
'lib/helpers/formatDA.js',
|
'lib/helpers/formatDA.js',
|
||||||
|
'lib/helpers/blaze.js',
|
||||||
'lib/helpers/logical.js',
|
'lib/helpers/logical.js',
|
||||||
'lib/helpers/formatJSDate.js',
|
'lib/helpers/formatJSDate.js',
|
||||||
'lib/helpers/jsDateFromNow.js',
|
'lib/helpers/jsDateFromNow.js',
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user