Push grid, pane, and provider

This commit is contained in:
dannyrb 2020-05-14 16:39:57 -04:00 committed by James A. Petts
parent 70ce476c32
commit 518ff4d6b5
4 changed files with 85 additions and 37 deletions

View File

@ -1,7 +1,7 @@
/** /**
* CSS Grid Reference: http://grid.malven.co/ * CSS Grid Reference: http://grid.malven.co/
*/ */
import React, { useEffect } from 'react'; import React, { useState } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
// //
import ViewportPane from './ViewportPane.jsx'; import ViewportPane from './ViewportPane.jsx';
@ -11,27 +11,35 @@ import ViewportPane from './ViewportPane.jsx';
function ViewportGrid(props) { function ViewportGrid(props) {
const { const {
activeViewportIndex, activeViewportIndex,
viewports,
displaySets, displaySets,
numRows, numRows,
numColumns, numColumns,
children, children,
} = props; } = props;
// From ViewportGridService and/or ContextProvider
const [viewportGrid, setViewportGrid] = useState({
viewports: [
{
displaySetUid: undefined,
},
],
});
const rowSize = 100 / numRows; const rowSize = 100 / numRows;
const colSize = 100 / numColumns; const colSize = 100 / numColumns;
// viewportData --> displaySets // viewportData --> displaySets
const getViewportPanes = () => const getViewportPanes = () =>
viewports.map((viewport, viewportIndex) => { viewportGrid.viewports.map((viewport, viewportIndex) => {
const someId = viewport.displaySetId; const someId = viewport.displaySetId;
const displaySet = displaySets[someId]; // const displaySet = displaySets[someId];
if (!displaySet) { // if (!displaySet) {
// TODO: Empty Viewport // // TODO: Empty Viewport
return null; // return null;
} // }
// const pluginName = // const pluginName =
// !layout.plugin && displaySet && displaySet.plugin // !layout.plugin && displaySet && displaySet.plugin
@ -50,7 +58,9 @@ function ViewportGrid(props) {
return ( return (
<ViewportPane <ViewportPane
key={viewportIndex} key={viewportIndex}
onDrop={() => { /* setDisplaySet for Viewport */ }} onDrop={() => {
/* setDisplaySet for Viewport */
}}
viewportIndex={viewportIndex} viewportIndex={viewportIndex}
isActive={activeViewportIndex === viewportIndex} isActive={activeViewportIndex === viewportIndex}
> >
@ -59,12 +69,10 @@ function ViewportGrid(props) {
); );
}); });
// const ViewportPanes = React.useMemo(getViewportPanes, [ const ViewportPanes = React.useMemo(getViewportPanes, [
// viewportData, children,
// children, activeViewportIndex,
// setViewportData, ]);
// activeViewportIndex,
// ]);
return ( return (
<div <div
@ -77,13 +85,13 @@ function ViewportGrid(props) {
width: '100%', width: '100%',
}} }}
> >
{/* {ViewportPanes} */} {ViewportPanes}
</div> </div>
); );
}; }
ViewportGrid.propTypes = { ViewportGrid.propTypes = {
viewports: PropTypes.array.isRequired, // viewports: PropTypes.array.isRequired,
activeViewportIndex: PropTypes.number.isRequired, activeViewportIndex: PropTypes.number.isRequired,
children: PropTypes.node, children: PropTypes.node,
numRows: PropTypes.number.isRequired, numRows: PropTypes.number.isRequired,
@ -91,7 +99,7 @@ ViewportGrid.propTypes = {
}; };
ViewportGrid.defaultProps = { ViewportGrid.defaultProps = {
viewports: [], // viewports: [],
numRows: 1, numRows: 1,
numColumns: 1, numColumns: 1,
activeViewportIndex: 0, activeViewportIndex: 0,

View File

@ -1,32 +1,35 @@
import React from 'react'; import React from 'react';
import { useDrop } from 'react-dnd'; // import { useDrop } from 'react-dnd';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
const ViewportPane = function(props) { const ViewportPane = function(props) {
const { children, onDrop, viewportIndex } = props; const { children, onDrop, viewportIndex } = props;
const [{ isHovered, isHighlighted }, drop] = useDrop({ // const [{ isHovered, isHighlighted }, drop] = useDrop({
accept: 'displayset', // accept: 'displayset',
drop: (displaySet, monitor) => { // drop: (displaySet, monitor) => {
const canDrop = monitor.canDrop(); // const canDrop = monitor.canDrop();
const isOver = monitor.isOver(); // const isOver = monitor.isOver();
if (canDrop && isOver && onDrop) { // if (canDrop && isOver && onDrop) {
const { StudyInstanceUID, displaySetInstanceUID } = displaySet; // const { StudyInstanceUID, displaySetInstanceUID } = displaySet;
onDrop({ viewportIndex, StudyInstanceUID, displaySetInstanceUID }); // onDrop({ viewportIndex, StudyInstanceUID, displaySetInstanceUID });
} // }
}, // },
// Monitor, and collect props; returned as values by `useDrop` // // Monitor, and collect props; returned as values by `useDrop`
collect: monitor => ({ // collect: monitor => ({
isHighlighted: monitor.canDrop(), // isHighlighted: monitor.canDrop(),
isHovered: monitor.isOver(), // isHovered: monitor.isOver(),
}), // }),
}); // });
const isHovered = false;
const isHighlighted = false;
return ( return (
<div <div
ref={drop} // ref={drop}
className={classNames({ hovered: isHovered, highlighted: isHighlighted })} className={classNames({ hovered: isHovered, highlighted: isHighlighted })}
data-cy={`viewport-pane-${viewportIndex}`} data-cy={`viewport-pane-${viewportIndex}`}
> >

View File

@ -0,0 +1,37 @@
import React, { useState, createContext, useContext } from 'react';
import PropTypes from 'prop-types';
const ViewportGridContext = createContext(null);
export const useViewportGrid = () => useContext(ViewportGridContext);
export default function ViewportGridProvider({ children }) {
const [viewportGrid, setViewportGrid] = useState({
rows: 1,
columns: 1,
viewports: [],
});
const get = () => {
return viewportGrid;
};
const set = ({ rows, columns, viewports }) => {
setViewportGrid({ rows, columns, viewports });
};
return (
<ViewportGridProvider.Provider value={{ get, set }}>
{/* {children} */}
</ViewportGridProvider.Provider>
);
}
ViewportGridProvider.propTypes = {
children: PropTypes.oneOfType([
PropTypes.arrayOf(PropTypes.node),
PropTypes.node,
]).isRequired,
};
export default ViewportGridProvider;