Skip to content

Commit f85465f

Browse files
authored
Merge pull request #197 from openscript-ch/35-implement-roles-admin-admin-without-deletion-cap
feat: disable delete for assistants
2 parents 2b9c43b + b626527 commit f85465f

File tree

8 files changed

+91
-58
lines changed

8 files changed

+91
-58
lines changed

.changeset/lovely-dolphins-tickle.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@quassel/frontend": patch
3+
---
4+
5+
Disable delete for assistants

apps/frontend/src/routes/_auth/administration/carers/index.tsx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import { createFileRoute, Link } from "@tanstack/react-router";
22
import { $api } from "../../../../stores/api";
33
import { Button, Table } from "@quassel/ui";
4+
import { $session } from "../../../../stores/session";
5+
import { useStore } from "@nanostores/react";
46

57
function AdministrationCarersIndex() {
8+
const sessionStore = useStore($session);
69
const carers = $api.useSuspenseQuery("get", "/carers");
710
const deleteCarerMutation = $api.useMutation("delete", "/carers/{id}", {
811
onSuccess: () => carers.refetch(),
@@ -29,16 +32,18 @@ function AdministrationCarersIndex() {
2932
<Button variant="default" renderRoot={(props) => <Link to={`/administration/carers/edit/${c.id}`} {...props} />}>
3033
Edit
3134
</Button>
32-
<Button
33-
variant="default"
34-
onClick={() =>
35-
deleteCarerMutation.mutate({
36-
params: { path: { id: c.id.toString() } },
37-
})
38-
}
39-
>
40-
Delete
41-
</Button>
35+
{sessionStore.role === "ADMIN" && (
36+
<Button
37+
variant="default"
38+
onClick={() =>
39+
deleteCarerMutation.mutate({
40+
params: { path: { id: c.id.toString() } },
41+
})
42+
}
43+
>
44+
Delete
45+
</Button>
46+
)}
4247
</Table.Td>
4348
</Table.Tr>
4449
))}

apps/frontend/src/routes/_auth/administration/languages/index.tsx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ import { createFileRoute, Link } from "@tanstack/react-router";
22
import { $api } from "../../../../stores/api";
33
import { Button, Table } from "@quassel/ui";
44
import { useSuspenseQuery } from "@tanstack/react-query";
5+
import { $session } from "../../../../stores/session";
6+
import { useStore } from "@nanostores/react";
57

68
function AdministrationLanguageIndex() {
9+
const sessionStore = useStore($session);
710
const languages = useSuspenseQuery($api.queryOptions("get", "/languages"));
811
const deleteLanguageMutation = $api.useMutation("delete", "/languages/{id}", {
912
onSuccess: () => languages.refetch(),
@@ -32,16 +35,18 @@ function AdministrationLanguageIndex() {
3235
<Button variant="default" renderRoot={(props) => <Link to={`/administration/languages/edit/${l.id}`} {...props} />}>
3336
Edit
3437
</Button>
35-
<Button
36-
variant="default"
37-
onClick={() =>
38-
deleteLanguageMutation.mutate({
39-
params: { path: { id: l.id.toString() } },
40-
})
41-
}
42-
>
43-
Delete
44-
</Button>
38+
{sessionStore.role === "ADMIN" && (
39+
<Button
40+
variant="default"
41+
onClick={() =>
42+
deleteLanguageMutation.mutate({
43+
params: { path: { id: l.id.toString() } },
44+
})
45+
}
46+
>
47+
Delete
48+
</Button>
49+
)}
4550
</Table.Td>
4651
</Table.Tr>
4752
))}

apps/frontend/src/routes/_auth/administration/participants/index.tsx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ import { createFileRoute, Link } from "@tanstack/react-router";
22
import { $api } from "../../../../stores/api";
33
import { Button, Table } from "@quassel/ui";
44
import { useSuspenseQuery } from "@tanstack/react-query";
5+
import { $session } from "../../../../stores/session";
6+
import { useStore } from "@nanostores/react";
57

68
function AdministrationParticipantsIndex() {
9+
const sessionStore = useStore($session);
710
const participants = useSuspenseQuery($api.queryOptions("get", "/participants"));
811
const deleteParticipantMutation = $api.useMutation("delete", "/participants/{id}", {
912
onSuccess: () => participants.refetch(),
@@ -34,16 +37,18 @@ function AdministrationParticipantsIndex() {
3437
<Button variant="default" renderRoot={(props) => <Link to={`/administration/participants/edit/${p.id}`} {...props} />}>
3538
Edit
3639
</Button>
37-
<Button
38-
variant="default"
39-
onClick={() =>
40-
deleteParticipantMutation.mutate({
41-
params: { path: { id: p.id.toString() } },
42-
})
43-
}
44-
>
45-
Delete
46-
</Button>
40+
{sessionStore.role === "ADMIN" && (
41+
<Button
42+
variant="default"
43+
onClick={() =>
44+
deleteParticipantMutation.mutate({
45+
params: { path: { id: p.id.toString() } },
46+
})
47+
}
48+
>
49+
Delete
50+
</Button>
51+
)}
4752
</Table.Td>
4853
</Table.Tr>
4954
))}

apps/frontend/src/routes/_auth/administration/questionnaires/index.tsx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import { createFileRoute, Link } from "@tanstack/react-router";
22
import { $api } from "../../../../stores/api";
33
import { Button, Table } from "@quassel/ui";
4+
import { $session } from "../../../../stores/session";
5+
import { useStore } from "@nanostores/react";
46

57
function AdministrationQuestionnairesIndex() {
8+
const sessionStore = useStore($session);
69
const { data, refetch } = $api.useSuspenseQuery("get", "/questionnaires");
710
const deleteQuestionnaireMutation = $api.useMutation("delete", "/questionnaires/{id}", {
811
onSuccess: () => refetch(),
@@ -25,16 +28,18 @@ function AdministrationQuestionnairesIndex() {
2528
<Button variant="default" renderRoot={(props) => <Link to={`/administration/questionnaires/edit/${q.id}`} {...props} />}>
2629
Edit
2730
</Button>
28-
<Button
29-
variant="default"
30-
onClick={() =>
31-
deleteQuestionnaireMutation.mutate({
32-
params: { path: { id: q.id.toString() } },
33-
})
34-
}
35-
>
36-
Delete
37-
</Button>
31+
{sessionStore.role === "ADMIN" && (
32+
<Button
33+
variant="default"
34+
onClick={() =>
35+
deleteQuestionnaireMutation.mutate({
36+
params: { path: { id: q.id.toString() } },
37+
})
38+
}
39+
>
40+
Delete
41+
</Button>
42+
)}
3843
</Table.Td>
3944
</Table.Tr>
4045
))}

apps/frontend/src/routes/_auth/administration/studies/index.tsx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ import { createFileRoute, Link } from "@tanstack/react-router";
22
import { $api } from "../../../../stores/api";
33
import { Button, Table } from "@quassel/ui";
44
import { useSuspenseQuery } from "@tanstack/react-query";
5+
import { $session } from "../../../../stores/session";
6+
import { useStore } from "@nanostores/react";
57

68
function AdministrationStudiesIndex() {
9+
const sessionStore = useStore($session);
710
const studies = useSuspenseQuery($api.queryOptions("get", "/studies"));
811
const deleteStudyMutation = $api.useMutation("delete", "/studies/{id}", {
912
onSuccess: () => studies.refetch(),
@@ -30,16 +33,18 @@ function AdministrationStudiesIndex() {
3033
<Button variant="default" renderRoot={(props) => <Link to={`/administration/studies/edit/${s.id}`} {...props} />}>
3134
Edit
3235
</Button>
33-
<Button
34-
variant="default"
35-
onClick={() =>
36-
deleteStudyMutation.mutate({
37-
params: { path: { id: s.id.toString() } },
38-
})
39-
}
40-
>
41-
Delete
42-
</Button>
36+
{sessionStore.role === "ADMIN" && (
37+
<Button
38+
variant="default"
39+
onClick={() =>
40+
deleteStudyMutation.mutate({
41+
params: { path: { id: s.id.toString() } },
42+
})
43+
}
44+
>
45+
Delete
46+
</Button>
47+
)}
4348
</Table.Td>
4449
</Table.Tr>
4550
))}

apps/frontend/src/routes/_auth/administration/users/index.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ import { createFileRoute, Link } from "@tanstack/react-router";
22
import { $api } from "../../../../stores/api";
33
import { Button, Table } from "@quassel/ui";
44
import { useSuspenseQuery } from "@tanstack/react-query";
5+
import { useStore } from "@nanostores/react";
6+
import { $session } from "../../../../stores/session";
57

68
function AdministrationUsersIndex() {
9+
const sessionStore = useStore($session);
710
const users = useSuspenseQuery($api.queryOptions("get", "/users"));
811
const deleteUserMutation = $api.useMutation("delete", "/users/{id}", { onSuccess: () => users.refetch() });
912

@@ -31,9 +34,11 @@ function AdministrationUsersIndex() {
3134
<Button variant="default" renderRoot={(props) => <Link to={`/administration/users/edit/${u.id}`} {...props} />}>
3235
Edit
3336
</Button>
34-
<Button variant="default" onClick={() => deleteUserMutation.mutate({ params: { path: { id: u.id.toString() } } })}>
35-
Delete
36-
</Button>
37+
{sessionStore.role === "ADMIN" && (
38+
<Button variant="default" onClick={() => deleteUserMutation.mutate({ params: { path: { id: u.id.toString() } } })}>
39+
Delete
40+
</Button>
41+
)}
3742
</Table.Td>
3843
</Table.Tr>
3944
))}

apps/frontend/src/stores/session.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import { persistentMap } from "@nanostores/persistent";
2+
import { components } from "../api.gen";
23

3-
type Session = {
4-
email?: string;
5-
role?: string;
6-
};
4+
type Session = Partial<Omit<components["schemas"]["SessionResponseDto"], "id">>;
75

8-
export const $session = persistentMap<Session>("session:", {});
6+
export const $session = persistentMap<Session>("session", {});

0 commit comments

Comments
 (0)