@ohif/app 3.10.0-beta.76 → 3.10.0-beta.78

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 (30) hide show
  1. package/dist/{1919.bundle.a56f8d9725154e8785e7.js → 1919.bundle.31872868d6d682f65000.js} +2 -2
  2. package/dist/{2701.bundle.b0e1042f5a528fb6bd2b.js → 2701.bundle.835eb3e0006bcfb85469.js} +2 -2
  3. package/dist/{2897.bundle.47ef91cbdce2c8d82aff.js → 2897.bundle.64b79bbbfa3cd956b6ed.js} +75 -77
  4. package/dist/{4526.bundle.90118ca1c32e0a4c7314.js → 4526.bundle.7d643ae29b3ac24f4972.js} +2 -2
  5. package/dist/{5770.bundle.4e4a67dd013f0faa1eff.js → 5770.bundle.a141e0d905d7f8583ed2.js} +2 -2
  6. package/dist/{6201.bundle.403edc53e7164620ff5a.js → 6201.bundle.c12aad45324561ef6a49.js} +2 -2
  7. package/dist/{7197.bundle.1654101bf836a84b875a.js → 7197.bundle.38967aed63fbf5958bba.js} +1 -1
  8. package/dist/{9199.bundle.1835c89a9e816d376292.js → 7490.bundle.a0eb8dff1c95bc1fb8b3.js} +916 -6
  9. package/dist/{810.bundle.16e2a7c2a5d74546586d.js → 810.bundle.c68b62c36b04f7569ab8.js} +2 -2
  10. package/dist/{8558.bundle.197f8d88a960c8ceef2a.js → 8558.bundle.bb60433936e8f98f1367.js} +1 -1
  11. package/dist/{870.bundle.6ab5c5d47f75fac67051.js → 870.bundle.3130ad17a04f89b763e3.js} +4 -3
  12. package/dist/{469.bundle.69efc7cbdeffc44f59d4.js → 9026.bundle.b8a3e1be70effe7ebe86.js} +8 -873
  13. package/dist/{9890.bundle.6656f9fdf968b9d9ed53.js → 9890.bundle.fa30fef9d54652d5980a.js} +2 -2
  14. package/dist/{app.bundle.c86f056e0b2d993eeab6.js → app.bundle.3f9345da025297a0d34d.js} +28 -28
  15. package/dist/app.bundle.css +2 -2
  16. package/dist/index.html +1 -1
  17. package/dist/sw.js +1 -1
  18. package/package.json +18 -18
  19. /package/dist/{213.bundle.e66ee8d813d7c9424cf1.js → 213.bundle.2e09b554c8c4cfdc78f1.js} +0 -0
  20. /package/dist/{2424.bundle.bb567908bf781783f52f.js → 2424.bundle.105a5f0e5354ca006188.js} +0 -0
  21. /package/dist/{2825.bundle.0f26105bd56c3934213b.js → 2825.bundle.a70345948ef742dac625.js} +0 -0
  22. /package/dist/{4834.bundle.c7e2834009cd0d4c19aa.js → 4834.bundle.ed13be06e063fbb85456.js} +0 -0
  23. /package/dist/{5247.bundle.5d156b22f93b05578a09.js → 5247.bundle.0b5588cb3d9b6f4506b4.js} +0 -0
  24. /package/dist/{6027.bundle.e940f475cf4f303cbb20.js → 6027.bundle.09862392da22ade4af87.js} +0 -0
  25. /package/dist/{6734.bundle.58377d74255354f6a7ba.js → 6734.bundle.0781a06cf061800fd9bb.js} +0 -0
  26. /package/dist/{7955.bundle.8485f4b6745eff1c94b1.js → 7955.bundle.53399afcafd2bd5122c0.js} +0 -0
  27. /package/dist/{8008.bundle.dcf5d32b42518268e006.js → 8008.bundle.5cf0282e312d1a99c95b.js} +0 -0
  28. /package/dist/{8259.bundle.b4c17d9aef7b49bdc9d5.js → 8259.bundle.148bed58e5ad1bc22874.js} +0 -0
  29. /package/dist/{469.css → 9026.css} +0 -0
  30. /package/dist/{9551.bundle.2bd0a06c01c076e1f748.js → 9551.bundle.6b770d7d70d2f32aceb8.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (self["webpackChunk"] = self["webpackChunk"] || []).push([[469],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[9026],{
3
3
 
4
- /***/ 30469:
4
+ /***/ 99026:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -1168,876 +1168,8 @@ function OHIFViewportActionCorners({
1168
1168
  });
1169
1169
  }
1170
1170
  /* harmony default export */ const components_OHIFViewportActionCorners = (OHIFViewportActionCorners);
1171
- // EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
1172
- var es = __webpack_require__(99993);
1173
- // EXTERNAL MODULE: ../../ui-next/src/index.ts + 2624 modules
1174
- var ui_next_src = __webpack_require__(18817);
1175
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/Colormap.tsx
1176
-
1177
-
1178
-
1179
- function Colormap({
1180
- colormaps,
1181
- viewportId,
1182
- displaySets,
1183
- commandsManager,
1184
- servicesManager
1185
- }) {
1186
- const {
1187
- cornerstoneViewportService
1188
- } = servicesManager.services;
1189
- const [activeDisplaySet, setActiveDisplaySet] = (0,react.useState)(displaySets[0]);
1190
- const [showPreview, setShowPreview] = (0,react.useState)(false);
1191
- const [prePreviewColormap, setPrePreviewColormap] = (0,react.useState)(null);
1192
- const showPreviewRef = (0,react.useRef)(showPreview);
1193
- showPreviewRef.current = showPreview;
1194
- const prePreviewColormapRef = (0,react.useRef)(prePreviewColormap);
1195
- prePreviewColormapRef.current = prePreviewColormap;
1196
- const activeDisplaySetRef = (0,react.useRef)(activeDisplaySet);
1197
- activeDisplaySetRef.current = activeDisplaySet;
1198
- const onSetColorLUT = (0,react.useCallback)(props => {
1199
- // TODO: Better way to check if it's a fusion
1200
- const oneOpacityColormaps = ['Grayscale', 'X Ray'];
1201
- const opacity = displaySets.length > 1 && !oneOpacityColormaps.includes(props.colormap.name) ? 0.5 : 1;
1202
- commandsManager.run({
1203
- commandName: 'setViewportColormap',
1204
- commandOptions: {
1205
- ...props,
1206
- opacity,
1207
- immediate: true
1208
- },
1209
- context: 'CORNERSTONE'
1210
- });
1211
- }, [commandsManager]);
1212
- const getViewportColormap = (viewportId, displaySet) => {
1213
- const {
1214
- displaySetInstanceUID
1215
- } = displaySet;
1216
- const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
1217
- if (viewport instanceof dist_esm.StackViewport) {
1218
- const {
1219
- colormap
1220
- } = viewport.getProperties();
1221
- if (!colormap) {
1222
- return colormaps.find(c => c.Name === 'Grayscale') || colormaps[0];
1223
- }
1224
- return colormap;
1225
- }
1226
- const actorEntries = viewport.getActors();
1227
- const actorEntry = actorEntries?.find(entry => entry.referencedId.includes(displaySetInstanceUID));
1228
- const {
1229
- colormap
1230
- } = viewport.getProperties(actorEntry.referencedId);
1231
- if (!colormap) {
1232
- return colormaps.find(c => c.Name === 'Grayscale') || colormaps[0];
1233
- }
1234
- return colormap;
1235
- };
1236
- const buttons = (0,react.useMemo)(() => {
1237
- return displaySets.map((displaySet, index) => ({
1238
- children: displaySet.Modality,
1239
- key: index,
1240
- style: {
1241
- minWidth: `calc(100% / ${displaySets.length})`,
1242
- fontSize: '0.8rem',
1243
- textAlign: 'center',
1244
- display: 'flex',
1245
- justifyContent: 'center',
1246
- alignItems: 'center'
1247
- }
1248
- }));
1249
- }, [displaySets]);
1250
- (0,react.useEffect)(() => {
1251
- setActiveDisplaySet(displaySets[displaySets.length - 1]);
1252
- }, [displaySets]);
1253
- return /*#__PURE__*/react.createElement(react.Fragment, null, buttons.length > 1 && /*#__PURE__*/react.createElement("div", {
1254
- className: "all-in-one-menu-item flex w-full justify-center"
1255
- }, /*#__PURE__*/react.createElement(ui_src/* ButtonGroup */.e2, {
1256
- onActiveIndexChange: index => {
1257
- setActiveDisplaySet(displaySets[index]);
1258
- setPrePreviewColormap(null);
1259
- },
1260
- activeIndex: displaySets.findIndex(ds => ds.displaySetInstanceUID === activeDisplaySetRef.current.displaySetInstanceUID) || 1,
1261
- className: "w-[70%] text-[10px]"
1262
- }, buttons.map(({
1263
- children,
1264
- key,
1265
- style
1266
- }) => /*#__PURE__*/react.createElement("div", {
1267
- key: key,
1268
- style: style
1269
- }, children)))), /*#__PURE__*/react.createElement("div", {
1270
- className: "all-in-one-menu-item flex w-full justify-center"
1271
- }, /*#__PURE__*/react.createElement(ui_src/* SwitchButton */.L$, {
1272
- label: "Preview in viewport",
1273
- checked: showPreview,
1274
- onChange: checked => {
1275
- setShowPreview(checked);
1276
- }
1277
- })), /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.DividerItem */.se.VG, null), /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.ItemPanel */.se.cV, null, colormaps.map((colormap, index) => /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.Item */.se.q7, {
1278
- key: index,
1279
- label: colormap.description,
1280
- onClick: () => {
1281
- onSetColorLUT({
1282
- viewportId,
1283
- colormap,
1284
- displaySetInstanceUID: activeDisplaySetRef.current.displaySetInstanceUID
1285
- });
1286
- setPrePreviewColormap(null);
1287
- },
1288
- onMouseEnter: () => {
1289
- if (showPreviewRef.current) {
1290
- setPrePreviewColormap(getViewportColormap(viewportId, activeDisplaySetRef.current));
1291
- onSetColorLUT({
1292
- viewportId,
1293
- colormap,
1294
- displaySetInstanceUID: activeDisplaySetRef.current.displaySetInstanceUID
1295
- });
1296
- }
1297
- },
1298
- onMouseLeave: () => {
1299
- if (showPreviewRef.current && prePreviewColormapRef.current) {
1300
- onSetColorLUT({
1301
- viewportId,
1302
- colormap: prePreviewColormapRef.current,
1303
- displaySetInstanceUID: activeDisplaySetRef.current.displaySetInstanceUID
1304
- });
1305
- }
1306
- }
1307
- }))));
1308
- }
1309
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/Colorbar.tsx
1310
-
1311
-
1312
-
1313
-
1314
- function setViewportColorbar(viewportId, displaySets, commandsManager, servicesManager, colorbarOptions) {
1315
- const {
1316
- cornerstoneViewportService
1317
- } = servicesManager.services;
1318
- const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
1319
- const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
1320
- const backgroundColor = viewportInfo.getViewportOptions().background;
1321
- const isLight = backgroundColor ? dist_esm.utilities.isEqual(backgroundColor, [1, 1, 1]) : false;
1322
- if (isLight) {
1323
- colorbarOptions.ticks = {
1324
- position: 'left',
1325
- style: {
1326
- font: '12px Arial',
1327
- color: '#000000',
1328
- maxNumTicks: 8,
1329
- tickSize: 5,
1330
- tickWidth: 1,
1331
- labelMargin: 3
1332
- }
1333
- };
1334
- }
1335
- const displaySetInstanceUIDs = [];
1336
- if (viewport instanceof dist_esm.StackViewport) {
1337
- displaySetInstanceUIDs.push(viewportId);
1338
- }
1339
- if (viewport instanceof dist_esm.VolumeViewport) {
1340
- displaySets.forEach(ds => {
1341
- displaySetInstanceUIDs.push(ds.displaySetInstanceUID);
1342
- });
1343
- }
1344
- commandsManager.run({
1345
- commandName: 'toggleViewportColorbar',
1346
- commandOptions: {
1347
- viewportId,
1348
- options: colorbarOptions,
1349
- displaySetInstanceUIDs
1350
- },
1351
- context: 'CORNERSTONE'
1352
- });
1353
- }
1354
- function Colorbar({
1355
- viewportId,
1356
- displaySets,
1357
- commandsManager,
1358
- servicesManager,
1359
- colorbarProperties
1360
- }) {
1361
- const {
1362
- colorbarService
1363
- } = servicesManager.services;
1364
- const {
1365
- width: colorbarWidth,
1366
- colorbarTickPosition,
1367
- colorbarContainerPosition,
1368
- colormaps,
1369
- colorbarInitialColormap
1370
- } = colorbarProperties;
1371
- const [showColorbar, setShowColorbar] = (0,react.useState)(colorbarService.hasColorbar(viewportId));
1372
- const onSetColorbar = (0,react.useCallback)(() => {
1373
- setViewportColorbar(viewportId, displaySets, commandsManager, servicesManager, {
1374
- viewportId,
1375
- colormaps,
1376
- ticks: {
1377
- position: colorbarTickPosition
1378
- },
1379
- width: colorbarWidth,
1380
- position: colorbarContainerPosition,
1381
- activeColormapName: colorbarInitialColormap
1382
- });
1383
- }, [commandsManager]);
1384
- (0,react.useEffect)(() => {
1385
- const updateColorbarState = () => {
1386
- setShowColorbar(colorbarService.hasColorbar(viewportId));
1387
- };
1388
- const {
1389
- unsubscribe
1390
- } = colorbarService.subscribe(colorbarService.EVENTS.STATE_CHANGED, updateColorbarState);
1391
- return () => {
1392
- unsubscribe();
1393
- };
1394
- }, [viewportId]);
1395
- return /*#__PURE__*/react.createElement("div", {
1396
- className: "all-in-one-menu-item flex w-full justify-center"
1397
- }, /*#__PURE__*/react.createElement("div", {
1398
- className: "mr-2 w-[28px]"
1399
- }), /*#__PURE__*/react.createElement(ui_src/* SwitchButton */.L$, {
1400
- label: "Display Color bar",
1401
- checked: showColorbar,
1402
- onChange: () => {
1403
- onSetColorbar();
1404
- }
1405
- }));
1406
- }
1407
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/WindowLevel.tsx
1408
-
1409
-
1410
-
1411
- function WindowLevel({
1412
- viewportId,
1413
- commandsManager,
1414
- presets
1415
- }) {
1416
- const {
1417
- t
1418
- } = (0,es/* useTranslation */.Bd)('WindowLevelActionMenu');
1419
- const onSetWindowLevel = (0,react.useCallback)(props => {
1420
- commandsManager.run({
1421
- commandName: 'setViewportWindowLevel',
1422
- commandOptions: {
1423
- ...props,
1424
- viewportId
1425
- },
1426
- context: 'CORNERSTONE'
1427
- });
1428
- }, [commandsManager, viewportId]);
1429
- return /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.ItemPanel */.se.cV, null, presets.map((modalityPresets, modalityIndex) => /*#__PURE__*/react.createElement(react.Fragment, {
1430
- key: modalityIndex
1431
- }, Object.entries(modalityPresets).map(([modality, presetsArray]) => /*#__PURE__*/react.createElement(react.Fragment, {
1432
- key: modality
1433
- }, /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.HeaderItem */.se.N5, null, t('Modality Presets', {
1434
- modality
1435
- })), presetsArray.map((preset, index) => /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.Item */.se.q7, {
1436
- key: `${modality}-${index}`,
1437
- label: preset.description,
1438
- secondaryLabel: `${preset.window} / ${preset.level}`,
1439
- onClick: () => onSetWindowLevel(preset)
1440
- })))))));
1441
- }
1442
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingPresetsContent.tsx
1443
-
1444
-
1445
-
1446
-
1447
- function VolumeRenderingPresetsContent({
1448
- presets,
1449
- viewportId,
1450
- commandsManager,
1451
- onClose
1452
- }) {
1453
- const [filteredPresets, setFilteredPresets] = (0,react.useState)(presets);
1454
- const [searchValue, setSearchValue] = (0,react.useState)('');
1455
- const [selectedPreset, setSelectedPreset] = (0,react.useState)(null);
1456
- const handleSearchChange = (0,react.useCallback)(value => {
1457
- setSearchValue(value);
1458
- const filtered = value ? presets.filter(preset => preset.name.toLowerCase().includes(value.toLowerCase())) : presets;
1459
- setFilteredPresets(filtered);
1460
- }, [presets]);
1461
- const handleApply = (0,react.useCallback)(props => {
1462
- commandsManager.runCommand('setViewportPreset', {
1463
- ...props
1464
- });
1465
- }, [commandsManager]);
1466
- const formatLabel = (label, maxChars) => {
1467
- return label.length > maxChars ? `${label.slice(0, maxChars)}...` : label;
1468
- };
1469
- return /*#__PURE__*/react.createElement("div", {
1470
- className: "flex min-h-full w-full flex-col justify-between"
1471
- }, /*#__PURE__*/react.createElement("div", {
1472
- className: "border-secondary-light h-[433px] w-full overflow-hidden rounded border bg-black px-2.5"
1473
- }, /*#__PURE__*/react.createElement("div", {
1474
- className: "flex h-[46px] w-full items-center justify-start"
1475
- }, /*#__PURE__*/react.createElement("div", {
1476
- className: "h-[26px] w-[200px]"
1477
- }, /*#__PURE__*/react.createElement(ui_src/* InputFilterText */.Cv, {
1478
- value: searchValue,
1479
- onDebounceChange: handleSearchChange,
1480
- placeholder: 'Search all'
1481
- }))), /*#__PURE__*/react.createElement("div", {
1482
- className: "ohif-scrollbar overflow h-[385px] w-full overflow-y-auto"
1483
- }, /*#__PURE__*/react.createElement("div", {
1484
- className: "grid grid-cols-4 gap-3 pt-2 pr-3"
1485
- }, filteredPresets.map((preset, index) => /*#__PURE__*/react.createElement("div", {
1486
- key: index,
1487
- className: "flex cursor-pointer flex-col items-start",
1488
- onClick: () => {
1489
- setSelectedPreset(preset);
1490
- handleApply({
1491
- preset: preset.name,
1492
- viewportId
1493
- });
1494
- }
1495
- }, /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI.ByName, {
1496
- name: preset.name,
1497
- className: selectedPreset?.name === preset.name ? 'border-primary-light h-[75px] w-[95px] max-w-none rounded border-2' : 'hover:border-primary-light h-[75px] w-[95px] max-w-none rounded border-2 border-black'
1498
- }), /*#__PURE__*/react.createElement("label", {
1499
- className: "text-aqua-pale mt-2 text-left text-xs"
1500
- }, formatLabel(preset.name, 11))))))), /*#__PURE__*/react.createElement("footer", {
1501
- className: "flex h-[60px] w-full items-center justify-end"
1502
- }, /*#__PURE__*/react.createElement("div", {
1503
- className: "flex"
1504
- }, /*#__PURE__*/react.createElement(ui_src/* Button */.$n, {
1505
- name: "Cancel",
1506
- size: ui_src/* ButtonEnums.size */.Ny.Ej.medium,
1507
- type: ui_src/* ButtonEnums.type */.Ny.NW.secondary,
1508
- onClick: onClose
1509
- }, ' ', "Cancel", ' '))));
1510
- }
1511
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingPresets.tsx
1512
-
1513
-
1514
-
1515
-
1516
- function VolumeRenderingPresets({
1517
- viewportId,
1518
- servicesManager,
1519
- commandsManager,
1520
- volumeRenderingPresets
1521
- }) {
1522
- const {
1523
- uiModalService
1524
- } = servicesManager.services;
1525
- const onClickPresets = () => {
1526
- uiModalService.show({
1527
- content: VolumeRenderingPresetsContent,
1528
- title: 'Rendering Presets',
1529
- movable: true,
1530
- contentProps: {
1531
- onClose: uiModalService.hide,
1532
- presets: volumeRenderingPresets,
1533
- viewportId,
1534
- commandsManager
1535
- },
1536
- containerDimensions: 'h-[543px] w-[460px]',
1537
- contentDimensions: 'h-[493px] w-[460px] pl-[12px] pr-[12px]'
1538
- });
1539
- };
1540
- return /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.Item */.se.q7, {
1541
- label: "Rendering Presets",
1542
- icon: /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI.VolumeRendering, null),
1543
- rightIcon: /*#__PURE__*/react.createElement(ui_next_src/* Icons */.FI.ByName, {
1544
- name: "action-new-dialog"
1545
- }),
1546
- onClick: onClickPresets
1547
- });
1548
- }
1549
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingQuality.tsx
1550
-
1551
- function VolumeRenderingQuality({
1552
- volumeRenderingQualityRange,
1553
- commandsManager,
1554
- servicesManager,
1555
- viewportId
1556
- }) {
1557
- const {
1558
- cornerstoneViewportService
1559
- } = servicesManager.services;
1560
- const {
1561
- min,
1562
- max,
1563
- step
1564
- } = volumeRenderingQualityRange;
1565
- const [quality, setQuality] = (0,react.useState)(null);
1566
- const onChange = (0,react.useCallback)(value => {
1567
- commandsManager.runCommand('setVolumeRenderingQulaity', {
1568
- viewportId,
1569
- volumeQuality: value
1570
- });
1571
- setQuality(value);
1572
- }, [commandsManager, viewportId]);
1573
- const calculateBackground = value => {
1574
- const percentage = (value - 0) / (1 - 0) * 100;
1575
- return `linear-gradient(to right, #5acce6 0%, #5acce6 ${percentage}%, #3a3f99 ${percentage}%, #3a3f99 100%)`;
1576
- };
1577
- (0,react.useEffect)(() => {
1578
- const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
1579
- const {
1580
- actor
1581
- } = viewport.getActors()[0];
1582
- const mapper = actor.getMapper();
1583
- const image = mapper.getInputData();
1584
- const spacing = image.getSpacing();
1585
- const sampleDistance = mapper.getSampleDistance();
1586
- const averageSpacing = spacing.reduce((a, b) => a + b) / 3.0;
1587
- if (sampleDistance === averageSpacing) {
1588
- setQuality(1);
1589
- } else {
1590
- setQuality(Math.sqrt(averageSpacing / (sampleDistance * 0.5)));
1591
- }
1592
- }, [cornerstoneViewportService, viewportId]);
1593
- return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
1594
- className: "all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px]"
1595
- }, /*#__PURE__*/react.createElement("label", {
1596
- className: "block text-white",
1597
- htmlFor: "volume"
1598
- }, "Quality"), quality !== null && /*#__PURE__*/react.createElement("input", {
1599
- className: "bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg",
1600
- value: quality,
1601
- id: "volume",
1602
- max: max,
1603
- min: min,
1604
- type: "range",
1605
- step: step,
1606
- onChange: e => onChange(parseInt(e.target.value, 10)),
1607
- style: {
1608
- background: calculateBackground((quality - min) / (max - min)),
1609
- '--thumb-inner-color': '#5acce6',
1610
- '--thumb-outer-color': '#090c29'
1611
- }
1612
- })));
1613
- }
1614
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeShift.tsx
1615
-
1616
- function VolumeShift({
1617
- viewportId,
1618
- commandsManager,
1619
- servicesManager
1620
- }) {
1621
- const {
1622
- cornerstoneViewportService
1623
- } = servicesManager.services;
1624
- const [minShift, setMinShift] = (0,react.useState)(null);
1625
- const [maxShift, setMaxShift] = (0,react.useState)(null);
1626
- const [shift, setShift] = (0,react.useState)(cornerstoneViewportService.getCornerstoneViewport(viewportId)?.shiftedBy || 0);
1627
- const [step, setStep] = (0,react.useState)(null);
1628
- const [isBlocking, setIsBlocking] = (0,react.useState)(false);
1629
- const prevShiftRef = (0,react.useRef)(shift);
1630
- const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
1631
- const {
1632
- actor
1633
- } = viewport.getActors()[0];
1634
- const ofun = actor.getProperty().getScalarOpacity(0);
1635
- (0,react.useEffect)(() => {
1636
- if (isBlocking) {
1637
- return;
1638
- }
1639
- const range = ofun.getRange();
1640
- const transferFunctionWidth = range[1] - range[0];
1641
- const minShift = -transferFunctionWidth;
1642
- const maxShift = transferFunctionWidth;
1643
- setMinShift(minShift);
1644
- setMaxShift(maxShift);
1645
- setStep(Math.pow(10, Math.floor(Math.log10(transferFunctionWidth / 500))));
1646
- }, [cornerstoneViewportService, viewportId, actor, ofun, isBlocking]);
1647
- const onChangeRange = (0,react.useCallback)(newShift => {
1648
- const shiftDifference = newShift - prevShiftRef.current;
1649
- prevShiftRef.current = newShift;
1650
- viewport.shiftedBy = newShift;
1651
- commandsManager.runCommand('shiftVolumeOpacityPoints', {
1652
- viewportId,
1653
- shift: shiftDifference
1654
- });
1655
- }, [commandsManager, viewportId, viewport]);
1656
- const calculateBackground = value => {
1657
- const percentage = (value - 0) / (1 - 0) * 100;
1658
- return `linear-gradient(to right, #5acce6 0%, #5acce6 ${percentage}%, #3a3f99 ${percentage}%, #3a3f99 100%)`;
1659
- };
1660
- return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
1661
- className: "all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px]"
1662
- }, /*#__PURE__*/react.createElement("label", {
1663
- className: "block text-white",
1664
- htmlFor: "shift"
1665
- }, "Shift"), step !== null && /*#__PURE__*/react.createElement("input", {
1666
- className: "bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg",
1667
- value: shift,
1668
- onChange: e => {
1669
- const shiftValue = parseInt(e.target.value, 10);
1670
- setShift(shiftValue);
1671
- onChangeRange(shiftValue);
1672
- },
1673
- id: "shift",
1674
- onMouseDown: () => setIsBlocking(true),
1675
- onMouseUp: () => setIsBlocking(false),
1676
- max: maxShift,
1677
- min: minShift,
1678
- type: "range",
1679
- step: step,
1680
- style: {
1681
- background: calculateBackground((shift - minShift) / (maxShift - minShift)),
1682
- '--thumb-inner-color': '#5acce6',
1683
- '--thumb-outer-color': '#090c29'
1684
- }
1685
- })));
1686
- }
1687
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeLighting.tsx
1688
-
1689
- function VolumeLighting({
1690
- servicesManager,
1691
- commandsManager,
1692
- viewportId,
1693
- hasShade
1694
- }) {
1695
- const {
1696
- cornerstoneViewportService
1697
- } = servicesManager.services;
1698
- const [ambient, setAmbient] = (0,react.useState)(null);
1699
- const [diffuse, setDiffuse] = (0,react.useState)(null);
1700
- const [specular, setSpecular] = (0,react.useState)(null);
1701
- const onAmbientChange = (0,react.useCallback)(() => {
1702
- commandsManager.runCommand('setVolumeLighting', {
1703
- viewportId,
1704
- options: {
1705
- ambient
1706
- }
1707
- });
1708
- }, [ambient, commandsManager, viewportId]);
1709
- const onDiffuseChange = (0,react.useCallback)(() => {
1710
- commandsManager.runCommand('setVolumeLighting', {
1711
- viewportId,
1712
- options: {
1713
- diffuse
1714
- }
1715
- });
1716
- }, [diffuse, commandsManager, viewportId]);
1717
- const onSpecularChange = (0,react.useCallback)(() => {
1718
- commandsManager.runCommand('setVolumeLighting', {
1719
- viewportId,
1720
- options: {
1721
- specular
1722
- }
1723
- });
1724
- }, [specular, commandsManager, viewportId]);
1725
- const calculateBackground = value => {
1726
- const percentage = (value - 0) / (1 - 0) * 100;
1727
- return `linear-gradient(to right, #5acce6 0%, #5acce6 ${percentage}%, #3a3f99 ${percentage}%, #3a3f99 100%)`;
1728
- };
1729
- (0,react.useEffect)(() => {
1730
- const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
1731
- const {
1732
- actor
1733
- } = viewport.getActors()[0];
1734
- const ambient = actor.getProperty().getAmbient();
1735
- const diffuse = actor.getProperty().getDiffuse();
1736
- const specular = actor.getProperty().getSpecular();
1737
- setAmbient(ambient);
1738
- setDiffuse(diffuse);
1739
- setSpecular(specular);
1740
- }, [viewportId, cornerstoneViewportService]);
1741
- const disableOption = hasShade ? '' : 'ohif-disabled !opacity-40';
1742
- const disableSlider = !hasShade;
1743
- return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
1744
- className: `all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px] ${disableOption}`
1745
- }, /*#__PURE__*/react.createElement("label", {
1746
- className: "block text-white",
1747
- htmlFor: "ambient"
1748
- }, "Ambient"), ambient !== null && /*#__PURE__*/react.createElement("input", {
1749
- className: "bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg",
1750
- value: ambient,
1751
- onChange: e => {
1752
- setAmbient(e.target.value);
1753
- onAmbientChange();
1754
- },
1755
- id: "ambient",
1756
- disabled: disableSlider,
1757
- max: 1,
1758
- min: 0,
1759
- type: "range",
1760
- step: 0.1,
1761
- style: {
1762
- background: calculateBackground(ambient),
1763
- '--thumb-inner-color': '#5acce6',
1764
- '--thumb-outer-color': '#090c29'
1765
- }
1766
- })), /*#__PURE__*/react.createElement("div", {
1767
- className: `all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px] ${disableOption}`
1768
- }, /*#__PURE__*/react.createElement("label", {
1769
- className: "block text-white",
1770
- htmlFor: "diffuse"
1771
- }, "Diffuse"), diffuse !== null && /*#__PURE__*/react.createElement("input", {
1772
- className: "bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg",
1773
- value: diffuse,
1774
- onChange: e => {
1775
- setDiffuse(e.target.value);
1776
- onDiffuseChange();
1777
- },
1778
- disabled: disableSlider,
1779
- id: "diffuse",
1780
- max: 1,
1781
- min: 0,
1782
- type: "range",
1783
- step: 0.1,
1784
- style: {
1785
- background: calculateBackground(diffuse),
1786
- '--thumb-inner-color': '#5acce6',
1787
- '--thumb-outer-color': '#090c29'
1788
- }
1789
- })), /*#__PURE__*/react.createElement("div", {
1790
- className: `all-in-one-menu-item flex w-full flex-row !items-center justify-between gap-[10px] ${disableOption}`
1791
- }, /*#__PURE__*/react.createElement("label", {
1792
- className: "block text-white",
1793
- htmlFor: "specular"
1794
- }, "Specular"), specular !== null && /*#__PURE__*/react.createElement("input", {
1795
- className: "bg-inputfield-main h-2 w-[120px] cursor-pointer appearance-none rounded-lg",
1796
- value: specular,
1797
- disabled: disableSlider,
1798
- onChange: e => {
1799
- setSpecular(e.target.value);
1800
- onSpecularChange();
1801
- },
1802
- id: "specular",
1803
- max: 1,
1804
- min: 0,
1805
- type: "range",
1806
- step: 0.1,
1807
- style: {
1808
- background: calculateBackground(specular),
1809
- '--thumb-inner-color': '#5acce6',
1810
- '--thumb-outer-color': '#090c29'
1811
- }
1812
- })));
1813
- }
1814
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeShade.tsx
1815
-
1816
-
1817
- function VolumeShade({
1818
- commandsManager,
1819
- viewportId,
1820
- servicesManager,
1821
- onClickShade = bool => {}
1822
- }) {
1823
- const {
1824
- cornerstoneViewportService
1825
- } = servicesManager.services;
1826
- const [shade, setShade] = (0,react.useState)(true);
1827
- const [key, setKey] = (0,react.useState)(0);
1828
- const onShadeChange = (0,react.useCallback)(checked => {
1829
- commandsManager.runCommand('setVolumeLighting', {
1830
- viewportId,
1831
- options: {
1832
- shade: checked
1833
- }
1834
- });
1835
- }, [commandsManager, viewportId]);
1836
- (0,react.useEffect)(() => {
1837
- const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
1838
- const {
1839
- actor
1840
- } = viewport.getActors()[0];
1841
- const shade = actor.getProperty().getShade();
1842
- setShade(shade);
1843
- onClickShade(shade);
1844
- setKey(key + 1);
1845
- }, [viewportId, cornerstoneViewportService]);
1846
- return /*#__PURE__*/react.createElement(ui_src/* SwitchButton */.L$, {
1847
- key: key,
1848
- label: "Shade",
1849
- checked: shade,
1850
- onChange: () => {
1851
- setShade(!shade);
1852
- onClickShade(!shade);
1853
- onShadeChange(!shade);
1854
- }
1855
- });
1856
- }
1857
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/VolumeRenderingOptions.tsx
1858
-
1859
-
1860
-
1861
-
1862
-
1863
-
1864
- function VolumeRenderingOptions({
1865
- viewportId,
1866
- commandsManager,
1867
- volumeRenderingQualityRange,
1868
- servicesManager
1869
- }) {
1870
- const [hasShade, setShade] = (0,react.useState)(false);
1871
- return /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.ItemPanel */.se.cV, null, /*#__PURE__*/react.createElement(VolumeRenderingQuality, {
1872
- viewportId: viewportId,
1873
- commandsManager: commandsManager,
1874
- servicesManager: servicesManager,
1875
- volumeRenderingQualityRange: volumeRenderingQualityRange
1876
- }), /*#__PURE__*/react.createElement(VolumeShift, {
1877
- viewportId: viewportId,
1878
- commandsManager: commandsManager,
1879
- servicesManager: servicesManager
1880
- }), /*#__PURE__*/react.createElement("div", {
1881
- className: "all-in-one-menu-item mt-2 flex !h-[20px] w-full justify-start"
1882
- }, /*#__PURE__*/react.createElement("div", {
1883
- className: "text-aqua-pale text-[13px]"
1884
- }, "LIGHTING")), /*#__PURE__*/react.createElement("div", {
1885
- className: "bg-primary-dark mt-1 mb-1 h-[2px] w-full"
1886
- }), /*#__PURE__*/react.createElement("div", {
1887
- className: "all-in-one-menu-item flex w-full justify-center"
1888
- }, /*#__PURE__*/react.createElement(VolumeShade, {
1889
- commandsManager: commandsManager,
1890
- servicesManager: servicesManager,
1891
- viewportId: viewportId,
1892
- onClickShade: setShade
1893
- })), /*#__PURE__*/react.createElement(VolumeLighting, {
1894
- viewportId: viewportId,
1895
- commandsManager: commandsManager,
1896
- servicesManager: servicesManager,
1897
- hasShade: hasShade
1898
- }));
1899
- }
1900
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/WindowLevelActionMenu.tsx
1901
-
1902
-
1903
-
1904
-
1905
-
1906
-
1907
-
1908
-
1909
-
1910
-
1911
-
1912
-
1913
-
1914
- const nonWLModalities = ['SR', 'SEG', 'SM', 'RTSTRUCT', 'RTPLAN', 'RTDOSE'];
1915
- function WindowLevelActionMenu({
1916
- viewportId,
1917
- element,
1918
- presets,
1919
- verticalDirection,
1920
- horizontalDirection,
1921
- commandsManager,
1922
- servicesManager,
1923
- colorbarProperties,
1924
- displaySets,
1925
- volumeRenderingPresets,
1926
- volumeRenderingQualityRange
1927
- }) {
1928
- const {
1929
- colormaps,
1930
- colorbarContainerPosition,
1931
- colorbarInitialColormap,
1932
- colorbarTickPosition,
1933
- width: colorbarWidth
1934
- } = colorbarProperties;
1935
- const {
1936
- colorbarService,
1937
- cornerstoneViewportService
1938
- } = servicesManager.services;
1939
- const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
1940
- const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
1941
- const backgroundColor = viewportInfo.getViewportOptions().background;
1942
- const isLight = backgroundColor ? dist_esm.utilities.isEqual(backgroundColor, [1, 1, 1]) : false;
1943
- const {
1944
- t
1945
- } = (0,es/* useTranslation */.Bd)('WindowLevelActionMenu');
1946
- const [viewportGrid] = (0,ui_next_src/* useViewportGrid */.ih)();
1947
- const {
1948
- activeViewportId
1949
- } = viewportGrid;
1950
- const [vpHeight, setVpHeight] = (0,react.useState)(element?.clientHeight);
1951
- const [menuKey, setMenuKey] = (0,react.useState)(0);
1952
- const [is3DVolume, setIs3DVolume] = (0,react.useState)(false);
1953
- const onSetColorbar = (0,react.useCallback)(() => {
1954
- setViewportColorbar(viewportId, displaySets, commandsManager, servicesManager, {
1955
- colormaps,
1956
- ticks: {
1957
- position: colorbarTickPosition
1958
- },
1959
- width: colorbarWidth,
1960
- position: colorbarContainerPosition,
1961
- activeColormapName: colorbarInitialColormap
1962
- });
1963
- }, [commandsManager]);
1964
- (0,react.useEffect)(() => {
1965
- const newVpHeight = element?.clientHeight;
1966
- if (vpHeight !== newVpHeight) {
1967
- setVpHeight(newVpHeight);
1968
- }
1969
- }, [element, vpHeight]);
1970
- (0,react.useEffect)(() => {
1971
- if (!colorbarService.hasColorbar(viewportId)) {
1972
- return;
1973
- }
1974
- window.setTimeout(() => {
1975
- colorbarService.removeColorbar(viewportId);
1976
- onSetColorbar();
1977
- }, 0);
1978
- }, [viewportId, displaySets, viewport]);
1979
- (0,react.useEffect)(() => {
1980
- setMenuKey(menuKey + 1);
1981
- const viewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
1982
- if (viewport instanceof dist_esm.VolumeViewport3D) {
1983
- setIs3DVolume(true);
1984
- } else {
1985
- setIs3DVolume(false);
1986
- }
1987
- }, [displaySets, viewportId, presets, volumeRenderingQualityRange, volumeRenderingPresets, colorbarProperties, activeViewportId, viewportGrid]);
1988
- return /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.IconMenu */.se.dd, {
1989
- icon: "viewport-window-level",
1990
- verticalDirection: verticalDirection,
1991
- horizontalDirection: horizontalDirection,
1992
- iconClassName: classnames_default()(
1993
- // Visible on hover and for the active viewport
1994
- activeViewportId === viewportId ? 'visible' : 'invisible group-hover/pane:visible', 'flex shrink-0 cursor-pointer rounded active:text-white text-primary-light', isLight ? ' hover:bg-secondary-dark' : 'hover:bg-secondary-light/60'),
1995
- menuStyle: {
1996
- maxHeight: vpHeight - 32,
1997
- minWidth: 218
1998
- },
1999
- onVisibilityChange: () => {
2000
- setVpHeight(element.clientHeight);
2001
- },
2002
- menuKey: menuKey
2003
- }, /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.ItemPanel */.se.cV, null, !is3DVolume && /*#__PURE__*/react.createElement(Colorbar, {
2004
- viewportId: viewportId,
2005
- displaySets: displaySets.filter(ds => !nonWLModalities.includes(ds.Modality)),
2006
- commandsManager: commandsManager,
2007
- servicesManager: servicesManager,
2008
- colorbarProperties: colorbarProperties
2009
- }), colormaps && !is3DVolume && /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.SubMenu */.se.g8, {
2010
- key: "colorLUTPresets",
2011
- itemLabel: "Color LUT",
2012
- itemIcon: "icon-color-lut"
2013
- }, /*#__PURE__*/react.createElement(Colormap, {
2014
- colormaps: colormaps,
2015
- viewportId: viewportId,
2016
- displaySets: displaySets.filter(ds => !nonWLModalities.includes(ds.Modality)),
2017
- commandsManager: commandsManager,
2018
- servicesManager: servicesManager
2019
- })), presets && presets.length > 0 && !is3DVolume && /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.SubMenu */.se.g8, {
2020
- key: "windowLevelPresets",
2021
- itemLabel: t('Modality Window Presets'),
2022
- itemIcon: "viewport-window-level"
2023
- }, /*#__PURE__*/react.createElement(WindowLevel, {
2024
- viewportId: viewportId,
2025
- commandsManager: commandsManager,
2026
- presets: presets
2027
- })), volumeRenderingPresets && is3DVolume && /*#__PURE__*/react.createElement(VolumeRenderingPresets, {
2028
- servicesManager: servicesManager,
2029
- viewportId: viewportId,
2030
- commandsManager: commandsManager,
2031
- volumeRenderingPresets: volumeRenderingPresets
2032
- }), volumeRenderingQualityRange && is3DVolume && /*#__PURE__*/react.createElement(ui_src/* AllInOneMenu.SubMenu */.se.g8, {
2033
- itemLabel: "Rendering Options"
2034
- }, /*#__PURE__*/react.createElement(VolumeRenderingOptions, {
2035
- viewportId: viewportId,
2036
- commandsManager: commandsManager,
2037
- volumeRenderingQualityRange: volumeRenderingQualityRange,
2038
- servicesManager: servicesManager
2039
- }))));
2040
- }
1171
+ // EXTERNAL MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/WindowLevelActionMenu.tsx + 10 modules
1172
+ var WindowLevelActionMenu_WindowLevelActionMenu = __webpack_require__(35392);
2041
1173
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/WindowLevelActionMenu/getWindowLevelActionMenu.tsx
2042
1174
 
