Skip to content

Commit 834966b

Browse files
committed
feat: add mentorship edit drawer
1 parent b4d52d5 commit 834966b

File tree

5 files changed

+154
-2
lines changed

5 files changed

+154
-2
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<script setup>
2+
import BaseDrawer from '@/components/base/BaseDrawer.vue'
3+
import useSkillTexts from '@/composables/useSkillTexts.js'
4+
import { ref, watchEffect } from 'vue'
5+
import LpiCheckbox from '@/components/base/form/LpiCheckbox.vue'
6+
import TextInput from '@/components/base/form/TextInput.vue'
7+
8+
const emit = defineEmits(['close', 'update-mentorship'])
9+
10+
const props = defineProps({
11+
skill: { type: Object, required: true },
12+
isOpened: { type: Boolean, required: true },
13+
})
14+
15+
const mentorship = ref({
16+
can_mentor: false,
17+
needs_mentor: false,
18+
comment: '',
19+
})
20+
21+
watchEffect(function onOpen() {
22+
if (props.isOpened) {
23+
mentorship.value = {
24+
can_mentor: props.skill.can_mentor || false,
25+
needs_mentor: props.skill.needs_mentor || false,
26+
comment: props.skill.comment || '',
27+
}
28+
}
29+
})
30+
31+
function saveMentorship() {
32+
emit('update-mentorship', { id: props.skill.id, ...mentorship.value })
33+
}
34+
35+
const skillTexts = useSkillTexts()
36+
</script>
37+
<template>
38+
<BaseDrawer
39+
data-test="edit-mentorship-drawer"
40+
:confirm-action-name="$t('common.confirm')"
41+
:confirm-action-disabled="false"
42+
:asyncing="asyncing"
43+
:is-opened="isOpened"
44+
:title="$t('profile.edit.skills.mentorship.edit', { skill: skillTexts.title(skill) })"
45+
class="medium"
46+
@close="$emit('close')"
47+
@confirm="saveMentorship"
48+
>
49+
<div class="form-group">
50+
<p>{{ $t('profile.edit.skills.mentorship.notice') }}</p>
51+
</div>
52+
<div class="form-group">
53+
<div class="buttons-group">
54+
<LpiCheckbox
55+
v-model="mentorship.can_mentor"
56+
:label="$t('profile.edit.skills.mentorship.can-mentor')"
57+
class="as-button"
58+
/>
59+
60+
<LpiCheckbox
61+
v-model="mentorship.needs_mentor"
62+
:label="$t('profile.edit.skills.mentorship.needs-mentor')"
63+
class="as-button"
64+
/>
65+
</div>
66+
</div>
67+
<div class="form-group">
68+
<TextInput
69+
v-model="mentorship.comment"
70+
:label="$t('profile.edit.skills.mentorship.comment')"
71+
input-type="textarea"
72+
:placeholder="$t('profile.edit.skills.mentorship.comment-placeholder')"
73+
/>
74+
</div>
75+
</BaseDrawer>
76+
</template>
77+
<style lang="scss" scoped>
78+
.buttons-group {
79+
display: flex;
80+
gap: $space-unit;
81+
82+
> * {
83+
flex-basis: 50%;
84+
}
85+
}
86+
87+
.form-group + .form-group {
88+
margin-top: $space-unit;
89+
}
90+
</style>

