Skip to content

Commit a8419c7

Browse files
committed
feat: add create entry logic
1 parent 64f8ca1 commit a8419c7

File tree

2 files changed

+45
-18
lines changed

2 files changed

+45
-18
lines changed

apps/frontend/src/components/questionnaire/calendar/EntryForm.tsx

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import { useEffect } from "react";
66
import { CarerSelect } from "../../CarerSelect";
77
import { LanguageSelect } from "../../LanguageSelect";
88

9-
type FormValues = {
10-
carerId?: number;
11-
languageEntries: {
9+
export type EntryFormValues = {
10+
carer?: number;
11+
entryLanguages: {
1212
ratio: number;
13-
languageId?: number;
13+
language?: number;
1414
}[];
1515
startedAt: string;
1616
endedAt: string;
@@ -26,18 +26,18 @@ const messages = i18n("entityForm", {
2626
});
2727

2828
type EntityFormProps = {
29-
onSave: (entity: FormValues) => void;
30-
entry?: Partial<FormValues>;
29+
onSave: (entity: EntryFormValues) => void;
30+
entry?: Partial<EntryFormValues>;
3131
actionLabel: string;
3232
};
3333

3434
export function EntityForm({ onSave, actionLabel, entry }: EntityFormProps) {
3535
const t = useStore(messages);
36-
const f = useForm<FormValues>({
36+
const f = useForm<EntryFormValues>({
3737
initialValues: {
3838
startedAt: "",
3939
endedAt: "",
40-
languageEntries: [
40+
entryLanguages: [
4141
{
4242
ratio: 100,
4343
},
@@ -46,16 +46,16 @@ export function EntityForm({ onSave, actionLabel, entry }: EntityFormProps) {
4646
validate: {
4747
startedAt: isNotEmpty(t.validationNotEmpty),
4848
endedAt: isNotEmpty(t.validationNotEmpty),
49-
carerId: isNotEmpty(t.validationNotEmpty),
50-
languageEntries: {
49+
carer: isNotEmpty(t.validationNotEmpty),
50+
entryLanguages: {
5151
ratio: (value) => {
5252
const fieldError = isInRange({ min: 1, max: 100 }, t.validationRatio)(value);
5353
if (fieldError) return fieldError;
5454

5555
const listError = getTotalRatio() !== 100;
5656
if (listError) return t.validationTotalRatio;
5757
},
58-
languageId: isNotEmpty(t.validationNotEmpty),
58+
language: isNotEmpty(t.validationNotEmpty),
5959
},
6060
},
6161
});
@@ -67,16 +67,16 @@ export function EntityForm({ onSave, actionLabel, entry }: EntityFormProps) {
6767
}
6868
}, [entry]);
6969

70-
const getTotalRatio = () => f.getValues().languageEntries.reduce((acc, cur) => (acc += cur.ratio), 0);
70+
const getTotalRatio = () => f.getValues().entryLanguages.reduce((acc, cur) => (acc += cur.ratio), 0);
7171

7272
const updateRatios = () => {
73-
const currentEntries = f.getValues().languageEntries;
73+
const currentEntries = f.getValues().entryLanguages;
7474
const lastEntryIndex = currentEntries.length - 1;
7575

7676
const avarageRatio = Math.round(100 / currentEntries.length);
7777

7878
f.setValues({
79-
languageEntries: currentEntries.map((entry, index) => ({
79+
entryLanguages: currentEntries.map((entry, index) => ({
8080
...entry,
8181
ratio: index === lastEntryIndex ? 100 - lastEntryIndex * avarageRatio : avarageRatio,
8282
})),
@@ -88,7 +88,7 @@ export function EntityForm({ onSave, actionLabel, entry }: EntityFormProps) {
8888
<Stack>
8989
<CarerSelect {...f.getInputProps("carerId")} placeholder={t.labelCarer} />
9090

91-
{f.getValues().languageEntries.map((_, index) => (
91+
{f.getValues().entryLanguages.map((_, index) => (
9292
// TODO: make key either languageId or name of new language entry
9393
<Group key={`entry-${index}`} justify="stretch">
9494
<NumberInput {...f.getInputProps(`languageEntries.${index}.ratio`)} max={100} min={1} w={80} rightSection="%" />

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

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import interactionPlugin from "@fullcalendar/interaction";
1010
import { useSuspenseQuery } from "@tanstack/react-query";
1111
import { components } from "../../../../../api.gen";
1212
import { QuestionnaireEntry } from "../../../../../components/questionnaire/calendar/QuestionnaireEntry";
13-
import { EntityForm } from "../../../../../components/questionnaire/calendar/EntryForm";
13+
import { EntityForm, EntryFormValues } from "../../../../../components/questionnaire/calendar/EntryForm";
1414
import { useState } from "react";
1515

1616
export type ExtendedEvent = EventInput & { extendedProps: { entryLanguages: components["schemas"]["EntryLanguageResponseDto"][] } };
@@ -44,8 +44,12 @@ function QuestionnaireEntries() {
4444

4545
const [selectedStartTime, setSelectedStartTime] = useState<string>();
4646
const [selectedEndTime, setSelectedEndTime] = useState<string>();
47+
const [selectedWeekday, setSelectedWeekday] = useState<number>();
4748

48-
const { data: questionnaire } = useSuspenseQuery($api.queryOptions("get", "/questionnaires/{id}", { params: { path: { id: p.id } } }));
49+
const createMutation = $api.useMutation("post", "/entries");
50+
const { data: questionnaire, refetch } = useSuspenseQuery(
51+
$api.queryOptions("get", "/questionnaires/{id}", { params: { path: { id: p.id } } })
52+
);
4953

5054
const events: ExtendedEvent[] =
5155
questionnaire.entries?.map(({ startedAt, endedAt, weekday, carer, entryLanguages }) => ({
@@ -56,6 +60,28 @@ function QuestionnaireEntries() {
5660
backgroundColor: theme.colors[theme.primaryColor][4],
5761
})) ?? [];
5862

63+
const handleAddEntry = ({ entryLanguages, carer, ...rest }: EntryFormValues) => {
64+
if (selectedWeekday === undefined) return;
65+
66+
createMutation.mutate(
67+
{
68+
body: {
69+
...rest,
70+
carer: carer!,
71+
entryLanguages: entryLanguages.map(({ ratio, language: languageId }) => ({ language: languageId!, ratio })),
72+
weekday: selectedWeekday,
73+
questionnaire: questionnaire.id,
74+
},
75+
},
76+
{
77+
onSuccess() {
78+
refetch();
79+
close();
80+
},
81+
}
82+
);
83+
};
84+
5985
const handleSubmit = () => {
6086
n({ to: "/questionnaire/$id/remarks", params: p });
6187
};
@@ -64,7 +90,7 @@ function QuestionnaireEntries() {
6490
<>
6591
<Modal opened={opened} onClose={close} size="md">
6692
<EntityForm
67-
onSave={console.log}
93+
onSave={handleAddEntry}
6894
entry={!!selectedStartTime && !!selectedEndTime ? { startedAt: selectedStartTime, endedAt: selectedEndTime } : undefined}
6995
actionLabel={t.addEntityLabel}
7096
/>
@@ -80,6 +106,7 @@ function QuestionnaireEntries() {
80106
select={(args) => {
81107
setSelectedStartTime(getTime(args.start));
82108
setSelectedEndTime(getTime(args.end));
109+
setSelectedWeekday(args.start.getDay());
83110
open();
84111
}}
85112
eventContent={({ event }) => <QuestionnaireEntry event={event} />}

0 commit comments

Comments
 (0)