You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
8.4 KiB
TypeScript
253 lines
8.4 KiB
TypeScript
// Copyright (C) 2020 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
import './styles.scss';
|
|
import React from 'react';
|
|
import { RouteComponentProps } from 'react-router';
|
|
import { withRouter } from 'react-router-dom';
|
|
import { Row, Col } from 'antd/lib/grid';
|
|
import Layout from 'antd/lib/layout';
|
|
import Icon from 'antd/lib/icon';
|
|
import Button from 'antd/lib/button';
|
|
import Menu from 'antd/lib/menu';
|
|
import Dropdown from 'antd/lib/dropdown';
|
|
import Modal from 'antd/lib/modal';
|
|
import Text from 'antd/lib/typography/Text';
|
|
|
|
import { CVATLogo, AccountIcon } from 'icons';
|
|
import consts from 'consts';
|
|
import SettingsModal from './settings-modal/settings-modal';
|
|
|
|
interface HeaderContainerProps {
|
|
onLogout: () => void;
|
|
switchSettingsDialog: (show: boolean) => void;
|
|
logoutFetching: boolean;
|
|
installedAnalytics: boolean;
|
|
installedAutoAnnotation: boolean;
|
|
installedTFAnnotation: boolean;
|
|
installedTFSegmentation: boolean;
|
|
serverHost: string;
|
|
username: string;
|
|
toolName: string;
|
|
serverVersion: string;
|
|
serverDescription: string;
|
|
coreVersion: string;
|
|
canvasVersion: string;
|
|
uiVersion: string;
|
|
switchSettingsShortcut: string;
|
|
settingsDialogShown: boolean;
|
|
}
|
|
|
|
type Props = HeaderContainerProps & RouteComponentProps;
|
|
|
|
function HeaderContainer(props: Props): JSX.Element {
|
|
const {
|
|
installedTFSegmentation,
|
|
installedAutoAnnotation,
|
|
installedTFAnnotation,
|
|
installedAnalytics,
|
|
username,
|
|
toolName,
|
|
serverHost,
|
|
serverVersion,
|
|
serverDescription,
|
|
coreVersion,
|
|
canvasVersion,
|
|
uiVersion,
|
|
onLogout,
|
|
logoutFetching,
|
|
settingsDialogShown,
|
|
switchSettingsShortcut,
|
|
switchSettingsDialog,
|
|
} = props;
|
|
|
|
const renderModels = installedAutoAnnotation
|
|
|| installedTFAnnotation
|
|
|| installedTFSegmentation;
|
|
|
|
const {
|
|
CHANGELOG_URL,
|
|
LICENSE_URL,
|
|
GITTER_URL,
|
|
FORUM_URL,
|
|
GITHUB_URL,
|
|
} = consts;
|
|
|
|
function aboutModal(): void {
|
|
Modal.info({
|
|
title: `${toolName}`,
|
|
content: (
|
|
<div>
|
|
<p>
|
|
{`${serverDescription}`}
|
|
</p>
|
|
<p>
|
|
<Text strong>
|
|
Server version:
|
|
</Text>
|
|
<Text type='secondary'>
|
|
{` ${serverVersion}`}
|
|
</Text>
|
|
</p>
|
|
<p>
|
|
<Text strong>
|
|
Core version:
|
|
</Text>
|
|
<Text type='secondary'>
|
|
{` ${coreVersion}`}
|
|
</Text>
|
|
</p>
|
|
<p>
|
|
<Text strong>
|
|
Canvas version:
|
|
</Text>
|
|
<Text type='secondary'>
|
|
{` ${canvasVersion}`}
|
|
</Text>
|
|
</p>
|
|
<p>
|
|
<Text strong>
|
|
UI version:
|
|
</Text>
|
|
<Text type='secondary'>
|
|
{` ${uiVersion}`}
|
|
</Text>
|
|
</p>
|
|
<Row type='flex' justify='space-around'>
|
|
<Col><a href={CHANGELOG_URL} target='_blank' rel='noopener noreferrer'>{'What\'s new?'}</a></Col>
|
|
<Col><a href={LICENSE_URL} target='_blank' rel='noopener noreferrer'>License</a></Col>
|
|
<Col><a href={GITTER_URL} target='_blank' rel='noopener noreferrer'>Need help?</a></Col>
|
|
<Col><a href={FORUM_URL} target='_blank' rel='noopener noreferrer'>Forum on Intel Developer Zone</a></Col>
|
|
</Row>
|
|
</div>
|
|
),
|
|
width: 800,
|
|
okButtonProps: {
|
|
style: {
|
|
width: '100px',
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
const menu = (
|
|
<Menu className='cvat-header-menu' mode='vertical'>
|
|
<Menu.Item
|
|
title={`Press ${switchSettingsShortcut} to switch`}
|
|
onClick={
|
|
(): void => switchSettingsDialog(true)
|
|
}
|
|
>
|
|
<Icon type='setting' />
|
|
Settings
|
|
</Menu.Item>
|
|
<Menu.Item onClick={() => aboutModal()}>
|
|
<Icon type='info-circle' />
|
|
About
|
|
</Menu.Item>
|
|
<Menu.Item
|
|
onClick={onLogout}
|
|
disabled={logoutFetching}
|
|
>
|
|
{logoutFetching ? <Icon type='loading' /> : <Icon type='logout' />}
|
|
Logout
|
|
</Menu.Item>
|
|
|
|
</Menu>
|
|
);
|
|
|
|
return (
|
|
<Layout.Header className='cvat-header'>
|
|
<div className='cvat-left-header'>
|
|
<Icon className='cvat-logo-icon' component={CVATLogo} />
|
|
|
|
<Button
|
|
className='cvat-header-button'
|
|
type='link'
|
|
value='tasks'
|
|
onClick={
|
|
(): void => props.history.push('/tasks?page=1')
|
|
}
|
|
>
|
|
Tasks
|
|
</Button>
|
|
{ renderModels
|
|
&& (
|
|
<Button
|
|
className='cvat-header-button'
|
|
type='link'
|
|
value='models'
|
|
onClick={
|
|
(): void => props.history.push('/models')
|
|
}
|
|
>
|
|
Models
|
|
</Button>
|
|
)}
|
|
{ installedAnalytics
|
|
&& (
|
|
<Button
|
|
className='cvat-header-button'
|
|
type='link'
|
|
onClick={
|
|
(): void => {
|
|
// false positive
|
|
// eslint-disable-next-line
|
|
window.open(`${serverHost}/analytics/app/kibana`, '_blank');
|
|
}
|
|
}
|
|
>
|
|
Analytics
|
|
</Button>
|
|
)}
|
|
</div>
|
|
<div className='cvat-right-header'>
|
|
<Button
|
|
className='cvat-header-button'
|
|
type='link'
|
|
onClick={
|
|
(): void => {
|
|
// false positive
|
|
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
window.open(GITHUB_URL, '_blank');
|
|
}
|
|
}
|
|
>
|
|
<Icon type='github' />
|
|
<Text className='cvat-text-color'>GitHub</Text>
|
|
</Button>
|
|
<Button
|
|
className='cvat-header-button'
|
|
type='link'
|
|
onClick={
|
|
(): void => {
|
|
// false positive
|
|
// eslint-disable-next-line
|
|
window.open(`${serverHost}/documentation/user_guide.html`, '_blank')
|
|
}
|
|
}
|
|
>
|
|
<Icon type='question-circle' />
|
|
Help
|
|
</Button>
|
|
<Dropdown overlay={menu} className='cvat-header-menu-dropdown'>
|
|
<span>
|
|
<Icon className='cvat-header-account-icon' component={AccountIcon} />
|
|
<Text strong>
|
|
{username.length > 14 ? `${username.slice(0, 10)} ...` : username}
|
|
</Text>
|
|
<Icon className='cvat-header-menu-icon' type='caret-down' />
|
|
</span>
|
|
</Dropdown>
|
|
</div>
|
|
<SettingsModal
|
|
visible={settingsDialogShown}
|
|
onClose={() => switchSettingsDialog(false)}
|
|
/>
|
|
</Layout.Header>
|
|
);
|
|
}
|
|
|
|
export default withRouter(HeaderContainer);
|