From 7dbe5e37b06056fdd5262a131417013d112c3d30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pedro=20K=C3=B6hler?= Date: Fri, 2 May 2025 15:45:39 -0300 Subject: [PATCH] feat: improve menu modals customizations (#5011) --- .../default/src/ViewerLayout/ViewerHeader.tsx | 23 +++++++++++------ platform/app/src/routes/WorkList/WorkList.tsx | 25 +++++++++++-------- .../services/CustomizationService/types.ts | 7 ++++++ 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/extensions/default/src/ViewerLayout/ViewerHeader.tsx b/extensions/default/src/ViewerLayout/ViewerHeader.tsx index 6e1afb651..cf9c501cc 100644 --- a/extensions/default/src/ViewerLayout/ViewerHeader.tsx +++ b/extensions/default/src/ViewerLayout/ViewerHeader.tsx @@ -8,6 +8,7 @@ import { Toolbar } from '../Toolbar/Toolbar'; import HeaderPatientInfo from './HeaderPatientInfo'; import { PatientInfoVisibility } from './HeaderPatientInfo/HeaderPatientInfo'; import { preserveQueryParameters } from '@ohif/app'; +import { Types } from '@ohif/core'; function ViewerHeader({ appConfig }: withAppTypes<{ appConfig: AppTypes.Config }>) { const { servicesManager, extensionManager, commandsManager } = useSystem(); @@ -38,28 +39,34 @@ function ViewerHeader({ appConfig }: withAppTypes<{ appConfig: AppTypes.Config } const { t } = useTranslation(); const { show } = useModal(); - const AboutModal = customizationService.getCustomization('ohif.aboutModal'); - const UserPreferencesModal = customizationService.getCustomization('ohif.userPreferencesModal'); + const AboutModal = customizationService.getCustomization( + 'ohif.aboutModal' + ) as Types.MenuComponentCustomization; + + const UserPreferencesModal = customizationService.getCustomization( + 'ohif.userPreferencesModal' + ) as Types.MenuComponentCustomization; const menuOptions = [ { - title: t('Header:About'), + title: AboutModal?.menuTitle ?? t('Header:About'), icon: 'info', onClick: () => show({ content: AboutModal, - title: t('AboutModal:About OHIF Viewer'), - containerClassName: 'max-w-md', + title: AboutModal?.title ?? t('AboutModal:About OHIF Viewer'), + containerClassName: AboutModal?.containerClassName ?? 'max-w-md', }), }, { - title: t('Header:Preferences'), + title: UserPreferencesModal.menuTitle ?? t('Header:Preferences'), icon: 'settings', onClick: () => show({ content: UserPreferencesModal, - title: t('UserPreferencesModal:User preferences'), - containerClassName: 'flex max-w-4xl p-6 flex-col', + title: UserPreferencesModal.title ?? t('UserPreferencesModal:User preferences'), + containerClassName: + UserPreferencesModal?.containerClassName ?? 'flex max-w-4xl p-6 flex-col', }), }, ]; diff --git a/platform/app/src/routes/WorkList/WorkList.tsx b/platform/app/src/routes/WorkList/WorkList.tsx index be176ee0f..a37027595 100644 --- a/platform/app/src/routes/WorkList/WorkList.tsx +++ b/platform/app/src/routes/WorkList/WorkList.tsx @@ -10,7 +10,7 @@ import { useTranslation } from 'react-i18next'; import filtersMeta from './filtersMeta.js'; import { useAppConfig } from '@state'; import { useDebounce, useSearchParams } from '@hooks'; -import { utils } from '@ohif/core'; +import { utils, Types as coreTypes } from '@ohif/core'; import { StudyListExpandedRow, @@ -465,28 +465,33 @@ function WorkList({ const hasStudies = numOfStudies > 0; - const AboutModal = customizationService.getCustomization('ohif.aboutModal'); - const UserPreferencesModal = customizationService.getCustomization('ohif.userPreferencesModal'); + const AboutModal = customizationService.getCustomization( + 'ohif.aboutModal' + ) as coreTypes.MenuComponentCustomization; + const UserPreferencesModal = customizationService.getCustomization( + 'ohif.userPreferencesModal' + ) as coreTypes.MenuComponentCustomization; const menuOptions = [ { - title: t('Header:About'), + title: AboutModal?.menuTitle ?? t('Header:About'), icon: 'info', onClick: () => show({ - content: AboutModal as React.ComponentType, - title: t('AboutModal:About OHIF Viewer'), - containerClassName: 'max-w-md ', + content: AboutModal, + title: AboutModal?.title ?? t('AboutModal:About OHIF Viewer'), + containerClassName: AboutModal?.containerClassName ?? 'max-w-md', }), }, { - title: t('Header:Preferences'), + title: UserPreferencesModal.menuTitle ?? t('Header:Preferences'), icon: 'settings', onClick: () => show({ - title: t('UserPreferencesModal:User preferences'), content: UserPreferencesModal as React.ComponentType, - containerClassName: 'flex max-w-4xl flex-col', + title: UserPreferencesModal.title ?? t('UserPreferencesModal:User preferences'), + containerClassName: + UserPreferencesModal?.containerClassName ?? 'flex max-w-4xl p-6 flex-col', }), }, ]; diff --git a/platform/core/src/services/CustomizationService/types.ts b/platform/core/src/services/CustomizationService/types.ts index 653e4c642..a0e0a7c44 100644 --- a/platform/core/src/services/CustomizationService/types.ts +++ b/platform/core/src/services/CustomizationService/types.ts @@ -31,7 +31,14 @@ export interface CallbackCustomization extends BaseCustomization { callbacks: Array<(...props: any) => any>; } +export type MenuComponentCustomization = React.ComponentType & { + menuTitle?: string; + title?: string; + containerClassName?: string; +}; + export type Customization = + | MenuComponentCustomization | React.ComponentType | BaseCustomization | LabelCustomization