diff --git a/src/components/Exercises/ReferenceSolutionsList/ReferenceSolutionsList.js b/src/components/Exercises/ReferenceSolutionsList/ReferenceSolutionsList.js index 9d6788593..7494313da 100644 --- a/src/components/Exercises/ReferenceSolutionsList/ReferenceSolutionsList.js +++ b/src/components/Exercises/ReferenceSolutionsList/ReferenceSolutionsList.js @@ -36,10 +36,9 @@ const ReferenceSolutionsList = ({ .map( ({ id, - uploadedAt, description, permissionHints, - solution: { userId } + solution: { userId, createdAt } }) => @@ -49,8 +48,8 @@ const ReferenceSolutionsList = ({ {description} -  {' '} - +  {' '} + diff --git a/src/components/Groups/ResultsTable/ResultsTableRow.js b/src/components/Groups/ResultsTable/ResultsTableRow.js index 22f8387cc..d0be83bee 100644 --- a/src/components/Groups/ResultsTable/ResultsTableRow.js +++ b/src/components/Groups/ResultsTable/ResultsTableRow.js @@ -14,7 +14,10 @@ const ResultsTableRow = ({ userId, assignmentsIds, submissions }) => { .filter(s => s !== null) .filter(s => s.exerciseAssignmentId === assignmentId)[0]; const points = - submission !== null + submission && + submission !== null && + submission.lastSubmission.evaluation && + submission.lastSubmission.evaluation.points ? submission.lastSubmission.evaluation.points : '-'; const bonusPoints = diff --git a/src/components/forms/EditGroupForm/EditGroupForm.js b/src/components/forms/EditGroupForm/EditGroupForm.js index 867d9f50a..938287880 100644 --- a/src/components/forms/EditGroupForm/EditGroupForm.js +++ b/src/components/forms/EditGroupForm/EditGroupForm.js @@ -227,15 +227,6 @@ const validate = ({ localizedTexts = [], threshold }) => { /> ); } - - if (!localizedTexts[i].description) { - localeErrors['description'] = ( - - ); - } } localizedTextsErrors[i] = localeErrors; diff --git a/src/containers/SidebarContainer/SidebarContainer.js b/src/containers/SidebarContainer/SidebarContainer.js index b537d72eb..72528347b 100644 --- a/src/containers/SidebarContainer/SidebarContainer.js +++ b/src/containers/SidebarContainer/SidebarContainer.js @@ -8,8 +8,8 @@ import { } from '../../redux/selectors/groups'; import { notificationsSelector, - isSuperAdmin, - isSupervisor + isSupervisor, + isLoggedAsSuperAdmin } from '../../redux/selectors/users'; const mapStateToProps = state => { @@ -17,7 +17,7 @@ const mapStateToProps = state => { return { instances: memberOfInstances(userId)(state), studentOf: studentOfSelector(userId)(state), - isAdmin: isSuperAdmin(userId)(state), + isAdmin: isLoggedAsSuperAdmin(state), isSupervisor: isSupervisor(userId)(state), supervisorOf: supervisorOfSelector(userId)(state), notifications: notificationsSelector(state) diff --git a/src/pages/Assignment/Assignment.js b/src/pages/Assignment/Assignment.js index d25c00f06..6ba0ea88c 100644 --- a/src/pages/Assignment/Assignment.js +++ b/src/pages/Assignment/Assignment.js @@ -27,9 +27,9 @@ import { canSubmitSolution } from '../../redux/selectors/canSubmit'; import { isSubmitting } from '../../redux/selectors/submission'; import { loggedInUserIdSelector } from '../../redux/selectors/auth'; import { - isSuperAdmin, isStudentOf, - isSupervisorOf + isSupervisorOf, + isLoggedAsSuperAdmin } from '../../redux/selectors/users'; import { runtimeEnvironmentSelector } from '../../redux/selectors/runtimeEnvironments'; @@ -356,7 +356,7 @@ export default withLinks( ), userId, loggedInUserId, - isSuperAdmin: isSuperAdmin(loggedInUserId)(state), + isSuperAdmin: isLoggedAsSuperAdmin(state), isStudentOf: groupId => isStudentOf(loggedInUserId, groupId)(state), isSupervisorOf: groupId => isSupervisorOf(loggedInUserId, groupId)(state), diff --git a/src/pages/Dashboard/Dashboard.js b/src/pages/Dashboard/Dashboard.js index 167113ca7..984cf3c05 100644 --- a/src/pages/Dashboard/Dashboard.js +++ b/src/pages/Dashboard/Dashboard.js @@ -30,7 +30,7 @@ import { supervisorOfGroupsIdsSelector, isStudent, isSupervisor, - isSuperAdmin + isLoggedAsSuperAdmin } from '../../redux/selectors/users'; import { loggedInUserIdSelector } from '../../redux/selectors/auth'; @@ -73,7 +73,7 @@ class Dashboard extends Component { const state = getState(); const user = getJsData(getUser(userId)(state)); const groups = user.groups.studentOf.concat(user.groups.supervisorOf); - const isAdmin = isSuperAdmin(userId)(state); + const isAdmin = isLoggedAsSuperAdmin(state); return dispatch(fetchGroupsIfNeeded(...groups)).then(groups => Promise.all( @@ -103,11 +103,11 @@ class Dashboard extends Component { supervisor, supervisorOf, supervisorOfGroupsIds, + superadmin, groupAssignments, groupStatistics, usersStatistics, allGroups, - isAdmin, links: { GROUP_URI_FACTORY }, intl: { locale } } = this.props; @@ -265,8 +265,10 @@ class Dashboard extends Component { } } - {(supervisor || isAdmin) && - + {(supervisor || superadmin) && + {(...groups) => } } @@ -343,7 +345,6 @@ Dashboard.propTypes = { groupStatistics: PropTypes.func.isRequired, usersStatistics: PropTypes.func.isRequired, allGroups: PropTypes.array, - isAdmin: PropTypes.bool, links: PropTypes.object, intl: PropTypes.shape({ locale: PropTypes.string.isRequired }).isRequired }; @@ -356,7 +357,7 @@ export default withLinks( userId, student: isStudent(userId)(state), supervisor: isSupervisor(userId)(state), - superadmin: isSuperAdmin(userId)(state), + superadmin: isLoggedAsSuperAdmin(state), user: getUser(userId)(state), studentOfGroupsIds: studentOfGroupsIdsSelector(userId)(state).toArray(), studentOf: studentOfSelector(userId)(state).toArray(), @@ -368,8 +369,7 @@ export default withLinks( groupStatistics: groupId => createGroupsStatsSelector(groupId)(state), usersStatistics: statistics => statistics.find(stat => stat.userId === userId) || {}, - allGroups: groupsSelector(state).toArray(), - isAdmin: isSuperAdmin(userId)(state) + allGroups: groupsSelector(state).toArray() }; }, (dispatch, { params }) => ({ diff --git a/src/pages/EditExerciseConfig/EditExerciseConfig.js b/src/pages/EditExerciseConfig/EditExerciseConfig.js index d4ab3d3de..373e8b19a 100644 --- a/src/pages/EditExerciseConfig/EditExerciseConfig.js +++ b/src/pages/EditExerciseConfig/EditExerciseConfig.js @@ -11,7 +11,7 @@ import Box from '../../components/widgets/Box'; import ResourceRenderer from '../../components/helpers/ResourceRenderer'; import { LocalizedExerciseName } from '../../components/helpers/LocalizedNames'; -// import EditExerciseConfigForm from '../../components/forms/EditExerciseConfigForm/EditExerciseConfigForm'; +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'; @@ -51,6 +51,7 @@ import { simpleLimitsSelector } from '../../redux/selectors/simpleLimits'; import withLinks from '../../hoc/withLinks'; import { getLocalizedName } from '../../helpers/getLocalizedData'; +import { isLoggedAsSuperAdmin } from '../../redux/selectors/users'; class EditExerciseConfig extends Component { componentWillMount = () => this.props.loadAsync(); @@ -87,19 +88,20 @@ class EditExerciseConfig extends Component { params: { exerciseId }, exercise, editEnvironmentConfigs, - // setConfig, + setConfig, runtimeEnvironments, environmentFormValues, exerciseConfig, exerciseEnvironmentConfig, exerciseScoreConfig, editEnvironmentSimpleLimits, - // pipelines, + pipelines, limits, setHorizontally, setVertically, setAll, editScoreConfig, + superadmin, intl: { locale } } = this.props; @@ -200,13 +202,14 @@ class EditExerciseConfig extends Component { > {(config, ...runtimeEnvironments) =>
- {/* */} + {superadmin && + } - simpleLimitsSelector(exerciseId, runtimeEnvironmentId)(state) + simpleLimitsSelector(exerciseId, runtimeEnvironmentId)(state), + superadmin: isLoggedAsSuperAdmin(state) }; }, (dispatch, { params: { exerciseId } }) => ({ diff --git a/src/pages/Exercises/Exercises.js b/src/pages/Exercises/Exercises.js index b2ff3c38e..7f53e45fd 100644 --- a/src/pages/Exercises/Exercises.js +++ b/src/pages/Exercises/Exercises.js @@ -13,7 +13,10 @@ import PageContent from '../../components/layout/PageContent'; import Box from '../../components/widgets/Box'; import { AddIcon, EditIcon } from '../../components/icons'; import { fetchManyStatus } from '../../redux/selectors/exercises'; -import { canEditExercise, isSuperAdmin } from '../../redux/selectors/users'; +import { + canEditExercise, + isLoggedAsSuperAdmin +} from '../../redux/selectors/users'; import { loggedInUserIdSelector } from '../../redux/selectors/auth'; import { fetchExercises, @@ -201,7 +204,7 @@ export default withLinks( const userId = loggedInUserIdSelector(state); return { fetchStatus: fetchManyStatus(state), - isSuperAdmin: isSuperAdmin(userId)(state), + isSuperAdmin: isLoggedAsSuperAdmin(state), isAuthorOfExercise: exerciseId => canEditExercise(userId, exerciseId)(state) }; diff --git a/src/pages/Group/Group.js b/src/pages/Group/Group.js index 94f671b29..cb4baece4 100644 --- a/src/pages/Group/Group.js +++ b/src/pages/Group/Group.js @@ -45,7 +45,7 @@ import { isStudentOf, isSupervisorOf, isAdminOf, - isSuperAdmin + isLoggedAsSuperAdmin } from '../../redux/selectors/users'; import { @@ -331,7 +331,7 @@ const mapStateToProps = (state, { params: { groupId } }) => { isStudent: isStudentOf(userId, groupId)(state), isSupervisor: isSupervisorOf(userId, groupId)(state), isAdmin: isAdminOf(userId, groupId)(state), - isSuperAdmin: isSuperAdmin(userId)(state) + isSuperAdmin: isLoggedAsSuperAdmin(state) }; }; diff --git a/src/pages/Instance/Instance.js b/src/pages/Instance/Instance.js index d1a888f02..f38a7e492 100644 --- a/src/pages/Instance/Instance.js +++ b/src/pages/Instance/Instance.js @@ -24,7 +24,7 @@ import { createGroup } from '../../redux/modules/groups'; import { fetchInstancePublicGroups } from '../../redux/modules/publicGroups'; import { publicGroupsSelectors } from '../../redux/selectors/publicGroups'; import { loggedInUserIdSelector } from '../../redux/selectors/auth'; -import { isSuperAdmin } from '../../redux/selectors/users'; +import { isLoggedAsSuperAdmin } from '../../redux/selectors/users'; import withLinks from '../../hoc/withLinks'; @@ -152,7 +152,7 @@ export default withLinks( instance: instanceSelector(state, instanceId), groups: publicGroupsSelectors(state), isAdmin: isAdminOfInstance(userId, instanceId)(state), - isSuperAdmin: isSuperAdmin(userId)(state), + isSuperAdmin: isLoggedAsSuperAdmin(state), formValues: getFormValues('editGroup')(state) }; }, diff --git a/src/pages/Submission/Submission.js b/src/pages/Submission/Submission.js index f2b325d47..b647febf2 100644 --- a/src/pages/Submission/Submission.js +++ b/src/pages/Submission/Submission.js @@ -23,7 +23,7 @@ import { getAssignment } from '../../redux/selectors/assignments'; import { isSupervisorOf, isAdminOf, - isSuperAdmin + isLoggedAsSuperAdmin } from '../../redux/selectors/users'; import { loggedInUserIdSelector } from '../../redux/selectors/auth'; import { @@ -166,7 +166,7 @@ export default connect( isSupervisorOrMore: groupId => isSupervisorOf(loggedInUserIdSelector(state), groupId)(state) || isAdminOf(loggedInUserIdSelector(state), groupId)(state) || - isSuperAdmin(loggedInUserIdSelector(state))(state), + isLoggedAsSuperAdmin(state), evaluations: evaluationsForSubmissionSelector(submissionId)(state), fetchStatus: fetchManyStatus(submissionId)(state) }), diff --git a/src/pages/User/User.js b/src/pages/User/User.js index a691a169d..5c62d5e7b 100644 --- a/src/pages/User/User.js +++ b/src/pages/User/User.js @@ -25,7 +25,7 @@ import { getUser, studentOfGroupsIdsSelector, isStudent, - isSuperAdmin + isLoggedAsSuperAdmin } from '../../redux/selectors/users'; import { getProfile } from '../../redux/selectors/publicProfiles'; import { loggedInUserIdSelector } from '../../redux/selectors/auth'; @@ -275,7 +275,7 @@ export default withLinks( connect( (state, { params: { userId } }) => { const loggedInUserId = loggedInUserIdSelector(state); - const isSuperadmin = isSuperAdmin(loggedInUserId)(state); + const isSuperadmin = isLoggedAsSuperAdmin(state); const studentOfArray = studentOfSelector2(userId)(state) .toList() diff --git a/src/pages/Users/Users.js b/src/pages/Users/Users.js index f3b12d029..17eb8fe49 100644 --- a/src/pages/Users/Users.js +++ b/src/pages/Users/Users.js @@ -15,11 +15,10 @@ import Box from '../../components/widgets/Box'; import UsersList from '../../components/Users/UsersList'; import SearchContainer from '../../containers/SearchContainer'; import { - isSuperAdmin, fetchManyStatus, - loggedInUserSelector + loggedInUserSelector, + isLoggedAsSuperAdmin } from '../../redux/selectors/users'; -import { loggedInUserIdSelector } from '../../redux/selectors/auth'; import { fetchAllUsers } from '../../redux/modules/users'; import { takeOver } from '../../redux/modules/auth'; import { searchPeople } from '../../redux/modules/search'; @@ -172,7 +171,7 @@ export default withLinks( connect( state => { return { - isSuperAdmin: isSuperAdmin(loggedInUserIdSelector(state))(state), + isSuperAdmin: isLoggedAsSuperAdmin(state), fetchStatus: fetchManyStatus(state), user: loggedInUserSelector(state) }; diff --git a/src/redux/selectors/users.js b/src/redux/selectors/users.js index df2f50f2d..5ebfe323b 100644 --- a/src/redux/selectors/users.js +++ b/src/redux/selectors/users.js @@ -59,9 +59,6 @@ export const isStudent = userId => export const isSupervisor = userId => createSelector(getRole(userId), role => role === 'supervisor'); -export const isSuperAdmin = userId => - createSelector(getRole(userId), role => role === 'superadmin'); - export const getUserSettings = userId => createSelector( getUser(userId), @@ -73,6 +70,11 @@ export const loggedInUserSelector = createSelector( (users, id) => users.get(id) ); +export const isLoggedAsSuperAdmin = createSelector( + [usersSelector, loggedInUserIdSelector], + (users, id) => users.get(id).getIn(['data', 'role']) === 'superadmin' +); + export const memberOfInstancesIdsSelector = userId => createSelector( getUser(userId), @@ -116,7 +118,7 @@ export const isSupervisorOf = (userId, groupId) => export const isAdminOf = (userId, groupId) => createSelector( - [groupSelector(groupId), isSuperAdmin(userId)], + [groupSelector(groupId), isLoggedAsSuperAdmin], (group, isSuperAdmin) => isSuperAdmin === true || (group && @@ -142,7 +144,7 @@ export const usersGroupsIds = userId => export const canEditExercise = (userId, exerciseId) => createSelector( - [exerciseSelector(exerciseId), isSuperAdmin(userId)], + [exerciseSelector(exerciseId), isLoggedAsSuperAdmin], (exercise, isSuperAdmin) => isSuperAdmin || (exercise && @@ -152,7 +154,7 @@ export const canEditExercise = (userId, exerciseId) => export const canEditPipeline = (userId, pipelineId) => createSelector( - [pipelineSelector(pipelineId), isSuperAdmin(userId)], + [pipelineSelector(pipelineId), isLoggedAsSuperAdmin], (pipeline, isSuperAdmin) => isSuperAdmin || (pipeline &&