Merge pull request #408 from dannyrb/docs/deploying-static-site

Docs/deploying static site
This commit is contained in:
Danny Brown 2019-04-29 16:26:15 -04:00 committed by GitHub
commit 27065dd303
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 476 additions and 758 deletions

View File

@ -12,6 +12,7 @@
], ],
"plugins": [ "plugins": [
"@babel/plugin-proposal-class-properties", "@babel/plugin-proposal-class-properties",
"@babel/plugin-syntax-dynamic-import",
"@babel/plugin-transform-regenerator", "@babel/plugin-transform-regenerator",
"@babel/plugin-transform-runtime" "@babel/plugin-transform-runtime"
] ]

View File

@ -37,7 +37,7 @@ jobs:
key: yarn-packages-v1-{{ .Branch }}-{{ checksum "yarn.lock" }} key: yarn-packages-v1-{{ .Branch }}-{{ checksum "yarn.lock" }}
# Build & Test # Build & Test
- run: yarn build - run: yarn build:package:ci
# https://www.viget.com/articles/using-junit-on-circleci-2-0-with-jest-and-eslint/ # https://www.viget.com/articles/using-junit-on-circleci-2-0-with-jest-and-eslint/
- run: - run:
name: 'JavaScript Test Suite' name: 'JavaScript Test Suite'

14
.env.development Normal file
View File

@ -0,0 +1,14 @@
##
# DEVELOPMENT: Default
#
# We're using this to set variables for our local development.
# Please feel free to delete or modify this file for your own setup.
# Be careful not to commit anything sensitive to source control.
#
PUBLIC_URL=/
#
# Most vars require REACT_APP_* naming
#
REACT_APP_CONFIG=config/default.js

14
.env.production Normal file
View File

@ -0,0 +1,14 @@
##
# PRODUCTION: Netlify
#
# We're using this to set variables for our Netlify deploy.
# Please feel free to delete or modify this file for your own production
# environment. Be careful not to commit anything sensitive to source control.
#
PUBLIC_URL=/demo
#
# Most vars require REACT_APP_* naming
#
REACT_APP_CONFIG=config/netlify.js

View File

