From 1c994601444b44ae7b9e5eace8d664c3e3d714ce Mon Sep 17 00:00:00 2001 From: Chad Elliott Date: Tue, 18 Feb 2025 12:46:08 -0600 Subject: [PATCH 1/5] Removed the Run Search button and run the search whenever the skills change. --- web-ui/src/pages/SkillReportPage.jsx | 68 +++++++++++----------------- 1 file changed, 27 insertions(+), 41 deletions(-) diff --git a/web-ui/src/pages/SkillReportPage.jsx b/web-ui/src/pages/SkillReportPage.jsx index e2728e0c9..9a2f713c5 100644 --- a/web-ui/src/pages/SkillReportPage.jsx +++ b/web-ui/src/pages/SkillReportPage.jsx @@ -1,4 +1,4 @@ -import React, { useContext, useRef, useState } from 'react'; +import React, { useContext, useRef, useState, useEffect } from 'react'; import { Button, TextField } from '@mui/material'; import Autocomplete from '@mui/material/Autocomplete'; @@ -54,26 +54,32 @@ const SkillReportPage = props => { processedQPs ); - const handleSearch = async searchRequestDTO => { - let res = await reportSkills(searchRequestDTO, csrf); - let memberSkillsFound; - if (res && res.payload) { - memberSkillsFound = - !res.error && res.payload.data.teamMembers - ? res.payload.data.teamMembers - : undefined; - } - // Filter out skills of terminated members - memberSkillsFound = memberSkillsFound?.filter(memberSkill => - memberIds.includes(memberSkill.id) - ); - if (memberSkillsFound && memberIds) { - let newSort = sortMembersBySkill(memberSkillsFound); - setSearchResults(newSort); - } else { - setSearchResults([]); - } - }; + useEffect(() => { + const handleSearch = async () => { + let memberSkillsFound = []; + + if (searchSkills.length > 0) { + const searchRequestDTO = createRequestDTO(editedSearchRequest); + const res = await reportSkills(searchRequestDTO, csrf); + if (res && res.payload) { + memberSkillsFound = + !res.error && res.payload.data?.teamMembers + ? res.payload.data.teamMembers + : []; + } + // Filter out skills of terminated members + memberSkillsFound = memberSkillsFound.filter(memberSkill => + memberIds?.includes(memberSkill.id) + ); + memberSkillsFound = sortMembersBySkill(memberSkillsFound); + } + + setSearchResults(memberSkillsFound); + }; + + handleSearch(); + }, [searchSkills]); + function skillsToSkillLevelDTO(skills) { return skills.map((skill, index) => { @@ -124,26 +130,6 @@ const SkillReportPage = props => { /> )} /> -
- -
From cf8cce05f86c9655e6c8ff0e35c54261cbbdbdbc Mon Sep 17 00:00:00 2001 From: Chad Elliott Date: Tue, 18 Feb 2025 12:56:35 -0600 Subject: [PATCH 2/5] Updated the test snapshot. --- .../__snapshots__/SkillReportPage.test.jsx.snap | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/web-ui/src/pages/__snapshots__/SkillReportPage.test.jsx.snap b/web-ui/src/pages/__snapshots__/SkillReportPage.test.jsx.snap index 3917370ce..6275d6ddb 100644 --- a/web-ui/src/pages/__snapshots__/SkillReportPage.test.jsx.snap +++ b/web-ui/src/pages/__snapshots__/SkillReportPage.test.jsx.snap @@ -91,20 +91,6 @@ exports[`renders correctly 1`] = ` -
- -
Date: Tue, 18 Feb 2025 14:05:17 -0600 Subject: [PATCH 3/5] Remove the Run Search button from the Team Skills report. --- web-ui/src/pages/TeamSkillReportPage.jsx | 79 ++++++++----------- .../TeamSkillReportPage.test.jsx.snap | 10 --- 2 files changed, 33 insertions(+), 56 deletions(-) diff --git a/web-ui/src/pages/TeamSkillReportPage.jsx b/web-ui/src/pages/TeamSkillReportPage.jsx index 2b32a25fc..979c82367 100644 --- a/web-ui/src/pages/TeamSkillReportPage.jsx +++ b/web-ui/src/pages/TeamSkillReportPage.jsx @@ -1,4 +1,4 @@ -import React, { useContext, useRef, useState } from 'react'; +import React, { useContext, useRef, useState, useEffect } from 'react'; import { Autocomplete, Button, TextField, Typography } from '@mui/material'; @@ -72,33 +72,38 @@ const TeamSkillReportPage = () => { processedQPs ); - const handleSearch = async searchRequestDTO => { - let res = await reportSkills(searchRequestDTO, csrf); - let memberSkillsFound; - if (res && res.payload) { - memberSkillsFound = - !res.error && res.payload.data.teamMembers - ? res.payload.data.teamMembers - : undefined; - } - if (memberSkillsFound && memberProfiles) { - // Filter the member skill down to only members that are not terminated. - memberSkillsFound = memberSkillsFound.filter( - mSkill => memberProfiles.find(member => member.id == mSkill.id) - ); - - setAllSearchResults(memberSkillsFound); - let membersSelected = memberSkillsFound.filter(mSkill => - selectedMembers.some(member => member.id === mSkill.id) - ); - let newSort = sortMembersBySkill(membersSelected); - setSearchResults(newSort); - } else { - setSearchResults([]); - setAllSearchResults([]); - } - setShowRadar(true); - }; + useEffect(() => { + const handleSearch = async () => { + if (searchSkills.length > 0) { + const searchRequestDTO = createRequest(editedSearchRequest); + const res = await reportSkills(searchRequestDTO, csrf); + let memberSkillsFound; + if (res && res.payload) { + memberSkillsFound = + !res.error && res.payload.data.teamMembers + ? res.payload.data.teamMembers + : []; + } + + // Filter the member skill down to only members that are not terminated. + memberSkillsFound = memberSkillsFound.filter( + mSkill => memberProfiles.find(member => member.id == mSkill.id) + ); + + setAllSearchResults(memberSkillsFound); + const membersSelected = memberSkillsFound.filter(mSkill => + selectedMembers.some(member => member.id === mSkill.id) + ); + setSearchResults(sortMembersBySkill(membersSelected)); + setShowRadar(true); + } else { + setSearchResults([]); + setAllSearchResults([]); + setShowRadar(false); + } + }; + handleSearch(); + }, [selectedMembers, searchSkills]); function skillsToSkillLevel(skills) { return skills.map(skill => { @@ -194,24 +199,6 @@ const TeamSkillReportPage = () => { /> )} /> -
{showRadar && (
diff --git a/web-ui/src/pages/__snapshots__/TeamSkillReportPage.test.jsx.snap b/web-ui/src/pages/__snapshots__/TeamSkillReportPage.test.jsx.snap index b7b15e400..bea67ab24 100644 --- a/web-ui/src/pages/__snapshots__/TeamSkillReportPage.test.jsx.snap +++ b/web-ui/src/pages/__snapshots__/TeamSkillReportPage.test.jsx.snap @@ -155,16 +155,6 @@ exports[`renders correctly 1`] = `
- From 1da833fdcdf7cd45e2e9565bc5b81bdb9d198cd8 Mon Sep 17 00:00:00 2001 From: Chad Elliott Date: Wed, 19 Feb 2025 10:19:24 -0600 Subject: [PATCH 4/5] Added a custom query to the MemberSkillRepository to filter out skills from terminated members. --- .../services/member_skill/MemberSkillRepository.java | 10 +++++++++- .../skillsreport/SkillsReportServicesImpl.java | 3 ++- web-ui/src/pages/SkillReportPage.jsx | 4 ---- web-ui/src/pages/TeamSkillReportPage.jsx | 5 ----- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/server/src/main/java/com/objectcomputing/checkins/services/member_skill/MemberSkillRepository.java b/server/src/main/java/com/objectcomputing/checkins/services/member_skill/MemberSkillRepository.java index 08c9a6314..175e97630 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/member_skill/MemberSkillRepository.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/member_skill/MemberSkillRepository.java @@ -1,5 +1,6 @@ package com.objectcomputing.checkins.services.member_skill; +import io.micronaut.data.annotation.Query; import io.micronaut.data.jdbc.annotation.JdbcRepository; import io.micronaut.data.model.query.builder.sql.Dialect; import io.micronaut.data.repository.CrudRepository; @@ -19,6 +20,13 @@ public interface MemberSkillRepository extends CrudRepository List findBySkillid(UUID skillid); - Optional findByMemberidAndSkillid(UUID memberId,UUID skillid ); + Optional findByMemberidAndSkillid(UUID memberId, UUID skillid); + @Query(value = "SELECT member_skills.* FROM member_skills " + + "INNER JOIN member_profile " + + "ON member_skills.memberid = member_profile.id " + + "WHERE :targetSkillId = member_skills.skillid " + + "AND member_profile.terminationdate IS NULL", + nativeQuery = true) + List activeMemberSkills(String targetSkillId); } diff --git a/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImpl.java b/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImpl.java index ef2c12ac6..f6321f0fa 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImpl.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImpl.java @@ -92,7 +92,8 @@ private List getPotentialQualifyingMembers(List temp = memberSkillRepo.findBySkillid(skill.getId()); + final List temp = + memberSkillRepo.activeMemberSkills(skill.getId().toString()); if (skill.getLevel() != null && !temp.isEmpty()) { for (MemberSkill memSkill : temp) { if (memSkill.getSkilllevel() != null && isSkillLevelSatisfied(memSkill.getSkilllevel(), skill.getLevel())) { diff --git a/web-ui/src/pages/SkillReportPage.jsx b/web-ui/src/pages/SkillReportPage.jsx index 9a2f713c5..6d9abfe7b 100644 --- a/web-ui/src/pages/SkillReportPage.jsx +++ b/web-ui/src/pages/SkillReportPage.jsx @@ -67,10 +67,6 @@ const SkillReportPage = props => { ? res.payload.data.teamMembers : []; } - // Filter out skills of terminated members - memberSkillsFound = memberSkillsFound.filter(memberSkill => - memberIds?.includes(memberSkill.id) - ); memberSkillsFound = sortMembersBySkill(memberSkillsFound); } diff --git a/web-ui/src/pages/TeamSkillReportPage.jsx b/web-ui/src/pages/TeamSkillReportPage.jsx index 979c82367..a79d4866f 100644 --- a/web-ui/src/pages/TeamSkillReportPage.jsx +++ b/web-ui/src/pages/TeamSkillReportPage.jsx @@ -85,11 +85,6 @@ const TeamSkillReportPage = () => { : []; } - // Filter the member skill down to only members that are not terminated. - memberSkillsFound = memberSkillsFound.filter( - mSkill => memberProfiles.find(member => member.id == mSkill.id) - ); - setAllSearchResults(memberSkillsFound); const membersSelected = memberSkillsFound.filter(mSkill => selectedMembers.some(member => member.id === mSkill.id) From f9dc4338eeb13775850c5f224fccfb0a7f9e1609 Mon Sep 17 00:00:00 2001 From: Chad Elliott Date: Wed, 19 Feb 2025 11:10:54 -0600 Subject: [PATCH 5/5] Added a terminated member to one of the tests. --- .../skillsreport/SkillsReportServicesImplTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/src/test/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImplTest.java b/server/src/test/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImplTest.java index b815befe0..fd2d6b0d6 100644 --- a/server/src/test/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImplTest.java +++ b/server/src/test/java/com/objectcomputing/checkins/services/member_skill/skillsreport/SkillsReportServicesImplTest.java @@ -108,6 +108,7 @@ void testReport() { MemberProfile member2 = createASecondDefaultMemberProfile(); MemberProfile member3 = createAThirdDefaultMemberProfile(); MemberProfile member4 = createADefaultMemberProfileForPdl(member1); + MemberProfile member5 = createAPastTerminatedMemberProfile(); final UUID skillId1 = skill1.getId(); final UUID skillId2 = skill2.getId(); @@ -128,6 +129,12 @@ void testReport() { final MemberSkill ms8 = createMemberSkill(member4, skill2, SkillLevel.INTERMEDIATE_LEVEL, LocalDate.now()); final MemberSkill ms9 = createMemberSkill(member4, skill4, SkillLevel.EXPERT_LEVEL, LocalDate.now()); + // Skills for the terminated member + createMemberSkill(member5, skill1, SkillLevel.ADVANCED_LEVEL, LocalDate.now()); + createMemberSkill(member5, skill2, SkillLevel.ADVANCED_LEVEL, LocalDate.now()); + createMemberSkill(member5, skill3, SkillLevel.ADVANCED_LEVEL, LocalDate.now()); + createMemberSkill(member5, skill4, SkillLevel.ADVANCED_LEVEL, LocalDate.now()); + // List of skills required in first request final SkillLevelDTO dto1 = new SkillLevelDTO(); final SkillLevelDTO dto2 = new SkillLevelDTO();