@ohif/app 3.13.0-beta.60 → 3.13.0-beta.62
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/{1608.bundle.e4aadbf17d38143dacdf.js → 1608.bundle.26306ea38618db59eff7.js} +4 -4
- package/dist/{1933.bundle.0055c536e1392867e57c.js → 1933.bundle.b85b2c09cb38bfe525c8.js} +2 -2
- package/dist/{2701.bundle.b591cf6385ed53ed6093.js → 2701.bundle.6873805ddfdccc7a8b1e.js} +4 -4
- package/dist/{2851.bundle.c5202066974b96955c28.js → 2851.bundle.f2ef0e59c90ecae3ec6d.js} +8 -8
- package/dist/{3138.bundle.5ed994e6e0ff7c720a75.js → 3138.bundle.41185469baddbf8dc88e.js} +4 -4
- package/dist/{3461.bundle.54f8d64ed1965c14ec4c.js → 3461.bundle.4e65e35db35197640fca.js} +2 -2
- package/dist/{147.bundle.173b4a11960d03a3b5b0.js → 3754.bundle.fd4b67c2a29c4bc4a840.js} +468 -7
- package/dist/{4202.bundle.850a7c7c011800b3daea.js → 4202.bundle.4fcd0de412907efd5b53.js} +2 -2
- package/dist/{4819.bundle.fb82fcc8360f4883691e.js → 4819.bundle.b283f2273a6d729e511a.js} +6 -6
- package/dist/{5015.bundle.dda760490cf19777b6b3.js → 5015.bundle.b9007d1ae37eb4b47785.js} +2 -2
- package/dist/{5028.bundle.494b6ca9e0f5567c26e2.js → 5028.bundle.8ebee6d983e1cb25ab85.js} +2 -2
- package/dist/{5802.bundle.41cf74cda9aad21601e8.js → 5802.bundle.26f84db0ff8851532c36.js} +2 -2
- package/dist/{4688.bundle.e23f20a556dca69540fd.js → 7166.bundle.60777e0340f8d582f7f8.js} +92 -11
- package/dist/{8305.bundle.21d4c7deff19f6ce9a6a.js → 8305.bundle.0944af795576bd91a806.js} +4 -4
- package/dist/{8499.bundle.dbeca38ee1d1471ce4d8.js → 8499.bundle.47932ca776595df65b4b.js} +2 -2
- package/dist/{8558.bundle.5c64a061bf4d5d5f6d7a.js → 8558.bundle.b2036822309d404ad769.js} +1 -1
- package/dist/{8583.bundle.a0ccedd0799600ad5fad.js → 8583.bundle.b37288f14cbfea977799.js} +4 -4
- package/dist/{9845.bundle.267831496ba080d9f8da.js → 9845.bundle.8c450e8d65a78a5afcd3.js} +4 -4
- package/dist/{9862.bundle.09783830f0cb75a84d2a.js → 9862.bundle.a5f7925840868fa4ecdb.js} +2 -2
- package/dist/{app.bundle.348a74b1a7aeb7c8d0a8.js → app.bundle.37580f8dff7a4aed2b5e.js} +408 -289
- package/dist/app.bundle.css +1 -1
- package/dist/index.html +1 -1
- package/dist/sw.js +1 -1
- package/package.json +20 -20
- /package/dist/{1459.bundle.ed7323f44e4ff4ecd69a.js → 1459.bundle.fe8a27b3ab8d81acf531.js} +0 -0
- /package/dist/{2018.bundle.ab8f9ceeae0e18eb303b.js → 2018.bundle.33dcbba4f0e42c4d0e80.js} +0 -0
- /package/dist/{213.bundle.18a8b5a1e2f00de7feaf.js → 213.bundle.b88aa2399af43a92c936.js} +0 -0
- /package/dist/{2424.bundle.5e858661a06aa36dd859.js → 2424.bundle.1b0725fbca0d4ca29899.js} +0 -0
- /package/dist/{147.css → 3754.css} +0 -0
- /package/dist/{4507.bundle.18379f328211aee3aba5.js → 4507.bundle.aedc64a2499473464afe.js} +0 -0
- /package/dist/{5457.bundle.328f29b05df8d287491b.js → 5457.bundle.e78f9e3ae0ecf2370b1d.js} +0 -0
- /package/dist/{5485.bundle.53614f38e6ee0e052bdc.js → 5485.bundle.0f65f0f4e253e43861ed.js} +0 -0
- /package/dist/{6027.bundle.1bfe806a0cb494dfc265.js → 6027.bundle.5fe4e273f5ec1bce93f9.js} +0 -0
- /package/dist/{7639.bundle.2ec2272d8eb08df56b66.js → 7639.bundle.b0c86e002ca3437d2eea.js} +0 -0
- /package/dist/{85.bundle.e426258a9ad5bcf9bb3e.js → 85.bundle.957c7bbd1aaf98624ccb.js} +0 -0
- /package/dist/{9927.bundle.3bdd61e78a710e09cc0b.js → 9927.bundle.68b7b79a98f21334958e.js} +0 -0
|
@@ -17,10 +17,10 @@ var react = __webpack_require__(86326);
|
|
|
17
17
|
// EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
|
|
18
18
|
var prop_types = __webpack_require__(97598);
|
|
19
19
|
var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
|
|
20
|
-
// EXTERNAL MODULE: ../../ui-next/src/index.ts +
|
|
21
|
-
var src = __webpack_require__(
|
|
22
|
-
// EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx +
|
|
23
|
-
var cornerstone_src = __webpack_require__(
|
|
20
|
+
// EXTERNAL MODULE: ../../ui-next/src/index.ts + 3085 modules
|
|
21
|
+
var src = __webpack_require__(564);
|
|
22
|
+
// EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 197 modules
|
|
23
|
+
var cornerstone_src = __webpack_require__(87166);
|
|
24
24
|
;// ../../../extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts
|
|
25
25
|
|
|
26
26
|
function promptHydrateRT({
|
|
@@ -18,8 +18,8 @@ const id = package_namespaceObject.UU;
|
|
|
18
18
|
|
|
19
19
|
// EXTERNAL MODULE: ../../../node_modules/react/index.js
|
|
20
20
|
var react = __webpack_require__(86326);
|
|
21
|
-
// EXTERNAL MODULE: ../../ui-next/src/index.ts +
|
|
22
|
-
var src = __webpack_require__(
|
|
21
|
+
// EXTERNAL MODULE: ../../ui-next/src/index.ts + 3085 modules
|
|
22
|
+
var src = __webpack_require__(564);
|
|
23
23
|
// EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 140 modules
|
|
24
24
|
var default_src = __webpack_require__(62851);
|
|
25
25
|
// EXTERNAL MODULE: ../../core/src/index.ts + 69 modules
|
|
@@ -23,10 +23,10 @@ var src = __webpack_require__(42356);
|
|
|
23
23
|
var dicomSRModule = __webpack_require__(76654);
|
|
24
24
|
// EXTERNAL MODULE: ../../../extensions/cornerstone-dicom-sr/src/utils/createReferencedImageDisplaySet.ts
|
|
25
25
|
var createReferencedImageDisplaySet = __webpack_require__(92643);
|
|
26
|
-
// EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx +
|
|
27
|
-
var cornerstone_src = __webpack_require__(
|
|
28
|
-
// EXTERNAL MODULE: ../../ui-next/src/index.ts +
|
|
29
|
-
var ui_next_src = __webpack_require__(
|
|
26
|
+
// EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 197 modules
|
|
27
|
+
var cornerstone_src = __webpack_require__(87166);
|
|
28
|
+
// EXTERNAL MODULE: ../../ui-next/src/index.ts + 3085 modules
|
|
29
|
+
var ui_next_src = __webpack_require__(564);
|
|
30
30
|
// EXTERNAL MODULE: ../../core/src/contextProviders/SystemProvider.tsx
|
|
31
31
|
var SystemProvider = __webpack_require__(83641);
|
|
32
32
|
;// ../../../extensions/cornerstone-dicom-sr/src/components/OHIFCornerstoneSRMeasurementViewport.tsx
|
|
@@ -8,7 +8,7 @@
|
|
|
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__(564);
|
|
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
|
|
|
@@ -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 + 3085 modules
|
|
127
|
+
var src = __webpack_require__(564);
|
|
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
|
|
@@ -618,7 +618,7 @@ function _findTabAndStudyOfDisplaySet(displaySetInstanceUID, tabs, currentTabNam
|
|
|
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__(564);
|
|
622
622
|
|
|
623
623
|
|
|
624
624
|
|
|
@@ -3789,8 +3789,8 @@ var react = __webpack_require__(86326);
|
|
|
3789
3789
|
// EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
|
|
3790
3790
|
var prop_types = __webpack_require__(97598);
|
|
3791
3791
|
var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
|
|
3792
|
-
// EXTERNAL MODULE: ../../ui-next/src/index.ts +
|
|
3793
|
-
var ui_next_src = __webpack_require__(
|
|
3792
|
+
// EXTERNAL MODULE: ../../ui-next/src/index.ts + 3085 modules
|
|
3793
|
+
var ui_next_src = __webpack_require__(564);
|
|
3794
3794
|
// EXTERNAL MODULE: ./state/index.js + 1 modules
|
|
3795
3795
|
var state = __webpack_require__(45981);
|
|
3796
3796
|
// EXTERNAL MODULE: ../../../node_modules/react-router-dom/dist/index.js
|
|
@@ -10604,8 +10604,8 @@ function AboutModalDefault() {
|
|
|
10604
10604
|
name
|
|
10605
10605
|
} = (0,browser_detect_es5/* default */.A)();
|
|
10606
10606
|
const browser = `${name[0].toUpperCase()}${name.substr(1)} ${version}`;
|
|
10607
|
-
const versionNumber = "3.13.0-beta.
|
|
10608
|
-
const commitHash = "
|
|
10607
|
+
const versionNumber = "3.13.0-beta.62";
|
|
10608
|
+
const commitHash = "1fc97fea43cc5e6689bd0076b77a278c67252af7";
|
|
10609
10609
|
const [main, beta] = versionNumber.split('-');
|
|
10610
10610
|
return /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU, {
|
|
10611
10611
|
className: "w-[400px]"
|
|
@@ -671,8 +671,8 @@ const commandsModule = ({
|
|
|
671
671
|
/* harmony default export */ const src_commandsModule = (commandsModule);
|
|
672
672
|
// EXTERNAL MODULE: ../../../node_modules/react/index.js
|
|
673
673
|
var react = __webpack_require__(86326);
|
|
674
|
-
// EXTERNAL MODULE: ../../ui-next/src/index.ts +
|
|
675
|
-
var ui_next_src = __webpack_require__(
|
|
674
|
+
// EXTERNAL MODULE: ../../ui-next/src/index.ts + 3085 modules
|
|
675
|
+
var ui_next_src = __webpack_require__(564);
|
|
676
676
|
;// ../../../extensions/cornerstone-dynamic-volume/src/panels/DynamicVolumeControls.tsx
|
|
677
677
|
|
|
678
678
|
|
|
@@ -1121,8 +1121,8 @@ function WorkflowPanel({
|
|
|
1121
1121
|
|
|
1122
1122
|
// EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 140 modules
|
|
1123
1123
|
var default_src = __webpack_require__(62851);
|
|
1124
|
-
// EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx +
|
|
1125
|
-
var cornerstone_src = __webpack_require__(
|
|
1124
|
+
// EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 197 modules
|
|
1125
|
+
var cornerstone_src = __webpack_require__(87166);
|
|
1126
1126
|
;// ../../../extensions/cornerstone-dynamic-volume/src/panels/DynamicExport.tsx
|
|
1127
1127
|
|
|
1128
1128
|
|
|
@@ -72,8 +72,8 @@ var react = __webpack_require__(86326);
|
|
|
72
72
|
var src = __webpack_require__(42356);
|
|
73
73
|
// EXTERNAL MODULE: ../../i18n/src/index.js + 286 modules
|
|
74
74
|
var i18n_src = __webpack_require__(89010);
|
|
75
|
-
// EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx +
|
|
76
|
-
var cornerstone_src = __webpack_require__(
|
|
75
|
+
// EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 197 modules
|
|
76
|
+
var cornerstone_src = __webpack_require__(87166);
|
|
77
77
|
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/adapters/dist/esm/index.js + 72 modules
|
|
78
78
|
var esm = __webpack_require__(64579);
|
|
79
79
|
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[
|
|
2
|
+
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[3754],{
|
|
3
3
|
|
|
4
|
-
/***/
|
|
4
|
+
/***/ 33754
|
|
5
5
|
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
6
6
|
|
|
7
7
|
// ESM COMPAT FLAG
|
|
@@ -18,8 +18,8 @@ var react = __webpack_require__(86326);
|
|
|
18
18
|
var esm = __webpack_require__(15327);
|
|
19
19
|
// EXTERNAL MODULE: ../../core/src/index.ts + 69 modules
|
|
20
20
|
var src = __webpack_require__(42356);
|
|
21
|
-
// EXTERNAL MODULE: ../../ui-next/src/index.ts +
|
|
22
|
-
var ui_next_src = __webpack_require__(
|
|
21
|
+
// EXTERNAL MODULE: ../../ui-next/src/index.ts + 3085 modules
|
|
22
|
+
var ui_next_src = __webpack_require__(564);
|
|
23
23
|
// EXTERNAL MODULE: ../../../extensions/cornerstone/src/state.ts
|
|
24
24
|
var state = __webpack_require__(71353);
|
|
25
25
|
;// ../../../extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.css
|
|
@@ -132,6 +132,456 @@ CornerstoneImageScrollbar.propTypes = {
|
|
|
132
132
|
servicesManager: (prop_types_default()).object.isRequired
|
|
133
133
|
};
|
|
134
134
|
/* harmony default export */ const ViewportImageScrollbar = (CornerstoneImageScrollbar);
|
|
135
|
+
;// ../../../extensions/cornerstone/src/Viewport/Overlays/ViewportSliceProgressScrollbar/helpers.ts
|
|
136
|
+
|
|
137
|
+
function getImageIndexFromEvent(event) {
|
|
138
|
+
const {
|
|
139
|
+
imageIndex,
|
|
140
|
+
newImageIdIndex = imageIndex,
|
|
141
|
+
imageIdIndex
|
|
142
|
+
} = event.detail;
|
|
143
|
+
return newImageIdIndex ?? imageIdIndex;
|
|
144
|
+
}
|
|
145
|
+
function getViewportImageIds(viewportData) {
|
|
146
|
+
if (!viewportData?.data?.length) {
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
const firstData = viewportData.data[0];
|
|
150
|
+
const volumeImageIds = firstData.volume?.imageIds;
|
|
151
|
+
const datumImageIds = firstData.imageIds;
|
|
152
|
+
return volumeImageIds || datumImageIds || [];
|
|
153
|
+
}
|
|
154
|
+
function isProgressFullMode(viewportData, viewport) {
|
|
155
|
+
if (!viewportData || !viewport || viewport instanceof esm.VolumeViewport3D) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
if (viewportData.viewportType === esm.Enums.ViewportType.STACK) {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
if (viewportData.viewportType === esm.Enums.ViewportType.ORTHOGRAPHIC) {
|
|
162
|
+
return !!viewport.isInAcquisitionPlane?.();
|
|
163
|
+
}
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
function getImageIdFromCacheEvent(event) {
|
|
167
|
+
const detail = event?.detail;
|
|
168
|
+
return detail?.imageId || detail?.image?.imageId || detail?.cachedImage?.imageId;
|
|
169
|
+
}
|
|
170
|
+
;// ../../../extensions/cornerstone/src/Viewport/Overlays/ViewportSliceProgressScrollbar/hooks.ts
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
function useProgressScrollbarMode({
|
|
176
|
+
viewportData,
|
|
177
|
+
viewportId,
|
|
178
|
+
element,
|
|
179
|
+
cornerstoneViewportService
|
|
180
|
+
}) {
|
|
181
|
+
const [isFullMode, setIsFullMode] = (0,react.useState)(false);
|
|
182
|
+
const lastViewPlaneNormalRef = (0,react.useRef)(null);
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Tracks whether this viewport should render full progress UI (stack or acquisition-plane
|
|
186
|
+
* orthographic volume) versus minimal UI. We compute once on setup and recompute on each
|
|
187
|
+
* CAMERA_MODIFIED event so stack->MPR transitions and acquisition-plane changes are reflected
|
|
188
|
+
* immediately.
|
|
189
|
+
*/
|
|
190
|
+
(0,react.useEffect)(() => {
|
|
191
|
+
if (!viewportData) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const updateMode = () => {
|
|
195
|
+
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
|
196
|
+
const viewportImageData = viewport?.getImageData?.();
|
|
197
|
+
const nextViewPlaneNormal = viewport?.getCamera?.()?.viewPlaneNormal;
|
|
198
|
+
// Do not update the lastViewPlaneNormalRef until we have a valid viewportImageData.
|
|
199
|
+
// Without viewportImageData, the viewport is not fully initialized and the isAcquisitionPlane
|
|
200
|
+
// check will not be accurate.
|
|
201
|
+
if (viewportImageData && nextViewPlaneNormal) {
|
|
202
|
+
lastViewPlaneNormalRef.current = [...nextViewPlaneNormal];
|
|
203
|
+
}
|
|
204
|
+
const nextMode = isProgressFullMode(viewportData, viewport);
|
|
205
|
+
setIsFullMode(prevMode => prevMode === nextMode ? prevMode : nextMode);
|
|
206
|
+
};
|
|
207
|
+
updateMode();
|
|
208
|
+
const onCameraModified = () => {
|
|
209
|
+
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
|
210
|
+
const nextViewPlaneNormal = viewport?.getCamera?.()?.viewPlaneNormal;
|
|
211
|
+
const previousViewPlaneNormal = lastViewPlaneNormalRef.current;
|
|
212
|
+
|
|
213
|
+
// Ignore camera updates that keep the same orientation (pan/zoom/scroll).
|
|
214
|
+
if (nextViewPlaneNormal && previousViewPlaneNormal) {
|
|
215
|
+
if (esm.utilities.isEqual(nextViewPlaneNormal, previousViewPlaneNormal)) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
updateMode();
|
|
220
|
+
};
|
|
221
|
+
element.addEventListener(esm.Enums.Events.CAMERA_MODIFIED, onCameraModified);
|
|
222
|
+
return () => {
|
|
223
|
+
element.removeEventListener(esm.Enums.Events.CAMERA_MODIFIED, onCameraModified);
|
|
224
|
+
};
|
|
225
|
+
}, [viewportData, viewportId, cornerstoneViewportService, element]);
|
|
226
|
+
return isFullMode;
|
|
227
|
+
}
|
|
228
|
+
function useViewportSliceSync({
|
|
229
|
+
viewportData,
|
|
230
|
+
viewportId,
|
|
231
|
+
element,
|
|
232
|
+
cornerstoneViewportService,
|
|
233
|
+
setImageSliceData
|
|
234
|
+
}) {
|
|
235
|
+
/**
|
|
236
|
+
* Keeps shared slice state in sync: first initialize from the live viewport snapshot, then
|
|
237
|
+
* subscribe to navigation/render events for incremental updates while users scroll.
|
|
238
|
+
*/
|
|
239
|
+
(0,react.useEffect)(() => {
|
|
240
|
+
if (!viewportData) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
|
244
|
+
if (viewport && !(viewport instanceof esm.VolumeViewport3D)) {
|
|
245
|
+
try {
|
|
246
|
+
const currentImageIndex = viewport.getCurrentImageIdIndex();
|
|
247
|
+
const currentNumberOfSlices = viewport.getNumberOfSlices();
|
|
248
|
+
setImageSliceData({
|
|
249
|
+
imageIndex: currentImageIndex,
|
|
250
|
+
numberOfSlices: currentNumberOfSlices
|
|
251
|
+
});
|
|
252
|
+
} catch (error) {
|
|
253
|
+
console.warn(error);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
const {
|
|
257
|
+
viewportType
|
|
258
|
+
} = viewportData;
|
|
259
|
+
const eventId = viewportType === esm.Enums.ViewportType.STACK && esm.Enums.Events.STACK_NEW_IMAGE || viewportType === esm.Enums.ViewportType.ORTHOGRAPHIC && esm.Enums.Events.VOLUME_NEW_IMAGE || esm.Enums.Events.IMAGE_RENDERED;
|
|
260
|
+
const updateIndex = event => {
|
|
261
|
+
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
|
262
|
+
if (!viewport || viewport instanceof esm.VolumeViewport3D) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
const nextImageIndex = getImageIndexFromEvent(event);
|
|
266
|
+
if (nextImageIndex == null) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const nextNumberOfSlices = viewport.getNumberOfSlices();
|
|
270
|
+
setImageSliceData({
|
|
271
|
+
imageIndex: nextImageIndex,
|
|
272
|
+
numberOfSlices: nextNumberOfSlices
|
|
273
|
+
});
|
|
274
|
+
};
|
|
275
|
+
element.addEventListener(eventId, updateIndex);
|
|
276
|
+
return () => {
|
|
277
|
+
element.removeEventListener(eventId, updateIndex);
|
|
278
|
+
};
|
|
279
|
+
}, [viewportData, element, viewportId, cornerstoneViewportService, setImageSliceData]);
|
|
280
|
+
}
|
|
281
|
+
function useLoadedSliceBytes({
|
|
282
|
+
isFullMode,
|
|
283
|
+
numberOfSlices,
|
|
284
|
+
viewportData,
|
|
285
|
+
imageIds,
|
|
286
|
+
imageIdToIndex,
|
|
287
|
+
loadedBatchIntervalMs
|
|
288
|
+
}) {
|
|
289
|
+
const loadedState = (0,ui_next_src/* useByteArray */.Pcq)(numberOfSlices || 0, loadedBatchIntervalMs);
|
|
290
|
+
const {
|
|
291
|
+
resetWith: resetLoaded,
|
|
292
|
+
setByte: setLoadedByte,
|
|
293
|
+
clearByte: clearLoadedByte
|
|
294
|
+
} = loadedState;
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Keeps the loaded byte array in sync with Cornerstone cache: seed from cache whenever stack /
|
|
298
|
+
* mode / slice count changes, then subscribe so cache add/remove updates stay incremental.
|
|
299
|
+
* Seeding runs immediately before registering listeners in the same effect.
|
|
300
|
+
*/
|
|
301
|
+
(0,react.useEffect)(() => {
|
|
302
|
+
if (isFullMode && numberOfSlices) {
|
|
303
|
+
resetLoaded(bytes => {
|
|
304
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
305
|
+
const imageId = imageIds[i];
|
|
306
|
+
if (imageId && esm.cache.isLoaded(imageId)) {
|
|
307
|
+
bytes[i] = 1;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
if (!isFullMode || !viewportData) {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
const markLoaded = event => {
|
|
316
|
+
const imageId = getImageIdFromCacheEvent(event);
|
|
317
|
+
if (!imageId) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
const index = imageIdToIndex.get(imageId);
|
|
321
|
+
if (index !== undefined) {
|
|
322
|
+
setLoadedByte(index);
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
const markRemoved = event => {
|
|
326
|
+
const imageId = getImageIdFromCacheEvent(event);
|
|
327
|
+
if (!imageId) {
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
const index = imageIdToIndex.get(imageId);
|
|
331
|
+
if (index !== undefined) {
|
|
332
|
+
clearLoadedByte(index);
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
esm.eventTarget.addEventListener(esm.Enums.Events.IMAGE_CACHE_IMAGE_ADDED, markLoaded);
|
|
336
|
+
esm.eventTarget.addEventListener(esm.Enums.Events.IMAGE_CACHE_IMAGE_REMOVED, markRemoved);
|
|
337
|
+
return () => {
|
|
338
|
+
esm.eventTarget.removeEventListener(esm.Enums.Events.IMAGE_CACHE_IMAGE_ADDED, markLoaded);
|
|
339
|
+
esm.eventTarget.removeEventListener(esm.Enums.Events.IMAGE_CACHE_IMAGE_REMOVED, markRemoved);
|
|
340
|
+
};
|
|
341
|
+
}, [imageIds, isFullMode, numberOfSlices, viewportData, imageIdToIndex, resetLoaded, setLoadedByte, clearLoadedByte]);
|
|
342
|
+
return loadedState;
|
|
343
|
+
}
|
|
344
|
+
function useViewedSliceBytes({
|
|
345
|
+
isFullMode,
|
|
346
|
+
numberOfSlices,
|
|
347
|
+
imageIndex,
|
|
348
|
+
imageIds,
|
|
349
|
+
imageIdToIndex,
|
|
350
|
+
viewedDwellMs,
|
|
351
|
+
viewedDataService
|
|
352
|
+
}) {
|
|
353
|
+
const viewedState = (0,ui_next_src/* useByteArray */.Pcq)(numberOfSlices || 0);
|
|
354
|
+
const {
|
|
355
|
+
resetWith: resetViewed,
|
|
356
|
+
setByte: setViewedByte
|
|
357
|
+
} = viewedState;
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Keeps the viewed byte array in sync with the global viewed-data store: seed from the store
|
|
361
|
+
* whenever stack / mode / slice count changes, then subscribe so `markDataViewed` updates stay
|
|
362
|
+
* incremental. Seeding runs immediately before registering the listener in the same effect.
|
|
363
|
+
*/
|
|
364
|
+
(0,react.useEffect)(() => {
|
|
365
|
+
if (isFullMode && numberOfSlices) {
|
|
366
|
+
resetViewed(bytes => {
|
|
367
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
368
|
+
const imageId = imageIds[i];
|
|
369
|
+
if (imageId && viewedDataService?.isDataViewed(imageId)) {
|
|
370
|
+
bytes[i] = 1;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
if (!viewedDataService) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
const subscription = viewedDataService.subscribeViewedDataChanges(({
|
|
379
|
+
viewedDataId,
|
|
380
|
+
viewedDataCleared
|
|
381
|
+
}) => {
|
|
382
|
+
if (!isFullMode || !numberOfSlices) {
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
if (viewedDataCleared) {
|
|
386
|
+
resetViewed(bytes => {
|
|
387
|
+
bytes.fill(0);
|
|
388
|
+
});
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
const index = imageIdToIndex.get(viewedDataId);
|
|
392
|
+
if (index !== undefined) {
|
|
393
|
+
setViewedByte(index);
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
return () => {
|
|
397
|
+
subscription.unsubscribe();
|
|
398
|
+
};
|
|
399
|
+
}, [imageIds, isFullMode, numberOfSlices, imageIdToIndex, resetViewed, setViewedByte, viewedDataService]);
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* Marks slices as viewed in full mode. With `viewedDwellMs === 0`, marking is immediate on
|
|
403
|
+
* index change; otherwise a dwell timer is used and cleaned up on subsequent changes/unmount.
|
|
404
|
+
*/
|
|
405
|
+
(0,react.useEffect)(() => {
|
|
406
|
+
if (!isFullMode || !numberOfSlices) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
const markViewed = targetIndex => {
|
|
410
|
+
setViewedByte(targetIndex);
|
|
411
|
+
const imageId = imageIds[targetIndex];
|
|
412
|
+
if (imageId) {
|
|
413
|
+
viewedDataService?.markDataViewed(imageId);
|
|
414
|
+
}
|
|
415
|
+
};
|
|
416
|
+
if (viewedDwellMs === 0) {
|
|
417
|
+
markViewed(imageIndex || 0);
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
const timerId = window.setTimeout(() => {
|
|
421
|
+
markViewed(imageIndex || 0);
|
|
422
|
+
}, viewedDwellMs);
|
|
423
|
+
return () => {
|
|
424
|
+
window.clearTimeout(timerId);
|
|
425
|
+
};
|
|
426
|
+
}, [isFullMode, numberOfSlices, imageIndex, imageIds, setViewedByte, viewedDwellMs, viewedDataService]);
|
|
427
|
+
return viewedState;
|
|
428
|
+
}
|
|
429
|
+
;// ../../../extensions/cornerstone/src/Viewport/Overlays/ViewportSliceProgressScrollbar/ViewportSliceProgressScrollbar.tsx
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
function ViewportSliceProgressScrollbar({
|
|
437
|
+
viewportData,
|
|
438
|
+
viewportId,
|
|
439
|
+
element,
|
|
440
|
+
imageSliceData,
|
|
441
|
+
setImageSliceData,
|
|
442
|
+
servicesManager
|
|
443
|
+
}) {
|
|
444
|
+
const {
|
|
445
|
+
cineService,
|
|
446
|
+
cornerstoneViewportService,
|
|
447
|
+
customizationService,
|
|
448
|
+
viewedDataService
|
|
449
|
+
} = servicesManager.services;
|
|
450
|
+
const showLoadedEndpoints = customizationService.getCustomization('viewportScrollbar.showLoadedEndpoints') !== false;
|
|
451
|
+
const showLoadedFill = customizationService.getCustomization('viewportScrollbar.showLoadedFill') !== false;
|
|
452
|
+
const showViewedFill = customizationService.getCustomization('viewportScrollbar.showViewedFill') !== false;
|
|
453
|
+
const showLoadingPattern = customizationService.getCustomization('viewportScrollbar.showLoadingPattern') !== false;
|
|
454
|
+
const viewedDwellMsRaw = customizationService.getCustomization('viewportScrollbar.viewedDwellMs');
|
|
455
|
+
const loadedBatchIntervalMsRaw = customizationService.getCustomization('viewportScrollbar.loadedBatchIntervalMs');
|
|
456
|
+
const viewedDwellMs = typeof viewedDwellMsRaw === 'number' && viewedDwellMsRaw >= 0 ? viewedDwellMsRaw : 0;
|
|
457
|
+
const loadedBatchIntervalMs = typeof loadedBatchIntervalMsRaw === 'number' && loadedBatchIntervalMsRaw >= 0 ? loadedBatchIntervalMsRaw : 200;
|
|
458
|
+
const {
|
|
459
|
+
numberOfSlices,
|
|
460
|
+
imageIndex
|
|
461
|
+
} = imageSliceData;
|
|
462
|
+
const imageIds = (0,react.useMemo)(() => getViewportImageIds(viewportData), [viewportData]);
|
|
463
|
+
const imageIdToIndex = (0,react.useMemo)(() => {
|
|
464
|
+
const map = new Map();
|
|
465
|
+
for (let i = 0; i < imageIds.length; i++) {
|
|
466
|
+
const imageId = imageIds[i];
|
|
467
|
+
if (imageId) {
|
|
468
|
+
map.set(imageId, i);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
return map;
|
|
472
|
+
}, [imageIds]);
|
|
473
|
+
const isFullMode = useProgressScrollbarMode({
|
|
474
|
+
viewportData,
|
|
475
|
+
viewportId,
|
|
476
|
+
element,
|
|
477
|
+
cornerstoneViewportService
|
|
478
|
+
});
|
|
479
|
+
useViewportSliceSync({
|
|
480
|
+
viewportData,
|
|
481
|
+
viewportId,
|
|
482
|
+
element,
|
|
483
|
+
cornerstoneViewportService,
|
|
484
|
+
setImageSliceData
|
|
485
|
+
});
|
|
486
|
+
const {
|
|
487
|
+
bytes: loadedBytes,
|
|
488
|
+
version: loadedVersion,
|
|
489
|
+
isFull: isFullyLoaded
|
|
490
|
+
} = useLoadedSliceBytes({
|
|
491
|
+
isFullMode,
|
|
492
|
+
numberOfSlices,
|
|
493
|
+
viewportData,
|
|
494
|
+
imageIds,
|
|
495
|
+
imageIdToIndex,
|
|
496
|
+
loadedBatchIntervalMs
|
|
497
|
+
});
|
|
498
|
+
const {
|
|
499
|
+
bytes: viewedBytes,
|
|
500
|
+
version: viewedVersion
|
|
501
|
+
} = useViewedSliceBytes({
|
|
502
|
+
isFullMode,
|
|
503
|
+
numberOfSlices,
|
|
504
|
+
imageIndex,
|
|
505
|
+
imageIds,
|
|
506
|
+
imageIdToIndex,
|
|
507
|
+
viewedDwellMs,
|
|
508
|
+
viewedDataService
|
|
509
|
+
});
|
|
510
|
+
const onScrollbarValueChange = targetImageIndex => {
|
|
511
|
+
const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
|
512
|
+
if (!viewport || viewport instanceof esm.VolumeViewport3D) {
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
const {
|
|
516
|
+
isCineEnabled
|
|
517
|
+
} = cineService.getState();
|
|
518
|
+
if (isCineEnabled) {
|
|
519
|
+
cineService.stopClip(element, {
|
|
520
|
+
viewportId
|
|
521
|
+
});
|
|
522
|
+
cineService.setCine({
|
|
523
|
+
id: viewportId,
|
|
524
|
+
frameRate: undefined,
|
|
525
|
+
isPlaying: false
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
esm.utilities.jumpToSlice(viewport.element, {
|
|
529
|
+
imageIndex: targetImageIndex,
|
|
530
|
+
debounceLoading: true
|
|
531
|
+
});
|
|
532
|
+
};
|
|
533
|
+
const isLoading = isFullMode && showLoadingPattern ? !isFullyLoaded : false;
|
|
534
|
+
if (!numberOfSlices || numberOfSlices <= 1) {
|
|
535
|
+
return null;
|
|
536
|
+
}
|
|
537
|
+
return /*#__PURE__*/react.createElement("div", {
|
|
538
|
+
style: {
|
|
539
|
+
position: 'absolute',
|
|
540
|
+
right: 0,
|
|
541
|
+
top: 0,
|
|
542
|
+
height: '100%',
|
|
543
|
+
padding: '8px 5px',
|
|
544
|
+
zIndex: 10
|
|
545
|
+
}
|
|
546
|
+
}, /*#__PURE__*/react.createElement("div", {
|
|
547
|
+
style: {
|
|
548
|
+
position: 'relative',
|
|
549
|
+
height: '100%',
|
|
550
|
+
width: '11px'
|
|
551
|
+
}
|
|
552
|
+
}, /*#__PURE__*/react.createElement(ui_next_src/* SmartScrollbar */.IN7, {
|
|
553
|
+
className: "absolute inset-0",
|
|
554
|
+
value: imageIndex || 0,
|
|
555
|
+
total: numberOfSlices,
|
|
556
|
+
onValueChange: onScrollbarValueChange,
|
|
557
|
+
isLoading: isLoading,
|
|
558
|
+
enableKeyboardNavigation: false,
|
|
559
|
+
"aria-label": "Image navigation scrollbar",
|
|
560
|
+
indicator: customizationService.getCustomization('viewportScrollbar.indicator')
|
|
561
|
+
}, /*#__PURE__*/react.createElement(ui_next_src/* SmartScrollbarTrack */.dLR, null, isFullMode && showLoadedFill && /*#__PURE__*/react.createElement(ui_next_src/* SmartScrollbarFill */.pSN, {
|
|
562
|
+
marked: loadedBytes,
|
|
563
|
+
version: loadedVersion,
|
|
564
|
+
className: "bg-neutral/25",
|
|
565
|
+
loadingClassName: "bg-neutral/50"
|
|
566
|
+
}), isFullMode && showViewedFill && /*#__PURE__*/react.createElement(ui_next_src/* SmartScrollbarFill */.pSN, {
|
|
567
|
+
marked: viewedBytes,
|
|
568
|
+
version: viewedVersion,
|
|
569
|
+
className: "bg-primary/35",
|
|
570
|
+
loadingClassName: "bg-primary/35"
|
|
571
|
+
})), /*#__PURE__*/react.createElement(ui_next_src/* SmartScrollbarIndicator */.RY_, null), isFullMode && showLoadedEndpoints && /*#__PURE__*/react.createElement(ui_next_src/* SmartScrollbarEndpoints */.ult, {
|
|
572
|
+
marked: loadedBytes,
|
|
573
|
+
version: loadedVersion
|
|
574
|
+
}))));
|
|
575
|
+
}
|
|
576
|
+
ViewportSliceProgressScrollbar.propTypes = {
|
|
577
|
+
viewportData: (prop_types_default()).object,
|
|
578
|
+
viewportId: (prop_types_default()).string.isRequired,
|
|
579
|
+
element: prop_types_default().instanceOf(Element),
|
|
580
|
+
imageSliceData: (prop_types_default()).object.isRequired,
|
|
581
|
+
setImageSliceData: (prop_types_default()).func.isRequired,
|
|
582
|
+
servicesManager: (prop_types_default()).object.isRequired
|
|
583
|
+
};
|
|
584
|
+
/* harmony default export */ const ViewportSliceProgressScrollbar_ViewportSliceProgressScrollbar = (ViewportSliceProgressScrollbar);
|
|
135
585
|
// EXTERNAL MODULE: ../../../node_modules/gl-matrix/esm/index.js + 1 modules
|
|
136
586
|
var gl_matrix_esm = __webpack_require__(3823);
|
|
137
587
|
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js
|
|
@@ -496,7 +946,7 @@ function OverlayItem(props) {
|
|
|
496
946
|
}, label ? /*#__PURE__*/react.createElement("span", {
|
|
497
947
|
className: "mr-1 shrink-0"
|
|
498
948
|
}, label) : null, /*#__PURE__*/react.createElement("span", {
|
|
499
|
-
className: "ml-0
|
|
949
|
+
className: "ml-0 shrink-0"
|
|
500
950
|
}, value));
|
|
501
951
|
}
|
|
502
952
|
|
|
@@ -773,6 +1223,7 @@ ViewportImageSliceLoadingIndicator.propTypes = {
|
|
|
773
1223
|
|
|
774
1224
|
|
|
775
1225
|
|
|
1226
|
+
|
|
776
1227
|
function CornerstoneOverlays(props) {
|
|
777
1228
|
const {
|
|
778
1229
|
viewportId,
|
|
@@ -781,7 +1232,8 @@ function CornerstoneOverlays(props) {
|
|
|
781
1232
|
servicesManager
|
|
782
1233
|
} = props;
|
|
783
1234
|
const {
|
|
784
|
-
cornerstoneViewportService
|
|
1235
|
+
cornerstoneViewportService,
|
|
1236
|
+
customizationService
|
|
785
1237
|
} = servicesManager.services;
|
|
786
1238
|
const [imageSliceData, setImageSliceData] = (0,react.useState)({
|
|
787
1239
|
imageIndex: 0,
|
|
@@ -810,9 +1262,18 @@ function CornerstoneOverlays(props) {
|
|
|
810
1262
|
return null;
|
|
811
1263
|
}
|
|
812
1264
|
}
|
|
1265
|
+
const viewportScrollbarVariant = customizationService.getCustomization('viewportScrollbar.variant');
|
|
1266
|
+
const useProgressScrollbar = viewportScrollbarVariant !== 'legacy';
|
|
813
1267
|
return /*#__PURE__*/react.createElement("div", {
|
|
814
1268
|
className: "noselect"
|
|
815
|
-
}, /*#__PURE__*/react.createElement(
|
|
1269
|
+
}, useProgressScrollbar ? /*#__PURE__*/react.createElement(ViewportSliceProgressScrollbar_ViewportSliceProgressScrollbar, {
|
|
1270
|
+
viewportId: viewportId,
|
|
1271
|
+
viewportData: viewportData,
|
|
1272
|
+
element: element,
|
|
1273
|
+
imageSliceData: imageSliceData,
|
|
1274
|
+
setImageSliceData: setImageSliceData,
|
|
1275
|
+
servicesManager: servicesManager
|
|
1276
|
+
}) : /*#__PURE__*/react.createElement(ViewportImageScrollbar, {
|
|
816
1277
|
viewportId: viewportId,
|
|
817
1278
|
viewportData: viewportData,
|
|
818
1279
|
element: element,
|
|
@@ -11,8 +11,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
11
11
|
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(97598);
|
|
12
12
|
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
|
13
13
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(86326);
|
|
14
|
-
/* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(
|
|
15
|
-
/* harmony import */ var _ohif_extension_cornerstone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(
|
|
14
|
+
/* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(564);
|
|
15
|
+
/* harmony import */ var _ohif_extension_cornerstone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(87166);
|
|
16
16
|
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); }
|
|
17
17
|
|
|
18
18
|
|