modified-dicom-pacs
Version:
A modified version of DICOM PACS implementation
2 lines • 38.3 kB
JavaScript
;(globalThis.webpackChunk=globalThis.webpackChunk||[]).push([[574],{71574:(e,t,n)=>{n.r(t),n.d(t,{default:()=>ae});var r=n(41766),i=n(78668),a=n(11374),o=n.n(a),s=n(39371),l=n(92136),c=n(55411),m=n(5085),u=n(71353);function p({viewportData:e,viewportId:t,element:n,imageSliceData:i,setImageSliceData:a,scrollbarHeight:o,servicesManager:c}){const{cineService:u,cornerstoneViewportService:p}=c.services;return(0,r.useEffect)((()=>{if(!e)return;const n=p.getCornerstoneViewport(t);if(n)if(e.viewportType!==l.Enums.ViewportType.STACK){if(e.viewportType===l.Enums.ViewportType.ORTHOGRAPHIC){const e=l.utilities.getImageSliceDataForVolumeViewport(n);if(!e)return;const{imageIndex:t,numberOfSlices:r}=e;a({imageIndex:t,numberOfSlices:r})}}else{const t=n.getCurrentImageIdIndex();a({imageIndex:t,numberOfSlices:e.data.imageIds.length})}}),[t,e]),(0,r.useEffect)((()=>{if(e?.viewportType!==l.Enums.ViewportType.STACK)return;const t=t=>{const{newImageIdIndex:n}=t.detail;a({imageIndex:n,numberOfSlices:e.data.imageIds.length})};return n.addEventListener(l.Enums.Events.STACK_VIEWPORT_SCROLL,t),()=>{n.removeEventListener(l.Enums.Events.STACK_VIEWPORT_SCROLL,t)}}),[e,n]),(0,r.useEffect)((()=>{if(e?.viewportType!==l.Enums.ViewportType.ORTHOGRAPHIC)return;const t=e=>{const{imageIndex:t,numberOfSlices:n}=e.detail;a({imageIndex:t,numberOfSlices:n})};return n.addEventListener(l.Enums.Events.VOLUME_NEW_IMAGE,t),()=>{n.removeEventListener(l.Enums.Events.VOLUME_NEW_IMAGE,t)}}),[e,n]),r.createElement(m.uq,{onChange:e=>((e,t)=>{const r=p.getCornerstoneViewport(t),{isCineEnabled:i}=u.getState();i&&(u.stopClip(n,{viewportId:t}),u.setCine({id:t,isPlaying:!1})),s.utilities.jumpToSlice(r.element,{imageIndex:e,debounceLoading:!0})})(e,t),max:i.numberOfSlices?i.numberOfSlices-1:0,height:o,value:i.imageIndex})}p.propTypes={viewportData:o().object,viewportId:o().string.isRequired,element:o().instanceOf(Element),scrollbarHeight:o().string,imageSliceData:o().object.isRequired,setImageSliceData:o().func.isRequired,servicesManager:o().object.isRequired};const d=p;var g=n(44753),v=n(8291),f=n.n(v);function E(e,t=0){if(null!==e)return parseFloat(e).toFixed(t)}function w(e,t="MMM D, YYYY"){return f()(e,"YYYYMMDD").format(t)}function I(e,t="HH:mm:ss"){return f()(e,"HH:mm:ss").format(t)}function y(e){if(!e)return"";const t=e.split("^").filter((e=>!!e)).join(", ").trim();return","===t||""===t?"":t}const S=1e-4,b={"ohif.overlayItem.windowLevel":function({voi:e,customization:t}){const{windowWidth:n,windowCenter:i}=e;if("number"!=typeof i||"number"!=typeof n)return null;return r.createElement("div",{className:"overlay-item flex flex-row",style:{color:t&&t.color||void 0}},r.createElement("span",{className:"mr-1 shrink-0"},"W:"),r.createElement("span",{className:"ml-1 mr-2 shrink-0"},n.toFixed(0)),r.createElement("span",{className:"mr-1 shrink-0"},"L:"),r.createElement("span",{className:"ml-1 shrink-0"},i.toFixed(0)))},"ohif.overlayItem.zoomLevel":function({scale:e,customization:t}){return r.createElement("div",{className:"overlay-item flex flex-row",style:{color:t&&t.color||void 0}},r.createElement("span",{className:"mr-1 shrink-0"},"Zoom:"),r.createElement("span",null,e.toFixed(2),"x"))},"ohif.overlayItem.instanceNumber":function({instanceNumber:e,imageSliceData:t,customization:n}){const{imageIndex:i,numberOfSlices:a}=t;return r.createElement("div",{className:"overlay-item flex flex-row",style:{color:n&&n.color||void 0}},r.createElement("span",null,null!=e?r.createElement(r.Fragment,null,r.createElement("span",{className:"mr-1 shrink-0"},"I:"),r.createElement("span",null,`${e} (${i+1}/${a})`)):`${i+1}/${a}`))}};function h({element:e,viewportData:t,imageSliceData:n,viewportId:i,servicesManager:a}){const{cornerstoneViewportService:o,customizationService:s,toolGroupService:c}=a.services,[u,p]=(0,r.useState)({windowCenter:null,windowWidth:null}),[d,g]=(0,r.useState)(1),{imageIndex:v}=n,f=s.getModeCustomization("cornerstoneOverlayTopLeft"),S=s.getModeCustomization("cornerstoneOverlayTopRight"),h=s.getModeCustomization("cornerstoneOverlayBottomLeft"),x=s.getModeCustomization("cornerstoneOverlayBottomRight"),M=(0,r.useMemo)((()=>null!=t?function(e){const t=[];if(e.viewportType===l.Enums.ViewportType.STACK)t.push(e.data.imageIds[0]);else if(e.viewportType===l.Enums.ViewportType.ORTHOGRAPHIC){e.data.forEach((e=>{e?.imageIds&&0!==e.imageIds.length&&t.push(e.imageIds[0])}))}const n=[];return t.forEach((e=>{const t=l.metaData.get("instance",e)||{};n.push(t)})),n}(t):null),[t,v]),T=(0,r.useMemo)((()=>t?C(t,i,v,o):null),[t,i,v,o]);(0,r.useEffect)((()=>{const t=e=>{const{range:t}=e.detail;if(!t)return;const{lower:n,upper:r}=t,{windowWidth:i,windowCenter:a}=l.utilities.windowLevel.toWindowLevel(n,r);p({windowCenter:a,windowWidth:i})};return e.addEventListener(l.Enums.Events.VOI_MODIFIED,t),()=>{e.removeEventListener(l.Enums.Events.VOI_MODIFIED,t)}}),[i,t,u,e]),(0,r.useEffect)((()=>{const t=t=>{const{previousCamera:n,camera:r}=t.detail;if(n.parallelScale!==r.parallelScale||n.scale!==r.scale){const t=o.getCornerstoneViewport(i);if(!t)return;const n=t.getImageData();if(!n)return;if(r.scale)return void g(r.scale);const{spacing:a}=n,s=e.clientHeight*a[0]*.5/r.parallelScale;g(s)}};return e.addEventListener(l.Enums.Events.CAMERA_MODIFIED,t),()=>{e.removeEventListener(l.Enums.Events.CAMERA_MODIFIED,t)}}),[i,t,o,e]);const D=(0,r.useCallback)((o=>{const l={element:e,viewportData:t,imageSliceData:n,viewportId:i,servicesManager:a,customization:o,formatters:{formatPN:y,formatDate:w,formatTime:I,formatNumberPrecision:E},instance:M?M[o?.instanceIndex]:null,voi:u,scale:d,instanceNumber:T};if(!o)return null;const{customizationType:c}=o,m=b[c];if(m)return r.createElement(m,l);{const e=s.transform(o);if("function"==typeof e.content)return e.content(l)}}),[e,t,n,i,a,s,M,u,d,T]),V=(0,r.useCallback)(((e,t,n)=>{const i=e?.items??t;return r.createElement(r.Fragment,null,i.map(((e,t)=>r.createElement("div",{key:`${n}_${t}`},e?.condition?e.condition({instance:M?M[e?.instanceIndex]:null,formatters:{formatDate:w}})?D(e):null:D(e)))))}),[D]),N={id:"StudyDate",customizationType:"ohif.overlayItem",label:"",title:"Study date",condition:({instance:e})=>e&&e.StudyDate,contentF:({instance:e,formatters:{formatDate:t}})=>t(e.StudyDate)},R={id:"SeriesDescription",customizationType:"ohif.overlayItem",label:"",title:"Series description",attribute:"SeriesDescription",condition:({instance:e})=>e&&e.SeriesDescription},P=M?M.map(((e,t)=>[{...N,instanceIndex:t},{...R,instanceIndex:t}])).flat():[];return r.createElement(m.pU,{topLeft:V(f,[...P],"topLeftOverlayItem"),topRight:V(S,[],"topRightOverlayItem"),bottomLeft:V(h,[{id:"WindowLevel",customizationType:"ohif.overlayItem.windowLevel"},{id:"ZoomLevel",customizationType:"ohif.overlayItem.zoomLevel",condition:()=>"Zoom"===c.getActiveToolForViewport(i)}],"bottomLeftOverlayItem"),bottomRight:V(x,[{id:"InstanceNumber",customizationType:"ohif.overlayItem.instanceNumber"}],"bottomRightOverlayItem")})}const C=(e,t,n,r)=>{let i;switch(e.viewportType){case l.Enums.ViewportType.STACK:i=function(e,t){const n=e.data.imageIds,r=n[t];if(!r)return;const i=l.metaData.get("generalImageModule",r)||{},{instanceNumber:a}=i;if(n.length<=1)return;return parseInt(a)}(e,n);break;case l.Enums.ViewportType.ORTHOGRAPHIC:i=function(e,t,n,r){const i=e.data;if(!i)return;const{volume:a}=i[0],{direction:o,imageIds:s}=a,c=n.getCornerstoneViewport(t);if(!c)return;const m=c.getCamera(),{viewPlaneNormal:u}=m,p=o.slice(6,9),d=g.eR.cross(g.eR.create(),u,p);if(g.eR.length(d)<S){const e=s[r];if(!e)return{};const{instanceNumber:t}=l.metaData.get("generalImageModule",e)||{};return parseInt(t)}}(e,t,r,n)}return i??null};h.propTypes={viewportData:o().object,imageIndex:o().number,viewportId:o().string};const x=h;var M=n(61466),T=n.n(M);const{getOrientationStringLPS:D,invertOrientationStringLPS:V}=s.utilities.orientation;function N({element:e,viewportData:t,imageSliceData:n,viewportId:i,servicesManager:a,orientationMarkers:o=["top","left"]}){const[s,c]=(0,r.useState)(0),[m,u]=(0,r.useState)(!1),[p,d]=(0,r.useState)(!1),{cornerstoneViewportService:v}=a.services;(0,r.useEffect)((()=>{const t=e=>{const{rotation:t,previousCamera:n,camera:r}=e.detail;void 0!==t&&c(t),void 0!==r.flipHorizontal&&n.flipHorizontal!==r.flipHorizontal&&u(r.flipHorizontal),void 0!==r.flipVertical&&n.flipVertical!==r.flipVertical&&d(r.flipVertical)};return e.addEventListener(l.Enums.Events.CAMERA_MODIFIED,t),()=>{e.removeEventListener(l.Enums.Events.CAMERA_MODIFIED,t)}}),[]);const f=(0,r.useMemo)((()=>{if(!t)return"";let a,c;if("stack"===t.viewportType){const e=n.imageIndex,r=t.data.imageIds?.[e];if(!r)return!1;({rowCosines:a,columnCosines:c}=l.metaData.get("imagePlaneModule",r)||{})}else{if(!e||!(0,l.getEnabledElement)(e))return"";const{viewport:t}=(0,l.getEnabledElement)(e),{viewUp:n,viewPlaneNormal:r}=t.getCamera(),i=g.eR.create();g.eR.cross(i,n,r),c=[-n[0],-n[1],-n[2]],a=i}if(!a||!c||void 0===s)return"";const u=function(e,t,n,r,i){const a=D(e),o=D(t),s=V(a),l={top:V(o),left:s,right:a,bottom:o};r&&(l.top=V(l.top),l.bottom=V(l.bottom));i&&(l.left=V(l.left),l.right=V(l.right));if(90===n||-270===n)return{top:l.left,left:V(l.top),right:V(l.bottom),bottom:l.right};if(-90===n||270===n)return{top:V(l.left),left:l.top,bottom:l.left,right:l.bottom};if(180===n||-180===n)return{top:V(l.top),left:V(l.left),bottom:V(l.bottom),right:V(l.right)};return l}(a,c,s,p,m);return v.getViewportInfo(i)?o.map(((e,t)=>r.createElement("div",{className:T()("overlay-text",`${e}-mid orientation-marker`,"text-aqua-pale","text-[13px]","leading-5"),key:`${e}-mid orientation-marker`},r.createElement("div",{className:"orientation-marker-value"},u[e])))):(console.log("ViewportOrientationMarkers::No viewport"),null)}),[t,n,s,p,m,o,e]);return r.createElement("div",{className:"ViewportOrientationMarkers select-none"},f)}N.propTypes={percentComplete:o().number,error:o().object},N.defaultProps={percentComplete:0,error:null};const R=N;function P({viewportData:e,element:t}){const[n,i]=(0,r.useState)(!1),[a,o]=(0,r.useState)(!1),s=(0,r.useRef)(null),c=(0,r.useRef)(null),m=e=>{clearTimeout(s.current),s.current=setTimeout((()=>{i(!0)}),50)},u=e=>{clearTimeout(s.current),i(!1)},p=e=>{clearTimeout(s.current),c.current===e.detail.imageId&&(o(e.detail.error),c.current=null)};return(0,r.useEffect)((()=>(t.addEventListener(l.Enums.Events.STACK_VIEWPORT_SCROLL,m),t.addEventListener(l.Enums.Events.IMAGE_LOAD_ERROR,p),t.addEventListener(l.Enums.Events.STACK_NEW_IMAGE,u),()=>{t.removeEventListener(l.Enums.Events.STACK_VIEWPORT_SCROLL,m),t.removeEventListener(l.Enums.Events.STACK_NEW_IMAGE,u),t.removeEventListener(l.Enums.Events.IMAGE_LOAD_ERROR,p)})),[t,e]),a?r.createElement(r.Fragment,null,r.createElement("div",{className:"absolute top-0 left-0 h-full w-full bg-black opacity-50"},r.createElement("div",{className:"transparent flex h-full w-full items-center justify-center"},r.createElement("p",{className:"text-primary-light text-xl font-light"},r.createElement("h4",null,"Error Loading Image"),r.createElement("p",null,"An error has occurred."),r.createElement("p",null,a))))):n?r.createElement("div",{className:"pointer-events-none absolute top-0 left-0 h-full w-full bg-black opacity-50"},r.createElement("div",{className:"transparent flex h-full w-full items-center justify-center"},r.createElement("p",{className:"text-primary-light text-xl font-light"},"Loading..."))):null}P.propTypes={percentComplete:o().number,error:o().object,element:o().object},P.defaultProps={percentComplete:0,error:null};const O=P;const L=function(e){const{viewportId:t,element:n,scrollbarHeight:i,servicesManager:a}=e,{cornerstoneViewportService:o}=a.services,[s,l]=(0,r.useState)({imageIndex:0,numberOfSlices:0}),[c,m]=(0,r.useState)(null);if((0,r.useEffect)((()=>{const{unsubscribe:e}=o.subscribe(o.EVENTS.VIEWPORT_DATA_CHANGED,(e=>{e.viewportId===t&&m(e.viewportData)}));return()=>{e()}}),[t]),!n)return null;if(c){const e=o.getViewportInfo(t);if(e?.viewportOptions?.customViewportProps?.hideOverlays)return null}return r.createElement("div",{className:"noselect"},r.createElement(d,{viewportId:t,viewportData:c,element:n,imageSliceData:s,setImageSliceData:l,scrollbarHeight:i,servicesManager:a}),r.createElement(x,{imageSliceData:s,viewportData:c,viewportId:t,servicesManager:a,element:n}),r.createElement(O,{viewportData:c,element:n}),r.createElement(R,{imageSliceData:s,element:n,viewportData:c,servicesManager:a,viewportId:t}))};var k=n(1663),A=n(23722),_=n(15575);function U({viewportId:e,cineService:t,newStackFrameRate:n,isPlaying:i,dynamicInfo:a,customizationService:o}){const{component:s=m.F0}=o.get("cinePlayer")??{},[c,u]=(0,r.useState)(a);(0,r.useEffect)((()=>{u(a)}),[a]),(0,r.useEffect)((()=>{if(!c)return;const e=e=>{const{volumeId:t,timePointIndex:n,numTimePoints:r,splittingTag:i}=e.detail;u({volumeId:t,timePointIndex:n,numTimePoints:r,label:i})};return l.eventTarget.addEventListener(A.fX.s.DYNAMIC_VOLUME_TIME_POINT_INDEX_CHANGED,e),()=>{l.eventTarget.removeEventListener(A.fX.s.DYNAMIC_VOLUME_TIME_POINT_INDEX_CHANGED,e)}}),[c]),(0,r.useEffect)((()=>{if(!c)return;const{volumeId:e,timePointIndex:t,numTimePoints:n,splittingTag:r}=c||{};l.cache.getVolume(e).timePointIndex=t,u({volumeId:e,timePointIndex:t,numTimePoints:n,label:r})}),[]);const p=(0,r.useCallback)((e=>{const{volumeId:t,timePointIndex:n}=e;l.cache.getVolume(t).timePointIndex=n}),[]);return r.createElement(s,{className:"absolute left-1/2 bottom-3 -translate-x-1/2",frameRate:n,isPlaying:i,onClose:()=>{t.setCine({id:e,isPlaying:!1}),t.setIsCineEnabled(!1)},onPlayPauseChange:n=>{t.setCine({id:e,isPlaying:n})},onFrameRateChange:n=>t.setCine({id:e,frameRate:n}),dynamicInfo:c,updateDynamicInfo:p})}const F=function({enabledVPElement:e,viewportId:t,servicesManager:n}){const{customizationService:i,displaySetService:a,viewportGridService:o}=n.services,[{isCineEnabled:s,cines:c},u]=(0,m.tq)(),[p,d]=(0,r.useState)(24),[g,v]=(0,r.useState)(null),[f]=(0,_.r)(),E=(0,r.useRef)(null),w=()=>{if(!c?.[t]||!e)return;const{isPlaying:n=!1,frameRate:r=24}=c[t],i=Math.max(r,1);return n?u.playClip(e,{framesPerSecond:i,viewportId:t}):u.stopClip(e)},I=(0,r.useCallback)((()=>{if(!e||!s)return;const{viewports:n}=o.getState(),{displaySetInstanceUIDs:r}=n.get(t);let i=24,l=c[t]?.isPlaying||!1;r.forEach((e=>{const t=a.getDisplaySetByUID(e);if(t.FrameRate&&(i=Math.round(1e3/t.FrameRate),l||=!!f.autoPlayCine),t.isDynamicVolume){const{dynamicVolumeInfo:e}=t,n=e.timePoints.length,r=e.splittingTag,i=e.timePointIndex||0;v({volumeId:t.displaySetInstanceUID,timePointIndex:i,numTimePoints:n,label:r})}else v(null)})),l&&u.setIsCineEnabled(l),u.setCine({id:t,isPlaying:l,frameRate:i}),d(i)}),[a,t,o,c,s,e]);if((0,r.useEffect)((()=>(E.current=!0,I(),()=>{E.current=!1})),[s,I]),(0,r.useEffect)((()=>{s&&w()}),[s,w,e]),(0,r.useEffect)((()=>{if(e)return l.eventTarget.addEventListener(l.Enums.Events.STACK_VIEWPORT_NEW_STACK,I),e.addEventListener(l.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,I),()=>{u.setCine({id:t,isPlaying:!1}),l.eventTarget.removeEventListener(l.Enums.Events.STACK_VIEWPORT_NEW_STACK,I),e.removeEventListener(l.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,I)}}),[e,I,t]),(0,r.useEffect)((()=>{if(c&&c[t]&&e&&E.current)return w(),()=>{u.stopClip(e,{viewportId:t})}}),[c,t,u,e,w]),!s)return null;const y=c[t],S=y?.isPlaying||!1;return r.createElement(U,{viewportId:t,cineService:u,newStackFrameRate:p,isPlaying:S,dynamicInfo:g,customizationService:i})};var z=n(76255);const G=function({viewportId:e}){const[t]=(0,z.R4)();return t[e]?r.createElement(m.R2,{cornerComponents:t[e]}):null};var H=n(80619);function W({colormaps:e,viewportId:t,displaySets:n,commandsManager:i,serviceManager:a}){const{cornerstoneViewportService:o}=a.services,[s,c]=(0,r.useState)(n[0]),[u,p]=(0,r.useState)(!1),[d,g]=(0,r.useState)(null),v=(0,r.useRef)(u);v.current=u;const f=(0,r.useRef)(d);f.current=d;const E=(0,r.useRef)(s);E.current=s;const w=(0,r.useCallback)((e=>{const t=n.length>1&&!["Grayscale","X Ray"].includes(e.colormap.name)?.5:1;i.run({commandName:"setViewportColormap",commandOptions:{...e,opacity:t,immediate:!0},context:"CORNERSTONE"})}),[i]),I=(0,r.useMemo)((()=>n.map(((e,t)=>({children:e.Modality,key:t,style:{minWidth:`calc(100% / ${n.length})`,fontSize:"0.8rem",textAlign:"center",display:"flex",justifyContent:"center",alignItems:"center"}})))),[n]);return(0,r.useEffect)((()=>{c(n[n.length-1])}),[n]),r.createElement(r.Fragment,null,I.length>1&&r.createElement("div",{className:"all-in-one-menu-item flex w-full justify-center"},r.createElement(m.e2,{onActiveIndexChange:e=>{c(n[e]),g(null)},activeIndex:n.findIndex((e=>e.displaySetInstanceUID===E.current.displaySetInstanceUID))||1,className:"w-[70%] text-[10px]"},I.map((({children:e,key:t,style:n})=>r.createElement("div",{key:t,style:n},e))))),r.createElement("div",{className:"all-in-one-menu-item flex w-full justify-center"},r.createElement(m.L$,{label:"Preview in viewport",checked:u,onChange:e=>{p(e)}})),r.createElement(m.se.VG,null),r.createElement(m.se.cV,null,e.map(((n,i)=>r.createElement(m.se.q7,{key:i,label:n.description,onClick:()=>{w({viewportId:t,colormap:n,displaySetInstanceUID:E.current.displaySetInstanceUID}),g(null)},onMouseEnter:()=>{v.current&&(g(((t,n)=>{const{displaySetInstanceUID:r}=n,i=o.getCornerstoneViewport(t);if(i instanceof l.StackViewport){const{colormap:t}=i.getProperties();return t||e.find((e=>"Grayscale"===e.Name))||e[0]}const a=i.getActors().find((e=>e.uid.includes(r))),{colormap:s}=i.getProperties(a.uid);return s||e.find((e=>"Grayscale"===e.Name))||e[0]})(t,E.current)),w({viewportId:t,colormap:n,displaySetInstanceUID:E.current.displaySetInstanceUID}))},onMouseLeave:()=>{v.current&&f.current&&w({viewportId:t,colormap:f.current,displaySetInstanceUID:E.current.displaySetInstanceUID})}})))))}function j(e,t,n,r,i){const{cornerstoneViewportService:a}=r.services,o=a.getCornerstoneViewport(e),s=a.getViewportInfo(e).getViewportOptions().background;!!s&&l.utilities.isEqual(s,[1,1,1])&&(i.ticks={position:"left",style:{font:"12px Arial",color:"#000000",maxNumTicks:8,tickSize:5,tickWidth:1,labelMargin:3}});const c=[];o instanceof l.StackViewport&&c.push(e),o instanceof l.VolumeViewport&&t.forEach((e=>{c.push(e.displaySetInstanceUID)})),n.run({commandName:"toggleViewportColorbar",commandOptions:{viewportId:e,options:i,displaySetInstanceUIDs:c},context:"CORNERSTONE"})}function $({viewportId:e,displaySets:t,commandsManager:n,serviceManager:i,colorbarProperties:a}){const{colorbarService:o}=i.services,{width:s,colorbarTickPosition:l,colorbarContainerPosition:c,colormaps:u,colorbarInitialColormap:p}=a,[d,g]=(0,r.useState)(o.hasColorbar(e)),v=(0,r.useCallback)((()=>{j(e,t,n,i,{viewportId:e,colormaps:u,ticks:{position:l},width:s,position:c,activeColormapName:p})}),[n]);return(0,r.useEffect)((()=>{const{unsubscribe:t}=o.subscribe(o.EVENTS.STATE_CHANGED,(()=>{g(o.hasColorbar(e))}));return()=>{t()}}),[e]),r.createElement("div",{className:"all-in-one-menu-item flex w-full justify-center"},r.createElement("div",{className:"mr-2 w-[28px]"}),r.createElement(m.L$,{label:"Display Color bar",checked:d,onChange:()=>{v()}}))}function q({viewportId:e,commandsManager:t,presets:n}){const{t:i}=(0,H.Bd)("WindowLevelActionMenu"),a=(0,r.useCallback)((n=>{t.run({commandName:"setViewportWindowLevel",commandOptions:{...n,viewportId:e},context:"CORNERSTONE"})}),[t,e]);return r.createElement(m.se.cV,null,n.map(((e,t)=>r.createElement(r.Fragment,{key:t},Object.entries(e).map((([e,t])=>r.createElement(r.Fragment,{key:e},r.createElement(m.se.N5,null,i("Modality Presets",{modality:e})),t.map(((t,n)=>r.createElement(m.se.q7,{key:`${e}-${n}`,label:t.description,secondaryLabel:`${t.window} / ${t.level}`,onClick:()=>a(t)}))))))))))}function K({presets:e,viewportId:t,commandsManager:n,onClose:i}){const[a,o]=(0,r.useState)(e),[s,l]=(0,r.useState)(""),[c,u]=(0,r.useState)(null),p=(0,r.useCallback)((t=>{l(t);const n=t?e.filter((e=>e.name.toLowerCase().includes(t.toLowerCase()))):e;o(n)}),[e]),d=(0,r.useCallback)((e=>{n.runCommand("setViewportPreset",{...e})}),[n]);return r.createElement("div",{className:"flex min-h-full w-full flex-col justify-between"},r.createElement("div",{className:"border-secondary-light h-[433px] w-full overflow-hidden rounded border bg-black px-2.5"},r.createElement("div",{className:"flex h-[46px] w-full items-center justify-start"},r.createElement("div",{className:"h-[26px] w-[200px]"},r.createElement(m.Cv,{value:s,onDebounceChange:p,placeholder:"Search all"}))),r.createElement("div",{className:"ohif-scrollbar overflow h-[385px] w-full overflow-y-auto"},r.createElement("div",{className:"grid grid-cols-4 gap-3 pt-2 pr-3"},a.map(((e,n)=>{return r.createElement("div",{key:n,className:"flex cursor-pointer flex-col items-start",onClick:()=>{u(e),d({preset:e.name,viewportId:t})}},r.createElement(m.In,{name:e.name,className:c?.name===e.name?"border-primary-light h-[75px] w-[95px] max-w-none rounded border-2":"hover:border-primary-light h-[75px] w-[95px] max-w-none rounded border-2 border-black"}),r.createElement("label",{className:"text-aqua-pale mt-2 text-left text-xs"},(i=e.name,a=11,i.length>a?`${i.slice(0,a)}...`:i)));var i,a}))))),r.createElement("footer",{className:"flex h-[60px] w-full items-center justify-end"},r.createElement("div",{className:"flex"},r.createElement(m.$n,{name:"Cancel",size:m.Ny.Ej.medium,type:m.Ny.NW.secondary,onClick:i}," ","Cancel"," "))))}function B({viewportId:e,serviceManager:t,commandsManager:n,volumeRenderingPresets:i}){const{uiModalService:a}=t.services;return r.createElement(m.se.q7,{label:"Rendering Presets",icon:r.createElement(m.In,{name:"VolumeRendering"}),rightIcon:r.createElement(m.In,{name:"action-new-dialog"}),onClick:()=>{a.show({content:K,title:"Rendering Presets",movable:!0,contentProps:{onClose:a.hide,presets:i,viewportId:e,commandsManager:n},containerDimensions:"h-[543px] w-[460px]",contentDimensions:"h-[493px] w-[460px] pl-[12px] pr-[12px]"})}})}function Y({volumeRenderingQualityRange:e,commandsManager:t,serviceManager:n,viewportId:i}){const{cornerstoneViewportService:a}=n.services,{min:o,max:s,step:l}=e,[c,m]=(0,r.useState)(null),u=(0,r.useCallback)((e=>{t.runCommand("setVolumeRenderingQulaity",{viewportId:i,volumeQuality:e}),m(e)}),[t,i]);return(0,r.useEffect)((()=>{const e=a.getCornerstoneViewport(i),{actor:t}=e.getActors()[0],n=t.getMapper(),r=n.getInputData().getSpacing(),o=n.getSampleDistance(),s=r.reduce(((e,t)=>e+t))/3;m(o===s?1:Math.sqrt(s/(.5*o)))}),[a,i]),r.createElement(r.Fragment,null,r.createElement("div",{className:"all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px]"},r.createElement("label",{className:"block text-white",htmlFor:"volume"},"Quality"),null!==c&&r.createElement("input",{className:"bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg",value:c,id:"volume",max:s,min:o,type:"range",step:l,onChange:e=>u(parseInt(e.target.value,10)),style:{background:(e=>{const t=(e-0)/1*100;return`linear-gradient(to right, #5acce6 0%, #5acce6 ${t}%, #3a3f99 ${t}%, #3a3f99 100%)`})((c-o)/(s-o)),"--thumb-inner-color":"#5acce6","--thumb-outer-color":"#090c29"}})))}function Q({viewportId:e,commandsManager:t,serviceManager:n}){const{cornerstoneViewportService:i}=n.services,[a,o]=(0,r.useState)(null),[s,l]=(0,r.useState)(null),[c,m]=(0,r.useState)(i.getCornerstoneViewport(e)?.shiftedBy||0),[u,p]=(0,r.useState)(null),[d,g]=(0,r.useState)(!1),v=(0,r.useRef)(c),f=i.getCornerstoneViewport(e),{actor:E}=f.getActors()[0],w=E.getProperty().getScalarOpacity(0);(0,r.useEffect)((()=>{if(d)return;const e=w.getRange(),t=e[1]-e[0],n=t;o(-t),l(n),p(Math.pow(10,Math.floor(Math.log10(t/500))))}),[i,e,E,w,d]);const I=(0,r.useCallback)((n=>{const r=n-v.current;v.current=n,f.shiftedBy=n,t.runCommand("shiftVolumeOpacityPoints",{viewportId:e,shift:r})}),[t,e,f]);return r.createElement(r.Fragment,null,r.createElement("div",{className:"all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px]"},r.createElement("label",{className:"block text-white",htmlFor:"shift"},"Shift"),null!==u&&r.createElement("input",{className:"bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg",value:c,onChange:e=>{const t=parseInt(e.target.value,10);m(t),I(t)},id:"shift",onMouseDown:()=>g(!0),onMouseUp:()=>g(!1),max:s,min:a,type:"range",step:u,style:{background:(e=>{const t=(e-0)/1*100;return`linear-gradient(to right, #5acce6 0%, #5acce6 ${t}%, #3a3f99 ${t}%, #3a3f99 100%)`})((c-a)/(s-a)),"--thumb-inner-color":"#5acce6","--thumb-outer-color":"#090c29"}})))}function J({serviceManager:e,commandsManager:t,viewportId:n}){const{cornerstoneViewportService:i}=e.services,[a,o]=(0,r.useState)(null),[s,l]=(0,r.useState)(null),[c,m]=(0,r.useState)(null),u=(0,r.useCallback)((()=>{t.runCommand("setVolumeLighting",{viewportId:n,options:{ambient:a}})}),[a,t,n]),p=(0,r.useCallback)((()=>{t.runCommand("setVolumeLighting",{viewportId:n,options:{diffuse:s}})}),[s,t,n]),d=(0,r.useCallback)((()=>{t.runCommand("setVolumeLighting",{viewportId:n,options:{specular:c}})}),[c,t,n]),g=e=>{const t=(e-0)/1*100;return`linear-gradient(to right, #5acce6 0%, #5acce6 ${t}%, #3a3f99 ${t}%, #3a3f99 100%)`};return(0,r.useEffect)((()=>{const e=i.getCornerstoneViewport(n),{actor:t}=e.getActors()[0],r=t.getProperty().getAmbient(),a=t.getProperty().getDiffuse(),s=t.getProperty().getSpecular();o(r),l(a),m(s)}),[n,i]),r.createElement(r.Fragment,null,r.createElement("div",{className:"all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px]"},r.createElement("label",{className:"block text-white",htmlFor:"ambient"},"Ambient"),null!==a&&r.createElement("input",{className:"bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg",value:a,onChange:e=>{o(e.target.value),u()},id:"ambient",max:1,min:0,type:"range",step:.1,style:{background:g(a),"--thumb-inner-color":"#5acce6","--thumb-outer-color":"#090c29"}})),r.createElement("div",{className:"all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px]"},r.createElement("label",{className:"block text-white",htmlFor:"diffuse"},"Diffuse"),null!==s&&r.createElement("input",{className:"bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg",value:s,onChange:e=>{l(e.target.value),p()},id:"diffuse",max:1,min:0,type:"range",step:.1,style:{background:g(s),"--thumb-inner-color":"#5acce6","--thumb-outer-color":"#090c29"}})),r.createElement("div",{className:"all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px]"},r.createElement("label",{className:"block text-white",htmlFor:"specular"},"Specular"),null!==c&&r.createElement("input",{className:"bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg",value:c,onChange:e=>{m(e.target.value),d()},id:"specular",max:1,min:0,type:"range",step:.1,style:{background:g(c),"--thumb-inner-color":"#5acce6","--thumb-outer-color":"#090c29"}})))}function X({commandsManager:e,viewportId:t,serviceManager:n}){const{cornerstoneViewportService:i}=n.services,[a,o]=(0,r.useState)(!0),[s,l]=(0,r.useState)(0),c=(0,r.useCallback)((n=>{e.runCommand("setVolumeLighting",{viewportId:t,options:{shade:n}})}),[e,t]);return(0,r.useEffect)((()=>{const e=i.getCornerstoneViewport(t),{actor:n}=e.getActors()[0],r=n.getProperty().getShade();o(r),l(s+1)}),[t,i]),r.createElement(m.L$,{key:s,label:"Shade",checked:a,onChange:()=>{o(!a),c(!a)}})}function Z({viewportId:e,commandsManager:t,volumeRenderingQualityRange:n,serviceManager:i}){return r.createElement(m.se.cV,null,r.createElement(Y,{viewportId:e,commandsManager:t,serviceManager:i,volumeRenderingQualityRange:n}),r.createElement(Q,{viewportId:e,commandsManager:t,serviceManager:i}),r.createElement("div",{className:"all-in-one-menu-item mt-2 flex !h-[20px] w-full justify-start"},r.createElement("div",{className:"text-aqua-pale text-[13px]"},"LIGHTING")),r.createElement("div",{className:"bg-primary-dark mt-1 mb-1 h-[2px] w-full"}),r.createElement("div",{className:"all-in-one-menu-item flex w-full justify-center"},r.createElement(X,{commandsManager:t,serviceManager:i,viewportId:e})),r.createElement(J,{viewportId:e,commandsManager:t,serviceManager:i}))}function ee({viewportId:e,element:t,presets:n,verticalDirection:i,horizontalDirection:a,commandsManager:o,serviceManager:s,colorbarProperties:c,displaySets:u,volumeRenderingPresets:p,volumeRenderingQualityRange:d}){const{colormaps:g,colorbarContainerPosition:v,colorbarInitialColormap:f,colorbarTickPosition:E,width:w}=c,{colorbarService:I,cornerstoneViewportService:y}=s.services,S=y.getViewportInfo(e),b=y.getCornerstoneViewport(e),h=S.getViewportOptions().background,C=!!h&&l.utilities.isEqual(h,[1,1,1]),x=["SR","SEG","SM","RTSTRUCT","RTPLAN","RTDOSE"],{t:M}=(0,H.Bd)("WindowLevelActionMenu"),[D]=(0,m.ih)(),{activeViewportId:V}=D,[N,R]=(0,r.useState)(t?.clientHeight),[P,O]=(0,r.useState)(0),[L,k]=(0,r.useState)(!1),A=(0,r.useCallback)((()=>{j(e,u,o,s,{colormaps:g,ticks:{position:E},width:w,position:v,activeColormapName:f})}),[o]);return(0,r.useEffect)((()=>{const e=t?.clientHeight;N!==e&&R(e)}),[t,N]),(0,r.useEffect)((()=>{I.hasColorbar(e)&&window.setTimeout((()=>{I.removeColorbar(e),A()}),0)}),[e,u,b]),(0,r.useEffect)((()=>{O(P+1);y.getCornerstoneViewport(e)instanceof l.VolumeViewport3D?k(!0):k(!1)}),[u,e,n,d,p,c,V,D]),r.createElement(m.se.dd,{icon:"viewport-window-level",verticalDirection:i,horizontalDirection:a,iconClassName:T()(V===e?"visible":"invisible group-hover:visible","flex shrink-0 cursor-pointer rounded active:text-white text-primary-light",C?" hover:bg-secondary-dark":"hover:bg-secondary-light/60"),menuStyle:{maxHeight:N-32,minWidth:218},onVisibilityChange:()=>{R(t.clientHeight)},menuKey:P},r.createElement(m.se.cV,null,!L&&r.createElement($,{viewportId:e,displaySets:u.filter((e=>!x.includes(e.Modality))),commandsManager:o,serviceManager:s,colorbarProperties:c}),g&&!L&&r.createElement(m.se.g8,{key:"colorLUTPresets",itemLabel:"Color LUT",itemIcon:"icon-color-lut"},r.createElement(W,{colormaps:g,viewportId:e,displaySets:u.filter((e=>!x.includes(e.Modality))),commandsManager:o,serviceManager:s})),n&&n.length>0&&!L&&r.createElement(m.se.g8,{key:"windowLevelPresets",itemLabel:M("Modality Window Presets"),itemIcon:"viewport-window-level"},r.createElement(q,{viewportId:e,commandsManager:o,presets:n})),p&&L&&r.createElement(B,{serviceManager:s,viewportId:e,commandsManager:o,volumeRenderingPresets:p}),d&&L&&r.createElement(m.se.g8,{itemLabel:"Rendering Options"},r.createElement(Z,{viewportId:e,commandsManager:o,volumeRenderingQualityRange:d,serviceManager:s}))))}let te;function ne(e,t){if(t.needsRerendering)return!1;if(e.displaySets.length!==t.displaySets.length)return!1;if(e.viewportOptions.orientation!==t.viewportOptions.orientation)return!1;if(e.viewportOptions.toolGroupId!==t.viewportOptions.toolGroupId)return!1;if(e.viewportOptions.viewportType!==t.viewportOptions.viewportType)return!1;if(t.viewportOptions.needsRerendering)return!1;const n=e.displaySets,r=t.displaySets;if(n.length!==r.length)return!1;for(let e=0;e<n.length;e++){const t=n[e],i=r.find((e=>e.displaySetInstanceUID===t.displaySetInstanceUID));if(!i)return!1;if(i.images?.length!==t.images?.length)return!1;if(i.images?.length)for(let e=0;e<i.images.length;e++)if(i.images[e].imageId!==t.images[e].imageId)return!1}return!0}const re=r.memo((e=>{const{displaySets:t,dataSource:n,viewportOptions:a,displaySetOptions:o,servicesManager:p,onElementEnabled:d,onElementDisabled:g,isJumpToMeasurementDisabled:v,initialImageIndex:f,isHangingProtocolLayout:E}=e,w=a.viewportId;if(!w)throw new Error("Viewport ID is required");a.viewportType=t.some((e=>e.isDynamicVolume&&e.isReconstructable))?"volume":a.viewportType;const[I,y]=(0,r.useState)("100px"),[S,b]=(0,r.useState)(null),h=(0,r.useRef)(),[C]=(0,_.r)(),{measurementService:x,displaySetService:M,toolbarService:T,toolGroupService:D,syncGroupService:V,cornerstoneViewportService:N,cornerstoneCacheService:R,viewportGridService:P,stateSyncService:O,viewportActionCornersService:k}=p.services,[A]=(0,m.OR)(),U=(0,r.useCallback)((()=>{const e=h.current.clientHeight-40+"px";y(e)}),[h]),z=(0,r.useCallback)((()=>{h.current&&(N.resize(),U())}),[h]),H=(0,r.useCallback)((e=>{const t=e.getRenderingEngineId(),n=e.getSyncGroups();D.removeViewportFromToolGroup(w,t),V.removeViewportFromSyncGroup(w,t,n),k.clear(w)}),[w]),W=(0,r.useCallback)((e=>{if(e.detail.element!==h.current)return;const{viewportId:t,element:n}=e.detail,r=N.getViewportInfo(t);(0,u.ye)(t,n),b(n);const i=r.getRenderingEngineId(),a=r.getToolGroupId(),o=r.getSyncGroups();D.addViewportToToolGroup(t,i,a),V.addViewportToSyncGroup(t,i,o);const s=O.getState().synchronizersStore;s?.[t]?.length&&!E&&function(e,t,n){e[t].forEach((e=>{if(!e.id)return;const{id:r,sourceViewports:i,targetViewports:a}=e,o=n.getSynchronizer(r);if(!o)return;const s=i.find((e=>e.viewportId===t)),l=a.find((e=>e.viewportId===t)),c=o.getSourceViewports().find((e=>e.viewportId===t)),m=o.getTargetViewports().find((e=>e.viewportId===t));s&&!c&&o.addSource({viewportId:s.viewportId,renderingEngineId:s.renderingEngineId}),l&&!m&&o.addTarget({viewportId:l.viewportId,renderingEngineId:l.renderingEngineId})}))}(s,t,V),d&&d(e)}),[w,d,D]);return(0,r.useEffect)((()=>(N.enableViewport(w,h.current),l.eventTarget.addEventListener(l.Enums.Events.ELEMENT_ENABLED,W),U(),()=>{const e=N.getViewportInfo(w);e&&(N.storePresentation({viewportId:w}),H(e),g&&g(e),N.disableElement(w),l.eventTarget.removeEventListener(l.Enums.Events.ELEMENT_ENABLED,W))})),[]),(0,r.useEffect)((()=>{const{unsubscribe:e}=M.subscribe(M.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,(async({displaySetInstanceUID:e,invalidateData:t})=>{if(!t)return;const r=N.getViewportInfo(w);if(r.hasDisplaySet(e)){const t=r.getViewportData(),i=await R.invalidateViewportData(t,e,n,M),a=!0;N.updateViewport(w,i,a)}}));return()=>{e()}}),[w]),(0,r.useEffect)((()=>{a.viewportType||(a.viewportType="stack");(async()=>{const e=await R.createViewportData(t,a,n,f),r=O.getState(),i=r.lutPresentationStore,l=r.positionPresentationStore,{presentationIds:c}=a,m={positionPresentation:l[c?.positionPresentationId],lutPresentation:i[c?.lutPresentationId]};let u;te?.viewportId===w&&(u=te.measurement,m.positionPresentation=null,te=null),a.needsRerendering&&(a.needsRerendering=!1),N.setViewportData(w,e,a,o,m),u&&s.annotation.selection.setAnnotationSelected(u.uid)})()}),[a,t,n]),(0,r.useEffect)((()=>{if(v)return;const e=function(e,t,n,r,i,a,o){const{unsubscribe:s}=e.subscribe(c.MeasurementService.EVENTS.JUMP_TO_MEASUREMENT_VIEWPORT,(i=>{te=i;const{viewportId:s,measurement:l,isConsumed:c}=i;l&&!c&&(void 0===te.cornerstoneViewport&&(te.cornerstoneViewport=o.getViewportIdToJump(s,l.displaySetInstanceUID,{referencedImageId:l.referencedImageId||l.metadata?.referencedImageId})),te.cornerstoneViewport===r&&ie(l,n,r,e,t,a,o))}));return s}(x,M,h,w,0,P,N);return function(e,t,n,r,i,a,o){if(!te)return;if(te.isConsumed)return void(te=null);const s=i.map((e=>e.displaySetInstanceUID));if(!s?.length)return;const{measurement:l}=te;l&&n&&s.includes(l?.displaySetInstanceUID)&&ie(l,n,r,e,t,a,o)}(x,M,h,w,t,P,N),()=>{e()}}),[t,h,w]),(0,r.useEffect)((()=>{if(!1===C.addWindowLevelActionMenu)return;const e=function({viewportId:e,element:t,displaySets:n,servicesManager:i,commandsManager:a,verticalDirection:o,horizontalDirection:s}){const{customizationService:l}=i.services,{presets:c}=l.get("cornerstone.windowLevelPresets"),m=l.get("cornerstone.colorbar"),{volumeRenderingPresets:u,volumeRenderingQualityRange:p}=l.get("cornerstone.3dVolumeRendering"),d=n.filter((e=>c[e.Modality])).map((e=>({[e.Modality]:c[e.Modality]})));return r.createElement(ee,{viewportId:e,element:t,presets:d,verticalDirection:o,horizontalDirection:s,commandsManager:a,serviceManager:i,colorbarProperties:m,displaySets:n,volumeRenderingPresets:u,volumeRenderingQualityRange:p})}({viewportId:w,element:h.current,displaySets:t,servicesManager:p,commandsManager,verticalDirection:m.se.mq.TopToBottom,horizontalDirection:m.se.Iu.RightToLeft});k.setComponent({viewportId:w,id:"windowLevelActionMenu",component:e,location:k.LOCATIONS.topRight,indexPriority:-100})}),[t,w,k,p,commandsManager]),r.createElement(r.Fragment,null,r.createElement("div",{className:"viewport-wrapper"},r.createElement(i.Ay,{onResize:z,targetRef:h.current}),r.createElement("div",{className:"cornerstone-viewport-element",style:{height:"100%",width:"100%"},onContextMenu:e=>e.preventDefault(),onMouseDown:e=>e.preventDefault(),ref:h}),r.createElement(L,{viewportId:w,toolBarService:T,element:h.current,scrollbarHeight:I,servicesManager:p}),r.createElement(F,{enabledVPElement:S,viewportId:w,servicesManager:p})),r.createElement("div",{className:"absolute top-[24px] w-full"},A.viewportId===w&&r.createElement(m.Eg,{id:"viewport-notification",message:A.message,type:A.type,actions:A.actions,onSubmit:A.onSubmit,onOutsideClick:A.onOutsideClick,onKeyPress:A.onKeyPress})),r.createElement(G,{viewportId:w}))}),ne);function ie(e,t,n,r,i,a,o){const c=t.current,{displaySetInstanceUID:m,SOPInstanceUID:u,frameNumber:p}=e;if(!u)return void console.warn("cannot jump in a non-acquisition plane measurements yet");const d=i.getDisplaySetByUID(m);a.setActiveViewportId(n);const g=(0,l.getEnabledElement)(c);if(g){const t=g.viewport;let n=0,r=!0;if(t instanceof l.StackViewport){n=t.getImageIds().findIndex((e=>{const{SOPInstanceUID:t,frameNumber:n}=(0,k.A)(e);return t===u&&(!p||p===n)}))}else{const{viewPlaneNormal:i}=e.metadata;n=d.images.findIndex((e=>e.SOPInstanceUID===u));const{viewPlaneNormal:a}=t.getCamera();i&&!l.utilities.isEqual(i.map(Math.abs),a.map(Math.abs))&&(r=!1)}if(!r||-1===n)return;s.utilities.jumpToSlice(c,{imageIndex:n}),s.annotation.selection.setAnnotationSelected(e.uid),te?.consume?.(),te=null}}re.displayName="OHIFCornerstoneViewport",re.defaultProps={isJumpToMeasurementDisabled:!1},re.propTypes={displaySets:o().array.isRequired,dataSource:o().object.isRequired,viewportOptions:o().object,displaySetOptions:o().arrayOf(o().any),servicesManager:o().object.isRequired,onElementEnabled:o().func,isJumpToMeasurementDisabled:o().bool,initialImageIdOrIndex:o().oneOfType([o().string,o().number])};const ae=re}}]);
//# sourceMappingURL=574.bundle.a8a0fa3dc86e45f0c59d.js.map