From 985ea095563533a9eac12ecab36753897541abde Mon Sep 17 00:00:00 2001 From: Nick Szaunig Date: Sun, 6 Sep 2026 21:44:29 +0200 Subject: [PATCH] fix: allow entering a queen's hatch year and marking color/number The backend has always accepted hatchYear/markingColor/markingNumber (Queen DTOs, Prisma schema), and the queens list even already renders a "Schlupfjahr" field - but neither the create nor the edit form ever exposed inputs for them, so no user could actually set hatchYear through the UI. That silently broke the OLD_QUEEN dashboard alert just added: it can only ever fire for colonies whose queen has a hatchYear, and there was no way to record one. Both forms now include Schlupfjahr, Zeichenfarbe and Zeichennummer. Marking color is auto-suggested from the hatch year using the internationally standardized queen marking color convention (last digit of the year -> white/yellow/red/green/blue), editable like any other suggestion. Co-Authored-By: Claude Sonnet 5 --- .../app/(app)/queens/[id]/queen-edit-card.tsx | 41 +++++++++++++++++ .../src/app/(app)/queens/new/page.tsx | 45 +++++++++++++++++++ .../src/app/(app)/queens/page.tsx | 5 ++- .../src/lib/queens/marking-color.ts | 20 +++++++++ ApiCore-Frontend/src/lib/queens/types.ts | 6 +++ 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 ApiCore-Frontend/src/lib/queens/marking-color.ts diff --git a/ApiCore-Frontend/src/app/(app)/queens/[id]/queen-edit-card.tsx b/ApiCore-Frontend/src/app/(app)/queens/[id]/queen-edit-card.tsx index 15a98fa..5d284fe 100644 --- a/ApiCore-Frontend/src/app/(app)/queens/[id]/queen-edit-card.tsx +++ b/ApiCore-Frontend/src/app/(app)/queens/[id]/queen-edit-card.tsx @@ -4,6 +4,7 @@ import { FormEvent, useState } from "react"; import { Crown } from "lucide-react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { fetchQueens, updateQueen } from "@/lib/queens/api"; +import { suggestMarkingColorForYear } from "@/lib/queens/marking-color"; import { Queen, QueenStatus } from "@/lib/queens/types"; import { QUEEN_STATUSES, QUEEN_STATUS_LABELS } from "@/lib/queens/labels"; import { statusTone } from "@/lib/status-tone"; @@ -28,12 +29,23 @@ import { export function QueenEditCard({ queen }: { queen: Queen }) { const queryClient = useQueryClient(); + const [hatchYear, setHatchYear] = useState(queen.hatchYear?.toString() ?? ""); const [breed, setBreed] = useState(queen.breed ?? ""); const [origin, setOrigin] = useState(queen.origin ?? ""); + const [markingColor, setMarkingColor] = useState(queen.markingColor ?? ""); + const [markingNumber, setMarkingNumber] = useState(queen.markingNumber ?? ""); const [motherQueenId, setMotherQueenId] = useState(queen.motherQueenId ?? ""); const [notes, setNotes] = useState(queen.notes ?? ""); const [status, setStatus] = useState(queen.status); + function handleHatchYearChange(value: string) { + setHatchYear(value); + const year = Number(value); + if (!markingColor && value && Number.isInteger(year)) { + setMarkingColor(suggestMarkingColorForYear(year)); + } + } + const { data: queens } = useQuery({ queryKey: ["queens"], queryFn: () => fetchQueens(), @@ -43,8 +55,11 @@ export function QueenEditCard({ queen }: { queen: Queen }) { const mutation = useMutation({ mutationFn: () => updateQueen(queen.id, { + hatchYear: hatchYear ? Number(hatchYear) : undefined, breed: breed || undefined, origin: origin || undefined, + markingColor: markingColor || undefined, + markingNumber: markingNumber || undefined, motherQueenId: motherQueenId || undefined, notes: notes || undefined, status, @@ -76,6 +91,16 @@ export function QueenEditCard({ queen }: { queen: Queen }) {
+
+ + handleHatchYearChange(event.target.value)} + /> +
setOrigin(event.target.value)} />
+
+ + setMarkingColor(event.target.value)} + /> +
+
+ + setMarkingNumber(event.target.value)} + /> +
handleHatchYearChange(event.target.value)} + /> +
setOrigin(event.target.value)} />
+
+ + setMarkingColor(event.target.value)} + /> +

+ Wird nach internationaler Konvention aus dem Schlupfjahr vorgeschlagen, kann + aber angepasst werden. +

+
+
+ + setMarkingNumber(event.target.value)} + /> +