Compare commits

...
Author SHA1 Message Date
ohif-bot ff5060f276 chore(release): publish [skip ci]
- @ohif/viewer@1.2.8
2019-10-01 07:42:58 +00:00
Erik Ziegler dafb26b34b chore: Fix dev server so that it can be accessed on LAN from other devices (#983) 2019-10-01 09:32:50 +02:00
ohif-bot c4f9d5e750 chore(release): publish [skip ci]
- @ohif/extension-vtk@0.50.23
 - @ohif/ui@0.51.3
 - @ohif/viewer@1.2.7
2019-10-01 07:11:22 +00:00
Erik Ziegler cf40a8388c fix: Address issues with touch devices and drag/drop causing crashes (#982) 2019-10-01 09:00:55 +02:00
Erik Ziegler d596ab5c3d ci: Try to fix codecov threshold (#976) 2019-09-30 12:24:14 +02:00
Erik Ziegler 72198eee7d ci: Increase build timeout limit as a stopgap measure (#977) 2019-09-30 12:19:44 +02:00
Danny Brown 057f68a9b4 fix: yarn run start as alias for yarn run dev (#973) 2019-09-28 20:25:47 -04:00
Steve Pieper 034ca64d6b docs: Update node version in readme (#971)
Fixes #970
2019-09-28 19:10:20 -04:00
ohif-bot 4a0901aee9 chore(release): publish [skip ci]
- @ohif/extension-vtk@0.50.22
 - @ohif/core@1.0.1
 - @ohif/viewer@1.2.6
2019-09-27 15:42:12 +00:00
Bhavesh Pandey d0ec9cf0e0 fix: Check for Value in 00081155 sequence (Few patient protocol images doesn't have this value) and removed a duplicate declaration (#921) 2019-09-27 11:30:26 -04:00
ohif-bot 71bea0d4d8 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@1.2.5
 - @ohif/viewer@1.2.5
2019-09-27 13:18:31 +00:00
Danny Brown e607ed2aa0 fix: version bump issue (#963)
* Revert "fix: version bump issue (#962)"

This reverts commit c80ea17cc2.

* fix: stick
2019-09-27 09:04:29 -04:00
ohif-bot 4939f43509 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@2.0.0
 - @ohif/viewer@2.0.0
2019-09-27 12:54:25 +00:00
Danny Brown c80ea17cc2 fix: version bump issue (#962)
* fix: version bump issue

* fix: catch the cornerstone-bump as well
2019-09-27 08:43:40 -04:00
ohif-bot aa7dc1e2c1 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@2.0.0
 - @ohif/extension-dicom-html@1.0.0
 - @ohif/extension-dicom-pdf@1.0.0
 - @ohif/extension-vtk@0.50.21
 - @ohif/core@1.0.0
 - @ohif/viewer@2.0.0
2019-09-27 11:58:23 +00:00
ladeirarodolfo e7e1a8a6cd fix: 🐛 Add DicomLoaderService & FileLoaderService to fix SR, PDF, and SEG support in local file and WADO-RS-only use cases (#862)
* fix: 🐛 Local file: failing when retrieving segmentation data

Fix segmentation data retrieval issues for local file. Changed from
fecthing to use cornerstone loadAndCache method

BREAKING CHANGE: DICOM Seg

Closes: part of #838

* Switch SEG retrieval to WADO-RS

* Forgot a debugger

* refactor: 💡 Code refactor. Minor changes into methods

* fix: 🐛 Load local files: PDF

Items:
1. FileLoaderService: used for serveral operations on local files(load it,  get list of studies, group them, accepting dicom and pdf)
2. DicomLoaderService: used for loading dicom based on dataset and studies. Depending on type of dicom loader might change. WIP
3. Refactor PDF and handleSegmentationStorage to use DicomLoaderService

* fix: 🐛 Code review

* fix: 🐛 Code review. Changed:Folder organization and dicom file

Move fileLoaderService and others to a specific folder. When loading
dicom file change to only retrieve the file(not use cornerstone to cache
or anything else).

* fix: 🐛 Code review. Move dicomLoaderService to core

Moved dicomLoaderService to ohif/core and localFileLoaders to a specific
folder.

* fix: 🐛 Code review

Simplified method to get study for dicom file. Added error handling on
file loading. DicomLoaderService to be exposed on ohif/core/utils
instead.

* fix: 🐛 Reduce local load to one method only

Reduced local file load to one method only

* fix: 🐛 HTML to use dicomLoaderService. Prefer wadors than (uri)

* fix: 🐛 Code implementation for multiframe files

* fix: 🐛 Code review. Default local loader to dicom

Closes: 838

* fix: 🐛 Code review. Use relative path to require DICOMWeb

Closes: 838

* fix: 🐛 Code review. Fix unit test. Added DicomLoaderService mod

Closes: 838

* fix: 🐛 Code review. Add 'Seg' on left thumb

When getting/creating dataset get modality for file/image read

Closes: 838
2019-09-27 13:47:08 +02:00
ohif-bot e66c27affb chore(release): publish [skip ci]
- @ohif/viewer@1.2.3
2019-09-27 11:10:33 +00:00
Danny Brown ae26904885 Revert "* fix: 🐛 Enabling workbox to cache webfonts and fonts-stylesheets, add local fonts for UMD build (#906)" (#961)
This reverts commit 69b96478cb.
2019-09-27 06:54:47 -04:00
ohif-bot 8bb730318a chore(release): publish [skip ci]
- @ohif/viewer@1.2.2
2019-09-27 09:20:09 +00:00
Gustavo André Lelis 69b96478cb * fix: 🐛 Enabling workbox to cache webfonts and fonts-stylesheets, add local fonts for UMD build (#906)
* fix: 🐛 commonjs/umd fonts import

Importing font into index-umd.js and creating a simple font css file
with font-face

Closes: #724

* fix: 🐛 Enabling workbox to cache webfonts and fonts-stylesheets

Closes: #724

* fix: 🐛 Adding all type of fonts from google - Roboto

Closes: #724
2019-09-27 11:11:05 +02:00
ohif-bot 816666df7b chore(release): publish [skip ci]
- @ohif/viewer@1.2.1
2019-09-26 18:24:46 +00:00
Danny Brown e375a4ab11 fix: google cloud support w/ docker (via env var) (#958)
* fix: make sure google config is in output

* fix: update config sub to use new paths and file names
2019-09-26 14:08:44 -04:00
ohif-bot 7f4d71e412 chore(release): publish [skip ci]
- @ohif/viewer@1.2.0
2019-09-26 17:56:20 +00:00
ladeirarodolfo a90605c82d feat: 🎸 React custom component on toolbar button (#935)
* feat: 🎸 React custom component on toolbar button

Toolbar button can consume/render react custom components. Its only
required to expose the component into toolbar definitions
(toolbarModule)

Closes: 924

* feat: 🎸 Core review. Minor changes on documentation

Closes: 924

* feat: 🎸 Code review

* feat: 🎸 Code review. Changing function call to variable decl
2019-09-26 13:45:19 -04:00
ohif-bot 5b523c2afa chore(release): publish [skip ci]
- @ohif/extension-vtk@0.50.20
 - @ohif/ui@0.51.2
 - @ohif/viewer@1.1.14
2019-09-26 14:21:10 +00:00
Gustavo André Lelis 5551f817e3 fix: 🐛 Set series into active viewport by clicking on thumbnail (#945)
* fix: 🐛 Set series into active viewport by clicking on thumbnail

Users should be able to set the series for the active viewport by
clicking it's thumbnail into Study browser

Closes: #895

* fix: 🐛 Set series into active viewport by clicking on thumbnail

Small refactor into onClick data callback and thumbnailClick function

Closes: #895

* fix: 🐛 Refactor thumbnail click code changes

* fix: 🐛 We must clear the sopInstanceUid if we don't update it together with the viewportSpecificData, preventing console warning.

* fix: 🐛  Cleaning up a few more code changes
2019-09-26 10:08:30 -04:00
ohif-bot a9ca3fa026 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@1.2.2
 - @ohif/extension-dicom-html@0.50.8
 - @ohif/extension-dicom-microscopy@0.50.6
 - @ohif/extension-vtk@0.50.19
 - @ohif/viewer@1.1.13
2019-09-26 12:24:19 +00:00
Erik Ziegler 89380353d2 fix: Add some code splitting for PWA build (#937)
* fix: Add some code splitting for PWA build

* Fix missing files
2019-09-26 11:35:13 +02:00
ohif-bot edb86fad55 chore(release): publish [skip ci]
- @ohif/viewer@1.1.12
2019-09-26 03:56:47 +00:00
Danny Brown 395a1be3fb Merge pull request #952 from dannyrb/fix/docker-ci
ci: docker publish (first attempt)
2019-09-25 23:45:59 -04:00
dannyrb 65d852b9e4 enable ci 2019-09-25 23:39:42 -04:00
dannyrb e797a3a141 Add modified dockerfile from previous version 2019-09-25 23:16:00 -04:00
Danny Brown 246936f90b Merge pull request #949 from TZubiri/2dmpr-ui-fix
ui fix: Made mpr more accessible from toolbar.
2019-09-24 21:29:43 -04:00
Tomas Zubiri c57298475a UI fix: Collapsed 2dMPR button to main toolbar 2019-09-24 18:43:32 -03:00
Tomas Zubiri 6a5ebb3e25 initial attempt to simplify code and ui 2019-09-24 18:20:06 -03:00
ohif-bot 291b23aee1 chore(release): publish [skip ci]
- @ohif/extension-vtk@0.50.18
 - @ohif/core@0.50.10
 - @ohif/viewer@1.1.11
2019-09-23 13:17:23 +00:00
Ivan Aksamentov 72427fe2ff fix: Avoid using variable name "module" (#942)
On some configurations variables named `module` may clash with the predefined JS global.
resolves #940
2019-09-23 15:05:26 +02:00
Erik Ziegler 882d04c9bf chore: add husky for automatic linting of staged files (#938) 2019-09-20 13:44:52 +02:00
Erik Ziegler d1a24bc9d9 ci: Update terser-webpack-plugin (#936) 2019-09-19 22:49:15 +02:00
ohif-bot 16a87fa75f chore(release): publish [skip ci]
- @ohif/extension-vtk@0.50.17
 - @ohif/ui@0.51.1
 - @ohif/viewer@1.1.10
2019-09-19 13:13:23 +00:00
Erik Ziegler 6fdac4d605 fix: Use HTML5Backend for drag-drop if the device does not support touch (#927)
* fix: Use HTML5Backend for drag-drop if the device does not support touch, since it's less buggy

* Forgot React when using jsx
2019-09-19 14:57:04 +02:00
ohif-bot 6192502fe0 chore(release): publish [skip ci]
- @ohif/extension-vtk@0.50.16
 - @ohif/viewer@1.1.9
2019-09-19 12:50:18 +00:00
Erik Ziegler 2341b32638 fix: Set transfer function range to data range when loading volumes in VTK (#930) 2019-09-19 14:39:36 +02:00
ohif-bot 45aeaec916 chore(release): publish [skip ci]
- @ohif/viewer@1.1.8
2019-09-19 12:34:20 +00:00
Erik Ziegler 66b84ae9c2 ci: Use development mode for e2e tests for now until we have a better alternative (#934) 2019-09-19 14:20:06 +02:00
ohif-bot bc28fe26ac chore(release): publish [skip ci]
- @ohif/extension-vtk@0.50.15
 - @ohif/viewer@1.1.7
2019-09-19 12:13:07 +00:00
Erik Ziegler 7f642a05da fix: Stop adding empty labelmap to VTK Viewports for now. Wait until paint tools are implemented (#926) 2019-09-19 13:59:50 +02:00
Erik Ziegler 66a0aadcce fix: Bump VTK viewport dependency (#929) 2019-09-19 12:54:10 +02:00
ohif-bot 808af7ee96 chore(release): publish [skip ci]
- @ohif/viewer@1.1.6
2019-09-19 10:01:01 +00:00
Erik Ziegler 10b5e071f4 ci: Comment out an E2E test that is failing on CI due to timing issues 2019-09-19 11:40:36 +02:00
Erik Ziegler fe1969b071 ci: Add progress reporting to build step so CircleCI won't think the step has timed out 2019-09-19 11:40:36 +02:00
Danny Brown 16b2a8295f chore: stalebot misbehaving 2019-09-18 16:15:33 -04:00
ohif-bot d33bb4210d chore(release): publish [skip ci]
- @ohif/extension-cornerstone@1.2.1
 - @ohif/extension-vtk@0.50.14
 - @ohif/core@0.50.9
 - @ohif/viewer@1.1.5
2019-09-17 03:00:30 +00:00
Danny Brown ab681b9929 Merge pull request #920 from dannyrb/fix/bump-cornerstone-tools-version
fix: bump cornerstone-tools to latest version
2019-09-16 22:36:04 -04:00
dannyrb f52daca5e5 fix: force rebuild of yarn.lock 2019-09-16 22:19:18 -04:00
dannyrb 4afc88c0e5 fix: bump cornerstone-tools version in peerDeps 2019-09-16 22:14:18 -04:00
dannyrb f519f8609c fix: bump cornerstone-tools to latest version 2019-09-16 21:53:06 -04:00
ohif-bot e27d5b58a4 chore(release): publish [skip ci]
- @ohif/viewer@1.1.4
2019-09-17 01:39:08 +00:00
Mirna Silva a18b292a9d test: [TEST E2E] Drag and drop thumbnail into viewport (#904)
* TEST E2E: Drag and drop thumbnail into viewport
* TEST E2E: Drag and drop thumbnail into viewport
* fix: add pollyfill to script-tag template
* Add wait's to command
* Try to store artifacts
* ci: updated artifact location
* Changing Patient to MisterMR
* Refactors based on PR comments
* Adding new sub-folders to separate the testing scripts according to context/features
* Adding test cases for Side Panels Measurements and Series
* Removing duplicated file OHIFStudyViewer.spec.js
2019-09-16 21:26:14 -04:00
Danny Brown 7bd1507a89 chore: bad stale bot 2019-09-16 13:53:41 -04:00
Danny Brown a634177578 chore: bad stale bot 2019-09-16 12:53:05 -04:00
ohif-bot fe4d71ad0b chore(release): publish [skip ci]
- @ohif/viewer@1.1.3
2019-09-16 14:41:16 +00:00
ladeirarodolfo f723546e6b fix: 🐛 Fix issue on not loading gcloud (#919)
Fixed issue on not loading gcloud. Error on name variable declaration
2019-09-16 10:26:59 -04:00
Danny Brown 348b8949d4 docs: update code sandbox links to use sandboxes in our team (#915) 2019-09-13 14:54:15 -04:00
ohif-bot 26e037dee7 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@1.2.0
 - @ohif/viewer@1.1.2
2019-09-12 19:34:57 +00:00
Romulo Bordezani 26be96783d feat(Annotate): Add annotate tool back to toolbar
* feat(Arrow Annotate Tool)

* feat(Arrow Annotate Tool)

* refactor: label "Arrow Annotate" to "Annotate"

to match viewer-legacy
2019-09-12 15:22:09 -04:00
ohif-bot 029ba1fb4a chore(release): publish [skip ci]
- @ohif/extension-cornerstone@1.1.1
 - @ohif/extension-dicom-html@0.50.7
 - @ohif/extension-vtk@0.50.13
 - @ohif/viewer@1.1.1
2019-09-12 10:40:45 +00:00
James Petts 56d658f02d Merge pull request #913 from JamesAPetts/dcmjs0.6.1
chore: 🤖 Upgrade dcmjs to 0.6.1
2019-09-12 12:24:36 +02:00
James A. Petts 64921b905f Cosmetic change to trigger netlify rebuild. 2019-09-12 11:26:36 +02:00
James A. Petts d00d7daf41 chore: 🤖 Upgrade dcmjs to 0.6.1 2019-09-12 11:22:46 +02:00
ohif-bot 144a173306 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@1.1.0
 - @ohif/extension-vtk@0.50.12
 - @ohif/ui@0.51.0
 - @ohif/viewer@1.1.0
2019-09-12 03:07:49 +00:00
Romulo Bordezani e40cbae113 feat(BidirectionalTool): Add BidrectionalTool to "more" menu (#911)
* feat(Bidirectional Tool)

* feat(Bidirectional Tool)
2019-09-11 22:53:06 -04:00
Romulo Bordezani 698d274c64 feat(EraserTool): add eraserTool to @ohif/extension-cornerstone (#912)
This includes `ui` changes in the same commit, so it will see a feature bump as well
2019-09-11 16:28:14 -04:00
ladeirarodolfo c221dd86d2 feat: 🎸 Load local file or folder using native dialog (#870)
Created to specialized dropzone elements to take care of loading local
file/folder from dialog

Closes: 847
2019-09-10 23:30:53 -04:00
Danny Brown a8c3d1b9a2 docs: runtime extensions (#908)
* docs: runtime extensions

* docs: small readability changes

* docs: clarity
2019-09-10 22:50:13 -04:00
ohif-bot 6cce8e6720 chore(release): publish [skip ci]
- @ohif/extension-cornerstone@1.0.1
 - @ohif/extension-dicom-html@0.50.6
 - @ohif/extension-dicom-microscopy@0.50.5
 - @ohif/extension-dicom-pdf@0.50.4
 - @ohif/extension-vtk@0.50.11
 - @ohif/i18n@0.50.4
 - @ohif/viewer@1.0.5
2019-09-10 20:38:26 +00:00
Danny Brown e8dbe3e1b6 Merge pull request #907 from dannyrb/publish/react-ohif-org
fix: runtime extension usage
2019-09-10 16:03:50 -04:00
dannyrb ac5dbda3b2 fix: simplify runtime-extension usage 2019-09-10 16:02:08 -04:00
dannyrb bf77b3959a chore: bump react peer deps 2019-09-10 15:12:59 -04:00
ohif-bot c6a6bce0b8 chore(release): publish [skip ci]
- @ohif/extension-vtk@0.50.10
 - @ohif/core@0.50.8
 - @ohif/viewer@1.0.4
2019-09-10 02:48:31 +00:00
dannyrb 3f9decc6d5 Merge branch 'master' of github.com:OHIF/Viewers into upstream-master 2019-09-09 22:33:39 -04:00
dannyrb 1b1ff8068d docs: updated embedded-viewer recipe 2019-09-09 22:33:33 -04:00
ohif-bot eb1a900b13 chore(release): publish [skip ci]
- @ohif/extension-vtk@0.50.9
 - @ohif/core@0.50.7
 - @ohif/viewer@1.0.3
2019-09-10 02:13:05 +00:00
dannyrb e8938111d5 ci: add checkout and restore persist 2019-09-09 21:57:01 -04:00
Danny Brown 73122e717c Merge pull request #905 from dannyrb/fix/regenerator-runtime-issue-for-umd-build
Misc. small script tag and config clean-up items
2019-09-09 21:47:21 -04:00
dannyrb 300fe06b60 chore: remove unused template 2019-09-09 21:46:38 -04:00
dannyrb 37e5387cf0 ci: update all of release to use cypress job names 2019-09-09 21:43:10 -04:00
dannyrb 7c2860789d without numbers 2019-09-09 21:41:50 -04:00
dannyrb df35b1bc06 ci: try using new names 2019-09-09 21:41:14 -04:00
dannyrb 0460a487ec Testing w/ no release steps 2019-09-09 21:39:31 -04:00
dannyrb 0195a3d860 ci: See if we can wait for dynamic job names 2019-09-09 21:37:39 -04:00
dannyrb 2740e34ad3 ignore video output 2019-09-09 21:34:34 -04:00
dannyrb 61d2caef96 ci: update RELEASE to use new cypress tests 2019-09-09 21:34:23 -04:00
dannyrb a88f37595d ci: upgrade cypress orb 2019-09-09 21:33:38 -04:00
Danny Brown 42d80a3e60 re-add working directory key 2019-09-09 18:05:03 -04:00
dannyrb 51143ffe35 Merge branch 'fix/regenerator-runtime-issue-for-umd-build' of github.com:dannyrb/Viewers into fix/regenerator-runtime-issue-for-umd-build 2019-09-09 16:40:21 -04:00
dannyrb 76f7b00b65 ci: script tag e2e tests 2019-09-09 16:40:07 -04:00
Danny Brown 64ca61745b Merge branch 'master' into fix/regenerator-runtime-issue-for-umd-build 2019-09-09 15:52:13 -04:00
dannyrb ababe63a55 fix: on-brand library global name 2019-09-09 15:50:45 -04:00
dannyrb 6c2217f2e5 chore: remove unused relativeWebWorkerScriptsPath config key 2019-09-09 15:50:10 -04:00
dannyrb cf9bec3ffa Merge branch 'fix/regenerator-runtime-issue-for-umd-build' of github.com:dannyrb/Viewers into fix/regenerator-runtime-issue-for-umd-build 2019-09-09 15:49:28 -04:00
dannyrb 32bc47d315 fix: remove requestOptions when key is not needed 2019-09-09 15:49:12 -04:00
ohif-bot 1fb98884d2 chore(release): publish [skip ci]
- @ohif/viewer@1.0.2
2019-09-09 16:35:06 +00:00
Danny Brown 7f8f9dc073 Merge pull request #902 from dannyrb/fix/regenerator-runtime-issue-for-umd-build
fix: import regenerator-runtime for umd build
2019-09-09 12:26:33 -04:00
Danny Brown c6f89495b2 Merge branch 'master' into fix/regenerator-runtime-issue-for-umd-build 2019-09-09 12:26:20 -04:00
dannyrb bad987a06b fix: import regenerator-runtime for umd build 2019-09-09 12:25:37 -04:00
ohif-bot c73abb518f chore(release): publish [skip ci]
- @ohif/extension-cornerstone@1.0.0
 - @ohif/extension-dicom-html@0.50.5
 - @ohif/extension-vtk@0.50.8
 - @ohif/core@0.50.6
 - @ohif/viewer@1.0.1
2019-09-09 15:17:11 +00:00
James Petts d12d01215e Merge pull request #900 from JamesAPetts/cst4
Upgrade to cornerstoneTools 4.0.1 and dcmjs 0.6.0
2019-09-09 17:03:10 +02:00
James A. Petts 86adb5113a feat: 🎸 Upgraded to cornerstoneTools 4.0
Upgraded OHIF to run on cornerstone-tools 4.0.1 and dcmjs 0.6.0.

BREAKING CHANGE: n
2019-09-09 16:43:48 +02:00
James A. Petts 5220cd371c Upgrade to cornerstoneTools 4.0.1 and dcmjs 0.6.0 2019-09-09 16:32:52 +02:00
Danny Brown 16b063a504 ci: fix docs deploy-preview redirect (#878)
* docs: filling in missing readme sections

* ci: fix docs deploy-preview redirect
2019-09-06 15:09:20 -04:00
ohif-bot d0d75987f7 chore(release): publish [skip ci]
- @ohif/viewer@1.0.0
2019-09-06 18:40:55 +00:00
ladeirarodolfo 7c4ee734fa refactor: 💡 React components to consume appConfig using Context (#852)
* refactor: 💡 React components to consume appConfig using Context

React components to consume app configuration using React Context and
React Hooks. Non React components to continue using global variable
window.config. Related documentation also changed.

Closes: #725

* refactor: 💡 Removing unecessary code

On current React component there is no need to import useContext method
from React, so, removing it.

* refactor: 💡 Code review

Code review. Minor changes based on review inputs and moving userManager
to an init method

BREAKING CHANGE: #725

Closes: #725

* docs: don't include implementation detail in docs

* docs: don't include implementation detail in docs

* docs: no need to specify implementation details in employment recipe

* docs: no need to specify implementation details in deployment recipe
2019-09-06 14:31:26 -04:00
ohif-bot a187783e0d chore(release): publish [skip ci]
- @ohif/viewer@0.50.21
2019-09-06 18:23:46 +00:00
Danny Brown ada05b01a7 Merge pull request #874 from dannyrb/docs/monorepo-updates-3
docs: contributing, tests, react-vtkjs-viewport link
2019-09-06 14:13:35 -04:00
Danny Brown 1a44d78277 Merge branch 'master' into docs/monorepo-updates-3 2019-09-06 14:13:22 -04:00
dannyrb 691a073b86 docs(build-pwa): updated commands, file locations, point to configs instead of duplicating 2019-09-06 10:27:02 -04:00
dannyrb 5a54564bff A way to list linked packages 2019-09-06 10:05:02 -04:00
dannyrb 94b625d4e6 fix: viewer project should build output before publish 2019-09-06 09:51:45 -04:00
dannyrb 8f730a5124 Merge branch 'docs/monorepo-updates-3' of github.com:dannyrb/Viewers into docs/monorepo-updates-3 2019-09-06 09:45:26 -04:00
dannyrb 0ff4d90878 docs(contributing): react-vtkjs-viewport, tests 2019-09-06 09:45:13 -04:00
ohif-bot c10342c05c chore(release): publish [skip ci]
- @ohif/extension-cornerstone@0.50.5
 - @ohif/extension-dicom-html@0.50.4
 - @ohif/extension-vtk@0.50.7
 - @ohif/ui@0.50.4
 - @ohif/viewer@0.50.20
2019-09-06 02:42:57 +00:00
Danny Brown a047994e3d Merge branch 'master' into docs/monorepo-updates-3 2019-09-05 22:38:24 -04:00
dannyrb 672ad2d0e7 docs(contributing): example gif 2019-09-05 22:37:17 -04:00
Danny Brown 98bd960014 Merge pull request #873 from dannyrb/docs/monorepo-updates-3
docs: contributing and recipes
2019-09-05 22:33:49 -04:00
dannyrb 9cf30eacb2 docs(contributing): link cornerstone-tools 2019-09-05 22:33:21 -04:00
dannyrb 373b01ac50 docs(contributing): yarn link instead of yalc 2019-09-05 22:27:01 -04:00
dannyrb 9120db49f1 fix: set NODE_ENV for production build 2019-09-05 21:56:19 -04:00
Danny Brown f02e0339a8 Merge branch 'master' into docs/monorepo-updates-3 2019-09-05 21:53:59 -04:00
dannyrb 20d6680e06 chore: update references to ohif-core and react-viewerbase 2019-09-05 21:52:45 -04:00
dannyrb 2b1f2104cd docs(contributing): move to own directory 2019-09-05 21:42:07 -04:00
130 changed files with 4504 additions and 2445 deletions

No files matched your search

+104 -103
View File
@@ -9,9 +9,11 @@ version: 2.1
# create pull request previews and to update `https://docs.ohif.org`
###
## https://github.com/cypress-io/circleci-orb
##
orbs:
codecov: codecov/codecov@1.0.5
cypress: cypress-io/cypress@1.8.0
cypress: cypress-io/cypress@1.10.0
defaults: &defaults
docker:
@@ -21,13 +23,11 @@ defaults: &defaults
working_directory: ~/repo
jobs:
PR_UNIT_TESTS:
CHECKOUT:
<<: *defaults
steps:
# Enable yarn workspaces
- run: yarn config set workspaces-experimental true
# Checkout code and ALL Git Tags
- checkout:
post:
@@ -47,6 +47,16 @@ jobs:
paths:
- ~/.cache ## Cache yarn and Cypress
key: yarn-packages-v1-{{ .Branch }}-{{ checksum "yarn.lock" }}
# Persist :+1:
- persist_to_workspace:
root: ~/repo
paths: .
UNIT_TESTS:
<<: *defaults
steps:
- attach_workspace:
at: ~/repo
# RUN TESTS
- run:
@@ -86,72 +96,7 @@ jobs:
root: ~/repo
paths: .
MERGE_UNIT_TESTS:
<<: *defaults
steps:
# Enable yarn workspaces
- run: yarn config set workspaces-experimental true
# Checkout code and ALL Git Tags
- checkout:
post:
- git fetch --all
- restore_cache:
name: Restore Yarn and Cypress Package Cache
keys:
# when lock file changes, use increasingly general patterns to restore cache
- yarn-packages-v1-{{ .Branch }}-{{ checksum "yarn.lock" }}
- yarn-packages-v1-{{ .Branch }}-
- yarn-packages-v1-
- run:
name: Install Dependencies
command: yarn install --frozen-lockfile
- save_cache:
name: Save Yarn Package Cache
paths:
- ~/.cache ## Cache yarn and Cypress
key: yarn-packages-v1-{{ .Branch }}-{{ checksum "yarn.lock" }}
# RUN TESTS
- run:
name: 'JavaScript Test Suite'
command: yarn run test:unit:ci
# PLATFORM/VIEWER
- run:
name: 'VIEWER: Combine report output'
command: |
viewerCov="/home/circleci/repo/platform/viewer/coverage"
touch "${viewerCov}/reports"
cat "${viewerCov}/clover.xml" >> "${viewerCov}/reports"
echo "\<<\<<\<< EOF" >> "${viewerCov}/reports"
cat "${viewerCov}/lcov.info" >>"${viewerCov}/reports"
echo "\<<\<<\<< EOF" >> "${viewerCov}/reports"
- codecov/upload:
file: '/home/circleci/repo/platform/viewer/coverage/reports'
flags: 'viewer'
# PLATFORM/CORE
- run:
name: 'CORE: Combine report output'
command: |
coreCov="/home/circleci/repo/platform/core/coverage"
touch "${coreCov}/reports"
cat "${coreCov}/clover.xml" >> "${coreCov}/reports"
echo "\<<\<<\<< EOF" >> "${coreCov}/reports"
cat "${coreCov}/lcov.info" >> "${coreCov}/reports"
echo "\<<\<<\<< EOF" >> "${coreCov}/reports"
- codecov/upload:
file: '/home/circleci/repo/platform/core/coverage/reports'
flags: 'core'
# Persist :+1:
- persist_to_workspace:
root: ~/repo
paths: .
npm_publish:
NPM_PUBLISH:
<<: *defaults
steps:
- attach_workspace:
@@ -175,7 +120,7 @@ jobs:
root: ~/repo
paths: .
docs_publish:
DOCS_PUBLISH:
<<: *defaults
steps:
- attach_workspace:
@@ -192,7 +137,7 @@ jobs:
- run: chmod +x ~/repo/.circleci/build-and-publish-docs.sh
- run: ~/repo/.circleci/build-and-publish-docs.sh
docker_publish:
DOCKER_PUBLISH:
<<: *defaults
steps:
- attach_workspace:
@@ -204,13 +149,13 @@ jobs:
command: |
# This file will exist if a new version was published by
# our `semantic-release` command in the previous job
if [[ ! -e tmp/updated-version.txt ]]; then
if [[ ! -e platform/viewer/success_version.txt ]]; then
exit 0
else
# Remove npm config
rm -f ./.npmrc
# Set our version number using vars
export IMAGE_VERSION=$(cat tmp/updated-version.txt)
export IMAGE_VERSION=$(cat platform/viewer/success_version.txt)
export IMAGE_VERSION_FULL=v$IMAGE_VERSION.${CIRCLE_BUILD_NUM}
echo $IMAGE_VERSION
echo $IMAGE_VERSION_FULL
@@ -221,7 +166,7 @@ jobs:
docker push ohif/$IMAGE_NAME:latest
fi
viewer_demo_build:
VIEWER_DEMO_BUILD:
<<: *defaults
steps:
- attach_workspace:
@@ -230,7 +175,7 @@ jobs:
- run:
name: 'Build Demo Site'
command: yarn run build:demo
no_output_timeout: 30m
no_output_timeout: 45m
- run:
name: 'Upload SourceMaps, Send Deploy Notification'
command: |
@@ -246,7 +191,7 @@ jobs:
root: ~/repo
paths: .
viewer_demo_publish:
VIEWER_DEMO_PUBLISH:
working_directory: ~/repo
docker:
- image: google/cloud-sdk
@@ -272,71 +217,127 @@ workflows:
# PULL REQUESTS
PR_CHECKS:
jobs:
- PR_UNIT_TESTS:
- CHECKOUT:
filters:
branches:
ignore:
- master
- feature/*
- hotfix/*
# Cypress job added by `cypress-io` orb
- UNIT_TESTS:
requires:
- CHECKOUT
# E2E: PWA
- cypress/run:
name: 'E2E: PWA'
pre-steps:
- run: 'rm -rf ~/.yarn && npm i -g yarn && yarn -v && yarn global
add wait-on' # Use yarn latest
yarn: true
store_artifacts: true
start: yarn run dev
wait-on: 'http://localhost:3000'
no-workspace: true # Don't persist workspace
store_artifacts: false
working_directory: platform/viewer
build: yarn run build:e2e
start: yarn run test:e2e:dist
wait-on: 'http://localhost:3000'
cache-key: 'yarn-packages-v1-{{ .Branch }}-{{ checksum "yarn.lock" }}'
no-workspace: true # Don't persist workspace
post-steps:
- store_test_results:
path: cypress/results
- store_artifacts:
path: platform/viewer/cypress/screenshots
requires:
- PR_UNIT_TESTS
- UNIT_TESTS
# E2E: script-tag
- cypress/run:
name: 'E2E: Script Tag'
pre-steps:
- run: 'rm -rf ~/.yarn && npm i -g yarn && yarn -v && yarn global
add wait-on' # Use yarn latest
yarn: true
store_artifacts: false
working_directory: platform/viewer
build: yarn run build:package
start: yarn run test:e2e:dist
wait-on: 'http://localhost:3000'
cache-key: 'yarn-packages-v1-{{ .Branch }}-{{ checksum "yarn.lock" }}'
no-workspace: true # Don't persist workspace
post-steps:
- store_artifacts:
path: platform/viewer/cypress/screenshots
requires:
- UNIT_TESTS
# MERGE TO MASTER
RELEASE:
jobs:
- MERGE_UNIT_TESTS:
- CHECKOUT:
filters:
branches:
only: master
# Cypress job added by `cypress-io` orb
- UNIT_TESTS:
requires:
- CHECKOUT
# E2E: PWA + Persist
- cypress/run:
name: 'E2E: PWA'
pre-steps:
- run: 'rm -rf ~/.yarn && npm i -g yarn && yarn -v && yarn global
add wait-on' # Use yarn latest
yarn: true
record: true
store_artifacts: true
start: yarn run dev
wait-on: 'http://localhost:3000'
working_directory: platform/viewer
build: yarn run build:e2e
start: yarn run test:e2e:dist
wait-on: 'http://localhost:3000'
cache-key: 'yarn-packages-v1-{{ .Branch }}-{{ checksum "yarn.lock" }}'
no-workspace: true # Don't persist workspace
post-steps:
- store_artifacts:
path: platform/viewer/cypress/screenshots
- store_test_results:
path: cypress/results
requires:
- MERGE_UNIT_TESTS
- UNIT_TESTS
# E2E: script-tag
- cypress/run:
name: 'E2E: Script Tag'
pre-steps:
- run: 'rm -rf ~/.yarn && npm i -g yarn && yarn -v && yarn global
add wait-on' # Use yarn latest
yarn: true
store_artifacts: false
working_directory: platform/viewer
build: yarn run build:package
start: yarn run test:e2e:dist
wait-on: 'http://localhost:3000'
cache-key: 'yarn-packages-v1-{{ .Branch }}-{{ checksum "yarn.lock" }}'
no-workspace: true # Don't persist workspace
post-steps:
- store_artifacts:
path: platform/viewer/cypress/screenshots
- store_test_results:
path: cypress/results
requires:
- UNIT_TESTS
# Update NPM
- npm_publish:
- NPM_PUBLISH:
requires:
- cypress/run
- 'E2E: Script Tag'
- 'E2E: PWA'
# Update docs.ohif.org
- docs_publish:
- DOCS_PUBLISH:
requires:
- cypress/run
# Update hub.docker.org
# - docker_publish:
# requires:
# - npm_publish
- 'E2E: Script Tag'
- 'E2E: PWA'
- VIEWER_DEMO_BUILD:
requires:
- 'E2E: Script Tag'
- 'E2E: PWA'
# Update viewer.ohif.org
- viewer_demo_build:
- VIEWER_DEMO_PUBLISH:
requires:
- cypress/run
- viewer_demo_publish:
- VIEWER_DEMO_BUILD
# Update hub.docker.org
- DOCKER_PUBLISH:
requires:
- viewer_demo_build
- NPM_PUBLISH
+3 -1
View File
@@ -8,11 +8,13 @@ coverage:
status:
project:
default:
threshold: 0.10%
threshold: 0.5%
core:
flags: core
threshold: 0.5%
viewer:
flags: viewer
threshold: 0.5%
patch: off
flags:
core:
+12
View File
@@ -0,0 +1,12 @@
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
+19
View File
@@ -0,0 +1,19 @@
#!/bin/bash
# If CLIENT_ID is specified, use the google.js configuration with the modified ID
if [ ! -z "$CLIENT_ID" ]
then
echo "Google Cloud Healthcare $CLIENT_ID has been provided: "
echo $CLIENT_ID
echo "Updating config..."
# - Use SED to replace the CLIENT_ID that is currently in google.js
sed -i -e "s/YOURCLIENTID.apps.googleusercontent.com/$CLIENT_ID/g" /usr/share/nginx/html/google.js
# - Copy google.js to overwrite app-config.js
cp /usr/share/nginx/html/google.js /usr/share/nginx/html/app-config.js
fi
echo "Starting Nginx to serve the OHIF Viewer..."
exec "$@"
+30
View File
@@ -0,0 +1,30 @@
# Reduces size of context and hides
# files from Docker (can't COPY or ADD these)
# Output
dist/
build/
# Dependencies
node_modules/
# Root
README.md
Dockerfile
dockerfile
# Misc. Config
.git
.DS_Store
.gitignore
.vscode
.circleci
# Unnecessary things to pull into container
.circleci/
.github/
.netlify/
.scripts/
.vscode/
coverage/
docs/
+3 -3
View File
@@ -7,13 +7,13 @@ daysUntilStale: 21
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- 'Story 🙌'
- 'Bug: Verified 🐛'
- 'Story :raised_hands:'
- 'Bug: Verified :bug:'
- 'Task: CI/Tooling 🤖'
- 'Task: Docs 📖'
- 'Task: Docs :book:'
- 'Task: Refactor 🛠'
- 'Task: Tests 🔬'
- 'Task: Tests :microscope:'
- 'PR: Awaiting Review 👀'
- 'Triage 🏳️'
- 'Announcement 🎉'
+2 -2
View File
@@ -28,7 +28,7 @@ example/deps/
docker/dcm4che/dcm4che-arc
# Cypress test results
cypress/videos/
videos/
# Locize settings
.locize
.locize
+6
View File
@@ -0,0 +1,6 @@
# Specific to our deploy-preview
# Our docs are published using CircleCI + GitBook
# Confgure redirects using netlify.toml
# PWA Demo
/pwa/* /pwa/index.html 200
+64
View File
@@ -0,0 +1,64 @@
# This dockerfile is used to publish the `ohif/viewer` image on dockerhub.
#
# It's a good example of how to build our static application and package it
# with a web server capable of hosting it as static content.
#
# docker build
# --------------
# If you would like to use this dockerfile to build and tag an image, make sure
# you set the context to the project's root directory:
# https://docs.docker.com/engine/reference/commandline/build/
#
#
# SUMMARY
# --------------
# This dockerfile has two stages:
#
# 1. Building the React application for production
# 2. Setting up our Nginx (Alpine Linux) image w/ step one's output
#
# Stage 1: Build the application
# docker build -t ohif/viewer:latest .
FROM node:10.16.3-slim as builder
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
# Copy Files
COPY .docker /usr/src/app/.docker
COPY .webpack /usr/src/app/.webpack
COPY extensions /usr/src/app/extensions
COPY platform /usr/src/app/platform
COPY .browserslistrc /usr/src/app/.browserslistrc
COPY aliases.config.js /usr/src/app/aliases.config.js
COPY babel.config.js /usr/src/app/babel.config.js
COPY lerna.json /usr/src/app/lerna.json
COPY package.json /usr/src/app/package.json
COPY postcss.config.js /usr/src/app/postcss.config.js
COPY yarn.lock /usr/src/app/yarn.lock
# Run the install before copying the rest of the files
RUN yarn config set workspaces-experimental true
RUN yarn install
ENV PATH /usr/src/app/node_modules/.bin:$PATH
# ENV GENERATE_SOURCEMAP=false
# ENV REACT_APP_CONFIG=config/default.js
RUN yarn run build
# Stage 2: Bundle the built application into a Docker container
# which runs Nginx using Alpine Linux
FROM nginx:1.15.5-alpine
RUN apk add --no-cache bash
RUN rm -rf /etc/nginx/conf.d
COPY .docker/Viewer-v2.x /etc/nginx/conf.d
COPY .docker/Viewer-v2.x/entrypoint.sh /usr/src/
RUN chmod 777 /usr/src/entrypoint.sh
COPY --from=builder /usr/src/app/platform/viewer/dist /usr/share/nginx/html
EXPOSE 80
EXPOSE 443
ENTRYPOINT ["/usr/src/entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]
+2 -4
View File
@@ -123,8 +123,7 @@ window.config = {
`window.OHIFStandaloneViewer.installViewer(window.config);`
This exact setup is demonstrated in this
[CodeSandbox](https://codesandbox.io/s/ohif-viewer-script-tag-usage-c4u4t) and
in our
[CodeSandbox](https://codesandbox.io/s/viewer-script-tag-tprch) and in our
[Embedding The Viewer](https://docs.ohif.org/deployment/recipes/embedded-viewer.html)
deployment recipe.
@@ -133,7 +132,7 @@ deployment recipe.
### Requirements
- [Yarn 1.17.3+](https://yarnpkg.com/en/docs/install)
- [Node 8+](https://nodejs.org/en/)
- [Node 10+](https://nodejs.org/en/)
- Yarn Workspaces should be enabled on your machine:
- `yarn config set workspaces-experimental true`
@@ -273,7 +272,6 @@ MIT © [OHIF](https://github.com/OHIF)
[netlify-image]: https://api.netlify.com/api/v1/badges/a5d369ab-18a6-41c3-bcde-83805205ac7f/deploy-status
[netlify-url]: https://app.netlify.com/sites/ohif/deploys
[all-contributors-image]: https://img.shields.io/badge/all_contributors-0-orange.svg?style=flat-square
[contributing-url]: https://github.com/OHIF/Viewers/blob/master/CONTRIBUTING.md
[circleci-image]: https://circleci.com/gh/OHIF/Viewers.svg?style=svg
[circleci-url]: https://circleci.com/gh/OHIF/Viewers
[codecov-image]: https://codecov.io/gh/OHIF/Viewers/branch/master/graph/badge.svg
+3
View File
@@ -0,0 +1,3 @@
# Netlify redirects
# SPA rules for our docs
/* /index.html 200
+1 -1
View File
@@ -40,7 +40,7 @@ Check out these helpful links:
- Ready to dive into some code? Check out our
[Getting Started Guide](./essentials/getting-started.md).
- We're an active, vibrant community.
[Learn how you can be more involved.](./contributing.md)
[Learn how you can be more involved.](./contributing/index.md)
- Feeling lost? Read our [help page](./help.md).
<!--
+1 -1
View File
@@ -46,6 +46,6 @@
---
- [FAQ](frequently-asked-questions.md)
- [Contributing](contributing.md)
- [Contributing](contributing/index.md)
- [Browser Support](browser-support.md)
- [Help](help.md)
+26
View File
@@ -160,6 +160,7 @@ An extension can register a Toolbar Module by providing a `getToolbarModule()`
method that returns a React Component. The component does not receive any props.
If you want to modify or react to state, you will need to connect to the redux
store.
The given toolbar must determine its set of elements and the context of them. The set of elements will be listed on toolbar `definitions`.
![Toolbar Extension](../assets/img/extensions-toolbar.gif)
@@ -170,6 +171,31 @@ Toolbar components are rendered in the `ToolbarRow` component.
For a complete example implementation,
[check out the OHIFCornerstoneViewport's Toolbar Module](https://github.com/OHIF/Viewers/blob/master/extensions/cornerstone/src/toolbarModule.js).
##### Toolbar Custom Component
Toolbar elements can define its own custom react component to be consumed when rendering it. So far, it accepts `Functional` and `Class` Components. For that, you just need to expose your `CustomToolbarComponent` as the value of key `CustomComponent`. In case the property `CustomComponent` is not present, a default toolbar component will be used to render it. See bellow
```js
definitions: [
...
{
id: 'Custom',
label: 'Custom',
icon: 'custom-icon',
CustomComponent: CustomToolbarComponent,
}
...
]
```
`CustomComponent` components will receive the following props:
- parentContext: parent context. (In most of the cases it will be a ToolbarRow instance)
- toolbarClickCallback: callback method when clicking on toolbar
- button: its own definition object
- key: react key prop
- activeButtons: list of active elements
- isActive: if current
#### SopClassHandler
...
Binary file not shown.

After

Width:  |  Height:  |  Size: 422 KiB

-103
View File
@@ -1,103 +0,0 @@
# Contributing
## I would like to contribute code - how do I do this?
Fork the repository, make your change and submit a pull request.
- The OHIF Viewer consists of code from three different repositories. Make sure
your change is modifying the appropriate one:
- `ohif-core`: Business Logic
- `react-viewerbase`: Reusable React Component Library
- `Viewers`: The glue, PWA, and primary extension point
- At a minimum, you may want to read the following documentation:
- [Essentials: Getting Started](./essentials/getting-started.md)
- [Advanced: Architecture](./advanced/architecture.md)
### When changes impact multiple repositories
This is a particularly tricky scenario. We don't want to publish code in one
repository, just so we can test and complete the other half of its requirements
in another. Thankfully, there are a couple of ways you can test unpublished
dependent changes locally before publishing:
- [Use `yarn link`](https://yarnpkg.com/en/docs/cli/link)
For example if you are working on `ohif-core` and would like to use your local
version to debug a problem in `Viewers`, simply run yarn link inside of the
`ohif-core` project.
- If you're experiencing issues with `yarn link`,
[try `yalc`](https://github.com/whitecolor/yalc)
Yalc provides an improved workflow as we add more and more dependent packages
that are "in-progress". This comes into play as we begin working on extensions
and their dependencies.
```js
// Install yalc for the first time
yarn global add yalc
// EXAMPLE: using an in-development version of ohif-core w/ Viewers locally
// 1. Navigate to ohif-core's project root
yarn install
yalc publish
// 2. Run the following after each change to ohif-core
yarn build
yalc push .
// 3. Use the local package in our Viewers project. Navigate to the Viewers
// Project root.
yarn install
yalc add ohif-core
yarn run dev
```
## Any guidance on submitting changes?
While we do appreciate code contributions, triaging and integrating contributed
code changes can be very time consuming. Please consider the following tips when
working on your pull requests:
- Functionality is appropriate for the repository. Consider creating a GitHub
issue to discuss your suggested changes.
- The scope of the pull request is not too large. Please consider separate pull
requests for each feature as big pull requests are very time consuming to
understand.
We will provide feedback on your pull requests as soon as possible. Following
the tips above will help ensure your changes are reviewed.
## Testing contribution pull requests
OHIF uses [netlify](netlify.com) so that pull requests are autogenerated and
available for testing.
For example, [this url][example-url] allows you to test [pull request 237, the
request that created this FAQ entry,][pr-237] using data pulled from Amazon S3.
Replacing the number 237 in the link below with your pull request number should
let you test it as well and you can use this link for discussions on github
without requiring reviewers to download and build your branch.
```bash
https://deploy-preview-237--ohif.netlify.com/viewer/?url=https://s3.eu-central-1.amazonaws.com/ohif-viewer/sampleDICOM.json
```
If you have made a documentation change, a link like this will let you preview
the gitbook generated by the pull request:
```bash
https://deploy-preview-237--ohif.netlify.com/contributing.html
```
<!--
Links
-->
<!-- prettier-ignore-start -->
[example-url]: https://deploy-preview-237--ohif.netlify.com/viewer/?url=https://s3.eu-central-1.amazonaws.com/ohif-viewer/sampleDICOM.json
[pr-237]: https://github.com/OHIF/Viewers/pull/237
<!-- prettier-ignore-end -->
+146
View File
@@ -0,0 +1,146 @@
# Contributing
## How can I help?
Fork the repository, make your change and submit a pull request. If you would
like to discuss the changes you intend to make to clarify where or how they
should be implemented, please don't hesitate to create a new issue. At a
minimum, you may want to read the following documentation:
- [Essentials: Getting Started](./essentials/getting-started.md)
- [Advanced: Architecture](./advanced/architecture.md)
Pull requests that are:
- Small
- [Well tested](./testing.md)
- Decoupled
Are much more likely to get reviewed and merged in a timely manner.
## When changes impact multiple repositories
While this can be tricky, we've tried to reduce how often this situation crops
up this with our [recent switch to a monorepo][monorepo]. Our maintained
extensions, ui components, internationalization library, and business logic can
all be developed by simply running `yarn run dev` from the repository root.
Testing the viewer with locally developed, unpublished package changes from a
package outside of the monorepo is most common with extension development. Let's
demonstrate how to accomplish this with two commonly forked extension
dependencies:
### `cornerstone-tools`
On your local file system:
```bash
# code/my-projects/
.
├── cornerstonejs/cornerstone-tools
└── ohif/viewers
```
- Open a terminal/shell
- Navigate to `cornerstonejs/cornerstone-tools`
- `npm install`
- [`yarn link`](https://yarnpkg.com/en/docs/cli/link)
- `npm run dev`
- Open a new terminal/shell
- Navigate to `ohif/viewers`.
- `yarn install`
- [`yarn link cornerstone-tools`](https://yarnpkg.com/en/docs/cli/link)
- `yarn run dev`
As you make changed to `cornerstone-tools`, and it's output is rebuilt, you
should see the following behavior:
<div style="text-align: center;">
<a href="/assets/img/cornerstone-tools-link.gif">
<img src="/assets/img/cornerstone-tools-link.gif" alt="Example of linked cornerstone-tools package" style="margin: 0 auto; max-width: 500px;" />
</a>
<div><i>example of linked cornerstone-tools package</i></div>
</div>
If you wish to stop using your local package, run the following commands in the
`ohif/viewers` repository root:
- `yarn unlink cornerstone-tools`
- `yarn install --force`
### `react-vtkjs-viewport`
On your local file system:
```bash
# code/my-projects/
.
├── ohif/react-vtkjs-viewport
└── ohif/viewers
```
- Open a terminal/shell
- Navigate to `ohif/react-vtkjs-viewport`
- `yarn install`
- [`yarn link`](https://yarnpkg.com/en/docs/cli/link)
- `yarn run start`
- Open a new terminal/shell
- Navigate to `ohif/viewers`.
- `yarn install`
- [`yarn link react-vtkjs-viewport`](https://yarnpkg.com/en/docs/cli/link)
- `yarn run dev`
#### Other linkage notes
We're still working out some of the kinks with local package development as
there are a lot of factors that can influence the behavior of our development
server and bundler. If you encounter issues not addressed here, please don't
hesitate to reach out on GitHub.
## Any guidance on submitting changes?
While we do appreciate code contributions, triaging and integrating contributed
code changes can be very time consuming. Please consider the following tips when
working on your pull requests:
- Functionality is appropriate for the repository. Consider creating a GitHub
issue to discuss your suggested changes.
- The scope of the pull request is not too large. Please consider separate pull
requests for each feature as big pull requests are very time consuming to
understand.
We will provide feedback on your pull requests as soon as possible. Following
the tips above will help ensure your changes are reviewed.
## Testing contribution pull requests
OHIF uses [netlify](netlify.com) so that pull requests are autogenerated and
available for testing.
For example, [this url][example-url] allows you to test [pull request 237, the
request that created this FAQ entry,][pr-237] using data pulled from Amazon S3.
Replacing the number 237 in the link below with your pull request number should
let you test it as well and you can use this link for discussions on github
without requiring reviewers to download and build your branch.
```bash
https://deploy-preview-237--ohif.netlify.com/viewer/?url=https://s3.eu-central-1.amazonaws.com/ohif-viewer/sampleDICOM.json
```
If you have made a documentation change, a link like this will let you preview
the gitbook generated by the pull request:
```bash
https://deploy-preview-237--ohif.netlify.com/contributing.html
```
<!--
Links
-->
<!-- prettier-ignore-start -->
[example-url]: https://deploy-preview-237--ohif.netlify.com/viewer/?url=https://s3.eu-central-1.amazonaws.com/ohif-viewer/sampleDICOM.json
[pr-237]: https://github.com/OHIF/Viewers/pull/237
[monorepo]: https://github.com/OHIF/Viewers/issues/768
<!-- prettier-ignore-end -->
+1 -1
View File
@@ -205,5 +205,5 @@ Please feel free to suggest or contribute your own recipes.
[host-static-assets]: https://www.netlify.com/blog/2016/05/18/9-reasons-your-site-should-be-static/
[cors]: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
[code-flows]: https://medium.com/@darutk/diagrams-of-all-the-openid-connect-flows-6968e3990660
[code-sandbox]: https://codesandbox.io/s/ohif-viewer-script-tag-usage-b3st9
[code-sandbox]: https://codesandbox.io/s/viewer-script-tag-tprch
<!-- prettier-ignore-end -->
@@ -19,9 +19,6 @@ _With Git:_
```bash
# Clone the remote repository to your local machine
git clone https://github.com/OHIF/Viewers.git
# Make sure the local code reflects the `react` version of the OHIF Viewer
git checkout react
```
More on: _[`git clone`](https://git-scm.com/docs/git-clone),
@@ -29,7 +26,7 @@ More on: _[`git clone`](https://git-scm.com/docs/git-clone),
_From .zip:_
[OHIF/Viewers: react.zip](https://github.com/OHIF/Viewers/archive/react.zip)
[OHIF/Viewers: react.zip](https://github.com/OHIF/Viewers/archive/master.zip)
### Restore Dependencies & Build
@@ -37,20 +34,24 @@ Open your terminal, and navigate to the directory containing the source files.
Next run these commands:
```js
// If you haven't already, enable yarn workspaces
yarn config set workspaces-experimental true
// Restore dependencies
yarn install
// Build source code for production
yarn run build:web
yarn run build
```
If everything worked as expected, you should have a new `build/` directory in
the project's folder. It should roughly resemble the following:
If everything worked as expected, you should have a new `dist/` directory in the
project's folder. It should roughly resemble the following:
```bash
build
├── config/
├── static/
dist/
├── app-config.js
├── app.bundle.js
├── app.css
├── index.html
├── manifest.json
├── service-worker.js
@@ -64,60 +65,15 @@ how to configure the project for your own imaging archive below.
### Configuration
> This step assumes you have an imaging archive. If you need assistance setting
> one up, check out the [`Data Source` Guide](./../../essentials/data-source.md)
> or a deployment recipe that contains an open source Image Archive
The configuration for our viewer is in the `<root>platform/viewer/public/config`
directory. Our build process knows which configuration file to use based on the
`APP_CONFIG` environment variable. By default, its value is
[`config/default.js`][default-config]. The majority of the viewer's features,
and registered extension's features, are configured using this file.
#### How it Works
The configuration for our project is in the `/public/config` directory. Our
build process knows which configuration file to use based on the `APP_CONFIG`
environment variable. By default, its value is
[`default.js`](https://github.com/OHIF/Viewers/blob/master/platform/viewer/public/config/default.js).
When we build, the `%APP_CONFIG%` value in
our[`/public/index.html`](https://github.com/OHIF/Viewers/blob/master/platform/viewer/public/index.html)
file is substituted for the correct configuration file's name. This sets
the`window.config` equal to our configuration file's value.
#### How do I configure my project?
The simplest way is to update the existing default config:
_/public/config/default.js_
```js
window.config = {
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',
requestOptions: {
requestFromBrowser: true,
},
},
],
},
};
```
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)
- [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)
- 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:web` to generate updated build
output.
The easiest way to apply your own configuration is to modify the `default.js`
file. For more advanced cofiguration options, check out our
[configuration essentials guide](/essentials/configuration.md).
## Next Steps
@@ -141,7 +97,7 @@ _Advanced_
### Testing Build Output Locally
A quick way to test your build output locally is to spin up a small webserver.
You can do this by running the following commands in the `build/` output
You can do this by running the following commands in the `dist/` output
directory:
```js
@@ -162,8 +118,7 @@ web application. For a starting point, check out this repository's own use of:
- [CircleCI][circleci]: [config.yaml][circleci-config]
- [Netlify][netlify]: [netlify.toml][netlify.toml] |
[generateStaticSite.sh][generatestaticsite.sh]
- [Semantic-Release][semantic-release]: [.releaserc][releaserc]
[build-deploy-preview.sh][build-deploy-preview.sh]
## Troubleshooting
@@ -173,10 +128,8 @@ web application. For a starting point, check out this repository's own use of:
<!-- prettier-ignore-start -->
[circleci]: https://circleci.com/gh/OHIF/Viewers
[circleci-config]: https://github.com/OHIF/Viewers/blob/react/.circleci/config.yml
[circleci-config]: https://github.com/OHIF/Viewers/blob/master/.circleci/config.yml
[netlify]: https://app.netlify.com/sites/ohif/deploys
[netlify.toml]: https://github.com/OHIF/Viewers/blob/react/netlify.toml
[generateStaticSite.sh]: https://github.com/OHIF/Viewers/blob/react/generateStaticSite.sh
[semantic-release]: https://semantic-release.gitbook.io/semantic-release/
[releaserc]: https://github.com/OHIF/Viewers/blob/react/.releaserc
[netlify.toml]: https://github.com/OHIF/Viewers/blob/master/netlify.toml
[build-deploy-preview.sh]: https://github.com/OHIF/Viewers/blob/master/.netlify/build-deploy-preview.sh
<!-- prettier-ignore-end -->
@@ -16,16 +16,6 @@ include tags. Here's how it works:
<code>Google Font: Roboto</code>
</a>
</li>
<li>
<a href="https://unpkg.com/react@16/umd/react.production.min.js">
<code>react@16.8.6</code>
</a>
</li>
<li>
<a href="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js">
<code>react-dom@16.8.6</code>
</a>
</li>
<li>
<a href="https://unpkg.com/@ohif/viewer">
<code>@ohif/viewer@latest</code>
@@ -53,28 +43,64 @@ window.config = {
qidoSupportsIncludeField: true,
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
requestOptions: {
requestFromBrowser: true,
},
},
],
},
};
```
<ol start="5"><li>
<ol start="3"><li>
Render the viewer in the web page's target <code>div</code>
</li></ol>
```js
// Made available by the `@ohif/viewer` script included in step 1
var Viewer = window.OHIFStandaloneViewer.App;
var app = React.createElement(Viewer, window.config, null);
ReactDOM.render(app, document.getElementById('ohif-viewer-target'));
var containerId = 'id-of-div-to-render-component-to';
var componentRenderedOrUpdatedCallback = function() {
console.log('OHIF Viewer rendered/updated');
};
window.OHIFViewer.installViewer(
window.config,
containerId,
componentRenderedOrUpdatedCallback
);
```
#### Tips & Tricks
You can see a live example of this recipe in [this CodeSandbox][code-sandbox].
## Add Extensions
The UMD build of the OHIF Viewer is a "light weight" build that only contains
the core extensions required for basic 2D image viewing. It's possible to add
other extensions at runtime.
This only requires us to include a single script tag, and add it using the
`extensions` key to our config. In this practical example, we register our
popular whole slide microscopy extension:
```html
<script
src="https://unpkg.com/@ohif/extension-dicom-microscopy@0.50.5/dist/index.umd.js"
crossorigin
></script>
<!-- --->
<script>
window.config = {
// ...
extensions: [OHIFExtDicomMicroscopy],
};
</script>
```
You can see an example of a slide microscopy study in the viewer [with the
extension enabled here][whole-slide-ext-demo] ([source code][ext-code-sandbox])
and [without it here][whole-slide-base-demo] ([source code][code-sandbox]).
You can read more about extensions and how to create your own in our
[extensions guide](/advanced/extensions.md).
#### FAQ
> I'm having trouble getting this to work. Where can I go for help?
@@ -94,8 +120,22 @@ Good. Now `embed` that new page using an
This should produce the expected result while also protecting your page from any
globally defined styles/scripts.
> We're trying to embed the OHIF Viewer into an existing React App, but seeing
> react-dom and react conflicts. What can we do?
`installViewer` is a convenience method that pulls in some dependencies that may
not be compatible with existing `react` apps. `@ohif/viewer` also exports `App`
which is a react component that takes the `configuration` outlined above as
props. You can use it as a reusable component, and to avoid `react` version
conflict issues.
<!--
LINKS
-->
[code-sandbox]: https://codesandbox.io/s/ohif-viewer-script-tag-usage-b3st9
<!-- prettier-ignore-start -->
[code-sandbox]: https://codesandbox.io/s/viewer-script-tag-tprch
[whole-slide-base-demo]: https://tprch.csb.app/viewer/1.2.392.200140.2.1.1.1.2.799008771.2020.1519719354.757
[ext-code-sandbox]: https://codesandbox.io/s/viewer-script-tag-microscopy-extension-44unk
[whole-slide-ext-demo]: https://44unk.csb.app/viewer/1.2.392.200140.2.1.1.1.2.799008771.2448.1519719572.518
<!-- prettier-ignore-end -->
@@ -121,11 +121,7 @@ likely want to update:
#### OHIF Viewer
The OHIF Viewer's configuration is imported from a static `.js` file and made
available globally at `window.config`. The configuration we use is set to a
specific file when we build the viewer, and determined by the env variable:
`APP_CONFIG`. You can see where we set its value in the `dockerfile` for this
solution:
The OHIF Viewer's configuration is imported from a static `.js` file. The configuration we use is set to a specific file when we build the viewer, and determined by the env variable: `APP_CONFIG`. You can see where we set its value in the `dockerfile` for this solution:
`ENV APP_CONFIG=config/docker_openresty-orthanc.js`
@@ -122,11 +122,7 @@ likely want to update:
#### OHIF Viewer
The OHIF Viewer's configuration is imported from a static `.js` file and made
available globally at `window.config`. The configuration we use is set to a
specific file when we build the viewer, and determined by the env variable:
`APP_CONFIG`. You can see where we set its value in the `dockerfile` for this
solution:
The OHIF Viewer's configuration is imported from a static `.js` file. The configuration we use is set to a specific file when we build the viewer, and determined by the env variable: `APP_CONFIG`. You can see where we set its value in the `dockerfile` for this solution:
`ENV APP_CONFIG=config/docker_openresty-orthanc-keycloak.js`
-3
View File
@@ -59,9 +59,6 @@ window.config = {
qidoSupportsIncludeField: true,
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
requestOptions: {
requestFromBrowser: true,
},
},
],
},
+3 -3
View File
@@ -4,7 +4,7 @@ Themeing is currently accomplished with color variables that are defined within
the [`:root`](https://css-tricks.com/almanac/selectors/r/root/) selector
(allowing them to cascade across all elements). This repository's components,
and the ones we consume from our
[React Viewerbase component library](https://react.ohif.org/styling-and-theming)
[`@ohif/ui` component library](https://react.ohif.org/styling-and-theming)
utilize them. We are interested in pursuing more robust themeing options, and
open to pull requests and discussion issues.
@@ -80,12 +80,12 @@ function RadicalImagingLogo() {
href: 'http://radicalimaging.com',
},
React.createElement('h5', {}, 'RADICAL IMAGING')
)
);
}
props.whiteLabelling = {
logoComponent: RadicalImagingLogo(),
}
};
```
<!--
+2 -2
View File
@@ -145,8 +145,8 @@ becomes a new namespace automatically.
- CineDialog: Translations for the toll tips inside the Cine Player Dialog
- Common: all common jargons that can be reused like `t('$t(common:image)')`
- Header: translations related to OHIF's Header Top Bar
- MeasurementTable - Translations for the react-viewerbase Measurement Table
- UserPreferencesModal - Translations for the react-viewerbase Preferences Modal
- MeasurementTable - Translations for the `@ohif/ui` Measurement Table
- UserPreferencesModal - Translations for the `@ohif/ui` Preferences Modal
### How to use another NameSpace inside the current NameSpace?
+2 -2
View File
@@ -19,8 +19,8 @@ Follow the steps outlined in the [Bug Report Template][bug-report-template].
At the moment we are in the process of defining our roadmap and will do our best
to communicate this to the community. If your requested feature is on the
roadmap, then it will most likely be built at some point. If it is not, you are
welcome to build it yourself and [contribute it](contributing.md). If you have
resources and would like to fund the development of a feature, please
welcome to build it yourself and [contribute it](contributing/index.md). If you
have resources and would like to fund the development of a feature, please
[contact us](http://www.ohif.org) or work with community members that offer
[consulting services][commercial-support].
@@ -1,3 +1,4 @@
const webpack = require('webpack');
const merge = require('webpack-merge');
const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
@@ -29,9 +30,15 @@ module.exports = (env, argv) => {
},
output: {
path: ROOT_DIR,
library: 'ohifExtensionCornerstone',
library: 'OHIFExtCornerstone',
libraryTarget: 'umd',
libraryExport: 'default',
filename: pkg.main,
},
plugins: [
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1,
}),
],
});
};
+132
View File
@@ -3,6 +3,138 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.2.5](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@1.2.4...@ohif/extension-cornerstone@1.2.5) (2019-09-27)
### Bug Fixes
* version bump issue ([#963](https://github.com/OHIF/Viewers/issues/963)) ([e607ed2](https://github.com/OHIF/Viewers/commit/e607ed2)), closes [#962](https://github.com/OHIF/Viewers/issues/962)
# [2.0.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@1.2.2...@ohif/extension-cornerstone@2.0.0) (2019-09-27)
### Bug Fixes
* 🐛 Add DicomLoaderService & FileLoaderService to fix SR, PDF, and SEG support in local file and WADO-RS-only use cases ([#862](https://github.com/OHIF/Viewers/issues/862)) ([e7e1a8a](https://github.com/OHIF/Viewers/commit/e7e1a8a)), closes [#838](https://github.com/OHIF/Viewers/issues/838)
* version bump issue ([#962](https://github.com/OHIF/Viewers/issues/962)) ([c80ea17](https://github.com/OHIF/Viewers/commit/c80ea17))
### BREAKING CHANGES
* DICOM Seg
# [2.0.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@1.2.2...@ohif/extension-cornerstone@2.0.0) (2019-09-27)
### Bug Fixes
* 🐛 Add DicomLoaderService & FileLoaderService to fix SR, PDF, and SEG support in local file and WADO-RS-only use cases ([#862](https://github.com/OHIF/Viewers/issues/862)) ([e7e1a8a](https://github.com/OHIF/Viewers/commit/e7e1a8a)), closes [#838](https://github.com/OHIF/Viewers/issues/838)
### BREAKING CHANGES
* DICOM Seg
## [1.2.2](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@1.2.1...@ohif/extension-cornerstone@1.2.2) (2019-09-26)
### Bug Fixes
* Add some code splitting for PWA build ([#937](https://github.com/OHIF/Viewers/issues/937)) ([8938035](https://github.com/OHIF/Viewers/commit/8938035))
## [1.2.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@1.2.0...@ohif/extension-cornerstone@1.2.1) (2019-09-17)
### Bug Fixes
* bump cornerstone-tools version in peerDeps ([4afc88c](https://github.com/OHIF/Viewers/commit/4afc88c))
# [1.2.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@1.1.1...@ohif/extension-cornerstone@1.2.0) (2019-09-12)
### Features
* **Annotate:** Add annotate tool back to toolbar ([26be967](https://github.com/OHIF/Viewers/commit/26be967))
## [1.1.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@1.1.0...@ohif/extension-cornerstone@1.1.1) (2019-09-12)
**Note:** Version bump only for package @ohif/extension-cornerstone
# [1.1.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@1.0.1...@ohif/extension-cornerstone@1.1.0) (2019-09-12)
### Features
* **BidirectionalTool:** Add BidrectionalTool to "more" menu ([#911](https://github.com/OHIF/Viewers/issues/911)) ([e40cbae](https://github.com/OHIF/Viewers/commit/e40cbae))
* **EraserTool:** add eraserTool to @ohif/extension-cornerstone ([#912](https://github.com/OHIF/Viewers/issues/912)) ([698d274](https://github.com/OHIF/Viewers/commit/698d274))
## [1.0.1](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@1.0.0...@ohif/extension-cornerstone@1.0.1) (2019-09-10)
### Bug Fixes
* simplify runtime-extension usage ([ac5dbda](https://github.com/OHIF/Viewers/commit/ac5dbda))
# [1.0.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@0.50.5...@ohif/extension-cornerstone@1.0.0) (2019-09-09)
### Features
* 🎸 Upgraded to cornerstoneTools 4.0 ([86adb51](https://github.com/OHIF/Viewers/commit/86adb51))
### BREAKING CHANGES
* n
## [0.50.5](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@0.50.4...@ohif/extension-cornerstone@0.50.5) (2019-09-06)
**Note:** Version bump only for package @ohif/extension-cornerstone
## [0.50.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-cornerstone@0.50.3...@ohif/extension-cornerstone@0.50.4) (2019-09-04)
**Note:** Version bump only for package @ohif/extension-cornerstone
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-cornerstone",
"version": "0.50.4",
"version": "1.2.5",
"description": "OHIF extension for Cornerstone",
"author": "OHIF",
"license": "MIT",
@@ -32,14 +32,14 @@
"@ohif/ui": "^0.50.0",
"cornerstone-core": "^2.2.8",
"cornerstone-math": "^0.1.8",
"cornerstone-tools": "^3.1.0",
"cornerstone-tools": "^4.0.9",
"cornerstone-wado-image-loader": "^3.0.0",
"dcmjs": "^0.3.8",
"dcmjs": "^0.6.1",
"dicom-parser": "^1.8.3",
"hammerjs": "^2.0.8",
"prop-types": "^15.6.2",
"react": "^15.0.0 || ^16.0.0",
"react-dom": "^15.0.0 || ^16.0.0",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"react-redux": "^6.0.0",
"react-resize-detector": "^3.4.0",
"redux": "^4.0.1"
@@ -0,0 +1,37 @@
/**
* We use this component to leverage "Code Splitting"
*
* Link: https://serverless-stack.com/chapters/code-splitting-in-create-react-app.html
*/
import React, { Component } from 'react';
export default function asyncComponent(importComponent) {
class AsyncComponent extends Component {
constructor(props) {
super(props);
this.state = {
component: null,
};
}
async componentDidMount() {
// Add dynamically loaded component to state
const { default: component } = await importComponent();
this.setState({
component: component,
});
}
render() {
const C = this.state.component;
// Render the loaded component, or null
return C ? <C {...this.props} /> : null;
}
}
return AsyncComponent;
}
@@ -1,10 +1,10 @@
import * as dcmjs from "dcmjs";
import * as dcmjs from 'dcmjs';
import OHIF from "@ohif/core";
import cornerstone from "cornerstone-core";
import cornerstoneTools from "cornerstone-tools";
import OHIF from '@ohif/core';
import cornerstone from 'cornerstone-core';
import cornerstoneTools from 'cornerstone-tools';
const { StackManager } = OHIF.utils;
const { StackManager, DicomLoaderService } = OHIF.utils;
function getDisplaySet(studies, studyInstanceUid, displaySetInstanceUid) {
const study = studies.find(
@@ -52,14 +52,6 @@ function addSegMetadataToCornerstoneToolState(
}
}
function retrieveDicomData(wadoUri) {
// TODO: Authorization header depends on the server. If we ever have multiple servers
// we will need to figure out how / when to pass this information in.
return fetch(wadoUri, {
headers: OHIF.DICOMWeb.getAuthorizationHeader()
}).then(response => response.arrayBuffer());
}
async function handleSegmentationStorage(
studies,
studyInstanceUid,
@@ -73,8 +65,11 @@ async function handleSegmentationStorage(
studyInstanceUid,
displaySetInstanceUid
);
const segWadoUri = displaySet.images[0].getData().wadouri;
const arrayBuffer = await retrieveDicomData(segWadoUri);
const arrayBuffer = await DicomLoaderService.findDicomDataPromise(
displaySet,
studies
);
const dicomData = dcmjs.data.DicomMessage.readFile(arrayBuffer);
const dataset = dcmjs.data.DicomMetaDictionary.naturalizeDataset(
dicomData.dict
@@ -91,7 +86,7 @@ async function handleSegmentationStorage(
if (displaySets.length > 1) {
console.warn(
"More than one display set with the same seriesInstanceUid. This is not supported yet..."
'More than one display set with the same seriesInstanceUid. This is not supported yet...'
);
}
@@ -100,17 +95,19 @@ async function handleSegmentationStorage(
const results = parseSeg(arrayBuffer, imageIds);
if (!results) {
throw new Error("Fractional segmentations are not supported");
throw new Error('Fractional segmentations are not supported');
}
const { segMetadata, toolState } = results;
const { labelmapBuffer, segMetadata, segmentsOnFrame } = results;
const { setters } = cornerstoneTools.getModule('segmentation');
segMetadata.seriesInstanceUid = seriesInstanceUid;
addSegMetadataToCornerstoneToolState(
setters.labelmap3DByFirstImageId(
imageIds[0],
labelmapBuffer,
0, // TODO -> Can define a color LUT based on colors in the SEG later.
segMetadata,
toolState,
displaySetInstanceUid
imageIds.length,
segmentsOnFrame
);
const cachedStack = StackManager.findOrCreateStack(
@@ -118,12 +115,13 @@ async function handleSegmentationStorage(
referenceDisplaySet
);
const stack = Object.assign({}, cachedStack);
stack.currentImageIdIndex = 0;
return {
studyInstanceUid,
displaySetInstanceUid,
stack
stack,
};
}
+3 -1
View File
@@ -1,7 +1,9 @@
import OHIFCornerstoneViewport from './OHIFCornerstoneViewport.js';
import asyncComponent from './asyncComponent.js';
import commandsModule from './commandsModule.js';
import toolbarModule from './toolbarModule.js';
const OHIFCornerstoneViewport = asyncComponent(() => import( /* webpackChunkName: "OHIFCornerstoneViewport" */ './OHIFCornerstoneViewport.js'));
/**
*
*/
+27 -2
View File
@@ -3,8 +3,6 @@
// - Include SVG Source/Inline?
// - By URL, or own component?
// TODO: `ohif-core` toolbar builder?
// What KINDS of toolbar buttons do we have...
// - One's that dispatch commands
// - One's that set tool's active
@@ -71,6 +69,15 @@ const definitions = [
commandName: 'setToolActive',
commandOptions: { toolName: 'Length' },
},
{
id: 'ArrowAnnotate',
label: 'Annotate',
icon: 'measure-non-target',
//
type: TOOLBAR_BUTTON_TYPES.COMMAND,
commandName: 'setToolActive',
commandOptions: { toolName: 'ArrowAnnotate' },
},
{
id: 'Angle',
label: 'Angle',
@@ -188,6 +195,24 @@ const definitions = [
type: TOOLBAR_BUTTON_TYPES.COMMAND,
commandName: 'clearAnnotations',
},
{
id: 'Bidirectional',
label: 'Bidirectional',
icon: 'measure-target',
//
type: TOOLBAR_BUTTON_TYPES.COMMAND,
commandName: 'setToolActive',
commandOptions: { toolName: 'Bidirectional' },
},
{
id: 'Eraser',
label: 'Eraser',
icon: 'eraser',
//
type: TOOLBAR_BUTTON_TYPES.COMMAND,
commandName: 'setToolActive',
commandOptions: { toolName: 'Eraser' },
},
],
},
];
@@ -1,3 +1,4 @@
const webpack = require('webpack');
const merge = require('webpack-merge');
const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
@@ -29,9 +30,15 @@ module.exports = (env, argv) => {
},
output: {
path: ROOT_DIR,
library: 'ohifExtensionDicomHtml',
library: 'OHIFExtDicomHtml',
libraryTarget: 'umd',
libraryExport: 'default',
filename: pkg.main,
},
plugins: [
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1,
}),
],
});
};
+65
View File
@@ -3,6 +3,71 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [1.0.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@0.50.8...@ohif/extension-dicom-html@1.0.0) (2019-09-27)
### Bug Fixes
* 🐛 Add DicomLoaderService & FileLoaderService to fix SR, PDF, and SEG support in local file and WADO-RS-only use cases ([#862](https://github.com/OHIF/Viewers/issues/862)) ([e7e1a8a](https://github.com/OHIF/Viewers/commit/e7e1a8a)), closes [#838](https://github.com/OHIF/Viewers/issues/838)
### BREAKING CHANGES
* DICOM Seg
## [0.50.8](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@0.50.7...@ohif/extension-dicom-html@0.50.8) (2019-09-26)
### Bug Fixes
* Add some code splitting for PWA build ([#937](https://github.com/OHIF/Viewers/issues/937)) ([8938035](https://github.com/OHIF/Viewers/commit/8938035))
## [0.50.7](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@0.50.6...@ohif/extension-dicom-html@0.50.7) (2019-09-12)
**Note:** Version bump only for package @ohif/extension-dicom-html
## [0.50.6](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@0.50.5...@ohif/extension-dicom-html@0.50.6) (2019-09-10)
### Bug Fixes
* simplify runtime-extension usage ([ac5dbda](https://github.com/OHIF/Viewers/commit/ac5dbda))
## [0.50.5](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@0.50.4...@ohif/extension-dicom-html@0.50.5) (2019-09-09)
**Note:** Version bump only for package @ohif/extension-dicom-html
## [0.50.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@0.50.3...@ohif/extension-dicom-html@0.50.4) (2019-09-06)
### Bug Fixes
* set NODE_ENV for production build ([9120db4](https://github.com/OHIF/Viewers/commit/9120db4))
## [0.50.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-html@0.50.2...@ohif/extension-dicom-html@0.50.3) (2019-09-04)
**Note:** Version bump only for package @ohif/extension-dicom-html
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-dicom-html",
"version": "0.50.3",
"version": "1.0.0",
"description": "OHIF extension for rendering structured reports to HTML",
"author": "OHIF",
"license": "MIT",
@@ -20,19 +20,19 @@
"access": "public"
},
"scripts": {
"dev": "cross-env NODE_ENV=production webpack --config .webpack/webpack.dev.js --watch --debug --output-pathinfo",
"dev": "cross-env NODE_ENV=development webpack --config .webpack/webpack.dev.js --watch --debug --output-pathinfo",
"dev:dicom-html": "yarn run dev",
"build": "webpack --config .webpack/webpack.prod.js",
"build": "cross-env NODE_ENV=production webpack --config .webpack/webpack.prod.js",
"build:package": "yarn run build",
"prepublishOnly": "yarn run build",
"start": "yarn run dev"
},
"peerDependencies": {
"@ohif/core": "^0.50.0",
"dcmjs": "^0.3.3",
"dcmjs": "^0.6.1",
"prop-types": "^15.6.2",
"react": "^15.0.0 || ^16.0.0",
"react-dom": "^15.0.0 || ^16.0.0"
"react": "^16.8.6",
"react-dom": "^16.8.6"
},
"dependencies": {
"@babel/runtime": "^7.5.5"
@@ -1,46 +1,34 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import DicomHtmlViewport from './DicomHtmlViewport';
import OHIF from '@ohif/core';
const { DicomLoaderService } = OHIF.utils;
class OHIFDicomHtmlViewport extends Component {
static propTypes = {
studies: PropTypes.object,
displaySet: PropTypes.object,
viewportIndex: PropTypes.number
viewportIndex: PropTypes.number,
};
state = {
byteArray: null,
error: null
error: null,
};
componentDidMount() {
const { displaySet } = this.props.viewportData;
const {
studyInstanceUid,
seriesInstanceUid,
sopInstanceUid,
wadoRoot,
wadoUri,
authorizationHeaders
} = displaySet;
const { displaySet, studies } = this.props.viewportData;
this.retrieveDicomData(
studyInstanceUid,
seriesInstanceUid,
sopInstanceUid,
wadoRoot,
wadoUri,
authorizationHeaders
).then(
byteArray => {
DicomLoaderService.findDicomDataPromise(displaySet, studies).then(
data => {
const byteArray = new Uint8Array(data);
this.setState({
byteArray
byteArray: byteArray,
});
},
error => {
this.setState({
error
error,
});
throw new Error(error);
@@ -48,27 +36,6 @@ class OHIFDicomHtmlViewport extends Component {
);
}
retrieveDicomData(
studyInstanceUid,
seriesInstanceUid,
sopInstanceUid,
wadoRoot,
wadoUri,
authorizationHeaders
) {
// TODO: Passing in a lot of data we aren't using
// TODO: Authorization header depends on the server. If we ever have multiple servers
// we will need to figure out how / when to pass this information in.
return fetch(wadoUri, {
headers: authorizationHeaders
})
.then(response => response.arrayBuffer())
.then(arraybuffer => {
return new Uint8Array(arraybuffer);
});
}
render() {
return (
<>
@@ -0,0 +1,37 @@
/**
* We use this component to leverage "Code Splitting"
*
* Link: https://serverless-stack.com/chapters/code-splitting-in-create-react-app.html
*/
import React, { Component } from 'react';
export default function asyncComponent(importComponent) {
class AsyncComponent extends Component {
constructor(props) {
super(props);
this.state = {
component: null,
};
}
async componentDidMount() {
// Add dynamically loaded component to state
const { default: component } = await importComponent();
this.setState({
component: component,
});
}
render() {
const C = this.state.component;
// Render the loaded component, or null
return C ? <C {...this.props} /> : null;
}
}
return AsyncComponent;
}
+8 -2
View File
@@ -1,5 +1,11 @@
import asyncComponent from './asyncComponent.js';
import OHIFDicomHtmlSopClassHandler from './OHIFDicomHtmlSopClassHandler.js';
import OHIFDicomHtmlViewport from './OHIFDicomHtmlViewport.js';
const OHIFDicomHtmlViewport = asyncComponent(() =>
import(
/* webpackChunkName: "OHIFDicomHtmlViewport" */ './OHIFDicomHtmlViewport.js'
)
);
export default {
/**
@@ -12,5 +18,5 @@ export default {
},
getSopClassHandlerModule() {
return OHIFDicomHtmlSopClassHandler;
}
},
};
@@ -1,3 +1,4 @@
const webpack = require('webpack');
const merge = require('webpack-merge');
const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
@@ -29,9 +30,15 @@ module.exports = (env, argv) => {
},
output: {
path: ROOT_DIR,
library: 'ohifExtensionDicomMicroscopy',
library: 'OHIFExtDicomMicroscopy',
libraryTarget: 'umd',
libraryExport: 'default',
filename: pkg.main,
},
plugins: [
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1
})
]
});
};
+22
View File
@@ -3,6 +3,28 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.50.6](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-microscopy@0.50.5...@ohif/extension-dicom-microscopy@0.50.6) (2019-09-26)
### Bug Fixes
* Add some code splitting for PWA build ([#937](https://github.com/OHIF/Viewers/issues/937)) ([8938035](https://github.com/OHIF/Viewers/commit/8938035))
## [0.50.5](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-microscopy@0.50.4...@ohif/extension-dicom-microscopy@0.50.5) (2019-09-10)
### Bug Fixes
* simplify runtime-extension usage ([ac5dbda](https://github.com/OHIF/Viewers/commit/ac5dbda))
## [0.50.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-microscopy@0.50.3...@ohif/extension-dicom-microscopy@0.50.4) (2019-09-04)
**Note:** Version bump only for package @ohif/extension-dicom-microscopy
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-dicom-microscopy",
"version": "0.50.4",
"version": "0.50.6",
"description": "OHIF extension for Dicom Microscopy",
"author": "OHIF",
"license": "MIT",
@@ -29,8 +29,8 @@
},
"peerDependencies": {
"@ohif/core": "^0.50.0",
"react": "^15.0.0 || ^16.0.0",
"react-dom": "^15.0.0 || ^16.0.0"
"react": "^16.8.6",
"react-dom": "^16.8.6"
},
"dependencies": {
"@babel/runtime": "^7.5.5",
@@ -1,10 +1,7 @@
import React, { Component } from 'react';
import ReactResizeDetector from 'react-resize-detector';
import { api } from 'dicom-microscopy-viewer';
import debounce from 'lodash.debounce';
const microscopyViewer = api.VLWholeSlideMicroscopyImageViewer;
class DicomMicroscopyViewport extends Component {
state = {
error: null,
@@ -56,9 +53,12 @@ class DicomMicroscopyViewport extends Component {
}
return Promise.all(promises);
})
.then(metadata => {
.then(async metadata => {
metadata = metadata.filter(m => m);
const { api } = await import(/* webpackChunkName: "dicom-microscopy-viewer" */ 'dicom-microscopy-viewer');
const microscopyViewer = api.VLWholeSlideMicroscopyImageViewer;
this.viewer = new microscopyViewer({
client: dicomWebClient,
metadata,
@@ -0,0 +1,37 @@
/**
* We use this component to leverage "Code Splitting"
*
* Link: https://serverless-stack.com/chapters/code-splitting-in-create-react-app.html
*/
import React, { Component } from 'react';
export default function asyncComponent(importComponent) {
class AsyncComponent extends Component {
constructor(props) {
super(props);
this.state = {
component: null,
};
}
async componentDidMount() {
// Add dynamically loaded component to state
const { default: component } = await importComponent();
this.setState({
component: component,
});
}
render() {
const C = this.state.component;
// Render the loaded component, or null
return C ? <C {...this.props} /> : null;
}
}
return AsyncComponent;
}
+7 -1
View File
@@ -1,5 +1,11 @@
import asyncComponent from './asyncComponent.js';
import DicomMicroscopySopClassHandler from './DicomMicroscopySopClassHandler.js';
import DicomMicroscopyViewport from './DicomMicroscopyViewport.js';
const DicomMicroscopyViewport = asyncComponent(() =>
import(
/* webpackChunkName: "DicomMicroscopyViewport" */ './DicomMicroscopyViewport.js'
)
);
export default {
/**
@@ -29,8 +29,9 @@ module.exports = (env, argv) => {
},
output: {
path: ROOT_DIR,
library: 'ohifExtensionDicomPdf',
library: 'OHIFExtDicomPdf',
libraryTarget: 'umd',
libraryExport: 'default',
filename: pkg.main,
},
});
+27
View File
@@ -3,6 +3,33 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
# [1.0.0](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-pdf@0.50.4...@ohif/extension-dicom-pdf@1.0.0) (2019-09-27)
### Bug Fixes
* 🐛 Add DicomLoaderService & FileLoaderService to fix SR, PDF, and SEG support in local file and WADO-RS-only use cases ([#862](https://github.com/OHIF/Viewers/issues/862)) ([e7e1a8a](https://github.com/OHIF/Viewers/commit/e7e1a8a)), closes [#838](https://github.com/OHIF/Viewers/issues/838)
### BREAKING CHANGES
* DICOM Seg
## [0.50.4](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-pdf@0.50.3...@ohif/extension-dicom-pdf@0.50.4) (2019-09-10)
### Bug Fixes
* simplify runtime-extension usage ([ac5dbda](https://github.com/OHIF/Viewers/commit/ac5dbda))
## [0.50.3](https://github.com/OHIF/Viewers/compare/@ohif/extension-dicom-pdf@0.50.2...@ohif/extension-dicom-pdf@0.50.3) (2019-09-04)
**Note:** Version bump only for package @ohif/extension-dicom-pdf
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-dicom-pdf",
"version": "0.50.3",
"version": "1.0.0",
"description": "OHIF extension for Dicom PDF",
"author": "OHIF",
"license": "MIT",
@@ -31,8 +31,8 @@
"@ohif/core": "^0.50.0",
"dicom-parser": "^1.8.3",
"prop-types": "^15.6.2",
"react": "^15.0.0 || ^16.0.0",
"react-dom": "^15.0.0 || ^16.0.0"
"react": "^16.8.6",
"react-dom": "^16.8.6"
},
"dependencies": {
"@babel/runtime": "^7.5.5",
+20 -15
View File
@@ -4,41 +4,46 @@ import TypedArrayProp from './TypedArrayProp';
// TODO: Should probably use dcmjs for this
const SOP_CLASS_UIDS = {
ENCAPSULATED_PDF: '1.2.840.10008.5.1.4.1.1.104.1'
ENCAPSULATED_PDF: '1.2.840.10008.5.1.4.1.1.104.1',
};
class DicomPDFViewport extends Component {
state = {
fileURL: null,
error: null
error: null,
};
static propTypes = {
byteArray: TypedArrayProp.uint8
byteArray: TypedArrayProp.uint8,
};
renderPDF = dataSet => {
const sopClassUid = dataSet.string('x00080016');
renderPDF = (dataSet, byteArray) => {
let pdfByteArray = byteArray;
if (sopClassUid !== SOP_CLASS_UIDS.ENCAPSULATED_PDF) {
throw new Error('This is not a DICOM-encapsulated PDF');
if (dataSet) {
const sopClassUid = dataSet.string('x00080016');
if (sopClassUid !== SOP_CLASS_UIDS.ENCAPSULATED_PDF) {
throw new Error('This is not a DICOM-encapsulated PDF');
}
const fileTag = dataSet.elements.x00420011;
const offset = fileTag.dataOffset;
const remainder = offset + fileTag.length;
pdfByteArray = dataSet.byteArray.slice(offset, remainder);
}
const fileTag = dataSet.elements.x00420011;
const offset = fileTag.dataOffset;
const remainder = offset + fileTag.length;
const pdfByteArray = dataSet.byteArray.slice(offset, remainder);
const PDF = new Blob([pdfByteArray], { type: 'application/pdf' });
const fileURL = URL.createObjectURL(PDF);
this.setState({
fileURL
fileURL,
});
};
parseByteArray = byteArray => {
const options = {
untilTag: ''
untilTag: '',
};
let dataSet;
@@ -47,7 +52,7 @@ class DicomPDFViewport extends Component {
dataSet = dicomParser.parseDicom(byteArray, options);
} catch (error) {
this.setState({
error
error,
});
}
@@ -57,7 +62,7 @@ class DicomPDFViewport extends Component {
componentDidMount() {
const dataSet = this.parseByteArray(this.props.byteArray);
this.renderPDF(dataSet);
this.renderPDF(dataSet, this.props.byteArray);
}
render() {
@@ -1,60 +1,54 @@
import React, { Component } from "react";
import PropTypes from "prop-types";
import OHIF from "@ohif/core";
import OHIFComponentPlugin from "./OHIFComponentPlugin.js";
import DicomPDFViewport from "./DicomPDFViewport";
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import OHIF from '@ohif/core';
import OHIFComponentPlugin from './OHIFComponentPlugin.js';
import DicomPDFViewport from './DicomPDFViewport';
const { DICOMWeb } = OHIF;
const { DicomLoaderService } = OHIF.utils;
class OHIFDicomPDFViewport extends Component {
static propTypes = {
studies: PropTypes.object,
displaySet: PropTypes.object,
viewportIndex: PropTypes.number
viewportIndex: PropTypes.number,
};
state = {
byteArray: null,
error: null
error: null,
};
static id = "DicomPDFViewportPDF";
static id = 'DicomPDFViewportPDF';
static init() {
console.log("DicomPDFViewport init()");
console.log('DicomPDFViewport init()');
}
static destroy() {
console.log("DicomPDFViewport destroy()");
console.log('DicomPDFViewport destroy()');
}
componentDidMount() {
const { displaySet } = this.props.viewportData;
const { displaySet, studies } = this.props.viewportData;
const {
studyInstanceUid,
seriesInstanceUid,
sopInstanceUid,
wadoRoot,
wadoUri,
authorizationHeaders
authorizationHeaders,
} = displaySet;
this.retrieveDicomData(
studyInstanceUid,
seriesInstanceUid,
sopInstanceUid,
wadoRoot,
wadoUri,
authorizationHeaders
).then(
byteArray => {
DicomLoaderService.findDicomDataPromise(displaySet, studies).then(
data => {
const byteArray = new Uint8Array(data);
this.setState({
byteArray
byteArray: byteArray,
});
},
error => {
this.setState({
error
error,
});
throw new Error(error);
@@ -62,27 +56,6 @@ class OHIFDicomPDFViewport extends Component {
);
}
retrieveDicomData(
studyInstanceUid,
seriesInstanceUid,
sopInstanceUid,
wadoRoot,
wadoUri,
authorizationHeaders
) {
// TODO: Passing in a lot of data we aren't using
// TODO: Authorization header depends on the server. If we ever have multiple servers
// we will need to figure out how / when to pass this information in.
return fetch(wadoUri, {
headers: authorizationHeaders
})
.then(response => response.arrayBuffer())
.then(arraybuffer => {
return new Uint8Array(arraybuffer);
});
}
render() {
const { id, init, destroy } = OHIFDicomPDFViewport;
const pluginProps = { id, init, destroy };
+8 -1
View File
@@ -1,3 +1,4 @@
const webpack = require('webpack');
const merge = require('webpack-merge');
const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
@@ -29,9 +30,15 @@ module.exports = (env, argv) => {
},
output: {
path: ROOT_DIR,
library: 'ohifExtensionVtk',
library: 'OHIFExtVtk',
libraryTarget: 'umd',
libraryExport: 'default',
filename: pkg.main,
},
plugins: [
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1,
}),
],
});
};
+152
View File
@@ -3,6 +3,158 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.50.23](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.22...@ohif/extension-vtk@0.50.23) (2019-10-01)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.22](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.21...@ohif/extension-vtk@0.50.22) (2019-09-27)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.21](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.20...@ohif/extension-vtk@0.50.21) (2019-09-27)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.20](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.19...@ohif/extension-vtk@0.50.20) (2019-09-26)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.19](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.18...@ohif/extension-vtk@0.50.19) (2019-09-26)
### Bug Fixes
* Add some code splitting for PWA build ([#937](https://github.com/OHIF/Viewers/issues/937)) ([8938035](https://github.com/OHIF/Viewers/commit/8938035))
## [0.50.18](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.17...@ohif/extension-vtk@0.50.18) (2019-09-23)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.17](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.16...@ohif/extension-vtk@0.50.17) (2019-09-19)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.16](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.15...@ohif/extension-vtk@0.50.16) (2019-09-19)
### Bug Fixes
* Set transfer function range to data range when loading volumes in VTK ([#930](https://github.com/OHIF/Viewers/issues/930)) ([2341b32](https://github.com/OHIF/Viewers/commit/2341b32))
## [0.50.15](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.14...@ohif/extension-vtk@0.50.15) (2019-09-19)
### Bug Fixes
* Bump VTK viewport dependency ([#929](https://github.com/OHIF/Viewers/issues/929)) ([66a0aad](https://github.com/OHIF/Viewers/commit/66a0aad))
* Stop adding empty labelmap to VTK Viewports for now. Wait until paint tools are implemented ([#926](https://github.com/OHIF/Viewers/issues/926)) ([7f642a0](https://github.com/OHIF/Viewers/commit/7f642a0))
## [0.50.14](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.13...@ohif/extension-vtk@0.50.14) (2019-09-17)
### Bug Fixes
* bump cornerstone-tools version in peerDeps ([4afc88c](https://github.com/OHIF/Viewers/commit/4afc88c))
## [0.50.13](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.12...@ohif/extension-vtk@0.50.13) (2019-09-12)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.12](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.11...@ohif/extension-vtk@0.50.12) (2019-09-12)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.11](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.10...@ohif/extension-vtk@0.50.11) (2019-09-10)
### Bug Fixes
* simplify runtime-extension usage ([ac5dbda](https://github.com/OHIF/Viewers/commit/ac5dbda))
## [0.50.10](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.9...@ohif/extension-vtk@0.50.10) (2019-09-10)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.9](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.8...@ohif/extension-vtk@0.50.9) (2019-09-10)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.8](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.7...@ohif/extension-vtk@0.50.8) (2019-09-09)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.7](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.6...@ohif/extension-vtk@0.50.7) (2019-09-06)
**Note:** Version bump only for package @ohif/extension-vtk
## [0.50.6](https://github.com/OHIF/Viewers/compare/@ohif/extension-vtk@0.50.5...@ohif/extension-vtk@0.50.6) (2019-09-04)
**Note:** Version bump only for package @ohif/extension-vtk
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/extension-vtk",
"version": "0.50.6",
"version": "0.50.23",
"description": "OHIF extension for VTK.js",
"author": "OHIF",
"license": "MIT",
@@ -34,7 +34,7 @@
"@ohif/ui": "^0.50.0",
"cornerstone-core": "^2.2.8",
"cornerstone-wado-image-loader": "^3.0.0",
"dcmjs": "^0.4.7",
"dcmjs": "^0.6.1",
"dicom-parser": "^1.8.3",
"i18next": "^17.0.3",
"i18next-browser-languagedetector": "^3.0.1",
@@ -48,14 +48,14 @@
},
"dependencies": {
"@babel/runtime": "^7.5.5",
"react-vtkjs-viewport": "0.0.11"
"react-vtkjs-viewport": "0.1.0"
},
"devDependencies": {
"@ohif/core": "^0.50.5",
"@ohif/ui": "^0.50.3",
"cornerstone-tools": "^3.13.0",
"@ohif/core": "^1.0.1",
"@ohif/ui": "^0.51.3",
"cornerstone-tools": "^4.0.9",
"cornerstone-wado-image-loader": "^3.0.0",
"dcmjs": "^0.5.1",
"dcmjs": "^0.6.1",
"dicom-parser": "^1.8.3",
"gh-pages": "^2.0.1",
"i18next": "^17.0.3",
+9 -2
View File
@@ -189,6 +189,11 @@ class OHIFVTKViewport extends Component {
volumeActor.setMapper(volumeMapper);
volumeMapper.setInputData(data);
const range = data.getPointData().getScalars().getRange();
// TODO: For PET we might want to just set this to 0-5 SUV
volumeActor.getProperty().getRGBTransferFunction(0).setRange(range[0], range[1]);
// TODO: Should look into implementing autoAdjustSampleDistance in vtk
const sampleDistance =
1.2 *
@@ -233,9 +238,11 @@ class OHIFVTKViewport extends Component {
frameIndex
);
if (!labelmap) {
// TODO: Temporarily disabling this since it is not yet
// being used and hurts performance significantly.
/*if (!labelmap) {
labelmap = createLabelMapImageData(data);
}
}*/
const volumeActor = this.getOrCreateVolume(data, displaySetInstanceUid);
+37
View File
@@ -0,0 +1,37 @@
/**
* We use this component to leverage "Code Splitting"
*
* Link: https://serverless-stack.com/chapters/code-splitting-in-create-react-app.html
*/
import React, { Component } from 'react';
export default function asyncComponent(importComponent) {
class AsyncComponent extends Component {
constructor(props) {
super(props);
this.state = {
component: null,
};
}
async componentDidMount() {
// Add dynamically loaded component to state
const { default: component } = await importComponent();
this.setState({
component: component,
});
}
render() {
const C = this.state.component;
// Render the loaded component, or null
return C ? <C {...this.props} /> : null;
}
}
return AsyncComponent;
}
+5 -1
View File
@@ -1,9 +1,13 @@
import OHIFVTKViewport from './OHIFVTKViewport.js';
import asyncComponent from './asyncComponent.js';
import commandsModule from './commandsModule.js';
import toolbarModule from './toolbarModule.js';
// This feels weird
// import loadLocales from './loadLocales';
const OHIFVTKViewport = asyncComponent(() =>
import(/* webpackChunkName: "OHIFVTKViewport" */ './OHIFVTKViewport.js')
);
const vtkExtension = {
/**
* Only required property. Should be a unique value across all extensions.
+1 -20
View File
@@ -3,7 +3,7 @@
# TOML Reference:
# https://www.netlify.com/docs/netlify-toml-reference/
#
# We use Netlify for deploy previews and deploy previews only.
# We use Netlify for deploy previews and for publishing docs (gh-pages branch).
# https://viewer.ohif.org is created using a different process that is
# managed by CircleCI and deployed to our Google Hosting
#
@@ -40,25 +40,6 @@
publish = ".netlify/www/"
command = "yarn config set workspaces-experimental true && chmod +x .netlify/build-deploy-preview.sh && .netlify/build-deploy-preview.sh"
# Redirects and headers are GLOBAL for all builds – they do not get scoped to
# contexts no matter where you define them in the file.
# For context-specific rules, use _headers or _redirects files, which are
# PER-DEPLOY.
# The following redirect is intended for use with most SPAs that handle
# routing internally.
# By default, redirects won't be applied if there's a file with the same
# path as the one defined in the `from` property. Setting `force` to `true`
# will make the redirect rule take precedence over any existing files.
[[redirects]]
from = "/*"
to = "/index.html"
status = 200
[[redirects]]
from = "/pwa/*"
to = "/pwa/index.html"
status = 200
[[headers]]
# Define which paths this specific [[headers]] block will cover.
for = "/*"
+20 -2
View File
@@ -13,6 +13,7 @@
"scripts": {
"cm": "npx git-cz",
"build": "lerna run build:viewer --stream",
"build:e2e": "lerna run build:viewer:e2e --stream",
"build:ci": "lerna run build:viewer:ci --stream",
"build:demo": "lerna run build:viewer:demo --stream",
"build:package": "lerna run build:viewer:package --stream",
@@ -21,14 +22,18 @@
"dev:project": ".scripts/dev.sh",
"dev:orthanc": "lerna run dev:orthanc --stream",
"orthanc:up": "docker-compose -f .docker/Nginx-Orthanc/docker-compose.yml up",
"start": "yarn run dev",
"test": "yarn run test:unit",
"test:unit": "jest --collectCoverage",
"test:unit:ci": "lerna run test:unit:ci --parallel --stream",
"test:e2e": "lerna run test:e2e --stream",
"test:e2e:dist": "lerna run test:e2e:dist --stream",
"see-changed": "lerna changed",
"docs:publish": "chmod +x ./build-and-publish-docs.sh && ./build-and-publish-docs.sh",
"release": "yarn run lerna:version && yarn run lerna:publish",
"lerna:version": "npx lerna version prerelease --force-publish",
"lerna:publish": "lerna publish from-package --canary --dist-tag canary"
"lerna:publish": "lerna publish from-package --canary --dist-tag canary",
"link-list": "npm ls --depth=0 --link=true"
},
"dependencies": {
"@babel/runtime": "^7.5.5",
@@ -78,13 +83,15 @@
"react-dom": "^16.8.6",
"react-hot-loader": "^4.12.11",
"redux-testkit": "^1.0.6",
"serve": "^11.1.0",
"shader-loader": "^1.3.1",
"start-server-and-test": "^1.10.0",
"style-loader": "^1.0.0",
"stylelint": "^10.1.0",
"stylelint-config-recommended": "^2.2.0",
"stylus": "^0.54.5",
"stylus-loader": "^3.0.2",
"terser-webpack-plugin": "^1.4.1",
"terser-webpack-plugin": "^2.1.0",
"webpack": "^4.35.2",
"webpack-cli": "^3.3.5",
"webpack-dev-server": "^3.7.2",
@@ -93,6 +100,17 @@
"workbox-webpack-plugin": "^4.3.1",
"worker-loader": "^2.0.0"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"src/**/*.{js,json,css}": [
"prettier --write",
"git add"
]
},
"resolutions": {
"**/@babel/runtime": "7.5.5"
}
+76
View File
@@ -3,6 +3,82 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.0.1](https://github.com/OHIF/Viewers/compare/@ohif/core@1.0.0...@ohif/core@1.0.1) (2019-09-27)
### Bug Fixes
* Check for Value in 00081155 sequence (Few patient protocol images doesn't have this value) and removed a duplicate declaration ([#921](https://github.com/OHIF/Viewers/issues/921)) ([d0ec9cf](https://github.com/OHIF/Viewers/commit/d0ec9cf))
# [1.0.0](https://github.com/OHIF/Viewers/compare/@ohif/core@0.50.10...@ohif/core@1.0.0) (2019-09-27)
### Bug Fixes
* 🐛 Add DicomLoaderService & FileLoaderService to fix SR, PDF, and SEG support in local file and WADO-RS-only use cases ([#862](https://github.com/OHIF/Viewers/issues/862)) ([e7e1a8a](https://github.com/OHIF/Viewers/commit/e7e1a8a)), closes [#838](https://github.com/OHIF/Viewers/issues/838)
### BREAKING CHANGES
* DICOM Seg
## [0.50.10](https://github.com/OHIF/Viewers/compare/@ohif/core@0.50.9...@ohif/core@0.50.10) (2019-09-23)
### Bug Fixes
* Avoid using variable name "module" ([#942](https://github.com/OHIF/Viewers/issues/942)) ([72427fe](https://github.com/OHIF/Viewers/commit/72427fe)), closes [#940](https://github.com/OHIF/Viewers/issues/940)
## [0.50.9](https://github.com/OHIF/Viewers/compare/@ohif/core@0.50.8...@ohif/core@0.50.9) (2019-09-17)
### Bug Fixes
* bump cornerstone-tools version in peerDeps ([4afc88c](https://github.com/OHIF/Viewers/commit/4afc88c))
## [0.50.8](https://github.com/OHIF/Viewers/compare/@ohif/core@0.50.7...@ohif/core@0.50.8) (2019-09-10)
**Note:** Version bump only for package @ohif/core
## [0.50.7](https://github.com/OHIF/Viewers/compare/@ohif/core@0.50.6...@ohif/core@0.50.7) (2019-09-10)
### Bug Fixes
* remove requestOptions when key is not needed ([32bc47d](https://github.com/OHIF/Viewers/commit/32bc47d))
## [0.50.6](https://github.com/OHIF/Viewers/compare/@ohif/core@0.50.5...@ohif/core@0.50.6) (2019-09-09)
**Note:** Version bump only for package @ohif/core
## [0.50.5](https://github.com/OHIF/Viewers/compare/@ohif/core@0.50.4...@ohif/core@0.50.5) (2019-09-04)
**Note:** Version bump only for package @ohif/core
+6 -7
View File
@@ -35,7 +35,7 @@ can be used with Vue, React, Vanilla JS, or any number of other frameworks.
The documentation for this library is sparse. The best way to get started is to
look at its
[top level exports](https://github.com/OHIF/ohif-core/blob/master/src/index.js),
[top level exports](https://github.com/OHIF/Viewers/blob/master/platform/core/src/index.js),
and explore the source code of features that interest you. If you want to see
how we use this library, you can check out [our viewer
implementation][react-viewer].
@@ -57,12 +57,12 @@ yarn add @ohif/core --exact
### Usage
Usage is dependent on the feature(s) you want to leverage. The bulk of
`ohif-core`'s features are "pure" and can be imported and used in place.
`@ohif/core`'s features are "pure" and can be imported and used in place.
_Example: retrieving study metadata from a server_
```js
import { studies } from "@ohif/core";
import { studies } from '@ohif/core';
const studiesMetadata = await studies.retrieveStudiesMetadata(
server, // Object
@@ -125,11 +125,10 @@ Links:
<!-- prettier-ignore-start -->
<!-- ROW -->
[npm-url]: https://npmjs.org/package/ohif-core
[npm-downloads-image]: https://img.shields.io/npm/dm/ohif-core.svg?style=flat-square
[npm-version-image]: https://img.shields.io/npm/v/ohif-core.svg?style=flat-square
[npm-url]: https://npmjs.org/package/@ohif/core
[npm-downloads-image]: https://img.shields.io/npm/dm/@ohif/core.svg?style=flat-square
[npm-version-image]: https://img.shields.io/npm/v/@ohif/core.svg?style=flat-square
[all-contributors-image]: https://img.shields.io/badge/all_contributors-0-orange.svg?style=flat-square
[contributing-url]: https://github.com/OHIF/ohif-core/blob/master/CONTRIBUTING.md
[license-image]: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square
[license-url]: LICENSE
<!-- Misc. -->
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/core",
"version": "0.50.5",
"version": "1.0.1",
"description": "Generic business logic for web-based medical imaging applications",
"author": "OHIF Core Team",
"license": "MIT",
@@ -32,7 +32,7 @@
},
"peerDependencies": {
"cornerstone-core": "^2.2.8",
"cornerstone-tools": "^3.9.0",
"cornerstone-tools": "^4.0.9",
"cornerstone-wado-image-loader": "^3.0.0",
"dicom-parser": "^1.8.3"
},
@@ -6,17 +6,21 @@ import user from '../user';
/**
* Returns the Authorization header as part of an Object.
*
* @returns {Object}
* @export
* @param {Object} [server={}]
* @param {Object} [server.requestOptions]
* @param {string} [server.requestOptions.auth]
* @returns {Object} { Authorization }
*/
export default function getAuthorizationHeader(server) {
export default function getAuthorizationHeader({ requestOptions } = {}) {
const headers = {};
// Check for OHIF.user since this can also be run on the server
const accessToken = user && user.getAccessToken && user.getAccessToken();
if (server && server.requestOptions && server.requestOptions.auth) {
if (requestOptions && requestOptions.auth) {
// HTTP Basic Auth (user:password)
headers.Authorization = `Basic ${btoa(server.requestOptions.auth)}`;
headers.Authorization = `Basic ${btoa(requestOptions.auth)}`;
} else if (accessToken) {
headers.Authorization = `Bearer ${accessToken}`;
}
@@ -129,6 +129,7 @@ export class StudyMetadata extends Metadata {
);
if (displaySet) {
displaySet.sopClassModule = true;
displaySets.push(displaySet);
return;
@@ -214,7 +215,7 @@ export class StudyMetadata extends Metadata {
* @returns {boolean} True on success, false on failure.
*/
addDisplaySet(displaySet) {
if (displaySet instanceof ImageSet) {
if (displaySet instanceof ImageSet || displaySet.sopClassModule) {
this._displaySets.push(displaySet);
return true;
}
@@ -1,6 +1,6 @@
import RetrieveMetadata from './services/wado/retrieveMetadata.js';
const module = 'RetrieveStudyMetadata';
const moduleName = 'RetrieveStudyMetadata';
// Cache for promises. Prevents unnecessary subsequent calls to the server
const StudyMetaDataPromises = new Map();
@@ -17,11 +17,11 @@ export function retrieveStudyMetadata(server, studyInstanceUid) {
// corresponding promise from the "StudyMetaDataPromises" map...
if (!server) {
throw new Error(`${module}: Required 'server' parameter not provided.`);
throw new Error(`${moduleName}: Required 'server' parameter not provided.`);
}
if (!studyInstanceUid) {
throw new Error(
`${module}: Required 'studyInstanceUid' parameter not provided.`
`${moduleName}: Required 'studyInstanceUid' parameter not provided.`
);
}
@@ -133,7 +133,8 @@ function getSourceImageInstanceUid(instance) {
if (
SourceImageSequence &&
SourceImageSequence.Value &&
SourceImageSequence.Value.length
SourceImageSequence.Value.length &&
SourceImageSequence.Value[0]['00081155'].Value
) {
return SourceImageSequence.Value[0]['00081155'].Value[0];
}
@@ -293,7 +294,6 @@ async function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
// TODO: Pass a reference ID to the server instead of including the URLs here
const studyData = {
seriesList: [],
studyInstanceUid,
wadoUriRoot: server.wadoUriRoot,
wadoRoot: server.wadoRoot,
qidoRoot: server.qidoRoot,
@@ -402,6 +402,7 @@ async function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
baseWadoRsUri: baseWadoRsUri,
wadouri: WADOProxy.convertURL(wadouri, server),
wadorsuri: WADOProxy.convertURL(wadorsuri, server),
wadoRoot: server.wadoRoot,
imageRendering: server.imageRendering,
thumbnailRendering: server.thumbnailRendering,
};
@@ -11,9 +11,6 @@ describe('addServers', () => {
qidoSupportsIncludeField: true,
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
requestOptions: {
requestFromBrowser: true,
},
},
],
oidc: [
@@ -52,7 +49,6 @@ describe('addServers', () => {
name: 'DCM4CHEE',
qidoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs',
qidoSupportsIncludeField: true,
requestOptions: { requestFromBrowser: true },
thumbnailRendering: 'wadors',
type: 'dicomWeb',
wadoRoot: 'https://server.dcmjs.org/dcm4chee-arc/aets/DCM4CHEE/rs',
@@ -0,0 +1,199 @@
import cornerstone from 'cornerstone-core';
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
import { api } from 'dicomweb-client';
import DICOMWeb from '../DICOMWeb';
const getImageId = imageObj => {
if (!imageObj) {
return;
}
return typeof imageObj.getImageId === 'function'
? imageObj.getImageId()
: imageObj.url;
};
const findImageIdOnStudies = (studies, displaySetInstanceUid) => {
const study = studies.find(study => {
const displaySet = study.displaySets.some(
displaySet => displaySet.displaySetInstanceUid === displaySetInstanceUid
);
return displaySet;
});
const { seriesList = [] } = study;
const { instances = [] } = seriesList[0] || {};
const instance = instances[0];
return getImageId(instance);
};
const someInvalidStrings = strings => {
const stringsArray = Array.isArray(strings) ? strings : [strings];
const emptyString = string => !string;
let invalid = stringsArray.some(emptyString);
return invalid;
};
const getImageInstance = dataset => {
return dataset && dataset.images && dataset.images[0];
};
const getImageInstanceId = imageInstance => {
return getImageId(imageInstance);
};
const fetchIt = (url, headers = DICOMWeb.getAuthorizationHeader()) => {
return fetch(url, headers).then(response => response.arrayBuffer());
};
const cornerstoneRetriever = imageId => {
return cornerstone.loadAndCacheImage(imageId).then(image => {
return image && image.data && image.data.byteArray.buffer;
});
};
const wadorsRetriever = (
url,
studyInstanceUID,
seriesInstanceUID,
sopInstanceUID,
headers = DICOMWeb.getAuthorizationHeader()
) => {
const config = {
url,
headers,
};
const dicomWeb = new api.DICOMwebClient(config);
return dicomWeb.retrieveInstance({
studyInstanceUID,
seriesInstanceUID,
sopInstanceUID,
});
};
const getImageLoaderType = imageId => {
const loaderRegExp = /^\w+\:/;
const loaderType = loaderRegExp.exec(imageId);
return (
(loaderRegExp.lastIndex === 0 &&
loaderType &&
loaderType[0] &&
loaderType[0].replace(':', '')) ||
''
);
};
const DicomLoaderService = new (class {
getLocalData(dataset, studies) {
if (dataset && dataset.localFile) {
// Use referenced imageInstance
const imageInstance = getImageInstance(dataset);
let imageId = getImageInstanceId(imageInstance);
// or Try to get it from studies
if (someInvalidStrings(imageId)) {
imageId = findImageIdOnStudies(studies, dataset.displaySetInstanceUid);
}
if (!someInvalidStrings(imageId)) {
return cornerstoneWADOImageLoader.wadouri.loadFileRequest(imageId);
}
}
}
getDataByImageType(dataset) {
const imageInstance = getImageInstance(dataset);
if (imageInstance) {
const imageId = getImageInstanceId(imageInstance);
let getDicomDataMethod = fetchIt;
const loaderType = getImageLoaderType(imageId);
switch (loaderType) {
case 'dicomfile':
getDicomDataMethod = cornerstoneRetriever.bind(this, imageId);
break;
case 'wadors':
const url = imageInstance.getData().wadoRoot;
const studyInstanceUID = imageInstance.getStudyInstanceUID();
const seriesInstanceUID = imageInstance.getSeriesInstanceUID();
const sopInstanceUID = imageInstance.getSOPInstanceUID();
const invalidParams = someInvalidStrings([
url,
studyInstanceUID,
seriesInstanceUID,
sopInstanceUID,
]);
if (invalidParams) {
return;
}
getDicomDataMethod = wadorsRetriever.bind(
this,
url,
studyInstanceUID,
seriesInstanceUID,
sopInstanceUID
);
break;
case 'wadouri':
// Strip out the image loader specifier
imageId = imageId.substring(imageId.indexOf(':') + 1);
if (someInvalidStrings(imageId)) {
return;
}
getDicomDataMethod = fetchIt.bind(this, imageId);
break;
}
return getDicomDataMethod();
}
}
getDataByDatasetType(dataset) {
const {
studyInstanceUid,
seriesInstanceUid,
sopInstanceUid,
authorizationHeaders,
wadoRoot,
wadoUri,
} = dataset;
// Retrieve wadors or just try to fetch wadouri
if (!someInvalidStrings(wadoRoot)) {
return wadorsRetriever(
wadoRoot,
studyInstanceUid,
seriesInstanceUid,
sopInstanceUid,
authorizationHeaders
);
} else if (!someInvalidStrings(wadoUri)) {
return fetchIt(wadoUri, { headers: authorizationHeaders });
}
}
*getLoaderIterator(dataset, studies) {
yield this.getLocalData(dataset, studies);
yield this.getDataByImageType(dataset);
yield this.getDataByDatasetType(dataset);
}
findDicomDataPromise(dataset, studies) {
const loaderIterator = this.getLoaderIterator(dataset, studies);
// it returns first valid retriever method.
for (const loader of loaderIterator) {
if (loader) {
return loader;
}
}
// in case of no valid loader
throw new Error('Invalid dicom data loader');
}
})();
export default DicomLoaderService;
+9 -4
View File
@@ -5,11 +5,16 @@ function getWADORSImageUrl(instance, frame) {
return;
}
// We need to sum 1 because WADO-RS frame number is 1-based
frame = frame ? parseInt(frame) + 1 : 1;
// Use null to obtain an imageId which represents the instance
if (frame === null) {
wadorsuri = wadorsuri.replace(/frames\/(\d+)/, '');
} else {
// We need to sum 1 because WADO-RS frame number is 1-based
frame = frame ? parseInt(frame) + 1 : 1;
// Replaces /frame/1 by /frame/{frame}
wadorsuri = wadorsuri.replace(/frames\/(\d+)/, `frames/${frame}`);
// Replaces /frame/1 by /frame/{frame}
wadorsuri = wadorsuri.replace(/frames\/(\d+)/, `frames/${frame}`);
}
return wadorsuri;
}
+3
View File
@@ -8,6 +8,7 @@ import sortBy from './sortBy.js';
import studyMetadataManager from './studyMetadataManager';
import updateMetaDataManager from './updateMetaDataManager.js';
import writeScript from './writeScript.js';
import DicomLoaderService from './dicomLoaderService.js';
const utils = {
guid,
@@ -21,6 +22,7 @@ const utils = {
// Updates WADO-RS metaDataManager
updateMetaDataManager,
DICOMTagDescriptions,
DicomLoaderService,
};
export {
@@ -35,6 +37,7 @@ export {
// Updates WADO-RS metaDataManager
updateMetaDataManager,
DICOMTagDescriptions,
DicomLoaderService,
};
export default utils;
+1
View File
@@ -14,6 +14,7 @@ describe('Top level exports', () => {
// Updates WADO-RS metaDataManager
'updateMetaDataManager',
'DICOMTagDescriptions',
'DicomLoaderService',
].sort();
const exports = Object.keys(utils.default).sort();
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.50.4](https://github.com/OHIF/Viewers/compare/@ohif/i18n@0.50.3...@ohif/i18n@0.50.4) (2019-09-10)
**Note:** Version bump only for package @ohif/i18n
## [0.50.3](https://github.com/OHIF/Viewers/compare/@ohif/i18n@0.50.2...@ohif/i18n@0.50.3) (2019-09-04)
**Note:** Version bump only for package @ohif/i18n
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/i18n",
"version": "0.50.3",
"version": "0.50.4",
"description": "Internationalization library for The OHIF Viewer",
"author": "OHIF",
"license": "MIT",
@@ -32,8 +32,8 @@
"peerDependencies": {
"i18next": "^17.0.3",
"i18next-browser-languagedetector": "^3.0.1",
"react": "^16.0.0",
"react-dom": "^16.0.0",
"react": "^16.8.6",
"react-dom": "^16.8.6",
"react-i18next": "^10.11.0"
},
"dependencies": {
+52
View File
@@ -3,6 +3,58 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.51.3](https://github.com/OHIF/Viewers/compare/@ohif/ui@0.51.2...@ohif/ui@0.51.3) (2019-10-01)
### Bug Fixes
* Address issues with touch devices and drag/drop causing crashes ([#982](https://github.com/OHIF/Viewers/issues/982)) ([cf40a83](https://github.com/OHIF/Viewers/commit/cf40a83))
## [0.51.2](https://github.com/OHIF/Viewers/compare/@ohif/ui@0.51.1...@ohif/ui@0.51.2) (2019-09-26)
### Bug Fixes
* 🐛 Set series into active viewport by clicking on thumbnail ([#945](https://github.com/OHIF/Viewers/issues/945)) ([5551f81](https://github.com/OHIF/Viewers/commit/5551f81)), closes [#895](https://github.com/OHIF/Viewers/issues/895) [#895](https://github.com/OHIF/Viewers/issues/895)
## [0.51.1](https://github.com/OHIF/Viewers/compare/@ohif/ui@0.51.0...@ohif/ui@0.51.1) (2019-09-19)
### Bug Fixes
* Use HTML5Backend for drag-drop if the device does not support touch ([#927](https://github.com/OHIF/Viewers/issues/927)) ([6fdac4d](https://github.com/OHIF/Viewers/commit/6fdac4d))
# [0.51.0](https://github.com/OHIF/Viewers/compare/@ohif/ui@0.50.4...@ohif/ui@0.51.0) (2019-09-12)
### Features
* **EraserTool:** add eraserTool to @ohif/extension-cornerstone ([#912](https://github.com/OHIF/Viewers/issues/912)) ([698d274](https://github.com/OHIF/Viewers/commit/698d274))
## [0.50.4](https://github.com/OHIF/Viewers/compare/@ohif/ui@0.50.3...@ohif/ui@0.50.4) (2019-09-06)
**Note:** Version bump only for package @ohif/ui
## [0.50.3](https://github.com/OHIF/Viewers/compare/@ohif/ui@0.50.2...@ohif/ui@0.50.3) (2019-09-04)
**Note:** Version bump only for package @ohif/ui
+8 -9
View File
@@ -49,8 +49,8 @@ yarn add @ohif/ui --exact
## Usage
```jsx
import React, { Component } from "react";
import { LayoutButton } from "@ohif/ui";
import React, { Component } from 'react';
import { LayoutButton } from '@ohif/ui';
class Example extends Component {
constructor(props) {
@@ -58,10 +58,10 @@ class Example extends Component {
this.state = {
selectedCell: {
className: "hover",
className: 'hover',
col: 1,
row: 1
}
row: 1,
},
};
}
@@ -117,10 +117,9 @@ Links:
<!-- prettier-ignore-start -->
[all-contributors-image]: https://img.shields.io/badge/all_contributors-0-orange.svg?style=flat-square
[contributing-url]: https://github.com/OHIF/react-viewerbase/blob/master/CONTRIBUTING.md
[npm-url]: https://npmjs.org/package/react-viewerbase
[npm-downloads-image]: https://img.shields.io/npm/dm/react-viewerbase.svg?style=flat-square
[npm-version-image]: https://img.shields.io/npm/v/react-viewerbase.svg?style=flat-square
[npm-url]: https://npmjs.org/package/@ohif/ui
[npm-downloads-image]: https://img.shields.io/npm/dm/@ohif/ui.svg?style=flat-square
[npm-version-image]: https://img.shields.io/npm/v/@ohif/ui.svg?style=flat-square
[license-image]: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square
[license-url]: LICENSE
<!-- prettier-ignore-end -->
+4 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/ui",
"version": "0.50.3",
"version": "0.51.3",
"description": "A set of React components for Medical Imaging Viewers",
"author": "OHIF Contributors",
"license": "MIT",
@@ -48,8 +48,9 @@
"prop-types": "15.6.2",
"react-bootstrap-modal": "4.2.0",
"react-dates": "18.4.1",
"react-dnd": "8.0.3",
"react-dnd-touch-backend": "^0.8.3",
"react-dnd": "9.3.4",
"react-dnd-html5-backend": "^9.3.4",
"react-dnd-touch-backend": "^9.3.4",
"react-i18next": "^10.11.0",
"react-with-direction": "1.3.0"
},
+1 -1
View File
@@ -7,7 +7,7 @@ route: /compatibility
## Browser Support
React Viewerbase relies on
`@ohif/ui` relies on
[browsers supported by Styled Components](https://www.styled-components.com/docs/faqs#which-browsers-are-supported)
or browsers supported by emotion.
+8 -8
View File
@@ -11,20 +11,20 @@ route: /getting-started
> possibility of introducing breaking changes. Please depend on an "exact"
> version in your projects to prevent issues caused by loose versioning.
Install `react-viewerbase` from npm:
Install `@ohif/ui` from npm:
```shell
// with npm
npm i react-viewerbase --save-exact
npm i @ohif/ui --save-exact
// with yarn
yarn add react-viewerbase --exact
yarn add @ohif/ui --exact
```
## Usage
There is some setup required for `react-viewerbase`. We are working to eliminate
these requirements with the goal of providing ready to use components.
There is some setup required for `@ohif/ui`. We are working to eliminate these
requirements with the goal of providing ready to use components.
### External Dependencies
@@ -37,8 +37,8 @@ or the font you set for your theme:
'https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700|Sanchez&display=swap';
```
React Viewerbase also looks for theme CSS variabled defined on `:root`. You can
find a list of variables [on the theming page](/styling-and-theming)
`@ohif/ui` also looks for theme CSS variabled defined on `:root`. You can find a
list of variables [on the theming page](/styling-and-theming)
### Import & Use
@@ -46,7 +46,7 @@ You can use components in your React app:
```js
import React, { Component } from 'react';
import { LayoutButton } from 'react-viewerbase';
import { LayoutButton } from '@ohif/ui';
class Example extends Component {
constructor(props) {
+9 -9
View File
@@ -3,14 +3,14 @@ name: Introduction
route: /
---
import { Playground, Props } from 'docz'
import { State } from 'react-powerplug'
import { TableList, TableListItem } from './../index.js'
import { Playground, Props } from 'docz';
import { State } from 'react-powerplug';
import { TableList, TableListItem } from './../index.js';
# Introduction
**React Viewerbase is a collection of components and utilities** that power
OHIF's [zero-footprint DICOM viewer](https://github.com/OHIF/Viewers)
**@ohif/ui is a collection of components and utilities** that power OHIF's
[zero-footprint DICOM viewer](https://github.com/OHIF/Viewers)
([demo][demo-url]). We maintain them as a separate component library to:
- Decouple presentation from business logic
@@ -25,11 +25,11 @@ OHIF's [zero-footprint DICOM viewer](https://github.com/OHIF/Viewers)
> version in your projects to prevent issues caused by loose versioning.
```js
// Add 'react-viewerbase' as a dependency
yarn add react-viewerbase
// Add '@ohif/ui' as a dependency
yarn add @ohif/ui
// Import and use components
import { TableList } from 'react-viewerbase'
import { TableList } from '@ohif/ui'
```
<Playground>
@@ -56,7 +56,7 @@ import { TableList } from 'react-viewerbase'
>
<label>{item.label}</label>
</TableListItem>
)
);
})}
</TableList>
)}
+6 -6
View File
@@ -36,9 +36,9 @@ export default withTranslation('MyNameSpace')(MyComponent);
For further information about namespaces and how they work, please visit
[OHIF Namespaces docs](https://docs.ohif.org/essentials/translating.html#namespaces).
### How to get right the Name Space of a react-viewerbase component?
### How to get right the Namespace of a `@ohif/ui` component?
Check the component's page in this site, the NameSpace information should be on
Check the component's page in this site, the Namespace information should be on
the bottom line.
Also, a nameSpace is defined when exporting a component, this information can be
@@ -50,10 +50,10 @@ E.g.
export default withTranslation('TheNamespaceYouAreLookingFor')(TheComponentYouWantToUse);
```
### How to use another NameSpace inside the current NameSpace?
### How to use another Namespace inside the current Namespace?
i18next provides a parsing feature able to get translations strings from any
NameSpace, like this following example getting data from `InnerSpace` NameSpace:
Namespace, like this following example getting data from `InnerSpace` Namespace:
```
$t(InnerSpace:Reset)
@@ -64,8 +64,8 @@ export default withTranslation('OuterSpace')(TheComponent);
## I18next Provider
**React Viewerbase** pass down the `t` function trough the custom
[withTranslation HOC](https://github.com/OHIF/react-viewerbase/blob/master/src/utils/LanguageProvider.js).
**@ohif/ui** pass down the `t` function trough the custom
[withTranslation HOC](https://github.com/OHIF/Viewers/blob/master/platform/ui/src/utils/LanguageProvider.js).
---
@@ -121,11 +121,6 @@ class CineDialog extends PureComponent {
}
};
// TODO:
// - Add next / previous display set buttons which just call
// onClickNextDisplaySet and onClickPreviousDisplaySet which are passed in as props.
// See https://github.com/OHIF/Viewers/blob/master/Packages/ohif-viewerbase/client/components/viewer/cineDialog/cineDialog.html#L38
// - Add 'isEnabled' prop: https://github.com/OHIF/Viewers/blob/master/Packages/ohif-viewerbase/client/components/viewer/cineDialog/cineDialog.js#L301
render() {
const { t } = this.props;
return (
@@ -99,13 +99,13 @@ class ThumbnailEntry extends Component {
onClick = () => {
if (this.props.onClick) {
this.props.onClick();
this.props.onClick(this.props.displaySetInstanceUid);
}
};
onDoubleClick = () => {
if (this.props.onDoubleClick) {
this.props.onDoubleClick();
this.props.onDoubleClick(this.props.displaySetInstanceUid);
}
};
}
+2
View File
@@ -30,6 +30,7 @@ import edit from './icons/edit.svg';
import ellipseCircle from './icons/ellipse-circle.svg';
import ellipseH from './icons/ellipse-h.svg';
import ellipseV from './icons/ellipse-v.svg';
import eraser from './icons/eraser.svg';
import exclamationCircle from './icons/exclamation-circle.svg';
import exclamationTriangle from './icons/exclamation-triangle.svg';
import fastBackward from './icons/fast-backward.svg';
@@ -110,6 +111,7 @@ const ICONS = {
'create-comment': createComment,
'create-screen-capture': createScreenCapture,
edit,
eraser,
'fast-backward': fastBackward,
'fast-forward': fastForward,
'object-group': objectGroup,
@@ -0,0 +1,15 @@
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 2048 1792"
aria-labelledby="eraser"
width="1em"
height="1em"
fill="currentColor"
>
<title id="title">Eraser</title>
<path transform="translate(0,1792) scale(1,-1)" fill="ACTIVE_COLOR" d="M960 1408l336-384h-768l-336 384h768zm1013-1077q15
34 9.5 71.5t-30.5 65.5l-896 1024q-38 44-96 44h-768q-38
0-69.5-20.5t-47.5-54.5q-15-34-9.5-71.5t30.5-65.5l896-1024q38-44 96-44h768q38
0 69.5 20.5t47.5 54.5z"
/>
</svg>

After

Width:  |  Height:  |  Size: 492 B

@@ -1,13 +1,21 @@
import { DragDropContext } from 'react-dnd';
import React from 'react';
import { DndProvider } from "react-dnd";
import HTML5Backend from 'react-dnd-html5-backend';
import TouchBackend from 'react-dnd-touch-backend';
const isTouchDevice = !!('ontouchstart' in window || navigator.maxTouchPoints);
// See https://github.com/react-dnd/react-dnd/issues/186#issuecomment-335429067
// https://github.com/react-dnd/react-dnd/issues/186#issuecomment-282789420
// TODO: Find a way for this context to be used in the parent application as well.
//
// http://react-dnd.github.io/react-dnd/docs/api/drag-drop-context
export default function viewerbaseDragDropContext(DecoratedClass) {
return DragDropContext(TouchBackend({ enableMouseEvents: true }), null, true)(
DecoratedClass
const backend = isTouchDevice ? TouchBackend : HTML5Backend;
const opts = isTouchDevice ? { enableMouseEvents: true } : {};
return (props) => (
<DndProvider backend={backend} opts={opts}>
<DecoratedClass {...props}/>
</DndProvider>
);
}
+16 -1
View File
@@ -1,12 +1,18 @@
const webpack = require('webpack');
const path = require('path');
const merge = require('webpack-merge');
const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
//
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const fontsToJavaScriptRule = require('./rules/fontsToJavaScript.js');
const HtmlWebpackPlugin = require('html-webpack-plugin');
// const
const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist');
const PUBLIC_DIR = path.join(__dirname, '../public');
// ~~ Env Vars
const HTML_TEMPLATE = process.env.HTML_TEMPLATE || 'script-tag.html';
const PUBLIC_URL = process.env.PUBLIC_URL || '/';
module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
@@ -33,7 +39,7 @@ module.exports = (env, argv) => {
},
output: {
path: DIST_DIR,
library: 'ohifViewer',
library: 'OHIFViewer',
libraryTarget: 'umd',
filename: 'index.umd.js',
},
@@ -43,6 +49,15 @@ module.exports = (env, argv) => {
plugins: [
// Clean output.path
new CleanWebpackPlugin(),
// Generate "index.html" w/ correct includes/imports
new HtmlWebpackPlugin({
inject: false,
template: `${PUBLIC_DIR}/html-templates/${HTML_TEMPLATE}`,
filename: 'index.html',
}),
new webpack.optimize.LimitChunkCountPlugin({
maxChunks: 1
})
],
});
};
+8
View File
@@ -71,6 +71,12 @@ module.exports = (env, argv) => {
// Ignore our configuration files
ignore: ['config/*', 'html-templates/*', '.DS_Store'],
},
// Short term solution to make sure GCloud config is available in output
// for our docker implementation
{
from: `${PUBLIC_DIR}/config/google.js`,
to: `${DIST_DIR}/google.js`,
},
// Copy over and rename our target app config file
{
from: `${PUBLIC_DIR}/${APP_CONFIG}`,
@@ -108,6 +114,8 @@ module.exports = (env, argv) => {
hot: true,
open: true,
port: 3000,
host: '0.0.0.0',
public: 'http://localhost:' + 3000,
historyApiFallback: {
disableDotRule: true,
},
+323
View File
@@ -3,6 +3,329 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.2.8](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.2.7...@ohif/viewer@1.2.8) (2019-10-01)
**Note:** Version bump only for package @ohif/viewer
## [1.2.7](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.2.6...@ohif/viewer@1.2.7) (2019-10-01)
**Note:** Version bump only for package @ohif/viewer
## [1.2.6](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.2.5...@ohif/viewer@1.2.6) (2019-09-27)
**Note:** Version bump only for package @ohif/viewer
## [1.2.5](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.2.4...@ohif/viewer@1.2.5) (2019-09-27)
### Bug Fixes
* version bump issue ([#963](https://github.com/OHIF/Viewers/issues/963)) ([e607ed2](https://github.com/OHIF/Viewers/commit/e607ed2)), closes [#962](https://github.com/OHIF/Viewers/issues/962)
# [2.0.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.2.3...@ohif/viewer@2.0.0) (2019-09-27)
### Bug Fixes
* 🐛 Add DicomLoaderService & FileLoaderService to fix SR, PDF, and SEG support in local file and WADO-RS-only use cases ([#862](https://github.com/OHIF/Viewers/issues/862)) ([e7e1a8a](https://github.com/OHIF/Viewers/commit/e7e1a8a)), closes [#838](https://github.com/OHIF/Viewers/issues/838)
* version bump issue ([#962](https://github.com/OHIF/Viewers/issues/962)) ([c80ea17](https://github.com/OHIF/Viewers/commit/c80ea17))
### BREAKING CHANGES
* DICOM Seg
# [2.0.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.2.3...@ohif/viewer@2.0.0) (2019-09-27)
### Bug Fixes
* 🐛 Add DicomLoaderService & FileLoaderService to fix SR, PDF, and SEG support in local file and WADO-RS-only use cases ([#862](https://github.com/OHIF/Viewers/issues/862)) ([e7e1a8a](https://github.com/OHIF/Viewers/commit/e7e1a8a)), closes [#838](https://github.com/OHIF/Viewers/issues/838)
### BREAKING CHANGES
* DICOM Seg
## [1.2.3](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.2.2...@ohif/viewer@1.2.3) (2019-09-27)
**Note:** Version bump only for package @ohif/viewer
## [1.2.2](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.2.1...@ohif/viewer@1.2.2) (2019-09-27)
**Note:** Version bump only for package @ohif/viewer
## [1.2.1](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.2.0...@ohif/viewer@1.2.1) (2019-09-26)
### Bug Fixes
* google cloud support w/ docker (via env var) ([#958](https://github.com/OHIF/Viewers/issues/958)) ([e375a4a](https://github.com/OHIF/Viewers/commit/e375a4a))
# [1.2.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.14...@ohif/viewer@1.2.0) (2019-09-26)
### Features
* 🎸 React custom component on toolbar button ([#935](https://github.com/OHIF/Viewers/issues/935)) ([a90605c](https://github.com/OHIF/Viewers/commit/a90605c))
## [1.1.14](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.13...@ohif/viewer@1.1.14) (2019-09-26)
### Bug Fixes
* 🐛 Set series into active viewport by clicking on thumbnail ([#945](https://github.com/OHIF/Viewers/issues/945)) ([5551f81](https://github.com/OHIF/Viewers/commit/5551f81)), closes [#895](https://github.com/OHIF/Viewers/issues/895) [#895](https://github.com/OHIF/Viewers/issues/895)
## [1.1.13](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.12...@ohif/viewer@1.1.13) (2019-09-26)
### Bug Fixes
* Add some code splitting for PWA build ([#937](https://github.com/OHIF/Viewers/issues/937)) ([8938035](https://github.com/OHIF/Viewers/commit/8938035))
## [1.1.12](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.11...@ohif/viewer@1.1.12) (2019-09-26)
**Note:** Version bump only for package @ohif/viewer
## [1.1.11](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.10...@ohif/viewer@1.1.11) (2019-09-23)
**Note:** Version bump only for package @ohif/viewer
## [1.1.10](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.9...@ohif/viewer@1.1.10) (2019-09-19)
**Note:** Version bump only for package @ohif/viewer
## [1.1.9](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.8...@ohif/viewer@1.1.9) (2019-09-19)
**Note:** Version bump only for package @ohif/viewer
## [1.1.8](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.7...@ohif/viewer@1.1.8) (2019-09-19)
**Note:** Version bump only for package @ohif/viewer
## [1.1.7](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.6...@ohif/viewer@1.1.7) (2019-09-19)
**Note:** Version bump only for package @ohif/viewer
## [1.1.6](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.5...@ohif/viewer@1.1.6) (2019-09-19)
**Note:** Version bump only for package @ohif/viewer
## [1.1.5](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.4...@ohif/viewer@1.1.5) (2019-09-17)
### Bug Fixes
* bump cornerstone-tools to latest version ([f519f86](https://github.com/OHIF/Viewers/commit/f519f86))
## [1.1.4](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.3...@ohif/viewer@1.1.4) (2019-09-17)
**Note:** Version bump only for package @ohif/viewer
## [1.1.3](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.2...@ohif/viewer@1.1.3) (2019-09-16)
### Bug Fixes
* 🐛 Fix issue on not loading gcloud ([#919](https://github.com/OHIF/Viewers/issues/919)) ([f723546](https://github.com/OHIF/Viewers/commit/f723546))
## [1.1.2](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.1...@ohif/viewer@1.1.2) (2019-09-12)
**Note:** Version bump only for package @ohif/viewer
## [1.1.1](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.1.0...@ohif/viewer@1.1.1) (2019-09-12)
**Note:** Version bump only for package @ohif/viewer
# [1.1.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.0.5...@ohif/viewer@1.1.0) (2019-09-12)
### Features
* 🎸 Load local file or folder using native dialog ([#870](https://github.com/OHIF/Viewers/issues/870)) ([c221dd8](https://github.com/OHIF/Viewers/commit/c221dd8))
## [1.0.5](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.0.4...@ohif/viewer@1.0.5) (2019-09-10)
**Note:** Version bump only for package @ohif/viewer
## [1.0.4](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.0.3...@ohif/viewer@1.0.4) (2019-09-10)
**Note:** Version bump only for package @ohif/viewer
## [1.0.3](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.0.2...@ohif/viewer@1.0.3) (2019-09-10)
### Bug Fixes
* on-brand library global name ([ababe63](https://github.com/OHIF/Viewers/commit/ababe63))
* remove requestOptions when key is not needed ([32bc47d](https://github.com/OHIF/Viewers/commit/32bc47d))
## [1.0.2](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.0.1...@ohif/viewer@1.0.2) (2019-09-09)
### Bug Fixes
* import regenerator-runtime for umd build ([bad987a](https://github.com/OHIF/Viewers/commit/bad987a))
## [1.0.1](https://github.com/OHIF/Viewers/compare/@ohif/viewer@1.0.0...@ohif/viewer@1.0.1) (2019-09-09)
**Note:** Version bump only for package @ohif/viewer
# [1.0.0](https://github.com/OHIF/Viewers/compare/@ohif/viewer@0.50.21...@ohif/viewer@1.0.0) (2019-09-06)
### Code Refactoring
* 💡 React components to consume appConfig using Context ([#852](https://github.com/OHIF/Viewers/issues/852)) ([7c4ee73](https://github.com/OHIF/Viewers/commit/7c4ee73)), closes [#725](https://github.com/OHIF/Viewers/issues/725) [#725](https://github.com/OHIF/Viewers/issues/725)
### BREAKING CHANGES
* #725
## [0.50.21](https://github.com/OHIF/Viewers/compare/@ohif/viewer@0.50.20...@ohif/viewer@0.50.21) (2019-09-06)
### Bug Fixes
* viewer project should build output before publish ([94b625d](https://github.com/OHIF/Viewers/commit/94b625d))
## [0.50.20](https://github.com/OHIF/Viewers/compare/@ohif/viewer@0.50.19...@ohif/viewer@0.50.20) (2019-09-06)
**Note:** Version bump only for package @ohif/viewer
## [0.50.19](https://github.com/OHIF/Viewers/compare/@ohif/viewer@0.50.18...@ohif/viewer@0.50.19) (2019-09-06)
-1
View File
@@ -188,7 +188,6 @@ Links:
[docker-pulls-img]: https://img.shields.io/docker/pulls/ohif/viewer.svg?style=flat-square
[docker-image-url]: https://hub.docker.com/r/ohif/viewer
[all-contributors-image]: https://img.shields.io/badge/all_contributors-0-orange.svg?style=flat-square
[contributing-url]: https://github.com/OHIF/Viewers/blob/react/CONTRIBUTING.md
[license-image]: https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square
[license-url]: LICENSE
<!-- DOCS -->
+2 -1
View File
@@ -1,5 +1,6 @@
{
"baseUrl": "http://localhost:3000",
"video": true,
"video": false,
"chromeWebSecurity": false,
"projectId": "4oe38f"
}
@@ -0,0 +1,78 @@
const dataTransfer = new DataTransfer();
export const DragSimulator = {
MAX_TRIES: 1,
DELAY_INTERVAL_MS: 10,
counter: 0,
rectsEqual(r1, r2) {
return (
r1.top === r2.top &&
r1.right === r2.right &&
r1.bottom === r2.bottom &&
r1.left === r2.left
);
},
get dropped() {
const currentSourcePosition = this.source.getBoundingClientRect();
return !this.rectsEqual(
this.initialSourcePosition,
currentSourcePosition
);
},
get hasTriesLeft() {
return this.counter < this.MAX_TRIES;
},
dragstart() {
cy.log('**DRAG START**');
cy.wrap(this.source)
.trigger('mousedown', { which: 1, button: 0 })
.trigger('dragstart', { dataTransfer })
.trigger('drag', {});
},
drop() {
cy.log('**DROP**');
return cy
.wrap(this.target)
.trigger('mousemove', 'center')
.trigger('dragover', { dataTransfer, force: true })
.trigger('drop', { dataTransfer, force: true })
.trigger('dragend', { dataTransfer })
.trigger('mouseup', { which: 1, button: 0 });
},
dragover() {
cy.log('**DRAGOVER**');
if (!this.dropped && this.hasTriesLeft) {
this.counter += 1;
return cy
.wrap(this.target)
.trigger('mousemove', 'center')
.trigger('dragover', {
dataTransfer,
position: this.position,
})
.wait(this.DELAY_INTERVAL_MS)
.then(() => this.dragover());
}
return this.drop().then(() => true);
},
init(source, target, position) {
this.source = source;
this.target = target;
this.position = position;
this.counter = 0;
this.dragstart();
return cy.wait(this.DELAY_INTERVAL_MS).then(() => {
this.initialSourcePosition = this.source.getBoundingClientRect();
return this.dragover();
});
},
simulate(sourceWrapper, targetSelector, position = 'center') {
return cy
.get(targetSelector)
.then(targetWrapper =>
this.init(sourceWrapper.get(0), targetWrapper.get(0), position)
);
},
};
@@ -0,0 +1,50 @@
/*
TODO: Temporarily commented out because it is failing on CI due to timing issues
describe('OHIF Study Viewer Page', () => {
before(() => {
cy.openStudy("MISTER^MR");
});
it('checks if series thumbnails are being displayed', ()=> {
cy.get('.ThumbnailEntryContainer')
.its('length')
.should('be.gt', 1);
});
it('drags and drop a series thumbnail into viewport', () => {
cy.get('.ThumbnailEntryContainer:nth-child(2)') //element to be dragged
.drag('.cornerstone-canvas'); //dropzone element
const overlaySeriesInformation = 'div.ViewportOverlay > div.bottom-left.overlay-element > div';
const expectedText = 'Ser: 2Img: 1 1/13512 x 512Loc: -17.60 mm Thick: 3.00 mm';
cy.get(overlaySeriesInformation)
.should('have.text', expectedText);
});
it('checks if Series left panel can be hidden/displayed', ()=> {
const seriesButton = '.pull-left > .RoundedButtonGroup > .roundedButtonWrapper > .roundedButton';
const leftPanel = 'section.sidepanel.from-left';
cy.get(seriesButton).click();
cy.get(leftPanel).should('not.be.enabled')
cy.get(seriesButton).click();
cy.get(leftPanel).should('be.visible');
});
it('checks if Measurements right panel can be hidden/displayed', ()=> {
const measurementsButton = '.pull-right > .RoundedButtonGroup > .roundedButtonWrapper > .roundedButton';
const rightPanel = 'section.sidepanel.from-right';
cy.get(measurementsButton).click();
cy.get(rightPanel).should('be.visible');
cy.get(measurementsButton).click();
cy.get(rightPanel).should('not.be.enabled');
});
});
*/
@@ -1,3 +1,5 @@
import { DragSimulator } from "../helpers/DragSimulator.js";
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
@@ -23,3 +25,17 @@
//
// -- This is will overwrite an existing command --
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
Cypress.Commands.add('openStudy', (patientName) => {
cy.visit('/');
cy.get('#patientName')
.type(patientName);
cy.get('.studylistStudy > .patientName')
.contains(patientName)
.click();
}
);
Cypress.Commands.add('drag', {prevSubject: 'element',},
(...args) => DragSimulator.simulate(...args)
);
@@ -1,56 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="description" content="Open Health Imaging Foundation DICOM Viewer" />
<meta name="viewport"
content="width=device-width,initial-scale=1.0,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<meta name="theme-color" content="#000000" />
<meta http-equiv="cleartype" content="on" />
<meta name="MobileOptimized" content="320" />
<meta name="HandheldFriendly" content="True" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous" />
<title>OHIF Standalone Viewer</title>
</head>
<body>
<noscript> You need to enable JavaScript to run this app. </noscript>
<div id="root"></div>
<!-- Load React. -->
<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
<script src="/index.umd.js" crossorigin></script>
<script>
window.config = {
// default: '/'
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',
},
],
},
}
window.OHIFStandaloneViewer.installViewer(window.config);
</script>
</body>
</html>
+19 -13
View File
@@ -1,6 +1,6 @@
{
"name": "@ohif/viewer",
"version": "0.50.19",
"version": "1.2.8",
"description": "OHIF Viewer",
"author": "OHIF Contributors",
"license": "MIT",
@@ -18,7 +18,8 @@
"proxy": "http://localhost:8042",
"scripts": {
"build:package": "cross-env NODE_ENV=production node --max_old_space_size=4096 ./../../node_modules/webpack/bin/webpack.js --config .webpack/webpack.commonjs.js",
"build:viewer": "cross-env NODE_ENV=production node --max_old_space_size=4096 ./../../node_modules/webpack/bin/webpack.js --config .webpack/webpack.pwa.js",
"build:viewer": "cross-env NODE_ENV=production node --max_old_space_size=4096 ./../../node_modules/webpack/bin/webpack.js --config .webpack/webpack.pwa.js --progress",
"build:viewer:e2e": "cross-env NODE_ENV=development node --max_old_space_size=4096 ./../../node_modules/webpack/bin/webpack.js --config .webpack/webpack.pwa.js --progress",
"build:viewer:ci": "cross-env NODE_ENV=production PUBLIC_URL=/pwa/ APP_CONFIG=config/netlify.js node --max_old_space_size=4096 ./../../node_modules/webpack/bin/webpack.js --config .webpack/webpack.pwa.js",
"build:viewer:demo": "cross-env NODE_ENV=production APP_CONFIG=config/demo.js HTML_TEMPLATE=rollbar.html node --max_old_space_size=4096 ./../../node_modules/webpack/bin/webpack.js --progress --config .webpack/webpack.pwa.js",
"build:viewer:package": "yarn run build:package",
@@ -27,8 +28,13 @@
"dev:viewer": "yarn run dev",
"start": "yarn run dev",
"test:e2e": "cypress open",
"test:e2e:ci": "cypress run",
"test:e2e:dist": "start-server-and-test test:e2e:serve http://localhost:3000 test:e2e:ci",
"test:e2e:serve": "serve -l 3000 -s dist",
"test:unit": "jest --watchAll",
"test:unit:ci": "jest --ci --runInBand --collectCoverage"
"test:unit:ci": "jest --ci --runInBand --collectCoverage",
"prepublishOnly": "yarn run build:package",
"postpublish": "node -p -e \"require('./package.json').version\" > success_version.txt"
},
"files": [
"dist",
@@ -40,22 +46,22 @@
},
"dependencies": {
"@babel/runtime": "^7.5.5",
"@ohif/core": "^0.50.5",
"@ohif/extension-cornerstone": "^0.50.4",
"@ohif/extension-dicom-html": "^0.50.3",
"@ohif/extension-dicom-microscopy": "^0.50.4",
"@ohif/extension-dicom-pdf": "^0.50.3",
"@ohif/extension-vtk": "^0.50.6",
"@ohif/i18n": "^0.50.3",
"@ohif/ui": "^0.50.3",
"@ohif/core": "^1.0.1",
"@ohif/extension-cornerstone": "^2.0.0",
"@ohif/extension-dicom-html": "^1.0.0",
"@ohif/extension-dicom-microscopy": "^0.50.6",
"@ohif/extension-dicom-pdf": "^1.0.0",
"@ohif/extension-vtk": "^0.50.23",
"@ohif/i18n": "^0.50.4",
"@ohif/ui": "^0.51.3",
"@tanem/react-nprogress": "^1.1.25",
"classnames": "^2.2.6",
"core-js": "^3.2.1",
"cornerstone-core": "^2.2.8",
"cornerstone-math": "^0.1.8",
"cornerstone-tools": "^3.19.2",
"cornerstone-tools": "^4.0.9",
"cornerstone-wado-image-loader": "^3.0.0",
"dcmjs": "^0.4.7",
"dcmjs": "^0.6.1",
"dicom-parser": "^1.8.3",
"dicomweb-client": "^0.4.4",
"hammerjs": "^2.0.8",
-3
View File
@@ -13,9 +13,6 @@ window.config = {
qidoSupportsIncludeField: true,
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
requestOptions: {
requestFromBrowser: true,
},
},
],
},
-3
View File
@@ -12,9 +12,6 @@ window.config = {
qidoSupportsIncludeField: true,
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
requestOptions: {
requestFromBrowser: true,
},
},
],
},
@@ -11,9 +11,6 @@ window.config = {
qidoSupportsIncludeField: false,
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
requestOptions: {
requestFromBrowser: true,
},
},
],
},
@@ -13,13 +13,11 @@ window.config = {
imageRendering: 'wadors',
thumbnailRendering: 'wadors',
// REQUIRED TAG:
// https://github.com/OHIF/ohif-core/blob/59e1e04b92be24aee5d4402445cb3dcedb746995/src/studies/retrieveStudyMetadata.js#L54
// TODO: Remove tag after https://github.com/OHIF/ohif-core/pull/19 is merged and we bump version
requestOptions: {
// undefined to use JWT + Bearer auth
// auth: 'orthanc:orthanc',
requestFromBrowser: true,
},
// requestOptions: {
// undefined to use JWT + Bearer auth
// auth: 'orthanc:orthanc',
// },
},
],
},
@@ -39,4 +37,4 @@ window.config = {
post_logout_redirect_uri: '/logout-redirect.html',
},
],
}
};
Loaded 100 of 130 files, more files were not shown because too many files have changed in this diff. Show more