// Copyright (C) 2021-2022 Intel Corporation // // SPDX-License-Identifier: MIT import React, { useEffect, useRef, useState } from 'react'; import { DeleteOutlined, PlusCircleOutlined, QuestionCircleOutlined } from '@ant-design/icons'; import Button from 'antd/lib/button'; import Col from 'antd/lib/col'; import Form from 'antd/lib/form'; import Input from 'antd/lib/input'; import Row from 'antd/lib/row'; import notification from 'antd/lib/notification'; import Tooltip from 'antd/lib/tooltip'; interface Props { form: any; manifestNames: string[]; setManifestNames: (manifestNames: string[]) => void; } export default function ManifestsManager(props: Props): JSX.Element { const { form, manifestNames, setManifestNames } = props; const maxManifestsCount = useRef(5); const [limitingAddingManifestNotification, setLimitingAddingManifestNotification] = useState(false); const updateManifestFields = (): void => { const newManifestFormItems = manifestNames.map((name, idx) => ({ id: idx, name, })); form.setFieldsValue({ manifests: [...newManifestFormItems], }); }; useEffect(() => { updateManifestFields(); }, [manifestNames]); useEffect(() => { if (limitingAddingManifestNotification) { notification.warning({ message: `Unable to add manifest. The maximum number of files is ${maxManifestsCount.current}`, className: 'cvat-notification-limiting-adding-manifest', }); } }, [limitingAddingManifestNotification]); 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 => { if (maxManifestsCount.current === manifestNames.length && limitingAddingManifestNotification) { setLimitingAddingManifestNotification(false); } setManifestNames(manifestNames.filter((name, idx) => idx !== key)); }; const onAddManifestItem = (): void => { if (maxManifestsCount.current <= manifestNames.length) { setLimitingAddingManifestNotification(true); } else { setManifestNames(manifestNames.concat([''])); } }; return ( <> Manifests )} rules={[{ required: true, message: 'Please, specify at least one manifest file' }]} /> { (fields) => ( <> {fields.map((field, idx): JSX.Element => ( onChangeManifestPath(event.target.value, idx)} /> ))} ) } ); }