@ohif/app 3.9.1 → 3.9.2

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 (38) hide show
  1. package/dist/{1185.bundle.023fe7179faaa50019d3.js → 1185.bundle.d328aabb2b43e9ea1f96.js} +62 -14
  2. package/dist/{1266.bundle.e9abd5c45b5236544151.js → 1266.bundle.46de27eda2ef1fce1243.js} +5 -0
  3. package/dist/{1436.bundle.773756cd51b69e887bac.js → 1436.bundle.27ae9c87e9fc7f52cad3.js} +234 -63
  4. package/dist/{1927.bundle.49539e3ab5b0aad1399c.js → 1927.bundle.2b2fa0b539d6ac5b0dc3.js} +1 -1
  5. package/dist/{3200.bundle.a12825fb5aec200d33e2.js → 3200.bundle.ccb809fb554332d9a0f5.js} +15 -7
  6. package/dist/{149.bundle.ce5596fc563276036744.js → 3900.bundle.3937999d1ee1f391647a.js} +35 -1
  7. package/dist/{4571.bundle.3b1691730b3c57bf4d35.js → 4571.bundle.a37be49663df2f4a2c8a.js} +99 -89
  8. package/dist/{5247.bundle.6dc2a50f21821b2ffdf5.js → 5247.bundle.1a1d7c27de482e4a73f3.js} +2 -2
  9. package/dist/{5252.bundle.5ec502c53a9cc877ed8d.js → 5252.bundle.f2675336275573a288d5.js} +13 -1
  10. package/dist/{1520.bundle.97dbd9bfa83148e5334d.js → 5630.bundle.1bd2402f37597078c1a1.js} +70 -59
  11. package/dist/{5717.bundle.848e13f256818475f57f.js → 5717.bundle.32836c212103dbbe8e4a.js} +247 -64
  12. package/dist/{7197.bundle.c28453cdb392072d8bf8.js → 7197.bundle.42a975bb7ae4a8df2d00.js} +2 -2
  13. package/dist/{7955.bundle.6a255705b1ef5906f4a8.js → 7955.bundle.f6c5edb284bdf8b80f2a.js} +1 -1
  14. package/dist/{8228.bundle.55ac03d7165248f47d4e.js → 8228.bundle.0a7997d04c82dd8c11c5.js} +2 -2
  15. package/dist/{8523.bundle.648334132159465cdc41.js → 8523.bundle.c0ec85de98ba380ebeb4.js} +55 -13
  16. package/dist/{9551.bundle.6c260a9869e14dcc3543.js → 9551.bundle.63b2679dd7beee6396d8.js} +1 -1
  17. package/dist/{app.bundle.d02143bec2df7fec9964.js → app.bundle.632bc6188462e1c95a41.js} +143 -80
  18. package/dist/app.bundle.css +2 -2
  19. package/dist/index.html +1 -1
  20. package/dist/{polySeg.bundle.b79ae514989e86301c71.js → polySeg.bundle.6e85073e3abf2e6e6078.js} +1 -1
  21. package/dist/serve.json +1 -10
  22. package/dist/{suv-peak-worker.bundle.31c3b3b957204af93b7e.js → suv-peak-worker.bundle.1f483dc7131d7c26b517.js} +3 -3
  23. package/dist/sw.js +1 -1
  24. package/package.json +19 -19
  25. /package/dist/{1374.bundle.019bbc010eeb66109e8b.js → 1374.bundle.1ee8326c0748c7b1a7c0.js} +0 -0
  26. /package/dist/{213.bundle.e663335fb0884edde6d8.js → 213.bundle.8c04fecea2e3796e4d73.js} +0 -0
  27. /package/dist/{2424.bundle.b7da298db43541d3a7c0.js → 2424.bundle.38b19314ebd984c9d393.js} +0 -0
  28. /package/dist/{2825.bundle.b04c941a87fd580deb6d.js → 2825.bundle.0307cae794e8b057c674.js} +0 -0
  29. /package/dist/{3198.bundle.c82b7424070ffd02faf1.js → 3198.bundle.ab612063af0d67397377.js} +0 -0
  30. /package/dist/{4834.bundle.aad44c2628cdefb7a4dd.js → 4834.bundle.c25348524be5214e90d6.js} +0 -0
  31. /package/dist/{5139.bundle.367a6827071448e2923d.js → 5139.bundle.db30dc02cf41e91c8985.js} +0 -0
  32. /package/dist/{5687.bundle.5731ec23dd9eb43a083e.js → 5687.bundle.05de4787676bf79f9906.js} +0 -0
  33. /package/dist/{717.bundle.0f32b7b57347b5141248.js → 717.bundle.3a4b8835adf03e4554c7.js} +0 -0
  34. /package/dist/{8008.bundle.5bf7b274246be10e2f05.js → 8008.bundle.d4187a30e8f656a21316.js} +0 -0
  35. /package/dist/{8259.bundle.623c29b26b170a8a085b.js → 8259.bundle.990db2fa9ce0800319e9.js} +0 -0
  36. /package/dist/{8558.bundle.01d05fd73da5db8e60f9.js → 8558.bundle.63714e2329c22c9cb9da.js} +0 -0
  37. /package/dist/{9611.bundle.767595c93877e5166c03.js → 9611.bundle.78a4ffb439f65cfd0379.js} +0 -0
  38. /package/dist/{9862.bundle.7146682e56aa66130ae6.js → 9862.bundle.aa2f8e0010f1be1bc87d.js} +0 -0
