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": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.20.13",
|
"@babel/runtime": "^7.20.13",
|
||||||
"@cornerstonejs/adapters": "^3.9.4",
|
"@cornerstonejs/adapters": "^3.9.5",
|
||||||
"@cornerstonejs/core": "^3.9.4",
|
"@cornerstonejs/core": "^3.9.5",
|
||||||
"@kitware/vtk.js": "32.12.0",
|
"@kitware/vtk.js": "32.12.0",
|
||||||
"react-color": "^2.19.3"
|
"react-color": "^2.19.3"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,8 +46,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.20.13",
|
"@babel/runtime": "^7.20.13",
|
||||||
"@cornerstonejs/adapters": "^3.9.4",
|
"@cornerstonejs/adapters": "^3.9.5",
|
||||||
"@cornerstonejs/core": "^3.9.4",
|
"@cornerstonejs/core": "^3.9.5",
|
||||||
"@kitware/vtk.js": "32.12.0",
|
"@kitware/vtk.js": "32.12.0",
|
||||||
"react-color": "^2.19.3"
|
"react-color": "^2.19.3"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,9 +46,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.20.13",
|
"@babel/runtime": "^7.20.13",
|
||||||
"@cornerstonejs/adapters": "^3.9.4",
|
"@cornerstonejs/adapters": "^3.9.5",
|
||||||
"@cornerstonejs/core": "^3.9.4",
|
"@cornerstonejs/core": "^3.9.5",
|
||||||
"@cornerstonejs/tools": "^3.9.4",
|
"@cornerstonejs/tools": "^3.9.5",
|
||||||
"classnames": "^2.3.2"
|
"classnames": "^2.3.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,8 +42,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.20.13",
|
"@babel/runtime": "^7.20.13",
|
||||||
"@cornerstonejs/core": "^3.9.4",
|
"@cornerstonejs/core": "^3.9.5",
|
||||||
"@cornerstonejs/tools": "^3.9.4",
|
"@cornerstonejs/tools": "^3.9.5",
|
||||||
"classnames": "^2.3.2"
|
"classnames": "^2.3.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { useEffect, useState, useRef } from 'react';
|
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 { useViewportGrid } from '@ohif/ui-next';
|
||||||
import { utilities as csUtils, volumeLoader, eventTarget, Enums, cache } from '@cornerstonejs/core';
|
import { utilities as csUtils, volumeLoader, eventTarget, Enums, cache } from '@cornerstonejs/core';
|
||||||
import { utilities as cstUtils } from '@cornerstonejs/tools';
|
import { utilities as cstUtils } from '@cornerstonejs/tools';
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
|
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
|
||||||
"@cornerstonejs/codec-openjpeg": "^1.2.4",
|
"@cornerstonejs/codec-openjpeg": "^1.2.4",
|
||||||
"@cornerstonejs/codec-openjph": "^2.4.5",
|
"@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/core": "3.10.0-beta.158",
|
||||||
"@ohif/ui": "3.10.0-beta.158",
|
"@ohif/ui": "3.10.0-beta.158",
|
||||||
"dcmjs": "*",
|
"dcmjs": "*",
|
||||||
@@ -51,12 +51,12 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "^7.20.13",
|
"@babel/runtime": "^7.20.13",
|
||||||
"@cornerstonejs/adapters": "^3.9.4",
|
"@cornerstonejs/adapters": "^3.9.5",
|
||||||
"@cornerstonejs/ai": "^3.9.4",
|
"@cornerstonejs/ai": "^3.9.5",
|
||||||
"@cornerstonejs/core": "^3.9.4",
|
"@cornerstonejs/core": "^3.9.5",
|
||||||
"@cornerstonejs/labelmap-interpolation": "^3.9.4",
|
"@cornerstonejs/labelmap-interpolation": "^3.9.5",
|
||||||
"@cornerstonejs/polymorphic-segmentation": "^3.9.4",
|
"@cornerstonejs/polymorphic-segmentation": "^3.9.5",
|
||||||
"@cornerstonejs/tools": "^3.9.4",
|
"@cornerstonejs/tools": "^3.9.5",
|
||||||
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
|
"@itk-wasm/morphological-contour-interpolation": "1.1.0",
|
||||||
"@kitware/vtk.js": "32.12.0",
|
"@kitware/vtk.js": "32.12.0",
|
||||||
"html2canvas": "^1.4.1",
|
"html2canvas": "^1.4.1",
|
||||||
|
|||||||
@@ -229,11 +229,6 @@ const ViewportWindowLevel = ({
|
|||||||
No window level data available
|
No window level data available
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{isLoading && (
|
|
||||||
<div className="text-muted-foreground py-2 text-center text-sm">
|
|
||||||
Loading window level data...
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</PanelSection.Content>
|
</PanelSection.Content>
|
||||||
</PanelSection>
|
</PanelSection>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ export default function getSegmentationPanelCustomization({ commandsManager, ser
|
|||||||
checked={useCenterAsSegmentIndex}
|
checked={useCenterAsSegmentIndex}
|
||||||
onCheckedChange={handleUseCenterAsSegmentIndexChange}
|
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>
|
||||||
|
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
import React from 'react';
|
|
||||||
import { DicomMetadataStore } from '@ohif/core';
|
import { DicomMetadataStore } from '@ohif/core';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ const DicomTagBrowser = ({
|
|||||||
</Select>
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
{shouldShowInstanceList && (
|
{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">
|
<span className="text-muted-foreground flex h-6 items-center text-xs">
|
||||||
Instance Number ({instanceNumber} of {activeDisplaySet?.images?.length})
|
Instance Number ({instanceNumber} of {activeDisplaySet?.images?.length})
|
||||||
</span>
|
</span>
|
||||||
@@ -169,7 +169,7 @@ const DicomTagBrowser = ({
|
|||||||
/>
|
/>
|
||||||
</div>
|
</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">
|
<span className="text-muted-foreground flex h-6 items-center text-xs">
|
||||||
Search metadata
|
Search metadata
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ const useResizablePanels = (
|
|||||||
leftPanelClosed,
|
leftPanelClosed,
|
||||||
setLeftPanelClosed,
|
setLeftPanelClosed,
|
||||||
rightPanelClosed,
|
rightPanelClosed,
|
||||||
setRightPanelClosed
|
setRightPanelClosed,
|
||||||
|
hasLeftPanels,
|
||||||
|
hasRightPanels
|
||||||
) => {
|
) => {
|
||||||
const [leftPanelExpandedWidth, setLeftPanelExpandedWidth] = useState(
|
const [leftPanelExpandedWidth, setLeftPanelExpandedWidth] = useState(
|
||||||
panelGroupDefinition.left.initialExpandedWidth
|
panelGroupDefinition.left.initialExpandedWidth
|
||||||
@@ -156,6 +158,8 @@ const useResizablePanels = (
|
|||||||
rightPanelExpandedWidth,
|
rightPanelExpandedWidth,
|
||||||
leftResizablePanelMinimumSize,
|
leftResizablePanelMinimumSize,
|
||||||
rightResizablePanelMinimumSize,
|
rightResizablePanelMinimumSize,
|
||||||
|
hasLeftPanels,
|
||||||
|
hasRightPanels,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -52,7 +52,9 @@ function ViewerLayout({
|
|||||||
leftPanelClosed,
|
leftPanelClosed,
|
||||||
setLeftPanelClosed,
|
setLeftPanelClosed,
|
||||||
rightPanelClosed,
|
rightPanelClosed,
|
||||||
setRightPanelClosed
|
setRightPanelClosed,
|
||||||
|
hasLeftPanels,
|
||||||
|
hasRightPanels
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleMouseEnter = () => {
|
const handleMouseEnter = () => {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import React, { useEffect, useMemo, useState } from 'react';
|
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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@ohif/ui-next';
|
||||||
import { useSystem } from '@ohif/core';
|
import { useSystem } from '@ohif/core';
|
||||||
|
|
||||||
@@ -71,69 +71,93 @@ function ReportDialog({ dataSources, hide, onSave, onCancel }: ReportDialogProps
|
|||||||
const showDataSourceSelect = dataSources?.length > 1;
|
const showDataSourceSelect = dataSources?.length > 1;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="text-foreground mt-2 flex min-w-[400px] max-w-md flex-col gap-4">
|
<div className="text-foreground flex min-w-[400px] max-w-md flex-col">
|
||||||
<div className="flex flex-col gap-3">
|
<div className="flex flex-col gap-4">
|
||||||
<div className="flex gap-4">
|
<div className="flex gap-4">
|
||||||
{showDataSourceSelect && (
|
{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
|
<Select
|
||||||
value={selectedDataSource}
|
value={selectedSeries}
|
||||||
onValueChange={setSelectedDataSource}
|
onValueChange={setSelectedSeries}
|
||||||
>
|
>
|
||||||
<SelectTrigger>
|
<SelectTrigger>
|
||||||
<SelectValue placeholder="Select a data source" />
|
<SelectValue placeholder="Select a series" />
|
||||||
</SelectTrigger>
|
</SelectTrigger>
|
||||||
<SelectContent>
|
<SelectContent>
|
||||||
{dataSources.map(source => (
|
{seriesOptions.map(series => (
|
||||||
<SelectItem
|
<SelectItem
|
||||||
key={source.value}
|
key={series.value}
|
||||||
value={source.value}
|
value={series.value}
|
||||||
>
|
>
|
||||||
{source.label}
|
{series.label}
|
||||||
</SelectItem>
|
</SelectItem>
|
||||||
))}
|
))}
|
||||||
</SelectContent>
|
</SelectContent>
|
||||||
</Select>
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className={showDataSourceSelect ? 'mt-1 w-1/2' : 'mt-1 w-full'}>
|
<InputDialog
|
||||||
<div className="mb-1 pl-1 text-base">Series</div>
|
value={reportName}
|
||||||
<Select
|
onChange={setReportName}
|
||||||
value={selectedSeries}
|
submitOnEnter
|
||||||
onValueChange={setSelectedSeries}
|
className="flex-1"
|
||||||
>
|
>
|
||||||
<SelectTrigger>
|
<InputDialog.Field className="mb-0">
|
||||||
<SelectValue placeholder="Select a series" />
|
<InputDialog.Input
|
||||||
</SelectTrigger>
|
placeholder="Report name"
|
||||||
<SelectContent>
|
disabled={!!selectedSeries}
|
||||||
{seriesOptions.map(series => (
|
/>
|
||||||
<SelectItem
|
</InputDialog.Field>
|
||||||
key={series.value}
|
</InputDialog>
|
||||||
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>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex justify-end gap-2">
|
<div className="flex justify-end gap-2">
|
||||||
|
|||||||
@@ -32,8 +32,8 @@
|
|||||||
"start": "yarn run dev"
|
"start": "yarn run dev"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@cornerstonejs/core": "^3.9.4",
|
"@cornerstonejs/core": "^3.9.5",
|
||||||
"@cornerstonejs/tools": "^3.9.4",
|
"@cornerstonejs/tools": "^3.9.5",
|
||||||
"@ohif/core": "3.10.0-beta.158",
|
"@ohif/core": "3.10.0-beta.158",
|
||||||
"@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.158",
|
"@ohif/extension-cornerstone-dicom-sr": "3.10.0-beta.158",
|
||||||
"@ohif/extension-default": "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 }) {
|
export function UntrackSeriesModal({ hide, onConfirm, message }) {
|
||||||
return (
|
return (
|
||||||
<div className="text-foreground">
|
<div className="text-foreground text-[13px]">
|
||||||
<div>
|
<div>
|
||||||
<p>{message}</p>
|
<p>{message}</p>
|
||||||
<p className="mt-2">
|
<p className="mt-2">
|
||||||
|
|||||||
@@ -53,7 +53,7 @@
|
|||||||
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
|
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
|
||||||
"@cornerstonejs/codec-openjpeg": "^1.2.4",
|
"@cornerstonejs/codec-openjpeg": "^1.2.4",
|
||||||
"@cornerstonejs/codec-openjph": "^2.4.5",
|
"@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",
|
"@emotion/serialize": "^1.1.3",
|
||||||
"@ohif/core": "3.10.0-beta.158",
|
"@ohif/core": "3.10.0-beta.158",
|
||||||
"@ohif/extension-cornerstone": "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/');
|
console.warn('test, navigate to https://ohif.org/');
|
||||||
},
|
},
|
||||||
// whiteLabeling: {
|
// whiteLabeling: {
|
||||||
// /* Optional: Should return a React component to be rendered in the "Logo" section of the application's Top Navigation bar */
|
|
||||||
// createLogoComponentFn: function (React) {
|
// createLogoComponentFn: function (React) {
|
||||||
// return React.createElement(
|
// return React.createElement(
|
||||||
// 'a',
|
// 'a',
|
||||||
@@ -284,14 +283,13 @@ window.config = {
|
|||||||
// target: '_self',
|
// target: '_self',
|
||||||
// rel: 'noopener noreferrer',
|
// rel: 'noopener noreferrer',
|
||||||
// className: 'text-purple-600 line-through',
|
// className: 'text-purple-600 line-through',
|
||||||
// href: '/',
|
// href: '_X___IDC__LOGO__LINK___Y_',
|
||||||
// },
|
// },
|
||||||
// React.createElement('img',
|
// React.createElement('img', {
|
||||||
// {
|
// src: './Logo.svg',
|
||||||
// src: './assets/customLogo.svg',
|
// className: 'w-14 h-14',
|
||||||
// className: 'w-8 h-8',
|
// })
|
||||||
// }
|
// );
|
||||||
// ))
|
|
||||||
// },
|
// },
|
||||||
// },
|
// },
|
||||||
};
|
};
|
||||||
@@ -37,8 +37,8 @@
|
|||||||
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
|
"@cornerstonejs/codec-libjpeg-turbo-8bit": "^1.2.2",
|
||||||
"@cornerstonejs/codec-openjpeg": "^1.2.4",
|
"@cornerstonejs/codec-openjpeg": "^1.2.4",
|
||||||
"@cornerstonejs/codec-openjph": "^2.4.5",
|
"@cornerstonejs/codec-openjph": "^2.4.5",
|
||||||
"@cornerstonejs/core": "^3.9.4",
|
"@cornerstonejs/core": "^3.9.5",
|
||||||
"@cornerstonejs/dicom-image-loader": "^3.9.4",
|
"@cornerstonejs/dicom-image-loader": "^3.9.5",
|
||||||
"@ohif/ui": "3.10.0-beta.158",
|
"@ohif/ui": "3.10.0-beta.158",
|
||||||
"cornerstone-math": "0.1.9",
|
"cornerstone-math": "0.1.9",
|
||||||
"dicom-parser": "^1.8.21"
|
"dicom-parser": "^1.8.21"
|
||||||
|
|||||||
@@ -518,7 +518,7 @@ const WADO_IMAGE_LOADER = {
|
|||||||
// Fallback for DX images.
|
// Fallback for DX images.
|
||||||
// TODO: We should use the rest of the results of this function
|
// TODO: We should use the rest of the results of this function
|
||||||
// to update the UI somehow
|
// to update the UI somehow
|
||||||
const { PixelSpacing, type } = getPixelSpacingInformation(instance);
|
const { PixelSpacing, type } = getPixelSpacingInformation(instance) || {};
|
||||||
|
|
||||||
let rowPixelSpacing;
|
let rowPixelSpacing;
|
||||||
let columnPixelSpacing;
|
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>
|
<h1 className="text-foreground mb-3 text-5xl">Components</h1>
|
||||||
</div>
|
</div>
|
||||||
<TabsShowcase />
|
<TabsShowcase />
|
||||||
|
|
||||||
<ButtonShowcase />
|
<ButtonShowcase />
|
||||||
<CheckboxShowcase />
|
<CheckboxShowcase />
|
||||||
<DataRowShowcase />
|
<DataRowShowcase />
|
||||||
|
|||||||
@@ -176,12 +176,12 @@ const [dimensionGroupNumber, setDimensionGroupNumber] = useState(1);
|
|||||||
mode="stepper"
|
mode="stepper"
|
||||||
min={-10}
|
min={-10}
|
||||||
max={10}
|
max={10}
|
||||||
step={0.1}
|
step={1}
|
||||||
defaultValue={0}
|
defaultValue={0}
|
||||||
>
|
>
|
||||||
<div className="flex items-center space-x-2">
|
<div className="flex items-center space-x-2">
|
||||||
<Numeric.NumberStepper
|
<Numeric.NumberStepper
|
||||||
className="w-[65px]"
|
className="w-[53px]"
|
||||||
direction="vertical"
|
direction="vertical"
|
||||||
/>
|
/>
|
||||||
<Numeric.Label>Zoom</Numeric.Label>
|
<Numeric.Label>Zoom</Numeric.Label>
|
||||||
|
|||||||
@@ -381,8 +381,8 @@ function NumberStepper({ className, children, direction, inputWidth }: NumberSte
|
|||||||
onChange={handleInputChange}
|
onChange={handleInputChange}
|
||||||
onBlur={handleBlur}
|
onBlur={handleBlur}
|
||||||
className={cn(
|
className={cn(
|
||||||
"h-6 appearance-none border-none p-0 text-center shadow-none focus:border-none focus:outline-none",
|
'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
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
{children}
|
{children}
|
||||||
@@ -410,16 +410,16 @@ function NumberStepper({ className, children, direction, inputWidth }: NumberSte
|
|||||||
onBlur={handleBlur}
|
onBlur={handleBlur}
|
||||||
className={cn(
|
className={cn(
|
||||||
'h-6 appearance-none border-none p-0 text-center shadow-none focus:border-none focus:outline-none',
|
'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
|
<Button
|
||||||
variant="ghost"
|
variant="ghost"
|
||||||
size="icon"
|
size="icon"
|
||||||
onClick={() => setSingleValue(singleValue + step)}
|
onClick={() => setSingleValue(singleValue + step)}
|
||||||
disabled={singleValue >= max}
|
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" />
|
<ChevronUp className="h-3 w-3" />
|
||||||
</Button>
|
</Button>
|
||||||
@@ -428,7 +428,7 @@ function NumberStepper({ className, children, direction, inputWidth }: NumberSte
|
|||||||
size="icon"
|
size="icon"
|
||||||
onClick={() => setSingleValue(singleValue - step)}
|
onClick={() => setSingleValue(singleValue - step)}
|
||||||
disabled={singleValue <= min}
|
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" />
|
<ChevronDown className="h-3 w-3" />
|
||||||
</Button>
|
</Button>
|
||||||
@@ -483,4 +483,4 @@ export const Numeric = {
|
|||||||
NumberStepper,
|
NumberStepper,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Numeric;
|
export default Numeric;
|
||||||
@@ -91,7 +91,7 @@ const ViewportDialog: React.FC<ViewportDialogProps> = ({
|
|||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
ref={notificationRef}
|
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}
|
data-cy={id}
|
||||||
onKeyDown={onKeyPress}
|
onKeyDown={onKeyPress}
|
||||||
tabIndex={0}
|
tabIndex={0}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import * as utils from './utils';
|
import * as utils from './utils';
|
||||||
|
import { cn } from './utils';
|
||||||
export * from './components';
|
export * from './components';
|
||||||
export * from './contextProviders';
|
export * from './contextProviders';
|
||||||
export * as Types from './types';
|
export * as Types from './types';
|
||||||
|
export { utils, cn };
|
||||||
export { utils };
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
import { getToggledClassName } from './getToggledClassName';
|
import { getToggledClassName } from './getToggledClassName';
|
||||||
import roundNumber from './roundNumber';
|
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"
|
resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
|
||||||
integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
|
integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
|
||||||
|
|
||||||
"@cornerstonejs/adapters@^3.9.4":
|
"@cornerstonejs/adapters@^3.9.5":
|
||||||
version "3.9.4"
|
version "3.9.5"
|
||||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.9.4.tgz#ce12eeb800618f8a6817c80129ec140f83439990"
|
resolved "https://registry.yarnpkg.com/@cornerstonejs/adapters/-/adapters-3.9.5.tgz#9957a97d22d79747a6deb4f2b4c2a86b8fe48331"
|
||||||
integrity sha512-0kuGAH5dCmxHFr+PjvH/AZJqFdVXXziEZm6Etl4yOOgY9JT81N0PZj5gaFAyvTmxyHb/EWZMhWLyG0D5XGLCmQ==
|
integrity sha512-I8nPFmwNBqBwrH26w06gZfsJaHyZPN4nZC8GO7IerkVSkyYXgFEFC5iRdVuU+Kr94nWm8zPKyLqHx7hAeNudgw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs2" "^7.17.8"
|
"@babel/runtime-corejs2" "^7.17.8"
|
||||||
buffer "^6.0.3"
|
buffer "^6.0.3"
|
||||||
@@ -1404,10 +1404,10 @@
|
|||||||
gl-matrix "^3.4.3"
|
gl-matrix "^3.4.3"
|
||||||
ndarray "^1.0.19"
|
ndarray "^1.0.19"
|
||||||
|
|
||||||
"@cornerstonejs/ai@^3.9.4":
|
"@cornerstonejs/ai@^3.9.5":
|
||||||
version "3.9.4"
|
version "3.9.5"
|
||||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-3.9.4.tgz#88417a7104ab45cfd2598087fc12fcf812b3cb41"
|
resolved "https://registry.yarnpkg.com/@cornerstonejs/ai/-/ai-3.9.5.tgz#40ac983158c325f204f605385d9bd4ad125d5844"
|
||||||
integrity sha512-W1mYcnddsp87Wka8UTzxNwPUF/f7wietvIxyRXQd7nPwR/nDVVbB2dLiUwirihISjumb6PnHjLyHM92on55HNA==
|
integrity sha512-AgVPLVoYJeefPcp6tf5UNfS8qoEJc8VxrqZab6f+LybhSa2se52h+57rCB5Ihd7SziNvWyIdux7v1Iy3GiZm+g==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@babel/runtime-corejs2" "^7.17.8"
|
"@babel/runtime-corejs2" "^7.17.8"
|
||||||
buffer "^6.0.3"
|
buffer "^6.0.3"
|
||||||
@@ -1443,20 +1443,20 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz#8690b61a86fa53ef38a70eee9d665a79229517c0"
|
resolved "https://registry.yarnpkg.com/@cornerstonejs/codec-openjph/-/codec-openjph-2.4.5.tgz#8690b61a86fa53ef38a70eee9d665a79229517c0"
|
||||||
integrity sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==
|
integrity sha512-MZCUy8VG0VG5Nl1l58+g+kH3LujAzLYTfJqkwpWI2gjSrGXnP6lgwyy4GmPRZWVoS40/B1LDNALK905cNWm+sg==
|
||||||
|
|
||||||
"@cornerstonejs/core@^3.9.4":
|
"@cornerstonejs/core@^3.9.5":
|
||||||
version "3.9.4"
|
version "3.9.5"
|
||||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.9.4.tgz#63fe5e2749b2c01b3d427e40345eeb2d8feeedc6"
|
resolved "https://registry.yarnpkg.com/@cornerstonejs/core/-/core-3.9.5.tgz#b42d8b93d2862b9673963f238e56109f299ca11e"
|
||||||
integrity sha512-kHjy2Q0iCNwQQe5FAXMHUWHqkFq3mGQ5Zzl3U9B8rQ3ne+at0wHfAFeJlRbT0uMkU1gw9AOMtb/L4QBWKy4o0A==
|
integrity sha512-EwXeTNSlL7UnXmj8o1DigNZOsVbhtNDKT2Bbi66jhnzZQm+rTPyYeTva+FnnqvpxBb/6QqwDEJ8gwlXwV0Rk5w==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@kitware/vtk.js" "32.12.1"
|
"@kitware/vtk.js" "32.12.1"
|
||||||
comlink "^4.4.1"
|
comlink "^4.4.1"
|
||||||
gl-matrix "^3.4.3"
|
gl-matrix "^3.4.3"
|
||||||
loglevel "^1.9.2"
|
loglevel "^1.9.2"
|
||||||
|
|
||||||
"@cornerstonejs/dicom-image-loader@^3.9.4":
|
"@cornerstonejs/dicom-image-loader@^3.9.5":
|
||||||
version "3.9.4"
|
version "3.9.5"
|
||||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.9.4.tgz#5e202e57ddbcf46b946857a2cfa2a703dc9fad9d"
|
resolved "https://registry.yarnpkg.com/@cornerstonejs/dicom-image-loader/-/dicom-image-loader-3.9.5.tgz#4ba9c97e2875fe67c524788833bdf2e38154869d"
|
||||||
integrity sha512-QGWejZ+QFCquoPqmIaHWDusaX89EN24Cih/0WcVcKPs/5VGmo6wbFZzZoKLD4tDGV8HLF8FaGdJy3vTrde9lWg==
|
integrity sha512-g0GZNkZ6PBRCl/dvi6NoQlmpmZhuLLeI4cdiFwV0Ug81HPkHdn8FQaqgy1XPOMknLSL6sJGZsJN2l2nW5COQSA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@cornerstonejs/codec-charls" "^1.2.3"
|
"@cornerstonejs/codec-charls" "^1.2.3"
|
||||||
"@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2"
|
"@cornerstonejs/codec-libjpeg-turbo-8bit" "^1.2.2"
|
||||||
@@ -1468,25 +1468,25 @@
|
|||||||
pako "^2.0.4"
|
pako "^2.0.4"
|
||||||
uuid "^9.0.0"
|
uuid "^9.0.0"
|
||||||
|
|
||||||
"@cornerstonejs/labelmap-interpolation@^3.9.4":
|
"@cornerstonejs/labelmap-interpolation@^3.9.5":
|
||||||
version "3.9.4"
|
version "3.9.5"
|
||||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.9.4.tgz#8f34f7ac32254cb54ddfacdd2687fa51f8e0c1b0"
|
resolved "https://registry.yarnpkg.com/@cornerstonejs/labelmap-interpolation/-/labelmap-interpolation-3.9.5.tgz#159b4a9be8002d996ff8f1a5d39b0a9b90a3bbcc"
|
||||||
integrity sha512-D8T6itPVHF5641axmzkR3b2RjDVXWYNxm3MuQ10LMDZsqwUNL/eeqy2+0TRpPsDL/LSuX2/i+n+udohf0jdaqg==
|
integrity sha512-U7XnaqrrEHGvH3kKdTwGiwLYaydxp5GVo0aqVvZaRDXMXfP3tbOpCfMQcqD+bv4Sh+Rr0719O5aDJ0+ENpA/MA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@itk-wasm/morphological-contour-interpolation" "1.1.0"
|
"@itk-wasm/morphological-contour-interpolation" "1.1.0"
|
||||||
itk-wasm "1.0.0-b.165"
|
itk-wasm "1.0.0-b.165"
|
||||||
|
|
||||||
"@cornerstonejs/polymorphic-segmentation@^3.9.4":
|
"@cornerstonejs/polymorphic-segmentation@^3.9.5":
|
||||||
version "3.9.4"
|
version "3.9.5"
|
||||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.9.4.tgz#a18bf58e60de1ab6d9f915a2fadc9fde5c022fd9"
|
resolved "https://registry.yarnpkg.com/@cornerstonejs/polymorphic-segmentation/-/polymorphic-segmentation-3.9.5.tgz#d54145b90929f9e9e90f272acf5f416c28ca33e3"
|
||||||
integrity sha512-fXio1P4Ic7ZQmWuTELFPAA8DfG/u6l/0f21UlC6QQNrRX7aYWtOVA6fqQdcdE3bJD+iTeJNikGdEl0j05KqNqQ==
|
integrity sha512-6ucJkb0X5CBBx00g3CzJGuLd6x4T99bPyKXa+y9Bek3jC+RyKI4vySS5RRKtQ4N59yuealZkBvV7dT0FseE8og==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@icr/polyseg-wasm" "0.4.0"
|
"@icr/polyseg-wasm" "0.4.0"
|
||||||
|
|
||||||
"@cornerstonejs/tools@^3.9.4":
|
"@cornerstonejs/tools@^3.9.5":
|
||||||
version "3.9.4"
|
version "3.9.5"
|
||||||
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.9.4.tgz#4a63fc350d8f45db5a2b4fcaea8b76e0893d5083"
|
resolved "https://registry.yarnpkg.com/@cornerstonejs/tools/-/tools-3.9.5.tgz#65fa00b2e20f0442cde7f0383e96253393229bcf"
|
||||||
integrity sha512-ys2blsOp6rWHjGQvMn6x0fh1Qr9Gnr5lRTjhzucAClRgt1WWFW9v9AqwPMXDS/f94m3WFT995LuBOWlxcGUZtQ==
|
integrity sha512-vdPsm4szolXmyBdDNTB1gyRCP5EEicsf+TOsTU5P6QYWR7cB+nyio7GeGK5zFQrUi0hb2a2qkVjjLQLQH9inAw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/offscreencanvas" "2019.7.3"
|
"@types/offscreencanvas" "2019.7.3"
|
||||||
comlink "^4.4.1"
|
comlink "^4.4.1"
|
||||||
|
|||||||
Reference in new issue
Block a user