fix(hotkeys): Fix the issues with hotkeys (#488)

* wip viewport

* refactoring to do not use dispatch from window

* fixing server active testing

* fix(dependencies): Bump ohif-core to 0.5.5
This commit is contained in:
Evren Ozkan 2019-05-27 11:31:39 -04:00 committed by GitHub
parent c2eb5f342f
commit 3bae254a6f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 128 additions and 98 deletions

View File

@ -30,7 +30,8 @@ const mapStateToProps = (state, ownProps) => {
...dataFromStore, ...dataFromStore,
enableStackPrefetch: isActive, enableStackPrefetch: isActive,
//stack: viewportSpecificData.stack, //stack: viewportSpecificData.stack,
cineToolData: viewportSpecificData.cine cineToolData: viewportSpecificData.cine,
viewport: viewportSpecificData.viewport
}; };
}; };

View File

@ -77,7 +77,7 @@
"hammerjs": "^2.0.8", "hammerjs": "^2.0.8",
"lodash.isequal": "4.5.0", "lodash.isequal": "4.5.0",
"moment": "^2.24.0", "moment": "^2.24.0",
"ohif-core": "0.5.3", "ohif-core": "0.5.5",
"ohif-cornerstone-extension": "0.0.30", "ohif-cornerstone-extension": "0.0.30",
"ohif-dicom-html-extension": "^0.0.2", "ohif-dicom-html-extension": "^0.0.2",
"ohif-dicom-microscopy-extension": "^0.0.5", "ohif-dicom-microscopy-extension": "^0.0.5",

View File

@ -1,33 +1,44 @@
import { connect } from 'react-redux'; import { connect } from 'react-redux'
import ViewerMain from './ViewerMain'; import ViewerMain from './ViewerMain'
import OHIF from 'ohif-core'; import OHIF from 'ohif-core'
const { setViewportSpecificData, clearViewportSpecificData } = OHIF.redux.actions; const {
setViewportSpecificData,
clearViewportSpecificData,
setToolActive,
setActiveViewportSpecificData,
} = OHIF.redux.actions
const mapStateToProps = state => { const mapStateToProps = state => {
const { activeViewportIndex, layout, viewportSpecificData } = state.viewports; const { activeViewportIndex, layout, viewportSpecificData } = state.viewports
return { return {
activeViewportIndex, activeViewportIndex,
layout, layout,
viewportSpecificData viewportSpecificData,
}
} }
};
const mapDispatchToProps = dispatch => { const mapDispatchToProps = dispatch => {
return { return {
setViewportSpecificData: (viewportIndex, data) => { setViewportSpecificData: (viewportIndex, data) => {
dispatch(setViewportSpecificData(viewportIndex, data)); dispatch(setViewportSpecificData(viewportIndex, data))
}, },
clearViewportSpecificData: () => { clearViewportSpecificData: () => {
dispatch(clearViewportSpecificData()); dispatch(clearViewportSpecificData())
},
setToolActive: tool => {
dispatch(setToolActive(tool))
},
setActiveViewportSpecificData: viewport => {
dispatch(setActiveViewportSpecificData(viewport))
},
}
} }
};
};
const ConnectedViewerMain = connect( const ConnectedViewerMain = connect(
mapStateToProps, mapStateToProps,
mapDispatchToProps mapDispatchToProps
)(ViewerMain); )(ViewerMain)
export default ConnectedViewerMain; export default ConnectedViewerMain

View File

@ -1,19 +1,19 @@
import { connect } from 'react-redux'; import { connect } from 'react-redux'
import ViewerRetrieveStudyData from './ViewerRetrieveStudyData.js'; import ViewerRetrieveStudyData from './ViewerRetrieveStudyData.js'
const isActive = (a) => a.active === true; const isActive = a => a.active === true
const mapStateToProps = state => { const mapStateToProps = state => {
const activeServer = state.servers.servers.find(isActive); const activeServer = state.servers.servers.find(isActive)
return { return {
server: activeServer, server: activeServer,
}; }
}; }
const ConnectedViewerRetrieveStudyData = connect( const ConnectedViewerRetrieveStudyData = connect(
mapStateToProps, mapStateToProps,
null null
)(ViewerRetrieveStudyData); )(ViewerRetrieveStudyData)
export default ConnectedViewerRetrieveStudyData; export default ConnectedViewerRetrieveStudyData