@@ -1,4 +1,4 @@
1
- (self["webpackChunk"] = self["webpackChunk"] || []).push([[149],{
1
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[3900],{
2
2
 
3
3
  /***/ 97181:
4
4
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
@@ -2123,6 +2123,40 @@ function triggerSegmentationRepresentationRemoved(viewportId, segmentationId, ty
2123
2123
  }
2124
2124
 
2125
2125
 
2126
+ /***/ }),
2127
+
2128
+ /***/ 50409:
2129
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2130
+
2131
+ "use strict";
2132
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2133
+ /* harmony export */ B: () => (/* binding */ getColorLUT)
2134
+ /* harmony export */ });
2135
+ /* harmony import */ var _SegmentationStateManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(59475);
2136
+
2137
+ function getColorLUT(index) {
2138
+ const segmentationStateManager = _SegmentationStateManager__WEBPACK_IMPORTED_MODULE_0__/* .defaultSegmentationStateManager */ ._6;
2139
+ return segmentationStateManager.getColorLUT(index);
2140
+ }
2141
+
2142
+
2143
+ /***/ }),
2144
+
2145
+ /***/ 70906:
2146
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2147
+
2148
+ "use strict";
2149
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2150
+ /* harmony export */ u: () => (/* binding */ getNextColorLUTIndex)
2151
+ /* harmony export */ });
2152
+ /* harmony import */ var _SegmentationStateManager__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(59475);
2153
+
2154
+ function getNextColorLUTIndex() {
2155
+ const segmentationStateManager = _SegmentationStateManager__WEBPACK_IMPORTED_MODULE_0__/* .defaultSegmentationStateManager */ ._6;
2156
+ return segmentationStateManager.getNextColorLUTIndex();
2157
+ }
2158
+
2159
+
2126
2160
  /***/ }),
2127
2161
 
2128
2162
  /***/ 33283:
@@ -1213,6 +1213,10 @@ function getPixelDataTypeFromMinMax(min, max) {
1213
1213
  }
1214
1214
  return pixelDataType || Float32Array;
1215
1215
  }
1216
+ function validatePixelDataType(min, max, type) {
1217
+ const pixelDataType = getPixelDataTypeFromMinMax(min, max);
1218
+ return pixelDataType === type;
1219
+ }
1216
1220
 
1217
1221
  ;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/dicom-image-loader/dist/esm/shared/isColorImage.js
