* feat: 🎸 New modal provider A new modal provider/context component to unify modal related code and simplify modal use Closes: #1086 * refactor(ModalContext): Keep current modal lib * Update modal provider version according to PR #1116 * Update modal provider props to use inner props * Add custom class prop * CR Update: Refactor provider to extract specific modal * Fix modal import * CR Update: Move from spread to object assign * CR Update: Add proptypes, use classnames dependency over interpolation and rename modal * fix: 🎸 Update AboutModal to use new modal provider (#1116) * feat: 🎸 Update AboutModal to use new modal provider This feature updates the AboutModal component and Header to use the new modal context (modal provider) * feat(ModalProvider): Add title prop to provider * fix(ModalContext): Add defaults on hide * CR Updates: Refactor modal provider and fix import * CR Update: Expose props and flat modal optons * Use customclassname instead of static * Add cypress tag * test: set right viewport when layout is decreased (#1146) * chore(release): publish [skip ci] - @ohif/viewer@2.3.6 * fix: 🐛 Minor issues measurement panel related to description (#1142) * chore(release): publish [skip ci] - @ohif/extension-vtk@0.52.28 - @ohif/ui@0.58.5 - @ohif/viewer@2.3.7 * fix: 🐛 Upgrade react-vtkjs-viewport to fix volume orientation (#1143) * chore(release): publish [skip ci] - @ohif/extension-vtk@0.52.29 - @ohif/viewer@2.3.8 * CR Update: Extract and rename AboutModal to AboutContent * feat: 🎸 New modal provider (#1110) * feat: 🎸 New modal provider A new modal provider/context component to unify modal related code and simplify modal use Closes: #1086 * refactor(ModalContext): Keep current modal lib * Update modal provider version according to PR #1116 * Update modal provider props to use inner props * Add custom class prop * CR Update: Refactor provider to extract specific modal * Fix modal import * CR Update: Move from spread to object assign * CR Update: Add proptypes, use classnames dependency over interpolation and rename modal * chore(release): publish [skip ci] - @ohif/extension-vtk@0.52.30 - @ohif/ui@0.59.0 - @ohif/viewer@2.4.0 * CR Update: Keep translation name * CR Update: Reposition cy tag of about modal in the correct level * feat: 🎸 Update DownloadModal to use new modal provider (#1119) * feat: 🎸 Update AboutModal to use new modal provider This feature updates the AboutModal component and Header to use the new modal context (modal provider) * feat(ModalProvider): Add title prop to provider * feat(DownloadModal): Refactor to use new modal provider * Update modal provider props * Use translation for DownloadDialog * CR Update: Use useTranslation hook * CR Update: Extract downloadDialog and rename to downloadContent * CR Update: Fix typo * CR Update: Rename download content to viewport download form
131 lines
4.3 KiB
JavaScript
131 lines
4.3 KiB
JavaScript
import { connect } from 'react-redux';
|
|
import { ViewportDownloadForm } from '@ohif/ui';
|
|
import { utils } from '@ohif/core';
|
|
import cornerstone from 'cornerstone-core';
|
|
import cornerstoneTools from 'cornerstone-tools';
|
|
|
|
const MINIMUM_SIZE = 100;
|
|
const DEFAULT_SIZE = 512;
|
|
const MAX_TEXTURE_SIZE = 10000;
|
|
|
|
const mapStateToProps = (state, ownProps) => {
|
|
const { viewportSpecificData, activeViewportIndex } = state.viewports;
|
|
const { dom: activeEnabledElement } =
|
|
viewportSpecificData[activeViewportIndex] || {};
|
|
|
|
return {
|
|
onClose: ownProps.hide,
|
|
minimumSize: MINIMUM_SIZE,
|
|
maximumSize: MAX_TEXTURE_SIZE,
|
|
defaultSize: DEFAULT_SIZE,
|
|
canvasClass: 'cornerstone-canvas',
|
|
activeViewport: activeEnabledElement,
|
|
enableViewport: viewportElement => {
|
|
if (viewportElement) {
|
|
cornerstone.enable(viewportElement);
|
|
}
|
|
},
|
|
disableViewport: viewportElement => {
|
|
if (viewportElement) {
|
|
cornerstone.disable(viewportElement);
|
|
}
|
|
},
|
|
updateViewportPreview: (viewportElement, downloadCanvas, fileType) =>
|
|
new Promise(resolve => {
|
|
cornerstone.fitToWindow(viewportElement);
|
|
|
|
viewportElement.addEventListener(
|
|
'cornerstoneimagerendered',
|
|
function updateViewport(event) {
|
|
const enabledElement = cornerstone.getEnabledElement(event.target)
|
|
.element;
|
|
const type = 'image/' + fileType;
|
|
const dataUrl = downloadCanvas.toDataURL(type, 1);
|
|
|
|
let newWidth = enabledElement.offsetHeight;
|
|
let newHeight = enabledElement.offsetWidth;
|
|
|
|
if (newWidth > DEFAULT_SIZE || newHeight > DEFAULT_SIZE) {
|
|
const multiplier = DEFAULT_SIZE / Math.max(newWidth, newHeight);
|
|
newHeight *= multiplier;
|
|
newWidth *= multiplier;
|
|
}
|
|
|
|
resolve({ dataUrl, width: newWidth, height: newHeight });
|
|
|
|
viewportElement.removeEventListener(
|
|
'cornerstoneimagerendered',
|
|
updateViewport
|
|
);
|
|
}
|
|
);
|
|
}),
|
|
loadImage: (activeViewport, viewportElement, width, height) =>
|
|
new Promise(resolve => {
|
|
if (activeViewport && viewportElement) {
|
|
const enabledElement = cornerstone.getEnabledElement(activeViewport);
|
|
const viewport = Object.assign({}, enabledElement.viewport);
|
|
delete viewport.scale;
|
|
viewport.translation = {
|
|
x: 0,
|
|
y: 0,
|
|
};
|
|
|
|
cornerstone.loadImage(enabledElement.image.imageId).then(image => {
|
|
cornerstone.displayImage(viewportElement, image);
|
|
cornerstone.setViewport(viewportElement, viewport);
|
|
cornerstone.resize(viewportElement, true);
|
|
|
|
const newWidth = Math.min(width || image.width, MAX_TEXTURE_SIZE);
|
|
const newHeight = Math.min(
|
|
height || image.height,
|
|
MAX_TEXTURE_SIZE
|
|
);
|
|
|
|
resolve({ image, width: newWidth, height: newHeight });
|
|
});
|
|
}
|
|
}),
|
|
toggleAnnotations: (toggle, viewportElement) => {
|
|
cornerstoneTools.store.state.tools.forEach(({ name }) => {
|
|
if (toggle) {
|
|
cornerstoneTools.setToolEnabledForElement(viewportElement, name);
|
|
} else {
|
|
cornerstoneTools.setToolDisabledForElement(viewportElement, name);
|
|
}
|
|
});
|
|
},
|
|
downloadBlob: (filename, fileType, viewportElement, downloadCanvas) => {
|
|
const file = `${filename}.${fileType}`;
|
|
const mimetype = `image/${fileType}`;
|
|
|
|
/* Handles JPEG images for IE11 */
|
|
if (downloadCanvas.msToBlob && fileType === 'jpeg') {
|
|
const image = downloadCanvas.toDataURL(mimetype, 1);
|
|
const blob = utils.b64toBlob(
|
|
image.replace('data:image/jpeg;base64,', ''),
|
|
mimetype
|
|
);
|
|
return window.navigator.msSaveBlob(blob, file);
|
|
}
|
|
|
|
viewportElement.querySelector('canvas').toBlob(blob => {
|
|
const URLObj = window.URL || window.webkitURL;
|
|
const a = document.createElement('a');
|
|
a.href = URLObj.createObjectURL(blob);
|
|
a.download = file;
|
|
document.body.appendChild(a);
|
|
a.click();
|
|
document.body.removeChild(a);
|
|
});
|
|
},
|
|
};
|
|
};
|
|
|
|
const ConnectedViewportDownloadForm = connect(
|
|
mapStateToProps,
|
|
null
|
|
)(ViewportDownloadForm);
|
|
|
|
export default ConnectedViewportDownloadForm;
|