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.
143 lines
4.9 KiB
TypeScript
143 lines
4.9 KiB
TypeScript
// Copyright (C) 2020 Intel Corporation
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
import React from 'react';
|
|
import ReactDOM from 'react-dom';
|
|
import Menu from 'antd/lib/menu';
|
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
import { MenuInfo } from 'rc-menu/lib/interface';
|
|
|
|
import ObjectItemContainer from 'containers/annotation-page/standard-workspace/objects-side-bar/object-item';
|
|
import { Workspace } from 'reducers/interfaces';
|
|
import consts from 'consts';
|
|
|
|
interface Props {
|
|
readonly: boolean;
|
|
workspace: Workspace;
|
|
contextMenuClientID: number | null;
|
|
objectStates: any[];
|
|
visible: boolean;
|
|
left: number;
|
|
top: number;
|
|
onStartIssue(position: number[]): void;
|
|
openIssue(position: number[], message: string): void;
|
|
latestComments: string[];
|
|
}
|
|
|
|
interface ReviewContextMenuProps {
|
|
top: number;
|
|
left: number;
|
|
latestComments: string[];
|
|
onClick: (param: MenuInfo) => void;
|
|
}
|
|
|
|
enum ReviewContextMenuKeys {
|
|
OPEN_ISSUE = 'open_issue',
|
|
QUICK_ISSUE_POSITION = 'quick_issue_position',
|
|
QUICK_ISSUE_ATTRIBUTE = 'quick_issue_attribute',
|
|
QUICK_ISSUE_FROM_LATEST = 'quick_issue_from_latest',
|
|
}
|
|
|
|
function ReviewContextMenu({
|
|
top, left, latestComments, onClick,
|
|
}: ReviewContextMenuProps): JSX.Element {
|
|
return (
|
|
<Menu onClick={onClick} selectable={false} className='cvat-canvas-context-menu' style={{ top, left }}>
|
|
<Menu.Item className='cvat-context-menu-item' key={ReviewContextMenuKeys.OPEN_ISSUE}>
|
|
Open an issue ...
|
|
</Menu.Item>
|
|
<Menu.Item className='cvat-context-menu-item' key={ReviewContextMenuKeys.QUICK_ISSUE_POSITION}>
|
|
Quick issue: incorrect position
|
|
</Menu.Item>
|
|
<Menu.Item className='cvat-context-menu-item' key={ReviewContextMenuKeys.QUICK_ISSUE_ATTRIBUTE}>
|
|
Quick issue: incorrect attribute
|
|
</Menu.Item>
|
|
{latestComments.length ? (
|
|
<Menu.SubMenu
|
|
title='Quick issue ...'
|
|
className='cvat-context-menu-item'
|
|
key={ReviewContextMenuKeys.QUICK_ISSUE_FROM_LATEST}
|
|
>
|
|
{latestComments.map(
|
|
(comment: string, id: number): JSX.Element => (
|
|
<Menu.Item className='cvat-context-menu-item' key={`${id}`}>
|
|
{comment}
|
|
</Menu.Item>
|
|
),
|
|
)}
|
|
</Menu.SubMenu>
|
|
) : null}
|
|
</Menu>
|
|
);
|
|
}
|
|
|
|
export default function CanvasContextMenu(props: Props): JSX.Element | null {
|
|
const {
|
|
contextMenuClientID,
|
|
objectStates,
|
|
visible,
|
|
left,
|
|
top,
|
|
readonly,
|
|
workspace,
|
|
latestComments,
|
|
onStartIssue,
|
|
openIssue,
|
|
} = props;
|
|
|
|
if (!visible || contextMenuClientID === null) {
|
|
return null;
|
|
}
|
|
|
|
if (workspace === Workspace.REVIEW_WORKSPACE) {
|
|
return ReactDOM.createPortal(
|
|
<ReviewContextMenu
|
|
key={contextMenuClientID}
|
|
top={top}
|
|
left={left}
|
|
latestComments={latestComments}
|
|
onClick={(param: MenuInfo) => {
|
|
const [state] = objectStates.filter(
|
|
(_state: any): boolean => _state.clientID === contextMenuClientID,
|
|
);
|
|
if (param.key === ReviewContextMenuKeys.OPEN_ISSUE) {
|
|
if (state) {
|
|
onStartIssue(state.points);
|
|
}
|
|
} else if (param.key === ReviewContextMenuKeys.QUICK_ISSUE_POSITION) {
|
|
if (state) {
|
|
openIssue(state.points, consts.QUICK_ISSUE_INCORRECT_POSITION_TEXT);
|
|
}
|
|
} else if (param.key === ReviewContextMenuKeys.QUICK_ISSUE_ATTRIBUTE) {
|
|
if (state) {
|
|
openIssue(state.points, consts.QUICK_ISSUE_INCORRECT_ATTRIBUTE_TEXT);
|
|
}
|
|
} else if (
|
|
param.keyPath.length === 2 &&
|
|
param.keyPath[1] === ReviewContextMenuKeys.QUICK_ISSUE_FROM_LATEST
|
|
) {
|
|
if (state) {
|
|
openIssue(state.points, latestComments[+param.keyPath[0]]);
|
|
}
|
|
}
|
|
}}
|
|
/>,
|
|
window.document.body,
|
|
);
|
|
}
|
|
|
|
return ReactDOM.createPortal(
|
|
<div className='cvat-canvas-context-menu' style={{ top, left }}>
|
|
<ObjectItemContainer
|
|
readonly={readonly}
|
|
key={contextMenuClientID}
|
|
clientID={contextMenuClientID}
|
|
objectStates={objectStates}
|
|
initialCollapsed
|
|
/>
|
|
</div>,
|
|
window.document.body,
|
|
);
|
|
}
|