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.
137 lines
5.4 KiB
TypeScript
137 lines
5.4 KiB
TypeScript
// Copyright (C) 2021-2022 Intel Corporation
|
|
// Copyright (C) 2023 CVAT.ai Corporation
|
|
//
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
import React, { useEffect } from 'react';
|
|
import { DeleteOutlined, PlusCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons';
|
|
import Button from 'antd/lib/button';
|
|
import Col from 'antd/lib/col';
|
|
import Form, { RuleObject } from 'antd/lib/form';
|
|
import { FormListFieldData, FormListOperation } from 'antd/lib/form/FormList';
|
|
import Input from 'antd/lib/input';
|
|
import Row from 'antd/lib/row';
|
|
import Tooltip from 'antd/lib/tooltip';
|
|
import config from 'config';
|
|
|
|
interface Props {
|
|
form: any;
|
|
manifestNames: string[];
|
|
setManifestNames: (manifestNames: string[]) => void;
|
|
}
|
|
|
|
export default function ManifestsManager(props: Props): JSX.Element {
|
|
const { form, manifestNames, setManifestNames } = props;
|
|
const { DATASET_MANIFEST_GUIDE_URL } = config;
|
|
|
|
const updateManifestFields = (): void => {
|
|
const newManifestFormItems = manifestNames.map((name, idx) => ({
|
|
id: idx,
|
|
name,
|
|
}));
|
|
form.setFieldsValue({
|
|
manifests: [...newManifestFormItems],
|
|
});
|
|
};
|
|
|
|
useEffect(() => {
|
|
updateManifestFields();
|
|
}, [manifestNames]);
|
|
|
|
const onChangeManifestPath = (manifestName: string | undefined, manifestId: number): void => {
|
|
if (manifestName !== undefined) {
|
|
setManifestNames(manifestNames.map((name, idx) => (idx !== manifestId ? name : manifestName)));
|
|
}
|
|
};
|
|
|
|
const onDeleteManifestItem = (key: number): void => {
|
|
setManifestNames(manifestNames.filter((name, idx) => idx !== key));
|
|
};
|
|
|
|
const onAddManifestItem = (): void => {
|
|
setManifestNames(manifestNames.concat(['']));
|
|
};
|
|
|
|
return (
|
|
<>
|
|
<Form.Item
|
|
className='cvat-manifests-manager-form-item'
|
|
label={(
|
|
<>
|
|
Manifests
|
|
<Tooltip title='More information'>
|
|
<Button
|
|
type='link'
|
|
target='_blank'
|
|
className='cvat-cloud-storage-help-button'
|
|
href={DATASET_MANIFEST_GUIDE_URL}
|
|
>
|
|
<QuestionCircleOutlined />
|
|
</Button>
|
|
</Tooltip>
|
|
</>
|
|
)}
|
|
required
|
|
/>
|
|
<Form.List
|
|
name='manifests'
|
|
rules={[
|
|
{
|
|
validator: async (_: RuleObject, names: string[]): Promise<void> => {
|
|
if (!names || !names.length) {
|
|
throw new Error('Please, specify at least one manifest file');
|
|
}
|
|
},
|
|
},
|
|
]}
|
|
>
|
|
{
|
|
(fields: FormListFieldData[], _: FormListOperation, { errors }: { errors: React.ReactNode[] }) => (
|
|
<>
|
|
{fields.map((field, idx): JSX.Element => (
|
|
<Form.Item key={idx} shouldUpdate>
|
|
<Row justify='space-between' align='top'>
|
|
<Col>
|
|
<Form.Item
|
|
name={[idx, 'name']}
|
|
rules={[
|
|
{
|
|
required: true,
|
|
message: 'Please specify a manifest name',
|
|
},
|
|
]}
|
|
initialValue={field.name}
|
|
>
|
|
<Input
|
|
placeholder='manifest.jsonl'
|
|
onChange={(event) => onChangeManifestPath(event.target.value, idx)}
|
|
/>
|
|
</Form.Item>
|
|
</Col>
|
|
<Col>
|
|
<Form.Item>
|
|
<Button type='link' onClick={() => onDeleteManifestItem(idx)}>
|
|
<DeleteOutlined />
|
|
</Button>
|
|
</Form.Item>
|
|
</Col>
|
|
</Row>
|
|
</Form.Item>
|
|
))}
|
|
<Form.ErrorList errors={errors} />
|
|
</>
|
|
)
|
|
}
|
|
</Form.List>
|
|
<Row justify='start'>
|
|
<Col>
|
|
<Button type='ghost' onClick={onAddManifestItem} className='cvat-add-manifest-button'>
|
|
Add manifest
|
|
<PlusCircleOutlined />
|
|
</Button>
|
|
</Col>
|
|
</Row>
|
|
</>
|
|
);
|
|
}
|