Skip to content

Commit 7920806

Browse files
committed
Updated to v1.8
-Roles can be removed/added
1 parent 4778a55 commit 7920806

File tree

8 files changed

+188
-13
lines changed

8 files changed

+188
-13
lines changed

src/component/Employees/EmployeeDetails.tsx

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,42 @@
1-
import { useSelector } from "react-redux";
1+
import { useDispatch, useSelector } from "react-redux";
22
import './Employee.css'
33
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
44
import { faEye, faLockOpen, faUser } from "@fortawesome/free-solid-svg-icons";
55
import { selectSelectedEmployee } from "../../store/employee/employeeSelectors";
6-
import { useWebservice } from "../../hooks/useWebservice";
7-
import { getUserRoles } from "../../store/userroles/userRoleActions";
6+
import { callWebservice, useWebservice } from "../../hooks/useWebservice";
7+
import { removeUserRole, getUserRoles, addUserRole } from "../../store/userroles/userRoleActions";
88
import { selectUserRoles } from "../../store/userroles/userRoleSelectors";
9+
import { setUserRoles } from "../../store/userroles/userRoleActions";
10+
import EmployeeList from "./EmployeeList";
11+
import { employeeActions } from "../../store";
12+
import { IMsalContext, MsalContext, useMsal } from "@azure/msal-react";
913

1014

