modified-dicom-pacs
Version:
A modified version of DICOM PACS implementation
1 lines • 102 kB
JavaScript
"use strict";(globalThis.webpackChunk=globalThis.webpackChunk||[]).push([[206],{7206:(e,t,a)=>{a.r(t),a.d(t,{ContextMenuController:()=>Ht,CustomizableContextMenuTypes:()=>n,StaticWadoClient:()=>A,createReportAsync:()=>ze,createReportDialogPrompt:()=>Ge,default:()=>ka,dicomWebUtils:()=>s,getStudiesForPatientByMRN:()=>Ve});var n={};a.r(n);var s={};a.r(s),a.d(s,{fixBulkDataURI:()=>O});var r=a(36922),i=a(55411),o=a(45476);const{getString:c,getName:l,getModalities:u}=i.DICOMWeb;function d(e){if(!e||!e.length)return[];const t=[];return e.forEach((e=>t.push({studyInstanceUid:c(e["0020000D"]),date:c(e["00080020"]),time:c(e["00080030"]),accession:c(e["00080050"])||"",mrn:c(e["00100020"])||"",patientName:i.utils.formatPN(l(e["00100010"]))||"",instances:Number(c(e["00201208"]))||0,description:c(e["00081030"])||"",modalities:c(u(e["00080060"],e["00080061"]))||""}))),t}async function m(e,t,a,n){return await e.searchForStudies({studyInstanceUid:void 0,queryParams:n})}function p(e,t={}){if(!e)return;const a=["00081030","00080060"].join(","),{supportsWildcard:n}=t,s=e=>n&&e?`*${e}*`:e,r={PatientName:s(e.patientName),"00100020":s(e.patientId),AccessionNumber:s(e.accessionNumber),StudyDescription:s(e.studyDescription),ModalitiesInStudy:e.modalitiesInStudy,limit:e.limit||101,offset:e.offset||0,fuzzymatching:!0===t.supportsFuzzyMatching,includefield:a};if(e.startDate&&e.endDate)r.StudyDate=`${e.startDate}-${e.endDate}`;else if(e.startDate){const t=new Date,a=String(t.getDate()).padStart(2,"0"),n=String(t.getMonth()+1).padStart(2,"0"),s=`${t.getFullYear()}${n}${a}`;r.StudyDate=`${e.startDate}-${s}`}else if(e.endDate){const t="19700102";r.StudyDate=`${t}-${e.endDate}`}if(e.studyInstanceUid){let t=e.studyInstanceUid;t=Array.isArray(t)?t.join():t,t=t.replace(/[^0-9.]+/g,"\\"),r.StudyInstanceUID=t}const i={};return Object.keys(r).forEach((e=>{void 0!==r[e]&&""!==r[e]&&(i[e]=r[e])})),i}function g({instance:e,frame:t,config:a,thumbnail:n=!1}){if(!e)return;if(e.url)return e.url;const s=n?"thumbnailRendering":"imageRendering";if(a[s]&&"wadouri"!==a[s])return function(e,t,a){const n=function(e,t,a){const n=function(e,t){const{StudyInstanceUID:a,SeriesInstanceUID:n,SOPInstanceUID:s}=e;return`${t.wadoRoot}/studies/${a}/series/${n}/instances/${s}`}(e,t);return`${n}/frames/${a=a||1}`}(e,t,a);if(n)return`wadors:${n}`}(e,a,t);{const n=function(e,t){const{StudyInstanceUID:a,SeriesInstanceUID:n,SOPInstanceUID:s}=t,r=[];r.push("requestType=WADO"),r.push(`studyUID=${a}`),r.push(`seriesUID=${n}`),r.push(`objectUID=${s}`),r.push("contentType=application/dicom"),r.push("transferSyntax=*");const i=r.join("&");return`${e.wadoUriRoot}?${i}`}(a,e);let s="dicomweb:"+n;return void 0!==t&&(s+="&frame="+t),s}}var f=a(31426);class S{constructor(e,t,a={},n=void 0,s=void 0){this.client=e,this.studyInstanceUID=t,this.filters=a,this.sortCriteria=n,this.sortFunction=s}async execLoad(){const e=await this.preLoad(),t=await this.load(e);return await this.posLoad(t)}async runLoaders(e){let t;for(const a of e)if(t=await a(),t&&t.length)break;if(e.next().done&&!t)throw new Error("RetrieveMetadataLoader failed");return t}async configLoad(){}async preLoad(){}async load(e){}async posLoad(e){}}class I extends S{getOptions(){const{studyInstanceUID:e,filters:t}=this,a={studyInstanceUID:e},{seriesInstanceUID:n}=t;return n&&(a.seriesInstanceUID=n),a}*getLoaders(){const e=[],{studyInstanceUID:t,filters:{seriesInstanceUID:a}={},client:n}=this;a&&e.push(n.retrieveSeriesMetadata.bind(n,{studyInstanceUID:t,seriesInstanceUID:a})),e.push(n.retrieveStudyMetadata.bind(n,{studyInstanceUID:t})),yield*e}async load(e){const t=this.getLoaders();return this.runLoaders(t)}async posLoad(e){return e}}const y=["00080021","00080031","0008103E","00200011"].join(",");class h{constructor(){this.metadata=void 0,this.processFunction=void 0,this.internalPromise=void 0,this.thenFunction=void 0,this.rejectFunction=void 0}setMetadata(e){this.metadata=e}setProcessFunction(e){this.processFunction=e}getPromise(){return this.start()}start(){return this.internalPromise||(this.internalPromise=this.processFunction(),this.thenFunction&&(this.then(this.thenFunction),this.thenFunction=void 0),this.rejectFunction&&(this.reject(this.rejectFunction),this.rejectFunction=void 0)),this.internalPromise}then(e){if(this.internalPromise)return this.internalPromise.then(e);this.thenFunction=e}reject(e){if(this.internalPromise)return this.internalPromise.reject(e);this.rejectFunction=e}}class v extends S{*getPreLoaders(){const e=[],{studyInstanceUID:t,filters:{seriesInstanceUID:a}={},client:n}=this;let s={studyInstanceUID:t,queryParams:{includefield:y}};a&&(s.queryParams.SeriesInstanceUID=a,e.push(n.searchForSeries.bind(n,s))),e.push(n.searchForSeries.bind(n,s)),yield*e}async preLoad(){const e=this.getPreLoaders(),t=await this.runLoaders(e),a=this.sortCriteria,n=this.sortFunction,{naturalizeDataset:s}=f.Ay.data.DicomMetaDictionary,r=t.map(s);return(0,o.LM)(r,a,n)}async load(e){const{client:t,studyInstanceUID:a}=this,n=function(e,t,a){return Object.freeze({hasNext:()=>a.length>0,next(){const{seriesInstanceUID:n,metadata:s}=a.shift(),r=new h;return r.setMetadata(s),r.setProcessFunction((()=>e.retrieveSeriesMetadata({studyInstanceUID:t,seriesInstanceUID:n}))),r}})}(t,a,e.map((e=>({seriesInstanceUID:e.SeriesInstanceUID,metadata:e})))),s=[];for(;n.hasNext();){const e=n.next();s.push(e)}return{preLoadData:e,promises:s}}async posLoad({preLoadData:e,promises:t}){return{preLoadData:e,promises:t}}}const D=async function(e,t,a,n={},s,r){const i=new(!1!==a?v:I)(e,t,n,s,r);return await i.execLoad()};const b=function(e,t,a,n,s,r){const{SeriesInstanceUIDs:i}=n;return new Promise(((o,c)=>{const l=i.map((i=>{const o=Object.assign({},n,{seriesInstanceUID:i});return D(e,t,a,o,s,r)}));Promise.all(l).then((e=>{const t={preLoadData:[],promises:[]};e.forEach((({preLoadData:e,promises:a})=>{t.preLoadData=t.preLoadData.concat(e),t.promises=t.promises.concat(a)})),o(t)}),c)}))},w="RetrieveStudyMetadata",E=new Map;function M(e,t,a,n,s,r,i={}){if(!e)throw new Error(`${w}: Required 'dicomWebClient' parameter not provided.`);if(!t)throw new Error(`${w}: Required 'StudyInstanceUID' parameter not provided.`);const o=`${i.name}:${t}`;if(E.has(o))return E.get(o);let c;return c=n&&n.SeriesInstanceUIDs?b(e,t,a,n,s,r):new Promise(((i,o)=>{D(e,t,a,n,s,r).then((function(e){i(e)}),o)})),E.set(o,c),c}function x(e){E.has(e)&&E.delete(e)}function U(e,t,a){if(a+e.length>t.length)return!1;let n=a;for(let a=0;a<e.length;a++)if(e[a]!==t[n++])return!1;return!0}const N=function(e,t,a){a=a||0;const n=function(e){const t=new Uint8Array(e.length);for(let a=0,n=e.length;a<n;a++)t[a]=e.charCodeAt(a);return t}(t);for(let t=a;t<e.length;t++)if(n[0]===e[t]&&U(n,e,t))return t;return-1};function C(e){const t=new Uint8Array(e[0]);if(t.length<25)return e;const a=N(t,"--");if(a>6)return e;const n=N(t,"\r\n\r\n",a);if(n>512)return e;const s=function(e,t,a){t=t||0,a=a||e.length-t;let n="";for(let s=t;s<t+a;s++)n+=String.fromCharCode(e[s]);return n}(t,0,n),r=function(e){for(let t=0;t<e.length;t++)if("--"===e[t].substr(0,2))return e[t]}(s.split("\r\n"));if(!r)return e;const i=n+4,o=N(t,r,i);return-1===o?e:[t.slice(i,o-2).buffer]}const{DICOMwebClient:R}=r.FH,P=R;P._orig_buildMultipartAcceptHeaderFieldValue||(P._orig_buildMultipartAcceptHeaderFieldValue=P._buildMultipartAcceptHeaderFieldValue,P._buildMultipartAcceptHeaderFieldValue=function(e,t){return 1===e.length&&e[0].mediaType.endsWith("/*")?"*/*":P._orig_buildMultipartAcceptHeaderFieldValue(e,t)});class A extends r.FH.DICOMwebClient{constructor(e){super(e),this.config=void 0,this.staticWado=void 0,this.staticWado=e.staticWado,this.config=e}retrieveBulkData(e){const t=!1!==this.config.fixBulkdataMultipart,a={...e};return this.staticWado&&(a.mediaTypes=[{mediaType:"application/*"}]),super.retrieveBulkData(a).then((e=>t?C(e):e))}retrieveInstanceFrames(e){return this.staticWado?super.retrieveInstanceFrames({...e,mediaTypes:[{mediaType:"image/*"}]}):super.retrieveInstanceFrames(e)}async searchForStudies(e){if(!this.staticWado)return super.searchForStudies(e);const t=await super.searchForStudies(e),{queryParams:a}=e;if(!a)return t;const n=this.toLowerParams(a);return t.filter((e=>{for(const t of Object.keys(A.studyFilterKeys))if(!this.filterItem(t,n,e,A.studyFilterKeys))return!1;return!0}))}async searchForSeries(e){if(!this.staticWado)return super.searchForSeries(e);const t=await super.searchForSeries(e),{queryParams:a}=e;if(!a)return t;const n=this.toLowerParams(a);return t.filter((e=>{for(const t of Object.keys(A.seriesFilterKeys))if(!this.filterItem(t,n,e,A.seriesFilterKeys))return!1;return!0}))}compareValues(e,t){if(Array.isArray(e))return e.find((e=>this.compareValues(e,t)));if(Array.isArray(t))return t.find((t=>this.compareValues(e,t)));if(t?.Alphabetic&&(t=t.Alphabetic),"string"==typeof t){if(0===t.length)return!0;if(0===e.length||"*"===e)return!0;if("*"===e[0]&&"*"===e[e.length-1])return-1!=t.indexOf(e.substring(1,e.length-1));if("*"===e[e.length-1])return-1!=t.indexOf(e.substring(0,e.length-1));if("*"===e[0])return t.indexOf(e.substring(1))===t.length-e.length+1}return e===t}compareDateRange(e,t){if(!t)return!0;const a=e.indexOf("-");if(-1===a)return this.compareValues(e,t);const n=e.substring(0,a),s=e.substring(a+1);return(!n||t>=n)&&(!s||t<=s)}filterItem(e,t,a,n){const s=n[e]||e;if(!t)return!0;const r=t[e]||t[s];if(!r)return!0;const i=a[e]||a[s];if(!i)return!1;if("DA"===i.vr&&i.Value?.[0])return this.compareDateRange(r,i.Value[0]);const o=i.Value;return this.compareValues(r,o)}toLowerParams(e){const t={};return Object.entries(e).forEach((([e,a])=>{t[e.toLowerCase()]=a})),t}}A.studyFilterKeys={studyinstanceuid:"0020000D",patientname:"00100010","00100020":"mrn",studydescription:"00081030",studydate:"00080020",modalitiesinstudy:"00080061",accessionnumber:"00080050"},A.seriesFilterKeys={seriesinstanceuid:"0020000E",seriesnumber:"00200011",modality:"00080060"};const T=(e,t)=>{const{wadoRoot:a,singlepart:n}=e,{instance:s,tag:r="PixelData",defaultPath:o="/pixeldata",defaultType:c="video/mp4",singlepart:l="video",url:u=null}=t;if(u)return u;const d=s[r];if(!d)return;if(d.DirectRetrieveURL)return d.DirectRetrieveURL;if(d.InlineBinary){const e=i.utils.b64toBlob(d.InlineBinary,c);return d.DirectRetrieveURL=URL.createObjectURL(e),d.DirectRetrieveURL}if(!n||!0!==n&&-1===n.indexOf(l)){if(d.retrieveBulkData){const e={mediaType:c};return d.retrieveBulkData(e).then((e=>(d.DirectRetrieveURL=URL.createObjectURL(new Blob([e],{type:c})),d.DirectRetrieveURL)))}return void console.warn("Unable to retrieve",r,"from",s)}const{StudyInstanceUID:m,SeriesInstanceUID:p,SOPInstanceUID:g}=s,f=d&&d.BulkDataURI||`series/${p}/instances/${g}${o}`,S=-1!==f.indexOf("?"),I=-1!==f.indexOf("accept=");return"PixelData"===r||"EncapsulatedDocument"===r?`${a}/studies/${m}/series/${p}/instances/${g}/rendered`:f+(I?"":(S?"&":"?")+`accept=${c}`)};function O(e,t,a){if(e.BulkDataURI.startsWith("http")||e.BulkDataURI.startsWith("/")){if("/"===e.BulkDataURI[0]&&a.wadoRoot.startsWith("http")){const t=new URL(a.wadoRoot);e.BulkDataURI=`${t.origin}${e.BulkDataURI}`}}else"studies"===a.bulkDataURI?.relativeResolution?e.BulkDataURI=`${a.wadoRoot}/studies/${t.StudyInstanceUID}/${e.BulkDataURI}`:"series"!==a.bulkDataURI?.relativeResolution&&a.bulkDataURI?.relativeResolution||(e.BulkDataURI=`${a.wadoRoot}/studies/${t.StudyInstanceUID}/series/${t.SeriesInstanceUID}/${e.BulkDataURI}`)}const{DicomMetaDictionary:F,DicomDict:L}=f.Ay.data,{naturalizeDataset:k,denaturalizeDataset:V}=F,$="2.25.270695996825855179949881587723571202391.2.0.0",q="OHIF-VIEWER-2.0.0",_="1.2.840.10008.1.2.1",j=i.classes.MetadataProvider;function H(e,t){const{userAuthenticationService:a,customizationService:n}=t.services;let s,l,u,f,S,I,y;const h={initialize:({params:t,query:n})=>{e.onConfiguration&&"function"==typeof e.onConfiguration&&(e=e.onConfiguration(e,{params:t,query:n})),s=JSON.parse(JSON.stringify(e)),I=()=>{const e={},t=a.getAuthorizationHeader();return t&&t.Authorization&&(e.Authorization=t.Authorization),e},y=()=>({...I(),Accept:i.utils.generateAcceptHeader(e.acceptHeader,e.requestTransferSyntaxUID,e.omitQuotationForMultipartRequest)}),l={url:e.qidoRoot,staticWado:e.staticWado,singlepart:e.singlepart,headers:a.getAuthorizationHeader(),errorInterceptor:i.r_.getHTTPErrorHandler()},u={url:e.wadoRoot,staticWado:e.staticWado,singlepart:e.singlepart,headers:a.getAuthorizationHeader(),errorInterceptor:i.r_.getHTTPErrorHandler()},f=e.staticWado?new A(l):new r.FH.DICOMwebClient(l),S=e.staticWado?new A(u):new r.FH.DICOMwebClient(u)},query:{studies:{mapParams:p.bind(),search:async function(t){f.headers=I();const{studyInstanceUid:a,seriesInstanceUid:n,...s}=p(t,{supportsFuzzyMatching:e.supportsFuzzyMatching,supportsWildcard:e.supportsWildcard})||{};return d(await m(f,0,0,s))},processResults:d.bind()},series:{search:async function(e){f.headers=I();return function(e){const t=[];return e&&e.length&&e.forEach((e=>t.push({studyInstanceUid:c(e["0020000D"]),seriesInstanceUid:c(e["0020000E"]),modality:c(e["00080060"]),seriesNumber:c(e["00200011"]),seriesDate:i.utils.formatDate(c(e["00080021"])),numSeriesInstances:Number(c(e["00201209"])),description:c(e["0008103E"])}))),(0,o.LM)(t),t}(await function(e,t){const a={includefield:["0008103E","00080021"].join(",")};return e.searchForSeries({studyInstanceUID:t,queryParams:a})}(f,e))}},instances:{search:(e,t)=>(f.headers=I(),m.call(void 0,f,e,null,t))}},retrieve:{directURL:t=>T({wadoRoot:e.wadoRoot,singlepart:e.singlepart},t),bulkDataURI:async({StudyInstanceUID:e,BulkDataURI:t})=>{f.headers=I();const a={multipart:!1,BulkDataURI:t,StudyInstanceUID:e};return f.retrieveBulkData(a).then((e=>e&&e[0]||void 0))},series:{metadata:async({StudyInstanceUID:t,filters:a,sortCriteria:n,sortFunction:s,madeInClient:r=!1,returnPromises:i=!1}={})=>{if(!t)throw new Error("Unable to query for SeriesMetadata without StudyInstanceUID");return e.enableStudyLazyLoad?h._retrieveSeriesMetadataAsync(t,a,n,s,r,i):h._retrieveSeriesMetadataSync(t,a,n,s,r)}}},store:{dicom:async(e,t,a)=>{if(S.headers=I(),e instanceof ArrayBuffer){const a={datasets:[e],request:t};await S.storeInstances(a)}else{let n=a;if(!a){const t={FileMetaInformationVersion:e._meta?.FileMetaInformationVersion?.Value,MediaStorageSOPClassUID:e.SOPClassUID,MediaStorageSOPInstanceUID:e.SOPInstanceUID,TransferSyntaxUID:_,ImplementationClassUID:$,ImplementationVersionName:q},a=V(t),s=new L(a);s.dict=V(e),n=s}const s={datasets:[n.write()],request:t};await S.storeInstances(s)}}},_retrieveSeriesMetadataSync:async(t,a,n,s,r)=>{S.headers=y();const o=(await M(S,t,!1,a,n,s,e)).map(k),c={},l={};o.forEach((a=>{c[a.SeriesInstanceUID]||(c[a.SeriesInstanceUID]={StudyInstanceUID:a.StudyInstanceUID,StudyDescription:a.StudyDescription,SeriesInstanceUID:a.SeriesInstanceUID,SeriesDescription:a.SeriesDescription,SeriesNumber:a.SeriesNumber,SeriesTime:a.SeriesTime,SOPClassUID:a.SOPClassUID,ProtocolName:a.ProtocolName,Modality:a.Modality}),l[a.SeriesInstanceUID]||(l[a.SeriesInstanceUID]=[]);const n=h.getImageIdsForInstance({instance:a});a.imageId=n,a.wadoRoot=e.wadoRoot,a.wadoUri=e.wadoUri,j.addImageIdToUIDs(n,{StudyInstanceUID:t,SeriesInstanceUID:a.SeriesInstanceUID,SOPInstanceUID:a.SOPInstanceUID}),l[a.SeriesInstanceUID].push(a)}));const u=Object.values(c);return i.DicomMetadataStore.addSeriesMetadata(u,r),Object.keys(l).forEach((e=>i.DicomMetadataStore.addInstances(l[e],r))),c},_retrieveSeriesMetadataAsync:async(t,a,n,s,r=!1,o=!1)=>{S.headers=y();const{preLoadData:c,promises:l}=await M(S,t,!0,a,n,s,e),u=t=>{const a=k(t);return e.bulkDataURI?.enabled?(Object.keys(a).forEach((t=>{const n=a[t];n&&n.BulkDataURI&&!n.Value&&(n.retrieveBulkData=(t={})=>{O(n,a,e);const{mediaType:s}=t,r={multipart:!1,BulkDataURI:n.BulkDataURI,StudyInstanceUID:a.StudyInstanceUID,mediaTypes:s?[{mediaType:s},{mediaType:"application/octet-stream"}]:void 0,...t};return f.retrieveBulkData(r).then((e=>{const t=e instanceof Array&&e.find((e=>e?.byteLength))||void 0;return n.Value=t,t}))})})),a):a};function d(){const e=i.DicomMetadataStore.getStudy(t);e&&(e.isLoaded=!0)}c.forEach((e=>{e.StudyInstanceUID=t})),i.DicomMetadataStore.addSeriesMetadata(c,r);const m=l.map((a=>(o||a?.start(),a.then((a=>{!function(a){const n=a.map(u);n.forEach((a=>{a.wadoRoot=e.wadoRoot,a.wadoUri=e.wadoUri;const n=h.getImageIdsForInstance({instance:a});a.imageId=n,j.addImageIdToUIDs(n,{StudyInstanceUID:t,SeriesInstanceUID:a.SeriesInstanceUID,SOPInstanceUID:a.SOPInstanceUID})})),i.DicomMetadataStore.addInstances(n,r)}(a)})))));return o?(Promise.all(m).then((()=>d())),l):(await Promise.all(m),d(),c)},deleteStudyMetadataPromise:x,getImageIdsForDisplaySet(e){const t=e.images,a=[];return t?(e.images.forEach((e=>{const t=e.NumberOfFrames;if(t>1)for(let n=1;n<=t;n++){const t=this.getImageIdsForInstance({instance:e,frame:n});a.push(t)}else{const t=this.getImageIdsForInstance({instance:e});a.push(t)}})),a):a},getImageIdsForInstance:({instance:t,frame:a})=>g({instance:t,frame:a,config:e}),getConfig:()=>s,getStudyInstanceUIDs({params:e,query:t}){const{StudyInstanceUIDs:a}=e,n=i.utils.splitComma(t.getAll("StudyInstanceUIDs")),s=n.length&&n||a;return s&&Array.isArray(s)?s:[s]}};var v;return e.supportsReject&&(h.reject=(v=e.wadoRoot,{series:(e,t)=>new Promise(((a,n)=>{const s=`${v}/studies/${e}/series/${t}/reject/113001%5EDCM`,r=new XMLHttpRequest;r.open("POST",s,!0),console.log(r),r.onreadystatechange=function(){if(4==r.readyState)switch(r.status){case 204:a(r.responseText);break;case 404:n("Your dataSource does not support reject functionality")}},r.send()}))})),i.pt.create(h)}const B=i.Ay.classes.MetadataProvider,G={studyInstanceUid:"StudyInstanceUID",patientId:"PatientID"};let W={urls:[],studyInstanceUIDMap:new Map};function z(e){return Object.keys(e).reduce(((t,a)=>("object"==typeof e[a]&&null!==e[a]?t[a]=z(e[a]):t[a]=e[a],a.endsWith("Sequence")&&(t[a]=i.Ay.utils.addAccessors(t[a])),t)),Array.isArray(e)?[]:{})}const Y=e=>W.urls.find((t=>t.url===e)),X=(e,t)=>{let a=[];return W.urls.map((n=>{n.studies.map((n=>{n[e]===t&&a.push(n)}))})),a};function J(e){const{wadoRoot:t}=e,a={initialize:async({query:e,url:t})=>{t||(t=e.get("url"));let a=Y(t);if(a)return a.studies.map((e=>e.StudyInstanceUID));const n=await fetch(t),s=await n.json();let r,i;s.studies.forEach((e=>{r=e.StudyInstanceUID,e.series.forEach((e=>{i=e.SeriesInstanceUID,e.instances.forEach((e=>{const{url:t,metadata:a}=e;B.addImageIdToUIDs(t,{StudyInstanceUID:r,SeriesInstanceUID:i,SOPInstanceUID:a.SOPInstanceUID})}))}))})),W.urls.push({url:t,studies:[...s.studies]}),W.studyInstanceUIDMap.set(t,s.studies.map((e=>e.StudyInstanceUID)))},query:{studies:{mapParams:()=>{},search:async e=>{const[t,a]=Object.entries(e)[0],n=G[t];return X(n,a).map((e=>({accession:e.AccessionNumber,date:e.StudyDate,description:e.StudyDescription,instances:e.NumInstances,modalities:e.Modalities,mrn:e.PatientID,patientName:e.PatientName,studyInstanceUid:e.StudyInstanceUID,NumInstances:e.NumInstances,time:e.StudyTime})))},processResults:()=>{console.warn(" DICOMJson QUERY processResults not implemented")}},series:{search:()=>{console.warn(" DICOMJson QUERY SERIES SEARCH not implemented")}},instances:{search:()=>{console.warn(" DICOMJson QUERY instances SEARCH not implemented")}}},retrieve:{directURL:t=>T(e,t),series:{metadata:async({StudyInstanceUID:e,madeInClient:t=!1,customSort:a}={})=>{if(!e)throw new Error("Unable to query for SeriesMetadata without StudyInstanceUID");const n=X("StudyInstanceUID",e)[0];let s;s=a?a(n.series):n.series;const r=s.map((e=>{const t={StudyInstanceUID:n.StudyInstanceUID,...e};return delete t.instances,t}));i.DicomMetadataStore.addSeriesMetadata(r,t);const o=s.length;s.forEach(((a,s)=>{const r=a.instances.map((e=>{const t={...z(e.metadata),url:e.url,imageId:e.url,...a,...n};return delete t.instances,delete t.series,t}));var c;c=r,i.DicomMetadataStore.addInstances(c,t),s===o-1&&(i.DicomMetadataStore.getStudy(e,t).isLoaded=!0)}))}}},store:{dicom:()=>{console.warn(" DICOMJson store dicom not implemented")}},getImageIdsForDisplaySet(t){const a=t.images,n=[];return a?(t.images.forEach((t=>{const a=t.NumberOfFrames;if(a>1)for(let s=0;s<a;s++){const a=g({instance:t,frame:s,config:e});n.push(a)}else{const a=g({instance:t,config:e});n.push(a)}})),n):n},getImageIdsForInstance:({instance:e,frame:t})=>g({instance:e,frame:t}),getStudyInstanceUIDs:({params:e,query:t})=>{const a=t.get("url");return W.studyInstanceUIDMap.get(a)}};return i.pt.create(a)}const K=i.Ay.classes.MetadataProvider,{EVENTS:Q}=i.DicomMetadataStore,Z={SR:!0,SEG:!0,DOC:!0},ee=(e,t,a=0)=>e===t?a:e<t?-1:1,te=(e,t)=>{const a=e.instances[0],n=t.instances[0],s=a.Modality,r=n.Modality,i=Z[s],o=Z[r];return i&&o?ee(a.SeriesNumber,n.SeriesNumber):i||o?i?-1:1:ee(n.SeriesNumber,a.SeriesNumber)};function ae(e){const{name:t}=e,a={initialize:({params:e,query:t})=>{},query:{studies:{mapParams:()=>{},search:e=>i.DicomMetadataStore.getStudyInstanceUIDs().map((e=>{let t=0;const a=new Set,n=i.DicomMetadataStore.getStudy(e);n.series.forEach((e=>{t+=e.instances.length,a.add(e.instances[0].Modality)}));const s=n?.series[0]?.instances[0];if(s)return{accession:s.AccessionNumber,date:s.StudyDate,description:s.StudyDescription,mrn:s.PatientID,patientName:i.utils.formatPN(s.PatientName),studyInstanceUid:s.StudyInstanceUID,time:s.StudyTime,instances:t,modalities:Array.from(a).join("/"),NumInstances:t}})),processResults:()=>{console.warn(" DICOMLocal QUERY processResults not implemented")}},series:{search:e=>i.DicomMetadataStore.getStudy(e).series.map((t=>{const a=t?.instances[0];return{studyInstanceUid:e,seriesInstanceUid:a.SeriesInstanceUID,modality:a.Modality,seriesNumber:a.SeriesNumber,seriesDate:a.SeriesDate,numSeriesInstances:t.instances.length,description:a.SeriesDescription}}))},instances:{search:()=>{console.warn(" DICOMLocal QUERY instances SEARCH not implemented")}}},retrieve:{directURL:e=>{const{instance:t,tag:a,defaultType:n}=e,s=t[a];if(s instanceof Array&&s[0]instanceof ArrayBuffer)return URL.createObjectURL(new Blob([s[0]],{type:n}))},series:{metadata:async({StudyInstanceUID:e,madeInClient:t=!1}={})=>{if(!e)throw new Error("Unable to query for SeriesMetadata without StudyInstanceUID");const a=i.DicomMetadataStore.getStudy(e,t);i.DicomMetadataStore._broadcastEvent(Q.SERIES_ADDED,{StudyInstanceUID:e,madeInClient:t}),a.series.forEach((a=>{const{SeriesInstanceUID:n}=a,s=a.instances[0].NumberOfFrames>1;a.instances.forEach(((e,t)=>{const{url:a,StudyInstanceUID:n,SeriesInstanceUID:r,SOPInstanceUID:i}=e;e.imageId=a,K.addImageIdToUIDs(a,{StudyInstanceUID:n,SeriesInstanceUID:r,SOPInstanceUID:i,frameIndex:s?t:1})})),i.DicomMetadataStore._broadcastEvent(Q.INSTANCES_ADDED,{StudyInstanceUID:e,SeriesInstanceUID:n,madeInClient:t})}))}}},store:{dicom:e=>{const t=f.Ay.data.datasetToBlob(e);var a=URL.createObjectURL(t);window.location.assign(a)}},getImageIdsForDisplaySet(e){const t=e.images,a=[];return t?(e.images.forEach((e=>{const t=e.NumberOfFrames;if(t>1)for(let n=1;n<=t;n++){const t=this.getImageIdsForInstance({instance:e,frame:n});a.push(t)}else{const t=this.getImageIdsForInstance({instance:e});a.push(t)}})),a):a},getImageIdsForInstance({instance:e,frame:t}){const{StudyInstanceUID:a,SeriesInstanceUID:n,SOPInstanceUID:s}=e;let r=i.DicomMetadataStore.getInstance(a,n,s).url;return void 0!==t&&(r+=`&frame=${t}`),r},deleteStudyMetadataPromise(){console.log("deleteStudyMetadataPromise not implemented")},getStudyInstanceUIDs:({params:e,query:t})=>{const{StudyInstanceUIDs:a}=e,n=t.getAll("StudyInstanceUIDs")||a,s=n&&Array.isArray(n)?n:[n];let r=!1;return s.forEach((e=>{const t=i.DicomMetadataStore.getStudy(e);t&&(t.series=t.series.sort(te),r=!0)})),r?s:[]}};return i.pt.create(a)}function ne(e,t){const{name:a}=e;let n;const s={initialize:async({params:e,query:s})=>{const r=s.get("url");if(!r)throw new Error(`No url for '${a}'`);{const a=await fetch(r);let i=await a.json();if(!i.servers?.dicomWeb?.[0])throw new Error("Invalid configuration returned by url");n=H(i.servers.dicomWeb[0].configuration,t),n.initialize({params:e,query:s})}},query:{studies:{search:e=>n.query.studies.search(e)},series:{search:(...e)=>n.query.series.search(...e)},instances:{search:(e,t)=>n.query.instances.search(e,t)}},retrieve:{directURL:(...e)=>n.retrieve.directURL(...e),series:{metadata:async(...e)=>n.retrieve.series.metadata(...e)}},store:{dicom:(...e)=>n.store(...e)},deleteStudyMetadataPromise:(...e)=>n.deleteStudyMetadataPromise(...e),getImageIdsForDisplaySet:(...e)=>n.getImageIdsForDisplaySet(...e),getImageIdsForInstance:(...e)=>n.getImageIdsForInstance(...e),getStudyInstanceUIDs({params:e,query:t}){let n=[];const s=t.get("studyInstanceUIDs")||t.get("studyInstanceUids");if(!s)throw new Error(`No studyInstanceUids in request for '${a}'`);return n=s.split(";"),n}};return i.pt.create(s)}var se=a(5517);const re={"query.studies.search":{mergeKey:"studyInstanceUid",tagFunc:e=>e},"query.series.search":{mergeKey:"seriesInstanceUid",tagFunc:(e,t)=>(e.forEach((e=>{e.RetrieveAETitle=t,i.DicomMetadataStore.updateSeriesMetadata(e)})),e)}},ie=async({mergeMap:e,path:t,args:a,extensionManager:n,dataSourceNames:s,defaultDataSourceName:r})=>{const{mergeKey:i,tagFunc:o}=e[t]||{tagFunc:e=>e},c=Object.values(n.dataSourceDefs),l=c.find((e=>e.sourceName===r)),u=c.filter((e=>e.sourceName!==r));l&&u.unshift(l);const d=[],m=[];for(const e of u){const{configuration:r,sourceName:i}=e;if(r&&s.includes(i)){const[e]=n.getDataSources(i),s=(0,se.get)(e,t).apply(e,a);d.push(s),m.push(i)}}const p=(await Promise.allSettled(d)).map(((e,t)=>o(e.value,m[t])));let g=[];return g=i?(0,se.uniqBy)(p.flat(),(e=>(0,se.get)(e,i))):p.flat(),g},oe=({path:e,args:t,extensionManager:a,dataSourceNames:n,defaultDataSourceName:s})=>{const r=Object.values(a.dataSourceDefs),i=r.find((e=>e.sourceName===s)),o=r.filter((e=>e.sourceName!==s));i&&o.unshift(i);const c=[];for(const s of o){const{configuration:r,sourceName:i}=s;if(r&&n.includes(i)){const[n]=a.getDataSources(i),s=(0,se.get)(n,e).apply(n,t);c.push(s)}}return c.flat()},ce=({path:e,args:t,defaultDataSourceName:a,extensionManager:n})=>{const[s]=n.getDataSources(a);return(0,se.get)(s,e).apply(s,t)},le=({path:e,args:t,defaultDataSourceName:a,extensionManager:n})=>{const[s]=t,r=i.DicomMetadataStore.getSeries(s.StudyInstanceUID,s.SeriesInstanceUID),[o]=n.getDataSources(r.RetrieveAETitle||a);return o[e](...t)};function ue(e,t,a){const{seriesMerge:n}=e,{dataSourceNames:s,defaultDataSourceName:r}=n,o={initialize:(...e)=>oe({path:"initialize",args:e,extensionManager:a,dataSourceNames:s,defaultDataSourceName:r}),query:{studies:{search:(...e)=>ie({mergeMap:re,path:"query.studies.search",args:e,extensionManager:a,dataSourceNames:s,defaultDataSourceName:r})},series:{search:(...e)=>ie({mergeMap:re,path:"query.series.search",args:e,extensionManager:a,dataSourceNames:s,defaultDataSourceName:r})},instances:{search:(...e)=>ie({mergeMap:re,path:"query.instances.search",args:e,extensionManager:a,dataSourceNames:s,defaultDataSourceName:r})}},retrieve:{bulkDataURI:(...e)=>ie({mergeMap:re,path:"retrieve.bulkDataURI",args:e,extensionManager:a,dataSourceNames:s,defaultDataSourceName:r}),directURL:(...e)=>ce({path:"retrieve.directURL",args:e,defaultDataSourceName:r,extensionManager:a}),series:{metadata:(...e)=>ie({mergeMap:re,path:"retrieve.series.metadata",args:e,extensionManager:a,dataSourceNames:s,defaultDataSourceName:r})}},store:{dicom:(...e)=>ce({path:"store.dicom",args:e,defaultDataSourceName:r,extensionManager:a})},deleteStudyMetadataPromise:(...e)=>oe({path:"deleteStudyMetadataPromise",args:e,extensionManager:a,dataSourceNames:s,defaultDataSourceName:r}),getImageIdsForDisplaySet:(...e)=>le({path:"getImageIdsForDisplaySet",args:e,defaultDataSourceName:r,extensionManager:a}),getImageIdsForInstance:(...e)=>le({path:"getImageIdsForDisplaySet",args:e,defaultDataSourceName:r,extensionManager:a}),getStudyInstanceUIDs:(...e)=>oe({path:"getStudyInstanceUIDs",args:e,extensionManager:a,dataSourceNames:s,defaultDataSourceName:r})};return i.pt.create(o)}const de=function(){return[{name:"dicomweb",type:"webApi",createDataSource:H},{name:"dicomwebproxy",type:"webApi",createDataSource:ne},{name:"dicomjson",type:"jsonApi",createDataSource:J},{name:"dicomlocal",type:"localApi",createDataSource:ae},{name:"merge",type:"mergeApi",createDataSource:ue}]};var me=a(41766),pe=a(11374),ge=a.n(pe),fe=a(5085),Se=a(15575),Ie=a(37396),ye=a(80619),he=a(10971),ve=a(912);function De(){return De=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},De.apply(this,arguments)}function be({servicesManager:e,buttonSection:t="primary"}){const{toolbarButtons:a,onInteraction:n}=(0,i.tR)({servicesManager:e,buttonSection:t});return a.length?me.createElement(me.Fragment,null,a.map((t=>{if(!t)return null;const{id:a,Component:s,componentProps:r}=t,i=me.createElement(s,De({key:a,id:a,onInteraction:n,servicesManager:e},r));return me.createElement("div",{key:a},i)}))):null}const{availableLanguages:we,defaultLanguage:Ee,currentLanguage:Me}=ve.A;const xe=function({hotkeysManager:e,extensionManager:t,servicesManager:a,appConfig:n}){const s=(0,Ie.Zp)(),r=(0,he.zy)(),{t:o}=(0,ye.Bd)(),{show:c,hide:l}=(0,fe.hS)(),{hotkeyDefinitions:u,hotkeyDefaults:d}=e,m=[{title:o("Header:About"),icon:"info",onClick:()=>c({content:fe.VT,title:o("AboutModal:About OHIF Viewer"),contentProps:{versionNumber:"3.8.0",commitHash:"1dcdc9dabe9d4179f223912d6adc00bc95629a85"},containerDimensions:"max-w-4xl max-h-4xl"})},{title:o("Header:Preferences"),icon:"settings",onClick:()=>c({title:o("UserPreferencesModal:User preferences"),content:fe.im,containerDimensions:"w-[70%] max-w-[900px]",contentProps:{hotkeyDefaults:e.getValidHotkeyDefinitions(d),hotkeyDefinitions:u,currentLanguage:Me(),availableLanguages:we,defaultLanguage:Ee,onCancel:()=>{i.ot.stopRecord(),i.ot.unpause(),l()},onSubmit:({hotkeyDefinitions:t,language:a})=>{a.value!==Me().value&&ve.A.changeLanguage(a.value),e.setHotkeys(t),l()},onReset:()=>e.restoreDefaultBindings(),hotkeysModule:i.ot}})}];return n.oidc&&m.push({title:o("Header:Logout"),icon:"power-off",onClick:async()=>{s(`/logout?redirect_uri=${encodeURIComponent(window.location.href)}`)}}),me.createElement(fe.Y9,{menuOptions:m,isReturnEnabled:!!n.showStudyList,onClickReturnButton:()=>{const{pathname:e}=r,a=e.indexOf("/",1),n=new URLSearchParams(window.location.search).get("configUrl"),i=e.substring(a+1),o=t.getDataSources(i),c=new URLSearchParams;-1!==a&&o&&c.append("datasources",e.substring(a+1)),n&&c.append("configUrl",n),s({pathname:"/",search:decodeURIComponent(c.toString())})},WhiteLabeling:n.whiteLabeling,showPatientInfo:n.showPatientInfo,servicesManager:a,Secondary:me.createElement(be,{servicesManager:a,buttonSection:"secondary"}),appConfig:n},me.createElement(fe.tH,{context:"Primary Toolbar"},me.createElement("div",{className:"relative flex justify-center gap-[4px]"},me.createElement(be,{servicesManager:a}))))};function Ue(){return Ue=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var a=arguments[t];for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(e[n]=a[n])}return e},Ue.apply(this,arguments)}const Ne=({servicesManager:e,side:t,activeTabIndex:a,tabs:n,expandedWidth:s,...r})=>{const i=e?.services?.panelService,[o,c]=(0,me.useState)(!1),[l,u]=(0,me.useState)(a),[d,m]=(0,me.useState)(n??i.getPanels(t)),p=(0,me.useCallback)((()=>{c(!0)}),[]),g=(0,me.useCallback)((({activeTabIndex:e})=>{u(e)}),[]);return(0,me.useEffect)((()=>{u(a)}),[a]),(0,me.useEffect)((()=>{const{unsubscribe:e}=i.subscribe(i.EVENTS.PANELS_CHANGED,(e=>{e.position===t&&m(i.getPanels(t))}));return()=>{e()}}),[i,t]),(0,me.useEffect)((()=>{const e=i.subscribe(i.EVENTS.ACTIVATE_PANEL,(e=>{if(!o||e.forceActive){const t=d.findIndex((t=>t.id===e.panelId));-1!==t&&u(t)}}));return()=>{e.unsubscribe()}}),[d,o,i]),me.createElement(fe.wv,Ue({},r,{side:t,tabs:d,activeTabIndex:l,onOpen:p,onActiveTabIndexChange:g,expandedWidth:s}))};function Ce({extensionManager:e,servicesManager:t,hotkeysManager:a,commandsManager:n,viewports:s,ViewportGridComp:r,leftPanelClosed:o=!1,rightPanelClosed:c=!1}){const[l]=(0,Se.r)(),{panelService:u,hangingProtocolService:d}=t.services,[m,p]=(0,me.useState)(l.showLoadingIndicator),g=(0,me.useCallback)((e=>!!u.getPanels(e).length),[u]),[f,S]=(0,me.useState)(g("right")),[I,y]=(0,me.useState)(g("left")),[h,v]=(0,me.useState)(o),[D,b]=(0,me.useState)(c);(0,me.useEffect)((()=>(document.body.classList.add("bg-black"),document.body.classList.add("overflow-hidden"),()=>{document.body.classList.remove("bg-black"),document.body.classList.remove("overflow-hidden")})),[]);(0,me.useEffect)((()=>{const{unsubscribe:e}=d.subscribe(i.Qe.EVENTS.PROTOCOL_CHANGED,(()=>{p(!1)}));return()=>{e()}}),[d]);(0,me.useEffect)((()=>{const{unsubscribe:e}=u.subscribe(u.EVENTS.PANELS_CHANGED,(({options:e})=>{y(g("left")),S(g("right")),void 0!==e?.leftPanelClosed&&v(e.leftPanelClosed),void 0!==e?.rightPanelClosed&&b(e.rightPanelClosed)}));return()=>{e()}}),[u,g]);const w=s.map((t=>{const{entry:a}=(t=>{const a=e.getModuleEntry(t);if(!a||!a.component)throw new Error(`${t} is not valid for an extension module or no component found from extension ${t}. Please verify your configuration or ensure that the extension is properly registered. It's also possible that your mode is utilizing a module from an extension that hasn't been included in its dependencies (add the extension to the "extensionDependencies" array in your mode's index.js file). Check the reference string to the extension in your Mode configuration`);return{entry:a,content:a.component}})(t.namespace);return{component:a.component,displaySetsToDisplay:t.displaySetsToDisplay}}));return me.createElement("div",null,me.createElement(xe,{hotkeysManager:a,extensionManager:e,servicesManager:t,appConfig:l}),me.createElement("div",{className:"relative flex w-full flex-row flex-nowrap items-stretch overflow-hidden bg-black",style:{height:"calc(100vh - 52px"}},me.createElement(me.Fragment,null,m&&me.createElement(fe.Jx,{className:"h-full w-full bg-black"}),I?me.createElement(fe.tH,{context:"Left Panel"},me.createElement(Ne,{side:"left",activeTabIndex:h?null:0,servicesManager:t})):null,me.createElement("div",{className:"flex h-full flex-1 flex-col"},me.createElement("div",{className:"relative flex h-full flex-1 items-center justify-center overflow-hidden bg-black"},me.createElement(fe.tH,{context:"Grid"},me.createElement(r,{servicesManager:t,viewportComponents:w,commandsManager:n})))),f?me.createElement(fe.tH,{context:"Right Panel"},me.createElement(Ne,{side:"right",activeTabIndex:D?null:0,servicesManager:t})):null)),me.createElement(fe.j,{dialogConfiguration:l?.investigationalUseDialog}))}Ce.propTypes={extensionManager:ge().shape({getModuleEntry:ge().func.isRequired}).isRequired,commandsManager:ge().instanceOf(i.Sp),servicesManager:ge().instanceOf(i.CS),leftPanels:ge().array,rightPanels:ge().array,leftPanelClosed:ge().bool.isRequired,rightPanelClosed:ge().bool.isRequired,children:ge().oneOfType([ge().node,ge().func]).isRequired,viewports:ge().array};const Re=Ce;const{sortStudyInstances:Pe,formatDate:Ae}=i.utils;function Te({servicesManager:e,getImageSrc:t,getStudiesForPatientByMRN:a,requestDisplaySetCreationForStudy:n,dataSource:s}){const{hangingProtocolService:r,displaySetService:i,uiNotificationService:o}=e.services,c=(0,Ie.Zp)(),{StudyInstanceUIDs:l}=(0,fe.Bz)(),[{activeViewportId:u,viewports:d,isHangingProtocolLayout:m},p]=(0,fe.ih)(),[g,f]=(0,me.useState)("primary"),[S,I]=(0,me.useState)([...l]),[y,h]=(0,me.useState)([]),[v,D]=(0,me.useState)([]),[b,w]=(0,me.useState)({});(0,me.useEffect)((()=>{l.forEach((e=>async function(e){const t=await s.query.studies.search({studyInstanceUid:e});if(!t?.length)throw c("/notfoundstudy","_self"),new Error("Invalid study URL");let n=t;try{n=await a(t)}catch(e){console.warn(e)}const r=n.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:Ae(e.StudyDate),description:e.StudyDescription,modalities:e.ModalitiesInStudy,numInstances:e.NumInstances})));h((e=>{const t=[...e];for(const a of r)e.find((e=>e.studyInstanceUid===a.studyInstanceUid))||t.push(a);return t}))}(e)))}),[l,s,a,c]),(0,me.useEffect)((()=>{i.activeDisplaySets.forEach((async e=>{const a={},n=i.getDisplaySetByUID(e.displaySetInstanceUID),r=s.getImageIdsForDisplaySet(n),o=r[Math.floor(r.length/2)];o&&!n?.unsupported&&(a[e.displaySetInstanceUID]=await t(o),w((e=>({...e,...a}))))}))}),[l,s,i,t]),(0,me.useEffect)((()=>{const e=Fe(i.activeDisplaySets,b);Pe(e),D(e)}),[l,b,i]),(0,me.useEffect)((()=>{const e=i.subscribe(i.EVENTS.DISPLAY_SETS_ADDED,(e=>{const{displaySetsAdded:a,options:n}=e;a.forEach((async e=>{const a={},n=i.getDisplaySetByUID(e.displaySetInstanceUID);if(n?.unsupported)return;const r=s.getImageIdsForDisplaySet(n),o=r[Math.floor(r.length/2)];o&&(a[e.displaySetInstanceUID]=await t(o,e.initialViewport),w((e=>({...e,...a}))))}))}));return()=>{e.unsubscribe()}}),[t,s,i]),(0,me.useEffect)((()=>{const e=i.subscribe(i.EVENTS.DISPLAY_SETS_CHANGED,(e=>{const t=Fe(e,b);D(t)})),t=i.subscribe(i.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,(()=>{const e=Fe(i.getActiveDisplaySets(),b);D(e)}));return()=>{e.unsubscribe(),t.unsubscribe()}}),[l,b,i]);const E=function(e,t,a){const n=[],s=[],r=[];t.forEach((t=>{const i=a.filter((e=>e.StudyInstanceUID===t.studyInstanceUid)),o=Object.assign({},t,{displaySets:i});e.includes(t.studyInstanceUid)?n.push(o):(s.push(o),r.push(o))}));const i=[{name:"primary",label:"Primary",studies:n},{name:"recent",label:"Recent",studies:s},{name:"all",label:"All",studies:r}];return i}(l,y,v);const M=d.get(u)?.displaySetInstanceUIDs;return me.createElement(fe.M4,{tabs:E,servicesManager:e,activeTabName:g,onDoubleClickThumbnail:e=>{let t=[];const a=u;try{t=r.getViewportsRequireUpdate(a,e,m)}catch(e){console.warn(e),o.show({title:"Thumbnail Double Click",message:"The selected display sets could not be added to the viewport.",type:"info",duration:3e3})}p.setDisplaySetsForViewports(t)},activeDisplaySetInstanceUIDs:M,expandedStudyInstanceUIDs:S,onClickStudy:function(e){const t=S.includes(e),a=t?[...S.filter((t=>t!==e))]:[...S,e];if(I(a),!t){n(i,e,!0)}},onClickTab:e=>{f(e)}})}Te.propTypes={servicesManager:ge().object.isRequired,dataSource:ge().shape({getImageIdsForDisplaySet:ge().func.isRequired}).isRequired,getImageSrc:ge().func.isRequired,getStudiesForPatientByMRN:ge().func.isRequired,requestDisplaySetCreationForStudy:ge().func.isRequired};const Oe=Te;function Fe(e,t){const a=[],n=[];return e.filter((e=>!e.excludeFromThumbnailBrowser)).forEach((e=>{const s=t[e.displaySetInstanceUID],r=function(e){if(Le.includes(e.Modality)||e?.unsupported)return"thumbnailNoImage";return"thumbnail"}(e);("thumbnail"===r?a:n).push({displaySetInstanceUID:e.displaySetInstanceUID,description:e.SeriesDescription||"",seriesNumber:e.SeriesNumber,modality:e.Modality,seriesDate:e.SeriesDate,seriesTime:e.SeriesTime,numInstances:e.numImageFrames,countIcon:e.countIcon,StudyInstanceUID:e.StudyInstanceUID,messages:e.messages,componentType:r,imageSrc:s,dragData:{type:"displayset",displaySetInstanceUID:e.displaySetInstanceUID},isHydratedForDerivedDisplaySet:e.isHydrated})})),[...a,...n]}const Le=["SR","SEG","SM","RTSTRUCT","RTPLAN","RTDOSE"];const ke=function(e,t){return new Promise(((a,n)=>{const s=document.createElement("canvas");e.utilities.loadImageToCanvas({canvas:s,imageId:t,thumbnail:!0}).then((e=>{a(s.toDataURL())})).catch(n)}))};const Ve=async function(e,t){return t&&t.length&&t[0].mrn?e.query.studies.search({patientId:t[0].mrn}):(console.log("No mrn found for",t),t)};const $e=function(e,t,a,n){t.activeDisplaySets.some((e=>e.StudyInstanceUID===a))||e.retrieve.series.metadata({StudyInstanceUID:a,madeInClient:n})};function qe({commandsManager:e,extensionManager:t,servicesManager:a}){const n=t.getDataSources()[0],s=Ve.bind(null,n),r=(0,me.useCallback)(function(e){const t=e.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common");try{const{cornerstone:e}=t.exports.getCornerstoneLibraries();return ke.bind(null,e)}catch(e){throw new Error("Required command not found")}}(t),[]),i=$e.bind(null,n);return me.createElement(Oe,{servicesManager:a,dataSource:n,getImageSrc:r,getStudiesForPatientByMRN:s,requestDisplaySetCreationForStudy:i})}qe.propTypes={commandsManager:ge().object.isRequired,extensionManager:ge().object.isRequired,servicesManager:ge().object.isRequired};const _e=qe;var je=a(14771),He=a.n(je);const Be={CANCEL:0,CREATE_REPORT:1};function Ge(e,{extensionManager:t}){return new Promise((function(a,n){let s;const r=Object.keys(t.dataSourceMap).filter((e=>{const a=t.dataSourceDefs[e]?.configuration;return a?.supportsStow??a?.wadoRoot})).map((e=>({value:e,label:e,placeHolder:e})));s=e.create({centralize:!0,isDraggable:!1,content:fe.lG,useLastPosition:!1,showOverlay:!0,contentProps:{title:"Create Report",value:{label:"",dataSourceName:t.activeDataSource},noCloseButton:!0,onClose:()=>{e.dismiss({id:s}),a({action:Be.CANCEL,value:void 0,dataSourceName:void 0})},actions:[{id:"cancel",text:"Cancel",type:fe.Ny.NW.secondary},{id:"save",text:"Save",type:fe.Ny.NW.primary}],onSubmit:({action:t,value:n})=>{switch(e.dismiss({id:s}),t.id){case"save":a({action:Be.CREATE_REPORT,value:n.label,dataSourceName:n.dataSourceName});break;case"cancel":a({action:Be.CANCEL,value:void 0,dataSourceName:void 0})}},body:({value:t,setValue:n})=>me.createElement(me.Fragment,null,r.length>1&&window.config?.allowMultiSelectExport&&me.createElement("div",null,me.createElement("label",{className:"text-[14px] leading-[1.2] text-white"},"Data Source"),me.createElement(fe.l6,{closeMenuOnSelect:!0,className:"border-primary-main mt-2 bg-black",options:r,placeholder:r.find((e=>e.value===t.dataSourceName)).placeHolder,value:t.dataSourceName,onChange:e=>{n((t=>({...t,dataSourceName:e.value})))},isClearable:!1})),me.createElement("div",{className:"mt-3"},me.createElement(fe.pd,{autoFocus:!0,label:"Enter the report name",labelClassName:"text-white text-[14px] leading-[1.2]",className:"border-primary-main bg-black",type:"text",value:t.label,onChange:e=>{e.persist(),n((t=>({...t,label:e.target.value})))},onKeyPress:n=>{"Enter"===n.key&&(e.dismiss({id:s}),a({action:Be.CREATE_REPORT,value:t.label}))},required:!0})))}})}))}function We(){return me.createElement("div",{className:"text-primary-active"},"Loading...")}const ze=async function({servicesManager:e,getReport:t,reportType:a="measurement"}){const{displaySetService:n,uiNotificationService:s,uiDialogService:r}=e.services,o=r.create({showOverlay:!0,isDraggable:!1,centralize:!0,content:We});try{const e=await t();i.DicomMetadataStore.addInstances([e],!0);const r=n.getMostRecentDisplaySet().displaySetInstanceUID;return s.show({title:"Create Report",message:`${a} saved successfully`,type:"success"}),[r]}catch(e){s.show({title:"Create Report",message:e.message||`Failed to store ${a}`,type:"error"})}finally{r.dismiss({id:o})}},Ye=4700;function Xe(e,t){const a=t.getActiveDisplaySets().filter((e=>"SR"===e.Modality)).find((t=>t.SeriesDescription===e));if(a){console.log("Storing to same series",a);const{instance:e}=a,{SeriesInstanceUID:t,SeriesDescription:n,SeriesDate:s,SeriesTime:r,SeriesNumber:i,Modality:o}=e;return{SeriesInstanceUID:t,SeriesDescription:n,SeriesDate:s,SeriesTime:r,SeriesNumber:i,Modality:o,InstanceNumber:a.instances.length+1}}const n=function(e){const t=e.getActiveDisplaySets().filter((e=>"SR"===e.Modality)).map((e=>e.SeriesNumber));return Math.max(...t,Ye)+1}(t);return{SeriesDescription:e,SeriesNumber:n}}const{downloadCSVReport:Je}=i.utils;function Ke({servicesManager:e,commandsManager:t,extensionManager:a}){const{t:n}=(0,ye.Bd)("MeasurementTable"),[s,r]=(0,fe.ih)(),{activeViewportId:i,viewports:o}=s,{measurementService:c,uiDialogService:l,uiNotificationService:u,displaySetService:d}=e.services,[m,p]=(0,me.useState)([]);(0,me.useEffect)((()=>{const e=He()(p,100);p(Qe(c));const t=c.EVENTS.MEASUREMENT_ADDED,a=c.EVENTS.RAW_MEASUREMENT_ADDED,n=c.EVENTS.MEASUREMENT_UPDATED,s=c.EVENTS.MEASUREMENT_REMOVED,r=c.EVENTS.MEASUREMENTS_CLEARED,i=[];return[t,a,n,s,r].forEach((t=>{i.push(c.subscribe(t,(()=>{e(Qe(c))})).unsubscribe)})),()=>{i.forEach((e=>{e()})),e.cancel()}}),[]);const g=({uid:e,isActive:t})=>{if(!t){const t=[...m],a=t.find((t=>t.uid===e));t.forEach((t=>t.isActive=t.uid===e)),a.isActive=!0,p(t)}};return me.createElement(me.Fragment,null,me.createElement("div",{className:"ohif-scrollbar overflow-y-auto overflow-x-hidden","data-cy":"measurements-panel"},me.createElement(fe.V,{title:n("Measurements"),servicesManager:e,data:m,onClick:({uid:e,isActive:t})=>{c.jumpToMeasurement(s.activeViewportId,e),g({uid:e,isActive:t})},onEdit:({uid:e,isActive:t})=>{const a=c.getMeasurement(e),n=({action:t,value:n})=>{if("save"===t.id)c.update(e,{...a,...n},!0);l.dismiss({id:"enter-annotation"})};l.create({id:"enter-annotation",centralize:!0,isDraggable:!1,showOverlay:!0,content:fe.lG,contentProps:{title:"Annotation",noCloseButton:!0,value:{label:a.label||""},body:({value:e,setValue:t})=>me.createElement(fe.pd,{label:"Enter your annotation",labelClassName:"text-white text-[14px] leading-[1.2]",autoFocus:!0,id:"annotation",className:"border-primary-main bg-black",type:"text",value:e.label,onChange:e=>{e.persist(),t((t=>({...t,label:e.target.value})))},onKeyPress:t=>{"Enter"===t.key&&n({value:e,action:{id:"save"}})}}),actions:[{id:"cancel",text:"Cancel",type:fe.Ny.NW.secondary},{id:"save",text:"Save",type:fe.Ny.NW.primary}],onSubmit:n}})}})),me.createElement("div",{className:"flex justify-center p-4"},me.createElement(fe.wr,{t:n,actions:[{label:"Export",onClick:async function(){const e=c.getMeasurements();Je(e,c)}},{label:"Create Report",onClick:async function(){const n=o.get(i),s=c.getMeasurements(),r=d.getDisplaySetByUID(n.displaySetInstanceUIDs[0]),m=s.filter((e=>r.StudyInstanceUID===e.referenceStudyUID));if(m.length<=0)return void u.show({title:"No Measurements",message:"No Measurements are added to the current Study.",type:"info",duration:3e3});const p=await Ge(l,{extensionManager:a});if(p.action===Be.CREATE_REPORT){const n=a.getDataSources(p.dataSourceName)[0],s=Xe(void 0===p.value||""===p.value?"Research Derived Series":p.value,d);return ze({servicesManager:e,getReport:async()=>t.runCommand("storeMeasurements",{measurementData:m,dataSource:n,additionalFindingTypes:["ArrowAnnotate"],options:s},"CORNERSTONE_STRUCTURED_REPORT")})}}}]})))}function Qe(e){return e.getMeasurements().map(((t,a)=>function(e,t,a){const{displayText:n,uid:s,label:r,type:i,selected:o,findingSites:c,finding:l}=e,u=c?.[0],d=r||l?.text||u?.text||"(empty)";let m=n||[];if(c){const e=[];c.forEach((t=>{t?.text!==d&&e.push(t.text)})),m=[...e,...m]}l&&l?.text!==d&&(m=[l.text,...m]);return{uid:s,label:d,baseLabel:r,measurementType:i,displayText:m,baseDisplayText:n,isActive:o,finding:l,findingSites:c}}(t,0,e.VALUE_TYPES)))}Ke.propTypes={servicesManager:ge().instanceOf(i.CS).isRequired};var Ze=a(92344);const et=function({commandsManager:e,extensionManager:t,servicesManager:a}){return[{name:"seriesList",iconName:"tab-studies",iconLabel:"Studies",label:Ze.A.t("SidePanel:Studies"),component:_e.bind(null,{commandsManager:e,extensionManager:t,servicesManager:a})},{name:"measure",iconName:"tab-linear",iconLabel:"Measure",label:Ze.A.t("SidePanel:Measurements"),secondaryLabel:Ze.A.t("SidePanel:Measurements"),component:()=>me.createElement(Ke,{commandsManager:e,servicesManager:a,extensionManager:t})}]};var tt=a(8094),at=a(48085),nt=a(14169),st=a(13835);const rt=JSON.parse('{"UU":"@ohif/extension-default"}').UU;var it=a(44563);var ot=a(58099);var ct=a(44753);function lt(e,t,a,n){const s=ct.eR.scaleAndAdd(ct.eR.create(),e,a,n);return ct.eR.distance(t,s)>n}function ut(e){if(!e?.length)return!1;const t=(0,ot.A)(e[0].ImageOrientationPatient);if(!t)return!1;const a=function(e){const t=ct.eR.fromValues(e[0],e[1],e[2]),a=ct.eR.fromValues(e[3],e[4],e[5]);return ct.eR.cross(ct.eR.create(),t,a)}(t),n=(0,ot.A)(e[0].ImagePositionPatient),s=(0,ot.A)(e[e.length-1].ImagePositionPatient),r=(0,st.jj)(n,s)/(e.length-1);let i=n;for(let t=1;t<e.length;t++){const n=e[t],s=(0,ot.A)(n.ImagePositionPatient);if(lt(i,s,a,r))return!1;i=s}return!0}function dt(e,t){e.length>2&&(function(e){if(!e?.length)return!1;const t=e[0],a=(0,ot.A)(t.Rows),n=(0,ot.A)(t.Columns);for(let t=1;t<e.length;t++){const s=e[t],{Rows:r,Columns:i}=s;if(r!==a||i!==n)return!1}return!0}(e)||t.addMessage(i.Ob.CODES.INCONSISTENT_DIMENSIONS),function(e){if(!e?.length)return!1;const t=e[0],a=(0,ot.A)(t.SamplesPerPixel);for(let t=1;t<e.length;t++){const n=e[t],{SamplesPerPixel:s}=n;if(s!==a)return!1}return!0}(e)||t.addMessage(i.Ob.CODES.INCONSISTENT_COMPONENTS),function(e){if(!e?.length)return!1;const t=e[0],a=(0,ot.A)(t.ImageOrientationPatient);for(let t=1;t<e.length;t++){const n=e[t],s=(0,ot.A)(n.ImageOrientationPatient);if(!(0,st.sW)(s,a))return!1}return!0}(e)||t.addMessage(i.Ob.CODES.INCONSISTENT_ORIENTATIONS),ut(e)||t.addMessage(i.Ob.CODES.INCONSISTENT_POSITION_INFORMATION),function(e,t){if(!e?.length)return;const a=(0,ot.A)(e[0].ImagePositionPatient);if(!a)return;const n=(0,ot.A)(e[e.length-1].ImagePositionPatient),s=(0,st.jj)(a,n)/(e.length-1);let r=a;const o=[];for(let a=1;a<e.length;a++){const n=e[a],c=(0,ot.A)(n.ImagePositionPatient),l=(0,st.jj)(c,r),u=(0,st.Op)(l,s);if(u){const e=u.issue;if(o.includes(e)||(o.push(e),e===st.JG.MISSING_FRAMES?t.addMessage(i.Ob.CODES.MISSING_FRAMES):e===st.JG.IRREGULAR_SPACING&&t.addMessage(i.Ob.CODES.IRREGULAR_SPACING)),o.length>1)break}r=c}}(e,t))}function mt(e,t,a){const n=new i.WZ;if(a)return n;if(!e.length)return void n.addMessage(i.Ob.CODES.NO_VALID_INSTANCES);const s=e[0],{Modality:r,ImageType:o,NumberOfFrames:c}=s;if(o?.includes("LOCALIZER"))return n;if(!st.Hf.includes(r))re