139 lines
4.1 KiB
TypeScript
139 lines
4.1 KiB
TypeScript
import React from 'react';
|
|
import { useNavigate, useLocation } from 'react-router-dom';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
import { UserPreferences, AboutModal, useModal } from '@ohif/ui';
|
|
import { Header } from '@ohif/ui-next';
|
|
import i18n from '@ohif/i18n';
|
|
import { hotkeys } from '@ohif/core';
|
|
import { Toolbar } from '../Toolbar/Toolbar';
|
|
import HeaderPatientInfo from './HeaderPatientInfo';
|
|
import { PatientInfoVisibility } from './HeaderPatientInfo/HeaderPatientInfo';
|
|
import { preserveQueryParameters, publicUrl } from '@ohif/app';
|
|
|
|
const { availableLanguages, defaultLanguage, currentLanguage } = i18n;
|
|
|
|
function ViewerHeader({
|
|
hotkeysManager,
|
|
extensionManager,
|
|
servicesManager,
|
|
appConfig,
|
|
}: withAppTypes<{ appConfig: AppTypes.Config }>) {
|
|
const navigate = useNavigate();
|
|
const location = useLocation();
|
|
|
|
const onClickReturnButton = () => {
|
|
const { pathname } = location;
|
|
const dataSourceIdx = pathname.indexOf('/', 1);
|
|
const query = new URLSearchParams(window.location.search);
|
|
const configUrl = query.get('configUrl');
|
|
|
|
const dataSourceName = pathname.substring(dataSourceIdx + 1);
|
|
const existingDataSource = extensionManager.getDataSources(dataSourceName);
|
|
|
|
const searchQuery = new URLSearchParams();
|
|
if (dataSourceIdx !== -1 && existingDataSource) {
|
|
searchQuery.append('datasources', pathname.substring(dataSourceIdx + 1));
|
|
}
|
|
|
|
if (configUrl) {
|
|
searchQuery.append('configUrl', configUrl);
|
|
}
|
|
|
|
navigate({
|
|
pathname: publicUrl,
|
|
search: decodeURIComponent(searchQuery.toString()),
|
|
});
|
|
};
|
|
|
|
const { t } = useTranslation();
|
|
const { show, hide } = useModal();
|
|
const { hotkeyDefinitions, hotkeyDefaults } = hotkeysManager;
|
|
const versionNumber = process.env.VERSION_NUMBER;
|
|
const commitHash = process.env.COMMIT_HASH;
|
|
|
|
const menuOptions = [
|
|
{
|
|
title: t('Header:About'),
|
|
icon: 'info',
|
|
onClick: () =>
|
|
show({
|
|
content: AboutModal,
|
|
title: t('AboutModal:About OHIF Viewer'),
|
|
contentProps: { versionNumber, commitHash },
|
|
containerDimensions: 'max-w-4xl max-h-4xl',
|
|
}),
|
|
},
|
|
{
|
|
title: t('Header:Preferences'),
|
|
icon: 'settings',
|
|
onClick: () =>
|
|
show({
|
|
title: t('UserPreferencesModal:User preferences'),
|
|
content: UserPreferences,
|
|
containerDimensions: 'w-[70%] max-w-[900px]',
|
|
contentProps: {
|
|
hotkeyDefaults: hotkeysManager.getValidHotkeyDefinitions(hotkeyDefaults),
|
|
hotkeyDefinitions,
|
|
currentLanguage: currentLanguage(),
|
|
availableLanguages,
|
|
defaultLanguage,
|
|
onCancel: () => {
|
|
hotkeys.stopRecord();
|
|
hotkeys.unpause();
|
|
hide();
|
|
},
|
|
onSubmit: ({ hotkeyDefinitions, language }) => {
|
|
if (language.value !== currentLanguage().value) {
|
|
i18n.changeLanguage(language.value);
|
|
}
|
|
hotkeysManager.setHotkeys(hotkeyDefinitions);
|
|
hide();
|
|
},
|
|
onReset: () => hotkeysManager.restoreDefaultBindings(),
|
|
hotkeysModule: hotkeys,
|
|
},
|
|
}),
|
|
},
|
|
];
|
|
|
|
if (appConfig.oidc) {
|
|
menuOptions.push({
|
|
title: t('Header:Logout'),
|
|
icon: 'power-off',
|
|
onClick: async () => {
|
|
navigate(`/logout?redirect_uri=${encodeURIComponent(window.location.href)}`);
|
|
},
|
|
});
|
|
}
|
|
|
|
return (
|
|
<Header
|
|
menuOptions={menuOptions}
|
|
isReturnEnabled={!!appConfig.showStudyList}
|
|
onClickReturnButton={onClickReturnButton}
|
|
WhiteLabeling={appConfig.whiteLabeling}
|
|
Secondary={
|
|
<Toolbar
|
|
servicesManager={servicesManager}
|
|
buttonSection="secondary"
|
|
/>
|
|
}
|
|
PatientInfo={
|
|
appConfig.showPatientInfo !== PatientInfoVisibility.DISABLED && (
|
|
<HeaderPatientInfo
|
|
servicesManager={servicesManager}
|
|
appConfig={appConfig}
|
|
/>
|
|
)
|
|
}
|
|
>
|
|
<div className="relative flex justify-center gap-[4px]">
|
|
<Toolbar servicesManager={servicesManager} />
|
|
</div>
|
|
</Header>
|
|
);
|
|
}
|
|
|
|
export default ViewerHeader;
|