home: split cases table by appeal type + add appeal-type chart
All checks were successful
Build & Deploy / build-and-deploy (push) Successful in 32s

Backend (cases listing)
- /api/cases: also return updated_at, created_at, practice_area,
  appeal_subtype, subject. The detail-mode response was previously
  dropping these even though db.list_cases reads them, leaving the
  UI's "תחום" and "עודכן" columns blank.

Frontend
- Split the home table into two: רישוי (1xxx) and היטל השבחה ופיצויים
  (8xxx + 9xxx), bucketing on appeal_subtype with a case-number-prefix
  fallback. The "תחום" column is now redundant and removed.
- New AppealTypeBars chart in the right rail next to the existing
  status donut.
- Donut: switch to a vertical layout (donut on top, legend below in a
  3-col grid) so labels like "חדש / בעיבוד" no longer wrap inside the
  320px sidebar; counts now align in a tabular column.
- CasesTable accepts emptyText/searchPlaceholder so each split table
  has its own copy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-02 15:44:41 +00:00
parent f7249b7807
commit e849285806
5 changed files with 160 additions and 41 deletions

View File

@@ -1080,6 +1080,9 @@ async def list_cases(
"title": c["title"],
"status": c["status"],
"archived_at": c["archived_at"].isoformat() if c.get("archived_at") else None,
"updated_at": c["updated_at"].isoformat() if c.get("updated_at") else None,
"practice_area": c.get("practice_area"),
"appeal_subtype": c.get("appeal_subtype"),
}
for c in cases
]
@@ -1100,10 +1103,15 @@ async def list_cases(
"case_number": c["case_number"],
"title": c["title"],
"status": c["status"],
"subject": c.get("subject", "") or "",
"expected_outcome": c.get("expected_outcome", ""),
"committee_type": c.get("committee_type", ""),
"hearing_date": str(c["hearing_date"]) if c.get("hearing_date") else "",
"archived_at": c["archived_at"].isoformat() if c.get("archived_at") else None,
"created_at": c["created_at"].isoformat() if c.get("created_at") else None,
"updated_at": c["updated_at"].isoformat() if c.get("updated_at") else None,
"practice_area": c.get("practice_area"),
"appeal_subtype": c.get("appeal_subtype"),
"document_count": doc_count,
"processing_count": processing_count,
"gitea_url": f"https://gitea.nautilus.marcusgroup.org/cases/{c['case_number']}",