diff --git a/extensions/default/src/ViewerLayout/ViewerHeader.tsx b/extensions/default/src/ViewerLayout/ViewerHeader.tsx index da9f98936..f9398631a 100644 --- a/extensions/default/src/ViewerLayout/ViewerHeader.tsx +++ b/extensions/default/src/ViewerLayout/ViewerHeader.tsx @@ -9,6 +9,7 @@ import HeaderPatientInfo from './HeaderPatientInfo'; import { PatientInfoVisibility } from './HeaderPatientInfo/HeaderPatientInfo'; import { preserveQueryParameters } from '@ohif/app'; import { Types } from '@ohif/core'; +import { checkTrizRisAccess } from '../services/TrizRisAccessApi'; function ViewerHeader({ appConfig }: withAppTypes<{ appConfig: AppTypes.Config }>) { const { servicesManager, extensionManager, commandsManager } = useSystem(); @@ -17,6 +18,22 @@ function ViewerHeader({ appConfig }: withAppTypes<{ appConfig: AppTypes.Config } const navigate = useNavigate(); const location = useLocation(); + const [toolbarDisabled, setToolbarDisabled] = React.useState(true); + + React.useEffect(() => { + const chargerAcces = async () => { + const access = await checkTrizRisAccess(); + + console.log('### ACCESS TOOLBAR ###', access); + console.log('### canUseToolbar ###', access?.canUseToolbar); + console.log('### canConsulter ###', access?.canConsulter); + console.log('### isMedecin ###', access?.isMedecin); + + setToolbarDisabled(access?.canUseToolbar !== true); + }; + + chargerAcces(); + }, []); const onClickReturnButton = () => { const { pathname } = location; const dataSourceIdx = pathname.indexOf('/', 1); @@ -104,7 +121,21 @@ function ViewerHeader({ appConfig }: withAppTypes<{ appConfig: AppTypes.Config } isReturnEnabled={!!appConfig.showStudyList} onClickReturnButton={onClickReturnButton} WhiteLabeling={appConfig.whiteLabeling} - Secondary={} + Secondary={ +
+ +
+ } PatientInfo={ appConfig.showPatientInfo !== PatientInfoVisibility.DISABLED && ( } > -
+
diff --git a/extensions/default/src/services/TrizRisAccessApi.ts b/extensions/default/src/services/TrizRisAccessApi.ts index ee4c5e262..3bd8ffb9f 100644 --- a/extensions/default/src/services/TrizRisAccessApi.ts +++ b/extensions/default/src/services/TrizRisAccessApi.ts @@ -2,7 +2,15 @@ import { TrizRisConfig } from '@ohif/core/src/config/TrizRisConfig'; const ACCESS_URL = `${TrizRisConfig.apiBaseUrl}/ohif/access`; -export async function checkTrizRisAccess(): Promise { +export interface TrizRisAccess { + authorized: boolean; + isMedecin: boolean; + canVisualiser: boolean; + canConsulter: boolean; + canUseToolbar: boolean; +} + +export async function checkTrizRisAccess(): Promise { try { const response = await fetch(ACCESS_URL, { method: 'GET', @@ -15,15 +23,22 @@ export async function checkTrizRisAccess(): Promise { }); if (!response.ok) { - return false; + return null; } const result = await response.json(); + console.log('### REPONSE ACCESS TRIZRIS ###', result); - return result.authorized === true; + return { + authorized: result.authorized === true, + isMedecin: result.isMedecin === true, + canVisualiser: result.canVisualiser === true, + canConsulter: result.canConsulter === true, + canUseToolbar: result.canUseToolbar === true, + }; } catch (error) { console.error('### ERREUR VERIFICATION ACCES TRIZRIS ###', error); - return false; + return null; } } diff --git a/platform/app/.webpack/webpack.pwa.js b/platform/app/.webpack/webpack.pwa.js index 6fbd6a081..e239468d8 100644 --- a/platform/app/.webpack/webpack.pwa.js +++ b/platform/app/.webpack/webpack.pwa.js @@ -9,6 +9,7 @@ const webpackBase = require('./../../../.webpack/webpack.base.js'); const SRC_DIR = path.join(__dirname, '../src'); const DIST_DIR = path.join(__dirname, '../dist'); const PUBLIC_DIR = path.join(__dirname, '../public'); +const { ORTHANC_BASE_URL } = require('../config/trizris.shared'); // Ignore node_modules except @cornerstonejs (symlinked local development). const WATCH_IGNORED = /node_modules[\\/](?!@cornerstonejs(?:[\\/]|$))/; @@ -212,7 +213,7 @@ module.exports = (env, argv) => { { context: ['/orthanc'], - target: 'http://localhost:8042', + target: ORTHANC_BASE_URL, changeOrigin: true, pathRewrite: { '^/orthanc': '', diff --git a/platform/app/src/routes/Mode/Mode.tsx b/platform/app/src/routes/Mode/Mode.tsx index dcba03a87..f37c17df3 100644 --- a/platform/app/src/routes/Mode/Mode.tsx +++ b/platform/app/src/routes/Mode/Mode.tsx @@ -66,12 +66,96 @@ export default function ModeRoute({ userAuthenticationService, customizationService, } = servicesManager.services; - + console.log('displaySetService =', displaySetService); const { extensions, sopClassHandlers, hangingProtocol } = mode; const runTimeHangingProtocolId = lowerCaseSearchParams.get('hangingprotocolid'); const runTimeStageId = lowerCaseSearchParams.get('stageid'); const token = lowerCaseSearchParams.get('token'); + // ==================== TRIZRIS : SOP INITIAL ==================== + const initialSopInstanceUID = new URLSearchParams(window.location.search).get( + 'initialSopInstanceUID' + ); + + useEffect(() => { + if (!initialSopInstanceUID) { + return; + } + + const { viewportGridService, cornerstoneViewportService } = servicesManager.services; + + const essayerNavigation = () => { + const displaySet = displaySetService.getDisplaySetForSOPInstanceUID( + initialSopInstanceUID, + null + ); + + console.log('DISPLAY SET DU SOP APRES CHARGEMENT =', displaySet); + + if (!displaySet) { + return; + } + + const imageIndex = displaySet.instances.findIndex( + instance => instance.SOPInstanceUID === initialSopInstanceUID + ); + + console.log('INDEX DU SOP =', imageIndex); + + if (imageIndex < 0) { + return; + } + + const { viewports } = viewportGridService.getState(); + + let targetViewport = null; + + viewports.forEach((viewport, viewportId) => { + console.log('VIEWPORT', viewportId, 'displaySets =', viewport.displaySetInstanceUIDs); + + if (viewport.displaySetInstanceUIDs?.includes(displaySet.displaySetInstanceUID)) { + targetViewport = { + id: viewportId, + ...viewport, + }; + } + }); + + console.log('TARGET VIEWPORT =', targetViewport); + + if (!targetViewport) { + console.log('### VIEWPORT PAS ENCORE PRET -> ATTENTE ###'); + return; + } + + console.log('### VIEWPORT TROUVE POUR KEY IMAGE ###', targetViewport.id); + + commandsManager.run('jumpToImage', { + imageIndex, + viewport: targetViewport, + }); + }; + + // 1. essai immédiat + essayerNavigation(); + + // 2. attendre les display sets + const { unsubscribe: unsubscribeDisplaySets } = displaySetService.subscribe( + displaySetService.EVENTS.DISPLAY_SETS_ADDED, + essayerNavigation + ); + + // 3. attendre que le viewport ait réellement reçu ses données + const { unsubscribe: unsubscribeViewport } = cornerstoneViewportService.subscribe( + cornerstoneViewportService.EVENTS.VIEWPORT_DATA_CHANGED, + essayerNavigation + ); + + return () => { + unsubscribeDisplaySets(); + unsubscribeViewport(); + }; + }, [initialSopInstanceUID, displaySetService, servicesManager]); // =============================================================== if (token) { updateAuthServiceAndCleanUrl(token, location, userAuthenticationService); @@ -232,6 +316,28 @@ export default function ModeRoute({ // Add SOPClassHandlers to a new SOPClassManager. displaySetService.init(extensionManager, sopClassHandlers); + const displaySets = displaySetService.getActiveDisplaySets + ? displaySetService.getActiveDisplaySets() + : displaySetService.getDisplaySets(); + + console.log('DISPLAY SETS =', displaySets); + + if (displaySets && displaySets.length > 0) { + displaySets.forEach((displaySet, index) => { + console.log('================ DISPLAY SET', index, '================'); + + console.log('SeriesInstanceUID =', displaySet.SeriesInstanceUID); + + console.log('displaySetInstanceUID =', displaySet.displaySetInstanceUID); + + console.log('CHAMPS =', Object.keys(displaySet)); + + console.log('images =', displaySet.images); + + console.log('instances =', displaySet.instances); + }); + } + extensionManager.onModeEnter({ servicesManager, extensionManager,