UNPKG

modified-dicom-pacs

Version:

A modified version of DICOM PACS implementation

2 lines 33.8 kB
"use strict";(globalThis.webpackChunk=globalThis.webpackChunk||[]).push([[325,481],{219:(e,t,n)=>{n.d(t,{A:()=>C,B:()=>U});var s=n(41766),r=n(11374),a=n.n(r),i=n(57593),o=n(6835),c=n(5085);const d={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3,NO_NOT_FOR_SERIES:4,HYDRATE_REPORT:5},u={id:"measurementTracking",initial:"idle",context:{activeViewportId:null,trackedStudy:"",trackedSeries:[],ignoredSeries:[],prevTrackedStudy:"",prevTrackedSeries:[],prevIgnoredSeries:[],ignoredSRSeriesForHydration:[],isDirty:!1},states:{off:{type:"final"},labellingOnly:{on:{TRACK_SERIES:[{target:"promptLabelAnnotation",actions:["setPreviousState"]},{target:"off"}]}},idle:{entry:"clearContext",on:{TRACK_SERIES:[{target:"promptLabelAnnotation",cond:"isLabelOnMeasure",actions:["setPreviousState"]},{target:"promptBeginTracking",actions:["setPreviousState"]}],SET_TRACKED_SERIES:[{target:"tracking",actions:["setTrackedStudyAndMultipleSeries","setIsDirtyToClean"]}],PROMPT_HYDRATE_SR:{target:"promptHydrateStructuredReport",cond:"hasNotIgnoredSRSeriesForHydration"},RESTORE_PROMPT_HYDRATE_SR:"promptHydrateStructuredReport",HYDRATE_SR:"hydrateStructuredReport",UPDATE_ACTIVE_VIEWPORT_ID:{actions:(0,i.kp)({activeViewportId:(e,t)=>t.activeViewportId})}}},promptBeginTracking:{invoke:{src:"promptBeginTracking",onDone:[{target:"tracking",actions:["setTrackedStudyAndSeries","setIsDirty"],cond:"shouldSetStudyAndSeries"},{target:"labellingOnly",cond:"isLabelOnMeasureAndShouldKillMachine"},{target:"off",cond:"shouldKillMachine"},{target:"idle"}],onError:{target:"idle"}}},tracking:{on:{TRACK_SERIES:[{target:"promptLabelAnnotation",cond:"isLabelOnMeasure",actions:["setPreviousState"]},{target:"promptTrackNewStudy",cond:"isNewStudy"},{target:"promptTrackNewSeries",cond:"isNewSeries"}],UNTRACK_SERIES:[{target:"tracking",actions:["removeTrackedSeries","setIsDirty"],cond:"hasRemainingTrackedSeries"},{target:"idle"}],SET_TRACKED_SERIES:[{target:"tracking",actions:["setTrackedStudyAndMultipleSeries"]}],SAVE_REPORT:"promptSaveReport",SET_DIRTY:[{target:"tracking",actions:["setIsDirty"],cond:"shouldSetDirty"},{target:"tracking"}]}},promptTrackNewSeries:{invoke:{src:"promptTrackNewSeries",onDone:[{target:"tracking",actions:["addTrackedSeries","setIsDirty"],cond:"shouldAddSeries"},{target:"tracking",actions:["discardPreviouslyTrackedMeasurements","setTrackedStudyAndSeries","setIsDirty"],cond:"shouldSetStudyAndSeries"},{target:"promptSaveReport",cond:"shouldPromptSaveReport"},{target:"tracking"}],onError:{target:"idle"}}},promptTrackNewStudy:{invoke:{src:"promptTrackNewStudy",onDone:[{target:"tracking",actions:["discardPreviouslyTrackedMeasurements","setTrackedStudyAndSeries","setIsDirty"],cond:"shouldSetStudyAndSeries"},{target:"tracking",actions:["ignoreSeries"],cond:"shouldAddIgnoredSeries"},{target:"promptSaveReport",cond:"shouldPromptSaveReport"},{target:"tracking"}],onError:{target:"idle"}}},promptSaveReport:{invoke:{src:"promptSaveReport",onDone:[{target:"idle",actions:["clearAllMeasurements","showStructuredReportDisplaySetInActiveViewport"],cond:"shouldSaveAndContinueWithSameReport"},{target:"tracking",actions:["discardPreviouslyTrackedMeasurements","setTrackedStudyAndSeries"],cond:"shouldSaveAndStartNewReport"},{target:"tracking"}],onError:{target:"idle"}}},promptHydrateStructuredReport:{invoke:{src:"promptHydrateStructuredReport",onDone:[{target:"tracking",actions:["setTrackedStudyAndMultipleSeries","jumpToFirstMeasurementInActiveViewport","setIsDirtyToClean"],cond:"shouldHydrateStructuredReport"},{target:"idle",actions:["ignoreHydrationForSRSeries"],cond:"shouldIgnoreHydrationForSR"}],onError:{target:"idle"}}},hydrateStructuredReport:{invoke:{src:"hydrateStructuredReport",onDone:[{target:"tracking",actions:["setTrackedStudyAndMultipleSeries","jumpToFirstMeasurementInActiveViewport","setIsDirtyToClean"]}],onError:{target:"idle"}}},promptLabelAnnotation:{invoke:{src:"promptLabelAnnotation",onDone:[{target:"labellingOnly",cond:"wasLabellingOnly"},{target:"promptBeginTracking",cond:"wasIdle"},{target:"promptTrackNewStudy",cond:"wasTrackingAndIsNewStudy"},{target:"promptTrackNewSeries",cond:"wasTrackingAndIsNewSeries"},{target:"tracking",cond:"wasTracking"},{target:"off"}]}}},strict:!0},l={services:{promptBeginTracking:(e,t)=>{},promptTrackNewStudy:(e,t)=>{},promptTrackNewSeries:(e,t)=>{}},actions:{discardPreviouslyTrackedMeasurements:(e,t)=>{console.log("discardPreviouslyTrackedMeasurements: not implemented")},clearAllMeasurements:(e,t)=>{console.log("clearAllMeasurements: not implemented")},jumpToFirstMeasurementInActiveViewport:(e,t)=>{console.warn("jumpToFirstMeasurementInActiveViewport: not implemented")},showStructuredReportDisplaySetInActiveViewport:(e,t)=>{console.warn("showStructuredReportDisplaySetInActiveViewport: not implemented")},clearContext:(0,i.kp)({trackedStudy:"",trackedSeries:[],ignoredSeries:[],prevTrackedStudy:"",prevTrackedSeries:[],prevIgnoredSeries:[]}),setTrackedStudyAndSeries:(0,i.kp)(((e,t)=>({prevTrackedStudy:e.trackedStudy,prevTrackedSeries:e.trackedSeries.slice(),prevIgnoredSeries:e.ignoredSeries.slice(),trackedStudy:t.data.StudyInstanceUID,trackedSeries:[t.data.SeriesInstanceUID],ignoredSeries:[]}))),setTrackedStudyAndMultipleSeries:(0,i.kp)(((e,t)=>{const n=t.StudyInstanceUID||t.data.StudyInstanceUID,s=t.SeriesInstanceUIDs||t.data.SeriesInstanceUIDs;return{prevTrackedStudy:e.trackedStudy,prevTrackedSeries:e.trackedSeries.slice(),prevIgnoredSeries:e.ignoredSeries.slice(),trackedStudy:n,trackedSeries:[...e.trackedSeries,...s],ignoredSeries:[]}})),setIsDirtyToClean:(0,i.kp)(((e,t)=>({isDirty:!1}))),setIsDirty:(0,i.kp)(((e,t)=>({isDirty:!0}))),ignoreSeries:(0,i.kp)(((e,t)=>({prevIgnoredSeries:[...e.ignoredSeries],ignoredSeries:[...e.ignoredSeries,t.data.SeriesInstanceUID]}))),ignoreHydrationForSRSeries:(0,i.kp)(((e,t)=>({ignoredSRSeriesForHydration:[...e.ignoredSRSeriesForHydration,t.data.srSeriesInstanceUID]}))),addTrackedSeries:(0,i.kp)(((e,t)=>({prevTrackedSeries:[...e.trackedSeries],trackedSeries:[...e.trackedSeries,t.data.SeriesInstanceUID]}))),removeTrackedSeries:(0,i.kp)(((e,t)=>({prevTrackedSeries:e.trackedSeries.slice().filter((e=>e!==t.SeriesInstanceUID)),trackedSeries:e.trackedSeries.slice().filter((e=>e!==t.SeriesInstanceUID))}))),setPreviousState:(0,i.kp)(((e,t,n)=>({prevState:n.state.value})))},guards:{shouldSetDirty:(e,t)=>void 0===t.SeriesInstanceUID||e.trackedSeries.includes(t.SeriesInstanceUID),wasLabellingOnly:(e,t,n)=>"labellingOnly"===e.prevState,wasIdle:(e,t,n)=>"idle"===e.prevState,wasTracking:(e,t,n)=>"tracking"===e.prevState,wasTrackingAndIsNewStudy:(e,t,n)=>"tracking"===e.prevState&&!e.ignoredSeries.includes(t.data.SeriesInstanceUID)&&e.trackedStudy!==t.data.StudyInstanceUID,wasTrackingAndIsNewSeries:(e,t,n)=>"tracking"===e.prevState&&!e.ignoredSeries.includes(t.data.SeriesInstanceUID)&&!e.trackedSeries.includes(t.data.SeriesInstanceUID),shouldKillMachine:(e,t)=>t.data&&t.data.userResponse===d.NO_NEVER,shouldAddSeries:(e,t)=>t.data&&t.data.userResponse===d.ADD_SERIES,shouldSetStudyAndSeries:(e,t)=>t.data&&t.data.userResponse===d.SET_STUDY_AND_SERIES,shouldAddIgnoredSeries:(e,t)=>t.data&&t.data.userResponse===d.NO_NOT_FOR_SERIES,shouldPromptSaveReport:(e,t)=>t.data&&t.data.userResponse===d.CREATE_REPORT,shouldIgnoreHydrationForSR:(e,t)=>t.data&&t.data.userResponse===d.CANCEL,shouldSaveAndContinueWithSameReport:(e,t)=>t.data&&t.data.userResponse===d.CREATE_REPORT&&!0===t.data.isBackupSave,shouldSaveAndStartNewReport:(e,t)=>t.data&&t.data.userResponse===d.CREATE_REPORT&&!1===t.data.isBackupSave,shouldHydrateStructuredReport:(e,t)=>t.data&&t.data.userResponse===d.HYDRATE_REPORT,hasRemainingTrackedSeries:(e,t)=>e.trackedSeries.length>1||!e.trackedSeries.includes(t.SeriesInstanceUID),hasNotIgnoredSRSeriesForHydration:(e,t)=>!e.ignoredSRSeriesForHydration.includes(t.SeriesInstanceUID),isNewStudy:(e,t)=>!e.ignoredSeries.includes(t.SeriesInstanceUID)&&e.trackedStudy!==t.StudyInstanceUID,isNewSeries:(e,t)=>!e.ignoredSeries.includes(t.SeriesInstanceUID)&&!e.trackedSeries.includes(t.SeriesInstanceUID)}};var S=n(92344);const p={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3};const y=function({servicesManager:e,extensionManager:t},n,s){const{uiViewportDialogService:r}=e.services,{viewportId:a,StudyInstanceUID:i,SeriesInstanceUID:o}=s.data||s;return new Promise((async function(e,t){let n=await function(e,t){return new Promise((function(n,s){const r=S.A.t("MeasurementTable:Track measurements for this series?"),a=[{id:"prompt-begin-tracking-cancel",type:c.Ny.NW.secondary,text:S.A.t("Common:No"),value:p.CANCEL},{id:"prompt-begin-tracking-no-do-not-ask-again",type:c.Ny.NW.secondary,text:S.A.t("MeasurementTable:No, do not ask again"),value:p.NO_NEVER},{id:"prompt-begin-tracking-yes",type:c.Ny.NW.primary,text:S.A.t("Common:Yes"),value:p.SET_STUDY_AND_SERIES}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,id:"measurement-tracking-prompt-begin-tracking",type:"info",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(p.CANCEL)},onKeyPress:e=>{if("Enter"===e.key){const e=a.find((e=>"prompt-begin-tracking-yes"===e.id));i(e.value)}}})}))}(r,a);e({userResponse:n,StudyInstanceUID:i,SeriesInstanceUID:o,viewportId:a})}))},m={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3,NO_NOT_FOR_SERIES:4};const I=function({servicesManager:e,extensionManager:t},n,s){const{UIViewportDialogService:r}=e.services,{viewportId:a,StudyInstanceUID:i,SeriesInstanceUID:o}=s.data||s;return new Promise((async function(e,t){let s=await function(e,t){return new Promise((function(n,s){const r="Do you want to add this measurement to the existing report?",a=[{type:c.Ny.NW.secondary,text:"Cancel",value:m.CANCEL},{type:c.Ny.NW.primary,text:"Create new report",value:m.CREATE_REPORT},{type:c.Ny.NW.primary,text:"Add to existing report",value:m.ADD_SERIES}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"info",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(m.CANCEL)}})}))}(r,a);s===m.CREATE_REPORT&&(s=n.isDirty?await function(e,t){return new Promise((function(n,s){const r="You have existing tracked measurements. What would you like to do with your existing tracked measurements?",a=[{type:"cancel",text:"Cancel",value:m.CANCEL},{type:"secondary",text:"Save",value:m.CREATE_REPORT},{type:"primary",text:"Discard",value:m.SET_STUDY_AND_SERIES}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"warning",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(m.CANCEL)}})}))}(r,a):m.SET_STUDY_AND_SERIES),e({userResponse:s,StudyInstanceUID:i,SeriesInstanceUID:o,viewportId:a,isBackupSave:!1})}))},g={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3,NO_NOT_FOR_SERIES:4};const E=function({servicesManager:e,extensionManager:t},n,s){const{UIViewportDialogService:r}=e.services,{viewportId:a,StudyInstanceUID:i,SeriesInstanceUID:o}=s.data||s;return new Promise((async function(e,t){let s=await function(e,t){return new Promise((function(n,s){const r=S.A.t("MeasurementTable:Track measurements for this series?"),a=[{type:"cancel",text:S.A.t("MeasurementTable:No"),value:g.CANCEL},{type:"secondary",text:S.A.t("MeasurementTable:No, do not ask again"),value:g.NO_NOT_FOR_SERIES},{type:"primary",text:S.A.t("MeasurementTable:Yes"),value:g.SET_STUDY_AND_SERIES}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"info",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(g.CANCEL)},onKeyPress:e=>{if("Enter"===e.key){const e=a.find((e=>e.value===g.SET_STUDY_AND_SERIES));i(e.value)}}})}))}(r,a);s===g.SET_STUDY_AND_SERIES&&(s=n.isDirty?await function(e,t){return new Promise((function(n,s){const r="Measurements cannot span across multiple studies. Do you want to save your tracked measurements?",a=[{type:"cancel",text:"Cancel",value:g.CANCEL},{type:"secondary",text:"No, discard previously tracked series & measurements",value:g.SET_STUDY_AND_SERIES},{type:"primary",text:"Yes",value:g.CREATE_REPORT}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"warning",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(g.CANCEL)}})}))}(r,a):g.SET_STUDY_AND_SERIES),e({userResponse:s,StudyInstanceUID:i,SeriesInstanceUID:o,viewportId:a,isBackupSave:!1})}))};var D=n(7206);const v=4700;const R={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3,NO_NOT_FOR_SERIES:4};const T=function({servicesManager:e,commandsManager:t,extensionManager:n},s,r){const{uiDialogService:a,measurementService:i,displaySetService:o}=e.services,c=void 0===r.viewportId?r.data.viewportId:r.viewportId,d=void 0===r.isBackupSave?r.data.isBackupSave:r.isBackupSave,u=r?.data?.StudyInstanceUID,l=r?.data?.SeriesInstanceUID,{trackedStudy:S,trackedSeries:p}=s;let y;return new Promise((async function(s,r){const m=await(0,D.createReportDialogPrompt)(a,{extensionManager:n});if(m.action===R.CREATE_REPORT){const s=n.getDataSources()[0],r=i.getMeasurements().filter((e=>S===e.referenceStudyUID&&p.includes(e.referenceSeriesUID))),a=void 0===m.value||""===m.value?"Research Derived Series":m.value,c=function(e){const t=e.getActiveDisplaySets().filter((e=>"SR"===e.Modality)).map((e=>e.SeriesNumber));return Math.max(...t,v)+1}(o),d=async()=>t.runCommand("storeMeasurements",{measurementData:r,dataSource:s,additionalFindingTypes:["ArrowAnnotate"],options:{SeriesDescription:a,SeriesNumber:c}},"CORNERSTONE_STRUCTURED_REPORT");y=await(0,D.createReportAsync)({servicesManager:e,getReport:d})}else m.action;s({userResponse:m.action,createdDisplaySetInstanceUIDs:y,StudyInstanceUID:u,SeriesInstanceUID:l,viewportId:c,isBackupSave:d})}))};var f=n(61669);const k={NO_NEVER:-1,CANCEL:0,CREATE_REPORT:1,ADD_SERIES:2,SET_STUDY_AND_SERIES:3,NO_NOT_FOR_SERIES:4,HYDRATE_REPORT:5};const h=function({servicesManager:e,extensionManager:t,appConfig:n},s,r){const{uiViewportDialogService:a,displaySetService:i}=e.services,{viewportId:o,displaySetInstanceUID:d}=r,u=i.getDisplaySetByUID(d);return new Promise((async function(s,i){const l=await function(e,t){return new Promise((function(n,s){const r="Do you want to continue tracking measurements for this study?",a=[{type:c.Ny.NW.secondary,text:"No",value:k.CANCEL},{type:c.Ny.NW.primary,text:"Yes",value:k.HYDRATE_REPORT}],i=t=>{e.hide(),n(t)};e.show({viewportId:t,type:"info",message:r,actions:a,onSubmit:i,onOutsideClick:()=>{e.hide(),n(k.CANCEL)},onKeyPress:e=>{if("Enter"===e.key){const e=a.find((e=>e.value===k.HYDRATE_REPORT));i(e.value)}}})}))}(a,o);let S,p;if(l===k.HYDRATE_REPORT){console.warn("!! HYDRATING STRUCTURED REPORT");const s=(0,f.hydrateStructuredReport)({servicesManager:e,extensionManager:t,appConfig:n},d);S=s.StudyInstanceUID,p=s.SeriesInstanceUIDs}s({userResponse:l,displaySetInstanceUID:r.displaySetInstanceUID,srSeriesInstanceUID:u.SeriesInstanceUID,viewportId:o,StudyInstanceUID:S,SeriesInstanceUIDs:p})}))};const A=function({servicesManager:e,extensionManager:t,appConfig:n},s,r){const{displaySetService:a}=e.services,{viewportId:i,displaySetInstanceUID:o}=r,c=a.getDisplaySetByUID(o);return new Promise(((s,a)=>{const d=(0,f.hydrateStructuredReport)({servicesManager:e,extensionManager:t,appConfig:n},o),u=d.StudyInstanceUID,l=d.SeriesInstanceUIDs;s({displaySetInstanceUID:r.displaySetInstanceUID,srSeriesInstanceUID:c.SeriesInstanceUID,viewportId:i,StudyInstanceUID:u,SeriesInstanceUIDs:l})}))};var w=n(15575);const M=function({servicesManager:e,extensionManager:t},n,s){const{measurementService:r,customizationService:a}=e.services,{viewportId:i,StudyInstanceUID:o,SeriesInstanceUID:c,measurementId:d}=s,u=t.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common"),{showLabelAnnotationPopup:l}=u.exports;return new Promise((async function(t){const n=a.get("measurementLabels"),s=r.getMeasurement(d),u=await l(s,e.services.uiDialogService,n);r.update(d,{...u},!0),t({StudyInstanceUID:o,SeriesInstanceUID:c,viewportId:i})}))},N=s.createContext();N.displayName="TrackedMeasurementsContext";const U=()=>(0,s.useContext)(N),b="@ohif/extension-cornerstone-dicom-sr.sopClassHandlerModule.dicom-sr";function _({servicesManager:e,commandsManager:t,extensionManager:n},{children:r}){const[a]=(0,w.r)(),[S,p]=(0,c.ih)(),{activeViewportId:m,viewports:g}=S,{measurementService:D,displaySetService:v,customizationService:R}=e.services,f=Object.assign({},l);f.actions=Object.assign({},f.actions,{jumpToFirstMeasurementInActiveViewport:(e,t)=>{const{trackedStudy:n,trackedSeries:s,activeViewportId:r}=e,a=D.getMeasurements().filter((e=>n===e.referenceStudyUID&&s.includes(e.referenceSeriesUID)));console.log("jumping to measurement reset viewport",r,a[0]);const i=a[0].displaySetInstanceUID,o=v.getDisplaySetByUID(i).images,c=o[0].imageId.startsWith("volumeId"),d=a[0].data;let u=0;!c&&d&&(u=o.findIndex((e=>{const t=Object.keys(d)[0].substring(8);return e.imageId===t})),-1===u&&(console.warn("Could not find image index for tracked measurement, using 0"),u=0)),p.setDisplaySetsForViewport({viewportId:r,displaySetInstanceUIDs:[i],viewportOptions:{initialImageOptions:{index:u}}})},showStructuredReportDisplaySetInActiveViewport:(e,t)=>{if(t.data.createdDisplaySetInstanceUIDs.length>0){const e=t.data.createdDisplaySetInstanceUIDs[0];p.setDisplaySetsForViewport({viewportId:t.data.viewportId,displaySetInstanceUIDs:[e]})}},discardPreviouslyTrackedMeasurements:(e,t)=>{const n=D.getMeasurements().filter((t=>e.prevTrackedSeries.includes(t.referenceSeriesUID))).map((e=>e.id));for(let e=0;e<n.length;e++)D.remove(n[e])},clearAllMeasurements:(e,t)=>{const n=D.getMeasurements().map((e=>e.uid));for(let e=0;e<n.length;e++)D.remove(n[e])}}),f.services=Object.assign({},f.services,{promptBeginTracking:y.bind(null,{servicesManager:e,extensionManager:n,appConfig:a}),promptTrackNewSeries:I.bind(null,{servicesManager:e,extensionManager:n,appConfig:a}),promptTrackNewStudy:E.bind(null,{servicesManager:e,extensionManager:n,appConfig:a}),promptSaveReport:T.bind(null,{servicesManager:e,commandsManager:t,extensionManager:n,appConfig:a}),promptHydrateStructuredReport:h.bind(null,{servicesManager:e,extensionManager:n,appConfig:a}),hydrateStructuredReport:A.bind(null,{servicesManager:e,extensionManager:n,appConfig:a}),promptLabelAnnotation:M.bind(null,{servicesManager:e,extensionManager:n})}),f.guards=Object.assign({},f.guards,{isLabelOnMeasure:(e,t,n)=>{const s=R.get("measurementLabels");return s?.labelOnMeasure},isLabelOnMeasureAndShouldKillMachine:(e,t,n)=>{const s=R.get("measurementLabels");return t.data&&t.data.userResponse===d.NO_NEVER&&s?.labelOnMeasure}});const k=(0,i.u5)(u,f),[U,_]=(0,o.zl)(k);return(0,s.useEffect)((()=>{_("UPDATE_ACTIVE_VIEWPORT_ID",{activeViewportId:m})}),[m,_]),(0,s.useEffect)((()=>{(async()=>{if(g.size>0){const t=g.get(m);if(!t||!t?.displaySetInstanceUIDs?.length)return;const{displaySetService:n}=e.services,s=n.getDisplaySetByUID(t.displaySetInstanceUIDs[0]);if(!s)return;s.SOPClassHandlerId===b&&!s.isLoaded&&s.load&&await s.load(),s.SOPClassHandlerId===b&&!0===s.isRehydratable&&(console.log("sending event...",U),_("PROMPT_HYDRATE_SR",{displaySetInstanceUID:s.displaySetInstanceUID,SeriesInstanceUID:s.SeriesInstanceUID,viewportId:m}))}})()}),[U,m,_,e.services,g]),s.createElement(N.Provider,{value:[U,_]},r)}_.propTypes={children:a().oneOf([a().func,a().node]),servicesManager:a().object.isRequired,commandsManager:a().object.isRequired,extensionManager:a().object.isRequired,appConfig:a().object};const C=function({servicesManager:e,extensionManager:t,commandsManager:n}){const s=_.bind(null,{servicesManager:e,extensionManager:t,commandsManager:n});return[{name:"TrackedMeasurementsContext",context:N,provider:s}]}},84284:(e,t,n)=>{n.r(t),n.d(t,{default:()=>x});var s=n(219),r=n(41766),a=n(11374),i=n.n(a),o=n(37396),c=n(80619),d=n(55411),u=n(5085);const{formatDate:l}=d.utils;function S({servicesManager:e,getImageSrc:t,getStudiesForPatientByMRN:n,requestDisplaySetCreationForStudy:a,dataSource:i}){const{displaySetService:d,uiDialogService:S,hangingProtocolService:p,uiNotificationService:I,measurementService:g}=e.services,E=(0,o.Zp)(),{t:D}=(0,c.Bd)("Common"),{StudyInstanceUIDs:v}=(0,u.Bz)(),[{activeViewportId:R,viewports:T,isHangingProtocolLayout:f},k]=(0,u.ih)(),[h,A]=(0,s.B)(),[w,M]=(0,r.useState)("primary"),[N,U]=(0,r.useState)([...v]),[b,_]=(0,r.useState)([]),[C,O]=(0,r.useState)([]),[P,x]=(0,r.useState)({}),[V,L]=(0,r.useState)(null),F=T.get(R)?.displaySetInstanceUIDs,{trackedSeries:j}=h.context;(0,r.useEffect)((()=>{v.forEach((e=>async function(e){const t=await i.query.studies.search({studyInstanceUid:e});if(!t?.length)throw E("/notfoundstudy","_self"),new Error("Invalid study URL");let s=t;try{s=await n(t)}catch(e){console.warn(e)}const r=s.map((e=>({AccessionNumber:e.accession,StudyDate:e.date,StudyDescription:e.description,NumInstances:e.instances,ModalitiesInStudy:e.modalities,PatientID:e.mrn,PatientName:e.patientName,StudyInstanceUID:e.studyInstanceUid,StudyTime:e.time}))).map((e=>({studyInstanceUid:e.StudyInstanceUID,date:l(e.StudyDate)||D("NoStudyDate"),description:e.StudyDescription,modalities:e.ModalitiesInStudy,numInstances:e.NumInstances})));_((e=>{const t=[...e];for(const n of r)e.find((e=>e.studyInstanceUid===n.studyInstanceUid))||t.push(n);return t}))}(e)))}),[v,n]),(0,r.useEffect)((()=>{const e=d.activeDisplaySets;e.length&&e.forEach((async e=>{const n={},s=d.getDisplaySetByUID(e.displaySetInstanceUID),r=y(s,i.getImageIdsForDisplaySet(s));r&&!s?.unsupported&&(n[e.displaySetInstanceUID]=await t(r),x((e=>({...e,...n}))))}))}),[d,i,t]),(0,r.useEffect)((()=>{const e=d.activeDisplaySets;if(!e.length)return;const t=m(e,P,j,T,k,i,d,S,I);O(t)}),[d.activeDisplaySets,j,T,i,P]),(0,r.useEffect)((()=>{const e=d.subscribe(d.EVENTS.DISPLAY_SETS_ADDED,(e=>{const{displaySetsAdded:n,options:s}=e;n.forEach((async e=>{const n=e.displaySetInstanceUID,r={},a=d.getDisplaySetByUID(n);if(a?.unsupported)return;s.madeInClient&&L(n);const o=y(a,i.getImageIdsForDisplaySet(a));o&&(r[n]=await t(o),x((e=>({...e,...r}))))}))}));return()=>{e.unsubscribe()}}),[d,i,t,P,j,T]),(0,r.useEffect)((()=>{const e=d.subscribe(d.EVENTS.DISPLAY_SETS_CHANGED,(e=>{const t=m(e,P,j,T,k,i,d,S,I);O(t)})),t=d.subscribe(d.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,(()=>{const e=m(d.getActiveDisplaySets(),P,j,T,k,i,d,S,I);O(e)}));return()=>{e.unsubscribe(),t.unsubscribe()}}),[P,j,T,i,d]);const Y=function(e,t,n,s){const r=[],a=[],i=[];t.forEach((t=>{const o=n.filter((e=>e.StudyInstanceUID===t.studyInstanceUid)),c=s.getDisplaySetSortFunction();o.sort(c);const d=Object.assign({},t,{displaySets:o});e.includes(t.studyInstanceUid)?(r.push(d),i.push(d)):(a.push(d),i.push(d))}));const o=(e,t)=>{const n=Date.parse(e);return Date.parse(t)-n},c=[{name:"primary",label:"Primary",studies:r.sort(((e,t)=>o(e.date,t.date)))},{name:"recent",label:"Recent",studies:a.sort(((e,t)=>o(e.date,t.date)))},{name:"all",label:"All",studies:i.sort(((e,t)=>o(e.date,t.date)))}];return c}(v,b,C,p);(0,r.useEffect)((()=>{if(V){const e=V,t=document.getElementById(`thumbnail-${e}`);t&&"function"==typeof t.scrollIntoView&&(t.scrollIntoView({behavior:"smooth"}),L(null))}}),[V,N,w]),(0,r.useEffect)((()=>{if(!V)return;const e=function(e,t){for(let n=0;n<t.length;n++){const{studies:s}=t[n];for(let r=0;r<s.length;r++){const{displaySets:a}=s[r];for(let i=0;i<a.length;i++){if(a[i].displaySetInstanceUID===e)return{tabName:t[n].name,StudyInstanceUID:s[r].studyInstanceUid}}}}}(V,Y);if(!e)return void console.warn("jumpToThumbnail: displaySet thumbnail not found.");const{tabName:t,StudyInstanceUID:n}=e;M(t);if(!N.includes(n)){const e=[...N,n];U(e)}}),[N,V,Y]);const H=e=>{S.create({id:"untrack-series",centralize:!0,isDraggable:!1,showOverlay:!0,content:u.lG,contentProps:{title:"Untrack Series",body:()=>r.createElement("div",{className:"bg-primary-dark p-4 text-white"},r.createElement("p",null,"Are you sure you want to untrack this series?"),r.createElement("p",{className:"mt-2"},"This action cannot be undone and will delete all your existing measurements.")),actions:[{id:"cancel",text:"Cancel",type:u.Ny.NW.secondary},{id:"yes",text:"Yes",type:u.Ny.NW.primary,classes:["untrack-yes-button"]}],onClose:()=>S.dismiss({id:"untrack-series"}),onSubmit:async({action:t})=>{switch(t.id){case"yes":(()=>{const t=d.getDisplaySetByUID(e);A("UNTRACK_SERIES",{SeriesInstanceUID:t.SeriesInstanceUID}),g.getMeasurements().forEach((e=>{e.referenceSeriesUID===t.SeriesInstanceUID&&g.remove(e.uid)}))})(),S.dismiss({id:"untrack-series"});break;case"cancel":S.dismiss({id:"untrack-series"})}}}})};return r.createElement(u.M4,{tabs:Y,servicesManager:e,activeTabName:w,expandedStudyInstanceUIDs:N,onClickStudy:function(e){const t=N.includes(e),n=t?[...N.filter((t=>t!==e))]:[...N,e];if(U(n),!t){a(d,e,!0)}},onClickTab:e=>{M(e)},onClickUntrack:e=>{H(e)},onClickThumbnail:()=>{},onDoubleClickThumbnail:e=>{let t=[];const n=R;try{t=p.getViewportsRequireUpdate(n,e,f)}catch(e){console.warn(e),I.show({title:"Thumbnail Double Click",message:"The selected display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.",type:"info",duration:3e3})}k.setDisplaySetsForViewports(t)},activeDisplaySetInstanceUIDs:F})}S.propTypes={servicesManager:i().object.isRequired,dataSource:i().shape({getImageIdsForDisplaySet:i().func.isRequired}).isRequired,getImageSrc:i().func.isRequired,getStudiesForPatientByMRN:i().func.isRequired,requestDisplaySetCreationForStudy:i().func.isRequired};const p=S;function y(e,t){let n;if(e.isDynamicVolume){const t=e.dynamicVolumeInfo.timePoints,s=t[Math.floor(t.length/2)];n=s[Math.floor(s.length/2)]}else n=t[Math.floor(t.length/2)];return n}function m(e,t,n,s,a,i,o,c,d){const S=[],p=[];return e.filter((e=>!e.excludeFromThumbnailBrowser)).forEach((e=>{const s=t[e.displaySetInstanceUID],y=function(e){if(I.includes(e.Modality)||e?.unsupported)return"thumbnailNoImage";return"thumbnailTracked"}(e),m=(a.getNumViewportPanes(),"thumbnailTracked"===y?S:p),{displaySetInstanceUID:g}=e,E={displaySetInstanceUID:g,description:e.SeriesDescription,seriesNumber:e.SeriesNumber,modality:e.Modality,seriesDate:l(e.SeriesDate),numInstances:e.numImageFrames,countIcon:e.countIcon,messages:e.messages,StudyInstanceUID:e.StudyInstanceUID,componentType:y,imageSrc:s,dragData:{type:"displayset",displaySetInstanceUID:g},isTracked:n.includes(e.SeriesInstanceUID),isHydratedForDerivedDisplaySet:e.isHydrated};"thumbnailNoImage"===y&&(i.reject&&i.reject.series?(E.canReject=!e?.unsupported,E.onReject=()=>{c.create({id:"ds-reject-sr",centralize:!0,isDraggable:!1,showOverlay:!0,content:u.lG,contentProps:{title:"Delete Report",body:()=>r.createElement("div",{className:"bg-primary-dark p-4 text-white"},r.createElement("p",null,"Are you sure you want to delete this report?"),r.createElement("p",{className:"mt-2"},"This action cannot be undone.")),actions:[{id:"cancel",text:"Cancel",type:u.Ny.NW.secondary},{id:"yes",text:"Yes",type:u.Ny.NW.primary,classes:["reject-yes-button"]}],onClose:()=>c.dismiss({id:"ds-reject-sr"}),onShow:()=>{document.querySelector(".reject-yes-button").focus()},onSubmit:async({action:t})=>{switch(t.id){case"yes":try{await i.reject.series(e.StudyInstanceUID,e.SeriesInstanceUID),o.deleteDisplaySet(g),c.dismiss({id:"ds-reject-sr"}),d.show({title:"Delete Report",message:"Report deleted successfully",type:"success"})}catch(e){c.dismiss({id:"ds-reject-sr"}),d.show({title:"Delete Report",message:"Failed to delete report",type:"error"})}break;case"cancel":c.dismiss({id:"ds-reject-sr"})}}}})}):E.canReject=!1),m.push(E)})),[...S,...p]}const I=["SR","SEG","SM","RTSTRUCT","RTPLAN","RTDOSE","DOC","OT"];const g=function(e,t){return new Promise(((n,s)=>{const r=document.createElement("canvas");e.utilities.loadImageToCanvas({canvas:r,imageId:t,thumbnail:!0}).then((e=>{n(r.toDataURL())})).catch(s)}))};const E=function(e,t,n,s){t.activeDisplaySets.some((e=>e.StudyInstanceUID===n))||e.retrieve.series.metadata({StudyInstanceUID:n,madeInClient:s})};function D({commandsManager:e,extensionManager:t,servicesManager:n}){const s=t.getActiveDataSource()[0],a=function(e){const t=e.getModuleEntry("@ohif/extension-default.utilityModule.common"),{getStudiesForPatientByMRN:n}=t.exports;return n}(t),i=a.bind(null,s),o=(0,r.useCallback)(function(e){const t=e.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common");try{const{cornerstone:e}=t.exports.getCornerstoneLibraries();return g.bind(null,e)}catch(e){throw new Error("Required command not found")}}(t),[]),c=E.bind(null,s);return r.createElement(p,{servicesManager:n,dataSource:s,getImageSrc:o,getStudiesForPatientByMRN:i,requestDisplaySetCreationForStudy:c})}D.propTypes={commandsManager:i().object.isRequired,extensionManager:i().object.isRequired,servicesManager:i().object.isRequired};const v=D;var R=n(25103),T=n(15575),f=n(14771),k=n.n(f);const{downloadCSVReport:h}=d.utils,{formatDate:A}=d.utils,w={key:void 0,date:"",modality:"",description:""};function M({servicesManager:e,extensionManager:t}){const[n]=(0,u.ih)(),{t:a}=(0,c.Bd)("MeasurementTable"),[i,o]=(0,r.useState)(Date.now().toString()),l=(0,R.d)(i,200),{measurementService:S,uiDialogService:p,displaySetService:y,customizationService:m}=e.services,[I,g]=(0,s.B)(),{trackedStudy:E,trackedSeries:D}=I.context,[v,f]=(0,r.useState)(w),[M,N]=(0,r.useState)([]),U=(0,r.useRef)(null),[b]=(0,T.r)();(0,r.useEffect)((()=>{const e=S.getMeasurements().filter((e=>E===e.referenceStudyUID&&D.includes(e.referenceSeriesUID))).map((e=>function(e,t,n){const{referenceStudyUID:s,referenceSeriesUID:r,SOPInstanceUID:a}=e,i=(d.DicomMetadataStore.getInstance(s,r,a),n.getDisplaySetsForSeries(r));if(!i[0]||!i[0].images)throw new Error('The tracked measurements panel should only be tracking "stack" displaySets.');const{displayText:o,uid:c,label:u,type:l,selected:S,findingSites:p,finding:y}=e,m=p?.[0],I=u||y?.text||m?.text||"(empty)";let g=o||[];if(p){const e=[];p.forEach((t=>{t?.text!==I&&e.push(t.text)})),g=[...e,...g]}y&&y?.text!==I&&(g=[y.text,...g]);return{uid:c,label:I,baseLabel:u,measurementType:l,displayText:g,baseDisplayText:o,isActive:S,finding:y,findingSites:p}}(e,S.VALUE_TYPES,y)));N(e)}),[S,E,D,l]);const _=async()=>{if(I.matches("tracking")){const e=E,t=d.DicomMetadataStore.getStudy(e),n=t.series[0].instances[0],{StudyDate:s,StudyDescription:r}=n,a=new Set;t.series.forEach((e=>{D.includes(e.SeriesInstanceUID)&&a.add(e.instances[0].Modality)}));const i=Array.from(a).join("/");v.key!==e&&f({key:e,date:s,modality:i,description:r})}else""!==E&&void 0!==E||f(w)};(0,r.useEffect)((()=>{_()}),[v.key,I,E,_]),(0,r.useEffect)((()=>{const e=S.EVENTS.MEASUREMENT_ADDED,t=S.EVENTS.RAW_MEASUREMENT_ADDED,n=S.EVENTS.MEASUREMENT_UPDATED,s=S.EVENTS.MEASUREMENT_REMOVED,r=S.EVENTS.MEASUREMENTS_CLEARED,a=[];return[e,t,n,s,r].forEach((t=>{a.push(S.subscribe(t,(()=>{o(Date.now().toString()),t===e&&k()((()=>{U.current.scrollTop=U.current.scrollHeight}),300)()})).unsubscribe)})),()=>{a.forEach((e=>{e()}))}}),[S,g]);const C=({uid:e,isActive:t})=>{S.jumpToMeasurement(n.activeViewportId,e),P({uid:e,isActive:t})},O=({uid:e,isActive:n})=>{C({uid:e,isActive:n});const s=m.get("measurementLabels"),r=S.getMeasurement(e),a=t.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common"),{showLabelAnnotationPopup:i}=a.exports;i(r,p,s).then((t=>{S.update(e,{...t},!0)}))},P=({uid:e,isActive:t})=>{if(!t){const t=[...M],n=t.find((t=>t.uid===e));t.forEach((t=>t.isActive=t.uid===e)),n.isActive=!0,N(t)}},x=M.filter((e=>e.measurementType!==S.VALUE_TYPES.POINT)),V=M.filter((e=>e.measurementType===S.VALUE_TYPES.POINT)),L=0===V.length&&0===x.length;return r.createElement(r.Fragment,null,r.createElement("div",{className:"invisible-scrollbar overflow-y-auto overflow-x-hidden",ref:U,"data-cy":"trackedMeasurements-panel"},v.key&&r.createElement(u.u3,{date:A(v.date),modality:v.modality,description:v.description}),r.createElement(u.V,{title:"Measurements",data:x,servicesManager:e,onClick:C,onEdit:O}),0!==V.length&&r.createElement(u.V,{title:"Additional Findings",data:V,servicesManager:e,onClick:C,onEdit:O})),!b?.disableEditing&&r.createElement("div",{className:"flex justify-center p-4"},r.createElement(u.wr,{t:a,actions:[{label:"Export",onClick:async function(){const e=S.getMeasurements().filter((e=>E===e.referenceStudyUID&&D.includes(e.referenceSeriesUID)));h(e,S)}},{label:"Create Report",onClick:()=>{g("SAVE_REPORT",{viewportId:n.activeViewportId,isBackupSave:!0})}}],disabled:L})))}M.propTypes={servicesManager:i().shape({services:i().shape({measurementService:i().shape({getMeasurements:i().func.isRequired,VALUE_TYPES:i().object.isRequired}).isRequired}).isRequired}).isRequired};const N=M;var U=n(92344);const b=function({commandsManager:e,extensionManager:t,servicesManager:n}){return[{name:"seriesList",iconName:"tab-studies",iconLabel:"Studies",label:U.A.t("SidePanel:Studies"),component:v.bind(null,{commandsManager:e,extensionManager:t,servicesManager:n})},{name:"trackedMeasurements",iconName:"tab-linear",iconLabel:"Measure",label:U.A.t("SidePanel:Measurements"),component:N.bind(null,{commandsManager:e,extensionManager:t,servicesManager:n})}]};function _(){return _=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(e[s]=n[s])}return e},_.apply(this,arguments)}const C=r.lazy((()=>n.e(862).then(n.bind(n,49862)))),O=e=>r.createElement(r.Suspense,{fallback:r.createElement("div",null,"Loading...")},r.createElement(C,e));const P=function({servicesManager:e,commandsManager:t,extensionManager:n}){return[{name:"cornerstone-tracked",component:s=>r.createElement(O,_({servicesManager:e,commandsManager:t,extensionManager:n},s))}]},x={id:JSON.parse('{"UU":"@ohif/extension-measurement-tracking"}').UU,getContextModule:s.A,getPanelModule:b,getViewportModule:P}}}]); //# sourceMappingURL=325.bundle.19e5628ba60ff7e4fda8.js.map