'use client' import { useState, useTransition } from 'react' import { useRouter } from 'next/navigation' import Link from 'next/link' import { Check, ExternalLink, Loader2, Pencil, RotateCcw, Trash2 } from 'lucide-react' import { toast } from 'sonner' import { Button } from '@/components/ui/button' import { Kennzeichen } from '@/components/ui/kennzeichen' import { Select } from '@/components/ui/select' import { PRIORITAET_NAME, QUELLE_NAME, STATUS_NAME, TYP_NAME, istAbgeschlossen, } from '@/lib/aufgabe' import { faelligkeitFarbe, type AufgabeAnzeige } from '@/lib/aufgabe-anzeige' import { alsDauer } from '@/lib/zeit' import { cn } from '@/lib/utils' import { aufgabeLoeschen, einsortieren, ideeUebernehmen, statusSetzen, type Rueckmeldung, } from '@/server/aktionen/aufgaben' export type BereichWahl = { id: string; name: string; farbe: string } type Eigenschaften = { aufgabe: AufgabeAnzeige /** Bereiche zur Auswahl; nur nötig, wenn einsortiert werden soll. */ bereiche?: BereichWahl[] /** Zeigt das Auswahlfeld zum Einsortieren (Inbox). */ mitEinsortieren?: boolean /** Zeigt den Knopf "Zur Aufgabe machen" (Ideen). */ mitUebernehmen?: boolean onBearbeiten?: (aufgabe: AufgabeAnzeige) => void } export function AufgabenZeile({ aufgabe, bereiche = [], mitEinsortieren = false, mitUebernehmen = false, onBearbeiten, }: Eigenschaften) { const router = useRouter() const [laeuft, starte] = useTransition() const [loeschenBestaetigt, setLoeschenBestaetigt] = useState(false) const abgeschlossen = istAbgeschlossen(aufgabe.status) function mitRueckmeldung(tun: () => Promise) { starte(async () => { const antwort = await tun() if (antwort.ok) { toast.success(antwort.meldung) router.refresh() } else { toast.error(antwort.fehler) } }) } function statusWechseln(neu: string) { const daten = new FormData() daten.set('id', aufgabe.id) daten.set('status', neu) mitRueckmeldung(() => statusSetzen(daten)) } function inBereich(bereichId: string) { if (!bereichId) return const daten = new FormData() daten.set('id', aufgabe.id) daten.set('bereichId', bereichId) mitRueckmeldung(() => einsortieren(daten)) } function loeschen() { if (!loeschenBestaetigt) { setLoeschenBestaetigt(true) return } const daten = new FormData() daten.set('id', aufgabe.id) mitRueckmeldung(() => aufgabeLoeschen(daten)) } function uebernehmen() { const daten = new FormData() daten.set('id', aufgabe.id) mitRueckmeldung(() => ideeUebernehmen(daten)) } return (
  • {aufgabe.titel}

    {aufgabe.notiz && (

    {aufgabe.notiz}

    )}
    {aufgabe.bereich ? ( {aufgabe.bereich.name} ) : ( Inbox )} {aufgabe.typ !== 'AUFGABE' && ( {TYP_NAME[aufgabe.typ]} )} {aufgabe.faelligDatum && ( {aufgabe.faelligText} )} {aufgabe.aufwandMinuten !== null && ( {alsDauer(aufgabe.aufwandMinuten)} )} {aufgabe.prioritaet <= 2 && ( {PRIORITAET_NAME[aufgabe.prioritaet]} )} {aufgabe.status !== 'OFFEN' && ( {STATUS_NAME[aufgabe.status]} )} {aufgabe.projekt && ( {aufgabe.projekt.name} )} {aufgabe.quelle !== 'MANUELL' && (aufgabe.quelleUrl ? ( {QUELLE_NAME[aufgabe.quelle]} ) : ( {QUELLE_NAME[aufgabe.quelle]} ))}
    {onBearbeiten && ( )}
    {(mitEinsortieren || mitUebernehmen) && (
    {mitEinsortieren && bereiche.length > 0 && ( <> )} {mitUebernehmen && ( )}
    )}
  • ) }