Instance metadata/metadata providers overhaul (#1481)
* Instance metadata plus metadata provider overhaul. Fix consumption of wado-uri urls fallbacks + datatype agnosticism. WIP DICOMify things. fix various issues with naturalized variable naming migration. Remove metadata provider. Fix consumption of multiframe images and addition of CWIL metadata. Fix strange build issues. Fix CWIL style windowWidth to array from naturalized DICOM. Fix PT, CT, CR and DX issues for cornerstone + DX issues for vtkjs. Move color palette fetching down to the natuaralized JSON level. Remove unused StudyMetadataSummary Remove redundant dicom metadata dictionary. Working local + json routes. Fix SR read. Finished first round of testing + cleaned up debugging etc. * data => metadata for instance naturalizedJSON * Update dcmjs version * Correct github isssues. * Fix erroneously replaced files. * Danny's recommended changes. * Instance metadata plus metadata provider overhaul. Fix consumption of wado-uri urls fallbacks + datatype agnosticism. WIP DICOMify things. fix various issues with naturalized variable naming migration. Remove metadata provider. Fix consumption of multiframe images and addition of CWIL metadata. Fix strange build issues. Fix CWIL style windowWidth to array from naturalized DICOM. Fix PT, CT, CR and DX issues for cornerstone + DX issues for vtkjs. Move color palette fetching down to the natuaralized JSON level. Remove unused StudyMetadataSummary Remove redundant dicom metadata dictionary. Working local + json routes. Fix SR read. Finished first round of testing + cleaned up debugging etc. * data => metadata for instance naturalizedJSON * Update dcmjs version * Correct github isssues. * Fix erroneously replaced files. * Danny's recommended changes. * Update JSON CI * Update casing of import. * Fix jump for SR. * Fix unit tests for measurements service * Fix json CI test. * fix: update yarn lock * Fix local non-encapsulated pdf view * CI updated to new sucess message. Co-authored-by: Danny <danny.ri.brown@gmail.com>
This commit is contained in:
1 parent
8833731ad3
commit
1d85f7a74e
142 files changed
+5322
-8570
No files matched your search
@@ -10,8 +10,8 @@ import './LayoutChooser.styl';
|
||||
|
||||
class LayoutChooser extends PureComponent {
|
||||
static propTypes = {
|
||||
rows: PropTypes.number.isRequired,
|
||||
columns: PropTypes.number.isRequired,
|
||||
Rows: PropTypes.number.isRequired,
|
||||
Columns: PropTypes.number.isRequired,
|
||||
visible: PropTypes.bool.isRequired,
|
||||
selectedCell: PropTypes.object,
|
||||
boxSize: PropTypes.number.isRequired,
|
||||
@@ -21,8 +21,8 @@ class LayoutChooser extends PureComponent {
|
||||
};
|
||||
|
||||
static defaultProps = {
|
||||
rows: 3,
|
||||
columns: 3,
|
||||
Rows: 3,
|
||||
Columns: 3,
|
||||
visible: true,
|
||||
boxSize: 20,
|
||||
cellBorder: 1,
|
||||
@@ -63,9 +63,9 @@ class LayoutChooser extends PureComponent {
|
||||
};
|
||||
highlightCells = currentCell => {
|
||||
let table = [];
|
||||
for (let row = 0; row < this.props.rows; row++) {
|
||||
for (let row = 0; row < this.props.Rows; row++) {
|
||||
let newRow = [];
|
||||
for (let col = 0; col < this.props.columns; col++) {
|
||||
for (let col = 0; col < this.props.Columns; col++) {
|
||||
let cell = { row: row, col: col };
|
||||
if (this.isRange(cell, currentCell)) {
|
||||
cell.className = 'hover';
|
||||
@@ -83,11 +83,11 @@ class LayoutChooser extends PureComponent {
|
||||
};
|
||||
|
||||
render() {
|
||||
let columns = this.props.columns;
|
||||
let Columns = this.props.Columns;
|
||||
const style = {
|
||||
display: this.props.visible ? 'block' : 'none',
|
||||
minWidth:
|
||||
columns * this.props.boxSize + (columns + 5) * this.props.cellBorder,
|
||||
Columns * this.props.boxSize + (Columns + 5) * this.props.cellBorder,
|
||||
};
|
||||
return (
|
||||
<div
|
||||
|
||||
@@ -12,10 +12,10 @@ export class QuickSwitch extends Component {
|
||||
side: PropTypes.string,
|
||||
studyListData: PropTypes.array.isRequired,
|
||||
onSeriesSelected: PropTypes.func.isRequired,
|
||||
seriesListData: PropTypes.array,
|
||||
seriesData: PropTypes.array,
|
||||
onStudySelected: PropTypes.func,
|
||||
activeStudyInstanceUid: PropTypes.string,
|
||||
activeDisplaySetInstanceUid: PropTypes.string,
|
||||
activeStudyInstanceUID: PropTypes.string,
|
||||
activeDisplaySetInstanceUID: PropTypes.string,
|
||||
};
|
||||
|
||||
constructor(props) {
|
||||
@@ -24,26 +24,26 @@ export class QuickSwitch extends Component {
|
||||
this.state = {
|
||||
seriesQuickSwitchOpen: false,
|
||||
sideClass: this.props.side || '',
|
||||
activeStudyInstanceUid: this.props.activeStudyInstanceUid,
|
||||
activeDisplaySetInstanceUid: this.props.activeDisplaySetInstanceUid,
|
||||
activeStudyInstanceUID: this.props.activeStudyInstanceUID,
|
||||
activeDisplaySetInstanceUID: this.props.activeDisplaySetInstanceUID,
|
||||
};
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps) {
|
||||
const props = this.props;
|
||||
|
||||
if (props.activeStudyInstanceUid !== prevProps.activeStudyInstanceUid) {
|
||||
if (props.activeStudyInstanceUID !== prevProps.activeStudyInstanceUID) {
|
||||
this.setState({
|
||||
activeStudyInstanceUid: props.activeStudyInstanceUid,
|
||||
activeStudyInstanceUID: props.activeStudyInstanceUID,
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
props.activeDisplaySetInstanceUid !==
|
||||
prevProps.activeDisplaySetInstanceUid
|
||||
props.activeDisplaySetInstanceUID !==
|
||||
prevProps.activeDisplaySetInstanceUID
|
||||
) {
|
||||
this.setState({
|
||||
activeDisplaySetInstanceUid: props.activeDisplaySetInstanceUid,
|
||||
activeDisplaySetInstanceUID: props.activeDisplaySetInstanceUID,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -55,9 +55,7 @@ export class QuickSwitch extends Component {
|
||||
|
||||
return (
|
||||
<div
|
||||
className={`series-quick-switch clearfix noselect ${
|
||||
this.state.sideClass
|
||||
} ${quickSwitchClass}`}
|
||||
className={`series-quick-switch clearfix noselect ${this.state.sideClass} ${quickSwitchClass}`}
|
||||
onMouseLeave={this.hideSeriesSwitch}
|
||||
>
|
||||
<div className="series-switch" onMouseEnter={this.showSeriesSwitch}>
|
||||
@@ -68,8 +66,8 @@ export class QuickSwitch extends Component {
|
||||
<SeriesList
|
||||
seriesItems={this.getSeriesItems()}
|
||||
onClick={this.onSeriesClick}
|
||||
activeDisplaySetInstanceUid={
|
||||
this.state.activeDisplaySetInstanceUid
|
||||
activeDisplaySetInstanceUID={
|
||||
this.state.activeDisplaySetInstanceUID
|
||||
}
|
||||
/>
|
||||
</ScrollableArea>
|
||||
@@ -82,7 +80,7 @@ export class QuickSwitch extends Component {
|
||||
<StudiesList
|
||||
studyListData={this.props.studyListData}
|
||||
onClick={this.onStudyClick}
|
||||
activeStudyInstanceUid={this.state.activeStudyInstanceUid}
|
||||
activeStudyInstanceUID={this.state.activeStudyInstanceUID}
|
||||
/>
|
||||
</ScrollableArea>
|
||||
</div>
|
||||
@@ -92,29 +90,29 @@ export class QuickSwitch extends Component {
|
||||
}
|
||||
|
||||
getSeriesItems = () => {
|
||||
let seriesListData;
|
||||
let seriesData;
|
||||
|
||||
if (this.props.seriesListData) {
|
||||
seriesListData = this.props.seriesListData;
|
||||
} else if (this.state.activeStudyInstanceUid) {
|
||||
if (this.props.seriesData) {
|
||||
seriesData = this.props.seriesData;
|
||||
} else if (this.state.activeStudyInstanceUID) {
|
||||
const study = this.props.studyListData.find(
|
||||
study => study.studyInstanceUid === this.state.activeStudyInstanceUid
|
||||
study => study.StudyInstanceUID === this.state.activeStudyInstanceUID
|
||||
);
|
||||
|
||||
seriesListData = study.thumbnails;
|
||||
seriesData = study.thumbnails;
|
||||
} else {
|
||||
seriesListData = this.props.studyListData[0].thumbnails;
|
||||
seriesData = this.props.studyListData[0].thumbnails;
|
||||
}
|
||||
|
||||
return seriesListData || [];
|
||||
return seriesData || [];
|
||||
};
|
||||
|
||||
getSmallListItems = () => {
|
||||
const seriesItems = this.getSeriesItems() || [];
|
||||
return seriesItems.map((seriesData, index) => {
|
||||
const active =
|
||||
seriesData.displaySetInstanceUid ===
|
||||
this.state.activeDisplaySetInstanceUid;
|
||||
seriesData.displaySetInstanceUID ===
|
||||
this.state.activeDisplaySetInstanceUID;
|
||||
return (
|
||||
<div key={index} className={`series-item ${active ? 'active' : ''}`} />
|
||||
);
|
||||
@@ -126,14 +124,14 @@ export class QuickSwitch extends Component {
|
||||
this.props.onStudySelected(studyDataSelected);
|
||||
}
|
||||
this.setState({
|
||||
activeStudyInstanceUid: studyDataSelected.studyInstanceUid,
|
||||
activeStudyInstanceUID: studyDataSelected.StudyInstanceUID,
|
||||
seriesQuickSwitchOpen: true,
|
||||
});
|
||||
};
|
||||
|
||||
onSeriesClick = seriesDataSelected => {
|
||||
this.setState({
|
||||
activeDisplaySetInstanceUid: seriesDataSelected.displaySetInstanceUid,
|
||||
activeDisplaySetInstanceUID: seriesDataSelected.displaySetInstanceUID,
|
||||
});
|
||||
|
||||
this.props.onSeriesSelected(seriesDataSelected);
|
||||
|
||||
@@ -8,7 +8,7 @@ export class SeriesList extends Component {
|
||||
static propTypes = {
|
||||
seriesItems: PropTypes.array.isRequired,
|
||||
onClick: PropTypes.func.isRequired,
|
||||
activeDisplaySetInstanceUid: PropTypes.string,
|
||||
activeDisplaySetInstanceUID: PropTypes.string,
|
||||
};
|
||||
|
||||
render() {
|
||||
@@ -25,12 +25,12 @@ export class SeriesList extends Component {
|
||||
return this.props.seriesItems.map((seriesData, index) => {
|
||||
return (
|
||||
<Thumbnail
|
||||
key={seriesData.displaySetInstanceUid}
|
||||
key={seriesData.displaySetInstanceUID}
|
||||
id={`series_thumb_${index}`}
|
||||
{...seriesData}
|
||||
active={
|
||||
seriesData.displaySetInstanceUid ===
|
||||
this.props.activeDisplaySetInstanceUid
|
||||
seriesData.displaySetInstanceUID ===
|
||||
this.props.activeDisplaySetInstanceUID
|
||||
}
|
||||
onClick={() => this.props.onClick(seriesData)}
|
||||
/>
|
||||
|
||||
@@ -12,13 +12,13 @@ export class StudiesItem extends Component {
|
||||
|
||||
render() {
|
||||
const {
|
||||
studyDate,
|
||||
studyDescription,
|
||||
StudyDate,
|
||||
StudyDescription,
|
||||
modalities,
|
||||
studyAvailable,
|
||||
} = this.props.studyData;
|
||||
const activeClass = this.props.active ? ' active' : '';
|
||||
const hasDescriptionAndDate = studyDate && studyDescription;
|
||||
const hasDescriptionAndDate = StudyDate && StudyDescription;
|
||||
return (
|
||||
<div
|
||||
className={`studyBrowseItem${activeClass}`}
|
||||
@@ -36,8 +36,8 @@ export class StudiesItem extends Component {
|
||||
<div className="studyText">
|
||||
{hasDescriptionAndDate ? (
|
||||
<React.Fragment>
|
||||
<div className="studyDate">{studyDate}</div>
|
||||
<div className="studyDescription">{studyDescription}</div>
|
||||
<div className="studyDate">{StudyDate}</div>
|
||||
<div className="studyDescription">{StudyDescription}</div>
|
||||
</React.Fragment>
|
||||
) : (
|
||||
<div className="studyAvailability">
|
||||
|
||||
@@ -8,7 +8,7 @@ $nestingMargin = 6px
|
||||
$spacerX = 7px
|
||||
$spacerY = 12px
|
||||
|
||||
.studyBrowseItem
|
||||
.studyBrowseItem
|
||||
margin-bottom: 10px;
|
||||
position: relative
|
||||
// required transformation to make inner fixed elements relative to this one
|
||||
@@ -58,7 +58,7 @@ $spacerY = 12px
|
||||
|
||||
&.additional
|
||||
color: var(--text-secondary-color)
|
||||
|
||||
|
||||
.studyModality
|
||||
color: var(--primary-background-color)
|
||||
&
|
||||
|
||||
@@ -9,7 +9,7 @@ export class StudiesList extends Component {
|
||||
class: PropTypes.string,
|
||||
studyListData: PropTypes.array.isRequired,
|
||||
onClick: PropTypes.func.isRequired,
|
||||
activeStudyInstanceUid: PropTypes.string,
|
||||
activeStudyInstanceUID: PropTypes.string,
|
||||
};
|
||||
|
||||
render() {
|
||||
@@ -27,7 +27,7 @@ export class StudiesList extends Component {
|
||||
key={index}
|
||||
studyData={studyData}
|
||||
active={
|
||||
studyData.studyInstanceUid === this.props.activeStudyInstanceUid
|
||||
studyData.StudyInstanceUID === this.props.activeStudyInstanceUID
|
||||
}
|
||||
onClick={event => this.props.onClick(studyData)}
|
||||
/>
|
||||
|
||||
@@ -23,17 +23,17 @@ import studies from './studies.js'
|
||||
studyListData={state.studyListData}
|
||||
// If this is always activeStudy's thumbnails,
|
||||
// Why do we need to specify this?
|
||||
seriesListData={
|
||||
seriesData={
|
||||
state.studyListData.find((study) => {
|
||||
return !!study.active;
|
||||
}).thumbnails}
|
||||
onSeriesSelected={(selectedSeries) => {
|
||||
const { studyListData } = state;
|
||||
const selectedId = selectedSeries.displaySetInstanceUid;
|
||||
const selectedId = selectedSeries.displaySetInstanceUID;
|
||||
|
||||
studyListData.forEach(study => {
|
||||
study.thumbnails.forEach(series => {
|
||||
series.active = series.displaySetInstanceUid === selectedId;
|
||||
series.active = series.displaySetInstanceUID === selectedId;
|
||||
})
|
||||
});
|
||||
|
||||
@@ -41,10 +41,10 @@ import studies from './studies.js'
|
||||
}}
|
||||
onStudySelected={(selectedStudy) => {
|
||||
const { studyListData } = state;
|
||||
const selectedId = selectedStudy.studyInstanceUid;
|
||||
const selectedId = selectedStudy.StudyInstanceUID;
|
||||
|
||||
studyListData.forEach(study => {
|
||||
study.active = study.studyInstanceUid === selectedId;
|
||||
study.active = study.StudyInstanceUID === selectedId;
|
||||
});
|
||||
|
||||
setState({ studyListData });
|
||||
|
||||
@@ -1,74 +1,74 @@
|
||||
export default [
|
||||
{
|
||||
studyInstanceUid: '10001',
|
||||
studyDescription: 'Anti-PD-1',
|
||||
StudyInstanceUID: '10001',
|
||||
StudyDescription: 'Anti-PD-1',
|
||||
modalities: 'CT',
|
||||
studyDate: '18-nov-2018',
|
||||
StudyDate: '18-nov-2018',
|
||||
active: false,
|
||||
thumbnails: [
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/Anti-PD-1_Lung.jpg',
|
||||
seriesDescription: 'Anti-PD-1_Lung',
|
||||
seriesNumber: '2',
|
||||
SeriesDescription: 'Anti-PD-1_Lung',
|
||||
SeriesNumber: '2',
|
||||
numImageFrames: 512,
|
||||
displaySetInstanceUid: '10001-1',
|
||||
displaySetInstanceUID: '10001-1',
|
||||
stackPercentComplete: 30,
|
||||
},
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/Anti-PD-1_MELANOMA.jpg',
|
||||
seriesDescription: 'Anti-PD-1_MELANOMA',
|
||||
seriesNumber: '2',
|
||||
instanceNumber: '1',
|
||||
SeriesDescription: 'Anti-PD-1_MELANOMA',
|
||||
SeriesNumber: '2',
|
||||
InstanceNumber: '1',
|
||||
numImageFrames: 256,
|
||||
displaySetInstanceUid: '10001-2',
|
||||
displaySetInstanceUID: '10001-2',
|
||||
stackPercentComplete: 70,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
studyInstanceUid: '10002',
|
||||
studyDescription: 'CPTAC',
|
||||
StudyInstanceUID: '10002',
|
||||
StudyDescription: 'CPTAC',
|
||||
modalities: 'CT',
|
||||
studyDate: '16-aug-2017',
|
||||
StudyDate: '16-aug-2017',
|
||||
active: true,
|
||||
thumbnails: [
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/CPTAC-GBM.jpg',
|
||||
seriesDescription: 'CPTAC-GBM',
|
||||
SeriesDescription: 'CPTAC-GBM',
|
||||
active: true,
|
||||
seriesNumber: '2',
|
||||
SeriesNumber: '2',
|
||||
numImageFrames: 512,
|
||||
displaySetInstanceUid: '10002-1',
|
||||
displaySetInstanceUID: '10002-1',
|
||||
stackPercentComplete: 100,
|
||||
},
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/CPTAC-CM.jpg',
|
||||
seriesDescription: 'CPTAC-CM',
|
||||
seriesNumber: '2',
|
||||
instanceNumber: '1',
|
||||
displaySetInstanceUid: '10002-2',
|
||||
SeriesDescription: 'CPTAC-CM',
|
||||
SeriesNumber: '2',
|
||||
InstanceNumber: '1',
|
||||
displaySetInstanceUID: '10002-2',
|
||||
numImageFrames: 256,
|
||||
},
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/CPTAC-HNSCC.jpg',
|
||||
seriesDescription: 'CPTAC-HNSCC',
|
||||
seriesNumber: '2',
|
||||
instanceNumber: '1',
|
||||
displaySetInstanceUid: '10002-3',
|
||||
SeriesDescription: 'CPTAC-HNSCC',
|
||||
SeriesNumber: '2',
|
||||
InstanceNumber: '1',
|
||||
displaySetInstanceUID: '10002-3',
|
||||
numImageFrames: 256,
|
||||
},
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/CPTAC-LSCC.jpg',
|
||||
seriesDescription: 'CPTAC-LSCC',
|
||||
seriesNumber: '2',
|
||||
instanceNumber: '1',
|
||||
displaySetInstanceUid: '10002-4',
|
||||
SeriesDescription: 'CPTAC-LSCC',
|
||||
SeriesNumber: '2',
|
||||
InstanceNumber: '1',
|
||||
displaySetInstanceUID: '10002-4',
|
||||
numImageFrames: 256,
|
||||
},
|
||||
],
|
||||
|
||||
@@ -16,23 +16,23 @@ function StudyBrowser(props) {
|
||||
<div className="scrollable-study-thumbnails">
|
||||
{studies
|
||||
.map((study, studyIndex) => {
|
||||
const { studyInstanceUid } = study;
|
||||
const { StudyInstanceUID } = study;
|
||||
return study.thumbnails.map((thumb, thumbIndex) => {
|
||||
// TODO: Thumb has more props than we care about?
|
||||
const {
|
||||
altImageText,
|
||||
displaySetInstanceUid,
|
||||
displaySetInstanceUID,
|
||||
imageId,
|
||||
instanceNumber,
|
||||
InstanceNumber,
|
||||
numImageFrames,
|
||||
seriesDescription,
|
||||
seriesNumber,
|
||||
SeriesDescription,
|
||||
SeriesNumber,
|
||||
stackPercentComplete,
|
||||
} = thumb;
|
||||
|
||||
return (
|
||||
<div
|
||||
key={thumb.displaySetInstanceUid}
|
||||
key={thumb.displaySetInstanceUID}
|
||||
className="thumbnail-container"
|
||||
data-cy="thumbnail-list"
|
||||
>
|
||||
@@ -41,20 +41,20 @@ function StudyBrowser(props) {
|
||||
key={`${studyIndex}_${thumbIndex}`}
|
||||
id={`${studyIndex}_${thumbIndex}`} // Unused?
|
||||
// Study
|
||||
studyInstanceUid={studyInstanceUid} // used by drop
|
||||
StudyInstanceUID={StudyInstanceUID} // used by drop
|
||||
// Thumb
|
||||
altImageText={altImageText}
|
||||
imageId={imageId}
|
||||
instanceNumber={instanceNumber}
|
||||
displaySetInstanceUid={displaySetInstanceUid} // used by drop
|
||||
InstanceNumber={InstanceNumber}
|
||||
displaySetInstanceUID={displaySetInstanceUID} // used by drop
|
||||
numImageFrames={numImageFrames}
|
||||
seriesDescription={seriesDescription}
|
||||
seriesNumber={seriesNumber}
|
||||
SeriesDescription={SeriesDescription}
|
||||
SeriesNumber={SeriesNumber}
|
||||
stackPercentComplete={stackPercentComplete}
|
||||
// Events
|
||||
onClick={onThumbnailClick.bind(
|
||||
undefined,
|
||||
displaySetInstanceUid
|
||||
displaySetInstanceUID
|
||||
)}
|
||||
onDoubleClick={onThumbnailDoubleClick}
|
||||
/>
|
||||
@@ -73,16 +73,16 @@ const noop = () => {};
|
||||
StudyBrowser.propTypes = {
|
||||
studies: PropTypes.arrayOf(
|
||||
PropTypes.shape({
|
||||
studyInstanceUid: PropTypes.string.isRequired,
|
||||
StudyInstanceUID: PropTypes.string.isRequired,
|
||||
thumbnails: PropTypes.arrayOf(
|
||||
PropTypes.shape({
|
||||
altImageText: PropTypes.string,
|
||||
displaySetInstanceUid: PropTypes.string.isRequired,
|
||||
displaySetInstanceUID: PropTypes.string.isRequired,
|
||||
imageId: PropTypes.string,
|
||||
instanceNumber: PropTypes.number,
|
||||
InstanceNumber: PropTypes.number,
|
||||
numImageFrames: PropTypes.number,
|
||||
seriesDescription: PropTypes.string,
|
||||
seriesNumber: PropTypes.number,
|
||||
SeriesDescription: PropTypes.string,
|
||||
SeriesNumber: PropTypes.number,
|
||||
stackPercentComplete: PropTypes.number,
|
||||
})
|
||||
),
|
||||
|
||||
@@ -7,12 +7,12 @@ import classNames from 'classnames';
|
||||
import './Thumbnail.styl';
|
||||
|
||||
function ThumbnailFooter({
|
||||
seriesDescription,
|
||||
seriesNumber,
|
||||
instanceNumber,
|
||||
SeriesDescription,
|
||||
SeriesNumber,
|
||||
InstanceNumber,
|
||||
numImageFrames,
|
||||
}) {
|
||||
const infoOnly = !seriesDescription;
|
||||
const infoOnly = !SeriesDescription;
|
||||
|
||||
const getInfo = (value, icon, className = '') => {
|
||||
return (
|
||||
@@ -23,18 +23,18 @@ function ThumbnailFooter({
|
||||
);
|
||||
};
|
||||
const getSeriesInformation = (
|
||||
seriesNumber,
|
||||
instanceNumber,
|
||||
SeriesNumber,
|
||||
InstanceNumber,
|
||||
numImageFrames
|
||||
) => {
|
||||
if (!seriesNumber && !instanceNumber && !numImageFrames) {
|
||||
if (!SeriesNumber && !InstanceNumber && !numImageFrames) {
|
||||
return;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="series-information">
|
||||
{getInfo(seriesNumber, 'S:')}
|
||||
{getInfo(instanceNumber, 'I:')}
|
||||
{getInfo(SeriesNumber, 'S:')}
|
||||
{getInfo(InstanceNumber, 'I:')}
|
||||
{getInfo(numImageFrames, '', 'image-frames')}
|
||||
</div>
|
||||
);
|
||||
@@ -42,8 +42,8 @@ function ThumbnailFooter({
|
||||
|
||||
return (
|
||||
<div className={classNames('series-details', { 'info-only': infoOnly })}>
|
||||
<div className="series-description">{seriesDescription}</div>
|
||||
{getSeriesInformation(seriesNumber, instanceNumber, numImageFrames)}
|
||||
<div className="series-description">{SeriesDescription}</div>
|
||||
{getSeriesInformation(SeriesNumber, InstanceNumber, numImageFrames)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -53,15 +53,15 @@ function Thumbnail(props) {
|
||||
active,
|
||||
altImageText,
|
||||
error,
|
||||
displaySetInstanceUid,
|
||||
displaySetInstanceUID,
|
||||
imageId,
|
||||
imageSrc,
|
||||
instanceNumber,
|
||||
InstanceNumber,
|
||||
numImageFrames,
|
||||
seriesDescription,
|
||||
seriesNumber,
|
||||
SeriesDescription,
|
||||
SeriesNumber,
|
||||
stackPercentComplete,
|
||||
studyInstanceUid,
|
||||
StudyInstanceUID,
|
||||
onClick,
|
||||
onDoubleClick,
|
||||
onMouseDown,
|
||||
@@ -72,8 +72,8 @@ function Thumbnail(props) {
|
||||
// `droppedItem` in `dropTarget`
|
||||
// The only data it will have access to
|
||||
item: {
|
||||
studyInstanceUid,
|
||||
displaySetInstanceUid,
|
||||
StudyInstanceUID,
|
||||
displaySetInstanceUID,
|
||||
type: 'thumbnail', // Has to match `dropTarget`'s type
|
||||
},
|
||||
canDrag: function(monitor) {
|
||||
@@ -117,8 +117,8 @@ const noop = () => {};
|
||||
Thumbnail.propTypes = {
|
||||
supportsDrag: PropTypes.bool,
|
||||
id: PropTypes.string.isRequired,
|
||||
displaySetInstanceUid: PropTypes.string.isRequired,
|
||||
studyInstanceUid: PropTypes.string.isRequired,
|
||||
displaySetInstanceUID: PropTypes.string.isRequired,
|
||||
StudyInstanceUID: PropTypes.string.isRequired,
|
||||
imageSrc: PropTypes.string,
|
||||
imageId: PropTypes.string,
|
||||
error: PropTypes.bool,
|
||||
@@ -130,9 +130,9 @@ It will be displayed inside the <div>. This is useful when it is difficult
|
||||
to make a preview for a type of DICOM series (e.g. DICOM-SR)
|
||||
*/
|
||||
altImageText: PropTypes.string,
|
||||
seriesDescription: PropTypes.string,
|
||||
seriesNumber: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
||||
instanceNumber: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
||||
SeriesDescription: PropTypes.string,
|
||||
SeriesNumber: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
||||
InstanceNumber: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
|
||||
numImageFrames: PropTypes.number,
|
||||
onDoubleClick: PropTypes.func,
|
||||
onClick: PropTypes.func,
|
||||
|
||||
@@ -18,7 +18,7 @@ const divTarget = {
|
||||
component.setState({
|
||||
item: {
|
||||
id: item.id,
|
||||
seriesDescription: item.seriesDescription,
|
||||
SeriesDescription: item.SeriesDescription,
|
||||
},
|
||||
});
|
||||
return { id: 'ExampleDropTarget' };
|
||||
|
||||
@@ -4,25 +4,25 @@ export const studies = [
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/Anti-PD-1_Lung.jpg',
|
||||
seriesDescription: 'Anti-PD-1_Lung',
|
||||
SeriesDescription: 'Anti-PD-1_Lung',
|
||||
active: true,
|
||||
seriesNumber: '2',
|
||||
SeriesNumber: '2',
|
||||
numImageFrames: 512,
|
||||
stackPercentComplete: 30,
|
||||
},
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/Anti-PD-1_MELANOMA.jpg',
|
||||
seriesDescription: 'Anti-PD-1_MELANOMA',
|
||||
seriesNumber: '2',
|
||||
instanceNumber: '1',
|
||||
SeriesDescription: 'Anti-PD-1_MELANOMA',
|
||||
SeriesNumber: '2',
|
||||
InstanceNumber: '1',
|
||||
numImageFrames: 256,
|
||||
stackPercentComplete: 70,
|
||||
},
|
||||
{
|
||||
altImageText: 'SR',
|
||||
seriesDescription: 'Imaging Measurement Report',
|
||||
seriesNumber: '3',
|
||||
SeriesDescription: 'Imaging Measurement Report',
|
||||
SeriesNumber: '3',
|
||||
stackPercentComplete: 100,
|
||||
},
|
||||
],
|
||||
@@ -32,34 +32,34 @@ export const studies = [
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/CPTAC-GBM.jpg',
|
||||
seriesDescription: 'CPTAC-GBM',
|
||||
SeriesDescription: 'CPTAC-GBM',
|
||||
active: true,
|
||||
seriesNumber: '2',
|
||||
SeriesNumber: '2',
|
||||
numImageFrames: 512,
|
||||
stackPercentComplete: 100,
|
||||
},
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/CPTAC-CM.jpg',
|
||||
seriesDescription: 'CPTAC-CM',
|
||||
seriesNumber: '2',
|
||||
instanceNumber: '1',
|
||||
SeriesDescription: 'CPTAC-CM',
|
||||
SeriesNumber: '2',
|
||||
InstanceNumber: '1',
|
||||
numImageFrames: 256,
|
||||
},
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/CPTAC-HNSCC.jpg',
|
||||
seriesDescription: 'CPTAC-HNSCC',
|
||||
seriesNumber: '2',
|
||||
instanceNumber: '1',
|
||||
SeriesDescription: 'CPTAC-HNSCC',
|
||||
SeriesNumber: '2',
|
||||
InstanceNumber: '1',
|
||||
numImageFrames: 256,
|
||||
},
|
||||
{
|
||||
imageSrc:
|
||||
'https://raw.githubusercontent.com/crowds-cure/cancer/master/public/screenshots/CPTAC-LSCC.jpg',
|
||||
seriesDescription: 'CPTAC-LSCC',
|
||||
seriesNumber: '2',
|
||||
instanceNumber: '1',
|
||||
SeriesDescription: 'CPTAC-LSCC',
|
||||
SeriesNumber: '2',
|
||||
InstanceNumber: '1',
|
||||
numImageFrames: 256,
|
||||
},
|
||||
],
|
||||
|
||||
@@ -43,25 +43,25 @@ function StudyList(props) {
|
||||
const largeTableMeta = [
|
||||
{
|
||||
displayText: t('PatientName'),
|
||||
fieldName: 'patientName',
|
||||
fieldName: 'PatientName',
|
||||
inputType: 'text',
|
||||
size: 330,
|
||||
},
|
||||
{
|
||||
displayText: t('MRN'),
|
||||
fieldName: 'patientId',
|
||||
fieldName: 'PatientID',
|
||||
inputType: 'text',
|
||||
size: 378,
|
||||
},
|
||||
{
|
||||
displayText: t('AccessionNumber'),
|
||||
fieldName: 'accessionNumber',
|
||||
fieldName: 'AccessionNumber',
|
||||
inputType: 'text',
|
||||
size: 180,
|
||||
},
|
||||
{
|
||||
displayText: t('StudyDate'),
|
||||
fieldName: 'studyDate',
|
||||
fieldName: 'StudyDate',
|
||||
inputType: 'date-range',
|
||||
size: 300,
|
||||
},
|
||||
@@ -73,7 +73,7 @@ function StudyList(props) {
|
||||
},
|
||||
{
|
||||
displayText: t('StudyDescription'),
|
||||
fieldName: 'studyDescription',
|
||||
fieldName: 'StudyDescription',
|
||||
inputType: 'text',
|
||||
size: 335,
|
||||
},
|
||||
@@ -94,7 +94,7 @@ function StudyList(props) {
|
||||
},
|
||||
{
|
||||
displayText: t('StudyDate'),
|
||||
fieldName: 'studyDate',
|
||||
fieldName: 'StudyDate',
|
||||
inputType: 'date-range',
|
||||
size: 300,
|
||||
},
|
||||
@@ -178,15 +178,15 @@ function StudyList(props) {
|
||||
{!isLoading &&
|
||||
studies.map((study, index) => (
|
||||
<TableRow
|
||||
key={`${study.studyInstanceUid}-${index}`}
|
||||
onClick={studyInstanceUid => handleSelectItem(studyInstanceUid)}
|
||||
accessionNumber={study.accessionNumber || ''}
|
||||
key={`${study.StudyInstanceUID}-${index}`}
|
||||
onClick={StudyInstanceUID => handleSelectItem(StudyInstanceUID)}
|
||||
AccessionNumber={study.AccessionNumber || ''}
|
||||
modalities={study.modalities}
|
||||
patientId={study.patientId || ''}
|
||||
patientName={study.patientName || ''}
|
||||
studyDate={study.studyDate}
|
||||
studyDescription={study.studyDescription || ''}
|
||||
studyInstanceUid={study.studyInstanceUid}
|
||||
PatientID={study.PatientID || ''}
|
||||
PatientName={study.PatientName || ''}
|
||||
StudyDate={study.StudyDate}
|
||||
StudyDescription={study.StudyDescription || ''}
|
||||
StudyInstanceUID={study.StudyInstanceUID}
|
||||
displaySize={displaySize}
|
||||
/>
|
||||
))}
|
||||
@@ -208,12 +208,12 @@ StudyList.propTypes = {
|
||||
onSort: PropTypes.func.isRequired,
|
||||
// ~~ FILTERS
|
||||
filterValues: PropTypes.shape({
|
||||
patientName: PropTypes.string.isRequired,
|
||||
patientId: PropTypes.string.isRequired,
|
||||
accessionNumber: PropTypes.string.isRequired,
|
||||
studyDate: PropTypes.string.isRequired,
|
||||
PatientName: PropTypes.string.isRequired,
|
||||
PatientID: PropTypes.string.isRequired,
|
||||
AccessionNumber: PropTypes.string.isRequired,
|
||||
StudyDate: PropTypes.string.isRequired,
|
||||
modalities: PropTypes.string.isRequired,
|
||||
studyDescription: PropTypes.string.isRequired,
|
||||
StudyDescription: PropTypes.string.isRequired,
|
||||
patientNameOrId: PropTypes.string.isRequired,
|
||||
accessionOrModalityOrDescription: PropTypes.string.isRequired,
|
||||
allFields: PropTypes.string.isRequired,
|
||||
@@ -229,14 +229,14 @@ StudyList.defaultProps = {};
|
||||
|
||||
function TableRow(props) {
|
||||
const {
|
||||
accessionNumber,
|
||||
AccessionNumber,
|
||||
isHighlighted,
|
||||
modalities,
|
||||
patientId,
|
||||
patientName,
|
||||
studyDate,
|
||||
studyDescription,
|
||||
studyInstanceUid,
|
||||
PatientID,
|
||||
PatientName,
|
||||
StudyDate,
|
||||
StudyDescription,
|
||||
StudyInstanceUID,
|
||||
onClick: handleClick,
|
||||
displaySize,
|
||||
} = props;
|
||||
@@ -245,30 +245,30 @@ function TableRow(props) {
|
||||
|
||||
const largeRowTemplate = (
|
||||
<tr
|
||||
onClick={() => handleClick(studyInstanceUid)}
|
||||
onClick={() => handleClick(StudyInstanceUID)}
|
||||
className={classNames({ active: isHighlighted })}
|
||||
>
|
||||
<td className={classNames({ 'empty-value': !patientName })}>
|
||||
{patientName || `(${t('Empty')})`}
|
||||
<td className={classNames({ 'empty-value': !PatientName })}>
|
||||
{PatientName || `(${t('Empty')})`}
|
||||
</td>
|
||||
<td>{patientId}</td>
|
||||
<td>{accessionNumber}</td>
|
||||
<td>{studyDate}</td>
|
||||
<td>{PatientID}</td>
|
||||
<td>{AccessionNumber}</td>
|
||||
<td>{StudyDate}</td>
|
||||
<td className={classNames({ 'empty-value': !modalities })}>
|
||||
{modalities || `(${t('Empty')})`}
|
||||
</td>
|
||||
<td>{studyDescription}</td>
|
||||
<td>{StudyDescription}</td>
|
||||
</tr>
|
||||
);
|
||||
|
||||
const mediumRowTemplate = (
|
||||
<tr
|
||||
onClick={() => handleClick(studyInstanceUid)}
|
||||
onClick={() => handleClick(StudyInstanceUID)}
|
||||
className={classNames({ active: isHighlighted })}
|
||||
>
|
||||
<td className={classNames({ 'empty-value': !patientName })}>
|
||||
{patientName || `(${t('Empty')})`}
|
||||
<div style={{ color: '#60656f' }}>{patientId}</div>
|
||||
<td className={classNames({ 'empty-value': !PatientName })}>
|
||||
{PatientName || `(${t('Empty')})`}
|
||||
<div style={{ color: '#60656f' }}>{PatientID}</div>
|
||||
</td>
|
||||
<td>
|
||||
<div style={{ display: 'flex', justifyContent: 'space-between' }}>
|
||||
@@ -280,7 +280,7 @@ function TableRow(props) {
|
||||
flexGrow: 1,
|
||||
}}
|
||||
>
|
||||
{studyDescription}
|
||||
{StudyDescription}
|
||||
</div>
|
||||
|
||||
{/* MODALITY & ACCESSION */}
|
||||
@@ -308,35 +308,35 @@ function TableRow(props) {
|
||||
whiteSpace: 'nowrap',
|
||||
overflow: 'hidden',
|
||||
}}
|
||||
aria-label={accessionNumber}
|
||||
title={accessionNumber}
|
||||
aria-label={AccessionNumber}
|
||||
title={AccessionNumber}
|
||||
>
|
||||
{accessionNumber}
|
||||
{AccessionNumber}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
{/* DATE */}
|
||||
<td style={{ textAlign: 'center' }}>{studyDate}</td>
|
||||
<td style={{ textAlign: 'center' }}>{StudyDate}</td>
|
||||
</tr>
|
||||
);
|
||||
|
||||
const smallRowTemplate = (
|
||||
<tr
|
||||
onClick={() => handleClick(studyInstanceUid)}
|
||||
onClick={() => handleClick(StudyInstanceUID)}
|
||||
className={classNames({ active: isHighlighted })}
|
||||
>
|
||||
<td style={{ position: 'relative', overflow: 'hidden' }}>
|
||||
<div style={{ display: 'flex', justifyContent: 'space-between' }}>
|
||||
{/* NAME AND ID */}
|
||||
<div
|
||||
className={classNames({ 'empty-value': !patientName })}
|
||||
className={classNames({ 'empty-value': !PatientName })}
|
||||
style={{ width: '150px', minWidth: '150px' }}
|
||||
>
|
||||
<div style={{ fontWeight: 500, paddingTop: '3px' }}>
|
||||
{patientName || `(${t('Empty')})`}
|
||||
{PatientName || `(${t('Empty')})`}
|
||||
</div>
|
||||
<div style={{ color: '#60656f' }}>{patientId}</div>
|
||||
<div style={{ color: '#60656f' }}>{PatientID}</div>
|
||||
</div>
|
||||
|
||||
{/* DESCRIPTION */}
|
||||
@@ -348,7 +348,7 @@ function TableRow(props) {
|
||||
paddingLeft: '35px',
|
||||
}}
|
||||
>
|
||||
{studyDescription}
|
||||
{StudyDescription}
|
||||
</div>
|
||||
|
||||
{/* MODALITY & DATE */}
|
||||
@@ -370,7 +370,7 @@ function TableRow(props) {
|
||||
>
|
||||
{modalities || `(${t('Empty')})`}
|
||||
</div>
|
||||
<div>{studyDate}</div>
|
||||
<div>{StudyDate}</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
@@ -391,14 +391,14 @@ function TableRow(props) {
|
||||
}
|
||||
|
||||
TableRow.propTypes = {
|
||||
accessionNumber: PropTypes.string.isRequired,
|
||||
AccessionNumber: PropTypes.string.isRequired,
|
||||
isHighlighted: PropTypes.bool,
|
||||
modalities: PropTypes.string,
|
||||
patientId: PropTypes.string.isRequired,
|
||||
patientName: PropTypes.string.isRequired,
|
||||
studyDate: PropTypes.string.isRequired,
|
||||
studyDescription: PropTypes.string.isRequired,
|
||||
studyInstanceUid: PropTypes.string.isRequired,
|
||||
PatientID: PropTypes.string.isRequired,
|
||||
PatientName: PropTypes.string.isRequired,
|
||||
StudyDate: PropTypes.string.isRequired,
|
||||
StudyDescription: PropTypes.string.isRequired,
|
||||
StudyInstanceUID: PropTypes.string.isRequired,
|
||||
displaySize: PropTypes.string,
|
||||
};
|
||||
|
||||
|
||||
@@ -156,7 +156,7 @@ table.table
|
||||
text-align: left;
|
||||
border-top: 0;
|
||||
|
||||
.study-list-container > table.table > thead > tr > th.studyDate
|
||||
.study-list-container > table.table > thead > tr > th.StudyDate
|
||||
min-width: 230px
|
||||
.study-list-container > table.table .modalities
|
||||
font-weight: 500;
|
||||
|
||||
@@ -11,7 +11,7 @@ class TablePagination extends PureComponent {
|
||||
};
|
||||
|
||||
static propTypes = {
|
||||
/* Values to show in "rows per page" select dropdown */
|
||||
/* Values to show in "Rows per page" select dropdown */
|
||||
pageOptions: PropTypes.array,
|
||||
rowsPerPage: PropTypes.number.isRequired,
|
||||
currentPage: PropTypes.number.isRequired,
|
||||
|
||||
@@ -4,9 +4,9 @@ export default function(searchData) {
|
||||
this.setState({ searchData });
|
||||
|
||||
const filter = (key, searchData, study) => {
|
||||
if (key === 'studyDateFrom' && searchData[key] && study['studyDate']) {
|
||||
const studyDate = moment(study['studyDate'], 'YYYYMMDD');
|
||||
return studyDate.isBetween(
|
||||
if (key === 'studyDateFrom' && searchData[key] && study['StudyDate']) {
|
||||
const StudyDate = moment(study['StudyDate'], 'YYYYMMDD');
|
||||
return StudyDate.isBetween(
|
||||
searchData['studyDateFrom'],
|
||||
searchData['studyDateTo'],
|
||||
'days',
|
||||
@@ -25,11 +25,11 @@ export default function(searchData) {
|
||||
let filteredStudies = this.defaultStudies
|
||||
.filter(function(study) {
|
||||
const all = [
|
||||
'patientName',
|
||||
'patientId',
|
||||
'accessionNumber',
|
||||
'PatientName',
|
||||
'PatientID',
|
||||
'AccessionNumber',
|
||||
'modalities',
|
||||
'studyDescription',
|
||||
'StudyDescription',
|
||||
'studyDateFrom',
|
||||
].every(key => {
|
||||
return filter(key, searchData, study);
|
||||
|
||||
@@ -2,83 +2,83 @@ import moment from 'moment';
|
||||
|
||||
const studies = [
|
||||
{
|
||||
studyInstanceUid: '11111.111111.111111.11111',
|
||||
patientName: 'John Doe',
|
||||
patientId: '1',
|
||||
accessionNumber: '1234567',
|
||||
studyDate: '19930201',
|
||||
StudyInstanceUID: '11111.111111.111111.11111',
|
||||
PatientName: 'John Doe',
|
||||
PatientID: '1',
|
||||
AccessionNumber: '1234567',
|
||||
StudyDate: '19930201',
|
||||
modalities: 'MR',
|
||||
studyDescription: 'BRAIN',
|
||||
StudyDescription: 'BRAIN',
|
||||
},
|
||||
{
|
||||
studyInstanceUid: '2222.222222.22222.22222',
|
||||
patientName: 'José Silva',
|
||||
patientId: '2',
|
||||
accessionNumber: '7654321',
|
||||
studyDate: moment().format('YYYYMMDD'),
|
||||
StudyInstanceUID: '2222.222222.22222.22222',
|
||||
PatientName: 'José Silva',
|
||||
PatientID: '2',
|
||||
AccessionNumber: '7654321',
|
||||
StudyDate: moment().format('YYYYMMDD'),
|
||||
modalities: 'CT',
|
||||
studyDescription: 'PET CT STANDARD',
|
||||
StudyDescription: 'PET CT STANDARD',
|
||||
},
|
||||
{
|
||||
studyInstanceUid: '3333.333333.33333.33333',
|
||||
patientName: 'Antônio Jefferson',
|
||||
patientId: '3',
|
||||
accessionNumber: '732311',
|
||||
studyDate: moment()
|
||||
StudyInstanceUID: '3333.333333.33333.33333',
|
||||
PatientName: 'Antônio Jefferson',
|
||||
PatientID: '3',
|
||||
AccessionNumber: '732311',
|
||||
StudyDate: moment()
|
||||
.subtract(14, 'days')
|
||||
.format('YYYYMMDD'),
|
||||
modalities: 'US',
|
||||
studyDescription: '0',
|
||||
StudyDescription: '0',
|
||||
},
|
||||
{
|
||||
studyInstanceUid: '444444.44444.44444.4444',
|
||||
patientName: 'Antonio da Silva',
|
||||
patientId: '4',
|
||||
accessionNumber: '732311',
|
||||
studyDate: moment()
|
||||
StudyInstanceUID: '444444.44444.44444.4444',
|
||||
PatientName: 'Antonio da Silva',
|
||||
PatientID: '4',
|
||||
AccessionNumber: '732311',
|
||||
StudyDate: moment()
|
||||
.subtract(1, 'months')
|
||||
.format('YYYYMMDD'),
|
||||
modalities: 'US',
|
||||
studyDescription: '0',
|
||||
StudyDescription: '0',
|
||||
},
|
||||
{
|
||||
studyInstanceUid: '55555.55555.55555.55555',
|
||||
patientName: 'Bezerra Souza',
|
||||
patientId: '5',
|
||||
accessionNumber: '5134543',
|
||||
studyDate: moment()
|
||||
StudyInstanceUID: '55555.55555.55555.55555',
|
||||
PatientName: 'Bezerra Souza',
|
||||
PatientID: '5',
|
||||
AccessionNumber: '5134543',
|
||||
StudyDate: moment()
|
||||
.subtract(6, 'days')
|
||||
.format('YYYYMMDD'),
|
||||
modalities: 'US',
|
||||
studyDescription: '0',
|
||||
StudyDescription: '0',
|
||||
},
|
||||
{
|
||||
studyInstanceUid: '66666.66666.66666.6666',
|
||||
patientName: 'Geraldo Roger',
|
||||
patientId: '6',
|
||||
accessionNumber: '5315135',
|
||||
studyDate: moment()
|
||||
StudyInstanceUID: '66666.66666.66666.6666',
|
||||
PatientName: 'Geraldo Roger',
|
||||
PatientID: '6',
|
||||
AccessionNumber: '5315135',
|
||||
StudyDate: moment()
|
||||
.subtract(7, 'days')
|
||||
.format('YYYYMMDD'),
|
||||
modalities: 'US',
|
||||
studyDescription: 'US',
|
||||
StudyDescription: 'US',
|
||||
},
|
||||
{
|
||||
studyInstanceUid: '77777.77777.77777.77777',
|
||||
patientName: '',
|
||||
patientId: '7',
|
||||
accessionNumber: '5315136',
|
||||
studyDate: moment()
|
||||
StudyInstanceUID: '77777.77777.77777.77777',
|
||||
PatientName: '',
|
||||
PatientID: '7',
|
||||
AccessionNumber: '5315136',
|
||||
StudyDate: moment()
|
||||
.subtract(5, 'days')
|
||||
.format('YYYYMMDD'),
|
||||
modalities: 'US',
|
||||
studyDescription: 'US',
|
||||
StudyDescription: 'US',
|
||||
},
|
||||
].sort(function(a, b) {
|
||||
if (a.patientName < b.patientName) {
|
||||
if (a.PatientName < b.PatientName) {
|
||||
return -1;
|
||||
}
|
||||
if (a.patientName > b.patientName) {
|
||||
if (a.PatientName > b.PatientName) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -20,11 +20,11 @@ import moment from 'moment'
|
||||
<State initial={{
|
||||
searchData: {},
|
||||
studies: defaultStudies.filter(study => {
|
||||
const studyDate = moment(study['studyDate'], 'YYYYMMDD');
|
||||
const StudyDate = moment(study['StudyDate'], 'YYYYMMDD');
|
||||
const startDate = moment().subtract(5, 'days');
|
||||
const endDate = moment();
|
||||
|
||||
return studyDate.isBetween(startDate, endDate, 'days', '[]');
|
||||
return StudyDate.isBetween(startDate, endDate, 'days', '[]');
|
||||
}).slice(0, 5)
|
||||
}}>
|
||||
{({ state, setState }) => (
|
||||
@@ -35,9 +35,9 @@ import moment from 'moment'
|
||||
pageOptions={[1, 2, 3, 5, 10, 15, 20, 25, 50, 100]}
|
||||
studyListFunctionsEnabled={true}
|
||||
onImport={(e) => alert('Import study mock ' + e)}
|
||||
onSelectItem={(studyInstanceUid) => { alert(studyInstanceUid + ' has selected! Now you can open your study.'); }}
|
||||
onSelectItem={(StudyInstanceUID) => { alert(StudyInstanceUID + ' has selected! Now you can open your study.'); }}
|
||||
rowsPerPage={5}
|
||||
defaultSort={{ field: 'patientName', order: 'desc', }}
|
||||
defaultSort={{ field: 'PatientName', order: 'desc', }}
|
||||
studyListDateFilterNumDays={7}
|
||||
onSearch={onSearch.bind({ setState, defaultStudies })}
|
||||
/>
|
||||
|
||||
@@ -19,7 +19,7 @@ class TextArea extends React.Component {
|
||||
<textarea
|
||||
className="textarea-ohif"
|
||||
value={this.state.value}
|
||||
rows={this.props.rows}
|
||||
Rows={this.props.Rows}
|
||||
cols={this.props.cols}
|
||||
onChange={this.handleChange}
|
||||
id={this.props.id}
|
||||
@@ -30,7 +30,7 @@ class TextArea extends React.Component {
|
||||
|
||||
TextArea.propTypes = {
|
||||
value: PropTypes.string,
|
||||
rows: PropTypes.number,
|
||||
Rows: PropTypes.number,
|
||||
cols: PropTypes.number,
|
||||
id: PropTypes.string,
|
||||
onChange: PropTypes.func,
|
||||
|
||||
Reference in new issue
Block a user