This commit is contained in:
mario
2025-03-11 13:16:07 +07:00
commit 3c64adc353
215 changed files with 111738 additions and 0 deletions

11
.eslintrc.js Normal file
View File

@@ -0,0 +1,11 @@
/* eslint-env node */
module.exports = {
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'prettier',
],
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
root: true,
};

116
.gitignore vendored Normal file
View File

@@ -0,0 +1,116 @@
*.dcm
.vscode
.node-persist
config/development.js
config/development.json
config/production.js
config/production.json
/build
keycloak.json
data
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
*.exe
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# Next.js build output
.next
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and *not* Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port

8
.prettierrc Normal file
View File

@@ -0,0 +1,8 @@
{
"trailingComma": "es5",
"printWidth": 150,
"proseWrap": "always",
"tabWidth": 2,
"semi": true,
"singleQuote": true
}

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
© 2020 GitHub, Inc.

82
README.md Normal file
View File

@@ -0,0 +1,82 @@
# dicomweb-proxy
A proxy to translate between [DICOMWEB](https://www.dicomstandard.org/dicomweb) and traditional DICOM [DIMSE](https://dicom.nema.org/medical/dicom/current/output/chtml/part07/sect_7.5.html) services
## Description
* A nodejs tool to easily connect a DICOMWEB capable DICOM viewer to one or more legacy PACS that only know DIMSE services.
Comes preinstalled with the popular [OHIF DICOM Web Viewer](https://github.com/OHIF/Viewers) (version 3.7.0-beta.13).
Note: Since OHIF 3 is still beta you can also switch back to OHIF 2 version: just remove the public directory and unzip public.zip to public
## What is it for?
* if you want to view image data from one or more legacy PACS that does not understand DICOMWEB nor come with a web-viewer
## How does it work?
* the app should be installed within the hospital intranet and configured to connect via DIMSE networking to on or more PACS (peers)
* it hosts a default DICOMweb viewer (OHIF) which can be replaced
* the webserver exposes the default QIDO and WADOURI/WADORS API needed for the viewer and converts on the fly between the two protocols
* optionally: you can connect to a [DICOMWEB-WEBSOCKET-BRIDGE](https://github.com/knopkem/dicomweb-websocket-bridge) and expose the data to the public (handle with care!)
## Prerequisite
* nodejs 12 or newer
## Setup Instructions - npm
* install in empty directory:
```npm init -y```
```npm install dicomweb-proxy```
* update config file located in:
```./node_modules/dicomweb-proxy/config```
* or better: create config override, see: [config](https://www.npmjs.com/package/config)
* start proxy:
```npx dicomweb-proxy```
## Setup Instructions - source
* clone repository and install dependencies:
```npm install```
* update config file located in:
```./config```
* start proxy:
```npm start```
## What to modify
* (optional) change our port or AET
```
config.source = {
aet: "SOURCE_AET",
ip: "SOURCE_IP",
port: "SOURCE_PORT"
};
```
* change peer(s) to your PACS
```
config.peers = [{
aet: "TARGET_AET",
ip: "TARGET_IP",
port: "TARGET_PORT"
}, { more peers here...}];
```
* in case your PACS does not support C-GET, switch to C-Move:
```config.useCget = false;```
* update webserver port:
```config.webserverPort = 5000;```
* open webbrowser and start viewing:
e.g. ```http://localhost:5000```
## License
MIT

18
bin/dicomweb-proxy Normal file
View File

@@ -0,0 +1,18 @@
#!/usr/bin/env node
"use strict";
const os = require('os');
var spawn = require('child_process').spawn;
console.log('starting dicomweb-proxy...');
process.chdir('./node_modules/dicomweb-proxy');
if (os.platform() === 'win32') {
var cmd = 'npm.cmd'
} else {
var cmd = 'npm'
}
spawn('npx.cmd', [ 'ts-node', 'src/app.ts'], {stdio: 'inherit'});

30
config/default.json Normal file
View File

@@ -0,0 +1,30 @@
{
"source": {
"aet": "DICOM_SAS",
"ip": "192.168.2.4",
"port": 21112
},
"peers": [
{
"aet": "ABPACS",
"ip": "192.168.2.8",
"port": 11112
}
],
"transferSyntax": "1.2.840.10008.1.2.4.80",
"mimeType": "image/dicom+jpeg",
"lossyQuality": 60,
"logDir": "./logs",
"storagePath": "./data",
"cacheRetentionMinutes": 60,
"webserverPort": 5050,
"useCget": true,
"useFetchLevel": "SERIES",
"maxAssociations": 4,
"qidoMinChars": 0,
"qidoAppendWildcard": true,
"verboseLogging": false,
"fullMeta": true,
"websocketUrl": "",
"websocketToken": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"
}

104777
dicom.log.1 Normal file

File diff suppressed because it is too large Load Diff

3803
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

67
package.json Normal file
View File

@@ -0,0 +1,67 @@
{
"name": "dicomweb-proxy",
"version": "1.10.2",
"description": "A proxy to translate between dicomweb and dimse",
"bin": "./build/app.js",
"scripts": {
"start": "ts-node src/app.ts",
"format": "npx prettier ./src",
"build": "tsc --p ./tsconfig.json",
"pkg:win": "npm run build && npx pkg --targets node16-win-x64 package.json"
},
"repository": {
"type": "git",
"url": "git+https://github.com/knopkem/dicomweb-proxy.git"
},
"keywords": [
"DICOMWEB",
"PROXY",
"DIMSE",
"DICOM"
],
"author": "Michael Knopke",
"license": "MIT",
"bugs": {
"url": "https://github.com/knopkem/dicomweb-proxy/issues"
},
"homepage": "https://github.com/knopkem/dicomweb-proxy#readme",
"dependencies": {
"@fastify/autoload": "^5.8.0",
"@fastify/cors": "^9.0.0",
"@fastify/helmet": "^11.1.1",
"@fastify/sensible": "^5.5.0",
"@fastify/static": "^6.12.0",
"@iwharris/dicom-data-dictionary": "^1.26.0",
"@wearemothership/socket.io-stream": "^0.9.1",
"close-with-grace": "^1.2.0",
"config": "^3.3.10",
"deepmerge": "^4.3.1",
"dicom-dimse-native": "2.4.5",
"dicom-parser": "^1.8.21",
"fastify": "^4.26.0",
"shelljs": "^0.8.5",
"simple-node-logger": "^21.8.12",
"socket.io-client": "^4.7.4",
"throat": "^6.0.2"
},
"devDependencies": {
"@types/config": "^3.3.3",
"@types/eslint": "^8.56.2",
"@types/node": "^20.11.10",
"@types/prettier": "^2.7.3",
"@types/shelljs": "^0.8.15",
"@typescript-eslint/eslint-plugin": "^6.20.0",
"@typescript-eslint/parser": "^6.20.0",
"eslint-config-prettier": "^9.1.0",
"prettier": "^3.2.4",
"ts-node": "^10.9.2",
"tslib": "^2.6.2",
"typescript": "^5.3.3"
},
"pkg": {
"assets": [
"./config/default.json",
"./node_modules/dicom-dimse-native/build/Release/dcmtk.node"
]
}
}

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[12],{85012:(e,n,s)=>{s.r(n),s.d(n,{default:()=>u});var t=s(43001);const a=JSON.parse('{"u2":"@ohif/extension-dicom-video"}').u2,r=`${a}.sopClassHandlerModule.dicom-video`;var i=s(71771);const _={VIDEO_MICROSCOPIC_IMAGE_STORAGE:"1.2.840.10008.5.1.4.1.1.77.1.2.1",VIDEO_PHOTOGRAPHIC_IMAGE_STORAGE:"1.2.840.10008.5.1.4.1.1.77.1.4.1",VIDEO_ENDOSCOPIC_IMAGE_STORAGE:"1.2.840.10008.5.1.4.1.1.77.1.1.1",SECONDARY_CAPTURE_IMAGE_STORAGE:"1.2.840.10008.5.1.4.1.1.7",MULTIFRAME_TRUE_COLOR_SECONDARY_CAPTURE_IMAGE_STORAGE:"1.2.840.10008.5.1.4.1.1.7.4"},I=Object.values(_),E=[_.SECONDARY_CAPTURE_IMAGE_STORAGE,_.MULTIFRAME_TRUE_COLOR_SECONDARY_CAPTURE_IMAGE_STORAGE],O=Object.values({MPEG4_AVC_264_HIGH_PROFILE:"1.2.840.10008.1.2.4.102",MPEG4_AVC_264_BD_COMPATIBLE_HIGH_PROFILE:"1.2.840.10008.1.2.4.103",MPEG4_AVC_264_HIGH_PROFILE_FOR_2D_VIDEO:"1.2.840.10008.1.2.4.104",MPEG4_AVC_264_HIGH_PROFILE_FOR_3D_VIDEO:"1.2.840.10008.1.2.4.105",MPEG4_AVC_264_STEREO_HIGH_PROFILE:"1.2.840.10008.1.2.4.106",HEVC_265_MAIN_PROFILE:"1.2.840.10008.1.2.4.107",HEVC_265_MAIN_10_PROFILE:"1.2.840.10008.1.2.4.108"});function l(){return l=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var s=arguments[n];for(var t in s)Object.prototype.hasOwnProperty.call(s,t)&&(e[t]=s[t])}return e},l.apply(this,arguments)}const c=t.lazy((()=>s.e(686).then(s.bind(s,39686)))),o=e=>t.createElement(t.Suspense,{fallback:t.createElement("div",null,"Loading...")},t.createElement(c,e));const u={id:a,getViewportModule(e){let{servicesManager:n,extensionManager:s}=e;return[{name:"dicom-video",component:e=>t.createElement(o,l({servicesManager:n,extensionManager:s},e))}]},getSopClassHandlerModule:function(e){let{servicesManager:n,extensionManager:s}=e;return[{name:"dicom-video",sopClassUids:I,getDisplaySetsFromSeries:e=>((e,n,s)=>{const t=s.getActiveDataSource()[0];return e.filter((e=>{const n=e.AvailableTransferSyntaxUID||e.TransferSyntaxUID||e["00083002"];return!!O.includes(n)||e.SOPClassUID===_.VIDEO_PHOTOGRAPHIC_IMAGE_STORAGE||E.includes(e.SOPClassUID)&&e.NumberOfFrames>=90})).map((e=>{const{Modality:n,SOPInstanceUID:s,SeriesDescription:a="VIDEO"}=e,{SeriesNumber:_,SeriesDate:E,SeriesInstanceUID:O,StudyInstanceUID:l,NumberOfFrames:c}=e;return{Modality:n,displaySetInstanceUID:i.utils.guid(),SeriesDescription:a,SeriesNumber:_,SeriesDate:E,SOPInstanceUID:s,SeriesInstanceUID:O,StudyInstanceUID:l,SOPClassHandlerId:r,referencedImages:null,measurements:null,videoUrl:t.retrieve.directURL({instance:e,singlepart:"video",tag:"PixelData"}),instances:[e],thumbnailSrc:t.retrieve.directURL({instance:e,defaultPath:"/thumbnail",defaultType:"image/jpeg",tag:"Absent"}),isDerivedDisplaySet:!0,isLoaded:!1,sopClassUids:I,numImageFrames:c,instance:e}}))})(e,0,s)}]}}}}]);
//# sourceMappingURL=12.bundle.81eef81badc8d1242199.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[125],{39125:(e,t,l)=>{l.r(t),l.d(t,{default:()=>i});var a=l(43001),s=l(3827),n=l.n(s);function r(e){let{displaySets:t}=e;const[l,s]=(0,a.useState)(null);if(t&&t.length>1)throw new Error("OHIFCornerstonePdfViewport: only one display set is supported for dicom pdf right now");const{pdfUrl:n}=t[0];return(0,a.useEffect)((()=>{(async()=>{s(await n)})()}),[n]),a.createElement("div",{className:"bg-primary-black h-full w-full text-white"},a.createElement("object",{data:l,type:"application/pdf",className:"h-full w-full"},a.createElement("div",null,"No online PDF viewer installed")))}r.propTypes={displaySets:n().arrayOf(n().object).isRequired};const i=r}}]);
//# sourceMappingURL=125.bundle.629517ff1af1a958ddc9.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"125.bundle.629517ff1af1a958ddc9.js","mappings":"oJAGA,SAASA,EAA0BC,GAAkB,IAAjB,YAAEC,GAAaD,EACjD,MAAOE,EAAKC,IAAUC,EAAAA,EAAAA,UAAS,MAE/B,GAAIH,GAAeA,EAAYI,OAAS,EACtC,MAAM,IAAIC,MACR,yFAIJ,MAAM,OAAEC,GAAWN,EAAY,GAU/B,OARAO,EAAAA,EAAAA,YAAU,KACKC,WACXN,QAAaI,EAAO,EAGtBG,EAAM,GACL,CAACH,IAGFI,EAAAA,cAAA,OAAKC,UAAU,6CACbD,EAAAA,cAAA,UACEE,KAAMX,EACNY,KAAK,kBACLF,UAAU,iBAEVD,EAAAA,cAAA,WAAK,mCAIb,CAEAZ,EAA2BgB,UAAY,CACrCd,YAAae,IAAAA,QAAkBA,IAAAA,QAAkBC,YAGnD,S","sources":["webpack:///../../../extensions/dicom-pdf/src/viewports/OHIFCornerstonePdfViewport.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nfunction OHIFCornerstonePdfViewport({ displaySets }) {\r\n const [url, setUrl] = useState(null);\r\n\r\n if (displaySets && displaySets.length > 1) {\r\n throw new Error(\r\n 'OHIFCornerstonePdfViewport: only one display set is supported for dicom pdf right now'\r\n );\r\n }\r\n\r\n const { pdfUrl } = displaySets[0];\r\n\r\n useEffect(() => {\r\n const load = async () => {\r\n setUrl(await pdfUrl);\r\n };\r\n\r\n load();\r\n }, [pdfUrl]);\r\n\r\n return (\r\n <div className=\"bg-primary-black h-full w-full text-white\">\r\n <object\r\n data={url}\r\n type=\"application/pdf\"\r\n className=\"h-full w-full\"\r\n >\r\n <div>No online PDF viewer installed</div>\r\n </object>\r\n </div>\r\n );\r\n}\r\n\r\nOHIFCornerstonePdfViewport.propTypes = {\r\n displaySets: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n};\r\n\r\nexport default OHIFCornerstonePdfViewport;\r\n"],"names":["OHIFCornerstonePdfViewport","_ref","displaySets","url","setUrl","useState","length","Error","pdfUrl","useEffect","async","load","React","className","data","type","propTypes","PropTypes","isRequired"],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

