diff --git a/.env-sample b/.env-sample
index ebbf2820f..1de723d46 100644
--- a/.env-sample
+++ b/.env-sample
@@ -10,3 +10,11 @@ ALLOW_NORMAL_REGISTRATION=true
ALLOW_LDAP_REGISTRATION=false
ALLOW_CAS_REGISTRATION=true
+
+# LOGGER_MIDDLEWARE is active only if NODE_ENV=development
+
+# verbose debug action logging
+LOGGER_MIDDLEWARE_VERBOSE=false
+
+# log complete dump of exceptions
+LOGGER_MIDDLEWARE_EXCEPTIONS=true
diff --git a/config/webpack.config.js b/config/webpack.config.js
index 4b8819bd4..890fb04a3 100644
--- a/config/webpack.config.js
+++ b/config/webpack.config.js
@@ -65,7 +65,9 @@ module.exports = {
"'" + process.env.ALLOW_NORMAL_REGISTRATION + "'",
ALLOW_LDAP_REGISTRATION:
"'" + process.env.ALLOW_LDAP_REGISTRATION + "'",
- ALLOW_CAS_REGISTRATION: "'" + process.env.ALLOW_CAS_REGISTRATION + "'"
+ ALLOW_CAS_REGISTRATION: "'" + process.env.ALLOW_CAS_REGISTRATION + "'",
+ LOGGER_MIDDLEWARE_VERBOSE: "'" + process.env.LOGGER_MIDDLEWARE_VERBOSE + "'",
+ LOGGER_MIDDLEWARE_EXCEPTIONS: "'" + process.env.LOGGER_MIDDLEWARE_EXCEPTIONS + "'",
},
gitRevision: {
VERSION: JSON.stringify(gitRevisionPlugin.version()),
diff --git a/package.json b/package.json
index aa3129e5f..403dad055 100644
--- a/package.json
+++ b/package.json
@@ -28,6 +28,8 @@
},
"dependencies": {
"admin-lte": "2.3.11",
+ "ajv": "5.5.1",
+ "ajv-keywords": "2.1.1",
"babel-plugin-react-intl": "^2.1.3",
"bluebird": "^3.3.5",
"browser-cookies": "^1.0.8",
@@ -48,39 +50,35 @@
"global": "^4.3.1",
"immutable": "^3.8.1",
"isomorphic-fetch": "^2.2.1",
+ "js-yaml": "^3.10.0",
"jwt-decode": "^2.0.1",
"moment": "^2.18.1",
- "pretty-bytes": "^3.0.1",
"pretty-ms": "^2.1.0",
"prop-types": "^15.5.8",
- "react": "^15.5.4",
- "react-ace": "^4.2.1",
- "react-bootstrap": "^0.31.2",
- "react-codemirror": "^0.3.0",
+ "react": "^16.2.0",
+ "react-ace": "5.8.0",
+ "react-bootstrap": "0.31.5",
"react-collapse": "^4.0.2",
"react-copy-to-clipboard": "^5.0.1",
"react-datetime": "^2.8.10",
- "react-dom": "^15.5.4",
+ "react-dom": "^16.2.0",
"react-dropzone": "^3.5.3",
- "react-fontawesome": "^1.1.0",
+ "react-fontawesome": "1.6.1",
"react-height": "^3.0.0",
"react-helmet": "^5.0.3",
"react-immutable-proptypes": "^2.1.0",
- "react-intl": "^2.1.3",
- "react-motion": "^0.5.0",
+ "react-intl": "2.4.0",
+ "react-motion": "^0.5.2",
"react-redux": "^5.0.4",
"react-remarkable": "^1.1.2",
"react-responsive": "^1.1.3",
- "react-router": "^3.0.0",
+ "react-router": "3.2.0",
"react-router-bootstrap": "^0.23.3",
"react-router-redux": "^4.0.8",
- "react-rte": "^0.11.0",
- "react-table": "^6.0.0",
- "react-throttle": "^0.3.0",
- "react-toggle": "^3.0.1",
+ "react-toggle": "4.0.2",
"redux": "^3.5.1",
"redux-actions": "^2.0.3",
- "redux-form": "^6.2.1",
+ "redux-form": "7.2.0",
"redux-promise-middleware": "^4.2.0",
"redux-storage": "^4.1.2",
"redux-storage-decorator-filter": "^1.1.8",
@@ -118,7 +116,7 @@
"eslint-plugin-promise": "^3.5.0",
"eslint-plugin-react": "^7.0.0",
"eslint-plugin-standard": "^3.0.1",
- "extract-text-webpack-plugin": "^2.0.0-beta.4",
+ "extract-text-webpack-plugin": "3.0.2",
"fetch-mock": "^5.10.0",
"file-loader": "^0.11.1",
"git-revision-webpack-plugin": "^2.5.1",
@@ -143,9 +141,9 @@
"scroll-behavior": "^0.4.0",
"strip-loader": "^0.1.2",
"style-loader": "^0.17.0",
- "webpack": "^2.5.1",
+ "webpack": "3.10.0",
"webpack-dev-middleware": "^1.10.2",
- "webpack-dev-server": "^2.4.5",
+ "webpack-dev-server": "2.9.7",
"webpack-isomorphic-tools": "^3.0.2"
}
}
diff --git a/src/components/Assignments/Assignment/AssignmentSync/AssignmentSync.js b/src/components/Assignments/Assignment/AssignmentSync/AssignmentSync.js
new file mode 100644
index 000000000..2304db7fe
--- /dev/null
+++ b/src/components/Assignments/Assignment/AssignmentSync/AssignmentSync.js
@@ -0,0 +1,116 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { FormattedMessage } from 'react-intl';
+import { Row, Col, Alert } from 'react-bootstrap';
+
+import Button from '../../../widgets/FlatButton';
+
+const AssignmentSync = ({ syncInfo, exerciseSync }) =>
+ !syncInfo.exerciseConfig.upToDate ||
+ !syncInfo.configurationType.upToDate ||
+ !syncInfo.exerciseEnvironmentConfigs.upToDate ||
+ !syncInfo.hardwareGroups.upToDate ||
+ !syncInfo.localizedTexts.upToDate ||
+ !syncInfo.limits.upToDate ||
+ !syncInfo.scoreConfig.upToDate ||
+ !syncInfo.scoreCalculator.upToDate ||
+ !syncInfo.exerciseTests.upToDate
+ ?
+
+
+
+
+
+
+
+
+ {!syncInfo.exerciseConfig.upToDate &&
+ -
+
+
}
+ {!syncInfo.configurationType.upToDate &&
+ -
+
+
}
+ {!syncInfo.exerciseEnvironmentConfigs.upToDate &&
+ -
+
+
}
+ {!syncInfo.hardwareGroups.upToDate &&
+ -
+
+
}
+ {!syncInfo.localizedTexts.upToDate &&
+ -
+
+
}
+ {!syncInfo.limits.upToDate &&
+ -
+
+
}
+ {!syncInfo.scoreConfig.upToDate &&
+ -
+
+
}
+ {!syncInfo.scoreCalculator.upToDate &&
+ -
+
+
}
+ {!syncInfo.exerciseTests.upToDate &&
+ -
+
+
}
+
+
+
+
+
+
+
+
+ :
;
+
+AssignmentSync.propTypes = {
+ syncInfo: PropTypes.object.isRequired,
+ exerciseSync: PropTypes.func.isRequired
+};
+
+export default AssignmentSync;
diff --git a/src/components/Assignments/Assignment/AssignmentSync/index.js b/src/components/Assignments/Assignment/AssignmentSync/index.js
new file mode 100644
index 000000000..505e8a8b2
--- /dev/null
+++ b/src/components/Assignments/Assignment/AssignmentSync/index.js
@@ -0,0 +1 @@
+export default from './AssignmentSync';
diff --git a/src/components/Exercises/EditSimpleLimitsBox/EditSimpleLimitsBox.js b/src/components/Exercises/EditSimpleLimitsBox/EditSimpleLimitsBox.js
deleted file mode 100644
index b8fd9a347..000000000
--- a/src/components/Exercises/EditSimpleLimitsBox/EditSimpleLimitsBox.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-import { FormattedMessage } from 'react-intl';
-
-import Box from '../../widgets/Box';
-import EditSimpleLimits from '../../forms/EditSimpleLimits';
-
-const EditSimpleLimitsBox = ({ editLimits, limits, ...props }) =>
-
- }
- unlimitedHeight
- >
-
- ;
-
-EditSimpleLimitsBox.propTypes = {
- editLimits: PropTypes.func.isRequired,
- limits: PropTypes.func.isRequired
-};
-
-export default EditSimpleLimitsBox;
diff --git a/src/components/Exercises/EditSimpleLimitsBox/index.js b/src/components/Exercises/EditSimpleLimitsBox/index.js
deleted file mode 100644
index 5dfa24035..000000000
--- a/src/components/Exercises/EditSimpleLimitsBox/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export default from './EditSimpleLimitsBox';
diff --git a/src/components/Exercises/FilesTable/AttachmentFilesTableRow.js b/src/components/Exercises/FilesTable/AttachmentFilesTableRow.js
index 38771bc44..6583449b2 100644
--- a/src/components/Exercises/FilesTable/AttachmentFilesTableRow.js
+++ b/src/components/Exercises/FilesTable/AttachmentFilesTableRow.js
@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
-import prettyBytes from 'pretty-bytes';
+import { prettyPrintBytes } from '../../helpers/stringFormatters';
import { FormattedDate, FormattedTime, FormattedMessage } from 'react-intl';
import withLinks from '../../../hoc/withLinks';
import { Button } from 'react-bootstrap';
@@ -25,7 +25,7 @@ const AttachmentFilesTableRow = ({
- {prettyBytes(size)}
+ {prettyPrintBytes(size)}
|
diff --git a/src/components/Exercises/FilesTable/FilesTable.js b/src/components/Exercises/FilesTable/FilesTable.js
index 404ca3cbf..7baa07d8e 100644
--- a/src/components/Exercises/FilesTable/FilesTable.js
+++ b/src/components/Exercises/FilesTable/FilesTable.js
@@ -31,7 +31,7 @@ const FilesTable = ({
RowComponent,
intl
}) =>
-
+
{description &&
diff --git a/src/components/Exercises/FilesTable/SupplementaryFilesTableRow.js b/src/components/Exercises/FilesTable/SupplementaryFilesTableRow.js
index 8035f17ca..3626f472e 100644
--- a/src/components/Exercises/FilesTable/SupplementaryFilesTableRow.js
+++ b/src/components/Exercises/FilesTable/SupplementaryFilesTableRow.js
@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
-import prettyBytes from 'pretty-bytes';
+import { prettyPrintBytes } from '../../helpers/stringFormatters';
import { FormattedDate, FormattedTime, FormattedMessage } from 'react-intl';
import { Button } from 'react-bootstrap';
import Confirm from '../../../components/forms/Confirm';
@@ -26,7 +26,7 @@ const SupplementaryFilesTableRow = ({
}
|
- {prettyBytes(size)}
+ {prettyPrintBytes(size)}
|
diff --git a/src/components/Groups/SupervisorsView/SupervisorsView.js b/src/components/Groups/SupervisorsView/SupervisorsView.js
index 15e333e75..85da5a1d5 100644
--- a/src/components/Groups/SupervisorsView/SupervisorsView.js
+++ b/src/components/Groups/SupervisorsView/SupervisorsView.js
@@ -30,7 +30,7 @@ const SupervisorsView = ({
deleteExercise,
users,
publicAssignments,
- links: { EXERCISE_EDIT_URI_FACTORY, EXERCISE_EDIT_CONFIG_URI_FACTORY },
+ links: { EXERCISE_EDIT_URI_FACTORY, EXERCISE_EDIT_SIMPLE_CONFIG_URI_FACTORY },
intl: { locale }
}) =>
@@ -157,7 +157,7 @@ const SupervisorsView = ({
|