Skip to content

Commit 4174115

Browse files
committed
feat: implement period edit page
1 parent 239c2d5 commit 4174115

File tree

2 files changed

+50
-9
lines changed

2 files changed

+50
-9
lines changed

apps/frontend/src/components/questionnaire/PeriodForm.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Button, Flex, MonthPicker, Stack, TextInput } from "@quassel/ui";
33
import { i18n } from "../../stores/i18n";
44
import { useStore } from "@nanostores/react";
55
import dayjs from "dayjs";
6+
import { useEffect } from "react";
67

78
export type PeriodFormValues = {
89
title: string;
@@ -11,25 +12,33 @@ export type PeriodFormValues = {
1112

1213
type PeriodFormProps = {
1314
onSave: (form: PeriodFormValues) => void;
15+
period?: PeriodFormValues;
1416
actionLabel: string;
1517
};
1618

1719
export const messages = i18n("periodForm", {
1820
labelTitle: "Title",
1921
});
2022

21-
export function PeriodForm({ onSave, actionLabel }: PeriodFormProps) {
23+
export function PeriodForm({ onSave, actionLabel, period }: PeriodFormProps) {
2224
const t = useStore(messages);
2325

2426
const f = useForm<PeriodFormValues>({
25-
mode: "uncontrolled",
27+
initialValues: period,
2628
transformValues(values) {
2729
values.range[1] = dayjs(values.range[1]).utc().endOf("month").toDate();
2830

2931
return values;
3032
},
3133
});
3234

35+
useEffect(() => {
36+
if (period) {
37+
f.setValues(period);
38+
f.resetDirty();
39+
}
40+
}, [period]);
41+
3342
return (
3443
<form onSubmit={f.onSubmit((values) => onSave(values))}>
3544
<Stack>
Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import { Button } from "@quassel/ui";
21
import { createFileRoute, useNavigate } from "@tanstack/react-router";
32
import { i18n } from "../../../../../stores/i18n";
43
import { useStore } from "@nanostores/react";
4+
import { PeriodForm, PeriodFormValues } from "../../../../../components/questionnaire/PeriodForm";
5+
import { $api } from "../../../../../stores/api";
6+
import { useSuspenseQuery } from "@tanstack/react-query";
57

68
export const messages = i18n("questionnairePeriod", {
79
title: "Period",
@@ -10,24 +12,54 @@ export const messages = i18n("questionnairePeriod", {
1012

1113
function QuestionnairePeriod() {
1214
const n = useNavigate();
13-
const p = Route.useParams();
15+
const { id } = Route.useParams();
1416

1517
const t = useStore(messages);
1618

17-
const handleSubmit = () => {
18-
n({ to: "/questionnaire/$id/entries", params: p });
19+
const { data: questionnaire } = useSuspenseQuery(
20+
$api.queryOptions("get", "/questionnaires/{id}", {
21+
params: { path: { id } },
22+
})
23+
);
24+
25+
const period: PeriodFormValues = {
26+
title: questionnaire.title!,
27+
range: [new Date(Date.parse(questionnaire.startedAt!)), new Date(Date.parse(questionnaire.endedAt!))],
28+
};
29+
30+
const updateQuestionnaireMutation = $api.useMutation("patch", "/questionnaires/{id}");
31+
32+
const onSave = async (form: PeriodFormValues) => {
33+
const {
34+
title,
35+
range: [localStartedAt, localEndedAt],
36+
} = form;
37+
38+
const startedAt = localStartedAt.toISOString();
39+
const endedAt = localEndedAt.toISOString();
40+
41+
await updateQuestionnaireMutation.mutateAsync({
42+
params: { path: { id } },
43+
body: { title, startedAt, endedAt },
44+
});
45+
46+
n({ to: "/questionnaire/$id/entries", params: { id } });
1947
};
2048

2149
return (
2250
<>
2351
<h3>{t.title}</h3>
24-
<form onSubmit={handleSubmit}>
25-
<Button type="submit">{t.formAction}</Button>
26-
</form>
52+
<PeriodForm onSave={onSave} period={period} actionLabel={t.formAction} />
2753
</>
2854
);
2955
}
3056

3157
export const Route = createFileRoute("/_auth/questionnaire/_questionnaire/$id/period")({
58+
loader: ({ params, context: { queryClient } }) =>
59+
queryClient.ensureQueryData(
60+
$api.queryOptions("get", "/questionnaires/{id}", {
61+
params: { path: { id: params.id } },
62+
})
63+
),
3264
component: QuestionnairePeriod,
3365
});

0 commit comments

Comments
 (0)