Skip to content

Commit

Permalink
Merge branch 'master' of github.com:OHIF/Viewers into ups-master
Browse files Browse the repository at this point in the history
  • Loading branch information
dannyrb committed Dec 9, 2019
2 parents f06ef53 + c700862 commit 994818f
Show file tree
Hide file tree
Showing 75 changed files with 1,540 additions and 1,229 deletions.
46 changes: 46 additions & 0 deletions docs/latest/configuring/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,52 @@ window.config = {
};
```

The configuration can also be written as a JS Function in case you need to inject dependencies like external services:

```js
window.config = ({ servicesManager } = {}) => {
const { UIDialogService } = servicesManager.services;
return {
cornerstoneExtensionConfig: {
tools: {
ArrowAnnotate: {
configuration: {
getTextCallback: (callback, eventDetails) => UIDialogService.create({...
}
}
},
},
routerBasename: '/',
servers: {
dicomWeb: [
{
name: 'DCM4CHEE',
wadoUriRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/wado',
qidoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs',
wadoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs',
qidoSupportsIncludeField: true,
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
},
],
},
};
};
```
You can also create a new config file and specify its path relative to the build
output's root by setting the `APP_CONFIG` environment variable. You can set the
value of this environment variable a few different ways:
- ~[Add a temporary environment variable in your shell](https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#adding-temporary-environment-variables-in-your-shell)~
- Previous `react-scripts` functionality that we need to duplicate with
`dotenv-webpack`
- ~[Add environment specific variables in `.env` file(s)](https://facebook.github.io/create-react-app/docs/adding-custom-environment-variables#adding-development-environment-variables-in-env)~
- Previous `react-scripts` functionality that we need to duplicate with
`dotenv-webpack`
- Using the `cross-env` package in an npm script:
- `"build": "cross-env APP_CONFIG=config/my-config.js react-scripts build"`
After updating the configuration, `yarn run build` to generate updated build
output.
Expand Down
7 changes: 5 additions & 2 deletions docs/latest/deployment/recipes/embedded-viewer.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@ include tags. Here's how it works:
</ul>

<ol start="2">
<li>Create a JS Object to hold the OHIF Viewer's configuration. Here are some
<li>Create a JS Object or Function to hold the OHIF Viewer's configuration. Here are some
example values that would allow the viewer to hit our public PACS:</li>
</ol>

```js
// Set before importing `ohif-viewer`
// Set before importing `ohif-viewer` (JS Object)
window.config = {
// default: '/'
routerBasename: '/',
Expand All @@ -49,6 +49,9 @@ window.config = {
};
```

To learn more about how you can configure the OHIF Viewer, check out our
[Configuration Guide](./index.md).

<ol start="3"><li>
Render the viewer in the web page's target <code>div</code>
</li></ol>
Expand Down
5 changes: 3 additions & 2 deletions extensions/_example/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ export default {
*/

preRegistration({
servicesManager,
configuration: extensionConfiguration,
servicesManager = {},
commandsManager = {},
configuration = {},
}) {},

/**
Expand Down
14 changes: 14 additions & 0 deletions extensions/cornerstone/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,20 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.

# [2.0.0](https://github.com/OHIF/Viewers/compare/@ohif/[email protected]...@ohif/[email protected]) (2019-12-09)


* feat!: Ability to configure cornerstone tools via extension configuration (#1229) ([55a5806](https://github.com/OHIF/Viewers/commit/55a580659ecb74ca6433461d8f9a05c2a2b69533)), closes [#1229](https://github.com/OHIF/Viewers/issues/1229)


### BREAKING CHANGES

* modifies the exposed react <App /> components props. The contract for providing configuration for the app has changed. Please reference updated documentation for guidance.





## [1.7.2](https://github.com/OHIF/Viewers/compare/@ohif/[email protected]...@ohif/[email protected]) (2019-12-02)

**Note:** Version bump only for package @ohif/extension-cornerstone
Expand Down
18 changes: 18 additions & 0 deletions extensions/cornerstone/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,24 @@ Our Viewport wraps [cornerstonejs/react-cornerstone-viewport][react-viewport]
and is connected the redux store. This module is the most prone to change as we
hammer out our Viewport interface.

## Tool Configuration

Tools can be configured through extension configuration using the tools key:

```js
...
cornerstoneExtensionConfig: {
tools: {
ArrowAnnotate: {
configuration: {
getTextCallback: (callback, eventDetails) => callback(prompt('Enter your custom annotation')),
},
},
},
},
...
```

## Resources

### Repositories
Expand Down
3 changes: 2 additions & 1 deletion extensions/cornerstone/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-cornerstone",
"version": "1.7.2",
"version": "2.0.0",
"description": "OHIF extension for Cornerstone",
"author": "OHIF",
"license": "MIT",
Expand Down Expand Up @@ -47,6 +47,7 @@
"dependencies": {
"@babel/runtime": "^7.5.5",
"classnames": "^2.2.6",
"lodash.merge": "^4.6.2",
"lodash.throttle": "^4.1.1",
"query-string": "^6.8.3",
"react-cornerstone-viewport": "2.x.x"
Expand Down
11 changes: 7 additions & 4 deletions extensions/cornerstone/src/OHIFCornerstoneViewport.js
Original file line number Diff line number Diff line change
Expand Up @@ -248,10 +248,13 @@ class OHIFCornerstoneViewport extends Component {
// TODO: Does it make more sense to use Context?
if (this.props.children && this.props.children.length) {
childrenWithProps = this.props.children.map((child, index) => {
return React.cloneElement(child, {
viewportIndex: this.props.viewportIndex,
key: index,
});
return (
child &&
React.cloneElement(child, {
viewportIndex: this.props.viewportIndex,
key: index,
})
);
});
}

Expand Down
114 changes: 107 additions & 7 deletions extensions/cornerstone/src/commandsModule.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,18 +148,118 @@ const commandsModule = ({ servicesManager }) => {
showDownloadViewportModal: ({ title, viewports }) => {
const activeViewportIndex = viewports.activeViewportIndex;
const { UIModalService } = servicesManager.services;
UIModalService.show({
content: CornerstoneViewportDownloadForm,
title,
contentProps: {
activeViewportIndex,
onClose: UIModalService.hide,
},
if (UIModalService) {
UIModalService.show({
content: CornerstoneViewportDownloadForm,
title,
contentProps: {
activeViewportIndex,
onClose: UIModalService.hide,
},
});
}
},
updateTableWithNewMeasurementData({
toolType,
measurementNumber,
location,
description,
}) {
// Update all measurements by measurement number
const measurementApi = OHIF.measurements.MeasurementApi.Instance;
const measurements = measurementApi.tools[toolType].filter(
m => m.measurementNumber === measurementNumber
);

measurements.forEach(measurement => {
measurement.location = location;
measurement.description = description;

measurementApi.updateMeasurement(measurement.toolType, measurement);
});

measurementApi.syncMeasurementsAndToolData();

// Update images in all active viewports
cornerstone.getEnabledElements().forEach(enabledElement => {
cornerstone.updateImage(enabledElement.element);
});
},
getNearbyToolData({ element, canvasCoordinates, availableToolTypes }) {
const nearbyTool = {};
let pointNearTool = false;

availableToolTypes.forEach(toolType => {
const elementToolData = cornerstoneTools.getToolState(
element,
toolType
);

if (!elementToolData) {
return;
}

elementToolData.data.forEach((toolData, index) => {
let elementToolInstance = cornerstoneTools.getToolForElement(
element,
toolType
);

if (!elementToolInstance) {
elementToolInstance = cornerstoneTools.getToolForElement(
element,
`${toolType}Tool`
);
}

if (!elementToolInstance) {
console.warn('Tool not found.');
return undefined;
}

if (
elementToolInstance.pointNearTool(
element,
toolData,
canvasCoordinates
)
) {
pointNearTool = true;
nearbyTool.tool = toolData;
nearbyTool.index = index;
nearbyTool.toolType = toolType;
}
});

if (pointNearTool) {
return false;
}
});

return pointNearTool ? nearbyTool : undefined;
},
removeToolState: ({ element, toolType, tool }) => {
cornerstoneTools.removeToolState(element, toolType, tool);
cornerstone.updateImage(element);
},
};

const definitions = {
getNearbyToolData: {
commandFn: actions.getNearbyToolData,
storeContexts: [],
options: {},
},
removeToolState: {
commandFn: actions.removeToolState,
storeContexts: [],
options: {},
},
updateTableWithNewMeasurementData: {
commandFn: actions.updateTableWithNewMeasurementData,
storeContexts: [],
options: {},
},
showDownloadViewportModal: {
commandFn: actions.showDownloadViewportModal,
storeContexts: ['viewports'],
Expand Down
Loading

0 comments on commit 994818f

Please sign in to comment.