@ -2,6 +2,7 @@
"recommendations": [ "recommendations": [
"esbenp.prettier-vscode", "esbenp.prettier-vscode",
"sysoev.language-stylus", "sysoev.language-stylus",
"dbaeumer.vscode-eslint" "dbaeumer.vscode-eslint",
"mikestead.dotenv"
] ]
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,237 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<symbol id="icon-hud" viewBox="0 0 20 22">
<title>HUD</title>
<g id="icon-hud-group" fill="none" stroke-width="1" stroke-linecap="round" stroke-linejoin="round">
<path id="icon-hud-dashes" d="m14.5,2.75 2,0 a2.5 2.5 0 0 1 2.5 2.5 l0,13.25 a2.5 2.5 0 0 1 -2.5 2.5 l-11.5,0 a2.5 2.5 0 0 1 -2.5 -2.5 l0,-1" stroke-dasharray="1,3" />
<path id="icon-hud-box" d="m0.5,2 0,14 a1.5 1.5 0 0 0 1.5 1.5 l12,0 a1.5 1.5 0 0 0 1.5 -1.5 l0,-14" />
<path id="icon-hud-top" d="m2,2 12,0" stroke-width="4" />
<path id="icon-hud-paralel" d="m4.4,7.5 7.2,0 m0,3 -7.2,0 m0,3 7.2,0" stroke-linecap="square" />
</g>
</symbol>
<symbol id="icon-measurements-additional" viewBox="0 0 16 16">
<title>Additional Measurements</title>
<g id="icon-measurements-additional-group" stroke="none">
<path id="icon-measurements-additional-boxes" d="M11,2 l1.85,-1.85 a1 1 0 0 1 1,0 l2,2 a1 1 0 0 1 0,1 l-1.85,1.85Z M10,3 l-10,10 0,3 3,0 10,-10Z M16,16 l0,-2 -9,0 -2,2Z" />
</g>
</symbol>
<symbol id="icon-measurements-lesions" viewBox="0 0 18 10">
<title>Lesions</title>
<g id="icon-measurements-lesions-group" stroke="none">
<path id="icon-measurements-lesions-boxes" d="M0,0 2,0 2,2 0,2Z M4,0 18,0 18,2 4,2Z M0,4 2,4 2,6 0,6Z M4,4 18,4 18,6 4,6Z M0,8 2,8 2,10 0,10Z M4,8 18,8 18,10 4,10Z" />
</g>
</symbol>
<symbol id="icon-settings" viewBox="0 0 15 15">
<title>Settings</title>
<path d="M12.85 8.25C12.85 8.03 12.93 7.8 12.93 7.5 12.93 7.2 12.93 6.98 12.85 6.75L14.43 5.48C14.58 5.33 14.58 5.18 14.5 5.03L13 2.4C12.93 2.33 12.78 2.25 12.55 2.33L10.68 3.08C10.3 2.78 9.85 2.55 9.4 2.33L9.1 0.38C9.18 0.15 8.95 0 8.8 0L5.8 0C5.65 0 5.43 0.15 5.43 0.3L5.13 2.33C4.68 2.48 4.3 2.78 3.85 3.08L2.05 2.33C1.83 2.25 1.68 2.33 1.53 2.48L0.03 5.1C-0.05 5.18 0.03 5.4 0.18 5.55L1.75 6.75C1.75 6.98 1.68 7.2 1.68 7.5 1.68 7.8 1.68 8.03 1.75 8.25L0.18 9.53C0.03 9.68 0.03 9.82 0.1 9.98L1.6 12.6C1.68 12.68 1.83 12.75 2.05 12.68L3.93 11.93C4.3 12.23 4.75 12.45 5.2 12.68L5.5 14.63C5.5 14.78 5.65 14.93 5.88 14.93L8.88 14.93C9.03 14.93 9.25 14.78 9.25 14.63L9.55 12.68C10 12.45 10.45 12.23 10.83 11.93L12.7 12.68C12.85 12.75 13.08 12.68 13.15 12.53L14.65 9.9C14.73 9.75 14.73 9.53 14.58 9.45L12.85 8.25 12.85 8.25ZM7.3 10.13C5.88 10.13 4.68 8.93 4.68 7.5 4.68 6.08 5.88 4.88 7.3 4.88 8.73 4.88 9.93 6.08 9.93 7.5 9.93 8.93 8.73 10.13 7.3 10.13L7.3 10.13Z" id="Shape"/>
</symbol>
<symbol id="icon-status-complete" viewBox="0 0 27 27">
<title>Complete</title>
<g id="icon-status-complete-group" stroke="none">
<path id="icon-status-complete-circle" d="M13.5,0 a13.5 13.5 0 0 1 0 27 a13.5 13.5 0 0 1 0 -27 M23,8 l-2,-2 -10,10, -5,-5 -2,2 7,7Z" />
</g>
</symbol>
<symbol id="icon-status-lock" viewBox="0 0 16 21">
<title>Locked</title>
<path d="M14 7L13 7 13 5C13 2.2 10.8 0 8 0 5.2 0 3 2.2 3 5L3 7 2 7C0.9 7 0 7.9 0 9L0 19C0 20.1 0.9 21 2 21L14 21C15.1 21 16 20.1 16 19L16 9C16 7.9 15.1 7 14 7L14 7ZM11.1 7L4.9 7 4.9 5C4.9 3.3 6.3 1.9 8 1.9 9.7 1.9 11.1 3.3 11.1 5L11.1 7 11.1 7Z"/>
</symbol>
<symbol id="icon-studies" viewBox="0 0 15 13">
<title>Studies</title>
<g id="icon-studies-group" stroke="none">
<path id="icon-studies-boxes" d="M0,0 7,0 7,6 0,6Z M8,0 15,0 15,6 8,6Z M0,7 7,7 7,13 0,13Z M8,7 15,7 15,13 8,13Z" />
</g>
</symbol>
<symbol id="icon-tools-levels" viewBox="0 0 18 18">
<title>Window / Level</title>
<g id="icon-tools-levels-group">
<path id="icon-tools-levels-path" d="M14.5,3.5 a1 1 0 0 1 -11,11 Z" stroke="none" opacity="0.8" />
<circle id="icon-tools-levels-circle" cx="9" cy="9" r="8" fill="none" stroke-width="2" />
</g>
</symbol>
<symbol id="icon-tools-link" viewBox="0 0 23 15">
<title>Link</title>
<g id="icon-tools-link-group" stroke="none">
<circle id="icon-tools-link-circle-l" opacity="0.8" cx="7.5" cy="7.5" r="7.5" />
<circle id="icon-tools-link-circle-r" opacity="0.6" cx="15.5" cy="7.5" r="7.5" />
</g>
</symbol>
<symbol id="icon-tools-measure-non-target" viewBox="0 0 24 24">
<title>Non-Target Measurement</title>
<g id="icon-tools-measure-non-target-group" fill="none" stroke-width="1" stroke-linecap="round" stroke-linejoin="round">
<circle id="icon-tools-measure-non-target-circle" cx="6.5" cy="6.5" r="6" />
<path id="icon-tools-measure-non-target-plus" d="M6.5,3 l0,7 M3,6.5 l7,0"></path>
<path id="icon-tools-measure-non-target-arrow" d="M23,7 l-15,15 M7,17 l0,6 6,0" stroke-width="2" />
</g>
</symbol>
<symbol id="icon-tools-measure-target" viewBox="0 0 26 26">
<title>Target Measurement</title>
<g id="icon-tools-measure-target-group" stroke-width="0">
<path id="icon-tools-measure-target-ruler" d="m9.5,26 2,-2 -1.5,-1.5 0.5,-0.5 1.5,1.5 1.5,-1.5 -2.5,-2.5 0.5,-0.5 2.5,2.5 1.5,-1.5 -1.5,-1.5 0.5,-0.5 1.5,1.5 1.5,-1.5 -2.5,-2.5 0.5,-0.5 2.5,2.5 1.5,-1.5 -1.5,-1.5 0.5,-0.5 1.5,1.5 1.5,-1.5 -2.5,-2.5 0.5,-0.5 2.5,2.5 1.5,-1.5 -1.5,-1.5 0.5,-0.5 1.5,1.5 2,-2 -4,-4 a2 2 0 0 0 -2.5 0 l-14 14 a2 2 0 0 0 0 2.5 l4,4 Z" />
<path id="icon-tools-measure-target-plus" d="m6,0 a6 6 0 0 1 0 12 a6 6 0 0 1 0 -12 m0.5,3 a0.5 0.5 0 0 0 -1 0 l0,2.5 -2.5,0 a0.5 0.5 0 0 0 0 1 l2.5,0 0,2.5 a0.5 0.5 0 0 0 1 0 l0,-2.5 2.5,0 a0.5 0.5 0 0 0 0 -1 l-2.5,0 z" />
</g>
</symbol>
<symbol id="icon-tools-measure-target-cr" viewBox="0 0 24 24">
<title>Target CR Measurement</title>
<g id="icon-tools-measure-target-cr-group" fill="none" stroke-width="1" stroke-linecap="round" stroke-linejoin="round">
<text id="icon-tools-measure-target-cr-text" fill="#000000" x="0" y="8" style="font-size:10px; font-family:sans-serif">CR</text>
<path id="icon-tools-measure-target-cr-arrow" d="M23,7 l-15,15 M7,17 l0,6 6,0" stroke-width="2" />
</g>
</symbol>
<symbol id="icon-tools-measure-target-un" viewBox="0 0 24 24">
<title>Target UN Measurement</title>
<g id="icon-tools-measure-target-un-group" fill="none" stroke-width="1" stroke-linecap="round" stroke-linejoin="round">
<text id="icon-tools-measure-target-un-text" fill="#000000" x="0" y="8" style="font-size:10px; font-family:sans-serif">UN</text>
<path id="icon-tools-measure-target-un-arrow" d="M23,7 l-15,15 M7,17 l0,6 6,0" stroke-width="2" />
</g>
</symbol>
<symbol id="icon-tools-measure-temp" viewBox="0 0 24 24">
<title>Temporary Measurement</title>
<g id="icon-tools-measure-temp-group" fill="none" stroke-width="1" stroke-linecap="round" stroke-linejoin="round">
<circle id="icon-tools-measure-temp-circle" cx="6.5" cy="6.5" r="6" />
<path id="icon-tools-measure-temp-plus" d="M6.5,3 l0,7 M3,6.5 l7,0"></path>
<path id="icon-tools-measure-temp-dashes" d="m22.5,6 -16.5,16.5" stroke-width="3" stroke-dasharray="0.6666,5" />
</g>
</symbol>
<symbol id="icon-tools-more" viewBox="0 0 18 18">
<title>More</title>
<g id="icon-tools-more-group" stroke="none">
<path id="icon-tools-more-circle" d="M9,0 a9 9 0 0 1 0 18 a9 9 0 0 1 0 -18 M4.5,8 a1.5 1.5 0 0 0 0 3 a1.5 1.5 0 0 0 0 -3 M9,8 a1.5 1.5 0 0 0 0 3 a1.5 1.5 0 0 0 0 -3 M13.5,8 a1.5 1.5 0 0 0 0 3 a1.5 1.5 0 0 0 0 -3" />
</g>
</symbol>
<symbol id="icon-tools-pan" viewBox="0 0 18 18">
<title>Pan</title>
<g id="icon-tools-pan-group" fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path id="icon-tools-pan-line-v" d="M9,1 L9,17"></path>
<path id="icon-tools-pan-line-h" d="M1,9 L17,9"></path>
<polyline id="icon-tools-pan-caret-t" points="7 3 9 1 11 3"></polyline>
<polyline id="icon-tools-pan-caret-r" points="15 11 17 9 15 7"></polyline>
<polyline id="icon-tools-pan-caret-b" points="11 15 9 17 7 15"></polyline>
<polyline id="icon-tools-pan-caret-l" points="3 7 1 9 3 11"></polyline>
</g>
</symbol>
<symbol id="icon-tools-zoom" viewBox="0 0 17 17">
<title>Zoom</title>
<g id="icon-tools-zoom-group" fill="none" stroke-width="2" stroke-linecap="round">
<path id="icon-tools-zoom-path" d="m11.5,11.5 4.5,4.5" />
<circle id="icon-tools-zoom-circle" cx="7" cy="7" r="6" />
</g>
</symbol>
<symbol id="icon-tools-invert" viewBox="0 0 24 28">
<title>Invert</title>
<path d="M12 22.5v-17c-4.688 0-8.5 3.813-8.5 8.5s3.813 8.5 8.5 8.5zM24 14c0 6.625-5.375 12-12 12s-12-5.375-12-12 5.375-12 12-12 12 5.375 12 12z"></path>
</symbol>
<symbol id="icon-tools-stack-scroll" viewBox="0 0 24 28">
<title>Stack Scroll</title>
<path d="M24 21v2c0 0.547-0.453 1-1 1h-22c-0.547 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547 0 1 0.453 1 1zM24 13v2c0 0.547-0.453 1-1 1h-22c-0.547 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547 0 1 0.453 1 1zM24 5v2c0 0.547-0.453 1-1 1h-22c-0.547 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547 0 1 0.453 1 1z"></path>
</symbol>
<symbol id="icon-tools-elliptical-roi" viewBox="0 0 24 28">
<title>Elliptical ROI</title>
<path d="M12 5.5c-4.688 0-8.5 3.813-8.5 8.5s3.813 8.5 8.5 8.5 8.5-3.813 8.5-8.5-3.813-8.5-8.5-8.5zM24 14c0 6.625-5.375 12-12 12s-12-5.375-12-12 5.375-12 12-12v0c6.625 0 12 5.375 12 12z"></path>
</symbol>
<symbol id="icon-tools-magnify" viewBox="0 0 24 28">
<title>Magnify</title>
<path d="M24 14c0 6.625-5.375 12-12 12s-12-5.375-12-12 5.375-12 12-12 12 5.375 12 12z"></path>
</symbol>
<symbol id="icon-tools-reset" viewBox="0 0 24 28">
<title>Reset</title>
<path d="M24 14c0 6.609-5.391 12-12 12-3.578 0-6.953-1.578-9.234-4.328-0.156-0.203-0.141-0.5 0.031-0.672l2.141-2.156c0.109-0.094 0.25-0.141 0.391-0.141 0.141 0.016 0.281 0.078 0.359 0.187 1.531 1.984 3.828 3.109 6.312 3.109 4.406 0 8-3.594 8-8s-3.594-8-8-8c-2.047 0-3.984 0.781-5.437 2.141l2.141 2.156c0.297 0.281 0.375 0.719 0.219 1.078-0.156 0.375-0.516 0.625-0.922 0.625h-7c-0.547 0-1-0.453-1-1v-7c0-0.406 0.25-0.766 0.625-0.922 0.359-0.156 0.797-0.078 1.078 0.219l2.031 2.016c2.203-2.078 5.187-3.313 8.266-3.313 6.609 0 12 5.391 12 12z"></path>
</symbol>
<symbol id="icon-tools-rotate" viewBox="0 0 24 28">
<title>Rotate</title>
<path d="M24 4v7c0 0.547-0.453 1-1 1h-7c-0.406 0-0.766-0.25-0.922-0.625-0.156-0.359-0.078-0.797 0.219-1.078l2.156-2.156c-1.469-1.359-3.406-2.141-5.453-2.141-4.406 0-8 3.594-8 8s3.594 8 8 8c2.484 0 4.781-1.125 6.312-3.109 0.078-0.109 0.219-0.172 0.359-0.187 0.141 0 0.281 0.047 0.391 0.141l2.141 2.156c0.187 0.172 0.187 0.469 0.031 0.672-2.281 2.75-5.656 4.328-9.234 4.328-6.609 0-12-5.391-12-12s5.391-12 12-12c3.078 0 6.062 1.234 8.266 3.313l2.031-2.016c0.281-0.297 0.719-0.375 1.094-0.219 0.359 0.156 0.609 0.516 0.609 0.922z"></path>
</symbol>
<symbol id="icon-tools-rotate-right" viewBox="0 0 24 24">
<title>Rotate Right</title>
<path d="M16.875 15.469c0.563-0.75 0.891-1.594 1.031-2.484h2.016c-0.188 1.406-0.703 2.719-1.594 3.891zM12.984 17.906c0.891-0.141 1.734-0.469 2.484-1.031l1.453 1.453c-1.172 0.891-2.531 1.406-3.938 1.594v-2.016zM19.922 11.016h-2.016c-0.141-0.891-0.469-1.734-1.031-2.484l1.453-1.406c0.891 1.172 1.406 2.484 1.594 3.891zM15.563 5.531l-4.547 4.453v-3.891c-2.859 0.469-5.016 2.953-5.016 5.906s2.156 5.438 5.016 5.906v2.016c-3.938-0.469-7.031-3.844-7.031-7.922s3.094-7.453 7.031-7.922v-3.094z"></path>
</symbol>
<symbol id="icon-tools-cineplay-toggle" viewBox="0 0 28 28">
<title>Cineplay Toggle</title>
<path d="M11.109 17.625l7.562-3.906-7.562-3.953v7.859zM14 4.156c5.891 0 9.797 0.281 9.797 0.281 0.547 0.063 1.75 0.063 2.812 1.188 0 0 0.859 0.844 1.109 2.781 0.297 2.266 0.281 4.531 0.281 4.531v2.125s0.016 2.266-0.281 4.531c-0.25 1.922-1.109 2.781-1.109 2.781-1.062 1.109-2.266 1.109-2.812 1.172 0 0-3.906 0.297-9.797 0.297v0c-7.281-0.063-9.516-0.281-9.516-0.281-0.625-0.109-2.031-0.078-3.094-1.188 0 0-0.859-0.859-1.109-2.781-0.297-2.266-0.281-4.531-0.281-4.531v-2.125s-0.016-2.266 0.281-4.531c0.25-1.937 1.109-2.781 1.109-2.781 1.062-1.125 2.266-1.125 2.812-1.188 0 0 3.906-0.281 9.797-0.281v0z"></path>
</symbol>
<symbol id="icon-tools-flip-vertical" viewBox="0 0 6 28">
<title>Vertical</title>
<path d="M6 19.5v3c0 0.828-0.672 1.5-1.5 1.5h-3c-0.828 0-1.5-0.672-1.5-1.5v-3c0-0.828 0.672-1.5 1.5-1.5h3c0.828 0 1.5 0.672 1.5 1.5zM6 11.5v3c0 0.828-0.672 1.5-1.5 1.5h-3c-0.828 0-1.5-0.672-1.5-1.5v-3c0-0.828 0.672-1.5 1.5-1.5h3c0.828 0 1.5 0.672 1.5 1.5zM6 3.5v3c0 0.828-0.672 1.5-1.5 1.5h-3c-0.828 0-1.5-0.672-1.5-1.5v-3c0-0.828 0.672-1.5 1.5-1.5h3c0.828 0 1.5 0.672 1.5 1.5z"></path>
</symbol>
<symbol id="icon-tools-flip-horizontal" viewBox="0 0 22 28">
<title>Horizontal</title>
<path d="M6 11.5v3c0 0.828-0.672 1.5-1.5 1.5h-3c-0.828 0-1.5-0.672-1.5-1.5v-3c0-0.828 0.672-1.5 1.5-1.5h3c0.828 0 1.5 0.672 1.5 1.5zM14 11.5v3c0 0.828-0.672 1.5-1.5 1.5h-3c-0.828 0-1.5-0.672-1.5-1.5v-3c0-0.828 0.672-1.5 1.5-1.5h3c0.828 0 1.5 0.672 1.5 1.5zM22 11.5v3c0 0.828-0.672 1.5-1.5 1.5h-3c-0.828 0-1.5-0.672-1.5-1.5v-3c0-0.828 0.672-1.5 1.5-1.5h3c0.828 0 1.5 0.672 1.5 1.5z"></path>
</symbol>
<symbol id="icon-trial-info" viewBox="0 0 20 20">
<title>Trial Information</title>
<g id="icon-trial-info-group" fill="none" stroke-width="2">
<path id="icon-trial-info-circle" d="M10,1 a9 9 0 0 1 0 18 a9 9 0 0 1 0 -18 M10,5 l0,2 m0,2 0,6" />
</g>
</symbol>
<symbol id="icon-ui-accordion-expand" viewBox="0 0 12 8">
<title>Expand</title>
<polygon transform="translate(6.000000, 3.700000) rotate(-270.000000) translate(-6.000000, -3.700000) " points="3.7 -2.3 2.3 -0.9 6.9 3.7 2.3 8.3 3.7 9.7 9.7 3.7"/>
</symbol>
<symbol id="icon-ui-add" viewBox="0 0 12 13">
<title>Add</title>
<path d="M6.5 7L6.5 12C6.5 12.28 6.28 12.5 6 12.5 5.72 12.5 5.5 12.28 5.5 12L5.5 7 0.5 7C0.22 7 0 6.78 0 6.5 0 6.22 0.22 6 0.5 6L5.5 6 5.5 1C5.5 0.72 5.72 0.5 6 0.5 6.28 0.5 6.5 0.72 6.5 1L6.5 6 11.5 6C11.78 6 12 6.22 12 6.5 12 6.78 11.78 7 11.5 7L6.5 7Z" id="Combined-Shape"/>
</symbol>
<symbol id="icon-ui-close" viewBox="0 0 14 14">
<title>Close</title>
<g id="icon-ui-close-group" stroke-width="1.75">
<path id="icon-ui-close-path" d="M1,1 13,13 M1,13 13,1" />
</g>
</symbol>
<symbol id="icon-create-comment" viewBox="0 0 37 34">
<title>Comment</title>
<path fill="#94a8b3" d="M22.32 14L35 14C36.1 14 37 14.9 37 16L37 28C37 29.1 36.1 30 35 30L21 30 17 34 17 20.39C19.45 18.97 21.36 16.71 22.32 14Z" id="Combined-Shape"/>
<path d="M10 0C4.5 0 0 4.5 0 10 0 15.5 4.5 20 10 20 15.5 20 20 15.5 20 10 20 4.5 15.5 0 10 0L10 0ZM15 11L11 11 11 15 9 15 9 11 5 11 5 9 9 9 9 5 11 5 11 9 15 9 15 11 15 11Z" id="Shape"/>
</symbol>
<symbol id="icon-create-screen-capture" viewBox="0 0 37 35">
<title>Capture Screen</title>
<g id="camera-alt" transform="translate(17.000000, 17.000000)" fill="#94a8b3">
<path d="M10 13C11.66 13 13 11.66 13 10 13 8.34 11.66 7 10 7 8.34 7 7 8.34 7 10 7 11.66 8.34 13 10 13Z" id="Oval"/>
<path d="M7 0L5.2 2 2 2C0.9 2 0 2.9 0 4L0 16C0 17.1 0.9 18 2 18L18 18C19.1 18 20 17.1 20 16L20 4C20 2.9 19.1 2 18 2L14.8 2 13 0 7 0 7 0ZM10 15C7.2 15 5 12.8 5 10 5 7.2 7.2 5 10 5 12.8 5 15 7.2 15 10 15 12.8 12.8 15 10 15L10 15Z" id="Shape"/>
</g>
<path d="M10 0C4.5 0 0 4.5 0 10 0 15.5 4.5 20 10 20 15.5 20 20 15.5 20 10 20 4.5 15.5 0 10 0L10 0ZM15 11L11 11 11 15 9 15 9 11 5 11 5 9 9 9 9 5 11 5 11 9 15 9 15 11 15 11Z" id="Shape"/>
</symbol>
<symbol id="icon-ui-warning" viewBox="0 0 22 20">
<title>Warning</title>
<g id="icon-ui-warning-group" stroke="none">
<path d="m11,0 11,20 -22,0Z m1,7 -2,0 0,6 2,0Z m0,8 -2,0 0,2 2,0Z" />
</g>
</symbol>
<symbol id="icon-ohif-logo" viewBox="0 0 47 47">
<title>Open Health Imaging Foundation</title>
<g id="icon-ohif-logo" stroke="#fff" stroke-width="2.5" stroke-miterlimit="10">
<rect x="1.25" y="1.25" width="18.8" height="18.8" rx="1" ry="1"/>
<rect x="26" y="1.25" width="18.8" height="18.8" rx="1" ry="1"/>
<rect x="1.25" y="26" width="18.8" height="18.8" rx="1" ry="1"/>
<rect x="26" y="26" width="18.8" height="18.8" rx="1" ry="1"/>
</g>
</symbol>
<symbol id="icon-viewport-link" viewBox="0 0 32 32">
<title>Viewport Link</title>
<g id="icon-viewport-link-group" stroke="none">
<path d="m5.364 28.917c1.047 1.046 2.422 1.57 3.797 1.57 1.376 0 2.751-0.523 3.798-1.572l7.552-7.554c1.016-1.014 1.574-2.361 1.574-3.797 -0.001-1.432-0.558-2.781-1.574-3.796l-2.297-2.298 -2.009 2.009 2.297 2.298c0.478 0.478 0.741 1.113 0.741 1.788 0 0.674-0.264 1.309-0.741 1.786l-7.553 7.555c-0.987 0.985-2.59 0.985-3.576 0l-2.297-2.298c-0.987-0.985-0.987-2.589 0-3.576l3.775-3.776 -2.009-2.009 -3.776 3.776c-2.094 2.096-2.092 5.502 0 7.595l2.299 2.3zM26.695 2.992"/>
<path d="m26.695 2.992c-1.014-1.016-2.362-1.575-3.797-1.575 -0.001 0-0.001 0-0.002 0 -1.435 0-2.784 0.56-3.798 1.573l-7.551 7.553c-1.017 1.016-1.576 2.363-1.576 3.799 0 1.434 0.558 2.784 1.574 3.797l2.297 2.297 2.01-2.009 -2.298-2.297c-0.477-0.477-0.741-1.113-0.741-1.788 0-0.676 0.265-1.311 0.742-1.788l7.553-7.555c0.477-0.477 1.111-0.74 1.789-0.74 0 0 0 0 0.001 0 0.674 0 1.309 0.264 1.786 0.74l2.297 2.299c0.477 0.477 0.74 1.111 0.74 1.788 0 0.674-0.264 1.311-0.74 1.788l-3.776 3.777 2.009 2.009 3.776-3.777c1.014-1.013 1.573-2.363 1.574-3.797 0-1.435-0.56-2.784-1.574-3.797l-2.295-2.296z"/>
</g>
</symbol>
<symbol id="theme" viewBox="0 0 24 24">
<title>Theme</title>
<path d="M17.484 12c0.844 0 1.5-0.656 1.5-1.5s-0.656-1.5-1.5-1.5-1.5 0.656-1.5 1.5 0.656 1.5 1.5 1.5zM14.484 8.016c0.844 0 1.5-0.656 1.5-1.5s-0.656-1.5-1.5-1.5-1.5 0.656-1.5 1.5 0.656 1.5 1.5 1.5zM9.516 8.016c0.844 0 1.5-0.656 1.5-1.5s-0.656-1.5-1.5-1.5-1.5 0.656-1.5 1.5 0.656 1.5 1.5 1.5zM6.516 12c0.844 0 1.5-0.656 1.5-1.5s-0.656-1.5-1.5-1.5-1.5 0.656-1.5 1.5 0.656 1.5 1.5 1.5zM12 3c4.969 0 9 3.609 9 8.016 0 2.766-2.25 4.969-5.016 4.969h-1.734c-0.844 0-1.5 0.656-1.5 1.5 0 0.375 0.141 0.703 0.375 0.984s0.375 0.656 0.375 1.031c0 0.844-0.656 1.5-1.5 1.5-4.969 0-9-4.031-9-9s4.031-9 9-9z"></path>
</symbol>
<symbol id="log" viewBox="0 0 24 24">
<title>Log</title>
<path d="M9.516 14.016c2.484 0 4.5-2.016 4.5-4.5s-2.016-4.5-4.5-4.5-4.5 2.016-4.5 4.5 2.016 4.5 4.5 4.5zM15.516 14.016l4.969 4.969-1.5 1.5-4.969-4.969v-0.797l-0.281-0.281c-1.125 0.984-2.625 1.547-4.219 1.547-3.609 0-6.516-2.859-6.516-6.469s2.906-6.516 6.516-6.516 6.469 2.906 6.469 6.516c0 1.594-0.563 3.094-1.547 4.219l0.281 0.281h0.797z"></path>
</symbol>
<symbol id="server" viewBox="0 0 24 28">
<title>Server</title>
<path d="M12 12c4.703 0 9.422-0.844 12-2.656v2.656c0 2.203-5.375 4-12 4s-12-1.797-12-4v-2.656c2.578 1.813 7.297 2.656 12 2.656zM12 24c4.703 0 9.422-0.844 12-2.656v2.656c0 2.203-5.375 4-12 4s-12-1.797-12-4v-2.656c2.578 1.813 7.297 2.656 12 2.656zM12 18c4.703 0 9.422-0.844 12-2.656v2.656c0 2.203-5.375 4-12 4s-12-1.797-12-4v-2.656c2.578 1.813 7.297 2.656 12 2.656zM12 0c6.625 0 12 1.797 12 4v2c0 2.203-5.375 4-12 4s-12-1.797-12-4v-2c0-2.203 5.375-4 12-4z"></path>
</symbol>
<symbol id="study-list" viewBox="0 0 24 24">
<title>Study List</title>
<path d="M9 5.016h12v3.984h-12v-3.984zM9 18.984v-3.984h12v3.984h-12zM9 14.016v-4.031h12v4.031h-12zM3.984 9v-3.984h4.031v3.984h-4.031zM3.984 18.984v-3.984h4.031v3.984h-4.031zM3.984 14.016v-4.031h4.031v4.031h-4.031z"></path>
</symbol>
<symbol id="logout" viewBox="0 0 24 28">
<title>Logout</title>
<path d="M24 14c0 6.609-5.391 12-12 12s-12-5.391-12-12c0-3.797 1.75-7.297 4.797-9.578 0.891-0.672 2.141-0.5 2.797 0.391 0.672 0.875 0.484 2.141-0.391 2.797-2.031 1.531-3.203 3.859-3.203 6.391 0 4.406 3.594 8 8 8s8-3.594 8-8c0-2.531-1.172-4.859-3.203-6.391-0.875-0.656-1.062-1.922-0.391-2.797 0.656-0.891 1.922-1.062 2.797-0.391 3.047 2.281 4.797 5.781 4.797 9.578zM14 2v10c0 1.094-0.906 2-2 2s-2-0.906-2-2v-10c0-1.094 0.906-2 2-2s2 0.906 2 2z"></path>
</symbol>
<symbol id="password" viewBox="0 0 18 28">
<title>Password</title>
<path d="M5 12h8v-3c0-2.203-1.797-4-4-4s-4 1.797-4 4v3zM18 13.5v9c0 0.828-0.672 1.5-1.5 1.5h-15c-0.828 0-1.5-0.672-1.5-1.5v-9c0-0.828 0.672-1.5 1.5-1.5h0.5v-3c0-3.844 3.156-7 7-7s7 3.156 7 7v3h0.5c0.828 0 1.5 0.672 1.5 1.5z"></path>
</symbol>
</svg>

