Skip to content

Commit

Permalink
Better select groups with assign permission
Browse files Browse the repository at this point in the history
  • Loading branch information
SemaiCZE committed Feb 25, 2018
1 parent 1302afc commit 63f3d91
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 17 deletions.
4 changes: 2 additions & 2 deletions src/components/forms/MultiAssignForm/MultiAssignForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ const MultiAssignForm = ({
locale
)
)
.map(group =>
.map((group, i) =>
<Field
key={group.id}
key={i}
name={`groups.${group.id}`}
component={CheckboxField}
onOff
Expand Down
20 changes: 6 additions & 14 deletions src/pages/Exercise/Exercise.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,8 @@ import {

import { loggedInUserIdSelector } from '../../redux/selectors/auth';
import {
supervisorOfSelector,
groupsSelector,
groupDataAccessorSelector
groupDataAccessorSelector,
groupsUserCanEditSelector
} from '../../redux/selectors/groups';

import withLinks from '../../helpers/withLinks';
Expand Down Expand Up @@ -104,14 +103,9 @@ class Exercise extends Component {
dispatch(fetchHardwareGroups()),
dispatch(fetchExercisePipelines(exerciseId)),
dispatch(fetchUsersGroupsIfNeeded(userId)),
dispatch(fetchUser(userId))
.then(res => res.value)
.then(
data =>
data.privateData.role === 'superadmin'
? dispatch(fetchInstanceGroups(data.privateData.instanceId))
: Promise.resolve()
)
dispatch(fetchUser(userId)).then(({ value: data }) =>
dispatch(fetchInstanceGroups(data.privateData.instanceId))
)
]);

componentWillMount() {
Expand Down Expand Up @@ -493,7 +487,6 @@ Exercise.propTypes = {
editAssignment: PropTypes.func.isRequired,
push: PropTypes.func.isRequired,
exercise: ImmutablePropTypes.map,
supervisedGroups: PropTypes.object,
canEditExercise: PropTypes.bool.isRequired,
referenceSolutions: ImmutablePropTypes.map,
intl: intlShape.isRequired,
Expand Down Expand Up @@ -522,11 +515,10 @@ export default withLinks(
userId,
exercise: exerciseSelector(exerciseId)(state),
submitting: isSubmitting(state),
supervisedGroups: supervisorOfSelector(userId)(state),
canEditExercise: canLoggedUserEditExercise(exerciseId)(state),
referenceSolutions: referenceSolutionsSelector(exerciseId)(state),
exercisePipelines: exercisePipelinesSelector(exerciseId)(state),
groups: groupsSelector(state),
groups: groupsUserCanEditSelector(state),
groupsAccessor: groupDataAccessorSelector(state),
isSuperAdmin: isLoggedAsSuperAdmin(state),
firstDeadline: editMultiAssignFormSelector(state, 'firstDeadline'),
Expand Down
24 changes: 23 additions & 1 deletion src/redux/selectors/groups.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ import { EMPTY_LIST, EMPTY_MAP, EMPTY_ARRAY } from '../../helpers/common';

import {
studentOfGroupsIdsSelector,
supervisorOfGroupsIdsSelector
supervisorOfGroupsIdsSelector,
isLoggedAsSuperAdmin
} from './users';
import { getAssignments } from './assignments';
import { isReady, getId, getJsData } from '../helpers/resourceManager';
import { loggedInUserIdSelector } from './auth';

/**
* Select groups part of the state
Expand Down Expand Up @@ -73,6 +75,26 @@ export const adminOfSelector = userId =>
)
);

export const groupsUserCanEditSelector = createSelector(
[
loggedInUserIdSelector,
groupsSelector,
state => isLoggedAsSuperAdmin(state)
],
(userId, groups, isSuperAdmin) =>
groups.filter(isReady).filter(group => {
if (isSuperAdmin) {
return true;
}
const groupData = getJsData(group);
return (
groupData.privateData &&
(groupData.privateData.supervisors.indexOf(userId) >= 0 ||
groupData.privateData.admins.indexOf(userId) >= 0)
);
})
);

const usersOfGroup = (type, groupId) =>
createSelector(
groupSelector(groupId),
Expand Down

0 comments on commit 63f3d91

Please sign in to comment.