5
public/181.css Normal file
View File

@@ -0,0 +1,5 @@
.viewport-wrapper{height:100%;position:relative;width:100%}.cornerstone-viewport-element{background-color:#000;height:100%;outline:0!important;overflow:hidden;position:relative;width:100%}
.viewport-overlay{max-width:40%}.viewport-overlay span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.viewport-overlay.left-viewport{text-align:left}.viewport-overlay.right-viewport-scrollbar{text-align:right}.viewport-overlay.right-viewport-scrollbar .flex.flex-row{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}
.ViewportOrientationMarkers{--marker-width:100px;--marker-height:100px;--scrollbar-width:20px;font-size:15px;line-height:18px;pointer-events:none}.ViewportOrientationMarkers .orientation-marker{position:absolute}.ViewportOrientationMarkers .top-mid{left:50%;top:.6rem}.ViewportOrientationMarkers .left-mid{left:5px;top:47%}.ViewportOrientationMarkers .right-mid{left:calc(100% - var(--marker-width) - var(--scrollbar-width));top:47%}.ViewportOrientationMarkers .bottom-mid{left:47%;top:calc(100% - var(--marker-height) - .6rem)}.ViewportOrientationMarkers .right-mid .orientation-marker-value{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;min-width:var(--marker-width)}.ViewportOrientationMarkers .bottom-mid .orientation-marker-value{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;min-height:var(--marker-height)}
/*# sourceMappingURL=181.css.map*/

1
public/181.css.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"181.css","mappings":"AAAA,kBAEE,WAAY,CACZ,iBAAkB,CAFlB,UAGF,CAEA,8BAIE,qBAAuB,CAFvB,WAAY,CAKZ,mBAAqB,CAIrB,eAAgB,CARhB,iBAAkB,CAFlB,UAWF,C;ACbA,kBACE,aACF,CACA,uBACE,cAAe,CACf,eAAgB,CAChB,sBAAuB,CACvB,kBACF,CAEA,gCACE,eACF,CAEA,2CACE,gBACF,CACA,0DACE,oBAAyB,CAAzB,iBAAyB,CAAzB,wBACF,C;ACxBA,4BACE,oBAAqB,CACrB,qBAAsB,CACtB,sBAAuB,CAEvB,cAAe,CACf,gBAAiB,CAFjB,mBAGF,CACA,gDACE,iBACF,CACA,qCAEE,QAAS,CADT,SAEF,CACA,sCAEE,QAAS,CADT,OAEF,CACA,uCAEE,8DAA+D,CAD/D,OAEF,CACA,wCAEE,QAAS,CADT,6CAEF,CACA,iEACE,mBAAa,CAAb,mBAAa,CAAb,YAAa,CACb,oBAAyB,CAAzB,iBAAyB,CAAzB,wBAAyB,CACzB,6BACF,CACA,kEACE,mBAAa,CAAb,mBAAa,CAAb,YAAa,CAGb,2BAA8B,CAA9B,6BAA8B,CAA9B,iCAA8B,CAA9B,6BAA8B,CAF9B,sBAA2B,CAA3B,mBAA2B,CAA3B,0BAA2B,CAC3B,+BAEF,C","sources":["webpack:///../../../extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.css","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/CustomizableViewportOverlay.css","webpack:///../../../extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.css"],"sourcesContent":[".viewport-wrapper {\r\n width: 100%;\r\n height: 100%; /* MUST have `height` to prevent resize infinite loop */\r\n position: relative;\r\n}\r\n\r\n.cornerstone-viewport-element {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n background-color: black;\r\n\r\n /* Prevent the blue outline in Chrome when a viewport is selected */\r\n outline: 0 !important;\r\n\r\n /* Prevents the entire page from getting larger\r\n when the magnify tool is near the sides/corners of the page */\r\n overflow: hidden;\r\n}\r\n","/*\r\ncustom overlay panels: top-left, top-right, bottom-left and bottom-right\r\nIf any text to be displayed on the overlay is too long to hold on a single\r\nline, it will be truncated with ellipsis in the end.\r\n*/\r\n.viewport-overlay {\r\n max-width: 40%;\r\n}\r\n.viewport-overlay span {\r\n max-width: 100%;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.viewport-overlay.left-viewport {\r\n text-align: left;\r\n}\r\n\r\n.viewport-overlay.right-viewport-scrollbar {\r\n text-align: right;\r\n}\r\n.viewport-overlay.right-viewport-scrollbar .flex.flex-row {\r\n justify-content: flex-end;\r\n}\r\n",".ViewportOrientationMarkers {\r\n --marker-width: 100px;\r\n --marker-height: 100px;\r\n --scrollbar-width: 20px;\r\n pointer-events: none;\r\n font-size: 15px;\r\n line-height: 18px;\r\n}\r\n.ViewportOrientationMarkers .orientation-marker {\r\n position: absolute;\r\n}\r\n.ViewportOrientationMarkers .top-mid {\r\n top: 0.6rem;\r\n left: 50%;\r\n}\r\n.ViewportOrientationMarkers .left-mid {\r\n top: 47%;\r\n left: 5px;\r\n}\r\n.ViewportOrientationMarkers .right-mid {\r\n top: 47%;\r\n left: calc(100% - var(--marker-width) - var(--scrollbar-width));\r\n}\r\n.ViewportOrientationMarkers .bottom-mid {\r\n top: calc(100% - var(--marker-height) - 0.6rem);\r\n left: 47%;\r\n}\r\n.ViewportOrientationMarkers .right-mid .orientation-marker-value {\r\n display: flex;\r\n justify-content: flex-end;\r\n min-width: var(--marker-width);\r\n}\r\n.ViewportOrientationMarkers .bottom-mid .orientation-marker-value {\r\n display: flex;\r\n justify-content: flex-start;\r\n min-height: var(--marker-height);\r\n flex-direction: column-reverse;\r\n}\r\n"],"names":[],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

3
public/19.css Normal file
View File

@@ -0,0 +1,3 @@
.dicom-tag-browser-table{margin-left:auto;margin-right:auto}.dicom-tag-browser-table-wrapper{overflow-x:scroll}.dicom-tag-browser-table tr{border-top:1px solid #ddd;color:#fff;padding-left:10px;padding-right:10px;white-space:nowrap}.stick{overflow:clip;position:sticky}.dicom-tag-browser-content{overflow:hidden;padding-bottom:50px;width:100%}.dicom-tag-browser-instance-range .range{height:20px}.dicom-tag-browser-instance-range{padding:20px 0}.dicom-tag-browser-table td.dicom-tag-browser-table-center{text-align:center}.dicom-tag-browser-table th{color:"#20A5D6";padding-left:10px;padding-right:10px;text-align:center}.dicom-tag-browser-table th.dicom-tag-browser-table-left{text-align:left}
/*# sourceMappingURL=19.css.map*/

1
public/19.css.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"19.css","mappings":"AAAA,yBAEE,gBAAiB,CADjB,iBAEF,CAEA,iCAGE,iBACF,CAEA,4BAIE,yBAA0B,CAD1B,UAAc,CAFd,iBAAkB,CAClB,kBAAmB,CAGnB,kBACF,CAEA,OAEE,aAAc,CADd,eAEF,CAEA,2BACE,eAAgB,CAEhB,mBAAoB,CADpB,UAGF,CAEA,yCACE,WACF,CAEA,kCACE,cACF,CAEA,2DACE,iBACF,CAEA,4BAIE,eAAgB,CAHhB,iBAAkB,CAClB,kBAAmB,CACnB,iBAEF,CAEA,yDACE,eACF,C","sources":["webpack:///../../../extensions/default/src/DicomTagBrowser/DicomTagBrowser.css"],"sourcesContent":[".dicom-tag-browser-table {\r\n margin-right: auto;\r\n margin-left: auto;\r\n}\r\n\r\n.dicom-tag-browser-table-wrapper {\r\n /* height: 500px;*/\r\n /*overflow-y: scroll;*/\r\n overflow-x: scroll;\r\n}\r\n\r\n.dicom-tag-browser-table tr {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n color: #ffffff;\r\n border-top: 1px solid #ddd;\r\n white-space: nowrap;\r\n}\r\n\r\n.stick {\r\n position: sticky;\r\n overflow: clip;\r\n}\r\n\r\n.dicom-tag-browser-content {\r\n overflow: hidden;\r\n width: 100%;\r\n padding-bottom: 50px;\r\n /*height: 500px;*/\r\n}\r\n\r\n.dicom-tag-browser-instance-range .range {\r\n height: 20px;\r\n}\r\n\r\n.dicom-tag-browser-instance-range {\r\n padding: 20px 0 20px 0;\r\n}\r\n\r\n.dicom-tag-browser-table td.dicom-tag-browser-table-center {\r\n text-align: center;\r\n}\r\n\r\n.dicom-tag-browser-table th {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n text-align: center;\r\n color: '#20A5D6';\r\n}\r\n\r\n.dicom-tag-browser-table th.dicom-tag-browser-table-left {\r\n text-align: left;\r\n}\r\n"],"names":[],"sourceRoot":""}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,6 @@
/*!
* Determine if an object is a Buffer
*
* @author Feross Aboukhadijeh <https://feross.org>
* @license MIT
*/

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,14 @@
/**
* @license Complex.js v2.1.1 12/05/2020
*
* Copyright (c) 2020, Robert Eisele (robert@xarg.org)
* Dual licensed under the MIT or GPL Version 2 licenses.
**/
/**
* @license Fraction.js v4.2.0 05/03/2022
* https://www.xarg.org/2014/03/rational-numbers-in-javascript/
*
* Copyright (c) 2021, Robert Eisele (robert@xarg.org)
* Dual licensed under the MIT or GPL Version 2 licenses.
**/

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4
public/221.css Normal file
View File

@@ -0,0 +1,4 @@
.dicom-tag-browser-table{margin-left:auto;margin-right:auto}.dicom-tag-browser-table-wrapper{overflow-x:scroll}.dicom-tag-browser-table tr{border-top:1px solid #ddd;color:#fff;padding-left:10px;padding-right:10px;white-space:nowrap}.stick{overflow:clip;position:sticky}.dicom-tag-browser-content{overflow:hidden;padding-bottom:50px;width:100%}.dicom-tag-browser-instance-range .range{height:20px}.dicom-tag-browser-instance-range{padding:20px 0}.dicom-tag-browser-table td.dicom-tag-browser-table-center{text-align:center}.dicom-tag-browser-table th{color:"#20A5D6";padding-left:10px;padding-right:10px;text-align:center}.dicom-tag-browser-table th.dicom-tag-browser-table-left{text-align:left}
.chrome-picker{background:#090c29!important}
/*# sourceMappingURL=221.css.map*/

1
public/221.css.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"221.css","mappings":"AAAA,yBAEE,gBAAiB,CADjB,iBAEF,CAEA,iCAGE,iBACF,CAEA,4BAIE,yBAA0B,CAD1B,UAAc,CAFd,iBAAkB,CAClB,kBAAmB,CAGnB,kBACF,CAEA,OAEE,aAAc,CADd,eAEF,CAEA,2BACE,eAAgB,CAEhB,mBAAoB,CADpB,UAGF,CAEA,yCACE,WACF,CAEA,kCACE,cACF,CAEA,2DACE,iBACF,CAEA,4BAIE,eAAgB,CAHhB,iBAAkB,CAClB,kBAAmB,CACnB,iBAEF,CAEA,yDACE,eACF,C;ACpDA,eACE,4BACF,C","sources":["webpack:///../../../extensions/default/src/DicomTagBrowser/DicomTagBrowser.css","webpack:///../../../extensions/cornerstone-dicom-seg/src/panels/colorPickerDialog.css"],"sourcesContent":[".dicom-tag-browser-table {\r\n margin-right: auto;\r\n margin-left: auto;\r\n}\r\n\r\n.dicom-tag-browser-table-wrapper {\r\n /* height: 500px;*/\r\n /*overflow-y: scroll;*/\r\n overflow-x: scroll;\r\n}\r\n\r\n.dicom-tag-browser-table tr {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n color: #ffffff;\r\n border-top: 1px solid #ddd;\r\n white-space: nowrap;\r\n}\r\n\r\n.stick {\r\n position: sticky;\r\n overflow: clip;\r\n}\r\n\r\n.dicom-tag-browser-content {\r\n overflow: hidden;\r\n width: 100%;\r\n padding-bottom: 50px;\r\n /*height: 500px;*/\r\n}\r\n\r\n.dicom-tag-browser-instance-range .range {\r\n height: 20px;\r\n}\r\n\r\n.dicom-tag-browser-instance-range {\r\n padding: 20px 0 20px 0;\r\n}\r\n\r\n.dicom-tag-browser-table td.dicom-tag-browser-table-center {\r\n text-align: center;\r\n}\r\n\r\n.dicom-tag-browser-table th {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n text-align: center;\r\n color: '#20A5D6';\r\n}\r\n\r\n.dicom-tag-browser-table th.dicom-tag-browser-table-left {\r\n text-align: left;\r\n}\r\n",".chrome-picker {\r\n background: #090c29 !important;\r\n}\r\n"],"names":[],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

5
public/250.css Normal file

File diff suppressed because one or more lines are too long

1
public/250.css.map Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[281],{42281:(o,e,n)=>{n.r(e),n.d(e,{cornerstone:()=>m,default:()=>M});var i=n(71771);const t=JSON.parse('{"u2":"@ohif/mode-microscopy"}').u2;function s(o,e,n,i,t,s){return{id:e,icon:n,label:i,type:o,commands:t,tooltip:s}}s.bind(null,"action"),s.bind(null,"toggle");const l=s.bind(null,"tool"),a=[{id:"MeasurementTools",type:"ohif.splitButton",props:{groupId:"MeasurementTools",isRadio:!0,primary:l("line","tool-length","Line",[{commandName:"setToolActive",commandOptions:{toolName:"line"},context:"MICROSCOPY"}],"Line"),secondary:{icon:"chevron-down",label:"",isActive:!0,tooltip:"More Measure Tools"},items:[l("line","tool-length","Line",[{commandName:"setToolActive",commandOptions:{toolName:"line"},context:"MICROSCOPY"}],"Line Tool"),l("point","tool-point","Point",[{commandName:"setToolActive",commandOptions:{toolName:"point"},context:"MICROSCOPY"}],"Point Tool"),l("polygon","tool-polygon","Polygon",[{commandName:"setToolActive",commandOptions:{toolName:"polygon"},context:"MICROSCOPY"}],"Polygon Tool"),l("circle","tool-circle","Circle",[{commandName:"setToolActive",commandOptions:{toolName:"circle"},context:"MICROSCOPY"}],"Circle Tool"),l("box","tool-rectangle","Box",[{commandName:"setToolActive",commandOptions:{toolName:"box"},context:"MICROSCOPY"}],"Box Tool"),l("freehandpolygon","tool-freehand-polygon","Freehand Polygon",[{commandName:"setToolActive",commandOptions:{toolName:"freehandpolygon"},context:"MICROSCOPY"}],"Freehand Polygon Tool"),l("freehandline","tool-freehand-line","Freehand Line",[{commandName:"setToolActive",commandOptions:{toolName:"freehandline"},context:"MICROSCOPY"}],"Freehand Line Tool")]}},{id:"dragPan",type:"ohif.radioGroup",props:{type:"tool",icon:"tool-move",label:"Pan",commands:[{commandName:"setToolActive",commandOptions:{toolName:"dragPan"},context:"MICROSCOPY"}]}}],c="@ohif/extension-default.layoutTemplateModule.viewerLayout",d="@ohif/extension-default.hangingProtocolModule.default",r="@ohif/extension-default.panelModule.seriesList",m={viewport:"@ohif/extension-cornerstone.viewportModule.cornerstone"},p="@ohif/extension-dicom-video.sopClassHandlerModule.dicom-video",u="@ohif/extension-dicom-video.viewportModule.dicom-video",f="@ohif/extension-dicom-pdf.sopClassHandlerModule.dicom-pdf",h="@ohif/extension-dicom-pdf.viewportModule.dicom-pdf",y={"@ohif/extension-default":"^3.0.0","@ohif/extension-cornerstone":"^3.0.0","@ohif/extension-cornerstone-dicom-sr":"^3.0.0","@ohif/extension-dicom-pdf":"^3.0.1","@ohif/extension-dicom-video":"^3.0.1","@ohif/extension-dicom-microscopy":"^3.0.0"};const M={id:t,modeFactory:function(o){let{modeConfiguration:e}=o;return{id:t,routeName:"microscopy",displayName:"Microscopy",onModeEnter:o=>{let{servicesManager:e,extensionManager:n,commandsManager:i}=o;const{toolbarService:t}=e.services;t.init(n),t.addButtons(a),t.createButtonSection("primary",["MeasurementTools","dragPan"])},onModeExit:o=>{let{servicesManager:e}=o;const{toolbarService:n}=e.services;n.reset()},validationTags:{study:[],series:[]},isValidMode:o=>{let{modalities:e}=o;return e.split("\\").includes("SM")},routes:[{path:"microscopy",layoutTemplate:o=>{let{location:e,servicesManager:n}=o;return{id:c,props:{leftPanels:[r],leftPanelDefaultClosed:!0,rightPanelDefaultClosed:!0,rightPanels:["@ohif/extension-dicom-microscopy.panelModule.measure"],viewports:[{namespace:"@ohif/extension-dicom-microscopy.viewportModule.microscopy-dicom",displaySetsToDisplay:["@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySopClassHandler","@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler"]},{namespace:u,displaySetsToDisplay:[p]},{namespace:h,displaySetsToDisplay:[f]}]}}}}],extensions:y,hangingProtocols:[d],hangingProtocol:["default"],sopClassHandlers:["@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySopClassHandler","@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler",p,f],hotkeys:[...i.dD.defaults.hotkeyBindings],...e}},extensionDependencies:y}}}]);
//# sourceMappingURL=281.bundle.17478b3e1d9df5f9a026.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,34 @@
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/**
* @license React
* use-sync-external-store-shim.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* use-sync-external-store-shim/with-selector.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

File diff suppressed because one or more lines are too long

3
public/579.css Normal file
View File

@@ -0,0 +1,3 @@
.dicom-tag-browser-table{margin-left:auto;margin-right:auto}.dicom-tag-browser-table-wrapper{overflow-x:scroll}.dicom-tag-browser-table tr{border-top:1px solid #ddd;color:#fff;padding-left:10px;padding-right:10px;white-space:nowrap}.stick{overflow:clip;position:sticky}.dicom-tag-browser-content{overflow:hidden;padding-bottom:50px;width:100%}.dicom-tag-browser-instance-range .range{height:20px}.dicom-tag-browser-instance-range{padding:20px 0}.dicom-tag-browser-table td.dicom-tag-browser-table-center{text-align:center}.dicom-tag-browser-table th{color:"#20A5D6";padding-left:10px;padding-right:10px;text-align:center}.dicom-tag-browser-table th.dicom-tag-browser-table-left{text-align:left}
/*# sourceMappingURL=579.css.map*/

1
public/579.css.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"579.css","mappings":"AAAA,yBAEE,gBAAiB,CADjB,iBAEF,CAEA,iCAGE,iBACF,CAEA,4BAIE,yBAA0B,CAD1B,UAAc,CAFd,iBAAkB,CAClB,kBAAmB,CAGnB,kBACF,CAEA,OAEE,aAAc,CADd,eAEF,CAEA,2BACE,eAAgB,CAEhB,mBAAoB,CADpB,UAGF,CAEA,yCACE,WACF,CAEA,kCACE,cACF,CAEA,2DACE,iBACF,CAEA,4BAIE,eAAgB,CAHhB,iBAAkB,CAClB,kBAAmB,CACnB,iBAEF,CAEA,yDACE,eACF,C","sources":["webpack:///../../../extensions/default/src/DicomTagBrowser/DicomTagBrowser.css"],"sourcesContent":[".dicom-tag-browser-table {\r\n margin-right: auto;\r\n margin-left: auto;\r\n}\r\n\r\n.dicom-tag-browser-table-wrapper {\r\n /* height: 500px;*/\r\n /*overflow-y: scroll;*/\r\n overflow-x: scroll;\r\n}\r\n\r\n.dicom-tag-browser-table tr {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n color: #ffffff;\r\n border-top: 1px solid #ddd;\r\n white-space: nowrap;\r\n}\r\n\r\n.stick {\r\n position: sticky;\r\n overflow: clip;\r\n}\r\n\r\n.dicom-tag-browser-content {\r\n overflow: hidden;\r\n width: 100%;\r\n padding-bottom: 50px;\r\n /*height: 500px;*/\r\n}\r\n\r\n.dicom-tag-browser-instance-range .range {\r\n height: 20px;\r\n}\r\n\r\n.dicom-tag-browser-instance-range {\r\n padding: 20px 0 20px 0;\r\n}\r\n\r\n.dicom-tag-browser-table td.dicom-tag-browser-table-center {\r\n text-align: center;\r\n}\r\n\r\n.dicom-tag-browser-table th {\r\n padding-left: 10px;\r\n padding-right: 10px;\r\n text-align: center;\r\n color: '#20A5D6';\r\n}\r\n\r\n.dicom-tag-browser-table th.dicom-tag-browser-table-left {\r\n text-align: left;\r\n}\r\n"],"names":[],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
public/610.min.worker.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[686],{39686:(e,t,r)=>{r.r(t),r.d(t,{default:()=>a});var o=r(43001),s=r(3827),l=r.n(s);function n(e){let{displaySets:t}=e;if(t&&t.length>1)throw new Error("OHIFCornerstoneVideoViewport: only one display set is supported for dicom video right now");const{videoUrl:r}=t[0],s="video/mp4",[l,n]=(0,o.useState)(null);return(0,o.useEffect)((()=>{(async()=>{n(await r)})()}),[r]),o.createElement("div",{className:"bg-primary-black h-full w-full"},o.createElement("video",{src:l,controls:!0,controlsList:"nodownload",preload:"auto",className:"h-full w-full",crossOrigin:"anonymous"},o.createElement("source",{src:l,type:s}),o.createElement("source",{src:l,type:s}),"Video src/type not supported:"," ",o.createElement("a",{href:l},l," of type ",s)))}n.propTypes={displaySets:l().arrayOf(l().object).isRequired};const a=n}}]);
//# sourceMappingURL=686.bundle.9b93df830edb822372a0.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"686.bundle.9b93df830edb822372a0.js","mappings":"oJAGA,SAASA,EAA4BC,GAAkB,IAAjB,YAAEC,GAAaD,EACnD,GAAIC,GAAeA,EAAYC,OAAS,EACtC,MAAM,IAAIC,MACR,6FAIJ,MAAM,SAAEC,GAAaH,EAAY,GAC3BI,EAAW,aACVC,EAAKC,IAAUC,EAAAA,EAAAA,UAAS,MAW/B,OATAC,EAAAA,EAAAA,YAAU,KACKC,WACXH,QAAaH,EAAS,EAGxBO,EAAM,GACL,CAACP,IAIFQ,EAAAA,cAAA,OAAKC,UAAU,kCACbD,EAAAA,cAAA,SACEE,IAAKR,EACLS,UAAQ,EACRC,aAAa,aACbC,QAAQ,OACRJ,UAAU,gBACVK,YAAY,aAEZN,EAAAA,cAAA,UACEE,IAAKR,EACLa,KAAMd,IAERO,EAAAA,cAAA,UACEE,IAAKR,EACLa,KAAMd,IACN,gCAC4B,IAC9BO,EAAAA,cAAA,KAAGQ,KAAMd,GACNA,EAAI,YAAUD,IAKzB,CAEAN,EAA6BsB,UAAY,CACvCpB,YAAaqB,IAAAA,QAAkBA,IAAAA,QAAkBC,YAGnD,S","sources":["webpack:///../../../extensions/dicom-video/src/viewports/OHIFCornerstoneVideoViewport.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\n\r\nfunction OHIFCornerstoneVideoViewport({ displaySets }) {\r\n if (displaySets && displaySets.length > 1) {\r\n throw new Error(\r\n 'OHIFCornerstoneVideoViewport: only one display set is supported for dicom video right now'\r\n );\r\n }\r\n\r\n const { videoUrl } = displaySets[0];\r\n const mimeType = 'video/mp4';\r\n const [url, setUrl] = useState(null);\r\n\r\n useEffect(() => {\r\n const load = async () => {\r\n setUrl(await videoUrl);\r\n };\r\n\r\n load();\r\n }, [videoUrl]);\r\n\r\n // Need to copies of the source to fix a firefox bug\r\n return (\r\n <div className=\"bg-primary-black h-full w-full\">\r\n <video\r\n src={url}\r\n controls\r\n controlsList=\"nodownload\"\r\n preload=\"auto\"\r\n className=\"h-full w-full\"\r\n crossOrigin=\"anonymous\"\r\n >\r\n <source\r\n src={url}\r\n type={mimeType}\r\n />\r\n <source\r\n src={url}\r\n type={mimeType}\r\n />\r\n Video src/type not supported:{' '}\r\n <a href={url}>\r\n {url} of type {mimeType}\r\n </a>\r\n </video>\r\n </div>\r\n );\r\n}\r\n\r\nOHIFCornerstoneVideoViewport.propTypes = {\r\n displaySets: PropTypes.arrayOf(PropTypes.object).isRequired,\r\n};\r\n\r\nexport default OHIFCornerstoneVideoViewport;\r\n"],"names":["OHIFCornerstoneVideoViewport","_ref","displaySets","length","Error","videoUrl","mimeType","url","setUrl","useState","useEffect","async","load","React","className","src","controls","controlsList","preload","crossOrigin","type","href","propTypes","PropTypes","isRequired"],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,29 @@
/*!
* html2canvas 1.4.1 <https://html2canvas.hertzen.com>
* Copyright (c) 2022 Niklas von Hertzen <https://hertzen.com>
* Released under MIT License
*/
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/**
* @license
* Lodash <https://lodash.com/>
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
* Released under MIT license <https://lodash.com/license>
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
*/

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[814],{92814:(e,n,t)=>{t.r(n),t.d(n,{default:()=>p});var a=t(43001);const s=JSON.parse('{"u2":"@ohif/extension-dicom-pdf"}').u2,r=`${s}.sopClassHandlerModule.dicom-pdf`;var i=t(71771);const{ImageSet:c}=i.classes,l=Object.values({ENCAPSULATED_PDF:"1.2.840.10008.5.1.4.1.1.104.1"});function d(){return d=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var a in t)Object.prototype.hasOwnProperty.call(t,a)&&(e[a]=t[a])}return e},d.apply(this,arguments)}const u=a.lazy((()=>t.e(125).then(t.bind(t,39125)))),o=e=>a.createElement(a.Suspense,{fallback:a.createElement("div",null,"Loading...")},a.createElement(u,e)),p={id:s,getViewportModule(e){let{servicesManager:n,extensionManager:t}=e;return[{name:"dicom-pdf",component:e=>a.createElement(o,d({servicesManager:n,extensionManager:t},e))}]},getSopClassHandlerModule:function(e){let{servicesManager:n,extensionManager:t}=e;return[{name:"dicom-pdf",sopClassUids:l,getDisplaySetsFromSeries:e=>((e,n,t)=>{const a=t.getActiveDataSource()[0];return e.map((e=>{const{Modality:n,SOPInstanceUID:t,EncapsulatedDocument:s}=e,{SeriesDescription:c="PDF",MIMETypeOfEncapsulatedDocument:d}=e,{SeriesNumber:u,SeriesDate:o,SeriesInstanceUID:p,StudyInstanceUID:m,SOPClassUID:S}=e,g=a.retrieve.directURL({instance:e,tag:"EncapsulatedDocument",defaultType:d||"application/pdf",singlepart:"pdf"});return{Modality:n,displaySetInstanceUID:i.utils.guid(),SeriesDescription:c,SeriesNumber:u,SeriesDate:o,SOPInstanceUID:t,SeriesInstanceUID:p,StudyInstanceUID:m,SOPClassHandlerId:r,SOPClassUID:S,referencedImages:null,measurements:null,pdfUrl:g,instances:[e],thumbnailSrc:a.retrieve.directURL({instance:e,defaultPath:"/thumbnail",defaultType:"image/jpeg",tag:"Absent"}),isDerivedDisplaySet:!0,isLoaded:!1,sopClassUids:l,numImageFrames:0,numInstances:1,instance:e}}))})(e,0,t)}]}}}}]);
//# sourceMappingURL=814.bundle.98cb45449347c08563de.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

