@ohif/app 3.12.0-beta.100 → 3.12.0-beta.104

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 (35) hide show
  1. package/dist/{1403.bundle.d239b27c143d2d1804a6.js → 1403.bundle.ea5eb28d7e1c937ccbbf.js} +2 -2
  2. package/dist/{147.bundle.205350dc3d21478277b1.js → 147.bundle.ee7de13189cf1963aea9.js} +6 -15
  3. package/dist/{1608.bundle.f855c4bdb7f00eb66fca.js → 1608.bundle.a25c80a3971ed6361b51.js} +2 -2
  4. package/dist/{1730.bundle.22a99760b94c163f0fb7.js → 1730.bundle.d1acf1f07ca5b3892f15.js} +3 -3
  5. package/dist/{1903.bundle.9ff3c3f706656667162b.js → 1903.bundle.27b8f13121796caad7a2.js} +110 -50
  6. package/dist/{1933.bundle.569480948b6079c2fa32.js → 1933.bundle.d9f39020c89b72d593cc.js} +7 -3
  7. package/dist/{2018.bundle.b7ae7a5f144dbb971f24.js → 2018.bundle.3790d08e5f93c334eb29.js} +47 -47
  8. package/dist/{213.bundle.cf9098fbe63d5a755829.js → 213.bundle.4cdd711da5e5f19a6c76.js} +2 -2
  9. package/dist/{2424.bundle.5bd224c13a61030eb18b.js → 2424.bundle.9bb3300eaecd20077a37.js} +2 -2
  10. package/dist/{2701.bundle.aca0d4f24a6f2094c3c3.js → 2701.bundle.e01a06411f68459ac955.js} +2 -2
  11. package/dist/{3461.bundle.89466434f00d3743c516.js → 3461.bundle.93c1d3ecf976a746f785.js} +3 -3
  12. package/dist/{4202.bundle.790706560c6edb303476.js → 4202.bundle.fa6f6adfd3d08a1cdcd7.js} +1 -1
  13. package/dist/{4775.bundle.4eb5ce7ba3586c94d2a1.js → 4775.bundle.f463033dbb9c8da57d52.js} +22 -16
  14. package/dist/{4819.bundle.eb31c1e4d81de071f3a4.js → 4819.bundle.58e054b5b00d756e2d14.js} +6 -4
  15. package/dist/{5028.bundle.35ec943cbe3fa9393fe8.js → 5028.bundle.862ac206a79ac2818f64.js} +2 -2
  16. package/dist/{5485.bundle.12b3e3738745943ba166.js → 5485.bundle.07103c4b490382c0ee77.js} +2 -2
  17. package/dist/{5802.bundle.28ab859d9b48a5b2c31c.js → 5802.bundle.aef18b250a1927d84108.js} +6 -12
  18. package/dist/{7639.bundle.c0b2beea06d6a185f7d0.js → 7639.bundle.6444531fac0b110595e5.js} +15 -15
  19. package/dist/{8305.bundle.8d594e60bd2732be72dc.js → 8305.bundle.b1fb25aa020e0d0faec8.js} +43 -25
  20. package/dist/{8558.bundle.0fa5a7eb7f0d181f655e.js → 8558.bundle.6b45234a8d6365bff3b9.js} +2 -2
  21. package/dist/{8583.bundle.e63824d304b3f4cdda34.js → 8583.bundle.246b35769cd393843c6e.js} +24 -19
  22. package/dist/{9195.bundle.e6597407d8dbd3e3f8fe.js → 9195.bundle.5f9be23bc1e8857cc478.js} +125 -66
  23. package/dist/{9845.bundle.31aec3fe7a5cdc247f4e.js → 9845.bundle.155759f5e8d8070ee16f.js} +14 -6
  24. package/dist/{9862.bundle.3ca0ad5f54db87ccf91e.js → 9862.bundle.bb6b5cab9e8eda1cc675.js} +1 -1
  25. package/dist/{9927.bundle.d1a5055b026d298658c3.js → 9927.bundle.ca2f72f62468744559e4.js} +16 -16
  26. package/dist/{app.bundle.cd4cdfa595de54b44206.js → app.bundle.41cd81f26da8a340185f.js} +888 -141
  27. package/dist/app.bundle.css +1 -1
  28. package/dist/index.html +1 -1
  29. package/dist/sw.js +1 -1
  30. package/package.json +20 -20
  31. /package/dist/{1459.bundle.24d4976c6a0b6d35458d.js → 1459.bundle.5dc3647b918b624cead1.js} +0 -0
  32. /package/dist/{5457.bundle.a8f19fcecb2f824151ba.js → 5457.bundle.105e15da7973e5b61959.js} +0 -0
  33. /package/dist/{6027.bundle.96b99802305416998206.js → 6027.bundle.83186e7c3d210cd30320.js} +0 -0
  34. /package/dist/{6163.bundle.2ed1359dc59e0d92b179.js → 6163.bundle.f327d1e8aea322893404.js} +0 -0
  35. /package/dist/{85.bundle.2b8f73c3514e787d6cc6.js → 85.bundle.3cb557e3015e5c652610.js} +0 -0
