@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,14 +1,14 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[9195],{
2
+ (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[2851],{
3
3
 
4
- /***/ 52675:
5
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4
+ /***/ 52675
5
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
6
6
 
7
7
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
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__(12517);
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
 
@@ -110,10 +110,10 @@ function MoreDropdownMenu(bindProps) {
110
110
  return BoundMoreDropdownMenu;
111
111
  }
112
112
 
113
- /***/ }),
113
+ /***/ },
114
114
 
115
- /***/ 40565:
116
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
115
+ /***/ 40565
116
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
117
117
 
118
118
 
119
119
  // EXPORTS
@@ -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 + 3075 modules
127
- var src = __webpack_require__(12517);
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
@@ -239,7 +239,7 @@ function PanelStudyBrowser({
239
239
  commandsManager,
240
240
  servicesManager,
241
241
  isHangingProtocolLayout,
242
- appConfig: extensionManager._appConfig
242
+ appConfig: extensionManager.appConfig
243
243
  };
244
244
  const handlers = customHandler?.callbacks.map(callback => callback(setupArgs));
245
245
  for (const handler of handlers) {
@@ -491,7 +491,7 @@ function PanelStudyBrowser({
491
491
  updateActionIconValue: updateActionIconValue
492
492
  }), /*#__PURE__*/react.createElement(src/* Separator */.wvv, {
493
493
  orientation: "horizontal",
494
- className: "bg-black",
494
+ className: "bg-background",
495
495
  thickness: "2px"
496
496
  })), /*#__PURE__*/react.createElement(src/* StudyBrowser */.M4o, {
497
497
  tabs: tabs,
@@ -609,16 +609,16 @@ function _findTabAndStudyOfDisplaySet(displaySetInstanceUID, tabs, currentTabNam
609
609
  }
610
610
  }
611
611
 
612
- /***/ }),
612
+ /***/ },
613
613
 
614
- /***/ 3329:
615
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
614
+ /***/ 3329
615
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
616
616
 
617
617
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
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__(12517);
621
+ /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(564);
622
622
 
623
623
 
624
624
 
@@ -656,15 +656,15 @@ function PanelStudyBrowserHeader({
656
656
  key: index,
657
657
  "aria-label": viewPreset.id,
658
658
  value: viewPreset.id,
659
- className: "text-actions-primary"
659
+ className: "text-primary"
660
660
  }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__/* .Icons */ .FI1[viewPreset.iconName] || _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__/* .Icons */ .FI1.MissingIcon)))))))));
661
661
  }
662
662
 
663
663
 
664
- /***/ }),
664
+ /***/ },
665
665
 
666
- /***/ 20528:
667
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
666
+ /***/ 20528
667
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
668
668
 
669
669
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
670
670
  /* harmony export */ M: () => (/* binding */ Toolbar)
@@ -743,66 +743,41 @@ function Toolbar({
743
743
  }));
744
744
  }
745
745
 
746
- /***/ }),
746
+ /***/ },
747
747
 
748
- /***/ 39195:
749
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
748
+ /***/ 62851
749
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
750
750
 
751
- // ESM COMPAT FLAG
752
- __webpack_require__.r(__webpack_exports__);
753
751
 
754
752
  // EXPORTS
755
753
  __webpack_require__.d(__webpack_exports__, {
756
- ContextMenuController: () => (/* reexport */ ContextMenuController),
757
- CustomizableContextMenuTypes: () => (/* reexport */ types_namespaceObject),
758
- MoreDropdownMenu: () => (/* reexport */ MoreDropdownMenu/* default */.A),
759
- PanelStudyBrowserHeader: () => (/* reexport */ PanelStudyBrowserHeader/* PanelStudyBrowserHeader */.T),
760
- StaticWadoClient: () => (/* reexport */ StaticWadoClient),
761
- Toolbar: () => (/* reexport */ Toolbar/* Toolbar */.M),
762
- Toolbox: () => (/* reexport */ Toolbox),
763
- callInputDialog: () => (/* reexport */ callInputDialog),
764
- callInputDialogAutoComplete: () => (/* reexport */ callInputDialogAutoComplete),
765
- cleanDenaturalizedDataset: () => (/* reexport */ cleanDenaturalizedDataset),
766
- colorPickerDialog: () => (/* reexport */ colorPickerDialog),
767
- createReportAsync: () => (/* reexport */ Actions_createReportAsync),
768
- createReportDialogPrompt: () => (/* reexport */ CreateReportDialogPrompt),
754
+ tm: () => (/* reexport */ StaticWadoClient),
755
+ M7: () => (/* reexport */ Toolbar/* Toolbar */.M),
756
+ OO: () => (/* reexport */ Toolbox),
757
+ l5: () => (/* reexport */ callInputDialog),
758
+ fq: () => (/* reexport */ callInputDialogAutoComplete),
759
+ wZ: () => (/* reexport */ cleanDenaturalizedDataset),
760
+ wS: () => (/* reexport */ colorPickerDialog),
761
+ Vy: () => (/* reexport */ Actions_createReportAsync),
762
+ tc: () => (/* reexport */ CreateReportDialogPrompt),
769
763
  "default": () => (/* binding */ default_src),
770
- dicomWebUtils: () => (/* reexport */ utils_namespaceObject),
771
- getStudiesForPatientByMRN: () => (/* reexport */ Panels_getStudiesForPatientByMRN),
772
- promptLabelAnnotation: () => (/* reexport */ utils_promptLabelAnnotation),
773
- promptSaveReport: () => (/* reexport */ utils_promptSaveReport),
774
- requestDisplaySetCreationForStudy: () => (/* reexport */ Panels_requestDisplaySetCreationForStudy),
775
- useDisplaySetSelectorStore: () => (/* reexport */ useDisplaySetSelectorStore),
776
- useHangingProtocolStageIndexStore: () => (/* reexport */ useHangingProtocolStageIndexStore),
777
- usePatientInfo: () => (/* reexport */ hooks_usePatientInfo),
778
- useToggleHangingProtocolStore: () => (/* reexport */ useToggleHangingProtocolStore),
779
- useToggleOneUpViewportGridStore: () => (/* reexport */ useToggleOneUpViewportGridStore),
780
- useUIStateStore: () => (/* reexport */ useUIStateStore),
781
- useViewportGridStore: () => (/* reexport */ useViewportGridStore),
782
- useViewportsByPositionStore: () => (/* reexport */ useViewportsByPositionStore),
783
- utils: () => (/* reexport */ src_utils_namespaceObject)
764
+ CA: () => (/* reexport */ utils_namespaceObject),
765
+ uR: () => (/* reexport */ utils_promptLabelAnnotation),
766
+ MP: () => (/* reexport */ utils_promptSaveReport),
767
+ Z: () => (/* reexport */ Panels_requestDisplaySetCreationForStudy),
768
+ Yd: () => (/* reexport */ useToggleOneUpViewportGridStore),
769
+ FS: () => (/* reexport */ useUIStateStore)
784
770
  });
785
771
 
786
- // NAMESPACE OBJECT: ../../../extensions/default/src/CustomizableContextMenu/types.ts
787
- var types_namespaceObject = {};
788
- __webpack_require__.r(types_namespaceObject);
772
+ // UNUSED EXPORTS: ContextMenuController, CustomizableContextMenuTypes, MoreDropdownMenu, PanelStudyBrowserHeader, getStudiesForPatientByMRN, useDisplaySetSelectorStore, useHangingProtocolStageIndexStore, usePatientInfo, useToggleHangingProtocolStore, useViewportGridStore, useViewportsByPositionStore, utils
789
773
 
790
774
  // NAMESPACE OBJECT: ../../../extensions/default/src/DicomWebDataSource/utils/index.ts
791
775
  var utils_namespaceObject = {};
792
776
  __webpack_require__.r(utils_namespaceObject);
793
777
  __webpack_require__.d(utils_namespaceObject, {
794
- cleanDenaturalizedDataset: () => (cleanDenaturalizedDataset),
795
- fixBulkDataURI: () => (fixBulkDataURI),
796
- fixMultiValueKeys: () => (fixMultiValueKeys),
797
- transferDenaturalizedDataset: () => (transferDenaturalizedDataset)
798
- });
799
-
800
- // NAMESPACE OBJECT: ../../../extensions/default/src/utils/index.ts
801
- var src_utils_namespaceObject = {};
802
- __webpack_require__.r(src_utils_namespaceObject);
803
- __webpack_require__.d(src_utils_namespaceObject, {
804
- Toolbox: () => (Toolbox),
805
- addIcon: () => (addIcon)
778
+ wZ: () => (cleanDenaturalizedDataset),
779
+ Uk: () => (fixMultiValueKeys),
780
+ If: () => (transferDenaturalizedDataset)
806
781
  });
807
782
 
808
783
  // EXTERNAL MODULE: ../../../node_modules/dicomweb-client/build/dicomweb-client.es.js