src/components/people/skill/SkillEditor.vue

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import IconImage from '@/components/base/media/IconImage.vue'
44
import useSkillTexts from '@/composables/useSkillTexts.js'
55
import useSkillLevels from '@/composables/useSkillLevels.js'
66
import ConfirmModal from '@/components/base/modal/ConfirmModal.vue'
7-
7+
import EditMentorshipDrawer from '@/components/people/skill/EditMentorshipDrawer.vue'
8+
import LpiButton from '@/components/base/button/LpiButton.vue'
89
const props = defineProps({
910
skill: { type: Object, required: true },
1011
type: { type: String, required: true }, // "skills" or "hobbies"
1112
scrollIntoView: { type: Boolean, default: false },
1213
})
13-
const emit = defineEmits(['set-level', 'delete'])
14+
const emit = defineEmits(['set-level', 'update-mentorship', 'delete'])
1415
1516
const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
1617
const { top, left, bottom, right } = el.getBoundingClientRect()
@@ -41,6 +42,12 @@ function deleteSkill() {
4142
asyncing.value = true
4243
emit('delete', props.skill)
4344
}
45+
46+
const editMentorship = ref(false)
47+
function onUpdateMentorship(mentorship) {
48+
emit('update-mentorship', mentorship)
49+
editMentorship.value = false
50+
}
4451
</script>
4552
<template>
4653
<div
@@ -61,6 +68,13 @@ function deleteSkill() {
6168
<span class="level-name">{{ level.label }}</span>
6269
</label>
6370
</div>
71+
<div class="mentorship">
72+
<LpiButton
73+
secondary
74+
@click="editMentorship = true"
75+
:label="$t('profile.edit.skills.mentorship.choose')"
76+
/>
77+
</div>
6478
<div class="delete-action">
6579
<IconImage
6680
name="TrashCanOutline"
@@ -79,6 +93,12 @@ function deleteSkill() {
7993
@cancel="confirmDelete = false"
8094
@confirm="deleteSkill"
8195
/>
96+
<EditMentorshipDrawer
97+
:is-opened="editMentorship"
98+
:skill="skill"
99+
@update-mentorship="onUpdateMentorship"
100+
@close="editMentorship = false"
101+
/>
82102
</div>
83103
</template>
84104
<style scoped lang="scss">

src/locales/en.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,6 +1354,18 @@
13541354
},
13551355
"selection": "Selected hobbies"
13561356
},
1357+
1358+
"mentorship": {
1359+
"choose": "Choose",
1360+
"edit": "Mentorship for \"{skill}\"",
1361+
"error": "Error while saving mentorship.",
1362+
"success": "Mentorship saved",
1363+
"notice": "Would you like to become a mentor or be mentee for this skill? You will determine the frequency of exchange that suits you with the mentee or your mentor. Rest assured, our guide is here to help you.",
1364+
"can-mentor": "I can mentor",
1365+
"needs-mentor": "I'm looking for a mentor",
1366+
"comment": "Comment",
1367+
"comment-placeholder": "Indicate what help you can offer or the help you need (hourly volume, frequency, etc.)"
1368+
},
13571369
"levels": {
13581370
"curious": "Curious",
13591371
"basic": "Basic",

src/locales/fr.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1355,6 +1355,17 @@
13551355
"competent": "Compétent",
13561356
"expert": "Expert"
13571357
},
1358+
"mentorship": {
1359+
"choose": "Choisir",
1360+
"edit": "Mentorat pour \"{skill}\"",
1361+
"error": "Erreur lors de la sauvegarde du mentorat.",
1362+
"success": "Mentorat sauvegardé",
1363+
"notice": "Vous souhaitez devenir mentor ou être mentoré pour cette compétence ? Vous déterminerez la fréquence d’échange qui vous arrange avec le/la mentoré·e ou votre mentor. Rassurez-vous, notre guide est là pour vous aider.",
1364+
"can-mentor": "Je peux être mentor",
1365+
"needs-mentor": "Je chercher un mentor",
1366+
"comment": "Commentaire",
1367+
"comment-placeholder": "Indiquez quelle aide vous pouvez offrir ou l’aide dont vous avez besoin (volume horaire, fréquence, etc...)"
1368+
},
13581369
"tip": {
13591370
"intro-edit": "Les différents niveaux parmi lesquels vous pouvez choisir :",
13601371
"curious": {

src/pages/ProfileEditPage/Tabs/ProfileSkillsEditTab.vue

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
:type="key"
5252
:data-skill-id="skill.id"
5353
@set-level="setTalentLevel(key, $event.skill, $event.level)"
54+
@update-mentorship="updateMentorship(key, $event, skill)"
5455
@delete="removeTalent(key, $event)"
5556
:scroll-into-view="lastAddedTalent === skill.id"
5657
/>
@@ -177,6 +178,24 @@ export default {
177178
}
178179
}
179180
},
181+
182+
async updateMentorship(type, data, talent) {
183+
try {
184+
await patchUserSkill(this.user.id, data.id, {
185+
...data,
186+
})
187+
this.toaster.pushSuccess(
188+
this.$t(`profile.edit.skills.${type}.edit-success`, {
189+
name: this.skillTexts.title(talent),
190+
})
191+
)
192+
this.reloadUser()
193+
this.$emit('profile-edited')
194+
} catch (error) {
195+
console.error(error)
196+
this.toaster.pushError(this.$t('profile.edit.skills.save-error'))
197+
}
198+
},
180199
async removeTalent(type, talent) {
181200
try {
182201
await deleteUserSkill(this.user.id, talent.id)

0 commit comments

Comments
 (0)