Skip to content

Commit b5b55f8

Browse files
committed
feat: handle remark form in questionnaire
1 parent a89c021 commit b5b55f8

File tree

2 files changed

+54
-11
lines changed

2 files changed

+54
-11
lines changed
Lines changed: 53 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,81 @@
1-
import { Button, Group } from "@quassel/ui";
1+
import { Button, Group, Stack, Textarea } from "@quassel/ui";
22
import { createFileRoute, Link, useNavigate } from "@tanstack/react-router";
33
import { i18n } from "../../../../../stores/i18n";
44
import { useStore } from "@nanostores/react";
5+
import { useForm } from "@mantine/form";
6+
import { $api } from "../../../../../stores/api";
7+
import { useEffect } from "react";
58

69
export const messages = i18n("questionnaireRemarks", {
710
title: "Add remarks",
11+
remarkDescription: "Use this field to point out any exceptions to the language exposure like vacations etc...",
812
backAction: "Back",
913
saveAction: "Save",
1014
formAction: "Save and complete",
1115
});
1216

17+
type FormValues = {
18+
remark: string;
19+
};
20+
1321
function QuestionnaireRemarks() {
1422
const n = useNavigate();
1523
const p = Route.useParams();
1624

1725
const t = useStore(messages);
1826

19-
const handleSubmit = () => {
27+
const f = useForm<FormValues>({
28+
initialValues: {
29+
remark: "",
30+
},
31+
});
32+
33+
const { data: questionnaire } = $api.useSuspenseQuery("get", "/questionnaires/{id}", { params: { path: { id: p.id } } });
34+
const updateMutation = $api.useMutation("patch", "/questionnaires/{id}");
35+
36+
useEffect(() => {
37+
if (questionnaire) {
38+
f.setValues(questionnaire);
39+
f.resetDirty();
40+
}
41+
}, [questionnaire]);
42+
43+
const onSave = (values: FormValues) => updateMutation.mutateAsync({ params: { path: p }, body: values });
44+
45+
const handleSubmit = async (values: FormValues) => {
46+
await onSave(values);
2047
n({ to: "/questionnaire/$id/overview", params: p });
2148
};
2249

2350
return (
24-
<form onSubmit={handleSubmit}>
25-
<h3>{t.title}</h3>
26-
<Group>
27-
<Link to="/questionnaire/$id/entries" params={p}>
28-
<Button variant="light">{t.backAction}</Button>
29-
</Link>
30-
<Button variant="outline">{t.saveAction}</Button>
31-
<Button type="submit">{t.formAction}</Button>
32-
</Group>
51+
<form onSubmit={f.onSubmit(handleSubmit)}>
52+
<Stack>
53+
<h3>{t.title}</h3>
54+
55+
<Textarea {...f.getInputProps("remark")} description={t.remarkDescription} rows={8} />
56+
57+
<Group>
58+
<Link to="/questionnaire/$id/entries" params={p}>
59+
<Button variant="light">{t.backAction}</Button>
60+
</Link>
61+
<Button variant="outline" onClick={() => onSave(f.getValues())} loading={updateMutation.isPending}>
62+
{t.saveAction}
63+
</Button>
64+
<Button type="submit" loading={updateMutation.isPending}>
65+
{t.formAction}
66+
</Button>
67+
</Group>
68+
</Stack>
3369
</form>
3470
);
3571
}
3672

3773
export const Route = createFileRoute("/_auth/questionnaire/_questionnaire/$id/remarks")({
74+
loader: ({ params, context: { queryClient } }) =>
75+
queryClient.ensureQueryData(
76+
$api.queryOptions("get", "/questionnaires/{id}", {
77+
params: { path: { id: params.id } },
78+
})
79+
),
3880
component: QuestionnaireRemarks,
3981
});

libs/ui/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export {
5656
Stack,
5757
Table,
5858
Text,
59+
Textarea,
5960
TextInput,
6061
NumberInput,
6162
Title,

0 commit comments

Comments
 (0)