11<template >
2- <div v-if = " teamMember.user.id != user?.id " >
3- <select
2+ <div >
3+ <Select
44 v-model =" selectedRole"
5- @change =" updateMemberRole"
6- >
7- <option
8- v-for =" (role, index) in roleOptions"
9- :key =" index"
10- :value =" role"
11- >
12- {{ t(`noteSettings.team.roles.${role}`) }}
13- </option >
14- </select >
5+ :align =" { vertically: 'below', horizontally: 'right' }"
6+ :is-disabled =" teamMember.user.id == user?.id || (note !== null && (note as Note).creatorId === teamMember.id)"
7+ :items =" roleItems"
8+ />
159 </div >
1610</template >
1711
1812<script setup lang="ts">
1913import { MemberRole , TeamMember } from ' @/domain/entities/Team.ts' ;
20- import { NoteId } from ' @/domain/entities/Note.ts' ;
21- import { computed , ref } from ' vue' ;
14+ import { Note , NoteId } from ' @/domain/entities/Note.ts' ;
15+ import { computed , ref , watch } from ' vue' ;
2216import useNoteSettings from ' @/application/services/useNoteSettings.ts' ;
2317import { useAppState } from ' @/application/services/useAppState' ;
24- import { useI18n } from ' vue-i18n' ;
18+ import { ContextMenuItem , DefaultItem , Select } from ' codex-ui/vue' ;
19+ import useNote from ' @/application/services/useNote.ts' ;
2520
2621/**
2722 * TeamMember props
@@ -37,31 +32,38 @@ const props = defineProps<{
3732 noteId: NoteId ;
3833}>();
3934
40- const selectedRole = ref (MemberRole [props .teamMember .role ]);
35+ const selectedRole = ref <DefaultItem >({
36+ title: MemberRole [props .teamMember .role ],
37+ onActivate : () => {},
38+ });
4139
4240const roleOptions = computed (() => Object .values (MemberRole ).filter (value => typeof value === ' string' ));
41+ const roleItems: ContextMenuItem [] = [];
4342
44- const { changeRole } = useNoteSettings ();
43+ roleOptions .value .forEach ((role ) => {
44+ roleItems .push ({
45+ title: role .toString (),
46+ onActivate : () => {},
47+ });
48+ });
4549
50+ const { changeRole } = useNoteSettings ();
51+ const { note } = useNote ({ id: props .noteId });
4652const { user } = useAppState ();
4753
48- const { t } = useI18n ();
49-
54+ /* Watch role's update */
55+ watch (selectedRole , (newRole ) => {
56+ updateMemberRole (newRole .title );
57+ });
5058/**
5159 * Updates the user role if it has been changed
60+ *
61+ * @param updatedRole - new role needed to set
5262 */
53- async function updateMemberRole() {
54- changeRole (props .noteId , props .teamMember .user .id , MemberRole [selectedRole . value as keyof typeof MemberRole ]);
63+ async function updateMemberRole(updatedRole : string | any ) {
64+ changeRole (props .noteId , props .teamMember .user .id , MemberRole [updatedRole as keyof typeof MemberRole ]);
5565}
5666 </script >
5767
5868<style scoped>
59- .member {
60- margin-top : var (--spacing-l );
61- }
62- .member-name {
63- display : flex ;
64- align-items : center ;
65- gap : var (--spacing-very-x );
66- }
6769 </style >
0 commit comments