@ohif/app 3.13.0-beta.6 → 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 (72) hide show
  1. package/dist/{1459.bundle.075e535250e3d4779923.js → 1459.bundle.4ad39e2c21e35cb2be1c.js} +5 -6
  2. package/dist/{1608.bundle.0687c661f1c9edfb3b8a.js → 1608.bundle.26306ea38618db59eff7.js} +12 -12
  3. package/dist/{1927.bundle.3050588e95f43cf57cdd.js → 1927.bundle.be67b3aafe238ca9f191.js} +27 -38
  4. package/dist/{1933.bundle.317997210b6a51079753.js → 1933.bundle.82822511235016082da4.js} +32 -27
  5. package/dist/{2018.bundle.31d14d6f9fb764b51bda.js → 2018.bundle.6f06faf8d0a5c91f5e7c.js} +18 -19
  6. package/dist/{6409.bundle.b36048896cb11c8571fb.js → 2075.bundle.23265b8e7597c398db4f.js} +327 -256
  7. package/dist/{2108.bundle.e84aa8d858d8c4f2413e.js → 2108.bundle.aea8d3b39486dd5ab39e.js} +569 -558
  8. package/dist/{213.bundle.363f9a3eb6c0d33e3921.js → 213.bundle.d8a8ffeec432cd8363c0.js} +3 -5
  9. package/dist/{2424.bundle.aa7f4df6cba71b817c87.js → 2424.bundle.c602ad458e7902f7f555.js} +3 -5
  10. package/dist/{2516.bundle.1ea0988d309a757bb6da.js → 2516.bundle.f62228e9a800de8d4b31.js} +6 -6
  11. package/dist/{2701.bundle.12bd01a80a9f8ea4cd94.js → 2701.bundle.6873805ddfdccc7a8b1e.js} +10 -10
  12. package/dist/{9195.bundle.adf6a548b6f7ae279c09.js → 2851.bundle.123d7f6fa1186ac1308a.js} +384 -169
  13. package/dist/{1730.bundle.1d137db2556d538263fb.js → 3138.bundle.bc81953147e0c5f3b23f.js} +16 -310
  14. package/dist/{3461.bundle.7024d5e66d12b4069031.js → 3461.bundle.f65494e79c37a14bc206.js} +131 -107
  15. package/dist/{147.bundle.37d627289453cb6c3937.js → 3754.bundle.fd4b67c2a29c4bc4a840.js} +486 -49
  16. package/dist/{4202.bundle.5a0f8e4004c5d8a68548.js → 4202.bundle.4fcd0de412907efd5b53.js} +6 -6
  17. package/dist/{4019.bundle.83a604779f7da0101ced.js → 4287.bundle.b7840e7b94cbbc102236.js} +348 -237
  18. package/dist/{5462.bundle.21beddaca145b7465c72.js → 4406.bundle.573d234b4641d23cf8db.js} +1083 -1308
  19. package/dist/{1403.bundle.40baf30d503370ce52c9.js → 4507.bundle.75bf28fe32a927130dec.js} +10 -305
  20. package/dist/{6347.bundle.784c48912700f281de1d.js → 4579.bundle.0a6b2f49a7e136a79e37.js} +561 -649
  21. package/dist/{4819.bundle.0c37918802ef7805586f.js → 4819.bundle.23965159795eaeb1ca1b.js} +39 -39
  22. package/dist/{4775.bundle.5d6203a2991902544266.js → 5015.bundle.54d7fda0f8e819aaa578.js} +29 -333
  23. package/dist/{5028.bundle.2cd4d2253b47845e6634.js → 5028.bundle.b806370179a0f878527b.js} +11 -13
  24. package/dist/{5261.bundle.6e1a017f8f1027557f5b.js → 5261.bundle.2655560097e9250eac44.js} +412 -345
  25. package/dist/{5457.bundle.15d4adb3ca43c45b044d.js → 5457.bundle.d1e9be8eab20c1620624.js} +16 -23
  26. package/dist/{5485.bundle.b9764a7846d57ee5710d.js → 5485.bundle.7de6ed76c9bf762fd395.js} +20 -32
  27. package/dist/{5491.bundle.2e01dd7ad29e4cc01bc1.js → 5491.bundle.4866d2ecb20dd089e071.js} +54 -51
  28. package/dist/{5802.bundle.3bf5e6b3ab330a594a47.js → 5802.bundle.26f84db0ff8851532c36.js} +79 -20
  29. package/dist/5802.css +1 -1
  30. package/dist/{5830.bundle.b073c265c4fcea1afff3.js → 5830.bundle.791019deddd536980a11.js} +3 -3
  31. package/dist/{5858.bundle.ff6b340cf7457db76a1a.js → 5858.bundle.466e58128de344ab53f3.js} +90 -86
  32. package/dist/{6027.bundle.55f4bf16015381255f33.js → 6027.bundle.11c8ba4581dca8a82b91.js} +3 -5
  33. package/dist/{6354.bundle.c387737dc09c9cab4ff2.js → 6354.bundle.929febcf6d326e582e00.js} +151 -140
  34. package/dist/{6376.bundle.9cb74d7bc08476e2f1a7.js → 6376.bundle.738c873196491232acb6.js} +6 -6
  35. package/dist/{2842.bundle.860b9f10fcdd9656947a.js → 6386.bundle.5d82d1f41d1c37a0358d.js} +904 -2298
  36. package/dist/6939.bundle.41fbdef87597b5172ec6.js +3 -3
  37. package/dist/{7159.bundle.a5991a5d4f0dd8f1c95f.js → 7159.bundle.fb9df255868960f69765.js} +7 -5
  38. package/dist/{3081.bundle.f0df1c7d93ef4be29102.js → 7166.bundle.6334b7a549c8d1f58bfd.js} +825 -410
  39. package/dist/{7190.bundle.e8f0193e0e06472f795c.js → 7190.bundle.3738008038e70525764f.js} +1129 -821
  40. package/dist/{732.bundle.6978ac30a1e36abf06db.js → 732.bundle.ea6f9d8504e37e01a208.js} +5 -13
  41. package/dist/{7431.bundle.b01791d10e6cf9f503b0.js → 7431.bundle.5e14641f2c71e852abe7.js} +28 -28
  42. package/dist/{4410.bundle.c5224cd7d6238a7d4660.js → 7537.bundle.1726a7f7a4c378296085.js} +5216 -2238
  43. package/dist/{7639.bundle.9057c381d5f455997d60.js → 7639.bundle.d7571b9b1bdd3c712fa7.js} +3 -5
  44. package/dist/7758.bundle.c8d106364298e7d288f0.js +3 -3
  45. package/dist/{8094.bundle.5c44190a325ac23e3e5c.js → 8094.bundle.148a66619607e37cbf19.js} +3 -4
  46. package/dist/{8305.bundle.2a215d860aa3bb1984f6.js → 8305.bundle.7ff9f067007c6fc02eff.js} +71 -66
  47. package/dist/{6163.bundle.18484c031c76e3835a71.js → 8499.bundle.b0d3892bff3f3163f747.js} +7 -302
  48. package/dist/8499.css +2 -0
  49. package/dist/{85.bundle.173a5ab4b47890e2f013.js → 85.bundle.203f56fd4f235891345a.js} +3 -5
  50. package/dist/{8558.bundle.52d7001a86845c8a91b8.js → 8558.bundle.ae26725ef258ef186524.js} +15 -309
  51. package/dist/{8583.bundle.e899badfa6f91f22b2f3.js → 8583.bundle.f56d7ead5b46d8d6f294.js} +24 -27
  52. package/dist/{997.bundle.822b33e561263084e18c.js → 9039.bundle.7afa93b103c3b26d4855.js} +3965 -2984
  53. package/dist/{7412.bundle.fab1742191b7fe937330.js → 9205.bundle.315c3b56464a7590235a.js} +6071 -3305
  54. package/dist/{3584.bundle.8cc0750425513433e9cc.js → 9567.bundle.be350438bed4e656f278.js} +3422 -2880
  55. package/dist/{9845.bundle.255e7c7f7a88193b4e47.js → 9845.bundle.8c450e8d65a78a5afcd3.js} +10 -10
  56. package/dist/{9862.bundle.3a8958a82c572015d25d.js → 9862.bundle.a5f7925840868fa4ecdb.js} +8 -6
  57. package/dist/{9927.bundle.0e4c7a7682b7acad3060.js → 9927.bundle.ceb2c44737524314f168.js} +4 -6
  58. package/dist/app-config.js +12 -0
  59. package/dist/{app.bundle.62d84a3df6ec149a44a6.js → app.bundle.97f04c5d27e5017d698b.js} +100613 -97645
  60. package/dist/app.bundle.css +3 -3
  61. package/dist/{polySeg.bundle.a5aa9130b4191253c410.js → compute.bundle.a41ec0ba4f935200ab93.js} +8 -20
  62. package/dist/{histogram-worker.bundle.d4e40a8018d2698b072e.js → histogram-worker.bundle.a2a50c4674d99c619ca7.js} +11 -23
  63. package/dist/index.html +1 -1
  64. package/dist/{interpolation.bundle.c70cb95d164dc494e6dc.js → interpolation.bundle.2559b710030605fc2bc6.js} +14 -26
  65. package/dist/{compute.bundle.64280c7af19ff567465f.js → polySeg.bundle.be57af5b834dd833a418.js} +10 -22
  66. package/dist/sw.js +1 -1
  67. package/package.json +23 -22
  68. package/dist/3343.bundle.d7578ce8f75d158c0bab.js +0 -297
  69. /package/dist/{1730.css → 3138.css} +0 -0
  70. /package/dist/{147.css → 3754.css} +0 -0
  71. /package/dist/{3343.css → 4972.css} +0 -0
  72. /package/dist/{6163.css → 7829.css} +0 -0
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[147],{
2
+ (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[3754],{
3
3
 
4
- /***/ 30147:
5
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4
+ /***/ 33754
5
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6
6
 
7
7
  // ESM COMPAT FLAG
8
8
  __webpack_require__.r(__webpack_exports__);
@@ -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 + 3075 modules
22
- var ui_next_src = __webpack_require__(12517);
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
@@ -140,6 +590,7 @@ var dist_esm = __webpack_require__(4667);
140
590
  var moment = __webpack_require__(14867);
141
591
  var moment_default = /*#__PURE__*/__webpack_require__.n(moment);
142
592
  ;// ../../../extensions/cornerstone/src/Viewport/Overlays/utils.ts
593
+ /* unused harmony import specifier */ var metaData;
143
594
 
144
595
 
145
596
 
@@ -248,14 +699,11 @@ function CustomizableViewportOverlay({
248
699
  toolGroupService,
249
700
  displaySetService
250
701
  } = servicesManager.services;
251
- const [voi, setVOI] = (0,react.useState)({
252
- windowCenter: null,
253
- windowWidth: null
254
- });
255
702
  const [scale, setScale] = (0,react.useState)(1);
256
703
  const [annotationState, setAnnotationState] = (0,react.useState)(0);
257
704
  const {
258
- isViewportBackgroundLight: isLight
705
+ isViewportBackgroundLight: isLight,
706
+ windowLevel: voi
259
707
  } = (0,hooks/* useViewportRendering */.eH)(viewportId);
260
708
  const {
261
709
  imageIndex
@@ -288,36 +736,6 @@ function CustomizableViewportOverlay({
288
736
  referenceInstance
289
737
  };
290
738
  }, [viewportData, viewportId, instanceNumber, cornerstoneViewportService]);
291
-
292
- /**
293
- * Updating the VOI when the viewport changes its voi
294
- */
295
- (0,react.useEffect)(() => {
296
- const updateVOI = eventDetail => {
297
- const {
298
- range
299
- } = eventDetail.detail;
300
- if (!range) {
301
- return;
302
- }
303
- const {
304
- lower,
305
- upper
306
- } = range;
307
- const {
308
- windowWidth,
309
- windowCenter
310
- } = esm.utilities.windowLevel.toWindowLevel(lower, upper);
311
- setVOI({
312
- windowCenter,
313
- windowWidth
314
- });
315
- };
316
- element.addEventListener(esm.Enums.Events.VOI_MODIFIED, updateVOI);
317
- return () => {
318
- element.removeEventListener(esm.Enums.Events.VOI_MODIFIED, updateVOI);
319
- };
320
- }, [viewportId, viewportData, voi, element]);
321
739
  const annotationModified = (0,react.useCallback)(evt => {
322
740
  if (evt.detail.annotation.metadata.toolName === dist_esm.UltrasoundPleuraBLineTool.toolName) {
323
741
  // Update the annotation state to trigger a re-render
@@ -385,7 +803,7 @@ function CustomizableViewportOverlay({
385
803
  return renderItem.contentF(overlayItemProps);
386
804
  }
387
805
  }
388
- }, [element, viewportData, imageSliceData, viewportId, servicesManager, customizationService, displaySetProps, voi, scale, instanceNumber, annotationState]);
806
+ }, [element, viewportData, imageSliceData, viewportId, servicesManager, customizationService, displaySetProps, voi, scale, instanceNumber, annotationState, isLight]);
389
807
  const getContent = (0,react.useCallback)((customization, keyPrefix) => {
390
808
  const props = {
391
809
  ...displaySetProps,
@@ -528,7 +946,7 @@ function OverlayItem(props) {
528
946
  }, label ? /*#__PURE__*/react.createElement("span", {
529
947
  className: "mr-1 shrink-0"
530
948
  }, label) : null, /*#__PURE__*/react.createElement("span", {
531
- className: "ml-0 mr-2 shrink-0"
949
+ className: "ml-0 shrink-0"
532
950
  }, value));
533
951
  }
534
952
 
@@ -544,6 +962,9 @@ function VOIOverlayItem({
544
962
  windowWidth,
545
963
  windowCenter
546
964
  } = voi;
965
+ const {
966
+ title
967
+ } = customization;
547
968
  if (typeof windowCenter !== 'number' || typeof windowWidth !== 'number') {
548
969
  return null;
549
970
  }
@@ -551,7 +972,8 @@ function VOIOverlayItem({
551
972
  className: "overlay-item flex flex-row",
552
973
  style: {
553
974
  color: customization?.color
554
- }
975
+ },
976
+ title: title
555
977
  }, /*#__PURE__*/react.createElement("span", {
556
978
  className: "mr-0.5 shrink-0 opacity-[0.70]"
557
979
  }, "W:"), /*#__PURE__*/react.createElement("span", {
@@ -592,11 +1014,15 @@ function InstanceNumberOverlayItem({
592
1014
  imageIndex,
593
1015
  numberOfSlices
594
1016
  } = imageSliceData;
1017
+ const {
1018
+ title
1019
+ } = customization;
595
1020
  return /*#__PURE__*/react.createElement("div", {
596
1021
  className: "overlay-item flex flex-row",
597
1022
  style: {
598
1023
  color: customization && customization.color || undefined
599
- }
1024
+ },
1025
+ title: title
600
1026
  }, /*#__PURE__*/react.createElement("span", null, instanceNumber !== undefined && instanceNumber !== null ? /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("span", {
601
1027
  className: "mr-0.5 shrink-0 opacity-[0.70]"
602
1028
  }, "I:"), /*#__PURE__*/react.createElement("span", null, `${instanceNumber} (${imageIndex + 1}/${numberOfSlices})`)) : `${imageIndex + 1}/${numberOfSlices}`));
@@ -767,7 +1193,7 @@ function ViewportImageSliceLoadingIndicator({
767
1193
  }, /*#__PURE__*/react.createElement("div", {
768
1194
  className: "transparent flex h-full w-full items-center justify-center"
769
1195
  }, /*#__PURE__*/react.createElement("p", {
770
- className: "text-primary-light text-xl font-light"
1196
+ className: "text-highlight text-xl font-light"
771
1197
  }, /*#__PURE__*/react.createElement("h4", null, "Error Loading Image"), /*#__PURE__*/react.createElement("p", null, "An error has occurred."), /*#__PURE__*/react.createElement("p", null, error)))));
772
1198
  }
773
1199
  if (loading) {
@@ -780,7 +1206,7 @@ function ViewportImageSliceLoadingIndicator({
780
1206
  }, /*#__PURE__*/react.createElement("div", {
781
1207
  className: "transparent flex h-full w-full items-center justify-center"
782
1208
  }, /*#__PURE__*/react.createElement("p", {
783
- className: "text-primary-light text-xl font-light"
1209
+ className: "text-highlight text-xl font-light"
784
1210
  }, "Loading...")))
785
1211
  );
786
1212
  }
@@ -797,6 +1223,7 @@ ViewportImageSliceLoadingIndicator.propTypes = {
797
1223
 
798
1224
 
799
1225
 
1226
+
800
1227
  function CornerstoneOverlays(props) {
801
1228
  const {
802
1229
  viewportId,
@@ -805,7 +1232,8 @@ function CornerstoneOverlays(props) {
805
1232
  servicesManager
806
1233
  } = props;
807
1234
  const {
808
- cornerstoneViewportService
1235
+ cornerstoneViewportService,
1236
+ customizationService
809
1237
  } = servicesManager.services;
810
1238
  const [imageSliceData, setImageSliceData] = (0,react.useState)({
811
1239
  imageIndex: 0,
@@ -834,9 +1262,18 @@ function CornerstoneOverlays(props) {
834
1262
  return null;
835
1263
  }
836
1264
  }
1265
+ const viewportScrollbarVariant = customizationService.getCustomization('viewportScrollbar.variant');
1266
+ const useProgressScrollbar = viewportScrollbarVariant !== 'legacy';
837
1267
  return /*#__PURE__*/react.createElement("div", {
838
1268
  className: "noselect"
839
- }, /*#__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, {
840
1277
  viewportId: viewportId,
841
1278
  viewportData: viewportData,
842
1279
  element: element,
@@ -1658,6 +2095,6 @@ function areEqual(prevProps, nextProps) {
1658
2095
  }
1659
2096
  /* harmony default export */ const Viewport_OHIFCornerstoneViewport = (OHIFCornerstoneViewport);
1660
2097
 
1661
- /***/ })
2098
+ /***/ }
1662
2099
 
1663
2100
  }]);
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[4202],{
3
3
 
4
- /***/ 74202:
5
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4
+ /***/ 74202
5
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6
6
 
7
7
  __webpack_require__.r(__webpack_exports__);
8
8
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
@@ -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__(12517);
15
- /* harmony import */ var _ohif_extension_cornerstone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(63081);
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
 
@@ -106,7 +106,7 @@ function OHIFCornerstonePMAPViewport(props) {
106
106
  type: 'warning',
107
107
  message: 'The values are multiplied by 100 in the viewport for better visibility'
108
108
  });
109
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(_ohif_extension_cornerstone__WEBPACK_IMPORTED_MODULE_3__.OHIFCornerstoneViewport, _extends({}, props, {
109
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(_ohif_extension_cornerstone__WEBPACK_IMPORTED_MODULE_3__/* .OHIFCornerstoneViewport */ .R9, _extends({}, props, {
110
110
  // Referenced + PMAP displaySets must be passed as parameter in this order
111
111
  displaySets: [referencedDisplaySet, pmapDisplaySet],
112
112
  viewportOptions: {
@@ -191,6 +191,6 @@ function _getReferencedDisplaySetMetadata(referencedDisplaySet, pmapDisplaySet)
191
191
  }
192
192
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (OHIFCornerstonePMAPViewport);
193
193
 
194
- /***/ })
194
+ /***/ }
195
195
 
196
196
  }]);