Skip to content

Commit 652deda

Browse files
committed
Added permission for view terminated profile and adjusted app context to respect it
1 parent 772a711 commit 652deda

File tree

4 files changed

+93
-3
lines changed

4 files changed

+93
-3
lines changed

server/src/main/java/com/objectcomputing/checkins/services/permissions/Permission.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public enum Permission {
1717
CAN_ADMINISTER_FEEDBACK_ANSWER("Administer feedback answers", "Feedback"),
1818
CAN_ADMINISTER_FEEDBACK_TEMPLATES("Administer feedback templates", "Feedback"),
1919
CAN_SEND_EMAIL("Send email", "Feedback"),
20+
CAN_VIEW_TERMINATED_MEMBERS("Can view the profiles of terminated members", "User Management"),
2021
CAN_EDIT_ALL_ORGANIZATION_MEMBERS("Edit all member profiles", "User Management"),
2122
CAN_DELETE_ORGANIZATION_MEMBERS("Delete organization members", "User Management"),
2223
CAN_CREATE_ORGANIZATION_MEMBERS("Create organization members", "User Management"),

web-ui/src/context/AppContext.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import {
2323
} from '../api/member';
2424
import {
2525
selectCanViewCheckinsPermission,
26-
selectCanEditAllOrganizationMembers,
26+
selectCanViewTerminatedMembers,
2727
} from './selectors';
2828
import { getAllRoles, getAllUserRoles } from '../api/roles';
2929
import { getMemberSkills } from '../api/memberskill';
@@ -191,7 +191,7 @@ const AppContextProvider = props => {
191191
if (csrf && userProfile && !memberProfiles) {
192192
dispatch({ type: UPDATE_PEOPLE_LOADING, payload: true });
193193
getMemberProfiles();
194-
if (selectCanEditAllOrganizationMembers(state)) {
194+
if (selectCanViewTerminatedMembers(state)) {
195195
getTerminatedMembers();
196196
}
197197
}

web-ui/src/context/selectors.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,14 @@ export const selectCanEditAllOrganizationMembers = hasPermission(
242242
'CAN_EDIT_ALL_ORGANIZATION_MEMBERS',
243243
);
244244

245+
export const selectCanViewTerminatedMembers = createSelector(
246+
selectCanEditAllOrganizationMembers,
247+
hasPermission(
248+
'CAN_VIEW_TERMINATED_MEMBERS'
249+
),
250+
(canEdit, canView) => canEdit || canView
251+
);
252+
245253
export const selectIsPDL = createSelector(
246254
selectUserProfile,
247255
userProfile =>

web-ui/src/context/selectors.test.js

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ import {
2121
selectSubordinates,
2222
selectIsSubordinateOfCurrentUser,
2323
selectHasReportPermission,
24-
selectActiveOrInactiveProfile
24+
selectActiveOrInactiveProfile,
25+
selectCanEditAllOrganizationMembers,
26+
selectCanViewTerminatedMembers,
2527
} from './selectors';
2628

2729
describe('Selectors', () => {
@@ -1527,6 +1529,85 @@ describe('Selectors', () => {
15271529
expect(selectHasReportPermission(testState)).toBe(false);
15281530
});
15291531

1532+
it("selectCanEditAllOrganizationMembers should return false when user does not have 'CAN_EDIT_ALL_ORGANIZATION_MEMBERS' permission", () => {
1533+
const testState = {
1534+
userProfile: {
1535+
firstName: 'Huey',
1536+
lastName: 'Emmerich',
1537+
role: 'MEMBER',
1538+
permissions: [
1539+
{ permission: 'CAN_VIEW_FEEDBACK_REQUEST' },
1540+
{ permission: 'CAN_VIEW_FEEDBACK_ANSWER' },
1541+
]
1542+
}
1543+
};
1544+
1545+
expect(selectCanEditAllOrganizationMembers(testState)).toBe(false);
1546+
});
1547+
1548+
it("selectCanEditAllOrganizationMembers should return true when user has 'CAN_EDIT_ALL_ORGANIZATION_MEMBERS' permission", () => {
1549+
const testState = {
1550+
userProfile: {
1551+
firstName: 'Huey',
1552+
lastName: 'Emmerich',
1553+
role: 'MEMBER',
1554+
permissions: [
1555+
{ permission: 'CAN_VIEW_FEEDBACK_REQUEST' },
1556+
{ permission: 'CAN_EDIT_ALL_ORGANIZATION_MEMBERS' },
1557+
{ permission: 'CAN_VIEW_FEEDBACK_ANSWER' },
1558+
]
1559+
}
1560+
};
1561+
1562+
expect(selectCanEditAllOrganizationMembers(testState)).toBe(true);
1563+
});
1564+
1565+
it("selectCanViewTerminatedMembers should return false when user does not have 'CAN_EDIT_ALL_ORGANIZATION_MEMBERS' or 'CAN_VIEW_TERMINATED_MEMBERS' permission", () => {
1566+
const testState = {
1567+
userProfile: {
1568+
firstName: 'Huey',
1569+
lastName: 'Emmerich',
1570+
role: 'MEMBER',
1571+
permissions: [
1572+
{ permission: 'CAN_VIEW_FEEDBACK_REQUEST' },
1573+
{ permission: 'CAN_VIEW_FEEDBACK_ANSWER' },
1574+
]
1575+
}
1576+
};
1577+
1578+
expect(selectCanViewTerminatedMembers(testState)).toBe(false);
1579+
});
1580+
1581+
it("selectCanViewTerminatedMembers should return true when user has 'CAN_EDIT_ALL_ORGANIZATION_MEMBERS' or 'CAN_VIEW_TERMINATED_MEMBERS' permissions", () => {
1582+
const testState = {
1583+
userProfile: {
1584+
firstName: 'Huey',
1585+
lastName: 'Emmerich',
1586+
role: 'MEMBER',
1587+
permissions: [
1588+
{ permission: 'CAN_VIEW_FEEDBACK_REQUEST' },
1589+
{ permission: 'CAN_EDIT_ALL_ORGANIZATION_MEMBERS' },
1590+
{ permission: 'CAN_VIEW_FEEDBACK_ANSWER' },
1591+
]
1592+
}
1593+
};
1594+
const otherTestState = {
1595+
userProfile: {
1596+
firstName: 'Huey',
1597+
lastName: 'Emmerich',
1598+
role: 'MEMBER',
1599+
permissions: [
1600+
{ permission: 'CAN_VIEW_FEEDBACK_REQUEST' },
1601+
{ permission: 'CAN_VIEW_TERMINATED_MEMBERS' },
1602+
{ permission: 'CAN_VIEW_FEEDBACK_ANSWER' },
1603+
]
1604+
}
1605+
};
1606+
1607+
expect(selectCanViewTerminatedMembers(testState)).toBe(true);
1608+
expect(selectCanViewTerminatedMembers(otherTestState)).toBe(true);
1609+
});
1610+
15301611
it('selectActiveOrInactiveProfile should a profile if active or inactive', () => {
15311612
const activeTestMember = {
15321613
id: 1,

0 commit comments

Comments
 (0)