@ohif/app 3.13.0-beta.6 → 3.13.0-beta.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{1459.bundle.075e535250e3d4779923.js → 1459.bundle.ed7323f44e4ff4ecd69a.js} +5 -6
- package/dist/{147.bundle.37d627289453cb6c3937.js → 147.bundle.173b4a11960d03a3b5b0.js} +21 -45
- package/dist/{1608.bundle.0687c661f1c9edfb3b8a.js → 1608.bundle.e4aadbf17d38143dacdf.js} +12 -12
- package/dist/{1927.bundle.3050588e95f43cf57cdd.js → 1927.bundle.be67b3aafe238ca9f191.js} +27 -38
- package/dist/{1933.bundle.317997210b6a51079753.js → 1933.bundle.0055c536e1392867e57c.js} +32 -27
- package/dist/{2018.bundle.31d14d6f9fb764b51bda.js → 2018.bundle.ab8f9ceeae0e18eb303b.js} +18 -19
- package/dist/{6409.bundle.b36048896cb11c8571fb.js → 2075.bundle.23265b8e7597c398db4f.js} +327 -256
- package/dist/{2108.bundle.e84aa8d858d8c4f2413e.js → 2108.bundle.aea8d3b39486dd5ab39e.js} +569 -558
- package/dist/{213.bundle.363f9a3eb6c0d33e3921.js → 213.bundle.18a8b5a1e2f00de7feaf.js} +3 -5
- package/dist/{2424.bundle.aa7f4df6cba71b817c87.js → 2424.bundle.5e858661a06aa36dd859.js} +3 -5
- package/dist/{2516.bundle.1ea0988d309a757bb6da.js → 2516.bundle.f62228e9a800de8d4b31.js} +6 -6
- package/dist/{2701.bundle.12bd01a80a9f8ea4cd94.js → 2701.bundle.b591cf6385ed53ed6093.js} +10 -10
- package/dist/{9195.bundle.adf6a548b6f7ae279c09.js → 2851.bundle.c5202066974b96955c28.js} +384 -169
- package/dist/{1730.bundle.1d137db2556d538263fb.js → 3138.bundle.5ed994e6e0ff7c720a75.js} +16 -310
- package/dist/{3461.bundle.7024d5e66d12b4069031.js → 3461.bundle.54f8d64ed1965c14ec4c.js} +131 -107
- package/dist/{4202.bundle.5a0f8e4004c5d8a68548.js → 4202.bundle.850a7c7c011800b3daea.js} +6 -6
- package/dist/{4019.bundle.83a604779f7da0101ced.js → 4287.bundle.b7840e7b94cbbc102236.js} +348 -237
- package/dist/{5462.bundle.21beddaca145b7465c72.js → 4406.bundle.573d234b4641d23cf8db.js} +1083 -1308
- package/dist/{1403.bundle.40baf30d503370ce52c9.js → 4507.bundle.18379f328211aee3aba5.js} +10 -305
- package/dist/{6347.bundle.784c48912700f281de1d.js → 4579.bundle.0a6b2f49a7e136a79e37.js} +561 -649
- package/dist/{3081.bundle.f0df1c7d93ef4be29102.js → 4688.bundle.e23f20a556dca69540fd.js} +742 -408
- package/dist/{4819.bundle.0c37918802ef7805586f.js → 4819.bundle.fb82fcc8360f4883691e.js} +39 -39
- package/dist/{4775.bundle.5d6203a2991902544266.js → 5015.bundle.dda760490cf19777b6b3.js} +29 -333
- package/dist/{5028.bundle.2cd4d2253b47845e6634.js → 5028.bundle.494b6ca9e0f5567c26e2.js} +11 -13
- package/dist/{5261.bundle.6e1a017f8f1027557f5b.js → 5261.bundle.2655560097e9250eac44.js} +412 -345
- package/dist/{5457.bundle.15d4adb3ca43c45b044d.js → 5457.bundle.328f29b05df8d287491b.js} +16 -23
- package/dist/{5485.bundle.b9764a7846d57ee5710d.js → 5485.bundle.53614f38e6ee0e052bdc.js} +20 -32
- package/dist/{5491.bundle.2e01dd7ad29e4cc01bc1.js → 5491.bundle.4866d2ecb20dd089e071.js} +54 -51
- package/dist/{5802.bundle.3bf5e6b3ab330a594a47.js → 5802.bundle.41cf74cda9aad21601e8.js} +79 -20
- package/dist/5802.css +1 -1
- package/dist/{5830.bundle.b073c265c4fcea1afff3.js → 5830.bundle.791019deddd536980a11.js} +3 -3
- package/dist/{5858.bundle.ff6b340cf7457db76a1a.js → 5858.bundle.466e58128de344ab53f3.js} +90 -86
- package/dist/{6027.bundle.55f4bf16015381255f33.js → 6027.bundle.1bfe806a0cb494dfc265.js} +3 -5
- package/dist/{6354.bundle.c387737dc09c9cab4ff2.js → 6354.bundle.929febcf6d326e582e00.js} +151 -140
- package/dist/{6376.bundle.9cb74d7bc08476e2f1a7.js → 6376.bundle.738c873196491232acb6.js} +6 -6
- package/dist/{2842.bundle.860b9f10fcdd9656947a.js → 6386.bundle.5d82d1f41d1c37a0358d.js} +904 -2298
- package/dist/6939.bundle.41fbdef87597b5172ec6.js +3 -3
- package/dist/{7159.bundle.a5991a5d4f0dd8f1c95f.js → 7159.bundle.fb9df255868960f69765.js} +7 -5
- package/dist/{7190.bundle.e8f0193e0e06472f795c.js → 7190.bundle.3738008038e70525764f.js} +1129 -821
- package/dist/{732.bundle.6978ac30a1e36abf06db.js → 732.bundle.ea6f9d8504e37e01a208.js} +5 -13
- package/dist/{7431.bundle.b01791d10e6cf9f503b0.js → 7431.bundle.5e14641f2c71e852abe7.js} +28 -28
- package/dist/{4410.bundle.c5224cd7d6238a7d4660.js → 7537.bundle.1726a7f7a4c378296085.js} +5216 -2238
- package/dist/{7639.bundle.9057c381d5f455997d60.js → 7639.bundle.2ec2272d8eb08df56b66.js} +3 -5
- package/dist/7758.bundle.c8d106364298e7d288f0.js +3 -3
- package/dist/{8094.bundle.5c44190a325ac23e3e5c.js → 8094.bundle.148a66619607e37cbf19.js} +3 -4
- package/dist/{8305.bundle.2a215d860aa3bb1984f6.js → 8305.bundle.21d4c7deff19f6ce9a6a.js} +71 -66
- package/dist/{6163.bundle.18484c031c76e3835a71.js → 8499.bundle.dbeca38ee1d1471ce4d8.js} +7 -302
- package/dist/8499.css +2 -0
- package/dist/{85.bundle.173a5ab4b47890e2f013.js → 85.bundle.e426258a9ad5bcf9bb3e.js} +3 -5
- package/dist/{8558.bundle.52d7001a86845c8a91b8.js → 8558.bundle.5c64a061bf4d5d5f6d7a.js} +15 -309
- package/dist/{8583.bundle.e899badfa6f91f22b2f3.js → 8583.bundle.a0ccedd0799600ad5fad.js} +24 -27
- package/dist/{997.bundle.822b33e561263084e18c.js → 9039.bundle.7afa93b103c3b26d4855.js} +3965 -2984
- package/dist/{7412.bundle.fab1742191b7fe937330.js → 9205.bundle.315c3b56464a7590235a.js} +6071 -3305
- package/dist/{3584.bundle.8cc0750425513433e9cc.js → 9567.bundle.be350438bed4e656f278.js} +3422 -2880
- package/dist/{9845.bundle.255e7c7f7a88193b4e47.js → 9845.bundle.267831496ba080d9f8da.js} +10 -10
- package/dist/{9862.bundle.3a8958a82c572015d25d.js → 9862.bundle.09783830f0cb75a84d2a.js} +8 -6
- package/dist/{9927.bundle.0e4c7a7682b7acad3060.js → 9927.bundle.3bdd61e78a710e09cc0b.js} +4 -6
- package/dist/app-config.js +12 -0
- package/dist/{app.bundle.62d84a3df6ec149a44a6.js → app.bundle.348a74b1a7aeb7c8d0a8.js} +100482 -97633
- package/dist/app.bundle.css +3 -3
- package/dist/{polySeg.bundle.a5aa9130b4191253c410.js → compute.bundle.a41ec0ba4f935200ab93.js} +8 -20
- package/dist/{histogram-worker.bundle.d4e40a8018d2698b072e.js → histogram-worker.bundle.a2a50c4674d99c619ca7.js} +11 -23
- package/dist/index.html +1 -1
- package/dist/{interpolation.bundle.c70cb95d164dc494e6dc.js → interpolation.bundle.2559b710030605fc2bc6.js} +14 -26
- package/dist/{compute.bundle.64280c7af19ff567465f.js → polySeg.bundle.be57af5b834dd833a418.js} +10 -22
- package/dist/sw.js +1 -1
- package/package.json +23 -22
- package/dist/3343.bundle.d7578ce8f75d158c0bab.js +0 -297
- /package/dist/{1730.css → 3138.css} +0 -0
- /package/dist/{3343.css → 4972.css} +0 -0
- /package/dist/{6163.css → 7829.css} +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[
|
|
2
|
+
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[2851],{
|
|
3
3
|
|
|
4
|
-
/***/ 52675
|
|
5
|
-
|
|
4
|
+
/***/ 52675
|
|
5
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
6
6
|
|
|
7
7
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
8
8
|
/* harmony export */ A: () => (/* binding */ MoreDropdownMenu)
|
|
9
9
|
/* harmony export */ });
|
|
10
10
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86326);
|
|
11
|
-
/* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(
|
|
11
|
+
/* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15953);
|
|
12
12
|
/* harmony import */ var _ohif_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(42356);
|
|
13
13
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
14
14
|
|
|
@@ -110,10 +110,10 @@ function MoreDropdownMenu(bindProps) {
|
|
|
110
110
|
return BoundMoreDropdownMenu;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
/***/ }
|
|
113
|
+
/***/ },
|
|
114
114
|
|
|
115
|
-
/***/ 40565
|
|
116
|
-
|
|
115
|
+
/***/ 40565
|
|
116
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
117
117
|
|
|
118
118
|
|
|
119
119
|
// EXPORTS
|
|
@@ -123,8 +123,8 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
123
123
|
|
|
124
124
|
// EXTERNAL MODULE: ../../../node_modules/react/index.js
|
|
125
125
|
var react = __webpack_require__(86326);
|
|
126
|
-
// EXTERNAL MODULE: ../../ui-next/src/index.ts +
|
|
127
|
-
var src = __webpack_require__(
|
|
126
|
+
// EXTERNAL MODULE: ../../ui-next/src/index.ts + 3084 modules
|
|
127
|
+
var src = __webpack_require__(15953);
|
|
128
128
|
// EXTERNAL MODULE: ../../core/src/index.ts + 69 modules
|
|
129
129
|
var core_src = __webpack_require__(42356);
|
|
130
130
|
// EXTERNAL MODULE: ../../../node_modules/react-router-dom/dist/index.js
|
|
@@ -239,7 +239,7 @@ function PanelStudyBrowser({
|
|
|
239
239
|
commandsManager,
|
|
240
240
|
servicesManager,
|
|
241
241
|
isHangingProtocolLayout,
|
|
242
|
-
appConfig: extensionManager.
|
|
242
|
+
appConfig: extensionManager.appConfig
|
|
243
243
|
};
|
|
244
244
|
const handlers = customHandler?.callbacks.map(callback => callback(setupArgs));
|
|
245
245
|
for (const handler of handlers) {
|
|
@@ -491,7 +491,7 @@ function PanelStudyBrowser({
|
|
|
491
491
|
updateActionIconValue: updateActionIconValue
|
|
492
492
|
}), /*#__PURE__*/react.createElement(src/* Separator */.wvv, {
|
|
493
493
|
orientation: "horizontal",
|
|
494
|
-
className: "bg-
|
|
494
|
+
className: "bg-background",
|
|
495
495
|
thickness: "2px"
|
|
496
496
|
})), /*#__PURE__*/react.createElement(src/* StudyBrowser */.M4o, {
|
|
497
497
|
tabs: tabs,
|
|
@@ -609,16 +609,16 @@ function _findTabAndStudyOfDisplaySet(displaySetInstanceUID, tabs, currentTabNam
|
|
|
609
609
|
}
|
|
610
610
|
}
|
|
611
611
|
|
|
612
|
-
/***/ }
|
|
612
|
+
/***/ },
|
|
613
613
|
|
|
614
|
-
/***/ 3329
|
|
615
|
-
|
|
614
|
+
/***/ 3329
|
|
615
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
616
616
|
|
|
617
617
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
618
618
|
/* harmony export */ T: () => (/* binding */ PanelStudyBrowserHeader)
|
|
619
619
|
/* harmony export */ });
|
|
620
620
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86326);
|
|
621
|
-
/* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(
|
|
621
|
+
/* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(15953);
|
|
622
622
|
|
|
623
623
|
|
|
624
624
|
|
|
@@ -656,15 +656,15 @@ function PanelStudyBrowserHeader({
|
|
|
656
656
|
key: index,
|
|
657
657
|
"aria-label": viewPreset.id,
|
|
658
658
|
value: viewPreset.id,
|
|
659
|
-
className: "text-
|
|
659
|
+
className: "text-primary"
|
|
660
660
|
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__/* .Icons */ .FI1[viewPreset.iconName] || _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__/* .Icons */ .FI1.MissingIcon)))))))));
|
|
661
661
|
}
|
|
662
662
|
|
|
663
663
|
|
|
664
|
-
/***/ }
|
|
664
|
+
/***/ },
|
|
665
665
|
|
|
666
|
-
/***/ 20528
|
|
667
|
-
|
|
666
|
+
/***/ 20528
|
|
667
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
668
668
|
|
|
669
669
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
670
670
|
/* harmony export */ M: () => (/* binding */ Toolbar)
|
|
@@ -743,66 +743,41 @@ function Toolbar({
|
|
|
743
743
|
}));
|
|
744
744
|
}
|
|
745
745
|
|
|
746
|
-
/***/ }
|
|
746
|
+
/***/ },
|
|
747
747
|
|
|
748
|
-
/***/
|
|
749
|
-
|
|
748
|
+
/***/ 62851
|
|
749
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
750
750
|
|
|
751
|
-
// ESM COMPAT FLAG
|
|
752
|
-
__webpack_require__.r(__webpack_exports__);
|
|
753
751
|
|
|
754
752
|
// EXPORTS
|
|
755
753
|
__webpack_require__.d(__webpack_exports__, {
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
cleanDenaturalizedDataset: () => (/* reexport */ cleanDenaturalizedDataset),
|
|
766
|
-
colorPickerDialog: () => (/* reexport */ colorPickerDialog),
|
|
767
|
-
createReportAsync: () => (/* reexport */ Actions_createReportAsync),
|
|
768
|
-
createReportDialogPrompt: () => (/* reexport */ CreateReportDialogPrompt),
|
|
754
|
+
tm: () => (/* reexport */ StaticWadoClient),
|
|
755
|
+
M7: () => (/* reexport */ Toolbar/* Toolbar */.M),
|
|
756
|
+
OO: () => (/* reexport */ Toolbox),
|
|
757
|
+
l5: () => (/* reexport */ callInputDialog),
|
|
758
|
+
fq: () => (/* reexport */ callInputDialogAutoComplete),
|
|
759
|
+
wZ: () => (/* reexport */ cleanDenaturalizedDataset),
|
|
760
|
+
wS: () => (/* reexport */ colorPickerDialog),
|
|
761
|
+
Vy: () => (/* reexport */ Actions_createReportAsync),
|
|
762
|
+
tc: () => (/* reexport */ CreateReportDialogPrompt),
|
|
769
763
|
"default": () => (/* binding */ default_src),
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
useHangingProtocolStageIndexStore: () => (/* reexport */ useHangingProtocolStageIndexStore),
|
|
777
|
-
usePatientInfo: () => (/* reexport */ hooks_usePatientInfo),
|
|
778
|
-
useToggleHangingProtocolStore: () => (/* reexport */ useToggleHangingProtocolStore),
|
|
779
|
-
useToggleOneUpViewportGridStore: () => (/* reexport */ useToggleOneUpViewportGridStore),
|
|
780
|
-
useUIStateStore: () => (/* reexport */ useUIStateStore),
|
|
781
|
-
useViewportGridStore: () => (/* reexport */ useViewportGridStore),
|
|
782
|
-
useViewportsByPositionStore: () => (/* reexport */ useViewportsByPositionStore),
|
|
783
|
-
utils: () => (/* reexport */ src_utils_namespaceObject)
|
|
764
|
+
CA: () => (/* reexport */ utils_namespaceObject),
|
|
765
|
+
uR: () => (/* reexport */ utils_promptLabelAnnotation),
|
|
766
|
+
MP: () => (/* reexport */ utils_promptSaveReport),
|
|
767
|
+
Z: () => (/* reexport */ Panels_requestDisplaySetCreationForStudy),
|
|
768
|
+
Yd: () => (/* reexport */ useToggleOneUpViewportGridStore),
|
|
769
|
+
FS: () => (/* reexport */ useUIStateStore)
|
|
784
770
|
});
|
|
785
771
|
|
|
786
|
-
//
|
|
787
|
-
var types_namespaceObject = {};
|
|
788
|
-
__webpack_require__.r(types_namespaceObject);
|
|
772
|
+
// UNUSED EXPORTS: ContextMenuController, CustomizableContextMenuTypes, MoreDropdownMenu, PanelStudyBrowserHeader, getStudiesForPatientByMRN, useDisplaySetSelectorStore, useHangingProtocolStageIndexStore, usePatientInfo, useToggleHangingProtocolStore, useViewportGridStore, useViewportsByPositionStore, utils
|
|
789
773
|
|
|
790
774
|
// NAMESPACE OBJECT: ../../../extensions/default/src/DicomWebDataSource/utils/index.ts
|
|
791
775
|
var utils_namespaceObject = {};
|
|
792
776
|
__webpack_require__.r(utils_namespaceObject);
|
|
793
777
|
__webpack_require__.d(utils_namespaceObject, {
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
transferDenaturalizedDataset: () => (transferDenaturalizedDataset)
|
|
798
|
-
});
|
|
799
|
-
|
|
800
|
-
// NAMESPACE OBJECT: ../../../extensions/default/src/utils/index.ts
|
|
801
|
-
var src_utils_namespaceObject = {};
|
|
802
|
-
__webpack_require__.r(src_utils_namespaceObject);
|
|
803
|
-
__webpack_require__.d(src_utils_namespaceObject, {
|
|
804
|
-
Toolbox: () => (Toolbox),
|
|
805
|
-
addIcon: () => (addIcon)
|
|
778
|
+
wZ: () => (cleanDenaturalizedDataset),
|
|
779
|
+
Uk: () => (fixMultiValueKeys),
|
|
780
|
+
If: () => (transferDenaturalizedDataset)
|
|
806
781
|
});
|
|
807
782
|
|
|
808
783
|
// EXTERNAL MODULE: ../../../node_modules/dicomweb-client/build/dicomweb-client.es.js
|
|
@@ -2735,12 +2710,96 @@ function retrieveBulkData(value, options = {}) {
|
|
|
2735
2710
|
|
|
2736
2711
|
// EXTERNAL MODULE: ../../../node_modules/query-string/index.js
|
|
2737
2712
|
var query_string = __webpack_require__(98985);
|
|
2713
|
+
;// ../../../extensions/default/src/utils/secureConfigFetch.js
|
|
2714
|
+
// @ts-nocheck
|
|
2715
|
+
|
|
2716
|
+
function normalizeAllowedOrigins(allowedOrigins = []) {
|
|
2717
|
+
if (!Array.isArray(allowedOrigins)) {
|
|
2718
|
+
return [];
|
|
2719
|
+
}
|
|
2720
|
+
const configuredOrigins = allowedOrigins.filter(origin => typeof origin === 'string').map(origin => origin.trim()).filter(Boolean);
|
|
2721
|
+
return configuredOrigins.map(origin => {
|
|
2722
|
+
try {
|
|
2723
|
+
const parsedOrigin = new URL(origin);
|
|
2724
|
+
if (!['http:', 'https:'].includes(parsedOrigin.protocol)) {
|
|
2725
|
+
console.error(`[secureConfigFetch] Ignoring misconfigured allowed origin "${origin}". ` + 'Entries must use http:// or https://.');
|
|
2726
|
+
return null;
|
|
2727
|
+
}
|
|
2728
|
+
if (parsedOrigin.username || parsedOrigin.password || parsedOrigin.pathname !== '/' || parsedOrigin.search || parsedOrigin.hash) {
|
|
2729
|
+
console.error(`[secureConfigFetch] Ignoring misconfigured allowed origin "${origin}". ` + 'Entries must be bare origins only (scheme + host + optional port), with no username/password, path, query, or hash.');
|
|
2730
|
+
return null;
|
|
2731
|
+
}
|
|
2732
|
+
return parsedOrigin.origin;
|
|
2733
|
+
} catch {
|
|
2734
|
+
console.error(`[secureConfigFetch] Ignoring misconfigured allowed origin "${origin}". Entry is not a valid URL.`);
|
|
2735
|
+
return null;
|
|
2736
|
+
}
|
|
2737
|
+
}).filter(Boolean);
|
|
2738
|
+
}
|
|
2739
|
+
function resolveConfigUrl(rawUrl) {
|
|
2740
|
+
if (!rawUrl || typeof rawUrl !== 'string') {
|
|
2741
|
+
throw new Error('Missing required "url" query parameter');
|
|
2742
|
+
}
|
|
2743
|
+
try {
|
|
2744
|
+
return new URL(rawUrl, window.location.href);
|
|
2745
|
+
} catch {
|
|
2746
|
+
throw new Error('Invalid URL in "url" query parameter');
|
|
2747
|
+
}
|
|
2748
|
+
}
|
|
2749
|
+
function resolveConfigFetchPolicy(rawUrl, policy = {}) {
|
|
2750
|
+
const {
|
|
2751
|
+
allowedOrigins = [],
|
|
2752
|
+
userAuthenticationService
|
|
2753
|
+
} = policy;
|
|
2754
|
+
const parsedUrl = resolveConfigUrl(rawUrl);
|
|
2755
|
+
const protocol = parsedUrl.protocol.toLowerCase();
|
|
2756
|
+
if (!['http:', 'https:'].includes(protocol)) {
|
|
2757
|
+
throw new Error('Only HTTP(S) URLs are allowed for dynamic datasource configuration');
|
|
2758
|
+
}
|
|
2759
|
+
if (parsedUrl.hash) {
|
|
2760
|
+
throw new Error('URL fragments are not allowed for dynamic datasource configuration');
|
|
2761
|
+
}
|
|
2762
|
+
if (parsedUrl.username || parsedUrl.password) {
|
|
2763
|
+
throw new Error('URL userinfo is not allowed for dynamic datasource configuration');
|
|
2764
|
+
}
|
|
2765
|
+
const isAuthenticated = Boolean(userAuthenticationService?.getAuthorizationHeader?.()?.Authorization);
|
|
2766
|
+
if (isAuthenticated) {
|
|
2767
|
+
const normalizedAllowedOrigins = normalizeAllowedOrigins(allowedOrigins);
|
|
2768
|
+
if (!normalizedAllowedOrigins.length || !normalizedAllowedOrigins.includes(parsedUrl.origin)) {
|
|
2769
|
+
throw new Error(`Blocked remote configuration origin "${parsedUrl.origin}" in authenticated environment`);
|
|
2770
|
+
}
|
|
2771
|
+
}
|
|
2772
|
+
return {
|
|
2773
|
+
parsedUrl,
|
|
2774
|
+
normalizedUrl: parsedUrl.toString(),
|
|
2775
|
+
isAuthenticated
|
|
2776
|
+
};
|
|
2777
|
+
}
|
|
2778
|
+
async function fetchConfigJson(normalizedPolicy) {
|
|
2779
|
+
const {
|
|
2780
|
+
normalizedUrl,
|
|
2781
|
+
isAuthenticated
|
|
2782
|
+
} = normalizedPolicy;
|
|
2783
|
+
const response = isAuthenticated ? await fetch(normalizedUrl) : await fetch(normalizedUrl, {
|
|
2784
|
+
method: 'GET',
|
|
2785
|
+
mode: 'cors',
|
|
2786
|
+
credentials: 'omit',
|
|
2787
|
+
redirect: 'error',
|
|
2788
|
+
referrerPolicy: 'no-referrer'
|
|
2789
|
+
});
|
|
2790
|
+
if (!response.ok) {
|
|
2791
|
+
throw new Error(`Failed to fetch dynamic datasource configuration (${response.status})`);
|
|
2792
|
+
}
|
|
2793
|
+
return response.json();
|
|
2794
|
+
}
|
|
2795
|
+
|
|
2738
2796
|
;// ../../../extensions/default/src/DicomJSONDataSource/index.js
|
|
2739
2797
|
|
|
2740
2798
|
|
|
2741
2799
|
|
|
2742
2800
|
|
|
2743
2801
|
|
|
2802
|
+
|
|
2744
2803
|
const DicomJSONDataSource_metadataProvider = src/* default.classes */.Ay.classes.MetadataProvider;
|
|
2745
2804
|
const mappings = {
|
|
2746
2805
|
studyInstanceUid: 'StudyInstanceUID',
|
|
@@ -2787,7 +2846,10 @@ const findStudies = (key, value) => {
|
|
|
2787
2846
|
});
|
|
2788
2847
|
return studies;
|
|
2789
2848
|
};
|
|
2790
|
-
function createDicomJSONApi(dicomJsonConfig) {
|
|
2849
|
+
function createDicomJSONApi(dicomJsonConfig, servicesManager) {
|
|
2850
|
+
const {
|
|
2851
|
+
userAuthenticationService
|
|
2852
|
+
} = servicesManager.services;
|
|
2791
2853
|
const implementation = {
|
|
2792
2854
|
initialize: async ({
|
|
2793
2855
|
query,
|
|
@@ -2796,7 +2858,11 @@ function createDicomJSONApi(dicomJsonConfig) {
|
|
|
2796
2858
|
if (!url) {
|
|
2797
2859
|
url = query.get('url');
|
|
2798
2860
|
}
|
|
2799
|
-
|
|
2861
|
+
const evaluatedUrl = resolveConfigFetchPolicy(url, {
|
|
2862
|
+
allowedOrigins: dicomJsonConfig.dangerouslyAllowedOriginsForAuthenticatedEnvironments,
|
|
2863
|
+
userAuthenticationService
|
|
2864
|
+
});
|
|
2865
|
+
let metaData = getMetaDataByURL(evaluatedUrl.normalizedUrl);
|
|
2800
2866
|
|
|
2801
2867
|
// if we have already cached the data from this specific url
|
|
2802
2868
|
// We are only handling one StudyInstanceUID to run; however,
|
|
@@ -2806,8 +2872,7 @@ function createDicomJSONApi(dicomJsonConfig) {
|
|
|
2806
2872
|
return aStudy.StudyInstanceUID;
|
|
2807
2873
|
});
|
|
2808
2874
|
}
|
|
2809
|
-
const
|
|
2810
|
-
const data = await response.json();
|
|
2875
|
+
const data = await fetchConfigJson(evaluatedUrl);
|
|
2811
2876
|
let StudyInstanceUID;
|
|
2812
2877
|
let SeriesInstanceUID;
|
|
2813
2878
|
data.studies.forEach(study => {
|
|
@@ -2837,10 +2902,10 @@ function createDicomJSONApi(dicomJsonConfig) {
|
|
|
2837
2902
|
});
|
|
2838
2903
|
});
|
|
2839
2904
|
_store.urls.push({
|
|
2840
|
-
url,
|
|
2905
|
+
url: evaluatedUrl.normalizedUrl,
|
|
2841
2906
|
studies: [...data.studies]
|
|
2842
2907
|
});
|
|
2843
|
-
_store.studyInstanceUIDMap.set(
|
|
2908
|
+
_store.studyInstanceUIDMap.set(evaluatedUrl.normalizedUrl, data.studies.map(study => study.StudyInstanceUID));
|
|
2844
2909
|
},
|
|
2845
2910
|
query: {
|
|
2846
2911
|
studies: {
|
|
@@ -2975,6 +3040,8 @@ function createDicomJSONApi(dicomJsonConfig) {
|
|
|
2975
3040
|
console.warn(' DICOMJson store dicom not implemented');
|
|
2976
3041
|
}
|
|
2977
3042
|
},
|
|
3043
|
+
reject: {},
|
|
3044
|
+
deleteStudyMetadataPromise: () => {},
|
|
2978
3045
|
getImageIdsForDisplaySet(displaySet) {
|
|
2979
3046
|
const images = displaySet.images;
|
|
2980
3047
|
const imageIds = [];
|
|
@@ -3033,8 +3100,20 @@ function createDicomJSONApi(dicomJsonConfig) {
|
|
|
3033
3100
|
query
|
|
3034
3101
|
}) => {
|
|
3035
3102
|
const url = query.get('url');
|
|
3036
|
-
|
|
3037
|
-
|
|
3103
|
+
if (!url) {
|
|
3104
|
+
return;
|
|
3105
|
+
}
|
|
3106
|
+
try {
|
|
3107
|
+
const evaluatedUrl = resolveConfigFetchPolicy(url, {
|
|
3108
|
+
allowedOrigins: dicomJsonConfig.dangerouslyAllowedOriginsForAuthenticatedEnvironments,
|
|
3109
|
+
userAuthenticationService
|
|
3110
|
+
});
|
|
3111
|
+
return _store.studyInstanceUIDMap.get(evaluatedUrl.normalizedUrl);
|
|
3112
|
+
} catch {
|
|
3113
|
+
return;
|
|
3114
|
+
}
|
|
3115
|
+
},
|
|
3116
|
+
getConfig: () => dicomJsonConfig
|
|
3038
3117
|
};
|
|
3039
3118
|
return src/* IWebApiDataSource */.pt.create(implementation);
|
|
3040
3119
|
}
|
|
@@ -3303,6 +3382,7 @@ function createDicomLocalApi(dicomLocalConfig) {
|
|
|
3303
3382
|
|
|
3304
3383
|
|
|
3305
3384
|
|
|
3385
|
+
|
|
3306
3386
|
/**
|
|
3307
3387
|
* This datasource is initialized with a url that returns a JSON object with a
|
|
3308
3388
|
* dicomWeb datasource configuration array present in a "servers" object.
|
|
@@ -3315,6 +3395,9 @@ function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager) {
|
|
|
3315
3395
|
const {
|
|
3316
3396
|
name
|
|
3317
3397
|
} = dicomWebProxyConfig;
|
|
3398
|
+
const {
|
|
3399
|
+
userAuthenticationService
|
|
3400
|
+
} = servicesManager.services;
|
|
3318
3401
|
let dicomWebDelegate = undefined;
|
|
3319
3402
|
const implementation = {
|
|
3320
3403
|
initialize: async ({
|
|
@@ -3325,8 +3408,11 @@ function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager) {
|
|
|
3325
3408
|
if (!url) {
|
|
3326
3409
|
throw new Error(`No url for '${name}'`);
|
|
3327
3410
|
} else {
|
|
3328
|
-
const
|
|
3329
|
-
|
|
3411
|
+
const evaluatedUrl = resolveConfigFetchPolicy(url, {
|
|
3412
|
+
allowedOrigins: dicomWebProxyConfig.dangerouslyAllowedOriginsForAuthenticatedEnvironments,
|
|
3413
|
+
userAuthenticationService
|
|
3414
|
+
});
|
|
3415
|
+
const data = await fetchConfigJson(evaluatedUrl);
|
|
3330
3416
|
if (!data.servers?.dicomWeb?.[0]) {
|
|
3331
3417
|
throw new Error('Invalid configuration returned by url');
|
|
3332
3418
|
}
|
|
@@ -3357,9 +3443,15 @@ function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager) {
|
|
|
3357
3443
|
store: {
|
|
3358
3444
|
dicom: (...args) => dicomWebDelegate.store.dicom(...args)
|
|
3359
3445
|
},
|
|
3360
|
-
|
|
3361
|
-
|
|
3362
|
-
|
|
3446
|
+
reject: {
|
|
3447
|
+
series: (...args) => dicomWebDelegate?.reject?.series?.(...args)
|
|
3448
|
+
},
|
|
3449
|
+
deleteStudyMetadataPromise: (...args) => dicomWebDelegate?.deleteStudyMetadataPromise?.(...args),
|
|
3450
|
+
getImageIdsForDisplaySet: (...args) => dicomWebDelegate?.getImageIdsForDisplaySet?.(...args),
|
|
3451
|
+
getImageIdsForInstance: (...args) => dicomWebDelegate?.getImageIdsForInstance?.(...args),
|
|
3452
|
+
getConfig: (...args) => dicomWebDelegate?.getConfig?.(...args) ?? {
|
|
3453
|
+
dicomUploadEnabled: false
|
|
3454
|
+
},
|
|
3363
3455
|
getStudyInstanceUIDs({
|
|
3364
3456
|
params,
|
|
3365
3457
|
query
|
|
@@ -3697,8 +3789,8 @@ var react = __webpack_require__(86326);
|
|
|
3697
3789
|
// EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
|
|
3698
3790
|
var prop_types = __webpack_require__(97598);
|
|
3699
3791
|
var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
|
|
3700
|
-
// EXTERNAL MODULE: ../../ui-next/src/index.ts +
|
|
3701
|
-
var ui_next_src = __webpack_require__(
|
|
3792
|
+
// EXTERNAL MODULE: ../../ui-next/src/index.ts + 3084 modules
|
|
3793
|
+
var ui_next_src = __webpack_require__(15953);
|
|
3702
3794
|
// EXTERNAL MODULE: ./state/index.js + 1 modules
|
|
3703
3795
|
var state = __webpack_require__(45981);
|
|
3704
3796
|
// EXTERNAL MODULE: ../../../node_modules/react-router-dom/dist/index.js
|
|
@@ -3811,7 +3903,7 @@ function HeaderPatientInfo({
|
|
|
3811
3903
|
const formattedPatientName = formatWithEllipsis(patientInfo.PatientName, 27);
|
|
3812
3904
|
const formattedPatientID = formatWithEllipsis(patientInfo.PatientID, 15);
|
|
3813
3905
|
return /*#__PURE__*/react.createElement("div", {
|
|
3814
|
-
className: "hover:bg-
|
|
3906
|
+
className: "hover:bg-muted flex cursor-pointer items-center justify-center gap-1 rounded-lg",
|
|
3815
3907
|
onClick: handleOnClick
|
|
3816
3908
|
}, isMixedPatients ? /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.MultiplePatients, {
|
|
3817
3909
|
className: "text-primary"
|
|
@@ -3820,9 +3912,9 @@ function HeaderPatientInfo({
|
|
|
3820
3912
|
}), /*#__PURE__*/react.createElement("div", {
|
|
3821
3913
|
className: "flex flex-col justify-center"
|
|
3822
3914
|
}, expanded ? /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
|
|
3823
|
-
className: "self-start text-[13px] font-bold
|
|
3915
|
+
className: "text-foreground self-start text-[13px] font-bold"
|
|
3824
3916
|
}, formattedPatientName), /*#__PURE__*/react.createElement("div", {
|
|
3825
|
-
className: "text-
|
|
3917
|
+
className: "text-muted-foreground flex gap-2 text-[11px]"
|
|
3826
3918
|
}, /*#__PURE__*/react.createElement("div", null, formattedPatientID), /*#__PURE__*/react.createElement("div", null, patientInfo.PatientSex), /*#__PURE__*/react.createElement("div", null, patientInfo.PatientDOB))) : /*#__PURE__*/react.createElement("div", {
|
|
3827
3919
|
className: "text-primary self-center text-[13px]"
|
|
3828
3920
|
}, isMixedPatients ? 'Multiple Patients' : 'Patient')), /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.ArrowLeft, {
|
|
@@ -3925,7 +4017,7 @@ function ViewerHeader({
|
|
|
3925
4017
|
className: "text-primary flex cursor-pointer items-center"
|
|
3926
4018
|
}, /*#__PURE__*/react.createElement(ui_next_src/* Button */.$nd, {
|
|
3927
4019
|
variant: "ghost",
|
|
3928
|
-
className: "hover:bg-
|
|
4020
|
+
className: "hover:bg-muted",
|
|
3929
4021
|
onClick: () => {
|
|
3930
4022
|
commandsManager.run('undo');
|
|
3931
4023
|
}
|
|
@@ -3933,7 +4025,7 @@ function ViewerHeader({
|
|
|
3933
4025
|
className: ""
|
|
3934
4026
|
})), /*#__PURE__*/react.createElement(ui_next_src/* Button */.$nd, {
|
|
3935
4027
|
variant: "ghost",
|
|
3936
|
-
className: "hover:bg-
|
|
4028
|
+
className: "hover:bg-muted",
|
|
3937
4029
|
onClick: () => {
|
|
3938
4030
|
commandsManager.run('redo');
|
|
3939
4031
|
}
|
|
@@ -4355,7 +4447,7 @@ function ViewerLayout_extends() { return ViewerLayout_extends = Object.assign ?
|
|
|
4355
4447
|
|
|
4356
4448
|
|
|
4357
4449
|
|
|
4358
|
-
const resizableHandleClassName = 'mt-[1px] bg-
|
|
4450
|
+
const resizableHandleClassName = 'mt-[1px] bg-background';
|
|
4359
4451
|
function ViewerLayout({
|
|
4360
4452
|
// From Extension Module Params
|
|
4361
4453
|
extensionManager,
|
|
@@ -4398,10 +4490,10 @@ function ViewerLayout({
|
|
|
4398
4490
|
* is sized to our viewport.
|
|
4399
4491
|
*/
|
|
4400
4492
|
(0,react.useEffect)(() => {
|
|
4401
|
-
document.body.classList.add('bg-
|
|
4493
|
+
document.body.classList.add('bg-background');
|
|
4402
4494
|
document.body.classList.add('overflow-hidden');
|
|
4403
4495
|
return () => {
|
|
4404
|
-
document.body.classList.remove('bg-
|
|
4496
|
+
document.body.classList.remove('bg-background');
|
|
4405
4497
|
document.body.classList.remove('overflow-hidden');
|
|
4406
4498
|
};
|
|
4407
4499
|
}, []);
|
|
@@ -4464,12 +4556,12 @@ function ViewerLayout({
|
|
|
4464
4556
|
servicesManager: servicesManager,
|
|
4465
4557
|
appConfig: appConfig
|
|
4466
4558
|
}), /*#__PURE__*/react.createElement("div", {
|
|
4467
|
-
className: "relative flex w-full flex-row flex-nowrap items-stretch overflow-hidden bg-
|
|
4559
|
+
className: "relative flex w-full flex-row flex-nowrap items-stretch overflow-hidden bg-background",
|
|
4468
4560
|
style: {
|
|
4469
4561
|
height: 'calc(100vh - 52px'
|
|
4470
4562
|
}
|
|
4471
4563
|
}, /*#__PURE__*/react.createElement(react.Fragment, null, showLoadingIndicator && /*#__PURE__*/react.createElement(LoadingIndicatorProgress, {
|
|
4472
|
-
className: "h-full w-full bg-
|
|
4564
|
+
className: "h-full w-full bg-background"
|
|
4473
4565
|
}), /*#__PURE__*/react.createElement(ui_next_src/* ResizablePanelGroup */.HKS, resizablePanelGroupProps, hasLeftPanels ? /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(ui_next_src/* ResizablePanel */.wVo, resizableLeftPanelProps, /*#__PURE__*/react.createElement(Components_SidePanelWithServices, ViewerLayout_extends({
|
|
4474
4566
|
side: "left",
|
|
4475
4567
|
isExpanded: !leftPanelClosedState,
|
|
@@ -4481,7 +4573,7 @@ function ViewerLayout({
|
|
|
4481
4573
|
})) : null, /*#__PURE__*/react.createElement(ui_next_src/* ResizablePanel */.wVo, resizableViewportGridPanelProps, /*#__PURE__*/react.createElement("div", {
|
|
4482
4574
|
className: "flex h-full flex-1 flex-col"
|
|
4483
4575
|
}, /*#__PURE__*/react.createElement("div", {
|
|
4484
|
-
className: "relative flex h-full flex-1 items-center justify-center overflow-hidden bg-
|
|
4576
|
+
className: "relative flex h-full flex-1 items-center justify-center overflow-hidden bg-background",
|
|
4485
4577
|
onMouseEnter: handleMouseEnter
|
|
4486
4578
|
}, /*#__PURE__*/react.createElement(ViewportGridComp, {
|
|
4487
4579
|
servicesManager: servicesManager,
|
|
@@ -4688,7 +4780,8 @@ function CreateReportDialogPrompt({
|
|
|
4688
4780
|
minSeriesNumber = 0,
|
|
4689
4781
|
predecessorImageId,
|
|
4690
4782
|
extensionManager,
|
|
4691
|
-
servicesManager
|
|
4783
|
+
servicesManager,
|
|
4784
|
+
enableDownload = false
|
|
4692
4785
|
}) {
|
|
4693
4786
|
const {
|
|
4694
4787
|
uiDialogService,
|
|
@@ -4708,6 +4801,7 @@ function CreateReportDialogPrompt({
|
|
|
4708
4801
|
predecessorImageId,
|
|
4709
4802
|
minSeriesNumber,
|
|
4710
4803
|
modality,
|
|
4804
|
+
enableDownload,
|
|
4711
4805
|
onSave: async ({
|
|
4712
4806
|
reportName,
|
|
4713
4807
|
dataSource: selectedDataSource,
|
|
@@ -5180,7 +5274,6 @@ var dist_esm = __webpack_require__(15327);
|
|
|
5180
5274
|
const {
|
|
5181
5275
|
isImage,
|
|
5182
5276
|
sortStudyInstances,
|
|
5183
|
-
instancesSortCriteria,
|
|
5184
5277
|
sopClassDictionary,
|
|
5185
5278
|
isDisplaySetReconstructable: getSopClassHandlerModule_isDisplaySetReconstructable
|
|
5186
5279
|
} = src/* utils */.Wp;
|
|
@@ -5225,12 +5318,17 @@ function getDisplaySetInfo(instances) {
|
|
|
5225
5318
|
const instancesMap = new Map();
|
|
5226
5319
|
let firstTimePointInstances;
|
|
5227
5320
|
if (instances[0].NumberOfFrames > 1 && timePoints.length > 1) {
|
|
5228
|
-
//
|
|
5229
|
-
|
|
5321
|
+
// Handle multiframe dynamic volumes. Local file frame imageIds do not
|
|
5322
|
+
// always resolve to a frame-level instance object, so keep resolved
|
|
5323
|
+
// entries and fall back to the source multiframe instance when needed.
|
|
5324
|
+
firstTimePointInstances = timePoints[0].map(imageId => dist_esm.metaData.get('instance', imageId)).filter(Boolean);
|
|
5325
|
+
if (!firstTimePointInstances.length) {
|
|
5326
|
+
firstTimePointInstances = [instances[0]];
|
|
5327
|
+
}
|
|
5230
5328
|
} else {
|
|
5231
5329
|
// O(n) to convert it into a map and O(1) to find each instance
|
|
5232
5330
|
instances.forEach(instance => instancesMap.set(instance.imageId, instance));
|
|
5233
|
-
firstTimePointInstances = timePoint.map(imageId => instancesMap.get(imageId));
|
|
5331
|
+
firstTimePointInstances = timePoint.map(imageId => instancesMap.get(imageId)).filter(Boolean);
|
|
5234
5332
|
}
|
|
5235
5333
|
displaySetInfo = getSopClassHandlerModule_isDisplaySetReconstructable(firstTimePointInstances, appConfig);
|
|
5236
5334
|
} else {
|
|
@@ -5393,7 +5491,7 @@ function getDisplaySetsFromSeries(instances) {
|
|
|
5393
5491
|
}
|
|
5394
5492
|
return displaySets;
|
|
5395
5493
|
}
|
|
5396
|
-
const getSopClassHandlerModule_sopClassUids = [sopClassDictionary.ComputedRadiographyImageStorage, sopClassDictionary.DigitalXRayImageStorageForPresentation, sopClassDictionary.DigitalXRayImageStorageForProcessing, sopClassDictionary.DigitalMammographyXRayImageStorageForPresentation, sopClassDictionary.DigitalMammographyXRayImageStorageForProcessing, sopClassDictionary.DigitalIntraOralXRayImageStorageForPresentation, sopClassDictionary.DigitalIntraOralXRayImageStorageForProcessing, sopClassDictionary.CTImageStorage, sopClassDictionary.EnhancedCTImageStorage, sopClassDictionary.LegacyConvertedEnhancedCTImageStorage, sopClassDictionary.UltrasoundMultiframeImageStorage, sopClassDictionary.MRImageStorage, sopClassDictionary.EnhancedMRImageStorage, sopClassDictionary.EnhancedMRColorImageStorage, sopClassDictionary.LegacyConvertedEnhancedMRImageStorage, sopClassDictionary.UltrasoundImageStorage, sopClassDictionary.UltrasoundImageStorageRET, sopClassDictionary.SecondaryCaptureImageStorage, sopClassDictionary.MultiframeSingleBitSecondaryCaptureImageStorage, sopClassDictionary.MultiframeGrayscaleByteSecondaryCaptureImageStorage, sopClassDictionary.MultiframeGrayscaleWordSecondaryCaptureImageStorage, sopClassDictionary.MultiframeTrueColorSecondaryCaptureImageStorage, sopClassDictionary.XRayAngiographicImageStorage, sopClassDictionary.EnhancedXAImageStorage, sopClassDictionary.XRayRadiofluoroscopicImageStorage, sopClassDictionary.EnhancedXRFImageStorage, sopClassDictionary.XRay3DAngiographicImageStorage, sopClassDictionary.XRay3DCraniofacialImageStorage, sopClassDictionary.BreastTomosynthesisImageStorage, sopClassDictionary.BreastProjectionXRayImageStorageForPresentation, sopClassDictionary.BreastProjectionXRayImageStorageForProcessing, sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForPresentation, sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForProcessing, sopClassDictionary.NuclearMedicineImageStorage, sopClassDictionary.VLEndoscopicImageStorage, sopClassDictionary.VideoEndoscopicImageStorage, sopClassDictionary.VLMicroscopicImageStorage, sopClassDictionary.VideoMicroscopicImageStorage, sopClassDictionary.VLSlideCoordinatesMicroscopicImageStorage, sopClassDictionary.VLPhotographicImageStorage, sopClassDictionary.VideoPhotographicImageStorage, sopClassDictionary.OphthalmicPhotography8BitImageStorage, sopClassDictionary.OphthalmicPhotography16BitImageStorage, sopClassDictionary.OphthalmicTomographyImageStorage,
|
|
5494
|
+
const getSopClassHandlerModule_sopClassUids = [sopClassDictionary.ComputedRadiographyImageStorage, sopClassDictionary.DigitalXRayImageStorageForPresentation, sopClassDictionary.DigitalXRayImageStorageForProcessing, sopClassDictionary.DigitalMammographyXRayImageStorageForPresentation, sopClassDictionary.DigitalMammographyXRayImageStorageForProcessing, sopClassDictionary.DigitalIntraOralXRayImageStorageForPresentation, sopClassDictionary.DigitalIntraOralXRayImageStorageForProcessing, sopClassDictionary.CTImageStorage, sopClassDictionary.EnhancedCTImageStorage, sopClassDictionary.LegacyConvertedEnhancedCTImageStorage, sopClassDictionary.UltrasoundMultiframeImageStorage, sopClassDictionary.MRImageStorage, sopClassDictionary.EnhancedMRImageStorage, sopClassDictionary.EnhancedMRColorImageStorage, sopClassDictionary.LegacyConvertedEnhancedMRImageStorage, sopClassDictionary.UltrasoundImageStorage, sopClassDictionary.UltrasoundImageStorageRET, sopClassDictionary.SecondaryCaptureImageStorage, sopClassDictionary.MultiframeSingleBitSecondaryCaptureImageStorage, sopClassDictionary.MultiframeGrayscaleByteSecondaryCaptureImageStorage, sopClassDictionary.MultiframeGrayscaleWordSecondaryCaptureImageStorage, sopClassDictionary.MultiframeTrueColorSecondaryCaptureImageStorage, sopClassDictionary.XRayAngiographicImageStorage, sopClassDictionary.EnhancedXAImageStorage, sopClassDictionary.XRayRadiofluoroscopicImageStorage, sopClassDictionary.EnhancedXRFImageStorage, sopClassDictionary.XRay3DAngiographicImageStorage, sopClassDictionary.XRay3DCraniofacialImageStorage, sopClassDictionary.BreastTomosynthesisImageStorage, sopClassDictionary.CornealTopographyMapStorage, sopClassDictionary.BreastProjectionXRayImageStorageForPresentation, sopClassDictionary.BreastProjectionXRayImageStorageForProcessing, sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForPresentation, sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForProcessing, sopClassDictionary.NuclearMedicineImageStorage, sopClassDictionary.VLEndoscopicImageStorage, sopClassDictionary.VideoEndoscopicImageStorage, sopClassDictionary.VLMicroscopicImageStorage, sopClassDictionary.VideoMicroscopicImageStorage, sopClassDictionary.VLSlideCoordinatesMicroscopicImageStorage, sopClassDictionary.VLPhotographicImageStorage, sopClassDictionary.VideoPhotographicImageStorage, sopClassDictionary.OphthalmicPhotography8BitImageStorage, sopClassDictionary.OphthalmicPhotography16BitImageStorage, sopClassDictionary.OphthalmicTomographyImageStorage,
|
|
5397
5495
|
// Handled by another sop class module
|
|
5398
5496
|
// sopClassDictionary.VLWholeSlideMicroscopyImageStorage,
|
|
5399
5497
|
sopClassDictionary.PositronEmissionTomographyImageStorage, sopClassDictionary.EnhancedPETImageStorage, sopClassDictionary.LegacyConvertedEnhancedPETImageStorage, sopClassDictionary.RTImageStorage, sopClassDictionary.EnhancedUSVolumeStorage, sopClassDictionary.RTDoseStorage];
|
|
@@ -5555,7 +5653,7 @@ function ToolbarLayoutSelectorWithServices({
|
|
|
5555
5653
|
disabled: preset.disabled,
|
|
5556
5654
|
isPreset: true
|
|
5557
5655
|
})))), /*#__PURE__*/react.createElement("div", {
|
|
5558
|
-
className: "bg-muted flex flex-col gap-2.5 border-l-2 border-solid border-
|
|
5656
|
+
className: "bg-muted flex flex-col gap-2.5 border-l-2 border-solid border-background p-2"
|
|
5559
5657
|
}, /*#__PURE__*/react.createElement("div", {
|
|
5560
5658
|
className: "text-muted-foreground text-xs"
|
|
5561
5659
|
}, t('Custom')), /*#__PURE__*/react.createElement(ui_next_src/* LayoutSelector */.sG4.GridSelector, {
|
|
@@ -5843,6 +5941,7 @@ function ToolButtonWrapper(props) {
|
|
|
5843
5941
|
}
|
|
5844
5942
|
|
|
5845
5943
|
;// ../../../extensions/default/src/Toolbar/ToolbarDivider.tsx
|
|
5944
|
+
/* unused harmony import specifier */ var React;
|
|
5846
5945
|
|
|
5847
5946
|
function ToolbarDivider() {
|
|
5848
5947
|
return /*#__PURE__*/React.createElement("span", {
|
|
@@ -6315,7 +6414,7 @@ const RowComponent = ({
|
|
|
6315
6414
|
...style,
|
|
6316
6415
|
...rowStyle
|
|
6317
6416
|
},
|
|
6318
|
-
className: classnames_default()('hover:bg-
|
|
6417
|
+
className: classnames_default()('hover:bg-primary/25 border-input text-foreground flex w-full flex-row items-center break-all bg-background text-base', lineHeightClassName),
|
|
6319
6418
|
key: keyPrefix
|
|
6320
6419
|
}, isChildOrParent && /*#__PURE__*/react.createElement("div", {
|
|
6321
6420
|
style: {
|
|
@@ -6345,34 +6444,34 @@ function ColumnHeaders({
|
|
|
6345
6444
|
valueRef
|
|
6346
6445
|
}) {
|
|
6347
6446
|
return /*#__PURE__*/react.createElement("div", {
|
|
6348
|
-
className: classnames_default()('bg-
|
|
6447
|
+
className: classnames_default()('bg-popover ohif-scrollbar flex w-full flex-row overflow-y-scroll'),
|
|
6349
6448
|
style: rowVerticalPaddingStyle
|
|
6350
6449
|
}, /*#__PURE__*/react.createElement("div", {
|
|
6351
6450
|
className: "w-4/24 px-3"
|
|
6352
6451
|
}, /*#__PURE__*/react.createElement("label", {
|
|
6353
6452
|
ref: tagRef,
|
|
6354
|
-
className: "flex flex-1 select-none flex-col pl-1 text-lg
|
|
6453
|
+
className: "text-foreground flex flex-1 select-none flex-col pl-1 text-lg"
|
|
6355
6454
|
}, /*#__PURE__*/react.createElement("span", {
|
|
6356
6455
|
className: "flex flex-row items-center focus:outline-none"
|
|
6357
6456
|
}, "Tag"))), /*#__PURE__*/react.createElement("div", {
|
|
6358
6457
|
className: "w-2/24 px-3"
|
|
6359
6458
|
}, /*#__PURE__*/react.createElement("label", {
|
|
6360
6459
|
ref: vrRef,
|
|
6361
|
-
className: "flex flex-1 select-none flex-col pl-1 text-lg
|
|
6460
|
+
className: "text-foreground flex flex-1 select-none flex-col pl-1 text-lg"
|
|
6362
6461
|
}, /*#__PURE__*/react.createElement("span", {
|
|
6363
6462
|
className: "flex flex-row items-center focus:outline-none"
|
|
6364
6463
|
}, "VR"))), /*#__PURE__*/react.createElement("div", {
|
|
6365
6464
|
className: "w-6/24 px-3"
|
|
6366
6465
|
}, /*#__PURE__*/react.createElement("label", {
|
|
6367
6466
|
ref: keywordRef,
|
|
6368
|
-
className: "flex flex-1 select-none flex-col pl-1 text-lg
|
|
6467
|
+
className: "text-foreground flex flex-1 select-none flex-col pl-1 text-lg"
|
|
6369
6468
|
}, /*#__PURE__*/react.createElement("span", {
|
|
6370
6469
|
className: "flex flex-row items-center focus:outline-none"
|
|
6371
6470
|
}, "Keyword"))), /*#__PURE__*/react.createElement("div", {
|
|
6372
6471
|
className: "w-5/24 grow px-3"
|
|
6373
6472
|
}, /*#__PURE__*/react.createElement("label", {
|
|
6374
6473
|
ref: valueRef,
|
|
6375
|
-
className: "flex flex-1 select-none flex-col pl-1 text-lg
|
|
6474
|
+
className: "text-foreground flex flex-1 select-none flex-col pl-1 text-lg"
|
|
6376
6475
|
}, /*#__PURE__*/react.createElement("span", {
|
|
6377
6476
|
className: "flex flex-row items-center focus:outline-none"
|
|
6378
6477
|
}, "Value"))));
|
|
@@ -6520,7 +6619,7 @@ function DicomTagTable({
|
|
|
6520
6619
|
keywordRef: keywordRef,
|
|
6521
6620
|
valueRef: valueRef
|
|
6522
6621
|
}), /*#__PURE__*/react.createElement("div", {
|
|
6523
|
-
className: "relative m-auto border-2 border-
|
|
6622
|
+
className: "relative m-auto border-2 border-background bg-background",
|
|
6524
6623
|
style: {
|
|
6525
6624
|
height: '32rem'
|
|
6526
6625
|
}
|
|
@@ -6635,7 +6734,7 @@ const DicomTagBrowser = ({
|
|
|
6635
6734
|
}, /*#__PURE__*/react.createElement("div", {
|
|
6636
6735
|
className: "mb-6 flex flex-row items-start pl-1"
|
|
6637
6736
|
}, /*#__PURE__*/react.createElement("div", {
|
|
6638
|
-
className: "flex w-full flex-row items-start gap-
|
|
6737
|
+
className: "flex w-full flex-row items-start gap-6"
|
|
6639
6738
|
}, /*#__PURE__*/react.createElement("div", {
|
|
6640
6739
|
className: "flex w-1/3 flex-col"
|
|
6641
6740
|
}, /*#__PURE__*/react.createElement("span", {
|
|
@@ -6645,7 +6744,11 @@ const DicomTagBrowser = ({
|
|
|
6645
6744
|
onValueChange: value => onSelectChange({
|
|
6646
6745
|
value
|
|
6647
6746
|
})
|
|
6648
|
-
}, /*#__PURE__*/react.createElement(ui_next_src/* SelectTrigger */.bqE,
|
|
6747
|
+
}, /*#__PURE__*/react.createElement(ui_next_src/* SelectTrigger */.bqE, {
|
|
6748
|
+
"data-cy": "dicom-tag-series-select-trigger"
|
|
6749
|
+
}, /*#__PURE__*/react.createElement(ui_next_src/* SelectValue */.yvm, {
|
|
6750
|
+
"data-cy": "dicom-tag-series-select-value"
|
|
6751
|
+
}, displaySetList.find(ds => ds.value === selectedDisplaySetInstanceUID)?.label || 'Select Series')), /*#__PURE__*/react.createElement(ui_next_src/* SelectContent */.gCo, null, displaySetList.map(item => {
|
|
6649
6752
|
return /*#__PURE__*/react.createElement(ui_next_src/* SelectItem */.ebT, {
|
|
6650
6753
|
key: item.value,
|
|
6651
6754
|
value: item.value
|
|
@@ -6664,7 +6767,7 @@ const DicomTagBrowser = ({
|
|
|
6664
6767
|
min: 1,
|
|
6665
6768
|
max: activeDisplaySet?.images?.length,
|
|
6666
6769
|
step: 1,
|
|
6667
|
-
className: "pt-
|
|
6770
|
+
className: "pt-3"
|
|
6668
6771
|
})), /*#__PURE__*/react.createElement("div", {
|
|
6669
6772
|
className: "ml-auto mr-1 flex w-1/3 flex-col"
|
|
6670
6773
|
}, /*#__PURE__*/react.createElement("span", {
|
|
@@ -7537,8 +7640,6 @@ const useToggleOneUpViewportGridStore = (0,zustand_esm/* create */.vt)(set => ({
|
|
|
7537
7640
|
})
|
|
7538
7641
|
}));
|
|
7539
7642
|
;// ../../../extensions/default/src/Actions/createReportAsync.tsx
|
|
7540
|
-
|
|
7541
|
-
|
|
7542
7643
|
/**
|
|
7543
7644
|
*
|
|
7544
7645
|
* @param {*} servicesManager
|
|
@@ -7546,7 +7647,8 @@ const useToggleOneUpViewportGridStore = (0,zustand_esm/* create */.vt)(set => ({
|
|
|
7546
7647
|
async function createReportAsync({
|
|
7547
7648
|
servicesManager,
|
|
7548
7649
|
getReport,
|
|
7549
|
-
reportType = '
|
|
7650
|
+
reportType = 'Measurements',
|
|
7651
|
+
successMessage
|
|
7550
7652
|
}) {
|
|
7551
7653
|
const {
|
|
7552
7654
|
displaySetService,
|
|
@@ -7559,15 +7661,13 @@ async function createReportAsync({
|
|
|
7559
7661
|
return;
|
|
7560
7662
|
}
|
|
7561
7663
|
|
|
7562
|
-
//
|
|
7563
|
-
//
|
|
7564
|
-
// automatically calls makeDisplaySets
|
|
7565
|
-
src/* DicomMetadataStore */.H8.addInstances([naturalizedReport], true);
|
|
7664
|
+
// addInstances is called by the store command (storeMeasurements/storeSegmentation),
|
|
7665
|
+
// so the display set should already exist at this point.
|
|
7566
7666
|
const displaySet = displaySetService.getMostRecentDisplaySet();
|
|
7567
7667
|
const displaySetInstanceUID = displaySet.displaySetInstanceUID;
|
|
7568
7668
|
uiNotificationService.show({
|
|
7569
7669
|
title: 'Create Report',
|
|
7570
|
-
message: `${reportType} saved successfully`,
|
|
7670
|
+
message: successMessage ?? `${reportType} saved successfully`,
|
|
7571
7671
|
type: 'success'
|
|
7572
7672
|
});
|
|
7573
7673
|
return [displaySetInstanceUID];
|
|
@@ -7623,34 +7723,32 @@ async function promptSaveReport({
|
|
|
7623
7723
|
predecessorImageId,
|
|
7624
7724
|
minSeriesNumber: 3000,
|
|
7625
7725
|
extensionManager,
|
|
7626
|
-
servicesManager
|
|
7726
|
+
servicesManager,
|
|
7727
|
+
enableDownload: true
|
|
7627
7728
|
});
|
|
7628
7729
|
if (promptResult.action === PROMPT_RESPONSES/* default */.A.CREATE_REPORT) {
|
|
7629
|
-
const dataSources = extensionManager.getDataSources(promptResult.dataSourceName);
|
|
7630
|
-
const dataSource = dataSources[0];
|
|
7631
7730
|
const {
|
|
7632
7731
|
series,
|
|
7633
7732
|
priorSeriesNumber,
|
|
7634
|
-
value: reportName
|
|
7733
|
+
value: reportName,
|
|
7734
|
+
dataSourceName
|
|
7635
7735
|
} = promptResult;
|
|
7636
7736
|
const SeriesDescription = reportName || defaultSaveTitle;
|
|
7637
|
-
const getReport = async () => {
|
|
7638
|
-
|
|
7639
|
-
|
|
7640
|
-
|
|
7641
|
-
|
|
7642
|
-
|
|
7643
|
-
|
|
7644
|
-
|
|
7645
|
-
|
|
7646
|
-
|
|
7647
|
-
}, 'CORNERSTONE_STRUCTURED_REPORT');
|
|
7648
|
-
};
|
|
7737
|
+
const getReport = async () => commandsManager.runCommand('storeMeasurements', {
|
|
7738
|
+
measurementData,
|
|
7739
|
+
dataSource: dataSourceName,
|
|
7740
|
+
additionalFindingTypes: ['ArrowAnnotate'],
|
|
7741
|
+
options: {
|
|
7742
|
+
SeriesDescription,
|
|
7743
|
+
SeriesNumber: 1 + priorSeriesNumber,
|
|
7744
|
+
predecessorImageId: series
|
|
7745
|
+
}
|
|
7746
|
+
}, 'CORNERSTONE_STRUCTURED_REPORT');
|
|
7649
7747
|
displaySetInstanceUIDs = await Actions_createReportAsync({
|
|
7650
7748
|
servicesManager,
|
|
7651
7749
|
getReport
|
|
7652
7750
|
});
|
|
7653
|
-
} else if (promptResult.action ===
|
|
7751
|
+
} else if (promptResult.action === PROMPT_RESPONSES/* default */.A.CANCEL) {
|
|
7654
7752
|
// Do nothing
|
|
7655
7753
|
}
|
|
7656
7754
|
return {
|
|
@@ -7682,6 +7780,10 @@ function findPredecessorImageId(annotations) {
|
|
|
7682
7780
|
;// ../../../extensions/default/src/commandsModule.ts
|
|
7683
7781
|
|
|
7684
7782
|
|
|
7783
|
+
const {
|
|
7784
|
+
downloadBlob
|
|
7785
|
+
} = src/* utils */.Wp;
|
|
7786
|
+
|
|
7685
7787
|
|
|
7686
7788
|
|
|
7687
7789
|
|
|
@@ -7811,6 +7913,19 @@ const commandsModule = ({
|
|
|
7811
7913
|
return;
|
|
7812
7914
|
}
|
|
7813
7915
|
|
|
7916
|
+
// Check if it's a segmentation and handle accordingly.
|
|
7917
|
+
// Note that for the sake of hydrated segmentations, we remove the
|
|
7918
|
+
// segmentation before checking if the display set is indeed in the viewport.
|
|
7919
|
+
// This is because hydrated segmentations are not in the viewport per se
|
|
7920
|
+
// {i.e. they are not layered) but are simply referenced by the display
|
|
7921
|
+
// set in the viewport.
|
|
7922
|
+
const isSegmentation = DERIVED_OVERLAY_MODALITIES.includes(displaySet.Modality);
|
|
7923
|
+
if (isSegmentation) {
|
|
7924
|
+
segmentationService.removeRepresentationsFromViewport(viewportId, {
|
|
7925
|
+
segmentationId: displaySetInstanceUID
|
|
7926
|
+
});
|
|
7927
|
+
}
|
|
7928
|
+
|
|
7814
7929
|
// Get current display sets for the viewport
|
|
7815
7930
|
const currentDisplaySetUIDs = viewportGridService.getDisplaySetsUIDsForViewport(viewportId);
|
|
7816
7931
|
|
|
@@ -7818,14 +7933,6 @@ const commandsModule = ({
|
|
|
7818
7933
|
if (!currentDisplaySetUIDs.includes(displaySetInstanceUID)) {
|
|
7819
7934
|
return;
|
|
7820
7935
|
}
|
|
7821
|
-
|
|
7822
|
-
// Check if it's a segmentation and handle accordingly
|
|
7823
|
-
const isSegmentation = DERIVED_OVERLAY_MODALITIES.includes(displaySet.Modality);
|
|
7824
|
-
if (isSegmentation) {
|
|
7825
|
-
segmentationService.removeSegmentationRepresentations(viewportId, {
|
|
7826
|
-
segmentationId: displaySetInstanceUID
|
|
7827
|
-
});
|
|
7828
|
-
}
|
|
7829
7936
|
const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(viewportId, displaySetInstanceUID);
|
|
7830
7937
|
|
|
7831
7938
|
// Configure each viewport for layer removal
|
|
@@ -8310,7 +8417,7 @@ const commandsModule = ({
|
|
|
8310
8417
|
const {
|
|
8311
8418
|
UIModalService
|
|
8312
8419
|
} = servicesManager.services;
|
|
8313
|
-
const defaultDisplaySetInstanceUID = displaySetInstanceUID || displaySetInstanceUIDs[0];
|
|
8420
|
+
const defaultDisplaySetInstanceUID = displaySetInstanceUID || displaySetInstanceUIDs[0] || displaySets[0]?.displaySetInstanceUID;
|
|
8314
8421
|
UIModalService.show({
|
|
8315
8422
|
content: DicomTagBrowser_DicomTagBrowser,
|
|
8316
8423
|
contentProps: {
|
|
@@ -8371,7 +8478,11 @@ const commandsModule = ({
|
|
|
8371
8478
|
const activeDisplaySetIndex = currentDisplaySets.findIndex(displaySet => displaySetInstanceUIDs.includes(displaySet.displaySetInstanceUID));
|
|
8372
8479
|
let displaySetIndexToShow;
|
|
8373
8480
|
for (displaySetIndexToShow = activeDisplaySetIndex + direction; displaySetIndexToShow > -1 && displaySetIndexToShow < currentDisplaySets.length; displaySetIndexToShow += direction) {
|
|
8374
|
-
|
|
8481
|
+
const nextDisplaySet = currentDisplaySets[displaySetIndexToShow];
|
|
8482
|
+
if (nextDisplaySet.madeInClient) {
|
|
8483
|
+
continue;
|
|
8484
|
+
}
|
|
8485
|
+
if (!excludeNonImageModalities || !nonImageModalities.includes(nextDisplaySet.Modality)) {
|
|
8375
8486
|
break;
|
|
8376
8487
|
}
|
|
8377
8488
|
}
|
|
@@ -8397,6 +8508,74 @@ const commandsModule = ({
|
|
|
8397
8508
|
viewportsToUpdate: updatedViewports
|
|
8398
8509
|
});
|
|
8399
8510
|
setTimeout(() => actions.scrollActiveThumbnailIntoView(), 0);
|
|
8511
|
+
},
|
|
8512
|
+
/**
|
|
8513
|
+
* Creates a store function based on the data source type.
|
|
8514
|
+
* @param dataSource - 'download', 'copyToClipboard', or a named data source
|
|
8515
|
+
* @param defaultFileName - Default filename for download/clipboard
|
|
8516
|
+
* @param defaultContentType - Default content type for clipboard
|
|
8517
|
+
* @returns A store function, or null if no valid store exists
|
|
8518
|
+
*/
|
|
8519
|
+
createStoreFunction: ({
|
|
8520
|
+
dataSource,
|
|
8521
|
+
defaultFileName,
|
|
8522
|
+
defaultContentType
|
|
8523
|
+
}) => {
|
|
8524
|
+
if (dataSource === 'download') {
|
|
8525
|
+
return async dicom => {
|
|
8526
|
+
const instances = Array.isArray(dicom) ? dicom : [dicom];
|
|
8527
|
+
src/* DicomMetadataStore */.H8.addInstances(instances, true);
|
|
8528
|
+
if (instances.length !== 1) {
|
|
8529
|
+
throw new Error('Download only supports a single DICOM instance');
|
|
8530
|
+
}
|
|
8531
|
+
const reportBlob = dcmjs_es/* default.data */.Ay.data.datasetToBlob(instances[0]);
|
|
8532
|
+
downloadBlob(reportBlob, {
|
|
8533
|
+
filename: defaultFileName || 'dicom.dcm'
|
|
8534
|
+
});
|
|
8535
|
+
};
|
|
8536
|
+
}
|
|
8537
|
+
if (dataSource === 'copyToClipboard') {
|
|
8538
|
+
return async dicom => {
|
|
8539
|
+
const instances = Array.isArray(dicom) ? dicom : [dicom];
|
|
8540
|
+
src/* DicomMetadataStore */.H8.addInstances(instances, true);
|
|
8541
|
+
if (instances.length !== 1) {
|
|
8542
|
+
throw new Error('Copy to clipboard only supports a single DICOM instance');
|
|
8543
|
+
}
|
|
8544
|
+
const reportBlob = dcmjs_es/* default.data */.Ay.data.datasetToBlob(instances[0]);
|
|
8545
|
+
const type = defaultContentType || 'application/dicom';
|
|
8546
|
+
await navigator.clipboard.write([new ClipboardItem({
|
|
8547
|
+
[type]: new Blob([reportBlob], {
|
|
8548
|
+
type
|
|
8549
|
+
})
|
|
8550
|
+
})]);
|
|
8551
|
+
};
|
|
8552
|
+
}
|
|
8553
|
+
|
|
8554
|
+
// DICOM STOW path — resolve the named data source
|
|
8555
|
+
const dataSources = extensionManager.getDataSources(dataSource);
|
|
8556
|
+
const resolvedDataSource = dataSources?.[0];
|
|
8557
|
+
if (!resolvedDataSource?.store?.dicom) {
|
|
8558
|
+
return null;
|
|
8559
|
+
}
|
|
8560
|
+
return async (dicom, {
|
|
8561
|
+
dicomDict
|
|
8562
|
+
} = {}) => {
|
|
8563
|
+
const instances = Array.isArray(dicom) ? dicom : [dicom];
|
|
8564
|
+
const config = resolvedDataSource.getConfig?.();
|
|
8565
|
+
if (config?.wadoRoot) {
|
|
8566
|
+
instances.forEach(instance => {
|
|
8567
|
+
instance.wadoRoot = config.wadoRoot;
|
|
8568
|
+
});
|
|
8569
|
+
}
|
|
8570
|
+
src/* DicomMetadataStore */.H8.addInstances(instances, true);
|
|
8571
|
+
for (const instance of instances) {
|
|
8572
|
+
await resolvedDataSource.store.dicom(instance, null, dicomDict);
|
|
8573
|
+
}
|
|
8574
|
+
const studyUIDs = new Set(instances.map(i => i.StudyInstanceUID).filter(Boolean));
|
|
8575
|
+
for (const uid of studyUIDs) {
|
|
8576
|
+
resolvedDataSource.deleteStudyMetadataPromise(uid);
|
|
8577
|
+
}
|
|
8578
|
+
};
|
|
8400
8579
|
}
|
|
8401
8580
|
};
|
|
8402
8581
|
const definitions = {
|
|
@@ -8428,7 +8607,8 @@ const commandsModule = ({
|
|
|
8428
8607
|
updateViewportDisplaySet: actions.updateViewportDisplaySet,
|
|
8429
8608
|
scrollActiveThumbnailIntoView: actions.scrollActiveThumbnailIntoView,
|
|
8430
8609
|
addDisplaySetAsLayer: actions.addDisplaySetAsLayer,
|
|
8431
|
-
removeDisplaySetLayer: actions.removeDisplaySetLayer
|
|
8610
|
+
removeDisplaySetLayer: actions.removeDisplaySetLayer,
|
|
8611
|
+
createStoreFunction: actions.createStoreFunction
|
|
8432
8612
|
};
|
|
8433
8613
|
return {
|
|
8434
8614
|
actions,
|
|
@@ -9605,7 +9785,7 @@ function DataSourceSelector() {
|
|
|
9605
9785
|
}, /*#__PURE__*/react.createElement("div", {
|
|
9606
9786
|
className: "flex h-screen w-screen items-center justify-center"
|
|
9607
9787
|
}, /*#__PURE__*/react.createElement("div", {
|
|
9608
|
-
className: "bg-
|
|
9788
|
+
className: "bg-popover mx-auto space-y-2 rounded-lg py-8 px-8 drop-shadow-md"
|
|
9609
9789
|
}, /*#__PURE__*/react.createElement("img", {
|
|
9610
9790
|
className: "mx-auto block h-14",
|
|
9611
9791
|
src: "./ohif-logo.svg",
|
|
@@ -9615,7 +9795,7 @@ function DataSourceSelector() {
|
|
|
9615
9795
|
}, dsConfigs.filter(it => it.sourceName !== 'dicomjson' && it.sourceName !== 'dicomlocal').map(ds => /*#__PURE__*/react.createElement("div", {
|
|
9616
9796
|
key: ds.sourceName
|
|
9617
9797
|
}, /*#__PURE__*/react.createElement("h1", {
|
|
9618
|
-
className: "text-
|
|
9798
|
+
className: "text-foreground"
|
|
9619
9799
|
}, ds.configuration?.friendlyName || ds.friendlyName), /*#__PURE__*/react.createElement(ui_src/* Button */.$n, {
|
|
9620
9800
|
type: ui_src/* ButtonEnums.type */.Ny.NW.primary,
|
|
9621
9801
|
className: classnames_default()('ml-2'),
|
|
@@ -9923,7 +10103,7 @@ function ItemListComponent({
|
|
|
9923
10103
|
}), /*#__PURE__*/react.createElement(ui_next_src/* InputFilter */.zbB.ClearButton, {
|
|
9924
10104
|
className: "text-primary mr-0.5 p-0.5"
|
|
9925
10105
|
}))), /*#__PURE__*/react.createElement("div", {
|
|
9926
|
-
className: "relative flex min-h-[1px] grow flex-col bg-
|
|
10106
|
+
className: "relative flex min-h-[1px] grow flex-col bg-background text-[14px]"
|
|
9927
10107
|
}, itemList == null ? /*#__PURE__*/react.createElement(LoadingIndicatorProgress, {
|
|
9928
10108
|
className: 'h-full w-full'
|
|
9929
10109
|
}) : itemList.length === 0 ? /*#__PURE__*/react.createElement("div", {
|
|
@@ -10015,16 +10195,16 @@ function DataSourceConfigurationModalComponent({
|
|
|
10015
10195
|
};
|
|
10016
10196
|
}, [selectedItems, configurationAPI, onHide, itemLabels, showFullConfig, currentSelectedItemIndex]);
|
|
10017
10197
|
const getSelectedItemCursorClasses = itemIndex => itemIndex !== itemLabels.length - 1 && itemIndex < selectedItems.length ? 'cursor-pointer' : 'cursor-auto';
|
|
10018
|
-
const getSelectedItemBackgroundClasses = itemIndex => itemIndex < selectedItems.length ? classnames_default()('bg-
|
|
10019
|
-
const getSelectedItemBorderClasses = itemIndex => itemIndex === currentSelectedItemIndex + 1 ? classnames_default()('border-2', 'border-solid', 'border-
|
|
10020
|
-
const getSelectedItemTextClasses = itemIndex => itemIndex <= selectedItems.length ? 'text-
|
|
10198
|
+
const getSelectedItemBackgroundClasses = itemIndex => itemIndex < selectedItems.length ? classnames_default()('bg-background/[.4]', itemIndex !== itemLabels.length - 1 ? 'hover:bg-transparent active:bg-popover' : '') : 'bg-transparent';
|
|
10199
|
+
const getSelectedItemBorderClasses = itemIndex => itemIndex === currentSelectedItemIndex + 1 ? classnames_default()('border-2', 'border-solid', 'border-highlight') : itemIndex < selectedItems.length ? 'border border-solid border-primary hover:border-highlight active:border-white' : 'border border-dashed border-input';
|
|
10200
|
+
const getSelectedItemTextClasses = itemIndex => itemIndex <= selectedItems.length ? 'text-highlight' : 'text-primary';
|
|
10021
10201
|
const getErrorComponent = () => {
|
|
10022
10202
|
return /*#__PURE__*/react.createElement("div", {
|
|
10023
10203
|
className: "flex min-h-[1px] grow flex-col gap-4"
|
|
10024
10204
|
}, /*#__PURE__*/react.createElement("div", {
|
|
10025
|
-
className: "text-
|
|
10205
|
+
className: "text-highlight text-[20px]"
|
|
10026
10206
|
}, t(`Error fetching ${itemLabels[selectedItems.length]} list`)), /*#__PURE__*/react.createElement("div", {
|
|
10027
|
-
className: "grow bg-
|
|
10207
|
+
className: "grow bg-background p-4 text-[14px]"
|
|
10028
10208
|
}, errorMessage));
|
|
10029
10209
|
};
|
|
10030
10210
|
const getSelectedItemsComponent = () => {
|
|
@@ -10047,14 +10227,14 @@ function DataSourceConfigurationModalComponent({
|
|
|
10047
10227
|
}), /*#__PURE__*/react.createElement("div", {
|
|
10048
10228
|
className: classnames_default()(NO_WRAP_ELLIPSIS_CLASS_NAMES)
|
|
10049
10229
|
}, t(itemLabel))), itemLabelIndex < selectedItems.length ? /*#__PURE__*/react.createElement("div", {
|
|
10050
|
-
className: classnames_default()('text-[14px]
|
|
10230
|
+
className: classnames_default()('text-foreground text-[14px]', NO_WRAP_ELLIPSIS_CLASS_NAMES)
|
|
10051
10231
|
}, selectedItems[itemLabelIndex].name) : /*#__PURE__*/react.createElement("br", null));
|
|
10052
10232
|
}));
|
|
10053
10233
|
};
|
|
10054
10234
|
return /*#__PURE__*/react.createElement("div", {
|
|
10055
10235
|
className: "flex h-[calc(100vh-300px)] select-none flex-col gap-4 pt-0.5"
|
|
10056
10236
|
}, getSelectedItemsComponent(), /*#__PURE__*/react.createElement("div", {
|
|
10057
|
-
className: "h-0.5 w-full shrink-0 bg-
|
|
10237
|
+
className: "h-0.5 w-full shrink-0 bg-background"
|
|
10058
10238
|
}), errorMessage ? getErrorComponent() : /*#__PURE__*/react.createElement(Components_ItemListComponent, {
|
|
10059
10239
|
itemLabel: itemLabels[currentSelectedItemIndex + 1],
|
|
10060
10240
|
itemList: itemList,
|
|
@@ -10137,7 +10317,7 @@ function DataSourceConfigurationComponent({
|
|
|
10137
10317
|
}
|
|
10138
10318
|
}, [configurationAPI, configuredItems, showConfigurationModal]);
|
|
10139
10319
|
return configuredItems ? /*#__PURE__*/react.createElement("div", {
|
|
10140
|
-
className: "text-
|
|
10320
|
+
className: "text-muted-foreground flex items-center overflow-hidden"
|
|
10141
10321
|
}, /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.Settings, {
|
|
10142
10322
|
className: "mr-2.5 h-3.5 w-3.5 shrink-0 cursor-pointer",
|
|
10143
10323
|
onClick: showConfigurationModal
|
|
@@ -10346,8 +10526,14 @@ function getDataSourceConfigurationCustomization({
|
|
|
10346
10526
|
const {
|
|
10347
10527
|
sortingCriteria
|
|
10348
10528
|
} = src/* utils */.Wp;
|
|
10529
|
+
const {
|
|
10530
|
+
seriesSortCriteria
|
|
10531
|
+
} = sortingCriteria;
|
|
10532
|
+
|
|
10533
|
+
/** Stable series order for e2e (Playwright sets TEST_ENV=true via cross-env). */
|
|
10534
|
+
const sortingCriteriaFn = false ? 0 : seriesSortCriteria.seriesInfoSortingCriteria;
|
|
10349
10535
|
/* harmony default export */ const sortingCriteriaCustomization = ({
|
|
10350
|
-
sortingCriteria:
|
|
10536
|
+
sortingCriteria: sortingCriteriaFn
|
|
10351
10537
|
});
|
|
10352
10538
|
;// ../../../extensions/default/src/customizations/onDropHandlerCustomization.ts
|
|
10353
10539
|
/* harmony default export */ const onDropHandlerCustomization = ({
|
|
@@ -10418,8 +10604,8 @@ function AboutModalDefault() {
|
|
|
10418
10604
|
name
|
|
10419
10605
|
} = (0,browser_detect_es5/* default */.A)();
|
|
10420
10606
|
const browser = `${name[0].toUpperCase()}${name.substr(1)} ${version}`;
|
|
10421
|
-
const versionNumber = "3.13.0-beta.
|
|
10422
|
-
const commitHash = "
|
|
10607
|
+
const versionNumber = "3.13.0-beta.60";
|
|
10608
|
+
const commitHash = "eede569a88ed6a3177bbdea8552dfb93ca13cac5";
|
|
10423
10609
|
const [main, beta] = versionNumber.split('-');
|
|
10424
10610
|
return /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU, {
|
|
10425
10611
|
className: "w-[400px]"
|
|
@@ -10592,6 +10778,7 @@ function UserPreferencesModalDefault({
|
|
|
10592
10778
|
|
|
10593
10779
|
|
|
10594
10780
|
|
|
10781
|
+
|
|
10595
10782
|
function ReportDialog({
|
|
10596
10783
|
dataSources,
|
|
10597
10784
|
modality = 'SR',
|
|
@@ -10599,11 +10786,16 @@ function ReportDialog({
|
|
|
10599
10786
|
minSeriesNumber = 3000,
|
|
10600
10787
|
hide,
|
|
10601
10788
|
onSave,
|
|
10602
|
-
onCancel
|
|
10789
|
+
onCancel,
|
|
10790
|
+
enableDownload = false
|
|
10603
10791
|
}) {
|
|
10792
|
+
const {
|
|
10793
|
+
t
|
|
10794
|
+
} = (0,es/* useTranslation */.Bd)('Buttons');
|
|
10604
10795
|
const {
|
|
10605
10796
|
servicesManager
|
|
10606
10797
|
} = (0,src/* useSystem */.Jg)();
|
|
10798
|
+
const actionTakenRef = (0,react.useRef)(false);
|
|
10607
10799
|
const [selectedDataSource, setSelectedDataSource] = (0,react.useState)(dataSources?.[0]?.value ?? null);
|
|
10608
10800
|
const {
|
|
10609
10801
|
displaySetService
|
|
@@ -10632,6 +10824,7 @@ function ReportDialog({
|
|
|
10632
10824
|
setReportName(newReportName);
|
|
10633
10825
|
}, [selectedSeries, seriesOptions]);
|
|
10634
10826
|
const handleSave = (0,react.useCallback)(() => {
|
|
10827
|
+
actionTakenRef.current = true;
|
|
10635
10828
|
onSave({
|
|
10636
10829
|
reportName,
|
|
10637
10830
|
dataSource: selectedDataSource,
|
|
@@ -10641,10 +10834,31 @@ function ReportDialog({
|
|
|
10641
10834
|
hide();
|
|
10642
10835
|
}, [selectedDataSource, selectedSeries, reportName, hide, onSave]);
|
|
10643
10836
|
const handleCancel = (0,react.useCallback)(() => {
|
|
10837
|
+
actionTakenRef.current = true;
|
|
10644
10838
|
onCancel();
|
|
10645
10839
|
hide();
|
|
10646
10840
|
}, [onCancel, hide]);
|
|
10841
|
+
const handleDownload = (0,react.useCallback)(() => {
|
|
10842
|
+
actionTakenRef.current = true;
|
|
10843
|
+
onSave({
|
|
10844
|
+
reportName,
|
|
10845
|
+
dataSource: 'download',
|
|
10846
|
+
priorSeriesNumber: Math.max(...seriesOptions.map(it => it.seriesNumber)),
|
|
10847
|
+
series: selectedSeries
|
|
10848
|
+
});
|
|
10849
|
+
hide();
|
|
10850
|
+
}, [selectedDataSource, selectedSeries, reportName, hide, onSave]);
|
|
10851
|
+
|
|
10852
|
+
// Handles the close dialog button/external close as a cancel
|
|
10853
|
+
(0,react.useEffect)(() => {
|
|
10854
|
+
return () => {
|
|
10855
|
+
if (!actionTakenRef.current) {
|
|
10856
|
+
onCancel();
|
|
10857
|
+
}
|
|
10858
|
+
};
|
|
10859
|
+
}, [onCancel]);
|
|
10647
10860
|
const showDataSourceSelect = dataSources?.length > 1;
|
|
10861
|
+
const showDownloadButton = enableDownload;
|
|
10648
10862
|
return /*#__PURE__*/react.createElement("div", {
|
|
10649
10863
|
className: "text-foreground flex min-w-[400px] max-w-md flex-col"
|
|
10650
10864
|
}, /*#__PURE__*/react.createElement("div", {
|
|
@@ -10701,9 +10915,9 @@ function ReportDialog({
|
|
|
10701
10915
|
disabled: !!selectedSeries
|
|
10702
10916
|
})))), /*#__PURE__*/react.createElement("div", {
|
|
10703
10917
|
className: "flex justify-end gap-2"
|
|
10704
|
-
}, /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0, null, /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0.Actions, null, /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0.ActionsSecondary, {
|
|
10705
|
-
onClick:
|
|
10706
|
-
},
|
|
10918
|
+
}, /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0, null, /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0.Actions, null, showDownloadButton && /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0.ActionsSecondary, {
|
|
10919
|
+
onClick: handleDownload
|
|
10920
|
+
}, t('Download')), /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0.ActionsPrimary, {
|
|
10707
10921
|
onClick: handleSave
|
|
10708
10922
|
}, "Save"))))));
|
|
10709
10923
|
}
|
|
@@ -11611,11 +11825,12 @@ function promptLabelAnnotation({
|
|
|
11611
11825
|
// EXTERNAL MODULE: ../../../extensions/default/src/Panels/StudyBrowser/PanelStudyBrowserHeader.tsx
|
|
11612
11826
|
var PanelStudyBrowserHeader = __webpack_require__(3329);
|
|
11613
11827
|
;// ../../../extensions/default/src/utils/addIcon.ts
|
|
11828
|
+
/* unused harmony import specifier */ var Icons;
|
|
11614
11829
|
|
|
11615
11830
|
|
|
11616
11831
|
/** Adds the icon to both ui and ui-next */
|
|
11617
11832
|
function addIcon(name, icon) {
|
|
11618
|
-
|
|
11833
|
+
Icons.addIcon(name, icon);
|
|
11619
11834
|
}
|
|
11620
11835
|
;// ../../../extensions/default/src/utils/Toolbox.tsx
|
|
11621
11836
|
function Toolbox_extends() { return Toolbox_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, Toolbox_extends.apply(null, arguments); }
|
|
@@ -11723,7 +11938,7 @@ function Toolbox({
|
|
|
11723
11938
|
})));
|
|
11724
11939
|
}));
|
|
11725
11940
|
}), activeToolOptions && /*#__PURE__*/react.createElement("div", {
|
|
11726
|
-
className: "bg-
|
|
11941
|
+
className: "bg-muted mt-1 h-auto px-2"
|
|
11727
11942
|
}, /*#__PURE__*/react.createElement(ui_next_src/* ToolSettings */.k_3, {
|
|
11728
11943
|
options: activeToolOptions
|
|
11729
11944
|
}))));
|
|
@@ -11807,10 +12022,10 @@ const defaultExtension = {
|
|
|
11807
12022
|
/* harmony default export */ const default_src = (defaultExtension);
|
|
11808
12023
|
|
|
11809
12024
|
|
|
11810
|
-
/***/ }
|
|
12025
|
+
/***/ },
|
|
11811
12026
|
|
|
11812
|
-
/***/ 96357
|
|
11813
|
-
|
|
12027
|
+
/***/ 96357
|
|
12028
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
11814
12029
|
|
|
11815
12030
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
11816
12031
|
/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
@@ -11825,6 +12040,6 @@ const RESPONSE = {
|
|
|
11825
12040
|
};
|
|
11826
12041
|
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RESPONSE);
|
|
11827
12042
|
|
|
11828
|
-
/***/ }
|
|
12043
|
+
/***/ }
|
|
11829
12044
|
|
|
11830
12045
|
}]);
|