From 230ae9758bfe01c685121145b065acaec937e8f9 Mon Sep 17 00:00:00 2001 From: Dan Rukas Date: Wed, 8 Jan 2025 14:23:34 -0500 Subject: [PATCH] ui(components): Viewport components added to ui-next (#4649) Co-authored-by: sedghi --- .circleci/config.yml | 4 +- bun.lockb | Bin 1342602 -> 1352946 bytes .../viewports/OHIFCornerstonePMAPViewport.tsx | 3 +- .../viewports/OHIFCornerstoneRTViewport.tsx | 3 +- .../viewports/OHIFCornerstoneSEGViewport.tsx | 3 +- .../OHIFCornerstoneSRMeasurementViewport.tsx | 3 +- .../src/panels/PanelGenerateImage.tsx | 3 +- .../ActiveViewportWindowLevel.tsx | 2 +- .../WindowLevelActionMenu.tsx | 3 +- .../src/panels/PanelMeasurement.tsx | 2 +- .../Panels/StudyBrowser/PanelStudyBrowser.tsx | 3 +- .../dicom-microscopy/src/getPanelModule.tsx | 2 +- extensions/dicom-microscopy/src/index.tsx | 3 +- .../TrackedMeasurementsContext.tsx | 2 +- .../panels/PanelMeasurementTableTracking.tsx | 2 +- .../PanelStudyBrowserTracking.tsx | 3 +- .../viewports/TrackedCornerstoneViewport.tsx | 4 +- platform/app/src/App.tsx | 2 +- platform/app/src/components/ViewportGrid.tsx | 3 +- platform/ui-next/package.json | 1 + .../components/ContextMenu/ContextMenu.tsx | 187 +++++++ .../src/components/ContextMenu/index.ts | 35 ++ .../src/components/Viewport/PatientInfo.tsx | 138 +++++ .../Viewport/ViewportActionArrows.tsx | 31 ++ .../components/Viewport/ViewportActionBar.tsx | 128 +++++ .../Viewport/ViewportActionButton.tsx | 31 ++ .../Viewport/ViewportActionCorners.tsx | 67 +++ .../src/components/Viewport/ViewportGrid.tsx | 30 + .../components/Viewport/ViewportOverlay.css | 22 + .../components/Viewport/ViewportOverlay.tsx | 69 +++ .../src/components/Viewport/ViewportPane.tsx | 97 ++++ .../ui-next/src/components/Viewport/index.ts | 8 + platform/ui-next/src/components/index.ts | 20 + .../contextProviders/ViewportGridProvider.tsx | 522 ++++++++++++++++++ .../ui-next/src/contextProviders/index.ts | 2 + platform/ui-next/src/index.ts | 22 + yarn.lock | 178 ++++++ 37 files changed, 1617 insertions(+), 21 deletions(-) create mode 100644 platform/ui-next/src/components/ContextMenu/ContextMenu.tsx create mode 100644 platform/ui-next/src/components/ContextMenu/index.ts create mode 100644 platform/ui-next/src/components/Viewport/PatientInfo.tsx create mode 100644 platform/ui-next/src/components/Viewport/ViewportActionArrows.tsx create mode 100644 platform/ui-next/src/components/Viewport/ViewportActionBar.tsx create mode 100644 platform/ui-next/src/components/Viewport/ViewportActionButton.tsx create mode 100644 platform/ui-next/src/components/Viewport/ViewportActionCorners.tsx create mode 100644 platform/ui-next/src/components/Viewport/ViewportGrid.tsx create mode 100644 platform/ui-next/src/components/Viewport/ViewportOverlay.css create mode 100644 platform/ui-next/src/components/Viewport/ViewportOverlay.tsx create mode 100644 platform/ui-next/src/components/Viewport/ViewportPane.tsx create mode 100644 platform/ui-next/src/components/Viewport/index.ts create mode 100644 platform/ui-next/src/contextProviders/ViewportGridProvider.tsx diff --git a/.circleci/config.yml b/.circleci/config.yml index ef8cf92ec..de35a810f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -462,7 +462,7 @@ workflows: - BUILD - DOCKER_BETA_PUBLISH: requires: - - NPM_PUBLISH + - DOCKER_BETA_PUBLISH_ARM - DOCKER_BETA_PUBLISH_ARM: requires: - NPM_PUBLISH @@ -487,7 +487,7 @@ workflows: - HOLD_FOR_APPROVAL - DOCKER_RELEASE_PUBLISH: requires: - - NPM_PUBLISH + - DOCKER_RELEASE_PUBLISH_ARM - DOCKER_RELEASE_PUBLISH_ARM: requires: - NPM_PUBLISH diff --git a/bun.lockb b/bun.lockb index 5d927c60ccbc5d517a0908d39d28c3cd39ccdcca..b92e3aedba8c8ab9398cc63bc56a4607d6f599a0 100755 GIT binary patch delta 136763 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 delta 132647 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

    {*k~QBrDeBV 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 z { diff --git a/extensions/cornerstone/src/components/WindowLevelActionMenu/WindowLevelActionMenu.tsx b/extensions/cornerstone/src/components/WindowLevelActionMenu/WindowLevelActionMenu.tsx index c4196f9d7..77dd1dd89 100644 --- a/extensions/cornerstone/src/components/WindowLevelActionMenu/WindowLevelActionMenu.tsx +++ b/extensions/cornerstone/src/components/WindowLevelActionMenu/WindowLevelActionMenu.tsx @@ -1,7 +1,8 @@ import React, { ReactElement, useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import classNames from 'classnames'; -import { AllInOneMenu, useViewportGrid } from '@ohif/ui'; +import { AllInOneMenu } from '@ohif/ui'; +import { useViewportGrid } from '@ohif/ui-next'; import { Colormap } from './Colormap'; import { Colorbar } from './Colorbar'; import { setViewportColorbar } from './Colorbar'; diff --git a/extensions/cornerstone/src/panels/PanelMeasurement.tsx b/extensions/cornerstone/src/panels/PanelMeasurement.tsx index 3652b31bb..ed86b2ef7 100644 --- a/extensions/cornerstone/src/panels/PanelMeasurement.tsx +++ b/extensions/cornerstone/src/panels/PanelMeasurement.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useRef } from 'react'; -import { useViewportGrid } from '@ohif/ui'; +import { useViewportGrid } from '@ohif/ui-next'; import { MeasurementTable } from '@ohif/ui-next'; import debounce from 'lodash.debounce'; import { useMeasurements } from '../hooks/useMeasurements'; diff --git a/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx b/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx index 4dd7225b2..81440b4f8 100644 --- a/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx +++ b/extensions/default/src/Panels/StudyBrowser/PanelStudyBrowser.tsx @@ -1,5 +1,6 @@ import React, { useState, useEffect } from 'react'; -import { useImageViewer, useViewportGrid } from '@ohif/ui'; +import { useImageViewer } from '@ohif/ui'; +import { useViewportGrid } from '@ohif/ui-next'; import { StudyBrowser } from '@ohif/ui-next'; import { utils } from '@ohif/core'; import { useNavigate } from 'react-router-dom'; diff --git a/extensions/dicom-microscopy/src/getPanelModule.tsx b/extensions/dicom-microscopy/src/getPanelModule.tsx index 8cbceb52b..6500e8df9 100644 --- a/extensions/dicom-microscopy/src/getPanelModule.tsx +++ b/extensions/dicom-microscopy/src/getPanelModule.tsx @@ -1,6 +1,6 @@ import React from 'react'; import type { Types } from '@ohif/core'; -import { useViewportGrid } from '@ohif/ui'; +import { useViewportGrid } from '@ohif/ui-next'; import MicroscopyPanel from './components/MicroscopyPanel/MicroscopyPanel'; // TODO: diff --git a/extensions/dicom-microscopy/src/index.tsx b/extensions/dicom-microscopy/src/index.tsx index 3491b9a5c..4efd61610 100644 --- a/extensions/dicom-microscopy/src/index.tsx +++ b/extensions/dicom-microscopy/src/index.tsx @@ -4,7 +4,7 @@ import getPanelModule from './getPanelModule'; import getCommandsModule from './getCommandsModule'; import { Types } from '@ohif/core'; -import { useViewportGrid } from '@ohif/ui'; +import { useViewportGrid } from '@ohif/ui-next'; import getDicomMicroscopySRSopClassHandler from './DicomMicroscopySRSopClassHandler'; import MicroscopyService from './services/MicroscopyService'; import { useResizeDetector } from 'react-resize-detector'; @@ -43,7 +43,6 @@ const extension: Types.Extensions.Extension = { * that is provided by the Cornerstone extension in OHIF. */ getViewportModule({ servicesManager, extensionManager, commandsManager }) { - /** * * @param props {*} diff --git a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/TrackedMeasurementsContext.tsx b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/TrackedMeasurementsContext.tsx index cd5b6f22b..45d248ec4 100644 --- a/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/TrackedMeasurementsContext.tsx +++ b/extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/TrackedMeasurementsContext.tsx @@ -2,7 +2,7 @@ import React, { useContext, useEffect, useMemo } from 'react'; import PropTypes from 'prop-types'; import { Machine } from 'xstate'; import { useMachine } from '@xstate/react'; -import { useViewportGrid } from '@ohif/ui'; +import { useViewportGrid } from '@ohif/ui-next'; import { promptLabelAnnotation, promptSaveReport } from '@ohif/extension-default'; import { machineConfiguration, defaultOptions, RESPONSE } from './measurementTrackingMachine'; import promptBeginTracking from './promptBeginTracking'; diff --git a/extensions/measurement-tracking/src/panels/PanelMeasurementTableTracking.tsx b/extensions/measurement-tracking/src/panels/PanelMeasurementTableTracking.tsx index 619c5d653..147e9c651 100644 --- a/extensions/measurement-tracking/src/panels/PanelMeasurementTableTracking.tsx +++ b/extensions/measurement-tracking/src/panels/PanelMeasurementTableTracking.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react'; import { PanelMeasurement } from '@ohif/extension-cornerstone'; -import { useViewportGrid } from '@ohif/ui'; +import { useViewportGrid } from '@ohif/ui-next'; import { StudySummary } from '@ohif/ui-next'; import { Button, Icons } from '@ohif/ui-next'; import { DicomMetadataStore, utils } from '@ohif/core'; diff --git a/extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/PanelStudyBrowserTracking.tsx b/extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/PanelStudyBrowserTracking.tsx index 9ed5e1e91..699f013b4 100644 --- a/extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/PanelStudyBrowserTracking.tsx +++ b/extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/PanelStudyBrowserTracking.tsx @@ -3,7 +3,8 @@ import { useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import PropTypes from 'prop-types'; import { utils } from '@ohif/core'; -import { useImageViewer, useViewportGrid, Dialog, ButtonEnums } from '@ohif/ui'; +import { useImageViewer, Dialog, ButtonEnums } from '@ohif/ui'; +import { useViewportGrid } from '@ohif/ui-next'; import { StudyBrowser } from '@ohif/ui-next'; import { useTrackedMeasurements } from '../../getContextModule'; diff --git a/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx b/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx index 1d08250fe..72c489242 100644 --- a/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx +++ b/extensions/measurement-tracking/src/viewports/TrackedCornerstoneViewport.tsx @@ -1,8 +1,8 @@ import React, { useState, useEffect, useCallback } from 'react'; import PropTypes from 'prop-types'; -import { ViewportActionArrows, useViewportGrid } from '@ohif/ui'; -import { Icons, Tooltip, TooltipTrigger, TooltipContent } from '@ohif/ui-next'; +import { ViewportActionArrows } from '@ohif/ui'; +import { useViewportGrid, Icons, Tooltip, TooltipTrigger, TooltipContent } from '@ohif/ui-next'; import { annotation } from '@cornerstonejs/tools'; import { useTrackedMeasurements } from './../getContextModule'; diff --git a/platform/app/src/App.tsx b/platform/app/src/App.tsx index 253080bd7..75290c53c 100644 --- a/platform/app/src/App.tsx +++ b/platform/app/src/App.tsx @@ -19,7 +19,6 @@ import { ModalProvider, ThemeWrapper, ViewportDialogProvider, - ViewportGridProvider, CineProvider, UserAuthenticationProvider, ToolboxProvider, @@ -27,6 +26,7 @@ import { import { ThemeWrapper as ThemeWrapperNext, NotificationProvider, + ViewportGridProvider, TooltipProvider, } from '@ohif/ui-next'; // Viewer Project diff --git a/platform/app/src/components/ViewportGrid.tsx b/platform/app/src/components/ViewportGrid.tsx index 0c0f37947..66d7d2e60 100644 --- a/platform/app/src/components/ViewportGrid.tsx +++ b/platform/app/src/components/ViewportGrid.tsx @@ -1,7 +1,8 @@ import React, { useEffect, useCallback, useRef } from 'react'; import { useResizeDetector } from 'react-resize-detector'; import { Types, MeasurementService } from '@ohif/core'; -import { ViewportGrid, ViewportPane, useViewportGrid } from '@ohif/ui'; +import { ViewportGrid, ViewportPane } from '@ohif/ui'; +import { useViewportGrid } from '@ohif/ui-next'; import EmptyViewport from './EmptyViewport'; import classNames from 'classnames'; import { useAppConfig } from '@state'; diff --git a/platform/ui-next/package.json b/platform/ui-next/package.json index d030bb5b0..f43bd2ce5 100644 --- a/platform/ui-next/package.json +++ b/platform/ui-next/package.json @@ -29,6 +29,7 @@ "dependencies": { "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-checkbox": "^1.1.1", + "@radix-ui/react-context-menu": "^2.2.4", "@radix-ui/react-dialog": "^1.1.1", "@radix-ui/react-dropdown-menu": "^2.1.1", "@radix-ui/react-icons": "^1.3.0", diff --git a/platform/ui-next/src/components/ContextMenu/ContextMenu.tsx b/platform/ui-next/src/components/ContextMenu/ContextMenu.tsx new file mode 100644 index 000000000..149596b47 --- /dev/null +++ b/platform/ui-next/src/components/ContextMenu/ContextMenu.tsx @@ -0,0 +1,187 @@ +import * as React from 'react'; +import * as ContextMenuPrimitive from '@radix-ui/react-context-menu'; + +import { cn } from '../../lib/utils'; +import { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons'; + +const ContextMenu = ContextMenuPrimitive.Root; + +const ContextMenuTrigger = ContextMenuPrimitive.Trigger; + +const ContextMenuGroup = ContextMenuPrimitive.Group; + +const ContextMenuPortal = ContextMenuPrimitive.Portal; + +const ContextMenuSub = ContextMenuPrimitive.Sub; + +const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup; + +const ContextMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName; + +const ContextMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName; + +const ContextMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)); +ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName; + +const ContextMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName; + +const ContextMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +ContextMenuCheckboxItem.displayName = ContextMenuPrimitive.CheckboxItem.displayName; + +const ContextMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName; + +const ContextMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName; + +const ContextMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName; + +const ContextMenuShortcut = ({ className, ...props }: React.HTMLAttributes) => { + return ( + + ); +}; +ContextMenuShortcut.displayName = 'ContextMenuShortcut'; + +export { + ContextMenu, + ContextMenuTrigger, + ContextMenuContent, + ContextMenuItem, + ContextMenuCheckboxItem, + ContextMenuRadioItem, + ContextMenuLabel, + ContextMenuSeparator, + ContextMenuShortcut, + ContextMenuGroup, + ContextMenuPortal, + ContextMenuSub, + ContextMenuSubContent, + ContextMenuSubTrigger, + ContextMenuRadioGroup, +}; diff --git a/platform/ui-next/src/components/ContextMenu/index.ts b/platform/ui-next/src/components/ContextMenu/index.ts new file mode 100644 index 000000000..36ed0d4cc --- /dev/null +++ b/platform/ui-next/src/components/ContextMenu/index.ts @@ -0,0 +1,35 @@ +import { + ContextMenu, + ContextMenuTrigger, + ContextMenuContent, + ContextMenuItem, + ContextMenuCheckboxItem, + ContextMenuRadioItem, + ContextMenuLabel, + ContextMenuSeparator, + ContextMenuShortcut, + ContextMenuGroup, + ContextMenuPortal, + ContextMenuSub, + ContextMenuSubContent, + ContextMenuSubTrigger, + ContextMenuRadioGroup, +} from './ContextMenu'; + +export { + ContextMenu, + ContextMenuTrigger, + ContextMenuContent, + ContextMenuItem, + ContextMenuCheckboxItem, + ContextMenuRadioItem, + ContextMenuLabel, + ContextMenuSeparator, + ContextMenuShortcut, + ContextMenuGroup, + ContextMenuPortal, + ContextMenuSub, + ContextMenuSubContent, + ContextMenuSubTrigger, + ContextMenuRadioGroup, +}; diff --git a/platform/ui-next/src/components/Viewport/PatientInfo.tsx b/platform/ui-next/src/components/Viewport/PatientInfo.tsx new file mode 100644 index 000000000..5be179878 --- /dev/null +++ b/platform/ui-next/src/components/Viewport/PatientInfo.tsx @@ -0,0 +1,138 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classnames from 'classnames'; +import { useTranslation } from 'react-i18next'; +import { Icons, Tooltip, TooltipTrigger, TooltipContent } from '../../components'; + +const classes = { + infoHeader: 'text-base text-primary-light', + infoText: 'text-base text-white max-w-24 truncate', + firstRow: 'flex flex-col', + row: 'flex flex-col ml-4', +}; + +/** + * A small info icon that, when clicked, can reveal additional patient details in a tooltip overlay. + */ +function PatientInfo({ + patientName, + patientSex, + patientAge, + MRN, + thickness, + thicknessUnits, + spacing, + scanner, + isOpen, + showPatientInfoRef, +}) { + const { t } = useTranslation('PatientInfo'); + + // strip leading '0' from age if present + while (patientAge.charAt(0) === '0') { + patientAge = patientAge.substr(1); + } + + return ( +

    + ); +} + +PatientInfo.propTypes = { + patientName: PropTypes.string, + patientSex: PropTypes.string, + patientAge: PropTypes.string, + MRN: PropTypes.string, + thickness: PropTypes.string, + thicknessUnits: PropTypes.string, + spacing: PropTypes.string, + scanner: PropTypes.string, + isOpen: PropTypes.bool, + showPatientInfoRef: PropTypes.object, +}; + +export { PatientInfo }; diff --git a/platform/ui-next/src/components/Viewport/ViewportActionArrows.tsx b/platform/ui-next/src/components/Viewport/ViewportActionArrows.tsx new file mode 100644 index 000000000..96b41ee44 --- /dev/null +++ b/platform/ui-next/src/components/Viewport/ViewportActionArrows.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import classNames from 'classnames'; +import PropTypes from 'prop-types'; + +import { Icons } from '@ohif/ui-next'; + +const arrowClasses = + 'cursor-pointer flex items-center justify-center shrink-0 text-primary-light active:text-white hover:bg-secondary-light/60 rounded'; + +/** + * A small set of left/right arrow icons for stepping through slices or series. + */ +function ViewportActionArrows({ onArrowsClick, className }) { + return ( +
    +
    + onArrowsClick(-1)} /> +
    +
    + onArrowsClick(1)} /> +
    +
    + ); +} + +ViewportActionArrows.propTypes = { + onArrowsClick: PropTypes.func.isRequired, + className: PropTypes.string, +}; + +export { ViewportActionArrows }; diff --git a/platform/ui-next/src/components/Viewport/ViewportActionBar.tsx b/platform/ui-next/src/components/Viewport/ViewportActionBar.tsx new file mode 100644 index 000000000..0de1d45fe --- /dev/null +++ b/platform/ui-next/src/components/Viewport/ViewportActionBar.tsx @@ -0,0 +1,128 @@ +import React, { + MouseEventHandler, + ReactElement, + useCallback, + useEffect, + useRef, + useState, +} from 'react'; +import PropTypes from 'prop-types'; +import { useTranslation } from 'react-i18next'; + +import { Icons } from '@ohif/ui-next'; +import PatientInfo from './PatientInfo'; + +/** + * This is the modern Viewport Action Bar, showing patient info, series date, + * series description, and optional next/prev arrows if there's enough screen width. + */ +type ViewportActionBarProps = { + studyData: any; + onArrowsClick: (arrow: string) => void; + onDoubleClick: MouseEventHandler; + getStatusComponent: () => ReactElement; +}; + +function ViewportActionBar({ + studyData, + onArrowsClick, + onDoubleClick, + getStatusComponent, +}: ViewportActionBarProps): JSX.Element { + const { label, studyDate, seriesDescription, patientInformation } = studyData; + const { patientName, patientSex, patientAge, MRN, thickness, thicknessUnits, spacing, scanner } = + patientInformation; + + const [showPatientInfo, setShowPatientInfo] = useState(false); + const showPatientInfoElemRef = useRef(null); + const { t } = useTranslation(); + + // handle click outside to close patient info + const handleClickOutside = useCallback( + (evt: MouseEvent) => { + if ( + showPatientInfo && + showPatientInfoElemRef.current && + !showPatientInfoElemRef.current.contains(evt.target as Node) + ) { + setShowPatientInfo(false); + } + }, + [showPatientInfoElemRef, showPatientInfo] + ); + + useEffect(() => { + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [handleClickOutside]); + + return ( +
    + {getStatusComponent()} + {!!label?.length && {label}} +
    + + {studyDate} + +
    + {seriesDescription} + {/* Prev/Next icons */} + onArrowsClick('left')} + /> + onArrowsClick('right')} + /> + {/* Patient Info */} +
    setShowPatientInfo(!showPatientInfo)}> + +
    +
    + ); +} + +ViewportActionBar.propTypes = { + onArrowsClick: PropTypes.func.isRequired, + onDoubleClick: PropTypes.func, + studyData: PropTypes.shape({ + label: PropTypes.string.isRequired, + studyDate: PropTypes.string.isRequired, + seriesDescription: PropTypes.string.isRequired, + patientInformation: PropTypes.shape({ + patientName: PropTypes.string, + patientSex: PropTypes.string, + patientAge: PropTypes.string, + MRN: PropTypes.string, + thickness: PropTypes.string, + thicknessUnits: PropTypes.string, + spacing: PropTypes.string, + scanner: PropTypes.string, + }), + }).isRequired, + getStatusComponent: PropTypes.func.isRequired, +}; + +export { ViewportActionBar }; diff --git a/platform/ui-next/src/components/Viewport/ViewportActionButton.tsx b/platform/ui-next/src/components/Viewport/ViewportActionButton.tsx new file mode 100644 index 000000000..d99421b94 --- /dev/null +++ b/platform/ui-next/src/components/Viewport/ViewportActionButton.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +/** + * A button that can trigger commands when clicked. + */ +function ViewportActionButton({ onInteraction, commands, id, children }) { + return ( +
    { + onInteraction({ + itemId: id, + commands, + }); + }} + > + {children} +
    + ); +} + +ViewportActionButton.propTypes = { + id: PropTypes.string, + onInteraction: PropTypes.func.isRequired, + commands: PropTypes.array, + children: PropTypes.node, +}; + +export { ViewportActionButton }; diff --git a/platform/ui-next/src/components/Viewport/ViewportActionCorners.tsx b/platform/ui-next/src/components/Viewport/ViewportActionCorners.tsx new file mode 100644 index 000000000..f02d4ff70 --- /dev/null +++ b/platform/ui-next/src/components/Viewport/ViewportActionCorners.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import classNames from 'classnames'; +import PropTypes from 'prop-types'; + +/** + * A small container that can render multiple "corner" items (like icons, status) + * in each corner of the viewport: top-left, top-right, bottom-left, bottom-right. + */ +export enum ViewportActionCornersLocations { + topLeft, + topRight, + bottomLeft, + bottomRight, +} + +const commonClasses = 'pointer-events-auto flex items-center gap-1'; +const locationClasses = { + [ViewportActionCornersLocations.topLeft]: classNames( + commonClasses, + 'absolute top-[4px] left-[0px] pl-[4px]' + ), + [ViewportActionCornersLocations.topRight]: classNames( + commonClasses, + 'absolute top-[4px] right-[4px] right-viewport-scrollbar' + ), + [ViewportActionCornersLocations.bottomLeft]: classNames( + commonClasses, + 'absolute bottom-[4px] left-[0px] pl-[4px]' + ), + [ViewportActionCornersLocations.bottomRight]: classNames( + commonClasses, + 'absolute bottom-[4px] right-[0px] right-viewport-scrollbar' + ), +}; + +function ViewportActionCorners({ cornerComponents }) { + if (!cornerComponents) { + return null; + } + + return ( +
    { + event.preventDefault(); + event.stopPropagation(); + }} + > + {Object.entries(cornerComponents).map(([location, locationArray]) => ( +
    + {locationArray.map(componentInfo => ( +
    {componentInfo.component}
    + ))} +
    + ))} +
    + ); +} + +ViewportActionCorners.propTypes = { + cornerComponents: PropTypes.object.isRequired, +}; + +export { ViewportActionCorners }; diff --git a/platform/ui-next/src/components/Viewport/ViewportGrid.tsx b/platform/ui-next/src/components/Viewport/ViewportGrid.tsx new file mode 100644 index 000000000..4c00a102a --- /dev/null +++ b/platform/ui-next/src/components/Viewport/ViewportGrid.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +/** + * A minimal top-level container that organizes multiple + * children in a grid. Typically driven by a layout config. + */ +function ViewportGrid({ numRows, numCols, layoutType, children }) { + return ( +
    + {children} +
    + ); +} + +ViewportGrid.propTypes = { + numRows: PropTypes.number.isRequired, + numCols: PropTypes.number.isRequired, + layoutType: PropTypes.string, + children: PropTypes.arrayOf(PropTypes.node).isRequired, +}; + +export { ViewportGrid }; diff --git a/platform/ui-next/src/components/Viewport/ViewportOverlay.css b/platform/ui-next/src/components/Viewport/ViewportOverlay.css new file mode 100644 index 000000000..e8aebd0be --- /dev/null +++ b/platform/ui-next/src/components/Viewport/ViewportOverlay.css @@ -0,0 +1,22 @@ +.imageViewerViewport.empty ~ .ViewportOverlay { + display: none; +} +.ViewportOverlay { + color: #9ccef9; +} +.ViewportOverlay .overlay-element { + position: absolute; + font-weight: 400; + text-shadow: 1px 1px #000; + pointer-events: none; +} +.overlay-top { + top: 28px; +} +.overlay-bottom { + bottom: 3px; +} + +.overlay-text { + text-shadow: 0.8px 0.8px 0.5px rgba(0, 0, 0, 0.75); +} diff --git a/platform/ui-next/src/components/Viewport/ViewportOverlay.tsx b/platform/ui-next/src/components/Viewport/ViewportOverlay.tsx new file mode 100644 index 000000000..5164142ad --- /dev/null +++ b/platform/ui-next/src/components/Viewport/ViewportOverlay.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import classNames from 'classnames'; +import PropTypes from 'prop-types'; + +import './ViewportOverlay.css'; + +/** + * Renders text overlays (top-left, top-right, bottom-left, bottom-right) + * around the active viewport for metadata or status messages. + * + * The parent is responsible for styling offsets. + */ +const classes = { + topLeft: 'overlay-top left-viewport', + topRight: 'overlay-top right-viewport-scrollbar', + bottomRight: 'overlay-bottom right-viewport-scrollbar', + bottomLeft: 'overlay-bottom left-viewport', +}; + +function ViewportOverlay({ + topLeft, + topRight, + bottomRight, + bottomLeft, + color = 'text-primary-light', +}) { + const overlay = 'absolute pointer-events-none viewport-overlay'; + + return ( +
    +
    + {topLeft} +
    +
    + {topRight} +
    +
    + {bottomRight} +
    +
    + {bottomLeft} +
    +
    + ); +} + +ViewportOverlay.propTypes = { + topLeft: PropTypes.node, + topRight: PropTypes.node, + bottomRight: PropTypes.node, + bottomLeft: PropTypes.node, + color: PropTypes.string, +}; + +export { ViewportOverlay }; diff --git a/platform/ui-next/src/components/Viewport/ViewportPane.tsx b/platform/ui-next/src/components/Viewport/ViewportPane.tsx new file mode 100644 index 000000000..398b84546 --- /dev/null +++ b/platform/ui-next/src/components/Viewport/ViewportPane.tsx @@ -0,0 +1,97 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import classNames from 'classnames'; +import { useDrop } from 'react-dnd'; + +/** + * The "pane" that encloses a Cornerstone or other type of Viewport. This handles + * drag-and-drop for display sets, activation on click, etc. + */ +function ViewportPane({ + children, + className, + customStyle, + isActive, + onDrop, + onDoubleClick, + onInteraction = () => {}, + acceptDropsFor, +}) { + let dropElement = null; + + const [{ isHovered, isHighlighted }, drop] = useDrop({ + accept: acceptDropsFor, + drop: (droppedItem, monitor) => { + if (monitor.canDrop() && monitor.isOver() && onDrop) { + onInteraction(); + onDrop(droppedItem); + } + }, + collect: monitor => ({ + isHighlighted: monitor.canDrop(), + isHovered: monitor.isOver(), + }), + }); + + const focus = () => { + if (dropElement) { + dropElement.focus(); + } + }; + + const onInteractionHandler = event => { + focus(); + onInteraction(event); + }; + + const refHandler = element => { + drop(element); + dropElement = element; + }; + + return ( +
    +
    + {children} +
    +
    + ); +} + +ViewportPane.propTypes = { + children: PropTypes.node.isRequired, + className: PropTypes.string, + isActive: PropTypes.bool.isRequired, + acceptDropsFor: PropTypes.string.isRequired, + onDrop: PropTypes.func.isRequired, + onInteraction: PropTypes.func.isRequired, + onDoubleClick: PropTypes.func, + customStyle: PropTypes.object, +}; + +export { ViewportPane }; diff --git a/platform/ui-next/src/components/Viewport/index.ts b/platform/ui-next/src/components/Viewport/index.ts new file mode 100644 index 000000000..feb9a0a95 --- /dev/null +++ b/platform/ui-next/src/components/Viewport/index.ts @@ -0,0 +1,8 @@ +export { ViewportActionButton } from './ViewportActionButton'; +export { PatientInfo } from './PatientInfo'; +export { ViewportActionBar } from './ViewportActionBar'; +export { ViewportActionArrows } from './ViewportActionArrows'; +export { ViewportPane } from './ViewportPane'; +export { ViewportActionCorners, ViewportActionCornersLocations } from './ViewportActionCorners'; +export { ViewportOverlay } from './ViewportOverlay'; +export { ViewportGrid } from './ViewportGrid'; diff --git a/platform/ui-next/src/components/index.ts b/platform/ui-next/src/components/index.ts index 42ef70024..20e613921 100644 --- a/platform/ui-next/src/components/index.ts +++ b/platform/ui-next/src/components/index.ts @@ -79,6 +79,17 @@ import { StudySummary } from './StudySummary'; import { ErrorBoundary } from './Errorboundary'; import { Header } from './Header'; import { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } from './Card'; +import { + ViewportActionButton, + PatientInfo, + ViewportActionBar, + ViewportActionArrows, + ViewportPane, + ViewportActionCorners, + ViewportActionCornersLocations, + ViewportOverlay, + ViewportGrid, +} from './Viewport'; export { ErrorBoundary, @@ -183,5 +194,14 @@ export { CardTitle, CardDescription, CardContent, + ViewportActionButton, + PatientInfo, + ViewportActionBar, + ViewportActionArrows, + ViewportPane, + ViewportActionCorners, + ViewportActionCornersLocations, + ViewportOverlay, + ViewportGrid, Clipboard, }; diff --git a/platform/ui-next/src/contextProviders/ViewportGridProvider.tsx b/platform/ui-next/src/contextProviders/ViewportGridProvider.tsx new file mode 100644 index 000000000..3a63c9684 --- /dev/null +++ b/platform/ui-next/src/contextProviders/ViewportGridProvider.tsx @@ -0,0 +1,522 @@ +import React, { + createContext, + useCallback, + useContext, + useEffect, + useReducer, + ReactNode, +} from 'react'; +import merge from 'lodash.merge'; + +import PropTypes from 'prop-types'; +import { ViewportGridService, utils } from '@ohif/core'; + +const DEFAULT_STATE: AppTypes.ViewportGrid.State = { + activeViewportId: null, + layout: { + numRows: 0, + numCols: 0, + layoutType: 'grid', + }, + // this flag is used to determine if the hanging protocol layout is active + // so that we can inherit the viewport options from the previous state + // otherwise we will not allow that. Basically the issue is that we need + // to be able to come out of the hanging protocol layout and go back to the + // regular layout e.g., if we are in the MPR hanging protocol, and someone use + // 1x1 layout by custom layout selector, there is no way to drag and drop + // a non-reconstructible series to the viewport since it will always + // inherit the hanging protocol layout options (volume viewport), + // so we need to be able to switch back to the regular layout. + isHangingProtocolLayout: false, + // Viewports structure has been changed to Map (previously it was + // tied to the viewportIndex which caused multiple issues. Now we have + // moved completely to viewportId which is unique for each viewport. + viewports: new Map( + Object.entries({ + default: { + viewportId: 'default', + displaySetInstanceUIDs: [], + isReady: false, + viewportOptions: { + viewportId: 'default', + }, + displaySetSelectors: [], + displaySetOptions: [{}], + x: 0, // left + y: 0, // top + width: 100, + height: 100, + viewportLabel: null, + }, + }) + ), +}; + +const determineActiveViewportId = ( + state: AppTypes.ViewportGrid.State, + newViewports: Map +) => { + const { activeViewportId } = state; + const currentActiveViewport = state.viewports.get(activeViewportId); + + if (!currentActiveViewport) { + // if there is no active viewport, we should just return the first viewport + const firstViewport = newViewports.values().next().value; + return firstViewport.viewportOptions.viewportId; + } + + // for the new viewports, we should rank them by the displaySetInstanceUIDs + // they are displaying and the orientation then we can find the active viewport + const currentActiveDisplaySetInstanceUIDs = currentActiveViewport.displaySetInstanceUIDs; + + // This doesn't take into account where stack viewport is converting to volumeViewport + // since in stack viewport we don't have a concept of "orientation" as a string + // maybe we should calculate the orientation based on the active imageId + // so that we can compare it with the new viewports (which might be volume viewports) + // and find the best match + const currentOrientation = currentActiveViewport.viewportOptions.orientation; + + const filteredNewViewports = Array.from(newViewports.values()).filter( + viewport => viewport.displaySetInstanceUIDs?.length > 0 + ); + + const sortedViewports = Array.from(filteredNewViewports.values()).sort((a, b) => { + // Compare orientations + const aOrientationMatch = a.viewportOptions.orientation === currentOrientation; + const bOrientationMatch = b.viewportOptions.orientation === currentOrientation; + if (aOrientationMatch !== bOrientationMatch) { + return bOrientationMatch - aOrientationMatch; + } + + // Compare displaySetInstanceUIDs + const aMatch = a.displaySetInstanceUIDs.some(uid => + currentActiveDisplaySetInstanceUIDs.includes(uid) + ); + const bMatch = b.displaySetInstanceUIDs.some(uid => + currentActiveDisplaySetInstanceUIDs.includes(uid) + ); + if (aMatch !== bMatch) { + return bMatch - aMatch; + } + + return 0; // Return 0 if no differences found + }); + + if (!sortedViewports?.length) { + return null; + } + + return sortedViewports[0].viewportId; +}; + +// Define the API interface +interface ViewportGridApi { + getState: () => AppTypes.ViewportGrid.State; + setActiveViewportId: (index: string) => void; + setDisplaySetsForViewport: (props: any) => void; + setDisplaySetsForViewports: (props: any[]) => void; + setLayout: (layout: AppTypes.ViewportGrid.Layout) => void; + reset: () => void; + set: (gridLayoutState: Partial) => void; + getNumViewportPanes: () => number; + setViewportIsReady: (viewportId: string, isReady: boolean) => void; + getGridViewportsReady: () => boolean; + getActiveViewportOptionByKey: (key: string) => any; + setViewportGridSizeChanged: (props: any) => void; + publishViewportsReady: () => void; +} + +// Update the context type +export const ViewportGridContext = createContext<[AppTypes.ViewportGrid.State, ViewportGridApi]>([ + DEFAULT_STATE, + {} as ViewportGridApi, +]); + +// Update the provider props type +interface ViewportGridProviderProps { + children: ReactNode; + service: ViewportGridService; +} + +export function ViewportGridProvider({ children, service }: ViewportGridProviderProps) { + const viewportGridReducer = (state: AppTypes.ViewportGrid.State, action) => { + switch (action.type) { + case 'SET_ACTIVE_VIEWPORT_ID': { + return { ...state, ...{ activeViewportId: action.payload } }; + } + + /** + * Sets the display sets for multiple viewports. + * This is a replacement for the older set display set for viewport (single) + * because the old one had race conditions wherein the viewports could + * render partially in various ways causing exceptions. + */ + case 'SET_DISPLAYSETS_FOR_VIEWPORTS': { + const { payload } = action; + const viewports = new Map(state.viewports); + + payload.forEach(updatedViewport => { + const { viewportId, displaySetInstanceUIDs } = updatedViewport; + + if (!viewportId) { + throw new Error('ViewportId is required to set display sets for viewport'); + } + + const previousViewport = viewports.get(viewportId); + + // remove options that were meant for one time usage + if (previousViewport?.viewportOptions?.initialImageOptions) { + const { useOnce } = previousViewport.viewportOptions.initialImageOptions; + if (useOnce) { + previousViewport.viewportOptions.initialImageOptions = null; + } + } + + // Use the newly provide viewportOptions and display set options + // when provided, and otherwise fall back to the previous ones. + // That allows for easy updates of just the display set. + let viewportOptions = merge( + {}, + previousViewport?.viewportOptions, + updatedViewport?.viewportOptions + ); + + const displaySetOptions = updatedViewport?.displaySetOptions || []; + if (!displaySetOptions.length) { + // Copy all the display set options, assuming a full set of displaySet UID's is provided. + if (state.isHangingProtocolLayout) { + displaySetOptions.push(...(previousViewport.displaySetOptions || [])); + } + if (!displaySetOptions.length) { + displaySetOptions.push({}); + } + } + + // if it is not part of the hanging protocol layout, we should remove the toolGroupId + // and viewportType from the viewportOptions so that it doesn't + // inherit the hanging protocol layout options, only when + // the viewport options is not provided (e.g., when drag and drop) + // otherwise, programmatically set options should be preserved + if (!updatedViewport.viewportOptions && !state.isHangingProtocolLayout) { + viewportOptions = { + viewportId: viewportOptions.viewportId, + }; + } + + const newViewport = { + ...previousViewport, + displaySetInstanceUIDs, + viewportOptions, + displaySetOptions, + // viewportLabel: getViewportLabel(viewports, viewportId), + }; + + viewportOptions.presentationIds = service.getPresentationIds({ + viewport: newViewport, + viewports, + }); + + viewports.set(viewportId, { + ...viewports.get(viewportId), + ...newViewport, + }); + }); + + return { ...state, viewports }; + } + case 'SET_LAYOUT': { + const { + numCols, + numRows, + layoutOptions, + layoutType = 'grid', + activeViewportId, + findOrCreateViewport, + isHangingProtocolLayout, + } = action.payload; + + // If empty viewportOptions, we use numRow and numCols to calculate number of viewports + const hasOptions = layoutOptions?.length; + const viewports = new Map(); + // Options is a temporary state store which can be used by the + // findOrCreate to store state about already found viewports. Typically, + // it will be used to store the display set UID's which are already + // in view so that the find or create can decide which display sets + // haven't been viewed yet, and add them in the appropriate order. + const options = {}; + + let activeViewportIdToSet = activeViewportId; + for (let row = 0; row < numRows; row++) { + for (let col = 0; col < numCols; col++) { + const position = col + row * numCols; + const layoutOption = layoutOptions[position]; + + let xPos, yPos, w, h; + if (layoutOptions && layoutOptions[position]) { + ({ x: xPos, y: yPos, width: w, height: h } = layoutOptions[position]); + } else { + w = 1 / numCols; + h = 1 / numRows; + xPos = col * w; + yPos = row * h; + } + + const colIndex = Math.round(xPos * numCols); + const rowIndex = Math.round(yPos * numRows); + + const positionId = layoutOption?.positionId || `${colIndex}-${rowIndex}`; + + if (hasOptions && position >= layoutOptions.length) { + continue; + } + + const viewport = findOrCreateViewport(position, positionId, options); + + if (!viewport) { + continue; + } + + viewport.positionId = positionId; + + // If the viewport doesn't have a viewportId, we create one + if (!viewport.viewportOptions?.viewportId) { + const randomUID = utils.uuidv4().substring(0, 8); + viewport.viewportOptions = viewport.viewportOptions || {}; + viewport.viewportOptions.viewportId = `viewport-${randomUID}`; + } + + viewport.viewportId = viewport.viewportOptions.viewportId; + + // Create a new viewport object as it is getting updated here + // and it is part of the read only state + viewports.set(viewport.viewportId, viewport); + + Object.assign(viewport, { + width: w, + height: h, + x: xPos, + y: yPos, + }); + + viewport.isReady = false; + + if (!viewport.viewportOptions.presentationIds) { + const presentationIds = service.getPresentationIds({ + viewport, + viewports, + }); + viewport.viewportOptions.presentationIds = presentationIds; + } + } + } + + activeViewportIdToSet = + activeViewportIdToSet ?? determineActiveViewportId(state, viewports); + + const ret = { + ...state, + activeViewportId: activeViewportIdToSet, + layout: { + ...state.layout, + numCols, + numRows, + layoutType, + }, + viewports, + isHangingProtocolLayout, + }; + return ret; + } + case 'RESET': { + return DEFAULT_STATE; + } + + case 'SET': { + return { + ...state, + ...action.payload, + }; + } + + case 'VIEWPORT_IS_READY': { + const { viewportId, isReady } = action.payload; + const viewports = new Map(state.viewports); + const viewport = viewports.get(viewportId); + if (!viewport) { + return; + } + + viewports.set(viewportId, { + ...viewport, + isReady, + }); + + return { + ...state, + viewports, + }; + } + + default: + return action.payload; + } + }; + + const [viewportGridState, dispatch] = useReducer(viewportGridReducer, DEFAULT_STATE); + + const getState = useCallback(() => { + return viewportGridState; + }, [viewportGridState]); + + const getActiveViewportOptionByKey = (key: string) => { + const { viewports, activeViewportId } = viewportGridState; + return viewports.get(activeViewportId)?.viewportOptions?.[key]; + }; + + const setActiveViewportId = useCallback( + index => dispatch({ type: 'SET_ACTIVE_VIEWPORT_ID', payload: index }), + [dispatch] + ); + + const setDisplaySetsForViewports = useCallback( + viewports => + dispatch({ + type: 'SET_DISPLAYSETS_FOR_VIEWPORTS', + payload: viewports, + }), + [dispatch] + ); + + const setViewportIsReady = useCallback( + (viewportId, isReady) => { + dispatch({ + type: 'VIEWPORT_IS_READY', + payload: { + viewportId, + isReady, + }, + }); + }, + [dispatch, viewportGridState] + ); + + const getGridViewportsReady = useCallback(() => { + const { viewports } = viewportGridState; + const readyViewports = Array.from(viewports.values()).filter(viewport => viewport.isReady); + return readyViewports.length === viewports.size; + }, [viewportGridState]); + + const setLayout = useCallback( + ({ + layoutType, + numRows, + numCols, + layoutOptions = [], + activeViewportId, + findOrCreateViewport, + isHangingProtocolLayout, + }) => + dispatch({ + type: 'SET_LAYOUT', + payload: { + layoutType, + numRows, + numCols, + layoutOptions, + activeViewportId, + findOrCreateViewport, + isHangingProtocolLayout, + }, + }), + [dispatch] + ); + + const reset = useCallback( + () => + dispatch({ + type: 'RESET', + payload: {}, + }), + [dispatch] + ); + + const set = useCallback( + payload => + dispatch({ + type: 'SET', + payload, + }), + [dispatch] + ); + + const getNumViewportPanes = useCallback(() => { + const { layout, viewports } = viewportGridState; + const { numRows, numCols } = layout; + return Math.min(viewports.size, numCols * numRows); + }, [viewportGridState]); + + /** + * Sets the implementation of ViewportGridService that can be used by extensions. + * + * @returns void + */ + useEffect(() => { + if (service) { + service.setServiceImplementation({ + getState, + setActiveViewportId, + setDisplaySetsForViewports, + setLayout, + reset, + onModeExit: reset, + set, + getNumViewportPanes, + setViewportIsReady, + getGridViewportsReady, + }); + } + }, [ + getState, + service, + setActiveViewportId, + setDisplaySetsForViewports, + setLayout, + reset, + set, + getNumViewportPanes, + setViewportIsReady, + getGridViewportsReady, + ]); + + // run many of the calls through the service itself since we want to publish events + const api = { + getState, + setActiveViewportId: index => service.setActiveViewportId(index), + setDisplaySetsForViewport: props => service.setDisplaySetsForViewports([props]), + setDisplaySetsForViewports: props => service.setDisplaySetsForViewports(props), + setLayout: layout => service.setLayout(layout), + reset: () => service.reset(), + set: gridLayoutState => service.setState(gridLayoutState), // run it through the service itself since we want to publish events + getNumViewportPanes, + setViewportIsReady, + getGridViewportsReady, + getActiveViewportOptionByKey, + setViewportGridSizeChanged: props => service.setViewportGridSizeChanged(props), + publishViewportsReady: () => service.publishViewportsReady(), + }; + + return ( + + {children} + + ); +} + +ViewportGridProvider.propTypes = { + children: PropTypes.any, + service: PropTypes.instanceOf(ViewportGridService).isRequired, +}; + +// Update the useViewportGrid hook +export const useViewportGrid = (): [AppTypes.ViewportGrid.State, ViewportGridApi] => + useContext(ViewportGridContext); diff --git a/platform/ui-next/src/contextProviders/index.ts b/platform/ui-next/src/contextProviders/index.ts index 57d3d90ec..ffe6d2fa7 100644 --- a/platform/ui-next/src/contextProviders/index.ts +++ b/platform/ui-next/src/contextProviders/index.ts @@ -1,3 +1,5 @@ import NotificationProvider, { useNotification } from './NotificationProvider'; +import { ViewportGridContext, ViewportGridProvider, useViewportGrid } from './ViewportGridProvider'; export { useNotification, NotificationProvider }; +export { ViewportGridContext, ViewportGridProvider, useViewportGrid }; diff --git a/platform/ui-next/src/index.ts b/platform/ui-next/src/index.ts index 597f3540e..874f222da 100644 --- a/platform/ui-next/src/index.ts +++ b/platform/ui-next/src/index.ts @@ -81,10 +81,20 @@ import { StudySummary, ErrorBoundary, Header, + ViewportActionButton, + PatientInfo, + ViewportActionBar, + ViewportActionArrows, + ViewportPane, + ViewportActionCorners, + ViewportActionCornersLocations, + ViewportOverlay, + ViewportGrid, } from './components'; import { DataRow } from './components/DataRow'; import { useNotification, NotificationProvider } from './contextProviders'; +import { ViewportGridContext, ViewportGridProvider, useViewportGrid } from './contextProviders'; export { ErrorBoundary, @@ -104,6 +114,9 @@ export { // contextProviders NotificationProvider, useNotification, + ViewportGridContext, + ViewportGridProvider, + useViewportGrid, Separator, Tabs, TabsContent, @@ -174,4 +187,13 @@ export { TooltipContent, StudySummary, Header, + ViewportActionButton, + PatientInfo, + ViewportActionBar, + ViewportActionArrows, + ViewportPane, + ViewportActionCorners, + ViewportActionCornersLocations, + ViewportOverlay, + ViewportGrid, }; diff --git a/yarn.lock b/yarn.lock index 5070887cf..cdcbd6e03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4670,6 +4670,11 @@ resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== +"@radix-ui/primitive@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.1.tgz#fc169732d755c7fbad33ba8d0cd7fd10c90dc8e3" + integrity sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA== + "@radix-ui/react-accordion@^1.2.0": version "1.2.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-accordion/-/react-accordion-1.2.1.tgz#5c942c42c24267376b26204ec6847b17d15659b3" @@ -4700,6 +4705,13 @@ dependencies: "@radix-ui/react-primitive" "2.0.0" +"@radix-ui/react-arrow@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.1.1.tgz#2103721933a8bfc6e53bbfbdc1aaad5fc8ba0dd7" + integrity sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w== + dependencies: + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-checkbox@^1.1.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-checkbox/-/react-checkbox-1.1.2.tgz#6465b800420923ecc39cbeaa8f357b5f09dbfd52" @@ -4749,6 +4761,16 @@ "@radix-ui/react-primitive" "2.0.0" "@radix-ui/react-slot" "1.1.0" +"@radix-ui/react-collection@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.1.tgz#be2c7e01d3508e6d4b6d838f492e7d182f17d3b0" + integrity sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-slot" "1.1.1" + "@radix-ui/react-compose-refs@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz#7ed868b66946aa6030e580b1ffca386dd4d21989" @@ -4761,6 +4783,23 @@ resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== +"@radix-ui/react-compose-refs@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz#6f766faa975f8738269ebb8a23bad4f5a8d2faec" + integrity sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw== + +"@radix-ui/react-context-menu@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-context-menu/-/react-context-menu-2.2.4.tgz#8fe70ffdfec25ada35a60d100496cace1b75a977" + integrity sha512-ap4wdGwK52rJxGkwukU1NrnEodsUFQIooANKu+ey7d6raQ2biTcEf8za1zr0mgFHieevRTB2nK4dJeN8pTAZGQ== + dependencies: + "@radix-ui/primitive" "1.1.1" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-menu" "2.1.4" + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-context@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.0.1.tgz#fe46e67c96b240de59187dcb7a1a50ce3e2ec00c" @@ -4866,6 +4905,17 @@ "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-escape-keydown" "1.1.0" +"@radix-ui/react-dismissable-layer@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz#4ee0f0f82d53bf5bd9db21665799bb0d1bad5ed8" + integrity sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg== + dependencies: + "@radix-ui/primitive" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-escape-keydown" "1.1.0" + "@radix-ui/react-dropdown-menu@^2.1.1": version "2.1.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz#acc49577130e3c875ef0133bd1e271ea3392d924" @@ -4920,6 +4970,15 @@ "@radix-ui/react-primitive" "2.0.0" "@radix-ui/react-use-callback-ref" "1.1.0" +"@radix-ui/react-focus-scope@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz#5c602115d1db1c4fcfa0fae4c3b09bb8919853cb" + integrity sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-icons@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-icons/-/react-icons-1.3.0.tgz#c61af8f323d87682c5ca76b856d60c2312dbcb69" @@ -4971,6 +5030,30 @@ aria-hidden "^1.1.1" react-remove-scroll "2.6.0" +"@radix-ui/react-menu@2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.1.4.tgz#ac7aec296f29608206a7c6ef6335d8f102edaa95" + integrity sha512-BnOgVoL6YYdHAG6DtXONaR29Eq4nvbi8rutrV/xlr3RQCMMb3yqP85Qiw/3NReozrSW+4dfLkK+rc1hb4wPU/A== + dependencies: + "@radix-ui/primitive" "1.1.1" + "@radix-ui/react-collection" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.3" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.1" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.1" + "@radix-ui/react-portal" "1.1.3" + "@radix-ui/react-presence" "1.1.2" + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-roving-focus" "1.1.1" + "@radix-ui/react-slot" "1.1.1" + "@radix-ui/react-use-callback-ref" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "^2.6.1" + "@radix-ui/react-popover@^1.0.7": version "1.1.2" resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.1.2.tgz#a0cab25f69aa49ad0077d91e9e9dcd323758020c" @@ -5025,6 +5108,22 @@ "@radix-ui/react-use-size" "1.1.0" "@radix-ui/rect" "1.1.0" +"@radix-ui/react-popper@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.1.tgz#2fc66cfc34f95f00d858924e3bee54beae2dff0a" + integrity sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-rect" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/rect" "1.1.0" + "@radix-ui/react-portal@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.3.tgz#ffb961244c8ed1b46f039e6c215a6c4d9989bda1" @@ -5049,6 +5148,14 @@ "@radix-ui/react-primitive" "2.0.0" "@radix-ui/react-use-layout-effect" "1.1.0" +"@radix-ui/react-portal@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.3.tgz#b0ea5141103a1671b715481b13440763d2ac4440" + integrity sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw== + dependencies: + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-presence@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.0.1.tgz#491990ba913b8e2a5db1b06b203cb24b5cdef9ba" @@ -5066,6 +5173,14 @@ "@radix-ui/react-compose-refs" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0" +"@radix-ui/react-presence@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.2.tgz#bb764ed8a9118b7ec4512da5ece306ded8703cdc" + integrity sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg== + dependencies: + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-primitive@1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz#d49ea0f3f0b2fe3ab1cb5667eb03e8b843b914d0" @@ -5081,6 +5196,13 @@ dependencies: "@radix-ui/react-slot" "1.1.0" +"@radix-ui/react-primitive@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz#6d9efc550f7520135366f333d1e820cf225fad9e" + integrity sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg== + dependencies: + "@radix-ui/react-slot" "1.1.1" + "@radix-ui/react-roving-focus@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz#b30c59daf7e714c748805bfe11c76f96caaac35e" @@ -5096,6 +5218,21 @@ "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-controllable-state" "1.1.0" +"@radix-ui/react-roving-focus@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz#3b3abb1e03646937f28d9ab25e96343667ca6520" + integrity sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw== + dependencies: + "@radix-ui/primitive" "1.1.1" + "@radix-ui/react-collection" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-scroll-area@^1.1.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.0.tgz#d09fd693728b09c50145935bec6f91efc2661729" @@ -5205,6 +5342,13 @@ dependencies: "@radix-ui/react-compose-refs" "1.1.0" +"@radix-ui/react-slot@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.1.tgz#ab9a0ffae4027db7dc2af503c223c978706affc3" + integrity sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g== + dependencies: + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-switch@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-switch/-/react-switch-1.1.1.tgz#1401658c24d66a18610f18793afbaa7fedf5429a" @@ -20916,6 +21060,14 @@ react-remove-scroll-bar@^2.3.3, react-remove-scroll-bar@^2.3.6: react-style-singleton "^2.2.1" tslib "^2.0.0" +react-remove-scroll-bar@^2.3.7: + version "2.3.8" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz#99c20f908ee467b385b68a3469b4a3e750012223" + integrity sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q== + dependencies: + react-style-singleton "^2.2.2" + tslib "^2.0.0" + react-remove-scroll@2.5.5: version "2.5.5" resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" @@ -20938,6 +21090,17 @@ react-remove-scroll@2.6.0: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" +react-remove-scroll@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.2.tgz#2518d2c5112e71ea8928f1082a58459b5c7a2a97" + integrity sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw== + dependencies: + react-remove-scroll-bar "^2.3.7" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.3" + use-sidecar "^1.1.2" + react-resize-detector@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-10.0.1.tgz#ae9a8c5b6b93c4c11e03b3eb87e57fd7b62f1020" @@ -21034,6 +21197,14 @@ react-style-singleton@^2.2.1: invariant "^2.2.4" tslib "^2.0.0" +react-style-singleton@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz#4265608be69a4d70cfe3047f2c6c88b2c3ace388" + integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== + dependencies: + get-nonce "^1.0.0" + tslib "^2.0.0" + react-test-renderer@^18.3.1: version "18.3.1" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.3.1.tgz#e693608a1f96283400d4a3afead6893f958b80b4" @@ -24206,6 +24377,13 @@ use-callback-ref@^1.3.0: dependencies: tslib "^2.0.0" +use-callback-ref@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz#98d9fab067075841c5b2c6852090d5d0feabe2bf" + integrity sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg== + dependencies: + tslib "^2.0.0" + use-editable@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/use-editable/-/use-editable-2.3.3.tgz#a292fe9ba4c291cd28d1cc2728c75a5fc8d9a33f"