diff --git a/cvat-ui/src/actions/tasks-actions.ts b/cvat-ui/src/actions/tasks-actions.ts index d277c6733b3..60e4da022ef 100644 --- a/cvat-ui/src/actions/tasks-actions.ts +++ b/cvat-ui/src/actions/tasks-actions.ts @@ -262,12 +262,8 @@ ThunkAction { validation_params: { mode: data.quality.validationMode, frame_selection_method: data.quality.frameSelectionMethod, - frame_share: data.quality.validationFramesPercent ? ( - data.quality.validationFramesPercent / 100 - ) : data.quality.validationFramesPercent, - frames_per_job_share: data.quality.validationFramesPerJobPercent ? ( - data.quality.validationFramesPerJobPercent / 100 - ) : data.quality.validationFramesPerJobPercent, + frame_share: data.quality.validationFramesPercent, + frames_per_job_share: data.quality.validationFramesPerJobPercent, }, }; } diff --git a/cvat-ui/src/components/create-task-page/create-task-content.tsx b/cvat-ui/src/components/create-task-page/create-task-content.tsx index e4161e96701..b1e4dc69008 100644 --- a/cvat-ui/src/components/create-task-page/create-task-content.tsx +++ b/cvat-ui/src/components/create-task-page/create-task-content.tsx @@ -22,7 +22,6 @@ import { RemoteFile } from 'components/file-manager/remote-browser'; import { getFileContentType, getContentTypeRemoteFile, getFileNameFromPath } from 'utils/files'; import { FrameSelectionMethod } from 'components/create-job-page/job-form'; -import { ArgumentError } from 'cvat-core/src/exceptions'; import BasicConfigurationForm, { BaseConfiguration } from './basic-configuration-form'; import ProjectSearchField from './project-search-field'; import ProjectSubsetField from './project-subset-field'; @@ -441,7 +440,7 @@ class CreateTaskContent extends React.PureComponent => new Promise((resolve, reject) => { - const { projectId, quality } = this.state; + const { projectId } = this.state; if (!this.validateLabelsOrProject()) { notification.error({ message: 'Could not create a task', @@ -452,21 +451,6 @@ class CreateTaskContent extends React.PureComponent { - const promises = []; + const promises: Promise[] = []; if (this.advancedConfigurationComponent.current) { promises.push(this.advancedConfigurationComponent.current.submit()); @@ -495,7 +479,33 @@ class CreateTaskContent extends React.PureComponent((_resolve, _reject) => { + Promise.all(promises).then(() => { + const { quality, advanced } = this.state; + if ( + quality.validationMode === ValidationMode.HONEYPOTS && + advanced.sortingMethod !== SortingMethod.RANDOM + ) { + this.setState({ + advanced: { + ...advanced, + sortingMethod: SortingMethod.RANDOM, + }, + }, () => { + _resolve(); + notification.info({ + message: 'Task parameters were automatically updated', + description: 'Sorting method has been updated as Honeypots' + + ' quality method only supports RANDOM sorting', + }); + }); + } else { + _resolve(); + } + }).catch(_reject); + }); + + return formIsValid; }).then(() => { if (projectId) { return core.projects.get({ id: projectId }).then((response) => { @@ -779,21 +789,6 @@ class CreateTaskContent extends React.PureComponent; initialValues: QualityConfiguration; frameSelectionMethod: FrameSelectionMethod; - onChangeFrameSelectionMethod: (method: FrameSelectionMethod) => void; validationMode: ValidationMode; + onSubmit(values: QualityConfiguration): Promise; + onChangeFrameSelectionMethod: (method: FrameSelectionMethod) => void; onChangeValidationMode: (method: ValidationMode) => void; } @@ -44,9 +45,18 @@ export default class QualityConfigurationForm extends React.PureComponent public submit(): Promise { const { onSubmit } = this.props; if (this.formRef.current) { - return this.formRef.current.validateFields().then((values: QualityConfiguration) => { - onSubmit(values); - }); + return this.formRef.current.validateFields().then((values: QualityConfiguration) => onSubmit({ + ...values, + frameSelectionMethod: values.validationMode === ValidationMode.HONEYPOTS ? + FrameSelectionMethod.RANDOM : values.frameSelectionMethod, + ...(typeof values.validationFramesPercent === 'number' ? { + validationFramesPercent: values.validationFramesPercent / 100, + } : {}), + ...(typeof values.validationFramesPerJobPercent === 'number' ? { + validationFramesPerJobPercent: values.validationFramesPerJobPercent / 100, + } : {}), + }), + ); } return Promise.reject(new Error('Quality form ref is empty')); @@ -78,57 +88,54 @@ export default class QualityConfigurationForm extends React.PureComponent { - (frameSelectionMethod === FrameSelectionMethod.RANDOM) ? - ( - - +value} - rules={[ - { required: true, message: 'The field is required' }, - { - type: 'number', min: 0, max: 100, message: 'Value is not valid', - }, - ]} - > - } - /> - - - ) : ('') + frameSelectionMethod === FrameSelectionMethod.RANDOM && ( + + +value} + rules={[ + { required: true, message: 'The field is required' }, + { + type: 'number', min: 0, max: 100, message: 'Value is not valid', + }, + ]} + > + } + /> + + + ) } - { - (frameSelectionMethod === FrameSelectionMethod.RANDOM_PER_JOB) ? - ( - - +value} - rules={[ - { required: true, message: 'The field is required' }, - { - type: 'number', min: 0, max: 100, message: 'Value is not valid', - }, - ]} - > - } - /> - - - ) : ('') + frameSelectionMethod === FrameSelectionMethod.RANDOM_PER_JOB && ( + + +value} + rules={[ + { required: true, message: 'The field is required' }, + { + type: 'number', min: 0, max: 100, message: 'Value is not valid', + }, + ]} + > + } + /> + + + ) } ); @@ -137,15 +144,6 @@ export default class QualityConfigurationForm extends React.PureComponent private honeypotsParamsBlock(): JSX.Element { return ( - -