Skip to content

Commit 05d651e

Browse files
committed
feat: allow clearing all entries from a questionnaire
1 parent 2af058e commit 05d651e

File tree

5 files changed

+51
-6
lines changed

5 files changed

+51
-6
lines changed

apps/backend/src/research/entries/entries.controller.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Body, Controller, Delete, Get, Param, Patch, Post } from "@nestjs/common";
2-
import { ApiTags, ApiOperation, ApiUnprocessableEntityResponse } from "@nestjs/swagger";
1+
import { Body, Controller, Delete, Get, Param, Patch, Post, Query } from "@nestjs/common";
2+
import { ApiTags, ApiOperation, ApiUnprocessableEntityResponse, ApiQuery } from "@nestjs/swagger";
33
import { ErrorResponseDto } from "../../common/dto/error.dto";
44
import { EntriesService } from "./entries.service";
55
import { EntryCreationDto, EntryResponseDto, EntryMutationDto } from "./entry.dto";
@@ -44,4 +44,11 @@ export class EntriesController {
4444
delete(@Param("id") id: string) {
4545
return this.entriesService.remove(+id);
4646
}
47+
48+
@Delete()
49+
@ApiQuery({ name: "questionnaireId", required: true, type: Number })
50+
@ApiOperation({ summary: "Delete all entries of a questionnaire" })
51+
deleteAll(@Query("questionnaireId") questionnaireId: number) {
52+
return this.entriesService.removeAllFromQuestionnaire(questionnaireId);
53+
}
4754
}

apps/backend/src/research/entries/entries.service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,4 +79,8 @@ export class EntriesService {
7979
remove(id: number) {
8080
return this.em.remove(this.entryRepository.getReference(id)).flush();
8181
}
82+
83+
removeAllFromQuestionnaire(questionnaireId: number) {
84+
return this.entryRepository.nativeDelete({ questionnaire: questionnaireId });
85+
}
8286
}

apps/frontend/src/api.gen.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,8 @@ export interface paths {
268268
put?: never;
269269
/** Create a entry */
270270
post: operations["EntriesController_create"];
271-
delete?: never;
271+
/** Delete all entries of a questionnaire */
272+
delete: operations["EntriesController_deleteAll"];
272273
options?: never;
273274
head?: never;
274275
patch?: never;
@@ -1842,6 +1843,27 @@ export interface operations {
18421843
};
18431844
};
18441845
};
1846+
EntriesController_deleteAll: {
1847+
parameters: {
1848+
query: {
1849+
questionnaireId: number;
1850+
};
1851+
header?: never;
1852+
path?: never;
1853+
cookie?: never;
1854+
};
1855+
requestBody?: never;
1856+
responses: {
1857+
200: {
1858+
headers: {
1859+
[name: string]: unknown;
1860+
};
1861+
content: {
1862+
"application/json": number;
1863+
};
1864+
};
1865+
};
1866+
};
18451867
EntriesController_get: {
18461868
parameters: {
18471869
query?: never;

apps/frontend/src/routes/_auth/questionnaire/_questionnaire/$id/entries.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Button, Group, Modal, Stack, Title, useDisclosure, useForm } from "@quassel/ui";
1+
import { Button, Group, IconClearAll, Modal, Stack, Title, useDisclosure, useForm } from "@quassel/ui";
22
import { createFileRoute, Link, useNavigate } from "@tanstack/react-router";
33
import { i18n } from "../../../../../stores/i18n";
44
import { useStore } from "@nanostores/react";
@@ -25,7 +25,9 @@ export function Entries() {
2525

2626
const t = useStore(messages);
2727

28-
const { data: questionnaire } = $api.useSuspenseQuery("get", "/questionnaires/{id}", { params: { path: p } });
28+
const { data: questionnaire, refetch } = $api.useSuspenseQuery("get", "/questionnaires/{id}", { params: { path: p } });
29+
30+
const removeAllEntriesMutation = $api.useMutation("delete", "/entries", { onSuccess: () => refetch() });
2931

3032
const [gaps, setGaps] = useState<GapsPerDay>();
3133
const [highlightGaps, setHighlightGaps] = useState(false);
@@ -50,6 +52,10 @@ export function Entries() {
5052
n({ to: "/questionnaire/$id/remarks", params: p });
5153
};
5254

55+
const handleClearEntries = () => {
56+
removeAllEntriesMutation.mutate({ params: { query: { questionnaireId: questionnaire.id } } });
57+
};
58+
5359
useEffect(() => {
5460
f.setValues({ entries: questionnaire.entries });
5561

@@ -75,7 +81,12 @@ export function Entries() {
7581
</Modal>
7682
<form onSubmit={f.onSubmit(handleSubmit, open)}>
7783
<Stack>
78-
<Title order={3}>{questionnaire.title}</Title>
84+
<Group justify="space-between">
85+
<Title order={3}>{questionnaire.title}</Title>
86+
<Button variant="default" onClick={handleClearEntries} rightSection={<IconClearAll />}>
87+
Clear all
88+
</Button>
89+
</Group>
7990
<QuestionnaireEntries gaps={highlightGaps ? gaps : undefined} questionnaire={questionnaire} />
8091

8192
<Group>

libs/ui/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ export {
123123
IconReportAnalytics,
124124
IconX,
125125
IconInfoCircle,
126+
IconClearAll,
126127
} from "@tabler/icons-react";
127128

128129
export { uzhColors } from "./theme/uzh";

0 commit comments

Comments
 (0)