Before

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,5 +0,0 @@
body {
margin: 0;
padding: 0;
font-family: sans-serif;
}

View File

@ -1,172 +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">
<link rel="shortcut icon" type="image/png" href="/images/logo.png" sizes="16x16 32x32 64x64">
<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">
<link rel="manifest" href="./manifest.json">
<link rel="stylesheet" href="index.css">
<!-- 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">
<!-- WEB FONTS -->
<link href="https://fonts.googleapis.com/css?family=Sanchez" rel="stylesheet">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<title>OHIF Standalone Viewer</title>
<base href="http://localhost:5000/">
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
<!-- Load React. -->
<!-- Note: when deploying, replace "development.js" with "production.min.js". -->
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<!--<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>
'use strict';
var process = {
"env": {
"NODE_ENV": "production"
}
};
window.process = process;
</script>
<!--<script src="https://unpkg.com/ohif-viewer/dist/index.umd.js" crossorigin></script>!-->
<script src="deps/index.umd.js" crossorigin></script>
<!--<script src="/node_modules/ohif-viewer/dist/index.umd.js" crossorigin></script>!-->
<!-- Load our React component. -->
<script>
var props = {"routerBasename": "/", rootUrl: "http://localhost:5000"};
/* props.servers = {
"dicomWeb": [{
"name": "DCM4CHEE",
"wadoUriRoot": "https://cancer.crowds-cure.org/dcm4chee-arc/aets/DCM4CHEE/wado",
"qidoRoot": "https://cancer.crowds-cure.org/dcm4chee-arc/aets/DCM4CHEE/rs",
"wadoRoot": "https://cancer.crowds-cure.org/dcm4chee-arc/aets/DCM4CHEE/rs",
"qidoSupportsIncludeField": true,
"imageRendering": "wadors",
"thumbnailRendering": "wadors",
"requestOptions": {
"requestFromBrowser": true
}
}
]
},
"oidc": [{
"authServerUrl": "https://cancer.crowds-cure.org/auth/realms/dcm4che",
"authRedirectUri": "http://localhost:5000/callback",
"postLogoutRedirectUri": "http://localhost:5000/logout-redirect.html",
"clientId": "crowds-cure-cancer",
"responseType": "id_token token",
"scope": "email profile openid",
"revokeAccessTokenOnSignout": true,
"extraQueryParams": {
"kc_idp_hint": "crowds-cure-cancer-auth0-oidc",
"client_id": "crowds-cure-cancer"
}
}]
}; */
</script>
<script>
'use strict';
/*
Example config with OIDC
*/
// Uncomment the next two blocks, comment out the config without OIDC
// Try going to:
// http://localhost:5000/viewer/1.3.6.1.4.1.25403.345050719074.3824.20170126082328.1
// http://ohif-viewer-react.s3-website-us-east-1.amazonaws.com/viewer/1.3.6.1.4.1.25403.345050719074.3824.20170126082328.1
/* Example config without OIDC */
// Try going to:
// http://localhost:5000/viewer/1.3.6.1.4.1.14519.5.2.1.1706.4996.216859690032335293073513900362
props.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
}
}
]
};
/*
UI settings
Plugins
- Custom tools / buttons
- Custom Sidebar module thing
- Custom Viewports
- Custom Sop Class Interpreters
*/
/*"PUBLIC_SETTINGS": {
"ui": {
"studyListFunctionsEnabled": true,
"leftSidebarOpen": false,
"displaySetNavigationLoopOverSeries": false,
"displaySetNavigationMultipleViewports": true,
"autoPositionMeasurementsTextCallOuts": "TRLB"
},
"prefetch": {
"order": "topdown",
"displaySetCount": 1
}
*/
/*
White labelling example
// Note that you can't write JSX here, so you can use the online JSX compiler:
// https://babeljs.io/repl/#?babili=false&browsers=&build=&builtIns=false&spec=false&loose=false&code_lz=GYVwdgxgLglg9mABACwKYBt1wBQEpEDeAUIogE6pQhlIA8AholPWQOaUC8ARAPoBG6emADWXchm5g4cAA6owqMoikVgiimTERBAZx0A5egFtU3NPQAmigLR8yQi2OSqzUKDIBcAei_2LMCHp0GCN6VhgwVgA6CDgjLgA-ElIU1LS02hDWRB0yCA4AcmQ3Tx8_AKCQsIjo2KMvAHcZa1iwKHkoLxAZLEsdLwAmAAYARgB2LxGRrwgyWTkLFrmZBetwMGNURYGomUiCxC8k9JOU2i96BIBuIgBfIiA&debug=false&forceAllTransforms=false&shippedProposals=false&circleciRepo=&evaluate=false&fileSize=false&timeTravel=false&sourceType=module&lineWrap=true&presets=react&prettier=false&targets=&version=6.26.0&envVersion=
*/
function RadicalImagingLogo() {
return React.createElement(
"a",
{ target: "_blank", rel: "noopener noreferrer", className: "header-brand", href: "http://radicalimaging.com" },
React.createElement("h5", {}, 'RADICAL IMAGING')
);
}
/*props.whiteLabelling = {
logoComponent: RadicalImagingLogo()
}*/
// TODO: Why do we need to do this? Something is wrong with our rollup settings
var Viewer = window.OHIFStandaloneViewer.App;
var app = React.createElement(Viewer, props, null);
ReactDOM.render(app, document.getElementById('root'));
</script>
</body>
</html>

