LT-92: Displaying the criteria nonconformities when clicking the warning icon
This commit is contained in:
parent
65b867d1b0
commit
db4792b3de
@ -0,0 +1,19 @@
|
||||
<template name="dialogSimple">
|
||||
<div id="{{this.id}}" class="modal fade" tabindex="-1" role="dialog">
|
||||
<div class="modal-dialog {{this.dialogClass}}" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
{{#button class='close' action='cancel'
|
||||
tagAttributes=(extend this.tagAttributes
|
||||
data-dismiss='modal' aria-label='Close'
|
||||
)
|
||||
}}<span aria-hidden="true">×</span>{{/button}}
|
||||
<h4 class="modal-title">{{this.title}}</h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
{{>UI.contentBlock}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -0,0 +1,44 @@
|
||||
import { Template } from 'meteor/templating';
|
||||
import { _ } from 'meteor/underscore';
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
|
||||
Template.dialogSimple.onCreated(() => {
|
||||
const instance = Template.instance();
|
||||
|
||||
instance.close = () => {
|
||||
const $modal = instance.$('.modal');
|
||||
$modal.on('hidden.bs.modal', () => instance.data.promiseResolve()).modal('hide');
|
||||
};
|
||||
});
|
||||
|
||||
Template.dialogSimple.onRendered(() => {
|
||||
const instance = Template.instance();
|
||||
|
||||
// Allow options ovewrite
|
||||
const modalOptions = _.extend({
|
||||
backdrop: 'static',
|
||||
keyboard: false
|
||||
}, instance.data.modalOptions);
|
||||
|
||||
const $modal = instance.$('.modal');
|
||||
|
||||
// Create the bootstrap modal
|
||||
$modal.modal(modalOptions);
|
||||
|
||||
const position = instance.data.position;
|
||||
if (position) {
|
||||
OHIF.ui.repositionDialog($modal, position.x, position.y);
|
||||
}
|
||||
});
|
||||
|
||||
Template.dialogSimple.events({
|
||||
keydown(event) {
|
||||
const instance = Template.instance();
|
||||
const keyCode = event.keyCode || event.which;
|
||||
|
||||
if (keyCode === 27) {
|
||||
instance.close();
|
||||
event.stopPropagation();
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -5,6 +5,8 @@ import './dialog/form.html';
|
||||
import './dialog/form.js';
|
||||
import './dialog/login.html';
|
||||
import './dialog/login.js';
|
||||
import './dialog/simple.html';
|
||||
import './dialog/simple.js';
|
||||
import './dialog/unsavedChangesDialog.html';
|
||||
import './dialog/unsavedChangesDialog.js';
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@ import { Blaze } from 'meteor/blaze';
|
||||
import { _ } from 'meteor/underscore';
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
|
||||
OHIF.ui.showFormDialog = (templateName, dialogData) => {
|
||||
OHIF.ui.showDialog = (templateName, dialogData) => {
|
||||
// Check if the given template exists
|
||||
const template = Template[templateName];
|
||||
if (!template) {
|
||||
@ -23,7 +23,7 @@ OHIF.ui.repositionDialog = ($modal, x, y) => {
|
||||
$dialog.css({
|
||||
left,
|
||||
top
|
||||
}).trigger('spatialChanged');
|
||||
}).trigger('spatialChanged').one('transitionend', () => $dialog.trigger('spatialChanged'));
|
||||
|
||||
// Switch the modal to its previous visibility state
|
||||
$modal.toggle(isVisible);
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import './bounded/bounded.js';
|
||||
import './dimensional/dimensional.js';
|
||||
import './dialog/form.js';
|
||||
import './dialog/display.js';
|
||||
import './dialog/spatial.js';
|
||||
import './dialog/unsavedChangesDialog.js';
|
||||
import './draggable/draggable.js';
|
||||
|
||||
@ -417,7 +417,7 @@ export const unsavedChanges = {
|
||||
title: 'You have unsaved changes!',
|
||||
message: "Your changes will be lost if you don't save them before leaving the current page... Are you sure you want to proceed?"
|
||||
}, options);
|
||||
OHIF.ui.showFormDialog('dialogConfirm', dialogOptions).then(function() {
|
||||
OHIF.ui.showDialog('dialogConfirm', dialogOptions).then(function() {
|
||||
// Unsaved changes exist but user confirms action...
|
||||
shouldProceed = true;
|
||||
callback.call(null, shouldProceed, hasChanges);
|
||||
|
||||
@ -9,6 +9,10 @@ html hr
|
||||
body .table > thead > tr > th
|
||||
theme('border-color', '$uiBorderColor')
|
||||
|
||||
body ol
|
||||
margin: 0
|
||||
padding-left: 1em
|
||||
|
||||
label.form-group
|
||||
width: 100%
|
||||
|
||||
|
||||
@ -81,7 +81,7 @@
|
||||
|
||||
// TODO= Refactor this so the confirmation dialog is an
|
||||
// optional settable callback in the tool's configuration
|
||||
OHIF.ui.showFormDialog('dialogConfirm', dialogSettings).then(() => {
|
||||
OHIF.ui.showDialog('dialogConfirm', dialogSettings).then(() => {
|
||||
removeMeasurementTimepoint(nearbyToolData.tool,
|
||||
nearbyToolData.index,
|
||||
nearbyToolData.toolType,
|
||||
|
||||
@ -40,7 +40,7 @@ import { toolManager } from 'meteor/ohif:viewerbase';
|
||||
|
||||
delete measurementData.isCreating;
|
||||
|
||||
OHIF.ui.showFormDialog('dialogNonTargetMeasurement', {
|
||||
OHIF.ui.showDialog('dialogNonTargetMeasurement', {
|
||||
position: getPosition(eventData),
|
||||
title: 'Select Lesion Location',
|
||||
element: eventData.element,
|
||||
@ -53,7 +53,7 @@ import { toolManager } from 'meteor/ohif:viewerbase';
|
||||
return;
|
||||
}
|
||||
|
||||
OHIF.ui.showFormDialog('dialogNonTargetMeasurement', {
|
||||
OHIF.ui.showDialog('dialogNonTargetMeasurement', {
|
||||
position: getPosition(eventData),
|
||||
title: 'Change Lesion Location',
|
||||
element: eventData.element,
|
||||
|
||||
@ -44,7 +44,7 @@ Template.dialogNonTargetMeasurement.onCreated(() => {
|
||||
message: 'Are you sure you want to remove this Non-Target measurement?'
|
||||
};
|
||||
|
||||
OHIF.ui.showFormDialog('dialogConfirm', dialogSettings)
|
||||
OHIF.ui.showDialog('dialogConfirm', dialogSettings)
|
||||
.then(instance.removeMeasurement);
|
||||
|
||||
instance.closeDialog();
|
||||
|
||||
@ -67,7 +67,7 @@ Template.longitudinalStudyListContextMenu.helpers({
|
||||
Template.longitudinalStudyListContextMenu.replaces(defaultTemplate);
|
||||
Template[defaultTemplate].inheritsHelpersFrom('longitudinalStudyListContextMenu');
|
||||
|
||||
StudyList.functions.launchStudyAssociation = () => OHIF.ui.showFormDialog('dialogStudyAssociation');
|
||||
StudyList.functions.launchStudyAssociation = () => OHIF.ui.showDialog('dialogStudyAssociation');
|
||||
StudyList.functions.removeTimepointAssociations = removeTimepointAssociations;
|
||||
StudyList.functions.exportSelectedStudies = exportSelectedStudies;
|
||||
StudyList.functions.viewStudies = viewStudies;
|
||||
@ -86,7 +86,7 @@ function removeTimepointAssociations($study, event) {
|
||||
}
|
||||
};
|
||||
|
||||
OHIF.ui.showFormDialog('dialogConfirm', dialogSettings).then(() => {
|
||||
OHIF.ui.showDialog('dialogConfirm', dialogSettings).then(() => {
|
||||
// Get a Cursor pointing to the selected Studies from the StudyList
|
||||
const selectedStudies = OHIF.studylist.getSelectedStudies();
|
||||
|
||||
|
||||
@ -26,3 +26,5 @@ import './measurementTableTimepointCell/measurementTableTimepointCell.js';
|
||||
import './measurementTableTimepointHeader/measurementTableTimepointHeader.html';
|
||||
import './measurementTableTimepointHeader/measurementTableTimepointHeader.styl';
|
||||
import './measurementTableTimepointHeader/measurementTableTimepointHeader.js';
|
||||
|
||||
import './measurementTableWarnings/measurementTableWarningsDialog.html';
|
||||
|
||||
@ -1,42 +1,41 @@
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
import { Template } from 'meteor/templating';
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
import { _ } from 'meteor/underscore';
|
||||
|
||||
function doneCallback(measurementData, deleteTool) {
|
||||
// If a Lesion or Non-Target is removed via a dialog
|
||||
// opened by the Lesion Table, we should clear the data for
|
||||
// the specified Timepoint Cell
|
||||
if (deleteTool === true) {
|
||||
Meteor.call('removeMeasurement', measurementData.id, function(error, response) {
|
||||
if (error) {
|
||||
OHIF.log.warn(error);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Template.measurementTableRow.onCreated(() => {
|
||||
const instance = Template.instance();
|
||||
|
||||
// Delete a lesion if Ctrl+D or DELETE is pressed while a lesion is selected
|
||||
const keys = {
|
||||
D: 68,
|
||||
DELETE: 46
|
||||
};
|
||||
|
||||
Template.measurementTableRow.helpers({
|
||||
hasWarnings() {
|
||||
const toolsGroupsMap = this.measurementApi.toolsGroupsMap;
|
||||
const measurementTypeId = this.rowItem.measurementTypeId;
|
||||
const measurementNumber = this.rowItem.measurementNumber;
|
||||
const groupedNonConformities = this.conformanceCriteria.groupedNonConformities.get() || {};
|
||||
instance.getWarningMessages = () => {
|
||||
const measurementTypeId = instance.data.rowItem.measurementTypeId;
|
||||
const measurementNumber = instance.data.rowItem.measurementNumber;
|
||||
const groupedNonConformities = instance.data.conformanceCriteria.groupedNonConformities.get() || {};
|
||||
const nonConformitiesByMeasurementTypeId = groupedNonConformities[measurementTypeId] || {};
|
||||
const nonConformitiesByMeasurementNumbers = nonConformitiesByMeasurementTypeId.measurementNumbers || {};
|
||||
const nonConformitiesByMeasurementNumber = nonConformitiesByMeasurementNumbers[measurementNumber] || {};
|
||||
|
||||
return nonConformitiesByMeasurementNumber.messages && nonConformitiesByMeasurementNumber.messages.length;
|
||||
return nonConformitiesByMeasurementNumber.messages || [];
|
||||
};
|
||||
});
|
||||
|
||||
Template.measurementTableRow.helpers({
|
||||
hasWarnings() {
|
||||
return !!Template.instance().getWarningMessages().length;
|
||||
}
|
||||
});
|
||||
|
||||
Template.measurementTableRow.events({
|
||||
'click .measurementRowSidebar .warning-icon'(event, instance) {
|
||||
event.stopPropagation();
|
||||
OHIF.ui.showDialog('measurementTableWarningsDialog', {
|
||||
title: 'Criteria Nonconformities',
|
||||
messages: instance.getWarningMessages(),
|
||||
position: {
|
||||
x: event.clientX,
|
||||
y: event.clientY
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
'click .measurementRowSidebar'(event, instance) {
|
||||
const $row = instance.$('.measurementTableRow');
|
||||
const rowItem = instance.data.rowItem;
|
||||
@ -70,10 +69,14 @@ Template.measurementTableRow.events({
|
||||
'click .js-delete'(event, instance) {
|
||||
const dialogSettings = {
|
||||
title: 'Delete measurements',
|
||||
message: 'Are you sure you want to delete the measurement across all timepoints?'
|
||||
message: 'Are you sure you want to delete the measurement across all timepoints?',
|
||||
position: {
|
||||
x: event.clientX,
|
||||
y: event.clientY
|
||||
}
|
||||
};
|
||||
|
||||
OHIF.ui.showFormDialog('dialogConfirm', dialogSettings).then(formData => {
|
||||
OHIF.ui.showDialog('dialogConfirm', dialogSettings).then(formData => {
|
||||
const measurementTypeId = instance.data.rowItem.measurementTypeId;
|
||||
const measurement = instance.data.rowItem.entries[0];
|
||||
const measurementNumber = measurement.measurementNumber;
|
||||
|
||||
@ -84,7 +84,7 @@ Template.measurementTableTimepointCell.events({
|
||||
message: 'Are you sure you want to delete this measurement?'
|
||||
};
|
||||
|
||||
OHIF.ui.showFormDialog('dialogConfirm', dialogSettings).then(() => {
|
||||
OHIF.ui.showDialog('dialogConfirm', dialogSettings).then(() => {
|
||||
const measurementTypeId = instance.data.rowItem.measurementTypeId;
|
||||
const measurement = instance.data.rowItem.entries[0];
|
||||
const measurementNumber = measurement.measurementNumber;
|
||||
|
||||
@ -0,0 +1,9 @@
|
||||
<template name="measurementTableWarningsDialog">
|
||||
{{#dialogSimple (extend this dialogClass='modal-sm')}}
|
||||
<ol>
|
||||
{{#each message in this.messages}}
|
||||
<li>{{message}}</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
{{/dialogSimple}}
|
||||
</template>
|
||||
@ -1,5 +1,7 @@
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
import { ReactiveVar } from 'meteor/reactive-var';
|
||||
import { Tracker } from 'meteor/tracker';
|
||||
import { _ } from 'meteor/underscore';
|
||||
import { OHIF } from 'meteor/ohif:core';
|
||||
import { CriteriaEvaluator } from './CriteriaEvaluator';
|
||||
import * as evaluations from './evaluations';
|
||||
|
||||
@ -49,7 +51,7 @@ class ConformanceCriteria {
|
||||
const toolsGroupsMap = this.measurementApi.toolsGroupsMap;
|
||||
|
||||
nonConformities.forEach(nonConformity => {
|
||||
if(nonConformity.isGlobal) {
|
||||
if (nonConformity.isGlobal) {
|
||||
groups.globals = groups.globals || { messages: [] };
|
||||
groups.globals.messages.push(nonConformity.message);
|
||||
|
||||
@ -64,11 +66,11 @@ class ConformanceCriteria {
|
||||
const measureNumber = measurement.measurementNumber;
|
||||
let measurementNumbers = group.measurementNumbers[measureNumber];
|
||||
|
||||
if(!measurementNumbers) {
|
||||
if (!measurementNumbers) {
|
||||
measurementNumbers = group.measurementNumbers[measureNumber] = {
|
||||
messages: [],
|
||||
measurements: []
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
measurementNumbers.messages.push(nonConformity.message);
|
||||
@ -76,8 +78,6 @@ class ConformanceCriteria {
|
||||
});
|
||||
});
|
||||
|
||||
console.log('>>>>> groups: ', groups);
|
||||
|
||||
return groups;
|
||||
}
|
||||
|
||||
@ -96,12 +96,12 @@ class ConformanceCriteria {
|
||||
getEvaluators(timepointId, trialCriteriaType) {
|
||||
const evaluators = [];
|
||||
const trialCriteriaTypeId = trialCriteriaType.id.toLowerCase();
|
||||
const evaluation = evaluations[trialCriteriaTypeId]
|
||||
|
||||
if(evaluation) {
|
||||
const evaluation = evaluations[trialCriteriaTypeId];
|
||||
|
||||
if (evaluation) {
|
||||
const evaluationTimepoint = evaluation[timepointId];
|
||||
|
||||
if(evaluationTimepoint) {
|
||||
if (evaluationTimepoint) {
|
||||
evaluators.push(new CriteriaEvaluator(evaluationTimepoint));
|
||||
}
|
||||
}
|
||||
@ -127,7 +127,7 @@ class ConformanceCriteria {
|
||||
const timepointId = measurement.timepointId;
|
||||
const timepoint = this.timepointApi.timepoints.findOne({ timepointId });
|
||||
|
||||
if((timepointType !== 'both') && (timepoint.timepointType !== timepointType)) {
|
||||
if ((timepointType !== 'both') && (timepoint.timepointType !== timepointType)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@ -48,7 +48,7 @@ function exportSelectedStudies($study, event) {
|
||||
const studiesCount = selectedStudies.length;
|
||||
const studyText = studiesCount > 1 ? 'Studies' : 'Study';
|
||||
|
||||
OHIF.ui.showFormDialog('dialogConfirm', {
|
||||
OHIF.ui.showDialog('dialogConfirm', {
|
||||
element: event.element,
|
||||
title: `Export ${studyText}`,
|
||||
message: `Would you like to export ${studiesCount} ${studyText.toLowerCase()}?`
|
||||
|
||||
@ -41,7 +41,7 @@ const exportQueriedStudiesWithProgress = studiesToExport => {
|
||||
const exportFilesCount = getNumberOfFilesToExport(studiesToExport);
|
||||
let exportHandler;
|
||||
|
||||
return OHIF.ui.showFormDialog('dialogProgress', {
|
||||
return OHIF.ui.showDialog('dialogProgress', {
|
||||
title: 'Exporting Studies...',
|
||||
message: `Exported files: 0 / ${exportFilesCount}`,
|
||||
total: getNumberOfFilesToExport(studiesToExport),
|
||||
|
||||
@ -32,7 +32,7 @@ queryStudies = function(studiesToQuery, options) {
|
||||
}
|
||||
|
||||
queryStudiesWithProgress = function(studiesToQuery) {
|
||||
return OHIF.ui.showFormDialog('dialogProgress', {
|
||||
return OHIF.ui.showDialog('dialogProgress', {
|
||||
title: 'Querying Studies...',
|
||||
message: `Queried: 0 / ${studiesToQuery.length}`,
|
||||
total: studiesToQuery.length,
|
||||
|
||||
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user