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.
306 lines
9.2 KiB
TypeScript
306 lines
9.2 KiB
TypeScript
import React from 'react';
|
|
|
|
import {
|
|
Row,
|
|
Col,
|
|
Icon,
|
|
Input,
|
|
Checkbox,
|
|
Tooltip,
|
|
} from 'antd';
|
|
|
|
import Form, { FormComponentProps } from 'antd/lib/form/Form';
|
|
import Text from 'antd/lib/typography/Text';
|
|
|
|
import patterns from '../../utils/validation-patterns';
|
|
|
|
export interface AdvancedConfiguration {
|
|
bugTracker?: string;
|
|
zOrder: boolean;
|
|
imageQuality?: number;
|
|
overlapSize?: number;
|
|
segmentSize?: number;
|
|
startFrame?: number;
|
|
stopFrame?: number;
|
|
frameFilter?: string;
|
|
lfs: boolean;
|
|
repository?: string;
|
|
}
|
|
|
|
type Props = FormComponentProps & {
|
|
onSubmit(values: AdvancedConfiguration): void
|
|
installedGit: boolean;
|
|
};
|
|
|
|
class AdvancedConfigurationForm extends React.PureComponent<Props> {
|
|
public submit() {
|
|
return new Promise((resolve, reject) => {
|
|
this.props.form.validateFields((error, values) => {
|
|
if (!error) {
|
|
const filteredValues = { ...values };
|
|
delete filteredValues.frameStep;
|
|
|
|
this.props.onSubmit({
|
|
...values,
|
|
frameFilter: values.frameStep ? `step=${values.frameStep}` : undefined,
|
|
});
|
|
resolve();
|
|
} else {
|
|
reject();
|
|
}
|
|
});
|
|
})
|
|
}
|
|
|
|
public resetFields() {
|
|
this.props.form.resetFields();
|
|
}
|
|
|
|
private renderZOrder() {
|
|
return (
|
|
<Form.Item help='Enables order for shapes. Useful for segmentation tasks'>
|
|
{this.props.form.getFieldDecorator('zOrder', {
|
|
initialValue: false,
|
|
valuePropName: 'checked',
|
|
})(
|
|
<Checkbox>
|
|
<Text className='cvat-black-color'>
|
|
Z-order
|
|
</Text>
|
|
</Checkbox>
|
|
)}
|
|
</Form.Item>
|
|
);
|
|
}
|
|
|
|
private renderImageQuality() {
|
|
return (
|
|
<Form.Item label='Image quality'>
|
|
<Tooltip overlay='Defines image compression level'>
|
|
{this.props.form.getFieldDecorator('imageQuality', {
|
|
initialValue: 70,
|
|
rules: [{
|
|
required: true,
|
|
message: 'This field is required'
|
|
}],
|
|
})(
|
|
<Input
|
|
size='large'
|
|
type='number'
|
|
min={5}
|
|
max={100}
|
|
suffix={<Icon type='percentage'/>}
|
|
/>
|
|
)}
|
|
</Tooltip>
|
|
</Form.Item>
|
|
);
|
|
}
|
|
|
|
private renderOverlap() {
|
|
return (
|
|
<Form.Item label='Overlap size'>
|
|
<Tooltip overlay='Defines a number of intersected frames between different segments'>
|
|
{this.props.form.getFieldDecorator('overlapSize')(
|
|
<Input size='large' type='number'/>
|
|
)}
|
|
</Tooltip>
|
|
</Form.Item>
|
|
);
|
|
}
|
|
|
|
private renderSegmentSize() {
|
|
return (
|
|
<Form.Item label='Segment size'>
|
|
<Tooltip overlay='Defines a number of frames in a segment'>
|
|
{this.props.form.getFieldDecorator('segmentSize')(
|
|
<Input size='large' type='number'/>
|
|
)}
|
|
</Tooltip>
|
|
</Form.Item>
|
|
);
|
|
}
|
|
|
|
private renderStartFrame() {
|
|
return (
|
|
<Form.Item label='Start frame'>
|
|
{this.props.form.getFieldDecorator('startFrame')(
|
|
<Input
|
|
size='large'
|
|
type='number'
|
|
min={0}
|
|
step={1}
|
|
/>
|
|
)}
|
|
</Form.Item>
|
|
);
|
|
}
|
|
|
|
private renderStopFrame() {
|
|
return (
|
|
<Form.Item label='Stop frame'>
|
|
{this.props.form.getFieldDecorator('stopFrame')(
|
|
<Input
|
|
size='large'
|
|
type='number'
|
|
min={0}
|
|
step={1}
|
|
/>
|
|
)}
|
|
</Form.Item>
|
|
);
|
|
}
|
|
|
|
private renderFrameStep() {
|
|
return (
|
|
<Form.Item label='Frame step'>
|
|
{this.props.form.getFieldDecorator('frameStep')(
|
|
<Input
|
|
size='large'
|
|
type='number'
|
|
min={1}
|
|
step={1}
|
|
/>
|
|
)}
|
|
</Form.Item>
|
|
);
|
|
}
|
|
|
|
private renderGitLFSBox() {
|
|
return (
|
|
<Form.Item help='If annotation files are large, you can use git LFS feature'>
|
|
{this.props.form.getFieldDecorator('lfs', {
|
|
valuePropName: 'checked',
|
|
initialValue: false,
|
|
})(
|
|
<Checkbox>
|
|
<Text className='cvat-black-color'>
|
|
Use LFS (Large File Support):
|
|
</Text>
|
|
</Checkbox>
|
|
)}
|
|
</Form.Item>
|
|
);
|
|
}
|
|
|
|
private renderGitRepositoryURL() {
|
|
return (
|
|
<Form.Item
|
|
hasFeedback
|
|
label='Dataset repository URL'
|
|
extra='Attach a repository to store annotations there'
|
|
>
|
|
{this.props.form.getFieldDecorator('repository', {
|
|
rules: [{
|
|
validator: (_, value, callback) => {
|
|
if (!value) {
|
|
callback();
|
|
} else {
|
|
const [url, path] = value.split(/\s+/);
|
|
if (!patterns.validateURL.pattern.test(url)) {
|
|
callback('Git URL is not a valid');
|
|
}
|
|
|
|
if (path && !patterns.validatePath.pattern.test(path)) {
|
|
callback('Git path is not a valid');
|
|
}
|
|
|
|
callback();
|
|
}
|
|
}
|
|
}]
|
|
})(
|
|
<Input size='large'
|
|
placeholder='e.g. https//github.com/user/repos [annotation/<anno_file_name>.zip]'
|
|
/>
|
|
)}
|
|
</Form.Item>
|
|
);
|
|
}
|
|
|
|
private renderGit() {
|
|
return (
|
|
<>
|
|
<Row>
|
|
<Col>
|
|
{this.renderGitRepositoryURL()}
|
|
</Col>
|
|
</Row>
|
|
<Row>
|
|
<Col>
|
|
{this.renderGitLFSBox()}
|
|
</Col>
|
|
</Row>
|
|
</>
|
|
);
|
|
}
|
|
|
|
private renderBugTracker() {
|
|
return (
|
|
<Form.Item
|
|
hasFeedback
|
|
label='Issue tracker'
|
|
extra='Attach issue tracker where the task is described'
|
|
>
|
|
{this.props.form.getFieldDecorator('bugTracker', {
|
|
rules: [{
|
|
validator: (_, value, callback) => {
|
|
if (value && !patterns.validateURL.pattern.test(value)) {
|
|
callback('Issue tracker must be URL');
|
|
} else {
|
|
callback();
|
|
}
|
|
}
|
|
}]
|
|
})(
|
|
<Input size='large'/>
|
|
)}
|
|
</Form.Item>
|
|
)
|
|
}
|
|
|
|
public render() {
|
|
return (
|
|
<Form>
|
|
<Row><Col>
|
|
{this.renderZOrder()}
|
|
</Col></Row>
|
|
|
|
<Row type='flex' justify='start'>
|
|
<Col span={7}>
|
|
{this.renderImageQuality()}
|
|
</Col>
|
|
<Col span={7} offset={1}>
|
|
{this.renderOverlap()}
|
|
</Col>
|
|
<Col span={7} offset={1}>
|
|
{this.renderSegmentSize()}
|
|
</Col>
|
|
</Row>
|
|
|
|
<Row type='flex' justify='start'>
|
|
<Col span={7}>
|
|
{this.renderStartFrame()}
|
|
</Col>
|
|
<Col span={7} offset={1}>
|
|
{this.renderStopFrame()}
|
|
</Col>
|
|
<Col span={7} offset={1}>
|
|
{this.renderFrameStep()}
|
|
</Col>
|
|
</Row>
|
|
|
|
{ this.props.installedGit ? this.renderGit() : null}
|
|
|
|
<Row>
|
|
<Col>
|
|
{this.renderBugTracker()}
|
|
</Col>
|
|
</Row>
|
|
</Form>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default Form.create<Props>()(AdvancedConfigurationForm);
|