From b820f885a16b17075502b848932f41cb5a0037bd Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sat, 27 Apr 2019 15:44:02 -0400 Subject: [PATCH 01/16] Switch sidebar and file locations up for more logical grouping --- docs/latest/SUMMARY.md | 19 ++++++++----------- .../custom-tools.md} | 0 .../dcm4chee-with-docker.md | 0 .../dicomweb.md | 0 docs/latest/data/image-viewport.md | 5 ----- docs/latest/data/index.md | 1 + .../orthanc-with-docker.md | 0 .../deployment/building-for-production.md | 5 ----- docs/latest/deployment/index.md | 7 +++++++ .../{I-want-to => deployment}/script-tag.md | 0 docs/latest/deployment/security.md | 1 - docs/latest/faq/technical.md | 1 - ...neral.md => frequently-asked-questions.md} | 0 13 files changed, 16 insertions(+), 23 deletions(-) rename docs/latest/{data/tool-management.md => advanced/custom-tools.md} (100%) rename docs/latest/{connecting-to-image-archives => data}/dcm4chee-with-docker.md (100%) rename docs/latest/{connecting-to-image-archives => data}/dicomweb.md (100%) delete mode 100644 docs/latest/data/image-viewport.md create mode 100644 docs/latest/data/index.md rename docs/latest/{connecting-to-image-archives => data}/orthanc-with-docker.md (100%) delete mode 100644 docs/latest/deployment/building-for-production.md create mode 100644 docs/latest/deployment/index.md rename docs/latest/{I-want-to => deployment}/script-tag.md (100%) delete mode 100644 docs/latest/deployment/security.md delete mode 100644 docs/latest/faq/technical.md rename docs/latest/{faq/general.md => frequently-asked-questions.md} (100%) diff --git a/docs/latest/SUMMARY.md b/docs/latest/SUMMARY.md index 9dc674294..4d644d42c 100644 --- a/docs/latest/SUMMARY.md +++ b/docs/latest/SUMMARY.md @@ -5,10 +5,10 @@ - [Configuration](essentials/configuration.md) - [Troubleshooting](essentials/troubleshooting.md) - [Architecture](architecture/index.md) - - Overview - Deployment --- + - [Advanced](advanced/index.md) - [Architecture](advanced/architecture.md) - [Overview](advanced/architecture.md#overview) @@ -22,18 +22,15 @@ - [Modules](advanced/extensions.md#modules) - [Registering](advanced/extensions.md#registering-extensions) - [OHIF Maintained](advanced/extensions.md#ohif-maintained-extensions) +- [Custom Tools](advanced/custom-tools.md) -- Connecting to Image Archives - - [DICOM Web](connecting-to-image-archives/dicomweb.md) +--- ----- -- I Want To - - [Embed the viewer using a script tag](I-want-to/script-tag.md) +- [Deployment](deployment/index.md) + - [Embed the Viewer](deployment/script-tag.md)) +- [Connecting to Image Archives](data/index.md) +--- ----- -- FAQ - - [General](faq/general.md) - ----- +- [FAQ](frequently-asked-questions.md) - [Contributing](contributing.md) diff --git a/docs/latest/data/tool-management.md b/docs/latest/advanced/custom-tools.md similarity index 100% rename from docs/latest/data/tool-management.md rename to docs/latest/advanced/custom-tools.md diff --git a/docs/latest/connecting-to-image-archives/dcm4chee-with-docker.md b/docs/latest/data/dcm4chee-with-docker.md similarity index 100% rename from docs/latest/connecting-to-image-archives/dcm4chee-with-docker.md rename to docs/latest/data/dcm4chee-with-docker.md diff --git a/docs/latest/connecting-to-image-archives/dicomweb.md b/docs/latest/data/dicomweb.md similarity index 100% rename from docs/latest/connecting-to-image-archives/dicomweb.md rename to docs/latest/data/dicomweb.md diff --git a/docs/latest/data/image-viewport.md b/docs/latest/data/image-viewport.md deleted file mode 100644 index 9d480566c..000000000 --- a/docs/latest/data/image-viewport.md +++ /dev/null @@ -1,5 +0,0 @@ -# Image Viewport - -### Main Viewport Component - -The [imageViewerViewport](https://github.com/OHIF/Viewers/tree/master/Packages/ohif-viewerbase/client/components/viewer/imageViewerViewport) component diff --git a/docs/latest/data/index.md b/docs/latest/data/index.md new file mode 100644 index 000000000..3c8e78517 --- /dev/null +++ b/docs/latest/data/index.md @@ -0,0 +1 @@ +# Connecting to Image Archives diff --git a/docs/latest/connecting-to-image-archives/orthanc-with-docker.md b/docs/latest/data/orthanc-with-docker.md similarity index 100% rename from docs/latest/connecting-to-image-archives/orthanc-with-docker.md rename to docs/latest/data/orthanc-with-docker.md diff --git a/docs/latest/deployment/building-for-production.md b/docs/latest/deployment/building-for-production.md deleted file mode 100644 index 2f12e0fe7..000000000 --- a/docs/latest/deployment/building-for-production.md +++ /dev/null @@ -1,5 +0,0 @@ -# Deployment - -There are a few possible approaches for deploying the application: - -- diff --git a/docs/latest/deployment/index.md b/docs/latest/deployment/index.md new file mode 100644 index 000000000..caa33dfce --- /dev/null +++ b/docs/latest/deployment/index.md @@ -0,0 +1,7 @@ +# Deployment + +## Gotchas + +## Next Steps + +### Securing your data diff --git a/docs/latest/I-want-to/script-tag.md b/docs/latest/deployment/script-tag.md similarity index 100% rename from docs/latest/I-want-to/script-tag.md rename to docs/latest/deployment/script-tag.md diff --git a/docs/latest/deployment/security.md b/docs/latest/deployment/security.md deleted file mode 100644 index 8dbb2f9bc..000000000 --- a/docs/latest/deployment/security.md +++ /dev/null @@ -1 +0,0 @@ -# Security diff --git a/docs/latest/faq/technical.md b/docs/latest/faq/technical.md deleted file mode 100644 index 83d08f24d..000000000 --- a/docs/latest/faq/technical.md +++ /dev/null @@ -1 +0,0 @@ -# Frequently Asked Questions - Technical diff --git a/docs/latest/faq/general.md b/docs/latest/frequently-asked-questions.md similarity index 100% rename from docs/latest/faq/general.md rename to docs/latest/frequently-asked-questions.md From c01f3aa920c837dd8b4ba9a1332e0a2e39bc2295 Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sat, 27 Apr 2019 16:23:25 -0400 Subject: [PATCH 02/16] High level summary of deployment --- docs/latest/deployment/index.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/latest/deployment/index.md b/docs/latest/deployment/index.md index caa33dfce..792855847 100644 --- a/docs/latest/deployment/index.md +++ b/docs/latest/deployment/index.md @@ -1,7 +1,24 @@ # Deployment +The OHIF Viewer can be embedded in other web applications via it's [packaged +script source][ohif-viewer-npm], or as a standalone PWA ([progressive web +application][pwa-url] by building and hosting a collection of static assets. In +either case, you will need to configure your instance of the Viewer so that it +can connect to your data source (the database or PACS that provides the data +your Viewer will display). Let's unpack that a little: + +## Overview + ## Gotchas ## Next Steps ### Securing your data + + + +[ohif-viewer-npm]: https://www.npmjs.com/package/ohif-viewer +[pwa-url]: https://developers.google.com/web/progressive-web-apps/ +[static-assets-url]: https://www.maxcdn.com/one/visual-glossary/static-content/ From aad29169331a07bc7b1d4aedf8717d2b68d4ab83 Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 11:03:59 -0400 Subject: [PATCH 03/16] Embedded-viewer-diagram assets and images --- .../assets/img/embedded-viewer-diagram.png | Bin 0 -> 22910 bytes img/designs/cloud.svg | 14 ++++++++++++++ img/designs/embedded-viewer-diagram | Bin 0 -> 29766 bytes img/designs/npm-logo-red.svg | 9 +++++++++ img/embedded-viewer-diagram.png | Bin 0 -> 22910 bytes 5 files changed, 23 insertions(+) create mode 100644 docs/latest/assets/img/embedded-viewer-diagram.png create mode 100644 img/designs/cloud.svg create mode 100644 img/designs/embedded-viewer-diagram create mode 100644 img/designs/npm-logo-red.svg create mode 100644 img/embedded-viewer-diagram.png diff --git a/docs/latest/assets/img/embedded-viewer-diagram.png b/docs/latest/assets/img/embedded-viewer-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..426cb7ab8552949b8362f280423ed4a8a8b89815 GIT binary patch literal 22910 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 WB-wbO3&bV=p{HYTrBvJI@jn37^?(xq literal 0 HcmV?d00001 diff --git a/img/designs/cloud.svg b/img/designs/cloud.svg new file mode 100644 index 000000000..ad04389c6 --- /dev/null +++ b/img/designs/cloud.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/img/designs/embedded-viewer-diagram b/img/designs/embedded-viewer-diagram new file mode 100644 index 0000000000000000000000000000000000000000..182ad232399a167b91a986e028c3d7bf4b26be02 GIT binary patch literal 29766 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 + + + + diff --git a/img/embedded-viewer-diagram.png b/img/embedded-viewer-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..426cb7ab8552949b8362f280423ed4a8a8b89815 GIT binary patch literal 22910 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 WB-wbO3&bV=p{HYTrBvJI@jn37^?(xq literal 0 HcmV?d00001 From 3b8987ecb16d29a6d9c0713ae23951b976cdab0c Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 11:04:27 -0400 Subject: [PATCH 04/16] Embedded viewer deployment scenario --- docs/latest/deployment/index.md | 117 ++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/docs/latest/deployment/index.md b/docs/latest/deployment/index.md index 792855847..35be60ac7 100644 --- a/docs/latest/deployment/index.md +++ b/docs/latest/deployment/index.md @@ -9,6 +9,119 @@ your Viewer will display). Let's unpack that a little: ## Overview +The OHIF Viewer is a tool. It + +## Deployment Scenarios + +### Embedded Viewer + +The quickest and easiest way to get the OHIF Viewer up and running is to embed +it into an existing web application. + +
+ Embedded Viewer Diagram + embedded viewer diagram +
+ +1. Create a new web page or template that includes the following external + dependencies: + + + +
  1. Create a JS Object to hold the OHIF Viewer's configuration. Here are some + example values that would allow the viewer to hit our public PACS:
+ +```js +var props = { + routerBasename: '/', + rootUrl: 'https://lrjoo3znxm.codesandbox.io', + 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, + }, + }, + ], + }, +} +``` + +
  1. + Render the viewer in the web page's target div +
+ +```js +// Made available by the `ohif-viewer` script included in step 1 +var Viewer = window.OHIFStandaloneViewer.App +var app = React.createElement(Viewer, props, null) + +ReactDOM.render(app, document.getElementById('ohif-viewer-target')) +``` + +#### Tips & Tricks + +> I'm having trouble getting this to work. Where can I go for help? + +First, check out this fully functional +[CodeSandbox](https://codesandbox.io/s/lrjoo3znxm) example. If you're still +having trouble, feel free to search or GitHub issues. Can't find anything +related your problem? Create a new one. + +> When I include bootstrap, other styles on my page no longer work correctly. +> What can I do? + +When we include `bootsrap` (and the other dependencies), they are added +globally. This has the potential of causing conflicts with other scripts and +styles on the page. To prevent this, `embed` the viewer in a new/empty web page. +Have that working? Good. Now `embed` that new page using an +[` - -## Important notes: - -- You must correctly specify `rootUrl` **and** the HTML `` tag. -- If your application runs in a subdirectory (e.g. /viewer/), this must be specified in `routerBasename` -- Currently, the WADO Image Loader Codecs and Web Worker source code must also be server at the ROOT URL From 85e3240597db63a7b93cebb88dc0a90b73c18886 Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 12:52:31 -0400 Subject: [PATCH 06/16] FAQ formatting --- docs/latest/frequently-asked-questions.md | 92 ++++++++++++++++++----- 1 file changed, 72 insertions(+), 20 deletions(-) diff --git a/docs/latest/frequently-asked-questions.md b/docs/latest/frequently-asked-questions.md index 40a5adbff..4e6734faf 100644 --- a/docs/latest/frequently-asked-questions.md +++ b/docs/latest/frequently-asked-questions.md @@ -1,45 +1,97 @@ -# Frequently Asked Questions - General -### How do I file a bug? +# Frequently Asked Questions + +## How do I file a bug? + We accept and triage bug reports through Github primarily. + 1. [Create a Github account](https://github.com/join) -2. Search the current [Issue List](https://github.com/OHIF/Viewers/issues) to ensure you are not creating a duplicate issue. +2. Search the current [Issue List](https://github.com/OHIF/Viewers/issues) to + ensure you are not creating a duplicate issue. - If your issue already exists, post a comment to show us that this issue also affects you. +If your issue already exists, post a comment to show us that this issue also +affects you. -3. If no prior issue exists, [Create a New Issue](https://github.com/OHIF/Viewers/issues/new) on the repository. +3. If no prior issue exists, + [Create a New Issue](https://github.com/OHIF/Viewers/issues/new) on the + repository. Some tips for filing a new issue: -* **Make sure your issue is reproducible**: If we try to reproduce your issue given your provided steps and we cannot reproduce it, we will not be able to fix it. *Nobody wants to spend time guessing how to reproduce your issue!* Before filing, please reproduce your issue more than once and clearly describe the steps taken. -* **If you are reporting a user interface issue, provide screenshots**: A picture is worth a thousand words. If your issue concerns the UI, screenshots will help us identify the issue dramatically faster since it can be extremely challenging to describe UI bugs with text. *You should still clearly describe the steps that you took to produce the issue*. -* **Include platform & environment**: Your operating system, web browser, and web browser version are highly relevant for many bugs. Please provide these with all bug reports. -* **Include expected and actual result**: Tell us what you expected to happen, and what actually happened. If you don't do this, we might not consider it a bug. + +- **Make sure your issue is reproducible**: If we try to reproduce your issue + given your provided steps and we cannot reproduce it, we will not be able to + fix it. _Nobody wants to spend time guessing how to reproduce your issue!_ + Before filing, please reproduce your issue more than once and clearly describe + the steps taken. +- **If you are reporting a user interface issue, provide screenshots**: A + picture is worth a thousand words. If your issue concerns the UI, screenshots + will help us identify the issue dramatically faster since it can be extremely + challenging to describe UI bugs with text. _You should still clearly describe + the steps that you took to produce the issue_. +- **Include platform & environment**: Your operating system, web browser, and + web browser version are highly relevant for many bugs. Please provide these + with all bug reports. +- **Include expected and actual result**: Tell us what you expected to happen, + and what actually happened. If you don't do this, we might not consider it a + bug. ### How can I request a new feature? -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 [contact us](http://www.ohif.org). +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 +[contact us](http://www.ohif.org). ### Who should I contact about Academic Collaborations? -[Gordon J. Harris](http://www.dfhcc.harvard.edu/insider/member-detail/member/gordon-j-harris-phd/) at Massachusetts General Hospital is the primary contact for any academic collaborators. We are always happy to hear about new groups interested in using the OHIF framework, and may be able to provide development support if the proposed collaboration has an impact on cancer research. +[Gordon J. Harris](http://www.dfhcc.harvard.edu/insider/member-detail/member/gordon-j-harris-phd/) +at Massachusetts General Hospital is the primary contact for any academic +collaborators. We are always happy to hear about new groups interested in using +the OHIF framework, and may be able to provide development support if the +proposed collaboration has an impact on cancer research. ### Do you offer commercial support? -The Open Health Imaging Foundation does not offer commercial support, however, some community members do offer consulting services. The following contacts may be useful: +The Open Health Imaging Foundation does not offer commercial support, however, +some community members do offer consulting services. The following contacts may +be useful: -* Rob Lewis ([Radical Imaging](http://radicalimaging.com/)) +- Rob Lewis ([Radical Imaging](http://radicalimaging.com/)) -**Please file a Pull Request if you wish to add your name or organization to this list.** +**Please file a Pull Request if you wish to add your name or organization to +this list.** ### I emailed my question to you directly and you did not respond. Why not? -Emailing developers directly is not a shortcut to faster support. Please file your issues and questions on Github so that everyone can benefit from the discussion and solutions. +Emailing developers directly is not a shortcut to faster support. Please file +your issues and questions on Github so that everyone can benefit from the +discussion and solutions. -### Do your Viewers have [510(k) Clearance](https://www.fda.gov/MedicalDevices/DeviceRegulationandGuidance/HowtoMarketYourDevice/PremarketSubmissions/PremarketNotification510k/) from the U.S. F.D.A or [CE Marking](https://ec.europa.eu/growth/single-market/ce-marking_en) from the European Commission? +### Do your Viewers have [510(k) Clearance][501k-clearance] from the U.S. F.D.A or [CE Marking][ce-marking] from the European Commission? -**NO.** The OHIF Viewer, Lesion Tracker, and Standalone Viewer, **NOT** F.D.A. cleared or CE Marked. It is the users responsibility to ensure compliance with applicable rules and regulations. The [License](https://github.com/OHIF/Viewers/blob/master/LICENSE) for the OHIF Framework does not prevent your company or group from seeking F.D.A. clearance for a product built using the framework. +**NO.** The OHIF Viewer, Lesion Tracker, and Standalone Viewer, **NOT** F.D.A. +cleared or CE Marked. It is the users responsibility to ensure compliance with +applicable rules and regulations. The +[License](https://github.com/OHIF/Viewers/blob/master/LICENSE) for the OHIF +Framework does not prevent your company or group from seeking F.D.A. clearance +for a product built using the framework. -If you have gone this route (or are going there), please let us know because we would be interested to hear about your experience. +If you have gone this route (or are going there), please let us know because we +would be interested to hear about your experience. -### Are your Viewers [HIPAA](https://en.wikipedia.org/wiki/Health_Insurance_Portability_and_Accountability_Act) Compliant? +### Are your Viewers [HIPAA][hipaa] Compliant? -**NO.** The OHIF Viewer, Lesion Tracker, and Standalone Viewer **DO NOT** fulfill all of the criteria to become HIPAA Compliant. It is the users responsibility to ensure compliance with applicable rules and regulations. +**NO.** The OHIF Viewer, Lesion Tracker, and Standalone Viewer **DO NOT** +fulfill all of the criteria to become HIPAA Compliant. It is the users +responsibility to ensure compliance with applicable rules and regulations. + + + + +[501k-clearance]: https://www.fda.gov/MedicalDevices/DeviceRegulationandGuidance/HowtoMarketYourDevice/PremarketSubmissions/PremarketNotification510k/ +[ce-marking]: https://ec.europa.eu/growth/single-market/ce-marking_en +[hipaa]: https://en.wikipedia.org/wiki/Health_Insurance_Portability_and_Accountability_Act + From c1f7e0ef6579f431d9a4d11cfbf67ad0bd59783b Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 12:53:20 -0400 Subject: [PATCH 07/16] Help page --- docs/latest/SUMMARY.md | 3 ++- docs/latest/help.md | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 docs/latest/help.md diff --git a/docs/latest/SUMMARY.md b/docs/latest/SUMMARY.md index e8a3c2f4e..48f779185 100644 --- a/docs/latest/SUMMARY.md +++ b/docs/latest/SUMMARY.md @@ -32,5 +32,6 @@ --- -- [FAQ](frequently-asked-questions.md) - [Contributing](contributing.md) +- [FAQ](frequently-asked-questions.md) +- [Help](help.md) diff --git a/docs/latest/help.md b/docs/latest/help.md new file mode 100644 index 000000000..7f93ecbe0 --- /dev/null +++ b/docs/latest/help.md @@ -0,0 +1,39 @@ +# Help + +We all need a little help sometimes. Don't let a few roadblocks stand in the way +of you building something awesome. + +## Free + +If you're a developer looking to contribute code, documentation, or discussion; +we are more than happy to help provide clarification and answer questions via +[GitHub issues][gh-issues] or our [community forum][google-group]. Regular +contributors may also be invited to join our Slack Group to streamline +discussion. + +For bug reports and feature requests (including incomplete or confusing +documentation), [GitHub issues][gh-issues] continue to be your best avenue of +communication. + +Complex issues specific to your organization/situation are still okay to post, +but they're less likely to receive a response. Unfortunately, we have limited +resources and must be judicious with how we allocate them. If you find yourself +in this situation and in need of assistance, it may be in your best interest to +persue paid support. + +## Paid / Commercial + +The Open Health Imaging Foundation does not offer commercial support, however, +some community members do offer consulting services: + +- Rob Lewis ([Radical Imaging](http://radicalimaging.com/)) + +**Please file a Pull Request if you wish to add your name or organization to +this list.** + + + +[gh-issues]: https://github.com/OHIF/Viewers/issues/ +[google-group]: https://groups.google.com/forum/#!forum/cornerstone-platform From 0b8626496bc2ae6fed608d4c9782c2ef676bf767 Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 12:58:25 -0400 Subject: [PATCH 08/16] Fix start number --- docs/latest/deployment/embedded-viewer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/latest/deployment/embedded-viewer.md b/docs/latest/deployment/embedded-viewer.md index c4e4c2eb5..f3365db3c 100644 --- a/docs/latest/deployment/embedded-viewer.md +++ b/docs/latest/deployment/embedded-viewer.md @@ -75,7 +75,7 @@ var props = { } ``` -
  1. +
    1. Render the viewer in the web page's target div
    From 398f4eb5ec0312749abe1a12be3c266b1c856a52 Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 13:44:07 -0400 Subject: [PATCH 09/16] Formatting --- docs/latest/contributing.md | 44 ++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/docs/latest/contributing.md b/docs/latest/contributing.md index 02509c0f4..935b92909 100644 --- a/docs/latest/contributing.md +++ b/docs/latest/contributing.md @@ -1,32 +1,50 @@ # Contributing -### I would like to contribute code - how do I do this? +## I would like to contribute code - how do I do this? Fork the repository, make your change and submit a pull request. -### Any guidance on submitting changes? +## 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: +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 posting on the forum if you are not sure. -- Code quality is acceptable. We don't have coding standards defined, but make sure it passes ESLint and looks like the rest of the code in the repository. -- Quality of design is acceptable. This is a bit subjective so you should consider posting on the forum for specific guidance. -- 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. +- Functionality is appropriate for the repository. Consider posting on the forum + if you are not sure. +- Code quality is acceptable. We don't have coding standards defined, but make + sure it passes ESLint and looks like the rest of the code in the repository. +- Quality of design is acceptable. This is a bit subjective so you should + consider posting on the forum for specific guidance. +- 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. +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 +## Testing contribution pull requests -OHIF uses [netlify](netlify.com) so that pull requests are autogenerated and available for testing. +OHIF uses [netlify](netlify.com) so that pull requests are autogenerated and +available for testing. -For example, [this url](https://deploy-preview-237--ohif.netlify.com/viewer/?url=https://s3.eu-central-1.amazonaws.com/ohif-viewer/sampleDICOM.json) allows you to test [pull request 237, the request that created this FAQ entry,](https://github.com/OHIF/Viewers/pull/237) using data pulled from Amazon S3. +For example, +[this url](https://deploy-preview-237--ohif.netlify.com/viewer/?url=https://s3.eu-central-1.amazonaws.com/ohif-viewer/sampleDICOM.json) +allows you to test +[pull request 237, the request that created this FAQ entry,](https://github.com/OHIF/Viewers/pull/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. -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. ``` 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: +If you have made a documentation change, a link like this will let you preview +the gitbook generated by the pull request: + ``` https://deploy-preview-237--ohif.netlify.com/contributing.html ``` From 1ae6704ed0ede993f026f9f3aef5963adf428123 Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 13:44:33 -0400 Subject: [PATCH 10/16] Update menu --- docs/latest/SUMMARY.md | 17 ++++++++++++++--- .../deployment/{ => recipes}/embedded-viewer.md | 2 +- docs/latest/essentials/deployment.md | 1 + docs/latest/essentials/themeing.md | 1 + 4 files changed, 17 insertions(+), 4 deletions(-) rename docs/latest/deployment/{ => recipes}/embedded-viewer.md (98%) create mode 100644 docs/latest/essentials/deployment.md create mode 100644 docs/latest/essentials/themeing.md diff --git a/docs/latest/SUMMARY.md b/docs/latest/SUMMARY.md index 48f779185..a7046097b 100644 --- a/docs/latest/SUMMARY.md +++ b/docs/latest/SUMMARY.md @@ -3,9 +3,10 @@ - Essentials - [Getting Started](essentials/getting-started.md) - [Configuration](essentials/configuration.md) + - [Themeing](essentials/themeing.md) - [Troubleshooting](essentials/troubleshooting.md) -- [Architecture](architecture/index.md) -- Deployment +- [Architecture](essentials/architecture.md) +- [Deployment](essentials/deployment.md) --- @@ -27,7 +28,17 @@ --- - [Deployment](deployment/index.md) - - [Embed the Viewer](deployment/embedded-viewer.md)) + - [Embedded](deployment/index.md#embedded-viewer) + - [Stand-alone](deployment/index.md#stand-alone-viewer) + - [Data]() +- Recipes + - [Embedding the Viewer](deployment/recipes/embedded-viewer.md)) + - [PWA: Static]() + - [PWA: Docker]() + - [PWA: Nginx + Orthanc]() + - [PWA: Nginx + dcm4chee]() + - [PWA: Nginx + DICOMCloud]() + - [PWA: User Access Control]() - [Connecting to Image Archives](data/index.md) --- diff --git a/docs/latest/deployment/embedded-viewer.md b/docs/latest/deployment/recipes/embedded-viewer.md similarity index 98% rename from docs/latest/deployment/embedded-viewer.md rename to docs/latest/deployment/recipes/embedded-viewer.md index f3365db3c..3e7427f5c 100644 --- a/docs/latest/deployment/embedded-viewer.md +++ b/docs/latest/deployment/recipes/embedded-viewer.md @@ -5,7 +5,7 @@ it into an existing web application. It allows us to forego a "build step", and add a powerful medical imaging viewer to an existing web page using only a few include tags. Here's how it works: -{% include "./_embedded-viewer-diagram.md" %} +{% include "./../_embedded-viewer-diagram.md" %} 1. Create a new web page or template that includes the following external dependencies: diff --git a/docs/latest/essentials/deployment.md b/docs/latest/essentials/deployment.md new file mode 100644 index 000000000..d36c65e59 --- /dev/null +++ b/docs/latest/essentials/deployment.md @@ -0,0 +1 @@ +# Deployment diff --git a/docs/latest/essentials/themeing.md b/docs/latest/essentials/themeing.md new file mode 100644 index 000000000..db3419c94 --- /dev/null +++ b/docs/latest/essentials/themeing.md @@ -0,0 +1 @@ +# Themeing From fcd2d63c5b39b3b3e221437e7dada5aabee155da Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 13:44:51 -0400 Subject: [PATCH 11/16] Stand-alone viewer section --- docs/latest/deployment/index.md | 38 ++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/docs/latest/deployment/index.md b/docs/latest/deployment/index.md index 6c3055e3a..138637796 100644 --- a/docs/latest/deployment/index.md +++ b/docs/latest/deployment/index.md @@ -2,16 +2,17 @@ The OHIF Viewer can be embedded in other web applications via it's [packaged script source][ohif-viewer-npm], or served up as a stand-alone PWA ([progressive -web application][pwa-url] by building and hosting a collection of static assets. -In either case, you will need to configure your instance of the Viewer so that -it can connect to your data source (the database or PACS that provides the data -your Viewer will display). Let's unpack that a little: +web application][pwa-url]) by building and hosting a collection of static +assets. In either case, you will need to configure your instance of the Viewer +so that it can connect to your data source (the database or PACS that provides +the data your Viewer will display). ## Overview Our goal is to make deployment as simple and painless as possible; however, there is an inherent amount of complexity in customizing, optimizing, and -deploying web applications. If +deploying web applications. If you find yourself a little lost, please don't +hesitate to [reach out for help](/help.md) ## Deployment Scenarios @@ -22,7 +23,7 @@ it into an existing web application. It allows us to forego a "build step", and add a powerful medical imaging viewer to an existing web page using only a few include tags. -- Read more about it here: [Embedded Viewer](/deployment/embedded-viewer.html) +- Read more about it here: [Embedded Viewer](./recipes/embedded-viewer.md) - And check out our [live demo on CodeSandbox](https://codesandbox.io/s/lrjoo3znxm) @@ -31,7 +32,19 @@ include tags. ### Stand-alone Viewer Deploying the OHIF Viewer as a stand-alone web application provides many -benefits, but comes at the cost of time and complexity. +benefits, but comes at the cost of time and complexity. Some benefits include: + +_Today:_ + +- Leverage [extensions](/advanced/extensions.md) to drop-in powerful new + features +- Add routes and customize the viewer's workflow +- Finer control over styling and whitelabeling + +_In the future:_ + +- The ability to package the viewer for [App Store distribution][app-store] +- Leverage `service-workers` for offline support and speed benefits from caching #### Hosted Static Assets @@ -41,9 +54,7 @@ benefits, but comes at the cost of time and complexity. ... -## Gotchas - -## Next Steps +## Data ### Securing your data @@ -51,10 +62,11 @@ benefits, but comes at the cost of time and complexity. Links --> + + [ohif-viewer-npm]: https://www.npmjs.com/package/ohif-viewer [pwa-url]: https://developers.google.com/web/progressive-web-apps/ [static-assets-url]: https://www.maxcdn.com/one/visual-glossary/static-content/ +[app-store]: https://medium.freecodecamp.org/i-built-a-pwa-and-published-it-in-3-app-stores-heres-what-i-learned-7cb3f56daf9b -``` - -``` + From f08e589cd2e31480fb68efd461537abbccf632b8 Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 14:02:41 -0400 Subject: [PATCH 12/16] Footer links to ease readability --- docs/latest/contributing.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/docs/latest/contributing.md b/docs/latest/contributing.md index 935b92909..122a310ac 100644 --- a/docs/latest/contributing.md +++ b/docs/latest/contributing.md @@ -28,11 +28,8 @@ the tips above will help ensure your changes are reviewed. OHIF uses [netlify](netlify.com) so that pull requests are autogenerated and available for testing. -For example, -[this url](https://deploy-preview-237--ohif.netlify.com/viewer/?url=https://s3.eu-central-1.amazonaws.com/ohif-viewer/sampleDICOM.json) -allows you to test -[pull request 237, the request that created this FAQ entry,](https://github.com/OHIF/Viewers/pull/237) -using data pulled from Amazon S3. +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 @@ -48,3 +45,14 @@ the gitbook generated by the pull request: ``` https://deploy-preview-237--ohif.netlify.com/contributing.html ``` + + + + + +[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 + + From b6a189700ea8dc8c38bbbe9e74077241768a8400 Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 14:26:03 -0400 Subject: [PATCH 13/16] Rough outline for data section --- docs/latest/data/dicomweb.md | 6 ---- docs/latest/data/index.md | 1 - docs/latest/deployment/index.md | 49 ++++++++++++++++++++++++++++++++- 3 files changed, 48 insertions(+), 8 deletions(-) delete mode 100644 docs/latest/data/dicomweb.md delete mode 100644 docs/latest/data/index.md diff --git a/docs/latest/data/dicomweb.md b/docs/latest/data/dicomweb.md deleted file mode 100644 index 065f5b40f..000000000 --- a/docs/latest/data/dicomweb.md +++ /dev/null @@ -1,6 +0,0 @@ -# Connecting to Image Archives - -# DICOM Web - -[DICOMWeb](https://en.wikipedia.org/wiki/DICOMweb) refers to RESTful DICOM Services and is a recently standardized set of guidelines for exchanging medical images and imaging metadata over the internet. Not all archives fully support it yet, but it is gaining wider adoption. - diff --git a/docs/latest/data/index.md b/docs/latest/data/index.md deleted file mode 100644 index 3c8e78517..000000000 --- a/docs/latest/data/index.md +++ /dev/null @@ -1 +0,0 @@ -# Connecting to Image Archives diff --git a/docs/latest/deployment/index.md b/docs/latest/deployment/index.md index 138637796..e6fa67155 100644 --- a/docs/latest/deployment/index.md +++ b/docs/latest/deployment/index.md @@ -48,15 +48,60 @@ _In the future:_ #### Hosted Static Assets +_blocking:_ Generate files from `npm script` that we can host. IE. production +ready build output + +- AWS S3 + Cloudfront +- GCP + Cloudflare +- Azure +- Netlify (can use private repo) +- Github pages + +Note: Include SSL instructions. + ... #### Docker +- Why Docker? + - Ship your environment + - "It works on my machine" + +_Ship Archive w/ Client:_ todo + ... ## Data -### Securing your data +The OHIF Viewer is able to connect to any data source that implements the [DICOM +Web Standard][dicom-web-standard]. [DICOM Web][dicom-web] refers to RESTful +DICOM Services -- a recently standardized set of guidelines for exchanging +medical images and imaging metadata over the internet. Not all archives fully +support it yet, but it is gaining wider adoption. + +### Configure Connection + +... + +### What if I don't have an imaging archive? + +... + +#### Making sure your archive is accessible + +- CORS +- Proxy (dangers) +- Note: PACS not meant to be directly accesible from Web + +#### Securing your data + +- Reach out to experts +- Recipes + +### What if my archive doesn't support DICOM Web? + +- Mapping layer +- GraphQL? From 213d88ed4669c6109d625a3fde69dedea90a0232 Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 14:32:00 -0400 Subject: [PATCH 14/16] Cleaning up menu further --- docs/latest/SUMMARY.md | 5 ++++- docs/latest/advanced/data.md | 9 +++++++++ docs/latest/data/data-hierarchy.md | 5 ----- docs/latest/data/measurements-and-annotations.md | 1 - docs/latest/{data => essentials}/dcm4chee-with-docker.md | 0 docs/latest/{data => essentials}/orthanc-with-docker.md | 0 6 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 docs/latest/advanced/data.md delete mode 100644 docs/latest/data/data-hierarchy.md delete mode 100644 docs/latest/data/measurements-and-annotations.md rename docs/latest/{data => essentials}/dcm4chee-with-docker.md (100%) rename docs/latest/{data => essentials}/orthanc-with-docker.md (100%) diff --git a/docs/latest/SUMMARY.md b/docs/latest/SUMMARY.md index a7046097b..54581e9e8 100644 --- a/docs/latest/SUMMARY.md +++ b/docs/latest/SUMMARY.md @@ -18,6 +18,10 @@ - [Extensions](advanced/architecture.md#misc-extensions) - [Diagram](advanced/architecture.md#diagram) - [Common Questions](advanced/architecture.md#common-questions) +- [Data](advanced/data.md) + - [Hierarchy](advanced/data.md#hierarchy) + - [Display Sets](advanced/data.md#display-sets) + - [Measurements & Annotations](advanced/data.md#measurements-and-annotations) - [Extensions](advanced/extensions.md) - [Overview](advanced/extensions.md#overview) - [Modules](advanced/extensions.md#modules) @@ -39,7 +43,6 @@ - [PWA: Nginx + dcm4chee]() - [PWA: Nginx + DICOMCloud]() - [PWA: User Access Control]() -- [Connecting to Image Archives](data/index.md) --- diff --git a/docs/latest/advanced/data.md b/docs/latest/advanced/data.md new file mode 100644 index 000000000..61f69b3c8 --- /dev/null +++ b/docs/latest/advanced/data.md @@ -0,0 +1,9 @@ +# Data + +## Hierarch + +Studies, Series, Instances, Frames + +## Display Sets + +## Measurements and Annotation diff --git a/docs/latest/data/data-hierarchy.md b/docs/latest/data/data-hierarchy.md deleted file mode 100644 index ceaee45b9..000000000 --- a/docs/latest/data/data-hierarchy.md +++ /dev/null @@ -1,5 +0,0 @@ -# Data Hierarchy - -## Studies, Series, Instances, Frames - -## Display Sets diff --git a/docs/latest/data/measurements-and-annotations.md b/docs/latest/data/measurements-and-annotations.md deleted file mode 100644 index 574f11845..000000000 --- a/docs/latest/data/measurements-and-annotations.md +++ /dev/null @@ -1 +0,0 @@ -# Measurements and Annotations diff --git a/docs/latest/data/dcm4chee-with-docker.md b/docs/latest/essentials/dcm4chee-with-docker.md similarity index 100% rename from docs/latest/data/dcm4chee-with-docker.md rename to docs/latest/essentials/dcm4chee-with-docker.md diff --git a/docs/latest/data/orthanc-with-docker.md b/docs/latest/essentials/orthanc-with-docker.md similarity index 100% rename from docs/latest/data/orthanc-with-docker.md rename to docs/latest/essentials/orthanc-with-docker.md From 32f8d7432741085345c53e4ff17c6bf04520632b Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 14:32:28 -0400 Subject: [PATCH 15/16] Spelling --- docs/latest/advanced/data.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/latest/advanced/data.md b/docs/latest/advanced/data.md index 61f69b3c8..0279df004 100644 --- a/docs/latest/advanced/data.md +++ b/docs/latest/advanced/data.md @@ -1,6 +1,6 @@ # Data -## Hierarch +## Hierarchy Studies, Series, Instances, Frames From 8a16892a0c957631e51650dad935f842d1af9224 Mon Sep 17 00:00:00 2001 From: dannyrb Date: Sun, 28 Apr 2019 14:33:25 -0400 Subject: [PATCH 16/16] Unused files --- docs/latest/layout/hanging-protocols.md | 1 - docs/latest/layout/layout-management.md | 1 - 2 files changed, 2 deletions(-) delete mode 100644 docs/latest/layout/hanging-protocols.md delete mode 100644 docs/latest/layout/layout-management.md diff --git a/docs/latest/layout/hanging-protocols.md b/docs/latest/layout/hanging-protocols.md deleted file mode 100644 index 319bda35f..000000000 --- a/docs/latest/layout/hanging-protocols.md +++ /dev/null @@ -1 +0,0 @@ -# Hanging Protocols diff --git a/docs/latest/layout/layout-management.md b/docs/latest/layout/layout-management.md deleted file mode 100644 index 3756edd1c..000000000 --- a/docs/latest/layout/layout-management.md +++ /dev/null @@ -1 +0,0 @@ -# Layout Management