From bcfde8b698bb5134faf135af7cb4302cf6d8d9a2 Mon Sep 17 00:00:00 2001 From: James Birnie Date: Tue, 1 Apr 2025 17:21:22 -0700 Subject: [PATCH 1/2] Created promote to team lead button on team tasks --- .../task_manager/controller/TeamController.java | 2 +- .../task_manager/service/TeamService.java | 3 +-- .../controller_tests/TeamControllerTest.java | 3 +-- .../service_tests/TeamServiceTest.java | 8 ++------ frontend/react-app/src/api/teamApi.js | 4 ++-- .../src/components/ChangeTeamLeadButton.jsx | 16 ++++++++++++++++ frontend/react-app/src/components/TeamMember.jsx | 4 +++- frontend/react-app/src/pages/TeamTasks.jsx | 10 ++++++---- 8 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 frontend/react-app/src/components/ChangeTeamLeadButton.jsx diff --git a/backend/task-manager/src/main/java/com/example/task_manager/controller/TeamController.java b/backend/task-manager/src/main/java/com/example/task_manager/controller/TeamController.java index 8974d364..1fd93c80 100644 --- a/backend/task-manager/src/main/java/com/example/task_manager/controller/TeamController.java +++ b/backend/task-manager/src/main/java/com/example/task_manager/controller/TeamController.java @@ -51,7 +51,7 @@ public ResponseEntity deleteTeam(@PathVariable int teamId) { @PutMapping("/{teamId}/change-lead") public ResponseEntity changeTeamLead(@PathVariable int teamId, @RequestBody TeamRequestDTO request) { try { - TeamDTO updatedTeam = teamService.changeTeamLead(teamId, request.getTeamName(), request.getTeamLeadId()); + TeamDTO updatedTeam = teamService.changeTeamLead(teamId, request.getTeamLeadId()); return ResponseEntity.ok(updatedTeam); } catch (RuntimeException e) { return ResponseEntity.badRequest().body(e.getMessage()); diff --git a/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java b/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java index d352c2e9..e4167ee7 100644 --- a/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java +++ b/backend/task-manager/src/main/java/com/example/task_manager/service/TeamService.java @@ -85,7 +85,7 @@ public void deleteTeam(int teamId) { * @param teamId The ID of the team whose lead should be changed. * @param teamLeadId The ID of the new team lead. */ - public TeamDTO changeTeamLead(int teamId, String teamName, int teamLeadId) { + public TeamDTO changeTeamLead(int teamId, int teamLeadId) { Team team = teamRepository.findById(teamId) .orElseThrow(() -> new RuntimeException("Team not found with ID: " + teamId)); @@ -93,7 +93,6 @@ public TeamDTO changeTeamLead(int teamId, String teamName, int teamLeadId) { .orElseThrow(() -> new RuntimeException("Team Lead not found with ID: " + teamLeadId)); team.setTeamLead(teamMember); - team.setTeamName(teamName); teamRepository.save(team); return new TeamDTO(team.getTeamId(), team.getTeamName(), team.getTeamLead().getAccountId()); diff --git a/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java b/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java index d711dc79..70b4f784 100644 --- a/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java +++ b/backend/task-manager/src/test/java/com/example/task_manager/controller_tests/TeamControllerTest.java @@ -94,14 +94,13 @@ void testChangeTeamLead() throws Exception { TeamRequestDTO requestDTO = new TeamRequestDTO(uniqueId, newTeamName, newLeadId); TeamDTO mockResponse = new TeamDTO(uniqueId, newTeamName, newLeadId); - when(teamService.changeTeamLead(uniqueId, newTeamName, newLeadId)).thenReturn(mockResponse); + when(teamService.changeTeamLead(uniqueId, newLeadId)).thenReturn(mockResponse); mockMvc.perform(put("/api/teams/" + uniqueId + "/change-lead") .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(requestDTO))) .andExpect(status().isOk()) .andExpect(jsonPath("$.teamId").value(uniqueId)) - .andExpect(jsonPath("$.teamName").value(newTeamName)) .andExpect(jsonPath("$.teamLeadId").value(newLeadId)); } diff --git a/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java b/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java index 5b880abd..9b335996 100644 --- a/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java +++ b/backend/task-manager/src/test/java/com/example/task_manager/service_tests/TeamServiceTest.java @@ -95,16 +95,13 @@ void testChangeTeamLead() { TeamMember newLead = createUniqueTeamMember("NewLead"); Team team = createUniqueTeam(oldLead); - String newTeamName = "Updated Team Name"; - TeamDTO updatedTeamDTO = teamService.changeTeamLead(team.getTeamId(), newTeamName, newLead.getAccountId()); + TeamDTO updatedTeamDTO = teamService.changeTeamLead(team.getTeamId(), newLead.getAccountId()); assertNotNull(updatedTeamDTO); - assertEquals(newTeamName, updatedTeamDTO.getTeamName()); assertEquals(newLead.getAccountId(), updatedTeamDTO.getTeamLeadId()); Team updatedTeam = teamRepository.findById(team.getTeamId()).orElseThrow(); - assertEquals(newTeamName, updatedTeam.getTeamName()); assertEquals(newLead.getAccountId(), updatedTeam.getTeamLead().getAccountId()); } @@ -113,10 +110,9 @@ void testChangeTeamLeadToNonExistentMember() { TeamMember oldLead = createUniqueTeamMember("OldLead"); Team team = createUniqueTeam(oldLead); - String newTeamName = "Updated Team Name"; Exception exception = assertThrows(RuntimeException.class, - () -> teamService.changeTeamLead(team.getTeamId(), newTeamName, 9999)); + () -> teamService.changeTeamLead(team.getTeamId(), 9999)); assertTrue(exception.getMessage().contains("Team Lead not found")); } diff --git a/frontend/react-app/src/api/teamApi.js b/frontend/react-app/src/api/teamApi.js index 66b22447..b7c617bd 100644 --- a/frontend/react-app/src/api/teamApi.js +++ b/frontend/react-app/src/api/teamApi.js @@ -32,12 +32,12 @@ export const deleteTeam = async (teamId) => { }; //Change team lead -export const changeTeamLead = async (teamId, teamLeadId, teamName) => { +export const changeTeamLead = async (teamId, teamLeadId) => { try { const response = await fetch(`${BASE_URL}/${teamId}/change-lead`, { method: 'PUT', headers: { "Content-Type": "application/json" }, - body: JSON.stringify({teamLeadId, teamName}) + body: JSON.stringify({teamLeadId}) }); if (!response.ok) { diff --git a/frontend/react-app/src/components/ChangeTeamLeadButton.jsx b/frontend/react-app/src/components/ChangeTeamLeadButton.jsx new file mode 100644 index 00000000..1603e2b9 --- /dev/null +++ b/frontend/react-app/src/components/ChangeTeamLeadButton.jsx @@ -0,0 +1,16 @@ +import { changeTeamLead } from "../api/teamApi" + +export default function ChangeTeamLeadButton({teamId, userId, setTeamLead}){ + async function onClick() { + try { + const response = await changeTeamLead(teamId, userId) + console.log(response) + setTeamLead(userId) + } catch (error) { + console.log(error) + } + } + return( + + ) +} \ No newline at end of file diff --git a/frontend/react-app/src/components/TeamMember.jsx b/frontend/react-app/src/components/TeamMember.jsx index 80034832..0bc42b19 100644 --- a/frontend/react-app/src/components/TeamMember.jsx +++ b/frontend/react-app/src/components/TeamMember.jsx @@ -1,7 +1,8 @@ import "../css/TeamTasks.css"; +import ChangeTeamLeadButton from "./ChangeTeamLeadButton"; import RemoveUserButton from "./RemoveUserButton"; -function TeamMember({ member,isAdminPage, teamLeadId, setTeamMembers, teamId, teamMembers}){ +function TeamMember({ member,isAdminPage, teamLeadId, setTeamMembers, teamId, teamMembers, setTeamLead}){ return(
👤 @@ -9,6 +10,7 @@ function TeamMember({ member,isAdminPage, teamLeadId, setTeamMembers, teamId, te {member.role === "ADMIN" && Admin} {member.accountId === teamLeadId && Team Lead} {isAdminPage && member.accountId !== teamLeadId && ()} + {isAdminPage && member.accountId !== teamLeadId && ()}
); } diff --git a/frontend/react-app/src/pages/TeamTasks.jsx b/frontend/react-app/src/pages/TeamTasks.jsx index 2cb2c8f2..ffb079c7 100644 --- a/frontend/react-app/src/pages/TeamTasks.jsx +++ b/frontend/react-app/src/pages/TeamTasks.jsx @@ -112,6 +112,7 @@ function TeamTasks(){ const [tasksToDo, setTasksToDo ] = useState([]); const [allUsers, setAllUsers] = useState(); + const [teamLead, setTeamLead] = useState(team.teamLeadId) async function fetchData(){ try{ @@ -165,13 +166,13 @@ function TeamTasks(){ } loadAPIInfo(); -},[]) +},[teamLead]) if(loadingNames || loadingTasks){ return (
Loading...
) } - +console.log(teamLead) //mock const isAdmin = cookies.userInfo.role ==='admin'; @@ -220,15 +221,16 @@ if(loadingNames || loadingTasks){

Team Members

{teamMembers.map((member) => ( - ))}
- {allUsersLoading&&(
..Loading
)} + {cookies.userInfo.role === 'admin'&&allUsersLoading&&(
..Loading
)} {cookies.userInfo.role === 'admin'&& !allUsersLoading && (
From ff90acf14432b6cbd2c765e7278909f308a0669d Mon Sep 17 00:00:00 2001 From: James Birnie Date: Tue, 1 Apr 2025 17:25:52 -0700 Subject: [PATCH 2/2] Fixed change team lead api test --- frontend/react-app/src/tests/api-tests/teamApiTest.test.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/react-app/src/tests/api-tests/teamApiTest.test.js b/frontend/react-app/src/tests/api-tests/teamApiTest.test.js index 50b9db7f..82804292 100644 --- a/frontend/react-app/src/tests/api-tests/teamApiTest.test.js +++ b/frontend/react-app/src/tests/api-tests/teamApiTest.test.js @@ -47,19 +47,17 @@ describe('Team API', () => { const updatedTeam = { teamId: 1, teamLeadId: 1, - teamName: "New Team Name" }; fetch.mockResponseOnce(JSON.stringify(updatedTeam), { status: 200 }); - const result = await changeTeamLead(1, 1, "New Team Name"); + const result = await changeTeamLead(1, 1); expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/1/change-lead`, { method: 'PUT', headers: { "Content-Type": "application/json" }, body: JSON.stringify({ teamLeadId: 1, - teamName: "New Team Name" }) });