Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions server/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ plugins {
id "jacoco"
}

version "0.8.15"
version "0.8.16"
group "com.objectcomputing.checkins"

repositories {
Expand Down Expand Up @@ -63,7 +63,7 @@ configurations {
}

dependencies {
runtimeOnly("org.flywaydb:flyway-database-postgresql")
runtimeOnly("org.flywaydb:flyway-database-postgresql:11.3.4")
runtimeOnly("org.yaml:snakeyaml")
runtimeOnly("ch.qos.logback:logback-classic")
runtimeOnly("org.postgresql:postgresql")
Expand Down
4 changes: 2 additions & 2 deletions web-ui/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "web-ui",
"version": "0.8.15",
"version": "0.8.16",
"private": true,
"type": "module",
"dependencies": {
Expand All @@ -20,7 +20,7 @@
"@mui/styles": "^5.15.14",
"@mui/x-date-pickers": "^7.3.1",
"@tinymce/tinymce-react": "^5.0.0",
"axios": "^1.7.4",
"axios": "^1.8.2",
"canvas-confetti": "^1.6.0",
"date-fns": "^2.24.0",
"dayjs": "^1.11.11",
Expand Down
6 changes: 3 additions & 3 deletions web-ui/src/api/roles.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ export const getAllRoles = async cookie => {
});
};

export const getAllUserRoles = async cookie => {
export const getAllMemberRoles = async cookie => {
return resolve({
url: roleURL + '/members',
headers: { 'X-CSRF-Header': cookie, Accept: 'application/json' }
});
};

export const removeUserFromRole = async (roleId, memberId, cookie) => {
export const removeMemberFromRole = async (roleId, memberId, cookie) => {
return resolve({
method: 'DELETE',
url: roleURL + `/members/${roleId}/${memberId}`,
Expand All @@ -28,7 +28,7 @@ export const removeUserFromRole = async (roleId, memberId, cookie) => {
});
};

export const addUserToRole = async (roleId, memberId, cookie) => {
export const addMemberToRole = async (roleId, memberId, cookie) => {
return resolve({
method: 'POST',
url: roleURL + '/members',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ const initialState = {
teams: [],
skills: [],
roles: [],
userRoles: [],
memberRoles: [],
memberSkills: [],
memberProfiles: []
}
Expand Down
43 changes: 23 additions & 20 deletions web-ui/src/components/admin/roles/Roles.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@ import React, { useContext, useEffect, useState } from 'react';
import { AppContext } from '../../../context/AppContext';
import {
SET_ROLES,
SET_USER_ROLES,
SET_MEMBER_ROLES,
UPDATE_TOAST
} from '../../../context/actions';
import {
addUserToRole,
addMemberToRole,
addNewRole,
removeUserFromRole,
removeMemberFromRole,
updateRole
} from '../../../api/roles';
import {
selectCanEditMemberRolesPermission,
noPermission,
noPermission, selectMemberRoles, selectCsrfToken, selectRoles, selectMemberProfiles,
} from '../../../context/selectors';
import RoleUserCards from './RoleUserCards';

Expand Down Expand Up @@ -52,8 +52,11 @@ import './Roles.css';

const Roles = () => {
const { state, dispatch } = useContext(AppContext);
// roles here is all possible roles, not the selected roles.
const { csrf, memberProfiles, roles, userRoles } = state;

const csrf = selectCsrfToken(state);
const memberProfiles = selectMemberProfiles(state);
const roles = selectRoles(state); // all possible roles, not the selected roles.
const memberRoles = selectMemberRoles(state);

const [showAddUser, setShowAddUser] = useState(false);
const [showEditRole, setShowEditRole] = useState(false);
Expand Down Expand Up @@ -97,25 +100,25 @@ const Roles = () => {
}

const newRoleToMemberMap = {};
for (const userRole of userRoles || []) {
for (const memberRole of memberRoles || []) {
const role = roles.find(
role => role.id === userRole?.memberRoleId?.roleId
role => role.id === memberRole?.memberRoleId?.roleId
);
if (role) {
let memberList = newRoleToMemberMap[role.role];
if (!memberList) {
memberList = newRoleToMemberMap[role.role] = [];
}
if (memberMap[userRole?.memberRoleId?.memberId] !== undefined) {
if (memberMap[memberRole?.memberRoleId?.memberId] !== undefined) {
memberList.push({
...memberMap[userRole?.memberRoleId?.memberId],
...memberMap[memberRole?.memberRoleId?.memberId],
roleId: role.id
});
}
}
}
setRoleToMemberMap(newRoleToMemberMap);
}, [userRoles, memberProfiles, roles]);
}, [memberRoles, memberProfiles, roles]);

const getRoleStats = role => {
let members = roleToMemberMap[role];
Expand All @@ -125,20 +128,20 @@ const Roles = () => {
const removeFromRole = async (member, role) => {
const members = roleToMemberMap[role];
const { roleId } = members.find(m => member.id === m.id);
let res = await removeUserFromRole(roleId, member.id, csrf);
let res = await removeMemberFromRole(roleId, member.id, csrf);
let data =
res.payload && res.payload.status === 200 && !res.error
? res.payload
: null;
if (data) {
// TODO: Remove role from map....
const filtered = userRoles.filter(
userRole =>
userRole?.memberRoleId?.roleId !== roleId ||
userRole?.memberRoleId?.memberId !== member.id
const filtered = memberRoles.filter(
memberRole =>
memberRole?.memberRoleId?.roleId !== roleId ||
memberRole?.memberRoleId?.memberId !== member.id
);
dispatch({
type: SET_USER_ROLES,
type: SET_MEMBER_ROLES,
payload: filtered
});
window.snackDispatch({
Expand All @@ -153,14 +156,14 @@ const Roles = () => {

const addToRole = async member => {
const role = roles.find(role => role.role === currentRole.role);
let res = await addUserToRole(role.id, member.id, csrf);
let res = await addMemberToRole(role.id, member.id, csrf);
let data =
res.payload && res.payload.data && !res.error ? res.payload.data : null;
if (data) {
setShowAddUser(false);
dispatch({
type: SET_USER_ROLES,
payload: [...userRoles, data]
type: SET_MEMBER_ROLES,
payload: [...memberRoles, data]
});
window.snackDispatch({
type: UPDATE_TOAST,
Expand Down
37 changes: 34 additions & 3 deletions web-ui/src/components/admin/roles/Roles.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,49 @@ const initialState = {
{ id: 2, name: 'Señora Test' },
{ id: 3, name: 'Herr Test' }
],
memberRoles: [
{ memberRoleId: { roleId: 1, memberId: 1 } },
{ memberRoleId: { roleId: 2, memberId: 2 } },
],
roles: [
{ id: 1, role: 'ADMIN', memberid: 1 },
{ id: 2, role: 'PDL', memberid: 2 }
{ id: 1, role: 'ADMIN', description: 'Administrator' },
{ id: 2, role: 'PDL', description: 'Prof. Dev. Lead' },
{ id: 3, role: 'MEMBER', description: 'A member of the org' }
],
userProfile: {
name: 'Current User',
role: ['MEMBER'],
id: 1,
permissions: [{ permission: 'CAN_EDIT_MEMBER_ROLES' }],
},
}
};

const noPermState = {
state: {
memberProfiles: [
{ id: 1, name: 'Señior Test' },
{ id: 2, name: 'Señora Test' },
{ id: 3, name: 'Herr Test' }
],
memberRoles: [
{ memberRoleId: { roleId: 1, memberId: 1 } },
{ memberRoleId: { roleId: 2, memberId: 2 } },
],
roles: [
{ id: 1, role: 'ADMIN', description: 'Administrator' },
{ id: 2, role: 'PDL', description: 'Prof. Dev. Lead' },
{ id: 3, role: 'MEMBER', description: 'A member of the org' }
],
userProfile: {
name: 'Current User',
role: ['MEMBER'],
id: 1,
permissions: [],
},
}
};

it('renders correctly', () => {
snapshot(
<AppContextProvider value={initialState}>
Expand All @@ -31,7 +62,7 @@ it('renders correctly', () => {

it('renders an error if user does not have appropriate permission', () => {
snapshot(
<AppContextProvider>
<AppContextProvider value={noPermState}>
<Roles />
</AppContextProvider>
);
Expand Down
Loading
Loading