{
"event": "PreToolUse",
"tool_name": "mcp__mcp-tasks__tasks_create",
"tool_input": {
"title": "HTMX: prompts\/index.php - Duplicate-Button ohne Page-Reload",
"type": "ai_task",
"description": "# HTMX-Implementation: prompts\/index.php\n\n## Ziel\nErsetze den traditionellen Form-Submit für \"Duplizieren\" durch HTMX für bessere UX ohne vollständigen Page-Reload.\n\n---\n\n## Betroffene Datei\n`\/var\/www\/dev.campus.systemische-tools.de\/src\/View\/prompts\/index.php`\n\n---\n\n## Aktuelle Implementierung (Zeilen 95-98)\n\n```php\n<form method=\"post\" action=\"\/prompts\/<?= $prompt['id'] ?>\/duplicate\" style=\"display:inline\">\n <?= $csrfField ?>\n <button type=\"submit\" class=\"btn btn--small btn--secondary\">Duplizieren<\/button>\n<\/form>\n```\n\n**Problem:** Vollständiger Page-Reload nach Submit, langsame UX.\n\n---\n\n## Ziel-Implementierung\n\n### Option A: Redirect nach Erfolg (empfohlen)\n```php\n<button class=\"btn btn--small btn--secondary\"\n hx-post=\"\/prompts\/<?= $prompt['id'] ?>\/duplicate\"\n hx-headers='{\"X-CSRF-TOKEN\": \"<?= $csrfToken ?>\"}'\n hx-swap=\"none\"\n hx-on::after-request=\"if(event.detail.successful) window.location.href=event.detail.xhr.getResponseHeader('X-Redirect') || '\/prompts'\">\n Duplizieren\n<\/button>\n```\n\n### Option B: Inline-Feedback mit Reload\n```php\n<button class=\"btn btn--small btn--secondary\"\n hx-post=\"\/prompts\/<?= $prompt['id'] ?>\/duplicate\"\n hx-headers='{\"X-CSRF-TOKEN\": \"<?= $csrfToken ?>\"}'\n hx-swap=\"none\"\n hx-indicator=\"closest tr\"\n hx-on::after-request=\"location.reload()\">\n Duplizieren\n<\/button>\n```\n\n---\n\n## Erforderliche Backend-Änderungen\n\n### PromptsController::duplicate() anpassen\n\n**Aktuell (Zeilen 153-166):**\n```php\npublic function duplicate(string $id): void\n{\n $this->requireCsrf();\n $result = $this->promptsUseCase->duplicate((int) $id);\n if (!$result->success) {\n $_SESSION['error'] = $result->message;\n $this->redirect('\/prompts\/' . $id);\n }\n $_SESSION['success'] = $result->message;\n $this->redirect('\/prompts\/' . $result->id . '\/edit');\n}\n```\n\n**Neu - HTMX-kompatibel:**\n```php\npublic function duplicate(string $id): void\n{\n $this->requireCsrf();\n $result = $this->promptsUseCase->duplicate((int) $id);\n \n \/\/ HTMX-Request erkennen\n if ($this->isHtmxRequest()) {\n if (!$result->success) {\n http_response_code(422);\n echo json_encode(['error' => $result->message]);\n return;\n }\n \/\/ Redirect-Header für HTMX\n header('X-Redirect: \/prompts\/' . $result->id . '\/edit');\n http_response_code(200);\n return;\n }\n \n \/\/ Fallback für Non-HTMX\n if (!$result->success) {\n $_SESSION['error'] = $result->message;\n $this->redirect('\/prompts\/' . $id);\n }\n $_SESSION['success'] = $result->message;\n $this->redirect('\/prompts\/' . $result->id . '\/edit');\n}\n```\n\n### Framework\\Controller - Helper hinzufügen (falls nicht vorhanden)\n```php\nprotected function isHtmxRequest(): bool\n{\n return isset($_SERVER['HTTP_HX_REQUEST']);\n}\n```\n\n---\n\n## Konsistenz-Prüfung (bestehende Patterns)\n\nReferenz: `content\/show.php:163-164`\n```html\n<button hx-post=\"\/content\/{id}\/approve\" \n hx-swap=\"none\" \n hx-on::after-request=\"location.reload()\" \n hx-headers='{\"X-CSRF-TOKEN\": \"...\"}'>\n```\n\nDie Implementierung folgt diesem etablierten Pattern.\n\n---\n\n## Contracts-Compliance\n\n### js-browser-architecture-contract_v2\n- ✅ Kein `var` verwendet\n- ✅ Keine globalen Variablen außerhalb Adapters\n- ✅ ES Modules bleiben unverändert\n\n### View Structure Contract v2.0 \n- ✅ URL-Struktur `\/prompts\/{id}\/duplicate` bleibt REST-konform\n- ✅ Keine verbotenen CSS-Klassen\n- ✅ `data-sortable` Tabelle unverändert\n\n---\n\n## Testplan\n\n1. [ ] Duplizieren-Button klicken\n2. [ ] Verifizieren: Kein vollständiger Page-Reload\n3. [ ] Verifizieren: Redirect zur Edit-Seite des neuen Prompts\n4. [ ] Fehlerfall testen: Ungültige ID → Fehlermeldung\n5. [ ] CSRF-Token-Fehler testen → 403-Response\n6. [ ] Non-JS-Fallback prüfen (sollte weiter funktionieren)\n\n---\n\n## Aufwand\n- View: ~5 Minuten\n- Controller: ~10 Minuten \n- Test: ~10 Minuten\n- **Gesamt: ~25 Minuten**"
}
}
{
"tool_response": [
{
"type": "text",
"text": "{\n \"success\": true,\n \"task\": {\n \"id\": 437,\n \"uuid\": \"a7b01334-4478-4577-a193-2bd97cb6ce9c\",\n \"title\": \"HTMX: prompts\/index.php - Duplicate-Button ohne Page-Reload\",\n \"description\": \"# HTMX-Implementation: prompts\/index.php\\n\\n## Ziel\\nErsetze den traditionellen Form-Submit für \\\"Duplizieren\\\" durch HTMX für bessere UX ohne vollständigen Page-Reload.\\n\\n---\\n\\n## Betroffene Datei\\n`\/var\/www\/dev.campus.systemische-tools.de\/src\/View\/prompts\/index.php`\\n\\n---\\n\\n## Aktuelle Implementierung (Zeilen 95-98)\\n\\n```php\\n<form method=\\\"post\\\" action=\\\"\/prompts\/<?= $prompt['id'] ?>\/duplicate\\\" style=\\\"display:inline\\\">\\n <?= $csrfField ?>\\n <button type=\\\"submit\\\" class=\\\"btn btn--small btn--secondary\\\">Duplizieren<\/button>\\n<\/form>\\n```\\n\\n**Problem:** Vollständiger Page-Reload nach Submit, langsame UX.\\n\\n---\\n\\n## Ziel-Implementierung\\n\\n### Option A: Redirect nach Erfolg (empfohlen)\\n```php\\n<button class=\\\"btn btn--small btn--secondary\\\"\\n hx-post=\\\"\/prompts\/<?= $prompt['id'] ?>\/duplicate\\\"\\n hx-headers='{\\\"X-CSRF-TOKEN\\\": \\\"<?= $csrfToken ?>\\\"}'\\n hx-swap=\\\"none\\\"\\n hx-on::after-request=\\\"if(event.detail.successful) window.location.href=event.detail.xhr.getResponseHeader('X-Redirect') || '\/prompts'\\\">\\n Duplizieren\\n<\/button>\\n```\\n\\n### Option B: Inline-Feedback mit Reload\\n```php\\n<button class=\\\"btn btn--small btn--secondary\\\"\\n hx-post=\\\"\/prompts\/<?= $prompt['id'] ?>\/duplicate\\\"\\n hx-headers='{\\\"X-CSRF-TOKEN\\\": \\\"<?= $csrfToken ?>\\\"}'\\n hx-swap=\\\"none\\\"\\n hx-indicator=\\\"closest tr\\\"\\n hx-on::after-request=\\\"location.reload()\\\">\\n Duplizieren\\n<\/button>\\n```\\n\\n---\\n\\n## Erforderliche Backend-Änderungen\\n\\n### PromptsController::duplicate() anpassen\\n\\n**Aktuell (Zeilen 153-166):**\\n```php\\npublic function duplicate(string $id): void\\n{\\n $this->requireCsrf();\\n $result = $this->promptsUseCase->duplicate((int) $id);\\n if (!$result->success) {\\n $_SESSION['error'] = $result->message;\\n $this->redirect('\/prompts\/' . $id);\\n }\\n $_SESSION['success'] = $result->message;\\n $this->redirect('\/prompts\/' . $result->id . '\/edit');\\n}\\n```\\n\\n**Neu - HTMX-kompatibel:**\\n```php\\npublic function duplicate(string $id): void\\n{\\n $this->requireCsrf();\\n $result = $this->promptsUseCase->duplicate((int) $id);\\n \\n \/\/ HTMX-Request erkennen\\n if ($this->isHtmxRequest()) {\\n if (!$result->success) {\\n http_response_code(422);\\n echo json_encode(['error' => $result->message]);\\n return;\\n }\\n \/\/ Redirect-Header für HTMX\\n header('X-Redirect: \/prompts\/' . $result->id . '\/edit');\\n http_response_code(200);\\n return;\\n }\\n \\n \/\/ Fallback für Non-HTMX\\n if (!$result->success) {\\n $_SESSION['error'] = $result->message;\\n $this->redirect('\/prompts\/' . $id);\\n }\\n $_SESSION['success'] = $result->message;\\n $this->redirect('\/prompts\/' . $result->id . '\/edit');\\n}\\n```\\n\\n### Framework\\\\Controller - Helper hinzufügen (falls nicht vorhanden)\\n```php\\nprotected function isHtmxRequest(): bool\\n{\\n return isset($_SERVER['HTTP_HX_REQUEST']);\\n}\\n```\\n\\n---\\n\\n## Konsistenz-Prüfung (bestehende Patterns)\\n\\nReferenz: `content\/show.php:163-164`\\n```html\\n<button hx-post=\\\"\/content\/{id}\/approve\\\" \\n hx-swap=\\\"none\\\" \\n hx-on::after-request=\\\"location.reload()\\\" \\n hx-headers='{\\\"X-CSRF-TOKEN\\\": \\\"...\\\"}'>\\n```\\n\\nDie Implementierung folgt diesem etablierten Pattern.\\n\\n---\\n\\n## Contracts-Compliance\\n\\n### js-browser-architecture-contract_v2\\n- ✅ Kein `var` verwendet\\n- ✅ Keine globalen Variablen außerhalb Adapters\\n- ✅ ES Modules bleiben unverändert\\n\\n### View Structure Contract v2.0 \\n- ✅ URL-Struktur `\/prompts\/{id}\/duplicate` bleibt REST-konform\\n- ✅ Keine verbotenen CSS-Klassen\\n- ✅ `data-sortable` Tabelle unverändert\\n\\n---\\n\\n## Testplan\\n\\n1. [ ] Duplizieren-Button klicken\\n2. [ ] Verifizieren: Kein vollständiger Page-Reload\\n3. [ ] Verifizieren: Redirect zur Edit-Seite des neuen Prompts\\n4. [ ] Fehlerfall testen: Ungültige ID → Fehlermeldung\\n5. [ ] CSRF-Token-Fehler testen → 403-Response\\n6. [ ] Non-JS-Fallback prüfen (sollte weiter funktionieren)\\n\\n---\\n\\n## Aufwand\\n- View: ~5 Minuten\\n- Controller: ~10 Minuten \\n- Test: ~10 Minuten\\n- **Gesamt: ~25 Minuten**\",\n \"type\": \"ai_task\",\n \"status\": \"pending\",\n \"created_by\": \"mcp-tasks\",\n \"created_by_type\": \"ai\",\n \"parent_task_id\": null,\n \"due_date\": null,\n \"created_at\": \"2025-12-27T11:20:54.738870\",\n \"updated_at\": \"2025-12-27T11:20:54.738871\",\n \"completed_at\": null,\n \"metadata\": {}\n },\n \"message\": \"Task #437 created\"\n}"
}
]
}