View File

@ -1,8 +0,0 @@
{
"short_name": "ohif-standalone-viewer-example",
"name": "ohif-standalone-viewer-example",
"start_url": "./index.html",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}

View File

@ -1,14 +0,0 @@
{
"name": "ohif-viewer-example",
"version": "0.0.0",
"license": "MIT",
"private": true,
"dependencies": {
"ohif-viewer": "link:../",
"serve": "^10.1.1"
},
"scripts": {
"prepare": "mkdir -p deps && cp node_modules/ohif-viewer/dist/index.umd.* deps/",
"start": "yarn run prepare && serve -s ."
}
}

View File

@ -44,15 +44,17 @@ cd ..
echo $DEPLOY_PRIME_URL echo $DEPLOY_PRIME_URL
export ROOT_URL=$DEPLOY_PRIME_URL/demo export ROOT_URL=$DEPLOY_PRIME_URL/demo
# cat package.json mkdir ./docs/latest/_book/demo/
# yarn install yarn install
# yarn build yarn build:web:ci
# OLD DEPLOY
# cd example # cd example
# yarn install # yarn install
# yarn run prepare # yarn run prepare
# sed -i "s,http://localhost:5000,${ROOT_URL},g" index.html # sed -i "s,http://localhost:5000,${ROOT_URL},g" index.html
# sed -i 's,"routerBasename": "/","routerBasename": "/demo",g' index.html # sed -i 's,"routerBasename": "/","routerBasename": "/demo",g' index.html
# rm -rf node_modules # rm -rf node_modules
# mkdir docs/latest/_book/demo/
# cp -R * docs/latest/_book/demo/ # NEW DEPLOY
# cpx 'build/*' docs/latest/_book/demo --verbose

