diff --git a/server/src/main/java/com/objectcomputing/checkins/security/permissions/Permissions.java b/server/src/main/java/com/objectcomputing/checkins/security/permissions/Permissions.java index 8646828415..acaea7e5a0 100644 --- a/server/src/main/java/com/objectcomputing/checkins/security/permissions/Permissions.java +++ b/server/src/main/java/com/objectcomputing/checkins/security/permissions/Permissions.java @@ -1,21 +1,37 @@ package com.objectcomputing.checkins.security.permissions; public enum Permissions { - CAN_VIEW_FEEDBACK_REQUEST, - CAN_CREATE_FEEDBACK_REQUEST, - CAN_DELETE_FEEDBACK_REQUEST, - CAN_VIEW_FEEDBACK_ANSWER, - CAN_DELETE_ORGANIZATION_MEMBERS, - CAN_CREATE_ORGANIZATION_MEMBERS, - CAN_VIEW_ROLE_PERMISSIONS, - CAN_ASSIGN_ROLE_PERMISSIONS, - CAN_VIEW_PERMISSIONS, - CAN_VIEW_SKILLS_REPORT, - CAN_VIEW_RETENTION_REPORT, - CAN_VIEW_ANNIVERSARY_REPORT, - CAN_VIEW_BIRTHDAY_REPORT, - CAN_VIEW_PROFILE_REPORT, - CAN_CREATE_CHECKINS, - CAN_VIEW_CHECKINS, - CAN_UPDATE_CHECKINS, -} \ No newline at end of file + CAN_VIEW_FEEDBACK_REQUEST("View feedback requests", "Feedback"), + CAN_CREATE_FEEDBACK_REQUEST("Create feedback requests", "Feedback"), + CAN_DELETE_FEEDBACK_REQUEST("Delete feedback requests", "Feedback"), + CAN_VIEW_FEEDBACK_ANSWER("View feedback answers", "Feedback"), + CAN_DELETE_ORGANIZATION_MEMBERS("Delete organization members", "User Management"), + CAN_CREATE_ORGANIZATION_MEMBERS("Create organization members", "User Management"), + CAN_VIEW_ROLE_PERMISSIONS("View role permissions", "Security"), + CAN_ASSIGN_ROLE_PERMISSIONS("Assign role permissions", "Security"), + CAN_VIEW_PERMISSIONS("View all permissions", "Security"), + CAN_VIEW_SKILLS_REPORT("View skills report", "Reporting"), + CAN_VIEW_RETENTION_REPORT("View retention report", "Reporting"), + CAN_VIEW_ANNIVERSARY_REPORT("View anniversary report", "Reporting"), + CAN_VIEW_BIRTHDAY_REPORT("View birthday report", "Reporting"), + CAN_VIEW_PROFILE_REPORT("View profile report", "Reporting"), + CAN_CREATE_CHECKINS("Create check-ins", "Check-ins"), + CAN_VIEW_CHECKINS("View check-ins", "Check-ins"), + CAN_UPDATE_CHECKINS("Update check-ins", "Check-ins"); + + private final String description; + private final String category; + + Permissions(String description, String category) { + this.description = description; + this.category = category; + } + + public String getDescription() { + return description; + } + + public String getCategory() { + return category; + } +} diff --git a/server/src/main/java/com/objectcomputing/checkins/services/permissions/Permission.java b/server/src/main/java/com/objectcomputing/checkins/services/permissions/Permission.java index 4c42d2bb05..1b05dd7992 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/permissions/Permission.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/permissions/Permission.java @@ -1,5 +1,6 @@ package com.objectcomputing.checkins.services.permissions; +import com.objectcomputing.checkins.security.permissions.Permissions; import io.micronaut.core.annotation.Introspected; import io.micronaut.core.annotation.Nullable; import io.micronaut.data.annotation.AutoPopulated; @@ -11,6 +12,7 @@ import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import javax.persistence.Transient; import javax.validation.constraints.NotBlank; import java.util.Objects; import java.util.UUID; @@ -36,6 +38,8 @@ public class Permission { @Schema(description = "A more verbose description of the permission to be displayed on UI") private String description; + public Permission() {} + public Permission(UUID id, String permission, @Nullable String description) { this.id = id; this.permission = permission; @@ -59,13 +63,18 @@ public void setPermission(String permission) { } public String getDescription() { - return description; + return Permissions.valueOf(permission).getDescription(); //ignoring the database for now... } - public void setDescription(String description) { + public void setDescription(@Nullable String description) { this.description = description; } + @Transient + public String getCategory() { + return Permissions.valueOf(permission).getCategory(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/server/src/test/java/com/objectcomputing/checkins/services/fixture/PermissionFixture.java b/server/src/test/java/com/objectcomputing/checkins/services/fixture/PermissionFixture.java index 2549fa3e46..83a280ea24 100644 --- a/server/src/test/java/com/objectcomputing/checkins/services/fixture/PermissionFixture.java +++ b/server/src/test/java/com/objectcomputing/checkins/services/fixture/PermissionFixture.java @@ -55,12 +55,12 @@ public interface PermissionFixture extends RepositoryFixture, RolePermissionFixt ); default Permission createACustomPermission(Permissions perm) { - return getPermissionRepository().save(new Permission(null, perm.name(), null)); + return getPermissionRepository().save(new Permission(null, perm.name(), perm.getDescription())); } default void saveAllPermissions() { for(Permissions permissions : Permissions.values()) { - getPermissionRepository().save(new Permission(null, permissions.name(), null)); + getPermissionRepository().save(new Permission(null, permissions.name(), permissions.getDescription())); } } diff --git a/web-ui/src/api/memberroles.js b/web-ui/src/api/memberroles.js new file mode 100644 index 0000000000..8208b4dfc0 --- /dev/null +++ b/web-ui/src/api/memberroles.js @@ -0,0 +1,11 @@ +import { resolve } from "./api.js"; + +const memberRolesUrl = "/services/roles/members" + +export const getMemberRolesList = async (cookie) => { + return resolve({ + url: memberRolesUrl, + responseType: "json", + headers: { "X-CSRF-Header": cookie }, + }); + }; \ No newline at end of file diff --git a/web-ui/src/api/permissions.js b/web-ui/src/api/permissions.js new file mode 100644 index 0000000000..d33ebda9c4 --- /dev/null +++ b/web-ui/src/api/permissions.js @@ -0,0 +1,11 @@ +import { resolve } from "./api.js"; + +const permissionsListUrl = "/services/permissions" + +export const getPermissionsList = async (cookie) => { + return resolve({ + url: permissionsListUrl, + responseType: "json", + headers: { "X-CSRF-Header": cookie }, + }); + }; \ No newline at end of file diff --git a/web-ui/src/api/rolepermissions.js b/web-ui/src/api/rolepermissions.js new file mode 100644 index 0000000000..ab00312aa1 --- /dev/null +++ b/web-ui/src/api/rolepermissions.js @@ -0,0 +1,31 @@ +import { resolve } from "./api.js"; + +const rolePermissionsListUrl = "/services/roles/role-permissions"; + +export const getRolePermissionsList = async (cookie) => { + return resolve({ + url: rolePermissionsListUrl, + responseType: "json", + headers: { "X-CSRF-Header": cookie }, + }); +}; + +export const postRolePermission = async (roleData, cookie) => { + return resolve({ + method: "post", + url: rolePermissionsListUrl, + responseType: "json", + data: roleData, + headers: { "X-CSRF-Header": cookie }, + }); +}; + +export const deleteRolePermission = async (roleData, cookie) => { + return resolve({ + method: "delete", + url: rolePermissionsListUrl, + responseType: "json", + data: roleData, + headers: { "X-CSRF-Header": cookie }, + }); +}; \ No newline at end of file diff --git a/web-ui/src/components/menu/Menu.jsx b/web-ui/src/components/menu/Menu.jsx index 77b6f148d6..6bd992778b 100644 --- a/web-ui/src/components/menu/Menu.jsx +++ b/web-ui/src/components/menu/Menu.jsx @@ -95,7 +95,7 @@ const Root = styled('div')(({theme}) => ({ })); const adminLinks = [ - // ["/admin/permissions", "Permissions"], + ["/admin/permissions", "Permissions"], ["/admin/roles", "Roles"], ["/admin/users", "Users"], ["/admin/email", "Send Email"], diff --git a/web-ui/src/components/routes/Routes.jsx b/web-ui/src/components/routes/Routes.jsx index 1c1bd610d7..17bc78857a 100644 --- a/web-ui/src/components/routes/Routes.jsx +++ b/web-ui/src/components/routes/Routes.jsx @@ -7,6 +7,7 @@ import BirthdayAnniversaryReportPage from "../../pages/BirthdayAnniversaryReport import CheckinsPage from "../../pages/CheckinsPage"; import CheckinsReportPage from "../../pages/CheckinsReportPage"; import EditSkillsPage from "../../pages/EditSkillsPage"; +import EditPermissionsPage from "../../pages/PermissionsPage"; import GroupIcon from "@mui/icons-material/Group"; import GuildsPage from "../../pages/GuildsPage"; import Header from "../header/Header"; @@ -101,6 +102,10 @@ export default function Routes() {
+ +
+ +
diff --git a/web-ui/src/context/selectors.js b/web-ui/src/context/selectors.js index fdd8c0b100..0bfe95e0ac 100644 --- a/web-ui/src/context/selectors.js +++ b/web-ui/src/context/selectors.js @@ -14,6 +14,7 @@ export const selectTeams = (state) => state.teams; export const selectGuilds = (state) => state.guilds; export const selectLoading = (state) => state.loading; export const selectReviewPeriods = (state) => state.reviewPeriods; +export const selectPermissions = (state) => state.permissions; export const selectTeamsLoading = createSelector ( selectLoading, @@ -40,6 +41,12 @@ export const selectIsAdmin = createSelector( userProfile && userProfile.role && userProfile.role.includes("ADMIN") ); +export const selectHasPermissionAssignmentPermission = createSelector( + selectUserProfile, + (userProfile) => + userProfile && userProfile.role && userProfile.permissions.some((p) => p?.permission?.includes("CAN_ASSIGN_ROLE_PERMISSIONS")) +); + export const selectHasReportPermission = createSelector( selectUserProfile, (userProfile) => diff --git a/web-ui/src/helpers/checks.js b/web-ui/src/helpers/checks.js new file mode 100644 index 0000000000..c643dbc636 --- /dev/null +++ b/web-ui/src/helpers/checks.js @@ -0,0 +1,23 @@ +/** + * Full check for whether an array actually exists or is empty, etc + * @param arr - an array + * @returns a boolean + */ + +export const isArrayPresent = (arr) => Array.isArray(arr) && arr.length; + +/** + * If a parameter is found in an object within an array, return the array with just that object. + * @param arr - an array + * @param value - a value + * @param key - an optional key with which to search + * @returns an array + */ + +export function filterObjectByValOrKey(arr, value, key) { + return arr.filter( + key + ? (a) => a[key].indexOf(value) > -1 + : (a) => Object.keys(a).some((k) => a[k] === value) + ); +} diff --git a/web-ui/src/pages/EditPermissionsPage.css b/web-ui/src/pages/EditPermissionsPage.css new file mode 100644 index 0000000000..22c42f021d --- /dev/null +++ b/web-ui/src/pages/EditPermissionsPage.css @@ -0,0 +1,7 @@ +.edit-permissions-page { + margin: 2rem; +} + +.edit-permissions-list { + margin: 1rem; +} diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx new file mode 100644 index 0000000000..cb15573e38 --- /dev/null +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -0,0 +1,1396 @@ +import React, { useEffect, useContext, useState } from "react"; + +import EditPermissionsPageRoles from "./EditPermissionsPageRoles"; + +import { getPermissionsList } from "../api/permissions"; +import { + getRolePermissionsList, + postRolePermission, + deleteRolePermission, +} from "../api/rolepermissions"; +import { getMemberRolesList } from "../api/memberroles"; +import { isArrayPresent, filterObjectByValOrKey } from "../helpers/checks"; +import { UPDATE_TOAST } from "../context/actions"; +import { AppContext } from "../context/AppContext"; +import { selectCurrentUserId } from "../context/selectors"; + +import "./EditPermissionsPage.css"; + +const groupPermissionsByCategory = (permissions) => permissions.reduce((categories, permission) => { + const category = permission.category; + const existingCategory = categories.find(cat => cat.category === category); + + // If category exists, add permission to its permissions array + if (existingCategory) { + existingCategory.permissions.push(permission); + } else { + // Create a new category object and add it to categories + categories.push({ + category, + permissions: [permission], + }); + } + + return categories; +}, []); + +const EditPermissionsPage = () => { + const { state } = useContext(AppContext); + const { csrf } = state; + const [permissionsList, setPermissionsList] = useState([]); + const [categoriesList, setCategoriesList] = useState([]); // eslint-disable-line no-unused-vars + const [adminId, setAdminId] = useState(""); + const [pdlId, setPDLId] = useState(""); + const [memberId, setMemberId] = useState(""); + const [rolePermissionsList, setRolePermissionsList] = useState([]); + const currentUserId = selectCurrentUserId(state); + const [currentUserRole, setCurrentUserRole] = useState(""); + const [memberRoles, setMemberRoles] = useState([]); + + const [isAdminRole, setIsAdminRole] = useState(false); + + const [adminPermissionsList, setAdminPermissionsList] = useState([]); + const [pdlPermissionsList, setPDLPermissionsList] = useState([]); + const [memberPermissionsList, setMemberPermissionsList] = useState([]); + + const [ + createFeedbackRequestPermissionsId, + setCreateFeedbackRequestPermissionsId, + ] = useState(""); + const [ + deleteFeedbackRequestPermissionsId, + setDeleteFeedbackRequestPermissionsId, + ] = useState(""); + const [ + viewFeedbackRequestPermissionsId, + setViewFeedbackRequestPermissionsId, + ] = useState(""); + const [viewFeedbackAnswerPermissionsId, setViewFeedbackAnswerPermissionsId] = + useState(""); + const [createOrgMembersPermissionsId, setCreateOrgMembersPermissionsId] = + useState(""); + const [deleteOrgMembersPermissionsId, setDeleteOrgMembersPermissionsId] = + useState(""); + const [viewRolePermissionsId, setViewRolePermissionsId] = useState(""); + const [assignRolePermissionsId, setAssignRolePermissionsId] = useState(""); + const [viewPermissionsId, setViewPermissionsId] = useState(""); + const [viewSkillsReportsId, setViewSkillsReportsId] = useState(""); + const [viewRetentionReportsId, setViewRetentionReportsId] = useState(""); + const [viewAnniversaryReportsId, setViewAnniversaryReportsId] = useState(""); + const [viewBirthdayReportsId, setViewBirthdayReportsId] = useState(""); + const [viewProfileReportsId, setViewProfileReportsId] = useState(""); + const [updateCheckinsId, setUpdateCheckinsId] = useState(""); + const [createCheckinsId, setCreateCheckinsId] = useState(""); + const [viewCheckinsId, setViewCheckinsId] = useState(""); + + const [ + createFeedbackRequestPermissionsAdmin, + setCreateFeedbackRequestPermissionsAdmin, + ] = useState(false); + const [ + createFeedbackRequestPermissionsPDL, + setCreateFeedbackRequestPermissionsPDL, + ] = useState(false); + const [ + createFeedbackRequestPermissionsMember, + setCreateFeedbackRequestPermissionsMember, + ] = useState(false); + + const [ + deleteFeedbackRequestPermissionsAdmin, + setDeleteFeedbackRequestPermissionsAdmin, + ] = useState(false); + const [ + deleteFeedbackRequestPermissionsPDL, + setDeleteFeedbackRequestPermissionsPDL, + ] = useState(false); + const [ + deleteFeedbackRequestPermissionsMember, + setDeleteFeedbackRequestPermissionsMember, + ] = useState(false); + + const [ + viewFeedbackRequestPermissionsAdmin, + setViewFeedbackRequestPermissionsAdmin, + ] = useState(false); + const [ + viewFeedbackRequestPermissionsPDL, + setViewFeedbackRequestPermissionsPDL, + ] = useState(false); + const [ + viewFeedbackRequestPermissionsMember, + setViewFeedbackRequestPermissionsMember, + ] = useState(false); + + const [ + viewFeedbackAnswerPermissionsAdmin, + setViewFeedbackAnswerPermissionsAdmin, + ] = useState(false); + const [ + viewFeedbackAnswerPermissionsPDL, + setViewFeedbackAnswerPermissionsPDL, + ] = useState(false); + const [ + viewFeedbackAnswerPermissionsMember, + setViewFeedbackAnswerPermissionsMember, + ] = useState(false); + + const [ + createOrgMembersPermissionsAdmin, + setCreateOrgMembersPermissionsAdmin, + ] = useState(false); + const [createOrgMembersPermissionsPDL, setCreateOrgMembersPermissionsPDL] = + useState(false); + const [ + createOrgMembersPermissionsMember, + setCreateOrgMembersPermissionsMember, + ] = useState(false); + + const [ + deleteOrgMembersPermissionsAdmin, + setDeleteOrgMembersPermissionsAdmin, + ] = useState(false); + const [deleteOrgMembersPermissionsPDL, setDeleteOrgMembersPermissionsPDL] = + useState(false); + const [ + deleteOrgMembersPermissionsMember, + setDeleteOrgMembersPermissionsMember, + ] = useState(false); + + const [viewRolePermissionsAdmin, setViewRolePermissionsAdmin] = + useState(false); + const [viewRolePermissionsPDL, setViewRolePermissionsPDL] = useState(false); + const [viewRolePermissionsMember, setViewRolePermissionsMember] = + useState(false); + + const [assignRolePermissionsAdmin, setAssignRolePermissionsAdmin] = + useState(false); + const [assignRolePermissionsPDL, setAssignRolePermissionsPDL] = + useState(false); + const [assignRolePermissionsMember, setAssignRolePermissionsMember] = + useState(false); + + const [viewPermissionsAdmin, setViewPermissionsAdmin] = useState(false); + const [viewPermissionsPDL, setViewPermissionsPDL] = useState(false); + const [viewPermissionsMember, setViewPermissionsMember] = useState(false); + + const [viewSkillsReportsAdmin, setViewSkillsReportsAdmin] = useState(false); + const [viewSkillsReportsPDL, setViewSkillsReportsPDL] = useState(false); + const [viewSkillsReportsMember, setViewSkillsReportsMember] = useState(false); + + const [viewRetentionReportsAdmin, setViewRetentionReportsAdmin] = + useState(false); + const [viewRetentionReportsPDL, setViewRetentionReportsPDL] = useState(false); + const [viewRetentionReportsMember, setViewRetentionReportsMember] = + useState(false); + + const [viewAnniversaryReportsAdmin, setViewAnniversaryReportsAdmin] = + useState(false); + const [viewAnniversaryReportsPDL, setViewAnniversaryReportsPDL] = + useState(false); + const [viewAnniversaryReportsMember, setViewAnniversaryReportsMember] = + useState(false); + + const [viewBirthdayReportsAdmin, setViewBirthdayReportsAdmin] = + useState(false); + const [viewBirthdayReportsPDL, setViewBirthdayReportsPDL] = useState(false); + const [viewBirthdayReportsMember, setViewBirthdayReportsMember] = + useState(false); + + const [viewProfileReportsAdmin, setViewProfileReportsAdmin] = useState(false); + const [viewProfileReportsPDL, setViewProfileReportsPDL] = useState(false); + const [viewProfileReportsMember, setViewProfileReportsMember] = + useState(false); + + const [updateCheckinsAdmin, setUpdateCheckinsAdmin] = useState(false); + const [updateCheckinsPDL, setUpdateCheckinsPDL] = useState(false); + const [updateCheckinsMember, setUpdateCheckinsMember] = useState(false); + + const [createCheckinsAdmin, setCreateCheckinsAdmin] = useState(false); + const [createCheckinsPDL, setCreateCheckinsPDL] = useState(false); + const [createCheckinsMember, setCreateCheckinsMember] = useState(false); + + const [viewCheckinsAdmin, setViewCheckinsAdmin] = useState(false); + const [viewCheckinsPDL, setViewCheckinsPDL] = useState(false); + const [viewCheckinsMember, setViewCheckinsMember] = useState(false); + + const changeRolePermission = async (roleId, permissionId) => { + let newSchema = { roleId: roleId, permissionId: permissionId }; + let res = await postRolePermission(newSchema, csrf); + let data = + res.payload && res.payload.data && !res.error ? res.payload.data : null; + if (data) { + window.snackDispatch({ + type: UPDATE_TOAST, + payload: { + severity: "success", + toast: `Permission added to Role`, + }, + }); + } else { + console.log(res?.error); + window.snackDispatch({ + type: UPDATE_TOAST, + payload: { + severity: "warning", + toast: `Problem changing permission for that role`, + }, + }); + } + }; + + const deleteRolePermission = async (roleId, permissionId) => { + let newSchema = { roleId: roleId, permissionId: permissionId }; + let res = await deleteRolePermission(newSchema, csrf); + let data = !res.error ? "Success" : null; + if (data) { + window.snackDispatch({ + type: UPDATE_TOAST, + payload: { + severity: "success", + toast: `Permission removed from Role`, + }, + }); + } else { + console.log(res?.error); + window.snackDispatch({ + type: UPDATE_TOAST, + payload: { + severity: "warning", + toast: `Problem deleting permission for that role`, + }, + }); + } + }; + + const handleClickCreateFeedbackRequestAdmin = () => { + if (!createFeedbackRequestPermissionsAdmin) { + changeRolePermission(adminId, createFeedbackRequestPermissionsId); + } else { + deleteRolePermission(adminId, createFeedbackRequestPermissionsId); + } + setCreateFeedbackRequestPermissionsAdmin( + !createFeedbackRequestPermissionsAdmin + ); + }; + const handleClickCreateFeedbackRequestPDL = () => { + if (!createFeedbackRequestPermissionsPDL) { + changeRolePermission(pdlId, createFeedbackRequestPermissionsId); + } else { + deleteRolePermission(pdlId, createFeedbackRequestPermissionsId); + } + setCreateFeedbackRequestPermissionsPDL( + !createFeedbackRequestPermissionsPDL + ); + }; + + const handleClickCreateFeedbackRequestMember = () => { + if (!createFeedbackRequestPermissionsMember) { + changeRolePermission(memberId, createFeedbackRequestPermissionsId); + } else { + deleteRolePermission(memberId, createFeedbackRequestPermissionsId); + } + setCreateFeedbackRequestPermissionsMember( + !createFeedbackRequestPermissionsMember + ); + }; + + const handleClickDeleteFeedbackRequestAdmin = () => { + if (!deleteFeedbackRequestPermissionsAdmin) { + changeRolePermission(adminId, deleteFeedbackRequestPermissionsId); + } else { + deleteRolePermission(adminId, deleteFeedbackRequestPermissionsId); + } + setDeleteFeedbackRequestPermissionsAdmin( + !deleteFeedbackRequestPermissionsAdmin + ); + }; + const handleClickDeleteFeedbackRequestPDL = () => { + if (!deleteFeedbackRequestPermissionsPDL) { + changeRolePermission(pdlId, deleteFeedbackRequestPermissionsId); + } else { + deleteRolePermission(pdlId, deleteFeedbackRequestPermissionsId); + } + setDeleteFeedbackRequestPermissionsPDL( + !deleteFeedbackRequestPermissionsPDL + ); + }; + const handleClickDeleteFeedbackRequestMember = () => { + if (!deleteFeedbackRequestPermissionsMember) { + changeRolePermission(memberId, deleteFeedbackRequestPermissionsId); + } else { + deleteRolePermission(memberId, deleteFeedbackRequestPermissionsId); + } + setDeleteFeedbackRequestPermissionsMember( + !deleteFeedbackRequestPermissionsMember + ); + }; + + const handleClickViewFeedbackRequestAdmin = () => { + if (!viewFeedbackRequestPermissionsAdmin) { + changeRolePermission(adminId, viewFeedbackRequestPermissionsId); + } else { + deleteRolePermission(adminId, viewFeedbackRequestPermissionsId); + } + setViewFeedbackRequestPermissionsAdmin( + !viewFeedbackRequestPermissionsAdmin + ); + }; + const handleClickViewFeedbackRequestPDL = () => { + if (!viewFeedbackRequestPermissionsPDL) { + changeRolePermission(pdlId, viewFeedbackRequestPermissionsId); + } else { + deleteRolePermission(pdlId, viewFeedbackRequestPermissionsId); + } + setViewFeedbackRequestPermissionsPDL(!viewFeedbackRequestPermissionsPDL); + }; + + const handleClickViewFeedbackRequestMember = () => { + if (!viewFeedbackRequestPermissionsMember) { + changeRolePermission(memberId, viewFeedbackRequestPermissionsId); + } else { + deleteRolePermission(memberId, viewFeedbackRequestPermissionsId); + } + setViewFeedbackRequestPermissionsMember( + !viewFeedbackRequestPermissionsMember + ); + }; + + const handleClickViewFeedbackAnswerAdmin = () => { + if (!viewFeedbackAnswerPermissionsAdmin) { + changeRolePermission(adminId, viewFeedbackAnswerPermissionsId); + } else { + deleteRolePermission(adminId, viewFeedbackAnswerPermissionsId); + } + setViewFeedbackAnswerPermissionsAdmin(!viewFeedbackAnswerPermissionsAdmin); + }; + const handleClickViewFeedbackAnswerPDL = () => { + if (!viewFeedbackAnswerPermissionsPDL) { + changeRolePermission(pdlId, viewFeedbackAnswerPermissionsId); + } else { + deleteRolePermission(pdlId, viewFeedbackAnswerPermissionsId); + } + setViewFeedbackAnswerPermissionsPDL(!viewFeedbackAnswerPermissionsPDL); + }; + const handleClickViewFeedbackAnswerMember = () => { + if (!viewFeedbackAnswerPermissionsMember) { + changeRolePermission(memberId, viewFeedbackAnswerPermissionsId); + } else { + deleteRolePermission(memberId, viewFeedbackAnswerPermissionsId); + } + setViewFeedbackAnswerPermissionsMember( + !viewFeedbackAnswerPermissionsMember + ); + }; + + const handleClickCreateOrgMembersPermissionsAdmin = () => { + if (!createOrgMembersPermissionsAdmin) { + changeRolePermission(adminId, createOrgMembersPermissionsId); + } else { + deleteRolePermission(adminId, createOrgMembersPermissionsId); + } + setCreateOrgMembersPermissionsAdmin(!createOrgMembersPermissionsAdmin); + }; + const handleClickCreateOrgMembersPermissionsPDL = () => { + if (!createOrgMembersPermissionsPDL) { + changeRolePermission(pdlId, createOrgMembersPermissionsId); + } else { + deleteRolePermission(pdlId, createOrgMembersPermissionsId); + } + setCreateOrgMembersPermissionsPDL(!createOrgMembersPermissionsPDL); + }; + const handleClickCreateOrgMembersPermissionsMember = () => { + if (!createOrgMembersPermissionsMember) { + changeRolePermission(memberId, createOrgMembersPermissionsId); + } else { + deleteRolePermission(memberId, createOrgMembersPermissionsId); + } + setCreateOrgMembersPermissionsMember(!createOrgMembersPermissionsMember); + }; + + const handleClickDeleteOrgMembersPermissionsAdmin = () => { + if (!deleteOrgMembersPermissionsAdmin) { + changeRolePermission(adminId, deleteOrgMembersPermissionsId); + } else { + deleteRolePermission(adminId, deleteOrgMembersPermissionsId); + } + setDeleteOrgMembersPermissionsAdmin(!deleteOrgMembersPermissionsAdmin); + }; + const handleClickDeleteOrgMembersPermissionsPDL = () => { + if (!deleteOrgMembersPermissionsPDL) { + changeRolePermission(pdlId, deleteOrgMembersPermissionsId); + } else { + deleteRolePermission(pdlId, deleteOrgMembersPermissionsId); + } + setDeleteOrgMembersPermissionsPDL(!deleteOrgMembersPermissionsPDL); + }; + const handleClickDeleteOrgMembersPermissionsMember = () => { + if (!deleteOrgMembersPermissionsMember) { + changeRolePermission(memberId, deleteOrgMembersPermissionsId); + } else { + deleteRolePermission(memberId, deleteOrgMembersPermissionsId); + } + setDeleteOrgMembersPermissionsMember(!deleteOrgMembersPermissionsMember); + }; + + const handleClickRolePermissionsViewAdmin = () => { + if (!viewRolePermissionsAdmin) { + changeRolePermission(adminId, viewRolePermissionsId); + } else { + deleteRolePermission(adminId, viewRolePermissionsId); + } + setViewRolePermissionsAdmin(!viewRolePermissionsAdmin); + }; + const handleClickRolePermissionsViewPDL = () => { + if (!viewRolePermissionsPDL) { + changeRolePermission(pdlId, viewRolePermissionsId); + } else { + deleteRolePermission(pdlId, viewRolePermissionsId); + } + setViewRolePermissionsPDL(!viewRolePermissionsPDL); + }; + const handleClickRolePermissionsViewMember = () => { + if (!viewRolePermissionsMember) { + changeRolePermission(memberId, viewRolePermissionsId); + } else { + deleteRolePermission(memberId, viewRolePermissionsId); + } + setViewRolePermissionsMember(!viewRolePermissionsMember); + }; + + const handleClickRolePermissionsAssignAdmin = () => { + if (!assignRolePermissionsAdmin) { + changeRolePermission(adminId, assignRolePermissionsId); + } else { + deleteRolePermission(adminId, assignRolePermissionsId); + } + setAssignRolePermissionsAdmin(!assignRolePermissionsAdmin); + }; + const handleClickRolePermissionsAssignPDL = () => { + if (!assignRolePermissionsPDL) { + changeRolePermission(pdlId, assignRolePermissionsId); + } else { + deleteRolePermission(pdlId, assignRolePermissionsId); + } + setAssignRolePermissionsPDL(!assignRolePermissionsPDL); + }; + const handleClickRolePermissionsAssignMember = () => { + if (!assignRolePermissionsMember) { + changeRolePermission(memberId, assignRolePermissionsId); + } else { + deleteRolePermission(memberId, assignRolePermissionsId); + } + setAssignRolePermissionsMember(!assignRolePermissionsMember); + }; + + const handleClickViewAdmin = () => { + if (!viewPermissionsAdmin) { + changeRolePermission(adminId, viewPermissionsId); + } else { + deleteRolePermission(adminId, viewPermissionsId); + } + setViewPermissionsAdmin(!viewPermissionsAdmin); + }; + const handleClickViewPDL = () => { + if (!viewPermissionsPDL) { + changeRolePermission(pdlId, viewPermissionsId); + } else { + deleteRolePermission(pdlId, viewPermissionsId); + } + setViewPermissionsPDL(!viewPermissionsPDL); + }; + const handleClickViewMember = () => { + if (!viewPermissionsMember) { + changeRolePermission(memberId, viewPermissionsId); + } else { + deleteRolePermission(memberId, viewPermissionsId); + } + setViewPermissionsMember(!viewPermissionsMember); + }; + + const handleClickViewSkillsReportsAdmin = () => { + if (!viewSkillsReportsAdmin) { + changeRolePermission(adminId, viewSkillsReportsId); + } else { + deleteRolePermission(adminId, viewSkillsReportsId); + } + setViewSkillsReportsAdmin(!viewSkillsReportsAdmin); + }; + const handleClickViewSkillsReportsPDL = () => { + if (!viewSkillsReportsPDL) { + changeRolePermission(pdlId, viewSkillsReportsId); + } else { + deleteRolePermission(pdlId, viewSkillsReportsId); + } + setViewSkillsReportsPDL(!viewSkillsReportsPDL); + }; + const handleClickViewSkillsReportsMember = () => { + if (!viewSkillsReportsMember) { + changeRolePermission(memberId, viewSkillsReportsId); + } else { + deleteRolePermission(memberId, viewSkillsReportsId); + } + setViewSkillsReportsMember(!viewSkillsReportsMember); + }; + + const handleClickViewRetentionReportsAdmin = () => { + if (!viewRetentionReportsAdmin) { + changeRolePermission(adminId, viewRetentionReportsId); + } else { + deleteRolePermission(adminId, viewRetentionReportsId); + } + setViewRetentionReportsAdmin(!viewRetentionReportsAdmin); + }; + const handleClickViewRetentionReportsPDL = () => { + if (!viewRetentionReportsPDL) { + changeRolePermission(pdlId, viewRetentionReportsId); + } else { + deleteRolePermission(pdlId, viewRetentionReportsId); + } + setViewRetentionReportsPDL(!viewRetentionReportsPDL); + }; + const handleClickViewRetentionReportsMember = () => { + if (!viewRetentionReportsMember) { + changeRolePermission(memberId, viewRetentionReportsId); + } else { + deleteRolePermission(memberId, viewRetentionReportsId); + } + setViewRetentionReportsMember(!viewRetentionReportsMember); + }; + + const handleClickViewAnniversaryReportsAdmin = () => { + if (!viewAnniversaryReportsAdmin) { + changeRolePermission(adminId, viewAnniversaryReportsId); + } else { + deleteRolePermission(adminId, viewAnniversaryReportsId); + } + setViewAnniversaryReportsAdmin(!viewAnniversaryReportsAdmin); + }; + const handleClickViewAnniversaryReportsPDL = () => { + if (!viewAnniversaryReportsPDL) { + changeRolePermission(pdlId, viewAnniversaryReportsId); + } else { + deleteRolePermission(pdlId, viewAnniversaryReportsId); + } + setViewAnniversaryReportsPDL(!viewAnniversaryReportsPDL); + }; + const handleClickViewAnniversaryReportsMember = () => { + if (!viewAnniversaryReportsMember) { + changeRolePermission(memberId, viewAnniversaryReportsId); + } else { + deleteRolePermission(memberId, viewAnniversaryReportsId); + } + setViewAnniversaryReportsMember(!viewAnniversaryReportsMember); + }; + + const handleClickViewBirthdayReportsAdmin = () => { + if (!viewBirthdayReportsAdmin) { + changeRolePermission(adminId, viewBirthdayReportsId); + } else { + deleteRolePermission(adminId, viewBirthdayReportsId); + } + setViewBirthdayReportsAdmin(!viewBirthdayReportsAdmin); + }; + const handleClickViewBirthdayReportsPDL = () => { + if (!viewBirthdayReportsPDL) { + changeRolePermission(pdlId, viewBirthdayReportsId); + } else { + deleteRolePermission(pdlId, viewBirthdayReportsId); + } + setViewBirthdayReportsPDL(!viewBirthdayReportsPDL); + }; + const handleClickViewBirthdayReportsMember = () => { + if (!viewBirthdayReportsMember) { + changeRolePermission(memberId, viewBirthdayReportsId); + } else { + deleteRolePermission(memberId, viewBirthdayReportsId); + } + setViewBirthdayReportsMember(!viewBirthdayReportsMember); + }; + + const handleClickViewProfileReportsAdmin = () => { + if (!viewProfileReportsAdmin) { + changeRolePermission(adminId, viewProfileReportsId); + } else { + deleteRolePermission(adminId, viewProfileReportsId); + } + setViewProfileReportsAdmin(!viewProfileReportsAdmin); + }; + const handleClickViewProfileReportsPDL = () => { + if (!viewProfileReportsPDL) { + changeRolePermission(pdlId, viewProfileReportsId); + } else { + deleteRolePermission(pdlId, viewProfileReportsId); + } + setViewProfileReportsPDL(!viewProfileReportsPDL); + }; + const handleClickViewProfileReportsMember = () => { + if (!viewProfileReportsMember) { + changeRolePermission(memberId, viewProfileReportsId); + } else { + deleteRolePermission(memberId, viewProfileReportsId); + } + setViewProfileReportsMember(!viewProfileReportsMember); + }; + + const handleClickUpdateCheckinsAdmin = () => { + if (!updateCheckinsAdmin) { + changeRolePermission(adminId, updateCheckinsId); + } else { + deleteRolePermission(adminId, updateCheckinsId); + } + setUpdateCheckinsAdmin(!updateCheckinsAdmin); + }; + const handleClickUpdateCheckinsPDL = () => { + if (!updateCheckinsPDL) { + changeRolePermission(pdlId, updateCheckinsId); + } else { + deleteRolePermission(pdlId, updateCheckinsId); + } + setUpdateCheckinsPDL(!updateCheckinsPDL); + }; + const handleClickUpdateCheckinsMember = () => { + if (!updateCheckinsMember) { + changeRolePermission(memberId, updateCheckinsId); + } else { + deleteRolePermission(memberId, updateCheckinsId); + } + setUpdateCheckinsMember(!updateCheckinsMember); + }; + + const handleClickCreateCheckinsAdmin = () => { + if (!createCheckinsAdmin) { + changeRolePermission(adminId, createCheckinsId); + } else { + deleteRolePermission(adminId, createCheckinsId); + } + setCreateCheckinsAdmin(!createCheckinsAdmin); + }; + const handleClickCreateCheckinsPDL = () => { + if (!createCheckinsPDL) { + changeRolePermission(pdlId, createCheckinsId); + } else { + deleteRolePermission(pdlId, createCheckinsId); + } + setCreateCheckinsPDL(!createCheckinsPDL); + }; + const handleClickCreateCheckinsMember = () => { + if (!createCheckinsMember) { + changeRolePermission(memberId, createCheckinsId); + } else { + deleteRolePermission(memberId, createCheckinsId); + } + setCreateCheckinsMember(!createCheckinsMember); + }; + + const handleClickViewCheckinsAdmin = () => { + if (!viewCheckinsAdmin) { + changeRolePermission(adminId, viewCheckinsId); + } else { + deleteRolePermission(adminId, viewCheckinsId); + } + setViewCheckinsAdmin(!viewCheckinsAdmin); + }; + const handleClickViewCheckinsPDL = () => { + if (!viewCheckinsPDL) { + changeRolePermission(pdlId, viewCheckinsId); + } else { + deleteRolePermission(pdlId, viewCheckinsId); + } + setViewCheckinsPDL(!viewCheckinsPDL); + }; + const handleClickViewCheckinsMember = () => { + if (!viewCheckinsMember) { + changeRolePermission(memberId, viewCheckinsId); + } else { + deleteRolePermission(memberId, viewCheckinsId); + } + setViewCheckinsMember(!viewCheckinsMember); + }; + + useEffect(() => { + const doTask1 = async () => { + let res = await getRolePermissionsList(csrf); + let data = + res.payload && res.payload.data && !res.error ? res.payload.data : null; + if (data) { + setRolePermissionsList(data); + } + }; + const doTask2 = async () => { + let res = await getPermissionsList(csrf); + let data = + res.payload && res.payload.data && !res.error ? res.payload.data : null; + if (data) { + setPermissionsList(data); + setCategoriesList(groupPermissionsByCategory(data)); + } + }; + const doTask3 = async () => { + let res = await getMemberRolesList(csrf); + let data = + res.payload && res.payload.data && !res.error ? res.payload.data : null; + if (data) { + setMemberRoles(data); + } + }; + + if (csrf) { + doTask1(); + doTask2(); + doTask3(); + } + }, [csrf]); + + useEffect(() => { + if (isArrayPresent(rolePermissionsList)) { + let adminData = rolePermissionsList.filter((a) => a.role === "ADMIN"); + if (isArrayPresent(adminData)) { + setAdminId(adminData[0].roleId); + } + let pdlData = rolePermissionsList.filter((a) => a.role === "PDL"); + if (isArrayPresent(pdlData)) { + setPDLId(pdlData[0].roleId); + } + let memberData = rolePermissionsList.filter((a) => a.role === "MEMBER"); + if (isArrayPresent(memberData)) { + setMemberId(memberData[0].roleId); + } + } + + if (isArrayPresent(permissionsList)) { + let id1 = permissionsList.filter( + (a) => a.permission === "CAN_CREATE_ORGANIZATION_MEMBERS" + ); + if (isArrayPresent(id1)) { + setCreateFeedbackRequestPermissionsId(id1[0].id); + } + let id2 = permissionsList.filter( + (a) => a.permission === "CAN_CREATE_FEEDBACK_REQUEST" + ); + if (isArrayPresent(id2)) { + setCreateFeedbackRequestPermissionsId(id2[0].id); + } + let id3 = permissionsList.filter( + (a) => a.permission === "CAN_DELETE_FEEDBACK_REQUEST" + ); + if (isArrayPresent(id3)) { + setDeleteFeedbackRequestPermissionsId(id3[0].id); + } + let id4 = permissionsList.filter( + (a) => a.permission === "CAN_VIEW_FEEDBACK_REQUEST" + ); + if (isArrayPresent(id4)) { + setViewFeedbackRequestPermissionsId(id4[0].id); + } + let id5 = permissionsList.filter( + (a) => a.permission === "CAN_VIEW_FEEDBACK_ANSWER" + ); + if (isArrayPresent(id5)) { + setViewFeedbackAnswerPermissionsId(id5[0].id); + } + let id6 = permissionsList.filter( + (a) => a.permission === "CAN_CREATE_ORGANIZATION_MEMBERS" + ); + if (isArrayPresent(id6)) { + setCreateOrgMembersPermissionsId(id6[0].id); + } + let id7 = permissionsList.filter( + (a) => a.permission === "CAN_DELETE_ORGANIZATION_MEMBERS" + ); + if (isArrayPresent(id7)) { + setDeleteOrgMembersPermissionsId(id7[0].id); + } + let id8 = permissionsList.filter( + (a) => a.permission === "CAN_VIEW_ROLE_PERMISSIONS" + ); + if (isArrayPresent(id8)) { + setViewRolePermissionsId(id8[0].id); + } + let id9 = permissionsList.filter( + (a) => a.permission === "CAN_ASSIGN_ROLE_PERMISSIONS" + ); + if (isArrayPresent(id9)) { + setAssignRolePermissionsId(id9[0].id); + } + let id10 = permissionsList.filter( + (a) => a.permission === "CAN_VIEW_PERMISSIONS" + ); + if (isArrayPresent(id10)) { + setViewPermissionsId(id10[0].id); + } + let id11 = permissionsList.filter( + (a) => a.permission === "CAN_VIEW_SKILLS_REPORT" + ); + if (isArrayPresent(id11)) { + setViewSkillsReportsId(id11[0].id); + } + let id12 = permissionsList.filter( + (a) => a.permission === "CAN_VIEW_RETENTION_REPORT" + ); + if (isArrayPresent(id12)) { + setViewRetentionReportsId(id12[0].id); + } + let id13 = permissionsList.filter( + (a) => a.permission === "CAN_VIEW_ANNIVERSARY_REPORT" + ); + if (isArrayPresent(id13)) { + setViewAnniversaryReportsId(id13[0].id); + } + let id14 = permissionsList.filter( + (a) => a.permission === "CAN_VIEW_BIRTHDAY_REPORT" + ); + if (isArrayPresent(id14)) { + setViewBirthdayReportsId(id14[0].id); + } + let id15 = permissionsList.filter( + (a) => a.permission === "CAN_VIEW_PROFILE_REPORT" + ); + if (isArrayPresent(id15)) { + setViewProfileReportsId(id15[0].id); + } + let id16 = permissionsList.filter( + (a) => a.permission === "CAN_UPDATE_CHECKINS" + ); + if (isArrayPresent(id16)) { + setUpdateCheckinsId(id16[0].id); + } + let id17 = permissionsList.filter( + (a) => a.permission === "CAN_CREATE_CHECKINS" + ); + if (isArrayPresent(id17)) { + setCreateCheckinsId(id17[0].id); + } + let id18 = permissionsList.filter( + (a) => a.permission === "CAN_VIEW_CHECKINS" + ); + if (isArrayPresent(id18)) { + setViewCheckinsId(id18[0].id); + } + } + }, [rolePermissionsList, permissionsList]); + + useEffect(() => { + if (isArrayPresent(memberRoles)) { + let data = memberRoles.filter( + (a) => a.memberRoleId.memberId === currentUserId + ); + if (isArrayPresent(data)) { + let role = filterObjectByValOrKey( + rolePermissionsList, + data[0].memberRoleId.roleId + ); + if (isArrayPresent(role)) { + setCurrentUserRole(role[0].role); + } + } + } + + if (currentUserRole === "ADMIN") { + setIsAdminRole(true); + } else { + setIsAdminRole(false); + } + }, [memberRoles, currentUserRole, csrf, rolePermissionsList, currentUserId]); + + useEffect(() => { + let adminRole = filterObjectByValOrKey( + rolePermissionsList, + "ADMIN", + "role" + ); + if (isArrayPresent(adminRole)) { + setAdminPermissionsList(adminRole[0].permissions); + } + }, [rolePermissionsList, adminPermissionsList]); + + useEffect(() => { + let pdlRole = filterObjectByValOrKey(rolePermissionsList, "PDL", "role"); + if (isArrayPresent(pdlRole)) { + setPDLPermissionsList(pdlRole[0].permissions); + } + }, [rolePermissionsList, pdlPermissionsList]); + + useEffect(() => { + let memberRole = filterObjectByValOrKey( + rolePermissionsList, + "MEMBER", + "role" + ); + if (isArrayPresent(memberRole)) { + setMemberPermissionsList(memberRole[0].permissions); + } + }, [rolePermissionsList, memberPermissionsList]); + + useEffect(() => { + setCreateFeedbackRequestPermissionsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_CREATE_FEEDBACK_REQUEST" + ) + ); + setDeleteFeedbackRequestPermissionsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_DELETE_FEEDBACK_REQUEST" + ) + ); + setViewFeedbackRequestPermissionsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_FEEDBACK_REQUEST" + ) + ); + setViewFeedbackAnswerPermissionsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_FEEDBACK_ANSWER" + ) + ); + setCreateOrgMembersPermissionsAdmin( + adminPermissionsList.some( + (permission) => + permission.permission === "CAN_CREATE_ORGANIZATION_MEMBERS" + ) + ); + setDeleteOrgMembersPermissionsAdmin( + adminPermissionsList.some( + (permission) => + permission.permission === "CAN_DELETE_ORGANIZATION_MEMBERS" + ) + ); + setViewRolePermissionsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_ROLE_PERMISSIONS" + ) + ); + setAssignRolePermissionsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_ASSIGN_ROLE_PERMISSIONS" + ) + ); + setViewPermissionsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_PERMISSIONS" + ) + ); + setViewSkillsReportsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_SKILLS_REPORT" + ) + ); + setViewRetentionReportsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_RETENTION_REPORT" + ) + ); + setViewAnniversaryReportsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_ANNIVERSARY_REPORT" + ) + ); + setViewBirthdayReportsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_BIRTHDAY_REPORT" + ) + ); + setViewProfileReportsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_PROFILE_REPORT" + ) + ); + setUpdateCheckinsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_UPDATE_CHECKINS" + ) + ); + setCreateCheckinsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_CREATE_CHECKINS" + ) + ); + setViewCheckinsAdmin( + adminPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_CHECKINS" + ) + ); + }, [adminPermissionsList]); + + useEffect(() => { + setCreateFeedbackRequestPermissionsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_CREATE_FEEDBACK_REQUEST" + ) + ); + setDeleteFeedbackRequestPermissionsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_DELETE_FEEDBACK_REQUEST" + ) + ); + setViewFeedbackRequestPermissionsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_FEEDBACK_REQUEST" + ) + ); + setViewFeedbackAnswerPermissionsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_FEEDBACK_ANSWER" + ) + ); + setCreateOrgMembersPermissionsPDL( + pdlPermissionsList.some( + (permission) => + permission.permission === "CAN_CREATE_ORGANIZATION_MEMBERS" + ) + ); + setDeleteOrgMembersPermissionsPDL( + pdlPermissionsList.some( + (permission) => + permission.permission === "CAN_DELETE_ORGANIZATION_MEMBERS" + ) + ); + setViewRolePermissionsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_ROLE_PERMISSIONS" + ) + ); + setAssignRolePermissionsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_ASSIGN_ROLE_PERMISSIONS" + ) + ); + setViewPermissionsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_PERMISSIONS" + ) + ); + setViewSkillsReportsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_SKILLS_REPORT" + ) + ); + setViewRetentionReportsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_RETENTION_REPORT" + ) + ); + setViewAnniversaryReportsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_ANNIVERSARY_REPORT" + ) + ); + setViewBirthdayReportsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_BIRTHDAY_REPORT" + ) + ); + setViewProfileReportsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_PROFILE_REPORT" + ) + ); + setUpdateCheckinsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_UPDATE_CHECKINS" + ) + ); + setCreateCheckinsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_CREATE_CHECKINS" + ) + ); + setViewCheckinsPDL( + pdlPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_CHECKINS" + ) + ); + }, [pdlPermissionsList]); + + useEffect(() => { + setCreateFeedbackRequestPermissionsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_CREATE_FEEDBACK_REQUEST" + ) + ); + setDeleteFeedbackRequestPermissionsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_DELETE_FEEDBACK_REQUEST" + ) + ); + setViewFeedbackRequestPermissionsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_FEEDBACK_REQUEST" + ) + ); + setViewFeedbackAnswerPermissionsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_FEEDBACK_ANSWER" + ) + ); + setCreateOrgMembersPermissionsMember( + memberPermissionsList.some( + (permission) => + permission.permission === "CAN_CREATE_ORGANIZATION_MEMBERS" + ) + ); + setDeleteOrgMembersPermissionsMember( + memberPermissionsList.some( + (permission) => + permission.permission === "CAN_DELETE_ORGANIZATION_MEMBERS" + ) + ); + setViewRolePermissionsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_ROLE_PERMISSIONS" + ) + ); + setAssignRolePermissionsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_ASSIGN_ROLE_PERMISSIONS" + ) + ); + setViewPermissionsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_PERMISSIONS" + ) + ); + setViewSkillsReportsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_SKILLS_REPORT" + ) + ); + setViewRetentionReportsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_RETENTION_REPORT" + ) + ); + setViewAnniversaryReportsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_ANNIVERSARY_REPORT" + ) + ); + setViewBirthdayReportsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_BIRTHDAY_REPORT" + ) + ); + setViewProfileReportsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_PROFILE_REPORT" + ) + ); + setUpdateCheckinsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_UPDATE_CHECKINS" + ) + ); + setCreateCheckinsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_CREATE_CHECKINS" + ) + ); + setViewCheckinsMember( + memberPermissionsList.some( + (permission) => permission.permission === "CAN_VIEW_CHECKINS" + ) + ); + }, [memberPermissionsList]); + + return ( +
+ {isAdminRole ? ( + <> +
+

Edit Feedback Request Permissions Below:

+ + + + + + +
+ +
+

Edit Feedback Answer Permissions Below:

+ +
+ +
+

Edit Organization Members Permissions Below:

+ + +
+ +
+

Edit Role Permissions Below:

+ + + +
+ +
+

Edit View Permissions Below:

+ +
+ +
+

Edit View Reports Permissions Below:

+ + + + + +
+ +
+

Edit Checkins Below:

+ + + + + + +
+ + ) : ( + <> +

You do not have permission to view this page.

+ + )} +
+ ); +}; + +export default EditPermissionsPage; diff --git a/web-ui/src/pages/EditPermissionsPage.test.js b/web-ui/src/pages/EditPermissionsPage.test.js new file mode 100644 index 0000000000..d106a06de3 --- /dev/null +++ b/web-ui/src/pages/EditPermissionsPage.test.js @@ -0,0 +1,11 @@ +import React from "react"; +import EditPermissionsPage from "./EditPermissionsPage"; +import { AppContextProvider } from "../context/AppContext"; + +it("renders correctly", () => { + snapshot( + + + + ); +}); diff --git a/web-ui/src/pages/EditPermissionsPageRoles.jsx b/web-ui/src/pages/EditPermissionsPageRoles.jsx new file mode 100644 index 0000000000..86167fa1fb --- /dev/null +++ b/web-ui/src/pages/EditPermissionsPageRoles.jsx @@ -0,0 +1,43 @@ +import React from "react"; +import { Checkbox } from "@mui/material"; + +const EditPermissionsPageRoles = ({ + title, + selectAdmin, + admin, + selectPDL, + pdl, + selectMember, + member, +}) => { + return ( +
+

{title}

+ + + + + + + + +
+ ); +}; + +export default EditPermissionsPageRoles; diff --git a/web-ui/src/pages/PermissionsPage.css b/web-ui/src/pages/PermissionsPage.css new file mode 100644 index 0000000000..66faa62780 --- /dev/null +++ b/web-ui/src/pages/PermissionsPage.css @@ -0,0 +1,7 @@ +.permissions-page { + margin: 2rem; +} + +.permissions-list { + margin: 1rem; +} diff --git a/web-ui/src/pages/PermissionsPage.jsx b/web-ui/src/pages/PermissionsPage.jsx new file mode 100644 index 0000000000..3c27c371e7 --- /dev/null +++ b/web-ui/src/pages/PermissionsPage.jsx @@ -0,0 +1,183 @@ +import React, { useEffect, useContext, useState } from "react"; + +import { getPermissionsList } from "../api/permissions"; +import { + getRolePermissionsList, + postRolePermission, + deleteRolePermission, +} from "../api/rolepermissions"; +import { Checkbox, FormControl, MenuItem, Select, InputLabel } from "@mui/material"; +import { UPDATE_TOAST } from "../context/actions"; +import { AppContext } from "../context/AppContext"; +import { selectRoles, selectHasPermissionAssignmentPermission } from "../context/selectors"; + +import "./PermissionsPage.css"; + +const groupPermissionsByCategory = (permissions) => permissions.reduce((categories, permission) => { + const category = permission.category; + const existingCategory = categories.find(cat => cat.category === category); + + // If category exists, add permission to its permissions array + if (existingCategory) { + existingCategory.permissions.push(permission); + } else { + // Create a new category object and add it to categories + categories.push({ + category, + permissions: [permission], + }); + } + + return categories.sort((a,b) => a.category.localeCompare(b.category)); +}, []); + +const PermissionEditor = ({ + permission, + title, + enabled, + onChange +}) => { + return ( +
+ + +
+ ); +}; + +const isPermissionEnabled = (rolePermissions, permission) => rolePermissions.some((current) => current.id === permission.id); + +const EditPermissionsPage = () => { + const { state } = useContext(AppContext); + const { csrf } = state; + const roles = selectRoles(state); + const hasPermission = selectHasPermissionAssignmentPermission(state); + const [selectedRole, setSelectedRole] = useState(roles && roles.find(()=>true)); + const [categoriesList, setCategoriesList] = useState([]); + const [rolePermissionsList, setRolePermissionsList] = useState([]); + const [rolePermissions, setRolePermissions] = useState([]); + const [refresh, setRefresh] = useState(true); + + useEffect(() => { + const getRolePermissions = async () => { + let res = await getRolePermissionsList(csrf); + let data = + res.payload && res.payload.data && !res.error ? res.payload.data : null; + if (data) { + setRolePermissionsList(data); + } + }; + const getPermissions = async () => { + let res = await getPermissionsList(csrf); + let data = + res.payload && res.payload.data && !res.error ? res.payload.data : null; + if (data) { + setCategoriesList(groupPermissionsByCategory(data)); + } + }; + + if (csrf) { + if(rolePermissionsList.length === 0){ + getPermissions(); + } + getRolePermissions(); + } + }, [csrf, refresh, rolePermissionsList.length]); + + useEffect(() => { + if(selectedRole && rolePermissionsList) { + const rolePermissions = rolePermissionsList.find((rolePermission) => rolePermission.roleId === selectedRole.id); + rolePermissions && setRolePermissions(rolePermissions?.permissions); + } + + }, [selectedRole, rolePermissionsList]); + + const handleRoleChange = (event) => { + setSelectedRole(roles.find((role) => role.id === event.target.value)); + }; + + const addPermissionForRole = async (role, permission) => { + let newSchema = { roleId: role.id, permissionId: permission.id }; + let res = await postRolePermission(newSchema, csrf); + const snackPayload = res.error + ? { severity: "warning", toast: `Problem adding ${permission.description} to ${role.role}` } + : { severity: "success", toast: `${permission.description} added to ${role.role}` }; + window.snackDispatch({ + type: UPDATE_TOAST, + payload: snackPayload, + }); + }; + + const deletePermissionForRole = async (role, permission) => { + let newSchema = { roleId: role.id, permissionId: permission.id }; + let res = await deleteRolePermission(newSchema, csrf); + const snackPayload = res.error + ? { severity: "warning", toast: `Problem deleting ${permission.description} from ${role.role}` } + : { severity: "success", toast: `${permission.description} removed from ${role.role}` }; + window.snackDispatch({ + type: UPDATE_TOAST, + payload: snackPayload, + }); + }; + + const handleChange = async (event, role, permission) => { + if (event?.target?.checked) { + await addPermissionForRole(role, permission); + setRefresh(!refresh); + } else { + await deletePermissionForRole(role, permission); + setRefresh(!refresh); + } + }; + + return ( +
+ { hasPermission ? + ( + <> +
+ + Select Role + + +
+ + { selectedRole && rolePermissions && categoriesList?.map((category) => ( +
+

{category?.category}:

+ { category?.permissions?.map((permission)=> ( + handleChange(event, selectedRole, permission)} /> + )) + } +
+ )) + } + + ) : ( +

You do not have permission to view this page.

+ )} +
+ ); +}; + +export default EditPermissionsPage; diff --git a/web-ui/src/pages/PermissionsPage.test.js b/web-ui/src/pages/PermissionsPage.test.js new file mode 100644 index 0000000000..dfb395f371 --- /dev/null +++ b/web-ui/src/pages/PermissionsPage.test.js @@ -0,0 +1,30 @@ +import React from "react"; +import PermissionsPage from "./PermissionsPage"; +import { AppContextProvider } from "../context/AppContext"; + +const initialState = { + state: { + userProfile: { + name: "holmes", + role: ["PDL"], + permissions: [{permission:"CAN_ASSIGN_ROLE_PERMISSIONS"}], + imageUrl: + "https://upload.wikimedia.org/wikipedia/commons/7/74/SNL_MrBill_Doll.jpg", + }, + memberProfiles: [ + { + id: "1234-5434-8765-3458", + name: "holmes", + }, + ], + index: 0, + }, +}; + +it("renders correctly", () => { + snapshot( + + + + ); +}); diff --git a/web-ui/src/pages/__snapshots__/EditPermissionsPage.test.js.snap b/web-ui/src/pages/__snapshots__/EditPermissionsPage.test.js.snap new file mode 100644 index 0000000000..7e4e0c90ca --- /dev/null +++ b/web-ui/src/pages/__snapshots__/EditPermissionsPage.test.js.snap @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`renders correctly 1`] = ` +
+

+ You do not have permission to view this page. +

+
+`; diff --git a/web-ui/src/pages/__snapshots__/PermissionsPage.test.js.snap b/web-ui/src/pages/__snapshots__/PermissionsPage.test.js.snap new file mode 100644 index 0000000000..eb6156f3e5 --- /dev/null +++ b/web-ui/src/pages/__snapshots__/PermissionsPage.test.js.snap @@ -0,0 +1,410 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`renders correctly 1`] = ` +.emotion-0 { + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + position: relative; + min-width: 0; + padding: 0; + margin: 0; + border: 0; + vertical-align: top; +} + +.emotion-1 { + color: rgba(0, 0, 0, 0.6); + font-family: "Roboto","Helvetica","Arial",sans-serif; + font-weight: 400; + font-size: 1rem; + line-height: 1.4375em; + letter-spacing: 0.00938em; + padding: 0; + position: relative; + display: block; + transform-origin: top left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: calc(100% - 24px); + position: absolute; + left: 0; + top: 0; + -webkit-transform: translate(14px, 16px) scale(1); + -moz-transform: translate(14px, 16px) scale(1); + -ms-transform: translate(14px, 16px) scale(1); + transform: translate(14px, 16px) scale(1); + -webkit-transition: color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms,-webkit-transform 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms,max-width 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms; + transition: color 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms,transform 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms,max-width 200ms cubic-bezier(0.0, 0, 0.2, 1) 0ms; + z-index: 1; + pointer-events: none; +} + +.emotion-1.Mui-focused { + color: #1976d2; +} + +.emotion-1.Mui-disabled { + color: rgba(0, 0, 0, 0.38); +} + +.emotion-1.Mui-error { + color: #d32f2f; +} + +.emotion-2 { + font-family: "Roboto","Helvetica","Arial",sans-serif; + font-weight: 400; + font-size: 1rem; + line-height: 1.4375em; + letter-spacing: 0.00938em; + color: rgba(0, 0, 0, 0.87); + box-sizing: border-box; + position: relative; + cursor: text; + display: -webkit-inline-box; + display: -webkit-inline-flex; + display: -ms-inline-flexbox; + display: inline-flex; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + position: relative; + border-radius: 4px; +} + +.emotion-2.Mui-disabled { + color: rgba(0, 0, 0, 0.38); + cursor: default; +} + +.emotion-2:hover .MuiOutlinedInput-notchedOutline { + border-color: rgba(0, 0, 0, 0.87); +} + +@media (hover: none) { + .emotion-2:hover .MuiOutlinedInput-notchedOutline { + border-color: rgba(0, 0, 0, 0.23); + } +} + +.emotion-2.Mui-focused .MuiOutlinedInput-notchedOutline { + border-color: #1976d2; + border-width: 2px; +} + +.emotion-2.Mui-error .MuiOutlinedInput-notchedOutline { + border-color: #d32f2f; +} + +.emotion-2.Mui-disabled .MuiOutlinedInput-notchedOutline { + border-color: rgba(0, 0, 0, 0.26); +} + +.emotion-3 { + -moz-appearance: none; + -webkit-appearance: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border-radius: 4px; + cursor: pointer; + font: inherit; + letter-spacing: inherit; + color: currentColor; + padding: 4px 0 5px; + border: 0; + box-sizing: content-box; + background: none; + height: 1.4375em; + margin: 0; + -webkit-tap-highlight-color: transparent; + display: block; + min-width: 0; + width: 100%; + -webkit-animation-name: mui-auto-fill-cancel; + animation-name: mui-auto-fill-cancel; + -webkit-animation-duration: 10ms; + animation-duration: 10ms; + padding: 16.5px 14px; +} + +.emotion-3:focus { + border-radius: 4px; +} + +.emotion-3::-ms-expand { + display: none; +} + +.emotion-3.Mui-disabled { + cursor: default; +} + +.emotion-3[multiple] { + height: auto; +} + +.emotion-3:not([multiple]) option, +.emotion-3:not([multiple]) optgroup { + background-color: #fff; +} + +.emotion-3.emotion-3.emotion-3 { + padding-right: 32px; +} + +.emotion-3.MuiSelect-select { + height: auto; + min-height: 1.4375em; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.emotion-3::-webkit-input-placeholder { + color: currentColor; + opacity: 0.42; + -webkit-transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; +} + +.emotion-3::-moz-placeholder { + color: currentColor; + opacity: 0.42; + -webkit-transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; +} + +.emotion-3:-ms-input-placeholder { + color: currentColor; + opacity: 0.42; + -webkit-transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; +} + +.emotion-3::-ms-input-placeholder { + color: currentColor; + opacity: 0.42; + -webkit-transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; +} + +.emotion-3:focus { + outline: 0; +} + +.emotion-3:invalid { + box-shadow: none; +} + +.emotion-3::-webkit-search-decoration { + -webkit-appearance: none; +} + +label[data-shrink=false]+.MuiInputBase-formControl .emotion-3::-webkit-input-placeholder { + opacity: 0!important; +} + +label[data-shrink=false]+.MuiInputBase-formControl .emotion-3::-moz-placeholder { + opacity: 0!important; +} + +label[data-shrink=false]+.MuiInputBase-formControl .emotion-3:-ms-input-placeholder { + opacity: 0!important; +} + +label[data-shrink=false]+.MuiInputBase-formControl .emotion-3::-ms-input-placeholder { + opacity: 0!important; +} + +label[data-shrink=false]+.MuiInputBase-formControl .emotion-3:focus::-webkit-input-placeholder { + opacity: 0.42; +} + +label[data-shrink=false]+.MuiInputBase-formControl .emotion-3:focus::-moz-placeholder { + opacity: 0.42; +} + +label[data-shrink=false]+.MuiInputBase-formControl .emotion-3:focus:-ms-input-placeholder { + opacity: 0.42; +} + +label[data-shrink=false]+.MuiInputBase-formControl .emotion-3:focus::-ms-input-placeholder { + opacity: 0.42; +} + +.emotion-3.Mui-disabled { + opacity: 1; + -webkit-text-fill-color: rgba(0, 0, 0, 0.38); +} + +.emotion-3:-webkit-autofill { + -webkit-animation-duration: 5000s; + animation-duration: 5000s; + -webkit-animation-name: mui-auto-fill; + animation-name: mui-auto-fill; +} + +.emotion-3:-webkit-autofill { + border-radius: inherit; +} + +.emotion-4 { + bottom: 0; + left: 0; + position: absolute; + opacity: 0; + pointer-events: none; + width: 100%; + box-sizing: border-box; +} + +.emotion-5 { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + width: 1em; + height: 1em; + display: inline-block; + fill: currentColor; + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + -webkit-transition: fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + transition: fill 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; + font-size: 1.5rem; + position: absolute; + right: 7px; + top: calc(50% - .5em); + pointer-events: none; + color: rgba(0, 0, 0, 0.54); +} + +.emotion-5.Mui-disabled { + color: rgba(0, 0, 0, 0.26); +} + +.emotion-6 { + text-align: left; + position: absolute; + bottom: 0; + right: 0; + top: -5px; + left: 0; + margin: 0; + padding: 0 8px; + pointer-events: none; + border-radius: inherit; + border-style: solid; + border-width: 1px; + overflow: hidden; + min-width: 0%; + border-color: rgba(0, 0, 0, 0.23); +} + +.emotion-7 { + float: unset; + overflow: hidden; + display: block; + width: auto; + padding: 0; + height: 11px; + font-size: 0.75em; + visibility: hidden; + max-width: 0.01px; + -webkit-transition: max-width 50ms cubic-bezier(0.0, 0, 0.2, 1) 0ms; + transition: max-width 50ms cubic-bezier(0.0, 0, 0.2, 1) 0ms; + white-space: nowrap; +} + +.emotion-7>span { + padding-left: 5px; + padding-right: 5px; + display: inline-block; + opacity: 0; + visibility: visible; +} + +
+
+
+ +
+ + + + + +
+ + + Select Role + + +
+
+
+
+
+`;