|
5 | 5 |
|
6 | 6 | let groupId = page.params.id;
|
7 | 7 |
|
8 |
| - let userId = 'user-1'; |
| 8 | + let userId = 'user-1'; |
9 | 9 |
|
10 | 10 | let group = $state({
|
11 | 11 | id: groupId,
|
12 | 12 | name: 'Design Team',
|
13 | 13 | avatar: 'https://i.pravatar.cc/150?img=15',
|
14 | 14 | description: 'Discuss all design-related tasks and updates here.',
|
15 | 15 | members: [
|
16 |
| - { id: 'user-1', name: 'Alice', avatar: 'https://i.pravatar.cc/150?img=1', role: 'owner' }, |
| 16 | + { |
| 17 | + id: 'user-1', |
| 18 | + name: 'Alice', |
| 19 | + avatar: 'https://i.pravatar.cc/150?img=1', |
| 20 | + role: 'owner' |
| 21 | + }, |
17 | 22 | { id: 'user-2', name: 'Bob', avatar: 'https://i.pravatar.cc/150?img=2', role: 'admin' },
|
18 |
| - { id: 'user-3', name: 'Charlie', avatar: 'https://i.pravatar.cc/150?img=3', role: 'member' } |
| 23 | + { |
| 24 | + id: 'user-3', |
| 25 | + name: 'Charlie', |
| 26 | + avatar: 'https://i.pravatar.cc/150?img=3', |
| 27 | + role: 'member' |
| 28 | + } |
19 | 29 | ]
|
20 | 30 | });
|
21 | 31 |
|
|
25 | 35 | return group.members.find((m) => m.id === userId)?.role;
|
26 | 36 | }
|
27 | 37 |
|
28 |
| - function canManage(member: { id?: string; name?: string; avatar?: string; role: any; }) { |
| 38 | + function canManage(member: { id?: string; name?: string; avatar?: string; role: any }) { |
29 | 39 | const current = currentUserRole();
|
30 | 40 | if (member.role === 'owner') return false;
|
31 | 41 | if (current === 'owner') return true;
|
|
58 | 68 | }
|
59 | 69 | </script>
|
60 | 70 |
|
61 |
| -<section class="mx-auto w-full h-[80vh] flex flex-col justify-between"> |
| 71 | +<section class="mx-auto flex h-[80vh] w-full flex-col justify-between"> |
62 | 72 | <div>
|
63 |
| - <div class="flex items-center gap-4 mb-6"> |
64 |
| - <Avatar src={group.avatar} /> |
65 |
| - <div> |
66 |
| - <h1 class="text-xl font-semibold">{group.name}</h1> |
67 |
| - <p class="text-sm text-gray-600">{group.description}</p> |
| 73 | + <div class="mb-6 flex items-center gap-4"> |
| 74 | + <Avatar src={group.avatar} /> |
| 75 | + <div> |
| 76 | + <h1 class="text-xl font-semibold">{group.name}</h1> |
| 77 | + <p class="text-sm text-gray-600">{group.description}</p> |
| 78 | + </div> |
68 | 79 | </div>
|
69 |
| - </div> |
70 | 80 |
|
71 |
| - <div class="space-y-6"> |
72 |
| - {#each group.members as member (member.id)} |
73 |
| - <div class="flex items-center justify-between"> |
74 |
| - <div class="flex items-center gap-3"> |
75 |
| - <Avatar src={member.avatar} size="sm" /> |
76 |
| - <div> |
77 |
| - <p class="text-sm font-medium">{member.name}</p> |
78 |
| - {#if member.role !== 'member'} |
79 |
| - <p class="text-xs text-gray-500">{member.role}</p> |
80 |
| - {/if} |
| 81 | + <div class="space-y-6"> |
| 82 | + {#each group.members as member (member.id)} |
| 83 | + <div class="flex items-center justify-between"> |
| 84 | + <div class="flex items-center gap-3"> |
| 85 | + <Avatar src={member.avatar} size="sm" /> |
| 86 | + <div> |
| 87 | + <p class="text-sm font-medium">{member.name}</p> |
| 88 | + {#if member.role !== 'member'} |
| 89 | + <p class="text-xs text-gray-500">{member.role}</p> |
| 90 | + {/if} |
| 91 | + </div> |
81 | 92 | </div>
|
82 |
| - </div> |
83 | 93 |
|
84 |
| - {#if canManage(member)} |
85 |
| - <div class="relative" use:clickOutside={() => (openMenuId = null)}> |
86 |
| - <button |
87 |
| - onclick={() => (openMenuId = openMenuId === member.id ? null : member.id)} |
88 |
| - > |
89 |
| - ⋮ |
90 |
| - </button> |
| 94 | + {#if canManage(member)} |
| 95 | + <div class="relative" use:clickOutside={() => (openMenuId = null)}> |
| 96 | + <button |
| 97 | + onclick={() => |
| 98 | + (openMenuId = openMenuId === member.id ? null : member.id)} |
| 99 | + > |
| 100 | + ⋮ |
| 101 | + </button> |
91 | 102 |
|
92 |
| - {#if openMenuId === member.id} |
93 |
| - <div class="absolute right-0 mt-2 w-40 rounded-md bg-white shadow-lg border z-10"> |
94 |
| - <!-- svelte-ignore a11y_click_events_have_key_events --> |
95 |
| - <ul class="text-sm"> |
96 |
| - {#if currentUserRole() === 'owner' && member.role === 'member'} |
| 103 | + {#if openMenuId === member.id} |
| 104 | + <div |
| 105 | + class="absolute right-0 z-10 mt-2 w-40 rounded-md border bg-white shadow-lg" |
| 106 | + > |
| 107 | + <!-- svelte-ignore a11y_click_events_have_key_events --> |
| 108 | + <ul class="text-sm"> |
| 109 | + {#if currentUserRole() === 'owner' && member.role === 'member'} |
| 110 | + <!-- svelte-ignore a11y_click_events_have_key_events --> |
| 111 | + <!-- svelte-ignore a11y_no_noninteractive_element_interactions --> |
| 112 | + <li |
| 113 | + class="cursor-pointer px-4 py-2 hover:bg-gray-100" |
| 114 | + onclick={() => promoteToAdmin(member.id)} |
| 115 | + > |
| 116 | + Make admin |
| 117 | + </li> |
| 118 | + {/if} |
97 | 119 | <!-- svelte-ignore a11y_click_events_have_key_events -->
|
98 | 120 | <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
|
99 | 121 | <li
|
100 |
| - class="px-4 py-2 hover:bg-gray-100 cursor-pointer" |
101 |
| - onclick={() => promoteToAdmin(member.id)} |
| 122 | + class="cursor-pointer px-4 py-2 text-red-600 hover:bg-red-50" |
| 123 | + onclick={() => removeMember(member.id)} |
102 | 124 | >
|
103 |
| - Make admin |
| 125 | + Remove member |
104 | 126 | </li>
|
105 |
| - {/if} |
106 |
| - <!-- svelte-ignore a11y_click_events_have_key_events --> |
107 |
| - <!-- svelte-ignore a11y_no_noninteractive_element_interactions --> |
108 |
| - <li |
109 |
| - class="px-4 py-2 hover:bg-red-50 text-red-600 cursor-pointer" |
110 |
| - onclick={() => removeMember(member.id)} |
111 |
| - > |
112 |
| - Remove member |
113 |
| - </li> |
114 |
| - </ul> |
115 |
| - </div> |
116 |
| - {/if} |
117 |
| - </div> |
118 |
| - {/if} |
119 |
| - </div> |
120 |
| - {/each} |
121 |
| - </div> |
| 127 | + </ul> |
| 128 | + </div> |
| 129 | + {/if} |
| 130 | + </div> |
| 131 | + {/if} |
| 132 | + </div> |
| 133 | + {/each} |
| 134 | + </div> |
122 | 135 | </div>
|
123 | 136 |
|
124 | 137 | <div class="flex justify-center">
|
125 |
| - <Button size="sm" variant="secondary" class="mt-6" callback={addMember}> |
126 |
| - Add Member |
127 |
| - </Button> |
| 138 | + <Button size="sm" variant="secondary" class="mt-6" callback={addMember}>Add Member</Button> |
128 | 139 | </div>
|
129 | 140 | </section>
|
0 commit comments