diff --git a/package.json b/package.json index 98ee95e56..d879ebcb0 100644 --- a/package.json +++ b/package.json @@ -61,11 +61,13 @@ "css-loader": "^3.2.0", "dotenv": "^8.1.0", "eslint": "5.16.0", + "eslint-config-prettier": "^6.4.0", "eslint-config-react-app": "^4.0.1", "eslint-plugin-flowtype": "2.x", "eslint-plugin-import": "2.x", "eslint-plugin-jsx-a11y": "6.x", "eslint-plugin-node": "^9.1.0", + "eslint-plugin-prettier": "^3.1.1", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-react": "7.x", "eslint-plugin-react-hooks": "1.5.0", diff --git a/platform/viewer/src/components/ViewportGrid/ViewportGrid.js b/platform/viewer/src/components/ViewportGrid/ViewportGrid.js index 66f874eca..75c10521a 100644 --- a/platform/viewer/src/components/ViewportGrid/ViewportGrid.js +++ b/platform/viewer/src/components/ViewportGrid/ViewportGrid.js @@ -32,6 +32,11 @@ const ViewportGrid = function(props) { const ViewportPanes = layout.viewports.map((layout, viewportIndex) => { const displaySet = viewportData[viewportIndex]; + + if (!displaySet) { + return null; + } + const data = { displaySet, studies, @@ -108,6 +113,9 @@ ViewportGrid.propTypes = { setViewportData: PropTypes.func.isRequired, studies: PropTypes.array, children: PropTypes.node, + defaultPlugin: PropTypes.string, + numRows: PropTypes.number, + numColumns: PropTypes.number, }; ViewportGrid.defaultProps = { diff --git a/platform/viewer/src/connectedComponents/ViewerMain.js b/platform/viewer/src/connectedComponents/ViewerMain.js index 073bc6f31..0790624da 100644 --- a/platform/viewer/src/connectedComponents/ViewerMain.js +++ b/platform/viewer/src/connectedComponents/ViewerMain.js @@ -22,8 +22,6 @@ class ViewerMain extends Component { this.state = { displaySets: [], }; - - this.cachedViewportData = {}; } getDisplaySets(studies) { @@ -65,63 +63,74 @@ class ViewerMain extends Component { this.setState({ displaySets, }); + + this.fillEmptyViewportPanes(); } } componentDidUpdate(prevProps) { - if (this.props.studies !== prevProps.studies) { + const prevViewportAmount = prevProps.layout.viewports.length; + const viewportAmount = this.props.layout.viewports.length; + + if ( + this.props.studies !== prevProps.studies || + viewportAmount !== prevViewportAmount + ) { const displaySets = this.getDisplaySets(this.props.studies); this.setState({ displaySets, }); + + this.fillEmptyViewportPanes(); } } - getViewportData = () => { - const viewportData = []; + fillEmptyViewportPanes = () => { + const dirtyViewportPanes = []; const { layout, viewportSpecificData } = this.props; + const { displaySets } = this.state; - for ( - let viewportIndex = 0; - viewportIndex < layout.viewports.length; - viewportIndex++ - ) { - let displaySet = viewportSpecificData[viewportIndex]; - - // Use the cached display set in viewport if the new one is empty - if (displaySet && !displaySet.displaySetInstanceUid) { - displaySet = this.cachedViewportData[viewportIndex]; - } - - if ( - displaySet && - displaySet.studyInstanceUid && - displaySet.displaySetInstanceUid - ) { - // Get missing fields from original display set - const originalDisplaySet = this.findDisplaySet( - this.props.studies, - displaySet.studyInstanceUid, - displaySet.displaySetInstanceUid - ); - viewportData.push(Object.assign({}, originalDisplaySet, displaySet)); - } else { - // If the viewport is empty, get one available in study - const { displaySets } = this.state; - displaySet = displaySets.find( - ds => - !viewportData.some( - v => v.displaySetInstanceUid === ds.displaySetInstanceUid - ) - ); - viewportData.push(Object.assign({}, displaySet)); - } + if (!displaySets || !displaySets.length) { + return; } - this.cachedViewportData = viewportData; + for (let i = 0; i < layout.viewports.length; i++) { + const viewportPane = viewportSpecificData[i]; + const isNonEmptyViewport = + viewportPane && + viewportPane.studyInstanceUid && + viewportPane.displaySetInstanceUid; - return viewportData; + if (isNonEmptyViewport) { + dirtyViewportPanes.push({ + studyInstanceUid: viewportPane.studyInstanceUid, + displaySetInstanceUid: viewportPane.displaySetInstanceUid, + }); + + continue; + } + + const foundDisplaySet = + displaySets.find( + ds => + !dirtyViewportPanes.some( + v => v.displaySetInstanceUid === ds.displaySetInstanceUid + ) + ) || displaySets[displaySets.length - 1]; + + dirtyViewportPanes.push(foundDisplaySet); + } + + dirtyViewportPanes.forEach((vp, i) => { + if (vp && vp.studyInstanceUid) { + this.setViewportData({ + viewportIndex: i, + studyInstanceUid: vp.studyInstanceUid, + displaySetInstanceUid: vp.displaySetInstanceUid, + }); + } + }); }; setViewportData = ({ @@ -139,12 +148,17 @@ class ViewerMain extends Component { }; render() { + const { viewportSpecificData } = this.props; + const viewportData = viewportSpecificData + ? Object.values(viewportSpecificData) + : []; + return (