import React, { useState, useEffect } from 'react'; import { X, Plus, Trash2, ArrowUp, ArrowDown, RotateCcw, Check, Columns, Layers, } from 'lucide-react'; import { KanbanColumn } from '../../lib/types'; import { triggerHaptic } from '../../lib/api'; interface ManageColumnsModalProps { isOpen: boolean; onClose: () => void; initialColumns: KanbanColumn[]; onSave: (columns: KanbanColumn[]) => Promise; listTitle?: string; } export const DEFAULT_KANBAN_COLUMNS: KanbanColumn[] = [ { id: 'todo', name: 'Zu erledigen' }, { id: 'in_progress', name: 'In Bearbeitung', color: 'accent' }, { id: 'waiting', name: 'Wartet auf andere', color: 'amber' }, { id: 'done', name: 'Erledigt', isDone: true, color: 'emerald' }, ]; export const ManageColumnsModal: React.FC = ({ isOpen, onClose, initialColumns, onSave, listTitle, }) => { if (!isOpen) return null; const [columns, setColumns] = useState(() => { return initialColumns && initialColumns.length > 0 ? initialColumns : DEFAULT_KANBAN_COLUMNS; }); const [newColName, setNewColName] = useState(''); const [newColIsDone, setNewColIsDone] = useState(false); const [saving, setSaving] = useState(false); useEffect(() => { setColumns(initialColumns && initialColumns.length > 0 ? initialColumns : DEFAULT_KANBAN_COLUMNS); }, [initialColumns, isOpen]); const handleMove = (index: number, direction: 'up' | 'down') => { triggerHaptic(10); const targetIndex = direction === 'up' ? index - 1 : index + 1; if (targetIndex < 0 || targetIndex >= columns.length) return; const next = [...columns]; const temp = next[index]; next[index] = next[targetIndex]; next[targetIndex] = temp; setColumns(next); }; const handleRename = (id: string, newName: string) => { setColumns((prev) => prev.map((c) => (c.id === id ? { ...c, name: newName } : c)) ); }; const handleToggleDone = (id: string) => { triggerHaptic(10); setColumns((prev) => prev.map((c) => (c.id === id ? { ...c, isDone: !c.isDone } : c)) ); }; const handleDelete = (id: string) => { if (columns.length <= 1) { alert('Mindestens eine Spalte muss vorhanden sein.'); return; } triggerHaptic(10); setColumns((prev) => prev.filter((c) => c.id !== id)); }; const handleAddColumn = (e: React.FormEvent) => { e.preventDefault(); const name = newColName.trim(); if (!name) return; triggerHaptic(10); const slug = name.toLowerCase().replace(/[^a-z0-9]+/g, '_').slice(0, 20) || 'col'; const id = `${slug}_${Date.now().toString(36).slice(-4)}`; setColumns((prev) => [ ...prev, { id, name, isDone: newColIsDone, }, ]); setNewColName(''); setNewColIsDone(false); }; const handleResetToDefault = () => { if (window.confirm('Spalten auf Standard zurücksetzen? (Zu erledigen, In Bearbeitung, Wartet auf andere, Erledigt)')) { triggerHaptic(15); setColumns(DEFAULT_KANBAN_COLUMNS); } }; const handleSave = async () => { if (columns.length === 0) { alert('Es muss mindestens eine Spalte vorhanden sein.'); return; } setSaving(true); triggerHaptic(15); try { await onSave(columns); onClose(); } catch (err: any) { alert(err.message || 'Fehler beim Speichern der Spalten'); } finally { setSaving(false); } }; return (
e.stopPropagation()} > {/* Header */}

Kanban-Spalten anpassen

{listTitle && (

Liste: {listTitle}

)}
{/* Content */}

Passe die Spalten für das Kanban-Board an. Aufgaben können in jede beliebige Spalte verschoben werden.

{/* Columns List */}
{columns.map((col, idx) => (
handleRename(col.id, e.target.value)} className="flex-1 h-7 px-2 text-xs input-field" placeholder="Spaltenname" /> {/* IsDone Toggle */}
))}
{/* Add New Column Form */}
setNewColName(e.target.value)} placeholder="z.B. Wartet auf Feedback, Review…" className="flex-1 h-8 px-2.5 text-xs input-field" />
{/* Reset button */}
{/* Footer */}
); };