From c812eef34bfea264bebd5e89dfcb407edc1e4e86 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Tue, 5 Dec 2023 14:59:59 -0600 Subject: [PATCH 01/37] [2064] Permissions Page init --- web-ui/src/components/routes/Routes.jsx | 5 ++ web-ui/src/context/selectors.js | 10 ++++ web-ui/src/pages/EditPermissionsPage.css | 21 ++++++++ web-ui/src/pages/EditPermissionsPage.jsx | 52 ++++++++++++++++++++ web-ui/src/pages/EditPermissionsPage.test.js | 11 +++++ 5 files changed, 99 insertions(+) create mode 100644 web-ui/src/pages/EditPermissionsPage.css create mode 100644 web-ui/src/pages/EditPermissionsPage.jsx create mode 100644 web-ui/src/pages/EditPermissionsPage.test.js diff --git a/web-ui/src/components/routes/Routes.jsx b/web-ui/src/components/routes/Routes.jsx index 1c1bd610d7..7c0ebd70bb 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/EditPermissionsPage"; 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 cfc8513e25..39834f03c3 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, @@ -397,6 +398,15 @@ export const selectMyGuilds = createSelector( ) ); +export const selectMyPermissions = createSelector( + selectCurrentUserId, + selectPermissions, + (id, permissions) => + permissions?.filter((permission) => + permission.permissions?.some((member) => member.memberId === id) + ) +); + export const selectMyTeams = createSelector( selectCurrentUserId, selectTeams, diff --git a/web-ui/src/pages/EditPermissionsPage.css b/web-ui/src/pages/EditPermissionsPage.css new file mode 100644 index 0000000000..9948bb623f --- /dev/null +++ b/web-ui/src/pages/EditPermissionsPage.css @@ -0,0 +1,21 @@ +.edit-permissions-page { + margin: 2rem; +} + +.edit-permissions-list { + margin: 1rem; +} + +.search { + display: flex; + justify-content: space-between; + align-items: center; + margin-left: 1rem; + margin-right: 1rem; +} + +.show-all-permissions { + align-items: center; + display: flex; + margin-top: 1rem; +} diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx new file mode 100644 index 0000000000..c98a7d2da3 --- /dev/null +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -0,0 +1,52 @@ +import React, { useContext, useState } from "react"; + +import { AppContext } from "../context/AppContext"; +import { selectPermissions } from "../context/selectors"; + +import { TextField } from "@mui/material"; + +import "./EditPermissionsPage.css"; + +const EditPermissionsPage = (props) => { + const { state } = useContext(AppContext); + + const [searchText, setSearchText] = useState(""); + const [showAllSkills, setShowAllSkills] = useState(false); + + const allPermissions = selectPermissions(state); + + const handleClick = () => setShowAllSkills(!showAllSkills); + + return ( +
+
+
+ { + setSearchText(e.target.value); + }} + /> +
+ + +
+
+
+ +
+ +
+
+ ); +}; + +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( + + + + ); +}); From bb8545e36250275e36f5b0929d432472e5506d6f Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Wed, 6 Dec 2023 09:19:15 -0600 Subject: [PATCH 02/37] [2064] Menu Addition --- web-ui/src/components/menu/Menu.jsx | 1 + web-ui/src/pages/EditPermissionsPage.jsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/web-ui/src/components/menu/Menu.jsx b/web-ui/src/components/menu/Menu.jsx index b273b7c17e..df9fbfef0a 100644 --- a/web-ui/src/components/menu/Menu.jsx +++ b/web-ui/src/components/menu/Menu.jsx @@ -96,6 +96,7 @@ const Root = styled('div')(({theme}) => ({ const adminLinks = [ // ["/admin/permissions", "Permissions"], + ["/admin/edit-permissions", "Permissions Roles"], ["/admin/roles", "Roles"], ["/admin/users", "Users"], ["/admin/email", "Send Email"], diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index c98a7d2da3..8937f9cc22 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -13,7 +13,7 @@ const EditPermissionsPage = (props) => { const [searchText, setSearchText] = useState(""); const [showAllSkills, setShowAllSkills] = useState(false); - const allPermissions = selectPermissions(state); + // const allPermissions = selectPermissions(state); const handleClick = () => setShowAllSkills(!showAllSkills); From e64fa3e723e454191b9421d485f8cb4d2e29771e Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Thu, 7 Dec 2023 15:51:53 -0600 Subject: [PATCH 03/37] [2064] Actions --- web-ui/src/context/actions.js | 3 +++ web-ui/src/pages/EditPermissionsPage.jsx | 15 ++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/web-ui/src/context/actions.js b/web-ui/src/context/actions.js index d9b6fbbf2d..d3754b2711 100644 --- a/web-ui/src/context/actions.js +++ b/web-ui/src/context/actions.js @@ -2,10 +2,12 @@ export const ADD_CHECKIN = "@@check-ins/add_checkin"; export const ADD_GUILD = "@@check-ins/add_guild"; export const ADD_MEMBER_SKILL = "@@check-ins/add_member_skill"; export const ADD_SKILL = "@@check-ins/add-skill"; +export const ADD_PERMISSION = "@@check-ins/add-permission"; export const ADD_TEAM = "@@check-ins/add_team"; export const DELETE_MEMBER_PROFILE = "@@check-ins/delete_member_profile"; export const DELETE_MEMBER_SKILL = "@@check-ins/delete_member_skill"; export const DELETE_SKILL = "@@check-ins/delete-skill"; +export const DELETE_PERMISSION = "@@check-ins/delete-permission"; export const DELETE_ROLE = "@@check-ins/delete-role"; export const MY_PROFILE_UPDATE = "@@check-ins/update_profile"; export const SET_CSRF = "@@check-ins/update_csrf"; @@ -21,6 +23,7 @@ export const UPDATE_MEMBER_SKILLS = "@@check-ins/update_member_skills"; export const UPDATE_ROLES = "@@check-ins/update_roles"; export const UPDATE_SKILL = "@@check-ins/update_skill"; export const UPDATE_SKILLS = "@@check-ins/update_skills"; +export const UPDATE_PERMISSION = "@@check-ins/update-permission"; export const UPDATE_TEAM_MEMBERS = "@@check-ins/update_team_members"; export const UPDATE_TEAMS = "@@check-ins/update_teams"; export const UPDATE_TERMINATED_MEMBERS = diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 8937f9cc22..2fcc95c5be 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -1,4 +1,4 @@ -import React, { useContext, useState } from "react"; +import React, { useEffect, useContext, useState } from "react"; import { AppContext } from "../context/AppContext"; import { selectPermissions } from "../context/selectors"; @@ -8,15 +8,24 @@ import { TextField } from "@mui/material"; import "./EditPermissionsPage.css"; const EditPermissionsPage = (props) => { - const { state } = useContext(AppContext); + const { state, dispatch } = useContext(AppContext); + const { csrf } = state; + const [permissionsList, setPermissionsList] = useState([]); const [searchText, setSearchText] = useState(""); const [showAllSkills, setShowAllSkills] = useState(false); - // const allPermissions = selectPermissions(state); + const allPermissions = selectPermissions(state); const handleClick = () => setShowAllSkills(!showAllSkills); + useEffect(() => { + + console.log("Permissions"); + console.log(allPermissions, permissionsList); + + }, [allPermissions, permissionsList]) + return (
From 0ac03e552d9870b7f2385c27ec94f9fe95b39b3b Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Wed, 13 Dec 2023 13:01:32 -0600 Subject: [PATCH 04/37] [2064] Updating Permissions page --- web-ui/src/pages/EditPermissionsPage.jsx | 47 ++++++++++++++++++++---- web-ui/src/pages/EditSkillsPage.css | 8 ++++ 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 2fcc95c5be..3f3be50845 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -13,18 +13,22 @@ const EditPermissionsPage = (props) => { const [permissionsList, setPermissionsList] = useState([]); const [searchText, setSearchText] = useState(""); - const [showAllSkills, setShowAllSkills] = useState(false); + const [showAllPermissions, setShowAllPermissions] = useState(true); + const [updatePermissions, setUpdatePermissions] = useState(false); + const [deletePermissions, setDeletePermissions] = useState(false); + const [viewPermissions, setViewPermissions] = useState(false); const allPermissions = selectPermissions(state); - const handleClick = () => setShowAllSkills(!showAllSkills); + const handleClick = () => setShowAllPermissions(!showAllPermissions); + const handleClickUpdate = () => setUpdatePermissions(!updatePermissions); + const handleClickDelete = () => setDeletePermissions(!deletePermissions); + const handleClickView = () => setViewPermissions(!viewPermissions); useEffect(() => { - console.log("Permissions"); console.log(allPermissions, permissionsList); - - }, [allPermissions, permissionsList]) + }, [allPermissions, permissionsList]); return (
@@ -40,19 +44,46 @@ const EditPermissionsPage = (props) => { }} />
- +
- +

Edit Permissions Below:

+
+ + +
+
+ + +
+
+ + +
); diff --git a/web-ui/src/pages/EditSkillsPage.css b/web-ui/src/pages/EditSkillsPage.css index 951a26bb95..003c116f06 100644 --- a/web-ui/src/pages/EditSkillsPage.css +++ b/web-ui/src/pages/EditSkillsPage.css @@ -25,3 +25,11 @@ display: flex; margin-top: 1rem; } + +.edit-permissions { + display: block; + float: left; + position: relative; + width: auto; + margin: 2%; +} From 60e44aa91db8c9950dc2a6e7b8bf3958b0e3f8d6 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Sun, 24 Dec 2023 23:21:40 -0600 Subject: [PATCH 05/37] [2064] Update Permissions Page --- web-ui/src/pages/EditPermissionsPage.jsx | 28 ++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 3f3be50845..a42b944a88 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -25,6 +25,26 @@ const EditPermissionsPage = (props) => { const handleClickDelete = () => setDeletePermissions(!deletePermissions); const handleClickView = () => setViewPermissions(!viewPermissions); + const permissionTypes = [ + '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', + ]; + useEffect(() => { console.log("Permissions"); console.log(allPermissions, permissionsList); @@ -55,9 +75,9 @@ const EditPermissionsPage = (props) => { -
+

Edit Permissions Below:

-
+
{ />
-
+
{ />
-
+
Date: Sun, 7 Jan 2024 23:04:17 -0600 Subject: [PATCH 06/37] [2064] Adding API --- web-ui/src/api/permissions.js | 11 + web-ui/src/pages/EditPermissionsPage.jsx | 312 ++++++++++++++++++++--- 2 files changed, 292 insertions(+), 31 deletions(-) create mode 100644 web-ui/src/api/permissions.js 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/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index a42b944a88..e135d6728b 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -1,5 +1,7 @@ import React, { useEffect, useContext, useState } from "react"; +import { getPermissionsList } from "../api/permissions"; + import { AppContext } from "../context/AppContext"; import { selectPermissions } from "../context/selectors"; @@ -8,42 +10,124 @@ import { TextField } from "@mui/material"; import "./EditPermissionsPage.css"; const EditPermissionsPage = (props) => { - const { state, dispatch } = useContext(AppContext); + // const { state, dispatch } = useContext(AppContext); + const { state } = useContext(AppContext); const { csrf } = state; const [permissionsList, setPermissionsList] = useState([]); const [searchText, setSearchText] = useState(""); + const [showAllPermissions, setShowAllPermissions] = useState(true); - const [updatePermissions, setUpdatePermissions] = useState(false); - const [deletePermissions, setDeletePermissions] = useState(false); + + const [ + updateFeedbackRequestPermissions, + setUpdateFeedbackRequestPermissions, + ] = useState(false); + const [ + deleteFeedbackRequestPermissions, + setDeleteFeedbackRequestPermissions, + ] = useState(false); + const [viewFeedbackRequestPermissions, setViewFeedbackRequestPermissions] = + useState(false); + + const [viewFeedbackAnswerPermissions, setViewFeedbackAnswerPermissions] = + useState(false); + + const [updateOrgMembersPermissions, setUpdateOrgMembersPermissions] = + useState(false); + const [deleteOrgMembersPermissions, setDeleteOrgMembersPermissions] = + useState(false); + + const [viewRolePermissions, setViewRolePermissions] = useState(false); + const [assignRolePermissions, setAssignRolePermissions] = useState(false); + const [viewPermissions, setViewPermissions] = useState(false); + const [viewSkillsReports, setViewSkillsReports] = useState(false); + const [viewRetentionReports, setViewRetentionReports] = useState(false); + const [viewAnniversaryReports, setViewAnniversaryReports] = useState(false); + const [viewBirthdayReports, setViewBirthdayReports] = useState(false); + const [viewProfileReports, setViewProfileReports] = useState(false); + + const [updateCheckins, setUpdateCheckins] = useState(false); + const [createCheckins, setCreateCheckins] = useState(false); + const [viewCheckins, setViewCheckins] = useState(false); + const allPermissions = selectPermissions(state); const handleClick = () => setShowAllPermissions(!showAllPermissions); - const handleClickUpdate = () => setUpdatePermissions(!updatePermissions); - const handleClickDelete = () => setDeletePermissions(!deletePermissions); + + const handleClickUpdateFeedbackRequest = () => + setUpdateFeedbackRequestPermissions(!updateFeedbackRequestPermissions); + const handleClickDeleteFeedbackRequest = () => + setDeleteFeedbackRequestPermissions(!deleteFeedbackRequestPermissions); + const handleClickViewFeedbackRequest = () => + setViewFeedbackRequestPermissions(!viewFeedbackRequestPermissions); + + const handleClickViewFeedbackAnswer = () => + setViewFeedbackAnswerPermissions(!viewFeedbackAnswerPermissions); + + const handleClickUpdateOrgMembersPermissions = () => + setUpdateOrgMembersPermissions(!updateOrgMembersPermissions); + const handleClickDeleteOrgMembers = () => + setDeleteOrgMembersPermissions(!deleteOrgMembersPermissions); + + const handleClickRolePermissionsView = () => + setViewRolePermissions(!viewRolePermissions); + const handleClickRolePermissionsAssign = () => + setAssignRolePermissions(!assignRolePermissions); + const handleClickView = () => setViewPermissions(!viewPermissions); - const permissionTypes = [ - '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', - ]; + const handleClickViewSkillsReports = () => + setViewSkillsReports(!viewSkillsReports); + const handleClickViewRetentionReports = () => + setViewRetentionReports(!viewRetentionReports); + const handleClickViewAnniversaryReports = () => + setViewAnniversaryReports(!viewAnniversaryReports); + const handleClickViewBirthdayReports = () => + setViewBirthdayReports(!viewBirthdayReports); + const handleClickViewProfileReports = () => + setViewProfileReports(!viewProfileReports); + + const handleClickUpdateCheckins = () => setUpdateCheckins(!updateCheckins); + const handleClickCreateCheckins = () => setCreateCheckins(!createCheckins); + const handleClickViewCheckins = () => setViewCheckins(!viewCheckins); + + // const permissionTypes = [ + // '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', + // ]; + + useEffect(() => { + const doTask = async (team) => { + let res = await getPermissionsList(team, csrf); + let data = + res.payload && res.payload.data && !res.error ? res.payload.data : null; + if (data) { + setPermissionsList(data); + } + }; + + if (csrf) { + doTask(); + } + }, [permissionsList, csrf]); useEffect(() => { console.log("Permissions"); @@ -76,25 +160,109 @@ const EditPermissionsPage = (props) => {
-

Edit Permissions Below:

+

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:

+
+ + +
+
+ + +
+
+ + +
+
); }; From 3d7091d36df4d23ebe104a57dbeed10bd5410db3 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Tue, 30 Jan 2024 01:42:41 -0600 Subject: [PATCH 07/37] [2064] Simplify UI / add roles to permissions tree --- web-ui/src/api/permissions.js | 2 +- web-ui/src/pages/EditPermissionsPage.jsx | 165 ++++++++++++------ web-ui/src/pages/EditPermissionsPageRoles.jsx | 35 ++++ 3 files changed, 148 insertions(+), 54 deletions(-) create mode 100644 web-ui/src/pages/EditPermissionsPageRoles.jsx diff --git a/web-ui/src/api/permissions.js b/web-ui/src/api/permissions.js index d33ebda9c4..e505bda4e5 100644 --- a/web-ui/src/api/permissions.js +++ b/web-ui/src/api/permissions.js @@ -1,6 +1,6 @@ import { resolve } from "./api.js"; -const permissionsListUrl = "/services/permissions" +const permissionsListUrl = "/services/roles/role-permissions" export const getPermissionsList = async (cookie) => { return resolve({ diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index e135d6728b..bafb7a7bbf 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -1,5 +1,7 @@ import React, { useEffect, useContext, useState } from "react"; +import EditPermissionsPageRoles from "./EditPermissionsPageRoles"; + import { getPermissionsList } from "../api/permissions"; import { AppContext } from "../context/AppContext"; @@ -20,20 +22,48 @@ const EditPermissionsPage = (props) => { const [showAllPermissions, setShowAllPermissions] = useState(true); const [ - updateFeedbackRequestPermissions, - setUpdateFeedbackRequestPermissions, + createFeedbackRequestPermissionsAdmin, + setCreateFeedbackRequestPermissionsAdmin, ] = useState(false); const [ - deleteFeedbackRequestPermissions, - setDeleteFeedbackRequestPermissions, + 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 [viewFeedbackRequestPermissions, setViewFeedbackRequestPermissions] = - useState(false); const [viewFeedbackAnswerPermissions, setViewFeedbackAnswerPermissions] = useState(false); - const [updateOrgMembersPermissions, setUpdateOrgMembersPermissions] = + const [createOrgMembersPermissions, setCreateOrgMembersPermissions] = useState(false); const [deleteOrgMembersPermissions, setDeleteOrgMembersPermissions] = useState(false); @@ -57,18 +87,50 @@ const EditPermissionsPage = (props) => { const handleClick = () => setShowAllPermissions(!showAllPermissions); - const handleClickUpdateFeedbackRequest = () => - setUpdateFeedbackRequestPermissions(!updateFeedbackRequestPermissions); - const handleClickDeleteFeedbackRequest = () => - setDeleteFeedbackRequestPermissions(!deleteFeedbackRequestPermissions); - const handleClickViewFeedbackRequest = () => - setViewFeedbackRequestPermissions(!viewFeedbackRequestPermissions); + const handleClickCreateFeedbackRequestAdmin = () => + setCreateFeedbackRequestPermissionsAdmin( + !createFeedbackRequestPermissionsAdmin + ); + + const handleClickCreateFeedbackRequestPDL = () => + setCreateFeedbackRequestPermissionsPDL( + !createFeedbackRequestPermissionsPDL + ); + + const handleClickCreateFeedbackRequestMember = () => + setCreateFeedbackRequestPermissionsMember( + !createFeedbackRequestPermissionsMember + ); + + const handleClickDeleteFeedbackRequestAdmin = () => + setDeleteFeedbackRequestPermissionsAdmin( + !deleteFeedbackRequestPermissionsAdmin + ); + const handleClickDeleteFeedbackRequestPDL = () => + setDeleteFeedbackRequestPermissionsPDL( + !deleteFeedbackRequestPermissionsPDL + ); + const handleClickDeleteFeedbackRequestMember = () => + setDeleteFeedbackRequestPermissionsMember( + !deleteFeedbackRequestPermissionsMember + ); + + const handleClickViewFeedbackRequestAdmin = () => + setViewFeedbackRequestPermissionsAdmin( + !viewFeedbackRequestPermissionsAdmin + ); + const handleClickViewFeedbackRequestPDL = () => + setViewFeedbackRequestPermissionsPDL(!viewFeedbackRequestPermissionsPDL); + const handleClickViewFeedbackRequestMember = () => + setViewFeedbackRequestPermissionsMember( + !viewFeedbackRequestPermissionsMember + ); const handleClickViewFeedbackAnswer = () => setViewFeedbackAnswerPermissions(!viewFeedbackAnswerPermissions); - const handleClickUpdateOrgMembersPermissions = () => - setUpdateOrgMembersPermissions(!updateOrgMembersPermissions); + const handleClickCreateOrgMembersPermissions = () => + setCreateOrgMembersPermissions(!createOrgMembersPermissions); const handleClickDeleteOrgMembers = () => setDeleteOrgMembersPermissions(!deleteOrgMembersPermissions); @@ -161,39 +223,36 @@ const EditPermissionsPage = (props) => {

Edit Feedback Request Permissions Below:

-
- - -
-
- - -
-
- - -
+ + + + + +
@@ -215,13 +274,13 @@ const EditPermissionsPage = (props) => {

Edit Organization Members Permissions Below:

-
diff --git a/web-ui/src/pages/EditPermissionsPageRoles.jsx b/web-ui/src/pages/EditPermissionsPageRoles.jsx new file mode 100644 index 0000000000..66ccc79002 --- /dev/null +++ b/web-ui/src/pages/EditPermissionsPageRoles.jsx @@ -0,0 +1,35 @@ +import React from "react"; + +const EditPermissionsPageRoles = ({ + title, + selectAdmin, + admin, + selectPDL, + pdl, + selectMember, + member, +}) => { + return ( +
+

{title}

+ + + + + + +
+ ); +}; + +export default EditPermissionsPageRoles; From a105b81aba24400d6140cba8fa6a1a64944e1680 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Tue, 30 Jan 2024 02:01:50 -0600 Subject: [PATCH 08/37] [2064] More roles --- web-ui/src/pages/EditPermissionsPage.jsx | 122 +++++++++++++++-------- 1 file changed, 79 insertions(+), 43 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index bafb7a7bbf..9b263115bb 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -60,13 +60,40 @@ const EditPermissionsPage = (props) => { setViewFeedbackRequestPermissionsMember, ] = useState(false); - const [viewFeedbackAnswerPermissions, setViewFeedbackAnswerPermissions] = - useState(false); + const [ + viewFeedbackAnswerPermissionsAdmin, + setViewFeedbackAnswerPermissionsAdmin, + ] = useState(false); + const [ + viewFeedbackAnswerPermissionsPDL, + setViewFeedbackAnswerPermissionsPDL, + ] = useState(false); + const [ + viewFeedbackAnswerPermissionsMember, + setViewFeedbackAnswerPermissionsMember, + ] = useState(false); - const [createOrgMembersPermissions, setCreateOrgMembersPermissions] = + const [ + createOrgMembersPermissionsAdmin, + setCreateOrgMembersPermissionsAdmin, + ] = useState(false); + const [createOrgMembersPermissionsPDL, setCreateOrgMembersPermissionsPDL] = useState(false); - const [deleteOrgMembersPermissions, setDeleteOrgMembersPermissions] = + const [ + createOrgMembersPermissionsMember, + setCreateOrgMembersPermissionsMember, + ] = useState(false); + + const [ + deleteOrgMembersPermissionsAdmin, + setDeleteOrgMembersPermissionsAdmin, + ] = useState(false); + const [deleteOrgMembersPermissionsPDL, setDeleteOrgMembersPermissionsPDL] = useState(false); + const [ + deleteOrgMembersPermissionsMember, + setDeleteOrgMembersPermissionsMember, + ] = useState(false); const [viewRolePermissions, setViewRolePermissions] = useState(false); const [assignRolePermissions, setAssignRolePermissions] = useState(false); @@ -126,13 +153,28 @@ const EditPermissionsPage = (props) => { !viewFeedbackRequestPermissionsMember ); - const handleClickViewFeedbackAnswer = () => - setViewFeedbackAnswerPermissions(!viewFeedbackAnswerPermissions); + const handleClickViewFeedbackAnswerAdmin = () => + setViewFeedbackAnswerPermissionsAdmin(!viewFeedbackAnswerPermissionsAdmin); + const handleClickViewFeedbackAnswerPDL = () => + setViewFeedbackAnswerPermissionsPDL(!viewFeedbackAnswerPermissionsPDL); + const handleClickViewFeedbackAnswerMember = () => + setViewFeedbackAnswerPermissionsMember( + !viewFeedbackAnswerPermissionsMember + ); + + const handleClickCreateOrgMembersPermissionsAdmin = () => + setCreateOrgMembersPermissionsAdmin(!createOrgMembersPermissionsAdmin); + const handleClickCreateOrgMembersPermissionsPDL = () => + setCreateOrgMembersPermissionsPDL(!createOrgMembersPermissionsPDL); + const handleClickCreateOrgMembersPermissionsMember = () => + setCreateOrgMembersPermissionsMember(!createOrgMembersPermissionsMember); - const handleClickCreateOrgMembersPermissions = () => - setCreateOrgMembersPermissions(!createOrgMembersPermissions); - const handleClickDeleteOrgMembers = () => - setDeleteOrgMembersPermissions(!deleteOrgMembersPermissions); + const handleClickDeleteOrgMembersPermissionsAdmin = () => + setDeleteOrgMembersPermissionsAdmin(!deleteOrgMembersPermissionsAdmin); + const handleClickDeleteOrgMembersPermissionsPDL = () => + setDeleteOrgMembersPermissionsPDL(!deleteOrgMembersPermissionsPDL); + const handleClickDeleteOrgMembersPermissionsMember = () => + setDeleteOrgMembersPermissionsMember(!deleteOrgMembersPermissionsMember); const handleClickRolePermissionsView = () => setViewRolePermissions(!viewRolePermissions); @@ -257,43 +299,37 @@ const EditPermissionsPage = (props) => {

Edit Feedback Answer Permissions Below:

-
- - -
+

Edit Organization Members Permissions Below:

-
- - -
-
- - -
+ +
From 256990be7e39304506e572962607e60066bb0327 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Wed, 31 Jan 2024 10:00:56 -0600 Subject: [PATCH 09/37] [2064] More roles --- web-ui/src/pages/EditPermissionsPage.jsx | 108 ++++++++++++++--------- 1 file changed, 66 insertions(+), 42 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 9b263115bb..d2daacf3fc 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -95,10 +95,22 @@ const EditPermissionsPage = (props) => { setDeleteOrgMembersPermissionsMember, ] = useState(false); - const [viewRolePermissions, setViewRolePermissions] = useState(false); - const [assignRolePermissions, setAssignRolePermissions] = 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 [viewPermissions, setViewPermissions] = useState(false); + const [viewPermissionsAdmin, setViewPermissionsAdmin] = useState(false); + const [viewPermissionsPDL, setViewPermissionsPDL] = useState(false); + const [viewPermissionsMember, setViewPermissionsMember] = useState(false); const [viewSkillsReports, setViewSkillsReports] = useState(false); const [viewRetentionReports, setViewRetentionReports] = useState(false); @@ -176,12 +188,25 @@ const EditPermissionsPage = (props) => { const handleClickDeleteOrgMembersPermissionsMember = () => setDeleteOrgMembersPermissionsMember(!deleteOrgMembersPermissionsMember); - const handleClickRolePermissionsView = () => - setViewRolePermissions(!viewRolePermissions); - const handleClickRolePermissionsAssign = () => - setAssignRolePermissions(!assignRolePermissions); - - const handleClickView = () => setViewPermissions(!viewPermissions); + const handleClickRolePermissionsViewAdmin = () => + setViewRolePermissionsAdmin(!viewRolePermissionsAdmin); + const handleClickRolePermissionsViewPDL = () => + setViewRolePermissionsPDL(!viewRolePermissionsPDL); + const handleClickRolePermissionsViewMember = () => + setViewRolePermissionsMember(!viewRolePermissionsMember); + + const handleClickRolePermissionsAssignAdmin = () => + setAssignRolePermissionsAdmin(!assignRolePermissionsAdmin); + const handleClickRolePermissionsAssignPDL = () => + setAssignRolePermissionsPDL(!assignRolePermissionsPDL); + const handleClickRolePermissionsAssignMember = () => + setAssignRolePermissionsMember(!assignRolePermissionsMember); + + const handleClickViewAdmin = () => + setViewPermissionsAdmin(!viewPermissionsAdmin); + const handleClickViewPDL = () => setViewPermissionsPDL(!viewPermissionsPDL); + const handleClickViewMember = () => + setViewPermissionsMember(!viewPermissionsMember); const handleClickViewSkillsReports = () => setViewSkillsReports(!viewSkillsReports); @@ -233,10 +258,10 @@ const EditPermissionsPage = (props) => { } }, [permissionsList, csrf]); - useEffect(() => { - console.log("Permissions"); - console.log(allPermissions, permissionsList); - }, [allPermissions, permissionsList]); + // useEffect(() => { + // console.log("Permissions"); + // console.log(allPermissions, permissionsList); + // }, [allPermissions, permissionsList]); return (
@@ -334,39 +359,38 @@ const EditPermissionsPage = (props) => {

Edit Role Permissions Below:

-
- - -
-
- - -
+ + +

Edit View Permissions Below:

-
- - -
+
From 8061b1e19ef6eb860ec047abc931f8bd8d5c3c73 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Fri, 2 Feb 2024 10:49:22 -0600 Subject: [PATCH 10/37] [2064] Another chunk of roles --- web-ui/src/pages/EditPermissionsPage.jsx | 168 ++++++++++++++--------- 1 file changed, 106 insertions(+), 62 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index d2daacf3fc..cc55d49bc1 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -112,11 +112,33 @@ const EditPermissionsPage = (props) => { const [viewPermissionsPDL, setViewPermissionsPDL] = useState(false); const [viewPermissionsMember, setViewPermissionsMember] = useState(false); - const [viewSkillsReports, setViewSkillsReports] = useState(false); - const [viewRetentionReports, setViewRetentionReports] = useState(false); - const [viewAnniversaryReports, setViewAnniversaryReports] = useState(false); - const [viewBirthdayReports, setViewBirthdayReports] = useState(false); - const [viewProfileReports, setViewProfileReports] = 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 [updateCheckins, setUpdateCheckins] = useState(false); const [createCheckins, setCreateCheckins] = useState(false); @@ -208,16 +230,40 @@ const EditPermissionsPage = (props) => { const handleClickViewMember = () => setViewPermissionsMember(!viewPermissionsMember); - const handleClickViewSkillsReports = () => - setViewSkillsReports(!viewSkillsReports); - const handleClickViewRetentionReports = () => - setViewRetentionReports(!viewRetentionReports); - const handleClickViewAnniversaryReports = () => - setViewAnniversaryReports(!viewAnniversaryReports); - const handleClickViewBirthdayReports = () => - setViewBirthdayReports(!viewBirthdayReports); - const handleClickViewProfileReports = () => - setViewProfileReports(!viewProfileReports); + const handleClickViewSkillsReportsAdmin = () => + setViewSkillsReportsAdmin(!viewSkillsReportsAdmin); + const handleClickViewSkillsReportsPDL = () => + setViewSkillsReportsPDL(!viewSkillsReportsPDL); + const handleClickViewSkillsReportsMember = () => + setViewSkillsReportsMember(!viewSkillsReportsMember); + + const handleClickViewRetentionReportsAdmin = () => + setViewRetentionReportsAdmin(!viewRetentionReportsAdmin); + const handleClickViewRetentionReportsPDL = () => + setViewRetentionReportsPDL(!viewRetentionReportsPDL); + const handleClickViewRetentionReportsMember = () => + setViewRetentionReportsMember(!viewRetentionReportsMember); + + const handleClickViewAnniversaryReportsAdmin = () => + setViewAnniversaryReportsAdmin(!viewAnniversaryReportsAdmin); + const handleClickViewAnniversaryReportsPDL = () => + setViewAnniversaryReportsPDL(!viewAnniversaryReportsPDL); + const handleClickViewAnniversaryReportsMember = () => + setViewAnniversaryReportsMember(!viewAnniversaryReportsMember); + + const handleClickViewBirthdayReportsAdmin = () => + setViewBirthdayReportsAdmin(!viewBirthdayReportsAdmin); + const handleClickViewBirthdayReportsPDL = () => + setViewBirthdayReportsPDL(!viewBirthdayReportsPDL); + const handleClickViewBirthdayReportsMember = () => + setViewBirthdayReportsMember(!viewBirthdayReportsMember); + + const handleClickViewProfileReportsAdmin = () => + setViewProfileReportsAdmin(!viewProfileReportsAdmin); + const handleClickViewProfileReportsPDL = () => + setViewProfileReportsPDL(!viewProfileReportsPDL); + const handleClickViewProfileReportsMember = () => + setViewProfileReportsMember(!viewProfileReportsMember); const handleClickUpdateCheckins = () => setUpdateCheckins(!updateCheckins); const handleClickCreateCheckins = () => setCreateCheckins(!createCheckins); @@ -395,53 +441,51 @@ const EditPermissionsPage = (props) => {

Edit View Reports Permissions Below:

-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
+ + + + +
From 0c1ae524ebf2c63652330f0d366d76e15dede51d Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Fri, 2 Feb 2024 11:05:10 -0600 Subject: [PATCH 11/37] [2064] Final Roles input batch --- web-ui/src/pages/EditPermissionsPage.jsx | 93 +++++++++++++++--------- 1 file changed, 60 insertions(+), 33 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index cc55d49bc1..0feacbcb1c 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -140,9 +140,17 @@ const EditPermissionsPage = (props) => { const [viewProfileReportsMember, setViewProfileReportsMember] = useState(false); - const [updateCheckins, setUpdateCheckins] = useState(false); - const [createCheckins, setCreateCheckins] = useState(false); - const [viewCheckins, setViewCheckins] = 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 allPermissions = selectPermissions(state); @@ -265,9 +273,25 @@ const EditPermissionsPage = (props) => { const handleClickViewProfileReportsMember = () => setViewProfileReportsMember(!viewProfileReportsMember); - const handleClickUpdateCheckins = () => setUpdateCheckins(!updateCheckins); - const handleClickCreateCheckins = () => setCreateCheckins(!createCheckins); - const handleClickViewCheckins = () => setViewCheckins(!viewCheckins); + const handleClickUpdateCheckinsAdmin = () => + setUpdateCheckinsAdmin(!updateCheckinsAdmin); + const handleClickUpdateCheckinsPDL = () => + setUpdateCheckinsPDL(!updateCheckinsPDL); + const handleClickUpdateCheckinsMember = () => + setUpdateCheckinsMember(!updateCheckinsMember); + + const handleClickCreateCheckinsAdmin = () => + setCreateCheckinsAdmin(!createCheckinsAdmin); + const handleClickCreateCheckinsPDL = () => + setCreateCheckinsPDL(!createCheckinsPDL); + const handleClickCreateCheckinsMember = () => + setCreateCheckinsMember(!createCheckinsMember); + + const handleClickViewCheckinsAdmin = () => + setViewCheckinsAdmin(!viewCheckinsAdmin); + const handleClickViewCheckinsPDL = () => setViewCheckinsPDL(!viewCheckinsPDL); + const handleClickViewCheckinsMember = () => + setViewCheckinsMember(!viewCheckinsMember); // const permissionTypes = [ // 'CAN_VIEW_FEEDBACK_REQUEST', @@ -490,33 +514,36 @@ const EditPermissionsPage = (props) => {

Edit Checkins Below:

-
- - -
-
- - -
-
- - -
+ + + + + +
); From 3f092e1e978505b721c102297636d891515763ff Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Mon, 5 Feb 2024 00:31:29 -0600 Subject: [PATCH 12/37] [2064] Add several API's & work on connections --- web-ui/src/api/memberroles.js | 11 +++ web-ui/src/api/permissions.js | 2 +- web-ui/src/api/rolepermissions.js | 11 +++ web-ui/src/api/roles.js | 8 ++ web-ui/src/helpers/checks.js | 49 ++++++++++++ web-ui/src/pages/EditPermissionsPage.css | 14 ---- web-ui/src/pages/EditPermissionsPage.jsx | 98 ++++++++++++++---------- 7 files changed, 136 insertions(+), 57 deletions(-) create mode 100644 web-ui/src/api/memberroles.js create mode 100644 web-ui/src/api/rolepermissions.js create mode 100644 web-ui/src/helpers/checks.js 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 index e505bda4e5..d33ebda9c4 100644 --- a/web-ui/src/api/permissions.js +++ b/web-ui/src/api/permissions.js @@ -1,6 +1,6 @@ import { resolve } from "./api.js"; -const permissionsListUrl = "/services/roles/role-permissions" +const permissionsListUrl = "/services/permissions" export const getPermissionsList = async (cookie) => { return resolve({ diff --git a/web-ui/src/api/rolepermissions.js b/web-ui/src/api/rolepermissions.js new file mode 100644 index 0000000000..9fe5e3c2bb --- /dev/null +++ b/web-ui/src/api/rolepermissions.js @@ -0,0 +1,11 @@ +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 }, + }); + }; \ No newline at end of file diff --git a/web-ui/src/api/roles.js b/web-ui/src/api/roles.js index 90f65e3142..0db9879c51 100644 --- a/web-ui/src/api/roles.js +++ b/web-ui/src/api/roles.js @@ -19,6 +19,14 @@ export const getAllUserRoles = async (cookie) => { }); }; +export const getCurrentUserRole = async (memberId, cookie) => { + return resolve({ + url: `${roleURL}/${memberId}`, + responseType: "json", + headers: { "X-CSRF-Header": cookie }, + }); +}; + export const removeUserFromRole = async (roleId, memberId, cookie) => { return resolve({ method: "delete", diff --git a/web-ui/src/helpers/checks.js b/web-ui/src/helpers/checks.js new file mode 100644 index 0000000000..d1b27b584d --- /dev/null +++ b/web-ui/src/helpers/checks.js @@ -0,0 +1,49 @@ +/** + * Full check for whether an array actually exists or is empty, etc + * @param arr - an array + * @returns a boolean + */ + +import { find } from "lodash"; + +export const isArrayPresent = (arr) => Array.isArray(arr) && arr.length; + +/** + * Check for whether unique object is already in an array and return a boolean. + * @param arr - an array + * @returns a boolean + */ +export const isObjectInArray = (arr, obj) => { + return arr.includes(obj); +}; + +/** + * If an object is already in an array, return the array without it. + * @param arr - an array + * @returns an array + */ +export const removeObjectFromArray = (arr, obj) => { + let newArr = []; + arr.map((opt) => { + if (opt !== obj) { + newArr.push(opt); + } + }); + return newArr; +}; + +/** + * 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 + */ + +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 index 9948bb623f..22c42f021d 100644 --- a/web-ui/src/pages/EditPermissionsPage.css +++ b/web-ui/src/pages/EditPermissionsPage.css @@ -5,17 +5,3 @@ .edit-permissions-list { margin: 1rem; } - -.search { - display: flex; - justify-content: space-between; - align-items: center; - margin-left: 1rem; - margin-right: 1rem; -} - -.show-all-permissions { - align-items: center; - display: flex; - margin-top: 1rem; -} diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 0feacbcb1c..43c4212b20 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -3,11 +3,16 @@ import React, { useEffect, useContext, useState } from "react"; import EditPermissionsPageRoles from "./EditPermissionsPageRoles"; import { getPermissionsList } from "../api/permissions"; +import { getRolePermissionsList } from "../api/rolepermissions"; +import { getCurrentUserRole } from '../api/roles'; +import { getMemberRolesList } from '../api/memberroles'; +import { isArrayPresent, isObjectInArray, filterObjectByValOrKey } from '../helpers/checks'; import { AppContext } from "../context/AppContext"; -import { selectPermissions } from "../context/selectors"; - -import { TextField } from "@mui/material"; +// import { selectPermissions } from "../context/selectors"; +import { + selectCurrentUserId, +} from "../context/selectors"; import "./EditPermissionsPage.css"; @@ -16,10 +21,11 @@ const EditPermissionsPage = (props) => { const { state } = useContext(AppContext); const { csrf } = state; const [permissionsList, setPermissionsList] = useState([]); - - const [searchText, setSearchText] = useState(""); - - const [showAllPermissions, setShowAllPermissions] = useState(true); + const [rolePermissionsList, setRolePermissionsList] = useState([]); + // const allPermissions = selectPermissions(state); + const currentUserId = selectCurrentUserId(state); + const [currentUserRole, setCurrentUserRole] = useState([]); + const [memberRoles, setMemberRoles] = useState([]); const [ createFeedbackRequestPermissionsAdmin, @@ -152,10 +158,6 @@ const EditPermissionsPage = (props) => { const [viewCheckinsPDL, setViewCheckinsPDL] = useState(false); const [viewCheckinsMember, setViewCheckinsMember] = useState(false); - const allPermissions = selectPermissions(state); - - const handleClick = () => setShowAllPermissions(!showAllPermissions); - const handleClickCreateFeedbackRequestAdmin = () => setCreateFeedbackRequestPermissionsAdmin( !createFeedbackRequestPermissionsAdmin @@ -314,50 +316,62 @@ const EditPermissionsPage = (props) => { // ]; useEffect(() => { - const doTask = async (team) => { - let res = await getPermissionsList(team, csrf); + 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); } }; + 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) { - doTask(); + doTask1(); + doTask2(); + doTask3(); } - }, [permissionsList, csrf]); + }, [csrf]); - // useEffect(() => { - // console.log("Permissions"); - // console.log(allPermissions, permissionsList); - // }, [allPermissions, permissionsList]); + useEffect(() => { + console.log("Permissions List"); + console.log(permissionsList); + // console.log("All Permissions"); + // console.log(allPermissions); + console.log("Role Permissions"); + console.log(rolePermissionsList); + }, [permissionsList, rolePermissionsList]); + + useEffect(() => { + console.log("Member Roles"); + console.log(memberRoles); + if(isArrayPresent(memberRoles)) { + let data = memberRoles.filter((a) => a.memberRoleId.memberId === currentUserId); + if (isArrayPresent(data)) { + setCurrentUserRole(data[0].memberRoleId.roleId); + } + } + console.log("Current User Role:") + console.log(currentUserRole); + }, [memberRoles, currentUserRole]); return (
-
-
- { - setSearchText(e.target.value); - }} - /> -
- - -
-
-
-

Edit Feedback Request Permissions Below:

From ea06c05b26ee9a521a32984a072ea368dab580c3 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Mon, 5 Feb 2024 00:57:33 -0600 Subject: [PATCH 13/37] [2064] Add restrictions for role --- web-ui/src/helpers/checks.js | 19 +- web-ui/src/pages/EditPermissionsPage.jsx | 416 ++++++++++++----------- 2 files changed, 216 insertions(+), 219 deletions(-) diff --git a/web-ui/src/helpers/checks.js b/web-ui/src/helpers/checks.js index d1b27b584d..340ac415d9 100644 --- a/web-ui/src/helpers/checks.js +++ b/web-ui/src/helpers/checks.js @@ -4,8 +4,6 @@ * @returns a boolean */ -import { find } from "lodash"; - export const isArrayPresent = (arr) => Array.isArray(arr) && arr.length; /** @@ -17,21 +15,6 @@ export const isObjectInArray = (arr, obj) => { return arr.includes(obj); }; -/** - * If an object is already in an array, return the array without it. - * @param arr - an array - * @returns an array - */ -export const removeObjectFromArray = (arr, obj) => { - let newArr = []; - arr.map((opt) => { - if (opt !== obj) { - newArr.push(opt); - } - }); - return newArr; -}; - /** * If a parameter is found in an object within an array, return the array with just that object. * @param arr - an array @@ -40,7 +23,7 @@ export const removeObjectFromArray = (arr, obj) => { * @returns an array */ -function filterObjectByValOrKey(arr, value, key) { +export function filterObjectByValOrKey(arr, value, key) { return arr.filter( key ? (a) => a[key].indexOf(value) > -1 diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 43c4212b20..37aa346aff 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -4,15 +4,13 @@ import EditPermissionsPageRoles from "./EditPermissionsPageRoles"; import { getPermissionsList } from "../api/permissions"; import { getRolePermissionsList } from "../api/rolepermissions"; -import { getCurrentUserRole } from '../api/roles'; -import { getMemberRolesList } from '../api/memberroles'; -import { isArrayPresent, isObjectInArray, filterObjectByValOrKey } from '../helpers/checks'; +import { getCurrentUserRole } from "../api/roles"; +import { getMemberRolesList } from "../api/memberroles"; +import { isArrayPresent, filterObjectByValOrKey } from "../helpers/checks"; import { AppContext } from "../context/AppContext"; // import { selectPermissions } from "../context/selectors"; -import { - selectCurrentUserId, -} from "../context/selectors"; +import { selectCurrentUserId } from "../context/selectors"; import "./EditPermissionsPage.css"; @@ -22,9 +20,8 @@ const EditPermissionsPage = (props) => { const { csrf } = state; const [permissionsList, setPermissionsList] = useState([]); const [rolePermissionsList, setRolePermissionsList] = useState([]); - // const allPermissions = selectPermissions(state); const currentUserId = selectCurrentUserId(state); - const [currentUserRole, setCurrentUserRole] = useState([]); + const [currentUserRole, setCurrentUserRole] = useState(""); const [memberRoles, setMemberRoles] = useState([]); const [ @@ -351,8 +348,6 @@ const EditPermissionsPage = (props) => { useEffect(() => { console.log("Permissions List"); console.log(permissionsList); - // console.log("All Permissions"); - // console.log(allPermissions); console.log("Role Permissions"); console.log(rolePermissionsList); }, [permissionsList, rolePermissionsList]); @@ -360,205 +355,224 @@ const EditPermissionsPage = (props) => { useEffect(() => { console.log("Member Roles"); console.log(memberRoles); - if(isArrayPresent(memberRoles)) { - let data = memberRoles.filter((a) => a.memberRoleId.memberId === currentUserId); + if (isArrayPresent(memberRoles)) { + let data = memberRoles.filter( + (a) => a.memberRoleId.memberId === currentUserId + ); if (isArrayPresent(data)) { - setCurrentUserRole(data[0].memberRoleId.roleId); + let role = filterObjectByValOrKey( + rolePermissionsList, + data[0].memberRoleId.roleId + ); + if (role) { + console.log("This is role", role); + setCurrentUserRole(role[0].role); + } } } - console.log("Current User Role:") + console.log("Current User Role:"); console.log(currentUserRole); }, [memberRoles, currentUserRole]); + let isAdmin = currentUserRole === "ADMIN"; + return (
-
-

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:

- - - - - - -
+ {isAdmin ? ( + <> +
+

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.

+ + )}
); }; From 5fd43f34c33f449bb772887670d8eef57455bd4f Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Mon, 5 Feb 2024 16:26:42 -0600 Subject: [PATCH 14/37] [2064] UI Linked to Roles Dynamically --- web-ui/src/pages/EditPermissionsPage.jsx | 315 +++++++++++++++++- web-ui/src/pages/EditPermissionsPageRoles.jsx | 28 +- 2 files changed, 328 insertions(+), 15 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 37aa346aff..fcccee7924 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -4,7 +4,6 @@ import EditPermissionsPageRoles from "./EditPermissionsPageRoles"; import { getPermissionsList } from "../api/permissions"; import { getRolePermissionsList } from "../api/rolepermissions"; -import { getCurrentUserRole } from "../api/roles"; import { getMemberRolesList } from "../api/memberroles"; import { isArrayPresent, filterObjectByValOrKey } from "../helpers/checks"; @@ -24,6 +23,10 @@ const EditPermissionsPage = (props) => { const [currentUserRole, setCurrentUserRole] = useState(""); const [memberRoles, setMemberRoles] = useState([]); + const [adminPermissionsList, setAdminPermissionsList] = useState([]); + const [pdlPermissionsList, setPDLPermissionsList] = useState([]); + const [memberPermissionsList, setMemberPermissionsList] = useState([]); + const [ createFeedbackRequestPermissionsAdmin, setCreateFeedbackRequestPermissionsAdmin, @@ -346,11 +349,11 @@ const EditPermissionsPage = (props) => { }, [csrf]); useEffect(() => { - console.log("Permissions List"); - console.log(permissionsList); console.log("Role Permissions"); console.log(rolePermissionsList); - }, [permissionsList, rolePermissionsList]); + console.log("Permissions List"); + console.log(permissionsList); + }, [rolePermissionsList, permissionsList]); useEffect(() => { console.log("Member Roles"); @@ -364,7 +367,7 @@ const EditPermissionsPage = (props) => { rolePermissionsList, data[0].memberRoleId.roleId ); - if (role) { + if (isArrayPresent(role)) { console.log("This is role", role); setCurrentUserRole(role[0].role); } @@ -374,6 +377,308 @@ const EditPermissionsPage = (props) => { console.log(currentUserRole); }, [memberRoles, currentUserRole]); + useEffect(() => { + let adminRole = filterObjectByValOrKey( + rolePermissionsList, + "ADMIN", + "role" + ); + if (isArrayPresent(adminRole)) { + setAdminPermissionsList(adminRole[0].permissions); + console.log("This is the admin permissions list", adminPermissionsList); + } + }, [rolePermissionsList, adminPermissionsList]); + + useEffect(() => { + let pdlRole = filterObjectByValOrKey(rolePermissionsList, "PDL", "role"); + if (isArrayPresent(pdlRole)) { + setPDLPermissionsList(pdlRole[0].permissions); + console.log("This is the PDL permissions list", pdlPermissionsList); + } + }, [rolePermissionsList, pdlPermissionsList]); + + useEffect(() => { + let memberRole = filterObjectByValOrKey( + rolePermissionsList, + "MEMBER", + "role" + ); + if (isArrayPresent(memberRole)) { + setMemberPermissionsList(memberRole[0].permissions); + console.log("This is the Member permissions list", memberPermissionsList); + } + }, [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]); + let isAdmin = currentUserRole === "ADMIN"; return ( diff --git a/web-ui/src/pages/EditPermissionsPageRoles.jsx b/web-ui/src/pages/EditPermissionsPageRoles.jsx index 66ccc79002..0f7b4fe17f 100644 --- a/web-ui/src/pages/EditPermissionsPageRoles.jsx +++ b/web-ui/src/pages/EditPermissionsPageRoles.jsx @@ -1,4 +1,5 @@ import React from "react"; +import { Checkbox } from "@mui/material"; const EditPermissionsPageRoles = ({ title, @@ -12,20 +13,27 @@ const EditPermissionsPageRoles = ({ return (

{title}

- + - + + -
From e8c01ac97ea2955de7769cfc76671ffdeababd5b Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Thu, 22 Feb 2024 23:18:33 -0600 Subject: [PATCH 15/37] [2064] Fix csrf loading issue --- web-ui/src/pages/EditPermissionsPage.jsx | 33 +++++++++++++++--------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index fcccee7924..4e6b710190 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -23,6 +23,8 @@ const EditPermissionsPage = (props) => { 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([]); @@ -345,19 +347,19 @@ const EditPermissionsPage = (props) => { doTask1(); doTask2(); doTask3(); + } else { + window.location.reload(true); } }, [csrf]); - useEffect(() => { - console.log("Role Permissions"); - console.log(rolePermissionsList); - console.log("Permissions List"); - console.log(permissionsList); - }, [rolePermissionsList, permissionsList]); + // useEffect(() => { + // console.log("Role Permissions"); + // console.log(rolePermissionsList); + // console.log("Permissions List"); + // console.log(permissionsList); + // }, [rolePermissionsList, permissionsList]); useEffect(() => { - console.log("Member Roles"); - console.log(memberRoles); if (isArrayPresent(memberRoles)) { let data = memberRoles.filter( (a) => a.memberRoleId.memberId === currentUserId @@ -373,9 +375,18 @@ const EditPermissionsPage = (props) => { } } } + + if (currentUserRole === "ADMIN") { + setIsAdminRole(true); + } else { + setIsAdminRole(false); + } + + console.log("Member Roles"); + console.log(memberRoles); console.log("Current User Role:"); console.log(currentUserRole); - }, [memberRoles, currentUserRole]); + }, [memberRoles, currentUserRole, csrf]); useEffect(() => { let adminRole = filterObjectByValOrKey( @@ -679,11 +690,9 @@ const EditPermissionsPage = (props) => { ); }, [memberPermissionsList]); - let isAdmin = currentUserRole === "ADMIN"; - return (
- {isAdmin ? ( + {isAdminRole ? ( <>

Edit Feedback Request Permissions Below:

From 3704a7b92cc348459afc51a8ef6d71f68593c98e Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Mon, 26 Feb 2024 12:16:44 -0600 Subject: [PATCH 16/37] [2064] Solution for CSRF --- web-ui/src/pages/EditPermissionsPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 4e6b710190..d2ebd19fbc 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -386,7 +386,7 @@ const EditPermissionsPage = (props) => { console.log(memberRoles); console.log("Current User Role:"); console.log(currentUserRole); - }, [memberRoles, currentUserRole, csrf]); + }, [memberRoles, currentUserRole, csrf, rolePermissionsList, currentUserId]); useEffect(() => { let adminRole = filterObjectByValOrKey( From 7a08cc71e6c62582b0d3ed5294c959c5e8e7b4d2 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Thu, 29 Feb 2024 09:26:44 -0600 Subject: [PATCH 17/37] [2064] Remove unneeded section --- web-ui/src/pages/EditPermissionsPage.jsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index d2ebd19fbc..08a9ad7abb 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -347,9 +347,7 @@ const EditPermissionsPage = (props) => { doTask1(); doTask2(); doTask3(); - } else { - window.location.reload(true); - } + } }, [csrf]); // useEffect(() => { From daef620278885d4657119ff0362214076f0ef99b Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Mon, 4 Mar 2024 00:19:58 -0600 Subject: [PATCH 18/37] [2064] Fix role ID's --- web-ui/src/pages/EditPermissionsPageRoles.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPageRoles.jsx b/web-ui/src/pages/EditPermissionsPageRoles.jsx index 0f7b4fe17f..86167fa1fb 100644 --- a/web-ui/src/pages/EditPermissionsPageRoles.jsx +++ b/web-ui/src/pages/EditPermissionsPageRoles.jsx @@ -23,7 +23,7 @@ const EditPermissionsPageRoles = ({ @@ -31,7 +31,7 @@ const EditPermissionsPageRoles = ({ From 3919d18db72a2db02f649976d55f313bd04f8439 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Mon, 4 Mar 2024 00:20:23 -0600 Subject: [PATCH 19/37] [2064] Add Post action for role permissions --- web-ui/src/api/rolepermissions.js | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/web-ui/src/api/rolepermissions.js b/web-ui/src/api/rolepermissions.js index 9fe5e3c2bb..8353dd278f 100644 --- a/web-ui/src/api/rolepermissions.js +++ b/web-ui/src/api/rolepermissions.js @@ -1,11 +1,21 @@ import { resolve } from "./api.js"; -const rolePermissionsListUrl = "/services/roles/role-permissions" +const rolePermissionsListUrl = "/services/roles/role-permissions"; export const getRolePermissionsList = async (cookie) => { - return resolve({ - url: rolePermissionsListUrl, - responseType: "json", - headers: { "X-CSRF-Header": cookie }, - }); - }; \ No newline at end of file + return resolve({ + url: rolePermissionsListUrl, + responseType: "json", + headers: { "X-CSRF-Header": cookie }, + }); +}; + +export const postRolePermissionsList = async (roleData, cookie) => { + return resolve({ + method: "post", + url: rolePermissionsListUrl, + responseType: "json", + data: roleData, + headers: { "X-CSRF-Header": cookie }, + }); +}; From c3191f406d419339694c5003c6b0475aa9380a8c Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Mon, 4 Mar 2024 01:08:22 -0600 Subject: [PATCH 20/37] [2064] Role permissions adjustments --- web-ui/src/pages/EditPermissionsPage.jsx | 44 +++++++++++++++++++++--- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 08a9ad7abb..4a07694280 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -3,10 +3,15 @@ import React, { useEffect, useContext, useState } from "react"; import EditPermissionsPageRoles from "./EditPermissionsPageRoles"; import { getPermissionsList } from "../api/permissions"; -import { getRolePermissionsList } from "../api/rolepermissions"; +import { + getRolePermissionsList, + postRolePermissionsList, +} 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 { selectPermissions } from "../context/selectors"; import { selectCurrentUserId } from "../context/selectors"; @@ -160,11 +165,42 @@ const EditPermissionsPage = (props) => { const [viewCheckinsPDL, setViewCheckinsPDL] = useState(false); const [viewCheckinsMember, setViewCheckinsMember] = useState(false); - const handleClickCreateFeedbackRequestAdmin = () => + const changeRolePermission = async (roleId, permissionId) => { + let newSchema = { roleId: roleId, permissionId: permissionId }; + let res = await postRolePermissionsList(newSchema, csrf); + let data = + res.payload && res.payload.data && !res.error ? res.payload.data : null; + if (data) { + // dispatch({ + // type: UPDATE_ROLE_PERMISSION, + // payload: 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 handleClickCreateFeedbackRequestAdmin = ({roleId, permissionId}) => { + // {"roleId": "e8a4fff8-e984-4e59-be84-a713c9fa8d23", "permissionId": "439ad8a8-500f-4f3f-963b-a86437d5820a"} + changeRolePermission(roleId, permissionId); setCreateFeedbackRequestPermissionsAdmin( !createFeedbackRequestPermissionsAdmin ); - + }; const handleClickCreateFeedbackRequestPDL = () => setCreateFeedbackRequestPermissionsPDL( !createFeedbackRequestPermissionsPDL @@ -347,7 +383,7 @@ const EditPermissionsPage = (props) => { doTask1(); doTask2(); doTask3(); - } + } }, [csrf]); // useEffect(() => { From f88993f18843e8401aba872ef36b87480a869c42 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Wed, 6 Mar 2024 01:07:05 -0600 Subject: [PATCH 21/37] [2064] Fix achieved, api error? --- web-ui/src/api/rolepermissions.js | 9 ++++++ web-ui/src/pages/EditPermissionsPage.jsx | 41 ++++++++++++++++++++---- 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/web-ui/src/api/rolepermissions.js b/web-ui/src/api/rolepermissions.js index 8353dd278f..3ddcaccb96 100644 --- a/web-ui/src/api/rolepermissions.js +++ b/web-ui/src/api/rolepermissions.js @@ -19,3 +19,12 @@ export const postRolePermissionsList = async (roleData, cookie) => { headers: { "X-CSRF-Header": cookie }, }); }; + +export const deleteRolePermissionsList = async (roleData, cookie) => { + return resolve({ + method: "delete", + url: rolePermissionsListUrl, + responseType: "json", + headers: { "X-CSRF-Header": cookie }, + }); +}; \ No newline at end of file diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 4a07694280..f844022f8b 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -6,6 +6,7 @@ import { getPermissionsList } from "../api/permissions"; import { getRolePermissionsList, postRolePermissionsList, + deleteRolePermissionsList } from "../api/rolepermissions"; import { getMemberRolesList } from "../api/memberroles"; import { isArrayPresent, filterObjectByValOrKey } from "../helpers/checks"; @@ -171,10 +172,6 @@ const EditPermissionsPage = (props) => { let data = res.payload && res.payload.data && !res.error ? res.payload.data : null; if (data) { - // dispatch({ - // type: UPDATE_ROLE_PERMISSION, - // payload: data, - // }); window.snackDispatch({ type: UPDATE_TOAST, payload: { @@ -194,11 +191,43 @@ const EditPermissionsPage = (props) => { } }; + const deleteRolePermission = async (roleId, permissionId) => { + let newSchema = { roleId: roleId, permissionId: permissionId }; + let res = await deleteRolePermissionsList(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 = ({roleId, permissionId}) => { + let currentBool = !createFeedbackRequestPermissionsAdmin; + if (currentBool) { + console.log("Execute bool"); + changeRolePermission("e8a4fff8-e984-4e59-be84-a713c9fa8d23", "439ad8a8-500f-4f3f-963b-a86437d5820a") + } else { + console.log("Post bool"); + deleteRolePermission("e8a4fff8-e984-4e59-be84-a713c9fa8d23", "439ad8a8-500f-4f3f-963b-a86437d5820a"); + } // {"roleId": "e8a4fff8-e984-4e59-be84-a713c9fa8d23", "permissionId": "439ad8a8-500f-4f3f-963b-a86437d5820a"} - changeRolePermission(roleId, permissionId); + changeRolePermission("e8a4fff8-e984-4e59-be84-a713c9fa8d23", "439ad8a8-500f-4f3f-963b-a86437d5820a"); setCreateFeedbackRequestPermissionsAdmin( - !createFeedbackRequestPermissionsAdmin + !currentBool ); }; const handleClickCreateFeedbackRequestPDL = () => From 57d2166837d9130ea0f6215d2e171a1688642fb1 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Wed, 6 Mar 2024 09:37:22 -0600 Subject: [PATCH 22/37] [2064] Small adjustment --- web-ui/src/pages/EditPermissionsPage.jsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index f844022f8b..a3d17ce3ec 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -216,18 +216,17 @@ const EditPermissionsPage = (props) => { }; const handleClickCreateFeedbackRequestAdmin = ({roleId, permissionId}) => { - let currentBool = !createFeedbackRequestPermissionsAdmin; - if (currentBool) { - console.log("Execute bool"); + if (!createFeedbackRequestPermissionsAdmin) { + console.log("Change role"); changeRolePermission("e8a4fff8-e984-4e59-be84-a713c9fa8d23", "439ad8a8-500f-4f3f-963b-a86437d5820a") } else { - console.log("Post bool"); + console.log("Delete role"); deleteRolePermission("e8a4fff8-e984-4e59-be84-a713c9fa8d23", "439ad8a8-500f-4f3f-963b-a86437d5820a"); } // {"roleId": "e8a4fff8-e984-4e59-be84-a713c9fa8d23", "permissionId": "439ad8a8-500f-4f3f-963b-a86437d5820a"} changeRolePermission("e8a4fff8-e984-4e59-be84-a713c9fa8d23", "439ad8a8-500f-4f3f-963b-a86437d5820a"); setCreateFeedbackRequestPermissionsAdmin( - !currentBool + !createFeedbackRequestPermissionsAdmin ); }; const handleClickCreateFeedbackRequestPDL = () => From 297d35c76602730583002b379f5cc5a1df958838 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Wed, 6 Mar 2024 09:53:58 -0600 Subject: [PATCH 23/37] [2064] Adjustment --- web-ui/src/api/rolepermissions.js | 2 +- web-ui/src/pages/EditPermissionsPage.jsx | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/web-ui/src/api/rolepermissions.js b/web-ui/src/api/rolepermissions.js index 3ddcaccb96..4b801bc214 100644 --- a/web-ui/src/api/rolepermissions.js +++ b/web-ui/src/api/rolepermissions.js @@ -20,7 +20,7 @@ export const postRolePermissionsList = async (roleData, cookie) => { }); }; -export const deleteRolePermissionsList = async (roleData, cookie) => { +export const deleteRolePermissionsList = async (cookie) => { return resolve({ method: "delete", url: rolePermissionsListUrl, diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index a3d17ce3ec..5f581ab70d 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -215,7 +215,7 @@ const EditPermissionsPage = (props) => { } }; - const handleClickCreateFeedbackRequestAdmin = ({roleId, permissionId}) => { + const handleClickCreateFeedbackRequestAdmin = () => { if (!createFeedbackRequestPermissionsAdmin) { console.log("Change role"); changeRolePermission("e8a4fff8-e984-4e59-be84-a713c9fa8d23", "439ad8a8-500f-4f3f-963b-a86437d5820a") @@ -224,7 +224,6 @@ const EditPermissionsPage = (props) => { deleteRolePermission("e8a4fff8-e984-4e59-be84-a713c9fa8d23", "439ad8a8-500f-4f3f-963b-a86437d5820a"); } // {"roleId": "e8a4fff8-e984-4e59-be84-a713c9fa8d23", "permissionId": "439ad8a8-500f-4f3f-963b-a86437d5820a"} - changeRolePermission("e8a4fff8-e984-4e59-be84-a713c9fa8d23", "439ad8a8-500f-4f3f-963b-a86437d5820a"); setCreateFeedbackRequestPermissionsAdmin( !createFeedbackRequestPermissionsAdmin ); From 27cd0dc5989ddce50535305f2f8ac4a0eb1e07a6 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:27:17 -0600 Subject: [PATCH 24/37] [2064] Fix 'Delete' Method --- web-ui/src/api/rolepermissions.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web-ui/src/api/rolepermissions.js b/web-ui/src/api/rolepermissions.js index 4b801bc214..a8cc55a1f6 100644 --- a/web-ui/src/api/rolepermissions.js +++ b/web-ui/src/api/rolepermissions.js @@ -20,11 +20,12 @@ export const postRolePermissionsList = async (roleData, cookie) => { }); }; -export const deleteRolePermissionsList = async (cookie) => { +export const deleteRolePermissionsList = async (roleData, cookie) => { return resolve({ method: "delete", url: rolePermissionsListUrl, responseType: "json", + data: roleData, headers: { "X-CSRF-Header": cookie }, }); }; \ No newline at end of file From d00aba67220d4f97cb43ef65ca425321e0aaf044 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Mon, 11 Mar 2024 07:27:34 -0500 Subject: [PATCH 25/37] [2064] Dynamic ID lookup for roles and permissions id's --- web-ui/src/pages/EditPermissionsPage.jsx | 260 +++++++++++++++++++---- 1 file changed, 219 insertions(+), 41 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 5f581ab70d..580ae51077 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -6,7 +6,7 @@ import { getPermissionsList } from "../api/permissions"; import { getRolePermissionsList, postRolePermissionsList, - deleteRolePermissionsList + deleteRolePermissionsList, } from "../api/rolepermissions"; import { getMemberRolesList } from "../api/memberroles"; import { isArrayPresent, filterObjectByValOrKey } from "../helpers/checks"; @@ -20,10 +20,12 @@ import { selectCurrentUserId } from "../context/selectors"; import "./EditPermissionsPage.css"; const EditPermissionsPage = (props) => { - // const { state, dispatch } = useContext(AppContext); const { state } = useContext(AppContext); const { csrf } = state; const [permissionsList, setPermissionsList] = useState([]); + const [adminId, setAdminId] = useState(""); + const [pdlId, setPDLId] = useState(""); + const [memberId, setMemberId] = useState(""); const [rolePermissionsList, setRolePermissionsList] = useState([]); const currentUserId = selectCurrentUserId(state); const [currentUserRole, setCurrentUserRole] = useState(""); @@ -35,6 +37,36 @@ const EditPermissionsPage = (props) => { 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, @@ -217,50 +249,95 @@ const EditPermissionsPage = (props) => { const handleClickCreateFeedbackRequestAdmin = () => { if (!createFeedbackRequestPermissionsAdmin) { - console.log("Change role"); - changeRolePermission("e8a4fff8-e984-4e59-be84-a713c9fa8d23", "439ad8a8-500f-4f3f-963b-a86437d5820a") + changeRolePermission(adminId, createFeedbackRequestPermissionsId); } else { - console.log("Delete role"); - deleteRolePermission("e8a4fff8-e984-4e59-be84-a713c9fa8d23", "439ad8a8-500f-4f3f-963b-a86437d5820a"); + deleteRolePermission(adminId, createFeedbackRequestPermissionsId); } - // {"roleId": "e8a4fff8-e984-4e59-be84-a713c9fa8d23", "permissionId": "439ad8a8-500f-4f3f-963b-a86437d5820a"} setCreateFeedbackRequestPermissionsAdmin( !createFeedbackRequestPermissionsAdmin ); }; - const handleClickCreateFeedbackRequestPDL = () => + const handleClickCreateFeedbackRequestPDL = () => { + if (!createFeedbackRequestPermissionsPDL) { + changeRolePermission(pdlId, createFeedbackRequestPermissionsId); + } else { + deleteRolePermission(pdlId, createFeedbackRequestPermissionsId); + } setCreateFeedbackRequestPermissionsPDL( !createFeedbackRequestPermissionsPDL ); + }; - const handleClickCreateFeedbackRequestMember = () => + const handleClickCreateFeedbackRequestMember = () => { + if (!createFeedbackRequestPermissionsMember) { + changeRolePermission(memberId, createFeedbackRequestPermissionsId); + } else { + deleteRolePermission(memberId, createFeedbackRequestPermissionsId); + } setCreateFeedbackRequestPermissionsMember( !createFeedbackRequestPermissionsMember ); + }; - const handleClickDeleteFeedbackRequestAdmin = () => + const handleClickDeleteFeedbackRequestAdmin = () => { + if (!deleteFeedbackRequestPermissionsAdmin) { + changeRolePermission(adminId, deleteFeedbackRequestPermissionsId); + } else { + deleteRolePermission(adminId, deleteFeedbackRequestPermissionsId); + } setDeleteFeedbackRequestPermissionsAdmin( !deleteFeedbackRequestPermissionsAdmin ); - const handleClickDeleteFeedbackRequestPDL = () => + }; + const handleClickDeleteFeedbackRequestPDL = () => { + if (!deleteFeedbackRequestPermissionsPDL) { + changeRolePermission(pdlId, deleteFeedbackRequestPermissionsId); + } else { + deleteRolePermission(pdlId, deleteFeedbackRequestPermissionsId); + } setDeleteFeedbackRequestPermissionsPDL( !deleteFeedbackRequestPermissionsPDL ); - const handleClickDeleteFeedbackRequestMember = () => + }; + const handleClickDeleteFeedbackRequestMember = () => { + if (!deleteFeedbackRequestPermissionsMember) { + changeRolePermission(memberId, deleteFeedbackRequestPermissionsId); + } else { + deleteRolePermission(memberId, deleteFeedbackRequestPermissionsId); + } setDeleteFeedbackRequestPermissionsMember( !deleteFeedbackRequestPermissionsMember ); + }; - const handleClickViewFeedbackRequestAdmin = () => + const handleClickViewFeedbackRequestAdmin = () => { + if (!viewFeedbackRequestPermissionsAdmin) { + changeRolePermission(adminId, viewFeedbackRequestPermissionsId); + } else { + deleteRolePermission(adminId, viewFeedbackRequestPermissionsId); + } setViewFeedbackRequestPermissionsAdmin( !viewFeedbackRequestPermissionsAdmin ); - const handleClickViewFeedbackRequestPDL = () => + }; + const handleClickViewFeedbackRequestPDL = () => { + if (!viewFeedbackRequestPermissionsAdmin) { + changeRolePermission(pdlId, viewFeedbackRequestPermissionsId); + } else { + deleteRolePermission(pdlId, viewFeedbackRequestPermissionsId); + } setViewFeedbackRequestPermissionsPDL(!viewFeedbackRequestPermissionsPDL); - const handleClickViewFeedbackRequestMember = () => + }; + const handleClickViewFeedbackRequestMember = () => { + if (!viewFeedbackRequestPermissionsAdmin) { + changeRolePermission(memberId, viewFeedbackRequestPermissionsId); + } else { + deleteRolePermission(memberId, viewFeedbackRequestPermissionsId); + } setViewFeedbackRequestPermissionsMember( !viewFeedbackRequestPermissionsMember ); + }; const handleClickViewFeedbackAnswerAdmin = () => setViewFeedbackAnswerPermissionsAdmin(!viewFeedbackAnswerPermissionsAdmin); @@ -360,26 +437,6 @@ const EditPermissionsPage = (props) => { const handleClickViewCheckinsMember = () => setViewCheckinsMember(!viewCheckinsMember); - // const permissionTypes = [ - // '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', - // ]; - useEffect(() => { const doTask1 = async () => { let res = await getRolePermissionsList(csrf); @@ -413,12 +470,133 @@ const EditPermissionsPage = (props) => { } }, [csrf]); - // useEffect(() => { - // console.log("Role Permissions"); - // console.log(rolePermissionsList); - // console.log("Permissions List"); - // console.log(permissionsList); - // }, [rolePermissionsList, permissionsList]); + 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 === "PDL"); + 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_DELETE_ORGANIZATION_MEMBERS" + ); + 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)) { From b12100cc799f71e8fc3c4f15ad23773f70777f17 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Mon, 11 Mar 2024 08:39:47 -0500 Subject: [PATCH 26/37] [2064] Small fix --- web-ui/src/pages/EditPermissionsPage.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 580ae51077..266dcf11b0 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -321,15 +321,16 @@ const EditPermissionsPage = (props) => { ); }; const handleClickViewFeedbackRequestPDL = () => { - if (!viewFeedbackRequestPermissionsAdmin) { + if (!viewFeedbackRequestPermissionsPDL) { changeRolePermission(pdlId, viewFeedbackRequestPermissionsId); } else { deleteRolePermission(pdlId, viewFeedbackRequestPermissionsId); } setViewFeedbackRequestPermissionsPDL(!viewFeedbackRequestPermissionsPDL); }; + const handleClickViewFeedbackRequestMember = () => { - if (!viewFeedbackRequestPermissionsAdmin) { + if (!viewFeedbackRequestPermissionsMember) { changeRolePermission(memberId, viewFeedbackRequestPermissionsId); } else { deleteRolePermission(memberId, viewFeedbackRequestPermissionsId); From 5d710dfee64a2aa0e6c05b153eadaffd6fa17d7e Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Mon, 11 Mar 2024 15:36:38 -0500 Subject: [PATCH 27/37] [2064] Added more sections for the API --- web-ui/src/pages/EditPermissionsPage.jsx | 48 +++++++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 266dcf11b0..5fa7bcdc82 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -340,21 +340,57 @@ const EditPermissionsPage = (props) => { ); }; - const handleClickViewFeedbackAnswerAdmin = () => + const handleClickViewFeedbackAnswerAdmin = () => { + if (!viewFeedbackAnswerPermissionsAdmin) { + changeRolePermission(adminId, viewFeedbackAnswerPermissionsId); + } else { + deleteRolePermission(adminId, viewFeedbackAnswerPermissionsId); + } setViewFeedbackAnswerPermissionsAdmin(!viewFeedbackAnswerPermissionsAdmin); - const handleClickViewFeedbackAnswerPDL = () => + }; + const handleClickViewFeedbackAnswerPDL = () => { + if (!viewFeedbackAnswerPermissionsPDL) { + changeRolePermission(pdlId, viewFeedbackAnswerPermissionsId); + } else { + deleteRolePermission(pdlId, viewFeedbackAnswerPermissionsId); + } setViewFeedbackAnswerPermissionsPDL(!viewFeedbackAnswerPermissionsPDL); - const handleClickViewFeedbackAnswerMember = () => + }; + const handleClickViewFeedbackAnswerMember = () => { + if (!viewFeedbackAnswerPermissionsMember) { + changeRolePermission(memberId, viewFeedbackAnswerPermissionsId); + } else { + deleteRolePermission(memberId, viewFeedbackAnswerPermissionsId); + } setViewFeedbackAnswerPermissionsMember( !viewFeedbackAnswerPermissionsMember ); + }; - const handleClickCreateOrgMembersPermissionsAdmin = () => + const handleClickCreateOrgMembersPermissionsAdmin = () => { + if (!createOrgMembersPermissionsAdmin) { + changeRolePermission(adminId, createOrgMembersPermissionsId); + } else { + deleteRolePermission(adminId, createOrgMembersPermissionsId); + } setCreateOrgMembersPermissionsAdmin(!createOrgMembersPermissionsAdmin); - const handleClickCreateOrgMembersPermissionsPDL = () => + }; + const handleClickCreateOrgMembersPermissionsPDL = () => { + if (!createOrgMembersPermissionsPDL) { + changeRolePermission(pdlId, createOrgMembersPermissionsId); + } else { + deleteRolePermission(pdlId, createOrgMembersPermissionsId); + } setCreateOrgMembersPermissionsPDL(!createOrgMembersPermissionsPDL); - const handleClickCreateOrgMembersPermissionsMember = () => + }; + const handleClickCreateOrgMembersPermissionsMember = () => { + if (!createOrgMembersPermissionsMember) { + changeRolePermission(memberId, createOrgMembersPermissionsId); + } else { + deleteRolePermission(memberId, createOrgMembersPermissionsId); + } setCreateOrgMembersPermissionsMember(!createOrgMembersPermissionsMember); + }; const handleClickDeleteOrgMembersPermissionsAdmin = () => setDeleteOrgMembersPermissionsAdmin(!deleteOrgMembersPermissionsAdmin); From 5b4113a0272cfe4520f8b778b783689a0888a6c7 Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Wed, 13 Mar 2024 23:38:55 -0500 Subject: [PATCH 28/37] [2064] Finishing up api calls --- web-ui/src/pages/EditPermissionsPage.jsx | 290 ++++++++++++++++++++--- 1 file changed, 254 insertions(+), 36 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 5fa7bcdc82..7d5c0b135d 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -392,87 +392,305 @@ const EditPermissionsPage = (props) => { setCreateOrgMembersPermissionsMember(!createOrgMembersPermissionsMember); }; - const handleClickDeleteOrgMembersPermissionsAdmin = () => + const handleClickDeleteOrgMembersPermissionsAdmin = () => { + if (!deleteOrgMembersPermissionsAdmin) { + changeRolePermission(adminId, deleteOrgMembersPermissionsId); + } else { + deleteRolePermission(adminId, deleteOrgMembersPermissionsId); + } setDeleteOrgMembersPermissionsAdmin(!deleteOrgMembersPermissionsAdmin); - const handleClickDeleteOrgMembersPermissionsPDL = () => + }; + const handleClickDeleteOrgMembersPermissionsPDL = () => { + if (!deleteOrgMembersPermissionsPDL) { + changeRolePermission(pdlId, deleteOrgMembersPermissionsId); + } else { + deleteRolePermission(pdlId, deleteOrgMembersPermissionsId); + } setDeleteOrgMembersPermissionsPDL(!deleteOrgMembersPermissionsPDL); - const handleClickDeleteOrgMembersPermissionsMember = () => + }; + const handleClickDeleteOrgMembersPermissionsMember = () => { + if (!deleteOrgMembersPermissionsMember) { + changeRolePermission(memberId, deleteOrgMembersPermissionsId); + } else { + deleteRolePermission(memberId, deleteOrgMembersPermissionsId); + } setDeleteOrgMembersPermissionsMember(!deleteOrgMembersPermissionsMember); + }; - const handleClickRolePermissionsViewAdmin = () => + const handleClickRolePermissionsViewAdmin = () => { + if (!viewRolePermissionsAdmin) { + changeRolePermission(adminId, viewRolePermissionsId); + } else { + deleteRolePermission(adminId, viewRolePermissionsId); + } setViewRolePermissionsAdmin(!viewRolePermissionsAdmin); - const handleClickRolePermissionsViewPDL = () => + }; + const handleClickRolePermissionsViewPDL = () => { + if (!viewRolePermissionsPDL) { + changeRolePermission(pdlId, viewRolePermissionsId); + } else { + deleteRolePermission(pdlId, viewRolePermissionsId); + } setViewRolePermissionsPDL(!viewRolePermissionsPDL); - const handleClickRolePermissionsViewMember = () => + }; + const handleClickRolePermissionsViewMember = () => { + if (!viewRolePermissionsMember) { + changeRolePermission(memberId, viewRolePermissionsId); + } else { + deleteRolePermission(memberId, viewRolePermissionsId); + } setViewRolePermissionsMember(!viewRolePermissionsMember); + }; - const handleClickRolePermissionsAssignAdmin = () => + const handleClickRolePermissionsAssignAdmin = () => { + if (!assignRolePermissionsAdmin) { + changeRolePermission(adminId, assignRolePermissionsId); + } else { + deleteRolePermission(adminId, assignRolePermissionsId); + } setAssignRolePermissionsAdmin(!assignRolePermissionsAdmin); - const handleClickRolePermissionsAssignPDL = () => + }; + const handleClickRolePermissionsAssignPDL = () => { + if (!assignRolePermissionsPDL) { + changeRolePermission(pdlId, assignRolePermissionsId); + } else { + deleteRolePermission(pdlId, assignRolePermissionsId); + } setAssignRolePermissionsPDL(!assignRolePermissionsPDL); - const handleClickRolePermissionsAssignMember = () => + }; + const handleClickRolePermissionsAssignMember = () => { + if (!assignRolePermissionsMember) { + changeRolePermission(memberId, assignRolePermissionsId); + } else { + deleteRolePermission(memberId, assignRolePermissionsId); + } setAssignRolePermissionsMember(!assignRolePermissionsMember); + }; - const handleClickViewAdmin = () => + const handleClickViewAdmin = () => { + if (!viewPermissionsAdmin) { + changeRolePermission(adminId, viewPermissionsId); + } else { + deleteRolePermission(adminId, viewPermissionsId); + } setViewPermissionsAdmin(!viewPermissionsAdmin); - const handleClickViewPDL = () => setViewPermissionsPDL(!viewPermissionsPDL); - const handleClickViewMember = () => + }; + 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 = () => + const handleClickViewSkillsReportsAdmin = () => { + if (!viewSkillsReportsAdmin) { + changeRolePermission(adminId, viewSkillsReportsId); + } else { + deleteRolePermission(adminId, viewSkillsReportsId); + } setViewSkillsReportsAdmin(!viewSkillsReportsAdmin); - const handleClickViewSkillsReportsPDL = () => + }; + const handleClickViewSkillsReportsPDL = () => { + if (!viewSkillsReportsPDL) { + changeRolePermission(pdlId, viewSkillsReportsId); + } else { + deleteRolePermission(pdlId, viewSkillsReportsId); + } setViewSkillsReportsPDL(!viewSkillsReportsPDL); - const handleClickViewSkillsReportsMember = () => + }; + const handleClickViewSkillsReportsMember = () => { + if (!viewSkillsReportsMember) { + changeRolePermission(memberId, viewSkillsReportsId); + } else { + deleteRolePermission(memberId, viewSkillsReportsId); + } setViewSkillsReportsMember(!viewSkillsReportsMember); + }; - const handleClickViewRetentionReportsAdmin = () => + const handleClickViewRetentionReportsAdmin = () => { + if (!viewRetentionReportsAdmin) { + changeRolePermission(adminId, viewRetentionReportsId); + } else { + deleteRolePermission(adminId, viewRetentionReportsId); + } setViewRetentionReportsAdmin(!viewRetentionReportsAdmin); - const handleClickViewRetentionReportsPDL = () => + }; + const handleClickViewRetentionReportsPDL = () => { + if (!viewRetentionReportsPDL) { + changeRolePermission(pdlId, viewRetentionReportsId); + } else { + deleteRolePermission(pdlId, viewRetentionReportsId); + } setViewRetentionReportsPDL(!viewRetentionReportsPDL); - const handleClickViewRetentionReportsMember = () => + }; + const handleClickViewRetentionReportsMember = () => { + if (!viewRetentionReportsMember) { + changeRolePermission(memberId, viewRetentionReportsId); + } else { + deleteRolePermission(memberId, viewRetentionReportsId); + } setViewRetentionReportsMember(!viewRetentionReportsMember); + }; - const handleClickViewAnniversaryReportsAdmin = () => + const handleClickViewAnniversaryReportsAdmin = () => { + if (!viewAnniversaryReportsAdmin) { + changeRolePermission(adminId, viewAnniversaryReportsId); + } else { + deleteRolePermission(adminId, viewAnniversaryReportsId); + } setViewAnniversaryReportsAdmin(!viewAnniversaryReportsAdmin); - const handleClickViewAnniversaryReportsPDL = () => + }; + const handleClickViewAnniversaryReportsPDL = () => { + if (!viewAnniversaryReportsPDL) { + changeRolePermission(pdlId, viewAnniversaryReportsId); + } else { + deleteRolePermission(pdlId, viewAnniversaryReportsId); + } setViewAnniversaryReportsPDL(!viewAnniversaryReportsPDL); - const handleClickViewAnniversaryReportsMember = () => + }; + const handleClickViewAnniversaryReportsMember = () => { + if (!viewAnniversaryReportsMember) { + changeRolePermission(memberId, viewAnniversaryReportsId); + } else { + deleteRolePermission(memberId, viewAnniversaryReportsId); + } setViewAnniversaryReportsMember(!viewAnniversaryReportsMember); + }; - const handleClickViewBirthdayReportsAdmin = () => + const handleClickViewBirthdayReportsAdmin = () => { + if (!viewBirthdayReportsAdmin) { + changeRolePermission(adminId, viewBirthdayReportsId); + } else { + deleteRolePermission(adminId, viewBirthdayReportsId); + } setViewBirthdayReportsAdmin(!viewBirthdayReportsAdmin); - const handleClickViewBirthdayReportsPDL = () => + }; + const handleClickViewBirthdayReportsPDL = () => { + if (!viewBirthdayReportsPDL) { + changeRolePermission(pdlId, viewBirthdayReportsId); + } else { + deleteRolePermission(pdlId, viewBirthdayReportsId); + } setViewBirthdayReportsPDL(!viewBirthdayReportsPDL); - const handleClickViewBirthdayReportsMember = () => + }; + const handleClickViewBirthdayReportsMember = () => { + if (!viewBirthdayReportsMember) { + changeRolePermission(memberId, viewBirthdayReportsId); + } else { + deleteRolePermission(memberId, viewBirthdayReportsId); + } setViewBirthdayReportsMember(!viewBirthdayReportsMember); + }; - const handleClickViewProfileReportsAdmin = () => + const handleClickViewProfileReportsAdmin = () => { + if (!viewProfileReportsAdmin) { + changeRolePermission(adminId, viewProfileReportsId); + } else { + deleteRolePermission(adminId, viewProfileReportsId); + } setViewProfileReportsAdmin(!viewProfileReportsAdmin); - const handleClickViewProfileReportsPDL = () => + }; + const handleClickViewProfileReportsPDL = () => { + if (!viewProfileReportsPDL) { + changeRolePermission(pdlId, viewProfileReportsId); + } else { + deleteRolePermission(pdlId, viewProfileReportsId); + } setViewProfileReportsPDL(!viewProfileReportsPDL); - const handleClickViewProfileReportsMember = () => + }; + const handleClickViewProfileReportsMember = () => { + if (!viewProfileReportsMember) { + changeRolePermission(memberId, viewProfileReportsMember); + } else { + deleteRolePermission(memberId, viewProfileReportsMember); + } setViewProfileReportsMember(!viewProfileReportsMember); + }; - const handleClickUpdateCheckinsAdmin = () => + const handleClickUpdateCheckinsAdmin = () => { + if (!updateCheckinsAdmin) { + changeRolePermission(adminId, updateCheckinsId); + } else { + deleteRolePermission(adminId, updateCheckinsId); + } setUpdateCheckinsAdmin(!updateCheckinsAdmin); - const handleClickUpdateCheckinsPDL = () => + }; + const handleClickUpdateCheckinsPDL = () => { + if (!updateCheckinsPDL) { + changeRolePermission(pdlId, updateCheckinsId); + } else { + deleteRolePermission(pdlId, updateCheckinsId); + } setUpdateCheckinsPDL(!updateCheckinsPDL); - const handleClickUpdateCheckinsMember = () => + }; + const handleClickUpdateCheckinsMember = () => { + if (!updateCheckinsMember) { + changeRolePermission(memberId, updateCheckinsId); + } else { + deleteRolePermission(memberId, updateCheckinsId); + } setUpdateCheckinsMember(!updateCheckinsMember); + }; - const handleClickCreateCheckinsAdmin = () => + const handleClickCreateCheckinsAdmin = () => { + if (!createCheckinsAdmin) { + changeRolePermission(adminId, createCheckinsId); + } else { + deleteRolePermission(adminId, createCheckinsId); + } setCreateCheckinsAdmin(!createCheckinsAdmin); - const handleClickCreateCheckinsPDL = () => + }; + const handleClickCreateCheckinsPDL = () => { + if (!createCheckinsPDL) { + changeRolePermission(pdlId, createCheckinsId); + } else { + deleteRolePermission(pdlId, createCheckinsId); + } setCreateCheckinsPDL(!createCheckinsPDL); - const handleClickCreateCheckinsMember = () => + }; + const handleClickCreateCheckinsMember = () => { + if (!createCheckinsMember) { + changeRolePermission(memberId, createCheckinsId); + } else { + deleteRolePermission(memberId, createCheckinsId); + } setCreateCheckinsMember(!createCheckinsMember); + }; - const handleClickViewCheckinsAdmin = () => + const handleClickViewCheckinsAdmin = () => { + if (!viewCheckinsAdmin) { + changeRolePermission(adminId, viewCheckinsId); + } else { + deleteRolePermission(adminId, viewCheckinsId); + } setViewCheckinsAdmin(!viewCheckinsAdmin); - const handleClickViewCheckinsPDL = () => setViewCheckinsPDL(!viewCheckinsPDL); - const handleClickViewCheckinsMember = () => + }; + 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 () => { From e574aabf3bb9924527718885e2a5a8a983cd92cb Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Thu, 14 Mar 2024 00:05:14 -0500 Subject: [PATCH 29/37] [2064] Post testing fix for nonworking calls --- web-ui/src/pages/EditPermissionsPage.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 7d5c0b135d..5352ac9d67 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -610,9 +610,9 @@ const EditPermissionsPage = (props) => { }; const handleClickViewProfileReportsMember = () => { if (!viewProfileReportsMember) { - changeRolePermission(memberId, viewProfileReportsMember); + changeRolePermission(memberId, viewProfileReportsId); } else { - deleteRolePermission(memberId, viewProfileReportsMember); + deleteRolePermission(memberId, viewProfileReportsId); } setViewProfileReportsMember(!viewProfileReportsMember); }; @@ -749,7 +749,7 @@ const EditPermissionsPage = (props) => { setCreateFeedbackRequestPermissionsId(id1[0].id); } let id2 = permissionsList.filter( - (a) => a.permission === "CAN_DELETE_ORGANIZATION_MEMBERS" + (a) => a.permission === "CAN_CREATE_FEEDBACK_REQUEST" ); if (isArrayPresent(id2)) { setCreateFeedbackRequestPermissionsId(id2[0].id); From be7726ab8ba0f3396d68a782022484ac1ab93acf Mon Sep 17 00:00:00 2001 From: S78901 <39834839+S78901@users.noreply.github.com> Date: Thu, 14 Mar 2024 00:21:38 -0500 Subject: [PATCH 30/37] [2064] Fix typo/omission --- web-ui/src/pages/EditPermissionsPage.jsx | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 5352ac9d67..fa731aa4ab 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -10,16 +10,13 @@ import { } 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 { selectPermissions } from "../context/selectors"; import { selectCurrentUserId } from "../context/selectors"; import "./EditPermissionsPage.css"; -const EditPermissionsPage = (props) => { +const EditPermissionsPage = () => { const { state } = useContext(AppContext); const { csrf } = state; const [permissionsList, setPermissionsList] = useState([]); @@ -735,7 +732,7 @@ const EditPermissionsPage = (props) => { if (isArrayPresent(pdlData)) { setPDLId(pdlData[0].roleId); } - let memberData = rolePermissionsList.filter((a) => a.role === "PDL"); + let memberData = rolePermissionsList.filter((a) => a.role === "MEMBER"); if (isArrayPresent(memberData)) { setMemberId(memberData[0].roleId); } @@ -864,7 +861,6 @@ const EditPermissionsPage = (props) => { data[0].memberRoleId.roleId ); if (isArrayPresent(role)) { - console.log("This is role", role); setCurrentUserRole(role[0].role); } } @@ -875,11 +871,6 @@ const EditPermissionsPage = (props) => { } else { setIsAdminRole(false); } - - console.log("Member Roles"); - console.log(memberRoles); - console.log("Current User Role:"); - console.log(currentUserRole); }, [memberRoles, currentUserRole, csrf, rolePermissionsList, currentUserId]); useEffect(() => { @@ -890,7 +881,6 @@ const EditPermissionsPage = (props) => { ); if (isArrayPresent(adminRole)) { setAdminPermissionsList(adminRole[0].permissions); - console.log("This is the admin permissions list", adminPermissionsList); } }, [rolePermissionsList, adminPermissionsList]); @@ -898,7 +888,6 @@ const EditPermissionsPage = (props) => { let pdlRole = filterObjectByValOrKey(rolePermissionsList, "PDL", "role"); if (isArrayPresent(pdlRole)) { setPDLPermissionsList(pdlRole[0].permissions); - console.log("This is the PDL permissions list", pdlPermissionsList); } }, [rolePermissionsList, pdlPermissionsList]); @@ -910,7 +899,6 @@ const EditPermissionsPage = (props) => { ); if (isArrayPresent(memberRole)) { setMemberPermissionsList(memberRole[0].permissions); - console.log("This is the Member permissions list", memberPermissionsList); } }, [rolePermissionsList, memberPermissionsList]); From 223a189432dfeca7fd977b342d2d6eb6d1e0def8 Mon Sep 17 00:00:00 2001 From: Michael Kimberlin Date: Wed, 20 Mar 2024 13:54:06 -0500 Subject: [PATCH 31/37] Swag at permissions changes --- .../security/permissions/Permissions.java | 52 ++++++++++++------- .../services/permissions/Permission.java | 7 ++- web-ui/src/pages/EditPermissionsPage.jsx | 20 +++++++ 3 files changed, 60 insertions(+), 19 deletions(-) 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..b7a3b59f3f 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; @@ -59,13 +60,17 @@ 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) { this.description = description; } + public String getCategory() { + return Permissions.valueOf(permission).getCategory(); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index fa731aa4ab..0d568fe573 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -16,10 +16,29 @@ 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([]); const [adminId, setAdminId] = useState(""); const [pdlId, setPDLId] = useState(""); const [memberId, setMemberId] = useState(""); @@ -704,6 +723,7 @@ const EditPermissionsPage = () => { res.payload && res.payload.data && !res.error ? res.payload.data : null; if (data) { setPermissionsList(data); + setCategoriesList(groupPermissionsByCategory(data)); } }; const doTask3 = async () => { From 407bb6acda328bd461fdeeee2ec65c35a75d0154 Mon Sep 17 00:00:00 2001 From: Michael Kimberlin Date: Wed, 20 Mar 2024 14:05:27 -0500 Subject: [PATCH 32/37] Disable eslint rule for now --- web-ui/src/pages/EditPermissionsPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index 0d568fe573..a9a729d887 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -38,7 +38,7 @@ const EditPermissionsPage = () => { const { state } = useContext(AppContext); const { csrf } = state; const [permissionsList, setPermissionsList] = useState([]); - const [categoriesList, setCategoriesList] = useState([]); + const [categoriesList, setCategoriesList] = useState([]); // eslint-disable-line no-unused-vars const [adminId, setAdminId] = useState(""); const [pdlId, setPDLId] = useState(""); const [memberId, setMemberId] = useState(""); From 5bc6f3eeb7576212c5629dc5c76a017fcb209b7a Mon Sep 17 00:00:00 2001 From: Michael Kimberlin Date: Wed, 20 Mar 2024 15:01:09 -0500 Subject: [PATCH 33/37] Fix permissions tests --- .../checkins/services/permissions/Permission.java | 2 ++ .../checkins/services/fixture/PermissionFixture.java | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) 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 b7a3b59f3f..fff5e75b71 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 @@ -12,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; @@ -67,6 +68,7 @@ public void setDescription(String description) { this.description = description; } + @Transient public String getCategory() { return Permissions.valueOf(permission).getCategory(); } 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())); } } From 7b9f480011a3e67c0400d217be1b1e483aff7a45 Mon Sep 17 00:00:00 2001 From: Michael Kimberlin Date: Thu, 21 Mar 2024 06:58:42 -0500 Subject: [PATCH 34/37] Use dynamically loaded Permission description and categories --- web-ui/src/components/menu/Menu.jsx | 2 +- web-ui/src/components/routes/Routes.jsx | 6 +- web-ui/src/context/selectors.js | 15 +- web-ui/src/pages/PermissionsPage.css | 7 + web-ui/src/pages/PermissionsPage.jsx | 199 ++++++++++++++++++ web-ui/src/pages/PermissionsPage.test.js | 11 + .../EditPermissionsPage.test.js.snap | 11 + .../PermissionsPage.test.js.snap | 11 + 8 files changed, 249 insertions(+), 13 deletions(-) create mode 100644 web-ui/src/pages/PermissionsPage.css create mode 100644 web-ui/src/pages/PermissionsPage.jsx create mode 100644 web-ui/src/pages/PermissionsPage.test.js create mode 100644 web-ui/src/pages/__snapshots__/EditPermissionsPage.test.js.snap create mode 100644 web-ui/src/pages/__snapshots__/PermissionsPage.test.js.snap diff --git a/web-ui/src/components/menu/Menu.jsx b/web-ui/src/components/menu/Menu.jsx index 5b8fb00eff..353016cf72 100644 --- a/web-ui/src/components/menu/Menu.jsx +++ b/web-ui/src/components/menu/Menu.jsx @@ -96,7 +96,7 @@ const Root = styled('div')(({theme}) => ({ const adminLinks = [ // ["/admin/permissions", "Permissions"], - ["/admin/edit-permissions", "Permissions Roles"], + ["/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 7c0ebd70bb..17bc78857a 100644 --- a/web-ui/src/components/routes/Routes.jsx +++ b/web-ui/src/components/routes/Routes.jsx @@ -7,7 +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/EditPermissionsPage"; +import EditPermissionsPage from "../../pages/PermissionsPage"; import GroupIcon from "@mui/icons-material/Group"; import GuildsPage from "../../pages/GuildsPage"; import Header from "../header/Header"; @@ -102,8 +102,8 @@ export default function Routes() {
- -
+ +
diff --git a/web-ui/src/context/selectors.js b/web-ui/src/context/selectors.js index a5e12cc78c..0bfe95e0ac 100644 --- a/web-ui/src/context/selectors.js +++ b/web-ui/src/context/selectors.js @@ -41,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) => @@ -435,15 +441,6 @@ export const selectMyGuilds = createSelector( ) ); -export const selectMyPermissions = createSelector( - selectCurrentUserId, - selectPermissions, - (id, permissions) => - permissions?.filter((permission) => - permission.permissions?.some((member) => member.memberId === id) - ) -); - export const selectMyTeams = createSelector( selectCurrentUserId, selectTeams, 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..3c64be18cb --- /dev/null +++ b/web-ui/src/pages/PermissionsPage.jsx @@ -0,0 +1,199 @@ +import React, { useEffect, useContext, useState } from "react"; + +import { getPermissionsList } from "../api/permissions"; +import { + getRolePermissionsList, + postRolePermissionsList, + deleteRolePermissionsList, +} from "../api/rolepermissions"; +import { Checkbox } 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) { + getPermissions(); + getRolePermissions(); + } + }, [csrf, refresh]); + + 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 addRolePermission = async (roleId, permissionId) => { + let newSchema = { roleId: roleId, permissionId: permissionId }; + let res = await postRolePermissionsList(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 { + 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 deleteRolePermissionsList(newSchema, csrf); + let data = !res.error ? "Success" : null; + if (data) { + window.snackDispatch({ + type: UPDATE_TOAST, + payload: { + severity: "success", + toast: `Permission removed from Role`, + }, + }); + } else { + window.snackDispatch({ + type: UPDATE_TOAST, + payload: { + severity: "warning", + toast: `Problem deleting permission for that role`, + }, + }); + } + }; + + const handleChange = async (event, roleId, permissionId) => { + if (event?.target?.checked) { + await addRolePermission(roleId, permissionId); + setRefresh(!refresh); + } else { + await deleteRolePermission(roleId, permissionId); + setRefresh(!refresh); + } + }; + + return ( +
+ { hasPermission ? + ( + <> +
+ + +
+ + { selectedRole && rolePermissions && categoriesList?.map((category) => ( +
+

{category?.category}:

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

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..6f2cc4aabe --- /dev/null +++ b/web-ui/src/pages/PermissionsPage.test.js @@ -0,0 +1,11 @@ +import React from "react"; +import PermissionsPage from "./PermissionsPage"; +import { AppContextProvider } from "../context/AppContext"; + +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..62bebe520c --- /dev/null +++ b/web-ui/src/pages/__snapshots__/PermissionsPage.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. +

+
+`; From ac04b912a114544573e31ea6937f74b0e86287e1 Mon Sep 17 00:00:00 2001 From: Michael Kimberlin Date: Thu, 21 Mar 2024 07:20:11 -0500 Subject: [PATCH 35/37] Prevent duplicate call to load permissions --- web-ui/src/pages/PermissionsPage.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web-ui/src/pages/PermissionsPage.jsx b/web-ui/src/pages/PermissionsPage.jsx index 3c64be18cb..cb5f566697 100644 --- a/web-ui/src/pages/PermissionsPage.jsx +++ b/web-ui/src/pages/PermissionsPage.jsx @@ -82,7 +82,9 @@ const EditPermissionsPage = () => { }; if (csrf) { - getPermissions(); + if(rolePermissionsList.length === 0){ + getPermissions(); + } getRolePermissions(); } }, [csrf, refresh]); From f620b5c5405649f6cc69d838b06708dff37c40f8 Mon Sep 17 00:00:00 2001 From: Michael Kimberlin Date: Thu, 21 Mar 2024 07:53:02 -0500 Subject: [PATCH 36/37] fixed a hook dependency --- web-ui/src/pages/PermissionsPage.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-ui/src/pages/PermissionsPage.jsx b/web-ui/src/pages/PermissionsPage.jsx index cb5f566697..b3e8c45516 100644 --- a/web-ui/src/pages/PermissionsPage.jsx +++ b/web-ui/src/pages/PermissionsPage.jsx @@ -87,7 +87,7 @@ const EditPermissionsPage = () => { } getRolePermissions(); } - }, [csrf, refresh]); + }, [csrf, refresh, rolePermissionsList.length]); useEffect(() => { if(selectedRole && rolePermissionsList) { From 74ba469841dd07ca53f1814c8f596755563bffe4 Mon Sep 17 00:00:00 2001 From: Michael Kimberlin Date: Thu, 21 Mar 2024 17:01:29 -0500 Subject: [PATCH 37/37] Adjustments from PR feedback --- .../services/permissions/Permission.java | 4 +- web-ui/src/api/rolepermissions.js | 4 +- web-ui/src/api/roles.js | 8 - web-ui/src/components/menu/Menu.jsx | 1 - web-ui/src/context/actions.js | 3 - web-ui/src/helpers/checks.js | 9 - web-ui/src/pages/EditPermissionsPage.jsx | 8 +- web-ui/src/pages/EditSkillsPage.css | 8 - web-ui/src/pages/PermissionsPage.jsx | 100 ++--- web-ui/src/pages/PermissionsPage.test.js | 21 +- .../PermissionsPage.test.js.snap | 405 +++++++++++++++++- 11 files changed, 472 insertions(+), 99 deletions(-) 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 fff5e75b71..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 @@ -38,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; @@ -64,7 +66,7 @@ public String getDescription() { return Permissions.valueOf(permission).getDescription(); //ignoring the database for now... } - public void setDescription(String description) { + public void setDescription(@Nullable String description) { this.description = description; } diff --git a/web-ui/src/api/rolepermissions.js b/web-ui/src/api/rolepermissions.js index a8cc55a1f6..ab00312aa1 100644 --- a/web-ui/src/api/rolepermissions.js +++ b/web-ui/src/api/rolepermissions.js @@ -10,7 +10,7 @@ export const getRolePermissionsList = async (cookie) => { }); }; -export const postRolePermissionsList = async (roleData, cookie) => { +export const postRolePermission = async (roleData, cookie) => { return resolve({ method: "post", url: rolePermissionsListUrl, @@ -20,7 +20,7 @@ export const postRolePermissionsList = async (roleData, cookie) => { }); }; -export const deleteRolePermissionsList = async (roleData, cookie) => { +export const deleteRolePermission = async (roleData, cookie) => { return resolve({ method: "delete", url: rolePermissionsListUrl, diff --git a/web-ui/src/api/roles.js b/web-ui/src/api/roles.js index 0db9879c51..90f65e3142 100644 --- a/web-ui/src/api/roles.js +++ b/web-ui/src/api/roles.js @@ -19,14 +19,6 @@ export const getAllUserRoles = async (cookie) => { }); }; -export const getCurrentUserRole = async (memberId, cookie) => { - return resolve({ - url: `${roleURL}/${memberId}`, - responseType: "json", - headers: { "X-CSRF-Header": cookie }, - }); -}; - export const removeUserFromRole = async (roleId, memberId, cookie) => { return resolve({ method: "delete", diff --git a/web-ui/src/components/menu/Menu.jsx b/web-ui/src/components/menu/Menu.jsx index 353016cf72..6bd992778b 100644 --- a/web-ui/src/components/menu/Menu.jsx +++ b/web-ui/src/components/menu/Menu.jsx @@ -95,7 +95,6 @@ const Root = styled('div')(({theme}) => ({ })); const adminLinks = [ - // ["/admin/permissions", "Permissions"], ["/admin/permissions", "Permissions"], ["/admin/roles", "Roles"], ["/admin/users", "Users"], diff --git a/web-ui/src/context/actions.js b/web-ui/src/context/actions.js index d3754b2711..d9b6fbbf2d 100644 --- a/web-ui/src/context/actions.js +++ b/web-ui/src/context/actions.js @@ -2,12 +2,10 @@ export const ADD_CHECKIN = "@@check-ins/add_checkin"; export const ADD_GUILD = "@@check-ins/add_guild"; export const ADD_MEMBER_SKILL = "@@check-ins/add_member_skill"; export const ADD_SKILL = "@@check-ins/add-skill"; -export const ADD_PERMISSION = "@@check-ins/add-permission"; export const ADD_TEAM = "@@check-ins/add_team"; export const DELETE_MEMBER_PROFILE = "@@check-ins/delete_member_profile"; export const DELETE_MEMBER_SKILL = "@@check-ins/delete_member_skill"; export const DELETE_SKILL = "@@check-ins/delete-skill"; -export const DELETE_PERMISSION = "@@check-ins/delete-permission"; export const DELETE_ROLE = "@@check-ins/delete-role"; export const MY_PROFILE_UPDATE = "@@check-ins/update_profile"; export const SET_CSRF = "@@check-ins/update_csrf"; @@ -23,7 +21,6 @@ export const UPDATE_MEMBER_SKILLS = "@@check-ins/update_member_skills"; export const UPDATE_ROLES = "@@check-ins/update_roles"; export const UPDATE_SKILL = "@@check-ins/update_skill"; export const UPDATE_SKILLS = "@@check-ins/update_skills"; -export const UPDATE_PERMISSION = "@@check-ins/update-permission"; export const UPDATE_TEAM_MEMBERS = "@@check-ins/update_team_members"; export const UPDATE_TEAMS = "@@check-ins/update_teams"; export const UPDATE_TERMINATED_MEMBERS = diff --git a/web-ui/src/helpers/checks.js b/web-ui/src/helpers/checks.js index 340ac415d9..c643dbc636 100644 --- a/web-ui/src/helpers/checks.js +++ b/web-ui/src/helpers/checks.js @@ -6,15 +6,6 @@ export const isArrayPresent = (arr) => Array.isArray(arr) && arr.length; -/** - * Check for whether unique object is already in an array and return a boolean. - * @param arr - an array - * @returns a boolean - */ -export const isObjectInArray = (arr, obj) => { - return arr.includes(obj); -}; - /** * If a parameter is found in an object within an array, return the array with just that object. * @param arr - an array diff --git a/web-ui/src/pages/EditPermissionsPage.jsx b/web-ui/src/pages/EditPermissionsPage.jsx index a9a729d887..cb15573e38 100644 --- a/web-ui/src/pages/EditPermissionsPage.jsx +++ b/web-ui/src/pages/EditPermissionsPage.jsx @@ -5,8 +5,8 @@ import EditPermissionsPageRoles from "./EditPermissionsPageRoles"; import { getPermissionsList } from "../api/permissions"; import { getRolePermissionsList, - postRolePermissionsList, - deleteRolePermissionsList, + postRolePermission, + deleteRolePermission, } from "../api/rolepermissions"; import { getMemberRolesList } from "../api/memberroles"; import { isArrayPresent, filterObjectByValOrKey } from "../helpers/checks"; @@ -216,7 +216,7 @@ const EditPermissionsPage = () => { const changeRolePermission = async (roleId, permissionId) => { let newSchema = { roleId: roleId, permissionId: permissionId }; - let res = await postRolePermissionsList(newSchema, csrf); + let res = await postRolePermission(newSchema, csrf); let data = res.payload && res.payload.data && !res.error ? res.payload.data : null; if (data) { @@ -241,7 +241,7 @@ const EditPermissionsPage = () => { const deleteRolePermission = async (roleId, permissionId) => { let newSchema = { roleId: roleId, permissionId: permissionId }; - let res = await deleteRolePermissionsList(newSchema, csrf); + let res = await deleteRolePermission(newSchema, csrf); let data = !res.error ? "Success" : null; if (data) { window.snackDispatch({ diff --git a/web-ui/src/pages/EditSkillsPage.css b/web-ui/src/pages/EditSkillsPage.css index 003c116f06..951a26bb95 100644 --- a/web-ui/src/pages/EditSkillsPage.css +++ b/web-ui/src/pages/EditSkillsPage.css @@ -25,11 +25,3 @@ display: flex; margin-top: 1rem; } - -.edit-permissions { - display: block; - float: left; - position: relative; - width: auto; - margin: 2%; -} diff --git a/web-ui/src/pages/PermissionsPage.jsx b/web-ui/src/pages/PermissionsPage.jsx index b3e8c45516..3c27c371e7 100644 --- a/web-ui/src/pages/PermissionsPage.jsx +++ b/web-ui/src/pages/PermissionsPage.jsx @@ -3,10 +3,10 @@ import React, { useEffect, useContext, useState } from "react"; import { getPermissionsList } from "../api/permissions"; import { getRolePermissionsList, - postRolePermissionsList, - deleteRolePermissionsList, + postRolePermission, + deleteRolePermission, } from "../api/rolepermissions"; -import { Checkbox } from "@mui/material"; +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"; @@ -101,59 +101,36 @@ const EditPermissionsPage = () => { setSelectedRole(roles.find((role) => role.id === event.target.value)); }; - const addRolePermission = async (roleId, permissionId) => { - let newSchema = { roleId: roleId, permissionId: permissionId }; - let res = await postRolePermissionsList(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 { - window.snackDispatch({ - type: UPDATE_TOAST, - payload: { - severity: "warning", - toast: `Problem changing permission for that role`, - }, - }); - } + 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 deleteRolePermission = async (roleId, permissionId) => { - let newSchema = { roleId: roleId, permissionId: permissionId }; - let res = await deleteRolePermissionsList(newSchema, csrf); - let data = !res.error ? "Success" : null; - if (data) { - window.snackDispatch({ - type: UPDATE_TOAST, - payload: { - severity: "success", - toast: `Permission removed from Role`, - }, - }); - } else { - window.snackDispatch({ - type: UPDATE_TOAST, - payload: { - severity: "warning", - toast: `Problem deleting permission for that role`, - }, - }); - } + 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, roleId, permissionId) => { + const handleChange = async (event, role, permission) => { if (event?.target?.checked) { - await addRolePermission(roleId, permissionId); + await addPermissionForRole(role, permission); setRefresh(!refresh); } else { - await deleteRolePermission(roleId, permissionId); + await deletePermissionForRole(role, permission); setRefresh(!refresh); } }; @@ -164,15 +141,20 @@ const EditPermissionsPage = () => { ( <>
- - + + Select Role + +
{ selectedRole && rolePermissions && categoriesList?.map((category) => ( @@ -184,7 +166,7 @@ const EditPermissionsPage = () => { permission={permission.permission} title={permission.description} enabled={isPermissionEnabled(rolePermissions, permission)} - onChange={(event) => handleChange(event, selectedRole?.id, permission.id, csrf)} /> + onChange={(event) => handleChange(event, selectedRole, permission)} /> )) }
diff --git a/web-ui/src/pages/PermissionsPage.test.js b/web-ui/src/pages/PermissionsPage.test.js index 6f2cc4aabe..dfb395f371 100644 --- a/web-ui/src/pages/PermissionsPage.test.js +++ b/web-ui/src/pages/PermissionsPage.test.js @@ -2,9 +2,28 @@ 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__/PermissionsPage.test.js.snap b/web-ui/src/pages/__snapshots__/PermissionsPage.test.js.snap index 62bebe520c..eb6156f3e5 100644 --- a/web-ui/src/pages/__snapshots__/PermissionsPage.test.js.snap +++ b/web-ui/src/pages/__snapshots__/PermissionsPage.test.js.snap @@ -1,11 +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; +} +
-

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

+
+
+ +
+ + + + + +
+ + + Select Role + + +
+
+
+
`;