Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,14 @@ 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));

TeamMember teamMember = teamMemberRepository.findById(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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}

Expand All @@ -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"));
}
Expand Down
4 changes: 2 additions & 2 deletions frontend/react-app/src/api/teamApi.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
16 changes: 16 additions & 0 deletions frontend/react-app/src/components/ChangeTeamLeadButton.jsx
Original file line number Diff line number Diff line change
@@ -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(
<button onClick={onClick} className="smallImportButton">Promote To Team Lead</button>
)
}
4 changes: 3 additions & 1 deletion frontend/react-app/src/components/TeamMember.jsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
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(
<div className="team-member">
<span className="avatar">👤</span>
<span className="name">{member.userName} {member.role === "You" && "(You)"}</span>
{member.role === "ADMIN" && <span className="role" >Admin</span>}
{member.accountId === teamLeadId && <span className="role" style={{backgroundColor:'#2b0fa7'}}>Team Lead</span>}
{isAdminPage && member.accountId !== teamLeadId && (<RemoveUserButton userId={member.accountId} setTeamMembers = {setTeamMembers} teamMembers={teamMembers} teamId={teamId}/>)}
{isAdminPage && member.accountId !== teamLeadId && (<ChangeTeamLeadButton teamId ={teamId} userId ={member.accountId} setTeamLead={setTeamLead}/>)}
</div>
);
}
Expand Down
10 changes: 6 additions & 4 deletions frontend/react-app/src/pages/TeamTasks.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ function TeamTasks(){

const [tasksToDo, setTasksToDo ] = useState([]);
const [allUsers, setAllUsers] = useState();
const [teamLead, setTeamLead] = useState(team.teamLeadId)

async function fetchData(){
try{
Expand Down Expand Up @@ -165,13 +166,13 @@ function TeamTasks(){
}
loadAPIInfo();

},[])
},[teamLead])
if(loadingNames || loadingTasks){
return (<div>Loading...</div>)
}



console.log(teamLead)
//mock
const isAdmin = cookies.userInfo.role ==='admin';

Expand Down Expand Up @@ -220,15 +221,16 @@ if(loadingNames || loadingTasks){
<h2>Team Members</h2>
<div className="team-list">
{teamMembers.map((member) => (
<TeamMember key={member.teamId} member={member} teamLeadId = {team.teamLeadId}
<TeamMember key={member.teamId} member={member} teamLeadId = {teamLead}
setTeamMembers = {setTeamMembers}
teamId={teamId}
isAdminPage={isAdmin}
teamMembers={teamMembers}
setTeamLead = {setTeamLead}
/>
))}
</div>
{allUsersLoading&&(<div>..Loading</div>)}
{cookies.userInfo.role === 'admin'&&allUsersLoading&&(<div>..Loading</div>)}
{cookies.userInfo.role === 'admin'&& !allUsersLoading &&
(
<div style={{marginTop: '30px'}}>
Expand Down
4 changes: 1 addition & 3 deletions frontend/react-app/src/tests/api-tests/teamApiTest.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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"
})
});

Expand Down