diff --git a/platform/ui/src/components/content/viewportDownloadForm/ViewportDownloadForm.js b/platform/ui/src/components/content/viewportDownloadForm/ViewportDownloadForm.js index 5408a0ef3..fb9ddb595 100644 --- a/platform/ui/src/components/content/viewportDownloadForm/ViewportDownloadForm.js +++ b/platform/ui/src/components/content/viewportDownloadForm/ViewportDownloadForm.js @@ -37,64 +37,47 @@ const ViewportDownloadForm = ({ const [filename, setFilename] = useState(DEFAULT_FILENAME); const [fileType, setFileType] = useState('jpg'); - const [height, setHeight] = useState(defaultSize); - const [width, setWidth] = useState(defaultSize); + const [dimensions, setDimensions] = useState({ + width: defaultSize, + height: defaultSize, + }); const [showAnnotations, setShowAnnotations] = useState(true); - const [keepAspect, setKeepAspect] = useState(true); - const [lastImage, setLastImage] = useState(); - const [viewportElement, setViewportElement] = useState(); - const [viewportElementHeight, setViewportElementHeight] = useState( - minimumSize - ); - const [viewportElementWidth, setViewportElementWidth] = useState(minimumSize); + const [viewportElementDimensions, setViewportElementDimensions] = useState({ + width: defaultSize, + height: defaultSize, + }); const [downloadCanvas, setDownloadCanvas] = useState({ ref: createRef(), - width: minimumSize, - height: minimumSize, + width: defaultSize, + height: defaultSize, }); const [viewportPreview, setViewportPreview] = useState({ src: null, - width: minimumSize, - height: minimumSize, + width: defaultSize, + height: defaultSize, }); + // Cornerstone's `enable/disable` useEffect(() => { enableViewport(viewportElement); return () => { disableViewport(viewportElement); - - setHeight(defaultSize); - setWidth(defaultSize); }; - }, [defaultSize, disableViewport, enableViewport, viewportElement]); + }, [disableViewport, enableViewport, viewportElement]); useEffect(() => { + const { width, height } = viewportElementDimensions; const validSize = value => (value >= minimumSize ? value : minimumSize); const loadAndUpdateViewports = async () => { - const { - image, - width: scaledWidth, - height: scaledHeight, - } = await loadImage(activeViewport, viewportElement, width, height); - setLastImage(image); - + await loadImage(activeViewport, viewportElement, width, height); toggleAnnotations(showAnnotations, viewportElement); - setViewportElementHeight(validSize(scaledHeight)); - setViewportElementWidth(validSize(scaledWidth)); - - setDownloadCanvas(state => ({ - ...state, - height: validSize(scaledHeight), - width: validSize(scaledWidth), - })); - const { dataUrl, width: viewportElementWidth, @@ -118,8 +101,6 @@ const ViewportDownloadForm = ({ activeViewport, viewportElement, showAnnotations, - height, - width, loadImage, toggleAnnotations, updateViewportPreview, @@ -127,54 +108,41 @@ const ViewportDownloadForm = ({ downloadCanvas.ref, minimumSize, maximumSize, + viewportElementDimensions, ]); - const onHeightChange = event => { - const newHeight = Math.min(event.target.value, maximumSize); - setHeight(newHeight); + /** + * @param {object} event - Input change event + * @param {string} dimension - "height" | "width" + */ + const onDimensionsChange = (event, dimension) => { + const sanitizedTargetValue = event.target.value.replace(/\D/, ''); + const isEmpty = sanitizedTargetValue === ''; + const updatedDimension = isEmpty + ? '' + : Math.min(sanitizedTargetValue, maximumSize); - setViewportElementHeight(newHeight); - - setDownloadCanvas(state => ({ - ...state, - height: newHeight, - })); - - if (keepAspect) { - const multiplier = newHeight / lastImage.height; - const newWidth = Math.round(lastImage.width * multiplier); - - setWidth(newWidth); - setViewportElementWidth(newWidth); - - setDownloadCanvas(state => ({ - ...state, - width: newWidth, - })); + if (updatedDimension === dimensions.width) { + return; } - }; - const onWidthChange = event => { - const newWidth = Math.min(event.target.value, maximumSize); - setWidth(newWidth); - - setViewportElementWidth(newWidth); - - setDownloadCanvas(state => ({ - ...state, - width: newWidth, - })); - - if (keepAspect) { - const multiplier = newWidth / lastImage.width; - const newHeight = Math.round(lastImage.height * multiplier); - - setHeight(newHeight); - setViewportElementHeight(newHeight); + // In current code, keepAspect is always `true` + // And we always start w/ a square width/height + setDimensions({ + width: updatedDimension, + height: updatedDimension, + }); + // Only update if value is non-empty + if (!isEmpty) { + setViewportElementDimensions({ + height: updatedDimension, + width: updatedDimension, + }); setDownloadCanvas(state => ({ ...state, - height: newHeight, + height: updatedDimension, + width: updatedDimension, })); } }; @@ -200,24 +168,18 @@ const ViewportDownloadForm = ({
onDimensionsChange(evt, 'height')} />
onDimensionsChange(evt, 'width')} />
@@ -263,8 +225,8 @@ const ViewportDownloadForm = ({