From 4339bb73bd16ebe20cb6dea470bd8c379a91715a Mon Sep 17 00:00:00 2001 From: Petr Stefan Date: Fri, 27 Oct 2017 21:36:03 +0200 Subject: [PATCH 1/6] WIP move score config form to exercise config page --- .../EditAssignmentForm/EditAssignmentForm.js | 32 +------ .../EditScoreConfigForm.js | 94 +++++++++++++++++++ .../forms/EditScoreConfigForm/index.js | 1 + .../EditExerciseConfig/EditExerciseConfig.js | 16 ++++ 4 files changed, 113 insertions(+), 30 deletions(-) create mode 100644 src/components/forms/EditScoreConfigForm/EditScoreConfigForm.js create mode 100644 src/components/forms/EditScoreConfigForm/index.js diff --git a/src/components/forms/EditAssignmentForm/EditAssignmentForm.js b/src/components/forms/EditAssignmentForm/EditAssignmentForm.js index 4182a261f..044870249 100644 --- a/src/components/forms/EditAssignmentForm/EditAssignmentForm.js +++ b/src/components/forms/EditAssignmentForm/EditAssignmentForm.js @@ -1,27 +1,17 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { canUseDOM } from 'exenv'; import { reduxForm, Field, FieldArray, touch } from 'redux-form'; -import { FormattedHTMLMessage, FormattedMessage } from 'react-intl'; +import { FormattedMessage } from 'react-intl'; import { Alert, HelpBlock } from 'react-bootstrap'; import isNumeric from 'validator/lib/isNumeric'; import FormBox from '../../widgets/FormBox'; -import { - DatetimeField, - TextField, - CheckboxField, - SourceCodeField -} from '../Fields'; +import { DatetimeField, TextField, CheckboxField } from '../Fields'; import LocalizedTextsFormField from '../LocalizedTextsFormField'; import SubmitButton from '../SubmitButton'; import { validateAssignment } from '../../../redux/modules/assignments'; -if (canUseDOM) { - require('codemirror/mode/yaml/yaml'); -} - const EditAssignmentForm = ({ initialValues: assignment, anyTouched, @@ -117,24 +107,6 @@ const EditAssignmentForm = ({ component={LocalizedTextsFormField} /> - - } - /> - - - - +
+ {hasFailed && + + + } + + + } + /> + +
+ + ), + submitting: ( + + ), + success: ( + + ) + }} + /> +
+
; + +EditScoreConfigForm.propTypes = { + handleSubmit: PropTypes.func.isRequired, + anyTouched: PropTypes.bool, + submitting: PropTypes.bool, + hasFailed: PropTypes.bool, + hasSucceeded: PropTypes.bool, + invalid: PropTypes.bool +}; + +const validate = () => { + const errors = {}; + return errors; +}; + +export default reduxForm({ + form: 'editScoreConfig', + validate +})(EditScoreConfigForm); diff --git a/src/components/forms/EditScoreConfigForm/index.js b/src/components/forms/EditScoreConfigForm/index.js new file mode 100644 index 000000000..6373871de --- /dev/null +++ b/src/components/forms/EditScoreConfigForm/index.js @@ -0,0 +1 @@ +export default from './EditScoreConfigForm'; diff --git a/src/pages/EditExerciseConfig/EditExerciseConfig.js b/src/pages/EditExerciseConfig/EditExerciseConfig.js index 261186d96..62b9467da 100644 --- a/src/pages/EditExerciseConfig/EditExerciseConfig.js +++ b/src/pages/EditExerciseConfig/EditExerciseConfig.js @@ -12,6 +12,7 @@ import ResourceRenderer from '../../components/helpers/ResourceRenderer'; import EditExerciseConfigForm from '../../components/forms/EditExerciseConfigForm/EditExerciseConfigForm'; import EditEnvironmentConfigForm from '../../components/forms/EditEnvironmentConfigForm'; +import EditScoreConfigForm from '../../components/forms/EditScoreConfigForm'; import EditSimpleLimitsBox from '../../components/Exercises/EditSimpleLimitsBox'; import SupplementaryFilesTableContainer from '../../containers/SupplementaryFilesTableContainer'; @@ -157,6 +158,21 @@ class EditExerciseConfig extends Component { + + + + } + unlimitedHeight + > + + + +
From feb9faf9a294cb4ebee71ef060c856c4d59a9186 Mon Sep 17 00:00:00 2001 From: Petr Stefan Date: Sat, 28 Oct 2017 12:44:17 +0200 Subject: [PATCH 2/6] Readme update --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d7aa9f1cb..4d430206e 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,10 @@ NODE_ENV=development API_BASE=http://localhost:4000/v1 PORT=8080 WEBPACK_DEV_SERVER_PORT=8081 +TITLE=ReCodEx +ALLOW_NORMAL_REGISTRATION=true +ALLOW_LDAP_REGISTRATION=false +ALLOW_CAS_REGISTRATION=true ``` ## Run Dev @@ -37,7 +41,7 @@ yarn build yarn start ``` -Consider using [PM2](http://pm2.keymetrics.io/) or similar tool to run the `yarn start` command to prevent crashes of the web service. +Consider using [PM2](http://pm2.keymetrics.io/) or similar tool to run the `yarn start` command to prevent crashes of the web service. It is wise to use watch mode of PM2 in `prod/` subdirectory and deploy the app using `yarn deploy` command. ## License From f4d3535686c6a4d79acf68cb04097ff35401837b Mon Sep 17 00:00:00 2001 From: Petr Stefan Date: Sat, 28 Oct 2017 22:24:06 +0200 Subject: [PATCH 3/6] Add score config actions --- .../EditExerciseConfig/EditExerciseConfig.js | 28 +++++++++++++++---- src/redux/modules/exerciseScoreConfig.js | 19 +++++++++++++ src/redux/reducer.js | 2 ++ src/redux/selectors/exerciseScoreConfig.js | 14 ++++++++++ 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 src/redux/modules/exerciseScoreConfig.js create mode 100644 src/redux/selectors/exerciseScoreConfig.js diff --git a/src/pages/EditExerciseConfig/EditExerciseConfig.js b/src/pages/EditExerciseConfig/EditExerciseConfig.js index 62b9467da..8ee77fd4e 100644 --- a/src/pages/EditExerciseConfig/EditExerciseConfig.js +++ b/src/pages/EditExerciseConfig/EditExerciseConfig.js @@ -30,6 +30,10 @@ import { fetchExerciseConfigIfNeeded, setExerciseConfig } from '../../redux/modules/exerciseConfigs'; +import { + fetchScoreConfigIfNeeded, + setScoreConfig +} from '../../redux/modules/exerciseScoreConfig'; import { fetchExerciseEnvironmentConfigIfNeeded, setExerciseEnvironmentConfig @@ -38,6 +42,7 @@ import { getExercise } from '../../redux/selectors/exercises'; import { pipelinesSelector } from '../../redux/selectors/pipelines'; import { exerciseConfigSelector } from '../../redux/selectors/exerciseConfigs'; import { exerciseEnvironmentConfigSelector } from '../../redux/selectors/exerciseEnvironmentConfigs'; +import { exerciseScoreConfigSelector } from '../../redux/selectors/exerciseScoreConfig'; import { loggedInUserIdSelector } from '../../redux/selectors/auth'; import { fetchRuntimeEnvironments } from '../../redux/modules/runtimeEnvironments'; import { runtimeEnvironmentsSelector } from '../../redux/selectors/runtimeEnvironments'; @@ -70,7 +75,8 @@ class EditExerciseConfig extends Component { dispatch(fetchExerciseConfigIfNeeded(exerciseId)), dispatch(fetchRuntimeEnvironments()), dispatch(fetchExerciseEnvironmentConfigIfNeeded(exerciseId)), - dispatch(fetchPipelines()) + dispatch(fetchPipelines()), + dispatch(fetchScoreConfigIfNeeded(exerciseId)) ]); render() { @@ -84,12 +90,14 @@ class EditExerciseConfig extends Component { environmentFormValues, exerciseConfig, exerciseEnvironmentConfig, + exerciseScoreConfig, editEnvironmentSimpleLimits, pipelines, limits, setHorizontally, setVertically, - setAll + setAll, + editScoreConfig } = this.props; return ( @@ -169,7 +177,13 @@ class EditExerciseConfig extends Component { } unlimitedHeight > - + + {config => + } + @@ -219,13 +233,15 @@ EditExerciseConfig.propTypes = { environmentFormValues: PropTypes.object, exerciseConfig: PropTypes.object, exerciseEnvironmentConfig: PropTypes.object, + exerciseScoreConfig: PropTypes.object, editEnvironmentSimpleLimits: PropTypes.func.isRequired, pipelines: ImmutablePropTypes.map, links: PropTypes.object.isRequired, limits: PropTypes.func.isRequired, setHorizontally: PropTypes.func.isRequired, setVertically: PropTypes.func.isRequired, - setAll: PropTypes.func.isRequired + setAll: PropTypes.func.isRequired, + editScoreConfig: PropTypes.func.isRequired }; export default withLinks( @@ -240,6 +256,7 @@ export default withLinks( exerciseEnvironmentConfig: exerciseEnvironmentConfigSelector( exerciseId )(state), + exerciseScoreConfig: exerciseScoreConfigSelector(exerciseId)(state), pipelines: pipelinesSelector(state), limits: runtimeEnvironmentId => simpleLimitsSelector(exerciseId, runtimeEnvironmentId)(state) @@ -263,7 +280,8 @@ export default withLinks( setVertically(formName, exerciseId, runtimeEnvironmentId, testName) ), setAll: (formName, runtimeEnvironmentId) => testName => () => - dispatch(setAll(formName, exerciseId, runtimeEnvironmentId, testName)) + dispatch(setAll(formName, exerciseId, runtimeEnvironmentId, testName)), + editScoreConfig: data => dispatch(setScoreConfig(exerciseId, data)) }) )(EditExerciseConfig) ); diff --git a/src/redux/modules/exerciseScoreConfig.js b/src/redux/modules/exerciseScoreConfig.js new file mode 100644 index 000000000..204230209 --- /dev/null +++ b/src/redux/modules/exerciseScoreConfig.js @@ -0,0 +1,19 @@ +import { handleActions } from 'redux-actions'; +import factory, { initialState } from '../helpers/resourceManager'; + +/** + * Create actions & reducer + */ + +const resourceName = 'exerciseScoreConfig'; +const { actions, reduceActions } = factory({ + resourceName, + apiEndpointFactory: id => `/exercises/${id}/score-config` +}); + +export const fetchScoreConfig = actions.fetchResource; +export const fetchScoreConfigIfNeeded = actions.fetchOneIfNeeded; +export const setScoreConfig = actions.updateResource; + +const reducer = handleActions(reduceActions, initialState); +export default reducer; diff --git a/src/redux/reducer.js b/src/redux/reducer.js index 8f83dd6c5..e5966d26b 100644 --- a/src/redux/reducer.js +++ b/src/redux/reducer.js @@ -11,6 +11,7 @@ import emailVerification from './modules/emailVerification'; import evaluationProgress from './modules/evaluationProgress'; import exerciseConfigs from './modules/exerciseConfigs'; import exerciseEnvironmentConfigs from './modules/exerciseEnvironmentConfigs'; +import exerciseScoreConfig from './modules/exerciseScoreConfig'; import exercises from './modules/exercises'; import pipelines from './modules/pipelines'; import files from './modules/files'; @@ -56,6 +57,7 @@ const createRecodexReducers = token => ({ evaluationProgress, exerciseConfigs, exerciseEnvironmentConfigs, + exerciseScoreConfig, exercises, pipelines, files, diff --git a/src/redux/selectors/exerciseScoreConfig.js b/src/redux/selectors/exerciseScoreConfig.js new file mode 100644 index 000000000..6a3881eaa --- /dev/null +++ b/src/redux/selectors/exerciseScoreConfig.js @@ -0,0 +1,14 @@ +import { createSelector } from 'reselect'; + +const getExerciseScoreConfig = state => state.exerciseScoreConfig; +const getResources = exerciseScoreConfig => + exerciseScoreConfig.get('resources'); + +export const exerciseScoreConfigsSelector = createSelector( + getExerciseScoreConfig, + getResources +); +export const exerciseScoreConfigSelector = exerciseId => + createSelector(exerciseScoreConfigsSelector, configs => + configs.get(exerciseId) + ); From 49e7548ab8d3301bfa8a325793ffc8799cce9396 Mon Sep 17 00:00:00 2001 From: Petr Stefan Date: Sun, 29 Oct 2017 18:59:21 +0100 Subject: [PATCH 4/6] Assignment - sync new values --- src/pages/Assignment/Assignment.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/pages/Assignment/Assignment.js b/src/pages/Assignment/Assignment.js index 02e0f5d89..28a10d660 100644 --- a/src/pages/Assignment/Assignment.js +++ b/src/pages/Assignment/Assignment.js @@ -181,7 +181,11 @@ class Assignment extends Component { .upToDate || !assignment.exerciseSynchronizationInfo.localizedTexts .upToDate || - !assignment.exerciseSynchronizationInfo.limits.upToDate) && + !assignment.exerciseSynchronizationInfo.limits.upToDate || + !assignment.exerciseSynchronizationInfo.scoreConfig + .upToDate || + !assignment.exerciseSynchronizationInfo.scoreCalculator + .upToDate) && @@ -237,6 +241,22 @@ class Assignment extends Component { defaultMessage="Limits" /> } + {!assignment.exerciseSynchronizationInfo.scoreConfig + .upToDate && +
  • + +
  • } + {!assignment.exerciseSynchronizationInfo + .scoreCalculator.upToDate && +
  • + +
  • }

    From 3ee5f67a8d5abd923872ef1b95a27f3e14df8850 Mon Sep 17 00:00:00 2001 From: Martin Krulis Date: Mon, 30 Oct 2017 01:59:42 +0100 Subject: [PATCH 5/6] Updates that reflect the changes in API were made in source code preview dialog. The dialog now shows warnings if the code is malformed or too large. --- .../SourceCodeViewerContainer.js | 30 +++- src/locales/cs.json | 145 +++++++----------- src/locales/en.json | 145 +++++++----------- 3 files changed, 132 insertions(+), 188 deletions(-) diff --git a/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js b/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js index dd5bc8db6..69bcebb95 100644 --- a/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js +++ b/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js @@ -58,7 +58,7 @@ class SourceCodeViewerContainer extends Component { } render() { - const { show, onHide, download, file, code } = this.props; + const { show, onHide, download, file, content } = this.props; const { height } = this.state; return ( } - resource={[file, code]} + resource={[file, content]} > - {(file, code) => + {(file, content) =>

    (this.bodyRef = body)}> + {content.malformedCharacters && + content.tooLarge && +
    + {content.malformedCharacters && +

    + +

    } + {content.tooLarge && +

    + +

    } +
    } @@ -147,13 +165,13 @@ SourceCodeViewerContainer.propTypes = { onHide: PropTypes.func.isRequired, loadAsync: PropTypes.func.isRequired, download: PropTypes.func.isRequired, - code: ImmutablePropTypes.map + content: ImmutablePropTypes.map }; export default connect( (state, { fileId }) => ({ file: getFile(fileId)(state), - code: getFilesContent(fileId)(state) + content: getFilesContent(fileId)(state) }), (dispatch, { fileId }) => ({ loadAsync: () => diff --git a/src/locales/cs.json b/src/locales/cs.json index 7ff75a654..79ed5978e 100644 --- a/src/locales/cs.json +++ b/src/locales/cs.json @@ -14,6 +14,8 @@ "app.addLicence.validation.validUntilInThePast": "Platnost licence musí být v budoucnosti.", "app.additionalExerciseFilesTable.description": "Přídavné soubory k úloze jsou soubory, které mohou být použity v popisu úlohy pomocí unikátních odkazů zobrazených níže. Tyto soubory mohou být zobrazovány a stahovány studenty.", "app.additionalExerciseFilesTable.title": "Přídavné soubory k úloze", + "app.additionalFiles.deleteButton": "Delete", + "app.additionalFiles.deleteConfirm": "Are you sure you want to delete the file? This cannot be undone.", "app.additionalFilesTable.fileName": "Původní název", "app.additionalFilesTable.fileSize": "Velikost", "app.additionalFilesTable.fileUploadedAt": "Nahráno", @@ -25,6 +27,7 @@ "app.adminAssignmentsTable.noAssignments": "Nejsou dostupné žádné úlohy.", "app.adminAssignmentsTableRow.edit": "Upravit", "app.adminAssignmentsTableRow.loading": "Načítají se zadané úlohy ...", + "app.assignExerciseButton.isLocked": "Locked", "app.assignemntStatusIcon.evaluationFailed": "Žádné řesení nebylo správně vyhodnoceno.", "app.assignemntStatusIcon.failed": "Žádné správné řešení nebylo zatím odevzdáno.", "app.assignemntStatusIcon.inProgress": "Řešení úlohy je právě vyhodnocováno.", @@ -38,9 +41,18 @@ "app.assignment.isBonus": "Bonusová úloha:", "app.assignment.loading": "Načítá se zadání úlohy ...", "app.assignment.maxPoints": "Maximální počet bodů pro správné řešení:", + "app.assignment.pointsPercentualThreshold": "Points percentual threshold:", "app.assignment.runtimeEnvironmentsIds": "Povolené jazyky/frameworky/technologie:", "app.assignment.secondDeadline": "Druhý termín odevzdání:", "app.assignment.submissionsCountLimit": "Limit počtu odevzdaných řešení:", + "app.assignment.syncButton": "Update this assignment", + "app.assignment.syncDescription": "The exercise for this assignment was updated in following categories:", + "app.assignment.syncExerciseConfig": "Exercise configuration", + "app.assignment.syncExerciseEnvironmentConfigs": "Environment configuration", + "app.assignment.syncHardwareGroups": "Hardware groups", + "app.assignment.syncLimits": "Limits", + "app.assignment.syncLocalizedTexts": "Localized texts", + "app.assignment.syncRequired": "The exercise was updated!", "app.assignment.title": "Zadání úlohy", "app.assignment.viewResults": "Zobrazit výsledky studenta", "app.assignmentStats.title": "Statistiky zadané úlohy", @@ -99,6 +111,7 @@ "app.comments.loadingCommentThread": "Načítají se komentáře ...", "app.comments.noCommentsYet": "V tomto vláknu zatím nejsou žádné komentáře.", "app.comments.onlyYouCanSeeThisComment": "Pouze vy vidíte tento komentář.", + "app.comments.refresh": "Refresh", "app.comments.title": "Komentáře a poznámky", "app.comments.warnings.isPrivate": "Tento komentář uvidíte pouze vy - nebude veřejný.", "app.comments.warnings.isPublic": "Tento komentář bude veřejný.", @@ -110,7 +123,6 @@ "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": "Popis skupiny nemůže být prázdný.", "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.", @@ -147,7 +159,6 @@ "app.editAssignmentForm.localized.locale": "Jazyková mutace:", "app.editAssignmentForm.localized.noLanguage": "Nyní není k dispozici žádný text pro tuto úlohu.", "app.editAssignmentForm.localized.reallyRemoveQuestion": "Opravdu chcete odstranit úlohu v tomto jazyce?", - "app.editAssignmentForm.localized.remove": "Odstranit tento jazyk", "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": "Přečtěte si více o syntaxi konfigurace ohodnocení syntax.", @@ -175,16 +186,6 @@ "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 ...", @@ -211,13 +212,6 @@ "app.editEnvironmentConfigVariables.stringArrayType": "Array of strings", "app.editEnvironmentConfigVariables.stringType": "Řetězec", "app.editEnvironmentConfigVariables.variables": "Proměnné:", - "app.editEnvironmentLimitsForm.box": "Box", - "app.editEnvironmentLimitsForm.environment.name": "Název běhového prostředí:", - "app.editEnvironmentLimitsForm.environment.noEnvironment": "Pro tuto úlohu není specifikováno žádné běhové prostředí.", - "app.editEnvironmentLimitsForm.newEnvironment": "Nové běhové prostředí", - "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.", @@ -242,10 +236,8 @@ "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": "Soubor", "app.editExerciseConfigForm.pipelines": "Pipeliny", "app.editExerciseConfigForm.removeLastTest": "Odstranit poslední test", - "app.editExerciseConfigForm.stringType": "Řetězec", "app.editExerciseConfigForm.submit": "Změnit konfiguraci", "app.editExerciseConfigForm.submitting": "Ukládání konfigurace ...", "app.editExerciseConfigForm.success": "Konfigurace byla uložena.", @@ -276,24 +268,6 @@ "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": "Uložení se nezdařilo. Prosíme opakujte akci později.", - "app.editExerciseLimitsForm.submit": "Změnit limity", - "app.editExerciseLimitsForm.submitting": "Ukládání limitů ...", - "app.editExerciseLimitsForm.success": "Limity byly uloženy.", - "app.editExerciseLimitsForm.validation.envName": "Prosím vyplňte název běhového prostředí.", - "app.editExerciseLimitsForm.validation.memoryIsNotNumer": "Paměťový limit musí být celé číslo.", - "app.editExerciseLimitsForm.validation.memoryLimit": "Paměťový limit musí být kladné celé číslo.", - "app.editExerciseLimitsForm.validation.timeIsNotNumer": "Časový limit musí být reálné číslo.", - "app.editExerciseLimitsForm.validation.timeLimit": "Časový limit musí být kladné reálné číslo.", - "app.editExerciseLimitsForm.validation.useDotDecimalSeparator": "Prosím použijte tečku jako oddělovač místo čárky.", - "app.editExerciseRuntimeConfigsForm.failed": "Uložení se nezdařilo. Prosíme, opakujte akci později.", - "app.editExerciseRuntimeConfigsForm.submit": "Změnit běhová prostředí", - "app.editExerciseRuntimeConfigsForm.submitting": "Ukládání běhových prostředí ...", - "app.editExerciseRuntimeConfigsForm.success": "Běhová prostředí byla uložena.", - "app.editExerciseRuntimeConfigsForm.validation.empty": "Prosíme vyplňte alespoň jedno běhové prostředí.", - "app.editExerciseRuntimeConfigsForm.validation.jobConfig": "Prosíme vyplňte konfiguraci úlohy.", - "app.editExerciseRuntimeConfigsForm.validation.name": "Prosíme vyplňte jméno běhové konfigurace.", - "app.editExerciseRuntimeConfigsForm.validation.runtimeEnvironmentId": "Prosíme vyberte běhové prostředí.", "app.editGroup.cannotDeleteRootGroup": "Toto je primární skupina a jako taková nemůže být smazána.", "app.editGroup.deleteGroup": "Smazat skupinu", "app.editGroup.deleteGroupWarning": "Smazání skupiny odstraní také všechny podskupiny, skupinové úlohy a zadané úlohy včetně studentských řešení.", @@ -335,14 +309,6 @@ "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": "Přidat nové běhové prostředí", - "app.editRuntimeConfigForm.configName": "Název konfigurace:", - "app.editRuntimeConfigForm.emptyConfigTabs": "Není k dispozici žádné běhové prostředí.", - "app.editRuntimeConfigForm.jobConfig": "Konfigurace úlohy:", - "app.editRuntimeConfigForm.moreAboutJobConfig": "Přečtěte si vice o syntaxi konfigurace úlohy.", - "app.editRuntimeConfigForm.newConfig": "Nová konfigurace", - "app.editRuntimeConfigForm.reallyRemoveQuestion": "Opravdu chcete odstranit toto běhové prostředí?", - "app.editRuntimeConfigForm.runtimeEnvironment": "Vyberte běhové prostředí:", "app.editUser.description": "Upravit nastavení uživatele", "app.editUser.title": "Upravit uživatelský profil", "app.editUserProfile.degreesAfterName": "Tituly za jménem:", @@ -355,8 +321,6 @@ "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": "Staré heslo nemůže být prázdné pokud si měníte heslo.", - "app.editUserProfile.validation.passwordTooWeak": "Heslo je příliš slabé, vyplňte prosím jiné.", "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.", @@ -392,9 +356,7 @@ "app.evaluationDetail.bonusPoints": "Bonusové body:", "app.evaluationDetail.buildSucceeded": "Kompilace:", "app.evaluationDetail.evaluatedAt": "Vyhodnoceno:", - "app.evaluationDetail.hasFinished": "Proces vyhodnocení skončil:", "app.evaluationDetail.isCorrect": "Správnost:", - "app.evaluationDetail.isValid": "Vyhodnocení je úspěšné:", "app.evaluationDetail.score": "Skóre:", "app.evaluationDetail.title.compilationLogs": "Logy kompilace", "app.evaluationDetail.title.details": "Detaily vyhodnocení", @@ -408,8 +370,9 @@ "app.evaluationProgressStatus.skipped": "PŘESKOČENO", "app.evaluationTable.empty": "There are no evaluations in this list.", "app.evaluationTable.evaluatedAt": "Vyhodnoceno:", + "app.evaluationTable.notAvailable": "Evaluation not available", + "app.evaluationTable.score": "Score:", "app.evaluationTable.showDetails": "Zobrazit detaily", - "app.exercise.assign": "Zadat", "app.exercise.assignButton": "Zadat", "app.exercise.assignToGroup": "Můžete zadat tuto úlohu pro skupiny, kde jste cvičící.", "app.exercise.author": "Autor:", @@ -428,25 +391,22 @@ "app.exercise.editSettings": "Upravit nastavení úlohy", "app.exercise.exercisePipelines": "Exercise Pipelines", "app.exercise.forked": "Duplikováno z:", - "app.exercise.group": "Skupina:", + "app.exercise.groups": "Groups:", "app.exercise.groupsBox": "Skupiny", + "app.exercise.isLocked": "Is locked:", + "app.exercise.isPublic": "Is public:", "app.exercise.noReferenceSolutions": "Nyní zde nejsou žádná referenční řešení pro tuto úlohu.", "app.exercise.publicGroup": "Public", + "app.exercise.referenceSolution.deleteButton": "Delete", + "app.exercise.referenceSolution.deleteConfirm": "Are you sure you want to delete the reference solution? This cannot be undone.", "app.exercise.referenceSolutionDetail": "Detail referenčního řešení", + "app.exercise.referenceSolutionEvaluationDescription": "Evaluation", + "app.exercise.referenceSolutionEvaluationDetail": "Evaluation detail", + "app.exercise.referenceSolutionEvaluationTitle": "Reference solution evaluation", "app.exercise.referenceSolutionTitle": "Přehled referenčního řešení", "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": "Musíte připojit alespoň jeden soubor se zdrojovým kódem a počkat, než jsou všechny soubory nahrány na server. Pokud nastane problém při uploadu některých soborů, nahrajte je znovu nebo soubory odeberte. Jméno souboru NESMÍ OBSAHOVAT žádné nestandardní znaky (například v kódování UTF-8).", - "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", @@ -465,11 +425,10 @@ "app.exercisesList.created": "Vytvořeno", "app.exercisesList.difficulty": "Obtížnost", "app.exercisesList.empty": "Nenalezeny žádné úlohy k zobrazení.", - "app.exercisesList.group": "Skupina", + "app.exercisesList.groups": "Groups", "app.exercisesList.name": "Jméno", "app.exercisesListItem.group.public": "Veřejné", "app.exercisesName.loading": "Loading ...", - "app.exercisesSimpleList.actions": "Akce", "app.exercisesSimpleList.difficulty": "Obtížnost", "app.exercisesSimpleList.empty": "V tomto seznamu nejsou žádné úlohy.", "app.exercisesSimpleList.name": "Jméno", @@ -505,6 +464,7 @@ "app.exitCodes.mono.200": "Internal error", "app.exitCodes.mono.201": "No main method", "app.exitCodes.mono.202": "More main methods", + "app.exitCodes.unknown": "Unknown", "app.externalRegistrationForm.failed": "Registrace se nezdařila. Prosíme, zkontrolujte vyplněné informace.", "app.externalRegistrationForm.instance": "Instance:", "app.externalRegistrationForm.password": "Heslo:", @@ -517,6 +477,8 @@ "app.failedGroupDetail.msg": "Načtení skupiny se nezdařilo. Prosíme zkuste dotaz opakovat později.", "app.failedSubmissionDetail.description": "Prosíme zkontroluje své připojení k internetu a zkuste dotaz později.", "app.failedSubmissionDetail.title": "Načtení vyhodnocení úlohy se nezdařilo", + "app.faq.description": "ReCodEx FAQ", + "app.faq.title": "FAQ", "app.feedbackAndBugs.contribution": "If you are interested in frontend web development, feel free to fix the bug itself and send a pull request! Any help will be much appreciated!", "app.feedbackAndBugs.description": "Ooh.. you found a bug?", "app.feedbackAndBugs.feedbackTitle": "How can I give you feedback?", @@ -524,6 +486,7 @@ "app.feedbackAndBugs.title": "Feedback and Bugs Reporting", "app.feedbackAndBugs.whereToReportBugs": "Where can I report bugs?", "app.feedbackAndBugs.whereToReportBugsText": "Every software contains bugs and we are well avare of this fact. From time to time you might find a bug that nobody else has reported and which hasn't been fixed yet. Please report all bugs to our issue tracker on GitHub - just file a new issue and give it a label 'bug'. We will try to investigate and release a bugfix as soon as possible.", + "app.field.isRequired": "This field is required.", "app.fields.limits.memory": "Test memory limit:", "app.fields.limits.time": "Test time limit:", "app.footer.copyright": "Copyright © 2016-2017 ReCodEx. Všechna práva vyhrazena.", @@ -556,6 +519,7 @@ "app.groupDetail.externalId": "Externí identifikace skupiny (např. identifikátor skupiny ve školním systému):", "app.groupDetail.isPublic": "Je veřejná:", "app.groupDetail.loading": "Načítání popisu skupiny ...", + "app.groupDetail.subgroups": "Subgroups hierarchy", "app.groupDetail.supervisors": "Cvíčící skupiny {groupName}", "app.groupDetail.threshold": "Minimální procentuální počet bodů potřebných ke splnění tohoto kurzu:", "app.groupResultsTableRow.loading": "Načítání výsledků ...", @@ -567,14 +531,12 @@ "app.groups.makeGroupAdminButton": "Změnit na správce skupiny", "app.groups.makeSupervisorButton": "Přidat cvičícího", "app.groups.removeFromGroup": "Odebrat ze skupiny", + "app.groups.removeGroupAdminButton": "Remove group admin", "app.groups.removeSupervisorButton": "Odebrat cvičícího", "app.groupsName.loading": "Načítání ...", - "app.hardwareGroupFields.memoryLimit": "Paměťový limit pro \"{taskId}\":", - "app.hardwareGroupFields.noReferenceSolutions": "Test '{testName}' and jeho task '{taskId}' nemá žádné referenční řešení.", - "app.hardwareGroupFields.test": "Test:", - "app.hardwareGroupFields.timeLimit": "Časový limit pro \"{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.", "app.homepage.aboutAndroidApp": "Vyvinuli jsme také jednoduchou aplikaci pro Android, která vám může pomoci zkontrolovat nově zadané úlohy a sledovat vaše statistiky odevzdaných řešení zatímco cestujete tramvají či autobusem.", "app.homepage.aboutContentP1": "Projekt vznikl v rámci předmětu Softwarový projekt v roce 2016 jako náhrada za již zastaralý systém CodEx používaný na MFF UK. Projekt je zveřejněn pod MIT licencí a hostován na GitHubu. Podrobnější informace jsou k dispozici na Wiki projektu.", "app.homepage.aboutContentP2": "Při vývoji se objevila řada témat pro studentské projekty různého typu, v případě zájmu o vylepšení tohoto systému neváhejte kontaktovat autory nebo některého z vyučujících.", @@ -604,6 +566,7 @@ "app.instancesTable.admin": "Admin", "app.instancesTable.name": "Jméno", "app.instancesTable.validLicence": "Má platnou licenci", + "app.leaveGroup.confirm": "Are you sure you want to leave this group?", "app.licencesTable.isValid": "Bez revokace", "app.licencesTable.noLicences": "Nejsou zde žádné licence.", "app.licencesTable.note": "Popis", @@ -615,15 +578,6 @@ "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", @@ -640,6 +594,7 @@ "app.markdownTextArea.preview": "Náhled:", "app.markdownTextArea.showPreview": "Ukaž náhled", "app.maybeBonusAssignmentIcon.isBonus": "Je bonusová", + "app.maybeLockedExerciseIcon.isLocked": "Exercise is locked by author and cannot be assigned", "app.maybePublicIcon.isNotPublic": "Není veřejné", "app.maybePublicIcon.isPublic": "Je veřejné", "app.milisecondsTextField.humanReadable": "Čitelná podoba:", @@ -649,10 +604,20 @@ "app.notifications.hideAll": "Pouze nové notifikace", "app.notifications.showAll": "Zobrazit {count, plural, one {jednu starou notifikaci} two {dvě staré notifikace} other {# starých notifikací}}", "app.notifications.title": "{count, plural, =0 {Nemáte žádnou novou notifikaci} one {Máte novou notifikaci} =2 {Máte dvě nové notifikace} =3 {Máte tři nové notifikace} =4 {Máte čtyři nové notifikace} other {Máte # nových notifikací}}", + "app.page.exercises.failed": "Cannot load the list of exercises", + "app.page.exercises.failedDescription": "We are sorry for the inconvenience, please try again later.", + "app.page.exercises.loading": "Loading list of exercises ...", + "app.page.exercises.loadingDescription": "Please wait while we are getting the list of exercises ready.", "app.page.failed": "Načtení stránky se nezdařilo", "app.page.failedDescription": "Prosíme, zkuste to později. Omlouváme se za způsobené problémy.", "app.page.loading": "Načítání ...", "app.page.loadingDescription": "Prosíme počkejte než bude vše připraveno.", + "app.page.pipelines.loading": "Loading list of pipelines ...", + "app.page.pipelines.loadingDescription": "Please wait while we are getting the list of pipelines ready.", + "app.page.users.failed": "Cannot load the list of users", + "app.page.users.failedDescription": "We are sorry for the inconvenience, please try again later.", + "app.page.users.loading": "Loading list of users ...", + "app.page.users.loadingDescription": "Please wait while we are getting the list of users ready.", "app.passwordStrength.bad": "Víte to jistě?", "app.passwordStrength.good": "Dobře", "app.passwordStrength.ok": "OK", @@ -689,7 +654,6 @@ "app.pipelineEditor.BoxForm.success": "Saved", "app.pipelineEditor.BoxForm.type": "Type:", "app.pipelineEditor.EditBoxForm.title": "Edit the box '{name}'", - "app.pipelineEditor.addBoxForm.portsIn": "Inputs", "app.pipelineFilesTable.description": "Supplementary files are files which can be referenced as remote file in pipeline configuration.", "app.pipelineFilesTable.title": "Supplementary files", "app.pipelineVisualEditor.addBoxButton": "Add box", @@ -751,17 +715,12 @@ "app.recodex.bugsAndFeedbackUrl": "Open ReCodEx webapp repository", "app.referenceSolution.author": "Autor:", "app.referenceSolutionDetail.description": "Popis", + "app.referenceSolutionDetail.exercise": "Exercise", "app.referenceSolutionDetail.refreshEvaluations": "Obnovit", "app.referenceSolutionDetail.resubmit": "Znovu vyhodnotit", "app.referenceSolutionDetail.title.details": "Detail referenčního řešení", "app.referenceSolutionDetail.uploadedAt": "Nahráno:", - "app.referenceSolutionEvaluation.downloadResults": "Stáhnout výsledky", - "app.referenceSolutionEvaluation.titlePrefix": "Vyhodnocení pro běhové prostředí:", - "app.referenceSolutionsEvaluations.description": "Popis řešení", - "app.referenceSolutionsEvaluations.evaluatedAt": "Vyhodnoceno", - "app.referenceSolutionsEvaluations.memory": "Naměřené využití paměti", - "app.referenceSolutionsEvaluations.time": "Naměřený čas", - "app.referenceSolutionsEvaluations.title": "Vyhodnocení referenčního řešení", + "app.referenceSolutionEvaluation.title": "Evaluations of reference solution", "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", @@ -782,9 +741,9 @@ "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": "Zvolené heslo je příliš slabé, prosím zvolte nějaké bezpečnější.", "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?", "app.resendEmailVerification.failed": "Opětovné odeslání selhalo. Prosíme opakujte akci později", "app.resendEmailVerification.resend": "Znovu odeslat ověřovací email", "app.resendEmailVerification.resending": "Odesílání emailu ...", @@ -815,6 +774,7 @@ "app.sidebar.menu.createAccount": "Zaregistrovat se", "app.sidebar.menu.dashboard": "Přehled", "app.sidebar.menu.exercises": "Úlohy", + "app.sidebar.menu.faq": "FAQ", "app.sidebar.menu.feedbackAndBugs": "Zpětná vazba a hlášení chyb", "app.sidebar.menu.pipelines": "Pipeliny", "app.sidebar.menu.signIn": "Přihlásit se", @@ -848,7 +808,9 @@ "app.sisSupervisor.noSisGroups": "Currently there are no ReCodEx groups matching this SIS lecture.", "app.sisSupervisor.yearTerm": "Year and term:", "app.sourceCodeViewer.downloadButton": "Stáhnout soubor", + "app.sourceCodeViewer.incompleteWarning": "Zdrojový soubor je příliš velký, a proto zde nemůže být zobrazen. Použijte tlačítko 'Stáhnout soubor', pokud si jej chcete prohlédnout celý.", "app.sourceCodeViewer.loading": "Načítání ...", + "app.sourceCodeViewer.utf8Warning": "Zdrojový soubor není v platném UTF-8 kódování. Některé znaky proto nemusí být zobrazeny správně. Pokud potřebujete soubor v původním kódování, použijte tlačítko k jeho stažení.", "app.studentsList.gainedPointsOfWithoutBreakingSpaces": "{gained, number} of {total, number}", "app.studentsList.noStudents": "V tomto seznamu nejsou žádní studenti.", "app.studentsView.assignments": "Zadané úlohy", @@ -910,10 +872,9 @@ "app.sudebar.menu.admin.title": "Administrátor", "app.sudebar.menu.student.title": "Student", "app.sudebar.menu.supervisor.title": "Cvičící", - "app.supplementaryFilesTable.addFiles": "Save supplementary files", + "app.supplementaryFiles.deleteButton": "Delete", + "app.supplementaryFiles.deleteConfirm": "Are you sure you want to delete the file? This cannot be undone.", "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", @@ -933,13 +894,15 @@ "app.user.welcomeTitle": "Vítejte v ReCodExu", "app.userList.noSupervisors": "V tomto seznamu nejsou žádní cvičící.", "app.userList.noUsers": "V tomto seznamu nejsou žádní uživatelé.", + "app.userSwitching.loginAs": "Login as", "app.users.description": "Procházení všech uživatelů ReCodExu.", "app.users.listTitle": "Uživatelé", "app.users.settings": "Nastavení", + "app.users.takeOver": "Login as", "app.users.title": "Seznam uživatelů", "app.users.users": "Uživatelé", "app.usersName.loading": "Načítání ...", "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." -} +} \ No newline at end of file diff --git a/src/locales/en.json b/src/locales/en.json index 014aecf4d..1c2e798bf 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -14,6 +14,8 @@ "app.addLicence.validation.validUntilInThePast": "End of licence's valid period must be in the future.", "app.additionalExerciseFilesTable.description": "Additional exercise files are files which can be used within exercise description using links provided below. Additional files can be viewed or downloaded by students.", "app.additionalExerciseFilesTable.title": "Additional exercise files", + "app.additionalFiles.deleteButton": "Delete", + "app.additionalFiles.deleteConfirm": "Are you sure you want to delete the file? This cannot be undone.", "app.additionalFilesTable.fileName": "Original filename", "app.additionalFilesTable.fileSize": "Filesize", "app.additionalFilesTable.fileUploadedAt": "Uploaded at", @@ -25,6 +27,7 @@ "app.adminAssignmentsTable.noAssignments": "There are no assignments.", "app.adminAssignmentsTableRow.edit": "Edit", "app.adminAssignmentsTableRow.loading": "Loading assignments ...", + "app.assignExerciseButton.isLocked": "Locked", "app.assignemntStatusIcon.evaluationFailed": "No solution was evaluated correctly by ReCodEx.", "app.assignemntStatusIcon.failed": "No correct solution was submitted yet.", "app.assignemntStatusIcon.inProgress": "Assignment solution is being evaluated.", @@ -38,9 +41,18 @@ "app.assignment.isBonus": "Bonus assignment:", "app.assignment.loading": "Loading exercise assignment ...", "app.assignment.maxPoints": "Maximum number of points for a correct solution:", + "app.assignment.pointsPercentualThreshold": "Points percentual threshold:", "app.assignment.runtimeEnvironmentsIds": "Allowed languages/frameworks/technologies:", "app.assignment.secondDeadline": "Second deadline:", "app.assignment.submissionsCountLimit": "Submission count limit:", + "app.assignment.syncButton": "Update this assignment", + "app.assignment.syncDescription": "The exercise for this assignment was updated in following categories:", + "app.assignment.syncExerciseConfig": "Exercise configuration", + "app.assignment.syncExerciseEnvironmentConfigs": "Environment configuration", + "app.assignment.syncHardwareGroups": "Hardware groups", + "app.assignment.syncLimits": "Limits", + "app.assignment.syncLocalizedTexts": "Localized texts", + "app.assignment.syncRequired": "The exercise was updated!", "app.assignment.title": "Exercise assignment", "app.assignment.viewResults": "View student results", "app.assignmentStats.title": "Assignment statistics", @@ -99,6 +111,7 @@ "app.comments.loadingCommentThread": "Loading comments ...", "app.comments.noCommentsYet": "There are no comments in this thread yet.", "app.comments.onlyYouCanSeeThisComment": "Only you can see this comment", + "app.comments.refresh": "Refresh", "app.comments.title": "Comments and notes", "app.comments.warnings.isPrivate": "Only you will see this comment.", "app.comments.warnings.isPublic": "Everyone on this page will see this comment.", @@ -110,7 +123,6 @@ "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.", @@ -147,7 +159,6 @@ "app.editAssignmentForm.localized.locale": "The language:", "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.", @@ -175,16 +186,6 @@ "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 ...", @@ -211,13 +212,6 @@ "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.", @@ -242,10 +236,8 @@ "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.", @@ -276,24 +268,6 @@ "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.editGroup.cannotDeleteRootGroup": "This is a so-called root group and it cannot be deleted.", "app.editGroup.deleteGroup": "Delete the group", "app.editGroup.deleteGroupWarning": "Deleting a group will remove all the subgroups, the students submissions and all the assignments and the submissions of the students.", @@ -335,14 +309,6 @@ "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.editUser.description": "Edit user's profile", "app.editUser.title": "Edit user's profile", "app.editUserProfile.degreesAfterName": "Degrees after name:", @@ -355,8 +321,6 @@ "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.", @@ -392,9 +356,7 @@ "app.evaluationDetail.bonusPoints": "Bonus points:", "app.evaluationDetail.buildSucceeded": "Build succeeded:", "app.evaluationDetail.evaluatedAt": "Evaluated at:", - "app.evaluationDetail.hasFinished": "Evaluation process has finished:", "app.evaluationDetail.isCorrect": "Is correct:", - "app.evaluationDetail.isValid": "Evaluation is valid:", "app.evaluationDetail.score": "Score:", "app.evaluationDetail.title.compilationLogs": "Compilation logs", "app.evaluationDetail.title.details": "Evaluation details", @@ -408,8 +370,9 @@ "app.evaluationProgressStatus.skipped": "SKIPPED", "app.evaluationTable.empty": "There are no evaluations in this list.", "app.evaluationTable.evaluatedAt": "Evaluated at:", + "app.evaluationTable.notAvailable": "Evaluation not available", + "app.evaluationTable.score": "Score:", "app.evaluationTable.showDetails": "Show details", - "app.exercise.assign": "Assign", "app.exercise.assignButton": "Assign", "app.exercise.assignToGroup": "You can assign this exercise to one of the groups you supervise.", "app.exercise.author": "Author:", @@ -428,25 +391,22 @@ "app.exercise.editSettings": "Edit exercise settings", "app.exercise.exercisePipelines": "Exercise Pipelines", "app.exercise.forked": "Forked from:", - "app.exercise.group": "Group:", + "app.exercise.groups": "Groups:", "app.exercise.groupsBox": "Groups", + "app.exercise.isLocked": "Is locked:", + "app.exercise.isPublic": "Is public:", "app.exercise.noReferenceSolutions": "There are no reference solutions for this exercise yet.", "app.exercise.publicGroup": "Public", + "app.exercise.referenceSolution.deleteButton": "Delete", + "app.exercise.referenceSolution.deleteConfirm": "Are you sure you want to delete the reference solution? This cannot be undone.", "app.exercise.referenceSolutionDetail": "Reference solution detail", + "app.exercise.referenceSolutionEvaluationDescription": "Evaluation", + "app.exercise.referenceSolutionEvaluationDetail": "Evaluation detail", + "app.exercise.referenceSolutionEvaluationTitle": "Reference solution evaluation", "app.exercise.referenceSolutionTitle": "Reference solution overview", "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, check the name of the file. The name MUST NOT contain non-standard characters (like UTF-8 ones). Then try to upload it again.", - "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", @@ -465,11 +425,10 @@ "app.exercisesList.created": "Created", "app.exercisesList.difficulty": "Difficulty", "app.exercisesList.empty": "There are no exercises in this list.", - "app.exercisesList.group": "Group", + "app.exercisesList.groups": "Groups", "app.exercisesList.name": "Name", "app.exercisesListItem.group.public": "Public", "app.exercisesName.loading": "Loading ...", - "app.exercisesSimpleList.actions": "Actions", "app.exercisesSimpleList.difficulty": "Difficulty", "app.exercisesSimpleList.empty": "There are no exercises in this list.", "app.exercisesSimpleList.name": "Name", @@ -505,6 +464,7 @@ "app.exitCodes.mono.200": "Internal error", "app.exitCodes.mono.201": "No main method", "app.exitCodes.mono.202": "More main methods", + "app.exitCodes.unknown": "Unknown", "app.externalRegistrationForm.failed": "Registration failed. Please check your information.", "app.externalRegistrationForm.instance": "Instance:", "app.externalRegistrationForm.password": "Password:", @@ -517,6 +477,8 @@ "app.failedGroupDetail.msg": "Cannot load group detail. Please try again later.", "app.failedSubmissionDetail.description": "Make sure you are connected to the Internet and repeat the action after a while.", "app.failedSubmissionDetail.title": "Cannot load evaluation of the solution", + "app.faq.description": "ReCodEx FAQ", + "app.faq.title": "FAQ", "app.feedbackAndBugs.contribution": "If you are interested in frontend web development, feel free to fix the bug itself and send a pull request! Any help will be much appreciated!", "app.feedbackAndBugs.description": "Ooh.. you found a bug?", "app.feedbackAndBugs.feedbackTitle": "How can I give you feedback?", @@ -524,6 +486,7 @@ "app.feedbackAndBugs.title": "Feedback and Bugs Reporting", "app.feedbackAndBugs.whereToReportBugs": "Where can I report bugs?", "app.feedbackAndBugs.whereToReportBugsText": "Every software contains bugs and we are well avare of this fact. From time to time you might find a bug that nobody else has reported and which hasn't been fixed yet. Please report all bugs to our issue tracker on GitHub - just file a new issue and give it a label 'bug'. We will try to investigate and release a bugfix as soon as possible.", + "app.field.isRequired": "This field is required.", "app.fields.limits.memory": "Test memory limit:", "app.fields.limits.time": "Test time limit:", "app.footer.copyright": "Copyright © 2016-2017 ReCodEx. All rights reserved.", @@ -556,6 +519,7 @@ "app.groupDetail.externalId": "External identification of the group:", "app.groupDetail.isPublic": "Is public:", "app.groupDetail.loading": "Loading group's description ...", + "app.groupDetail.subgroups": "Subgroups hierarchy", "app.groupDetail.supervisors": "Supervisors of {groupName}", "app.groupDetail.threshold": "Minimum percent of the total points count needed to complete the course:", "app.groupResultsTableRow.loading": "Loading results ...", @@ -567,14 +531,12 @@ "app.groups.makeGroupAdminButton": "Make group admin", "app.groups.makeSupervisorButton": "Make supervisor", "app.groups.removeFromGroup": "Remove from group", + "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.", "app.homepage.aboutAndroidApp": "We have also developed a simple Android app which can help you check new assignments and your statistics while you are on a tram or a bus.", "app.homepage.aboutContentP1": "ReCodEx was born in 2016 as final work for Software project class. It is replacement for old system CodEx used at MFF UK since 2006. The project is opensource under MIT licence hosted on GitHub. More detailed info is on Wiki page of the project.", "app.homepage.aboutContentP2": "During development was found number of topics for following student works of different kinds. In case of interest in make this project more awesome, please contact one of the authors or teachers.", @@ -604,6 +566,7 @@ "app.instancesTable.admin": "Admin", "app.instancesTable.name": "Name", "app.instancesTable.validLicence": "Has valid licence", + "app.leaveGroup.confirm": "Are you sure you want to leave this group?", "app.licencesTable.isValid": "Without revocation", "app.licencesTable.noLicences": "There are no licences.", "app.licencesTable.note": "Note", @@ -615,15 +578,6 @@ "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", @@ -640,6 +594,7 @@ "app.markdownTextArea.preview": "Preview:", "app.markdownTextArea.showPreview": "Show preview", "app.maybeBonusAssignmentIcon.isBonus": "Is Bonus", + "app.maybeLockedExerciseIcon.isLocked": "Exercise is locked by author and cannot be assigned", "app.maybePublicIcon.isNotPublic": "Is not public", "app.maybePublicIcon.isPublic": "Is public", "app.milisecondsTextField.humanReadable": "Human readable variant:", @@ -649,10 +604,20 @@ "app.notifications.hideAll": "Only new notifications", "app.notifications.showAll": "Show {count, plural, one {old notification} two {two old notifications} other {all # notifications}}", "app.notifications.title": "You have {count, number} new {count, plural, one {notification} two {notifications} other {notifications}}", + "app.page.exercises.failed": "Cannot load the list of exercises", + "app.page.exercises.failedDescription": "We are sorry for the inconvenience, please try again later.", + "app.page.exercises.loading": "Loading list of exercises ...", + "app.page.exercises.loadingDescription": "Please wait while we are getting the list of exercises ready.", "app.page.failed": "Cannot load the page", "app.page.failedDescription": "We are sorry for the inconvenience, please try again later.", "app.page.loading": "Loading ...", "app.page.loadingDescription": "Please wait while we are getting things ready.", + "app.page.pipelines.loading": "Loading list of pipelines ...", + "app.page.pipelines.loadingDescription": "Please wait while we are getting the list of pipelines ready.", + "app.page.users.failed": "Cannot load the list of users", + "app.page.users.failedDescription": "We are sorry for the inconvenience, please try again later.", + "app.page.users.loading": "Loading list of users ...", + "app.page.users.loadingDescription": "Please wait while we are getting the list of users ready.", "app.passwordStrength.bad": "Are you sure?", "app.passwordStrength.good": "Good", "app.passwordStrength.ok": "OK", @@ -689,7 +654,6 @@ "app.pipelineEditor.BoxForm.success": "Saved", "app.pipelineEditor.BoxForm.type": "Type:", "app.pipelineEditor.EditBoxForm.title": "Edit the box '{name}'", - "app.pipelineEditor.addBoxForm.portsIn": "Inputs", "app.pipelineFilesTable.description": "Supplementary files are files which can be referenced as remote file in pipeline configuration.", "app.pipelineFilesTable.title": "Supplementary files", "app.pipelineVisualEditor.addBoxButton": "Add box", @@ -751,17 +715,12 @@ "app.recodex.bugsAndFeedbackUrl": "Open ReCodEx webapp repository", "app.referenceSolution.author": "Author:", "app.referenceSolutionDetail.description": "Description", + "app.referenceSolutionDetail.exercise": "Exercise", "app.referenceSolutionDetail.refreshEvaluations": "Refresh", "app.referenceSolutionDetail.resubmit": "Resubmit", "app.referenceSolutionDetail.title.details": "Reference solution detail", "app.referenceSolutionDetail.uploadedAt": "Uploaded at:", - "app.referenceSolutionEvaluation.downloadResults": "Download results", - "app.referenceSolutionEvaluation.titlePrefix": "Evaluations for runtime:", - "app.referenceSolutionsEvaluations.description": "Description", - "app.referenceSolutionsEvaluations.evaluatedAt": "Evaluated on", - "app.referenceSolutionsEvaluations.memory": "Measured memory", - "app.referenceSolutionsEvaluations.time": "Measured time", - "app.referenceSolutionsEvaluations.title": "Reference solutions' evaluations", + "app.referenceSolutionEvaluation.title": "Evaluations of reference solution", "app.registration.description": "Start using ReCodEx today", "app.registration.title": "Create a new ReCodEx account", "app.registrationForm.createAccount": "Create account", @@ -782,9 +741,9 @@ "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?", "app.resendEmailVerification.failed": "Resending failed", "app.resendEmailVerification.resend": "Resend verification email", "app.resendEmailVerification.resending": "Sending email ...", @@ -815,6 +774,7 @@ "app.sidebar.menu.createAccount": "Create account", "app.sidebar.menu.dashboard": "Dashboard", "app.sidebar.menu.exercises": "Exercises", + "app.sidebar.menu.faq": "FAQ", "app.sidebar.menu.feedbackAndBugs": "Feedback and bug reporting", "app.sidebar.menu.pipelines": "Pipelines", "app.sidebar.menu.signIn": "Sign in", @@ -848,7 +808,9 @@ "app.sisSupervisor.noSisGroups": "Currently there are no ReCodEx groups matching this SIS lecture.", "app.sisSupervisor.yearTerm": "Year and term:", "app.sourceCodeViewer.downloadButton": "Download file", + "app.sourceCodeViewer.incompleteWarning": "The selected source file is too large. Only a leading part of the file is displayed here. Use the download button to get the whole file.", "app.sourceCodeViewer.loading": "Loading ...", + "app.sourceCodeViewer.utf8Warning": "The source file is not a valid UTF-8 file. Some characters may be displayed incorrectly. Use the download button to see unaltered source file.", "app.studentsList.gainedPointsOfWithoutBreakingSpaces": "{gained, number} of {total, number}", "app.studentsList.noStudents": "There are no students in this list.", "app.studentsView.assignments": "Assignments", @@ -910,10 +872,9 @@ "app.sudebar.menu.admin.title": "Administration", "app.sudebar.menu.student.title": "Student", "app.sudebar.menu.supervisor.title": "Supervisor", - "app.supplementaryFilesTable.addFiles": "Save supplementary files", + "app.supplementaryFiles.deleteButton": "Delete", + "app.supplementaryFiles.deleteConfirm": "Are you sure you want to delete the file? This cannot be undone.", "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", @@ -933,13 +894,15 @@ "app.user.welcomeTitle": "Welcome to ReCodEx", "app.userList.noSupervisors": "There are no supervisors in this list.", "app.userList.noUsers": "There are no users in this list.", + "app.userSwitching.loginAs": "Login as", "app.users.description": "Browse all ReCodEx users.", "app.users.listTitle": "Users", "app.users.settings": "Settings", + "app.users.takeOver": "Login as", "app.users.title": "User list", "app.users.users": "Users", "app.usersName.loading": "Loading ...", "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." -} +} \ No newline at end of file From d3d1fdf4a0c49ab3f600a60a1c5e0c7c2fe0fedb Mon Sep 17 00:00:00 2001 From: Martin Krulis Date: Mon, 30 Oct 2017 17:55:36 +0100 Subject: [PATCH 6/6] Fixed source viewer dialog box to use flex CSS instead of broken JS height settings. --- .../SourceCodeViewer/SourceCodeViewer.js | 27 +++---- .../SourceCodeViewerContainer.js | 73 +++++-------------- .../SourceCodeViewerContainer/sourceCode.less | 30 +++++++- 3 files changed, 58 insertions(+), 72 deletions(-) diff --git a/src/components/helpers/SourceCodeViewer/SourceCodeViewer.js b/src/components/helpers/SourceCodeViewer/SourceCodeViewer.js index 386d93089..3dd20c8ee 100644 --- a/src/components/helpers/SourceCodeViewer/SourceCodeViewer.js +++ b/src/components/helpers/SourceCodeViewer/SourceCodeViewer.js @@ -32,27 +32,24 @@ const getMode = ext => { }; const SourceCodeViewer = ( - { name, content = '', lineNumbers = true, height }, + { name, content = '', lineNumbers = true }, { userSettings: { vimMode = false, darkTheme = false } } ) => - height - ? - : null; + ; SourceCodeViewer.propTypes = { name: PropTypes.string.isRequired, content: PropTypes.string, - lineNumbers: PropTypes.bool, - height: PropTypes.number + lineNumbers: PropTypes.bool }; SourceCodeViewer.contextTypes = { diff --git a/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js b/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js index 69bcebb95..870cb6e47 100644 --- a/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js +++ b/src/containers/SourceCodeViewerContainer/SourceCodeViewerContainer.js @@ -16,8 +16,6 @@ import SourceCodeViewer from '../../components/helpers/SourceCodeViewer'; import styles from './sourceCode.less'; class SourceCodeViewerContainer extends Component { - state = { height: null }; - componentWillMount() { const { fileId, loadAsync } = this.props; if (fileId !== null) { @@ -31,45 +29,13 @@ class SourceCodeViewerContainer extends Component { } } - onModalEntered() { - if (this.state.height === null) { - const { headerRef, bodyRef, footerRef } = this; - const height = - window.innerHeight - - headerRef.clientHeight - - bodyRef.clientHeight - - footerRef.clientHeight; - this.setState({ height }); - } - } - - onModalEnteredWhileLoading() { - if (this.state.height === null) { - const { loadingHeaderRef, loadingBodyRef, loadingFooterRef } = this; - const height = - window.innerHeight - - loadingHeaderRef.clientHeight - - loadingBodyRef.clientHeight - - loadingFooterRef.clientHeight; - this.setState({ height }); - } else { - // console.log('already has height', this.state.height); - } - } - render() { const { show, onHide, download, file, content } = this.props; - const { height } = this.state; return ( this.onModalEnteredWhileLoading()} - > -
    (this.loadingHeaderRef = header)}> + +
    {' '} @@ -80,12 +46,14 @@ class SourceCodeViewerContainer extends Component {
    -
    (this.loadingBodyRef = body)}> +
    - +
    + +
    -
    (this.loadingFooterRef = footer)}> +