|
|
|
|
@ -1,18 +1,21 @@
|
|
|
|
|
// Copyright (C) 2022 Intel Corporation
|
|
|
|
|
// Copyright (C) CVAT.ai corp
|
|
|
|
|
//
|
|
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
|
|
|
|
|
import React, { useCallback, useEffect, useState } from 'react';
|
|
|
|
|
|
|
|
|
|
import { useDispatch, useSelector } from 'react-redux';
|
|
|
|
|
import { CombinedState } from 'reducers';
|
|
|
|
|
|
|
|
|
|
import { CombinedState, ObjectType } from 'reducers';
|
|
|
|
|
import Text from 'antd/lib/typography/Text';
|
|
|
|
|
import Modal from 'antd/lib/modal';
|
|
|
|
|
|
|
|
|
|
import consts from 'consts';
|
|
|
|
|
import { removeObjectAsync, removeObject as removeObjectAction } from 'actions/annotation-actions';
|
|
|
|
|
|
|
|
|
|
export default function RemoveConfirmComponent(): JSX.Element | null {
|
|
|
|
|
const [visible, setVisible] = useState(false);
|
|
|
|
|
const [title, setTitle] = useState('');
|
|
|
|
|
const [description, setDescription] = useState<JSX.Element>(<></>);
|
|
|
|
|
const objectState = useSelector((state: CombinedState) => state.annotation.remove.objectState);
|
|
|
|
|
const force = useSelector((state: CombinedState) => state.annotation.remove.force);
|
|
|
|
|
const jobInstance = useSelector((state: CombinedState) => state.annotation.job.instance);
|
|
|
|
|
@ -21,13 +24,37 @@ export default function RemoveConfirmComponent(): JSX.Element | null {
|
|
|
|
|
const onOk = useCallback(() => {
|
|
|
|
|
dispatch(removeObjectAsync(jobInstance, objectState, true));
|
|
|
|
|
}, [jobInstance, objectState]);
|
|
|
|
|
|
|
|
|
|
const onCancel = useCallback(() => {
|
|
|
|
|
dispatch(removeObjectAction(null, false));
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const newVisible = !!objectState && !force && objectState.lock;
|
|
|
|
|
const newVisible = (!!objectState && !force && objectState.lock) ||
|
|
|
|
|
(objectState?.objectType === ObjectType.TRACK && !force);
|
|
|
|
|
setTitle(objectState?.lock ? 'Object is locked' : 'Remove object');
|
|
|
|
|
let descriptionMessage: string | JSX.Element = 'Are you sure you want to remove it?';
|
|
|
|
|
|
|
|
|
|
if (objectState?.objectType === ObjectType.TRACK && !force) {
|
|
|
|
|
descriptionMessage = (
|
|
|
|
|
<>
|
|
|
|
|
<Text>
|
|
|
|
|
{
|
|
|
|
|
`The object you are trying to remove is a track.
|
|
|
|
|
If you continue, it removes many drawn objects on different frames.
|
|
|
|
|
If you want to hide it only on this frame, use the outside feature instead.
|
|
|
|
|
${descriptionMessage}`
|
|
|
|
|
}
|
|
|
|
|
</Text>
|
|
|
|
|
<div className='cvat-remove-object-confirm-wrapper'>
|
|
|
|
|
{/* eslint-disable-next-line */}
|
|
|
|
|
<img src={consts.OUTSIDE_PIC_URL} />
|
|
|
|
|
</div>
|
|
|
|
|
</>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setDescription(descriptionMessage);
|
|
|
|
|
setVisible(newVisible);
|
|
|
|
|
if (!newVisible && objectState) {
|
|
|
|
|
dispatch(removeObjectAsync(jobInstance, objectState, true));
|
|
|
|
|
@ -46,7 +73,7 @@ export default function RemoveConfirmComponent(): JSX.Element | null {
|
|
|
|
|
className='cvat-modal-confirm'
|
|
|
|
|
>
|
|
|
|
|
<div>
|
|
|
|
|
Are you sure you want to remove it?
|
|
|
|
|
{description}
|
|
|
|
|
</div>
|
|
|
|
|
</Modal>
|
|
|
|
|
);
|
|
|
|
|
|