diff --git a/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigForm.css b/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigForm.css new file mode 100644 index 000000000..043e4145c --- /dev/null +++ b/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigForm.css @@ -0,0 +1,7 @@ +.configRow { + padding: 15px; +} + +.configRow:nth-child(odd) { + background-color: #F9F9F9; +} diff --git a/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigForm.js b/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigForm.js index 86dab1731..463619cde 100644 --- a/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigForm.js +++ b/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigForm.js @@ -1,98 +1,109 @@ -import React, { Component } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import { reduxForm, FieldArray, getFormValues } from 'redux-form'; +import { reduxForm, getFormValues } from 'redux-form'; import { connect } from 'react-redux'; import { FormattedMessage } from 'react-intl'; import { Alert } from 'react-bootstrap'; +import FormBox from '../../widgets/FormBox'; import EditExerciseSimpleConfigTest from './EditExerciseSimpleConfigTest'; import SubmitButton from '../SubmitButton'; import ResourceRenderer from '../../helpers/ResourceRenderer'; import { createGetSupplementaryFiles } from '../../../redux/selectors/supplementaryFiles'; -class EditExerciseSimpleConfigForm extends Component { - render() { - const { - anyTouched, - submitting, - handleSubmit, - hasFailed = false, - hasSucceeded = false, - invalid, - formValues, - supplementaryFiles, - exerciseTests - } = this.props; - return ( -
- {hasFailed && - - - } - - {(...files) => - + + } + unlimitedHeight + noPadding + success={submitSucceeded} + dirty={dirty} + footer={ +
+ + ), + submitting: ( + + ), + success: ( + + ) + }} + /> +
+ } + > + {submitFailed && + + + } + + {(...files) => +
+ {exerciseTests.map((test, i) => + } - - -

- - ), - submitting: ( - - ), - success: ( - - ) - }} - /> -

-
- ); - } -} + testName={test.name} + test={`config.${i}`} + i={i} + /> + )} +
} + + ; EditExerciseSimpleConfigForm.propTypes = { initialValues: PropTypes.object, - values: PropTypes.array, handleSubmit: PropTypes.func.isRequired, anyTouched: PropTypes.bool, submitting: PropTypes.bool, hasFailed: PropTypes.bool, hasSucceeded: PropTypes.bool, + dirty: PropTypes.bool, + submitFailed: PropTypes.bool, + submitSucceeded: PropTypes.bool, invalid: PropTypes.bool, - exercise: PropTypes.shape({ - id: PropTypes.string.isRequired - }), formValues: PropTypes.object, supplementaryFiles: ImmutablePropTypes.map, exerciseTests: PropTypes.array @@ -186,6 +197,14 @@ export default connect((state, { exercise }) => { })( reduxForm({ form: 'editExerciseSimpleConfig', + enableReinitialize: true, + keepDirtyOnReinitialize: true, + immutableProps: [ + 'formValues', + 'supplementaryFiles', + 'exerciseTests', + 'handleSubmit' + ], validate })(EditExerciseSimpleConfigForm) ); diff --git a/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTest.js b/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTest.js index 04dc3e717..5dc56dd1b 100644 --- a/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTest.js +++ b/src/components/forms/EditExerciseSimpleConfigForm/EditExerciseSimpleConfigTest.js @@ -12,6 +12,8 @@ import { CheckboxField } from '../Fields'; +import './EditExerciseSimpleConfigForm.css'; + const messages = defineMessages({ normal: { id: 'recodex-judge-normal', @@ -52,11 +54,11 @@ const messages = defineMessages({ }); const EditExerciseSimpleConfigTest = ({ - fields, - prefix, supplementaryFiles, formValues, - exerciseTests, + testName, + test, + i, intl }) => { const supplementaryFilesOptions = [{ key: '', name: '...' }].concat( @@ -69,225 +71,222 @@ const EditExerciseSimpleConfigTest = ({ })) ); return ( -
- {fields.map((test, i) => -
- - -

- {exerciseTests[i].name} -

- -
- - -

- -

- - } - rightLabel={ - - } +
+ + +

+ {testName} +

+ +
+ + +

+ +

+ - - } + } + rightLabel={ + - - -

- -

- - } + } + /> + + } + /> + + +

+ +

+ - - -

+ } + /> + + +

+ +

+ + } + /> + {formValues && + formValues.config && + formValues.config[i] && + (formValues.config[i].useOutFile === true || + formValues.config[i].useOutFile === 'true') && + - - - } + } + />} + - {formValues && - formValues.config && - formValues.config[i] && - (formValues.config[i].useOutFile === true || - formValues.config[i].useOutFile === 'true') && - - } - />} - + + +

+ +

+ + } + /> + {formValues && + formValues.config && + formValues.config[i] && + (formValues.config[i].useCustomJudge === true || + formValues.config[i].useCustomJudge === 'true') + ? } /> - - -

- -

