44 :caption =" t('noteSettings.team.caption')"
55 >
66 <Row
7- v-for =" (member, memberIndex) in team "
7+ v-for =" (member, memberIndex) in sortedTeam "
88 :key =" member.id"
99 :title =" member.user.name || member.user.email"
10- :has-delimiter =" memberIndex !== team .length - 1"
10+ :has-delimiter =" memberIndex !== sortedTeam .length - 1"
1111 data-dimensions =" medium"
1212 >
1313 <template #right >
3333</template >
3434
3535<script setup lang="ts">
36- import { Team } from ' @/domain/entities/Team' ;
37- import { NoteId } from ' @/domain/entities/Note' ;
36+ import { computed } from ' vue' ;
37+ import { Team , MemberRole } from ' @/domain/entities/Team' ;
38+ import { Note , NoteId } from ' @/domain/entities/Note' ;
3839import { Section , Row , Avatar } from ' codex-ui/vue' ;
3940import RoleSelect from ' ./RoleSelect.vue' ;
4041import { useI18n } from ' vue-i18n' ;
42+ import useNote from ' @/application/services/useNote.ts' ;
4143
42- defineProps <{
44+ const props = defineProps <{
4345 /**
4446 * Team of the current note
4547 */
@@ -51,6 +53,32 @@ defineProps<{
5153}>();
5254
5355const { t } = useI18n ();
56+ const { note } = useNote ({ id: props .noteId });
57+
58+ const sortedTeam = computed (() => {
59+ if (! note .value ) {
60+ return props .team ;
61+ }
62+
63+ return [... props .team ].sort ((a , b ) => {
64+ const isCreatorA = a .user .id === (note .value as Note ).creatorId ;
65+ const isCreatorB = b .user .id === (note .value as Note ).creatorId ;
66+
67+ if (isCreatorA ) {
68+ return - 1 ;
69+ }
70+ if (isCreatorB ) {
71+ return 1 ;
72+ }
73+
74+ const roleOrder = {
75+ [MemberRole .Write ]: 0 ,
76+ [MemberRole .Read ]: 1 ,
77+ };
78+
79+ return roleOrder [a .role ] - roleOrder [b .role ];
80+ });
81+ });
5482 </script >
5583
5684<style scoped>
0 commit comments