feat(ui): customization option for viewport notification (#4638)

This commit is contained in:
nithin-trenser 2025-02-04 19:16:39 +05:30 committed by GitHub
parent c65e7f57cc
commit 8acbd760d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 49 additions and 20 deletions

View File

@ -3,7 +3,7 @@ import { useResizeDetector } from 'react-resize-detector';
import * as cs3DTools from '@cornerstonejs/tools'; import * as cs3DTools from '@cornerstonejs/tools';
import { Enums, eventTarget, getEnabledElement } from '@cornerstonejs/core'; import { Enums, eventTarget, getEnabledElement } from '@cornerstonejs/core';
import { MeasurementService } from '@ohif/core'; import { MeasurementService } from '@ohif/core';
import { AllInOneMenu, Notification, useViewportDialog } from '@ohif/ui'; import { AllInOneMenu, useViewportDialog } from '@ohif/ui';
import type { Types as csTypes } from '@cornerstonejs/core'; import type { Types as csTypes } from '@cornerstonejs/core';
import { setEnabledElement } from '../state'; import { setEnabledElement } from '../state';
@ -99,6 +99,7 @@ const OHIFCornerstoneViewport = React.memo(
segmentationService, segmentationService,
cornerstoneCacheService, cornerstoneCacheService,
viewportActionCornersService, viewportActionCornersService,
customizationService,
} = servicesManager.services; } = servicesManager.services;
const [viewportDialogState] = useViewportDialog(); const [viewportDialogState] = useViewportDialog();
@ -373,6 +374,8 @@ const OHIFCornerstoneViewport = React.memo(
onResize, onResize,
}); });
const Notification = customizationService.getCustomization('ui.notificationComponent');
return ( return (
<React.Fragment> <React.Fragment>
<div className="viewport-wrapper"> <div className="viewport-wrapper">

View File

@ -0,0 +1,5 @@
import { Notification } from '@ohif/ui';
export default {
'ui.notificationComponent': Notification,
};

View File

@ -17,6 +17,7 @@ import loadingIndicatorTotalPercentCustomization from './customizations/loadingI
import progressLoadingBarCustomization from './customizations/progressLoadingBarCustomization'; import progressLoadingBarCustomization from './customizations/progressLoadingBarCustomization';
import viewportActionCornersCustomization from './customizations/viewportActionCornersCustomization'; import viewportActionCornersCustomization from './customizations/viewportActionCornersCustomization';
import labellingFlowCustomization from './customizations/labellingFlowCustomization'; import labellingFlowCustomization from './customizations/labellingFlowCustomization';
import viewportNotificationCustomization from './customizations/notificationCustomization';
/** /**
* *
@ -60,6 +61,7 @@ export default function getCustomizationModule({ servicesManager, extensionManag
...viewportActionCornersCustomization, ...viewportActionCornersCustomization,
...labellingFlowCustomization, ...labellingFlowCustomization,
...contextMenuUICustomization, ...contextMenuUICustomization,
...viewportNotificationCustomization,
}, },
}, },
]; ];

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

View File

@ -22,6 +22,7 @@ import segDisplayEditingFalse from '../../../assets/img/segDisplayEditingFalse.p
import thumbnailMenuItemsImage from '../../../assets/img/thumbnailMenuItemsImage.png'; import thumbnailMenuItemsImage from '../../../assets/img/thumbnailMenuItemsImage.png';
import studyMenuItemsImage from '../../../assets/img/studyMenuItemsImage.png'; import studyMenuItemsImage from '../../../assets/img/studyMenuItemsImage.png';
import windowLevelActionMenu from '../../../assets/img/windowLevelActionMenu.png'; import windowLevelActionMenu from '../../../assets/img/windowLevelActionMenu.png';
import viewPortNotificationImage from '../../../assets/img/viewport-notification.png';
export const viewportOverlayCustomizations = [ export const viewportOverlayCustomizations = [
{ {
@ -614,6 +615,24 @@ window.config = {
}, },
}, },
], ],
};
`,
},
{
id: 'ui.notificationComponent',
description: 'Define the component which is used to render viewport notifications',
default: 'Default Notification component in viewport',
image: [viewPortNotificationImage],
configuration: `
window.config = {
// rest of window config
customizationService: [
{
'ui.notificationComponent': {
$set: CustomizedComponent,
},
},
],
}; };
`, `,
}, },

View File

@ -1,11 +1,28 @@
import React, { useEffect, useRef } from 'react'; import React, { useEffect, useRef } from 'react';
import classnames from 'classnames'; import classnames from 'classnames';
import PropTypes from 'prop-types';
import Button, { ButtonEnums } from '../Button'; import Button, { ButtonEnums } from '../Button';
import { Icons } from '@ohif/ui-next'; import { Icons } from '@ohif/ui-next';
const Notification = ({ type NotificationAction = {
id: string;
text: string;
value: any;
type: ButtonEnums.type.primary | ButtonEnums.type.secondary;
size?: ButtonEnums.size.small | ButtonEnums.size.medium;
};
export type NotificationProps = {
id: string;
type: 'error' | 'warning' | 'info' | 'success';
message: string | React.ReactNode;
actions: NotificationAction[];
onSubmit: (e: any) => void;
onOutsideClick?: () => void;
onKeyPress?: (e: React.KeyboardEvent) => void;
};
const Notification: React.FC<NotificationProps> = ({
id, id,
type = 'info', type = 'info',
message, message,
@ -107,21 +124,4 @@ const Notification = ({
); );
}; };
Notification.propTypes = {
type: PropTypes.oneOf(['error', 'warning', 'info', 'success']),
message: PropTypes.string.isRequired,
actions: PropTypes.arrayOf(
PropTypes.shape({
text: PropTypes.string.isRequired,
value: PropTypes.any.isRequired,
type: PropTypes.oneOf([ButtonEnums.type.primary, ButtonEnums.type.secondary]).isRequired,
size: PropTypes.oneOf([ButtonEnums.size.small, ButtonEnums.size.medium]),
})
).isRequired,
onSubmit: PropTypes.func.isRequired,
/** Can be used as a callback to dismiss the notification for clicks that occur outside of it */
onOutsideClick: PropTypes.func,
onKeyPress: PropTypes.func,
};
export default Notification; export default Notification;