2 lines
90 KiB
JavaScript
2 lines
90 KiB
JavaScript
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[342],{56342:(e,t,a)=>{a.r(t),a.d(t,{ContextMenuController:()=>ht,CustomizableContextMenuTypes:()=>n,createReportAsync:()=>Ae,createReportDialogPrompt:()=>Te,default:()=>ua,dicomWebUtils:()=>s,getStudiesForPatientByMRN:()=>be});var n={};a.r(n);var s={};a.r(s),a.d(s,{fixBulkDataURI:()=>x});var r=a(97604),o=a(71771),i=a(62971);const{getString:c,getName:l,getModalities:u}=o.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:o.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){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};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 o={};return Object.keys(r).forEach((e=>{void 0!==r[e]&&""!==r[e]&&(o[e]=r[e])})),o}function g(e){let{instance:t,frame:a,config:n,thumbnail:s=!1}=e;if(!t)return;if(t.url)return t.url;const r=s?"thumbnailRendering":"imageRendering";if(n[r]&&"wadouri"!==n[r])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}`}(t,n,a);{const e=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 o=r.join("&");return`${e.wadoUriRoot}?${o}`}(n,t);let s="dicomweb:"+e;return void 0!==a&&(s+="&frame="+a),s}}var f=a(67540);class I{constructor(e,t){let a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3?arguments[3]:void 0,s=arguments.length>4?arguments[4]: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)try{if(t=await a(),t&&t.length)break}catch(e){throw e}if(e.next().done&&!t)throw new Error("RetrieveMetadataLoader failed");return t}async configLoad(){}async preLoad(){}async load(e){}async posLoad(e){}}class y extends I{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}}class S extends I{*getPreLoaders(){const e=[],{studyInstanceUID:t,filters:{seriesInstanceUID:a}={},client:n}=this;if(a){const s={studyInstanceUID:t,queryParams:{SeriesInstanceUID:a}};e.push(n.searchForSeries.bind(n,s))}e.push(n.searchForSeries.bind(n,{studyInstanceUID:t})),yield*e}async preLoad(){const e=this.getPreLoaders(),t=await this.runLoaders(e),a=this.sortCriteria,n=this.sortFunction,{naturalizeDataset:s}=f.default.data.DicomMetaDictionary,r=t.map(s);return(0,i.IO)(r,a||i.S1.seriesSortCriteria.seriesInfoSortingCriteria,n)}async load(e){const{client:t,studyInstanceUID:a}=this,n=function(e,t,a){return Object.freeze({hasNext:()=>a.length>0,async next(){const n=a.shift();return e.retrieveSeriesMetadata({studyInstanceUID:t,seriesInstanceUID:n})}})}(t,a,e.map((e=>e.SeriesInstanceUID))),s=[];for(;n.hasNext();)s.push(n.next());return{preLoadData:e,promises:s}}async posLoad(e){let{preLoadData:t,promises:a}=e;return{preLoadData:t,promises:a}}}const h=async function(e,t,a){const n=new(!1!==a?S:y)(e,t,arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},arguments.length>4?arguments[4]:void 0,arguments.length>5?arguments[5]:void 0);return await n.execLoad()},v="RetrieveStudyMetadata",D=new Map;function w(e,t,a,n,s,r){if(!e)throw new Error(`${v}: Required 'dicomWebClient' parameter not provided.`);if(!t)throw new Error(`${v}: Required 'StudyInstanceUID' parameter not provided.`);if(D.has(t))return D.get(t);const o=new Promise(((o,i)=>{h(e,t,a,n,s,r).then((function(e){o(e)}),i)}));return D.set(t,o),o}function b(e){D.has(e)&&D.delete(e)}class E extends r.api.DICOMwebClient{constructor(e){super(e),this.staticWado=e.staticWado}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(E.studyFilterKeys))if(!this.filterItem(t,n,e,E.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(E.seriesFilterKeys))if(!this.filterItem(t,n,e,E.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 o=a[e]||a[s];if(!o)return!1;if("DA"===o.vr&&o.Value?.[0])return this.compareDateRange(r,o.Value[0]);const i=o.Value;return this.compareValues(r,i)}toLowerParams(e){const t={};return Object.entries(e).forEach((e=>{let[a,n]=e;t[a.toLowerCase()]=n})),t}}E.studyFilterKeys={studyinstanceuid:"0020000D",patientname:"00100010","00100020":"mrn",studydescription:"00081030",studydate:"00080020",modalitiesinstudy:"00080061",accessionnumber:"00080050"},E.seriesFilterKeys={seriesinstanceuid:"0020000E",seriesnumber:"00200011",modality:"00080060"};const M=(e,t)=>{const{wadoRoot:a,singlepart:n}=e,{instance:s,tag:r="PixelData",defaultPath:i="/pixeldata",defaultType:c="video/mp4",singlepart:l="video"}=t,u=s[r];if(!u)return;if(u.DirectRetrieveURL)return u.DirectRetrieveURL;if(u.InlineBinary){const e=o.utils.b64toBlob(u.InlineBinary,c);return u.DirectRetrieveURL=URL.createObjectURL(e),u.DirectRetrieveURL}if(!n||!0!==n&&-1===n.indexOf(l))return u.retrieveBulkData?u.retrieveBulkData().then((e=>(u.DirectRetrieveURL=URL.createObjectURL(new Blob([e],{type:c})),u.DirectRetrieveURL))):void console.warn("Unable to retrieve",r,"from",s);const{StudyInstanceUID:d,SeriesInstanceUID:m,SOPInstanceUID:p}=s,g=u&&u.BulkDataURI||`series/${m}/instances/${p}${i}`,f=-1!==g.indexOf("?"),I=-1!==g.indexOf("accept=");return"PixelData"===r||"EncapsulatedDocument"===r?`${a}/studies/${d}/series/${m}/instances/${p}/rendered`:g+(I?"":(f?"&":"?")+`accept=${c}`)};function x(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:U,DicomDict:R}=f.default.data,{naturalizeDataset:N,denaturalizeDataset:C}=U,P="2.25.270695996825855179949881587723571202391.2.0.0",T="OHIF-VIEWER-2.0.0",O="1.2.840.10008.1.2.1",A=o.classes.MetadataProvider;function L(e,t){let a,n,s,l,u,f,I;const y={initialize:i=>{let{params:c,query:d}=i;e.onConfiguration&&"function"==typeof e.onConfiguration&&(e=e.onConfiguration(e,{params:c,query:d})),a=JSON.parse(JSON.stringify(e)),f=()=>{const e={},a=t.getAuthorizationHeader();return a&&a.Authorization&&(e.Authorization=a.Authorization),e},I=()=>({...f(),Accept:o.utils.generateAcceptHeader(e.acceptHeader,e.requestTransferSyntaxUID,e.omitQuotationForMultipartRequest)}),n={url:e.qidoRoot,staticWado:e.staticWado,singlepart:e.singlepart,headers:t.getAuthorizationHeader(),errorInterceptor:o.Po.getHTTPErrorHandler()},s={url:e.wadoRoot,staticWado:e.staticWado,singlepart:e.singlepart,headers:t.getAuthorizationHeader(),errorInterceptor:o.Po.getHTTPErrorHandler()},l=e.staticWado?new E(n):new r.api.DICOMwebClient(n),u=e.staticWado?new E(s):new r.api.DICOMwebClient(s)},query:{studies:{mapParams:p.bind(),search:async function(t){l.headers=f();const{studyInstanceUid:a,seriesInstanceUid:n,...s}=p(t,{supportsFuzzyMatching:e.supportsFuzzyMatching,supportsWildcard:e.supportsWildcard})||{};return d(await m(l,0,0,s))},processResults:d.bind()},series:{search:async function(e){l.headers=f();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:o.utils.formatDate(c(e["00080021"])),numSeriesInstances:Number(c(e["00201209"])),description:c(e["0008103E"])}))),(0,i.IO)(t),t}(await function(e,t){const a={includefield:["0008103E","00080021"].join(",")};return e.searchForSeries({studyInstanceUID:t,queryParams:a})}(l,e))}},instances:{search:(e,t)=>{l.headers=f(),m.call(void 0,l,e,null,t)}}},retrieve:{directURL:t=>M({wadoRoot:e.wadoRoot,singlepart:e.singlepart},t),bulkDataURI:async e=>{let{StudyInstanceUID:t,BulkDataURI:a}=e;l.headers=f();const n={multipart:!1,BulkDataURI:a,StudyInstanceUID:t};return l.retrieveBulkData(n).then((e=>e&&e[0]||void 0))},series:{metadata:async function(){let{StudyInstanceUID:t,filters:a,sortCriteria:n,sortFunction:s,madeInClient:r=!1}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!t)throw new Error("Unable to query for SeriesMetadata without StudyInstanceUID");return e.enableStudyLazyLoad?y._retrieveSeriesMetadataAsync(t,a,n,s,r):y._retrieveSeriesMetadataSync(t,a,n,s,r)}}},store:{dicom:async(e,t)=>{if(u.headers=f(),e instanceof ArrayBuffer){const a={datasets:[e],request:t};await u.storeInstances(a)}else{const a={FileMetaInformationVersion:e._meta?.FileMetaInformationVersion?.Value,MediaStorageSOPClassUID:e.SOPClassUID,MediaStorageSOPInstanceUID:e.SOPInstanceUID,TransferSyntaxUID:O,ImplementationClassUID:P,ImplementationVersionName:T},n=C(a),s=new R(n);s.dict=C(e);const r={datasets:[s.write()],request:t};await u.storeInstances(r)}}},_retrieveSeriesMetadataSync:async(t,a,n,s,r)=>{u.headers=I();const i=(await w(u,t,!1,a,n,s)).map(N),c={},l={};i.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=y.getImageIdsForInstance({instance:a});a.imageId=n,a.wadoRoot=e.wadoRoot,a.wadoUri=e.wadoUri,A.addImageIdToUIDs(n,{StudyInstanceUID:t,SeriesInstanceUID:a.SeriesInstanceUID,SOPInstanceUID:a.SOPInstanceUID}),l[a.SeriesInstanceUID].push(a)}));const d=Object.values(c);o.DicomMetadataStore.addSeriesMetadata(d,r),Object.keys(l).forEach((e=>o.DicomMetadataStore.addInstances(l[e],r)))},_retrieveSeriesMetadataAsync:async function(t,a,n,s){let r=arguments.length>4&&void 0!==arguments[4]&&arguments[4];u.headers=I();const{preLoadData:i,promises:c}=await w(u,t,!0,a,n,s),d=t=>{const a=N(t);return e.bulkDataURI?.enabled?(Object.keys(a).forEach((t=>{const n=a[t];n&&n.BulkDataURI&&!n.Value&&(n.retrieveBulkData=()=>{x(n,a,e);const t={multipart:!1,BulkDataURI:n.BulkDataURI,StudyInstanceUID:a.StudyInstanceUID};return l.retrieveBulkData(t).then((e=>{const t=e instanceof Array&&e.find((e=>e?.byteLength))||void 0;return n.Value=t,t}))})})),a):a};i.forEach((e=>{e.StudyInstanceUID=t})),o.DicomMetadataStore.addSeriesMetadata(i,r);const m=c.map((a=>a.then((a=>{!function(a){const n=a.map(d);n.forEach(((a,n)=>{a.wadoRoot=e.wadoRoot,a.wadoUri=e.wadoUri;const s=y.getImageIdsForInstance({instance:a});a.imageId=s,A.addImageIdToUIDs(s,{StudyInstanceUID:t,SeriesInstanceUID:a.SeriesInstanceUID,SOPInstanceUID:a.SOPInstanceUID})})),o.DicomMetadataStore.addInstances(n,r)}(a)}))));await Promise.all(m),o.DicomMetadataStore.getStudy(t,r).isLoaded=!0},deleteStudyMetadataPromise:b,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(t){let{instance:a,frame:n}=t;return g({instance:a,frame:n,config:e})},getConfig:()=>a,getStudyInstanceUIDs(e){let{params:t,query:a}=e;const{StudyInstanceUIDs:n}=t,s=o.utils.splitComma(a.getAll("StudyInstanceUIDs")),r=s.length&&s||n;return r&&Array.isArray(r)?r:[r]}};var S;return e.supportsReject&&(y.reject=(S=e.wadoRoot,{series:(e,t)=>new Promise(((a,n)=>{const s=`${S}/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()}))})),o.Is.create(y)}const k=o.default.classes.MetadataProvider,F={studyInstanceUid:"StudyInstanceUID",patientId:"PatientID"};let V={urls:[],studyInstanceUIDMap:new Map};const $=e=>V.urls.find((t=>t.url===e)),q=(e,t)=>{let a=[];return V.urls.map((n=>{n.studies.map((n=>{n[e]===t&&a.push(n)}))})),a};function _(e){const{wadoRoot:t}=e,a={initialize:async e=>{let{query:t,url:a}=e;a||(a=t.get("url"));let n=$(a);if(n)return n.studies.map((e=>e.StudyInstanceUID));const s=await fetch(a),r=await s.json();let o,i;r.studies.forEach((e=>{o=e.StudyInstanceUID,e.series.forEach((e=>{i=e.SeriesInstanceUID,e.instances.forEach((e=>{const{url:t,metadata:a}=e;k.addImageIdToUIDs(t,{StudyInstanceUID:o,SeriesInstanceUID:i,SOPInstanceUID:a.SOPInstanceUID})}))}))})),V.urls.push({url:a,studies:[...r.studies]}),V.studyInstanceUIDMap.set(a,r.studies.map((e=>e.StudyInstanceUID)))},query:{studies:{mapParams:()=>{},search:async e=>{const[t,a]=Object.entries(e)[0],n=F[t];return q(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:e=>M(t,e),series:{metadata:async function(){let{StudyInstanceUID:e,madeInClient:t=!1,customSort:a}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!e)throw new Error("Unable to query for SeriesMetadata without StudyInstanceUID");const n=q("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}));o.DicomMetadataStore.addSeriesMetadata(r,t);const i=s.length;s.forEach(((a,s)=>{const r=a.instances.map((e=>{const t={...e.metadata,url:e.url,imageId:e.url,...a,...n};return delete t.instances,delete t.series,t}));var c;c=r,o.DicomMetadataStore.addInstances(c,t),s===i-1&&(o.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(e){let{instance:t,frame:a}=e;return g({instance:t,frame:a})},getStudyInstanceUIDs:e=>{let{params:t,query:a}=e;const n=a.get("url");return V.studyInstanceUIDMap.get(n)}};return o.Is.create(a)}const j=o.default.classes.MetadataProvider,{EVENTS:B}=o.DicomMetadataStore,Z={SR:!0,SEG:!0,DOC:!0},H=function(e,t){return e===t?arguments.length>2&&void 0!==arguments[2]?arguments[2]:0:e<t?-1:1},G=(e,t)=>{const a=e.instances[0],n=t.instances[0],s=a.Modality,r=n.Modality,o=Z[s],i=Z[r];return o&&i?H(a.SeriesNumber,n.SeriesNumber):o||i?o?-1:1:H(n.SeriesNumber,a.SeriesNumber)};function z(e){const{name:t}=e,a={initialize:e=>{let{params:t,query:a}=e},query:{studies:{mapParams:()=>{},search:e=>o.DicomMetadataStore.getStudyInstanceUIDs().map((e=>{let t=0;const a=new Set,n=o.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:o.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=>o.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 function(){let{StudyInstanceUID:e,madeInClient:t=!1}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!e)throw new Error("Unable to query for SeriesMetadata without StudyInstanceUID");const a=o.DicomMetadataStore.getStudy(e,t);o.DicomMetadataStore._broadcastEvent(B.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:o}=e;e.imageId=a,j.addImageIdToUIDs(a,{StudyInstanceUID:n,SeriesInstanceUID:r,SOPInstanceUID:o,frameIndex:s?t:1})})),o.DicomMetadataStore._broadcastEvent(B.INSTANCES_ADDED,{StudyInstanceUID:e,SeriesInstanceUID:n,madeInClient:t})}))}}},store:{dicom:e=>{const t=f.default.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(e){let{instance:t,frame:a}=e;const{StudyInstanceUID:n,SeriesInstanceUID:s,SOPInstanceUID:r}=t;let i=o.DicomMetadataStore.getInstance(n,s,r).url;return void 0!==a&&(i+=`&frame=${a}`),i},deleteStudyMetadataPromise(){console.log("deleteStudyMetadataPromise not implemented")},getStudyInstanceUIDs:e=>{let{params:t,query:a}=e;const{StudyInstanceUIDs:n}=t,s=a.getAll("StudyInstanceUIDs")||n,r=s&&Array.isArray(s)?s:[s];let i=!1;return r.forEach((e=>{const t=o.DicomMetadataStore.getStudy(e);t&&(t.series=t.series.sort(G),i=!0)})),i?r:[]}};return o.Is.create(a)}function W(e,t){const{name:a}=e;let n;const s={initialize:async e=>{let{params:s,query:r}=e;const o=r.get("url");if(!o)throw new Error(`No url for '${a}'`);{const e=await fetch(o);let a=await e.json();if(!a.servers?.dicomWeb?.[0])throw new Error("Invalid configuration returned by url");n=L(a.servers.dicomWeb[0].configuration,t),n.initialize({params:s,query:r})}},query:{studies:{search:e=>n.query.studies.search(e)},series:{search:function(){return n.query.series.search(...arguments)}},instances:{search:(e,t)=>n.query.instances.search(e,t)}},retrieve:{directURL:function(){return n.retrieve.directURL(...arguments)},series:{metadata:async function(){return n.retrieve.series.metadata(...arguments)}}},store:{dicom:function(){return n.store(...arguments)}},deleteStudyMetadataPromise:function(){return n.deleteStudyMetadataPromise(...arguments)},getImageIdsForDisplaySet:function(){return n.getImageIdsForDisplaySet(...arguments)},getImageIdsForInstance:function(){return n.getImageIdsForInstance(...arguments)},getStudyInstanceUIDs(e){let{params:t,query:n}=e,s=[];const r=n.get("studyInstanceUIDs")||n.get("studyInstanceUids");if(!r)throw new Error(`No studyInstanceUids in request for '${a}'`);return s=r.split(";"),s}};return o.Is.create(s)}const X=function(){return[{name:"dicomweb",type:"webApi",createDataSource:L},{name:"dicomwebproxy",type:"webApi",createDataSource:W},{name:"dicomjson",type:"jsonApi",createDataSource:_},{name:"dicomlocal",type:"localApi",createDataSource:z}]};var Y=a(43001),J=a(3827),K=a.n(J),Q=a(71783),ee=a(62657),te=a(62474),ae=a(69190),ne=a(85066),se=a(50376),re=a(44921),oe=a.n(re);function ie(){return ie=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},ie.apply(this,arguments)}function ce(e){let{servicesManager:t}=e;const{toolbarService:a}=t.services,[n,s]=(0,Y.useState)([]);(0,Y.useEffect)((()=>{const{unsubscribe:e}=a.subscribe(a.EVENTS.TOOL_BAR_MODIFIED,(()=>s(a.getButtonSection("primary"))));return()=>{e()}}),[a]);const r=(0,Y.useCallback)((e=>a.recordInteraction(e)),[a]);return Y.createElement(Y.Fragment,null,n.map((e=>{const{id:a,Component:n,componentProps:s}=e;return Y.createElement("div",{key:a,className:oe()("mr-1")},Y.createElement(n,ie({id:a},s,{onInteraction:r,servicesManager:t})))})))}const{availableLanguages:le,defaultLanguage:ue,currentLanguage:de}=se.default;const me=function(e){let{hotkeysManager:t,extensionManager:a,servicesManager:n}=e;const[s]=(0,ee.M)(),r=(0,te.s0)(),i=(0,ne.TH)(),{t:c}=(0,ae.$G)(),{show:l,hide:u}=(0,Q.dd)(),{hotkeyDefinitions:d,hotkeyDefaults:m}=t,p=[{title:c("Header:About"),icon:"info",onClick:()=>l({content:Q.tk,title:"About OHIF Viewer",contentProps:{versionNumber:"3.7.0",commitHash:"5ddf8a16027255d28dc01c1740099cf85bbcf458"}})},{title:c("Header:Preferences"),icon:"settings",onClick:()=>l({title:c("UserPreferencesModal:User Preferences"),content:Q.i1,contentProps:{hotkeyDefaults:t.getValidHotkeyDefinitions(m),hotkeyDefinitions:d,currentLanguage:de(),availableLanguages:le,defaultLanguage:ue,onCancel:()=>{o.dD.stopRecord(),o.dD.unpause(),u()},onSubmit:e=>{let{hotkeyDefinitions:a,language:n}=e;n.value!==de().value&&se.default.changeLanguage(n.value),t.setHotkeys(a),u()},onReset:()=>t.restoreDefaultBindings(),hotkeysModule:o.dD}})}];return s.oidc&&p.push({title:c("Header:Logout"),icon:"power-off",onClick:async()=>{r(`/logout?redirect_uri=${encodeURIComponent(window.location.href)}`)}}),Y.createElement(Q.h4,{menuOptions:p,isReturnEnabled:!!s.showStudyList,onClickReturnButton:()=>{const{pathname:e}=i,t=e.indexOf("/",1),n=new URLSearchParams(window.location.search).get("configUrl"),s=e.substring(t+1),o=a.getDataSources(s),c=new URLSearchParams;-1!==t&&o&&c.append("datasources",e.substring(t+1)),n&&c.append("configUrl",n),r({pathname:"/",search:decodeURIComponent(c.toString())})},WhiteLabeling:s.whiteLabeling},Y.createElement(Q.SV,{context:"Primary Toolbar"},Y.createElement("div",{className:"relative flex justify-center"},Y.createElement(ce,{servicesManager:n}))))},pe=e=>{let{servicesManager:t,side:a,className:n,activeTabIndex:s,tabs:r}=e;const o=t?.services?.panelService,[i,c]=(0,Y.useState)(!1),[l,u]=(0,Y.useState)(s);return(0,Y.useEffect)((()=>{if(o){const e=o.subscribe(o.EVENTS.ACTIVATE_PANEL,(e=>{if(!i||e.forceActive){const t=r.findIndex((t=>t.id===e.panelId));-1!==t&&u(t)}}));return()=>{e.unsubscribe()}}}),[r,i,o]),Y.createElement(Q.hs,{side:a,className:n,activeTabIndex:l,tabs:r,onOpen:()=>{c(!0)}})};function ge(e){let{extensionManager:t,servicesManager:a,hotkeysManager:n,commandsManager:s,viewports:r,ViewportGridComp:i,leftPanels:c=[],rightPanels:l=[],leftPanelDefaultClosed:u=!1,rightPanelDefaultClosed:d=!1}=e;const[m]=(0,ee.M)(),{hangingProtocolService:p}=a.services,[g,f]=(0,Y.useState)(m.showLoadingIndicator);(0,Y.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")})),[]);const I=e=>{const a=t.getModuleEntry(e);if(!a)throw new Error(`${e} is not valid for an extension module. 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)`);let n;if(!a||!a.component)throw new Error(`No component found from extension ${e}. Check the reference string to the extension in your Mode configuration`);return n=a.component,{entry:a,content:n}},y=e=>{const{content:t,entry:a}=I(e);return{id:a.id,iconName:a.iconName,iconLabel:a.iconLabel,label:a.label,name:a.name,content:t}};(0,Y.useEffect)((()=>{const{unsubscribe:e}=p.subscribe(o.hy.EVENTS.PROTOCOL_CHANGED,(()=>{f(!1)}));return()=>{e()}}),[p]);const S=c.map(y),h=l.map(y),v=r.map((e=>{const{entry:t}=I(e.namespace);return{component:t.component,displaySetsToDisplay:e.displaySetsToDisplay}}));return Y.createElement("div",null,Y.createElement(me,{hotkeysManager:n,extensionManager:t,servicesManager:a}),Y.createElement("div",{className:"relative flex w-full flex-row flex-nowrap items-stretch overflow-hidden bg-black",style:{height:"calc(100vh - 52px"}},Y.createElement(Y.Fragment,null,g&&Y.createElement(Q.LE,{className:"h-full w-full bg-black"}),S.length?Y.createElement(Q.SV,{context:"Left Panel"},Y.createElement(pe,{side:"left",activeTabIndex:u?null:0,tabs:S,servicesManager:a})):null,Y.createElement("div",{className:"flex h-full flex-1 flex-col"},Y.createElement("div",{className:"relative flex h-full flex-1 items-center justify-center overflow-hidden bg-black"},Y.createElement(Q.SV,{context:"Grid"},Y.createElement(i,{servicesManager:a,viewportComponents:v,commandsManager:s})))),h.length?Y.createElement(Q.SV,{context:"Right Panel"},Y.createElement(pe,{side:"right",activeTabIndex:d?null:0,tabs:h,servicesManager:a})):null)))}ge.propTypes={extensionManager:K().shape({getModuleEntry:K().func.isRequired}).isRequired,commandsManager:K().instanceOf(o.HQ),servicesManager:K().instanceOf(o.Xw),leftPanels:K().array,rightPanels:K().array,leftPanelDefaultClosed:K().bool.isRequired,rightPanelDefaultClosed:K().bool.isRequired,children:K().oneOfType([K().node,K().func]).isRequired,viewports:K().array};const fe=ge;const{sortStudyInstances:Ie,formatDate:ye}=o.utils;function Se(e){let{servicesManager:t,getImageSrc:a,getStudiesForPatientByMRN:n,requestDisplaySetCreationForStudy:s,dataSource:r}=e;const{hangingProtocolService:o,displaySetService:i,uiNotificationService:c}=t.services,l=(0,te.s0)(),{StudyInstanceUIDs:u}=(0,Q.zG)(),[{activeViewportId:d,viewports:m},p]=(0,Q.O_)(),[g,f]=(0,Y.useState)("primary"),[I,y]=(0,Y.useState)([...u]),[S,h]=(0,Y.useState)([]),[v,D]=(0,Y.useState)([]),[w,b]=(0,Y.useState)({});(0,Y.useEffect)((()=>{u.forEach((e=>async function(e){const t=await r.query.studies.search({studyInstanceUid:e});if(!t?.length)throw l("/notfoundstudy","_self"),new Error("Invalid study URL");let a=t;try{a=await n(t)}catch(e){console.warn(e)}const s=a.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:ye(e.StudyDate),description:e.StudyDescription,modalities:e.ModalitiesInStudy,numInstances:e.NumInstances})));h((e=>{const t=[...e];for(const a of s)e.find((e=>e.studyInstanceUid===a.studyInstanceUid))||t.push(a);return t}))}(e)))}),[u,r,n,l]),(0,Y.useEffect)((()=>{i.activeDisplaySets.forEach((async e=>{const t={},n=i.getDisplaySetByUID(e.displaySetInstanceUID),s=r.getImageIdsForDisplaySet(n),o=s[Math.floor(s.length/2)];o&&!n?.unsupported&&(t[e.displaySetInstanceUID]=await a(o),b((e=>({...e,...t}))))}))}),[u,r,i,a]),(0,Y.useEffect)((()=>{const e=ve(i.activeDisplaySets,w);Ie(e),D(e)}),[u,w,i]),(0,Y.useEffect)((()=>{const e=i.subscribe(i.EVENTS.DISPLAY_SETS_ADDED,(e=>{const{displaySetsAdded:t,options:n}=e;t.forEach((async e=>{const t={},n=i.getDisplaySetByUID(e.displaySetInstanceUID);if(n?.unsupported)return;const s=r.getImageIdsForDisplaySet(n),o=s[Math.floor(s.length/2)];o&&(t[e.displaySetInstanceUID]=await a(o,e.initialViewport),b((e=>({...e,...t}))))}))}));return()=>{e.unsubscribe()}}),[a,r,i]),(0,Y.useEffect)((()=>{const e=i.subscribe(i.EVENTS.DISPLAY_SETS_CHANGED,(e=>{const t=ve(e,w);D(t)})),t=i.subscribe(i.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED,(()=>{const e=ve(i.getActiveDisplaySets(),w);D(e)}));return()=>{e.unsubscribe(),t.unsubscribe()}}),[u,w,i]);const E=function(e,t,a){const n=[],s=[],r=[];t.forEach((t=>{const o=a.filter((e=>e.StudyInstanceUID===t.studyInstanceUid)),i=Object.assign({},t,{displaySets:o});e.includes(t.studyInstanceUid)?n.push(i):(s.push(i),r.push(i))}));const o=[{name:"primary",label:"Primary",studies:n},{name:"recent",label:"Recent",studies:s},{name:"all",label:"All",studies:r}];return o}(u,S,v);const M=m.get(d)?.displaySetInstanceUIDs;return Y.createElement(Q.eX,{tabs:E,servicesManager:t,activeTabName:g,onDoubleClickThumbnail:e=>{let t=[];const a=d;try{t=o.getViewportsRequireUpdate(a,e)}catch(e){console.warn(e),c.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:I,onClickStudy:function(e){const t=I.includes(e),a=t?[...I.filter((t=>t!==e))]:[...I,e];if(y(a),!t){s(i,e,!0)}},onClickTab:e=>{f(e)}})}Se.propTypes={servicesManager:K().object.isRequired,dataSource:K().shape({getImageIdsForDisplaySet:K().func.isRequired}).isRequired,getImageSrc:K().func.isRequired,getStudiesForPatientByMRN:K().func.isRequired,requestDisplaySetCreationForStudy:K().func.isRequired};const he=Se;function ve(e,t){const a=[],n=[];return e.filter((e=>!e.excludeFromThumbnailBrowser)).forEach((e=>{const s=t[e.displaySetInstanceUID],r=function(e){if(De.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 De=["SR","SEG","SM","RTSTRUCT","RTPLAN","RTDOSE"];const we=function(e,t){return new Promise(((a,n)=>{const s=document.createElement("canvas");e.utilities.loadImageToCanvas({canvas:s,imageId:t}).then((e=>{a(s.toDataURL())})).catch(n)}))};const be=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 Ee=function(e,t,a,n){t.activeDisplaySets.some((e=>e.StudyInstanceUID===a))||e.retrieve.series.metadata({StudyInstanceUID:a,madeInClient:n})};function Me(e){let{commandsManager:t,extensionManager:a,servicesManager:n}=e;const s=a.getDataSources()[0],r=be.bind(null,s),o=function(e){const t=e.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common");try{const{cornerstone:e}=t.exports.getCornerstoneLibraries();return we.bind(null,e)}catch(e){throw new Error("Required command not found")}}(a),i=Ee.bind(null,s);return Y.createElement(he,{servicesManager:n,dataSource:s,getImageSrc:o,getStudiesForPatientByMRN:r,requestDisplaySetCreationForStudy:i})}Me.propTypes={commandsManager:K().object.isRequired,extensionManager:K().object.isRequired,servicesManager:K().object.isRequired};const xe=Me;function Ue(e){let{onExportClick:t,onCreateReportClick:a}=e;const{t:n}=(0,ae.$G)("MeasurementTable");return Y.createElement(Y.Fragment,null,Y.createElement(Q.HO,{color:"black",size:"inherit"},Y.createElement(Q.mN,{className:"px-2 py-2 text-base",onClick:t},n("Export CSV")),Y.createElement(Q.mN,{className:"px-2 py-2 text-base",onClick:a},n("Create Report"))))}Ue.propTypes={onExportClick:K().func,onCreateReportClick:K().func},Ue.defaultProps={onExportClick:()=>alert("Export"),onCreateReportClick:()=>alert("Create Report")};const Re=Ue;var Ne=a(8324),Ce=a.n(Ne);const Pe={CANCEL:0,CREATE_REPORT:1};function Te(e,t){let{extensionManager:a}=t;return new Promise((function(t,n){let s;const r=Object.keys(a.dataSourceMap).filter((e=>{const t=a.dataSourceDefs[e]?.configuration;return t?.supportsStow??t?.wadoRoot})).map((e=>({value:e,label:e,placeHolder:e})));s=e.create({centralize:!0,isDraggable:!1,content:Q.Vq,useLastPosition:!1,showOverlay:!0,contentProps:{title:"Create Report",value:{label:"",dataSourceName:a.activeDataSource},noCloseButton:!0,onClose:()=>{e.dismiss({id:s}),t({action:Pe.CANCEL,value:void 0,dataSourceName:void 0})},actions:[{id:"cancel",text:"Cancel",type:Q.LZ.dt.secondary},{id:"save",text:"Save",type:Q.LZ.dt.primary}],onSubmit:a=>{let{action:n,value:r}=a;switch(e.dismiss({id:s}),n.id){case"save":t({action:Pe.CREATE_REPORT,value:r.label,dataSourceName:r.dataSourceName});break;case"cancel":t({action:Pe.CANCEL,value:void 0,dataSourceName:void 0})}},body:a=>{let{value:n,setValue:o}=a;return Y.createElement(Y.Fragment,null,r.length>1&&window.config?.allowMultiSelectExport&&Y.createElement("div",null,Y.createElement("label",{className:"text-[14px] leading-[1.2] text-white"},"Data Source"),Y.createElement(Q.Ph,{closeMenuOnSelect:!0,className:"border-primary-main mt-2 bg-black",options:r,placeholder:r.find((e=>e.value===n.dataSourceName)).placeHolder,value:n.dataSourceName,onChange:e=>{o((t=>({...t,dataSourceName:e.value})))},isClearable:!1})),Y.createElement("div",{className:"mt-3"},Y.createElement(Q.II,{autoFocus:!0,label:"Enter the report name",labelClassName:"text-white text-[14px] leading-[1.2]",className:"border-primary-main bg-black",type:"text",value:n.label,onChange:e=>{e.persist(),o((t=>({...t,label:e.target.value})))},onKeyPress:a=>{"Enter"===a.key&&(e.dismiss({id:s}),t({action:Pe.CREATE_REPORT,value:n.label}))},required:!0})))}}})}))}function Oe(){return Y.createElement("div",{className:"text-primary-active"},"Loading...")}const Ae=async function(e){let{servicesManager:t,getReport:a,reportType:n="measurement"}=e;const{displaySetService:s,uiNotificationService:r,uiDialogService:i}=t.services,c=i.create({showOverlay:!0,isDraggable:!1,centralize:!0,content:Oe});try{const e=await a();o.DicomMetadataStore.addInstances([e],!0);const t=s.getMostRecentDisplaySet().displaySetInstanceUID;return r.show({title:"Create Report",message:`${n} saved successfully`,type:"success"}),[t]}catch(e){r.show({title:"Create Report",message:e.message||`Failed to store ${n}`,type:"error"})}finally{i.dismiss({id:c})}},Le=4700;function ke(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:o,Modality:i}=e;return{SeriesInstanceUID:t,SeriesDescription:n,SeriesDate:s,SeriesTime:r,SeriesNumber:o,Modality:i,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,Le)+1}(t);return{SeriesDescription:e,SeriesNumber:n}}const{downloadCSVReport:Fe}=o.utils;function Ve(e){let{servicesManager:t,commandsManager:a,extensionManager:n}=e;const[s,r]=(0,Q.O_)(),{activeViewportId:o,viewports:i}=s,{measurementService:c,uiDialogService:l,uiNotificationService:u,displaySetService:d}=t.services,[m,p]=(0,Y.useState)([]);(0,Y.useEffect)((()=>{const e=Ce()(p,100);p($e(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,o=[];return[t,a,n,s,r].forEach((t=>{o.push(c.subscribe(t,(()=>{e($e(c))})).unsubscribe)})),()=>{o.forEach((e=>{e()})),e.cancel()}}),[]);const g=e=>{let{uid:t,isActive:a}=e;if(!a){const e=[...m],a=e.find((e=>e.uid===t));e.forEach((e=>e.isActive=e.uid===t)),a.isActive=!0,p(e)}};return Y.createElement(Y.Fragment,null,Y.createElement("div",{className:"ohif-scrollbar overflow-y-auto overflow-x-hidden","data-cy":"measurements-panel"},Y.createElement(Q.wt,{title:"Measurements",servicesManager:t,data:m,onClick:e=>{let{uid:t,isActive:a}=e;c.jumpToMeasurement(s.activeViewportId,t),g({uid:t,isActive:a})},onEdit:e=>{let{uid:t,isActive:a}=e;const n=c.getMeasurement(t),s=e=>{let{action:a,value:s}=e;if("save"===a.id)c.update(t,{...n,...s},!0);l.dismiss({id:"enter-annotation"})};l.create({id:"enter-annotation",centralize:!0,isDraggable:!1,showOverlay:!0,content:Q.Vq,contentProps:{title:"Annotation",noCloseButton:!0,value:{label:n.label||""},body:e=>{let{value:t,setValue:a}=e;return Y.createElement(Q.II,{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:t.label,onChange:e=>{e.persist(),a((t=>({...t,label:e.target.value})))},onKeyPress:e=>{"Enter"===e.key&&s({value:t,action:{id:"save"}})}})},actions:[{id:"cancel",text:"Cancel",type:Q.LZ.dt.secondary},{id:"save",text:"Save",type:Q.LZ.dt.primary}],onSubmit:s}})}})),Y.createElement("div",{className:"flex justify-center p-4"},Y.createElement(Re,{onExportClick:async function(){const e=c.getMeasurements();Fe(e,c)},onClearMeasurementsClick:async function(){c.clearMeasurements()},onCreateReportClick:async function(){const e=i.get(o),s=c.getMeasurements(),r=d.getDisplaySetByUID(e.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 Te(l,{extensionManager:n});if(p.action===Pe.CREATE_REPORT){const e=n.getDataSources(p.dataSourceName)[0],s=ke(void 0===p.value||""===p.value?"Research Derived Series":p.value,d);return Ae({servicesManager:t,getReport:async()=>a.runCommand("storeMeasurements",{measurementData:m,dataSource:e,additionalFindingTypes:["ArrowAnnotate"],options:s},"CORNERSTONE_STRUCTURED_REPORT")})}}})))}function $e(e){return e.getMeasurements().map(((t,a)=>function(e,t,a){const{displayText:n,uid:s,label:r,type:o,selected:i,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:o,displayText:m,baseDisplayText:n,isActive:i,finding:l,findingSites:c}}(t,0,e.VALUE_TYPES)))}Ve.propTypes={servicesManager:K().instanceOf(o.Xw).isRequired};const qe=function(e){let{commandsManager:t,extensionManager:a,servicesManager:n}=e;return[{name:"seriesList",iconName:"tab-studies",iconLabel:"Studies",label:"Studies",component:xe.bind(null,{commandsManager:t,extensionManager:a,servicesManager:n})},{name:"measure",iconName:"tab-linear",iconLabel:"Measure",label:"Measurements",secondaryLabel:"Measurements",component:()=>Y.createElement(Ve,{commandsManager:t,servicesManager:n,extensionManager:a})}]};var _e=a(11835),je=a(24369),Be=a(13950),Ze=a(89359);const He=JSON.parse('{"u2":"@ohif/extension-default"}').u2;var Ge=a(87425);var ze=a(94972);var We=a(45451);function Xe(e,t,a,n){const s=We.R3.scaleAndAdd(We.R3.create(),e,a,n);return We.R3.distance(t,s)>n}function Ye(e){if(!e?.length)return!1;const t=(0,ze.Z)(e[0].ImageOrientationPatient);if(!t)return!1;const a=function(e){const t=We.R3.fromValues(e[0],e[1],e[2]),a=We.R3.fromValues(e[3],e[4],e[5]);return We.R3.cross(We.R3.create(),t,a)}(t),n=(0,ze.Z)(e[0].ImagePositionPatient),s=(0,ze.Z)(e[e.length-1].ImagePositionPatient),r=(0,Ze.Xn)(n,s)/(e.length-1);let o=n;for(let t=1;t<e.length;t++){const n=e[t],s=(0,ze.Z)(n.ImagePositionPatient);if(Xe(o,s,a,r))return!1;o=s}return!0}function Je(e,t){e.length>2&&(function(e){if(!e?.length)return!1;const t=e[0],a=(0,ze.Z)(t.Rows),n=(0,ze.Z)(t.Columns);for(let t=1;t<e.length;t++){const s=e[t],{Rows:r,Columns:o}=s;if(r!==a||o!==n)return!1}return!0}(e)||t.addMessage(o.Lt.CODES.INCONSISTENT_DIMENSIONS),function(e){if(!e?.length)return!1;const t=e[0],a=(0,ze.Z)(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(o.Lt.CODES.INCONSISTENT_COMPONENTS),function(e){if(!e?.length)return!1;const t=e[0],a=(0,ze.Z)(t.ImageOrientationPatient);for(let t=1;t<e.length;t++){const n=e[t],s=(0,ze.Z)(n.ImageOrientationPatient);if(!(0,Ze.NB)(s,a))return!1}return!0}(e)||t.addMessage(o.Lt.CODES.INCONSISTENT_ORIENTATIONS),Ye(e)||t.addMessage(o.Lt.CODES.INCONSISTENT_POSITION_INFORMATION),function(e,t){if(!e?.length)return;const a=(0,ze.Z)(e[0].ImagePositionPatient);if(!a)return;const n=(0,ze.Z)(e[e.length-1].ImagePositionPatient),s=(0,Ze.Xn)(a,n)/(e.length-1);let r=a;const i=[];for(let a=1;a<e.length;a++){const n=e[a],c=(0,ze.Z)(n.ImagePositionPatient),l=(0,Ze.Xn)(c,r),u=(0,Ze.bg)(l,s);if(u){const e=u.issue;if(i.includes(e)||(i.push(e),e===Ze.e1.MISSING_FRAMES?t.addMessage(o.Lt.CODES.MISSING_FRAMES):e===Ze.e1.IRREGULAR_SPACING&&t.addMessage(o.Lt.CODES.IRREGULAR_SPACING)),i.length>1)break}r=c}}(e,t))}function Ke(e,t){const a=new o.iK;if(!e.length)return void a.addMessage(o.Lt.CODES.NO_VALID_INSTANCES);const n=e[0],{Modality:s,ImageType:r,NumberOfFrames:i}=n;if(r?.includes("LOCALIZER"))return a;if(!Ze.M6.includes(s))return a;const c=i>1;c||e.every((e=>e.ImagePositionPatient))||a.addMessage(o.Lt.CODES.NO_POSITION_INFORMATION);const l=(0,Ge.Z)(e);return c?function(e,t){(0,Ze.hu)(e)||t.addMessage(o.Lt.CODES.MULTIFRAME_NO_PIXEL_MEASUREMENTS),(0,Ze.sb)(e)||t.addMessage(o.Lt.CODES.MULTIFRAME_NO_ORIENTATION),(0,Ze.kN)(e)||t.addMessage(o.Lt.CODES.MULTIFRAME_NO_POSITION_INFORMATION)}(l[0],a):Je(l,a),t||a.addMessage(o.Lt.CODES.NOT_RECONSTRUCTABLE),a}function Qe(e){const t=new Be.Z(e),a=new o.iK;a.addMessage(o.Lt.CODES.UNSUPPORTED_DISPLAYSET);const n=e[0];return t.setAttributes({displaySetInstanceUID:t.uid,SeriesDate:n.SeriesDate,SeriesTime:n.SeriesTime,SeriesInstanceUID:n.SeriesInstanceUID,StudyInstanceUID:n.StudyInstanceUID,SeriesNumber:n.SeriesNumber||0,FrameRate:n.FrameTime,SOPClassUID:n.SOPClassUID,SeriesDescription:n.SeriesDescription||"",Modality:n.Modality,numImageFrames:e.length,unsupported:!0,SOPClassHandlerId:"unsupported",isReconstructable:!1,messages:a}),[t]}const et="stack",tt=e=>e.NumberOfFrames>1,at=e=>{const t=e[0],a=new Be.Z(e),{value:n,averageSpacingBetweenFrames:s}=(0,Ze.ZP)(e),r=Ke(e,n);a.setAttributes({displaySetInstanceUID:a.uid,SeriesDate:t.SeriesDate,SeriesTime:t.SeriesTime,SeriesInstanceUID:t.SeriesInstanceUID,StudyInstanceUID:t.StudyInstanceUID,SeriesNumber:t.SeriesNumber||0,FrameRate:t.FrameTime,SOPClassUID:t.SOPClassUID,SeriesDescription:t.SeriesDescription||"",Modality:t.Modality,isMultiFrame:tt(t),countIcon:n?"icon-mpr":void 0,numImageFrames:e.length,SOPClassHandlerId:`${He}.sopClassHandlerModule.${et}`,isReconstructable:n,messages:r,averageSpacingBetweenFrames:s||null});return a.sortBy(((e,t)=>(parseInt(e.InstanceNumber)||0)-(parseInt(t.InstanceNumber)||0))),a},nt=e=>"CR"===e||"MG"===e||"DX"===e;function st(e){if(!e||!e.length)throw new Error("No instances were provided");const t=[],a=function(e){const t=new Set;return e.forEach((e=>{t.add(e.SOPClassUID)})),Array.from(t)}(e),n=[];if(e.forEach((e=>{if(!(0,_e.O)(e.SOPClassUID)&&!e.Rows)return;let s;tt(e)?(s=at([e]),s.setAttributes({sopClassUids:a,isClip:!0,numImageFrames:e.NumberOfFrames,instanceNumber:e.InstanceNumber,acquisitionDatetime:e.AcquisitionDateTime}),t.push(s)):nt(e.Modality)?(s=at([e]),s.setAttributes({sopClassUids:a,instanceNumber:e.InstanceNumber,acquisitionDatetime:e.AcquisitionDateTime}),t.push(s)):n.push(e)})),n.length){const s=at(n);s.setAttribute("studyInstanceUid",e[0].StudyInstanceUID),s.setAttributes({sopClassUids:a}),t.push(s)}return t}const rt=[je.Z.ComputedRadiographyImageStorage,je.Z.DigitalXRayImageStorageForPresentation,je.Z.DigitalXRayImageStorageForProcessing,je.Z.DigitalMammographyXRayImageStorageForPresentation,je.Z.DigitalMammographyXRayImageStorageForProcessing,je.Z.DigitalIntraOralXRayImageStorageForPresentation,je.Z.DigitalIntraOralXRayImageStorageForProcessing,je.Z.CTImageStorage,je.Z.EnhancedCTImageStorage,je.Z.LegacyConvertedEnhancedCTImageStorage,je.Z.UltrasoundMultiframeImageStorage,je.Z.MRImageStorage,je.Z.EnhancedMRImageStorage,je.Z.EnhancedMRColorImageStorage,je.Z.LegacyConvertedEnhancedMRImageStorage,je.Z.UltrasoundImageStorage,je.Z.UltrasoundImageStorageRET,je.Z.SecondaryCaptureImageStorage,je.Z.MultiframeSingleBitSecondaryCaptureImageStorage,je.Z.MultiframeGrayscaleByteSecondaryCaptureImageStorage,je.Z.MultiframeGrayscaleWordSecondaryCaptureImageStorage,je.Z.MultiframeTrueColorSecondaryCaptureImageStorage,je.Z.XRayAngiographicImageStorage,je.Z.EnhancedXAImageStorage,je.Z.XRayRadiofluoroscopicImageStorage,je.Z.EnhancedXRFImageStorage,je.Z.XRay3DAngiographicImageStorage,je.Z.XRay3DCraniofacialImageStorage,je.Z.BreastTomosynthesisImageStorage,je.Z.BreastProjectionXRayImageStorageForPresentation,je.Z.BreastProjectionXRayImageStorageForProcessing,je.Z.IntravascularOpticalCoherenceTomographyImageStorageForPresentation,je.Z.IntravascularOpticalCoherenceTomographyImageStorageForProcessing,je.Z.NuclearMedicineImageStorage,je.Z.VLEndoscopicImageStorage,je.Z.VideoEndoscopicImageStorage,je.Z.VLMicroscopicImageStorage,je.Z.VideoMicroscopicImageStorage,je.Z.VLSlideCoordinatesMicroscopicImageStorage,je.Z.VLPhotographicImageStorage,je.Z.VideoPhotographicImageStorage,je.Z.OphthalmicPhotography8BitImageStorage,je.Z.OphthalmicPhotography16BitImageStorage,je.Z.OphthalmicTomographyImageStorage,je.Z.VLWholeSlideMicroscopyImageStorage,je.Z.PositronEmissionTomographyImageStorage,je.Z.EnhancedPETImageStorage,je.Z.LegacyConvertedEnhancedPETImageStorage,je.Z.RTImageStorage,je.Z.EnhancedUSVolumeStorage];const ot=function(){return[{name:et,sopClassUids:rt,getDisplaySetsFromSeries:st},{name:"not-supported-display-sets-handler",sopClassUids:[],getDisplaySetsFromSeries:Qe}]};function it(){return Y.createElement("span",{className:"border-common-dark mx-2 h-8 w-4 self-center border-l"})}function ct(){return ct=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},ct.apply(this,arguments)}function lt(e){let{rows:t,columns:a,className:n,onSelection:s,...r}=e;const[o,i]=(0,Y.useState)(!1),c=()=>{o&&i(!1)};(0,Y.useEffect)((()=>(window.addEventListener("click",c),()=>{window.removeEventListener("click",c)})),[o]);const l=o?Q.OF:null;return Y.createElement(Q.hA,{id:"Layout",label:"Grid Layout",icon:"tool-layout",onInteraction:()=>i(!o),className:n,rounded:r.rounded,dropdownContent:null!==l&&Y.createElement(l,{rows:t,columns:a,onSelection:s}),isActive:o,type:"toggle"})}lt.propTypes={rows:K().number,columns:K().number,onLayoutChange:K().func,servicesManager:K().instanceOf(o.Xw)},lt.defaultProps={rows:3,columns:3,onLayoutChange:()=>{}};const ut=function(e){let{servicesManager:t,...a}=e;const{toolbarService:n}=t.services,s=(0,Y.useCallback)((e=>{n.recordInteraction({interactionType:"action",commands:[{commandName:"setViewportGridLayout",commandOptions:{...e},context:"DEFAULT"}]})}),[n]);return Y.createElement(lt,ct({},a,{onSelection:s}))};function dt(){return dt=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},dt.apply(this,arguments)}function mt(e){let{isRadio:t,isAction:a,groupId:n,primary:s,secondary:r,items:o,renderer:i,onInteraction:c,servicesManager:l}=e;const{toolbarService:u}=l?.services,d=(e,s)=>{const{id:r,type:i,commands:l}=e;c({groupId:n,itemId:r,interactionType:i,commands:l}),I((n=>({...n,primary:!a&&t?{...e,index:s}:n.primary,isExpanded:!1,items:m(o).filter((e=>!(t&&!a)||e.index!==s))})))},m=e=>e.map(((e,t)=>({...e,index:t,onClick:()=>d(e,t)}))),[p,g]=(0,Y.useState)({primaryToolId:"",toggles:{},groups:{}}),[f,I]=(0,Y.useState)({primary:s,items:m(o).filter((e=>!(t&&!a)||e.id!==s.id))}),{primaryToolId:y,toggles:S}=p,h="toggle"===f.primary.type,v="tool"===f.primary.type&&y===f.primary.id||h&&!0===S[f.primary.id],D=u?.getButtonComponentForUIType(f.primary.uiType)??Q.hA;(0,Y.useEffect)((()=>{const{unsubscribe:e}=u.subscribe(u.EVENTS.TOOL_BAR_STATE_MODIFIED,(e=>{g({...e})}));return()=>{e()}}),[u]);const w=f.items.map((e=>{const t="tool"===e.type&&y===e.id;return{...e,isActive:t}})),b=i||(e=>{let{type:t,icon:a,label:n,t:s,id:r}=e;const o="toggle"===t&&!0===S[r];return Y.createElement("div",{className:oe()("hover:bg-primary-dark flex h-8 w-full flex-row items-center p-3","whitespace-pre text-base",o&&"bg-primary-dark",o?"text-[#348CFD]":"text-common-bright hover:bg-primary-dark hover:text-primary-light")},a&&Y.createElement("span",{className:"mr-4"},Y.createElement(Q.JO,{name:a,className:"h-5 w-5"})),Y.createElement("span",{className:"mr-5"},s(n)))});return Y.createElement(Q.aW,{isRadio:t,isAction:a,primary:f.primary,secondary:r,items:w,groupId:n,renderer:b,isActive:v||w.some((e=>e.isActive)),isToggle:h,onInteraction:c,Component:e=>Y.createElement(D,dt({},e,{servicesManager:l}))})}mt.propTypes={isRadio:K().bool,isAction:K().bool,groupId:K().string,primary:K().shape({id:K().string.isRequired,type:K().oneOf(["tool","action","toggle"]).isRequired,uiType:K().string}),secondary:K().shape({id:K().string,icon:K().string.isRequired,label:K().string,tooltip:K().string.isRequired,isActive:K().bool}),items:K().arrayOf(K().shape({id:K().string.isRequired,type:K().oneOf(["tool","action","toggle"]).isRequired,icon:K().string,label:K().string,tooltip:K().string})),renderer:K().func,onInteraction:K().func.isRequired,servicesManager:K().shape({services:K().shape({toolbarService:K().object})})},mt.defaultProps={isRadio:!1,isAction:!1};const pt=mt;function gt(){return gt=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},gt.apply(this,arguments)}function ft(e){let{id:t,type:a,commands:n,onInteraction:s,servicesManager:r,...o}=e;const{toolbarService:i}=r?.services||{},[c,l]=(0,Y.useState)({primaryToolId:"",toggles:{},groups:{}}),{primaryToolId:u}=c,d="tool"===a&&t===u||"toggle"===a&&!0===c.toggles[t];return(0,Y.useEffect)((()=>{const{unsubscribe:e}=i.subscribe(i.EVENTS.TOOL_BAR_STATE_MODIFIED,(e=>{l({...e})}));return()=>{e()}}),[i]),Y.createElement(Q.hA,gt({commands:n,id:t,type:a,isActive:d,onInteraction:s},o))}ft.propTypes={id:K().string.isRequired,type:K().oneOf(["tool","action","toggle"]).isRequired,commands:K().arrayOf(K().shape({commandName:K().string.isRequired,context:K().string})),onInteraction:K().func.isRequired,servicesManager:K().shape({services:K().shape({toolbarService:K().shape({subscribe:K().func.isRequired,state:K().shape({primaryToolId:K().string,toggles:K().objectOf(K().bool),groups:K().objectOf(K().object)}).isRequired}).isRequired}).isRequired}).isRequired};const It=ft;function yt(e,t,a,n){const s={selectorProps:e,event:t},r=function(e,t,a){const{subMenu:n}=t,s=function*(){yield function(e,t){if(t)return e.find((e=>e.id===t))}(e,a||n),yield function(e,t){return e?e.find((e=>!e.selector||e.selector(t.selectorProps))):null}(e,t)}();let r=s.next(),o=r.value;for(;!r.done;)o=r.value,o&&s.return(),r=s.next();return console.log("Menu chosen",o?.id||"NONE"),o}(a,s,n);if(!r)return;if(!r.items)return console.warn("Must define items in menu",r),[];let o=[];return r.items.forEach((n=>{const{delegating:r,selector:i,subMenu:c}=n;if(!i||i(e))if(r)o=[...o,...yt(e,t,a,c)];else{const e=function(e,t){const a={...e,value:t.selectorProps?.value};"ShowSubMenu"!==e.actionType||a.iconRight||(a.iconRight="chevron-menu");e.action||(a.action=(e,n)=>{const{event:s={}}=n,{detail:r={}}=s;a.element=r.element,n.onClose();const o=n[`on${e.actionType||"Default"}`];o?o.call(n,a,e,t):console.warn("No action defined for",e)});return a}(n,s);o.push(e)}})),o}var St=a(5638);class ht{constructor(e,t){this.commandsManager=void 0,this.services=void 0,this.menuItems=void 0,this.services=e.services,this.commandsManager=t}closeContextMenu(){this.services.uiDialogService.dismiss({id:"context-menu"})}showContextMenu(e,t,a){if(!this.services.uiDialogService)return void console.warn("Unable to show dialog; no UI Dialog Service available.");const{event:n,subMenu:s,menuId:r,menus:o,selectorProps:i}=e;console.log("Getting items from",o);const c=yt(i||e,n,o,r);this.services.uiDialogService.dismiss({id:"context-menu"}),this.services.uiDialogService.create({id:"context-menu",isDraggable:!1,preservePosition:!1,preventCutOf:!0,defaultPosition:ht._getDefaultPosition(a,n?.detail,t),event:n,content:St.Z,onClickOutside:()=>this.services.uiDialogService.dismiss({id:"context-menu"}),contentProps:{items:c,selectorProps:i,menus:o,event:n,subMenu:s,eventData:n?.detail,onClose:()=>{this.services.uiDialogService.dismiss({id:"context-menu"})},onShowSubMenu:(n,s,r)=>{s.subMenu?this.showContextMenu({...e,menuId:s.subMenu},t,a):console.warn("No submenu defined for",n,s,r)},onDefault:(e,t,a)=>{this.commandsManager.run(e,{...i,...t,subProps:a})}}})}}ht.getDefaultPosition=()=>({x:0,y:0}),ht._getEventDefaultPosition=e=>({x:e&&e.currentPoints.client[0],y:e&&e.currentPoints.client[1]}),ht._getElementDefaultPosition=e=>{if(e){const t=e.getBoundingClientRect();return{x:t.x,y:t.y}}return{x:void 0,y:void 0}},ht._getCanvasPointsPosition=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1?arguments[1]:void 0;const a=ht._getElementDefaultPosition(t);for(let t=0;t<e.length;t++){const n={x:e[t][0]||e[t].x,y:e[t][1]||e[t].y};if(ht._isValidPosition(n)&&ht._isValidPosition(a))return{x:n.x+a.x,y:n.y+a.y}}},ht._isValidPosition=e=>e&&"number"==typeof e.x&&"number"==typeof e.y,ht._getDefaultPosition=(e,t,a)=>{const n=function*(){yield ht._getCanvasPointsPosition(e,a),yield ht._getEventDefaultPosition(t),yield ht._getElementDefaultPosition(a),yield ht.getDefaultPosition()}();let s=n.next(),r=s.value;for(;!s.done;)r=s.value,ht._isValidPosition(r)&&n.return(),s=n.next();return r};const vt={id:"measurementsContextMenu",customizationType:"ohif.contextMenu",menus:[{id:"forExistingMeasurement",selector:e=>{let{nearbyToolData:t}=e;return!!t},items:[{label:"Delete measurement",commands:[{commandName:"deleteMeasurement"}]},{label:"Add Label",commands:[{commandName:"setMeasurementLabel"}]}]}]};var Dt=a(71271),wt=a.n(Dt),bt=a(94614);const Et={padding:"10px 0"},Mt={borderBottomWidth:"1px",...Et};function xt(e){let{tagRef:t,vrRef:a,keywordRef:n,valueRef:s}=e;return Y.createElement("div",{className:oe()("bg-secondary-dark ohif-scrollbar flex w-full flex-row overflow-y-scroll"),style:Et},Y.createElement("div",{className:"w-4/24 px-3"},Y.createElement("label",{ref:t,className:"flex flex-1 select-none flex-col pl-1 text-lg text-white"},Y.createElement("span",{className:"flex flex-row items-center focus:outline-none"},"Tag"))),Y.createElement("div",{className:"w-2/24 px-3"},Y.createElement("label",{ref:a,className:"flex flex-1 select-none flex-col pl-1 text-lg text-white"},Y.createElement("span",{className:"flex flex-row items-center focus:outline-none"},"VR"))),Y.createElement("div",{className:"w-6/24 px-3"},Y.createElement("label",{ref:n,className:"flex flex-1 select-none flex-col pl-1 text-lg text-white"},Y.createElement("span",{className:"flex flex-row items-center focus:outline-none"},"Keyword"))),Y.createElement("div",{className:"w-5/24 grow px-3"},Y.createElement("label",{ref:s,className:"flex flex-1 select-none flex-col pl-1 text-lg text-white"},Y.createElement("span",{className:"flex flex-row items-center focus:outline-none"},"Value"))))}const Ut=function(e){let{rows:t}=e;const a=(0,Y.useRef)(),n=(0,Y.useRef)(),[s,r]=(0,Y.useState)(null),[o,i]=(0,Y.useState)(null),[c,l]=(0,Y.useState)(null),[u,d]=(0,Y.useState)(null);(0,Y.useEffect)((()=>{a?.current&&(a.current.scrollTo(0),a.current.resetAfterIndex(0))}),[t]),(0,Y.useEffect)((()=>{const e=Ce()((()=>a.current.resetAfterIndex(0)),100);return window.addEventListener("resize",e),()=>{e.cancel(),window.removeEventListener("resize",e)}}),[]);const m=(0,Y.useCallback)((e=>{let{index:a,style:n}=e;const s=t[a];return Y.createElement("div",{style:{...n,...Mt},className:oe()("hover:bg-secondary-main border-secondary-light flex w-full flex-row items-center break-all bg-black text-base transition duration-300","leading-[20px]"),key:`DICOMTagRow-${a}`},Y.createElement("div",{className:"w-4/24 px-3"},s[0]),Y.createElement("div",{className:"w-2/24 px-3"},s[1]),Y.createElement("div",{className:"w-6/24 px-3"},s[2]),Y.createElement("div",{className:"w-5/24 grow px-3"},s[3]))}),[t]),p=(0,Y.useCallback)((()=>null!==s),[s]),g=(0,Y.useCallback)((e=>{const a=[s.offsetWidth,o.offsetWidth,c.offsetWidth,u.offsetWidth],r=n.current.getContext("2d");return r.font=getComputedStyle(n.current).font,t[e].map(((e,t)=>{const n=r.measureText(e).width;return 20*Math.ceil(n/a[t])+20+1})).reduce(((e,t)=>Math.max(e,t)))}),[t,c,s,u,o]);return Y.createElement("div",null,Y.createElement("canvas",{style:{visibility:"hidden",position:"absolute"},className:"text-base",ref:n}),Y.createElement(xt,{tagRef:e=>{e&&r(e)},vrRef:e=>{e&&i(e)},keywordRef:e=>{e&&l(e)},valueRef:e=>{e&&d(e)}}),Y.createElement("div",{className:"relative m-auto border-2 border-black bg-black",style:{height:"32rem"}},p()&&Y.createElement(bt.S_,{ref:a,height:500,itemCount:t.length,itemSize:g,width:"100%",className:"ohif-scrollbar"},m)))},{ImageSet:Rt}=o.classes,{DicomMetaDictionary:Nt}=f.default.data,{nameMap:Ct}=Nt;function Pt(e,t){const a=[];return e.forEach((e=>{if("SQ"===e.vr){a.push([`${e.tagIndent}${e.tag}`,e.vr,e.keyword,""]);const{values:n}=e;n.forEach(((e,n)=>{const s=Pt(e,t);a.push([`${e[0].tagIndent}(FFFE,E000)`,"",`Item #${n}`,""]),a.push(...s)}))}else{if("xs"===e.vr)try{const a=f.default.data.Tag.fromPString(e.tag).toCleanString(),n=t[a];e.vr=n.vr}catch(t){console.error(`Failed to parse value representation for tag '${e.keyword}'`)}a.push([`${e.tagIndent}${e.tag}`,e.vr,e.keyword,e.value])}})),a}function Tt(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const a=Object.keys(e);let n="";for(let e=0;e<t;e++)n+=">";t>0&&(n+=" ");const s=[];for(let o=0;o<a.length;o++){let i=a[o];if("_vrMap"===i)continue;const c=Ct[i];let l=e[i];if(c&&"SQ"===c.vr){const e=(r=l,Array.isArray(r)?r:[r]),a={tag:c.tag,tagIndent:n,vr:c.vr,keyword:i,values:[]};if(s.push(a),null===l)continue;e.forEach((e=>{const n=Tt(e,t+1);n.length&&(Ot(n),a.values.push(n))}))}else if(Array.isArray(l)&&l.length>0&&"object"!=typeof l[0]&&(l=l.join("\\")),"number"==typeof l&&(l=l.toString()),"string"!=typeof l&&(null===l?l=" ":"object"==typeof l?l.InlineBinary?l="Inline Binary":l.BulkDataURI?l="Bulk Data URI":l.Alphabetic?l=l.Alphabetic:(console.warn(`Unrecognised Value: ${l} for ${i}:`),console.warn(l),l=" "):(console.warn(`Unrecognised Value: ${l} for ${i}:`),l=" ")),i=i.replace("RETIRED_",""),c)s.push({tag:c.tag,tagIndent:n,vr:c.vr,keyword:i,value:l});else{const e=/[0-9A-Fa-f]{6}/g;if(i.match(e)){const e=`(${i.substring(0,4)},${i.substring(4,8)})`;s.push({tag:e,tagIndent:n,vr:"",keyword:"Private Tag",value:l})}}}var r;return s}function Ot(e){e.sort(((e,t)=>e.tag<t.tag?-1:1))}const At=e=>{let{displaySets:t,displaySetInstanceUID:a}=e;const n=new Set([1]),[s,r]=(0,Y.useState)(a),[o,i]=(0,Y.useState)(1),[c,l]=(0,Y.useState)(""),u=t.find((e=>e.displaySetInstanceUID===s)),d=u instanceof Rt;const m=d&&u.images.length>1,p=(0,Y.useMemo)((()=>(t.sort(((e,t)=>e.SeriesNumber-t.SeriesNumber)),t.map((e=>{const{displaySetInstanceUID:t,SeriesDate:a,SeriesTime:n,SeriesNumber:s,SeriesDescription:r,Modality:o}=e,i=`${a}:${n}`.split(".")[0];return{value:t,label:`${s} (${o}): ${r}`,description:wt()(i,"YYYYMMDD:HHmmss").format("ddd, MMM Do YYYY")}})))),[t]),g=(0,Y.useMemo)((()=>{let e;e=d?u.images[o-1]:u.instance||u;const t=function(e){const t=Tt(e);return Ot(t),t}(e);return Pt(t,e)}),[o,s]),f=(0,Y.useMemo)((()=>{if(!c)return g;const e=c.toLowerCase();return g.filter((t=>t.reduce(((t,a,s)=>t||(n.has(s)?t:t||a.toLowerCase().includes(e))),!1)))}),[g,c]),I=(0,Y.useMemo)((()=>Ce()(l,200)),[]);return(0,Y.useEffect)((()=>()=>{I?.cancel()}),[]),Y.createElement("div",{className:"dicom-tag-browser-content"},Y.createElement("div",{className:"mb-6 flex flex-row items-center pl-1"},Y.createElement("div",{className:"flex w-1/2 flex-row items-center"},Y.createElement(Q.ZT,{variant:"subtitle",className:"mr-4"},"Series"),Y.createElement("div",{className:"mr-8 grow"},Y.createElement(Q.Ph,{id:"display-set-selector",isClearable:!1,onChange:e=>{r(e.value),i(1)},options:p,value:p.find((e=>e.value===s)),className:"text-white"}))),Y.createElement("div",{className:"flex w-1/2 flex-row items-center"},m&&Y.createElement(Q.ZT,{variant:"subtitle",className:"mr-4"},"Instance Number"),m&&Y.createElement("div",{className:"grow"},Y.createElement(Q.OX,{value:o,key:s,onChange:e=>{i(parseInt(e))},minValue:1,maxValue:u.images.length,step:1,inputClassName:"w-full",labelPosition:"left",trackColor:"#3a3f99"})))),Y.createElement("div",{className:"h-1 w-full bg-black"}),Y.createElement("div",{className:"my-3 flex w-1/2 flex-row"},Y.createElement(Q.Xe,{className:"mr-8 block w-full",placeholder:"Search metadata...",onDebounceChange:l})),Y.createElement(Ut,{rows:f}))},Lt=(e,t,a)=>{const{activeViewportId:n}=e,{protocol:s}=t.getActiveProtocol(),r=t.getState(),{protocolId:o,stageIndex:i,activeStudyUID:c}=r,l=a.getState(),u={...l.viewportGridStore},d={...l.displaySetSelectorMap},m=s.stages[i],p=`${c}:${o}:${i}`,g=`${c}:${o}`,f={...l.hangingProtocolStageIndexMap},{rows:I,columns:y}=m.viewportStructure.properties,S=m.viewports.length!==e.viewports.size||e.layout.numRows!==I||e.layout.numCols!==y;return f[g]=r,p&&S&&(u[p]={...e}),e.viewports.forEach(((e,t)=>{const{displaySetOptions:a,displaySetInstanceUIDs:s}=e;if(a)for(let e=0;e<a.length;e++){const r=s[e];r&&(t===n&&0===e&&(d[`${c}:activeDisplaySet:0`]=r),a[e]?.id&&(d[`${c}:${a[e].id}:${a[e].matchedDisplaySetsIndex||0}`]=r))}})),{hangingProtocolStageIndexMap:f,viewportGridStore:u,displaySetSelectorMap:d}},kt=(e,t,a,n,s)=>{const r=t?.[n];if(r)return{...r};const{protocolId:o,stageIndex:i}=e.getState();s.inDisplay||(s.inDisplay=[...t.initialInDisplay]);const c=e.getMissingViewport(o,i,s);if(c){const e=c.displaySetsInfo.map((e=>e.displaySetInstanceUID));return s.inDisplay.push(...e),{displaySetInstanceUIDs:e,displaySetOptions:c.displaySetsInfo.map((e=>e.displaySetOptions)),viewportOptions:{...c.viewportOptions}}}return{}},Ft=(e,t,a)=>{let{numRows:n,numCols:s}=t;const{viewports:r}=e,o={...a.getState().viewportsByPosition},i=[];r.forEach((e=>{if(e.positionId){const t={...e,viewportOptions:{...e.viewportOptions}};o[e.positionId]=t}}));for(let e=0;e<n;e++)for(let t=0;t<s;t++){const a=o[`${t}-${e}`];a?.displaySetInstanceUIDs&&i.push(...a.displaySetInstanceUIDs)}return o.initialInDisplay=i,{viewportsByPosition:o}};var Vt=a(59754);const{subscribeToNextViewportGridChange:$t}=o.utils,qt=e=>e&&("setHangingProtocol"===e.commandName||"toggleHangingProtocol"===e.commandName),_t=e=>{let{servicesManager:t,commandsManager:a}=e;const{customizationService:n,measurementService:s,hangingProtocolService:r,uiNotificationService:o,viewportGridService:i,displaySetService:c,stateSyncService:l,toolbarService:u}=t.services,d=new ht(t,a),m={showContextMenu:e=>{const{menuCustomizationId:t,element:a,event:s,selectorProps:o,defaultPointsPosition:i=[]}=e,c={...e};t&&Object.assign(c,n.get(t,vt));const{protocol:l,stage:u}=r.getActiveProtocol();c.selectorProps={event:s,protocol:l,stage:u,...o},d.showContextMenu(c,a,i)},closeContextMenu:()=>{d.closeContextMenu()},displayNotification:e=>{let{text:t,title:a,type:n}=e;o.show({title:a,message:t,type:n})},clearMeasurements:()=>{s.clear()},toggleHpTools:()=>{const{protocol:e,stageIndex:t,stage:a}=r.getActiveProtocol(),n=s=>{if(!s.id)return;const{commands:r,items:o}=s.props||s;o&&o.forEach(n);const i=r?.find?.(qt);if(!i)return;const{protocolId:c,stageIndex:l,stageId:d}=i.commandOptions,m=!(c&&c!==e.id||void 0!==l&&l!==t||d&&d!==a.id);u.setToggled(s.id,m)};Object.values(u.getButtons()).forEach(n)},setHangingProtocol:e=>{let{activeStudyUID:t="",protocolId:n,stageId:s,stageIndex:c,reset:d=!1}=e;const p=u.getActivePrimaryTool();try{const e=i.getState(),o=r.getState(),{protocol:g}=r.getActiveProtocol(),f=Lt(e,r,l),{hangingProtocolStageIndexMap:I,viewportGridStore:y,displaySetSelectorMap:S}=f;if(n){if(void 0===c&&void 0===s){const e=`${t||o.activeStudyUID}:${n}`;c=I[e]?.stageIndex}}else n=o.protocolId,void 0===s&&void 0===c&&(c=o.stageIndex);const h=c??r.getStageIndex(n,{stageId:s,stageIndex:c});t&&r.setActiveStudyUID(t);const v=`${r.getState().activeStudyUID}:${n}:${h||0}`,D=!d&&y[v];n!==o.protocolId||h!==o.stageIndex||t?(r.setProtocol(n,{displaySetSelectorMap:S,stageId:s,stageIndex:h,restoreProtocol:D}),D&&i.set(y[v])):r.setProtocol(n,{stageId:s,stageIndex:h}),delete S[`${t||o.activeStudyUID}:activeDisplaySet:0`],l.store(f);const{protocol:w}=r.getActiveProtocol();m.toggleHpTools();const b=u.getButton(p);if(b){let e=b.props?.interactionType;if(!e&&b.props?.items){const t=b.props.items[0];e=t.props?.interactionType||t.props?.type}e&&u.recordInteraction({interactionType:e,...b.props})}return n!==o.protocolId&&a.run(g.callbacks?.onProtocolExit),a.run(w.callbacks?.onProtocolEnter),!0}catch(e){return console.error(e),m.toggleHpTools(),o.show({title:"Apply Hanging Protocol",message:"The hanging protocol could not be applied.",type:"error",duration:3e3}),!1}},toggleHangingProtocol:e=>{let{protocolId:t,stageIndex:a}=e;const{protocol:n,stageIndex:s,activeStudy:o}=r.getActiveProtocol(),{toggleHangingProtocol:i}=l.getState(),c=`${o.StudyInstanceUID}:${t}:${0|a}`;if(n.id!==t||void 0!==a&&a!==s)return l.store({toggleHangingProtocol:{...i,[c]:{protocolId:n.id,stageIndex:s}}}),m.setHangingProtocol({protocolId:t,stageIndex:a,reset:!0});{const e=i[c]||{protocolId:"default"};return m.setHangingProtocol(e)}},deltaStage:e=>{let{direction:t}=e;const{protocolId:a,stageIndex:n}=r.getState(),{protocol:s}=r.getActiveProtocol();for(let e=n+t;e>=0&&e<s.stages.length;e+=t)if("disabled"!==s.stages[e].status)return m.setHangingProtocol({protocolId:a,stageIndex:e});o.show({title:"Change Stage",message:"The hanging protocol has no more applicable stages",type:"info",duration:3e3})},setViewportGridLayout:e=>{let{numRows:t,numCols:n}=e;const{protocol:s}=r.getActiveProtocol(),o=s.callbacks?.onLayoutChange;if(!1===a.run(o,{numRows:t,numCols:n}))return void console.log("setViewportGridLayout running",o,t,n);window.setTimeout((()=>{const e=i.getState(),a=Ft(e,{numRows:t,numCols:n},l),s=kt.bind(null,r,a.viewportsByPosition);i.setLayout({numRows:t,numCols:n,findOrCreateViewport:s}),l.store(a)}),0)},toggleOneUp(){const e=i.getState(),{activeViewportId:t,viewports:a,layout:n}=e,{displaySetInstanceUIDs:s,displaySetOptions:o,viewportOptions:c}=a.get(t);if(1===n.numCols&&1===n.numRows){const{toggleOneUpViewportGridStore:e}=l.getState();if(!e.layout)return;const t=e.activeViewportId,a=s.length>1?[]:s.map((e=>r.getViewportsRequireUpdate(t,e))).flat(),n=(t,n)=>{const s=Array.from(e.viewports.values()).find((e=>e.positionId===n)),r=a.find((e=>e.viewportId===s.viewportId));return r?{viewportOptions:c,displaySetOptions:o,...r}:s},u=i.getLayoutOptionsFromState(e);i.setLayout({numRows:e.layout.numRows,numCols:e.layout.numCols,activeViewportId:t,layoutOptions:u,findOrCreateViewport:n})}else{l.store({toggleOneUpViewportGridStore:e});const t=()=>({displaySetInstanceUIDs:s,displaySetOptions:o,viewportOptions:c});i.setLayout({numRows:1,numCols:1,findOrCreateViewport:t});$t(i,(()=>{l.store({toggleOneUpViewportGridStore:{}})}))}},navigateHistory(e){Vt.m.navigate(e.to,e.options)},openDICOMTagViewer(){const{activeViewportId:e,viewports:a}=i.getState(),n=a.get(e),{displaySetInstanceUIDs:s}=n,r=c.activeDisplaySets,{UIModalService:o}=t.services,l=s[0];o.show({content:At,contentProps:{displaySets:r,displaySetInstanceUID:l,onClose:o.hide},title:"DICOM Tag Browser"})},toggleOverlays:()=>{const e=document.getElementsByClassName("viewport-overlay");for(let t=0;t<e.length;t++)e.item(t).classList.toggle("hidden")},scrollActiveThumbnailIntoView:()=>{const{activeViewportId:e,viewports:t}=i.getState(),a=t.get(e).displaySetInstanceUIDs[0],n=document.querySelector("#ohif-thumbnail-list");if(!n)return;const s=n.getBoundingClientRect(),r=document.querySelector(`#thumbnail-${a}`);if(!r)return;const o=r.getBoundingClientRect();o.top>=s.top&&o.top<=s.bottom||r.scrollIntoView({behavior:"smooth"})},updateViewportDisplaySet:e=>{let{direction:t,excludeNonImageModalities:a}=e;const n=["SR","SEG","SM","RTSTRUCT","RTPLAN","RTDOSE"],s=r.getDisplaySetSortFunction(),l=[...c.activeDisplaySets];l.sort(s);const{activeViewportId:u,viewports:d}=i.getState(),{displaySetInstanceUIDs:p}=d.get(u);let g;for(g=l.findIndex((e=>p.includes(e.displaySetInstanceUID)))+t;g>-1&&g<l.length&&(a&&n.includes(l[g].Modality));g+=t);if(g<0||g>=l.length)return;const{displaySetInstanceUID:f}=l[g];let I=[];try{I=r.getViewportsRequireUpdate(u,f)}catch(e){console.warn(e),o.show({title:"Navigate Viewport Display Set",message:"The requested display sets could not be added to the viewport due to a mismatch in the Hanging Protocol rules.",type:"info",duration:3e3})}i.setDisplaySetsForViewports(I),setTimeout((()=>m.scrollActiveThumbnailIntoView()),0)}},p={showContextMenu:{commandFn:m.showContextMenu},closeContextMenu:{commandFn:m.closeContextMenu},clearMeasurements:{commandFn:m.clearMeasurements,storeContexts:[],options:{}},displayNotification:{commandFn:m.displayNotification,storeContexts:[],options:{}},setHangingProtocol:{commandFn:m.setHangingProtocol,storeContexts:[],options:{}},toggleHangingProtocol:{commandFn:m.toggleHangingProtocol,storeContexts:[],options:{}},navigateHistory:{commandFn:m.navigateHistory,storeContexts:[],options:{}},nextStage:{commandFn:m.deltaStage,storeContexts:[],options:{direction:1}},previousStage:{commandFn:m.deltaStage,storeContexts:[],options:{direction:-1}},setViewportGridLayout:{commandFn:m.setViewportGridLayout,storeContexts:[],options:{}},toggleOneUp:{commandFn:m.toggleOneUp,storeContexts:[],options:{}},openDICOMTagViewer:{commandFn:m.openDICOMTagViewer},updateViewportDisplaySet:{commandFn:m.updateViewportDisplaySet,storeContexts:[],options:{}}};return{actions:m,definitions:p,defaultContext:"DEFAULT"}},jt={id:"@ohif/mnGrid",description:"Has various hanging protocol grid layouts",name:"2x2",protocolMatchingRules:[{id:"OneOrMoreSeries",weight:25,attribute:"numberOfDisplaySetsWithImages",constraint:{greaterThan:0}}],toolGroupIds:["default"],displaySetSelectors:{defaultDisplaySetId:{seriesMatchingRules:[{attribute:"numImageFrames",constraint:{greaterThan:{value:0}},required:!0},{attribute:"isDisplaySetFromUrl",weight:10,constraint:{equals:!0}}]}},defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId",matchedDisplaySetsIndex:-1}]},stages:[{id:"2x2",stageActivation:{enabled:{minViewportsMatched:4}},viewportStructure:{layoutType:"grid",properties:{rows:2,columns:2}},viewports:[{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId"}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:1,id:"defaultDisplaySetId"}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:2,id:"defaultDisplaySetId"}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:3,id:"defaultDisplaySetId"}]}]},{id:"3x1",requiredViewports:1,preferredViewports:3,stageActivation:{enabled:{minViewportsMatched:3}},viewportStructure:{layoutType:"grid",properties:{rows:1,columns:3}},viewports:[{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId"}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId",matchedDisplaySetsIndex:1}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId",matchedDisplaySetsIndex:2}]}]},{id:"2x1",requiredViewports:1,preferredViewports:2,stageActivation:{enabled:{minViewportsMatched:2}},viewportStructure:{layoutType:"grid",properties:{rows:1,columns:2}},viewports:[{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId"}]},{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{matchedDisplaySetsIndex:1,id:"defaultDisplaySetId"}]}]},{id:"1x1",requiredViewports:1,preferredViewports:1,stageActivation:{enabled:{minViewportsMatched:1}},viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId"}]}]}],numberOfPriorsReferenced:-1},Bt={id:"defaultDisplaySetId"},Zt={id:"priorDisplaySetId"},Ht={viewportOptions:{toolGroupId:"default",allowUnmatchedView:!0},displaySets:[Bt]},Gt={...Ht,displaySets:[{...Bt,matchedDisplaySetsIndex:1}]},zt={...Ht,displaySets:[Zt]},Wt={id:"@ohif/hpCompare",description:"Compare two studies in various layouts",name:"Compare Two Studies",numberOfPriorsReferenced:1,protocolMatchingRules:[{id:"Two Studies",weight:1e3,attribute:"StudyInstanceUID",from:"prior",required:!0,constraint:{notNull:!0}}],toolGroupIds:["default"],displaySetSelectors:{defaultDisplaySetId:{studyMatchingRules:[{attribute:"studyInstanceUIDsIndex",from:"options",required:!0,constraint:{equals:{value:0}}}],seriesMatchingRules:[{attribute:"numImageFrames",constraint:{greaterThan:{value:0}}},{attribute:"isDisplaySetFromUrl",weight:10,constraint:{equals:!0}}]},priorDisplaySetId:{studyMatchingRules:[{attribute:"studyInstanceUIDsIndex",from:"options",required:!0,constraint:{equals:{value:1}}}],seriesMatchingRules:[{attribute:"numImageFrames",constraint:{greaterThan:{value:0}}},{attribute:"isDisplaySetFromUrl",weight:10,constraint:{equals:!0}}]}},defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId",matchedDisplaySetsIndex:-1}]},stages:[{name:"2x2",stageActivation:{enabled:{minViewportsMatched:4}},viewportStructure:{layoutType:"grid",properties:{rows:2,columns:2}},viewports:[Ht,zt,Gt,{...zt,displaySets:[{...Zt,matchedDisplaySetsIndex:1}]}]},{name:"2x1",stageActivation:{enabled:{minViewportsMatched:2}},viewportStructure:{layoutType:"grid",properties:{rows:1,columns:2}},viewports:[Ht,zt]}]},Xt={id:"default",locked:!0,name:"Default",createdDate:"2021-02-23T19:22:08.894Z",modifiedDate:"2023-04-01",availableTo:{},editableBy:{},protocolMatchingRules:[],toolGroupIds:["default"],numberOfPriorsReferenced:0,defaultViewport:{viewportOptions:{viewportType:"stack",toolGroupId:"default",allowUnmatchedView:!0},displaySets:[{id:"defaultDisplaySetId",matchedDisplaySetsIndex:-1}]},displaySetSelectors:{defaultDisplaySetId:{seriesMatchingRules:[{attribute:"numImageFrames",constraint:{greaterThan:{value:0}}},{attribute:"isDisplaySetFromUrl",weight:10,constraint:{equals:!0}}]}},stages:[{name:"default",viewportStructure:{layoutType:"grid",properties:{rows:1,columns:1}},viewports:[{viewportOptions:{viewportType:"stack",viewportId:"default",toolGroupId:"default",initialImageOptions:{custom:"sopInstanceLocation"}},displaySets:[{id:"defaultDisplaySetId"}]}],createdDate:"2021-02-23T18:32:42.850Z"}]};const Yt=function(){return[{name:Xt.id,protocol:Xt},{name:jt.id,protocol:jt},{name:Wt.id,protocol:Wt}]};const Jt=function(){const[e]=(0,ee.M)(),t=(0,te.s0)(),a=e.dataSources;return Y.createElement("div",{style:{width:"100%",height:"100%"}},Y.createElement("div",{className:"flex h-screen w-screen items-center justify-center "},Y.createElement("div",{className:"bg-secondary-dark mx-auto space-y-2 rounded-lg py-8 px-8 drop-shadow-md"},Y.createElement("img",{className:"mx-auto block h-14",src:"./ohif-logo.svg",alt:"OHIF"}),Y.createElement("div",{className:"space-y-2 pt-4 text-center"},a.filter((e=>"dicomjson"!==e.sourceName&&"dicomlocal"!==e.sourceName)).map((e=>Y.createElement("div",{key:e.sourceName},Y.createElement("h1",{className:"text-white"},e.configuration?.friendlyName||e.friendlyName),Y.createElement(Q.zx,{type:Q.LZ.dt.primary,className:oe()("ml-2"),onClick:()=>{t({pathname:"/",search:`datasources=${e.sourceName}`})}},e.sourceName),Y.createElement("br",null))))))))};const Kt=function(e){let{itemLabel:t,itemList:a,onItemClicked:n}=e;const{t:s}=(0,ae.$G)("DataSourceConfiguration"),[r,o]=(0,Y.useState)("");return(0,Y.useEffect)((()=>{o("")}),[a]),Y.createElement("div",{className:"flex min-h-[1px] grow flex-col gap-4"},Y.createElement("div",{className:"flex items-center justify-between"},Y.createElement("div",{className:"text-primary-light text-[20px]"},s(`Select ${t}`)),Y.createElement(Q.Xe,{className:"max-w-[40%] grow",value:r,onDebounceChange:o,placeholder:s(`Search ${t} list`)})),Y.createElement("div",{className:"relative flex min-h-[1px] grow flex-col bg-black text-[14px]"},null==a?Y.createElement(Q.LE,{className:"h-full w-full"}):0===a.length?Y.createElement("div",{className:"text-primary-light flex h-full flex-col items-center justify-center px-6 py-4"},Y.createElement(Q.JO,{name:"magnifier",className:"mb-4"}),Y.createElement("span",null,s(`No ${t} available`))):Y.createElement(Y.Fragment,null,Y.createElement("div",{className:"bg-secondary-dark px-3 py-1.5 text-white"},s(t)),Y.createElement("div",{className:"ohif-scrollbar overflow-auto"},a.filter((e=>!r||e.name.toLowerCase().includes(r.toLowerCase()))).map((e=>Y.createElement("div",{className:oe()("hover:text-primary-light hover:bg-primary-dark group mx-2 flex items-center justify-between px-6 py-2","rounded border-transparent border-b-secondary-light border-[1px] hover:border-primary-light"),key:e.id},Y.createElement("div",null,e.name),Y.createElement(Q.zx,{onClick:()=>n(e),className:"invisible group-hover:visible",endIcon:Y.createElement(Q.JO,{name:"arrow-left"})},s("Select")))))))))},Qt="text-ellipsis whitespace-nowrap overflow-hidden";const ea=function(e){let{configurationAPI:t,configuredItems:a,onHide:n}=e;const{t:s}=(0,ae.$G)("DataSourceConfiguration"),[r,o]=(0,Y.useState)(),[i,c]=(0,Y.useState)(a),[l,u]=(0,Y.useState)(),[d]=(0,Y.useState)(t.getItemLabels()),[m,p]=(0,Y.useState)(d.length===a.length),g=m?i.length-2:i.length-1;(0,Y.useEffect)((()=>{let e=!0;return u(null),o(null),0===i.length?t.initialize().then((t=>{e&&o(t)})).catch((e=>u(e.message))):m||i.length!==d.length?t.setCurrentItem(i[g]).then((t=>{e&&o(t)})).catch((e=>u(e.message))):(t.setCurrentItem(i[i.length-1]),n()),()=>{e=!1}}),[i,t,n,d,m,g]);const f=e=>e<i.length?oe()("bg-black/[.4]",e!==d.length-1?"hover:bg-transparent active:bg-secondary-dark":""):"bg-transparent",I=e=>e===g+1?oe()("border-2","border-solid","border-primary-light"):e<i.length?"border border-solid border-primary-active hover:border-primary-light active:border-white":"border border-dashed border-secondary-light",y=e=>e<=i.length?"text-primary-light":"text-primary-active";return Y.createElement("div",{className:"flex h-[calc(100vh-300px)] select-none flex-col gap-4 pt-0.5"},Y.createElement("div",{className:"flex gap-4"},d.map(((e,t)=>{return Y.createElement("div",{key:e,className:oe()("flex min-w-[1px] shrink basis-[200px] flex-col gap-1 rounded-md p-3.5",(a=t,a!==d.length-1&&a<i.length?"cursor-pointer":"cursor-auto"),f(t),I(t),y(t)),onClick:m&&t<g||t<=g?()=>{p(!1),c((e=>e.slice(0,t)))}:void 0},Y.createElement("div",{className:"text- flex items-center gap-2"},t<i.length?Y.createElement(Q.JO,{name:"status-tracked"}):Y.createElement(Q.JO,{name:"status-untracked"}),Y.createElement("div",{className:oe()(Qt)},s(e))),t<i.length?Y.createElement("div",{className:oe()("text-[14px] text-white",Qt)},i[t].name):Y.createElement("br",null));var a}))),Y.createElement("div",{className:"h-0.5 w-full shrink-0 bg-black"}),l?Y.createElement("div",{className:"flex min-h-[1px] grow flex-col gap-4"},Y.createElement("div",{className:"text-primary-light text-[20px]"},s(`Error fetching ${d[i.length]} list`)),Y.createElement("div",{className:"grow bg-black p-4 text-[14px]"},l)):Y.createElement(Kt,{itemLabel:d[g+1],itemList:r,onItemClicked:e=>{p(!1),c((t=>[...t.slice(0,g+1),e]))}}))};const ta=function(e){let{servicesManager:t,extensionManager:a}=e;const{t:n}=(0,ae.$G)("DataSourceConfiguration"),{show:s,hide:r}=(0,Q.dd)(),{customizationService:o}=t.services,[i,c]=(0,Y.useState)(),[l,u]=(0,Y.useState)();(0,Y.useEffect)((()=>{let e=!0;const t=async()=>{const t=a.getActiveDataSourceDefinition();if(!t.configuration.configurationAPI)return;const{factory:n}=o.get(t.configuration.configurationAPI)??{};if(!n)return;const s=n(t.sourceName);c(s),u(null),s.getConfiguredItems().then((t=>{e&&u(t)}))},n=a.subscribe(a.EVENTS.ACTIVE_DATA_SOURCE_CHANGED,t);return t(),()=>{e=!1,n.unsubscribe()}}),[]);const d=(0,Y.useCallback)((()=>{s({content:ea,title:n("Configure Data Source"),contentProps:{configurationAPI:i,configuredItems:l,onHide:r}})}),[i,l]);return(0,Y.useEffect)((()=>{i&&l&&l.length!==i.getItemLabels().length&&d()}),[i,l,d]),l?Y.createElement("div",{className:"text-aqua-pale flex items-center overflow-hidden"},Y.createElement(Q.JO,{name:"settings",className:"mr-2.5 h-3.5 w-3.5 shrink-0 cursor-pointer",onClick:d}),l.map(((e,t)=>Y.createElement("div",{key:t,className:"flex overflow-hidden"},Y.createElement("div",{key:t,className:"overflow-hidden text-ellipsis whitespace-nowrap"},e.name),t!==l.length-1&&Y.createElement("div",{className:"px-2.5"},"|"))))):Y.createElement(Y.Fragment,null)};var aa=function(e){return e[e.projects=0]="projects",e[e.locations=1]="locations",e[e.datasets=2]="datasets",e[e.dicomStores=3]="dicomStores",e}(aa||{});const na="https://cloudresourcemanager.googleapis.com/v1",sa="https://healthcare.googleapis.com/v1";class ra{constructor(e,t,a){this._extensionManager=void 0,this._fetchOptions=void 0,this._dataSourceName=void 0,this.getItemLabels=()=>["Project","Location","Data set","DICOM store"],this._dataSourceName=e,this._extensionManager=a;const n=t.services.userAuthenticationService;this._fetchOptions={method:"GET",headers:n.getAuthorizationHeader()}}async initialize(){const e=`${na}/projects`,t=await ra._doFetch(e,aa.projects,this._fetchOptions);if(!t?.length)return[];return t.map((e=>({id:e.projectId,name:e.name,itemType:aa.projects,url:`${sa}/projects/${e.projectId}`})))}async setCurrentItem(e){const t=e;if(t.itemType===aa.dicomStores){const e=`${t.url}/dicomWeb`,a=JSON.parse(JSON.stringify(this._extensionManager.getDataSourceDefinition(this._dataSourceName)));return a.configuration={...a.configuration,wadoUriRoot:e,qidoRoot:e,wadoRoot:e},this._extensionManager.updateDataSourceConfiguration(a.sourceName,a.configuration),[]}const a=t.itemType+1,n=`${aa[a]}`,s=`${t.url}/${n}`,r=await ra._doFetch(s,a,this._fetchOptions);if(!r?.length)return[];return r.map((e=>{const t=e.name.split("/");return{id:e.name,name:t[t.length-1],itemType:a,url:`${sa}/${e.name}`}}))}async getConfiguredItems(){const e=this._extensionManager.getDataSourceDefinition(this._dataSourceName).configuration.wadoUriRoot,t=e.indexOf("projects"),a=e.substring(t).split("/"),n=[];for(let e=0;e<4&&2*(e+1)<a.length;e+=1)if(e===aa.projects){const t=a[1],s=`${na}/projects/${t}`,r=(await ra._doFetch(s,aa.projects,this._fetchOptions))[0];n.push({id:r.projectId,name:r.name,itemType:e,url:`${sa}/projects/${r.projectId}`})}else{const t=a.slice(0,2*e+2).join("/");n.push({id:t,name:a[2*e+1],itemType:e,url:`${sa}/${t}`})}return n}static async _doFetch(e,t){let a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};try{const s=new URL(e);s.search=new URLSearchParams(n).toString();const r=await fetch(s,a),o=await r.json();if(r.status>=200&&r.status<300&&null!=o){if(null!=o.nextPageToken){n.pageToken=o.nextPageToken;const s=await this._doFetch(e,t,a,n);o[aa[t]]=o[aa[t]].concat(s)}return o[aa[t]]?o[aa[t]]:o.name?[o]:[]}{const e=o?.error?.message||`Error returned from Google Cloud Healthcare: ${r.status} - ${r.statusText}`;throw new Error(e)}}catch(e){throw new Error(e?.message||"Error occurred during fetch request.")}}}var oa=a(15747);const ia=o.default.classes.MetadataProvider;const ca=o.classes.MetadataProvider;const la=e=>{let{SeriesInstanceUID:t,StudyInstanceUID:a}=e;const{instances:n}=o.DicomMetadataStore.getSeries(a,t);if("PT"!==n[0].Modality)return;const s=n.map((e=>e.imageId)),r=[];if(s.forEach((e=>{const t=function(e){const t=ia.get("instance",e);if(!t)throw new Error("dicom metadata are required");if(void 0===t.SeriesDate||void 0===t.SeriesTime||void 0===t.CorrectedImage||void 0===t.Units||!t.RadiopharmaceuticalInformationSequence||void 0===t.RadiopharmaceuticalInformationSequence[0].RadionuclideHalfLife||void 0===t.RadiopharmaceuticalInformationSequence[0].RadionuclideTotalDose||void 0===t.DecayCorrection||void 0===t.AcquisitionDate||void 0===t.AcquisitionTime||void 0===t.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartDateTime&&void 0===t.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartTime)throw new Error("required metadata are missing");void 0===t.PatientWeight&&console.warn("PatientWeight missing from PT instance metadata");const a={CorrectedImage:t.CorrectedImage,Units:t.Units,RadionuclideHalfLife:t.RadiopharmaceuticalInformationSequence[0].RadionuclideHalfLife,RadionuclideTotalDose:t.RadiopharmaceuticalInformationSequence[0].RadionuclideTotalDose,RadiopharmaceuticalStartDateTime:t.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartDateTime,RadiopharmaceuticalStartTime:t.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartTime,DecayCorrection:t.DecayCorrection,PatientWeight:t.PatientWeight,SeriesDate:t.SeriesDate,SeriesTime:t.SeriesTime,AcquisitionDate:t.AcquisitionDate,AcquisitionTime:t.AcquisitionTime};if(t[70531e3]||void 0!==t[70531e3]||t[70531009]||void 0!==t[70531009]){const e={SUVScaleFactor:t[70531e3],ActivityConcentrationScaleFactor:t[70531009]};a.PhilipsPETPrivateGroup=e}return t["0009100d"]&&void 0!==t["0009100d"]&&(a.GEPrivatePostInjectionDateTime=t["0009100d"]),t.FrameReferenceTime&&void 0!==t.FrameReferenceTime&&(a.FrameReferenceTime=t.FrameReferenceTime),t.ActualFrameDuration&&void 0!==t.ActualFrameDuration&&(a.ActualFrameDuration=t.ActualFrameDuration),t.PatientSex&&void 0!==t.PatientSex&&(a.PatientSex=t.PatientSex),t.PatientSize&&void 0!==t.PatientSize&&(a.PatientSize=t.PatientSize),a}(e);t&&r.push(t)})),!r.length)return;let i;try{i=(0,oa.d)(r)}catch(e){console.log(e)}i&&r.forEach(((e,t)=>{ca.addCustomMetadata(s[t],"scalingModule",i[t])}))},ua={id:He,preRegistration:function(e){let{servicesManager:t,configuration:a={}}=e;const{stateSyncService:n}=t.services;o.DicomMetadataStore.subscribe(o.DicomMetadataStore.EVENTS.INSTANCES_ADDED,la),o.DicomMetadataStore.subscribe(o.DicomMetadataStore.EVENTS.SERIES_UPDATED,la),n.register("viewportGridStore",{clearOnModeExit:!0}),n.register("displaySetSelectorMap",{clearOnModeExit:!0}),n.register("hangingProtocolStageIndexMap",{clearOnModeExit:!0}),n.register("toggleHangingProtocol",{clearOnModeExit:!0}),n.register("viewportsByPosition",{clearOnModeExit:!0})},getDataSourcesModule:X,getLayoutTemplateModule:function(e){let{servicesManager:t,extensionManager:a,commandsManager:n,hotkeysManager:s}=e;return[{name:"viewerLayout",id:"viewerLayout",component:function(e){return fe({servicesManager:t,extensionManager:a,commandsManager:n,hotkeysManager:s,...e})}}]},getPanelModule:qe,getHangingProtocolModule:Yt,getSopClassHandlerModule:ot,getToolbarModule:function(e){let{commandsManager:t,servicesManager:a}=e;return[{name:"ohif.divider",defaultComponent:it,clickHandler:()=>{}},{name:"ohif.action",defaultComponent:It,clickHandler:()=>{}},{name:"ohif.radioGroup",defaultComponent:It,clickHandler:()=>{}},{name:"ohif.splitButton",defaultComponent:pt,clickHandler:()=>{}},{name:"ohif.layoutSelector",defaultComponent:ut,clickHandler:(e,t,a)=>{}},{name:"ohif.toggle",defaultComponent:It,clickHandler:()=>{}}]},getCommandsModule:_t,getUtilityModule(e){let{servicesManager:t}=e;return[{name:"common",exports:{getStudiesForPatientByMRN:be}}]},getCustomizationModule:function(e){let{servicesManager:t,extensionManager:a}=e;return[{name:"helloPage",value:{id:"customRoutes",routes:[{path:"/custom",children:()=>Y.createElement("h1",{style:{color:"white"}},"Hello Custom Route")}]}},{name:"datasources",value:{id:"customRoutes",routes:[{path:"/datasources",children:Jt}]}},{name:"default",value:[{id:"ohif.overlayItem",content:function(e){if(this.condition&&!this.condition(e))return null;const{instance:t}=e,a=t&&this.attribute?t[this.attribute]:this.contentF&&"function"==typeof this.contentF?this.contentF(e):null;return a?Y.createElement("span",{className:"overlay-item flex flex-row",style:{color:this.color||void 0},title:this.title||""},this.label&&Y.createElement("span",{className:"mr-1 shrink-0"},this.label),Y.createElement("span",{className:"font-light"},a)):null}},{id:"ohif.contextMenu",transform:function(e){const t={...this};t.menus=this.menus.map((e=>({...e})));for(const a of t.menus){const{items:t}=a;a.items=[];for(const n of t)a.items.push(e.transform(n))}return t}},{id:"ohif.dataSourceConfigurationComponent",component:ta.bind(null,{servicesManager:t,extensionManager:a})},{id:"ohif.dataSourceConfigurationAPI.google",factory:e=>new ra(e,t,a)}]}]}}}}]);
|
|
//# sourceMappingURL=342.bundle.352b0a5b0103bd979889.js.map
|