From a2c9a9f2be26cc8d02b5c29fc5af2334ceb44bc3 Mon Sep 17 00:00:00 2001
From: Benjamin Frost
Date: Mon, 28 Oct 2024 14:27:13 +0100
Subject: [PATCH 1/9] feat: add registration page
---
src/pages/[lang]/anmeldung.astro | 47 ++++++++++++++++++++++++++++++++
1 file changed, 47 insertions(+)
create mode 100644 src/pages/[lang]/anmeldung.astro
diff --git a/src/pages/[lang]/anmeldung.astro b/src/pages/[lang]/anmeldung.astro
new file mode 100644
index 0000000..cb9fb51
--- /dev/null
+++ b/src/pages/[lang]/anmeldung.astro
@@ -0,0 +1,47 @@
+---
+import { InformationCircleIcon } from "@heroicons/react/20/solid";
+import NoTranslate from "~/components/NoTranslate.astro";
+import { localeParams } from "~/i18n";
+import Layout from "~/layouts/Layout.astro";
+
+export const getStaticPaths = localeParams;
+---
+
+
+
+
+
+
+ Anmeldung zur Deutschen Meisterschaft
+
+
+ Der Online-Wettkampf und die Deutschen Meisterschaften werden von allen
+ drei Skills gemeinsam durchgeführt. Die Aufteilung des Nationalteams auf
+ Skill 08, Skill 09 und Skill 17 erfolgt erst im
+ Februar 2025 im Rahmen eines Wettkampfes, also vor dem
+ internationalen Albert-Einstein-Cup.
Um teilzunehmen solltest
+ du mindestens eine Programmiersprache beherrschen, Android-Apps
+ programmieren können, grundlegende Kenntnisse in UML und Datenbanken
+ besitzen und englischsprachige Aufgabenstellungen verstehen können.
+
+
+
+
+
+
+
+
+ Bitte beachte, dass du im Wettkampfjahr 2025 nicht älter als
+ 22 Jahre werden darfst, d. h. Jahrgänge 01.01.2004 und
+ aufwärts.
+
There is currently no national team.{" "}
- Apply now!
+ Apply now!
)
diff --git a/src/pages/en/index.astro b/src/pages/en/index.astro
index aa741d6..703cfb9 100644
--- a/src/pages/en/index.astro
+++ b/src/pages/en/index.astro
@@ -95,7 +95,7 @@ const lang = (Astro.currentLocale || defaultLang) as Language;
subtitle="Have you always wanted to take part in a software development competition and compete with the best of the best? The next registration starts in November."
action={{
label: "Register now",
- url: getRelativeLocaleUrl(lang, "dm-registration"),
+ url: getRelativeLocaleUrl(lang, "anmeldung"),
}}
/>
diff --git a/src/pages/index.astro b/src/pages/index.astro
index 4057675..c3d8c7b 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -93,7 +93,7 @@ const lang = (Astro.currentLocale || defaultLang) as Language;
subtitle="Wolltest du schon immer an einem Wettbewerb im Bereich der Softwareentwicklung teilnehmen und dich mit den Besten der Besten messen? Die nächste Registrierung startet im November."
action={{
label: "Registriere dich jetzt",
- url: getRelativeLocaleUrl(lang, "dm-registration"),
+ url: getRelativeLocaleUrl(lang, "anmeldung"),
}}
/>
From 6d69e3f90b82dccb391b3eaba8fa6e4d4602443c Mon Sep 17 00:00:00 2001
From: Benjamin Frost <58258541+Benjamin-Frost@users.noreply.github.com>
Date: Mon, 28 Oct 2024 17:45:14 +0100
Subject: [PATCH 4/9] Apply suggestions from code review
Co-authored-by: Jonas Wanke
---
src/components/skill/SkillInformation.astro | 2 +-
src/pages/[lang]/anmeldung.astro | 18 +++++++-----------
src/pages/en/index.astro | 2 +-
src/pages/index.astro | 4 ++--
4 files changed, 11 insertions(+), 15 deletions(-)
diff --git a/src/components/skill/SkillInformation.astro b/src/components/skill/SkillInformation.astro
index 3cd1969..e1cde17 100644
--- a/src/components/skill/SkillInformation.astro
+++ b/src/components/skill/SkillInformation.astro
@@ -41,7 +41,7 @@ const t = useTranslations(lang);
})
}
- {t({ de: "Jetzt bewerben!", en: "Apply now!" })}
+ {t({ de: "Jetzt anmelden!", en: "Register now!" })}
diff --git a/src/pages/[lang]/anmeldung.astro b/src/pages/[lang]/anmeldung.astro
index 15c17b4..bc4508d 100644
--- a/src/pages/[lang]/anmeldung.astro
+++ b/src/pages/[lang]/anmeldung.astro
@@ -16,14 +16,11 @@ export const getStaticPaths = localeParams;
Anmeldung zur Deutschen Meisterschaft
- Der Online-Wettkampf und die Deutschen Meisterschaften werden von allen
- drei Skills gemeinsam durchgeführt. Die Aufteilung des Nationalteams auf
- Skill 08, Skill 09 und Skill 17 erfolgt erst im
- Februar 2025 im Rahmen eines Wettkampfes, also vor dem
- internationalen Albert-Einstein-Cup.
Um teilzunehmen solltest
- du mindestens eine Programmiersprache beherrschen, Android-Apps
- programmieren können, grundlegende Kenntnisse in UML und Datenbanken
- besitzen und englischsprachige Aufgabenstellungen verstehen können.
+ Der Online-Vorausscheid wird für alle drei Disziplinen gemeinsam
+ durchgeführt. Je nachdem, für welche Disziplin oder welche Disziplinen
+ du dich interessierst, bekommst du unterschiedliche Aufgaben.
Bei den Deutschen Meisterschaften im Juni tritt jede Person dann nur
+ noch in einer Disziplin an.
- Bitte beachte, dass du im Wettkampfjahr 2025 nicht älter als
- 22 Jahre werden darfst, d. h. Jahrgänge 01.01.2004 und
- aufwärts.
+ Es können nur Personen teilnehmen, die 2024 oder später geboren
+ sind.
diff --git a/src/pages/en/index.astro b/src/pages/en/index.astro
index 703cfb9..acb67cd 100644
--- a/src/pages/en/index.astro
+++ b/src/pages/en/index.astro
@@ -92,7 +92,7 @@ const lang = (Astro.currentLocale || defaultLang) as Language;
From 35716e80e587cf14528e9d59131ce6c771fbe006 Mon Sep 17 00:00:00 2001
From: Benjamin Frost
Date: Mon, 28 Oct 2024 18:16:02 +0100
Subject: [PATCH 5/9] feat: add translations for zod errors
---
src/components/forms/registration-form.tsx | 81 ++++++++++++++--------
1 file changed, 53 insertions(+), 28 deletions(-)
diff --git a/src/components/forms/registration-form.tsx b/src/components/forms/registration-form.tsx
index 1a89339..c0f2cc9 100644
--- a/src/components/forms/registration-form.tsx
+++ b/src/components/forms/registration-form.tsx
@@ -9,38 +9,63 @@ import { Select } from "./component/select";
import { fixOptional } from "./utils";
const institutionSchema = z.object({
- name: z.string().min(1).max(255),
- city: z.string().min(1).max(255),
+ name: z
+ .string()
+ .min(1, "Der Name darf nicht leer sein.")
+ .max(255, "Der Name darf nicht länger als 255 Zeichen sein."),
+ city: z
+ .string()
+ .min(1, "Die Stadt darf nicht leer sein.")
+ .max(255, "Die Stadt darf nicht länger als 255 Zeichen sein."),
});
export const participantSchema = z.object({
- firstName: z.string().min(1).max(255),
- lastName: z.string().min(1).max(255),
- birthday: z
+ firstName: z
.string()
- .regex(/^\d{4}-\d{2}-\d{2}$/, "Invalid date (YYYY-MM-DD)"),
- email: z.string().email(),
- state: z.enum([
- "BADEN_WUERTTEMBERG",
- "BAVARIA",
- "BERLIN",
- "BRANDENBURG",
- "BREMEN",
- "HAMBURG",
- "HESSE",
- "MECKLENBURG_WESTERN_POMERANIA",
- "LOWER_SAXONY",
- "NORTH_RHINE_WESTPHALIA",
- "RHINELAND_PALATINATE",
- "SAARLAND",
- "SAXONY",
- "SAXONY_ANHALT",
- "SCHLESWIG_HOLSTEIN",
- "THURINGIA",
- ]),
- city: z.string().min(1).max(255),
- phone: z.preprocess(fixOptional, z.string().min(1).max(255).optional()),
- occupation: z.enum(["APPRENTICE", "PUPIL", "STUDENT", "EMPLOYEE", "OTHER"]),
+ .min(1, "Der Vorname darf nicht leer sein.")
+ .max(255, "Der Vorname darf nicht länger als 255 Zeichen sein."),
+ lastName: z
+ .string()
+ .min(1, "Der Nachname darf nicht leer sein.")
+ .max(255, "Der Nachname darf nicht länger als 255 Zeichen sein."),
+ birthday: z.string().regex(/^\d{4}-\d{2}-\d{2}$/, "Ungültiges Datum"),
+ email: z.string().email("Ungültige E-Mail-Adresse."),
+ state: z.enum(
+ [
+ "BADEN_WUERTTEMBERG",
+ "BAVARIA",
+ "BERLIN",
+ "BRANDENBURG",
+ "BREMEN",
+ "HAMBURG",
+ "HESSE",
+ "MECKLENBURG_WESTERN_POMERANIA",
+ "LOWER_SAXONY",
+ "NORTH_RHINE_WESTPHALIA",
+ "RHINELAND_PALATINATE",
+ "SAARLAND",
+ "SAXONY",
+ "SAXONY_ANHALT",
+ "SCHLESWIG_HOLSTEIN",
+ "THURINGIA",
+ ],
+ { required_error: "Das Bundesland ist erforderlich." },
+ ),
+ city: z
+ .string()
+ .min(1, "Die Stadt darf nicht leer sein.")
+ .max(255, "Die Stadt darf nicht länger als 255 Zeichen sein."),
+ phone: z.preprocess(
+ fixOptional,
+ z
+ .string()
+ .min(1, "Die Telefonnummer darf nicht leer sein.")
+ .max(255, "Die Telefonnummer darf nicht länger als 255 Zeichen sein.")
+ .optional(),
+ ),
+ occupation: z.enum(["APPRENTICE", "PUPIL", "STUDENT", "EMPLOYEE", "OTHER"], {
+ required_error: "Die Beschäftigungsart ist erforderlich.",
+ }),
company: z.preprocess(fixOptional, institutionSchema.optional()),
educationalInsitution: z.preprocess(
fixOptional,
From 1693109b2d6d9e31633a7673a4f74e2cbb5857e3 Mon Sep 17 00:00:00 2001
From: Benjamin Frost
Date: Mon, 28 Oct 2024 18:16:26 +0100
Subject: [PATCH 6/9] feat: add birthday check
---
src/components/forms/registration-form.tsx | 10 ++++++++++
src/pages/[lang]/anmeldung.astro | 2 +-
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/components/forms/registration-form.tsx b/src/components/forms/registration-form.tsx
index c0f2cc9..4e50b8f 100644
--- a/src/components/forms/registration-form.tsx
+++ b/src/components/forms/registration-form.tsx
@@ -91,6 +91,16 @@ export default function RegistrationForm() {
} = useForm({ resolver: zodResolver(participantSchema) });
const onSubmit = handleSubmit(async (data) => {
+ // check that birthday is after 2004-01-01
+ const birthday = new Date(data.birthday);
+ if (birthday < new Date("2004-01-01")) {
+ setMessage({
+ type: "error",
+ text: "Es können nur Personen teilnehmen, die 2004 oder später geboren sind.",
+ });
+ return;
+ }
+
const response = await fetch(
"https://registration-api.blz-it.de/participants",
{
diff --git a/src/pages/[lang]/anmeldung.astro b/src/pages/[lang]/anmeldung.astro
index bc4508d..4e0f61e 100644
--- a/src/pages/[lang]/anmeldung.astro
+++ b/src/pages/[lang]/anmeldung.astro
@@ -32,7 +32,7 @@ export const getStaticPaths = localeParams;
- Es können nur Personen teilnehmen, die 2024 oder später geboren
+ Es können nur Personen teilnehmen, die 2004 oder später geboren
sind.
From 5e45d6b70e8d9276d991d14afac60f92361bc879 Mon Sep 17 00:00:00 2001
From: Benjamin Frost
Date: Mon, 28 Oct 2024 18:40:55 +0100
Subject: [PATCH 7/9] fix: missing parts in form
---
src/components/forms/registration-form.tsx | 107 +++++++++++++++------
1 file changed, 78 insertions(+), 29 deletions(-)
diff --git a/src/components/forms/registration-form.tsx b/src/components/forms/registration-form.tsx
index 4e50b8f..8f3728a 100644
--- a/src/components/forms/registration-form.tsx
+++ b/src/components/forms/registration-form.tsx
@@ -49,7 +49,7 @@ export const participantSchema = z.object({
"SCHLESWIG_HOLSTEIN",
"THURINGIA",
],
- { required_error: "Das Bundesland ist erforderlich." },
+ { message: "Das Bundesland ist erforderlich." },
),
city: z
.string()
@@ -64,7 +64,7 @@ export const participantSchema = z.object({
.optional(),
),
occupation: z.enum(["APPRENTICE", "PUPIL", "STUDENT", "EMPLOYEE", "OTHER"], {
- required_error: "Die Beschäftigungsart ist erforderlich.",
+ message: "Die Beschäftigungsart ist erforderlich.",
}),
company: z.preprocess(fixOptional, institutionSchema.optional()),
educationalInsitution: z.preprocess(
@@ -88,8 +88,11 @@ export default function RegistrationForm() {
handleSubmit,
reset,
formState: { isSubmitting, errors },
+ watch,
} = useForm({ resolver: zodResolver(participantSchema) });
+ const occupation = watch("occupation");
+
const onSubmit = handleSubmit(async (data) => {
// check that birthday is after 2004-01-01
const birthday = new Date(data.birthday);
@@ -180,8 +183,12 @@ export default function RegistrationForm() {
id="state"
label="Bundesland"
error={errors.state?.message}
+ defaultValue=""
{...register("state")}
>
+
@@ -218,10 +225,14 @@ export default function RegistrationForm() {
-
-
-
- Deine Firma
-
-
- Falls du in einer Firma arbeitest, kannst du diese hier angeben.
-
- Falls du in einer Firma arbeitest, kannst du diese hier angeben.
+ {occupation === "APPRENTICE"
+ ? "Bitte gib hier die Firma an, von der du ausgebildet wirst."
+ : occupation === "EMPLOYEE"
+ ? "Bitte gib hier die Firma an, bei der du arbeitest."
+ : "Falls du in einer Firma arbeitest, kannst du diese hier angeben."}
- Falls du an einer (Hoch-)Schule bist, kannst du diese hier
- angeben.
+ {occupation === "PUPIL"
+ ? "Bitte gib hier deine Schule an."
+ : occupation == "STUDENT"
+ ? "Bitte gib hier deine Universität oder Hochschule an."
+ : "Falls du an einer Universität oder Hochschule bist, kannst du diese hier angeben."}