View File

@ -7,6 +7,7 @@ module.exports = {
'<rootDir>/src/**/*.{js,jsx}', '<rootDir>/src/**/*.{js,jsx}',
'!<rootDir>/src/**/*.test.js', '!<rootDir>/src/**/*.test.js',
'!**/node_modules/**', '!**/node_modules/**',
'!**/__tests__/**',
], ],
reporters: ['default', 'jest-junit'], reporters: ['default', 'jest-junit'],
// //

View File

@ -1,3 +1,5 @@
# https://www.netlify.com/docs/netlify-toml-reference/
[build] [build]
# Directory (relative to root of your repo) that contains the deploy-ready # Directory (relative to root of your repo) that contains the deploy-ready
# HTML files and assets generated by the build. If a base directory has # HTML files and assets generated by the build. If a base directory has

View File

@ -9,7 +9,6 @@
"browser": "dist/index.umd.js", "browser": "dist/index.umd.js",
"module": "dist/index.es.js", "module": "dist/index.es.js",
"jsnext:main": "dist/index.es.js", "jsnext:main": "dist/index.es.js",
"homepage": "http://localhost:5000",
"engines": { "engines": {
"node": ">=8", "node": ">=8",
"npm": ">=5" "npm": ">=5"
@ -18,12 +17,15 @@
"cm": "npx git-cz", "cm": "npx git-cz",
"dev": "yarn run preBuild && cross-env PORT=5000 react-scripts start", "dev": "yarn run preBuild && cross-env PORT=5000 react-scripts start",
"dev:debug": "cross-env PORT=5000 react-scripts start", "dev:debug": "cross-env PORT=5000 react-scripts start",
"build": "yarn run preBuild && node --max-old-space-size=4096 node_modules/rollup/bin/rollup -c", "build:package": "yarn run preBuild && node --max-old-space-size=4096 node_modules/rollup/bin/rollup -c",
"build:package:ci": "yarn run preBuild && cross-env REACT_APP_CONFIG=config/default node --max-old-space-size=4096 node_modules/rollup/bin/rollup -c",
"build:web": "yarn run preBuild && react-scripts build",
"build:web:ci": "yarn run preBuild && react-scripts --max_old_space_size=4096 build && cpx 'build/**/*' docs/latest/_book/demo --verbose",
"lint": "eslint -c .eslintrc --fix src && prettier --single-quote --write src/**/*.{js,jsx,json,css}", "lint": "eslint -c .eslintrc --fix src && prettier --single-quote --write src/**/*.{js,jsx,json,css}",
"test": "jest", "test": "jest",
"test:ci": "jest --ci --runInBand --collectCoverage --reporters=default --reporters=jest-junit && codecov", "test:ci": "jest --ci --runInBand --collectCoverage --reporters=default --reporters=jest-junit && codecov",
"staticDeploy": "./generateStaticSite.sh", "staticDeploy": "./generateStaticSite.sh",
"predeploy": "cd example && npm install && yarn run build", "predeploy": "cd example && npm install && yarn run build:package",
"preBuild": "yarn run version && yarn run copy:webworkers", "preBuild": "yarn run version && yarn run copy:webworkers",
"version": "node -p -e \"'export default \\'' + require('./package.json').version + '\\';'\" > src/version.js", "version": "node -p -e \"'export default \\'' + require('./package.json').version + '\\';'\" > src/version.js",
"copy:webworkers": "cpx 'node_modules/cornerstone-wado-image-loader/dist/*.min.js*' public" "copy:webworkers": "cpx 'node_modules/cornerstone-wado-image-loader/dist/*.min.js*' public"
@ -95,6 +97,7 @@
"@babel/core": "^7.2.2", "@babel/core": "^7.2.2",
"@babel/plugin-external-helpers": "^7.2.0", "@babel/plugin-external-helpers": "^7.2.0",
"@babel/plugin-proposal-class-properties": "^7.2.3", "@babel/plugin-proposal-class-properties": "^7.2.3",
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/plugin-transform-runtime": "^7.2.0", "@babel/plugin-transform-runtime": "^7.2.0",
"@babel/preset-env": "^7.2.3", "@babel/preset-env": "^7.2.3",
"@babel/preset-react": "^7.0.0", "@babel/preset-react": "^7.0.0",

22
public/config/default.js Normal file
View File

@ -0,0 +1,22 @@
window.config = {
// default: '/'
routerBasename: '/',
// default: ''
relativeWebWorkerScriptsPath: '',
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,
},
},
],
},
}

19
public/config/netlify.js Normal file
View File

@ -0,0 +1,19 @@
window.config = {
routerBasename: '/demo',
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,
},
},
],
},
}

View File

@ -1,22 +1,40 @@
<!doctype html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta
<meta name="theme-color" content="#000000"> name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<meta name="theme-color" content="#000000" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json"> <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<script
type="text/javascript"
src="%PUBLIC_URL%/%REACT_APP_CONFIG%"
></script>
<title>OHIF Viewer</title> <title>OHIF Viewer</title>
<!-- Latest compiled and minified CSS --> <!-- 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"> <link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
crossorigin="anonymous"
/>
<!-- WEB FONTS --> <!-- WEB FONTS -->
<link href="https://fonts.googleapis.com/css?family=Sanchez" rel="stylesheet"> <link
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" href="https://fonts.googleapis.com/css?family=Sanchez"
crossorigin="anonymous"> rel="stylesheet"
/>
<link
rel="stylesheet"
href="https://use.fontawesome.com/releases/v5.6.3/css/all.css"
integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/"
crossorigin="anonymous"
/>
</head> </head>
<body> <body>
@ -26,5 +44,4 @@
<div id="root"></div> <div id="root"></div>
</body> </body>
</html> </html>

View File

