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({
userId: {
type: String,
label: "User ID"
label: 'User ID'
},
patientId: {
type: String,
label: "Patient ID"
label: 'Patient ID'
},
measurementNumber: {
type: Number,
label: "Measurement Number",
label: 'Measurement Number',
optional: true
},
measurementNumberOverall: {
type: Number,
label: "Measurement Number Overall",
label: 'Measurement Number Overall',
optional: true
},
timepointId: {
type: String,
label: "Timepoint ID",
label: 'Timepoint ID',
optional: true
},
// 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
optional: true
},
})
const StudyLevelMeasurement = new SimpleSchema([Measurement, {
studyInstanceUid: {
type: String,
label: 'Study Instance UID'
}
}]);
});
const SeriesLevelMeasurement = new SimpleSchema([StudyLevelMeasurement, {
seriesInstanceUid: {
type: String,
label: 'Series Instance UID'
const StudyLevelMeasurement = new SimpleSchema([
Measurement,
{
studyInstanceUid: {
type: String,
label: 'Study Instance UID'
}
}
}]);
]);
const InstanceLevelMeasurement = new SimpleSchema([StudyLevelMeasurement, SeriesLevelMeasurement, {
sopInstanceUid: {
type: String,
label: 'SOP Instance UID'
const SeriesLevelMeasurement = new SimpleSchema([
StudyLevelMeasurement,
{
seriesInstanceUid: {
type: String,
label: 'Series Instance UID'
}
}
}]);
]);
const FrameLevelMeasurement = new SimpleSchema([StudyLevelMeasurement, SeriesLevelMeasurement, InstanceLevelMeasurement, {
frameIndex: {
type: Number,
min: 0,
label: 'Frame index in Instance'
},
// TODO: In the future we should remove this in favour of searching ViewerStudies and display sets when
// re-displaying measurements. Otherwise if a study moves servers the measurements will not be displayed correctly
imageId: {
type: String,
label: 'Cornerstone Image Id'
const InstanceLevelMeasurement = new SimpleSchema([
StudyLevelMeasurement,
SeriesLevelMeasurement,
{
sopInstanceUid: {
type: String,
label: 'SOP Instance UID'
}
}
}]);
]);
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 FrameLevelMeasurement = new SimpleSchema([
StudyLevelMeasurement,
SeriesLevelMeasurement,
InstanceLevelMeasurement,
{
frameIndex: {
type: Number,
min: 0,
label: 'Frame index in Instance'
},
// TODO: In the future we should remove this in favour of searching ViewerStudies and display sets when
// 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,
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({
x: {
@ -178,7 +196,7 @@ const CornerstoneHandleSchema = new SimpleSchema({
label: 'Locked',
optional: true,
defaultValue: false
},
}
});
export const MeasurementSchemaTypes = {
@ -189,4 +207,4 @@ export const MeasurementSchemaTypes = {
FrameLevelMeasurement: FrameLevelMeasurement,
CornerstoneToolMeasurement: CornerstoneToolMeasurement,
CornerstoneHandleSchema: CornerstoneHandleSchema
};
};

View File

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

View File

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

View File

@ -4,8 +4,7 @@
<div class="col-md-12">
<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>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
select a study.</p>
<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>
</div>
</div>
@ -21,44 +20,44 @@
</thead>
<tbody>
{{ #each relevantStudies }}
<tr>
<td class="center">
<input type="checkbox" class="includeStudy" {{valueIf autoselected '' 'checked'}}/>
</td>
<td class="center studyDataCell {{ #if autoselected }}disabled{{ /if }}">
{{ #if autoselected}}
<p class="studyDate autoselected"
data-toggle="tooltip"
title="This study was autoselected.">
{{formatDA studyDate}}
</p>
{{ else }}
<p class="studyDate">{{formatDA studyDate}}</p>
{{ /if }}
</td>
<td class="center studyDataCell {{ #if autoselected }}disabled{{ /if }}">
<p>{{formatPN patientName}}</p>
</td>
<td class="studyDataCell {{ #if autoselected }}disabled{{ /if }}">
<p>{{studyDescription}}</p>
</td>
<td class="timepointOptions center studyDataCell noselect {{ #if autoselected }}disabled{{ /if }}">
{{ #each timepointOptions }}
<label class="noselect">
<input type="radio"
name="{{../_id}}"
value="{{value}}"
class="timepointOption"
{{ valueIf checked 'checked' ''}}
{{ valueIf autoselected 'disabled' ''}}>
{{name}}
</label>
{{ /each }}
</td>
</tr>
{{ /each }}
{{#each relevantStudies}}
<tr>
<td class="center">
<input type="checkbox" class="includeStudy" {{valueIf autoselected '' 'checked'}}/>
</td>
<td class="center studyDataCell {{#if autoselected}}disabled{{/if}}">
{{#if autoselected}}
<p class="studyDate autoselected"
data-toggle="tooltip"
title="This study was autoselected.">
{{formatDA studyDate}}
</p>
{{else}}
<p class="studyDate">{{formatDA studyDate}}</p>
{{/if}}
</td>
<td class="center studyDataCell {{#if autoselected}}disabled{{/if}}">
<p>{{formatPN patientName}}</p>
</td>
<td class="studyDataCell {{#if autoselected}}disabled{{/if}}">
<p>{{studyDescription}}</p>
</td>
<td class="timepointOptions center studyDataCell noselect {{#if autoselected}}disabled{{/if}}">
{{#each timepointOptions}}
<label class="noselect">
<input type="radio"
name="{{../_id}}"
value="{{value}}"
class="timepointOption"
{{valueIf checked 'checked' ''}}
{{valueIf autoselected 'disabled' ''}}>
{{name}}
</label>
{{/each}}
</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</template>
</template>

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 './helpers';

View File

@ -29,75 +29,11 @@ Package.onUse(function(api) {
api.use('ohif:log');
api.use('ohif:study-list');
api.addFiles('both/schema/measurements.js', ['client', 'server']);
api.addFiles('both/schema/timepoints.js', ['client', 'server']);
// Client and server imports
api.addFiles('both/index.js', ['client', 'server']);
api.addFiles('both/configuration/measurements.js', ['client', 'server']);
api.addFiles('both/configuration/timepoints.js', ['client', 'server']);
// Client imports and routes
// Client imports
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']);
});