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.

134 lines
6.1 KiB
TypeScript

// Copyright (C) 2020-2022 Intel Corporation
// Copyright (C) 2022 CVAT.ai Corporation
//
// SPDX-License-Identifier: MIT
import React, { useState, useEffect } from 'react';
import { useDispatch } from 'react-redux';
import { useHistory } from 'react-router';
import { Row, Col } from 'antd/lib/grid';
import Dropdown from 'antd/lib/dropdown';
import { PlusOutlined, UploadOutlined, LoadingOutlined } from '@ant-design/icons';
import Button from 'antd/lib/button';
import Input from 'antd/lib/input';
import { importActions } from 'actions/import-actions';
import { SortingComponent, ResourceFilterHOC, defaultVisibility } from 'components/resource-sorting-filtering';
import { TasksQuery } from 'reducers';
import { usePrevious } from 'utils/hooks';
import { MultiPlusIcon } from 'icons';
import CvatDropdownMenuPaper from 'components/common/cvat-dropdown-menu-paper';
import {
localStorageRecentKeyword, localStorageRecentCapacity, predefinedFilterValues, config,
} from './tasks-filter-configuration';
const FilteringComponent = ResourceFilterHOC(
config, localStorageRecentKeyword, localStorageRecentCapacity, predefinedFilterValues,
);
interface VisibleTopBarProps {
onApplyFilter(filter: string | null): void;
onApplySorting(sorting: string | null): void;
onApplySearch(search: string | null): void;
query: TasksQuery;
importing: boolean;
}
export default function TopBarComponent(props: VisibleTopBarProps): JSX.Element {
const dispatch = useDispatch();
const {
importing, query, onApplyFilter, onApplySorting, onApplySearch,
} = props;
const [visibility, setVisibility] = useState(defaultVisibility);
const history = useHistory();
const prevImporting = usePrevious(importing);
useEffect(() => {
if (prevImporting && !importing) {
onApplyFilter(query.filter);
}
}, [importing]);
return (
<Row className='cvat-tasks-page-top-bar' justify='center' align='middle'>
<Col md={22} lg={18} xl={16} xxl={14}>
<div className='cvat-tasks-page-filters-wrapper'>
<Input.Search
enterButton
onSearch={(phrase: string) => {
onApplySearch(phrase);
}}
defaultValue={query.search || ''}
className='cvat-tasks-page-search-bar'
placeholder='Search ...'
/>
<div>
<SortingComponent
visible={visibility.sorting}
onVisibleChange={(visible: boolean) => (
setVisibility({ ...defaultVisibility, sorting: visible })
)}
defaultFields={query.sort?.split(',') || ['-ID']}
sortingFields={['ID', 'Owner', 'Status', 'Assignee', 'Updated date', 'Subset', 'Mode', 'Dimension', 'Project ID', 'Name', 'Project name']}
onApplySorting={onApplySorting}
/>
<FilteringComponent
value={query.filter}
predefinedVisible={visibility.predefined}
builderVisible={visibility.builder}
recentVisible={visibility.recent}
onPredefinedVisibleChange={(visible: boolean) => (
setVisibility({ ...defaultVisibility, predefined: visible })
)}
onBuilderVisibleChange={(visible: boolean) => (
setVisibility({ ...defaultVisibility, builder: visible })
)}
onRecentVisibleChange={(visible: boolean) => (
setVisibility({ ...defaultVisibility, builder: visibility.builder, recent: visible })
)}
onApplyFilter={onApplyFilter}
/>
</div>
</div>
<div>
<Dropdown
trigger={['click']}
overlay={(
<CvatDropdownMenuPaper>
<Button
className='cvat-create-task-button'
type='primary'
onClick={(): void => history.push('/tasks/create')}
icon={<PlusOutlined />}
>
Create a new task
</Button>
<Button
className='cvat-create-multi-tasks-button'
type='primary'
onClick={(): void => history.push('/tasks/create?many=true')}
icon={<span className='anticon'><MultiPlusIcon /></span>}
>
Create multi tasks
</Button>
<Button
className='cvat-import-task-button'
type='primary'
disabled={importing}
icon={<UploadOutlined />}
onClick={() => dispatch(importActions.openImportBackupModal('task'))}
>
Create from backup
{importing && <LoadingOutlined />}
</Button>
</CvatDropdownMenuPaper>
)}
>
<Button type='primary' className='cvat-create-task-dropdown' icon={<PlusOutlined />} />
</Dropdown>
</div>
</Col>
</Row>
);
}