@ohif/app 3.13.0-beta.60 → 3.13.0-beta.61

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.
Files changed (36) hide show
  1. package/dist/{1608.bundle.e4aadbf17d38143dacdf.js → 1608.bundle.26306ea38618db59eff7.js} +4 -4
  2. package/dist/{1933.bundle.0055c536e1392867e57c.js → 1933.bundle.82822511235016082da4.js} +2 -2
  3. package/dist/{2701.bundle.b591cf6385ed53ed6093.js → 2701.bundle.6873805ddfdccc7a8b1e.js} +4 -4
  4. package/dist/{2851.bundle.c5202066974b96955c28.js → 2851.bundle.123d7f6fa1186ac1308a.js} +8 -8
  5. package/dist/{3138.bundle.5ed994e6e0ff7c720a75.js → 3138.bundle.bc81953147e0c5f3b23f.js} +4 -4
  6. package/dist/{3461.bundle.54f8d64ed1965c14ec4c.js → 3461.bundle.f65494e79c37a14bc206.js} +2 -2
  7. package/dist/{147.bundle.173b4a11960d03a3b5b0.js → 3754.bundle.fd4b67c2a29c4bc4a840.js} +468 -7
  8. package/dist/{4202.bundle.850a7c7c011800b3daea.js → 4202.bundle.4fcd0de412907efd5b53.js} +2 -2
  9. package/dist/{4819.bundle.fb82fcc8360f4883691e.js → 4819.bundle.23965159795eaeb1ca1b.js} +6 -6
  10. package/dist/{5015.bundle.dda760490cf19777b6b3.js → 5015.bundle.54d7fda0f8e819aaa578.js} +2 -2
  11. package/dist/{5028.bundle.494b6ca9e0f5567c26e2.js → 5028.bundle.b806370179a0f878527b.js} +2 -2
  12. package/dist/{5802.bundle.41cf74cda9aad21601e8.js → 5802.bundle.26f84db0ff8851532c36.js} +2 -2
  13. package/dist/{4688.bundle.e23f20a556dca69540fd.js → 7166.bundle.6334b7a549c8d1f58bfd.js} +92 -11
  14. package/dist/{8305.bundle.21d4c7deff19f6ce9a6a.js → 8305.bundle.7ff9f067007c6fc02eff.js} +4 -4
  15. package/dist/{8499.bundle.dbeca38ee1d1471ce4d8.js → 8499.bundle.b0d3892bff3f3163f747.js} +2 -2
  16. package/dist/{8558.bundle.5c64a061bf4d5d5f6d7a.js → 8558.bundle.ae26725ef258ef186524.js} +1 -1
  17. package/dist/{8583.bundle.a0ccedd0799600ad5fad.js → 8583.bundle.f56d7ead5b46d8d6f294.js} +4 -4
  18. package/dist/{9845.bundle.267831496ba080d9f8da.js → 9845.bundle.8c450e8d65a78a5afcd3.js} +4 -4
  19. package/dist/{9862.bundle.09783830f0cb75a84d2a.js → 9862.bundle.a5f7925840868fa4ecdb.js} +2 -2
  20. package/dist/{app.bundle.348a74b1a7aeb7c8d0a8.js → app.bundle.97f04c5d27e5017d698b.js} +408 -289
  21. package/dist/app.bundle.css +1 -1
  22. package/dist/index.html +1 -1
  23. package/dist/sw.js +1 -1
  24. package/package.json +20 -20
  25. /package/dist/{1459.bundle.ed7323f44e4ff4ecd69a.js → 1459.bundle.4ad39e2c21e35cb2be1c.js} +0 -0
  26. /package/dist/{2018.bundle.ab8f9ceeae0e18eb303b.js → 2018.bundle.6f06faf8d0a5c91f5e7c.js} +0 -0
  27. /package/dist/{213.bundle.18a8b5a1e2f00de7feaf.js → 213.bundle.d8a8ffeec432cd8363c0.js} +0 -0
  28. /package/dist/{2424.bundle.5e858661a06aa36dd859.js → 2424.bundle.c602ad458e7902f7f555.js} +0 -0
  29. /package/dist/{147.css → 3754.css} +0 -0
  30. /package/dist/{4507.bundle.18379f328211aee3aba5.js → 4507.bundle.75bf28fe32a927130dec.js} +0 -0
  31. /package/dist/{5457.bundle.328f29b05df8d287491b.js → 5457.bundle.d1e9be8eab20c1620624.js} +0 -0
  32. /package/dist/{5485.bundle.53614f38e6ee0e052bdc.js → 5485.bundle.7de6ed76c9bf762fd395.js} +0 -0
  33. /package/dist/{6027.bundle.1bfe806a0cb494dfc265.js → 6027.bundle.11c8ba4581dca8a82b91.js} +0 -0
  34. /package/dist/{7639.bundle.2ec2272d8eb08df56b66.js → 7639.bundle.d7571b9b1bdd3c712fa7.js} +0 -0
  35. /package/dist/{85.bundle.e426258a9ad5bcf9bb3e.js → 85.bundle.203f56fd4f235891345a.js} +0 -0
  36. /package/dist/{9927.bundle.3bdd61e78a710e09cc0b.js → 9927.bundle.ceb2c44737524314f168.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 + 3084 modules
21
- var src = __webpack_require__(15953);
22
- // EXTERNAL MODULE: ../../../extensions/cornerstone/src/index.tsx + 194 modules
23
- var cornerstone_src = __webpack_require__(24688);
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 + 3084 modules
22
- var src = __webpack_require__(15953);
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 + 194 modules
27
- var cornerstone_src = __webpack_require__(24688);
28
- // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3084 modules
29
- var ui_next_src = __webpack_require__(15953);
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__(15953);
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 + 3084 modules
127
- var src = __webpack_require__(15953);
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__(15953);
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 + 3084 modules
3793
- var ui_next_src = __webpack_require__(15953);
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.60";
10608
- const commitHash = "eede569a88ed6a3177bbdea8552dfb93ca13cac5";
10607
+ const versionNumber = "3.13.0-beta.61";
10608
+ const commitHash = "8fc0dc16e97f3262fdac902ecf2d7c20cb8f78cc";
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 + 3084 modules
675
- var ui_next_src = __webpack_require__(15953);
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 + 194 modules
1125
- var cornerstone_src = __webpack_require__(24688);
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 + 194 modules
76
- var cornerstone_src = __webpack_require__(24688);
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([[147],{
2
+ (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[3754],{
3
3
 
4
- /***/ 30147
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 + 3084 modules
22
- var ui_next_src = __webpack_require__(15953);
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 mr-2 shrink-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(ViewportImageScrollbar, {
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__(15953);
15
- /* harmony import */ var _ohif_extension_cornerstone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(24688);
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