Skip to content

Commit f89f673

Browse files
committed
feat(frontend): add validation for period start date
1 parent 16b0f55 commit f89f673

File tree

3 files changed

+28
-13
lines changed

3 files changed

+28
-13
lines changed

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

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useForm } from "@mantine/form";
2-
import { Button, Flex, formatDate, getNext, MonthPicker, Stack, TextInput } from "@quassel/ui";
2+
import { Button, Flex, formatDate, getNext, InputError, MonthPicker, Stack, TextInput } from "@quassel/ui";
33
import { i18n } from "../../stores/i18n";
44
import { useStore } from "@nanostores/react";
55
import { useEffect } from "react";
@@ -20,6 +20,7 @@ type PeriodFormProps = {
2020
const messages = i18n("periodForm", {
2121
labelTitle: "Title",
2222
defaultTitle: params("Period ({start} - {end})"),
23+
validationStartDate: "There are no gaps allowed between questionnaires. The questionnaire must start when the previous ended.",
2324
});
2425

2526
export function PeriodForm({ onSave, actionLabel, period, prevEndDate }: PeriodFormProps) {
@@ -30,6 +31,16 @@ export function PeriodForm({ onSave, actionLabel, period, prevEndDate }: PeriodF
3031
range: [prevEndDate ? getNext("month", prevEndDate) : null, null],
3132
title: "",
3233
},
34+
validate: {
35+
range([start]) {
36+
console.log(start);
37+
console.log(prevEndDate && getNext("month", prevEndDate));
38+
39+
if (prevEndDate && +getNext("month", prevEndDate) !== +start!) {
40+
return t.validationStartDate;
41+
}
42+
},
43+
},
3344
onValuesChange(newValues, prevValues) {
3445
const [newStart, newEnd] = newValues.range ?? [];
3546
const [prevStart, prevEnd] = prevValues.range ?? [];
@@ -51,17 +62,20 @@ export function PeriodForm({ onSave, actionLabel, period, prevEndDate }: PeriodF
5162
<form onSubmit={f.onSubmit((values) => onSave(values))}>
5263
<Stack>
5364
<Flex justify="center">
54-
<MonthPicker
55-
{...f.getInputProps("range")}
56-
size="md"
57-
type="range"
58-
minDate={prevEndDate}
59-
defaultDate={prevEndDate}
60-
numberOfColumns={2}
61-
columnsToScroll={1}
62-
allowSingleDateInRange
63-
selectEndOfMonth
64-
/>
65+
<Stack>
66+
<MonthPicker
67+
{...f.getInputProps("range")}
68+
size="md"
69+
type="range"
70+
minDate={prevEndDate}
71+
defaultDate={prevEndDate}
72+
numberOfColumns={2}
73+
columnsToScroll={1}
74+
allowSingleDateInRange
75+
selectEndOfMonth
76+
/>
77+
<InputError>{f.getInputProps("range").error}</InputError>
78+
</Stack>
6579
</Flex>
6680
<TextInput {...f.getInputProps("title")} label={t.labelTitle} />
6781
<Button type="submit">{actionLabel}</Button>

libs/ui/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export {
4747
Divider,
4848
Flex,
4949
Group,
50+
InputError,
5051
Modal,
5152
NavLink,
5253
Paper,

libs/ui/src/utils/date.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export function formatDate(date: Date, dayjsFormatTemplate: string) {
77
export const getTime = (date: Date) => formatDate(date, "HH:mm");
88

99
export const getNext = (unit: dayjs.ManipulateType, date: Date) => {
10-
return dayjs(date).add(1, unit).startOf(unit).toDate();
10+
return dayjs(date).utc().add(1, unit).startOf(unit).toDate();
1111
};
1212

1313
export function getDateFromTimeAndWeekday(time: string, weekday: number) {

0 commit comments

Comments
 (0)