2043
1175
 
@@ -2059,12 +1191,13 @@ function getWindowLevelActionMenu({
2059
1191
  volumeRenderingPresets,
2060
1192
  volumeRenderingQualityRange
2061
1193
  } = customizationService.getCustomization('cornerstone.3dVolumeRendering');
1194
+ const WindowLevelActionMenu = customizationService.getCustomization('cornerstone.windowLevelActionMenu');
2062
1195
  const displaySetPresets = displaySets.filter(displaySet => presets[displaySet.Modality]).map(displaySet => {
2063
1196
  return {
2064
1197
  [displaySet.Modality]: presets[displaySet.Modality]
2065
1198
  };
2066
1199
  });
2067
- const modalities = displaySets.map(displaySet => displaySet.Modality).filter(modality => !nonWLModalities.includes(modality));
1200
+ const modalities = displaySets.map(displaySet => displaySet.Modality).filter(modality => !WindowLevelActionMenu_WindowLevelActionMenu/* nonWLModalities */.i.includes(modality));
2068
1201
  if (modalities.length === 0) {
2069
1202
  return null;
2070
1203
  }
@@ -2082,6 +1215,8 @@ function getWindowLevelActionMenu({
2082
1215
  volumeRenderingQualityRange: volumeRenderingQualityRange
2083
1216
  });
2084
1217
  }
1218
+ // EXTERNAL MODULE: ../../ui-next/src/index.ts + 2624 modules
1219
+ var ui_next_src = __webpack_require__(18817);
2085
1220
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/enums/index.js + 2 modules
2086
1221
  var enums = __webpack_require__(99737);
2087
1222
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/ViewportDataOverlaySettingMenu/ViewportSegmentationMenu.tsx