PWV-1: Refactoring ohif:measurements import structure for templates

This commit is contained in:
Bruno Alves de Faria 2016-09-22 19:21:59 -03:00 committed by Erik Ziegler
parent 7bbd380983
commit 8e6ac3bf1e
14 changed files with 194 additions and 173 deletions

View File

@ -0,0 +1,2 @@
import './measurements.js';
import './timepoints.js';

View File

@ -0,0 +1,2 @@
import './configuration';
import './schema';

View File

@ -0,0 +1,2 @@
import './measurements.js';
import './timepoints.js';

View File

@ -3,25 +3,25 @@ import { SimpleSchema } from 'meteor/aldeed:simple-schema';
const Measurement = new SimpleSchema({ const Measurement = new SimpleSchema({
userId: { userId: {
type: String, type: String,
label: "User ID" label: 'User ID'
}, },
patientId: { patientId: {
type: String, type: String,
label: "Patient ID" label: 'Patient ID'
}, },
measurementNumber: { measurementNumber: {
type: Number, type: Number,
label: "Measurement Number", label: 'Measurement Number',
optional: true optional: true
}, },
measurementNumberOverall: { measurementNumberOverall: {
type: Number, type: Number,
label: "Measurement Number Overall", label: 'Measurement Number Overall',
optional: true optional: true
}, },
timepointId: { timepointId: {
type: String, type: String,
label: "Timepoint ID", label: 'Timepoint ID',
optional: true optional: true
}, },
// Force value to be current date (on server) upon insert // Force value to be current date (on server) upon insert
@ -51,70 +51,88 @@ const Measurement = new SimpleSchema({
}, },
// denyInsert: true, // Commenting this out for now since we are constantly re-adding entries to client-side collections // denyInsert: true, // Commenting this out for now since we are constantly re-adding entries to client-side collections
optional: true optional: true
},
})
const StudyLevelMeasurement = new SimpleSchema([Measurement, {
studyInstanceUid: {
type: String,
label: 'Study Instance UID'
} }
}]); });
const SeriesLevelMeasurement = new SimpleSchema([StudyLevelMeasurement, { const StudyLevelMeasurement = new SimpleSchema([
seriesInstanceUid: { Measurement,
type: String, {
label: 'Series Instance UID' studyInstanceUid: {
type: String,
label: 'Study Instance UID'
}
} }
}]); ]);
const InstanceLevelMeasurement = new SimpleSchema([StudyLevelMeasurement, SeriesLevelMeasurement, { const SeriesLevelMeasurement = new SimpleSchema([
sopInstanceUid: { StudyLevelMeasurement,
type: String, {
label: 'SOP Instance UID' seriesInstanceUid: {
type: String,
label: 'Series Instance UID'
}
} }
}]); ]);
const FrameLevelMeasurement = new SimpleSchema([StudyLevelMeasurement, SeriesLevelMeasurement, InstanceLevelMeasurement, { const InstanceLevelMeasurement = new SimpleSchema([
frameIndex: { StudyLevelMeasurement,
type: Number, SeriesLevelMeasurement,
min: 0, {
label: 'Frame index in Instance' sopInstanceUid: {
}, type: String,
// TODO: In the future we should remove this in favour of searching ViewerStudies and display sets when label: 'SOP Instance UID'
// re-displaying measurements. Otherwise if a study moves servers the measurements will not be displayed correctly }
imageId: {
type: String,
label: 'Cornerstone Image Id'
} }
}]); ]);
const CornerstoneToolMeasurement = new SimpleSchema([StudyLevelMeasurement, const FrameLevelMeasurement = new SimpleSchema([
SeriesLevelMeasurement, StudyLevelMeasurement,
InstanceLevelMeasurement, SeriesLevelMeasurement,
FrameLevelMeasurement, { InstanceLevelMeasurement,
toolType: { {
type: String, frameIndex: {
label: 'Cornerstone Tool Type', type: Number,
optional: true min: 0,
}, label: 'Frame index in Instance'
visible: { },
type: Boolean, // TODO: In the future we should remove this in favour of searching ViewerStudies and display sets when
label: 'Visible', // re-displaying measurements. Otherwise if a study moves servers the measurements will not be displayed correctly
defaultValue: true imageId: {
}, type: String,
active: { label: 'Cornerstone Image Id'
type: Boolean, }
label: 'Active',
defaultValue: false
},
invalidated: {
type: Boolean,
label: 'Invalidated',
defaultValue: false,
optional: true
} }
}]); ]);
const CornerstoneToolMeasurement = new SimpleSchema([
StudyLevelMeasurement,
SeriesLevelMeasurement,
InstanceLevelMeasurement,
FrameLevelMeasurement,
{
toolType: {
type: String,
label: 'Cornerstone Tool Type',
optional: true
},
visible: {
type: Boolean,
label: 'Visible',
defaultValue: true
},
active: {
type: Boolean,
label: 'Active',
defaultValue: false
},
invalidated: {
type: Boolean,
label: 'Invalidated',
defaultValue: false,
optional: true
}
}
]);
const CornerstoneHandleSchema = new SimpleSchema({ const CornerstoneHandleSchema = new SimpleSchema({
x: { x: {
@ -178,7 +196,7 @@ const CornerstoneHandleSchema = new SimpleSchema({
label: 'Locked', label: 'Locked',
optional: true, optional: true,
defaultValue: false defaultValue: false
}, }
}); });
export const MeasurementSchemaTypes = { export const MeasurementSchemaTypes = {

View File

@ -28,5 +28,5 @@ export const schema = new SimpleSchema({
latestDate: { latestDate: {
type: Date, type: Date,
label: 'Most recent Study Date from associated studies', label: 'Most recent Study Date from associated studies',
}, }
}); });

View File

@ -7,7 +7,7 @@
<h4 class="modal-title" id="associationModalLabel">Study Association</h4> <h4 class="modal-title" id="associationModalLabel">Study Association</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
{{ >studyAssociationTable }} {{>studyAssociationTable}}
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-primary" id="saveAssociations">Save</button> <button type="button" class="btn btn-primary" id="saveAssociations">Save</button>

View File

@ -4,8 +4,7 @@
<div class="col-md-12"> <div class="col-md-12">
<h4>Instructions</h4> <h4>Instructions</h4>
<p>Associate the selected studies with timepoints in the clinical trial. Only 1 follow-up time point can be associated at the same time.</p> <p>Associate the selected studies with timepoints in the clinical trial. Only 1 follow-up time point can be associated at the same time.</p>
<p>We have automatically retrieved all studies within 14 days (<strong>{{formatDA earliestDate}}</strong> to <strong>{{formatDA latestDate}}</strong>) of your selected studies, in case you forgot to <p>We have automatically retrieved all studies within 14 days (<strong>{{formatDA this.earliestDate}}</strong> to <strong>{{formatDA latestDate}}</strong>) of your selected studies, in case you forgot to select a study.</p>
select a study.</p>
</div> </div>
</div> </div>
@ -21,43 +20,43 @@
</thead> </thead>
<tbody> <tbody>
{{ #each relevantStudies }} {{#each relevantStudies}}
<tr> <tr>
<td class="center"> <td class="center">
<input type="checkbox" class="includeStudy" {{valueIf autoselected '' 'checked'}}/> <input type="checkbox" class="includeStudy" {{valueIf autoselected '' 'checked'}}/>
</td> </td>
<td class="center studyDataCell {{ #if autoselected }}disabled{{ /if }}"> <td class="center studyDataCell {{#if autoselected}}disabled{{/if}}">
{{ #if autoselected}} {{#if autoselected}}
<p class="studyDate autoselected" <p class="studyDate autoselected"
data-toggle="tooltip" data-toggle="tooltip"
title="This study was autoselected."> title="This study was autoselected.">
{{formatDA studyDate}} {{formatDA studyDate}}
</p> </p>
{{ else }} {{else}}
<p class="studyDate">{{formatDA studyDate}}</p> <p class="studyDate">{{formatDA studyDate}}</p>
{{ /if }} {{/if}}
</td> </td>
<td class="center studyDataCell {{ #if autoselected }}disabled{{ /if }}"> <td class="center studyDataCell {{#if autoselected}}disabled{{/if}}">
<p>{{formatPN patientName}}</p> <p>{{formatPN patientName}}</p>
</td> </td>
<td class="studyDataCell {{ #if autoselected }}disabled{{ /if }}"> <td class="studyDataCell {{#if autoselected}}disabled{{/if}}">
<p>{{studyDescription}}</p> <p>{{studyDescription}}</p>
</td> </td>
<td class="timepointOptions center studyDataCell noselect {{ #if autoselected }}disabled{{ /if }}"> <td class="timepointOptions center studyDataCell noselect {{#if autoselected}}disabled{{/if}}">
{{ #each timepointOptions }} {{#each timepointOptions}}
<label class="noselect"> <label class="noselect">
<input type="radio" <input type="radio"
name="{{../_id}}" name="{{../_id}}"
value="{{value}}" value="{{value}}"
class="timepointOption" class="timepointOption"
{{ valueIf checked 'checked' ''}} {{valueIf checked 'checked' ''}}
{{ valueIf autoselected 'disabled' ''}}> {{valueIf autoselected 'disabled' ''}}>
{{name}} {{name}}
</label> </label>
{{ /each }} {{/each}}
</td> </td>
</tr> </tr>
{{ /each }} {{/each}}
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@ -0,0 +1,11 @@
// Study-Timepoint Association imports
import './associationModal/associationModal.html';
import './associationModal/associationModal.styl';
import './associationModal/associationModal.js';
import './associationModal/studyAssociationTable/studyAssociationTable.html';
import './associationModal/studyAssociationTable/studyAssociationTable.styl';
import './associationModal/studyAssociationTable/studyAssociationTable.js';
import './confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.html';
import './confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.js';

View File

@ -0,0 +1,8 @@
// Case Progress imports
import './caseProgress.html';
import './caseProgress.styl';
import './caseProgress.js';
import './radialProgressBar/radialProgressBar.html';
import './radialProgressBar/radialProgressBar.styl';
import './radialProgressBar/radialProgressBar.js';

View File

@ -0,0 +1,4 @@
import './association';
import './caseProgress';
import './longitudinal';
import './measurementTable';

View File

@ -0,0 +1,10 @@
// Longitudinal Components imports
import './longitudinalStudyListStudy/longitudinalStudyListStudy.html';
import './longitudinalStudyListStudy/longitudinalStudyListStudy.styl';
import './longitudinalStudyListStudy/longitudinalStudyListStudy.js';
import './longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.html';
import './longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.js';
import './longitudinalViewportOverlay/longitudinalViewportOverlay.html';
import './longitudinalViewportOverlay/longitudinalViewportOverlay.js';

View File

@ -0,0 +1,28 @@
// Measurement Table Components imports
import './measurementTable.html';
import './measurementTable.styl';
import './measurementTable.js';
import './measurementTableView/measurementTableView.html';
import './measurementTableView/measurementTableView.styl';
import './measurementTableView/measurementTableView.js';
import './measurementTableHUD/measurementTableHUD.html';
import './measurementTableHUD/measurementTableHUD.styl';
import './measurementTableHUD/measurementTableHUD.js';
import './measurementTableRow/measurementTableRow.html';
import './measurementTableRow/measurementTableRow.styl';
import './measurementTableRow/measurementTableRow.js';
import './measurementTableHeaderRow/measurementTableHeaderRow.html';
import './measurementTableHeaderRow/measurementTableHeaderRow.styl';
import './measurementTableHeaderRow/measurementTableHeaderRow.js';
import './measurementTableTimepointCell/measurementTableTimepointCell.html';
import './measurementTableTimepointCell/measurementTableTimepointCell.styl';
import './measurementTableTimepointCell/measurementTableTimepointCell.js';
import './measurementTableTimepointHeader/measurementTableTimepointHeader.html';
import './measurementTableTimepointHeader/measurementTableTimepointHeader.styl';
import './measurementTableTimepointHeader/measurementTableTimepointHeader.js';

View File

@ -1,2 +1,3 @@
import './components';
import './lib'; import './lib';
import './helpers'; import './helpers';

View File

@ -29,75 +29,11 @@ Package.onUse(function(api) {
api.use('ohif:log'); api.use('ohif:log');
api.use('ohif:study-list'); api.use('ohif:study-list');
api.addFiles('both/schema/measurements.js', ['client', 'server']); // Client and server imports
api.addFiles('both/schema/timepoints.js', ['client', 'server']); api.addFiles('both/index.js', ['client', 'server']);
api.addFiles('both/configuration/measurements.js', ['client', 'server']); // Client imports
api.addFiles('both/configuration/timepoints.js', ['client', 'server']);
// Client imports and routes
api.addFiles('client/index.js', 'client'); api.addFiles('client/index.js', 'client');
// Measurement Table Components
api.addFiles('client/components/measurementTable/measurementTable.html', 'client');
api.addFiles('client/components/measurementTable/measurementTable.styl', 'client');
api.addFiles('client/components/measurementTable/measurementTable.js', 'client');
api.addFiles('client/components/measurementTable/measurementTableView/measurementTableView.html', 'client');
api.addFiles('client/components/measurementTable/measurementTableView/measurementTableView.styl', 'client');
api.addFiles('client/components/measurementTable/measurementTableView/measurementTableView.js', 'client');
api.addFiles('client/components/measurementTable/measurementTableHUD/measurementTableHUD.html', 'client');
api.addFiles('client/components/measurementTable/measurementTableHUD/measurementTableHUD.styl', 'client');
api.addFiles('client/components/measurementTable/measurementTableHUD/measurementTableHUD.js', 'client');
api.addFiles('client/components/measurementTable/measurementTableRow/measurementTableRow.html', 'client');
api.addFiles('client/components/measurementTable/measurementTableRow/measurementTableRow.styl', 'client');
api.addFiles('client/components/measurementTable/measurementTableRow/measurementTableRow.js', 'client');
api.addFiles('client/components/measurementTable/measurementTableHeaderRow/measurementTableHeaderRow.html', 'client');
api.addFiles('client/components/measurementTable/measurementTableHeaderRow/measurementTableHeaderRow.styl', 'client');
api.addFiles('client/components/measurementTable/measurementTableHeaderRow/measurementTableHeaderRow.js', 'client');
api.addFiles('client/components/measurementTable/measurementTableTimepointCell/measurementTableTimepointCell.html', 'client');
api.addFiles('client/components/measurementTable/measurementTableTimepointCell/measurementTableTimepointCell.styl', 'client');
api.addFiles('client/components/measurementTable/measurementTableTimepointCell/measurementTableTimepointCell.js', 'client');
api.addFiles('client/components/measurementTable/measurementTableTimepointHeader/measurementTableTimepointHeader.html', 'client');
api.addFiles('client/components/measurementTable/measurementTableTimepointHeader/measurementTableTimepointHeader.styl', 'client');
api.addFiles('client/components/measurementTable/measurementTableTimepointHeader/measurementTableTimepointHeader.js', 'client');
// Longitudinal Components
api.addFiles('client/components/longitudinal/longitudinalStudyListStudy/longitudinalStudyListStudy.html', 'client');
api.addFiles('client/components/longitudinal/longitudinalStudyListStudy/longitudinalStudyListStudy.styl', 'client');
api.addFiles('client/components/longitudinal/longitudinalStudyListStudy/longitudinalStudyListStudy.js', 'client');
api.addFiles('client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.html', 'client');
api.addFiles('client/components/longitudinal/longitudinalStudyListContextMenu/longitudinalStudyListContextMenu.js', 'client');
api.addFiles('client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.html', 'client');
api.addFiles('client/components/longitudinal/longitudinalViewportOverlay/longitudinalViewportOverlay.js', 'client');
// Case Progress
api.addFiles('client/components/caseProgress/caseProgress.html', 'client');
api.addFiles('client/components/caseProgress/caseProgress.styl', 'client');
api.addFiles('client/components/caseProgress/caseProgress.js', 'client');
api.addFiles('client/components/caseProgress/radialProgressBar/radialProgressBar.html', 'client');
api.addFiles('client/components/caseProgress/radialProgressBar/radialProgressBar.styl', 'client');
api.addFiles('client/components/caseProgress/radialProgressBar/radialProgressBar.js', 'client');
// Study-Timepoint Association
api.addFiles('client/components/association/associationModal/associationModal.html', 'client');
api.addFiles('client/components/association/associationModal/associationModal.styl', 'client');
api.addFiles('client/components/association/associationModal/associationModal.js', 'client');
api.addFiles('client/components/association/associationModal/studyAssociationTable/studyAssociationTable.html', 'client');
api.addFiles('client/components/association/associationModal/studyAssociationTable/studyAssociationTable.styl', 'client');
api.addFiles('client/components/association/associationModal/studyAssociationTable/studyAssociationTable.js', 'client');
api.addFiles('client/components/association/confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.html', 'client');
api.addFiles('client/components/association/confirmRemoveTimepointAssociation/confirmRemoveTimepointAssociation.js', 'client');
api.export('MeasurementSchemaTypes', ['client', 'server']); api.export('MeasurementSchemaTypes', ['client', 'server']);
}); });