feat: two-step issue resolution (resolve then delete)

- New PATCH /issues/{id} endpoint to toggle resolved flag
- Add resolved:false to new issues
- Frontend: click "✓ Resolve" marks issue green with strikethrough
- Resolved issues show "↺ Reopen" and "🗑 Delete" buttons
- Delete requires confirmation
- Sort: unresolved first, then resolved
- Issues persist until explicitly deleted

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-04-10 09:48:20 +02:00
parent f2b43fce0b
commit 604d4376b4
3 changed files with 120 additions and 16 deletions

20
main.py
View file

@ -1368,6 +1368,7 @@ async def add_issue(issue: dict):
"category": issue.get("category", "other"),
"author": issue.get("author", "Anonymous").strip(),
"created": datetime.utcnow().isoformat(),
"resolved": False,
}
if not new_issue["title"]:
raise HTTPException(status_code=400, detail="Title is required")
@ -1376,9 +1377,26 @@ async def add_issue(issue: dict):
return new_issue
@app.patch("/issues/{issue_id}")
async def update_issue(issue_id: str, update: dict):
"""Update an issue (e.g. toggle resolved state)."""
issues = _load_issues()
found = None
for i in issues:
if i.get("id") == issue_id:
if "resolved" in update:
i["resolved"] = bool(update["resolved"])
found = i
break
if not found:
raise HTTPException(status_code=404, detail="Issue not found")
_save_issues(issues)
return found
@app.delete("/issues/{issue_id}")
async def delete_issue(issue_id: str):
"""Resolve (delete) an issue."""
"""Permanently delete an issue."""
issues = _load_issues()
issues = [i for i in issues if i.get("id") != issue_id]
_save_issues(issues)