@@ -2735,12 +2710,96 @@ function retrieveBulkData(value, options = {}) {
2735
2710
 
2736
2711
  // EXTERNAL MODULE: ../../../node_modules/query-string/index.js
2737
2712
  var query_string = __webpack_require__(98985);
2713
+ ;// ../../../extensions/default/src/utils/secureConfigFetch.js
2714
+ // @ts-nocheck
2715
+
2716
+ function normalizeAllowedOrigins(allowedOrigins = []) {
2717
+ if (!Array.isArray(allowedOrigins)) {
2718
+ return [];
2719
+ }
2720
+ const configuredOrigins = allowedOrigins.filter(origin => typeof origin === 'string').map(origin => origin.trim()).filter(Boolean);
2721
+ return configuredOrigins.map(origin => {
2722
+ try {
2723
+ const parsedOrigin = new URL(origin);
2724
+ if (!['http:', 'https:'].includes(parsedOrigin.protocol)) {
2725
+ console.error(`[secureConfigFetch] Ignoring misconfigured allowed origin "${origin}". ` + 'Entries must use http:// or https://.');
2726
+ return null;
2727
+ }
2728
+ if (parsedOrigin.username || parsedOrigin.password || parsedOrigin.pathname !== '/' || parsedOrigin.search || parsedOrigin.hash) {
2729
+ console.error(`[secureConfigFetch] Ignoring misconfigured allowed origin "${origin}". ` + 'Entries must be bare origins only (scheme + host + optional port), with no username/password, path, query, or hash.');
2730
+ return null;
2731
+ }
2732
+ return parsedOrigin.origin;
2733
+ } catch {
2734
+ console.error(`[secureConfigFetch] Ignoring misconfigured allowed origin "${origin}". Entry is not a valid URL.`);
2735
+ return null;
2736
+ }
2737
+ }).filter(Boolean);
2738
+ }
2739
+ function resolveConfigUrl(rawUrl) {
2740
+ if (!rawUrl || typeof rawUrl !== 'string') {
2741
+ throw new Error('Missing required "url" query parameter');
2742
+ }
2743
+ try {
2744
+ return new URL(rawUrl, window.location.href);
2745
+ } catch {
2746
+ throw new Error('Invalid URL in "url" query parameter');
2747
+ }
2748
+ }
2749
+ function resolveConfigFetchPolicy(rawUrl, policy = {}) {
2750
+ const {
2751
+ allowedOrigins = [],
2752
+ userAuthenticationService
2753
+ } = policy;
2754
+ const parsedUrl = resolveConfigUrl(rawUrl);
2755
+ const protocol = parsedUrl.protocol.toLowerCase();
2756
+ if (!['http:', 'https:'].includes(protocol)) {
2757
+ throw new Error('Only HTTP(S) URLs are allowed for dynamic datasource configuration');
2758
+ }
2759
+ if (parsedUrl.hash) {
2760
+ throw new Error('URL fragments are not allowed for dynamic datasource configuration');
2761
+ }
2762
+ if (parsedUrl.username || parsedUrl.password) {
2763
+ throw new Error('URL userinfo is not allowed for dynamic datasource configuration');
2764
+ }
2765
+ const isAuthenticated = Boolean(userAuthenticationService?.getAuthorizationHeader?.()?.Authorization);
2766
+ if (isAuthenticated) {
2767
+ const normalizedAllowedOrigins = normalizeAllowedOrigins(allowedOrigins);
2768
+ if (!normalizedAllowedOrigins.length || !normalizedAllowedOrigins.includes(parsedUrl.origin)) {
2769
+ throw new Error(`Blocked remote configuration origin "${parsedUrl.origin}" in authenticated environment`);
2770
+ }
2771
+ }
2772
+ return {
2773
+ parsedUrl,
2774
+ normalizedUrl: parsedUrl.toString(),
2775
+ isAuthenticated
2776
+ };
2777
+ }
2778
+ async function fetchConfigJson(normalizedPolicy) {
2779
+ const {
2780
+ normalizedUrl,
2781
+ isAuthenticated
2782
+ } = normalizedPolicy;
2783
+ const response = isAuthenticated ? await fetch(normalizedUrl) : await fetch(normalizedUrl, {
2784
+ method: 'GET',
2785
+ mode: 'cors',
2786
+ credentials: 'omit',
2787
+ redirect: 'error',
2788
+ referrerPolicy: 'no-referrer'
2789
+ });
2790
+ if (!response.ok) {
2791
+ throw new Error(`Failed to fetch dynamic datasource configuration (${response.status})`);
2792
+ }
2793
+ return response.json();
2794
+ }
2795
+
2738
2796
  ;// ../../../extensions/default/src/DicomJSONDataSource/index.js
2739
2797
 
2740
2798
 
2741
2799
 
2742
2800
 
2743
2801
 
2802
+
2744
2803
  const DicomJSONDataSource_metadataProvider = src/* default.classes */.Ay.classes.MetadataProvider;
2745
2804
  const mappings = {
2746
2805
  studyInstanceUid: 'StudyInstanceUID',
@@ -2787,7 +2846,10 @@ const findStudies = (key, value) => {
2787
2846
  });
2788
2847
  return studies;
2789
2848
  };
2790
- function createDicomJSONApi(dicomJsonConfig) {
2849
+ function createDicomJSONApi(dicomJsonConfig, servicesManager) {
2850
+ const {
2851
+ userAuthenticationService
2852
+ } = servicesManager.services;
2791
2853
  const implementation = {
2792
2854
  initialize: async ({
2793
2855
  query,
@@ -2796,7 +2858,11 @@ function createDicomJSONApi(dicomJsonConfig) {
2796
2858
  if (!url) {
2797
2859
  url = query.get('url');
2798
2860
  }
2799
- let metaData = getMetaDataByURL(url);
2861
+ const evaluatedUrl = resolveConfigFetchPolicy(url, {
2862
+ allowedOrigins: dicomJsonConfig.dangerouslyAllowedOriginsForAuthenticatedEnvironments,
2863
+ userAuthenticationService
2864
+ });
2865
+ let metaData = getMetaDataByURL(evaluatedUrl.normalizedUrl);
2800
2866
 
2801
2867
  // if we have already cached the data from this specific url
2802
2868
  // We are only handling one StudyInstanceUID to run; however,
@@ -2806,8 +2872,7 @@ function createDicomJSONApi(dicomJsonConfig) {
2806
2872
  return aStudy.StudyInstanceUID;
2807
2873
  });
2808
2874
  }
2809
- const response = await fetch(url);
2810
- const data = await response.json();
2875
+ const data = await fetchConfigJson(evaluatedUrl);
2811
2876
  let StudyInstanceUID;
2812
2877
  let SeriesInstanceUID;
2813
2878
  data.studies.forEach(study => {
@@ -2837,10 +2902,10 @@ function createDicomJSONApi(dicomJsonConfig) {
2837
2902
  });
2838
2903
  });
2839
2904
  _store.urls.push({
2840
- url,
2905
+ url: evaluatedUrl.normalizedUrl,
2841
2906
  studies: [...data.studies]
2842
2907
  });
2843
- _store.studyInstanceUIDMap.set(url, data.studies.map(study => study.StudyInstanceUID));
2908
+ _store.studyInstanceUIDMap.set(evaluatedUrl.normalizedUrl, data.studies.map(study => study.StudyInstanceUID));
2844
2909
  },
2845
2910
  query: {
2846
2911
  studies: {
@@ -2975,6 +3040,8 @@ function createDicomJSONApi(dicomJsonConfig) {
2975
3040
  console.warn(' DICOMJson store dicom not implemented');
2976
3041
  }
2977
3042
  },
3043
+ reject: {},
3044
+ deleteStudyMetadataPromise: () => {},
2978
3045
  getImageIdsForDisplaySet(displaySet) {
2979
3046
  const images = displaySet.images;
2980
3047
  const imageIds = [];
@@ -3033,8 +3100,20 @@ function createDicomJSONApi(dicomJsonConfig) {
3033
3100
  query
3034
3101
  }) => {
3035
3102
  const url = query.get('url');
3036
- return _store.studyInstanceUIDMap.get(url);
3037
- }
3103
+ if (!url) {
3104
+ return;
3105
+ }
3106
+ try {
3107
+ const evaluatedUrl = resolveConfigFetchPolicy(url, {
3108
+ allowedOrigins: dicomJsonConfig.dangerouslyAllowedOriginsForAuthenticatedEnvironments,
3109
+ userAuthenticationService
3110
+ });
3111
+ return _store.studyInstanceUIDMap.get(evaluatedUrl.normalizedUrl);
3112
+ } catch {
3113
+ return;
3114
+ }
3115
+ },
3116
+ getConfig: () => dicomJsonConfig
3038
3117
  };
3039
3118
  return src/* IWebApiDataSource */.pt.create(implementation);
3040
3119
  }