@ -8,12 +8,12 @@ import url from 'rollup-plugin-url'
import svgr from '@svgr/rollup' import svgr from '@svgr/rollup'
import pkg from './package.json' import pkg from './package.json'
// Deal with https://github.com/rollup/rollup-plugin-commonjs/issues/297 // Deal with https://github.com/rollup/rollup-plugin-commonjs/issues/297
import builtins from 'rollup-plugin-node-builtins'; import builtins from 'rollup-plugin-node-builtins'
const globals = { const globals = {
'react': 'React', react: 'React',
'react-dom': 'ReactDOM' 'react-dom': 'ReactDOM',
}; }
export default { export default {
input: 'src/index_publish.js', input: 'src/index_publish.js',
@ -24,20 +24,21 @@ export default {
sourcemap: true, sourcemap: true,
exports: 'named', exports: 'named',
name: 'OHIFStandaloneViewer', name: 'OHIFStandaloneViewer',
globals esModule: false,
globals,
}, },
{ {
file: pkg.module, file: pkg.module,
format: 'es', format: 'es',
exports: 'named', exports: 'named',
sourcemap: true, sourcemap: true,
globals globals,
} },
], ],
plugins: [ plugins: [
external(), external(),
postcss({ postcss({
modules: false modules: false,
}), }),
url(), url(),
svgr(), svgr(),
@ -45,22 +46,27 @@ export default {
resolve(), resolve(),
babel({ babel({
exclude: 'node_modules/**', exclude: 'node_modules/**',
runtimeHelpers: true runtimeHelpers: true,
}), }),
commonjs({ commonjs({
include: 'node_modules/**', include: 'node_modules/**',
namedExports: { namedExports: {
'node_modules/react-is/index.js': ['isValidElementType', 'isContextConsumer'], 'node_modules/react-is/index.js': [
'node_modules/redux-oidc/dist/redux-oidc.js': [ 'isValidElementType',
'reducer', 'CallbackComponent', 'loadUser', 'OidcProvider', 'createUserManager' 'isContextConsumer',
], ],
'node_modules/cornerstoneTools/dist/cornerstoneTools.min.js': [ 'node_modules/redux-oidc/dist/redux-oidc.js': [
'cornerstoneTools' 'reducer',
], 'CallbackComponent',
'node_modules/dcmjs/build/dcmjs.js': [ 'loadUser',
'data', 'adapters' 'OidcProvider',
] 'createUserManager',
} ],
'node_modules/cornerstoneTools/dist/cornerstoneTools.min.js': [
'cornerstoneTools',
],
'node_modules/dcmjs/build/dcmjs.js': ['data', 'adapters'],
},
}), }),
builtins(), builtins(),
], ],

View File

@ -1,42 +1,39 @@
import React, { Component } from 'react'; import React, { Component } from 'react'
import { BrowserRouter } from 'react-router-dom'; import { BrowserRouter as Router } from 'react-router-dom'
import { Provider } from 'react-redux'; import { Provider } from 'react-redux'
import { createStore, combineReducers } from 'redux'; import { createStore, combineReducers } from 'redux'
import PropTypes from 'prop-types'; import PropTypes from 'prop-types'
import OHIF from 'ohif-core'; import OHIF from 'ohif-core'
import './config'; import './config'
import ui from './redux/ui.js'; import ui from './redux/ui.js'
import OHIFStandaloneViewer from './OHIFStandaloneViewer'; import OHIFStandaloneViewer from './OHIFStandaloneViewer'
import WhiteLabellingContext from './WhiteLabellingContext'; import WhiteLabellingContext from './WhiteLabellingContext'
import OHIFCornerstoneExtension from 'ohif-cornerstone-extension'; import OHIFCornerstoneExtension from 'ohif-cornerstone-extension'
import OHIFVTKExtension from 'ohif-vtk-extension'; import OHIFVTKExtension from 'ohif-vtk-extension'
import OHIFDicomPDFExtension from 'ohif-dicom-pdf-extension'; import OHIFDicomPDFExtension from 'ohif-dicom-pdf-extension'
import OHIFDicomHtmlExtension from 'ohif-dicom-html-extension'; import OHIFDicomHtmlExtension from 'ohif-dicom-html-extension'
import OHIFDicomMicroscopyExtension from 'ohif-dicom-microscopy-extension'; import OHIFDicomMicroscopyExtension from 'ohif-dicom-microscopy-extension'
import { OidcProvider, reducer as oidcReducer } from 'redux-oidc'
import { import {
loadUser, getUserManagerForOpenIdConnectClient,
OidcProvider, initWebWorkers,
createUserManager, } from './utils/index.js'
reducer as oidcReducer
} from 'redux-oidc';
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
const { ExtensionManager } = OHIF.extensions; const Icons = 'icons.svg'
const { ExtensionManager } = OHIF.extensions
const { reducers, localStorage } = OHIF.redux
const Icons = 'icons.svg'; reducers.ui = ui
reducers.oidc = oidcReducer
const { reducers, localStorage } = OHIF.redux; const combined = combineReducers(reducers)
reducers.ui = ui; const store = createStore(combined, localStorage.loadState())
reducers.oidc = oidcReducer;
const combined = combineReducers(reducers);
const store = createStore(combined, localStorage.loadState());
store.subscribe(() => { store.subscribe(() => {
localStorage.saveState({ localStorage.saveState({
preferences: store.getState().preferences preferences: store.getState().preferences,
}); })
}); })
const defaultButtons = [ const defaultButtons = [
{ {
@ -44,35 +41,35 @@ const defaultButtons = [
type: 'tool', type: 'tool',
text: 'Stack Scroll', text: 'Stack Scroll',
svgUrl: `${Icons}#icon-tools-stack-scroll`, svgUrl: `${Icons}#icon-tools-stack-scroll`,
active: false active: false,
}, },
{ {
command: 'Zoom', command: 'Zoom',
type: 'tool', type: 'tool',
text: 'Zoom', text: 'Zoom',
svgUrl: `${Icons}#icon-tools-zoom`, svgUrl: `${Icons}#icon-tools-zoom`,
active: false active: false,
}, },
{ {
command: 'Wwwc', command: 'Wwwc',
type: 'tool', type: 'tool',
text: 'Levels', text: 'Levels',
svgUrl: `${Icons}#icon-tools-levels`, svgUrl: `${Icons}#icon-tools-levels`,
active: true active: true,
}, },
{ {
command: 'Pan', command: 'Pan',
type: 'tool', type: 'tool',
text: 'Pan', text: 'Pan',
svgUrl: `${Icons}#icon-tools-pan`, svgUrl: `${Icons}#icon-tools-pan`,
active: false active: false,
}, },
{ {
command: 'Length', command: 'Length',
type: 'tool', type: 'tool',
text: 'Length', text: 'Length',
svgUrl: `${Icons}#icon-tools-measure-temp`, svgUrl: `${Icons}#icon-tools-measure-temp`,
active: false active: false,
}, },
/*{ /*{
command: 'Annotate', command: 'Annotate',
@ -86,41 +83,41 @@ const defaultButtons = [
type: 'tool', type: 'tool',
text: 'Angle', text: 'Angle',
iconClasses: 'fa fa-angle-left', iconClasses: 'fa fa-angle-left',
active: false active: false,
}, },
{ {
command: 'Bidirectional', command: 'Bidirectional',
type: 'tool', type: 'tool',
text: 'Bidirectional', text: 'Bidirectional',
svgUrl: `${Icons}#icon-tools-measure-target`, svgUrl: `${Icons}#icon-tools-measure-target`,
active: false active: false,
}, },
{ {
command: 'Brush', command: 'Brush',
type: 'tool', type: 'tool',
text: 'Brush', text: 'Brush',
iconClasses: 'fa fa-circle', iconClasses: 'fa fa-circle',
active: false active: false,
}, },
{ {
command: 'FreehandMouse', command: 'FreehandMouse',
type: 'tool', type: 'tool',
text: 'Freehand', text: 'Freehand',
iconClasses: 'fa fa-star', iconClasses: 'fa fa-star',
active: false active: false,
}, },
{ {
command: 'reset', command: 'reset',
type: 'command', type: 'command',
text: 'Reset', text: 'Reset',
svgUrl: `${Icons}#icon-tools-reset`, svgUrl: `${Icons}#icon-tools-reset`,
active: false active: false,
} },
]; ]
const buttonsAction = OHIF.redux.actions.setAvailableButtons(defaultButtons); const buttonsAction = OHIF.redux.actions.setAvailableButtons(defaultButtons)
store.dispatch(buttonsAction); store.dispatch(buttonsAction)
const availableTools = [ const availableTools = [
{ name: 'Pan', mouseButtonMasks: [1, 4] }, { name: 'Pan', mouseButtonMasks: [1, 4] },
@ -135,14 +132,14 @@ const availableTools = [
{ name: 'PanMultiTouch' }, { name: 'PanMultiTouch' },
{ name: 'ZoomTouchPinch' }, { name: 'ZoomTouchPinch' },
{ name: 'StackScrollMouseWheel' }, { name: 'StackScrollMouseWheel' },
{ name: 'StackScrollMultiTouch' } { name: 'StackScrollMultiTouch' },
]; ]
const toolAction = OHIF.redux.actions.setExtensionData('cornerstone', { const toolAction = OHIF.redux.actions.setExtensionData('cornerstone', {
availableTools availableTools,
}); })
store.dispatch(toolAction); store.dispatch(toolAction)
/** TODO: extensions should be passed in as prop as soon as we have the extensions as separate packages and then registered by ExtensionsManager */ /** TODO: extensions should be passed in as prop as soon as we have the extensions as separate packages and then registered by ExtensionsManager */
const extensions = [ const extensions = [
@ -150,137 +147,78 @@ const extensions = [
new OHIFVTKExtension(), new OHIFVTKExtension(),
new OHIFDicomPDFExtension(), new OHIFDicomPDFExtension(),
new OHIFDicomHtmlExtension(), new OHIFDicomHtmlExtension(),
new OHIFDicomMicroscopyExtension() new OHIFDicomMicroscopyExtension(),
]; ]
ExtensionManager.registerExtensions(store, extensions); ExtensionManager.registerExtensions(store, extensions)
// TODO[react] Use a provider when the whole tree is React // TODO[react] Use a provider when the whole tree is React
window.store = store; window.store = store
function handleServers(servers) { function handleServers(servers) {
if (servers) { if (servers) {
OHIF.utils.addServers(servers, store); OHIF.utils.addServers(servers, store)
}
}
function handleOIDC(oidc) {
if (!oidc) {
return;
}
const oidcClient = oidc[0];
const settings = {
authority: oidcClient.authServerUrl,
client_id: oidcClient.clientId,
redirect_uri: oidcClient.authRedirectUri,
silent_redirect_uri: '/silent-refresh.html',
post_logout_redirect_uri: oidcClient.postLogoutRedirectUri,
response_type: oidcClient.responseType,
scope: 'email profile openid', // Note: Request must have scope 'openid' to be considered an OpenID Connect request
automaticSilentRenew: true,
revokeAccessTokenOnSignout: true,
filterProtocolClaims: true,
loadUserInfo: true,
extraQueryParams: oidcClient.extraQueryParams
};
const userManager = createUserManager(settings);
loadUser(store, userManager);
return userManager;
}
function handleWebWorkerInit(basename) {
const config = {
maxWebWorkers: Math.max(navigator.hardwareConcurrency - 1, 1),
startWebWorkersOnDemand: true,
webWorkerPath: basename + '/cornerstoneWADOImageLoaderWebWorker.min.js',
taskConfiguration: {
decodeTask: {
loadCodecsOnStartup: true,
initializeCodecsOnStartup: false,
codecsPath: basename + '/cornerstoneWADOImageLoaderCodecs.min.js',
usePDFJS: false,
strict: false
}
}
};
cornerstoneWADOImageLoader.webWorkerManager.initialize(config);
}
/**
* Set or update the HTML Base tag present on the document
* to point to the provided ROOT Url.
*
* @param rootUrl
*/
function updateBaseTag(rootUrl) {
const bases = document.getElementsByTagName('base');
let baseHref = rootUrl;
baseHref += baseHref.endsWith('/') ? '' : '/';
if (bases.length > 1) {
throw new Error('For some reason there is more than one base tag present.');
} else if (bases.length === 1) {
bases[0].href = baseHref;
} else {
document.write(`<base href='${baseHref}'/>`);
} }
} }
class App extends Component { class App extends Component {
static propTypes = { static propTypes = {
routerBasename: PropTypes.string,
relativeWebWorkerScriptsPath: PropTypes.string,
//
servers: PropTypes.object, servers: PropTypes.object,
oidc: PropTypes.array, oidc: PropTypes.array,
routerBasename: PropTypes.string,
rootUrl: PropTypes.string,
userManager: PropTypes.object, userManager: PropTypes.object,
location: PropTypes.object location: PropTypes.object,
}; whiteLabelling: PropTypes.object,
}
static defaultProps = { static defaultProps = {
whiteLabelling: {} routerBasename: '/',
}; relativeWebWorkerScriptsPath: '',
whiteLabelling: {},
}
constructor(props) { constructor(props) {
super(props); super(props)
this.userManager = handleOIDC(this.props.oidc); this.userManager = getUserManagerForOpenIdConnectClient(
handleServers(this.props.servers); store,
handleWebWorkerInit(this.props.rootUrl); this.props.oidc
updateBaseTag(this.props.rootUrl); )
handleServers(this.props.servers)
initWebWorkers(
this.props.routerBasename,
this.props.relativeWebWorkerScriptsPath
)
} }
render() { render() {
const userManager = this.userManager; const userManager = this.userManager
if (userManager) { if (userManager) {
return ( return (
<Provider store={store}> <Provider store={store}>
<OidcProvider store={store} userManager={userManager}> <OidcProvider store={store} userManager={userManager}>
<BrowserRouter basename={this.props.routerBasename}> <Router basename={this.props.routerBasename}>
<WhiteLabellingContext.Provider value={this.props.whiteLabelling}> <WhiteLabellingContext.Provider value={this.props.whiteLabelling}>
<OHIFStandaloneViewer userManager={userManager} /> <OHIFStandaloneViewer userManager={userManager} />
</WhiteLabellingContext.Provider> </WhiteLabellingContext.Provider>
</BrowserRouter> </Router>
</OidcProvider> </OidcProvider>
</Provider> </Provider>
); )
} }
return ( return (
<Provider store={store}> <Provider store={store}>
<BrowserRouter basename={this.props.routerBasename}> <Router basename={this.props.routerBasename}>
<WhiteLabellingContext.Provider value={this.props.whiteLabelling}> <WhiteLabellingContext.Provider value={this.props.whiteLabelling}>
<OHIFStandaloneViewer /> <OHIFStandaloneViewer />
</WhiteLabellingContext.Provider> </WhiteLabellingContext.Provider>
</BrowserRouter> </Router>
</Provider> </Provider>
); )
} }
} }
export default App; export default App

View File

@ -1,48 +1,63 @@
import React, { Component } from 'react'; import React, { Component } from 'react'
import PropTypes from 'prop-types'; import PropTypes from 'prop-types'
import { withRouter } from 'react-router'; // import asyncComponent from './components/AsyncComponent.js'
import { Route, Switch } from 'react-router-dom'; import IHEInvokeImageDisplay from './routes/IHEInvokeImageDisplay.js'
import { connect } from 'react-redux'; import ViewerRouting from './routes/ViewerRouting.js'
import { ViewerbaseDragDropContext } from 'react-viewerbase';
import ViewerRouting from './routes/ViewerRouting.js';
import StudyListRouting from './studylist/StudyListRouting.js' import StudyListRouting from './studylist/StudyListRouting.js'
import StandaloneRouting from './routes/StandaloneRouting.js'; import StandaloneRouting from './routes/StandaloneRouting.js'
import IHEInvokeImageDisplay from './routes/IHEInvokeImageDisplay.js'; import CallbackPage from './CallbackPage.js'
import CallbackPage from './CallbackPage.js'; import { withRouter } from 'react-router'
import { Route, Switch } from 'react-router-dom'
import { connect } from 'react-redux'
import { ViewerbaseDragDropContext } from 'react-viewerbase'
import './OHIFStandaloneViewer.css'; import './OHIFStandaloneViewer.css'
import './variables.css'; import './variables.css'
import './theme-tide.css'; import './theme-tide.css'
const reload = () => window.location.reload(); // Dynamic Import Routes (CodeSplitting)
// const IHEInvokeImageDisplay = asyncComponent(() =>
// import('./routes/IHEInvokeImageDisplay.js')
// )
// const ViewerRouting = asyncComponent(() => import('./routes/ViewerRouting.js'))
// const StudyListRouting = asyncComponent(() =>
// import('./studylist/StudyListRouting.js')
// )
// const StandaloneRouting = asyncComponent(() =>
// import('./routes/StandaloneRouting.js')
// )
// const CallbackPage = asyncComponent(() => import('./CallbackPage.js'))
//
const reload = () => window.location.reload()
class OHIFStandaloneViewer extends Component { class OHIFStandaloneViewer extends Component {
static propTypes = { static propTypes = {
history: PropTypes.object.isRequired, history: PropTypes.object.isRequired,
user: PropTypes.object user: PropTypes.object,
}; }
componentDidMount() { componentDidMount() {
this.unlisten = this.props.history.listen((location, action) => { this.unlisten = this.props.history.listen((location, action) => {
if (this.props.setContext) { if (this.props.setContext) {
this.props.setContext(window.location.pathname); this.props.setContext(window.location.pathname)
} }
}); })
} }
componentWillUnmount() { componentWillUnmount() {
this.unlisten(); this.unlisten()
} }
render() { render() {
const { user, userManager } = this.props; const { user, userManager } = this.props
const userNotLoggedIn = userManager && (!user || user.expired); const userNotLoggedIn = userManager && (!user || user.expired)
if (userNotLoggedIn) { if (userNotLoggedIn) {
const pathname = this.props.location.pathname; const pathname = this.props.location.pathname
if (pathname !== '/callback') { if (pathname !== '/callback') {
sessionStorage.setItem('ohif-redirect-to', pathname); sessionStorage.setItem('ohif-redirect-to', pathname)
} }
return ( return (
@ -55,24 +70,20 @@ class OHIFStandaloneViewer extends Component {
/> />
<Route <Route
component={() => { component={() => {
userManager.signinRedirect(); userManager.signinRedirect()
return null; return null
}} }}
/> />
</Switch> </Switch>
); )
} }
return ( return (
<Switch> <Switch>
<Route exact path="/silent-refresh.html" onEnter={reload} /> <Route exact path="/silent-refresh.html" onEnter={reload} />
<Route exact path="/logout-redirect.html" onEnter={reload} /> <Route exact path="/logout-redirect.html" onEnter={reload} />
<Route <Route exact path="/studylist" component={StudyListRouting} />
exact
path="/studylist"
component={StudyListRouting}
/>
<Route exact path="/" component={StudyListRouting} /> <Route exact path="/" component={StudyListRouting} />
<Route exact path="/viewer" component={StandaloneRouting} /> <Route exact path="/viewer" component={StandaloneRouting} />
<Route path="/viewer/:studyInstanceUids" component={ViewerRouting} /> <Route path="/viewer/:studyInstanceUids" component={ViewerRouting} />
@ -86,21 +97,21 @@ class OHIFStandaloneViewer extends Component {
/> />
<Route render={() => <div> Sorry, this page does not exist. </div>} /> <Route render={() => <div> Sorry, this page does not exist. </div>} />
</Switch> </Switch>
); )
} }
} }
const mapStateToProps = state => { const mapStateToProps = state => {
return { return {
user: state.oidc.user user: state.oidc.user,
}; }
}; }
const ConnectedOHIFStandaloneViewer = connect( const ConnectedOHIFStandaloneViewer = connect(
mapStateToProps, mapStateToProps,
null null
)(OHIFStandaloneViewer); )(OHIFStandaloneViewer)
export default ViewerbaseDragDropContext( export default ViewerbaseDragDropContext(
withRouter(ConnectedOHIFStandaloneViewer) withRouter(ConnectedOHIFStandaloneViewer)
); )

View File

@ -0,0 +1,5 @@
export default {
webWorkerManager: {
initialize: jest.fn(),
},
}

View File

@ -0,0 +1,4 @@
const createUserManager = () => jest.fn().mockReturnValue({})
const loadUser = () => jest.fn()
export { createUserManager, loadUser }

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
}

View File

@ -1,38 +1,37 @@
import dicomParser from 'dicom-parser'; import dicomParser from 'dicom-parser'
import cornerstone from 'cornerstone-core'; import cornerstone from 'cornerstone-core'
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'; import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
import OHIF from 'ohif-core'; import OHIF from 'ohif-core'
import version from './version.js'; import version from './version.js'
import { homepage } from '../package.json';
window.info = { window.info = {
version, version,
homepage homepage: `${process.env.PUBLIC_URL}`,
}; }
// For debugging // For debugging
window.cornerstone = cornerstone; window.cornerstone = cornerstone
window.cornerstoneWADOImageLoader = cornerstoneWADOImageLoader; window.cornerstoneWADOImageLoader = cornerstoneWADOImageLoader
cornerstoneWADOImageLoader.external.cornerstone = cornerstone; cornerstoneWADOImageLoader.external.cornerstone = cornerstone
cornerstoneWADOImageLoader.external.dicomParser = dicomParser; cornerstoneWADOImageLoader.external.dicomParser = dicomParser
OHIF.user.getAccessToken = () => { OHIF.user.getAccessToken = () => {
// TODO: Get the Redux store from somewhere else // TODO: Get the Redux store from somewhere else
const state = window.store.getState(); const state = window.store.getState()
if (!state.oidc || !state.oidc.user) { if (!state.oidc || !state.oidc.user) {
return; return
} }
return state.oidc.user.access_token; return state.oidc.user.access_token
}; }
cornerstoneWADOImageLoader.configure({ cornerstoneWADOImageLoader.configure({
beforeSend: function(xhr) { beforeSend: function(xhr) {
const headers = OHIF.DICOMWeb.getAuthorizationHeader(); const headers = OHIF.DICOMWeb.getAuthorizationHeader()
if (headers.Authorization) { if (headers.Authorization) {
xhr.setRequestHeader('Authorization', headers.Authorization); xhr.setRequestHeader('Authorization', headers.Authorization)
} }
} },
}); })

View File

@ -1,19 +1,22 @@
/** /**
* Entry point index.js for development * Entry point for development and production PWA builds.
* Packaged (NPM) builds go through `index_publish.js`
*/ */
import App from './App.js'
import React from 'react'
import ReactDOM from 'react-dom'
import App from './App.js'; export { App }
import React from 'react';
import ReactDOM from 'react-dom';
export { App }; window.config = window.config || {}
const applicationDefaults = {
routerBasename: '/',
relativeWebWorkerScriptsPath: '',
}
const applicationProps = Object.assign({}, applicationDefaults, window.config)
const app = React.createElement(App, applicationProps, null)
var rootUrl = 'http://localhost:5000'; ReactDOM.render(app, document.getElementById('root'))
var routerBasename = '/';
var props = {
routerBasename: routerBasename,
rootUrl: rootUrl
};
/* /*
Example config with OIDC Example config with OIDC
@ -87,24 +90,6 @@ props.oidc = [
} }
]; */ ]; */
/* Example config without OIDC */
props.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
}
}
]
};
/*props.servers = { /*props.servers = {
"dicomWeb": [ "dicomWeb": [
{ {
@ -169,23 +154,3 @@ White labelling example
props.whiteLabelling = { props.whiteLabelling = {
logoComponent: RadicalImagingLogo() logoComponent: RadicalImagingLogo()
};*/ };*/
// Note: Run your build like this:
// REACT_APP_CONFIG=$(cat ../config-react/ccc.json) yarn start
//
// If you change the JSON config, you need to re-run the command!
const configString = process.env && process.env && process.env.REACT_APP_CONFIG;
if (configString) {
const configJSON = JSON.parse(configString);
if (configJSON.servers) {
props.servers = configJSON.servers;
}
if (configJSON.oidc) {
props.oidc = configJSON.oidc;
}
}
var app = React.createElement(App, props, null);
ReactDOM.render(app, document.getElementById('root'));