1218
1222
  /* harmony default export */ function isColorImage(photoMetricInterpretation) {
@@ -1247,87 +1251,12 @@ const imageUtils = {
1247
1251
  bilinear: bilinear,
1248
1252
  replicate: replicate,
1249
1253
  };
1250
- async function decodeImageFrame(imageFrame, transferSyntax, pixelData, decodeConfig, options, callbackFn) {
1251
- const start = new Date().getTime();
1252
- let decodePromise = null;
1253
- let opts;
1254
- switch (transferSyntax) {
1255
- case '1.2.840.10008.1.2':
1256
- case '1.2.840.10008.1.2.1':
1257
- decodePromise = decoders_decodeLittleEndian(imageFrame, pixelData);
1258
- break;
1259
- case '1.2.840.10008.1.2.2':
1260
- decodePromise = decoders_decodeBigEndian(imageFrame, pixelData);
1261
- break;
1262
- case '1.2.840.10008.1.2.1.99':
1263
- decodePromise = decoders_decodeLittleEndian(imageFrame, pixelData);
1264
- break;
1265
- case '1.2.840.10008.1.2.5':
1266
- decodePromise = decoders_decodeRLE(imageFrame, pixelData);
1267
- break;
1268
- case '1.2.840.10008.1.2.4.50':
1269
- opts = {
1270
- ...imageFrame,
1271
- };
1272
- decodePromise = decodeJPEGBaseline8Bit(pixelData, opts);
1273
- break;
1274
- case '1.2.840.10008.1.2.4.51':
1275
- decodePromise = decodeJPEGBaseline12Bit_js(imageFrame, pixelData);
1276
- break;
1277
- case '1.2.840.10008.1.2.4.57':
1278
- decodePromise = decoders_decodeJPEGLossless(imageFrame, pixelData);
1279
- break;
1280
- case '1.2.840.10008.1.2.4.70':
1281
- decodePromise = decoders_decodeJPEGLossless(imageFrame, pixelData);
1282
- break;
1283
- case '1.2.840.10008.1.2.4.80':
1284
- opts = {
1285
- signed: imageFrame.pixelRepresentation === 1,
1286
- bytesPerPixel: imageFrame.bitsAllocated <= 8 ? 1 : 2,
1287
- ...imageFrame,
1288
- };
1289
- decodePromise = decodeJPEGLS(pixelData, opts);
1290
- break;
1291
- case '1.2.840.10008.1.2.4.81':
1292
- opts = {
1293
- signed: imageFrame.pixelRepresentation === 1,
1294
- bytesPerPixel: imageFrame.bitsAllocated <= 8 ? 1 : 2,
1295
- ...imageFrame,
1296
- };
1297
- decodePromise = decodeJPEGLS(pixelData, opts);
1298
- break;
1299
- case '1.2.840.10008.1.2.4.90':
1300
- opts = {
1301
- ...imageFrame,
1302
- };
1303
- decodePromise = decodeJPEG2000(pixelData, opts);
1304
- break;
1305
- case '1.2.840.10008.1.2.4.91':
1306
- opts = {
1307
- ...imageFrame,
1308
- };
1309
- decodePromise = decodeJPEG2000(pixelData, opts);
1310
- break;
1311
- case '3.2.840.10008.1.2.4.96':
1312
- case '1.2.840.10008.1.2.4.201':
1313
- case '1.2.840.10008.1.2.4.202':
1314
- case '1.2.840.10008.1.2.4.203':
1315
- opts = {
1316
- ...imageFrame,
1317
- };
1318
- decodePromise = decodeHTJ2K(pixelData, opts);
1319
- break;
1320
- default:
1321
- throw new Error(`no decoder for transfer syntax ${transferSyntax}`);
1322
- }
1323
- if (!decodePromise) {
1324
- throw new Error('decodePromise not defined');
1325
- }
1326
- const decodedFrame = await decodePromise;
1327
- const postProcessed = postProcessDecodedPixels(decodedFrame, options, start, decodeConfig);
1328
- callbackFn?.(postProcessed);
1329
- return postProcessed;
1330
- }
1254
+ const typedArrayConstructors = {
1255
+ Uint8Array,
1256
+ Uint16Array,
1257
+ Int16Array,
1258
+ Float32Array,
1259
+ };
1331
1260
  function postProcessDecodedPixels(imageFrame, options, start, decodeConfig) {
1332
1261
  const shouldShift = imageFrame.pixelRepresentation !== undefined &&
1333
1262
  imageFrame.pixelRepresentation === 1;
@@ -1342,22 +1271,22 @@ function postProcessDecodedPixels(imageFrame, options, start, decodeConfig) {
1342
1271
  let pixelDataArray = imageFrame.pixelData;
1343
1272
  imageFrame.pixelDataLength = imageFrame.pixelData.length;
1344
1273
  const { min: minBeforeScale, max: maxBeforeScale } = shared_getMinMax(imageFrame.pixelData);
1345
- const typedArrayConstructors = {
1346
- Uint8Array,
1347
- Uint16Array,
1348
- Int16Array,
1349
- Float32Array,
1350
- };
1351
- const type = options.targetBuffer?.type;
1352
1274
  const canRenderFloat = typeof options.allowFloatRendering !== 'undefined'
1353
1275
  ? options.allowFloatRendering
1354
1276
  : true;
1355
- const invalidType = isColorImage(imageFrame.photometricInterpretation) &&
1277
+ let invalidType = isColorImage(imageFrame.photometricInterpretation) &&
1356
1278
  options.targetBuffer?.offset === undefined;
1357
1279
  const willScale = options.preScale?.enabled;
1358
1280
  const hasFloatRescale = willScale &&
1359
1281
  Object.values(options.preScale.scalingParameters).some((v) => typeof v === 'number' && !Number.isInteger(v));
1360
1282
  const disableScale = !options.preScale.enabled || (!canRenderFloat && hasFloatRescale);
1283
+ const type = options.targetBuffer?.type;
1284
+ if (type && options.preScale.enabled && !disableScale) {
1285
+ const { rescaleSlope, rescaleIntercept } = options.preScale.scalingParameters;
1286
+ const minAfterScale = rescaleSlope * minBeforeScale + rescaleIntercept;
1287
+ const maxAfterScale = rescaleSlope * maxBeforeScale + rescaleIntercept;
1288
+ invalidType = !validatePixelDataType(minAfterScale, maxAfterScale, type);
1289
+ }
1361
1290
  if (type && !invalidType) {
1362
1291
  pixelDataArray = _handleTargetBuffer(options, imageFrame, typedArrayConstructors, pixelDataArray);
1363
1292
  }
@@ -1484,6 +1413,87 @@ function scaleImageFrame(imageFrame, targetBuffer, TypedArrayConstructor) {
1484
1413
  imageFrame.pixelDataLength = imageFrame.pixelData.length;
1485
1414
  return imageFrame;
1486
1415
  }
1416
+ async function decodeImageFrame(imageFrame, transferSyntax, pixelData, decodeConfig, options, callbackFn) {
1417
+ const start = new Date().getTime();
1418
+ let decodePromise = null;
1419
+ let opts;
1420
+ switch (transferSyntax) {
1421
+ case '1.2.840.10008.1.2':
1422
+ case '1.2.840.10008.1.2.1':
1423
+ decodePromise = decoders_decodeLittleEndian(imageFrame, pixelData);
1424
+ break;
1425
+ case '1.2.840.10008.1.2.2':
1426
+ decodePromise = decoders_decodeBigEndian(imageFrame, pixelData);
1427
+ break;
1428
+ case '1.2.840.10008.1.2.1.99':
1429
+ decodePromise = decoders_decodeLittleEndian(imageFrame, pixelData);
1430
+ break;
1431
+ case '1.2.840.10008.1.2.5':
1432
+ decodePromise = decoders_decodeRLE(imageFrame, pixelData);
1433
+ break;
1434
+ case '1.2.840.10008.1.2.4.50':
1435
+ opts = {
1436
+ ...imageFrame,
1437
+ };
1438
+ decodePromise = decodeJPEGBaseline8Bit(pixelData, opts);
1439
+ break;
1440
+ case '1.2.840.10008.1.2.4.51':
1441
+ decodePromise = decodeJPEGBaseline12Bit_js(imageFrame, pixelData);
1442
+ break;
1443
+ case '1.2.840.10008.1.2.4.57':
1444
+ decodePromise = decoders_decodeJPEGLossless(imageFrame, pixelData);
1445
+ break;
1446
+ case '1.2.840.10008.1.2.4.70':
1447
+ decodePromise = decoders_decodeJPEGLossless(imageFrame, pixelData);
1448
+ break;
1449
+ case '1.2.840.10008.1.2.4.80':
1450
+ opts = {
1451
+ signed: imageFrame.pixelRepresentation === 1,
1452
+ bytesPerPixel: imageFrame.bitsAllocated <= 8 ? 1 : 2,
1453
+ ...imageFrame,
1454
+ };
1455
+ decodePromise = decodeJPEGLS(pixelData, opts);
1456
+ break;
1457
+ case '1.2.840.10008.1.2.4.81':
1458
+ opts = {
1459
+ signed: imageFrame.pixelRepresentation === 1,
1460
+ bytesPerPixel: imageFrame.bitsAllocated <= 8 ? 1 : 2,
1461
+ ...imageFrame,
1462
+ };
1463
+ decodePromise = decodeJPEGLS(pixelData, opts);
1464
+ break;
1465
+ case '1.2.840.10008.1.2.4.90':
1466
+ opts = {
1467
+ ...imageFrame,
1468
+ };
1469
+ decodePromise = decodeJPEG2000(pixelData, opts);
1470
+ break;
1471
+ case '1.2.840.10008.1.2.4.91':
1472
+ opts = {
1473
+ ...imageFrame,
1474
+ };
1475
+ decodePromise = decodeJPEG2000(pixelData, opts);
1476
+ break;
1477
+ case '3.2.840.10008.1.2.4.96':
1478
+ case '1.2.840.10008.1.2.4.201':
1479
+ case '1.2.840.10008.1.2.4.202':
1480
+ case '1.2.840.10008.1.2.4.203':
1481
+ opts = {
1482
+ ...imageFrame,
1483
+ };
1484
+ decodePromise = decodeHTJ2K(pixelData, opts);
1485
+ break;
1486
+ default:
1487
+ throw new Error(`no decoder for transfer syntax ${transferSyntax}`);
1488
+ }
1489
+ if (!decodePromise) {
1490
+ throw new Error('decodePromise not defined');
1491
+ }
1492
+ const decodedFrame = await decodePromise;
1493
+ const postProcessed = postProcessDecodedPixels(decodedFrame, options, start, decodeConfig);
1494
+ callbackFn?.(postProcessed);
1495
+ return postProcessed;
1496
+ }
1487
1497
  const obj = {
1488
1498
  decodeTask({ imageFrame, transferSyntax, decodeConfig, options, pixelData, callbackFn, }) {
1489
1499
  return decodeImageFrame(imageFrame, transferSyntax, pixelData, decodeConfig, options, callbackFn);
@@ -1379,8 +1379,8 @@ MicroscopyService.REGISTRATION = servicesManager => {
1379
1379
 
1380
1380
  // EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
1381
1381
  var dcmjs_es = __webpack_require__(5842);
1382
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 114 modules
1383
- var default_src = __webpack_require__(71520);
1382
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 115 modules
1383
+ var default_src = __webpack_require__(55630);
1384
1384
  ;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/utils/DEVICE_OBSERVER_UID.js
1385
1385
  // We need to define a UID for this extension as a device, and it should be the same for all saves:
1386
1386
 
@@ -2709,6 +2709,15 @@ const imageRetrieveMetadataProvider = {
2709
2709
  add: (key, payload) => {
2710
2710
  retrieveConfigurationState.set(key, payload);
2711
2711
  },
2712
+ clone: () => {
2713
+ return new Map(retrieveConfigurationState);
2714
+ },
2715
+ restore: (state) => {
2716
+ retrieveConfigurationState.clear();
2717
+ state.forEach((value, key) => {
2718
+ retrieveConfigurationState.set(key, value);
2719
+ });
2720
+ },
2712
2721
  get: (type, ...queries) => {
2713
2722
  if (type === IMAGE_RETRIEVE_CONFIGURATION) {
2714
2723
  return queries
@@ -3633,7 +3642,10 @@ function calculateViewportsSpatialRegistration(viewport1, viewport2) {
3633
3642
 
3634
3643
  ;// CONCATENATED MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/utilities/getViewportImageCornersInWorld.js
3635
3644
  function getViewportImageCornersInWorld(viewport) {
3636
- const { imageData, dimensions } = viewport.getImageData();
3645
+ const { imageData, dimensions } = viewport.getImageData() || {};
3646
+ if (!imageData || !dimensions) {
3647
+ return [];
3648
+ }
3637
3649
  const { canvas } = viewport;
3638
3650
  const ratio = window.devicePixelRatio;
3639
3651
  const topLeftCanvas = [0, 0];
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (self["webpackChunk"] = self["webpackChunk"] || []).push([[1520],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[5630],{
3
3
 
4
- /***/ 71520:
4
+ /***/ 55630:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -29,7 +29,7 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  useHangingProtocolStageIndexStore: () => (/* reexport */ useHangingProtocolStageIndexStore),
30
30
  usePatientInfo: () => (/* reexport */ hooks_usePatientInfo),
31
31
  useToggleHangingProtocolStore: () => (/* reexport */ useToggleHangingProtocolStore),
32
- useToggleOneUpViewportGridStore: () => (/* reexport */ useToggleOneUpViewportGridStore/* useToggleOneUpViewportGridStore */.Y),
32
+ useToggleOneUpViewportGridStore: () => (/* reexport */ useToggleOneUpViewportGridStore),
33
33
  useUIStateStore: () => (/* reexport */ useUIStateStore),
34
34
  useViewportGridStore: () => (/* reexport */ useViewportGridStore),
35
35
  useViewportsByPositionStore: () => (/* reexport */ useViewportsByPositionStore),
@@ -1726,23 +1726,35 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
1726
1726
  naturalizedInstances.forEach(instance => {
1727
1727
  instance.wadoRoot = dicomWebConfig.wadoRoot;
1728
1728
  instance.wadoUri = dicomWebConfig.wadoUri;
1729
- const imageId = implementation.getImageIdsForInstance({
1730
- instance
1731
- });
1729
+ const {
1730
+ StudyInstanceUID,
1731
+ SeriesInstanceUID,
1732
+ SOPInstanceUID
1733
+ } = instance;
1734
+ const numberOfFrames = instance.NumberOfFrames || 1;
1735
+ // Process all frames consistently, whether single or multiframe
1736
+ for (let i = 0; i < numberOfFrames; i++) {
1737
+ const frameNumber = i + 1;
1738
+ const frameImageId = implementation.getImageIdsForInstance({
1739
+ instance,
1740
+ frame: frameNumber
1741
+ });
1742
+ // Add imageId specific mapping to this data as the URL isn't necessarily WADO-URI.
1743
+ metadataProvider.addImageIdToUIDs(frameImageId, {
1744
+ StudyInstanceUID,
1745
+ SeriesInstanceUID,
1746
+ SOPInstanceUID,
1747
+ frameNumber: numberOfFrames > 1 ? frameNumber : undefined
1748
+ });
1749
+ }
1732
1750
 
1733
1751
  // Adding imageId to each instance
1734
1752
  // Todo: This is not the best way I can think of to let external
1735
1753
  // metadata handlers know about the imageId that is stored in the store
1736
- instance.imageId = imageId;
1737
-
1738
- // Adding UIDs to metadataProvider
1739
- // Note: storing imageURI in metadataProvider since stack viewports
1740
- // will use the same imageURI
1741
- metadataProvider.addImageIdToUIDs(imageId, {
1742
- StudyInstanceUID,
1743
- SeriesInstanceUID: instance.SeriesInstanceUID,
1744
- SOPInstanceUID: instance.SOPInstanceUID
1754
+ const imageId = implementation.getImageIdsForInstance({
1755
+ instance
1745
1756
  });
1757
+ instance.imageId = imageId;
1746
1758
  });
1747
1759
  src/* DicomMetadataStore */.H8.addInstances(naturalizedInstances, madeInClient);
1748
1760
  }
@@ -1964,7 +1976,7 @@ function createDicomJSONApi(dicomJsonConfig) {
1964
1976
  query
1965
1977
  } = query_string.parseUrl(instance.url);
1966
1978
 
1967
- // Add imageId specific mapping to this data as the URL isn't necessarliy WADO-URI.
1979
+ // Add imageId specific mapping to this data as the URL isn't necessarily WADO-URI.
1968
1980
  DicomJSONDataSource_metadataProvider.addImageIdToUIDs(imageId, {
1969
1981
  StudyInstanceUID,
1970
1982
  SeriesInstanceUID,
@@ -2322,8 +2334,7 @@ function createDicomLocalApi(dicomLocalConfig) {
2322
2334
  const {
2323
2335
  SeriesInstanceUID
2324
2336
  } = aSeries;
2325
- const isMultiframe = aSeries.instances[0].NumberOfFrames > 1;
2326
- aSeries.instances.forEach((instance, index) => {
2337
+ aSeries.instances.forEach(instance => {
2327
2338
  const {
2328
2339
  url: imageId,
2329
2340
  StudyInstanceUID,
@@ -2331,14 +2342,22 @@ function createDicomLocalApi(dicomLocalConfig) {
2331
2342
  SOPInstanceUID
2332
2343
  } = instance;
2333
2344
  instance.imageId = imageId;
2334
-
2335
- // Add imageId specific mapping to this data as the URL isn't necessarily WADO-URI.
2336
- DicomLocalDataSource_metadataProvider.addImageIdToUIDs(imageId, {
2337
- StudyInstanceUID,
2338
- SeriesInstanceUID,
2339
- SOPInstanceUID,
2340
- frameIndex: isMultiframe ? index : 1
2341
- });
2345
+ const numberOfFrames = instance.NumberOfFrames || 1;
2346
+ // Process all frames consistently, whether single or multiframe
2347
+ for (let i = 0; i < numberOfFrames; i++) {
2348
+ const frameNumber = i + 1;
2349
+ const frameImageId = implementation.getImageIdsForInstance({
2350
+ instance,
2351
+ frame: frameNumber
2352
+ });
2353
+ // Add imageId specific mapping to this data as the URL isn't necessarily WADO-URI.
2354
+ DicomLocalDataSource_metadataProvider.addImageIdToUIDs(frameImageId, {
2355
+ StudyInstanceUID,
2356
+ SeriesInstanceUID,
2357
+ SOPInstanceUID,
2358
+ frameNumber: numberOfFrames > 1 ? frameNumber : undefined
2359
+ });
2360
+ }
2342
2361
  });
2343
2362
  src/* DicomMetadataStore */.H8._broadcastEvent(EVENTS.INSTANCES_ADDED, {
2344
2363
  StudyInstanceUID,
@@ -2388,9 +2407,12 @@ function createDicomLocalApi(dicomLocalConfig) {
2388
2407
  instance,
2389
2408
  frame
2390
2409
  }) {
2391
- if (instance.imageId) {
2392
- return instance.imageId;
2393
- }
2410
+ // Important: Never use instance.imageId because it might be multiframe,
2411
+ // which would make it an invalid imageId.
2412
+ // if (instance.imageId) {
2413
+ // return instance.imageId;
2414
+ // }
2415
+
2394
2416
  const {
2395
2417
  StudyInstanceUID,
2396
2418
  SeriesInstanceUID,
@@ -3056,8 +3078,8 @@ function ViewerHeader({
3056
3078
  hotkeyDefinitions,
3057
3079
  hotkeyDefaults
3058
3080
  } = hotkeysManager;
3059
- const versionNumber = "3.9.1";
3060
- const commitHash = "610faa5a2738da5eabc40e57e338c359f481e852";
3081
+ const versionNumber = "3.9.2";
3082
+ const commitHash = "e5286d9fc2449da50b738e7e6208d489cce1633e";
3061
3083
  const menuOptions = [{
3062
3084
  title: t('Header:About'),
3063
3085
  icon: 'info',
@@ -6495,8 +6517,21 @@ const createToggleHangingProtocolStore = set => ({
6495
6517
  const useToggleHangingProtocolStore = (0,zustand_esm/* create */.vt)()(useToggleHangingProtocolStore_DEBUG_STORE ? (0,middleware/* devtools */.lt)(createToggleHangingProtocolStore, {
6496
6518
  name: 'ToggleHangingProtocolStore'
6497
6519
  }) : createToggleHangingProtocolStore);
6498
- // EXTERNAL MODULE: ../../../extensions/default/src/stores/useToggleOneUpViewportGridStore.ts
6499
- var useToggleOneUpViewportGridStore = __webpack_require__(73325);
6520
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/stores/useToggleOneUpViewportGridStore.ts
6521
+
6522
+ const useToggleOneUpViewportGridStore_PRESENTATION_TYPE_ID = 'toggleOneUpViewportGridId';
6523
+ // Stores the entire ViewportGridService getState when toggling to one up
6524
+ // (e.g. via a double click) so that it can be restored when toggling back.
6525
+ const useToggleOneUpViewportGridStore = (0,zustand_esm/* create */.vt)(set => ({
6526
+ toggleOneUpViewportGridStore: null,
6527
+ type: useToggleOneUpViewportGridStore_PRESENTATION_TYPE_ID,
6528
+ setToggleOneUpViewportGridStore: state => set({
6529
+ toggleOneUpViewportGridStore: state
6530
+ }),
6531
+ clearToggleOneUpViewportGridStore: () => set({
6532
+ toggleOneUpViewportGridStore: null
6533
+ })
6534
+ }));
6500
6535
  ;// CONCATENATED MODULE: ../../../extensions/default/src/commandsModule.ts
6501
6536
 
6502
6537
 
@@ -6798,7 +6833,7 @@ const commandsModule = ({
6798
6833
  // The viewer is in one-up. Check if there is a state to restore/toggle back to.
6799
6834
  const {
6800
6835
  toggleOneUpViewportGridStore
6801
- } = useToggleOneUpViewportGridStore/* useToggleOneUpViewportGridStore */.Y.getState();
6836
+ } = useToggleOneUpViewportGridStore.getState();
6802
6837
  if (!toggleOneUpViewportGridStore) {
6803
6838
  return;
6804
6839
  }
@@ -6854,7 +6889,7 @@ const commandsModule = ({
6854
6889
  // Store the current viewport grid state so we can toggle it back later.
6855
6890
  const {
6856
6891
  setToggleOneUpViewportGridStore
6857
- } = useToggleOneUpViewportGridStore/* useToggleOneUpViewportGridStore */.Y.getState();
6892
+ } = useToggleOneUpViewportGridStore.getState();
6858
6893
  setToggleOneUpViewportGridStore(viewportGridState);
6859
6894
 
6860
6895
  // one being toggled to one up.
@@ -9620,30 +9655,6 @@ const defaultExtension = {
9620
9655
  /* harmony default export */ const default_src = (defaultExtension);
9621
9656
 
9622
9657
 
9623
- /***/ }),
9624
-
9625
- /***/ 73325:
9626
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9627
-
9628
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
9629
- /* harmony export */ Y: () => (/* binding */ useToggleOneUpViewportGridStore)
9630
- /* harmony export */ });
9631
- /* harmony import */ var zustand__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(95759);
9632
-
9633
- const PRESENTATION_TYPE_ID = 'toggleOneUpViewportGridId';
9634
- // Stores the entire ViewportGridService getState when toggling to one up
9635
- // (e.g. via a double click) so that it can be restored when toggling back.
9636
- const useToggleOneUpViewportGridStore = (0,zustand__WEBPACK_IMPORTED_MODULE_0__/* .create */ .vt)(set => ({
9637
- toggleOneUpViewportGridStore: null,
9638
- type: PRESENTATION_TYPE_ID,
9639
- setToggleOneUpViewportGridStore: state => set({
9640
- toggleOneUpViewportGridStore: state
9641
- }),
9642
- clearToggleOneUpViewportGridStore: () => set({
9643
- toggleOneUpViewportGridStore: null
9644
- })
9645
- }));
9646
-
9647
9658
  /***/ })
9648
9659
 
9649
9660
  }]);