From e50c04c96fb0b983177825d7ced1101ea021ea30 Mon Sep 17 00:00:00 2001 From: Lars Date: Thu, 9 Jul 2026 11:26:48 +0200 Subject: [PATCH] =?UTF-8?q?AP1.12b:=20Modal-Bearbeitung=20f=C3=BCr=20Profi?= =?UTF-8?q?l,=20Projekte=20und=20Backlog=20im=20Plan-Modus.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ersetzt Inline-Formulare durch Dialoge; Scope-Breadcrumb aktualisiert sich nach Profil-Speichern. Co-authored-by: Cursor --- .cursor/rules/kairo-deployment-testing.mdc | 15 +- backend/version.py | 2 +- frontend/src/components/BacklogItemForm.jsx | 102 +++++++++++ frontend/src/components/BacklogSection.jsx | 158 ++++++++---------- frontend/src/components/GateSelect.jsx | 3 +- frontend/src/components/Modal.jsx | 68 ++++++++ frontend/src/components/ProjectsSection.jsx | 103 +++++++++--- .../context/InitiativeOperationsContext.jsx | 31 ++++ frontend/src/context/ProgramScopeContext.jsx | 9 + .../pages/initiative/InitiativeInboxPage.jsx | 3 +- frontend/src/pages/modes/PlanProfilePage.jsx | 77 ++++++--- .../src/pages/modes/PlanStructurePage.jsx | 3 +- frontend/src/styles/components.css | 83 ++++++++- frontend/src/styles/program-chrome.css | 7 + 14 files changed, 529 insertions(+), 135 deletions(-) create mode 100644 frontend/src/components/BacklogItemForm.jsx create mode 100644 frontend/src/components/Modal.jsx diff --git a/.cursor/rules/kairo-deployment-testing.mdc b/.cursor/rules/kairo-deployment-testing.mdc index bdb92e3..141a655 100644 --- a/.cursor/rules/kairo-deployment-testing.mdc +++ b/.cursor/rules/kairo-deployment-testing.mdc @@ -19,9 +19,22 @@ Praktische Verifikation erfolgt durch **Deployment auf ein entferntes System (Ra 2. Deployment wird dadurch ausgelöst (CI/Deploy-Pipeline auf dem Raspberry) 3. Dort laufen Migrationen, Backend-Tests und Smoke-Checks gegen echte Infrastruktur +**Dev-Instanz (kein localhost):** [https://dev.kairo.jinkendo.de](https://dev.kairo.jinkendo.de) +Schnellcheck: `GET https://dev.kairo.jinkendo.de/api/health` (Version + DB). + +**Gitea Actions** (Test-Suite läuft nach Deploy automatisch): + +- Übersicht: `http://192.168.2.144:3000/Lars/Kairo-Jinkendo/actions` +- Workflows: `deploy-dev.yml` (Deploy), `test.yml` (pytest, lint, k6, Playwright) +- Filter z. B. `?workflow=test.yml` oder `?workflow=deploy-dev.yml` +- Run-Detail: `/Lars/Kairo-Jinkendo/actions/runs/{id}` + +Nach Push auf `develop`: Deploy-Run grün → Health auf Dev → Test-Suite in Gitea Actions prüfen. + ## Konsequenz für Agenten - Code und Tests **schreiben** und dokumentieren — aber fehlende lokale DB nicht als Implementierungsblocker behandeln - Frontend: `npm test` / `vite build` lokal weiterhin sinnvoll, wenn Node verfügbar -- Backend: nach AP-Umsetzung Abschlussbericht mit „Remote-Verifikation nach Push auf develop“ kennzeichnen +- Backend: Abnahme über Gitea Actions (`test.yml`) + Dev-Health — nicht lokales pytest erzwingen +- Funktionale Checks gegen **https://dev.kairo.jinkendo.de**, nicht localhost - **Nicht** proaktiv committen/pushen, es sei denn, der Nutzer bittet explizit darum diff --git a/backend/version.py b/backend/version.py index 8aaa9ed..825c34d 100644 --- a/backend/version.py +++ b/backend/version.py @@ -1,3 +1,3 @@ -APP_VERSION = "0.16.5-ap1.12a" +APP_VERSION = "0.16.6-ap1.12b" DB_SCHEMA_VERSION = "014" APP_NAME = "jinkendo-kairo" diff --git a/frontend/src/components/BacklogItemForm.jsx b/frontend/src/components/BacklogItemForm.jsx new file mode 100644 index 0000000..4b9b3d2 --- /dev/null +++ b/frontend/src/components/BacklogItemForm.jsx @@ -0,0 +1,102 @@ +import { + BACKLOG_STATUSES, + BACKLOG_STATUS_LABELS, + PRIORITIES, + PRIORITY_LABELS, +} from '../constants/status.js' +import { GateSelect } from './GateSelect.jsx' + +export function BacklogItemForm({ + initial = {}, + roadmapItems = [], + onSubmit, + onCancel, + busy = false, + submitLabel = 'Speichern', + allowStatus = true, +}) { + async function handleSubmit(e) { + e.preventDefault() + const form = e.target + const gateValue = form.roadmap_item_id?.value ?? '' + await onSubmit({ + title: form.title.value.trim(), + description: form.description.value, + status: form.status?.value, + priority: form.priority.value, + roadmap_item_id: gateValue || undefined, + clear_roadmap_item: gateValue === '', + }) + } + + const statusLocked = initial.status === 'converted' + + return ( +
+ +