feat: allow deleting housekeeper tasks

This commit is contained in:
Marcel Peterkau
2026-06-21 18:09:04 +02:00
parent 3e9f347435
commit c717d6806b
6 changed files with 110 additions and 2 deletions
+30 -1
View File
@@ -1,7 +1,7 @@
import tkinter as tk
from collections import Counter
from collections.abc import Callable
from tkinter import ttk
from tkinter import messagebox, ttk
from ccma.domain.dates import format_date_for_display
from ccma.domain.models import MEMBERSHIP_STATUS_LABELS, HousekeeperFinding, Member
@@ -188,12 +188,14 @@ class HousekeeperTab(ttk.Frame):
findings: list[HousekeeperFinding],
on_open_member: Callable[[str], None],
on_refresh: Callable[[], list[HousekeeperFinding]],
on_delete: Callable[[str], list[HousekeeperFinding]],
on_close: Callable[[], None],
):
super().__init__(master, padding=12)
self.findings = findings
self.on_open_member = on_open_member
self.on_refresh = on_refresh
self.on_delete = on_delete
self.on_close = on_close
self._build_ui()
@@ -241,6 +243,13 @@ class HousekeeperTab(ttk.Frame):
style="Status.TLabel",
)
self.detail_label.grid(row=0, column=0, sticky="ew")
self.delete_button = ttk.Button(
details,
text="Task löschen",
command=self._delete_selected,
state="disabled",
)
self.delete_button.grid(row=0, column=1, sticky="ne", padx=(12, 0))
details.bind(
"<Configure>",
lambda event: self.detail_label.configure(wraplength=max(300, event.width - 32)),
@@ -254,6 +263,7 @@ class HousekeeperTab(ttk.Frame):
def _render(self) -> None:
self.tree.delete(*self.tree.get_children())
self.detail_var.set("Eintrag auswählen, um Details anzuzeigen.")
self.delete_button.configure(state="disabled")
self.title_var.set(f"HAUSMEISTER · {len(self.findings)} Vorgänge")
for index, finding in enumerate(self.findings):
self.tree.insert(
@@ -267,11 +277,28 @@ class HousekeeperTab(ttk.Frame):
selected = self.tree.selection()
if not selected:
self.detail_var.set("Eintrag auswählen, um Details anzuzeigen.")
self.delete_button.configure(state="disabled")
return
index = int(selected[0])
if index >= len(self.findings):
return
self.detail_var.set(_finding_details(self.findings[index]))
self.delete_button.configure(state="normal" if self.findings[index].key else "disabled")
def _delete_selected(self) -> None:
selected = self.tree.selection()
if not selected:
return
finding = self.findings[int(selected[0])]
if not finding.key or not messagebox.askyesno(
"Hausmeister-Task löschen",
f"Task wirklich löschen?\n\n{finding.title}\n\n"
"Falls die Ursache weiter besteht, wird er beim nächsten Lauf neu angelegt.",
parent=self,
):
return
self.findings = self.on_delete(finding.key)
self._render()
def _open_selected(self) -> None:
selected = self.tree.selection()
@@ -281,6 +308,8 @@ class HousekeeperTab(ttk.Frame):
def _finding_details(finding: HousekeeperFinding) -> str:
lines = [f"{finding.severity.upper()} · {finding.code}", finding.title]
if finding.key:
lines.append(f"Key: {finding.key}")
if finding.due_date:
lines.append(f"Fällig: {format_date_for_display(finding.due_date.isoformat())}")
if finding.detail: