Skip to content

Commit 9faa0f6

Browse files
feat: add project members settings page
1 parent 744c92f commit 9faa0f6

File tree

3 files changed

+71
-2
lines changed

3 files changed

+71
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script lang="ts">
2+
import { Skeleton } from "$lib/components/primitives/skeleton";
3+
</script>
4+
5+
<div class="flex flex-col md:flex-row items-center justify-between px-4 gap-4">
6+
<div class="flex flex-col gap-1">
7+
<Skeleton class="h-6 w-40 rounded-full" />
8+
<Skeleton class="h-5 w-52 rounded-full" />
9+
</div>
10+
<Skeleton class="h-7 w-40 rounded-full" />
11+
</div>

src/routes/project/[projectId]/settings/members/+page.svelte

+45-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
<script lang="ts">
2+
import ProjectMemberListEntry from "$lib/components/composites/project-components/settings/ProjectMemberListEntry.svelte";
3+
import ProjectMemberListEntrySkeleton from "$lib/components/composites/project-components/settings/ProjectMemberListEntrySkeleton.svelte";
24
import ProjectSettingsLayout from "$lib/components/composites/project-components/settings/ProjectSettingsLayout.svelte";
5+
import Button from "$lib/components/primitives/button/button.svelte";
6+
import Separator from "$lib/components/primitives/separator/separator.svelte";
37
48
let { data } = $props();
5-
const { projectId, loadingProject } = data;
9+
const { user, projectId, loadingProject, loadingMembers } = data;
10+
const numberOfSkeletons = 7;
611
</script>
712

813
<svelte:head>
@@ -15,4 +20,42 @@
1520
{/await}
1621
</svelte:head>
1722

18-
<ProjectSettingsLayout {projectId} selectedTab="members">Members content</ProjectSettingsLayout>
23+
<ProjectSettingsLayout {projectId} selectedTab="members">
24+
{#if user.isAdmin}
25+
<div class="flex flex-row items-center justify-between">
26+
<h1>Manage Access</h1>
27+
<Button>Add User</Button>
28+
</div>
29+
{:else}
30+
<h1>Members</h1>
31+
{/if}
32+
<div class="flex flex-col w-full h-fit rounded-md border gap-3 py-2.5">
33+
{#await loadingMembers}
34+
{#each { length: numberOfSkeletons }, i}
35+
<ProjectMemberListEntrySkeleton />
36+
{#if i < numberOfSkeletons - 1}
37+
<Separator />
38+
{/if}
39+
{/each}
40+
{:then members}
41+
{#each members as member, i}
42+
<!-- TODO: Replace isInvitationPending with actual value -->
43+
<ProjectMemberListEntry
44+
{member}
45+
isCurrentUser={member.id === user.id}
46+
isInvitationPending={i === 2}
47+
isAdminView={user.isAdmin}
48+
/>
49+
{#if i < members.length - 1}
50+
<Separator />
51+
{/if}
52+
{/each}
53+
{:catch error}
54+
<div class="m-auto py-4">
55+
<span class="text-error">
56+
Loading Project Members failed{error ? `: ${error.message}` : "."}
57+
</span>
58+
</div>
59+
{/await}
60+
</div>
61+
</ProjectSettingsLayout>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { BackendController } from "$lib/controller/backend-controller";
2+
import type { PageLoad } from "./$types";
3+
4+
export const load: PageLoad = ({ params }) => {
5+
const projectId = Number(params.projectId);
6+
const projectController = BackendController.getInstance().project(projectId);
7+
const loadingMembers = projectController.getMembers();
8+
9+
// attach noop-catch to handle promise rejection correctly (see https://svelte.dev/docs/kit/load#Streaming-with-promises)
10+
loadingMembers.catch(() => {});
11+
12+
return {
13+
loadingMembers,
14+
};
15+
};

0 commit comments

Comments
 (0)