Aufgaben: erledigte trotzdem bearbeiten + Nachträge anlegen

Drei Frontend-Guards raus, die verhindert haben, dass man an
erledigten Aufgaben noch etwas machen kann:

- TaskList: der Reply-/Subtask-Input war für erledigte Aufgaben
  komplett ausgeblendet. Jetzt sichtbar mit angepasstem Placeholder
  ("Nachtrag zu erledigter Aufgabe…" / "Antwort zu erledigter
  Anfrage…").
- ContractDetail: der Subtask-Input war für erledigte Aufgaben aus.
  Jetzt sichtbar – man muss die Aufgabe nicht mehr als offen
  markieren, nur um einen Nachtrag anzuhängen.
- ContractDetail: der Edit-Button war für erledigte Aufgaben aus.
  Jetzt immer verfügbar (Löschen war eh schon da).

Backend hatte keine Restriktion, es waren rein UI-Gate.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-07-04 00:55:58 +02:00
parent a3bdb3f467
commit cc6fa9be47
2 changed files with 20 additions and 14 deletions
+13 -11
View File
@@ -1147,8 +1147,11 @@ function ContractTaskItem({
)}
{/* Add Subtask */}
{/* Subtask/Antwort hinzufügen: Mitarbeiter mit Berechtigung ODER Kundenportal */}
{!isCompleted && ((canEdit && !isCustomerPortal) || isCustomerPortal) && (
{/* Subtask/Antwort hinzufügen: Mitarbeiter mit Berechtigung ODER Kundenportal.
2026-07-04: bewusst OHNE isCompleted-Guard man soll auch
zu erledigten Aufgaben Nachträge anlegen können, ohne die
Aufgabe erst wieder auf offen zu setzen. */}
{((canEdit && !isCustomerPortal) || isCustomerPortal) && (
<div className="mt-2 ml-2">
{showSubtaskInput ? (
<form onSubmit={handleAddSubtask} className="flex items-center gap-2">
@@ -1181,15 +1184,14 @@ function ContractTaskItem({
</div>
{canEdit && !isCustomerPortal && (
<div className="flex gap-1 opacity-0 group-hover:opacity-100">
{!isCompleted && (
<button
onClick={onEdit}
className="text-gray-400 hover:text-blue-600 p-1"
title="Bearbeiten"
>
<Edit className="w-4 h-4" />
</button>
)}
{/* 2026-07-04: Edit auch bei erledigten Aufgaben verfügbar. */}
<button
onClick={onEdit}
className="text-gray-400 hover:text-blue-600 p-1"
title="Bearbeiten"
>
<Edit className="w-4 h-4" />
</button>
<button
onClick={() => {
if (confirm('Aufgabe wirklich löschen?')) {
+7 -3
View File
@@ -350,11 +350,15 @@ export default function TaskList() {
</div>
)}
{/* Reply Input - nur anzeigen wenn Task noch offen */}
{!isTaskCompleted && (canEditSubtasks || isCustomerPortal) && (
{/* Reply/Subtask-Input 2026-07-04: auch bei erledigten
Aufgaben verfügbar, damit man nicht erst öffnen muss um
eine Nachfrage / Nachtrag anzulegen. */}
{(canEditSubtasks || isCustomerPortal) && (
<div className="flex gap-2 ml-6">
<Input
placeholder={isCustomerPortal ? 'Antwort schreiben...' : 'Neue Unteraufgabe...'}
placeholder={isCustomerPortal
? (isTaskCompleted ? 'Antwort zu erledigter Anfrage…' : 'Antwort schreiben...')
: (isTaskCompleted ? 'Nachtrag zu erledigter Aufgabe…' : 'Neue Unteraufgabe...')}
value={replyInputs[task.id] || ''}
onChange={(e) => setReplyInputs(prev => ({ ...prev, [task.id]: e.target.value }))}
onKeyDown={(e) => {