@@ -3303,6 +3382,7 @@ function createDicomLocalApi(dicomLocalConfig) {
3303
3382
 
3304
3383
 
3305
3384
 
3385
+
3306
3386
  /**
3307
3387
  * This datasource is initialized with a url that returns a JSON object with a
3308
3388
  * dicomWeb datasource configuration array present in a "servers" object.
@@ -3315,6 +3395,9 @@ function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager) {
3315
3395
  const {
3316
3396
  name
3317
3397
  } = dicomWebProxyConfig;
3398
+ const {
3399
+ userAuthenticationService
3400
+ } = servicesManager.services;
3318
3401
  let dicomWebDelegate = undefined;
3319
3402
  const implementation = {
3320
3403
  initialize: async ({
@@ -3325,8 +3408,11 @@ function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager) {
3325
3408
  if (!url) {
3326
3409
  throw new Error(`No url for '${name}'`);
3327
3410
  } else {
3328
- const response = await fetch(url);
3329
- const data = await response.json();
3411
+ const evaluatedUrl = resolveConfigFetchPolicy(url, {
3412
+ allowedOrigins: dicomWebProxyConfig.dangerouslyAllowedOriginsForAuthenticatedEnvironments,
3413
+ userAuthenticationService
3414
+ });
3415
+ const data = await fetchConfigJson(evaluatedUrl);
3330
3416
  if (!data.servers?.dicomWeb?.[0]) {
3331
3417
  throw new Error('Invalid configuration returned by url');
3332
3418
  }
@@ -3357,9 +3443,15 @@ function createDicomWebProxyApi(dicomWebProxyConfig, servicesManager) {
3357
3443
  store: {
3358
3444
  dicom: (...args) => dicomWebDelegate.store.dicom(...args)
3359
3445
  },
3360
- deleteStudyMetadataPromise: (...args) => dicomWebDelegate.deleteStudyMetadataPromise(...args),
3361
- getImageIdsForDisplaySet: (...args) => dicomWebDelegate.getImageIdsForDisplaySet(...args),
3362
- getImageIdsForInstance: (...args) => dicomWebDelegate.getImageIdsForInstance(...args),
3446
+ reject: {
3447
+ series: (...args) => dicomWebDelegate?.reject?.series?.(...args)
3448
+ },
3449
+ deleteStudyMetadataPromise: (...args) => dicomWebDelegate?.deleteStudyMetadataPromise?.(...args),
3450
+ getImageIdsForDisplaySet: (...args) => dicomWebDelegate?.getImageIdsForDisplaySet?.(...args),
3451
+ getImageIdsForInstance: (...args) => dicomWebDelegate?.getImageIdsForInstance?.(...args),
3452
+ getConfig: (...args) => dicomWebDelegate?.getConfig?.(...args) ?? {
3453
+ dicomUploadEnabled: false
3454
+ },
3363
3455
  getStudyInstanceUIDs({
3364
3456
  params,
3365
3457
  query
@@ -3697,8 +3789,8 @@ var react = __webpack_require__(86326);
3697
3789
  // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
3698
3790
  var prop_types = __webpack_require__(97598);
3699
3791
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
3700
- // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3075 modules
3701
- var ui_next_src = __webpack_require__(12517);
3792
+ // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3085 modules
3793
+ var ui_next_src = __webpack_require__(564);
3702
3794
  // EXTERNAL MODULE: ./state/index.js + 1 modules
3703
3795
  var state = __webpack_require__(45981);
3704
3796
  // EXTERNAL MODULE: ../../../node_modules/react-router-dom/dist/index.js
@@ -3811,7 +3903,7 @@ function HeaderPatientInfo({
3811
3903
  const formattedPatientName = formatWithEllipsis(patientInfo.PatientName, 27);
3812
3904
  const formattedPatientID = formatWithEllipsis(patientInfo.PatientID, 15);
3813
3905
  return /*#__PURE__*/react.createElement("div", {
3814
- className: "hover:bg-primary-dark flex cursor-pointer items-center justify-center gap-1 rounded-lg",
3906
+ className: "hover:bg-muted flex cursor-pointer items-center justify-center gap-1 rounded-lg",
3815
3907
  onClick: handleOnClick
3816
3908
  }, isMixedPatients ? /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.MultiplePatients, {
3817
3909
  className: "text-primary"
@@ -3820,9 +3912,9 @@ function HeaderPatientInfo({
3820
3912
  }), /*#__PURE__*/react.createElement("div", {
3821
3913
  className: "flex flex-col justify-center"
3822
3914
  }, expanded ? /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
3823
- className: "self-start text-[13px] font-bold text-white"
3915
+ className: "text-foreground self-start text-[13px] font-bold"
3824
3916
  }, formattedPatientName), /*#__PURE__*/react.createElement("div", {
3825
- className: "text-aqua-pale flex gap-2 text-[11px]"
3917
+ className: "text-muted-foreground flex gap-2 text-[11px]"
3826
3918
  }, /*#__PURE__*/react.createElement("div", null, formattedPatientID), /*#__PURE__*/react.createElement("div", null, patientInfo.PatientSex), /*#__PURE__*/react.createElement("div", null, patientInfo.PatientDOB))) : /*#__PURE__*/react.createElement("div", {
3827
3919
  className: "text-primary self-center text-[13px]"
3828
3920
  }, isMixedPatients ? 'Multiple Patients' : 'Patient')), /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.ArrowLeft, {
@@ -3925,7 +4017,7 @@ function ViewerHeader({
3925
4017
  className: "text-primary flex cursor-pointer items-center"
3926
4018
  }, /*#__PURE__*/react.createElement(ui_next_src/* Button */.$nd, {
3927
4019
  variant: "ghost",
3928
- className: "hover:bg-primary-dark",
4020
+ className: "hover:bg-muted",
3929
4021
  onClick: () => {
3930
4022
  commandsManager.run('undo');
3931
4023
  }
@@ -3933,7 +4025,7 @@ function ViewerHeader({
3933
4025
  className: ""
3934
4026
  })), /*#__PURE__*/react.createElement(ui_next_src/* Button */.$nd, {
3935
4027
  variant: "ghost",
3936
- className: "hover:bg-primary-dark",
4028
+ className: "hover:bg-muted",
3937
4029
  onClick: () => {
3938
4030
  commandsManager.run('redo');
3939
4031
  }
@@ -4355,7 +4447,7 @@ function ViewerLayout_extends() { return ViewerLayout_extends = Object.assign ?
4355
4447
 
4356
4448
 
4357
4449
 
4358
- const resizableHandleClassName = 'mt-[1px] bg-black';
4450
+ const resizableHandleClassName = 'mt-[1px] bg-background';
4359
4451
  function ViewerLayout({
4360
4452
  // From Extension Module Params
4361
4453
  extensionManager,
@@ -4398,10 +4490,10 @@ function ViewerLayout({
4398
4490
  * is sized to our viewport.
4399
4491
  */
4400
4492
  (0,react.useEffect)(() => {
4401
- document.body.classList.add('bg-black');
4493
+ document.body.classList.add('bg-background');
4402
4494
  document.body.classList.add('overflow-hidden');
4403
4495
  return () => {
4404
- document.body.classList.remove('bg-black');
4496
+ document.body.classList.remove('bg-background');
4405
4497
  document.body.classList.remove('overflow-hidden');
4406
4498
  };
4407
4499
  }, []);
@@ -4464,12 +4556,12 @@ function ViewerLayout({
4464
4556
  servicesManager: servicesManager,
4465
4557
  appConfig: appConfig
4466
4558
  }), /*#__PURE__*/react.createElement("div", {
4467
- className: "relative flex w-full flex-row flex-nowrap items-stretch overflow-hidden bg-black",
4559
+ className: "relative flex w-full flex-row flex-nowrap items-stretch overflow-hidden bg-background",
4468
4560
  style: {
4469
4561
  height: 'calc(100vh - 52px'
4470
4562
  }
4471
4563
  }, /*#__PURE__*/react.createElement(react.Fragment, null, showLoadingIndicator && /*#__PURE__*/react.createElement(LoadingIndicatorProgress, {
4472
- className: "h-full w-full bg-black"
4564
+ className: "h-full w-full bg-background"
4473
4565
  }), /*#__PURE__*/react.createElement(ui_next_src/* ResizablePanelGroup */.HKS, resizablePanelGroupProps, hasLeftPanels ? /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(ui_next_src/* ResizablePanel */.wVo, resizableLeftPanelProps, /*#__PURE__*/react.createElement(Components_SidePanelWithServices, ViewerLayout_extends({
4474
4566
  side: "left",
4475
4567
  isExpanded: !leftPanelClosedState,
@@ -4481,7 +4573,7 @@ function ViewerLayout({
4481
4573
  })) : null, /*#__PURE__*/react.createElement(ui_next_src/* ResizablePanel */.wVo, resizableViewportGridPanelProps, /*#__PURE__*/react.createElement("div", {
4482
4574
  className: "flex h-full flex-1 flex-col"
4483
4575
  }, /*#__PURE__*/react.createElement("div", {
4484
- className: "relative flex h-full flex-1 items-center justify-center overflow-hidden bg-black",
4576
+ className: "relative flex h-full flex-1 items-center justify-center overflow-hidden bg-background",
4485
4577
  onMouseEnter: handleMouseEnter
4486
4578
  }, /*#__PURE__*/react.createElement(ViewportGridComp, {
4487
4579
  servicesManager: servicesManager,
@@ -4688,7 +4780,8 @@ function CreateReportDialogPrompt({
4688
4780
  minSeriesNumber = 0,
4689
4781
  predecessorImageId,
4690
4782
  extensionManager,
4691
- servicesManager
4783
+ servicesManager,
4784
+ enableDownload = false
4692
4785
  }) {
4693
4786
  const {
4694
4787
  uiDialogService,
@@ -4708,6 +4801,7 @@ function CreateReportDialogPrompt({
4708
4801
  predecessorImageId,
4709
4802
  minSeriesNumber,
4710
4803
  modality,
4804
+ enableDownload,
4711
4805
  onSave: async ({
4712
4806
  reportName,
4713
4807
  dataSource: selectedDataSource,
@@ -5180,7 +5274,6 @@ var dist_esm = __webpack_require__(15327);
5180
5274
  const {
5181
5275
  isImage,
5182
5276
  sortStudyInstances,
5183
- instancesSortCriteria,
5184
5277
  sopClassDictionary,
5185
5278
  isDisplaySetReconstructable: getSopClassHandlerModule_isDisplaySetReconstructable
5186
5279
  } = src/* utils */.Wp;
@@ -5225,12 +5318,17 @@ function getDisplaySetInfo(instances) {
5225
5318
  const instancesMap = new Map();
5226
5319
  let firstTimePointInstances;
5227
5320
  if (instances[0].NumberOfFrames > 1 && timePoints.length > 1) {
5228
- // handle multiframe dynamic volume
5229
- firstTimePointInstances = timePoints[0].map(imageId => dist_esm.metaData.get('instance', imageId));
5321
+ // Handle multiframe dynamic volumes. Local file frame imageIds do not
5322
+ // always resolve to a frame-level instance object, so keep resolved
5323
+ // entries and fall back to the source multiframe instance when needed.
5324
+ firstTimePointInstances = timePoints[0].map(imageId => dist_esm.metaData.get('instance', imageId)).filter(Boolean);
5325
+ if (!firstTimePointInstances.length) {
5326
+ firstTimePointInstances = [instances[0]];
5327
+ }
5230
5328
  } else {
5231
5329
  // O(n) to convert it into a map and O(1) to find each instance
5232
5330
  instances.forEach(instance => instancesMap.set(instance.imageId, instance));
5233
- firstTimePointInstances = timePoint.map(imageId => instancesMap.get(imageId));
5331
+ firstTimePointInstances = timePoint.map(imageId => instancesMap.get(imageId)).filter(Boolean);
5234
5332
  }
5235
5333
  displaySetInfo = getSopClassHandlerModule_isDisplaySetReconstructable(firstTimePointInstances, appConfig);
5236
5334
  } else {
@@ -5393,7 +5491,7 @@ function getDisplaySetsFromSeries(instances) {
5393
5491
  }
5394
5492
  return displaySets;
5395
5493
  }
5396
- const getSopClassHandlerModule_sopClassUids = [sopClassDictionary.ComputedRadiographyImageStorage, sopClassDictionary.DigitalXRayImageStorageForPresentation, sopClassDictionary.DigitalXRayImageStorageForProcessing, sopClassDictionary.DigitalMammographyXRayImageStorageForPresentation, sopClassDictionary.DigitalMammographyXRayImageStorageForProcessing, sopClassDictionary.DigitalIntraOralXRayImageStorageForPresentation, sopClassDictionary.DigitalIntraOralXRayImageStorageForProcessing, sopClassDictionary.CTImageStorage, sopClassDictionary.EnhancedCTImageStorage, sopClassDictionary.LegacyConvertedEnhancedCTImageStorage, sopClassDictionary.UltrasoundMultiframeImageStorage, sopClassDictionary.MRImageStorage, sopClassDictionary.EnhancedMRImageStorage, sopClassDictionary.EnhancedMRColorImageStorage, sopClassDictionary.LegacyConvertedEnhancedMRImageStorage, sopClassDictionary.UltrasoundImageStorage, sopClassDictionary.UltrasoundImageStorageRET, sopClassDictionary.SecondaryCaptureImageStorage, sopClassDictionary.MultiframeSingleBitSecondaryCaptureImageStorage, sopClassDictionary.MultiframeGrayscaleByteSecondaryCaptureImageStorage, sopClassDictionary.MultiframeGrayscaleWordSecondaryCaptureImageStorage, sopClassDictionary.MultiframeTrueColorSecondaryCaptureImageStorage, sopClassDictionary.XRayAngiographicImageStorage, sopClassDictionary.EnhancedXAImageStorage, sopClassDictionary.XRayRadiofluoroscopicImageStorage, sopClassDictionary.EnhancedXRFImageStorage, sopClassDictionary.XRay3DAngiographicImageStorage, sopClassDictionary.XRay3DCraniofacialImageStorage, sopClassDictionary.BreastTomosynthesisImageStorage, sopClassDictionary.BreastProjectionXRayImageStorageForPresentation, sopClassDictionary.BreastProjectionXRayImageStorageForProcessing, sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForPresentation, sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForProcessing, sopClassDictionary.NuclearMedicineImageStorage, sopClassDictionary.VLEndoscopicImageStorage, sopClassDictionary.VideoEndoscopicImageStorage, sopClassDictionary.VLMicroscopicImageStorage, sopClassDictionary.VideoMicroscopicImageStorage, sopClassDictionary.VLSlideCoordinatesMicroscopicImageStorage, sopClassDictionary.VLPhotographicImageStorage, sopClassDictionary.VideoPhotographicImageStorage, sopClassDictionary.OphthalmicPhotography8BitImageStorage, sopClassDictionary.OphthalmicPhotography16BitImageStorage, sopClassDictionary.OphthalmicTomographyImageStorage,
5494
+ const getSopClassHandlerModule_sopClassUids = [sopClassDictionary.ComputedRadiographyImageStorage, sopClassDictionary.DigitalXRayImageStorageForPresentation, sopClassDictionary.DigitalXRayImageStorageForProcessing, sopClassDictionary.DigitalMammographyXRayImageStorageForPresentation, sopClassDictionary.DigitalMammographyXRayImageStorageForProcessing, sopClassDictionary.DigitalIntraOralXRayImageStorageForPresentation, sopClassDictionary.DigitalIntraOralXRayImageStorageForProcessing, sopClassDictionary.CTImageStorage, sopClassDictionary.EnhancedCTImageStorage, sopClassDictionary.LegacyConvertedEnhancedCTImageStorage, sopClassDictionary.UltrasoundMultiframeImageStorage, sopClassDictionary.MRImageStorage, sopClassDictionary.EnhancedMRImageStorage, sopClassDictionary.EnhancedMRColorImageStorage, sopClassDictionary.LegacyConvertedEnhancedMRImageStorage, sopClassDictionary.UltrasoundImageStorage, sopClassDictionary.UltrasoundImageStorageRET, sopClassDictionary.SecondaryCaptureImageStorage, sopClassDictionary.MultiframeSingleBitSecondaryCaptureImageStorage, sopClassDictionary.MultiframeGrayscaleByteSecondaryCaptureImageStorage, sopClassDictionary.MultiframeGrayscaleWordSecondaryCaptureImageStorage, sopClassDictionary.MultiframeTrueColorSecondaryCaptureImageStorage, sopClassDictionary.XRayAngiographicImageStorage, sopClassDictionary.EnhancedXAImageStorage, sopClassDictionary.XRayRadiofluoroscopicImageStorage, sopClassDictionary.EnhancedXRFImageStorage, sopClassDictionary.XRay3DAngiographicImageStorage, sopClassDictionary.XRay3DCraniofacialImageStorage, sopClassDictionary.BreastTomosynthesisImageStorage, sopClassDictionary.CornealTopographyMapStorage, sopClassDictionary.BreastProjectionXRayImageStorageForPresentation, sopClassDictionary.BreastProjectionXRayImageStorageForProcessing, sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForPresentation, sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForProcessing, sopClassDictionary.NuclearMedicineImageStorage, sopClassDictionary.VLEndoscopicImageStorage, sopClassDictionary.VideoEndoscopicImageStorage, sopClassDictionary.VLMicroscopicImageStorage, sopClassDictionary.VideoMicroscopicImageStorage, sopClassDictionary.VLSlideCoordinatesMicroscopicImageStorage, sopClassDictionary.VLPhotographicImageStorage, sopClassDictionary.VideoPhotographicImageStorage, sopClassDictionary.OphthalmicPhotography8BitImageStorage, sopClassDictionary.OphthalmicPhotography16BitImageStorage, sopClassDictionary.OphthalmicTomographyImageStorage,
5397
5495
  // Handled by another sop class module
5398
5496
  // sopClassDictionary.VLWholeSlideMicroscopyImageStorage,
5399
5497
  sopClassDictionary.PositronEmissionTomographyImageStorage, sopClassDictionary.EnhancedPETImageStorage, sopClassDictionary.LegacyConvertedEnhancedPETImageStorage, sopClassDictionary.RTImageStorage, sopClassDictionary.EnhancedUSVolumeStorage, sopClassDictionary.RTDoseStorage];
@@ -5555,7 +5653,7 @@ function ToolbarLayoutSelectorWithServices({
5555
5653
  disabled: preset.disabled,
5556
5654
  isPreset: true
5557
5655
  })))), /*#__PURE__*/react.createElement("div", {
5558
- className: "bg-muted flex flex-col gap-2.5 border-l-2 border-solid border-black p-2"
5656
+ className: "bg-muted flex flex-col gap-2.5 border-l-2 border-solid border-background p-2"
5559
5657
  }, /*#__PURE__*/react.createElement("div", {
5560
5658
  className: "text-muted-foreground text-xs"
5561
5659
  }, t('Custom')), /*#__PURE__*/react.createElement(ui_next_src/* LayoutSelector */.sG4.GridSelector, {
@@ -5843,6 +5941,7 @@ function ToolButtonWrapper(props) {
5843
5941
  }
5844
5942
 
5845
5943
  ;// ../../../extensions/default/src/Toolbar/ToolbarDivider.tsx
5944
+ /* unused harmony import specifier */ var React;
5846
5945
 
5847
5946
  function ToolbarDivider() {
5848
5947
  return /*#__PURE__*/React.createElement("span", {
@@ -6315,7 +6414,7 @@ const RowComponent = ({
6315
6414
  ...style,
6316
6415
  ...rowStyle
6317
6416
  },
6318
- className: classnames_default()('hover:bg-secondary-main border-secondary-light text-foreground flex w-full flex-row items-center break-all bg-black text-base transition duration-300', lineHeightClassName),
6417
+ className: classnames_default()('hover:bg-primary/25 border-input text-foreground flex w-full flex-row items-center break-all bg-background text-base', lineHeightClassName),
6319
6418
  key: keyPrefix
6320
6419
  }, isChildOrParent && /*#__PURE__*/react.createElement("div", {
6321
6420
  style: {
@@ -6345,34 +6444,34 @@ function ColumnHeaders({
6345
6444
  valueRef
6346
6445
  }) {
6347
6446
  return /*#__PURE__*/react.createElement("div", {
6348
- className: classnames_default()('bg-secondary-dark ohif-scrollbar flex w-full flex-row overflow-y-scroll'),
6447
+ className: classnames_default()('bg-popover ohif-scrollbar flex w-full flex-row overflow-y-scroll'),
6349
6448
  style: rowVerticalPaddingStyle
6350
6449
  }, /*#__PURE__*/react.createElement("div", {
6351
6450
  className: "w-4/24 px-3"
6352
6451
  }, /*#__PURE__*/react.createElement("label", {
6353
6452
  ref: tagRef,
6354
- className: "flex flex-1 select-none flex-col pl-1 text-lg text-white"
6453
+ className: "text-foreground flex flex-1 select-none flex-col pl-1 text-lg"
6355
6454
  }, /*#__PURE__*/react.createElement("span", {
6356
6455
  className: "flex flex-row items-center focus:outline-none"
6357
6456
  }, "Tag"))), /*#__PURE__*/react.createElement("div", {
6358
6457
  className: "w-2/24 px-3"
6359
6458
  }, /*#__PURE__*/react.createElement("label", {
6360
6459
  ref: vrRef,
6361
- className: "flex flex-1 select-none flex-col pl-1 text-lg text-white"
6460
+ className: "text-foreground flex flex-1 select-none flex-col pl-1 text-lg"
6362
6461
  }, /*#__PURE__*/react.createElement("span", {
6363
6462
  className: "flex flex-row items-center focus:outline-none"
6364
6463
  }, "VR"))), /*#__PURE__*/react.createElement("div", {
6365
6464
  className: "w-6/24 px-3"
6366
6465
  }, /*#__PURE__*/react.createElement("label", {
6367
6466
  ref: keywordRef,
6368
- className: "flex flex-1 select-none flex-col pl-1 text-lg text-white"
6467
+ className: "text-foreground flex flex-1 select-none flex-col pl-1 text-lg"
6369
6468
  }, /*#__PURE__*/react.createElement("span", {
6370
6469
  className: "flex flex-row items-center focus:outline-none"
6371
6470
  }, "Keyword"))), /*#__PURE__*/react.createElement("div", {
6372
6471
  className: "w-5/24 grow px-3"
6373
6472
  }, /*#__PURE__*/react.createElement("label", {
6374
6473
  ref: valueRef,
6375
- className: "flex flex-1 select-none flex-col pl-1 text-lg text-white"
6474
+ className: "text-foreground flex flex-1 select-none flex-col pl-1 text-lg"
6376
6475
  }, /*#__PURE__*/react.createElement("span", {
6377
6476
  className: "flex flex-row items-center focus:outline-none"
6378
6477
  }, "Value"))));
@@ -6520,7 +6619,7 @@ function DicomTagTable({
6520
6619
  keywordRef: keywordRef,
6521
6620
  valueRef: valueRef
6522
6621
  }), /*#__PURE__*/react.createElement("div", {
6523
- className: "relative m-auto border-2 border-black bg-black",
6622
+ className: "relative m-auto border-2 border-background bg-background",
6524
6623
  style: {
6525
6624
  height: '32rem'
6526
6625
  }
@@ -6635,7 +6734,7 @@ const DicomTagBrowser = ({
6635
6734
  }, /*#__PURE__*/react.createElement("div", {
6636
6735
  className: "mb-6 flex flex-row items-start pl-1"
6637
6736
  }, /*#__PURE__*/react.createElement("div", {
6638
- className: "flex w-full flex-row items-start gap-4"
6737
+ className: "flex w-full flex-row items-start gap-6"
6639
6738
  }, /*#__PURE__*/react.createElement("div", {
6640
6739
  className: "flex w-1/3 flex-col"
6641
6740
  }, /*#__PURE__*/react.createElement("span", {
@@ -6645,7 +6744,11 @@ const DicomTagBrowser = ({
6645
6744
  onValueChange: value => onSelectChange({
6646
6745
  value
6647
6746
  })
6648
- }, /*#__PURE__*/react.createElement(ui_next_src/* SelectTrigger */.bqE, null, displaySetList.find(ds => ds.value === selectedDisplaySetInstanceUID)?.label || 'Select Series'), /*#__PURE__*/react.createElement(ui_next_src/* SelectContent */.gCo, null, displaySetList.map(item => {
6747
+ }, /*#__PURE__*/react.createElement(ui_next_src/* SelectTrigger */.bqE, {
6748
+ "data-cy": "dicom-tag-series-select-trigger"
6749
+ }, /*#__PURE__*/react.createElement(ui_next_src/* SelectValue */.yvm, {
6750
+ "data-cy": "dicom-tag-series-select-value"
6751
+ }, displaySetList.find(ds => ds.value === selectedDisplaySetInstanceUID)?.label || 'Select Series')), /*#__PURE__*/react.createElement(ui_next_src/* SelectContent */.gCo, null, displaySetList.map(item => {
6649
6752
  return /*#__PURE__*/react.createElement(ui_next_src/* SelectItem */.ebT, {
6650
6753
  key: item.value,
6651
6754
  value: item.value
@@ -6664,7 +6767,7 @@ const DicomTagBrowser = ({
6664
6767
  min: 1,
6665
6768
  max: activeDisplaySet?.images?.length,
6666
6769
  step: 1,
6667
- className: "pt-4"
6770
+ className: "pt-3"
6668
6771
  })), /*#__PURE__*/react.createElement("div", {
6669
6772
  className: "ml-auto mr-1 flex w-1/3 flex-col"
6670
6773
  }, /*#__PURE__*/react.createElement("span", {
@@ -7537,8 +7640,6 @@ const useToggleOneUpViewportGridStore = (0,zustand_esm/* create */.vt)(set => ({
7537
7640
  })
7538
7641
  }));
7539
7642
  ;// ../../../extensions/default/src/Actions/createReportAsync.tsx
7540
-
7541
-
7542
7643
  /**
7543
7644
  *
7544
7645
  * @param {*} servicesManager
@@ -7546,7 +7647,8 @@ const useToggleOneUpViewportGridStore = (0,zustand_esm/* create */.vt)(set => ({
7546
7647
  async function createReportAsync({
7547
7648
  servicesManager,
7548
7649
  getReport,
7549
- reportType = 'measurement'
7650
+ reportType = 'Measurements',
7651
+ successMessage
7550
7652
  }) {
7551
7653
  const {
7552
7654
  displaySetService,
@@ -7559,15 +7661,13 @@ async function createReportAsync({
7559
7661
  return;
7560
7662
  }
7561
7663
 
7562
- // The "Mode" route listens for DicomMetadataStore changes
7563
- // When a new instance is added, it listens and
7564
- // automatically calls makeDisplaySets
7565
- src/* DicomMetadataStore */.H8.addInstances([naturalizedReport], true);
7664
+ // addInstances is called by the store command (storeMeasurements/storeSegmentation),
7665
+ // so the display set should already exist at this point.
7566
7666
  const displaySet = displaySetService.getMostRecentDisplaySet();
7567
7667
  const displaySetInstanceUID = displaySet.displaySetInstanceUID;
7568
7668
  uiNotificationService.show({
7569
7669
  title: 'Create Report',
7570
- message: `${reportType} saved successfully`,
7670
+ message: successMessage ?? `${reportType} saved successfully`,
7571
7671
  type: 'success'
7572
7672
  });
7573
7673
  return [displaySetInstanceUID];
@@ -7623,34 +7723,32 @@ async function promptSaveReport({
7623
7723
  predecessorImageId,
7624
7724
  minSeriesNumber: 3000,
7625
7725
  extensionManager,
7626
- servicesManager
7726
+ servicesManager,
7727
+ enableDownload: true
7627
7728
  });
7628
7729
  if (promptResult.action === PROMPT_RESPONSES/* default */.A.CREATE_REPORT) {
7629
- const dataSources = extensionManager.getDataSources(promptResult.dataSourceName);
7630
- const dataSource = dataSources[0];
7631
7730
  const {
7632
7731
  series,
7633
7732
  priorSeriesNumber,
7634
- value: reportName
7733
+ value: reportName,
7734
+ dataSourceName
7635
7735
  } = promptResult;
7636
7736
  const SeriesDescription = reportName || defaultSaveTitle;
7637
- const getReport = async () => {
7638
- return commandsManager.runCommand('storeMeasurements', {
7639
- measurementData,
7640
- dataSource,
7641
- additionalFindingTypes: ['ArrowAnnotate'],
7642
- options: {
7643
- SeriesDescription,
7644
- SeriesNumber: 1 + priorSeriesNumber,
7645
- predecessorImageId: series
7646
- }
7647
- }, 'CORNERSTONE_STRUCTURED_REPORT');
7648
- };
7737
+ const getReport = async () => commandsManager.runCommand('storeMeasurements', {
7738
+ measurementData,
7739
+ dataSource: dataSourceName,
7740
+ additionalFindingTypes: ['ArrowAnnotate'],
7741
+ options: {
7742
+ SeriesDescription,
7743
+ SeriesNumber: 1 + priorSeriesNumber,
7744
+ predecessorImageId: series
7745
+ }
7746
+ }, 'CORNERSTONE_STRUCTURED_REPORT');
7649
7747
  displaySetInstanceUIDs = await Actions_createReportAsync({
7650
7748
  servicesManager,
7651
7749
  getReport
7652
7750
  });
7653
- } else if (promptResult.action === RESPONSE.CANCEL) {
7751
+ } else if (promptResult.action === PROMPT_RESPONSES/* default */.A.CANCEL) {
7654
7752
  // Do nothing
7655
7753
  }
7656
7754
  return {
@@ -7682,6 +7780,10 @@ function findPredecessorImageId(annotations) {
7682
7780
  ;// ../../../extensions/default/src/commandsModule.ts
7683
7781
 
7684
7782
 
7783
+ const {
7784
+ downloadBlob
7785
+ } = src/* utils */.Wp;
7786
+
7685
7787
 
7686
7788
 
7687
7789
 
@@ -7811,6 +7913,19 @@ const commandsModule = ({
7811
7913
  return;
7812
7914
  }
7813
7915
 
7916
+ // Check if it's a segmentation and handle accordingly.
7917
+ // Note that for the sake of hydrated segmentations, we remove the
7918
+ // segmentation before checking if the display set is indeed in the viewport.
7919
+ // This is because hydrated segmentations are not in the viewport per se
7920
+ // {i.e. they are not layered) but are simply referenced by the display
7921
+ // set in the viewport.
7922
+ const isSegmentation = DERIVED_OVERLAY_MODALITIES.includes(displaySet.Modality);
7923
+ if (isSegmentation) {
7924
+ segmentationService.removeRepresentationsFromViewport(viewportId, {
7925
+ segmentationId: displaySetInstanceUID
7926
+ });
7927
+ }
7928
+
7814
7929
  // Get current display sets for the viewport
7815
7930
  const currentDisplaySetUIDs = viewportGridService.getDisplaySetsUIDsForViewport(viewportId);
7816
7931
 
@@ -7818,14 +7933,6 @@ const commandsModule = ({
7818
7933
  if (!currentDisplaySetUIDs.includes(displaySetInstanceUID)) {
7819
7934
  return;
7820
7935
  }
7821
-
7822
- // Check if it's a segmentation and handle accordingly
7823
- const isSegmentation = DERIVED_OVERLAY_MODALITIES.includes(displaySet.Modality);
7824
- if (isSegmentation) {
7825
- segmentationService.removeSegmentationRepresentations(viewportId, {
7826
- segmentationId: displaySetInstanceUID
7827
- });
7828
- }
7829
7936
  const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(viewportId, displaySetInstanceUID);
7830
7937
 
7831
7938
  // Configure each viewport for layer removal
@@ -8310,7 +8417,7 @@ const commandsModule = ({
8310
8417
  const {
8311
8418
  UIModalService
8312
8419
  } = servicesManager.services;
8313
- const defaultDisplaySetInstanceUID = displaySetInstanceUID || displaySetInstanceUIDs[0];
8420
+ const defaultDisplaySetInstanceUID = displaySetInstanceUID || displaySetInstanceUIDs[0] || displaySets[0]?.displaySetInstanceUID;
8314
8421
  UIModalService.show({
8315
8422
  content: DicomTagBrowser_DicomTagBrowser,
8316
8423
  contentProps: {
@@ -8371,7 +8478,11 @@ const commandsModule = ({
8371
8478
  const activeDisplaySetIndex = currentDisplaySets.findIndex(displaySet => displaySetInstanceUIDs.includes(displaySet.displaySetInstanceUID));
8372
8479
  let displaySetIndexToShow;
8373
8480
  for (displaySetIndexToShow = activeDisplaySetIndex + direction; displaySetIndexToShow > -1 && displaySetIndexToShow < currentDisplaySets.length; displaySetIndexToShow += direction) {
8374
- if (!excludeNonImageModalities || !nonImageModalities.includes(currentDisplaySets[displaySetIndexToShow].Modality)) {
8481
+ const nextDisplaySet = currentDisplaySets[displaySetIndexToShow];
8482
+ if (nextDisplaySet.madeInClient) {
8483
+ continue;
8484
+ }
8485
+ if (!excludeNonImageModalities || !nonImageModalities.includes(nextDisplaySet.Modality)) {
8375
8486
  break;
8376
8487
  }
8377
8488
  }
@@ -8397,6 +8508,74 @@ const commandsModule = ({
8397
8508
  viewportsToUpdate: updatedViewports
8398
8509
  });
8399
8510
  setTimeout(() => actions.scrollActiveThumbnailIntoView(), 0);
8511
+ },
8512
+ /**
8513
+ * Creates a store function based on the data source type.
8514
+ * @param dataSource - 'download', 'copyToClipboard', or a named data source
8515
+ * @param defaultFileName - Default filename for download/clipboard
8516
+ * @param defaultContentType - Default content type for clipboard
8517
+ * @returns A store function, or null if no valid store exists
8518
+ */
8519
+ createStoreFunction: ({
8520
+ dataSource,
8521
+ defaultFileName,
8522
+ defaultContentType
8523
+ }) => {
8524
+ if (dataSource === 'download') {
8525
+ return async dicom => {
8526
+ const instances = Array.isArray(dicom) ? dicom : [dicom];
8527
+ src/* DicomMetadataStore */.H8.addInstances(instances, true);
8528
+ if (instances.length !== 1) {
8529
+ throw new Error('Download only supports a single DICOM instance');
8530
+ }
8531
+ const reportBlob = dcmjs_es/* default.data */.Ay.data.datasetToBlob(instances[0]);
8532
+ downloadBlob(reportBlob, {
8533
+ filename: defaultFileName || 'dicom.dcm'
8534
+ });
8535
+ };
8536
+ }
8537
+ if (dataSource === 'copyToClipboard') {
8538
+ return async dicom => {
8539
+ const instances = Array.isArray(dicom) ? dicom : [dicom];
8540
+ src/* DicomMetadataStore */.H8.addInstances(instances, true);
8541
+ if (instances.length !== 1) {
8542
+ throw new Error('Copy to clipboard only supports a single DICOM instance');
8543
+ }
8544
+ const reportBlob = dcmjs_es/* default.data */.Ay.data.datasetToBlob(instances[0]);
8545
+ const type = defaultContentType || 'application/dicom';
8546
+ await navigator.clipboard.write([new ClipboardItem({
8547
+ [type]: new Blob([reportBlob], {
8548
+ type
8549
+ })
8550
+ })]);
8551
+ };
8552
+ }
8553
+
8554
+ // DICOM STOW path — resolve the named data source
8555
+ const dataSources = extensionManager.getDataSources(dataSource);
8556
+ const resolvedDataSource = dataSources?.[0];
8557
+ if (!resolvedDataSource?.store?.dicom) {
8558
+ return null;
8559
+ }
8560
+ return async (dicom, {
8561
+ dicomDict
8562
+ } = {}) => {
8563
+ const instances = Array.isArray(dicom) ? dicom : [dicom];
8564
+ const config = resolvedDataSource.getConfig?.();
8565
+ if (config?.wadoRoot) {
8566
+ instances.forEach(instance => {
8567
+ instance.wadoRoot = config.wadoRoot;
8568
+ });
8569
+ }
8570
+ src/* DicomMetadataStore */.H8.addInstances(instances, true);
8571
+ for (const instance of instances) {
8572
+ await resolvedDataSource.store.dicom(instance, null, dicomDict);
8573
+ }
8574
+ const studyUIDs = new Set(instances.map(i => i.StudyInstanceUID).filter(Boolean));
8575
+ for (const uid of studyUIDs) {
8576
+ resolvedDataSource.deleteStudyMetadataPromise(uid);
8577
+ }
8578
+ };
8400
8579
  }
8401
8580
  };
8402
8581
  const definitions = {
@@ -8428,7 +8607,8 @@ const commandsModule = ({
8428
8607
  updateViewportDisplaySet: actions.updateViewportDisplaySet,
8429
8608
  scrollActiveThumbnailIntoView: actions.scrollActiveThumbnailIntoView,
8430
8609
  addDisplaySetAsLayer: actions.addDisplaySetAsLayer,
8431
- removeDisplaySetLayer: actions.removeDisplaySetLayer
8610
+ removeDisplaySetLayer: actions.removeDisplaySetLayer,
8611
+ createStoreFunction: actions.createStoreFunction
8432
8612
  };
8433
8613
  return {
8434
8614
  actions,
@@ -9605,7 +9785,7 @@ function DataSourceSelector() {
9605
9785
  }, /*#__PURE__*/react.createElement("div", {
9606
9786
  className: "flex h-screen w-screen items-center justify-center"
9607
9787
  }, /*#__PURE__*/react.createElement("div", {
9608
- className: "bg-secondary-dark mx-auto space-y-2 rounded-lg py-8 px-8 drop-shadow-md"
9788
+ className: "bg-popover mx-auto space-y-2 rounded-lg py-8 px-8 drop-shadow-md"
9609
9789
  }, /*#__PURE__*/react.createElement("img", {
9610
9790
  className: "mx-auto block h-14",
9611
9791
  src: "./ohif-logo.svg",
@@ -9615,7 +9795,7 @@ function DataSourceSelector() {
9615
9795
  }, dsConfigs.filter(it => it.sourceName !== 'dicomjson' && it.sourceName !== 'dicomlocal').map(ds => /*#__PURE__*/react.createElement("div", {
9616
9796
  key: ds.sourceName
9617
9797
  }, /*#__PURE__*/react.createElement("h1", {
9618
- className: "text-white"
9798
+ className: "text-foreground"
9619
9799
  }, ds.configuration?.friendlyName || ds.friendlyName), /*#__PURE__*/react.createElement(ui_src/* Button */.$n, {
9620
9800
  type: ui_src/* ButtonEnums.type */.Ny.NW.primary,
9621
9801
  className: classnames_default()('ml-2'),
@@ -9923,7 +10103,7 @@ function ItemListComponent({
9923
10103
  }), /*#__PURE__*/react.createElement(ui_next_src/* InputFilter */.zbB.ClearButton, {
9924
10104
  className: "text-primary mr-0.5 p-0.5"
9925
10105
  }))), /*#__PURE__*/react.createElement("div", {
9926
- className: "relative flex min-h-[1px] grow flex-col bg-black text-[14px]"
10106
+ className: "relative flex min-h-[1px] grow flex-col bg-background text-[14px]"
9927
10107
  }, itemList == null ? /*#__PURE__*/react.createElement(LoadingIndicatorProgress, {
9928
10108
  className: 'h-full w-full'
9929
10109
  }) : itemList.length === 0 ? /*#__PURE__*/react.createElement("div", {
@@ -10015,16 +10195,16 @@ function DataSourceConfigurationModalComponent({
10015
10195
  };
10016
10196
  }, [selectedItems, configurationAPI, onHide, itemLabels, showFullConfig, currentSelectedItemIndex]);
10017
10197
  const getSelectedItemCursorClasses = itemIndex => itemIndex !== itemLabels.length - 1 && itemIndex < selectedItems.length ? 'cursor-pointer' : 'cursor-auto';
10018
- const getSelectedItemBackgroundClasses = itemIndex => itemIndex < selectedItems.length ? classnames_default()('bg-black/[.4]', itemIndex !== itemLabels.length - 1 ? 'hover:bg-transparent active:bg-secondary-dark' : '') : 'bg-transparent';
10019
- const getSelectedItemBorderClasses = itemIndex => itemIndex === currentSelectedItemIndex + 1 ? classnames_default()('border-2', 'border-solid', 'border-primary-light') : itemIndex < selectedItems.length ? 'border border-solid border-primary-active hover:border-primary-light active:border-white' : 'border border-dashed border-secondary-light';
10020
- const getSelectedItemTextClasses = itemIndex => itemIndex <= selectedItems.length ? 'text-primary-light' : 'text-primary';
10198
+ const getSelectedItemBackgroundClasses = itemIndex => itemIndex < selectedItems.length ? classnames_default()('bg-background/[.4]', itemIndex !== itemLabels.length - 1 ? 'hover:bg-transparent active:bg-popover' : '') : 'bg-transparent';
10199
+ const getSelectedItemBorderClasses = itemIndex => itemIndex === currentSelectedItemIndex + 1 ? classnames_default()('border-2', 'border-solid', 'border-highlight') : itemIndex < selectedItems.length ? 'border border-solid border-primary hover:border-highlight active:border-white' : 'border border-dashed border-input';
10200
+ const getSelectedItemTextClasses = itemIndex => itemIndex <= selectedItems.length ? 'text-highlight' : 'text-primary';
10021
10201
  const getErrorComponent = () => {
10022
10202
  return /*#__PURE__*/react.createElement("div", {
10023
10203
  className: "flex min-h-[1px] grow flex-col gap-4"
10024
10204
  }, /*#__PURE__*/react.createElement("div", {
10025
- className: "text-primary-light text-[20px]"
10205
+ className: "text-highlight text-[20px]"
10026
10206
  }, t(`Error fetching ${itemLabels[selectedItems.length]} list`)), /*#__PURE__*/react.createElement("div", {
10027
- className: "grow bg-black p-4 text-[14px]"
10207
+ className: "grow bg-background p-4 text-[14px]"
10028
10208
  }, errorMessage));
10029
10209
  };
10030
10210
  const getSelectedItemsComponent = () => {
@@ -10047,14 +10227,14 @@ function DataSourceConfigurationModalComponent({
10047
10227
  }), /*#__PURE__*/react.createElement("div", {
10048
10228
  className: classnames_default()(NO_WRAP_ELLIPSIS_CLASS_NAMES)
10049
10229
  }, t(itemLabel))), itemLabelIndex < selectedItems.length ? /*#__PURE__*/react.createElement("div", {
10050
- className: classnames_default()('text-[14px] text-white', NO_WRAP_ELLIPSIS_CLASS_NAMES)
10230
+ className: classnames_default()('text-foreground text-[14px]', NO_WRAP_ELLIPSIS_CLASS_NAMES)
10051
10231
  }, selectedItems[itemLabelIndex].name) : /*#__PURE__*/react.createElement("br", null));
10052
10232
  }));
10053
10233
  };
10054
10234
  return /*#__PURE__*/react.createElement("div", {
10055
10235
  className: "flex h-[calc(100vh-300px)] select-none flex-col gap-4 pt-0.5"
10056
10236
  }, getSelectedItemsComponent(), /*#__PURE__*/react.createElement("div", {
10057
- className: "h-0.5 w-full shrink-0 bg-black"
10237
+ className: "h-0.5 w-full shrink-0 bg-background"
10058
10238
  }), errorMessage ? getErrorComponent() : /*#__PURE__*/react.createElement(Components_ItemListComponent, {
10059
10239
  itemLabel: itemLabels[currentSelectedItemIndex + 1],
10060
10240
  itemList: itemList,
@@ -10137,7 +10317,7 @@ function DataSourceConfigurationComponent({
10137
10317
  }
10138
10318
  }, [configurationAPI, configuredItems, showConfigurationModal]);
10139
10319
  return configuredItems ? /*#__PURE__*/react.createElement("div", {
10140
- className: "text-aqua-pale flex items-center overflow-hidden"
10320
+ className: "text-muted-foreground flex items-center overflow-hidden"
10141
10321
  }, /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.Settings, {
10142
10322
  className: "mr-2.5 h-3.5 w-3.5 shrink-0 cursor-pointer",
10143
10323
  onClick: showConfigurationModal
@@ -10346,8 +10526,14 @@ function getDataSourceConfigurationCustomization({
10346
10526
  const {
10347
10527
  sortingCriteria
10348
10528
  } = src/* utils */.Wp;
10529
+ const {
10530
+ seriesSortCriteria
10531
+ } = sortingCriteria;
10532
+
10533
+ /** Stable series order for e2e (Playwright sets TEST_ENV=true via cross-env). */
10534
+ const sortingCriteriaFn = false ? 0 : seriesSortCriteria.seriesInfoSortingCriteria;
10349
10535
  /* harmony default export */ const sortingCriteriaCustomization = ({
10350
- sortingCriteria: sortingCriteria.seriesSortCriteria.seriesInfoSortingCriteria
10536
+ sortingCriteria: sortingCriteriaFn
10351
10537
  });
10352
10538
  ;// ../../../extensions/default/src/customizations/onDropHandlerCustomization.ts
10353
10539
  /* harmony default export */ const onDropHandlerCustomization = ({
@@ -10418,8 +10604,8 @@ function AboutModalDefault() {
10418
10604
  name
10419
10605
  } = (0,browser_detect_es5/* default */.A)();
10420
10606
  const browser = `${name[0].toUpperCase()}${name.substr(1)} ${version}`;
10421
- const versionNumber = "3.13.0-beta.6";
10422
- const commitHash = "b8adfdfc84eb652bcc1a7d761b3189903797a20b";
10607
+ const versionNumber = "3.13.0-beta.61";
10608
+ const commitHash = "8fc0dc16e97f3262fdac902ecf2d7c20cb8f78cc";
10423
10609
  const [main, beta] = versionNumber.split('-');
10424
10610
  return /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU, {
10425
10611
  className: "w-[400px]"
@@ -10592,6 +10778,7 @@ function UserPreferencesModalDefault({
10592
10778
 
10593
10779
 
10594
10780
 
10781
+
10595
10782
  function ReportDialog({
10596
10783
  dataSources,
10597
10784
  modality = 'SR',
@@ -10599,11 +10786,16 @@ function ReportDialog({
10599
10786
  minSeriesNumber = 3000,
10600
10787
  hide,
10601
10788
  onSave,
10602
- onCancel
10789
+ onCancel,
10790
+ enableDownload = false
10603
10791
  }) {
10792
+ const {
10793
+ t
10794
+ } = (0,es/* useTranslation */.Bd)('Buttons');
10604
10795
  const {
10605
10796
  servicesManager
10606
10797
  } = (0,src/* useSystem */.Jg)();
10798
+ const actionTakenRef = (0,react.useRef)(false);
10607
10799
  const [selectedDataSource, setSelectedDataSource] = (0,react.useState)(dataSources?.[0]?.value ?? null);
10608
10800
  const {
10609
10801
  displaySetService
@@ -10632,6 +10824,7 @@ function ReportDialog({
10632
10824
  setReportName(newReportName);
10633
10825
  }, [selectedSeries, seriesOptions]);
10634
10826
  const handleSave = (0,react.useCallback)(() => {
10827
+ actionTakenRef.current = true;
10635
10828
  onSave({
10636
10829
  reportName,
10637
10830
  dataSource: selectedDataSource,
@@ -10641,10 +10834,31 @@ function ReportDialog({
10641
10834
  hide();
10642
10835
  }, [selectedDataSource, selectedSeries, reportName, hide, onSave]);
10643
10836
  const handleCancel = (0,react.useCallback)(() => {
10837
+ actionTakenRef.current = true;
10644
10838
  onCancel();
10645
10839
  hide();
10646
10840
  }, [onCancel, hide]);
10841
+ const handleDownload = (0,react.useCallback)(() => {
10842
+ actionTakenRef.current = true;
10843
+ onSave({
10844
+ reportName,
10845
+ dataSource: 'download',
10846
+ priorSeriesNumber: Math.max(...seriesOptions.map(it => it.seriesNumber)),
10847
+ series: selectedSeries
10848
+ });
10849
+ hide();
10850
+ }, [selectedDataSource, selectedSeries, reportName, hide, onSave]);
10851
+
10852
+ // Handles the close dialog button/external close as a cancel
10853
+ (0,react.useEffect)(() => {
10854
+ return () => {
10855
+ if (!actionTakenRef.current) {
10856
+ onCancel();
10857
+ }
10858
+ };
10859
+ }, [onCancel]);
10647
10860
  const showDataSourceSelect = dataSources?.length > 1;
10861
+ const showDownloadButton = enableDownload;
10648
10862
  return /*#__PURE__*/react.createElement("div", {
10649
10863
  className: "text-foreground flex min-w-[400px] max-w-md flex-col"
10650
10864
  }, /*#__PURE__*/react.createElement("div", {
@@ -10701,9 +10915,9 @@ function ReportDialog({
10701
10915
  disabled: !!selectedSeries
10702
10916
  })))), /*#__PURE__*/react.createElement("div", {
10703
10917
  className: "flex justify-end gap-2"
10704
- }, /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0, null, /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0.Actions, null, /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0.ActionsSecondary, {
10705
- onClick: handleCancel
10706
- }, "Cancel"), /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0.ActionsPrimary, {
10918
+ }, /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0, null, /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0.Actions, null, showDownloadButton && /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0.ActionsSecondary, {
10919
+ onClick: handleDownload
10920
+ }, t('Download')), /*#__PURE__*/react.createElement(ui_next_src/* InputDialog */.fa0.ActionsPrimary, {
10707
10921
  onClick: handleSave
10708
10922
  }, "Save"))))));
10709
10923
  }
@@ -11611,11 +11825,12 @@ function promptLabelAnnotation({
11611
11825
  // EXTERNAL MODULE: ../../../extensions/default/src/Panels/StudyBrowser/PanelStudyBrowserHeader.tsx
11612
11826
  var PanelStudyBrowserHeader = __webpack_require__(3329);
11613
11827
  ;// ../../../extensions/default/src/utils/addIcon.ts
11828
+ /* unused harmony import specifier */ var Icons;
11614
11829
 
11615
11830
 
11616
11831
  /** Adds the icon to both ui and ui-next */
11617
11832
  function addIcon(name, icon) {
11618
- ui_next_src/* Icons */.FI1.addIcon(name, icon);
11833
+ Icons.addIcon(name, icon);
11619
11834
  }
11620
11835
  ;// ../../../extensions/default/src/utils/Toolbox.tsx
11621
11836
  function Toolbox_extends() { return Toolbox_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; }, Toolbox_extends.apply(null, arguments); }
@@ -11723,7 +11938,7 @@ function Toolbox({
11723
11938
  })));
11724
11939
  }));
11725
11940
  }), activeToolOptions && /*#__PURE__*/react.createElement("div", {
11726
- className: "bg-primary-dark mt-1 h-auto px-2"
11941
+ className: "bg-muted mt-1 h-auto px-2"
11727
11942
  }, /*#__PURE__*/react.createElement(ui_next_src/* ToolSettings */.k_3, {
11728
11943
  options: activeToolOptions
11729
11944
  }))));
@@ -11807,10 +12022,10 @@ const defaultExtension = {
11807
12022
  /* harmony default export */ const default_src = (defaultExtension);
11808
12023
 
11809
12024
 
11810
- /***/ }),
12025
+ /***/ },
11811
12026
 
11812
- /***/ 96357:
11813
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
12027
+ /***/ 96357
12028
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
11814
12029
 
11815
12030
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11816
12031
  /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
@@ -11825,6 +12040,6 @@ const RESPONSE = {
11825
12040
  };
11826
12041
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RESPONSE);
11827
12042
 
11828
- /***/ })
12043
+ /***/ }
11829
12044
 
11830
12045
  }]);