View File

@ -1,52 +1,61 @@
import { Component } from 'react'; import { Component } from 'react'
import React from 'react'; import React from 'react'
import PropTypes from 'prop-types'; import PropTypes from 'prop-types'
import { OHIF } from 'ohif-core'; import { OHIF } from 'ohif-core'
import ConnectedLayoutManager from './ConnectedLayoutManager.js'; import ConnectedLayoutManager from './ConnectedLayoutManager.js'
import './ViewerMain.css'; import './ViewerMain.css'
class ViewerMain extends Component { class ViewerMain extends Component {
static propTypes = { static propTypes = {
studies: PropTypes.array.isRequired, studies: PropTypes.array.isRequired,
setViewportSpecificData: PropTypes.func.isRequired, setViewportSpecificData: PropTypes.func.isRequired,
clearViewportSpecificData: PropTypes.func.isRequired clearViewportSpecificData: PropTypes.func.isRequired,
}; setToolActive: PropTypes.func.isRequired,
setActiveViewportSpecificData: PropTypes.func.isRequired,
}
constructor(props) { constructor(props) {
super(props); super(props)
OHIF.hotkeysUtil.setup('viewer');
// Initialize hotkeys
new OHIF.HotkeysUtil('viewer', {
setViewportSpecificData: props.setViewportSpecificData,
clearViewportSpecificData: props.clearViewportSpecificData,
setToolActive: props.setToolActive,
setActiveViewportSpecificData: props.setActiveViewportSpecificData,
})
this.state = { this.state = {
displaySets: [] displaySets: [],
} }
} }
getDisplaySets(studies) { getDisplaySets(studies) {
const displaySets = []; const displaySets = []
studies.forEach(study => { studies.forEach(study => {
study.displaySets.forEach(dSet => { study.displaySets.forEach(dSet => {
if (!dSet.plugin) { if (!dSet.plugin) {
dSet.plugin = 'cornerstone'; dSet.plugin = 'cornerstone'
} }
displaySets.push(dSet); displaySets.push(dSet)
}); })
}); })
return displaySets; return displaySets
} }
findDisplaySet(studies, studyInstanceUid, displaySetInstanceUid) { findDisplaySet(studies, studyInstanceUid, displaySetInstanceUid) {
const study = studies.find(study => { const study = studies.find(study => {
return study.studyInstanceUid === studyInstanceUid; return study.studyInstanceUid === studyInstanceUid
}); })
if (!study) { if (!study) {
return; return
} }
return study.displaySets.find(displaySet => { return study.displaySets.find(displaySet => {
return displaySet.displaySetInstanceUid === displaySetInstanceUid; return displaySet.displaySetInstanceUid === displaySetInstanceUid
}); })
} }
componentDidMount() { componentDidMount() {
@ -54,41 +63,50 @@ class ViewerMain extends Component {
//window.addEventListener('beforeunload', unloadHandlers.beforeUnload); //window.addEventListener('beforeunload', unloadHandlers.beforeUnload);
// Get all the display sets for the viewer studies // Get all the display sets for the viewer studies
const displaySets = this.getDisplaySets(this.props.studies); const displaySets = this.getDisplaySets(this.props.studies)
this.setState({ this.setState({
displaySets displaySets,
}); })
} }
getViewportData = () => { getViewportData = () => {
const viewportData = []; const viewportData = []
const { layout, viewportSpecificData } = this.props; const { layout, viewportSpecificData } = this.props
for (let viewportIndex = 0; viewportIndex < layout.viewports.length; viewportIndex++) { for (
let displaySet = viewportSpecificData[viewportIndex]; let viewportIndex = 0;
viewportIndex < layout.viewports.length;
viewportIndex++
) {
let displaySet = viewportSpecificData[viewportIndex]
// If the viewport is empty, get one available in study // If the viewport is empty, get one available in study
if (!displaySet || !displaySet.displaySetInstanceUid) { if (!displaySet || !displaySet.displaySetInstanceUid) {
const { displaySets } = this.state; const { displaySets } = this.state
displaySet = displaySets.find(ds => !viewportData.some(v => v.displaySetInstanceUid === ds.displaySetInstanceUid)); displaySet = displaySets.find(
ds =>
!viewportData.some(
v => v.displaySetInstanceUid === ds.displaySetInstanceUid
)
)
} }
viewportData.push(displaySet); viewportData.push(displaySet)
} }
return viewportData; return viewportData
}; }
setViewportData = ({ viewportIndex, item }) => { setViewportData = ({ viewportIndex, item }) => {
const displaySet = this.findDisplaySet( const displaySet = this.findDisplaySet(
this.props.studies, this.props.studies,
item.studyInstanceUid, item.studyInstanceUid,
item.displaySetInstanceUid item.displaySetInstanceUid
); )
this.props.setViewportSpecificData(viewportIndex, displaySet); this.props.setViewportSpecificData(viewportIndex, displaySet)
}; }
render() { render() {
return ( return (
@ -99,15 +117,15 @@ class ViewerMain extends Component {
setViewportData={this.setViewportData} setViewportData={this.setViewportData}
/> />
</div> </div>
); )
} }
componentWillUnmount() { componentWillUnmount() {
// Clear the entire viewport specific data // Clear the entire viewport specific data
const { viewportSpecificData } = this.props; const { viewportSpecificData } = this.props
Object.keys(viewportSpecificData).forEach((viewportIndex) => { Object.keys(viewportSpecificData).forEach(viewportIndex => {
this.props.clearViewportSpecificData(viewportIndex); this.props.clearViewportSpecificData(viewportIndex)
}); })
// Remove beforeUnload event handler... // Remove beforeUnload event handler...
//window.removeEventListener('beforeunload', unloadHandlers.beforeUnload); //window.removeEventListener('beforeunload', unloadHandlers.beforeUnload);
@ -126,4 +144,4 @@ class ViewerMain extends Component {
} }
} }
export default ViewerMain; export default ViewerMain

View File

@ -1,21 +1,21 @@
import { connect } from 'react-redux'; import { connect } from 'react-redux'
import StudyListWithData from './StudyListWithData.js'; import StudyListWithData from './StudyListWithData.js'
const isActive = (a) => a.active === true; const isActive = a => a.active === true
const mapStateToProps = state => { const mapStateToProps = state => {
const activeServer = state.servers.servers.find(isActive); const activeServer = state.servers.servers.find(isActive)
return { return {
server: activeServer, server: activeServer,
user: state.oidc.user, user: state.oidc.user,
}; }
}; }
const ConnectedStudyList = connect( const ConnectedStudyList = connect(
mapStateToProps, mapStateToProps,
null null
)(StudyListWithData); )(StudyListWithData)
export default ConnectedStudyList; export default ConnectedStudyList

View File

@ -9674,10 +9674,10 @@ octokit-pagination-methods@^1.1.0:
resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4"
integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==
ohif-core@0.5.3: ohif-core@0.5.5:
version "0.5.3" version "0.5.5"
resolved "https://registry.yarnpkg.com/ohif-core/-/ohif-core-0.5.3.tgz#cf78f0e4b28ed5a602b032483cdd44f3baea34f2" resolved "https://registry.yarnpkg.com/ohif-core/-/ohif-core-0.5.5.tgz#78ace87fa06b3b23a004414a702cc23cb00edf9d"
integrity sha512-pdzVz9WkdXVm99TuBSx1JYEed9aPaD9/CKd/+YM4R3lgchDNLxuz0l76HBPHpFV2XDIKmu1q5EyETyMiOxhZsw== integrity sha512-BORJCxOWuVAx2CE6+LSdL5+1+PG6gkYgl6tyAZhHhAgT46DWAfbq8nkAIX7Rhwot0BWpAcHkkBWIavGOBOH24Q==
dependencies: dependencies:
"@babel/runtime" "^7.2.0" "@babel/runtime" "^7.2.0"
ajv "^6.10.0" ajv "^6.10.0"