feat(aufgaben): Inbox, Aufgabenliste, Ideen und Projekte

Die Schnellerfassung braucht ein Feld und einen Knopf; wer beim Erfassen
erst ein Formular ausfüllen muss, erfasst nichts. Der Fokus bleibt danach
im Feld, damit mehrere Sachen hintereinander hineingehen.

Die Filter der Aufgabenliste stehen in der Adresse, nicht im Zustand der
Komponente — so lässt sich eine gefilterte Liste als Lesezeichen ablegen,
und der Zurück-Knopf tut, was er soll.

Die Startseite zeigt jetzt, was überfällig, heute oder morgen fällig ist,
statt nur die Bereiche aufzuzählen.

Für die Auswahlfelder bewusst das native <select>: es bedient sich auf
dem Handy mit dem Systemdialog und ist ohne Zusatzcode tastaturbedienbar.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-09-10 16:17:44 +02:00
co-authored by Claude Opus 5
parent b3ca1c9ce7
commit a4a889fcb8
19 changed files with 1859 additions and 43 deletions
+75
View File
@@ -0,0 +1,75 @@
import type { Metadata } from 'next'
import { Inbox } from 'lucide-react'
import { AufgabenListe } from '@/components/aufgaben/aufgaben-liste'
import { Schnellerfassung } from '@/components/aufgaben/schnellerfassung'
import {
Card,
CardBeschreibung,
CardInhalt,
CardKopf,
CardTitel,
} from '@/components/ui/card'
import {
aufgabenLaden,
bereicheLaden,
projekteZurAuswahlLaden,
} from '@/server/abfragen/aufgaben'
import { verlangeAnmeldung } from '@/server/berechtigung'
export const metadata: Metadata = { title: 'Inbox' }
export default async function InboxSeite() {
await verlangeAnmeldung('/inbox')
const [aufgaben, bereiche, projekte] = await Promise.all([
aufgabenLaden({ nurInbox: true, nurOffen: true }),
bereicheLaden(),
projekteZurAuswahlLaden(),
])
return (
<div className="flex flex-col gap-6">
<header>
<h1 className="flex items-center gap-2 text-2xl font-semibold tracking-tight">
<Inbox className="size-6" aria-hidden />
Inbox
</h1>
<p className="text-gedaempft-vordergrund mt-1 text-sm">
Alles, was noch keinem Bereich zugeordnet ist. Erst erfassen, später
einsortieren — Nachdenken beim Aufschreiben kostet nur Zeit.
</p>
</header>
<Card>
<CardKopf>
<CardTitel className="text-base">Schnell erfassen</CardTitel>
<CardBeschreibung>
Ein Titel genügt. Bereich, Termin und Aufwand kommen beim Einsortieren.
</CardBeschreibung>
</CardKopf>
<CardInhalt>
<Schnellerfassung />
</CardInhalt>
</Card>
<section className="flex flex-col gap-3">
<h2 className="text-lg font-medium">
Noch einzusortieren
{aufgaben.length > 0 && (
<span className="text-gedaempft-vordergrund ml-2 text-sm font-normal">
{aufgaben.length}
</span>
)}
</h2>
<AufgabenListe
aufgaben={aufgaben}
bereiche={bereiche}
projekte={projekte}
mitEinsortieren
leerText="Die Inbox ist leer. Alles einsortiert."
/>
</section>
</div>
)
}