diff --git a/extensions/default/src/Components/SidePanelWithServices.tsx b/extensions/default/src/Components/SidePanelWithServices.tsx index 2b02164..0d61302 100644 --- a/extensions/default/src/Components/SidePanelWithServices.tsx +++ b/extensions/default/src/Components/SidePanelWithServices.tsx @@ -26,6 +26,8 @@ const SidePanelWithServices = ({ const [sidePanelOpen, setSidePanelOpen] = useState(activeTabIndexProp !== null); const [activeTabIndex, setActiveTabIndex] = useState(activeTabIndexProp); const [tabs, setTabs] = useState(tabsProp ?? panelService.getPanels(side)); + const [studyInstanceUID, setStudyInstanceUID] = useState(''); + const [lastActivatedStudyUID, setLastActivatedStudyUID] = useState(''); const handleActiveTabIndexChange = useCallback(({ activeTabIndex }) => { setActiveTabIndex(activeTabIndex); @@ -71,23 +73,33 @@ const SidePanelWithServices = ({ const activatePanelSubscription = panelService.subscribe( panelService.EVENTS.ACTIVATE_PANEL, (activatePanelEvent: Types.ActivatePanelEvent) => { - // Handle the `-exp` suffix logic - const isExpertisePanel = activatePanelEvent.panelId.endsWith('-exp'); + const isExpertisePanel = activatePanelEvent.panelId.includes('-exp-'); const realPanelID = isExpertisePanel - ? activatePanelEvent.panelId.replace(/-exp$/, '') + ? activatePanelEvent.panelId.split('-exp-')[0] : activatePanelEvent.panelId; + // studyInstanceUID = take from activatePanelEvent.panelId after '-exp- + setStudyInstanceUID(isExpertisePanel ? activatePanelEvent.panelId.split('-exp-')[1] : null); + const tabIndex = tabs.findIndex(tab => tab.id === realPanelID); if (isExpertisePanel && side === 'right') { - const shouldOpen = !sidePanelOpen; // Use sidePanelOpen to determine toggle state - setSidePanelOpen(shouldOpen); + // Extract study UID from the panel ID + const currentStudyUID = activatePanelEvent.panelId.split('-exp-')[1]; - if (shouldOpen) { - setActiveTabIndex(tabIndex !== -1 ? tabIndex : null); - } else { - setActiveTabIndex(null); - } + // Toggle logic - close if same study is clicked again, open if different study + if (currentStudyUID === lastActivatedStudyUID && sidePanelOpen) { + // Same study - close panel + setSidePanelOpen(false); + setActiveTabIndex(null); + setLastActivatedStudyUID(''); + } else { + // Different study or panel was closed - open panel with new study + setSidePanelOpen(true); + setActiveTabIndex(tabIndex !== -1 ? tabIndex : null); + setStudyInstanceUID(currentStudyUID); + setLastActivatedStudyUID(currentStudyUID); + } } else if (tabIndex !== -1) { setActiveTabIndex(tabIndex); } @@ -97,7 +109,7 @@ const SidePanelWithServices = ({ return () => { activatePanelSubscription.unsubscribe(); }; - }, [tabs, sidePanelOpen, panelService]); + }, [tabs, sidePanelOpen, panelService, lastActivatedStudyUID]); return ( ); }; diff --git a/platform/app/public/config/default.js b/platform/app/public/config/default.js index fe1eb0c..7b87288 100644 --- a/platform/app/public/config/default.js +++ b/platform/app/public/config/default.js @@ -23,8 +23,8 @@ window.config = { // above, the number of requests can be go a lot higher. prefetch: 25, }, - expertise: true, //* Tambahan untuk enable expertise (CustomizableViewportOverlay) - expertise_host: `http://128.199.154.150`, + expertise: false, //* Tambahan untuk enable expertise (CustomizableViewportOverlay) + expertise_host: `http://${window.location.hostname}`, //* Tambahan untuk fetch data Expertise) // filterQueryParam: false, // defaultDataSourceName: 'dicomweb', defaultDataSourceName: 'local-proxy', @@ -39,100 +39,14 @@ window.config = { // regex: /.*/, // }, dataSources: [ - { - namespace: '@ohif/extension-default.dataSourcesModule.dicomweb', - sourceName: 'dicomweb', - configuration: { - friendlyName: 'AWS S3 Static wado server', - name: 'aws', - wadoUriRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', - qidoRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', - wadoRoot: 'https://d14fa38qiwhyfd.cloudfront.net/dicomweb', - qidoSupportsIncludeField: false, - imageRendering: 'wadors', - thumbnailRendering: 'wadors', - enableStudyLazyLoad: true, - supportsFuzzyMatching: false, - supportsWildcard: true, - staticWado: true, - singlepart: 'bulkdata,video', - // whether the data source should use retrieveBulkData to grab metadata, - // and in case of relative path, what would it be relative to, options - // are in the series level or study level (some servers like series some study) - bulkDataURI: { - enabled: true, - relativeResolution: 'studies', - transform: url => url.replace('/pixeldata.mp4', '/rendered'), - }, - omitQuotationForMultipartRequest: true, - }, - }, - - { - namespace: '@ohif/extension-default.dataSourcesModule.dicomweb', - sourceName: 'ohif2', - configuration: { - friendlyName: 'AWS S3 Static wado secondary server', - name: 'aws', - wadoUriRoot: 'https://dd14fa38qiwhyfd.cloudfront.net/dicomweb', - qidoRoot: 'https://dd14fa38qiwhyfd.cloudfront.net/dicomweb', - wadoRoot: 'https://dd14fa38qiwhyfd.cloudfront.net/dicomweb', - qidoSupportsIncludeField: false, - supportsReject: false, - imageRendering: 'wadors', - thumbnailRendering: 'wadors', - enableStudyLazyLoad: true, - supportsFuzzyMatching: false, - supportsWildcard: true, - staticWado: true, - singlepart: 'bulkdata,video', - // whether the data source should use retrieveBulkData to grab metadata, - // and in case of relative path, what would it be relative to, options - // are in the series level or study level (some servers like series some study) - bulkDataURI: { - enabled: true, - relativeResolution: 'studies', - }, - omitQuotationForMultipartRequest: true, - }, - }, - { - namespace: '@ohif/extension-default.dataSourcesModule.dicomweb', - sourceName: 'ohif3', - configuration: { - friendlyName: 'AWS S3 Static wado secondary server', - name: 'aws', - wadoUriRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb', - qidoRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb', - wadoRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb', - qidoSupportsIncludeField: false, - supportsReject: false, - imageRendering: 'wadors', - thumbnailRendering: 'wadors', - enableStudyLazyLoad: true, - supportsFuzzyMatching: false, - supportsWildcard: true, - staticWado: true, - singlepart: 'bulkdata,video', - // whether the data source should use retrieveBulkData to grab metadata, - // and in case of relative path, what would it be relative to, options - // are in the series level or study level (some servers like series some study) - bulkDataURI: { - enabled: true, - relativeResolution: 'studies', - }, - omitQuotationForMultipartRequest: true, - }, - }, - { namespace: '@ohif/extension-default.dataSourcesModule.dicomweb', sourceName: 'local-proxy', configuration: { friendlyName: 'Static WADO Local Data', name: 'DCM4CHEE', - qidoRoot: 'http://128.199.154.150:5000/rs', - wadoRoot: 'http://128.199.154.150:5000/rs', + qidoRoot: `http://${window.location.hostname}:5050/rs`, + wadoRoot: `http://${window.location.hostname}:5050/rs`, qidoSupportsIncludeField: false, supportsReject: true, supportsStow: true, diff --git a/platform/ui-next/src/components/SidePanel/SidePanel.tsx b/platform/ui-next/src/components/SidePanel/SidePanel.tsx index 8b35a70..71d6f37 100644 --- a/platform/ui-next/src/components/SidePanel/SidePanel.tsx +++ b/platform/ui-next/src/components/SidePanel/SidePanel.tsx @@ -154,6 +154,7 @@ const SidePanel = ({ expandedWidth = 280, onActiveTabIndexChange, servicesManager, // Tambah servicesManager as a prop + studyInstanceUID, }) => { const [panelOpen, setPanelOpen] = useState(activeTabIndexProp !== null); const [activeTabIndex, setActiveTabIndex] = useState(0); @@ -166,8 +167,8 @@ const SidePanel = ({ const [viewportData, setViewportData] = useState(null); // Harusnya (viewportId), tapi karena gabutuh perubahan viewport maka dihardcode 'default' - const viewportInfo = cornerstoneViewportService.getViewportInfo('default'); - const studyInstanceUID = viewportInfo?.viewportData?.data?.[0]?.StudyInstanceUID || ''; + // const viewportInfo = cornerstoneViewportService.getViewportInfo('default'); + // const studyInstanceUID = viewportInfo?.viewportData?.data?.[0]?.StudyInstanceUID || ''; const styleMap = createStyleMap(expandedWidth, borderSize, collapsedWidth); const baseStyle = createBaseStyle(expandedWidth); @@ -623,6 +624,7 @@ SidePanel.propTypes = { onActiveTabIndexChange: PropTypes.func, expandedWidth: PropTypes.number, servicesManager: PropTypes.object.isRequired, // Tambah servicesManager prop + studyInstanceUID: PropTypes.string, // Tambahkan prop studyInstanceUID }; export { SidePanel }; diff --git a/platform/ui-next/src/components/StudyBrowser/StudyBrowser.tsx b/platform/ui-next/src/components/StudyBrowser/StudyBrowser.tsx index ed097e4..3b3dbf1 100644 --- a/platform/ui-next/src/components/StudyBrowser/StudyBrowser.tsx +++ b/platform/ui-next/src/components/StudyBrowser/StudyBrowser.tsx @@ -63,6 +63,7 @@ const StudyBrowser = ({ viewPreset={viewPreset} onThumbnailContextMenu={onThumbnailContextMenu} servicesManager={servicesManager} // Pass servicesManager ke Study Item + studyInstanceUid={studyInstanceUid} /> ); diff --git a/platform/ui-next/src/components/StudyItem/StudyItem.tsx b/platform/ui-next/src/components/StudyItem/StudyItem.tsx index 47fb32a..9a6bb9d 100644 --- a/platform/ui-next/src/components/StudyItem/StudyItem.tsx +++ b/platform/ui-next/src/components/StudyItem/StudyItem.tsx @@ -21,7 +21,10 @@ const StudyItem = ({ viewPreset = 'thumbnails', onThumbnailContextMenu, servicesManager, // Tambah servicesManager as a prop + studyInstanceUid = '', }: withAppTypes) => { + // FETCHING ACCESSION NUMBER DAN EXPERTISE + return ( {/* Expertise Button */}
{ // Trigger the expertise panel in the right side panel (segmentation Panel) servicesManager.services.panelService.activatePanel( - '@ohif/extension-cornerstone.panelModule.panelSegmentation-exp', + // '@ohif/extension-cornerstone.panelModule.panelSegmentation-exp', + `@ohif/extension-cornerstone.panelModule.panelSegmentation-exp-${studyInstanceUid}`, true ); }} > - View Expertise + Expertise
{/* Thumbnails */} @@ -105,6 +109,7 @@ StudyItem.propTypes = { onClickUntrack: PropTypes.func, viewPreset: PropTypes.string, servicesManager: PropTypes.object.isRequired, // Tambah servicesManager prop + studyInstanceUid: PropTypes.string.string, }; export { StudyItem };