Files
ApiCore/ApiCore-Frontend/src/components/varroa/varroa-rate-light.tsx
T
Nick SzaunigandClaude Opus 5.5 c01a38835a feat: platform backbone and field capture, first part (checkpoint)
Platform backbone (plan 2026-10-13-plattform-rueckgrat), reviewed tasks:
- run roles api/worker/job/all with shared startup checks (Task 1)
- schema and migration for DomainEvent, deliveries, JobRun, ThrottlerHit (Task 2)
- audit, notifications and domain events written in the same transaction (Task 3)
- dispatcher with SKIP LOCKED claims, retries and stale release (Task 4)
- worker building blocks: tick, LISTEN/NOTIFY wake-up, health (Task 5)
- worker process and entry points (Task 6)
- throttler counters in Postgres (Task 19)
- separate keys per purpose with key ring (Task 20)
- public origin page without exact location (Task 22)
- shop keys split into read and write (Task 23)
- Kustomize base, components, overlay encry, CI validation (Task 26)

Field capture T3 (plan 2026-10-13-t3-erfassung-am-stand), reviewed tasks:
- brood frames, read endpoints, apiary overview and offline pack
- network basics, offline queue v3, navigation sheets, form building blocks
- new inspection with last-time hints and weather, varroa per day,
  treatment prefill, apiary page with round
- inspection photo (Task 10) is implemented, review pending

Not rolled out. Remaining tasks follow in later commits.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-13 17:57:54 +02:00

56 lines
1.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { AlertTriangle, CheckCircle2, OctagonAlert } from "lucide-react";
import { RATING_TONE_CLASS } from "@/lib/forms/rating";
import { formatMitesPerDay, formatThreshold } from "@/lib/varroa/format";
import { VarroaLight, varroaLight } from "@/lib/varroa/rate";
import { cn } from "@/lib/utils";
const LIGHTS: Record<VarroaLight, { Icon: typeof CheckCircle2; tone: string }> = {
green: { Icon: CheckCircle2, tone: RATING_TONE_CLASS[4] },
yellow: { Icon: AlertTriangle, tone: RATING_TONE_CLASS[3] },
red: { Icon: OctagonAlert, tone: RATING_TONE_CLASS[1] },
};
function lightText(light: VarroaLight, threshold: number): string {
if (light === "red") return "über der Schwelle, Behandlung prüfen";
if (light === "yellow") return "nahe an der Schwelle";
return `unter der Schwelle (${formatThreshold(threshold)}/Tag)`;
}
/**
* The live result of the count. The state is always spelled out and has an
* icon, so it never depends on the colour alone.
*/
export function VarroaRateLight({
rate,
threshold,
}: {
rate: number | null;
threshold: number | null;
}) {
const light = varroaLight(rate, threshold);
if (rate === null) {
return <div role="status" aria-live="polite" />;
}
const base = `${formatMitesPerDay(rate)} Milben/Tag`;
if (light === null || threshold === null) {
return (
<p role="status" aria-live="polite" className="text-sm font-medium">
{base}
</p>
);
}
const { Icon, tone } = LIGHTS[light];
return (
<p
role="status"
aria-live="polite"
className={cn("flex min-h-11 items-center gap-2 rounded-lg border px-3 text-sm font-medium", tone)}
>
<Icon aria-hidden className="size-5 shrink-0" />
<span>
{base} – {lightText(light, threshold)}
</span>
</p>
);
}