Skip to content

Commit 4cb819c

Browse files
committed
Initial transition of member skill data structure. Something is not right with my flyway migration.
1 parent 7151f2d commit 4cb819c

File tree

8 files changed

+185
-40
lines changed

8 files changed

+185
-40
lines changed

server/src/main/java/com/objectcomputing/checkins/services/member_skill/MemberSkill.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -54,25 +54,20 @@ public class MemberSkill {
5454
@Schema(description = "the last used date of the skill")
5555
private LocalDate lastuseddate;
5656

57-
public MemberSkill() {
58-
}
57+
@Column(name="interested")
58+
@TypeDef(type = DataType.BOOLEAN)
59+
@Schema(description = "the member interest")
60+
private boolean interested;
5961

60-
public MemberSkill(UUID memberid, UUID skillid) {
61-
this.memberid = memberid;
62-
this.skillid = skillid;
63-
}
64-
65-
public MemberSkill(UUID id, UUID memberid, UUID skillid) {
66-
this.id = id;
67-
this.memberid = memberid;
68-
this.skillid = skillid;
62+
public MemberSkill() {
6963
}
7064

71-
public MemberSkill(UUID memberid, UUID skillid, String skilllevel, LocalDate lastuseddate) {
65+
public MemberSkill(UUID memberid, UUID skillid, String skilllevel, LocalDate lastuseddate, boolean interested) {
7266
this.memberid = memberid;
7367
this.skillid = skillid;
7468
this.skilllevel = skilllevel;
7569
this.lastuseddate = lastuseddate;
70+
this.interested = interested;
7671
}
7772

7873
@Override
@@ -84,12 +79,13 @@ public boolean equals(Object o) {
8479
Objects.equals(memberid, that.memberid) &&
8580
Objects.equals(skillid, that.skillid) &&
8681
Objects.equals(skilllevel, that.skilllevel) &&
87-
Objects.equals(lastuseddate, that.lastuseddate);
82+
Objects.equals(lastuseddate, that.lastuseddate) &&
83+
Objects.equals(interested, that.interested);
8884
}
8985

9086
@Override
9187
public int hashCode() {
92-
return Objects.hash(id, memberid, skillid, skilllevel, lastuseddate);
88+
return Objects.hash(id, memberid, skillid, skilllevel, lastuseddate, interested);
9389
}
9490

9591
@Override
@@ -100,6 +96,7 @@ public String toString() {
10096
", skillid=" + skillid + '\'' +
10197
", skilllevel=" + skilllevel + '\'' +
10298
", lastuseddate=" + lastuseddate +
99+
", interested=" + interested +
103100
'}';
104101
}
105102
}

server/src/main/java/com/objectcomputing/checkins/services/member_skill/MemberSkillController.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@ public MemberSkillController(MemberSkillServices memberSkillServices) {
4545
@Post
4646
public HttpResponse<MemberSkill> createAMemberSkill(@Body @Valid @NotNull MemberSkillCreateDTO memberSkill, HttpRequest<?> request) {
4747
MemberSkill createdMemberSkill = memberSkillsService.save(
48-
new MemberSkill(memberSkill.getMemberid(), memberSkill.getSkillid(), memberSkill.getSkilllevel(), memberSkill.getLastuseddate())
48+
new MemberSkill(memberSkill.getMemberid(),
49+
memberSkill.getSkillid(),
50+
memberSkill.getSkilllevel(),
51+
memberSkill.getLastuseddate(),
52+
memberSkill.interested)
4953
);
5054
return HttpResponse.created(createdMemberSkill)
5155
.headers(headers -> headers.location(URI.create(String.format("%s/%s", request.getPath(), createdMemberSkill.getId()))));

server/src/main/java/com/objectcomputing/checkins/services/member_skill/MemberSkillCreateDTO.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ public class MemberSkillCreateDTO {
2626
private String skilllevel;
2727

2828
@Schema(description = "the last used date of the skill")
29-
3029
private LocalDate lastuseddate;
3130

31+
@Schema(description = "the member interest")
32+
public boolean interested;
3233
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
ALTER TABLE member_skills ADD COLUMN interested boolean DEFAULT false;
2+
3+
-- If the original skilllevel was 'interested', set the new column value to true
4+
UPDATE member_skills SET interested = true WHERE skilllevel = '1';
5+
6+
-- Transition old skill levels to the new range
7+
UPDATE member_skills SET skilllevel = '0' WHERE skilllevel = '1';
8+
UPDATE member_skills SET skilllevel = '1' WHERE skilllevel = '2';
9+
UPDATE member_skills SET skilllevel = '2' WHERE skilllevel = '3' OR
10+
skilllevel = '4';
11+
UPDATE member_skills SET skilllevel = '3' WHERE skilllevel = '5';

server/src/main/resources/db/dev/R__Load_testing_data.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1698,6 +1698,11 @@ INSERT INTO member_skills -- Revolver Ocelot, Java
16981698
VALUES
16991699
('d27b679c-3aa8-4c4d-b08e-4eda63cea23f', '105f2968-a182-45a3-892c-eeff76383fe0', '06c03df3-85fe-4fc3-979e-9f1f6ba74a03', '5', '2022-08-01');
17001700

1701+
INSERT INTO member_skills -- Faux Freddy, CSS
1702+
(id, memberid, skillid, skilllevel, lastuseddate)
1703+
VALUES
1704+
('fabd11fa-2268-4e72-a2ad-e13aaaaaaa5b', '2dee821c-de32-4d9c-9ecb-f73e5903d17a', '6b56f0aa-09aa-4b09-bb81-03481af7e49f', '1', '2018-06-01');
1705+
17011706
INSERT INTO kudos
17021707
(id, message, senderid, teamid, datecreated, dateapproved, publiclyvisible)
17031708
VALUES
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
.skill-level-container {
2+
width: 100%;
3+
display: flex;
4+
flex-direction: row;
5+
align-items: flex-start;
6+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import { debounce } from 'lodash/function';
2+
import React, { useState } from 'react';
3+
import DeleteIcon from '@mui/icons-material/Delete';
4+
import {
5+
Checkbox,
6+
FormControl,
7+
FormControlLabel,
8+
IconButton,
9+
TextField,
10+
Typography
11+
} from '@mui/material';
12+
import RadioGroup from '@mui/material/RadioGroup';
13+
import Radio from '@mui/material/Radio';
14+
import { styled } from '@mui/material/styles';
15+
16+
import './SkillLevel.css';
17+
18+
const PREFIX = 'SkillLevel';
19+
const classes = {
20+
hidden: `${PREFIX}-hidden`
21+
};
22+
23+
const Root = styled('span')(() => ({
24+
[`& .${classes.hidden}`]: {
25+
display: 'none'
26+
},
27+
'@media screen and (max-width: 900px)': {
28+
width: '100%'
29+
}
30+
}));
31+
32+
const SkillLevel = ({
33+
id,
34+
name,
35+
startLevel,
36+
lastUsedDate,
37+
onDelete,
38+
onUpdate
39+
}) => {
40+
let [currCheck, setCurrCheck] = useState(!lastUsedDate);
41+
let [lastUsed, setLastUsed] = useState(lastUsedDate);
42+
let [skillLevel, setSkillLevel] = useState(startLevel);
43+
44+
const datePickerVisibility = () => {
45+
setCurrCheck(!currCheck);
46+
};
47+
48+
const updateLevel = (e, value) => {
49+
setSkillLevel(value);
50+
updateSkillLevel(e, value);
51+
}
52+
53+
const updateSkillLevel = debounce((event, value) => {
54+
onUpdate(lastUsed, value, id);
55+
}, 1500);
56+
57+
const updateLastUsed = debounce(value => {
58+
setLastUsed(value);
59+
onUpdate(value, skillLevel, id);
60+
}, 1500);
61+
62+
const formatDate = date => {
63+
if (!date) return;
64+
let dateString = date[0] + '-';
65+
dateString = dateString + (date[1] < 10 ? '0' + date[1] : date[1]) + '-';
66+
dateString = dateString + (date[2] < 10 ? '0' + date[2] : date[2]);
67+
return dateString;
68+
};
69+
70+
return (
71+
<>
72+
<Root>
73+
<Typography variant="body1">
74+
{name}
75+
</Typography>
76+
<div className="skill-level-container">
77+
<RadioGroup
78+
row
79+
value={skillLevel}
80+
onChange={updateLevel}
81+
>
82+
<FormControlLabel value="0" control={<Radio/>} label="None"/>
83+
<FormControlLabel value="1" control={<Radio/>} label="Novice"/>
84+
<FormControlLabel value="2" control={<Radio/>} label="Practitioner"/>
85+
<FormControlLabel value="3" control={<Radio/>} label="Expert"/>
86+
</RadioGroup>
87+
<IconButton onClick={() => onDelete(id)} size="large">
88+
<DeleteIcon />
89+
</IconButton>
90+
</div>
91+
</Root>
92+
</>
93+
);
94+
};
95+
export default SkillLevel;

web-ui/src/components/skills/SkillSection.jsx

Lines changed: 50 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
updateMemberSkill
2121
} from '../../api/memberskill.js';
2222
import { getSkill, createSkill } from '../../api/skill.js';
23-
import SkillSlider from './SkillSlider';
23+
import SkillLevel from './SkillLevel';
2424

2525
import {
2626
Avatar,
@@ -36,7 +36,10 @@ import {
3636
List,
3737
ListItem,
3838
Modal,
39-
TextField
39+
TextField,
40+
Switch,
41+
FormControlLabel,
42+
Grid,
4043
} from '@mui/material';
4144
import Autocomplete, { createFilterOptions } from '@mui/material/Autocomplete';
4245
import BuildIcon from '@mui/icons-material/Build';
@@ -132,7 +135,8 @@ const SkillSection = ({ userId }) => {
132135
return;
133136
}
134137
const res = await createMemberSkill(
135-
{ skillid: curSkill.id, memberid: userId, skilllevel: 3 },
138+
{ skillid: curSkill.id, memberid: userId,
139+
skilllevel: 2, interested: true },
136140
csrf
137141
);
138142
const data =
@@ -180,6 +184,19 @@ const SkillSection = ({ userId }) => {
180184
};
181185
const filter = createFilterOptions();
182186

187+
const handleInterest = async (id, interested) => {
188+
if (csrf && interested) {
189+
const mSkill = { ...myMemberSkills.find(s => s.skillid === id) };
190+
mSkill.interested = interested;
191+
await updateMemberSkill(mSkill, csrf);
192+
const copy = [
193+
...myMemberSkills.filter(skill => skill.id !== mSkill.id),
194+
mSkill
195+
];
196+
dispatch({ type: UPDATE_MEMBER_SKILLS, payload: copy });
197+
}
198+
};
199+
183200
const SkillSelector = () => (
184201
<Autocomplete
185202
blurOnSelect
@@ -292,32 +309,41 @@ const SkillSection = ({ userId }) => {
292309
</div>
293310
<SkillSelector />
294311
</div>
295-
<List>
312+
<Grid container spacing={3}>
296313
{mySkills &&
297314
mySkills.map(memberSkill => {
298315
return (
299-
<ListItem
300-
key={`MemberSkill-${memberSkill.id}`}
301-
className={classes.skillRow}
302-
>
303-
<SkillSlider
304-
description={memberSkill.description}
305-
id={memberSkill.id}
306-
name={memberSkill.name}
307-
startLevel={
308-
memberSkill.skilllevel ? memberSkill.skilllevel : 3
309-
}
310-
lastUsedDate={memberSkill.lastuseddate}
311-
onDelete={id => {
312-
handleOpenDeleteConfirmation();
313-
setSelectedSkillId(id);
314-
}}
315-
onUpdate={handleUpdate}
316-
/>
317-
</ListItem>
316+
<Grid item>
317+
<Card>
318+
<CardContent>
319+
<div
320+
key={`MemberSkill-${memberSkill.id}`}
321+
className={classes.skillRow}
322+
>
323+
<SkillLevel
324+
description={memberSkill.description}
325+
id={memberSkill.id}
326+
name={memberSkill.name}
327+
startLevel={memberSkill.skilllevel}
328+
lastUsedDate={memberSkill.lastuseddate}
329+
onDelete={id => {
330+
handleOpenDeleteConfirmation();
331+
setSelectedSkillId(id);
332+
}}
333+
onUpdate={handleUpdate}
334+
/>
335+
<FormControlLabel
336+
control={<Switch checked={memberSkill.interested}
337+
onChange={() => handleInterest(memberSkill.id, !memberSkill.interested)} />}
338+
label="Interested in learning or doing more with this skill?"
339+
/>
340+
</div>
341+
</CardContent>
342+
</Card>
343+
</Grid>
318344
);
319345
})}
320-
</List>
346+
</Grid>
321347
</CardContent>
322348
<CardActions>
323349
<div>

0 commit comments

Comments
 (0)