View File

@ -1,17 +0,0 @@
import IHEInvokeImageDisplay from './IHEInvokeImageDisplay.js';
import StandaloneRouting from './StandaloneRouting.js';
import ViewerRouting from './ViewerRouting.js';
export {
IHEInvokeImageDisplay,
ViewerRouting,
StandaloneRouting
};
const routes = {
IHEInvokeImageDisplay,
ViewerRouting,
StandaloneRouting
};
export default routes;

View File

@ -0,0 +1,52 @@
// https://github.com/maxmantz/redux-oidc/blob/master/docs/API.md
import { loadUser, createUserManager } from 'redux-oidc'
/**
* Creates a userManager from oidcSettings;
* loads the user into the provided redux store
*
* @param {*} store
* @param {Object} oidcSettings
* @param {string} oidcSettings.authServerUrl,
* @param {string} oidcSettings.clientId,
* @param {string} oidcSettings.authRedirectUri,
* @param {string} oidcSettings.postLogoutRedirectUri,
* @param {string} oidcSettings.responseType,
* @param {string} oidcSettings.extraQueryParams,
*/
export default function(store, oidcSettings) {
if (!store || !oidcSettings) {
return
}
const {
authServerUrl,
clientId,
authRedirectUri,
postLogoutRedirectUri,
responseType,
extraQueryParams,
} = oidcSettings
const settings = {
authority: authServerUrl,
client_id: clientId,
redirect_uri: authRedirectUri,
silent_redirect_uri: '/silent-refresh.html',
post_logout_redirect_uri: postLogoutRedirectUri,
response_type: responseType,
// Note: Request must have scope 'openid' to be considered an OpenID Connect request
scope: 'email profile openid',
automaticSilentRenew: true,
revokeAccessTokenOnSignout: true,
filterProtocolClaims: true,
loadUserInfo: true,
extraQueryParams: extraQueryParams,
}
const userManager = createUserManager(settings)
loadUser(store, userManager)
return userManager
}

