Fixes for Standalone OpenID Connect usage

This commit is contained in:
Erik Ziegler committed 2019-01-24 10:22:40 +01:00
1 parent 9cc063430a
commit d961a73b6c
28 files changed
+81117 -14405

No files matched your search

+2 -2
View File
@@ -14,8 +14,8 @@
"lodash.clonedeep": "^4.5.0",
"lodash.debounce": "^4.0.8",
"moment": "^2.22.2",
"ohif-core": "^0.1.6",
"ohif-viewer": "0.0.1",
"ohif-core": "^0.1.7",
"ohif-viewer": "0.0.5",
"oidc-client": "^1.6.1",
"prop-types": "^15.6.2",
"query-string": "^6.2.0",
+22 -26
View File
@@ -6,8 +6,7 @@ import { connect } from 'react-redux';
import { ViewerbaseDragDropContext } from 'react-viewerbase';
import routes from './routes/';
import StudyListRouting from './studylist/StudyListRouting.js';
//import CallbackPage from './CallbackPage.js';'
import userManager from "./userManager.js";
import CallbackPage from './CallbackPage.js';
import './App.css';
import './variables.css';
import './theme-tide.css';
@@ -24,14 +23,10 @@ function setContext(context) {
});*/
}
function LoadingUser() {
return (<div>Loading user...</div>);
}
class App extends Component {
static propTypes = {
history: PropTypes.object.isRequired,
user: PropTypes.object
user: PropTypes.object,
}
componentDidMount() {
@@ -45,21 +40,30 @@ class App extends Component {
}
render() {
const user = this.props.user;
const { user, userManager } = this.props;
/*if (!user || user.expired) {
// TODO: redirect to OAuth page if necessary
return <Switch>
<Route path="/callback" component={CallbackPage} />
<Route exact path='/login' component={() => {
userManager.signinRedirect();
}}/>
<Route component={LoadingUser}/>
</Switch>;
}*/
const userNotLoggedIn = userManager && (!user || user.expired);
if (userNotLoggedIn) {
return (
<Switch>
<Route exact path="/silent-refresh.html" onEnter={reload} />
<Route exact path="/logout-redirect.html" onEnter={reload} />
<Route path="/callback" render={
() => <CallbackPage userManager={userManager}/>
}/>
<Route component={() => {
userManager.signinRedirect();
return null;
}}/>
</Switch>
)
}
return (
<Switch>
<Route exact path="/silent-refresh.html" onEnter={reload} />
<Route exact path="/logout-redirect.html" onEnter={reload} />
<Route
exact
path="/studylist"
@@ -87,14 +91,6 @@ class App extends Component {
path="/IHEInvokeImageDisplay"
component={IHEInvokeImageDisplay}
/>
<Route path="/silent-refresh.html" onEnter={reload} />
<Route path="/logout-redirect.html" onEnter={reload} />
<Route exact path='/login' component={() => {
userManager.signinRedirect();
}}
/>
{/*<Route path="/callback" component={CallbackPage} />*/}
<Route render={() =>
<div> Sorry, this page does not exist. </div>}
/>
+30
View File
@@ -0,0 +1,30 @@
import React, { Component } from "react";
import { CallbackComponent } from "redux-oidc";
import { withRouter } from "react-router-dom";
import PropTypes from 'prop-types';
class CallbackPage extends Component {
static propTypes = {
userManager: PropTypes.object.isRequired,
history: PropTypes.object.isRequired
}
render() {
return (
<CallbackComponent
userManager={this.props.userManager}
successCallback={() => {
this.props.history.push("/");
}}
errorCallback={error => {
//this.props.history.push("/");
throw new Error(error);
}}
>
<div>Redirecting...</div>
</CallbackComponent>
);
}
}
export default withRouter(CallbackPage);
@@ -8,7 +8,8 @@ const mapStateToProps = (state, ownProps) => {
return {
studyInstanceUid,
seriesInstanceUid
seriesInstanceUid,
displaySet
};
};
@@ -4,7 +4,8 @@ import PropTypes from 'prop-types';
class ExampleViewportPlugin extends Component {
static propTypes = {
studyInstanceUid: PropTypes.string.isRequired,
seriesInstanceUid: PropTypes.string.isRequired
seriesInstanceUid: PropTypes.string.isRequired,
displaySet: PropTypes.object
};
static defaultProps = {
@@ -16,6 +17,7 @@ class ExampleViewportPlugin extends Component {
return (<div className="ExampleViewportPlugin">
<p>StudyInstanceUid: {this.props.studyInstanceUid}</p>
<p>SeriesInstanceUid: {this.props.seriesInstanceUid}</p>
{JSON.stringify(this.props.displaySet)}
</div>
);
}
@@ -9,6 +9,7 @@ import ConnectedLayoutManager from './ConnectedLayoutManager.js';
import './ViewerMain.css';
// Attempt to fix weird undefined dep issue
cornerstoneTools.external.cornerstone = cornerstone;
cornerstoneTools.external.cornerstoneMath = cornerstoneMath;
class ViewerMain extends Component {
+63 -46
View File
@@ -1,27 +1,62 @@
import React from 'react';
import React from "react";
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import { BrowserRouter } from "react-router-dom";
import { Provider } from 'react-redux';
import { createStore, combineReducers } from 'redux';
import { loadUser, reducer as oidcReducer, OidcProvider} from 'redux-oidc';
import { loadUser, reducer as oidcReducer, OidcProvider, createUserManager } from 'redux-oidc';
import OHIF from 'ohif-core';
import OHIFCornerstoneViewportPlugin from "./connectedComponents/OHIFCornerstoneViewportPlugin/OHIFCornerstoneViewportPlugin.js";
import './config';
import ui from './redux/ui.js';
import App from './App.js';
import userManager from './userManager.js';
import ConnectedExampleViewportPlugin from './components/ConnectedExampleViewportPlugin.js';
import OHIFCornerstoneViewportPlugin from "./connectedComponents/OHIFCornerstoneViewportPlugin/OHIFCornerstoneViewportPlugin.js";
//import ConnectedExampleViewportPlugin from './components/ConnectedExampleViewportPlugin.js';
const reducers = OHIF.redux.reducers;
reducers.ui = ui;
reducers.oidc = oidcReducer;
const Icons = '/icons.svg';
const combined = combineReducers(reducers)
const store = createStore(combined);
loadUser(store, userManager);
// 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!
let config;
if (process.env.REACT_APP_CONFIG) {
config = JSON.parse(process.env.REACT_APP_CONFIG);
}
let userManager;
if (config.oidc) {
const oidcClient = config.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
};
userManager = createUserManager(settings);
loadUser(store, userManager);
}
if (config.servers) {
OHIF.utils.addServers(config.servers, store);
}
const defaultButtons = [
{
@@ -109,46 +144,28 @@ const pluginAction = OHIF.redux.actions.addPlugin({
store.dispatch(pluginAction);
const servers = {
dicomWeb: [
{
"name": "DCM4CHEE",
//"wadoUriRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/wado",
//"qidoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs",
//"wadoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs",
//"wadoUriRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/wado",
//"qidoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
//"wadoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
"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,
"logRequests": true,
"logResponses": false,
"logTiming": true,
//"auth": "admin:admin"
//"auth": "cloud:healthcare"
}
}
]
};
OHIF.utils.addServers(servers, store);
// TODO[react] Use a provider when the whole tree is React
window.store = store;
ReactDOM.render(
if (userManager) {
ReactDOM.render(
<Provider store={store}>
<OidcProvider store={store} userManager={userManager}>
<BrowserRouter>
<App/>
</BrowserRouter>
</OidcProvider>
<OidcProvider store={store} userManager={userManager}>
<BrowserRouter>
<App userManager={userManager}/>
</BrowserRouter>
</OidcProvider>
</Provider>,
document.getElementById('root')
);
);
} else {
ReactDOM.render(
<Provider store={store}>
<BrowserRouter>
<App/>
</BrowserRouter>
</Provider>,
document.getElementById('root')
);
}
-34
View File
@@ -1,34 +0,0 @@
import { createUserManager } from 'redux-oidc';
const oidcClient = {
authServerUrl: 'https://cancer.crowds-cure.org/auth/realms/dcm4che',
clientId: 'crowds-cure-cancer',
authRedirectUri: '/callback',
postLogoutRedirectUri: '/logout-redirect.html',
responseType: 'id_token token',
scope: 'email profile openid',
revokeAccessTokenOnSignout: true,
extraQueryParams: {
kc_idp_hint: 'crowds-cure-cancer-auth0-oidc',
client_id: 'crowds-cure-cancer'
}
};
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);
export default userManager;
+26841 -4666
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"index.es.js","sources":["../node_modules/@babel/runtime/helpers/classCallCheck.js","../node_modules/@babel/runtime/helpers/createClass.js","../node_modules/@babel/runtime/helpers/typeof.js","../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/inherits.js","../node_modules/@babel/runtime/helpers/defineProperty.js","../node_modules/react-router-dom/node_modules/warning/warning.js","../node_modules/object-assign/index.js","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/checkPropTypes.js","../node_modules/prop-types/factoryWithTypeCheckers.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../node_modules/warning/warning.js","../node_modules/invariant/invariant.js","../node_modules/resolve-pathname/index.js","../node_modules/value-equal/index.js","../node_modules/history/es/PathUtils.js","../node_modules/history/es/LocationUtils.js","../node_modules/history/es/createTransitionManager.js","../node_modules/history/es/DOMUtils.js","../node_modules/history/es/createBrowserHistory.js","../node_modules/history/es/createHashHistory.js","../node_modules/history/es/createMemoryHistory.js","../node_modules/react-router/node_modules/warning/warning.js","../node_modules/react-router/es/Router.js","../node_modules/react-router-dom/es/Router.js","../node_modules/react-router-dom/es/BrowserRouter.js","../node_modules/react-router-dom/es/HashRouter.js","../node_modules/react-router-dom/es/Link.js","../node_modules/react-router/es/MemoryRouter.js","../node_modules/react-router-dom/es/MemoryRouter.js","../node_modules/path-to-regexp/node_modules/isarray/index.js","../node_modules/path-to-regexp/index.js","../node_modules/react-router/es/matchPath.js","../node_modules/react-router/es/Route.js","../node_modules/react-router-dom/es/Route.js","../node_modules/react-router-dom/es/NavLink.js","../node_modules/react-router/es/Prompt.js","../node_modules/react-router-dom/es/Prompt.js","../node_modules/react-router/es/generatePath.js","../node_modules/react-router/es/Redirect.js","../node_modules/react-router-dom/es/Redirect.js","../node_modules/react-router/es/StaticRouter.js","../node_modules/react-router-dom/es/StaticRouter.js","../node_modules/react-router/es/Switch.js","../node_modules/react-router-dom/es/Switch.js","../node_modules/react-router-dom/es/generatePath.js","../node_modules/react-router-dom/es/matchPath.js","../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-router/es/withRouter.js","../node_modules/react-router-dom/es/withRouter.js","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/react-redux/es/components/Context.js","../node_modules/react-redux/es/components/Provider.js","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-is/cjs/react-is.development.js","../node_modules/react-is/index.js","../node_modules/react-redux/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-redux/es/components/connectAdvanced.js","../node_modules/react-redux/es/utils/shallowEqual.js","../node_modules/symbol-observable/es/ponyfill.js","../node_modules/symbol-observable/es/index.js","../node_modules/redux/es/redux.js","../node_modules/react-redux/es/utils/isPlainObject.js","../node_modules/react-redux/es/utils/warning.js","../node_modules/react-redux/es/utils/verifyPlainObject.js","../node_modules/react-redux/es/connect/wrapMapToProps.js","../node_modules/react-redux/es/connect/mapDispatchToProps.js","../node_modules/react-redux/es/connect/mapStateToProps.js","../node_modules/react-redux/es/connect/mergeProps.js","../node_modules/react-redux/es/connect/verifySubselectors.js","../node_modules/react-redux/es/connect/selectorFactory.js","../node_modules/react-redux/es/connect/connect.js","../../ohif-core/dist/index.es.js","../node_modules/dicom-parser/dist/dicomParser.min.js","../node_modules/cornerstone-core/dist/cornerstone.js","../node_modules/cornerstone-wado-image-loader/dist/cornerstoneWADOImageLoader.min.js","../node_modules/cornerstone-math/dist/cornerstoneMath.min.js","../node_modules/cornerstone-tools/dist/cornerstoneTools.min.js","../node_modules/hammerjs/hammer.js","../src/config.js","../src/redux/ui.js","../../react-viewerbase/dist/index.es.js","../node_modules/style-inject/dist/style-inject.es.js","../src/components/Header/Header.js","../node_modules/lodash.clonedeep/index.js","../src/connectedComponents/ConnectedStudyBrowser.js","../src/coLine truncated
{"version":3,"file":"index.es.js","sources":["../node_modules/@babel/runtime/helpers/classCallCheck.js","../node_modules/@babel/runtime/helpers/createClass.js","../node_modules/@babel/runtime/helpers/typeof.js","../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/inherits.js","../node_modules/@babel/runtime/helpers/defineProperty.js","../node_modules/react-router-dom/node_modules/warning/warning.js","../node_modules/object-assign/index.js","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/checkPropTypes.js","../node_modules/prop-types/factoryWithTypeCheckers.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../node_modules/warning/warning.js","../node_modules/invariant/invariant.js","../node_modules/resolve-pathname/index.js","../node_modules/value-equal/index.js","../node_modules/history/es/PathUtils.js","../node_modules/history/es/LocationUtils.js","../node_modules/history/es/createTransitionManager.js","../node_modules/history/es/DOMUtils.js","../node_modules/history/es/createBrowserHistory.js","../node_modules/history/es/createHashHistory.js","../node_modules/history/es/createMemoryHistory.js","../node_modules/react-router/node_modules/warning/warning.js","../node_modules/react-router/es/Router.js","../node_modules/react-router-dom/es/Router.js","../node_modules/react-router-dom/es/BrowserRouter.js","../node_modules/react-router-dom/es/HashRouter.js","../node_modules/react-router-dom/es/Link.js","../node_modules/react-router/es/MemoryRouter.js","../node_modules/react-router-dom/es/MemoryRouter.js","../node_modules/path-to-regexp/node_modules/isarray/index.js","../node_modules/path-to-regexp/index.js","../node_modules/react-router/es/matchPath.js","../node_modules/react-router/es/Route.js","../node_modules/react-router-dom/es/Route.js","../node_modules/react-router-dom/es/NavLink.js","../node_modules/react-router/es/Prompt.js","../node_modules/react-router-dom/es/Prompt.js","../node_modules/react-router/es/generatePath.js","../node_modules/react-router/es/Redirect.js","../node_modules/react-router-dom/es/Redirect.js","../node_modules/react-router/es/StaticRouter.js","../node_modules/react-router-dom/es/StaticRouter.js","../node_modules/react-router/es/Switch.js","../node_modules/react-router-dom/es/Switch.js","../node_modules/react-router-dom/es/generatePath.js","../node_modules/react-router-dom/es/matchPath.js","../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-router/es/withRouter.js","../node_modules/react-router-dom/es/withRouter.js","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/react-redux/es/components/Context.js","../node_modules/react-redux/es/components/Provider.js","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-is/cjs/react-is.development.js","../node_modules/react-is/index.js","../node_modules/react-redux/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-redux/es/components/connectAdvanced.js","../node_modules/react-redux/es/utils/shallowEqual.js","../node_modules/symbol-observable/es/ponyfill.js","../node_modules/symbol-observable/es/index.js","../node_modules/redux/es/redux.js","../node_modules/react-redux/es/utils/isPlainObject.js","../node_modules/react-redux/es/utils/warning.js","../node_modules/react-redux/es/utils/verifyPlainObject.js","../node_modules/react-redux/es/connect/wrapMapToProps.js","../node_modules/react-redux/es/connect/mapDispatchToProps.js","../node_modules/react-redux/es/connect/mapStateToProps.js","../node_modules/react-redux/es/connect/mergeProps.js","../node_modules/react-redux/es/connect/verifySubselectors.js","../node_modules/react-redux/es/connect/selectorFactory.js","../node_modules/react-redux/es/connect/connect.js","../../ohif-core/dist/index.es.js","../node_modules/dicom-parser/dist/dicomParser.min.js","../node_modules/cornerstone-core/dist/cornerstone.js","../node_modules/cornerstone-wado-image-loader/dist/cornerstoneWADOImageLoader.min.js","../node_modules/cornerstone-math/dist/cornerstoneMath.min.js","../node_modules/cornerstone-tools/dist/cornerstoneTools.min.js","../node_modules/hammerjs/hammer.js","../src/config.js","../src/redux/ui.js","../node_modules/react-viewerbase/dist/index.es.js","../node_modules/style-inject/dist/style-inject.es.js","../src/components/Header/Header.js","../node_modules/lodash.clonedeep/index.js","../src/connectedComponents/ConnectedStudyBrowser.js",Line truncated
+26841 -4666
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"index.js","sources":["../node_modules/@babel/runtime/helpers/classCallCheck.js","../node_modules/@babel/runtime/helpers/createClass.js","../node_modules/@babel/runtime/helpers/typeof.js","../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/inherits.js","../node_modules/@babel/runtime/helpers/defineProperty.js","../node_modules/react-router-dom/node_modules/warning/warning.js","../node_modules/object-assign/index.js","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/checkPropTypes.js","../node_modules/prop-types/factoryWithTypeCheckers.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../node_modules/warning/warning.js","../node_modules/invariant/invariant.js","../node_modules/resolve-pathname/index.js","../node_modules/value-equal/index.js","../node_modules/history/es/PathUtils.js","../node_modules/history/es/LocationUtils.js","../node_modules/history/es/createTransitionManager.js","../node_modules/history/es/DOMUtils.js","../node_modules/history/es/createBrowserHistory.js","../node_modules/history/es/createHashHistory.js","../node_modules/history/es/createMemoryHistory.js","../node_modules/react-router/node_modules/warning/warning.js","../node_modules/react-router/es/Router.js","../node_modules/react-router-dom/es/Router.js","../node_modules/react-router-dom/es/BrowserRouter.js","../node_modules/react-router-dom/es/HashRouter.js","../node_modules/react-router-dom/es/Link.js","../node_modules/react-router/es/MemoryRouter.js","../node_modules/react-router-dom/es/MemoryRouter.js","../node_modules/path-to-regexp/node_modules/isarray/index.js","../node_modules/path-to-regexp/index.js","../node_modules/react-router/es/matchPath.js","../node_modules/react-router/es/Route.js","../node_modules/react-router-dom/es/Route.js","../node_modules/react-router-dom/es/NavLink.js","../node_modules/react-router/es/Prompt.js","../node_modules/react-router-dom/es/Prompt.js","../node_modules/react-router/es/generatePath.js","../node_modules/react-router/es/Redirect.js","../node_modules/react-router-dom/es/Redirect.js","../node_modules/react-router/es/StaticRouter.js","../node_modules/react-router-dom/es/StaticRouter.js","../node_modules/react-router/es/Switch.js","../node_modules/react-router-dom/es/Switch.js","../node_modules/react-router-dom/es/generatePath.js","../node_modules/react-router-dom/es/matchPath.js","../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-router/es/withRouter.js","../node_modules/react-router-dom/es/withRouter.js","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/react-redux/es/components/Context.js","../node_modules/react-redux/es/components/Provider.js","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-is/cjs/react-is.development.js","../node_modules/react-is/index.js","../node_modules/react-redux/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-redux/es/components/connectAdvanced.js","../node_modules/react-redux/es/utils/shallowEqual.js","../node_modules/symbol-observable/es/ponyfill.js","../node_modules/symbol-observable/es/index.js","../node_modules/redux/es/redux.js","../node_modules/react-redux/es/utils/isPlainObject.js","../node_modules/react-redux/es/utils/warning.js","../node_modules/react-redux/es/utils/verifyPlainObject.js","../node_modules/react-redux/es/connect/wrapMapToProps.js","../node_modules/react-redux/es/connect/mapDispatchToProps.js","../node_modules/react-redux/es/connect/mapStateToProps.js","../node_modules/react-redux/es/connect/mergeProps.js","../node_modules/react-redux/es/connect/verifySubselectors.js","../node_modules/react-redux/es/connect/selectorFactory.js","../node_modules/react-redux/es/connect/connect.js","../../ohif-core/dist/index.es.js","../node_modules/dicom-parser/dist/dicomParser.min.js","../node_modules/cornerstone-core/dist/cornerstone.js","../node_modules/cornerstone-wado-image-loader/dist/cornerstoneWADOImageLoader.min.js","../node_modules/cornerstone-math/dist/cornerstoneMath.min.js","../node_modules/cornerstone-tools/dist/cornerstoneTools.min.js","../node_modules/hammerjs/hammer.js","../src/config.js","../src/redux/ui.js","../../react-viewerbase/dist/index.es.js","../node_modules/style-inject/dist/style-inject.es.js","../src/components/Header/Header.js","../node_modules/lodash.clonedeep/index.js","../src/connectedComponents/ConnectedStudyBrowser.js","../src/conneLine truncated
{"version":3,"file":"index.js","sources":["../node_modules/@babel/runtime/helpers/classCallCheck.js","../node_modules/@babel/runtime/helpers/createClass.js","../node_modules/@babel/runtime/helpers/typeof.js","../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/inherits.js","../node_modules/@babel/runtime/helpers/defineProperty.js","../node_modules/react-router-dom/node_modules/warning/warning.js","../node_modules/object-assign/index.js","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/checkPropTypes.js","../node_modules/prop-types/factoryWithTypeCheckers.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../node_modules/warning/warning.js","../node_modules/invariant/invariant.js","../node_modules/resolve-pathname/index.js","../node_modules/value-equal/index.js","../node_modules/history/es/PathUtils.js","../node_modules/history/es/LocationUtils.js","../node_modules/history/es/createTransitionManager.js","../node_modules/history/es/DOMUtils.js","../node_modules/history/es/createBrowserHistory.js","../node_modules/history/es/createHashHistory.js","../node_modules/history/es/createMemoryHistory.js","../node_modules/react-router/node_modules/warning/warning.js","../node_modules/react-router/es/Router.js","../node_modules/react-router-dom/es/Router.js","../node_modules/react-router-dom/es/BrowserRouter.js","../node_modules/react-router-dom/es/HashRouter.js","../node_modules/react-router-dom/es/Link.js","../node_modules/react-router/es/MemoryRouter.js","../node_modules/react-router-dom/es/MemoryRouter.js","../node_modules/path-to-regexp/node_modules/isarray/index.js","../node_modules/path-to-regexp/index.js","../node_modules/react-router/es/matchPath.js","../node_modules/react-router/es/Route.js","../node_modules/react-router-dom/es/Route.js","../node_modules/react-router-dom/es/NavLink.js","../node_modules/react-router/es/Prompt.js","../node_modules/react-router-dom/es/Prompt.js","../node_modules/react-router/es/generatePath.js","../node_modules/react-router/es/Redirect.js","../node_modules/react-router-dom/es/Redirect.js","../node_modules/react-router/es/StaticRouter.js","../node_modules/react-router-dom/es/StaticRouter.js","../node_modules/react-router/es/Switch.js","../node_modules/react-router-dom/es/Switch.js","../node_modules/react-router-dom/es/generatePath.js","../node_modules/react-router-dom/es/matchPath.js","../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-router/es/withRouter.js","../node_modules/react-router-dom/es/withRouter.js","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/react-redux/es/components/Context.js","../node_modules/react-redux/es/components/Provider.js","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-is/cjs/react-is.development.js","../node_modules/react-is/index.js","../node_modules/react-redux/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-redux/es/components/connectAdvanced.js","../node_modules/react-redux/es/utils/shallowEqual.js","../node_modules/symbol-observable/es/ponyfill.js","../node_modules/symbol-observable/es/index.js","../node_modules/redux/es/redux.js","../node_modules/react-redux/es/utils/isPlainObject.js","../node_modules/react-redux/es/utils/warning.js","../node_modules/react-redux/es/utils/verifyPlainObject.js","../node_modules/react-redux/es/connect/wrapMapToProps.js","../node_modules/react-redux/es/connect/mapDispatchToProps.js","../node_modules/react-redux/es/connect/mapStateToProps.js","../node_modules/react-redux/es/connect/mergeProps.js","../node_modules/react-redux/es/connect/verifySubselectors.js","../node_modules/react-redux/es/connect/selectorFactory.js","../node_modules/react-redux/es/connect/connect.js","../../ohif-core/dist/index.es.js","../node_modules/dicom-parser/dist/dicomParser.min.js","../node_modules/cornerstone-core/dist/cornerstone.js","../node_modules/cornerstone-wado-image-loader/dist/cornerstoneWADOImageLoader.min.js","../node_modules/cornerstone-math/dist/cornerstoneMath.min.js","../node_modules/cornerstone-tools/dist/cornerstoneTools.min.js","../node_modules/hammerjs/hammer.js","../src/config.js","../src/redux/ui.js","../node_modules/react-viewerbase/dist/index.es.js","../node_modules/style-inject/dist/style-inject.es.js","../src/components/Header/Header.js","../node_modules/lodash.clonedeep/index.js","../src/connectedComponents/ConnectedStudyBrowser.js","..Line truncated
+26841 -4666
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"index.umd.js","sources":["../node_modules/@babel/runtime/helpers/classCallCheck.js","../node_modules/@babel/runtime/helpers/createClass.js","../node_modules/@babel/runtime/helpers/typeof.js","../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/inherits.js","../node_modules/@babel/runtime/helpers/defineProperty.js","../node_modules/react-router-dom/node_modules/warning/warning.js","../node_modules/object-assign/index.js","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/checkPropTypes.js","../node_modules/prop-types/factoryWithTypeCheckers.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../node_modules/warning/warning.js","../node_modules/invariant/invariant.js","../node_modules/resolve-pathname/index.js","../node_modules/value-equal/index.js","../node_modules/history/es/PathUtils.js","../node_modules/history/es/LocationUtils.js","../node_modules/history/es/createTransitionManager.js","../node_modules/history/es/DOMUtils.js","../node_modules/history/es/createBrowserHistory.js","../node_modules/history/es/createHashHistory.js","../node_modules/history/es/createMemoryHistory.js","../node_modules/react-router/node_modules/warning/warning.js","../node_modules/react-router/es/Router.js","../node_modules/react-router-dom/es/Router.js","../node_modules/react-router-dom/es/BrowserRouter.js","../node_modules/react-router-dom/es/HashRouter.js","../node_modules/react-router-dom/es/Link.js","../node_modules/react-router/es/MemoryRouter.js","../node_modules/react-router-dom/es/MemoryRouter.js","../node_modules/path-to-regexp/node_modules/isarray/index.js","../node_modules/path-to-regexp/index.js","../node_modules/react-router/es/matchPath.js","../node_modules/react-router/es/Route.js","../node_modules/react-router-dom/es/Route.js","../node_modules/react-router-dom/es/NavLink.js","../node_modules/react-router/es/Prompt.js","../node_modules/react-router-dom/es/Prompt.js","../node_modules/react-router/es/generatePath.js","../node_modules/react-router/es/Redirect.js","../node_modules/react-router-dom/es/Redirect.js","../node_modules/react-router/es/StaticRouter.js","../node_modules/react-router-dom/es/StaticRouter.js","../node_modules/react-router/es/Switch.js","../node_modules/react-router-dom/es/Switch.js","../node_modules/react-router-dom/es/generatePath.js","../node_modules/react-router-dom/es/matchPath.js","../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-router/es/withRouter.js","../node_modules/react-router-dom/es/withRouter.js","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/react-redux/es/components/Context.js","../node_modules/react-redux/es/components/Provider.js","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-is/cjs/react-is.development.js","../node_modules/react-is/index.js","../node_modules/react-redux/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-redux/es/components/connectAdvanced.js","../node_modules/react-redux/es/utils/shallowEqual.js","../node_modules/symbol-observable/es/ponyfill.js","../node_modules/symbol-observable/es/index.js","../node_modules/redux/es/redux.js","../node_modules/react-redux/es/utils/isPlainObject.js","../node_modules/react-redux/es/utils/warning.js","../node_modules/react-redux/es/utils/verifyPlainObject.js","../node_modules/react-redux/es/connect/wrapMapToProps.js","../node_modules/react-redux/es/connect/mapDispatchToProps.js","../node_modules/react-redux/es/connect/mapStateToProps.js","../node_modules/react-redux/es/connect/mergeProps.js","../node_modules/react-redux/es/connect/verifySubselectors.js","../node_modules/react-redux/es/connect/selectorFactory.js","../node_modules/react-redux/es/connect/connect.js","../../ohif-core/dist/index.es.js","../node_modules/dicom-parser/dist/dicomParser.min.js","../node_modules/cornerstone-core/dist/cornerstone.js","../node_modules/cornerstone-wado-image-loader/dist/cornerstoneWADOImageLoader.min.js","../node_modules/cornerstone-math/dist/cornerstoneMath.min.js","../node_modules/cornerstone-tools/dist/cornerstoneTools.min.js","../node_modules/hammerjs/hammer.js","../src/config.js","../src/redux/ui.js","../../react-viewerbase/dist/index.es.js","../node_modules/style-inject/dist/style-inject.es.js","../src/components/Header/Header.js","../node_modules/lodash.clonedeep/index.js","../src/connectedComponents/ConnectedStudyBrowser.js","../src/cLine truncated
{"version":3,"file":"index.umd.js","sources":["../node_modules/@babel/runtime/helpers/classCallCheck.js","../node_modules/@babel/runtime/helpers/createClass.js","../node_modules/@babel/runtime/helpers/typeof.js","../node_modules/@babel/runtime/helpers/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","../node_modules/@babel/runtime/helpers/getPrototypeOf.js","../node_modules/@babel/runtime/helpers/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/inherits.js","../node_modules/@babel/runtime/helpers/defineProperty.js","../node_modules/react-router-dom/node_modules/warning/warning.js","../node_modules/object-assign/index.js","../node_modules/prop-types/lib/ReactPropTypesSecret.js","../node_modules/prop-types/checkPropTypes.js","../node_modules/prop-types/factoryWithTypeCheckers.js","../node_modules/prop-types/factoryWithThrowingShims.js","../node_modules/prop-types/index.js","../node_modules/warning/warning.js","../node_modules/invariant/invariant.js","../node_modules/resolve-pathname/index.js","../node_modules/value-equal/index.js","../node_modules/history/es/PathUtils.js","../node_modules/history/es/LocationUtils.js","../node_modules/history/es/createTransitionManager.js","../node_modules/history/es/DOMUtils.js","../node_modules/history/es/createBrowserHistory.js","../node_modules/history/es/createHashHistory.js","../node_modules/history/es/createMemoryHistory.js","../node_modules/react-router/node_modules/warning/warning.js","../node_modules/react-router/es/Router.js","../node_modules/react-router-dom/es/Router.js","../node_modules/react-router-dom/es/BrowserRouter.js","../node_modules/react-router-dom/es/HashRouter.js","../node_modules/react-router-dom/es/Link.js","../node_modules/react-router/es/MemoryRouter.js","../node_modules/react-router-dom/es/MemoryRouter.js","../node_modules/path-to-regexp/node_modules/isarray/index.js","../node_modules/path-to-regexp/index.js","../node_modules/react-router/es/matchPath.js","../node_modules/react-router/es/Route.js","../node_modules/react-router-dom/es/Route.js","../node_modules/react-router-dom/es/NavLink.js","../node_modules/react-router/es/Prompt.js","../node_modules/react-router-dom/es/Prompt.js","../node_modules/react-router/es/generatePath.js","../node_modules/react-router/es/Redirect.js","../node_modules/react-router-dom/es/Redirect.js","../node_modules/react-router/es/StaticRouter.js","../node_modules/react-router-dom/es/StaticRouter.js","../node_modules/react-router/es/Switch.js","../node_modules/react-router-dom/es/Switch.js","../node_modules/react-router-dom/es/generatePath.js","../node_modules/react-router-dom/es/matchPath.js","../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-router/es/withRouter.js","../node_modules/react-router-dom/es/withRouter.js","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/react-redux/es/components/Context.js","../node_modules/react-redux/es/components/Provider.js","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-is/cjs/react-is.development.js","../node_modules/react-is/index.js","../node_modules/react-redux/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react-redux/es/components/connectAdvanced.js","../node_modules/react-redux/es/utils/shallowEqual.js","../node_modules/symbol-observable/es/ponyfill.js","../node_modules/symbol-observable/es/index.js","../node_modules/redux/es/redux.js","../node_modules/react-redux/es/utils/isPlainObject.js","../node_modules/react-redux/es/utils/warning.js","../node_modules/react-redux/es/utils/verifyPlainObject.js","../node_modules/react-redux/es/connect/wrapMapToProps.js","../node_modules/react-redux/es/connect/mapDispatchToProps.js","../node_modules/react-redux/es/connect/mapStateToProps.js","../node_modules/react-redux/es/connect/mergeProps.js","../node_modules/react-redux/es/connect/verifySubselectors.js","../node_modules/react-redux/es/connect/selectorFactory.js","../node_modules/react-redux/es/connect/connect.js","../../ohif-core/dist/index.es.js","../node_modules/dicom-parser/dist/dicomParser.min.js","../node_modules/cornerstone-core/dist/cornerstone.js","../node_modules/cornerstone-wado-image-loader/dist/cornerstoneWADOImageLoader.min.js","../node_modules/cornerstone-math/dist/cornerstoneMath.min.js","../node_modules/cornerstone-tools/dist/cornerstoneTools.min.js","../node_modules/hammerjs/hammer.js","../src/config.js","../src/redux/ui.js","../node_modules/react-viewerbase/dist/index.es.js","../node_modules/style-inject/dist/style-inject.es.js","../src/components/Header/Header.js","../node_modules/lodash.clonedeep/index.js","../src/connectedComponents/ConnectedStudyBrowser.js"Line truncated
+66 -14
View File
@@ -51,35 +51,89 @@
window.process = process;
</script>
<script src="https://unpkg.com/ohif-viewer/dist/index.umd.js" crossorigin></script>
<!--<script src="http://localhost:3000/dist/index.umd.js" crossorigin></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>
'use strict';
// TODO: Add viewer config here
var routerBasename = 'http://localhost:5000';
var props = {
routerBasename: window.location.pathname
routerBasename: routerBasename
};
/*
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
/*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
}
}
]
};
OAuth settings
DICOMWeb servers
props.oidc = [{
"authServerUrl": "https://cancer.crowds-cure.org/auth/realms/dcm4che",
"authRedirectUri": routerBasename + '/callback',
"postLogoutRedirectUri": routerBasename + '/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"
}
}];*/
/* 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://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/wado",
"qidoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
"wadoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
"qidoSupportsIncludeField": true,
"imageRendering": "wadors",
"thumbnailRendering": "wadors",
"requestOptions": {
"requestFromBrowser": true,
"auth": "cloud:healthcare"
}
}
]
};
/*
UI settings
Plugins
- Custom tools / buttons
- Custom Sidebar module thing
- Custom Viewports
- Custom Sop Class Interpreters
*/
base url path
"ROOT_URL": "http://localhost:3000",
"PUBLIC_SETTINGS": {
"verifyEmail": false,
/*"PUBLIC_SETTINGS": {
"ui": {
"studyListFunctionsEnabled": true,
"leftSidebarOpen": false,
@@ -94,8 +148,6 @@
*/
// 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);
@@ -8,6 +8,7 @@
"serve": "^10.1.1"
},
"scripts": {
"start": "serve ."
"prepare": "mkdir -p deps && cp node_modules/ohif-viewer/dist/index.umd.* deps/",
"start": "yarn run prepare && serve -s ."
}
}
+2 -3
View File
@@ -1,6 +1,6 @@
{
"name": "ohif-viewer",
"version": "0.0.4",
"version": "0.0.5",
"description": "OHIF Viewer",
"author": "OHIF Contributors",
"license": "MIT",
@@ -9,7 +9,6 @@
"browser": "dist/index.umd.js",
"module": "dist/index.es.js",
"jsnext:main": "dist/index.es.js",
"homepage": "http://localhost:3000",
"engines": {
"node": ">=8",
"npm": ">=5"
@@ -94,7 +93,7 @@
"dicom-parser": "^1.8.3",
"hammerjs": "^2.0.8",
"lodash.isequal": "^4.5.0",
"ohif-core": "^0.1.6",
"ohif-core": "^0.1.7",
"oidc-client": "^1.6.1",
"prop-types": "^15.6.2",
"react-bootstrap-modal": "^4.2.0",
+6 -3
View File
@@ -43,7 +43,6 @@ export default {
}
],
plugins: [
builtins(),
external(),
postcss({
modules: false
@@ -59,8 +58,12 @@ export default {
commonjs({
include: 'node_modules/**',
namedExports: {
'node_modules/react-is/index.js': ['isValidElementType']
'node_modules/react-is/index.js': ['isValidElementType'],
'node_modules/redux-oidc/dist/redux-oidc.js': [
'reducer', 'CallbackComponent', 'loadUser', 'OidcProvider', 'createUserManager'
]
}
})
}),
builtins(),
]
}
+95 -43
View File
@@ -6,23 +6,29 @@ import { createStore, combineReducers } from 'redux';
import PropTypes from 'prop-types';
import OHIF from 'ohif-core';
import './config';
import ui from './redux/ui.js'
import ui from './redux/ui.js';
import OHIFStandaloneViewer from './OHIFStandaloneViewer';
import OHIFCornerstoneViewportPlugin from './connectedComponents/OHIFCornerstoneViewportPlugin/OHIFCornerstoneViewportPlugin.js';
//import { loadUser, reducer as oidcReducer, OidcProvider} from 'redux-oidc';
//import userManager from './userManager.js';
import {
loadUser,
OidcProvider,
createUserManager,
reducer as oidcReducer
} from 'redux-oidc';
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
//import Icons from "./images/icons.svg"
const Icons = 'icons.svg';
const Icons = '/icons.svg';
const reducers = OHIF.redux.reducers;
reducers.ui = ui;
//reducers.oidc = oidcReducer;
reducers.oidc = oidcReducer;
const combined = combineReducers(reducers)
const combined = combineReducers(reducers);
const store = createStore(combined);
//loadUser(store, userManager);
const defaultButtons = [
{
@@ -87,7 +93,7 @@ const defaultButtons = [
text: 'Reset',
svgUrl: `${Icons}#icon-tools-reset`,
active: false
},
}
];
const buttonsAction = OHIF.redux.actions.setAvailableButtons(defaultButtons);
@@ -102,52 +108,98 @@ const pluginAction = OHIF.redux.actions.addPlugin({
store.dispatch(pluginAction);
const servers = {
dicomWeb: [
{
"name": "DCM4CHEE",
//"wadoUriRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/wado",
//"qidoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs",
//"wadoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs",
//"wadoUriRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/wado",
//"qidoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
//"wadoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
"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,
"logRequests": true,
"logResponses": false,
"logTiming": true,
//"auth": "admin:admin"
//"auth": "cloud:healthcare"
}
}
]
};
OHIF.utils.addServers(servers, store);
// TODO[react] Use a provider when the whole tree is React
window.store = store;
function handleServers(servers) {
if (servers) {
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);
}
class App extends Component {
static propTypes = {
servers: PropTypes.array,
oidc: PropTypes.array,
routerBasename: PropTypes.string
};
constructor(props) {
super(props);
this.userManager = handleOIDC(this.props.oidc);
handleServers(this.props.servers);
handleWebWorkerInit(this.props.routerBasename);
}
render() {
const userManager = this.userManager;
if (userManager) {
return (
<Provider store={store}>
<OidcProvider store={store} userManager={userManager}>
<BrowserRouter>
<OHIFStandaloneViewer userManager={userManager} />
</BrowserRouter>
</OidcProvider>
</Provider>
);
}
return (
<Provider store={store}>
{/*<OidcProvider store={store} userManager={userManager}>*/}
<BrowserRouter basename={this.props.routerBasename}>
<OHIFStandaloneViewer/>
</BrowserRouter>
{/*</OidcProvider>*/}
<BrowserRouter>
<OHIFStandaloneViewer />
</BrowserRouter>
</Provider>
);
}
+26 -22
View File
@@ -1,29 +1,33 @@
import React, { Component } from "react";
import { CallbackComponent } from "redux-oidc";
import { withRouter } from "react-router-dom";
import React, { Component } from 'react';
import { withRouter } from 'react-router-dom';
import PropTypes from 'prop-types';
import userManager from "./userManager";
import { CallbackComponent } from 'redux-oidc';
class CallbackPage extends Component {
static propTypes = {
history: PropTypes.object
}
static propTypes = {
userManager: PropTypes.object.isRequired,
history: PropTypes.object.isRequired
};
render() {
// just redirect to '/' in both cases
return (
<CallbackComponent
userManager={userManager}
successCallback={() => this.props.history.push("/")}
errorCallback={error => {
this.props.history.push("/");
throw new Error(error);
}}
>
<div>Redirecting...</div>
</CallbackComponent>
);
}
render() {
return (
<CallbackComponent
userManager={this.props.userManager}
successCallback={() => {
const pathname = sessionStorage.getItem('ohif-redirect-to');
debugger;
this.props.history.push(pathname);
}}
errorCallback={error => {
this.props.history.push('/');
throw new Error(error);
}}
>
<div>Redirecting...</div>
</CallbackComponent>
);
}
}
export default withRouter(CallbackPage);
@@ -4,103 +4,98 @@ import { withRouter } from 'react-router';
import { Route, Switch } from 'react-router-dom';
import { connect } from 'react-redux';
import { ViewerbaseDragDropContext } from 'react-viewerbase';
import ViewerRouting from "./routes/ViewerRouting.js";
import ViewerRouting from './routes/ViewerRouting.js';
import StandaloneRouting from './routes/StandaloneRouting.js';
import IHEInvokeImageDisplay from './routes/IHEInvokeImageDisplay.js';
//import CallbackPage from './CallbackPage.js';
//import userManager from "./userManager.js";
import CallbackPage from './CallbackPage.js';
import './OHIFStandaloneViewer.css';
import './variables.css';
import './theme-tide.css';
const reload = () => window.location.reload();
/*function LoadingUser() {
return (<div>Loading user...</div>);
}*/
class OHIFStandaloneViewer extends Component {
static propTypes = {
history: PropTypes.object.isRequired,
user: PropTypes.object
};
class App extends Component {
static propTypes = {
history: PropTypes.object.isRequired,
user: PropTypes.object
componentDidMount() {
this.unlisten = this.props.history.listen((location, action) => {
if (this.props.setContext) {
this.props.setContext(window.location.pathname);
}
});
}
componentWillUnmount() {
this.unlisten();
}
render() {
const { user, userManager } = this.props;
const userNotLoggedIn = userManager && (!user || user.expired);
if (userNotLoggedIn) {
debugger;
const pathname = this.props.location.pathname;
if (pathname !== '/callback') {
sessionStorage.setItem('ohif-redirect-to', pathname);
}
return (
<Switch>
<Route exact path="/silent-refresh.html" onEnter={reload} />
<Route exact path="/logout-redirect.html" onEnter={reload} />
<Route
path="/callback"
render={() => <CallbackPage userManager={userManager} />}
/>
<Route
component={() => {
userManager.signinRedirect();
return null;
}}
/>
</Switch>
);
}
componentDidMount() {
this.unlisten = this.props.history.listen((location, action) => {
if (this.props.setContext) {
this.props.setContext(window.location.pathname);
}
});
}
componentWillUnmount() {
this.unlisten();
}
render() {
const user = this.props.user;
/*if (!user || user.expired) {
// TODO: redirect to OAuth page if necessary
return <Switch>
<Route path="/callback" component={CallbackPage} />
<Route exact path='/login' component={() => {
userManager.signinRedirect();
}}/>
<Route component={LoadingUser}/>
</Switch>;
}*/
return (
<Switch>
<Route
exact
path="/"
component={StandaloneRouting}
/>
<Route
exact
path="/viewer"
component={StandaloneRouting}
/>
<Route
path="/viewer/:studyInstanceUids"
component={ViewerRouting}
/>
<Route
path="/study/:studyInstanceUid/series/:seriesInstanceUids"
component={ViewerRouting}
/>
<Route
path="/IHEInvokeImageDisplay"
component={IHEInvokeImageDisplay}
/>
<Route path="/silent-refresh.html" onEnter={reload} />
<Route path="/logout-redirect.html" onEnter={reload} />
{/*<Route exact path='/login' component={() => {
userManager.signinRedirect();
}}
/>*/
/*<Route path="/callback" component={CallbackPage} />*/}
<Route render={() =>
<div> Sorry, this page does not exist. </div>}
/>
</Switch>
);
}
return (
<Switch>
<Route exact path="/silent-refresh.html" onEnter={reload} />
<Route exact path="/logout-redirect.html" onEnter={reload} />
<Route exact path="/" component={StandaloneRouting} />
<Route exact path="/viewer" component={StandaloneRouting} />
<Route path="/viewer/:studyInstanceUids" component={ViewerRouting} />
<Route
path="/study/:studyInstanceUid/series/:seriesInstanceUids"
component={ViewerRouting}
/>
<Route
path="/IHEInvokeImageDisplay"
component={IHEInvokeImageDisplay}
/>
<Route render={() => <div> Sorry, this page does not exist. </div>} />
</Switch>
);
}
}
const mapStateToProps = state => {
return {};
/*return {
user: state.oidc.user,
};*/
return {
user: state.oidc.user
};
};
const ConnectedApp = connect(
mapStateToProps,
null
)(App);
const ConnectedOHIFStandaloneViewer = connect(
mapStateToProps,
null
)(OHIFStandaloneViewer);
export default ViewerbaseDragDropContext(withRouter(ConnectedApp));
export default ViewerbaseDragDropContext(
withRouter(ConnectedOHIFStandaloneViewer)
);
+14 -37
View File
@@ -7,12 +7,10 @@ import Hammer from 'hammerjs';
import OHIF from 'ohif-core';
//import sha from './sha.js';
//import version from './version.js';
import { homepage } from '../package.json';
window.info = {
//sha,
//sha,
//version,
homepage
};
// For debugging
@@ -33,51 +31,30 @@ OHIF.external.cornerstoneTools = cornerstoneTools;
OHIF.external.cornerstoneMath = cornerstoneMath;
OHIF.external.cornerstoneWADOImageLoader = cornerstoneWADOImageLoader;
// TODO: Is there a better way to guess ROOT_URL?
let ROOT_URL = window.location.pathname;
OHIF.user.getAccessToken = () => {
// TODO: Get the Redux store from somewhere else
const state = window.store.getState();
if (!state.oidc || !state.oidc.user) {
return;
}
const config = {
maxWebWorkers: Math.max(navigator.hardwareConcurrency - 1, 1),
startWebWorkersOnDemand: true,
webWorkerPath: ROOT_URL + '/cornerstoneWADOImageLoaderWebWorker.min.js',
taskConfiguration: {
decodeTask: {
loadCodecsOnStartup: true,
initializeCodecsOnStartup: false,
codecsPath: ROOT_URL + '/cornerstoneWADOImageLoaderCodecs.min.js',
usePDFJS: false,
strict: false
}
}
return state.oidc.user.access_token;
};
cornerstoneWADOImageLoader.webWorkerManager.initialize(config);
OHIF.user.getAccessToken = () => {
// TODO: Get the Redux store from somewhere else
const state = window.store.getState();
if (!state.oidc || !state.oidc.user) {
return;
}
return state.oidc.user.access_token;
}
cornerstoneWADOImageLoader.configure({
beforeSend: function(xhr) {
const headers = OHIF.DICOMWeb.getAuthorizationHeader();
beforeSend: function(xhr) {
const headers = OHIF.DICOMWeb.getAuthorizationHeader();
if (headers.Authorization) {
xhr.setRequestHeader("Authorization", headers.Authorization);
}
if (headers.Authorization) {
xhr.setRequestHeader('Authorization', headers.Authorization);
}
}
});
// Set the tool font and font size
// context.font = "[style] [variant] [weight] [size]/[line height] [font family]";
const fontFamily =
'Roboto, OpenSans, HelveticaNeue-Light, Helvetica Neue Light, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif';
'Roboto, OpenSans, HelveticaNeue-Light, Helvetica Neue Light, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif';
cornerstoneTools.textStyle.setFont(`16px ${fontFamily}`);
// Set the tool width
@@ -1,104 +1,126 @@
import React, { Component } from "react";
import PropTypes from "prop-types";
import qs from 'query-string'
import Viewer from "../connectedComponents/Viewer";
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import qs from 'query-string';
import Viewer from '../connectedComponents/Viewer';
import OHIF from 'ohif-core';
const { createDisplaySets } = OHIF.utils;
function parseQueryAndFetchStudies(query) {
return new Promise((resolve, reject) => {
const url = query.url;
return new Promise((resolve, reject) => {
const url = query.url;
if (!url) {
reject(new Error('No URL was specified. Use ?url=$yourURL'));
}
if (!url) {
reject(new Error('No URL was specified. Use ?url=$yourURL'));
}
// Define a request to the server to retrieve the study data
// as JSON, given a URL that was in the Route
const oReq = new XMLHttpRequest();
// Define a request to the server to retrieve the study data
// as JSON, given a URL that was in the Route
const oReq = new XMLHttpRequest();
// Add event listeners for request failure
oReq.addEventListener('error', (error) => {
OHIF.log.warn('An error occurred while retrieving the JSON data');
reject(error)
});
// When the JSON has been returned, parse it into a JavaScript Object
// and render the OHIF Viewer with this data
oReq.addEventListener('load', () => {
// Parse the response content
// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseText
if (!oReq.responseText) {
OHIF.log.warn('Response was undefined');
reject(new Error('Response was undefined'));
}
OHIF.log.info(JSON.stringify(oReq.responseText, null, 2));
const data = JSON.parse(oReq.responseText);
if (data.servers && query.studyInstanceUids) {
const server = data.servers.dicomWeb[0];
server.type = 'dicomWeb';
const studyInstanceUids = query.studyInstanceUids.split(';');
const seriesInstanceUids = [];
OHIF.studies.retrieveStudiesMetadata(server, studyInstanceUids, seriesInstanceUids).then(studies => {
resolve(studies);
}, error => {
reject(error);
});
} else {
resolve(data.studies);
}
});
// Open the Request to the server for the JSON data
// In this case we have a server-side route called /api/
// which responds to GET requests with the study data
OHIF.log.info(`Sending Request to: ${url}`);
oReq.open('GET', url);
oReq.setRequestHeader('Accept', 'application/json')
// Fire the request to the server
oReq.send();
// Add event listeners for request failure
oReq.addEventListener('error', error => {
OHIF.log.warn('An error occurred while retrieving the JSON data');
reject(error);
});
// When the JSON has been returned, parse it into a JavaScript Object
// and render the OHIF Viewer with this data
oReq.addEventListener('load', () => {
// Parse the response content
// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseText
if (!oReq.responseText) {
OHIF.log.warn('Response was undefined');
reject(new Error('Response was undefined'));
}
OHIF.log.info(JSON.stringify(oReq.responseText, null, 2));
const data = JSON.parse(oReq.responseText);
if (data.servers && query.studyInstanceUids) {
const server = data.servers.dicomWeb[0];
server.type = 'dicomWeb';
const studyInstanceUids = query.studyInstanceUids.split(';');
const seriesInstanceUids = [];
OHIF.studies
.retrieveStudiesMetadata(
server,
studyInstanceUids,
seriesInstanceUids
)
.then(
studies => {
resolve(studies);
},
error => {
reject(error);
}
);
} else {
resolve(data.studies);
}
});
// Open the Request to the server for the JSON data
// In this case we have a server-side route called /api/
// which responds to GET requests with the study data
OHIF.log.info(`Sending Request to: ${url}`);
oReq.open('GET', url);
oReq.setRequestHeader('Accept', 'application/json');
// Fire the request to the server
oReq.send();
});
}
class StandaloneRouting extends Component {
state = {
studies: null,
error: null
state = {
studies: null,
error: null
};
static propTypes = {
location: PropTypes.object,
store: PropTypes.object
};
componentDidMount() {
const search = this.props.location.search;
if (!search) {
console.warn('no search string!');
this.setState({
error: new Error('No query string provided.')
});
return;
}
static propTypes = {
location: PropTypes.object,
store: PropTypes.object
};
const query = qs.parse(search);
componentDidMount() {
const query = qs.parse(this.props.location.search);
parseQueryAndFetchStudies(query).then(studies => {
const updatedStudies = createDisplaySets(studies);
parseQueryAndFetchStudies(query).then(
studies => {
const updatedStudies = createDisplaySets(studies);
this.setState({ studies: updatedStudies });
}, error => {
this.setState({ error });
});
this.setState({ studies: updatedStudies });
},
error => {
this.setState({ error });
}
);
}
render() {
if (this.state.error) {
return <div>Error: {JSON.stringify(this.state.error)}</div>;
} else if (!this.state.studies) {
return <div>Loading...</div>;
}
render() {
if (this.state.error) {
return (<div>Error: {JSON.stringify(this.state.error)}</div>);
} else if (!this.state.studies) {
return (<div>Loading...</div>);
}
return (
<Viewer studies={this.state.studies}/>
);
}
return <Viewer studies={this.state.studies} />;
}
}
export default StandaloneRouting;
+4 -4
View File
@@ -7126,10 +7126,10 @@ octal@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/octal/-/octal-1.0.0.tgz#63e7162a68efbeb9e213588d58e989d1e5c4530b"
ohif-core@^0.1.6:
version "0.1.6"
resolved "https://registry.yarnpkg.com/ohif-core/-/ohif-core-0.1.6.tgz#81e2aea7bfe41acaea18641428c65afb57223a0b"
integrity sha512-2qYojFkcM5Zoa2y4nlJ/1ovZCLNjTvnuizixSWIuIvu4s3jnlu+2f09R3cHb53hlknC4NiZEgHH//cSXR4/9Jw==
ohif-core@^0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/ohif-core/-/ohif-core-0.1.7.tgz#81f49f142d40338a3839f06c849aace675847002"
integrity sha512-VXnpaw4VjKBR1P9tSB2ZGLpXYXwdbmL0oZ7P+bbKKOh2Q+8An4E9lTiKpUlUoxaf/HiTZIUQ/2Cjp7qJe88FDg==
dependencies:
"@babel/runtime" "^7.2.0"
dicomweb-client "^0.4.1"
+31
View File
@@ -0,0 +1,31 @@
{
"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": "/callback",
"clientId": "crowds-cure-cancer",
"postLogoutRedirectUri": "/logout-redirect.html",
"responseType": "id_token token",
"scope": "email profile openid",
"revokeAccessTokenOnSignout": true,
"extraQueryParams": {
"kc_idp_hint": "crowds-cure-cancer-auth0-oidc",
"client_id": "crowds-cure-cancer"
}
}]
}
+19
View File
@@ -0,0 +1,19 @@
{
"servers": {
"dicomWeb": [
{
"name": "DCM4CHEE",
"wadoUriRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/wado",
"qidoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs",
"wadoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs",
"qidoSupportsIncludeField": true,
"imageRendering": "wadors",
"thumbnailRendering": "wadors",
"requestOptions": {
"requestFromBrowser": true,
"auth": "admin:admin"
}
}
]
}
}
+19
View File
@@ -0,0 +1,19 @@
{
"servers": {
"dicomWeb": [
{
"name": "DCM4CHEE",
"wadoUriRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/wado",
"qidoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
"wadoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
"qidoSupportsIncludeField": true,
"imageRendering": "wadors",
"thumbnailRendering": "wadors",
"requestOptions": {
"requestFromBrowser": true,
"auth": "cloud:healthcare"
}
}
]
}
}