- } - /> - {formValues && - formValues.config && - formValues.config[i] && - (formValues.config[i].useCustomJudge === true || - formValues.config[i].useCustomJudge === 'true') - ? - } - /> - : - } - />} - {formValues && - formValues.config && - formValues.config[i] && - (formValues.config[i].useCustomJudge === true || - formValues.config[i].useCustomJudge === 'true') && - - } - />} - -
-
- )} + />} + {formValues && + formValues.config && + formValues.config[i] && + (formValues.config[i].useCustomJudge === true || + formValues.config[i].useCustomJudge === 'true') && + + } + />} + +
); }; EditExerciseSimpleConfigTest.propTypes = { - fields: PropTypes.object.isRequired, - prefix: PropTypes.string.isRequired, + testName: PropTypes.string.isRequired, + test: PropTypes.string.isRequired, + i: PropTypes.number.isRequired, supplementaryFiles: PropTypes.array.isRequired, exerciseTests: PropTypes.array, formValues: PropTypes.object, diff --git a/src/components/forms/EditSimpleLimitsForm/EditSimpleLimitsForm.js b/src/components/forms/EditSimpleLimitsForm/EditSimpleLimitsForm.js index 312bd8eee..081bea7d5 100644 --- a/src/components/forms/EditSimpleLimitsForm/EditSimpleLimitsForm.js +++ b/src/components/forms/EditSimpleLimitsForm/EditSimpleLimitsForm.js @@ -38,6 +38,7 @@ const EditSimpleLimitsForm = ({ /> } unlimitedHeight + noPadding success={submitSucceeded} dirty={dirty} footer={ diff --git a/src/components/forms/Fields/ExpandingInputFilesField.js b/src/components/forms/Fields/ExpandingInputFilesField.js index 50e80442b..59ce70d43 100644 --- a/src/components/forms/Fields/ExpandingInputFilesField.js +++ b/src/components/forms/Fields/ExpandingInputFilesField.js @@ -61,7 +61,7 @@ class ExpandingInputFilesField extends Component { leftLabel = '', rightLabel = '', input: { onChange, ...input }, - meta: { touched, error }, + meta: { dirty, error }, style = {}, options, ...props @@ -71,7 +71,7 @@ class ExpandingInputFilesField extends Component { return ( @@ -119,12 +119,7 @@ class ExpandingInputFilesField extends Component { {error && - {' '}{touched - ? error - : }{' '} + {' '}{error}{' '} } ); diff --git a/src/components/forms/Fields/ExpandingSelectField.js b/src/components/forms/Fields/ExpandingSelectField.js index cabf21e58..1ad08eda5 100644 --- a/src/components/forms/Fields/ExpandingSelectField.js +++ b/src/components/forms/Fields/ExpandingSelectField.js @@ -45,7 +45,7 @@ class ExpandingSelectField extends Component { const { label = '', input: { name, onChange }, - meta: { touched, error }, + meta: { dirty, error }, options, style = {}, ...props @@ -55,7 +55,7 @@ class ExpandingSelectField extends Component { return ( {label}
@@ -78,12 +78,7 @@ class ExpandingSelectField extends Component {
{' '} {error && - {' '}{touched - ? error - : }{' '} + {' '}{error}{' '} }
); diff --git a/src/components/forms/Fields/ExpandingTextField.js b/src/components/forms/Fields/ExpandingTextField.js index df9728b0c..1d77f276a 100644 --- a/src/components/forms/Fields/ExpandingTextField.js +++ b/src/components/forms/Fields/ExpandingTextField.js @@ -49,7 +49,7 @@ class ExpandingTextField extends Component { const { label = '', input: { onChange }, - meta: { touched, error }, + meta: { dirty, error }, style = {}, ...props } = this.props; @@ -58,7 +58,7 @@ class ExpandingTextField extends Component { return ( {label}
@@ -75,12 +75,7 @@ class ExpandingTextField extends Component {
{' '} {error && - {' '}{touched - ? error - : }{' '} + {' '}{error}{' '} }
); diff --git a/src/components/forms/Fields/SelectField.js b/src/components/forms/Fields/SelectField.js index 4b56e79a0..d75780a97 100644 --- a/src/components/forms/Fields/SelectField.js +++ b/src/components/forms/Fields/SelectField.js @@ -11,7 +11,7 @@ import { const SelectField = ({ input, - meta: { touched, error }, + meta: { touched, dirty, error }, label, options, addEmptyOption = false, @@ -20,7 +20,7 @@ const SelectField = ({ }) => {label} @@ -38,12 +38,7 @@ const SelectField = ({ {error && - {touched - ? error - : } + {' '}{error}{' '} } ; @@ -51,7 +46,11 @@ SelectField.propTypes = { input: PropTypes.shape({ name: PropTypes.string.isRequired }).isRequired, - meta: PropTypes.shape({ error: PropTypes.any, touched: PropTypes.bool }), + meta: PropTypes.shape({ + error: PropTypes.any, + dirty: PropTypes.bool, + touched: PropTypes.bool + }), type: PropTypes.string, label: PropTypes.oneOfType([ PropTypes.string, diff --git a/src/helpers/exerciseSimpleForm.js b/src/helpers/exerciseSimpleForm.js index 230e154fa..28cf94038 100644 --- a/src/helpers/exerciseSimpleForm.js +++ b/src/helpers/exerciseSimpleForm.js @@ -170,10 +170,13 @@ export const transformAndSendConfigValues = ( formData, pipelines, environments, + sortedTests, setConfig ) => { let testVars = []; - for (const test of formData.config) { + for (let testIndex = 0; testIndex < sortedTests.length; ++testIndex) { + const test = formData.config[testIndex]; + const testName = sortedTests[testIndex].name; let variables = []; variables.push({ @@ -234,7 +237,7 @@ export const transformAndSendConfigValues = ( }); testVars.push({ - name: test.name, + name: testName, variables: variables, producesFiles: test.useOutFile }); diff --git a/src/locales/cs.json b/src/locales/cs.json index b284a9554..53e011e3f 100644 --- a/src/locales/cs.json +++ b/src/locales/cs.json @@ -140,6 +140,9 @@ "app.createGroup.isPublic": "Studenti se mohou sami přidávat k této skupině", "app.createGroup.publicStats": "Studenti mohou vidět dosažené body ostatních", "app.createGroup.threshold": "Minimální procentuální hranice potřebná ke splnění tohoto kurzu:", + "app.createGroup.validation.emptyDescription": "Group description cannot be empty.", + "app.createGroup.validation.emptyName": "Název skupiny nemůže být prázdný.", + "app.createGroup.validation.nameCollision": "Jméno \"{name}\" je již obsazené, prosíme vyberte jiné.", "app.createGroup.validation.thresholdBetweenZeroHundred": "Procentuální hranice musí být celé číslo od 0 do 100.", "app.createGroup.validation.thresholdMustBeInteger": "Procentuální hranice musí být celé číslo.", "app.createGroupForm.validation.noLocalizedText": "Please add at least one localized text describing the group.", @@ -155,6 +158,7 @@ "app.editAssignment.deleteAssignmentWarning": "Smazání zadané úlohy odstraní všechna studentská řešní. Pro případné obnovení těchto dat prosím kontaktujte správce ReCodExu.", "app.editAssignment.description": "Změnit nastavení zadání úlohy včetně jejích limitů", "app.editAssignment.title": "Upravit zadání úlohy", + "app.editAssignmentForm.addLanguage": "Add language variant", "app.editAssignmentForm.allowSecondDeadline": "Povolit druhý termín odevzdání.", "app.editAssignmentForm.canViewLimitRatios": "Viditelnost poměrů dosažených výsledků vůči limitům", "app.editAssignmentForm.chooseFirstDeadlineBeforeSecondDeadline": "Před nastavením druhého termínu odevzdání je nutné zvolit první termín.", @@ -166,9 +170,16 @@ "app.editAssignmentForm.localized.assignment": "Zadání úlohy a popis pro studenty:", "app.editAssignmentForm.localized.locale": "Jazyková mutace:", "app.editAssignmentForm.localized.name": "Name:", + "app.editAssignmentForm.localized.noLanguage": "There is currently no text in any language for this assignment.", + "app.editAssignmentForm.localized.reallyRemoveQuestion": "Do you really want to delete the assignmenet in this language?", + "app.editAssignmentForm.localized.remove": "Remove this language", "app.editAssignmentForm.maxPointsBeforeFirstDeadline": "Maximální počet bodů pro řešení odevzdaná před prvním termínem:", "app.editAssignmentForm.maxPointsBeforeSecondDeadline": "Maximální počet bodů pro řešení odevzdaná před druhým termínem:", + "app.editAssignmentForm.moreAboutScoreConfig": "Read more about score configuration syntax.", + "app.editAssignmentForm.name": "Assignment default name:", + "app.editAssignmentForm.newLocale": "New language", "app.editAssignmentForm.pointsPercentualThreshold": "Minimální procentuální správnost řešení, za kterou lze získat nějaké body:", + "app.editAssignmentForm.scoreConfig": "Score configuration:", "app.editAssignmentForm.secondDeadline": "Druhý termín odevzdání:", "app.editAssignmentForm.submissionsCountLimit": "Počet pokusů odevzdání:", "app.editAssignmentForm.submit": "Upravit nastavení", @@ -189,6 +200,16 @@ "app.editAssignmentForm.validation.secondDeadline": "Prosíme vyplňte datum a čas druhého termínu odevzdání.", "app.editAssignmentForm.validation.secondDeadlineBeforeFirstDeadline": "Prosíme vyplňte datum a čas druhého termínu odevzdání, které je po {firstDeadline, date} {firstDeadline, time, short}.", "app.editAssignmentForm.validation.submissionsCountLimit": "Prosíme vyplňte maximální počet odevzdaných řešení jako kladné celé číslo.", + "app.editAssignmentLimitsForm.failed": "Saving failed. Please try again later.", + "app.editAssignmentLimitsForm.submit": "Change limits", + "app.editAssignmentLimitsForm.submitting": "Saving limits ...", + "app.editAssignmentLimitsForm.success": "Limits were saved.", + "app.editAssignmentLimitsForm.validation.envName": "Please fill environment name.", + "app.editAssignmentLimitsForm.validation.memoryIsNotNumer": "Memory limit must be an integer.", + "app.editAssignmentLimitsForm.validation.memoryLimit": "Memory limit must be a positive integer.", + "app.editAssignmentLimitsForm.validation.timeIsNotNumer": "Time limit must be a real number.", + "app.editAssignmentLimitsForm.validation.timeLimit": "Time limit must be a positive real number.", + "app.editAssignmentLimitsForm.validation.useDotDecimalSeparator": "Please use a dot as a decimal separator instead of the comma.", "app.editEnvironmentConfigForm.failed": "Uložení se nezdařilo. Prosíme opakujte akci později.", "app.editEnvironmentConfigForm.submit": "Změnit konfiguraci", "app.editEnvironmentConfigForm.submitting": "Ukládání konfigurace ...", @@ -215,6 +236,13 @@ "app.editEnvironmentConfigVariables.stringArrayType": "Array of strings", "app.editEnvironmentConfigVariables.stringType": "Řetězec", "app.editEnvironmentConfigVariables.variables": "Proměnné:", + "app.editEnvironmentLimitsForm.box": "Box", + "app.editEnvironmentLimitsForm.environment.name": "Environment name:", + "app.editEnvironmentLimitsForm.environment.noEnvironment": "There is currently no environment specified for this assignment.", + "app.editEnvironmentLimitsForm.newEnvironment": "New environment", + "app.editEnvironmentLimitsForm.noBoxesForPipeline": "There are no boxes which need to set limits in this pipeline.", + "app.editEnvironmentLimitsForm.noPipelinesForTest": "There are no pipelines for this test to edit.", + "app.editEnvironmentLimitsForm.pipeline": "Pipeline", "app.editEnvironmentLimitsForm.submit": "Save changes to {env}", "app.editEnvironmentLimitsForm.submitting": "Saving changes ...", "app.editEnvironmentLimitsForm.success": "Saved.", @@ -248,14 +276,17 @@ "app.editExerciseConfigEnvironment.reallyRemoveQuestion": "Opravdu chcete smazat tuto konfiguraci prostředí?", "app.editExerciseConfigForm.addTest": "Přidat nový test", "app.editExerciseConfigForm.failed": "Uložení se nezdařilo. Prosíme opakujte akci později.", + "app.editExerciseConfigForm.fileType": "File", "app.editExerciseConfigForm.pipelines": "Pipeliny", "app.editExerciseConfigForm.removeLastTest": "Odstranit poslední test", + "app.editExerciseConfigForm.stringType": "String", "app.editExerciseConfigForm.submit": "Změnit konfiguraci", "app.editExerciseConfigForm.submitting": "Ukládání konfigurace ...", "app.editExerciseConfigForm.success": "Konfigurace byla uložena.", "app.editExerciseConfigForm.validation.duplicatePipeline": "Please select a different pipeline.", "app.editExerciseConfigForm.validation.noEnvironments": "Please add at least one environment config for the exercise.", "app.editExerciseConfigForm.variables": "Proměnné", + "app.editExerciseForm.description": "Description for supervisors:", "app.editExerciseForm.difficulty": "Obtížnost", "app.editExerciseForm.easy": "Snadné", "app.editExerciseForm.failed": "Uložení se nezdařilo. Prosim, opakujte akci později.", @@ -264,6 +295,7 @@ "app.editExerciseForm.isLocked": "Exercise is locked (visible, but cannot be assigned to any group).", "app.editExerciseForm.isPublic": "Úloha je veřejná a může být použita cvičícími.", "app.editExerciseForm.medium": "Průměrné", + "app.editExerciseForm.name": "Exercise name:", "app.editExerciseForm.submit": "Upravit nastavení", "app.editExerciseForm.submitting": "Ukládání změn ...", "app.editExerciseForm.success": "Nastavení bylo uloženo.", @@ -278,6 +310,28 @@ "app.editExerciseForm.validation.noLocalizedText": "Prosíme přidejte alespoň jeden lokalizovaný text popisující tuto úlohu.", "app.editExerciseForm.validation.sameLocalizedTexts": "Je vyplněno více jazykových variant pro jednu lokalizaci. Prosím ujistěte se, že lokalizace jsou unikátní.", "app.editExerciseForm.validation.versionDiffers": "Někdo změnil tuto úlohu v průběhu její editace. Prosíme obnovte si tuto stránku a proveďte své změny znovu.", + "app.editExerciseLimitsForm.failed": "Saving failed. Please try again later.", + "app.editExerciseLimitsForm.submit": "Change limits", + "app.editExerciseLimitsForm.submitting": "Saving limits ...", + "app.editExerciseLimitsForm.success": "Limits were saved.", + "app.editExerciseLimitsForm.validation.envName": "Please fill environment name.", + "app.editExerciseLimitsForm.validation.memoryIsNotNumer": "Memory limit must be an integer.", + "app.editExerciseLimitsForm.validation.memoryLimit": "Memory limit must be a positive integer.", + "app.editExerciseLimitsForm.validation.timeIsNotNumer": "Time limit must be a real number.", + "app.editExerciseLimitsForm.validation.timeLimit": "Time limit must be a positive real number.", + "app.editExerciseLimitsForm.validation.useDotDecimalSeparator": "Please use a dot as a decimal separator instead of the comma.", + "app.editExerciseRuntimeConfigsForm.failed": "Saving failed. Please try again later.", + "app.editExerciseRuntimeConfigsForm.submit": "Change runtime configurations", + "app.editExerciseRuntimeConfigsForm.submitting": "Saving runtime configurations ...", + "app.editExerciseRuntimeConfigsForm.success": "Runtime configurations were saved.", + "app.editExerciseRuntimeConfigsForm.validation.empty": "Please fill the runtime environment information.", + "app.editExerciseRuntimeConfigsForm.validation.jobConfig": "Please fill the job configuration of the runtime environment.", + "app.editExerciseRuntimeConfigsForm.validation.name": "Please fill the display name of the runtime environment.", + "app.editExerciseRuntimeConfigsForm.validation.runtimeEnvironmentId": "Please select a runtime environment.", + "app.editExerciseSimpleConfigEnvironment.addConfigTab": "Add new runtime configuration", + "app.editExerciseSimpleConfigEnvironment.emptyConfigTabs": "There is currently no runtime configuration.", + "app.editExerciseSimpleConfigEnvironment.newEnvironment": "New environment", + "app.editExerciseSimpleConfigEnvironment.reallyRemoveQuestion": "Do you really want to delete this runtime configuration?", "app.editExerciseSimpleConfigForm.submit": "Change configuration", "app.editExerciseSimpleConfigForm.submitting": "Saving configuration ...", "app.editExerciseSimpleConfigForm.success": "Configuration was changed.", @@ -299,6 +353,7 @@ "app.editExerciseSimpleConfigTests.judgeTitle": "Judge", "app.editExerciseSimpleConfigTests.outputFile": "Output file:", "app.editExerciseSimpleConfigTests.outputTitle": "Output", + "app.editExerciseSimpleConfigTests.runtimeEnvironment": "Runtime environment:", "app.editExerciseSimpleConfigTests.useCustomJudge": "Use custom judge binary", "app.editExerciseSimpleConfigTests.useOutfile": "Use output file instead of stdout", "app.editGroup.cannotDeleteRootGroup": "Toto je primární skupina a jako taková nemůže být smazána.", @@ -314,6 +369,7 @@ "app.editGroupForm.set": "Upravit skupinu", "app.editGroupForm.success": "Nastavení skupiny bylo uloženo.", "app.editGroupForm.successNew": "Create group", + "app.editGroupForm.title": "Edit group", "app.editGroupForm.titleEdit": "Edit group", "app.editGroupForm.titleNew": "Create new group", "app.editGroupForm.validation.emptyName": "Please fill the name of the group.", @@ -356,6 +412,14 @@ "app.editPipelineForm.validation.description": "Prosíme vyplňte popis této pipeliny.", "app.editPipelineForm.validation.emptyName": "Prosíme vyplňte název této pipeliny.", "app.editPipelineForm.validation.versionDiffers": "Někdo jiný změnit nastavení této pipeliny v průběhu vaší editace. Prosíme znovu načtěte tuto stránku a aplikujte své změny znovu.", + "app.editRuntimeConfigForm.addConfigTab": "Add new runtime configuration", + "app.editRuntimeConfigForm.configName": "Name of Configuration:", + "app.editRuntimeConfigForm.emptyConfigTabs": "There is currently no runtime configuration.", + "app.editRuntimeConfigForm.jobConfig": "Job Configuration:", + "app.editRuntimeConfigForm.moreAboutJobConfig": "Read more about job configuration syntax.", + "app.editRuntimeConfigForm.newConfig": "New configuration", + "app.editRuntimeConfigForm.reallyRemoveQuestion": "Do you really want to delete this runtime configuration?", + "app.editRuntimeConfigForm.runtimeEnvironment": "Select runtime environment:", "app.editScoreConfigForm.failed": "Saving failed. Please try again later.", "app.editScoreConfigForm.scoreConfig": "Score configuration:", "app.editScoreConfigForm.submit": "Change configuration", @@ -393,6 +457,8 @@ "app.editUserProfile.validation.emptyFirstName": "Jméno nemůže být prázdné.", "app.editUserProfile.validation.emptyLastName": "Příjmení nemůže být prázdné.", "app.editUserProfile.validation.emptyNewPassword": "Nové heslo nemůže být prázdné pokud si měníte heslo.", + "app.editUserProfile.validation.emptyOldPassword": "Old password cannot be empty if you want to change your password.", + "app.editUserProfile.validation.passwordTooWeak": "The password you chose is too weak, please choose a different one.", "app.editUserProfile.validation.passwordsDontMatch": "Hesla se neshodují.", "app.editUserProfile.validation.samePasswords": "Změnit Vaše heslo na stejné nedává žádný smysl.", "app.editUserProfile.validation.shortFirstName": "First name must contain at least 2 characters.", @@ -479,6 +545,16 @@ "app.exercise.referenceSolutionsBox": "Referenční řešení", "app.exercise.runtimes": "Podporovaná běhová prostředí:", "app.exercise.updatedAt": "Naposledy změněno:", + "app.exercise.uploadReferenceSolution.createButton": "Create account", + "app.exercise.uploadReferenceSolution.createSuccessful": "Solution created successfully.", + "app.exercise.uploadReferenceSolution.creatingButtonText": "Creating solution ...", + "app.exercise.uploadReferenceSolution.creationFailed": "Solution was rejected by the server.", + "app.exercise.uploadReferenceSolution.instructions": "You must attach at least one file with source code and wait, until all your files are uploaded to the server. If there is a problem uploading any of the files, please try uploading it again or remove the file. This form cannot be submitted until there are any files which have not been successfully uploaded or which could not have been uploaded to the server.", + "app.exercise.uploadReferenceSolution.noteLabel": "Description of the provided exercise solution", + "app.exercise.uploadReferenceSolution.resetFormButton": "Reset form", + "app.exercise.uploadReferenceSolution.runtimeConfigs": "Runtime Configuration:", + "app.exercise.uploadReferenceSolution.validation.emptyNote": "Description of the solution cannot be empty.", + "app.exercise.uploadReferenceSolution.validation.runtimeId": "Please select one of the runtime configurations.", "app.exercise.uploadReferenceSolutionBox": "Vytvořit referenční řešení", "app.exercise.version": "Verze:", "app.exercises.add": "Přidat úlohu", @@ -566,6 +642,11 @@ "app.filesTable.title": "Attached files", "app.footer.copyright": "Copyright © 2016-2017 ReCodEx. Všechna práva vyhrazena.", "app.footer.version": "Verze {version}", + "app.forkExerciseButton.confirmation": "Opravdu chcete zduplokovat tuto úlohu?", + "app.forkExerciseButton.failed": "Zkuste zduplikovat tuto úlohu znovu", + "app.forkExerciseButton.fork": "Zduplikovat úlohu", + "app.forkExerciseButton.loading": "Duplikování ...", + "app.forkExerciseButton.success": "Ukázat zduplikovanou úlohu", "app.forkPipelineButton.success": "Show the forked pipeline", "app.forkPipelineForm.failed": "Saving failed. Please try again later.", "app.forkPipelineForm.submit": "Fork pipeline", @@ -603,6 +684,10 @@ "app.groups.removeGroupAdminButton": "Remove group admin", "app.groups.removeSupervisorButton": "Odebrat cvičícího", "app.groupsName.loading": "Načítání ...", + "app.hardwareGroupFields.memoryLimit": "Memory limit for \"{taskId}\":", + "app.hardwareGroupFields.noReferenceSolutions": "There are no reference solutions' evaluations' for test '{testName}' and its task '{taskId}'.", + "app.hardwareGroupFields.test": "Test:", + "app.hardwareGroupFields.timeLimit": "Time limit for \"{taskId}\":", "app.header.toggleSidebar": "Zobrazit/skrýt boční panel", "app.header.toggleSidebarSize": "Zvětšit/zmenšit boční panel", "app.headerNotification.copiedToClippboard": "Copied to clippboard.", @@ -647,6 +732,15 @@ "app.login.description": "Prosíme zadejte své přihlašovací údaje", "app.login.resetPassword": "Obnovte si své heslo.", "app.login.title": "Přihlásit se", + "app.loginCASForm.failed": "Login failed. Please check your credentials.", + "app.loginCASForm.login": "Sign in", + "app.loginCASForm.password": "Password:", + "app.loginCASForm.processing": "Signing in ...", + "app.loginCASForm.success": "You are successfully signed in", + "app.loginCASForm.title": "Sign into ReCodEx using CAS UK", + "app.loginCASForm.ukco": "UKCO (student's number):", + "app.loginCASForm.validation.emptyPassword": "Password cannot be empty.", + "app.loginCASForm.validation.emptyUKCO": "UKCO address cannot be empty.", "app.loginForm.email": "E-mailová adresa:", "app.loginForm.failed": "Přihlášení selhalo. Prosíme zkontrolujte své přihlašovací údaje.", "app.loginForm.login": "Přihlásit se", @@ -790,6 +884,12 @@ "app.referenceSolutionDetail.title.details": "Detail referenčního řešení", "app.referenceSolutionDetail.uploadedAt": "Nahráno:", "app.referenceSolutionEvaluation.title": "Evaluations of reference solution", + "app.referenceSolutionEvaluation.titlePrefix": "Evaluations for runtime:", + "app.referenceSolutionsEvaluations.description": "Description", + "app.referenceSolutionsEvaluations.evaluatedAt": "Evaluated on", + "app.referenceSolutionsEvaluations.memory": "Memory", + "app.referenceSolutionsEvaluations.time": "Time", + "app.referenceSolutionsEvaluations.title": "Reference solutions' evaluations", "app.registration.description": "Začněte dnes používat ReCodEx", "app.registration.title": "Vytvořte si nový účet v ReCodExu", "app.registrationForm.createAccount": "Vytvořit účet", @@ -810,6 +910,7 @@ "app.registrationForm.validation.emptyLastName": "Příjmení nemůže být prázdné.", "app.registrationForm.validation.emptyPassword": "Heslo nemůže být prázdné.", "app.registrationForm.validation.passwordDontMatch": "Passwords don't match.", + "app.registrationForm.validation.passwordTooWeak": "The password you chose is too weak, please choose a different one.", "app.registrationForm.validation.shortFirstName": "First name must contain at least 2 characters.", "app.registrationForm.validation.shortLastName": "Last name must contain at least 2 characters.", "app.removeFromGroup.confirm": "Are you sure you want to remove the user from this group?", @@ -948,7 +1049,10 @@ "app.sudebar.menu.supervisor.title": "Cvičící", "app.supplementaryFiles.deleteButton": "Delete", "app.supplementaryFiles.deleteConfirm": "Are you sure you want to delete the file? This cannot be undone.", + "app.supplementaryFilesTable.addFiles": "Save supplementary files", "app.supplementaryFilesTable.description": "Soubory úlohy jsou soubory, které mohou být použity v nastavení úlohy jako vstupy nebo vzorové výstupy.", + "app.supplementaryFilesTable.empty": "There are no supplementary files attached to this exercise yet.", + "app.supplementaryFilesTable.fileHashName": "Hash Name", "app.supplementaryFilesTable.fileName": "Původní název", "app.supplementaryFilesTable.fileSize": "Velikost souboru", "app.supplementaryFilesTable.fileUploadedAt": "Nahrán", @@ -979,13 +1083,13 @@ "app.usersName.notVerified.title": "Tento účet nemá ověřenou emailovou adresu.", "app.usersStats.description": "Body získané ve skupině {name}.", "app.usersname.notVerified.description": "Tento uživatel si neověřil svou emailovou adresu přes aktivační odkaz, který mu byl na tuto adresu zaslán.", - "diff": "Diff", - "recodex-judge-float": "Floating point judge", - "recodex-judge-float-newline": "Floating judge ignoring newlines", - "recodex-judge-normal": "Normal judge", - "recodex-judge-normal-newline": "Normal judge ignoring newlines", - "recodex-judge-shuffle": "Shuffle judge", - "recodex-judge-shuffle-all": "Shuffle judge ignoring all", - "recodex-judge-shuffle-newline": "Shuffle judge ignoring newlines", - "recodex-judge-shuffle-rows": "Shuffle judge ignoring rows" + "diff": "Binary-safe judge", + "recodex-judge-float": "Float-numbers judge", + "recodex-judge-float-newline": "Float-numbers judge (ignoring ends of lines)", + "recodex-judge-normal": "Token judge", + "recodex-judge-normal-newline": "Token judge (ignoring ends of lines)", + "recodex-judge-shuffle": "Unordered-tokens judge", + "recodex-judge-shuffle-all": "Unordered-tokens-and-rows judge", + "recodex-judge-shuffle-newline": "Unordered-tokens judge (ignoring ends of lines)", + "recodex-judge-shuffle-rows": "Unordered-rows judge" } \ No newline at end of file diff --git a/src/locales/en.json b/src/locales/en.json index 52bded61d..e3d77e98a 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -140,6 +140,9 @@ "app.createGroup.isPublic": "Students can join the group themselves", "app.createGroup.publicStats": "Students can see statistics of each other", "app.createGroup.threshold": "Minimum percent of the total points count needed to complete the course:", + "app.createGroup.validation.emptyDescription": "Group description cannot be empty.", + "app.createGroup.validation.emptyName": "Group name cannot be empty.", + "app.createGroup.validation.nameCollision": "The name \"{name}\" is already used, please choose a different one.", "app.createGroup.validation.thresholdBetweenZeroHundred": "Threshold must be an integer in between 0 and 100.", "app.createGroup.validation.thresholdMustBeInteger": "Threshold must be an integer.", "app.createGroupForm.validation.noLocalizedText": "Please add at least one localized text describing the group.", @@ -155,6 +158,7 @@ "app.editAssignment.deleteAssignmentWarning": "Deleting an assignment will remove all the students submissions and you will have to contact the administrator of ReCodEx if you wanted to restore the assignment in the future.", "app.editAssignment.description": "Change assignment settings and limits", "app.editAssignment.title": "Edit assignment settings", + "app.editAssignmentForm.addLanguage": "Add language variant", "app.editAssignmentForm.allowSecondDeadline": "Allow second deadline.", "app.editAssignmentForm.canViewLimitRatios": "Visibility of memory and time ratios", "app.editAssignmentForm.chooseFirstDeadlineBeforeSecondDeadline": "You must select the date of the first deadline before selecting the date of the second deadline.", @@ -166,9 +170,16 @@ "app.editAssignmentForm.localized.assignment": "Description for the students:", "app.editAssignmentForm.localized.locale": "The language:", "app.editAssignmentForm.localized.name": "Name:", + "app.editAssignmentForm.localized.noLanguage": "There is currently no text in any language for this assignment.", + "app.editAssignmentForm.localized.reallyRemoveQuestion": "Do you really want to delete the assignmenet in this language?", + "app.editAssignmentForm.localized.remove": "Remove this language", "app.editAssignmentForm.maxPointsBeforeFirstDeadline": "Maximum amount of points received when submitted before the deadline:", "app.editAssignmentForm.maxPointsBeforeSecondDeadline": "Maximum amount of points received when submitted before the second deadline:", + "app.editAssignmentForm.moreAboutScoreConfig": "Read more about score configuration syntax.", + "app.editAssignmentForm.name": "Assignment default name:", + "app.editAssignmentForm.newLocale": "New language", "app.editAssignmentForm.pointsPercentualThreshold": "Minimum percentage of points which submissions have to gain:", + "app.editAssignmentForm.scoreConfig": "Score configuration:", "app.editAssignmentForm.secondDeadline": "Second deadline:", "app.editAssignmentForm.submissionsCountLimit": "Submissions count limit:", "app.editAssignmentForm.submit": "Edit settings", @@ -189,6 +200,16 @@ "app.editAssignmentForm.validation.secondDeadline": "Please fill the date and time of the second deadline.", "app.editAssignmentForm.validation.secondDeadlineBeforeFirstDeadline": "Please fill the date and time of the second deadline with a value which is after {firstDeadline, date} {firstDeadline, time, short}.", "app.editAssignmentForm.validation.submissionsCountLimit": "Please fill the submissions count limit field with a positive integer.", + "app.editAssignmentLimitsForm.failed": "Saving failed. Please try again later.", + "app.editAssignmentLimitsForm.submit": "Change limits", + "app.editAssignmentLimitsForm.submitting": "Saving limits ...", + "app.editAssignmentLimitsForm.success": "Limits were saved.", + "app.editAssignmentLimitsForm.validation.envName": "Please fill environment name.", + "app.editAssignmentLimitsForm.validation.memoryIsNotNumer": "Memory limit must be an integer.", + "app.editAssignmentLimitsForm.validation.memoryLimit": "Memory limit must be a positive integer.", + "app.editAssignmentLimitsForm.validation.timeIsNotNumer": "Time limit must be a real number.", + "app.editAssignmentLimitsForm.validation.timeLimit": "Time limit must be a positive real number.", + "app.editAssignmentLimitsForm.validation.useDotDecimalSeparator": "Please use a dot as a decimal separator instead of the comma.", "app.editEnvironmentConfigForm.failed": "Saving failed. Please try again later.", "app.editEnvironmentConfigForm.submit": "Change configuration", "app.editEnvironmentConfigForm.submitting": "Saving configuration ...", @@ -215,6 +236,13 @@ "app.editEnvironmentConfigVariables.stringArrayType": "Array of strings", "app.editEnvironmentConfigVariables.stringType": "String", "app.editEnvironmentConfigVariables.variables": "Variables:", + "app.editEnvironmentLimitsForm.box": "Box", + "app.editEnvironmentLimitsForm.environment.name": "Environment name:", + "app.editEnvironmentLimitsForm.environment.noEnvironment": "There is currently no environment specified for this assignment.", + "app.editEnvironmentLimitsForm.newEnvironment": "New environment", + "app.editEnvironmentLimitsForm.noBoxesForPipeline": "There are no boxes which need to set limits in this pipeline.", + "app.editEnvironmentLimitsForm.noPipelinesForTest": "There are no pipelines for this test to edit.", + "app.editEnvironmentLimitsForm.pipeline": "Pipeline", "app.editEnvironmentLimitsForm.submit": "Save changes to {env}", "app.editEnvironmentLimitsForm.submitting": "Saving changes ...", "app.editEnvironmentLimitsForm.success": "Saved.", @@ -248,14 +276,17 @@ "app.editExerciseConfigEnvironment.reallyRemoveQuestion": "Do you really want to delete this runtime configuration?", "app.editExerciseConfigForm.addTest": "Add new test", "app.editExerciseConfigForm.failed": "Saving failed. Please try again later.", + "app.editExerciseConfigForm.fileType": "File", "app.editExerciseConfigForm.pipelines": "Pipelines", "app.editExerciseConfigForm.removeLastTest": "Remove last test", + "app.editExerciseConfigForm.stringType": "String", "app.editExerciseConfigForm.submit": "Change configuration", "app.editExerciseConfigForm.submitting": "Saving configuration ...", "app.editExerciseConfigForm.success": "Configuration was changed.", "app.editExerciseConfigForm.validation.duplicatePipeline": "Please select a different pipeline.", "app.editExerciseConfigForm.validation.noEnvironments": "Please add at least one environment config for the exercise.", "app.editExerciseConfigForm.variables": "Variables", + "app.editExerciseForm.description": "Description for supervisors:", "app.editExerciseForm.difficulty": "Difficulty", "app.editExerciseForm.easy": "Easy", "app.editExerciseForm.failed": "Saving failed. Please try again later.", @@ -264,6 +295,7 @@ "app.editExerciseForm.isLocked": "Exercise is locked (visible, but cannot be assigned to any group).", "app.editExerciseForm.isPublic": "Exercise is public and can be assigned to students by their supervisors.", "app.editExerciseForm.medium": "Medium", + "app.editExerciseForm.name": "Exercise name:", "app.editExerciseForm.submit": "Edit settings", "app.editExerciseForm.submitting": "Saving changes ...", "app.editExerciseForm.success": "Settings were saved.", @@ -278,6 +310,28 @@ "app.editExerciseForm.validation.noLocalizedText": "Please add at least one localized text describing the exercise.", "app.editExerciseForm.validation.sameLocalizedTexts": "There are more language variants with the same locale. Please make sure locales are unique.", "app.editExerciseForm.validation.versionDiffers": "Somebody has changed the exercise while you have been editing it. Please reload the page and apply your changes once more.", + "app.editExerciseLimitsForm.failed": "Saving failed. Please try again later.", + "app.editExerciseLimitsForm.submit": "Change limits", + "app.editExerciseLimitsForm.submitting": "Saving limits ...", + "app.editExerciseLimitsForm.success": "Limits were saved.", + "app.editExerciseLimitsForm.validation.envName": "Please fill environment name.", + "app.editExerciseLimitsForm.validation.memoryIsNotNumer": "Memory limit must be an integer.", + "app.editExerciseLimitsForm.validation.memoryLimit": "Memory limit must be a positive integer.", + "app.editExerciseLimitsForm.validation.timeIsNotNumer": "Time limit must be a real number.", + "app.editExerciseLimitsForm.validation.timeLimit": "Time limit must be a positive real number.", + "app.editExerciseLimitsForm.validation.useDotDecimalSeparator": "Please use a dot as a decimal separator instead of the comma.", + "app.editExerciseRuntimeConfigsForm.failed": "Saving failed. Please try again later.", + "app.editExerciseRuntimeConfigsForm.submit": "Change runtime configurations", + "app.editExerciseRuntimeConfigsForm.submitting": "Saving runtime configurations ...", + "app.editExerciseRuntimeConfigsForm.success": "Runtime configurations were saved.", + "app.editExerciseRuntimeConfigsForm.validation.empty": "Please fill the runtime environment information.", + "app.editExerciseRuntimeConfigsForm.validation.jobConfig": "Please fill the job configuration of the runtime environment.", + "app.editExerciseRuntimeConfigsForm.validation.name": "Please fill the display name of the runtime environment.", + "app.editExerciseRuntimeConfigsForm.validation.runtimeEnvironmentId": "Please select a runtime environment.", + "app.editExerciseSimpleConfigEnvironment.addConfigTab": "Add new runtime configuration", + "app.editExerciseSimpleConfigEnvironment.emptyConfigTabs": "There is currently no runtime configuration.", + "app.editExerciseSimpleConfigEnvironment.newEnvironment": "New environment", + "app.editExerciseSimpleConfigEnvironment.reallyRemoveQuestion": "Do you really want to delete this runtime configuration?", "app.editExerciseSimpleConfigForm.submit": "Change configuration", "app.editExerciseSimpleConfigForm.submitting": "Saving configuration ...", "app.editExerciseSimpleConfigForm.success": "Configuration was changed.", @@ -299,6 +353,7 @@ "app.editExerciseSimpleConfigTests.judgeTitle": "Judge", "app.editExerciseSimpleConfigTests.outputFile": "Output file:", "app.editExerciseSimpleConfigTests.outputTitle": "Output", + "app.editExerciseSimpleConfigTests.runtimeEnvironment": "Runtime environment:", "app.editExerciseSimpleConfigTests.useCustomJudge": "Use custom judge binary", "app.editExerciseSimpleConfigTests.useOutfile": "Use output file instead of stdout", "app.editGroup.cannotDeleteRootGroup": "This is a so-called root group and it cannot be deleted.", @@ -314,6 +369,7 @@ "app.editGroupForm.set": "Edit group", "app.editGroupForm.success": "Group settings was saved.", "app.editGroupForm.successNew": "Create group", + "app.editGroupForm.title": "Edit group", "app.editGroupForm.titleEdit": "Edit group", "app.editGroupForm.titleNew": "Create new group", "app.editGroupForm.validation.emptyName": "Please fill the name of the group.", @@ -356,6 +412,14 @@ "app.editPipelineForm.validation.description": "Please fill the description of the pipeline.", "app.editPipelineForm.validation.emptyName": "Please fill the name of the pipeline.", "app.editPipelineForm.validation.versionDiffers": "Somebody has changed the pipeline while you have been editing it. Please reload the page and apply your changes once more.", + "app.editRuntimeConfigForm.addConfigTab": "Add new runtime configuration", + "app.editRuntimeConfigForm.configName": "Name of Configuration:", + "app.editRuntimeConfigForm.emptyConfigTabs": "There is currently no runtime configuration.", + "app.editRuntimeConfigForm.jobConfig": "Job Configuration:", + "app.editRuntimeConfigForm.moreAboutJobConfig": "Read more about job configuration syntax.", + "app.editRuntimeConfigForm.newConfig": "New configuration", + "app.editRuntimeConfigForm.reallyRemoveQuestion": "Do you really want to delete this runtime configuration?", + "app.editRuntimeConfigForm.runtimeEnvironment": "Select runtime environment:", "app.editScoreConfigForm.failed": "Saving failed. Please try again later.", "app.editScoreConfigForm.scoreConfig": "Score configuration:", "app.editScoreConfigForm.submit": "Change configuration", @@ -393,6 +457,8 @@ "app.editUserProfile.validation.emptyFirstName": "First name cannot be empty.", "app.editUserProfile.validation.emptyLastName": "Last name cannot be empty.", "app.editUserProfile.validation.emptyNewPassword": "New password cannot be empty if you want to change your password.", + "app.editUserProfile.validation.emptyOldPassword": "Old password cannot be empty if you want to change your password.", + "app.editUserProfile.validation.passwordTooWeak": "The password you chose is too weak, please choose a different one.", "app.editUserProfile.validation.passwordsDontMatch": "Passwords don't match.", "app.editUserProfile.validation.samePasswords": "Changing your password to the same password does not make any sense.", "app.editUserProfile.validation.shortFirstName": "First name must contain at least 2 characters.", @@ -479,6 +545,16 @@ "app.exercise.referenceSolutionsBox": "Reference solutions", "app.exercise.runtimes": "Supported runtime environments:", "app.exercise.updatedAt": "Last updated at:", + "app.exercise.uploadReferenceSolution.createButton": "Create account", + "app.exercise.uploadReferenceSolution.createSuccessful": "Solution created successfully.", + "app.exercise.uploadReferenceSolution.creatingButtonText": "Creating solution ...", + "app.exercise.uploadReferenceSolution.creationFailed": "Solution was rejected by the server.", + "app.exercise.uploadReferenceSolution.instructions": "You must attach at least one file with source code and wait, until all your files are uploaded to the server. If there is a problem uploading any of the files, please try uploading it again or remove the file. This form cannot be submitted until there are any files which have not been successfully uploaded or which could not have been uploaded to the server.", + "app.exercise.uploadReferenceSolution.noteLabel": "Description of the provided exercise solution", + "app.exercise.uploadReferenceSolution.resetFormButton": "Reset form", + "app.exercise.uploadReferenceSolution.runtimeConfigs": "Runtime Configuration:", + "app.exercise.uploadReferenceSolution.validation.emptyNote": "Description of the solution cannot be empty.", + "app.exercise.uploadReferenceSolution.validation.runtimeId": "Please select one of the runtime configurations.", "app.exercise.uploadReferenceSolutionBox": "Create reference solution", "app.exercise.version": "Version:", "app.exercises.add": "Add exercise", @@ -566,6 +642,11 @@ "app.filesTable.title": "Attached files", "app.footer.copyright": "Copyright © 2016-2017 ReCodEx. All rights reserved.", "app.footer.version": "Version {version}", + "app.forkExerciseButton.confirmation": "Do you really want to fork this exercise?", + "app.forkExerciseButton.failed": "Try forking the exercise again", + "app.forkExerciseButton.fork": "Fork the exercise", + "app.forkExerciseButton.loading": "Forking ...", + "app.forkExerciseButton.success": "Show the forked exercise", "app.forkPipelineButton.success": "Show the forked pipeline", "app.forkPipelineForm.failed": "Saving failed. Please try again later.", "app.forkPipelineForm.submit": "Fork pipeline", @@ -603,6 +684,10 @@ "app.groups.removeGroupAdminButton": "Remove group admin", "app.groups.removeSupervisorButton": "Remove supervisor", "app.groupsName.loading": "Loading ...", + "app.hardwareGroupFields.memoryLimit": "Memory limit for \"{taskId}\":", + "app.hardwareGroupFields.noReferenceSolutions": "There are no reference solutions' evaluations' for test '{testName}' and its task '{taskId}'.", + "app.hardwareGroupFields.test": "Test:", + "app.hardwareGroupFields.timeLimit": "Time limit for \"{taskId}\":", "app.header.toggleSidebar": "Show/hide sidebar", "app.header.toggleSidebarSize": "Expand/minimize sidebar", "app.headerNotification.copiedToClippboard": "Copied to clippboard.", @@ -647,6 +732,15 @@ "app.login.description": "Please fill your credentials", "app.login.resetPassword": "Reset your password.", "app.login.title": "Sign in", + "app.loginCASForm.failed": "Login failed. Please check your credentials.", + "app.loginCASForm.login": "Sign in", + "app.loginCASForm.password": "Password:", + "app.loginCASForm.processing": "Signing in ...", + "app.loginCASForm.success": "You are successfully signed in", + "app.loginCASForm.title": "Sign into ReCodEx using CAS UK", + "app.loginCASForm.ukco": "UKCO (student's number):", + "app.loginCASForm.validation.emptyPassword": "Password cannot be empty.", + "app.loginCASForm.validation.emptyUKCO": "UKCO address cannot be empty.", "app.loginForm.email": "E-mail address:", "app.loginForm.failed": "Login failed. Please check your credentials.", "app.loginForm.login": "Sign in", @@ -790,6 +884,12 @@ "app.referenceSolutionDetail.title.details": "Reference solution detail", "app.referenceSolutionDetail.uploadedAt": "Uploaded at:", "app.referenceSolutionEvaluation.title": "Evaluations of reference solution", + "app.referenceSolutionEvaluation.titlePrefix": "Evaluations for runtime:", + "app.referenceSolutionsEvaluations.description": "Description", + "app.referenceSolutionsEvaluations.evaluatedAt": "Evaluated on", + "app.referenceSolutionsEvaluations.memory": "Memory", + "app.referenceSolutionsEvaluations.time": "Time", + "app.referenceSolutionsEvaluations.title": "Reference solutions' evaluations", "app.registration.description": "Start using ReCodEx today", "app.registration.title": "Create a new ReCodEx account", "app.registrationForm.createAccount": "Create account", @@ -810,6 +910,7 @@ "app.registrationForm.validation.emptyLastName": "Last name cannot be empty.", "app.registrationForm.validation.emptyPassword": "Password cannot be empty.", "app.registrationForm.validation.passwordDontMatch": "Passwords don't match.", + "app.registrationForm.validation.passwordTooWeak": "The password you chose is too weak, please choose a different one.", "app.registrationForm.validation.shortFirstName": "First name must contain at least 2 characters.", "app.registrationForm.validation.shortLastName": "Last name must contain at least 2 characters.", "app.removeFromGroup.confirm": "Are you sure you want to remove the user from this group?", @@ -948,7 +1049,10 @@ "app.sudebar.menu.supervisor.title": "Supervisor", "app.supplementaryFiles.deleteButton": "Delete", "app.supplementaryFiles.deleteConfirm": "Are you sure you want to delete the file? This cannot be undone.", + "app.supplementaryFilesTable.addFiles": "Save supplementary files", "app.supplementaryFilesTable.description": "Supplementary files are files which can be used in job configuration.", + "app.supplementaryFilesTable.empty": "There are no supplementary files attached to this exercise yet.", + "app.supplementaryFilesTable.fileHashName": "Hash Name", "app.supplementaryFilesTable.fileName": "Original filename", "app.supplementaryFilesTable.fileSize": "Filesize", "app.supplementaryFilesTable.fileUploadedAt": "Uploaded at", @@ -979,13 +1083,13 @@ "app.usersName.notVerified.title": "This account does not have a verified email address yet.", "app.usersStats.description": "Points gained from {name}.", "app.usersname.notVerified.description": "This user has not verified his/her email address via an activation link he has received to his email address.", - "diff": "Diff", - "recodex-judge-float": "Floating point judge", - "recodex-judge-float-newline": "Floating judge ignoring newlines", - "recodex-judge-normal": "Normal judge", - "recodex-judge-normal-newline": "Normal judge ignoring newlines", - "recodex-judge-shuffle": "Shuffle judge", - "recodex-judge-shuffle-all": "Shuffle judge ignoring all", - "recodex-judge-shuffle-newline": "Shuffle judge ignoring newlines", - "recodex-judge-shuffle-rows": "Shuffle judge ignoring rows" + "diff": "Binary-safe judge", + "recodex-judge-float": "Float-numbers judge", + "recodex-judge-float-newline": "Float-numbers judge (ignoring ends of lines)", + "recodex-judge-normal": "Token judge", + "recodex-judge-normal-newline": "Token judge (ignoring ends of lines)", + "recodex-judge-shuffle": "Unordered-tokens judge", + "recodex-judge-shuffle-all": "Unordered-tokens-and-rows judge", + "recodex-judge-shuffle-newline": "Unordered-tokens judge (ignoring ends of lines)", + "recodex-judge-shuffle-rows": "Unordered-rows judge" } \ No newline at end of file diff --git a/src/pages/EditExerciseSimpleConfig/EditExerciseSimpleConfig.js b/src/pages/EditExerciseSimpleConfig/EditExerciseSimpleConfig.js index 2d1a37b99..13a4864f7 100644 --- a/src/pages/EditExerciseSimpleConfig/EditExerciseSimpleConfig.js +++ b/src/pages/EditExerciseSimpleConfig/EditExerciseSimpleConfig.js @@ -225,48 +225,39 @@ class EditExerciseSimpleConfig extends Component { - - } - unlimitedHeight + - - {(config, tests, environments, ...pipelines) => { - const sortedTests = tests.sort((a, b) => - a.name.localeCompare(b.name, locale) - ); - return ( - { + const sortedTests = tests.sort((a, b) => + a.name.localeCompare(b.name, locale) + ); + return ( + + transformAndSendConfigValues( + data, + pipelines, + environments, sortedTests, - locale + setConfig )} - exercise={exercise} - exerciseTests={sortedTests} - onSubmit={data => - transformAndSendConfigValues( - data, - pipelines, - environments, - setConfig - )} - /> - ); - }} - - + /> + ); + }} +