View File

@ -0,0 +1,23 @@
import getUserManagerForOpenIdConnectClient from './getUserManagerForOpenIdConnectClient.js'
describe('getUserManagerForOpenIdConnectClient', () => {
it('returns undefined if store is not provided', () => {
const expectedReturnVal = undefined
const returnVal = getUserManagerForOpenIdConnectClient(undefined, {})
expect(returnVal).toEqual(expectedReturnVal)
})
it('returns undefined if oidcSettings are not provided', () => {
const expectedReturnVal = undefined
const returnVal = getUserManagerForOpenIdConnectClient({}, undefined)
expect(returnVal).toEqual(expectedReturnVal)
})
it('does not return undefined when store and oidcSettings are defined', () => {
const returnVal = getUserManagerForOpenIdConnectClient({}, {})
expect(returnVal).not.toBe(undefined)
})
})

4
src/utils/index.js Normal file
View File

@ -0,0 +1,4 @@
import getUserManagerForOpenIdConnectClient from './getUserManagerForOpenIdConnectClient.js'
import initWebWorkers from './initWebWorkers.js'
export { getUserManagerForOpenIdConnectClient, initWebWorkers }

View File

@ -0,0 +1,26 @@
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
/**
*
* @param {String} baseDirectory
* @param {String} webWorkScriptsPath
*/
export default function(baseDirectory, webWorkScriptsPath) {
const scriptsPath = `${baseDirectory}/${webWorkScriptsPath}`
const config = {
maxWebWorkers: Math.max(navigator.hardwareConcurrency - 1, 1),
startWebWorkersOnDemand: true,
webWorkerPath: `${scriptsPath}/cornerstoneWADOImageLoaderWebWorker.min.js`,
taskConfiguration: {
decodeTask: {
loadCodecsOnStartup: true,
initializeCodecsOnStartup: false,
codecsPath: `${scriptsPath}/cornerstoneWADOImageLoaderCodecs.min.js`,
usePDFJS: false,
strict: false,
},
},
}
cornerstoneWADOImageLoader.webWorkerManager.initialize(config)
}

View File

@ -0,0 +1,15 @@
import initWebWorkers from './initWebWorkers.js'
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
describe('initWebWorkers', () => {
it("initializes cornerstoneWADOImageLoader's web workers", () => {
const basePath = '/'
const relativeWebWorkerScriptsPath = ''
initWebWorkers(basePath, relativeWebWorkerScriptsPath)
expect(
cornerstoneWADOImageLoader.webWorkerManager.initialize
).toHaveBeenCalled()
})
})

View File

@ -354,7 +354,7 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-dynamic-import@7.2.0": "@babel/plugin-syntax-dynamic-import@7.2.0", "@babel/plugin-syntax-dynamic-import@^7.2.0":
version "7.2.0" version "7.2.0"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612"
integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==