1115
const EmployeeDetails = (props: any) => {
1216
useWebservice(true, getUserRoles)
13-
const userRoles = useSelector(selectUserRoles)
17+
18+
const dispatch = useDispatch()
1419

20+
const msalContext: IMsalContext = useMsal();
21+
const userRoles = useSelector(selectUserRoles)
1522
const employee = useSelector(selectSelectedEmployee)
1623

24+
25+
const getUserRole = () => {
26+
const roleItem = userRoles.findIndex
27+
console.log(roleItem)
28+
}
29+
30+
const deleteUserGroup = (group:string) => {
31+
console.log(group)
32+
callWebservice(msalContext, dispatch, removeUserRole, employee?.email, group)
33+
}
34+
35+
const addUserGroup = (group:string) => {
36+
console.log(group)
37+
callWebservice(msalContext, dispatch, addUserRole, employee?.email, group)
38+
}
39+
1740
return (
1841
<div className="employee-view">
1942
<div className="employee-details">
@@ -27,13 +50,20 @@ const EmployeeDetails = (props: any) => {
2750
</div>
2851
<div className="usergroups">
2952
Assigned Groups:
30-
<a>{employee?.groups}</a>
53+
<ul>
54+
{employee?.groups?.map(group =>
55+
<li onClick={() => deleteUserGroup(group)} key={group}>{group}</li>
56+
)}
57+
</ul>
58+
3159
</div>
3260
<div className="list-group">
3361
Available Groups:
34-
<a>
35-
{userRoles.join(", ")}
36-
</a>
62+
<ul>
63+
{userRoles.filter(group => !employee?.groups?.includes(group)).map(group =>
64+
<li onClick={() => addUserGroup(group)} key={group}>{group}</li>
65+
)}
66+
</ul>
3767
</div>
3868
<button className="btn btn-primary shadow-none">Save</button>
3969
</div>

src/component/Employees/EmployeeList.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ const EmployeeList = (props:any) => {
2727
return el;
2828
} else {
2929
return el.acronym.toLowerCase().includes(props.input)
30+
|| el.fullName?.toLowerCase().includes(props.input)
31+
|| el.email?.toLowerCase().includes(props.input)
3032
}
3133
})
3234

src/component/Header/Header.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ const Header = () => {
5252
<button onClick={onClick} className="menu-trigger">
5353
<span>{msal.accounts[0]?.name}</span>
5454
<div className="user-avatar">
55-
<h4 className='user-avatar-acronym'>{employee?.acronym}</h4>
5655
</div>
5756
</button>
5857
<nav ref={dropdownRef} className={`menu ${isActive ? 'active' : 'inactive'}`}>

src/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ const ProjectsApp = () => (
2121
</React.StrictMode>
2222
);
2323

24+
25+
2426
ReactDOM.render(<ProjectsApp />, document.getElementById("root"));
2527

2628
declare global {

src/store/employee/employeeActions.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,31 @@ export const loadEmployees = (headers: any) => {
3232
}
3333
;
3434

35+
export const loadEmployee = (headers: any, email: string) => {
36+
return async (dispatch: any) => {
37+
const fetchEmployee = async () => {
38+
return await axios.get(
39+
`${window._env_?.EMPLOYEE_SERVICE_EXTERNAL_URL}/api/v1/employees/${email}`,
40+
{
41+
headers: headers
42+
});
43+
};
44+
45+
dispatch(employeeActions.setLoading(true));
46+
try {
47+
const employeeResponse = await fetchEmployee();
48+
const employee: Employee = employeeResponse.data;
49+
employee.displayName = concatEmployeeNameAndAcronym(employee.fullName, employee.acronym);
50+
dispatch(employeeActions.setEmployee(employee));
51+
} catch (error: any) {
52+
dispatch(employeeActions.setErrorMessage(`Employees: ${error.message}`));
53+
} finally {
54+
dispatch(employeeActions.setLoading(false));
55+
}
56+
};
57+
}
58+
;
59+
3560
function concatEmployeeNameAndAcronym(fullName: string | null, acronym: string | null) {
3661
const name = fullName ? fullName : 'Unnamed';
3762
return acronym ? name.concat(' (').concat(acronym).concat(')') : name;

src/store/employee/employeeSlice.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import {createSlice} from '@reduxjs/toolkit';
2-
import {EmployeeState} from './employeeModels';
1+
import { createSlice } from '@reduxjs/toolkit';
2+
import { EmployeeState } from './employeeModels';
3+
import { Employee } from './employeeModels';
34

45

56
const initialState: EmployeeState = {
@@ -26,6 +27,15 @@ const employeeSlice = createSlice({
2627
setSelectedEmployee(state, action) {
2728
state.selectedEmployee = action.payload;
2829
},
30+
setEmployee(state, action) {
31+
const employee: Employee = action.payload
32+
const employeeFound = state.employees.filter(e => e.email !== employee.email)
33+
employeeFound.push(employee)
34+
employeeFound.sort((a: Employee, b: Employee) => a.email.localeCompare(b.email))
35+
state.employees = employeeFound;
36+
if (state.selectedEmployee?.email === employee.email) { state.selectedEmployee = employee }
37+
}
38+
2939
}
3040
});
3141

src/store/userroles/userRoleActions.ts

Lines changed: 100 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import axios from 'axios';
2-
import { loginActions, userRoleActions } from '../index';
3-
2+
import { loadEmployee } from '../employee/employeeActions';
3+
import { userRoleActions } from '../index';
44

55
export const getUserRoles = (headers: any) => {
66
return async (dispatch: any) => {
@@ -23,3 +23,101 @@ export const getUserRoles = (headers: any) => {
2323
}
2424
};
2525
};
26+
27+
28+
export const setUserRoles = (headers: any) => {
29+
return async (dispatch: any) => {
30+
const putUserRoles = async () => {
31+
return await axios.put(
32+
`${window._env_?.EMPLOYEE_SERVICE_EXTERNAL_URL}/api/v1/employees/ddhubadmin@dialogdata.de/groups/sales-manager`,
33+
{
34+
headers: headers
35+
});
36+
};
37+
38+
dispatch(userRoleActions.setLoading(true));
39+
try {
40+
const userRoleResponse = await putUserRoles();
41+
dispatch(userRoleActions.setUserRole(userRoleResponse.data));
42+
} catch (error: any) {
43+
dispatch(userRoleActions.setErrorMessage(`Employees: ${error.message}`));
44+
} finally {
45+
dispatch(userRoleActions.setLoading(false));
46+
}
47+
};
48+
};
49+
50+
export const removeUserRole = ( headers: any, email:string, key:string) => {
51+
return async (dispatch: any) => {
52+
const deleteUserRole = async () => {
53+
const response = await axios.delete(
54+
`${window._env_?.EMPLOYEE_SERVICE_EXTERNAL_URL}/api/v1/employees/${email}/groups/${key}`,
55+
{
56+
headers: headers
57+
});
58+
return response.data
59+
};
60+
61+
console.log('Role removed', {key})
62+
63+
dispatch(userRoleActions.setLoading(true));
64+
try {
65+
const userRoleResponse = await deleteUserRole();
66+
dispatch(loadEmployee(headers, email))
67+
68+
} catch (error: any) {
69+
dispatch(userRoleActions.setErrorMessage(`Employees: ${error.message}`));
70+
} finally {
71+
dispatch(userRoleActions.setLoading(false));
72+
}
73+
};
74+
};
75+
76+
export const addUserRole = ( headers: any, email:string, key:string) => {
77+
return async (dispatch: any) => {
78+
const addUserRole = async () => {
79+
const response = await axios.put(
80+
`${window._env_?.EMPLOYEE_SERVICE_EXTERNAL_URL}/api/v1/employees/${email}/groups`,
81+
{
82+
groupId: key
83+
},
84+
{
85+
headers: headers
86+
});
87+
return response.data
88+
};
89+
90+
console.log('Role added', {key})
91+
92+
dispatch(userRoleActions.setLoading(true));
93+
try {
94+
const userRoleResponse = await addUserRole();
95+
dispatch(loadEmployee(headers, email))
96+
97+
} catch (error: any) {
98+
dispatch(userRoleActions.setErrorMessage(`Employees: ${error.message}`));
99+
} finally {
100+
dispatch(userRoleActions.setLoading(false));
101+
}
102+
};
103+
};
104+
/* export const deleteUserRoles = (headers: any, key: number) => {
105+
return async (dispatch: any, getState: any) => {
106+
const deleteUserRoles = async () => {
107+
const response = await axios.delete(
108+
`${window._env_?.MISSIONASSIGNMENTS_SERVICE_EXTERNAL_URL}/api/v1/employees/ddhubadmin@dialogdata.de/groups/sales-manager`,
109+
{
110+
headers: headers
111+
});
112+
return response.data;
113+
};
114+
dispatch(userRoleActions.setLoading(true));
115+
try {
116+
await deleteUserRoles();
117+
} catch (error:any) {
118+
dispatch(userRoleActions.setErrorMessage(`Missionassignment Service: ${error.message}`));
119+
} finally {
120+
dispatch(userRoleActions.setLoading(false));
121+
}
122+
};
123+
}; */

src/store/userroles/userRoleSelectors.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,12 @@ export const selectLoginErrorMessage = (state: RootState): string | null => {
1111
export const selectUserRoles = (state: RootState): string[] => {
1212
return state.userRoleState.userRoles;
1313
}
14+
15+
export const setUserRoles = (state: RootState): string[] => {
16+
return state.userRoleState.userRoles;
17+
}
18+
19+
export const removeUserRole = (state: RootState): string[] => {
20+
return state.userRoleState.userRoles;
21+
}
22+

0 commit comments

Comments
 (0)