// Copyright (C) 2020-2021 Intel Corporation // // SPDX-License-Identifier: MIT import React, { RefObject } from 'react'; import { Row, Col } from 'antd/lib/grid'; import { PercentageOutlined } from '@ant-design/icons'; import Input from 'antd/lib/input'; import Select from 'antd/lib/select'; import Radio from 'antd/lib/radio'; import Checkbox from 'antd/lib/checkbox'; import Form, { FormInstance, RuleObject, RuleRender } from 'antd/lib/form'; import Text from 'antd/lib/typography/Text'; import { Store } from 'antd/lib/form/interface'; import CVATTooltip from 'components/common/cvat-tooltip'; import patterns from 'utils/validation-patterns'; const { Option } = Select; export enum SortingMethod { LEXICOGRAPHICAL = 'lexicographical', NATURAL = 'natural', PREDEFINED = 'predefined', RANDOM = 'random', } export interface AdvancedConfiguration { bugTracker?: string; imageQuality?: number; overlapSize?: number; segmentSize?: number; startFrame?: number; stopFrame?: number; frameFilter?: string; lfs: boolean; format?: string, repository?: string; useZipChunks: boolean; dataChunkSize?: number; useCache: boolean; copyData?: boolean; sortingMethod: SortingMethod; } const initialValues: AdvancedConfiguration = { imageQuality: 70, lfs: false, useZipChunks: true, useCache: true, copyData: false, sortingMethod: SortingMethod.LEXICOGRAPHICAL, }; interface Props { onSubmit(values: AdvancedConfiguration): void; installedGit: boolean; activeFileManagerTab: string; dumpers: [] } function validateURL(_: RuleObject, value: string): Promise { if (value && !patterns.validateURL.pattern.test(value)) { return Promise.reject(new Error('URL is not a valid URL')); } return Promise.resolve(); } function validateRepositoryPath(_: RuleObject, value: string): Promise { if (value && !patterns.validatePath.pattern.test(value)) { return Promise.reject(new Error('Repository path is not a valid path')); } return Promise.resolve(); } function validateRepository(_: RuleObject, value: string): Promise<[void, void]> | Promise { if (value) { const [url, path] = value.split(/\s+/); return Promise.all([validateURL(_, url), validateRepositoryPath(_, path)]); } return Promise.resolve(); } const isInteger = ({ min, max }: { min?: number; max?: number }) => ( _: RuleObject, value?: number | string, ): Promise => { if (typeof value === 'undefined' || value === '') { return Promise.resolve(); } const intValue = +value; if (Number.isNaN(intValue) || !Number.isInteger(intValue)) { return Promise.reject(new Error('Value must be a positive integer')); } if (typeof min !== 'undefined' && intValue < min) { return Promise.reject(new Error(`Value must be more than ${min}`)); } if (typeof max !== 'undefined' && intValue > max) { return Promise.reject(new Error(`Value must be less than ${max}`)); } return Promise.resolve(); }; const validateOverlapSize: RuleRender = ({ getFieldValue }): RuleObject => ({ validator(_: RuleObject, value?: string | number): Promise { if (typeof value !== 'undefined' && value !== '') { const segmentSize = getFieldValue('segmentSize'); if (typeof segmentSize !== 'undefined' && segmentSize !== '') { if (+segmentSize <= +value) { return Promise.reject(new Error('Segment size must be more than overlap size')); } } } return Promise.resolve(); }, }); const validateStopFrame: RuleRender = ({ getFieldValue }): RuleObject => ({ validator(_: RuleObject, value?: string | number): Promise { if (typeof value !== 'undefined' && value !== '') { const startFrame = getFieldValue('startFrame'); if (typeof startFrame !== 'undefined' && startFrame !== '') { if (+startFrame > +value) { return Promise.reject(new Error('Start frame must not be more than stop frame')); } } } return Promise.resolve(); }, }); class AdvancedConfigurationForm extends React.PureComponent { private formRef: RefObject; public constructor(props: Props) { super(props); this.formRef = React.createRef(); } public submit(): Promise { const { onSubmit } = this.props; if (this.formRef.current) { return this.formRef.current.validateFields().then( (values: Store): Promise => { const frameFilter = values.frameStep ? `step=${values.frameStep}` : undefined; const entries = Object.entries(values).filter( (entry: [string, unknown]): boolean => entry[0] !== frameFilter, ); onSubmit({ ...((Object.fromEntries(entries) as any) as AdvancedConfiguration), frameFilter, }); return Promise.resolve(); }, ); } return Promise.reject(new Error('Form ref is empty')); } public resetFields(): void { if (this.formRef.current) { this.formRef.current.resetFields(); } } /* eslint-disable class-methods-use-this */ private renderCopyDataChechbox(): JSX.Element { return ( Copy data into CVAT ); } private renderSortingMethodRadio(): JSX.Element { return ( Lexicographical Natural Predefined Random ); } private renderImageQuality(): JSX.Element { return ( } /> ); } private renderOverlap(): JSX.Element { return ( ); } private renderSegmentSize(): JSX.Element { return ( ); } private renderStartFrame(): JSX.Element { return ( ); } private renderStopFrame(): JSX.Element { return ( ); } private renderFrameStep(): JSX.Element { return ( ); } private renderGitLFSBox(): JSX.Element { return ( Use LFS (Large File Support): ); } private renderGitRepositoryURL(): JSX.Element { return ( ); } private renderGitFormat(): JSX.Element { const { dumpers } = this.props; return ( ); } private renderGit(): JSX.Element { return ( <> {this.renderGitRepositoryURL()} {this.renderGitFormat()} {this.renderGitLFSBox()} ); } private renderBugTracker(): JSX.Element { return ( ); } private renderUzeZipChunks(): JSX.Element { return ( Use zip chunks ); } private renderCreateTaskMethod(): JSX.Element { return ( Use cache ); } private renderChunkSize(): JSX.Element { return ( Defines a number of frames to be packed in a chunk when send from client to server. Server defines automatically if empty.
Recommended values:
1080p or less: 36
2k or less: 8 - 16
4k or less: 4 - 8
More: 1 - 4 )} >
); } public render(): JSX.Element { const { installedGit, activeFileManagerTab } = this.props; return (
{this.renderSortingMethodRadio()} {activeFileManagerTab === 'share' ? ( {this.renderCopyDataChechbox()} ) : null} {this.renderUzeZipChunks()} {this.renderCreateTaskMethod()} {this.renderImageQuality()} {this.renderOverlap()} {this.renderSegmentSize()} {this.renderStartFrame()} {this.renderStopFrame()} {this.renderFrameStep()} {this.renderChunkSize()} {installedGit ? this.renderGit() : null} {this.renderBugTracker()}
); } } export default AdvancedConfigurationForm;