@ohif/app 3.7.0-beta.8 → 3.7.0-beta.81
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/{917.bundle.d238efac58b7fe8fd1a3.js → 12.bundle.f5ca9901f923a487d8b3.js} +6 -6
- package/dist/{295.bundle.957b1159fec14b9199a1.js → 125.bundle.253395f320b72180da63.js} +6 -6
- package/dist/{208.bundle.37c2a73b3387e657568c.js → 128.bundle.2dfd63dcf3b846809dfb.js} +41 -59
- package/dist/{351.bundle.0742237651aef9694a65.js → 181.bundle.fa57199595cf28f44c7b.js} +226 -204
- package/dist/{351.css → 181.css} +1 -1
- package/dist/{744.bundle.23011553706b687f67e4.js → 19.bundle.0d74cbc1db3841b851a6.js} +240 -375
- package/dist/{606.bundle.5d876f5f3dd8287f0a28.js → 202.bundle.96bbb4547a346fe3921f.js} +1420 -750
- package/dist/{926.bundle.dbc9d0e591cb9217fda2.js → 220.bundle.f7e1c96c94245e70f2be.js} +990 -400
- package/dist/221.bundle.933ef6dcf6d29eea0259.js +1722 -0
- package/dist/221.css +2 -0
- package/dist/{664.bundle.09abae984223969d1bde.js → 23.bundle.e008ad788170f2ed5569.js} +5 -6
- package/dist/{976.bundle.dcbddf56a7d8f388bb8a.js → 236.bundle.3f6a0e3dd259bc60d4d0.js} +87 -103
- package/dist/{55.bundle.550a823e75eb608e8d5e.js → 250.bundle.36909d7bc681d66087d1.js} +52 -36
- package/dist/{973.bundle.03b016e6095622adf12f.js → 281.bundle.69d85dc35d1bc1335fbd.js} +18 -14
- package/dist/{82.bundle.10c2133333748ec6fba0.js → 342.bundle.46b3527fb38b74a044e8.js} +1768 -475
- package/dist/{192.bundle.2dc14a6e3c4c6be913b0.js → 348.bundle.46d4c41b9ae681c50903.js} +86 -73
- package/dist/{404.bundle.5d57295bc05206092d42.js → 359.bundle.408fa86b95fd1597552c.js} +46 -131
- package/dist/{790.bundle.cedf27deeed29266a92b.js → 410.bundle.bf702dcec9db605d0d72.js} +11 -9
- package/dist/{151.bundle.31ea35044218837bf73f.js → 417.bundle.af0a207c29b109f84159.js} +49 -17
- package/dist/{569.bundle.c8e771a8d28e237b32be.js → 451.bundle.dc0d14c3724464cca2bf.js} +86 -106
- package/dist/{581.bundle.dc6197189f7c88c27d4c.js → 471.bundle.2206d4c0ac2ad0df2362.js} +78 -99
- package/dist/{199.bundle.e4ac6606dd62e42e9da4.js → 506.bundle.90364a62dcd8e433c1a4.js} +11 -9
- package/dist/{531.bundle.2a82fb1d69e5b57cc72b.js → 530.bundle.a03b6f942ace3e1baa1e.js} +726 -447
- package/dist/579.css +1 -0
- package/dist/{935.bundle.deeffff0e4f7b528e3c3.js → 604.bundle.a51f83e64004bca5f497.js} +2 -3
- package/dist/613.bundle.a06431b9a1b14cb8f469.js +532 -0
- package/dist/{984.bundle.e7dcbd3b8992748823fb.js → 663.bundle.482bdfb562bfb3700c55.js} +68 -38
- package/dist/{205.bundle.b5a473c200dcf2bbcdb4.js → 686.bundle.dccef1f36e4bc79bcc48.js} +6 -6
- package/dist/{50.bundle.424f8d05f1bebaafcf2c.js → 687.bundle.b456dd5eae1afeaab05d.js} +218 -9
- package/dist/{331.bundle.bd0c13931a21d53086c9.js → 754.bundle.e3ce6855d8d4d187f224.js} +12423 -7549
- package/dist/{728.bundle.d13856835357400fef82.js → 774.bundle.d365320749c4f67cda70.js} +93 -64
- package/dist/{381.bundle.0905e683605fcbc0895f.js → 775.bundle.2285e7e0e67878948c0d.js} +16 -16
- package/dist/{270.bundle.4564621556b0f963a004.js → 777.bundle.ae3fdb8a470caecc0c6a.js} +1330 -929
- package/dist/{283.bundle.085cddb2f16e430677b0.js → 782.bundle.742caefc99a1393225d2.js} +117 -67
- package/dist/{642.bundle.25e56df5f0bcd2c729b4.js → 814.bundle.f84f8c34cd82d9456367.js} +6 -6
- package/dist/{799.bundle.758558e64147e5aad612.js → 822.bundle.5fca45a4f40f5259aec5.js} +81 -34
- package/dist/831.bundle.83658f62fcc769043605.js +16700 -0
- package/dist/{953.bundle.3b0189ebc11cf0946f18.js → 886.bundle.a9de117c3a42b7907cf6.js} +34 -29
- package/dist/945.min.worker.js +1 -1
- package/dist/945.min.worker.js.map +1 -1
- package/dist/{707.bundle.17a9d7352409b6269596.js → 967.bundle.aa7e40475fa7cab0726e.js} +895 -572
- package/dist/_redirects +1 -1
- package/dist/app-config.js +35 -17
- package/dist/{app.bundle.837996a8f7dd2aaac338.js → app.bundle.91713b6c13b1264236f9.js} +73339 -68140
- package/dist/app.bundle.css +13 -12
- package/dist/assets/yandex-browser-manifest.json +1 -1
- package/dist/cornerstoneDICOMImageLoader.min.js +1 -1
- package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -1
- package/dist/{dicom-microscopy-viewer.bundle.aa60bdf008c32c39cfd7.js → dicom-microscopy-viewer.bundle.2c146384eb9466d02ff8.js} +5 -4
- package/dist/es6-shim.min.js +3569 -2
- package/dist/google.js +8 -7
- package/dist/index.html +1 -1
- package/dist/{index.worker.1c69152d710fa7b84bce.worker.js → index.worker.e62ecca63f1a2e124230.worker.js} +2 -2
- package/dist/index.worker.e62ecca63f1a2e124230.worker.js.map +1 -0
- package/dist/init-service-worker.js +3 -5
- package/dist/oidc-client.min.js +10857 -39
- package/dist/polyfill.min.js +184 -1
- package/dist/silent-refresh.html +18 -9
- package/dist/sw.js +1 -1
- package/package.json +20 -21
- package/dist/616.bundle.eb4887184da6c57bf7a3.js +0 -685
- package/dist/780.bundle.fd0f13dc92e9caa0581e.js +0 -4769
- package/dist/index.worker.1c69152d710fa7b84bce.worker.js.map +0 -1
- /package/dist/{806.css → 19.css} +0 -0
- /package/dist/{55.css → 250.css} +0 -0
- /package/dist/{707.css → 967.css} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
(
|
|
2
|
+
(self["webpackChunk"] = self["webpackChunk"] || []).push([[181],{
|
|
3
3
|
|
|
4
|
-
/***/
|
|
4
|
+
/***/ 86181:
|
|
5
5
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
6
6
|
|
|
7
7
|
// ESM COMPAT FLAG
|
|
@@ -13,22 +13,22 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
13
13
|
});
|
|
14
14
|
|
|
15
15
|
// EXTERNAL MODULE: ../../../node_modules/react/index.js
|
|
16
|
-
var react = __webpack_require__(
|
|
16
|
+
var react = __webpack_require__(43001);
|
|
17
17
|
// EXTERNAL MODULE: ../../../node_modules/react-resize-detector/build/index.esm.js
|
|
18
|
-
var index_esm = __webpack_require__(
|
|
18
|
+
var index_esm = __webpack_require__(7023);
|
|
19
19
|
// EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
|
|
20
|
-
var prop_types = __webpack_require__(
|
|
20
|
+
var prop_types = __webpack_require__(3827);
|
|
21
21
|
var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
|
|
22
|
-
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js +
|
|
23
|
-
var esm = __webpack_require__(
|
|
24
|
-
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js +
|
|
25
|
-
var dist_esm = __webpack_require__(
|
|
26
|
-
// EXTERNAL MODULE: ../../core/src/index.ts +
|
|
27
|
-
var src = __webpack_require__(
|
|
28
|
-
// EXTERNAL MODULE: ../../ui/src/index.js +
|
|
29
|
-
var ui_src = __webpack_require__(
|
|
22
|
+
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 327 modules
|
|
23
|
+
var esm = __webpack_require__(99777);
|
|
24
|
+
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 337 modules
|
|
25
|
+
var dist_esm = __webpack_require__(45754);
|
|
26
|
+
// EXTERNAL MODULE: ../../core/src/index.ts + 75 modules
|
|
27
|
+
var src = __webpack_require__(34491);
|
|
28
|
+
// EXTERNAL MODULE: ../../ui/src/index.js + 485 modules
|
|
29
|
+
var ui_src = __webpack_require__(71783);
|
|
30
30
|
// EXTERNAL MODULE: ../../../extensions/cornerstone/src/state.ts
|
|
31
|
-
var state = __webpack_require__(
|
|
31
|
+
var state = __webpack_require__(73704);
|
|
32
32
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.css
|
|
33
33
|
// extracted by mini-css-extract-plugin
|
|
34
34
|
|
|
@@ -41,7 +41,7 @@ var state = __webpack_require__(21922);
|
|
|
41
41
|
function CornerstoneImageScrollbar(_ref) {
|
|
42
42
|
let {
|
|
43
43
|
viewportData,
|
|
44
|
-
|
|
44
|
+
viewportId,
|
|
45
45
|
element,
|
|
46
46
|
imageSliceData,
|
|
47
47
|
setImageSliceData,
|
|
@@ -52,9 +52,7 @@ function CornerstoneImageScrollbar(_ref) {
|
|
|
52
52
|
cineService,
|
|
53
53
|
cornerstoneViewportService
|
|
54
54
|
} = servicesManager.services;
|
|
55
|
-
const onImageScrollbarChange = (imageIndex,
|
|
56
|
-
const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(viewportIndex);
|
|
57
|
-
const viewportId = viewportInfo.getViewportId();
|
|
55
|
+
const onImageScrollbarChange = (imageIndex, viewportId) => {
|
|
58
56
|
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
|
59
57
|
const {
|
|
60
58
|
isCineEnabled
|
|
@@ -63,7 +61,7 @@ function CornerstoneImageScrollbar(_ref) {
|
|
|
63
61
|
// on image scrollbar change, stop the CINE if it is playing
|
|
64
62
|
cineService.stopClip(element);
|
|
65
63
|
cineService.setCine({
|
|
66
|
-
id:
|
|
64
|
+
id: viewportId,
|
|
67
65
|
isPlaying: false
|
|
68
66
|
});
|
|
69
67
|
}
|
|
@@ -76,7 +74,7 @@ function CornerstoneImageScrollbar(_ref) {
|
|
|
76
74
|
if (!viewportData) {
|
|
77
75
|
return;
|
|
78
76
|
}
|
|
79
|
-
const viewport = cornerstoneViewportService.
|
|
77
|
+
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
|
80
78
|
if (!viewport) {
|
|
81
79
|
return;
|
|
82
80
|
}
|
|
@@ -102,7 +100,7 @@ function CornerstoneImageScrollbar(_ref) {
|
|
|
102
100
|
numberOfSlices
|
|
103
101
|
});
|
|
104
102
|
}
|
|
105
|
-
}, [
|
|
103
|
+
}, [viewportId, viewportData]);
|
|
106
104
|
(0,react.useEffect)(() => {
|
|
107
105
|
if (viewportData?.viewportType !== dist_esm.Enums.ViewportType.STACK) {
|
|
108
106
|
return;
|
|
@@ -143,7 +141,7 @@ function CornerstoneImageScrollbar(_ref) {
|
|
|
143
141
|
};
|
|
144
142
|
}, [viewportData, element]);
|
|
145
143
|
return /*#__PURE__*/react.createElement(ui_src/* ImageScrollbar */.Ln, {
|
|
146
|
-
onChange: evt => onImageScrollbarChange(evt,
|
|
144
|
+
onChange: evt => onImageScrollbarChange(evt, viewportId),
|
|
147
145
|
max: imageSliceData.numberOfSlices ? imageSliceData.numberOfSlices - 1 : 0,
|
|
148
146
|
height: scrollbarHeight,
|
|
149
147
|
value: imageSliceData.imageIndex
|
|
@@ -151,7 +149,7 @@ function CornerstoneImageScrollbar(_ref) {
|
|
|
151
149
|
}
|
|
152
150
|
CornerstoneImageScrollbar.propTypes = {
|
|
153
151
|
viewportData: (prop_types_default()).object,
|
|
154
|
-
|
|
152
|
+
viewportId: (prop_types_default()).string.isRequired,
|
|
155
153
|
element: prop_types_default().instanceOf(Element),
|
|
156
154
|
scrollbarHeight: (prop_types_default()).string,
|
|
157
155
|
imageSliceData: (prop_types_default()).object.isRequired,
|
|
@@ -160,9 +158,9 @@ CornerstoneImageScrollbar.propTypes = {
|
|
|
160
158
|
};
|
|
161
159
|
/* harmony default export */ const ViewportImageScrollbar = (CornerstoneImageScrollbar);
|
|
162
160
|
// EXTERNAL MODULE: ../../../node_modules/gl-matrix/esm/index.js + 10 modules
|
|
163
|
-
var gl_matrix_esm = __webpack_require__(
|
|
161
|
+
var gl_matrix_esm = __webpack_require__(45451);
|
|
164
162
|
// EXTERNAL MODULE: ../../../node_modules/moment/moment.js
|
|
165
|
-
var moment = __webpack_require__(
|
|
163
|
+
var moment = __webpack_require__(71271);
|
|
166
164
|
var moment_default = /*#__PURE__*/__webpack_require__.n(moment);
|
|
167
165
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/Viewport/Overlays/utils.ts
|
|
168
166
|
|
|
@@ -240,7 +238,7 @@ function formatPN(name) {
|
|
|
240
238
|
* Gets compression type
|
|
241
239
|
*
|
|
242
240
|
* @param {number} imageId
|
|
243
|
-
* @returns {string}
|
|
241
|
+
* @returns {string} compression type.
|
|
244
242
|
*/
|
|
245
243
|
function getCompression(imageId) {
|
|
246
244
|
const generalImageModule = metaData.get('generalImageModule', imageId) || {};
|
|
@@ -291,11 +289,11 @@ function VOIOverlayItem(_ref) {
|
|
|
291
289
|
}, /*#__PURE__*/react.createElement("span", {
|
|
292
290
|
className: "mr-1 shrink-0"
|
|
293
291
|
}, "W:"), /*#__PURE__*/react.createElement("span", {
|
|
294
|
-
className: "ml-1 mr-2 font-light
|
|
292
|
+
className: "ml-1 mr-2 shrink-0 font-light"
|
|
295
293
|
}, windowWidth.toFixed(0)), /*#__PURE__*/react.createElement("span", {
|
|
296
294
|
className: "mr-1 shrink-0"
|
|
297
295
|
}, "L:"), /*#__PURE__*/react.createElement("span", {
|
|
298
|
-
className: "ml-1 font-light
|
|
296
|
+
className: "ml-1 shrink-0 font-light"
|
|
299
297
|
}, windowCenter.toFixed(0)));
|
|
300
298
|
}
|
|
301
299
|
|
|
@@ -352,7 +350,7 @@ function CustomizableViewportOverlay(_ref4) {
|
|
|
352
350
|
element,
|
|
353
351
|
viewportData,
|
|
354
352
|
imageSliceData,
|
|
355
|
-
|
|
353
|
+
viewportId,
|
|
356
354
|
servicesManager
|
|
357
355
|
} = _ref4;
|
|
358
356
|
const {
|
|
@@ -382,10 +380,10 @@ function CustomizableViewportOverlay(_ref4) {
|
|
|
382
380
|
}, [viewportData, imageIndex]);
|
|
383
381
|
const instanceNumber = (0,react.useMemo)(() => {
|
|
384
382
|
if (viewportData != null) {
|
|
385
|
-
return _getInstanceNumber(viewportData,
|
|
383
|
+
return _getInstanceNumber(viewportData, viewportId, imageIndex, cornerstoneViewportService);
|
|
386
384
|
}
|
|
387
385
|
return null;
|
|
388
|
-
}, [viewportData,
|
|
386
|
+
}, [viewportData, viewportId, imageIndex, cornerstoneViewportService]);
|
|
389
387
|
|
|
390
388
|
/**
|
|
391
389
|
* Initial toolbar state
|
|
@@ -422,7 +420,7 @@ function CustomizableViewportOverlay(_ref4) {
|
|
|
422
420
|
return () => {
|
|
423
421
|
element.removeEventListener(dist_esm.Enums.Events.VOI_MODIFIED, updateVOI);
|
|
424
422
|
};
|
|
425
|
-
}, [
|
|
423
|
+
}, [viewportId, viewportData, voi, element]);
|
|
426
424
|
|
|
427
425
|
/**
|
|
428
426
|
* Updating the scale when the viewport changes its zoom
|
|
@@ -434,7 +432,7 @@ function CustomizableViewportOverlay(_ref4) {
|
|
|
434
432
|
camera
|
|
435
433
|
} = eventDetail.detail;
|
|
436
434
|
if (previousCamera.parallelScale !== camera.parallelScale || previousCamera.scale !== camera.scale) {
|
|
437
|
-
const viewport = cornerstoneViewportService.
|
|
435
|
+
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
|
438
436
|
if (!viewport) {
|
|
439
437
|
return;
|
|
440
438
|
}
|
|
@@ -458,7 +456,7 @@ function CustomizableViewportOverlay(_ref4) {
|
|
|
458
456
|
return () => {
|
|
459
457
|
element.removeEventListener(dist_esm.Enums.Events.CAMERA_MODIFIED, updateScale);
|
|
460
458
|
};
|
|
461
|
-
}, [
|
|
459
|
+
}, [viewportId, viewportData, cornerstoneViewportService, element]);
|
|
462
460
|
|
|
463
461
|
/**
|
|
464
462
|
* Updating the active tools when the toolbar changes
|
|
@@ -479,7 +477,7 @@ function CustomizableViewportOverlay(_ref4) {
|
|
|
479
477
|
element,
|
|
480
478
|
viewportData,
|
|
481
479
|
imageSliceData,
|
|
482
|
-
|
|
480
|
+
viewportId,
|
|
483
481
|
servicesManager,
|
|
484
482
|
customization: item,
|
|
485
483
|
formatters: {
|
|
@@ -506,7 +504,7 @@ function CustomizableViewportOverlay(_ref4) {
|
|
|
506
504
|
return renderItem.content(overlayItemProps);
|
|
507
505
|
}
|
|
508
506
|
}
|
|
509
|
-
}, [element, viewportData, imageSliceData,
|
|
507
|
+
}, [element, viewportData, imageSliceData, viewportId, servicesManager, customizationService, instance, voi, scale, instanceNumber]);
|
|
510
508
|
const getTopLeftContent = (0,react.useCallback)(() => {
|
|
511
509
|
const items = topLeftCustomization?.items || [{
|
|
512
510
|
id: 'WindowLevel',
|
|
@@ -557,7 +555,7 @@ function _getViewportInstance(viewportData, imageIndex) {
|
|
|
557
555
|
}
|
|
558
556
|
return imageId ? dist_esm.metaData.get('instance', imageId) || {} : {};
|
|
559
557
|
}
|
|
560
|
-
function _getInstanceNumber(viewportData,
|
|
558
|
+
function _getInstanceNumber(viewportData, viewportId, imageIndex, cornerstoneViewportService) {
|
|
561
559
|
let instanceNumber;
|
|
562
560
|
if (viewportData.viewportType === dist_esm.Enums.ViewportType.STACK) {
|
|
563
561
|
instanceNumber = _getInstanceNumberFromStack(viewportData, imageIndex);
|
|
@@ -565,7 +563,7 @@ function _getInstanceNumber(viewportData, viewportIndex, imageIndex, cornerstone
|
|
|
565
563
|
return null;
|
|
566
564
|
}
|
|
567
565
|
} else if (viewportData.viewportType === dist_esm.Enums.ViewportType.ORTHOGRAPHIC) {
|
|
568
|
-
instanceNumber = _getInstanceNumberFromVolume(viewportData, imageIndex,
|
|
566
|
+
instanceNumber = _getInstanceNumberFromVolume(viewportData, imageIndex, viewportId, cornerstoneViewportService);
|
|
569
567
|
}
|
|
570
568
|
return instanceNumber;
|
|
571
569
|
}
|
|
@@ -589,7 +587,7 @@ function _getInstanceNumberFromStack(viewportData, imageIndex) {
|
|
|
589
587
|
// Since volume viewports can be in any view direction, they can render
|
|
590
588
|
// a reconstructed image which don't have imageIds; therefore, no instance and instanceNumber
|
|
591
589
|
// Here we check if viewport is in the acquisition direction and if so, we get the instanceNumber
|
|
592
|
-
function _getInstanceNumberFromVolume(viewportData,
|
|
590
|
+
function _getInstanceNumberFromVolume(viewportData, viewportId, cornerstoneViewportService) {
|
|
593
591
|
const volumes = viewportData.volumes;
|
|
594
592
|
|
|
595
593
|
// Todo: support fusion of acquisition plane which has instanceNumber
|
|
@@ -601,7 +599,7 @@ function _getInstanceNumberFromVolume(viewportData, imageIndex, viewportIndex, c
|
|
|
601
599
|
direction,
|
|
602
600
|
imageIds
|
|
603
601
|
} = volume;
|
|
604
|
-
const cornerstoneViewport = cornerstoneViewportService.
|
|
602
|
+
const cornerstoneViewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
|
605
603
|
if (!cornerstoneViewport) {
|
|
606
604
|
return;
|
|
607
605
|
}
|
|
@@ -630,11 +628,11 @@ function _getInstanceNumberFromVolume(viewportData, imageIndex, viewportIndex, c
|
|
|
630
628
|
CustomizableViewportOverlay.propTypes = {
|
|
631
629
|
viewportData: (prop_types_default()).object,
|
|
632
630
|
imageIndex: (prop_types_default()).number,
|
|
633
|
-
|
|
631
|
+
viewportId: (prop_types_default()).string
|
|
634
632
|
};
|
|
635
633
|
/* harmony default export */ const Overlays_CustomizableViewportOverlay = (CustomizableViewportOverlay);
|
|
636
634
|
// EXTERNAL MODULE: ../../../node_modules/classnames/index.js
|
|
637
|
-
var classnames = __webpack_require__(
|
|
635
|
+
var classnames = __webpack_require__(44921);
|
|
638
636
|
var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
|
|
639
637
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/Viewport/Overlays/ViewportOrientationMarkers.css
|
|
640
638
|
// extracted by mini-css-extract-plugin
|
|
@@ -656,7 +654,7 @@ function ViewportOrientationMarkers(_ref) {
|
|
|
656
654
|
element,
|
|
657
655
|
viewportData,
|
|
658
656
|
imageSliceData,
|
|
659
|
-
|
|
657
|
+
viewportId,
|
|
660
658
|
servicesManager,
|
|
661
659
|
orientationMarkers = ['top', 'left']
|
|
662
660
|
} = _ref;
|
|
@@ -726,7 +724,7 @@ function ViewportOrientationMarkers(_ref) {
|
|
|
726
724
|
return '';
|
|
727
725
|
}
|
|
728
726
|
const markers = _getOrientationMarkers(rowCosines, columnCosines, rotation, flipVertical, flipHorizontal);
|
|
729
|
-
const ohifViewport = cornerstoneViewportService.
|
|
727
|
+
const ohifViewport = cornerstoneViewportService.getViewportInfo(viewportId);
|
|
730
728
|
if (!ohifViewport) {
|
|
731
729
|
console.log('ViewportOrientationMarkers::No viewport');
|
|
732
730
|
return null;
|
|
@@ -858,9 +856,9 @@ function ViewportImageSliceLoadingIndicator(_ref) {
|
|
|
858
856
|
}, [element, viewportData]);
|
|
859
857
|
if (error) {
|
|
860
858
|
return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
|
|
861
|
-
className: "
|
|
859
|
+
className: "absolute top-0 left-0 h-full w-full bg-black opacity-50"
|
|
862
860
|
}, /*#__PURE__*/react.createElement("div", {
|
|
863
|
-
className: "flex
|
|
861
|
+
className: "transparent flex h-full w-full items-center justify-center"
|
|
864
862
|
}, /*#__PURE__*/react.createElement("p", {
|
|
865
863
|
className: "text-primary-light text-xl font-light"
|
|
866
864
|
}, /*#__PURE__*/react.createElement("h4", null, "Error Loading Image"), /*#__PURE__*/react.createElement("p", null, "An error has occurred."), /*#__PURE__*/react.createElement("p", null, error)))));
|
|
@@ -871,9 +869,9 @@ function ViewportImageSliceLoadingIndicator(_ref) {
|
|
|
871
869
|
// IMPORTANT: we need to use the pointer-events-none class to prevent the loading indicator from
|
|
872
870
|
// interacting with the mouse, since scrolling should propagate to the viewport underneath
|
|
873
871
|
react.createElement("div", {
|
|
874
|
-
className: "pointer-events-none
|
|
872
|
+
className: "pointer-events-none absolute top-0 left-0 h-full w-full bg-black opacity-50"
|
|
875
873
|
}, /*#__PURE__*/react.createElement("div", {
|
|
876
|
-
className: "flex
|
|
874
|
+
className: "transparent flex h-full w-full items-center justify-center"
|
|
877
875
|
}, /*#__PURE__*/react.createElement("p", {
|
|
878
876
|
className: "text-primary-light text-xl font-light"
|
|
879
877
|
}, "Loading...")))
|
|
@@ -899,7 +897,7 @@ ViewportImageSliceLoadingIndicator.defaultProps = {
|
|
|
899
897
|
|
|
900
898
|
function CornerstoneOverlays(props) {
|
|
901
899
|
const {
|
|
902
|
-
|
|
900
|
+
viewportId,
|
|
903
901
|
element,
|
|
904
902
|
scrollbarHeight,
|
|
905
903
|
servicesManager
|
|
@@ -916,7 +914,7 @@ function CornerstoneOverlays(props) {
|
|
|
916
914
|
const {
|
|
917
915
|
unsubscribe
|
|
918
916
|
} = cornerstoneViewportService.subscribe(cornerstoneViewportService.EVENTS.VIEWPORT_DATA_CHANGED, props => {
|
|
919
|
-
if (props.
|
|
917
|
+
if (props.viewportId !== viewportId) {
|
|
920
918
|
return;
|
|
921
919
|
}
|
|
922
920
|
setViewportData(props.viewportData);
|
|
@@ -924,12 +922,12 @@ function CornerstoneOverlays(props) {
|
|
|
924
922
|
return () => {
|
|
925
923
|
unsubscribe();
|
|
926
924
|
};
|
|
927
|
-
}, [
|
|
925
|
+
}, [viewportId]);
|
|
928
926
|
if (!element) {
|
|
929
927
|
return null;
|
|
930
928
|
}
|
|
931
929
|
if (viewportData) {
|
|
932
|
-
const viewportInfo = cornerstoneViewportService.
|
|
930
|
+
const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
|
|
933
931
|
if (viewportInfo?.viewportOptions?.customViewportProps?.hideOverlays) {
|
|
934
932
|
return null;
|
|
935
933
|
}
|
|
@@ -937,7 +935,7 @@ function CornerstoneOverlays(props) {
|
|
|
937
935
|
return /*#__PURE__*/react.createElement("div", {
|
|
938
936
|
className: "noselect"
|
|
939
937
|
}, /*#__PURE__*/react.createElement(ViewportImageScrollbar, {
|
|
940
|
-
|
|
938
|
+
viewportId: viewportId,
|
|
941
939
|
viewportData: viewportData,
|
|
942
940
|
element: element,
|
|
943
941
|
imageSliceData: imageSliceData,
|
|
@@ -947,7 +945,7 @@ function CornerstoneOverlays(props) {
|
|
|
947
945
|
}), /*#__PURE__*/react.createElement(Overlays_CustomizableViewportOverlay, {
|
|
948
946
|
imageSliceData: imageSliceData,
|
|
949
947
|
viewportData: viewportData,
|
|
950
|
-
|
|
948
|
+
viewportId: viewportId,
|
|
951
949
|
servicesManager: servicesManager,
|
|
952
950
|
element: element
|
|
953
951
|
}), /*#__PURE__*/react.createElement(Overlays_ViewportImageSliceLoadingIndicator, {
|
|
@@ -958,12 +956,105 @@ function CornerstoneOverlays(props) {
|
|
|
958
956
|
element: element,
|
|
959
957
|
viewportData: viewportData,
|
|
960
958
|
servicesManager: servicesManager,
|
|
961
|
-
|
|
959
|
+
viewportId: viewportId
|
|
962
960
|
}));
|
|
963
961
|
}
|
|
964
962
|
/* harmony default export */ const Overlays_CornerstoneOverlays = (CornerstoneOverlays);
|
|
965
963
|
// EXTERNAL MODULE: ../../../extensions/cornerstone/src/utils/measurementServiceMappings/utils/getSOPInstanceAttributes.js
|
|
966
|
-
var getSOPInstanceAttributes = __webpack_require__(
|
|
964
|
+
var getSOPInstanceAttributes = __webpack_require__(87172);
|
|
965
|
+
;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/CinePlayer/CinePlayer.tsx
|
|
966
|
+
|
|
967
|
+
|
|
968
|
+
|
|
969
|
+
function WrappedCinePlayer(_ref) {
|
|
970
|
+
let {
|
|
971
|
+
enabledVPElement,
|
|
972
|
+
viewportId,
|
|
973
|
+
servicesManager
|
|
974
|
+
} = _ref;
|
|
975
|
+
const {
|
|
976
|
+
toolbarService,
|
|
977
|
+
customizationService
|
|
978
|
+
} = servicesManager.services;
|
|
979
|
+
const [{
|
|
980
|
+
isCineEnabled,
|
|
981
|
+
cines
|
|
982
|
+
}, cineService] = (0,ui_src/* useCine */.vQ)();
|
|
983
|
+
const [{
|
|
984
|
+
activeViewportId
|
|
985
|
+
}] = (0,ui_src/* useViewportGrid */.O_)();
|
|
986
|
+
const {
|
|
987
|
+
component: CinePlayerComponent = ui_src/* CinePlayer */.H6
|
|
988
|
+
} = customizationService.get('cinePlayer') ?? {};
|
|
989
|
+
const handleCineClose = () => {
|
|
990
|
+
toolbarService.recordInteraction({
|
|
991
|
+
groupId: 'MoreTools',
|
|
992
|
+
interactionType: 'toggle',
|
|
993
|
+
commands: [{
|
|
994
|
+
commandName: 'toggleCine',
|
|
995
|
+
commandOptions: {},
|
|
996
|
+
toolName: 'cine',
|
|
997
|
+
context: 'CORNERSTONE'
|
|
998
|
+
}]
|
|
999
|
+
});
|
|
1000
|
+
};
|
|
1001
|
+
const cineHandler = () => {
|
|
1002
|
+
if (!cines || !cines[viewportId] || !enabledVPElement) {
|
|
1003
|
+
return;
|
|
1004
|
+
}
|
|
1005
|
+
const cine = cines[viewportId];
|
|
1006
|
+
const isPlaying = cine.isPlaying || false;
|
|
1007
|
+
const frameRate = cine.frameRate || 24;
|
|
1008
|
+
const validFrameRate = Math.max(frameRate, 1);
|
|
1009
|
+
if (isPlaying) {
|
|
1010
|
+
cineService.playClip(enabledVPElement, {
|
|
1011
|
+
framesPerSecond: validFrameRate
|
|
1012
|
+
});
|
|
1013
|
+
} else {
|
|
1014
|
+
cineService.stopClip(enabledVPElement);
|
|
1015
|
+
}
|
|
1016
|
+
};
|
|
1017
|
+
(0,react.useEffect)(() => {
|
|
1018
|
+
dist_esm.eventTarget.addEventListener(dist_esm.Enums.Events.STACK_VIEWPORT_NEW_STACK, cineHandler);
|
|
1019
|
+
return () => {
|
|
1020
|
+
cineService.setCine({
|
|
1021
|
+
id: viewportId,
|
|
1022
|
+
isPlaying: false
|
|
1023
|
+
});
|
|
1024
|
+
dist_esm.eventTarget.removeEventListener(dist_esm.Enums.Events.STACK_VIEWPORT_NEW_STACK, cineHandler);
|
|
1025
|
+
};
|
|
1026
|
+
}, [enabledVPElement]);
|
|
1027
|
+
(0,react.useEffect)(() => {
|
|
1028
|
+
if (!cines || !cines[viewportId] || !enabledVPElement) {
|
|
1029
|
+
return;
|
|
1030
|
+
}
|
|
1031
|
+
cineHandler();
|
|
1032
|
+
return () => {
|
|
1033
|
+
if (enabledVPElement && cines?.[viewportId]?.isPlaying) {
|
|
1034
|
+
cineService.stopClip(enabledVPElement);
|
|
1035
|
+
}
|
|
1036
|
+
};
|
|
1037
|
+
}, [cines, viewportId, cineService, enabledVPElement, cineHandler]);
|
|
1038
|
+
const cine = cines[viewportId];
|
|
1039
|
+
const isPlaying = cine && cine.isPlaying || false;
|
|
1040
|
+
return isCineEnabled && /*#__PURE__*/react.createElement(CinePlayerComponent, {
|
|
1041
|
+
className: "absolute left-1/2 bottom-3 -translate-x-1/2",
|
|
1042
|
+
isPlaying: isPlaying,
|
|
1043
|
+
onClose: handleCineClose,
|
|
1044
|
+
onPlayPauseChange: isPlaying => cineService.setCine({
|
|
1045
|
+
id: activeViewportId,
|
|
1046
|
+
isPlaying
|
|
1047
|
+
}),
|
|
1048
|
+
onFrameRateChange: frameRate => cineService.setCine({
|
|
1049
|
+
id: activeViewportId,
|
|
1050
|
+
frameRate
|
|
1051
|
+
})
|
|
1052
|
+
});
|
|
1053
|
+
}
|
|
1054
|
+
/* harmony default export */ const CinePlayer = (WrappedCinePlayer);
|
|
1055
|
+
;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/CinePlayer/index.ts
|
|
1056
|
+
|
|
1057
|
+
/* harmony default export */ const components_CinePlayer = (CinePlayer);
|
|
967
1058
|
;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.tsx
|
|
968
1059
|
|
|
969
1060
|
|
|
@@ -976,6 +1067,7 @@ var getSOPInstanceAttributes = __webpack_require__(63130);
|
|
|
976
1067
|
|
|
977
1068
|
|
|
978
1069
|
|
|
1070
|
+
|
|
979
1071
|
const STACK = 'stack';
|
|
980
1072
|
|
|
981
1073
|
/**
|
|
@@ -999,6 +1091,9 @@ function areEqual(prevProps, nextProps) {
|
|
|
999
1091
|
if (prevProps.viewportOptions.viewportType !== nextProps.viewportOptions.viewportType) {
|
|
1000
1092
|
return false;
|
|
1001
1093
|
}
|
|
1094
|
+
if (nextProps.viewportOptions.needsRerendering) {
|
|
1095
|
+
return false;
|
|
1096
|
+
}
|
|
1002
1097
|
const prevDisplaySets = prevProps.displaySets;
|
|
1003
1098
|
const nextDisplaySets = nextProps.displaySets;
|
|
1004
1099
|
if (prevDisplaySets.length !== nextDisplaySets.length) {
|
|
@@ -1032,27 +1127,22 @@ function areEqual(prevProps, nextProps) {
|
|
|
1032
1127
|
// Then we don't need to worry about the re-renders if the props change.
|
|
1033
1128
|
const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
1034
1129
|
const {
|
|
1035
|
-
viewportIndex,
|
|
1036
1130
|
displaySets,
|
|
1037
1131
|
dataSource,
|
|
1038
1132
|
viewportOptions,
|
|
1039
1133
|
displaySetOptions,
|
|
1040
1134
|
servicesManager,
|
|
1135
|
+
commandsManager,
|
|
1041
1136
|
onElementEnabled,
|
|
1042
1137
|
onElementDisabled,
|
|
1138
|
+
isJumpToMeasurementDisabled,
|
|
1043
1139
|
// Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation
|
|
1044
1140
|
// of the imageData in the OHIFCornerstoneViewport. This prop is used
|
|
1045
1141
|
// to set the initial state of the viewport's first image to render
|
|
1046
1142
|
initialImageIndex
|
|
1047
1143
|
} = props;
|
|
1144
|
+
const viewportId = viewportOptions.viewportId;
|
|
1048
1145
|
const [scrollbarHeight, setScrollbarHeight] = (0,react.useState)('100px');
|
|
1049
|
-
const [{
|
|
1050
|
-
isCineEnabled,
|
|
1051
|
-
cines
|
|
1052
|
-
}, cineService] = (0,ui_src/* useCine */.vQ)();
|
|
1053
|
-
const [{
|
|
1054
|
-
activeViewportIndex
|
|
1055
|
-
}] = (0,ui_src/* useViewportGrid */.O_)();
|
|
1056
1146
|
const [enabledVPElement, setEnabledVPElement] = (0,react.useState)(null);
|
|
1057
1147
|
const elementRef = (0,react.useRef)();
|
|
1058
1148
|
const {
|
|
@@ -1067,58 +1157,6 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1067
1157
|
stateSyncService
|
|
1068
1158
|
} = servicesManager.services;
|
|
1069
1159
|
const [viewportDialogState] = (0,ui_src/* useViewportDialog */.en)();
|
|
1070
|
-
const cineHandler = () => {
|
|
1071
|
-
if (!cines || !cines[viewportIndex] || !enabledVPElement) {
|
|
1072
|
-
return;
|
|
1073
|
-
}
|
|
1074
|
-
const cine = cines[viewportIndex];
|
|
1075
|
-
const isPlaying = cine.isPlaying || false;
|
|
1076
|
-
const frameRate = cine.frameRate || 24;
|
|
1077
|
-
const validFrameRate = Math.max(frameRate, 1);
|
|
1078
|
-
if (isPlaying) {
|
|
1079
|
-
cineService.playClip(enabledVPElement, {
|
|
1080
|
-
framesPerSecond: validFrameRate
|
|
1081
|
-
});
|
|
1082
|
-
} else {
|
|
1083
|
-
cineService.stopClip(enabledVPElement);
|
|
1084
|
-
}
|
|
1085
|
-
};
|
|
1086
|
-
(0,react.useEffect)(() => {
|
|
1087
|
-
dist_esm.eventTarget.addEventListener(dist_esm.Enums.Events.STACK_VIEWPORT_NEW_STACK, cineHandler);
|
|
1088
|
-
return () => {
|
|
1089
|
-
cineService.setCine({
|
|
1090
|
-
id: viewportIndex,
|
|
1091
|
-
isPlaying: false
|
|
1092
|
-
});
|
|
1093
|
-
dist_esm.eventTarget.removeEventListener(dist_esm.Enums.Events.STACK_VIEWPORT_NEW_STACK, cineHandler);
|
|
1094
|
-
};
|
|
1095
|
-
}, [enabledVPElement]);
|
|
1096
|
-
(0,react.useEffect)(() => {
|
|
1097
|
-
if (!cines || !cines[viewportIndex] || !enabledVPElement) {
|
|
1098
|
-
return;
|
|
1099
|
-
}
|
|
1100
|
-
cineHandler();
|
|
1101
|
-
return () => {
|
|
1102
|
-
if (enabledVPElement && cines?.[viewportIndex]?.isPlaying) {
|
|
1103
|
-
cineService.stopClip(enabledVPElement);
|
|
1104
|
-
}
|
|
1105
|
-
};
|
|
1106
|
-
}, [cines, viewportIndex, cineService, enabledVPElement, cineHandler]);
|
|
1107
|
-
const cine = cines[viewportIndex];
|
|
1108
|
-
const isPlaying = cine && cine.isPlaying || false;
|
|
1109
|
-
const handleCineClose = () => {
|
|
1110
|
-
toolbarService.recordInteraction({
|
|
1111
|
-
groupId: 'MoreTools',
|
|
1112
|
-
itemId: 'cine',
|
|
1113
|
-
interactionType: 'toggle',
|
|
1114
|
-
commands: [{
|
|
1115
|
-
commandName: 'toggleCine',
|
|
1116
|
-
commandOptions: {},
|
|
1117
|
-
context: 'CORNERSTONE'
|
|
1118
|
-
}]
|
|
1119
|
-
});
|
|
1120
|
-
};
|
|
1121
|
-
|
|
1122
1160
|
// useCallback for scroll bar height calculation
|
|
1123
1161
|
const setImageScrollBarHeight = (0,react.useCallback)(() => {
|
|
1124
1162
|
const scrollbarHeight = `${elementRef.current.clientHeight - 20}px`;
|
|
@@ -1132,46 +1170,12 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1132
1170
|
setImageScrollBarHeight();
|
|
1133
1171
|
}
|
|
1134
1172
|
}, [elementRef]);
|
|
1135
|
-
const
|
|
1136
|
-
const currentPresentation = cornerstoneViewportService.getPresentation(viewportIndex);
|
|
1137
|
-
if (!currentPresentation || !currentPresentation.presentationIds) return;
|
|
1138
|
-
const {
|
|
1139
|
-
lutPresentationStore,
|
|
1140
|
-
positionPresentationStore
|
|
1141
|
-
} = stateSyncService.getState();
|
|
1142
|
-
const {
|
|
1143
|
-
presentationIds
|
|
1144
|
-
} = currentPresentation;
|
|
1145
|
-
const {
|
|
1146
|
-
lutPresentationId,
|
|
1147
|
-
positionPresentationId
|
|
1148
|
-
} = presentationIds || {};
|
|
1149
|
-
const storeState = {};
|
|
1150
|
-
if (lutPresentationId) {
|
|
1151
|
-
storeState.lutPresentationStore = {
|
|
1152
|
-
...lutPresentationStore,
|
|
1153
|
-
[lutPresentationId]: currentPresentation
|
|
1154
|
-
};
|
|
1155
|
-
}
|
|
1156
|
-
if (positionPresentationId) {
|
|
1157
|
-
storeState.positionPresentationStore = {
|
|
1158
|
-
...positionPresentationStore,
|
|
1159
|
-
[positionPresentationId]: currentPresentation
|
|
1160
|
-
};
|
|
1161
|
-
}
|
|
1162
|
-
stateSyncService.store(storeState);
|
|
1163
|
-
};
|
|
1164
|
-
const cleanUpServices = (0,react.useCallback)(() => {
|
|
1165
|
-
const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(viewportIndex);
|
|
1166
|
-
if (!viewportInfo) {
|
|
1167
|
-
return;
|
|
1168
|
-
}
|
|
1169
|
-
const viewportId = viewportInfo.getViewportId();
|
|
1173
|
+
const cleanUpServices = (0,react.useCallback)(viewportInfo => {
|
|
1170
1174
|
const renderingEngineId = viewportInfo.getRenderingEngineId();
|
|
1171
1175
|
const syncGroups = viewportInfo.getSyncGroups();
|
|
1172
1176
|
toolGroupService.removeViewportFromToolGroup(viewportId, renderingEngineId);
|
|
1173
1177
|
syncGroupService.removeViewportFromSyncGroup(viewportId, renderingEngineId, syncGroups);
|
|
1174
|
-
}, [
|
|
1178
|
+
}, [viewportId]);
|
|
1175
1179
|
const elementEnabledHandler = (0,react.useCallback)(evt => {
|
|
1176
1180
|
// check this is this element reference and return early if doesn't match
|
|
1177
1181
|
if (evt.detail.element !== elementRef.current) {
|
|
@@ -1182,8 +1186,7 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1182
1186
|
element
|
|
1183
1187
|
} = evt.detail;
|
|
1184
1188
|
const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
|
|
1185
|
-
|
|
1186
|
-
(0,state/* setEnabledElement */.Yc)(viewportIndex, element);
|
|
1189
|
+
(0,state/* setEnabledElement */.Yc)(viewportId, element);
|
|
1187
1190
|
setEnabledVPElement(element);
|
|
1188
1191
|
const renderingEngineId = viewportInfo.getRenderingEngineId();
|
|
1189
1192
|
const toolGroupId = viewportInfo.getToolGroupId();
|
|
@@ -1193,18 +1196,22 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1193
1196
|
if (onElementEnabled) {
|
|
1194
1197
|
onElementEnabled(evt);
|
|
1195
1198
|
}
|
|
1196
|
-
}, [
|
|
1199
|
+
}, [viewportId, onElementEnabled, toolGroupService]);
|
|
1197
1200
|
|
|
1198
1201
|
// disable the element upon unmounting
|
|
1199
1202
|
(0,react.useEffect)(() => {
|
|
1200
|
-
cornerstoneViewportService.enableViewport(
|
|
1203
|
+
cornerstoneViewportService.enableViewport(viewportId, elementRef.current);
|
|
1201
1204
|
dist_esm.eventTarget.addEventListener(dist_esm.Enums.Events.ELEMENT_ENABLED, elementEnabledHandler);
|
|
1202
1205
|
setImageScrollBarHeight();
|
|
1203
1206
|
return () => {
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1207
|
+
const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
|
|
1208
|
+
if (!viewportInfo) {
|
|
1209
|
+
return;
|
|
1210
|
+
}
|
|
1211
|
+
cleanUpServices(viewportInfo);
|
|
1212
|
+
cornerstoneViewportService.storePresentation({
|
|
1213
|
+
viewportId
|
|
1214
|
+
});
|
|
1208
1215
|
if (onElementDisabled) {
|
|
1209
1216
|
onElementDisabled(viewportInfo);
|
|
1210
1217
|
}
|
|
@@ -1223,19 +1230,26 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1223
1230
|
(0,react.useEffect)(() => {
|
|
1224
1231
|
const {
|
|
1225
1232
|
unsubscribe
|
|
1226
|
-
} = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED, async
|
|
1227
|
-
|
|
1233
|
+
} = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SET_SERIES_METADATA_INVALIDATED, async _ref => {
|
|
1234
|
+
let {
|
|
1235
|
+
displaySetInstanceUID: invalidatedDisplaySetInstanceUID,
|
|
1236
|
+
invalidateData
|
|
1237
|
+
} = _ref;
|
|
1238
|
+
if (!invalidateData) {
|
|
1239
|
+
return;
|
|
1240
|
+
}
|
|
1241
|
+
const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
|
|
1228
1242
|
if (viewportInfo.hasDisplaySet(invalidatedDisplaySetInstanceUID)) {
|
|
1229
1243
|
const viewportData = viewportInfo.getViewportData();
|
|
1230
1244
|
const newViewportData = await cornerstoneCacheService.invalidateViewportData(viewportData, invalidatedDisplaySetInstanceUID, dataSource, displaySetService);
|
|
1231
1245
|
const keepCamera = true;
|
|
1232
|
-
cornerstoneViewportService.updateViewport(
|
|
1246
|
+
cornerstoneViewportService.updateViewport(viewportId, newViewportData, keepCamera);
|
|
1233
1247
|
}
|
|
1234
1248
|
});
|
|
1235
1249
|
return () => {
|
|
1236
1250
|
unsubscribe();
|
|
1237
1251
|
};
|
|
1238
|
-
}, [
|
|
1252
|
+
}, [viewportId]);
|
|
1239
1253
|
(0,react.useEffect)(() => {
|
|
1240
1254
|
// handle the default viewportType to be stack
|
|
1241
1255
|
if (!viewportOptions.viewportType) {
|
|
@@ -1259,13 +1273,23 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1259
1273
|
lutPresentation: lutPresentationStore[presentationIds?.lutPresentationId]
|
|
1260
1274
|
};
|
|
1261
1275
|
let measurement;
|
|
1262
|
-
if (cacheJumpToMeasurementEvent?.
|
|
1276
|
+
if (cacheJumpToMeasurementEvent?.viewportId === viewportId) {
|
|
1263
1277
|
measurement = cacheJumpToMeasurementEvent.measurement;
|
|
1264
1278
|
// Delete the position presentation so that viewport navigates direct
|
|
1265
1279
|
presentations.positionPresentation = null;
|
|
1266
1280
|
cacheJumpToMeasurementEvent = null;
|
|
1267
1281
|
}
|
|
1268
|
-
|
|
1282
|
+
|
|
1283
|
+
// Note: This is a hack to get the grid to re-render the OHIFCornerstoneViewport component
|
|
1284
|
+
// Used for segmentation hydration right now, since the logic to decide whether
|
|
1285
|
+
// a viewport needs to render a segmentation lives inside the CornerstoneViewportService
|
|
1286
|
+
// so we need to re-render (force update via change of the needsRerendering) so that React
|
|
1287
|
+
// does the diffing and decides we should render this again (although the id and element has not changed)
|
|
1288
|
+
// so that the CornerstoneViewportService can decide whether to render the segmentation or not. Not that we reached here we can turn it off.
|
|
1289
|
+
if (viewportOptions.needsRerendering) {
|
|
1290
|
+
viewportOptions.needsRerendering = false;
|
|
1291
|
+
}
|
|
1292
|
+
cornerstoneViewportService.setViewportData(viewportId, viewportData, viewportOptions, displaySetOptions, presentations);
|
|
1269
1293
|
if (measurement) {
|
|
1270
1294
|
esm.annotation.selection.setAnnotationSelected(measurement.uid);
|
|
1271
1295
|
}
|
|
@@ -1284,21 +1308,20 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1284
1308
|
* the cache for jumping to see if there is any jump queued, then we jump to the correct slice.
|
|
1285
1309
|
*/
|
|
1286
1310
|
(0,react.useEffect)(() => {
|
|
1287
|
-
|
|
1288
|
-
|
|
1311
|
+
if (isJumpToMeasurementDisabled) {
|
|
1312
|
+
return;
|
|
1313
|
+
}
|
|
1314
|
+
const unsubscribeFromJumpToMeasurementEvents = _subscribeToJumpToMeasurementEvents(measurementService, displaySetService, elementRef, viewportId, displaySets, viewportGridService, cornerstoneViewportService);
|
|
1315
|
+
_checkForCachedJumpToMeasurementEvents(measurementService, displaySetService, elementRef, viewportId, displaySets, viewportGridService, cornerstoneViewportService);
|
|
1289
1316
|
return () => {
|
|
1290
1317
|
unsubscribeFromJumpToMeasurementEvents();
|
|
1291
1318
|
};
|
|
1292
|
-
}, [displaySets, elementRef,
|
|
1319
|
+
}, [displaySets, elementRef, viewportId]);
|
|
1293
1320
|
return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
|
|
1294
1321
|
className: "viewport-wrapper"
|
|
1295
1322
|
}, /*#__PURE__*/react.createElement(index_esm/* default */.ZP, {
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
skipOnMount: true // Todo: make these configurable
|
|
1299
|
-
,
|
|
1300
|
-
refreshMode: 'debounce',
|
|
1301
|
-
refreshRate: 200 // transition amount in side panel
|
|
1323
|
+
refreshMode: "debounce",
|
|
1324
|
+
refreshRate: 50 // Wait 50 ms after last move to render
|
|
1302
1325
|
,
|
|
1303
1326
|
onResize: onResize,
|
|
1304
1327
|
targetRef: elementRef.current
|
|
@@ -1312,26 +1335,18 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1312
1335
|
onMouseDown: e => e.preventDefault(),
|
|
1313
1336
|
ref: elementRef
|
|
1314
1337
|
}), /*#__PURE__*/react.createElement(Overlays_CornerstoneOverlays, {
|
|
1315
|
-
|
|
1338
|
+
viewportId: viewportId,
|
|
1316
1339
|
toolBarService: toolbarService,
|
|
1317
1340
|
element: elementRef.current,
|
|
1318
1341
|
scrollbarHeight: scrollbarHeight,
|
|
1319
1342
|
servicesManager: servicesManager
|
|
1320
|
-
}),
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
onPlayPauseChange: isPlaying => cineService.setCine({
|
|
1325
|
-
id: activeViewportIndex,
|
|
1326
|
-
isPlaying
|
|
1327
|
-
}),
|
|
1328
|
-
onFrameRateChange: frameRate => cineService.setCine({
|
|
1329
|
-
id: activeViewportIndex,
|
|
1330
|
-
frameRate
|
|
1331
|
-
})
|
|
1343
|
+
}), /*#__PURE__*/react.createElement(components_CinePlayer, {
|
|
1344
|
+
enabledVPElement: enabledVPElement,
|
|
1345
|
+
viewportId: viewportId,
|
|
1346
|
+
servicesManager: servicesManager
|
|
1332
1347
|
})), /*#__PURE__*/react.createElement("div", {
|
|
1333
1348
|
className: "absolute w-full"
|
|
1334
|
-
}, viewportDialogState.
|
|
1349
|
+
}, viewportDialogState.viewportId === viewportId && /*#__PURE__*/react.createElement(ui_src/* Notification */.P_, {
|
|
1335
1350
|
id: "viewport-notification",
|
|
1336
1351
|
message: viewportDialogState.message,
|
|
1337
1352
|
type: viewportDialogState.type,
|
|
@@ -1340,41 +1355,46 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
|
|
|
1340
1355
|
onOutsideClick: viewportDialogState.onOutsideClick
|
|
1341
1356
|
})));
|
|
1342
1357
|
}, areEqual);
|
|
1343
|
-
function _subscribeToJumpToMeasurementEvents(measurementService, displaySetService, elementRef,
|
|
1344
|
-
const displaysUIDs = displaySets.map(displaySet => displaySet.displaySetInstanceUID);
|
|
1358
|
+
function _subscribeToJumpToMeasurementEvents(measurementService, displaySetService, elementRef, viewportId, displaySets, viewportGridService, cornerstoneViewportService) {
|
|
1345
1359
|
const {
|
|
1346
1360
|
unsubscribe
|
|
1347
1361
|
} = measurementService.subscribe(src.MeasurementService.EVENTS.JUMP_TO_MEASUREMENT_VIEWPORT, props => {
|
|
1348
1362
|
cacheJumpToMeasurementEvent = props;
|
|
1349
1363
|
const {
|
|
1350
|
-
|
|
1364
|
+
viewportId: jumpId,
|
|
1351
1365
|
measurement,
|
|
1352
1366
|
isConsumed
|
|
1353
1367
|
} = props;
|
|
1354
|
-
if (!measurement || isConsumed)
|
|
1368
|
+
if (!measurement || isConsumed) {
|
|
1369
|
+
return;
|
|
1370
|
+
}
|
|
1355
1371
|
if (cacheJumpToMeasurementEvent.cornerstoneViewport === undefined) {
|
|
1356
1372
|
// Decide on which viewport should handle this
|
|
1357
|
-
cacheJumpToMeasurementEvent.cornerstoneViewport = cornerstoneViewportService.
|
|
1373
|
+
cacheJumpToMeasurementEvent.cornerstoneViewport = cornerstoneViewportService.getViewportIdToJump(jumpId, measurement.displaySetInstanceUID, {
|
|
1358
1374
|
referencedImageId: measurement.referencedImageId
|
|
1359
1375
|
});
|
|
1360
1376
|
}
|
|
1361
|
-
if (cacheJumpToMeasurementEvent.cornerstoneViewport !==
|
|
1377
|
+
if (cacheJumpToMeasurementEvent.cornerstoneViewport !== viewportId) {
|
|
1362
1378
|
return;
|
|
1363
1379
|
}
|
|
1364
|
-
_jumpToMeasurement(measurement, elementRef,
|
|
1380
|
+
_jumpToMeasurement(measurement, elementRef, viewportId, measurementService, displaySetService, viewportGridService, cornerstoneViewportService);
|
|
1365
1381
|
});
|
|
1366
1382
|
return unsubscribe;
|
|
1367
1383
|
}
|
|
1368
1384
|
|
|
1369
1385
|
// Check if there is a queued jumpToMeasurement event
|
|
1370
|
-
function _checkForCachedJumpToMeasurementEvents(measurementService, displaySetService, elementRef,
|
|
1371
|
-
if (!cacheJumpToMeasurementEvent)
|
|
1386
|
+
function _checkForCachedJumpToMeasurementEvents(measurementService, displaySetService, elementRef, viewportId, displaySets, viewportGridService, cornerstoneViewportService) {
|
|
1387
|
+
if (!cacheJumpToMeasurementEvent) {
|
|
1388
|
+
return;
|
|
1389
|
+
}
|
|
1372
1390
|
if (cacheJumpToMeasurementEvent.isConsumed) {
|
|
1373
1391
|
cacheJumpToMeasurementEvent = null;
|
|
1374
1392
|
return;
|
|
1375
1393
|
}
|
|
1376
1394
|
const displaysUIDs = displaySets.map(displaySet => displaySet.displaySetInstanceUID);
|
|
1377
|
-
if (!displaysUIDs?.length)
|
|
1395
|
+
if (!displaysUIDs?.length) {
|
|
1396
|
+
return;
|
|
1397
|
+
}
|
|
1378
1398
|
|
|
1379
1399
|
// Jump to measurement if the measurement exists
|
|
1380
1400
|
const {
|
|
@@ -1382,11 +1402,11 @@ function _checkForCachedJumpToMeasurementEvents(measurementService, displaySetSe
|
|
|
1382
1402
|
} = cacheJumpToMeasurementEvent;
|
|
1383
1403
|
if (measurement && elementRef) {
|
|
1384
1404
|
if (displaysUIDs.includes(measurement?.displaySetInstanceUID)) {
|
|
1385
|
-
_jumpToMeasurement(measurement, elementRef,
|
|
1405
|
+
_jumpToMeasurement(measurement, elementRef, viewportId, measurementService, displaySetService, viewportGridService, cornerstoneViewportService);
|
|
1386
1406
|
}
|
|
1387
1407
|
}
|
|
1388
1408
|
}
|
|
1389
|
-
function _jumpToMeasurement(measurement, targetElementRef,
|
|
1409
|
+
function _jumpToMeasurement(measurement, targetElementRef, viewportId, measurementService, displaySetService, viewportGridService, cornerstoneViewportService) {
|
|
1390
1410
|
const targetElement = targetElementRef.current;
|
|
1391
1411
|
const {
|
|
1392
1412
|
displaySetInstanceUID,
|
|
@@ -1403,9 +1423,8 @@ function _jumpToMeasurement(measurement, targetElementRef, viewportIndex, measur
|
|
|
1403
1423
|
// to set it properly
|
|
1404
1424
|
// setCornerstoneMeasurementActive(measurement);
|
|
1405
1425
|
|
|
1406
|
-
viewportGridService.
|
|
1426
|
+
viewportGridService.setActiveViewportId(viewportId);
|
|
1407
1427
|
const enabledElement = (0,dist_esm.getEnabledElement)(targetElement);
|
|
1408
|
-
const viewportInfo = cornerstoneViewportService.getViewportInfoByIndex(viewportIndex);
|
|
1409
1428
|
if (enabledElement) {
|
|
1410
1429
|
// See how the jumpToSlice() of Cornerstone3D deals with imageIdx param.
|
|
1411
1430
|
const viewport = enabledElement.viewport;
|
|
@@ -1451,14 +1470,17 @@ function _jumpToMeasurement(measurement, targetElementRef, viewportIndex, measur
|
|
|
1451
1470
|
|
|
1452
1471
|
// Component displayName
|
|
1453
1472
|
OHIFCornerstoneViewport.displayName = 'OHIFCornerstoneViewport';
|
|
1473
|
+
OHIFCornerstoneViewport.defaultProps = {
|
|
1474
|
+
isJumpToMeasurementDisabled: false
|
|
1475
|
+
};
|
|
1454
1476
|
OHIFCornerstoneViewport.propTypes = {
|
|
1455
|
-
viewportIndex: (prop_types_default()).number.isRequired,
|
|
1456
1477
|
displaySets: (prop_types_default()).array.isRequired,
|
|
1457
1478
|
dataSource: (prop_types_default()).object.isRequired,
|
|
1458
1479
|
viewportOptions: (prop_types_default()).object,
|
|
1459
1480
|
displaySetOptions: prop_types_default().arrayOf((prop_types_default()).any),
|
|
1460
1481
|
servicesManager: (prop_types_default()).object.isRequired,
|
|
1461
1482
|
onElementEnabled: (prop_types_default()).func,
|
|
1483
|
+
isJumpToMeasurementDisabled: (prop_types_default()).bool,
|
|
1462
1484
|
// Note: you SHOULD NOT use the initialImageIdOrIndex for manipulation
|
|
1463
1485
|
// of the imageData in the OHIFCornerstoneViewport. This prop is used
|
|
1464
1486
|
// to set the initial state of the viewport's first image to render
|