@@ -8,7 +8,7 @@
8
8
  /* harmony export */ A: () => (/* binding */ MoreDropdownMenu)
9
9
  /* harmony export */ });
10
10
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86326);
11
- /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1246);
11
+ /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12517);
12
12
  /* harmony import */ var _ohif_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(42356);
13
13
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
14
14
 
@@ -123,8 +123,8 @@ __webpack_require__.d(__webpack_exports__, {
123
123
 
124
124
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
125
125
  var react = __webpack_require__(86326);
126
- // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3073 modules
127
- var src = __webpack_require__(1246);
126
+ // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3075 modules
127
+ var src = __webpack_require__(12517);
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
@@ -622,7 +622,7 @@ function _findTabAndStudyOfDisplaySet(displaySetInstanceUID, tabs, currentTabNam
622
622
  /* harmony export */ T: () => (/* binding */ PanelStudyBrowserHeader)
623
623
  /* harmony export */ });
624
624
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86326);
625
- /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1246);
625
+ /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12517);
626
626
 
627
627
 
628
628
 
@@ -3701,8 +3701,8 @@ var react = __webpack_require__(86326);
3701
3701
  // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
3702
3702
  var prop_types = __webpack_require__(97598);
3703
3703
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
3704
- // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3073 modules
3705
- var ui_next_src = __webpack_require__(1246);
3704
+ // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3075 modules
3705
+ var ui_next_src = __webpack_require__(12517);
3706
3706
  // EXTERNAL MODULE: ./state/index.js + 1 modules
3707
3707
  var state = __webpack_require__(45981);
3708
3708
  // EXTERNAL MODULE: ../../../node_modules/react-router-dom/dist/index.js
@@ -4775,8 +4775,8 @@ function getPanelModule({
4775
4775
  }];
4776
4776
  }
4777
4777
  /* harmony default export */ const src_getPanelModule = (getPanelModule);
4778
- // EXTERNAL MODULE: ../../i18n/src/index.js + 210 modules
4779
- var i18n_src = __webpack_require__(68523);
4778
+ // EXTERNAL MODULE: ../../i18n/src/index.js + 286 modules
4779
+ var i18n_src = __webpack_require__(89010);
4780
4780
  ;// ../../../extensions/default/package.json
4781
4781
  const package_namespaceObject = /*#__PURE__*/JSON.parse('{"UU":"@ohif/extension-default"}');
4782
4782
  ;// ../../../extensions/default/src/id.js
@@ -8777,6 +8777,7 @@ const hpMN8 = {
8777
8777
  };
8778
8778
  /* harmony default export */ const hpMNGrid = ((/* unused pure expression or super */ null && (hpMN)));
8779
8779
  ;// ../../../extensions/default/src/hangingprotocols/hpCompare.ts
