4
4
:caption =" t('noteSettings.team.caption')"
5
5
>
6
6
<Row
7
- v-for =" (member, memberIndex) in team "
7
+ v-for =" (member, memberIndex) in sortedTeam "
8
8
:key =" member.id"
9
9
:title =" member.user.name || member.user.email"
10
- :has-delimiter =" memberIndex !== team .length - 1"
10
+ :has-delimiter =" memberIndex !== sortedTeam .length - 1"
11
11
data-dimensions =" medium"
12
12
>
13
13
<template #right >
33
33
</template >
34
34
35
35
<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' ;
38
39
import { Section , Row , Avatar } from ' codex-ui/vue' ;
39
40
import RoleSelect from ' ./RoleSelect.vue' ;
40
41
import { useI18n } from ' vue-i18n' ;
42
+ import useNote from ' @/application/services/useNote.ts' ;
41
43
42
- defineProps <{
44
+ const props = defineProps <{
43
45
/**
44
46
* Team of the current note
45
47
*/
@@ -51,6 +53,32 @@ defineProps<{
51
53
}>();
52
54
53
55
const { 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
+ });
54
82
</script >
55
83
56
84
<style scoped>
0 commit comments