Voeg Module 1 Projecten toe met project plan, Rikx calculatie en Rikx rondes

- Projectenpagina met pipeline (standaard) en tabelweergave, filters op
  status, Rikx Ronde en zoeken
- Projectpagina in stappen: Project plan (velden uit de Rikx-aanvraag) en
  Rikx calculatie achter een schuif, live berekend volgens de rekenmethode
- Rikx rondes beheren (label, Rikx waarde, Rikx prijs) en koppelen aan projecten
- Oranje Rikx-menubalk met menu per module, gedeeld door alle pagina's
- Oude offerte-tabellen opgeruimd: leeg wordt verwijderd, met data hernoemd
  naar legacy_*
- CLAUDE.md bijgewerkt naar de huidige stand

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-08 10:26:30 +02:00
parent 46eecc31a4
commit 9f0bd87c40
25 changed files with 2161 additions and 55 deletions
+35
View File
@@ -0,0 +1,35 @@
import type { RikxRonde } from "../../lib/db";
const inputClass =
"h-10 rounded-lg border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-800 px-3 text-sm text-zinc-900 dark:text-zinc-100 focus:outline-none focus:ring-2 focus:ring-rikx-orange";
const labelClass = "text-sm font-medium text-zinc-700 dark:text-zinc-300";
export const RONDE_ERRORS: Record<string, string> = {
missing: "Vul een ronde label in.",
invalid: "Rikx waarde en Rikx prijs mogen niet negatief zijn.",
label: "Er bestaat al een ronde met dit label.",
};
// Gedeelde velden voor toevoegen en bewerken van een Rikx Ronde.
export function RondeFields({ ronde }: { ronde?: RikxRonde }) {
return (
<>
<label className="flex flex-col gap-1">
<span className={labelClass}>
Ronde label<span className="text-red-500 ml-1">*</span>
</span>
<input name="label" required defaultValue={ronde?.label} placeholder="Rikx Ronde 5 – Rotterdam" className={inputClass} />
</label>
<label className="flex flex-col gap-1">
<span className={labelClass}>Rikx waarde</span>
<input name="rikx_waarde" type="number" min={0} step="any" defaultValue={ronde?.rikx_waarde ?? ""} className={inputClass} />
<span className="text-xs text-zinc-500">Kosten/impact van het 75%-ste project in de ronde.</span>
</label>
<label className="flex flex-col gap-1">
<span className={labelClass}>Rikx prijs (€)</span>
<input name="rikx_prijs" type="number" min={0} step="0.01" defaultValue={ronde?.rikx_prijs ?? ""} className={inputClass} />
<span className="text-xs text-zinc-500">Leeg laten = Rikx waarde / 10.</span>
</label>
</>
);
}