diff --git a/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.css b/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.css index 9694fa4..5277c3f 100644 --- a/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.css +++ b/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.css @@ -23,3 +23,12 @@ line, it will be truncated with ellipsis in the end. .viewport-overlay.right-viewport-scrollbar .flex.flex-row { justify-content: flex-end; } + +.expertise-overlay { + max-width: 300px; /* Atur sesuai kebutuhan */ + word-wrap: break-word; + white-space: pre-line; /* Untuk mempertahankan format newline dari API */ + background: rgba(0, 0, 0, 0.7); /* Background semi-transparan */ + font-size: 12px; + line-height: 1.2; +} diff --git a/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx b/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx index b459c69..eae8a75 100644 --- a/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx +++ b/extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.tsx @@ -36,6 +36,11 @@ interface OverlayItemProps { }; instanceNumber?: number; scale?: number; + displaySetProps?: { + referenceInstance?: { + StudyInstanceUID?: string; + }; + }; } const OverlayItemComponents = { @@ -43,6 +48,7 @@ const OverlayItemComponents = { 'ohif.overlayItem.windowLevel': VOIOverlayItem, 'ohif.overlayItem.zoomLevel': ZoomOverlayItem, 'ohif.overlayItem.instanceNumber': InstanceNumberOverlayItem, + 'ohif.overlayItem.expertise': ExpertiseOverlayItem, }; const studyDateItem = { @@ -76,6 +82,10 @@ const topRightItems = { id: 'cornerstoneOverlayTopRight', items: [] }; const bottomLeftItems = { id: 'cornerstoneOverlayBottomLeft', items: [ + { + id: 'Expertise', + customizationType: 'ohif.overlayItem.expertise', + }, { id: 'WindowLevel', customizationType: 'ohif.overlayItem.windowLevel', @@ -177,6 +187,7 @@ function CustomizableViewportOverlay({ } const [displaySet] = displaySets; const { instances, instance: referenceInstance } = displaySet; + return { displaySets, displaySet, @@ -256,6 +267,7 @@ function CustomizableViewportOverlay({ formatTime: formatDICOMTime, formatNumberPrecision, }, + displaySetProps, }; if (!item) { @@ -316,7 +328,7 @@ function CustomizableViewportOverlay({ > ); }, - [_renderOverlayItem] + [_renderOverlayItem, displaySetProps] ); return ( @@ -523,6 +535,39 @@ function InstanceNumberOverlayItem({ ); } +function ExpertiseOverlayItem({ displaySetProps, customization }: OverlayItemProps) { + const [expertise, setExpertise] = useState(null); + const { referenceInstance } = displaySetProps || {}; + + useEffect(() => { + if (!referenceInstance?.StudyInstanceUID) return; + + const fetchExpertise = async () => { + try { + const response = await fetch( + `https://devone.aplikasi.web.id/one-api/test/api_dummy/expertisi/${referenceInstance.StudyInstanceUID}` + ); + const data = await response.json(); + setExpertise(data.result); + } catch (error) { + } + }; + + fetchExpertise(); + }, [referenceInstance]); + + if (!expertise) return null; + + return ( +