8780
+
8780
8781
  const defaultDisplaySetSelector = {
8781
8782
  studyMatchingRules: [{
8782
8783
  // The priorInstance is a study counter that indicates what position this study is in
@@ -8879,8 +8880,8 @@ const priorViewport1 = {
8879
8880
  */
8880
8881
  const hpMNCompare = {
8881
8882
  id: '@ohif/hpCompare',
8882
- description: 'Compare two studies in various layouts',
8883
- name: 'Compare Two Studies',
8883
+ description: i18next/* default */.A.t('Hps:Compare two studies in various layouts'),
8884
+ name: i18next/* default */.A.t('Hps:Compare Two Studies'),
8884
8885
  numberOfPriorsReferenced: 1,
8885
8886
  protocolMatchingRules: [{
8886
8887
  id: 'Two Studies',
@@ -9123,6 +9124,7 @@ const LMLOPrior = {
9123
9124
 
9124
9125
  ;// ../../../extensions/default/src/hangingprotocols/hpMammo.ts
9125
9126
 
9127
+
9126
9128
  const rightDisplayArea = {
9127
9129
  storeAsInitialCamera: true,
9128
9130
  imageArea: [0.8, 0.8],
@@ -9142,7 +9144,7 @@ const leftDisplayArea = {
9142
9144
  const hpMammography = {
9143
9145
  id: '@ohif/hpMammo',
9144
9146
  hasUpdatedPriorsInformation: false,
9145
- name: 'Mammography Breast Screening',
9147
+ name: i18next/* default */.A.t('Hps:Mammography Breast Screening'),
9146
9148
  protocolMatchingRules: [{
9147
9149
  id: 'Mammography',
9148
9150
  weight: 150,
@@ -9880,7 +9882,6 @@ const {
9880
9882
 
9881
9883
 
9882
9884
 
9883
-
9884
9885
  function ItemListComponent({
9885
9886
  itemLabel,
9886
9887
  itemList,
@@ -9902,36 +9903,42 @@ function ItemListComponent({
9902
9903
  }, /*#__PURE__*/react.createElement("div", {
9903
9904
  className: "flex items-center justify-between"
9904
9905
  }, /*#__PURE__*/react.createElement("div", {
9905
- className: "text-primary-light text-[20px]"
9906
- }, t(`Select ${itemLabel}`)), /*#__PURE__*/react.createElement(ui_src/* InputFilterText */.Cv, {
9906
+ className: "text-highlight text-xl"
9907
+ }, t(`Select ${itemLabel}`)), /*#__PURE__*/react.createElement(ui_next_src/* InputFilter */.zbB, {
9907
9908
  className: "max-w-[40%] grow",
9908
- value: filterValue,
9909
- onDebounceChange: setFilterValue,
9910
- placeholder: t(`Search ${itemLabel} list`)
9911
- })), /*#__PURE__*/react.createElement("div", {
9909
+ onChange: setFilterValue
9910
+ }, /*#__PURE__*/react.createElement(ui_next_src/* InputFilter */.zbB.SearchIcon, null), /*#__PURE__*/react.createElement(ui_next_src/* InputFilter */.zbB.Input, {
9911
+ placeholder: t(`Search ${itemLabel} list`),
9912
+ className: "pl-8 pr-9"
9913
+ }), /*#__PURE__*/react.createElement(ui_next_src/* InputFilter */.zbB.ClearButton, {
9914
+ className: "text-primary mr-0.5 p-0.5"
9915
+ }))), /*#__PURE__*/react.createElement("div", {
9912
9916
  className: "relative flex min-h-[1px] grow flex-col bg-black text-[14px]"
9913
9917
  }, itemList == null ? /*#__PURE__*/react.createElement(LoadingIndicatorProgress, {
9914
9918
  className: 'h-full w-full'
9915
9919
  }) : itemList.length === 0 ? /*#__PURE__*/react.createElement("div", {
9916
- className: "text-primary-light flex h-full flex-col items-center justify-center px-6 py-4"
9920
+ className: "text-highlight flex h-full flex-col items-center justify-center px-6 py-4"
9917
9921
  }, /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.ToolMagnify, {
9918
9922
  className: "mb-4"
9919
9923
  }), /*#__PURE__*/react.createElement("span", null, t(`No ${itemLabel} available`))) : /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
9920
- className: "bg-secondary-dark px-3 py-1.5 text-white"
9924
+ className: "bg-popover text-foreground px-3 py-1.5"
9921
9925
  }, t(itemLabel)), /*#__PURE__*/react.createElement("div", {
9922
9926
  className: "ohif-scrollbar overflow-auto"
9923
9927
  }, itemList.filter(item => !filterValue || item.name.toLowerCase().includes(filterValue.toLowerCase())).map(item => {
9924
- const border = 'rounded border-transparent border-b-secondary-light border-[1px] hover:border-primary-light';
9928
+ const border = 'rounded border-transparent border-b-input border-[1px]';
9925
9929
  return /*#__PURE__*/react.createElement("div", {
9926
- className: classnames_default()('hover:text-primary-light hover:bg-primary-dark group mx-2 flex items-center justify-between px-6 py-2', border),
9930
+ className: classnames_default()('hover:text-highlight hover:bg-muted group mx-2 flex items-center justify-between px-6 py-2', border),
9927
9931
  key: item.id
9928
- }, /*#__PURE__*/react.createElement("div", null, item.name), /*#__PURE__*/react.createElement(ui_src/* Button */.$n, {
9932
+ }, /*#__PURE__*/react.createElement("div", {
9933
+ className: "text-muted-foreground"
9934
+ }, item.name), /*#__PURE__*/react.createElement(ui_next_src/* Button */.$nd, {
9929
9935
  onClick: () => onItemClicked(item),
9930
9936
  className: "invisible group-hover:visible",
9931
- endIcon: /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.ByName, {
9932
- name: "arrow-left"
9933
- })
9934
- }, t('Select')));
9937
+ variant: "default",
9938
+ size: "sm"
9939
+ }, t('Select'), /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI1.ChevronRight, {
9940
+ className: "ml-2 h-3 w-3"
9941
+ })));
9935
9942
  })))));
9936
9943
  }
9937
9944
  /* harmony default export */ const Components_ItemListComponent = (ItemListComponent);
@@ -10076,11 +10083,7 @@ function DataSourceConfigurationComponent({
10076
10083
  if (!activeDataSourceDef?.configuration?.configurationAPI) {
10077
10084
  return;
10078
10085
  }
10079
- const {
10080
- factory: configurationAPIFactory
10081
- } = customizationService.getCustomization(activeDataSourceDef.configuration.configurationAPI) ?? {
10082
- factory: () => null
10083
- };
10086
+ const configurationAPIFactory = customizationService.getCustomization(activeDataSourceDef.configuration.configurationAPI) ?? (() => null);
10084
10087
  if (!configurationAPIFactory) {
10085
10088
  return;
10086
10089
  }
@@ -10106,6 +10109,7 @@ function DataSourceConfigurationComponent({
10106
10109
  show({
10107
10110
  content: Components_DataSourceConfigurationModalComponent,
10108
10111
  title: t('Configure Data Source'),
10112
+ containerClassName: 'max-w-3xl',
10109
10113
  contentProps: {
10110
10114
  configurationAPI,
10111
10115
  configuredItems,
@@ -10393,23 +10397,27 @@ var browser_detect_es5 = __webpack_require__(88123);
10393
10397
 
10394
10398
 
10395
10399
 
10400
+
10396
10401
  function AboutModalDefault() {
10402
+ const {
10403
+ t
10404
+ } = (0,es/* useTranslation */.Bd)('AboutModal');
10397
10405
  const {
10398
10406
  os,
10399
10407
  version,
10400
10408
  name
10401
10409
  } = (0,browser_detect_es5/* default */.A)();
10402
10410
  const browser = `${name[0].toUpperCase()}${name.substr(1)} ${version}`;
10403
- const versionNumber = "3.12.0-beta.100";
10404
- const commitHash = "c4e5a4616db87b39df5e16b75f1ba3c18407468f";
10411
+ const versionNumber = "3.12.0-beta.104";
10412
+ const commitHash = "d917e74e6888744c9a5f3fa2170993c23a9b9341";
10405
10413
  const [main, beta] = versionNumber.split('-');
10406
10414
  return /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU, {
10407
10415
  className: "w-[400px]"
10408
10416
  }, /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.ProductName, null, "OHIF Viewer"), /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.ProductVersion, null, main), beta && /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.ProductBeta, null, beta), /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.Body, null, /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.DetailItem, {
10409
- label: "Commit Hash",
10417
+ label: t('Commit Hash'),
10410
10418
  value: commitHash
10411
10419
  }), /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.DetailItem, {
10412
- label: "Current Browser & OS",
10420
+ label: t('Current Browser & OS'),
10413
10421
  value: `${browser}, ${os}`
10414
10422
  }), /*#__PURE__*/react.createElement(ui_next_src/* AboutModal */.VTU.SocialItem, {
10415
10423
  icon: "SocialGithub",
@@ -10439,15 +10447,27 @@ function UserPreferencesModalDefault({
10439
10447
  hotkeysManager
10440
10448
  } = (0,src/* useSystem */.Jg)();
10441
10449
  const {
10442
- t
10450
+ t,
10451
+ i18n: i18nextInstance
10443
10452
  } = (0,es/* useTranslation */.Bd)('UserPreferencesModal');
10444
10453
  const {
10445
10454
  hotkeyDefinitions = {},
10446
10455
  hotkeyDefaults = {}
10447
10456
  } = hotkeysManager;
10457
+ const fallbackHotkeyDefinitions = (0,react.useMemo)(() => hotkeysManager.getValidHotkeyDefinitions(src/* hotkeys */.ot.defaults.hotkeyBindings), [hotkeysManager]);
10458
+ (0,react.useEffect)(() => {
10459
+ if (!Object.keys(hotkeyDefaults).length) {
10460
+ hotkeysManager.setDefaultHotKeys(src/* hotkeys */.ot.defaults.hotkeyBindings);
10461
+ }
10462
+ if (!Object.keys(hotkeyDefinitions).length) {
10463
+ hotkeysManager.setHotkeys(fallbackHotkeyDefinitions);
10464
+ }
10465
+ }, [hotkeysManager, hotkeyDefaults, hotkeyDefinitions, fallbackHotkeyDefinitions]);
10466
+ const resolvedHotkeyDefaults = Object.keys(hotkeyDefaults).length ? hotkeyDefaults : fallbackHotkeyDefinitions;
10467
+ const initialHotkeyDefinitions = Object.keys(hotkeyDefinitions).length ? hotkeyDefinitions : resolvedHotkeyDefaults;
10448
10468
  const currentLanguage = currentLanguageFn();
10449
10469
  const [state, setState] = (0,react.useState)({
10450
- hotkeyDefinitions: hotkeyDefinitions,
10470
+ hotkeyDefinitions: initialHotkeyDefinitions,
10451
10471
  languageValue: currentLanguage.value
10452
10472
  });
10453
10473
  const onLanguageChangeHandler = value => {
@@ -10472,10 +10492,45 @@ function UserPreferencesModalDefault({
10472
10492
  setState(state => ({
10473
10493
  ...state,
10474
10494
  languageValue: defaultLanguage.value,
10475
- hotkeyDefinitions: hotkeyDefaults
10495
+ hotkeyDefinitions: resolvedHotkeyDefaults
10476
10496
  }));
10477
10497
  hotkeysManager.restoreDefaultBindings();
10478
10498
  };
10499
+ const displayNames = react.useMemo(() => {
10500
+ if (typeof Intl === 'undefined' || typeof Intl.DisplayNames !== 'function') {
10501
+ return null;
10502
+ }
10503
+ const locales = [state.languageValue, currentLanguage.value, i18nextInstance.language, 'en'];
10504
+ const uniqueLocales = Array.from(new Set(locales.filter(Boolean)));
10505
+ try {
10506
+ return new Intl.DisplayNames(uniqueLocales, {
10507
+ type: 'language',
10508
+ fallback: 'none'
10509
+ });
10510
+ } catch (error) {
10511
+ console.warn('Intl.DisplayNames not supported for locales', uniqueLocales, error);
10512
+ }
10513
+ return null;
10514
+ }, [state.languageValue, currentLanguage.value, i18nextInstance.language]);
10515
+ const getLanguageLabel = react.useCallback((languageValue, fallbackLabel) => {
10516
+ const translationKey = `LanguageName.${languageValue}`;
10517
+ if (i18nextInstance.exists(translationKey, {
10518
+ ns: 'UserPreferencesModal'
10519
+ })) {
10520
+ return t(translationKey);
10521
+ }
10522
+ if (displayNames) {
10523
+ try {
10524
+ const localized = displayNames.of(languageValue);
10525
+ if (localized && localized.toLowerCase() !== languageValue.toLowerCase()) {
10526
+ return localized.charAt(0).toUpperCase() + localized.slice(1);
10527
+ }
10528
+ } catch (error) {
10529
+ console.debug(`Unable to resolve display name for ${languageValue}`, error);
10530
+ }
10531
+ }
10532
+ return fallbackLabel;
10533
+ }, [displayNames, i18nextInstance, t]);
10479
10534
  return /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy, null, /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.Body, null, /*#__PURE__*/react.createElement("div", {
10480
10535
  className: "mb-3 flex items-center space-x-14"
10481
10536
  }, /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.SubHeading, null, t('Language')), /*#__PURE__*/react.createElement(ui_next_src/* Select */.l6P, {
@@ -10489,7 +10544,7 @@ function UserPreferencesModalDefault({
10489
10544
  })), /*#__PURE__*/react.createElement(ui_next_src/* SelectContent */.gCo, null, availableLanguages.map(lang => /*#__PURE__*/react.createElement(ui_next_src/* SelectItem */.ebT, {
10490
10545
  key: lang.value,
10491
10546
  value: lang.value
10492
- }, lang.label))))), /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.SubHeading, null, t('Hotkeys')), /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.HotkeysGrid, null, Object.entries(state.hotkeyDefinitions).map(([id, definition]) => /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.Hotkey, {
10547
+ }, getLanguageLabel(lang.value, lang.label)))))), /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.SubHeading, null, t('Hotkeys')), /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.HotkeysGrid, null, Object.entries(state.hotkeyDefinitions).map(([id, definition]) => /*#__PURE__*/react.createElement(ui_next_src/* UserPreferencesModal */.xMy.Hotkey, {
10493
10548
  key: id,
10494
10549
  label: t(definition.label),
10495
10550
  value: definition.keys,
@@ -10508,6 +10563,9 @@ function UserPreferencesModalDefault({
10508
10563
  onClick: () => {
10509
10564
  if (state.languageValue !== currentLanguage.value) {
10510
10565
  i18n_src/* default */.A.changeLanguage(state.languageValue);
10566
+ // Force page reload after language change to ensure all translations are applied
10567
+ window.location.reload();
10568
+ return; // Exit early since we're reloading
10511
10569
  }
10512
10570
  hotkeysManager.setHotkeys(state.hotkeyDefinitions);
10513
10571
  src/* hotkeys */.ot.stopRecord();
@@ -10649,6 +10707,7 @@ function ReportDialog({
10649
10707
  'ohif.hotkeyBindings': src/* defaults */.NT.hotkeyBindings
10650
10708
  });
10651
10709
  ;// ../../../extensions/default/src/customizations/onboardingCustomization.ts
10710
+
10652
10711
  function waitForElement(selector, maxAttempts = 20, interval = 25) {
10653
10712
  return new Promise(resolve => {
10654
10713
  let attempts = 0;
@@ -10668,8 +10727,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10668
10727
  route: '/viewer',
10669
10728
  steps: [{
10670
10729
  id: 'scroll',
10671
- title: 'Scrolling Through Images',
10672
- text: 'You can scroll through the images using the mouse wheel or scrollbar.',
10730
+ title: i18n_src/* default */.A.t('Onboarding:Scrolling Through Images'),
10731
+ text: i18n_src/* default */.A.t('Onboarding:You can scroll through the images using the mouse wheel or scrollbar.'),
10673
10732
  attachTo: {
10674
10733
  element: '.viewport-element',
10675
10734
  on: 'top'
@@ -10681,8 +10740,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10681
10740
  beforeShowPromise: () => waitForElement('.viewport-element')
10682
10741
  }, {
10683
10742
  id: 'zoom',
10684
- title: 'Zooming In and Out',
10685
- text: 'You can zoom the images using the right click.',
10743
+ title: i18n_src/* default */.A.t('Onboarding:Zooming In and Out'),
10744
+ text: i18n_src/* default */.A.t('Onboarding:You can zoom the images using the right click.'),
10686
10745
  attachTo: {
10687
10746
  element: '.viewport-element',
10688
10747
  on: 'left'
@@ -10694,8 +10753,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10694
10753
  beforeShowPromise: () => waitForElement('.viewport-element')
10695
10754
  }, {
10696
10755
  id: 'pan',
10697
- title: 'Panning the Image',
10698
- text: 'You can pan the images using the middle click.',
10756
+ title: i18n_src/* default */.A.t('Onboarding:Panning the Image'),
10757
+ text: i18n_src/* default */.A.t('Onboarding:You can pan the images using the middle click.'),
10699
10758
  attachTo: {
10700
10759
  element: '.viewport-element',
10701
10760
  on: 'top'
@@ -10707,8 +10766,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10707
10766
  beforeShowPromise: () => waitForElement('.viewport-element')
10708
10767
  }, {
10709
10768
  id: 'windowing',
10710
- title: 'Adjusting Window Level',
10711
- text: 'You can modify the window level using the left click.',
10769
+ title: i18n_src/* default */.A.t('Onboarding:Adjusting Window Level'),
10770
+ text: i18n_src/* default */.A.t('Onboarding:You can modify the window level using the left click.'),
10712
10771
  attachTo: {
10713
10772
  element: '.viewport-element',
10714
10773
  on: 'left'
@@ -10720,8 +10779,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10720
10779
  beforeShowPromise: () => waitForElement('.viewport-element')
10721
10780
  }, {
10722
10781
  id: 'length',
10723
- title: 'Using the Measurement Tools',
10724
- text: 'You can measure the length of a region using the Length tool.',
10782
+ title: i18n_src/* default */.A.t('Onboarding:Using the Measurement Tools'),
10783
+ text: i18n_src/* default */.A.t('Onboarding:You can measure the length of a region using the Length tool.'),
10725
10784
  attachTo: {
10726
10785
  element: '[data-cy="MeasurementTools-split-button-primary"]',
10727
10786
  on: 'bottom'
@@ -10730,11 +10789,11 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10730
10789
  selector: '[data-cy="MeasurementTools-split-button-primary"]',
10731
10790
  event: 'click'
10732
10791
  },
10733
- beforeShowPromise: () => waitForElement('[data-cy="MeasurementTools-split-button-primary]')
10792
+ beforeShowPromise: () => waitForElement('[data-cy="MeasurementTools-split-button-primary"]')
10734
10793
  }, {
10735
10794
  id: 'drawAnnotation',
10736
- title: 'Drawing Length Annotations',
10737
- text: 'Use the length tool on the viewport to measure the length of a region.',
10795
+ title: i18n_src/* default */.A.t('Onboarding:Drawing Length Annotations'),
10796
+ text: i18n_src/* default */.A.t('Onboarding:Use the length tool on the viewport to measure the length of a region.'),
10738
10797
  attachTo: {
10739
10798
  element: '.viewport-element',
10740
10799
  on: 'right'
@@ -10746,8 +10805,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10746
10805
  beforeShowPromise: () => waitForElement('.viewport-element')
10747
10806
  }, {
10748
10807
  id: 'trackMeasurement',
10749
- title: 'Tracking Measurements in the Panel',
10750
- text: 'Click yes to track the measurements in the measurement panel.',
10808
+ title: i18n_src/* default */.A.t('Onboarding:Tracking Measurements in the Panel'),
10809
+ text: i18n_src/* default */.A.t('Onboarding:Click yes to track the measurements in the measurement panel.'),
10751
10810
  attachTo: {
10752
10811
  element: '[data-cy="prompt-begin-tracking-yes-btn"]',
10753
10812
  on: 'bottom'
@@ -10759,8 +10818,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10759
10818
  beforeShowPromise: () => waitForElement('[data-cy="prompt-begin-tracking-yes-btn"]')
10760
10819
  }, {
10761
10820
  id: 'openMeasurementPanel',
10762
- title: 'Opening the Measurements Panel',
10763
- text: 'Click the measurements button to open the measurements panel.',
10821
+ title: i18n_src/* default */.A.t('Onboarding:Opening the Measurements Panel'),
10822
+ text: i18n_src/* default */.A.t('Onboarding:Click the measurements button to open the measurements panel.'),
10764
10823
  attachTo: {
10765
10824
  element: '#trackedMeasurements-btn',
10766
10825
  on: 'left-start'
@@ -10772,8 +10831,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10772
10831
  beforeShowPromise: () => waitForElement('#trackedMeasurements-btn')
10773
10832
  }, {
10774
10833
  id: 'scrollAwayFromMeasurement',
10775
- title: 'Scrolling Away from a Measurement',
10776
- text: 'Scroll the images using the mouse wheel away from the measurement.',
10834
+ title: i18n_src/* default */.A.t('Onboarding:Scrolling Away from a Measurement'),
10835
+ text: i18n_src/* default */.A.t('Onboarding:Scroll the images using the mouse wheel away from the measurement.'),
10777
10836
  attachTo: {
10778
10837
  element: '.viewport-element',
10779
10838
  on: 'left'
@@ -10785,8 +10844,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10785
10844
  beforeShowPromise: () => waitForElement('.viewport-element')
10786
10845
  }, {
10787
10846
  id: 'jumpToMeasurement',
10788
- title: 'Jumping to Measurements in the Panel',
10789
- text: 'Click the measurement in the measurement panel to jump to it.',
10847
+ title: i18n_src/* default */.A.t('Onboarding:Jumping to Measurements in the Panel'),
10848
+ text: i18n_src/* default */.A.t('Onboarding:Click the measurement in the measurement panel to jump to it.'),
10790
10849
  attachTo: {
10791
10850
  element: '[data-cy="data-row"]',
10792
10851
  on: 'left-start'
@@ -10798,8 +10857,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10798
10857
  beforeShowPromise: () => waitForElement('[data-cy="data-row"]')
10799
10858
  }, {
10800
10859
  id: 'changeLayout',
10801
- title: 'Changing Layout',
10802
- text: 'You can change the layout of the viewer using the layout button.',
10860
+ title: i18n_src/* default */.A.t('Onboarding:Changing Layout'),
10861
+ text: i18n_src/* default */.A.t('Onboarding:You can change the layout of the viewer using the layout button.'),
10803
10862
  attachTo: {
10804
10863
  element: '[data-cy="Layout"]',
10805
10864
  on: 'bottom'
@@ -10811,8 +10870,8 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10811
10870
  beforeShowPromise: () => waitForElement('[data-cy="Layout"]')
10812
10871
  }, {
10813
10872
  id: 'selectLayout',
10814
- title: 'Selecting the MPR Layout',
10815
- text: 'Select the MPR layout to view the images in MPR mode.',
10873
+ title: i18n_src/* default */.A.t('Onboarding:Selecting the MPR Layout'),
10874
+ text: i18n_src/* default */.A.t('Onboarding:Select the MPR layout to view the images in MPR mode.'),
10816
10875
  attachTo: {
10817
10876
  element: '[data-cy="MPR"]',
10818
10877
  on: 'left-start'
@@ -10827,7 +10886,7 @@ function waitForElement(selector, maxAttempts = 20, interval = 25) {
10827
10886
  useModalOverlay: true,
10828
10887
  defaultStepOptions: {
10829
10888
  buttons: [{
10830
- text: 'Skip all',
10889
+ text: i18n_src/* default */.A.t('Onboarding:Skip all'),
10831
10890
  action() {
10832
10891
  this.complete();
10833
10892
  },
@@ -14,8 +14,8 @@ __webpack_require__.d(__webpack_exports__, {
14
14
 
15
15
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
16
16
  var react = __webpack_require__(86326);
17
- // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3073 modules
18
- var src = __webpack_require__(1246);
17
+ // EXTERNAL MODULE: ../../ui-next/src/index.ts + 3075 modules
18
+ var src = __webpack_require__(12517);
19
19
  ;// ../../../extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts
20
20
  function createSEGToolGroupAndAddTools({
21
21
  commandsManager,
@@ -121,12 +121,20 @@ function OHIFCornerstoneSEGViewport(props) {
121
121
  // In such cases, we attempt to handle this scenario gracefully by
122
122
  // invoking a custom handler. Ideally, if a user tries to launch a series that isn't viewable,
123
123
  // (eg.: we can prompt them with an explanation and provide a link to the full study).
124
+
125
+ // Additional guard: If no customization handler is registered for missing
126
+ // referenced display sets, skip SEG rendering to avoid a viewport crash.
124
127
  if (!referencedDisplaySetInstanceUID) {
125
128
  const missingReferenceDisplaySetHandler = customizationService.getCustomization('missingReferenceDisplaySetHandler');
126
- const {
127
- handled
128
- } = missingReferenceDisplaySetHandler();
129
- if (handled) {
129
+ if (typeof missingReferenceDisplaySetHandler === 'function') {
130
+ const {
131
+ handled
132
+ } = missingReferenceDisplaySetHandler();
133
+ if (handled) {
134
+ return;
135
+ }
136
+ } else {
137
+ console.log("No customization 'missingReferenceDisplaySetHandler' registered. Skipping SEG rendering.");
130
138
  return;
131
139
  }
132
140
  }
@@ -11,7 +11,7 @@ __webpack_require__.r(__webpack_exports__);
11
11
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(86326);
12
12
  /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(97598);
13
13
  /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
14
- /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1246);
14
+ /* harmony import */ var _ohif_ui_next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12517);
15
15
  /* harmony import */ var _ohif_extension_cornerstone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(71903);
16
16
  /* harmony import */ var _cornerstonejs_tools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(4667);
17
17
  /* harmony import */ var _getContextModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(55844);
@@ -407,7 +407,7 @@ const toolbarButtons = [{
407
407
  radiusOptionId: 'brush-radius'
408
408
  }],
409
409
  options: [{
410
- name: 'Radius (mm)',
410
+ name: i18next/* default */.A.t('Buttons:Radius (mm)'),
411
411
  id: 'brush-radius',
412
412
  type: 'range',
413
413
  explicitRunOnly: true,
@@ -422,16 +422,16 @@ const toolbarButtons = [{
422
422
  }
423
423
  }
424
424
  }, {
425
- name: 'Shape',
425
+ name: i18next/* default */.A.t('Buttons:Shape'),
426
426
  type: 'radio',
427
427
  id: 'brush-mode',
428
428
  value: 'CircularBrush',
429
429
  values: [{
430
430
  value: 'CircularBrush',
431
- label: 'Circle'
431
+ label: i18next/* default */.A.t('Buttons:Circle')
432
432
  }, {
433
433
  value: 'SphereBrush',
434
- label: 'Sphere'
434
+ label: i18next/* default */.A.t('Buttons:Sphere')
435
435
  }],
436
436
  commands: 'setToolActiveToolbar'
437
437
  }]
@@ -450,7 +450,7 @@ const toolbarButtons = [{
450
450
  radiusOptionId: 'eraser-radius'
451
451
  }],
452
452
  options: [{
453
- name: 'Radius (mm)',
453
+ name: i18next/* default */.A.t('Buttons:Radius (mm)'),
454
454
  id: 'eraser-radius',
455
455
  type: 'range',
456
456
  explicitRunOnly: true,
@@ -465,16 +465,16 @@ const toolbarButtons = [{
465
465
  }
466
466
  }
467
467
  }, {
468
- name: 'Shape',
468
+ name: i18next/* default */.A.t('Buttons:Shape'),
469
469
  type: 'radio',
470
470
  id: 'eraser-mode',
471
471
  value: 'CircularEraser',
472
472
  values: [{
473
473
  value: 'CircularEraser',
474
- label: 'Circle'
474
+ label: i18next/* default */.A.t('Buttons:Circle')
475
475
  }, {
476
476
  value: 'SphereEraser',
477
- label: 'Sphere'
477
+ label: i18next/* default */.A.t('Buttons:Sphere')
478
478
  }],
479
479
  commands: 'setToolActiveToolbar'
480
480
  }]
@@ -493,7 +493,7 @@ const toolbarButtons = [{
493
493
  radiusOptionId: 'threshold-radius'
494
494
  }],
495
495
  options: [{
496
- name: 'Radius (mm)',
496
+ name: i18next/* default */.A.t('Buttons:Radius (mm)'),
497
497
  id: 'threshold-radius',
498
498
  type: 'range',
499
499
  explicitRunOnly: true,
@@ -508,16 +508,16 @@ const toolbarButtons = [{
508
508
  }
509
509
  }
510
510
  }, {
511
- name: 'Threshold',
511
+ name: i18next/* default */.A.t('Buttons:Threshold'),
512
512
  type: 'radio',
513
513
  id: 'dynamic-mode',
514
514
  value: 'ThresholdRange',
515
515
  values: [{
516
516
  value: 'ThresholdDynamic',
517
- label: 'Dynamic'
517
+ label: i18next/* default */.A.t('Buttons:Dynamic')
518
518
  }, {
519
519
  value: 'ThresholdRange',
520
- label: 'Range'
520
+ label: i18next/* default */.A.t('Buttons:Range')
521
521
  }],
522
522
  commands: ({
523
523
  value,
@@ -534,23 +534,23 @@ const toolbarButtons = [{
534
534
  }
535
535
  }
536
536
  }, {
537
- name: 'Shape',
537
+ name: i18next/* default */.A.t('Buttons:Shape'),
538
538
  type: 'radio',
539
539
  id: 'eraser-mode',
540
540
  value: 'ThresholdCircularBrush',
541
541
  values: [{
542
542
  value: 'ThresholdCircularBrush',
543
- label: 'Circle'
543
+ label: i18next/* default */.A.t('Buttons:Circle')
544
544
  }, {
545
545
  value: 'ThresholdSphereBrush',
546
- label: 'Sphere'
546
+ label: i18next/* default */.A.t('Buttons:Sphere')
547
547
  }],
548
548
  condition: ({
549
549
  options
550
550
  }) => options.find(option => option.id === 'dynamic-mode').value === 'ThresholdRange',
551
551
  commands: 'setToolActiveToolbar'
552
552
  }, {
553
- name: 'ThresholdRange',
553
+ name: i18next/* default */.A.t('ROIThresholdConfiguration:ThresholdRange'),
554
554
  type: 'double-range',
555
555
  id: 'threshold-range',
556
556
  min: 0,