fix(ui): Enhance UI Components and Update CornerstoneJS Dependencies and resizable panels (#4938)
Co-authored-by: Joe Boccanfuso <joe.boccanfuso@radicalimaging.com>
This commit is contained in:
1 parent
c05ec1909f
commit
43bc142439
46 files changed
+504
-467
No files matched your search
@@ -46,8 +46,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.20.13",
|
||||
"@cornerstonejs/adapters": "^3.9.4",
|
||||
"@cornerstonejs/core": "^3.9.4",
|
||||
"@cornerstonejs/adapters": "^3.9.5",
|
||||
"@cornerstonejs/core": "^3.9.5",
|
||||
"@kitware/vtk.js": "32.12.0",
|
||||
"react-color": "^2.19.3"
|
||||
}
|
||||
|
||||
@@ -46,8 +46,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.20.13",
|
||||
"@cornerstonejs/adapters": "^3.9.4",
|
||||
"@cornerstonejs/core": "^3.9.4",
|
||||
"@cornerstonejs/adapters": "^3.9.5",
|
||||
"@cornerstonejs/core": "^3.9.5",
|
||||
"@kitware/vtk.js": "32.12.0",
|
||||
"react-color": "^2.19.3"
|
||||
}
|
||||
|
||||
@@ -46,9 +46,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.20.13",
|
||||
"@cornerstonejs/adapters": "^3.9.4",
|
||||
"@cornerstonejs/core": "^3.9.4",
|
||||
"@cornerstonejs/tools": "^3.9.4",
|
||||
"@cornerstonejs/adapters": "^3.9.5",
|
||||
"@cornerstonejs/core": "^3.9.5",
|
||||
"@cornerstonejs/tools": "^3.9.5",
|
||||
"classnames": "^2.3.2"
|
||||
}
|
||||
}
|
||||
@@ -42,8 +42,8 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.20.13",
|
||||
"@cornerstonejs/core": "^3.9.4",
|
||||
"@cornerstonejs/tools": "^3.9.4",
|
||||
"@cornerstonejs/core": "^3.9.5",
|
||||
"@cornerstonejs/tools": "^3.9.5",
|
||||
"classnames": "^2.3.2"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import React, { useEffect, useState, useRef } from 'react';
|
||||
import { useCine } from '@ohif/ui';
|
||||
import { useCine } from '@ohif/ui-next';
|
||||
import { useViewportGrid } from '@ohif/ui-next';
|
||||
import { utilities as csUtils, volumeLoader, eventTarget, Enums, cache } from '@cornerstonejs/core';
|
||||
import { utilities as cstUtils } from '@cornerstonejs/tools';
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
|
||||
"@cornerstonejs/codec-openjpeg": "^1.2.4",
|
||||
"@cornerstonejs/codec-openjph": "^2.4.5",
|
||||
"@cornerstonejs/dicom-image-loader": "^3.9.4",
|
||||
"@cornerstonejs/dicom-image-loader": "^3.9.5",
|
||||
"@ohif/core": "3.10.0-beta.158",
|
||||
"@ohif/ui": "3.10.0-beta.158",
|
||||
"dcmjs": "*",
|
||||
@@ -51,12 +51,12 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.20.13",
|
||||
"@cornerstonejs/adapters": "^3.9.4",
|
||||
"@cornerstonejs/ai": "^3.9.4",
|
||||
"@cornerstonejs/core": "^3.9.4",
|
||||
"@cornerstonejs/labelmap-interpolation": "^3.9.4",
|
||||
"@cornerstonejs/polymorphic-segmentation": "^3.9.4",
|
||||
"@cornerstonejs/tools": "^3.9.4",
|
||||
"@cornerstonejs/adapters": "^3.9.5",
|
||||
"@cornerstonejs/ai": "^3.9.5",
|
||||
"@cornerstonejs/core": "^3.9.5",
|
||||
"@cornerstonejs/labelmap-interpolation": "^3.9.5",
|
||||
"@cornerstonejs/polymorphic-segmentation": "^3.9.5",
|
||||
"@cornerstonejs/tools": "^3.9.5",
|
||||
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
|
||||
"@kitware/vtk.js": "32.12.0",
|
||||
"html2canvas": "^1.4.1",
|
||||
|
||||
@@ -229,11 +229,6 @@ const ViewportWindowLevel = ({
|
||||
No window level data available
|
||||
</div>
|
||||
)}
|
||||
{isLoading && (
|
||||
<div className="text-muted-foreground py-2 text-center text-sm">
|
||||
Loading window level data...
|
||||
</div>
|
||||
)}
|
||||
</PanelSection.Content>
|
||||
</PanelSection>
|
||||
);
|
||||
|
||||
@@ -68,7 +68,7 @@ export default function getSegmentationPanelCustomization({ commandsManager, ser
|
||||
checked={useCenterAsSegmentIndex}
|
||||
onCheckedChange={handleUseCenterAsSegmentIndexChange}
|
||||
/>
|
||||
<span className="text-base text-white">Use Center as Segment Index</span>
|
||||
<span className="text-base text-white">Use center as segment index</span>
|
||||
</div>
|
||||
|
||||
<div className="flex items-center gap-2">
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import React from 'react';
|
||||
import { DicomMetadataStore } from '@ohif/core';
|
||||
|
||||
/**
|
||||
|
||||
@@ -153,7 +153,7 @@ const DicomTagBrowser = ({
|
||||
</Select>
|
||||
</div>
|
||||
{shouldShowInstanceList && (
|
||||
<div className="mx-auto flex w-1/5 flex-col">
|
||||
<div className="mx-auto mt-0.5 flex w-1/4 flex-col">
|
||||
<span className="text-muted-foreground flex h-6 items-center text-xs">
|
||||
Instance Number ({instanceNumber} of {activeDisplaySet?.images?.length})
|
||||
</span>
|
||||
@@ -169,7 +169,7 @@ const DicomTagBrowser = ({
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
<div className="ml-auto flex w-1/3 flex-col">
|
||||
<div className="ml-auto mr-1 flex w-1/3 flex-col">
|
||||
<span className="text-muted-foreground flex h-6 items-center text-xs">
|
||||
Search metadata
|
||||
</span>
|
||||
|
||||
@@ -28,7 +28,9 @@ const useResizablePanels = (
|
||||
leftPanelClosed,
|
||||
setLeftPanelClosed,
|
||||
rightPanelClosed,
|
||||
setRightPanelClosed
|
||||
setRightPanelClosed,
|
||||
hasLeftPanels,
|
||||
hasRightPanels
|
||||
) => {
|
||||
const [leftPanelExpandedWidth, setLeftPanelExpandedWidth] = useState(
|
||||
panelGroupDefinition.left.initialExpandedWidth
|
||||
@@ -156,6 +158,8 @@ const useResizablePanels = (
|
||||
rightPanelExpandedWidth,
|
||||
leftResizablePanelMinimumSize,
|
||||
rightResizablePanelMinimumSize,
|
||||
hasLeftPanels,
|
||||
hasRightPanels,
|
||||
]);
|
||||
|
||||
/**
|
||||
|
||||
@@ -52,7 +52,9 @@ function ViewerLayout({
|
||||
leftPanelClosed,
|
||||
setLeftPanelClosed,
|
||||
rightPanelClosed,
|
||||
setRightPanelClosed
|
||||
setRightPanelClosed,
|
||||
hasLeftPanels,
|
||||
hasRightPanels
|
||||
);
|
||||
|
||||
const handleMouseEnter = () => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React, { useEffect, useMemo, useState } from 'react';
|
||||
import { InputDialog } from '@ohif/ui-next';
|
||||
import { InputDialog, cn } from '@ohif/ui-next';
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@ohif/ui-next';
|
||||
import { useSystem } from '@ohif/core';
|
||||
|
||||
@@ -71,69 +71,93 @@ function ReportDialog({ dataSources, hide, onSave, onCancel }: ReportDialogProps
|
||||
const showDataSourceSelect = dataSources?.length > 1;
|
||||
|
||||
return (
|
||||
<div className="text-foreground mt-2 flex min-w-[400px] max-w-md flex-col gap-4">
|
||||
<div className="flex flex-col gap-3">
|
||||
<div className="text-foreground flex min-w-[400px] max-w-md flex-col">
|
||||
<div className="flex flex-col gap-4">
|
||||
<div className="flex gap-4">
|
||||
{showDataSourceSelect && (
|
||||
<div className="mt-1 w-1/2">
|
||||
<div className="mb-1 pl-1 text-base">Data source</div>
|
||||
<>
|
||||
<div className="mt-1 w-1/2">
|
||||
<div className="mb-1 pl-1 text-base">Data source</div>
|
||||
<Select
|
||||
value={selectedDataSource}
|
||||
onValueChange={setSelectedDataSource}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Select a data source" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{dataSources.map(source => (
|
||||
<SelectItem
|
||||
key={source.value}
|
||||
value={source.value}
|
||||
>
|
||||
{source.label}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
<div className={showDataSourceSelect ? 'mt-1 w-1/2' : 'mt-1 w-full'}>
|
||||
<div className="mb-1 pl-1 text-base">Series</div>
|
||||
<Select
|
||||
value={selectedSeries}
|
||||
onValueChange={setSelectedSeries}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Select a series" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{seriesOptions.map(series => (
|
||||
<SelectItem
|
||||
key={series.value}
|
||||
value={series.value}
|
||||
>
|
||||
{series.label}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
<div className="flex items-end gap-4">
|
||||
{!showDataSourceSelect && (
|
||||
<div className="w-1/3">
|
||||
<div className="mb-1 pl-1 text-base">Series</div>
|
||||
<Select
|
||||
value={selectedDataSource}
|
||||
onValueChange={setSelectedDataSource}
|
||||
value={selectedSeries}
|
||||
onValueChange={setSelectedSeries}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Select a data source" />
|
||||
<SelectValue placeholder="Select a series" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{dataSources.map(source => (
|
||||
{seriesOptions.map(series => (
|
||||
<SelectItem
|
||||
key={source.value}
|
||||
value={source.value}
|
||||
key={series.value}
|
||||
value={series.value}
|
||||
>
|
||||
{source.label}
|
||||
{series.label}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
)}
|
||||
<div className={showDataSourceSelect ? 'mt-1 w-1/2' : 'mt-1 w-full'}>
|
||||
<div className="mb-1 pl-1 text-base">Series</div>
|
||||
<Select
|
||||
value={selectedSeries}
|
||||
onValueChange={setSelectedSeries}
|
||||
>
|
||||
<SelectTrigger>
|
||||
<SelectValue placeholder="Select a series" />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{seriesOptions.map(series => (
|
||||
<SelectItem
|
||||
key={series.value}
|
||||
value={series.value}
|
||||
>
|
||||
{series.label}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
</div>
|
||||
</div>
|
||||
<div className={showDataSourceSelect ? 'flex gap-4' : ''}>
|
||||
<div className="mt-4 w-full">
|
||||
<InputDialog
|
||||
value={reportName}
|
||||
onChange={setReportName}
|
||||
submitOnEnter
|
||||
>
|
||||
<InputDialog.Field>
|
||||
<InputDialog.Input
|
||||
placeholder="Report name"
|
||||
disabled={!!selectedSeries}
|
||||
/>
|
||||
</InputDialog.Field>
|
||||
</InputDialog>
|
||||
</div>
|
||||
<InputDialog
|
||||
value={reportName}
|
||||
onChange={setReportName}
|
||||
submitOnEnter
|
||||
className="flex-1"
|
||||
>
|
||||
<InputDialog.Field className="mb-0">
|
||||
<InputDialog.Input
|
||||
placeholder="Report name"
|
||||
disabled={!!selectedSeries}
|
||||
/>
|
||||
</InputDialog.Field>
|
||||
</InputDialog>
|
||||
</div>
|
||||
|
||||
<div className="flex justify-end gap-2">
|
||||
|
||||
@@ -32,8 +32,8 @@
|
||||
"start": "yarn run dev"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@cornerstonejs/core": "^3.9.4",
|
||||
"@cornerstonejs/tools": "^3.9.4",
|
||||
"@cornerstonejs/core": "^3.9.5",
|
||||
"@cornerstonejs/tools": "^3.9.5",
|
||||
"@ohif/core": "3.10.0-beta.158",
|
||||
"@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.158",
|
||||
"@ohif/extension-default": "3.10.0-beta.158",
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ import { FooterAction } from '@ohif/ui-next';
|
||||
|
||||
export function UntrackSeriesModal({ hide, onConfirm, message }) {
|
||||
return (
|
||||
<div className="text-foreground">
|
||||
<div className="text-foreground text-[13px]">
|
||||
<div>
|
||||
<p>{message}</p>
|
||||
<p className="mt-2">
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
|
||||
"@cornerstonejs/codec-openjpeg": "^1.2.4",
|
||||
"@cornerstonejs/codec-openjph": "^2.4.5",
|
||||
"@cornerstonejs/dicom-image-loader": "^3.9.4",
|
||||
"@cornerstonejs/dicom-image-loader": "^3.9.5",
|
||||
"@emotion/serialize": "^1.1.3",
|
||||
"@ohif/core": "3.10.0-beta.158",
|
||||
"@ohif/extension-cornerstone": "3.10.0-beta.158",
|
||||
|
||||
@@ -276,7 +276,6 @@ window.config = {
|
||||
console.warn('test, navigate to https://ohif.org/');
|
||||
},
|
||||
// whiteLabeling: {
|
||||
// /* Optional: Should return a React component to be rendered in the "Logo" section of the application's Top Navigation bar */
|
||||
// createLogoComponentFn: function (React) {
|
||||
// return React.createElement(
|
||||
// 'a',
|
||||
@@ -284,14 +283,13 @@ window.config = {
|
||||
// target: '_self',
|
||||
// rel: 'noopener noreferrer',
|
||||
// className: 'text-purple-600 line-through',
|
||||
// href: '/',
|
||||
// href: '_X___IDC__LOGO__LINK___Y_',
|
||||
// },
|
||||
// React.createElement('img',
|
||||
// {
|
||||
// src: './assets/customLogo.svg',
|
||||
// className: 'w-8 h-8',
|
||||
// }
|
||||
// ))
|
||||
// React.createElement('img', {
|
||||
// src: './Logo.svg',
|
||||
// className: 'w-14 h-14',
|
||||
// })
|
||||
// );
|
||||
// },
|
||||
// },
|
||||
};
|
||||
@@ -37,8 +37,8 @@
|
||||
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
|
||||
"@cornerstonejs/codec-openjpeg": "^1.2.4",
|
||||
"@cornerstonejs/codec-openjph": "^2.4.5",
|
||||
"@cornerstonejs/core": "^3.9.4",
|
||||
"@cornerstonejs/dicom-image-loader": "^3.9.4",
|
||||
"@cornerstonejs/core": "^3.9.5",
|
||||
"@cornerstonejs/dicom-image-loader": "^3.9.5",
|
||||
"@ohif/ui": "3.10.0-beta.158",
|
||||
"cornerstone-math": "0.1.9",
|
||||
"dicom-parser": "^1.8.21"
|
||||
|
||||
@@ -518,7 +518,7 @@ const WADO_IMAGE_LOADER = {
|
||||
// Fallback for DX images.
|
||||
// TODO: We should use the rest of the results of this function
|
||||
// to update the UI somehow
|
||||
const { PixelSpacing, type } = getPixelSpacingInformation(instance);
|
||||
const { PixelSpacing, type } = getPixelSpacingInformation(instance) || {};
|
||||
|
||||
let rowPixelSpacing;
|
||||
let columnPixelSpacing;
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -0,0 +1,55 @@
|
||||
---
|
||||
title: routerBaseName
|
||||
---
|
||||
|
||||
|
||||
## Migration Guide: Router Configuration (`routerBasename` and `PUBLIC_URL`)
|
||||
|
||||
|
||||
**Key Changes:**
|
||||
|
||||
* **`routerBasename` Default Value:** The recommended default value for `routerBasename` in the configuration file (`window.config`) has changed from `'/'` to `null`.
|
||||
* **New Default Behavior:** If `routerBasename` is set to `null` (or is not defined) in the configuration, the application's base path will now automatically default to the value determined by `PUBLIC_URL`.
|
||||
* **Clarified Roles:**
|
||||
* `routerBasename`: Explicitly defines the base path for the application's routes (e.g., `/viewer`). If `null`, it defaults to `PUBLIC_URL`.
|
||||
* `PUBLIC_URL`: Primarily defines the URL prefix from which static assets (like JavaScript files, CSS, images) are loaded. It defaults to `/` if not set.
|
||||
|
||||
|
||||
:::info
|
||||
see the comprehensive guide [here](/deployment/custom-url-access)
|
||||
:::
|
||||
|
||||
**Migration Steps:**
|
||||
|
||||
1. **Review `routerBasename` Configuration:**
|
||||
Locate the `routerBasename` setting within your application configuration file (typically found in `platform/app/public/config/*.js`).
|
||||
|
||||
2. **Update `routerBasename` Based on Hosting Scenario:**
|
||||
|
||||
* **Scenario A: Hosting at the Root (`/`)**
|
||||
If your application is served from the root domain (e.g., `https://example.com/`), it's recommended to update `routerBasename` to `null`. This aligns the routing base with the default asset loading path (`PUBLIC_URL` which defaults to `/`).
|
||||
|
||||
*Example Diff:*
|
||||
```diff
|
||||
window.config = {
|
||||
- routerBasename: '/',
|
||||
+ routerBasename: null,
|
||||
// ... other config options
|
||||
showStudyList: true,
|
||||
dataSources: [ /* ... */ ],
|
||||
```
|
||||
*Explanation:* Setting `routerBasename: null` leverages the new default behavior. The router will use `/` as its base because `PUBLIC_URL` defaults to `/`.
|
||||
|
||||
* **Scenario B: Hosting at a Subpath (e.g., `/viewer/`)**
|
||||
If your application is served from a subpath (e.g., `https://example.com/viewer/`), you should ensure `routerBasename` is explicitly set to that path.
|
||||
|
||||
*Example (No Change Needed if Already Correct):*
|
||||
```diff
|
||||
window.config = {
|
||||
// No change needed if already set correctly for subpath hosting
|
||||
routerBasename: '/viewer',
|
||||
// ... other config options
|
||||
showStudyList: true,
|
||||
dataSources: [ /* ... */ ],
|
||||
```
|
||||
*Explanation:* Explicitly setting `routerBasename` ensures the application's internal routing works correctly under the `/viewer/` path.
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -34,7 +34,6 @@ export default function ComponentsList() {
|
||||
<h1 className="text-foreground mb-3 text-5xl">Components</h1>
|
||||
</div>
|
||||
<TabsShowcase />
|
||||
|
||||
<ButtonShowcase />
|
||||
<CheckboxShowcase />
|
||||
<DataRowShowcase />
|
||||
|
||||
@@ -176,12 +176,12 @@ const [dimensionGroupNumber, setDimensionGroupNumber] = useState(1);
|
||||
mode="stepper"
|
||||
min={-10}
|
||||
max={10}
|
||||
step={0.1}
|
||||
step={1}
|
||||
defaultValue={0}
|
||||
>
|
||||
<div className="flex items-center space-x-2">
|
||||
<Numeric.NumberStepper
|
||||
className="w-[65px]"
|
||||
className="w-[53px]"
|
||||
direction="vertical"
|
||||
/>
|
||||
<Numeric.Label>Zoom</Numeric.Label>
|
||||
|
||||
@@ -381,8 +381,8 @@ function NumberStepper({ className, children, direction, inputWidth }: NumberSte
|
||||
onChange={handleInputChange}
|
||||
onBlur={handleBlur}
|
||||
className={cn(
|
||||
"h-6 appearance-none border-none p-0 text-center shadow-none focus:border-none focus:outline-none",
|
||||
inputWidth ? inputWidth : "w-12 max-w-12"
|
||||
'h-6 appearance-none border-none p-0 text-center shadow-none focus:border-none focus:outline-none',
|
||||
inputWidth
|
||||
)}
|
||||
/>
|
||||
{children}
|
||||
@@ -410,16 +410,16 @@ function NumberStepper({ className, children, direction, inputWidth }: NumberSte
|
||||
onBlur={handleBlur}
|
||||
className={cn(
|
||||
'h-6 appearance-none border-none p-0 text-center shadow-none focus:border-none focus:outline-none',
|
||||
inputWidth ? inputWidth : "w-12 max-w-12"
|
||||
inputWidth ? inputWidth : 'max-w-12 min-w-0'
|
||||
)}
|
||||
/>
|
||||
<div className="ml-1 flex flex-col">
|
||||
<div className="ml-1 flex flex-shrink-0 flex-col">
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
onClick={() => setSingleValue(singleValue + step)}
|
||||
disabled={singleValue >= max}
|
||||
className="text-primary h-3 w-5 pr-px"
|
||||
className="text-primary h-3 w-5"
|
||||
>
|
||||
<ChevronUp className="h-3 w-3" />
|
||||
</Button>
|
||||
@@ -428,7 +428,7 @@ function NumberStepper({ className, children, direction, inputWidth }: NumberSte
|
||||
size="icon"
|
||||
onClick={() => setSingleValue(singleValue - step)}
|
||||
disabled={singleValue <= min}
|
||||
className="text-primary h-3 w-5 pr-px"
|
||||
className="text-primary h-3 w-5"
|
||||
>
|
||||
<ChevronDown className="h-3 w-3" />
|
||||
</Button>
|
||||
@@ -483,4 +483,4 @@ export const Numeric = {
|
||||
NumberStepper,
|
||||
};
|
||||
|
||||
export default Numeric;
|
||||
export default Numeric;
|
||||
@@ -91,7 +91,7 @@ const ViewportDialog: React.FC<ViewportDialogProps> = ({
|
||||
return (
|
||||
<div
|
||||
ref={notificationRef}
|
||||
className="border-input bg-muted mx-2 mt-2 flex flex-col rounded-md border p-2 outline-none"
|
||||
className="border-input bg-muted mx-1.5 mt-2 flex flex-col rounded-md border p-2 outline-none"
|
||||
data-cy={id}
|
||||
onKeyDown={onKeyPress}
|
||||
tabIndex={0}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import * as utils from './utils';
|
||||
import { cn } from './utils';
|
||||
export * from './components';
|
||||
export * from './contextProviders';
|
||||
export * as Types from './types';
|
||||
|
||||
export { utils };
|
||||
export { utils, cn };
|
||||
@@ -1,4 +1,5 @@
|
||||
import { getToggledClassName } from './getToggledClassName';
|
||||
import roundNumber from './roundNumber';
|
||||
import { cn } from '../lib/utils';
|
||||
|
||||
export { getToggledClassName, roundNumber };
|
||||
export { getToggledClassName, roundNumber, cn };
|
||||
@@ -1393,10 +1393,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
|
||||
integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
|
||||
|
||||
"@cornerstonejs/adapters@^3.9.4":
|
||||
version "3.9.4"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.9.4.tgz#ce12eeb800618f8a6817c80129ec140f83439990"
|
||||
integrity sha512-0kuGAH5dCmxHFr+PjvH/AZJqFdVXXziEZm6Etl4yOOgY9JT81N0PZj5gaFAyvTmxyHb/EWZMhWLyG0D5XGLCmQ==
|
||||
"@cornerstonejs/adapters@^3.9.5":
|
||||
version "3.9.5"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.9.5.tgz#9957a97d22d79747a6deb4f2b4c2a86b8fe48331"
|
||||
integrity sha512-I8nPFmwNBqBwrH26w06gZfsJaHyZPN4nZC8GO7IerkVSkyYXgFEFC5iRdVuU+Kr94nWm8zPKyLqHx7hAeNudgw==
|
||||
dependencies:
|
||||
"@babel/runtime-corejs2" "^7.17.8"
|
||||
buffer "^6.0.3"
|
||||
@@ -1404,10 +1404,10 @@
|
||||
gl-matrix "^3.4.3"
|
||||
ndarray "^1.0.19"
|
||||
|
||||
"@cornerstonejs/ai@^3.9.4":
|
||||
version "3.9.4"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-3.9.4.tgz#88417a7104ab45cfd2598087fc12fcf812b3cb41"
|
||||
integrity sha512-W1mYcnddsp87Wka8UTzxNwPUF/f7wietvIxyRXQd7nPwR/nDVVbB2dLiUwirihISjumb6PnHjLyHM92on55HNA==
|
||||
"@cornerstonejs/ai@^3.9.5":
|
||||
version "3.9.5"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-3.9.5.tgz#40ac983158c325f204f605385d9bd4ad125d5844"
|
||||
integrity sha512-AgVPLVoYJeefPcp6tf5UNfS8qoEJc8VxrqZab6f+LybhSa2se52h+57rCB5Ihd7SziNvWyIdux7v1Iy3GiZm+g==
|
||||
dependencies:
|
||||
"@babel/runtime-corejs2" "^7.17.8"
|
||||
buffer "^6.0.3"
|
||||
@@ -1443,20 +1443,20 @@
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz#8690b61a86fa53ef38a70eee9d665a79229517c0"
|
||||
integrity sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==
|
||||
|
||||
"@cornerstonejs/core@^3.9.4":
|
||||
version "3.9.4"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.9.4.tgz#63fe5e2749b2c01b3d427e40345eeb2d8feeedc6"
|
||||
integrity sha512-kHjy2Q0iCNwQQe5FAXMHUWHqkFq3mGQ5Zzl3U9B8rQ3ne+at0wHfAFeJlRbT0uMkU1gw9AOMtb/L4QBWKy4o0A==
|
||||
"@cornerstonejs/core@^3.9.5":
|
||||
version "3.9.5"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.9.5.tgz#b42d8b93d2862b9673963f238e56109f299ca11e"
|
||||
integrity sha512-EwXeTNSlL7UnXmj8o1DigNZOsVbhtNDKT2Bbi66jhnzZQm+rTPyYeTva+FnnqvpxBb/6QqwDEJ8gwlXwV0Rk5w==
|
||||
dependencies:
|
||||
"@kitware/vtk.js" "32.12.1"
|
||||
comlink "^4.4.1"
|
||||
gl-matrix "^3.4.3"
|
||||
loglevel "^1.9.2"
|
||||
|
||||
"@cornerstonejs/dicom-image-loader@^3.9.4":
|
||||
version "3.9.4"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.9.4.tgz#5e202e57ddbcf46b946857a2cfa2a703dc9fad9d"
|
||||
integrity sha512-QGWejZ+QFCquoPqmIaHWDusaX89EN24Cih/0WcVcKPs/5VGmo6wbFZzZoKLD4tDGV8HLF8FaGdJy3vTrde9lWg==
|
||||
"@cornerstonejs/dicom-image-loader@^3.9.5":
|
||||
version "3.9.5"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.9.5.tgz#4ba9c97e2875fe67c524788833bdf2e38154869d"
|
||||
integrity sha512-g0GZNkZ6PBRCl/dvi6NoQlmpmZhuLLeI4cdiFwV0Ug81HPkHdn8FQaqgy1XPOMknLSL6sJGZsJN2l2nW5COQSA==
|
||||
dependencies:
|
||||
"@cornerstonejs/codec-charls" "^1.2.3"
|
||||
"@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2"
|
||||
@@ -1468,25 +1468,25 @@
|
||||
pako "^2.0.4"
|
||||
uuid "^9.0.0"
|
||||
|
||||
"@cornerstonejs/labelmap-interpolation@^3.9.4":
|
||||
version "3.9.4"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.9.4.tgz#8f34f7ac32254cb54ddfacdd2687fa51f8e0c1b0"
|
||||
integrity sha512-D8T6itPVHF5641axmzkR3b2RjDVXWYNxm3MuQ10LMDZsqwUNL/eeqy2+0TRpPsDL/LSuX2/i+n+udohf0jdaqg==
|
||||
"@cornerstonejs/labelmap-interpolation@^3.9.5":
|
||||
version "3.9.5"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.9.5.tgz#159b4a9be8002d996ff8f1a5d39b0a9b90a3bbcc"
|
||||
integrity sha512-U7XnaqrrEHGvH3kKdTwGiwLYaydxp5GVo0aqVvZaRDXMXfP3tbOpCfMQcqD+bv4Sh+Rr0719O5aDJ0+ENpA/MA==
|
||||
dependencies:
|
||||
"@itk-wasm/morphological-contour-interpolation" "1.1.0"
|
||||
itk-wasm "1.0.0-b.165"
|
||||
|
||||
"@cornerstonejs/polymorphic-segmentation@^3.9.4":
|
||||
version "3.9.4"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.9.4.tgz#a18bf58e60de1ab6d9f915a2fadc9fde5c022fd9"
|
||||
integrity sha512-fXio1P4Ic7ZQmWuTELFPAA8DfG/u6l/0f21UlC6QQNrRX7aYWtOVA6fqQdcdE3bJD+iTeJNikGdEl0j05KqNqQ==
|
||||
"@cornerstonejs/polymorphic-segmentation@^3.9.5":
|
||||
version "3.9.5"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.9.5.tgz#d54145b90929f9e9e90f272acf5f416c28ca33e3"
|
||||
integrity sha512-6ucJkb0X5CBBx00g3CzJGuLd6x4T99bPyKXa+y9Bek3jC+RyKI4vySS5RRKtQ4N59yuealZkBvV7dT0FseE8og==
|
||||
dependencies:
|
||||
"@icr/polyseg-wasm" "0.4.0"
|
||||
|
||||
"@cornerstonejs/tools@^3.9.4":
|
||||
version "3.9.4"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.9.4.tgz#4a63fc350d8f45db5a2b4fcaea8b76e0893d5083"
|
||||
integrity sha512-ys2blsOp6rWHjGQvMn6x0fh1Qr9Gnr5lRTjhzucAClRgt1WWFW9v9AqwPMXDS/f94m3WFT995LuBOWlxcGUZtQ==
|
||||
"@cornerstonejs/tools@^3.9.5":
|
||||
version "3.9.5"
|
||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.9.5.tgz#65fa00b2e20f0442cde7f0383e96253393229bcf"
|
||||
integrity sha512-vdPsm4szolXmyBdDNTB1gyRCP5EEicsf+TOsTU5P6QYWR7cB+nyio7GeGK5zFQrUi0hb2a2qkVjjLQLQH9inAw==
|
||||
dependencies:
|
||||
"@types/offscreencanvas" "2019.7.3"
|
||||
comlink "^4.4.1"
|
||||
|
||||
Reference in new issue
Block a user