3
public/82.css Normal file
View File

@@ -0,0 +1,3 @@
.dicom-upload-drop-area-border-dash{background-image:repeating-linear-gradient(90deg,#7bb2ce 0,#7bb2ce 50%,#0000 0,#0000),repeating-linear-gradient(90deg,#7bb2ce 0,#7bb2ce 50%,#0000 0,#0000),repeating-linear-gradient(180deg,#7bb2ce 0,#7bb2ce 50%,#0000 0,#0000),repeating-linear-gradient(180deg,#7bb2ce 0,#7bb2ce 50%,#0000 0,#0000);background-position:0 0,0 100%,0 0,100% 0;background-repeat:repeat-x,repeat-x,repeat-y,repeat-y;background-size:20px 3px,20px 3px,3px 20px,3px 20px}
/*# sourceMappingURL=82.css.map*/

1
public/82.css.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"82.css","mappings":"AAAA,oCACE,sSASkG,CAClG,yCAIW,CACX,qDAAyD,CACzD,mDAKF,C","sources":["webpack:///../../../extensions/cornerstone/src/components/DicomUpload/DicomUpload.css"],"sourcesContent":[".dicom-upload-drop-area-border-dash {\r\n background-image: repeating-linear-gradient(\r\n to right,\r\n #7bb2ce 0%,\r\n #7bb2ce 50%,\r\n transparent 50%,\r\n transparent 100%\r\n ),\r\n repeating-linear-gradient(to right, #7bb2ce 0%, #7bb2ce 50%, transparent 50%, transparent 100%),\r\n repeating-linear-gradient(to bottom, #7bb2ce 0%, #7bb2ce 50%, transparent 50%, transparent 100%),\r\n repeating-linear-gradient(to bottom, #7bb2ce 0%, #7bb2ce 50%, transparent 50%, transparent 100%);\r\n background-position:\r\n left top,\r\n left bottom,\r\n left top,\r\n right top;\r\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\r\n background-size:\r\n 20px 3px,\r\n 20px 3px,\r\n 3px 20px,\r\n 3px 20px;\r\n}\r\n"],"names":[],"sourceRoot":""}

View File

@@ -0,0 +1,2 @@
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[822],{86822:(e,t,n)=>{n.r(t),n.d(t,{default:()=>f});var r=n(43001),s=n(3827),a=n.n(s),i=n(71771),o=n(71783),l=n(69190),c=n(14957),u=n(41832),m=n(3743);function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},d.apply(this,arguments)}const{formatDate:p}=i.utils;function E(e){const{displaySets:t,viewportId:n,viewportLabel:s,servicesManager:a,extensionManager:E}=e,{t:f}=(0,l.$G)("Common"),{measurementService:S,cornerstoneViewportService:v,viewportGridService:g}=a.services,b=t[0],[w,D]=(0,u.I)(),[I,h]=(0,r.useState)(!1),[y,N]=(0,r.useState)(null),[V,x]=(0,r.useState)(null),{trackedSeries:k}=w.context,{SeriesDate:M,SeriesDescription:T,SeriesInstanceUID:U,SeriesNumber:R}=b,{PatientID:O,PatientName:A,PatientSex:C,PatientAge:P,SliceThickness:_,SpacingBetweenSlices:j,StudyDate:F,ManufacturerModelName:L}=b.images[0],W=(0,r.useCallback)((()=>{const e=v.getCornerstoneViewport(n);if(e instanceof m.BaseVolumeViewport){const t=e?.getCurrentImageId();if(!t)return void(I&&h(!1))}k.includes(U)!==I&&h(!I)}),[I,w,n,U]),q=(0,r.useCallback)((e=>{e.detail.element!==V&&(e.detail.element?.addEventListener(m.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,W),x(e.detail.element))}),[W,V]),G=(0,r.useCallback)((()=>{V?.removeEventListener(m.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME,W)}),[W,V]);(0,r.useEffect)(W,[W]),(0,r.useEffect)((()=>{const{unsubscribe:e}=v.subscribe(v.EVENTS.VIEWPORT_DATA_CHANGED,(e=>{e.viewportId===n&&W()}));return()=>{e()}}),[W,n]),(0,r.useEffect)((()=>I?(c.annotation.config.style.setViewportToolStyles(n,{global:{lineDash:""}}),void v.getRenderingEngine().renderViewport(n)):(c.annotation.config.style.setViewportToolStyles(n,{global:{lineDash:"4,4"}}),v.getRenderingEngine().renderViewport(n),()=>{c.annotation.config.style.setViewportToolStyles(n,{})})),[I]),(0,r.useEffect)((()=>{const e=S.EVENTS.MEASUREMENT_ADDED,t=S.EVENTS.RAW_MEASUREMENT_ADDED,r=[];return[e,t].forEach((e=>{r.push(S.subscribe(e,(e=>{let{source:t,measurement:r}=e;const{activeViewportId:s}=g.getState();if(n===s){const{referenceStudyUID:e,referenceSeriesUID:t}=r;D("SET_DIRTY",{SeriesInstanceUID:t}),D("TRACK_SERIES",{viewportId:n,StudyInstanceUID:e,SeriesInstanceUID:t})}})).unsubscribe)})),()=>{r.forEach((e=>{e()}))}}),[S,D,n,g]);return r.createElement(r.Fragment,null,r.createElement(o.uY,{onDoubleClick:e=>{e.stopPropagation(),e.preventDefault()},useAltStyling:I,onArrowsClick:e=>function(e){const t=function(e,t,n,r){const{measurementService:s,viewportGridService:a}=t.services,i=s.getMeasurements(),{activeViewportId:o,viewports:l}=a.getState(),{displaySetInstanceUIDs:c}=l.get(o),{trackedSeries:u}=r.context,m=i.filter((e=>u.includes(e.referenceSeriesUID)&&c.includes(e.displaySetInstanceUID)));if(!m.length)return;const d=m.length,p=m.map((e=>e.uid));let E=p.findIndex((e=>e===n));return-1===E?E=0:"left"===e?(E--,E<0&&(E=d-1)):"right"===e&&(E++,E===d&&(E=0)),p[E]}(e,a,y,w);t&&(N(t),S.jumpToMeasurement(n,t))}(e),getStatusComponent:()=>function(e){const t=e?"status-tracked":"status-untracked";return r.createElement("div",{className:"relative"},r.createElement(o.u,{position:"bottom-left",content:r.createElement("div",{className:"flex py-2"},r.createElement("div",{className:"flex pt-1"},r.createElement(o.JO,{name:"info-link",className:"text-primary-main w-4"})),r.createElement("div",{className:"ml-4 flex"},r.createElement("span",{className:"text-common-light text-base"},e?r.createElement(r.Fragment,null,"Series is",r.createElement("span",{className:"font-bold text-white"}," tracked")," and can be viewed ",r.createElement("br",null)," ","in the measurement panel"):r.createElement(r.Fragment,null,"Measurements for",r.createElement("span",{className:"font-bold text-white"}," untracked "),"series ",r.createElement("br",null)," will not be shown in the ",r.createElement("br",null)," measurements panel"))))},r.createElement(o.JO,{name:t,className:"text-aqua-pale"})))}(I),studyData:{label:s,studyDate:p(M)||p(F)||f("NoStudyDate"),currentSeries:R,seriesDescription:T,patientInformation:{patientName:A?i.default.utils.formatPN(A):"",patientSex:C||"",patientAge:P||"",MRN:O||"",thickness:_?`${parseFloat(_).toFixed(2)}`:"",thicknessUnits:"mm",spacing:void 0!==j?`${parseFloat(j).toFixed(2)}mm`:"",scanner:L||""}}}),r.createElement("div",{className:"relative flex h-full w-full flex-row overflow-hidden"},(()=>{const{component:t}=E.getModuleEntry("@ohif/extension-cornerstone.viewportModule.cornerstone");return r.createElement(t,d({},e,{onElementEnabled:q,onElementDisabled:G}))})()))}E.propTypes={displaySets:a().arrayOf(a().object.isRequired).isRequired,viewportId:a().string.isRequired,dataSource:a().object,children:a().node,customProps:a().object},E.defaultProps={customProps:{}};const f=E}}]);
//# sourceMappingURL=822.bundle.c7db86db8d8ed49ef794.js.map

Some files were not shown because too many files have changed in this diff Show More