Skip to content
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -19,6 +20,13 @@ public interface MemberSkillRepository extends CrudRepository<MemberSkill, UUID>

List<MemberSkill> findBySkillid(UUID skillid);

Optional<MemberSkill> findByMemberidAndSkillid(UUID memberId,UUID skillid );
Optional<MemberSkill> 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<MemberSkill> activeMemberSkills(String targetSkillId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ private List<TeamMemberSkillDTO> getPotentialQualifyingMembers(List<SkillLevelDT
throw new BadArgException("Invalid requested skill ID");
}

final List<MemberSkill> temp = memberSkillRepo.findBySkillid(skill.getId());
final List<MemberSkill> 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())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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();
Expand Down
64 changes: 23 additions & 41 deletions web-ui/src/pages/SkillReportPage.jsx
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -54,26 +54,28 @@ 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
: [];
}
memberSkillsFound = sortMembersBySkill(memberSkillsFound);
}

setSearchResults(memberSkillsFound);
};

handleSearch();
}, [searchSkills]);


function skillsToSkillLevelDTO(skills) {
return skills.map((skill, index) => {
Expand Down Expand Up @@ -124,26 +126,6 @@ const SkillReportPage = props => {
/>
)}
/>
<div className="SkillsSearch-actions fullWidth">
<Button
onClick={() => {
if (!searchSkills.length) {
window.snackDispatch({
type: UPDATE_TOAST,
payload: {
severity: 'error',
toast: 'Must select a skill'
}
});
} else {
handleSearch(createRequestDTO(editedSearchRequest));
}
}}
color="primary"
>
Run Search
</Button>
</div>
</div>
<SearchResults searchResults={searchResults} />
</div>
Expand Down
74 changes: 28 additions & 46 deletions web-ui/src/pages/TeamSkillReportPage.jsx
Original file line number Diff line number Diff line change
@@ -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';

Expand Down Expand Up @@ -72,33 +72,33 @@ 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
: [];
}

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 => {
Expand Down Expand Up @@ -194,24 +194,6 @@ const TeamSkillReportPage = () => {
/>
)}
/>
<Button
onClick={() => {
if (!searchSkills.length) {
window.snackDispatch({
type: UPDATE_TOAST,
payload: {
severity: 'error',
toast: 'Must select a skill'
}
});
return;
}
handleSearch(createRequest(editedSearchRequest));
}}
color="primary"
>
Run Search
</Button>
</div>
{showRadar && (
<div>
Expand Down
14 changes: 0 additions & 14 deletions web-ui/src/pages/__snapshots__/SkillReportPage.test.jsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -91,20 +91,6 @@ exports[`renders correctly 1`] = `
</div>
</div>
</div>
<div
class="SkillsSearch-actions fullWidth"
>
<button
class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium MuiButton-colorPrimary css-1e6y48t-MuiButtonBase-root-MuiButton-root"
tabindex="0"
type="button"
>
Run Search
<span
class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"
/>
</button>
</div>
</div>
<div
class="results-section"
Expand Down
10 changes: 0 additions & 10 deletions web-ui/src/pages/__snapshots__/TeamSkillReportPage.test.jsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -155,16 +155,6 @@ exports[`renders correctly 1`] = `
</div>
</div>
</div>
<button
class="MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium MuiButton-colorPrimary MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-sizeMedium MuiButton-textSizeMedium MuiButton-colorPrimary css-1e6y48t-MuiButtonBase-root-MuiButton-root"
tabindex="0"
type="button"
>
Run Search
<span
class="MuiTouchRipple-root css-8je8zh-MuiTouchRipple-root"
/>
</button>
</div>
</div>
</div>
Expand Down
Loading