From b54f2075ec96dc862ea4ca6f35eee5e1ef39f0ab Mon Sep 17 00:00:00 2001 From: Dan Rukas Date: Wed, 8 Jan 2025 13:10:57 -0500 Subject: [PATCH] ui(component): Tooltip component ui-next (#4635) Co-authored-by: sedghi --- .../src/viewports/_getStatusComponent.tsx | 22 ++++--- .../src/viewports/_getStatusComponent.tsx | 22 ++++--- .../OHIFCornerstoneSRMeasurementViewport.tsx | 22 ++++--- .../src/panels/DynamicVolumeControls.tsx | 43 ++++++------- .../viewports/TrackedCornerstoneViewport.tsx | 56 +++++++---------- platform/app/src/routes/WorkList/WorkList.tsx | 46 ++++++++++---- .../3p9-to-3p10/General/index.md | 15 +++++ .../{Icons.md => UI/Migration-Icons.md} | 3 +- .../3p9-to-3p10/UI/Migration-Tooltip.md | 62 +++++++++++++++++++ .../docs/migration-guide/3p9-to-3p10/index.md | 3 + .../src/components/Clipboard/Clipboard.tsx | 55 ++++++++++++++++ .../src/components/Clipboard/index.tsx | 3 + .../ui-next/src/components/Icons/Icons.tsx | 4 ++ .../src/components/Icons/Sources/Copy.tsx | 44 +++++++++++++ .../Icons/Sources/FeedbackComplete.tsx | 35 +++++++++++ .../src/components/Tooltip/Tooltip.tsx | 2 +- platform/ui-next/src/components/index.ts | 3 +- platform/ui-next/src/index.ts | 2 + 18 files changed, 342 insertions(+), 100 deletions(-) create mode 100644 platform/docs/docs/migration-guide/3p9-to-3p10/General/index.md rename platform/docs/docs/migration-guide/3p9-to-3p10/{Icons.md => UI/Migration-Icons.md} (99%) create mode 100644 platform/docs/docs/migration-guide/3p9-to-3p10/UI/Migration-Tooltip.md create mode 100644 platform/ui-next/src/components/Clipboard/Clipboard.tsx create mode 100644 platform/ui-next/src/components/Clipboard/index.tsx create mode 100644 platform/ui-next/src/components/Icons/Sources/Copy.tsx create mode 100644 platform/ui-next/src/components/Icons/Sources/FeedbackComplete.tsx diff --git a/extensions/cornerstone-dicom-rt/src/viewports/_getStatusComponent.tsx b/extensions/cornerstone-dicom-rt/src/viewports/_getStatusComponent.tsx index d270f278d..78b36ca63 100644 --- a/extensions/cornerstone-dicom-rt/src/viewports/_getStatusComponent.tsx +++ b/extensions/cornerstone-dicom-rt/src/viewports/_getStatusComponent.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; -import { Icon, Tooltip, ViewportActionButton } from '@ohif/ui'; -import { Icons } from '@ohif/ui-next'; +import { ViewportActionButton } from '@ohif/ui'; +import { Icons, Tooltip, TooltipTrigger, TooltipContent } from '@ohif/ui-next'; export default function _getStatusComponent({ isHydrated, onStatusClick }) { let ToolTipMessage = null; @@ -10,7 +10,6 @@ export default function _getStatusComponent({ isHydrated, onStatusClick }) { switch (isHydrated) { case true: StatusIcon = () => ; - ToolTipMessage = () =>
This Segmentation is loaded in the segmentation panel
; break; case false: @@ -20,7 +19,6 @@ export default function _getStatusComponent({ isHydrated, onStatusClick }) { name="status-untracked" /> ); - ToolTipMessage = () =>
Click LOAD to load RTSTRUCT.
; } @@ -44,14 +42,18 @@ export default function _getStatusComponent({ isHydrated, onStatusClick }) { return ( <> {ToolTipMessage && ( - } - position="bottom-left" - > - + + + + + + + + + )} {!ToolTipMessage && } ); -} +} \ No newline at end of file diff --git a/extensions/cornerstone-dicom-seg/src/viewports/_getStatusComponent.tsx b/extensions/cornerstone-dicom-seg/src/viewports/_getStatusComponent.tsx index 234337ede..836dca5bb 100644 --- a/extensions/cornerstone-dicom-seg/src/viewports/_getStatusComponent.tsx +++ b/extensions/cornerstone-dicom-seg/src/viewports/_getStatusComponent.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { useTranslation } from 'react-i18next'; -import { Tooltip, ViewportActionButton } from '@ohif/ui'; -import { Icons } from '@ohif/ui-next'; +import { ViewportActionButton } from '@ohif/ui'; +import { Icons, Tooltip, TooltipTrigger, TooltipContent } from '@ohif/ui-next'; export default function _getStatusComponent({ isHydrated, onStatusClick }) { let ToolTipMessage = null; @@ -10,7 +10,6 @@ export default function _getStatusComponent({ isHydrated, onStatusClick }) { switch (isHydrated) { case true: StatusIcon = () => ; - ToolTipMessage = () =>
This Segmentation is loaded in the segmentation panel
; break; case false: @@ -20,7 +19,6 @@ export default function _getStatusComponent({ isHydrated, onStatusClick }) { name="status-untracked" /> ); - ToolTipMessage = () =>
Click LOAD to load segmentation.
; } @@ -44,14 +42,18 @@ export default function _getStatusComponent({ isHydrated, onStatusClick }) { return ( <> {ToolTipMessage && ( - } - position="bottom-left" - > - + + + + + + + + + )} {!ToolTipMessage && } ); -} +} \ No newline at end of file diff --git a/extensions/cornerstone-dicom-sr/src/components/OHIFCornerstoneSRMeasurementViewport.tsx b/extensions/cornerstone-dicom-sr/src/components/OHIFCornerstoneSRMeasurementViewport.tsx index 48f8e8652..f028b225e 100644 --- a/extensions/cornerstone-dicom-sr/src/components/OHIFCornerstoneSRMeasurementViewport.tsx +++ b/extensions/cornerstone-dicom-sr/src/components/OHIFCornerstoneSRMeasurementViewport.tsx @@ -5,10 +5,11 @@ import { ExtensionManager, useToolbar } from '@ohif/core'; import { setTrackingUniqueIdentifiersForElement } from '../tools/modules/dicomSRModule'; -import { Icon, Tooltip, useViewportGrid, ViewportActionArrows } from '@ohif/ui'; import createReferencedImageDisplaySet from '../utils/createReferencedImageDisplaySet'; import { usePositionPresentationStore } from '@ohif/extension-cornerstone'; -import { Icons } from '@ohif/ui-next'; +import { useViewportGrid, ViewportActionArrows } from '@ohif/ui'; +import { Icons, Tooltip, TooltipTrigger, TooltipContent } from '@ohif/ui-next'; + const MEASUREMENT_TRACKING_EXTENSION_ID = '@ohif/extension-measurement-tracking'; const SR_TOOLGROUP_BASE_NAME = 'SRToolGroup'; @@ -467,11 +468,18 @@ function _getStatusComponent({ return ( <> {ToolTipMessage && ( - } - position="bottom-left" - > - + + + + + + + + + )} {!ToolTipMessage && } diff --git a/extensions/cornerstone-dynamic-volume/src/panels/DynamicVolumeControls.tsx b/extensions/cornerstone-dynamic-volume/src/panels/DynamicVolumeControls.tsx index b632dfce7..f5dfa07cc 100644 --- a/extensions/cornerstone-dynamic-volume/src/panels/DynamicVolumeControls.tsx +++ b/extensions/cornerstone-dynamic-volume/src/panels/DynamicVolumeControls.tsx @@ -1,8 +1,6 @@ import React, { useState } from 'react'; -import { Button, PanelSection, ButtonGroup, IconButton, InputNumber, Tooltip } from '@ohif/ui'; - -import { DoubleSlider, Icons } from '@ohif/ui-next'; - +import { Button, PanelSection, ButtonGroup, IconButton, InputNumber } from '@ohif/ui'; +import { DoubleSlider, Icons, Tooltip, TooltipTrigger, TooltipContent } from '@ohif/ui-next'; import { Enums } from '@cornerstonejs/core'; const controlClassNames = { @@ -13,16 +11,18 @@ const controlClassNames = { const Header = ({ title, tooltip }) => (
- {tooltip}
} - position="bottom-left" - tight={true} - tooltipBoxClassName="max-w-xs p-2" - > - + + + + + + + +
{tooltip}
+
{title} @@ -45,9 +45,7 @@ const DynamicVolumeControls = ({ onDynamicClick, }) => { const [computedView, setComputedView] = useState(false); - const [computeViewMode, setComputeViewMode] = useState(Enums.DynamicOperatorType.SUM); - const [sliderRangeValues, setSliderRangeValues] = useState([0, framesLength - 1]); const handleSliderChange = newValues => { @@ -113,15 +111,14 @@ const DynamicVolumeControls = ({
Operation Buttons (SUM, AVERAGE, SUBTRACT): Select the mathematical operation to be applied to the data set. -

Range Slider: Choose the numeric range within which the operation will be +
Range Slider: Choose the numeric range within which the operation will be performed. -

Generate Button: Execute the chosen operation on the specified range of - data.{' '} +
Generate Button: Execute the chosen operation on the specified range of data.
} /> + ); +}; + +export { Clipboard }; diff --git a/platform/ui-next/src/components/Clipboard/index.tsx b/platform/ui-next/src/components/Clipboard/index.tsx new file mode 100644 index 000000000..0c7b4238b --- /dev/null +++ b/platform/ui-next/src/components/Clipboard/index.tsx @@ -0,0 +1,3 @@ +import { Clipboard } from './Clipboard'; + +export { Clipboard }; diff --git a/platform/ui-next/src/components/Icons/Icons.tsx b/platform/ui-next/src/components/Icons/Icons.tsx index 349a4686e..bf9e6d910 100644 --- a/platform/ui-next/src/components/Icons/Icons.tsx +++ b/platform/ui-next/src/components/Icons/Icons.tsx @@ -7,6 +7,7 @@ import ChevronOpen from './Sources/ChevronOpen'; import Code from './Sources/Code'; import ColorChange from './Sources/ColorChange'; import Controls from './Sources/Controls'; +import Copy from './Sources/Copy'; import Delete from './Sources/Delete'; import DicomTagBrowser from './Sources/DicomTagBrowser'; import DisplayFillAndOutline from './Sources/DisplayFillAndOutline'; @@ -16,6 +17,7 @@ import Download from './Sources/Download'; import Export from './Sources/Export'; import EyeHidden from './Sources/EyeHidden'; import EyeVisible from './Sources/EyeVisible'; +import FeedbackComplete from './Sources/FeedbackComplete'; import GearSettings from './Sources/GearSettings'; import Hide from './Sources/Hide'; import IconMPR from './Sources/IconMPR'; @@ -418,6 +420,7 @@ export const Icons = { Code, ColorChange, Controls, + Copy, Delete, DicomTagBrowser, DisplayFillAndOutline, @@ -430,6 +433,7 @@ export const Icons = { Export, EyeHidden, EyeVisible, + FeedbackComplete, GearSettings, Hide, IconMPR, diff --git a/platform/ui-next/src/components/Icons/Sources/Copy.tsx b/platform/ui-next/src/components/Icons/Sources/Copy.tsx new file mode 100644 index 000000000..35198c4ea --- /dev/null +++ b/platform/ui-next/src/components/Icons/Sources/Copy.tsx @@ -0,0 +1,44 @@ +import React from 'react'; +import type { IconProps } from '../types'; + +export const Copy = (props: IconProps) => ( + + + + + + + +); + +export default Copy; diff --git a/platform/ui-next/src/components/Icons/Sources/FeedbackComplete.tsx b/platform/ui-next/src/components/Icons/Sources/FeedbackComplete.tsx new file mode 100644 index 000000000..a3df59a85 --- /dev/null +++ b/platform/ui-next/src/components/Icons/Sources/FeedbackComplete.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import type { IconProps } from '../types'; + +export const FeedbackComplete = (props: IconProps) => ( + + + + + + +); + +export default FeedbackComplete; diff --git a/platform/ui-next/src/components/Tooltip/Tooltip.tsx b/platform/ui-next/src/components/Tooltip/Tooltip.tsx index 93f940555..ad8151fb6 100644 --- a/platform/ui-next/src/components/Tooltip/Tooltip.tsx +++ b/platform/ui-next/src/components/Tooltip/Tooltip.tsx @@ -17,7 +17,7 @@ const TooltipContent = React.forwardRef< ref={ref} sideOffset={sideOffset} className={cn( - 'bg-primary-dark border-secondary-light text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 overflow-hidden rounded border px-3 py-1.5 text-sm', + 'bg-primary-dark border-secondary-light text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 overflow-hidden rounded border px-2 py-1.5 text-sm', className )} {...props} diff --git a/platform/ui-next/src/components/index.ts b/platform/ui-next/src/components/index.ts index c4f8307c0..42ef70024 100644 --- a/platform/ui-next/src/components/index.ts +++ b/platform/ui-next/src/components/index.ts @@ -24,7 +24,7 @@ import { DialogDescription, } from './Dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './Select'; - +import { Clipboard } from './Clipboard'; import { Combobox } from './Combobox'; import { Popover, PopoverContent, PopoverTrigger, PopoverAnchor } from './Popover'; import { Calendar } from './Calendar'; @@ -183,4 +183,5 @@ export { CardTitle, CardDescription, CardContent, + Clipboard, }; diff --git a/platform/ui-next/src/index.ts b/platform/ui-next/src/index.ts index e20cb012a..597f3540e 100644 --- a/platform/ui-next/src/index.ts +++ b/platform/ui-next/src/index.ts @@ -12,6 +12,7 @@ import { Tabs, TabsContent, TabsList, + Clipboard, TabsTrigger, Toggle, toggleVariants, @@ -99,6 +100,7 @@ export { ThemeWrapper, Calendar, DatePickerWithRange, + Clipboard, // contextProviders NotificationProvider, useNotification,