From 0269decb870719734c4e54450ba4b35dec61f84b Mon Sep 17 00:00:00 2001 From: type-two Date: Mon, 22 Jun 2026 23:58:10 +1000 Subject: [PATCH] =?UTF-8?q?feat(search):=20editable=20Rack=20Info=20(name)?= =?UTF-8?q?=20+=20Reorganize=20planner=20UI=20(scan=20source=20crates=20?= =?UTF-8?q?=E2=86=92=20filter=20=E2=86=92=20A-Z=20distribute=20into=20targ?= =?UTF-8?q?et=20crates=20=E2=86=92=20review=20=E2=86=92=20apply)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- app/navigator_routes.py | 17 +++++++++ site/search.html | 78 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/app/navigator_routes.py b/app/navigator_routes.py index e86ab66..6a5f84d 100644 --- a/app/navigator_routes.py +++ b/app/navigator_routes.py @@ -81,6 +81,23 @@ async def rack_detail(rack_id: int, ident=Depends(require_token), db=Depends(get return {"ok": True, "rack": dict(rack), "crates": crates, "levels": levels} +class RackEditIn(BaseModel): + name: str | None = None + + +@router.post("/rack/{rack_id}") +async def rack_edit(rack_id: int, body: RackEditIn, ident=Depends(require_token), db=Depends(get_db)): + fields = {k: v for k, v in body.model_dump().items() if v is not None} + if not fields: + return {"ok": True, "unchanged": True} + sets = ", ".join(f"{k} = :{k}" for k in fields) + ", updated_at = now()" + r = await db.execute(text(f"UPDATE virtual_rack SET {sets} WHERE id = :i"), {**fields, "i": rack_id}) + await db.commit() + if not r.rowcount: + raise HTTPException(404, "rack not found") + return {"ok": True} + + @router.get("/crate/{crate_id}") async def crate_contents(crate_id: int, ident=Depends(require_token), db=Depends(get_db)): """A crate's records, in slot order โ€” the Crate Contents list.""" diff --git a/site/search.html b/site/search.html index 64b67a5..b44f612 100644 --- a/site/search.html +++ b/site/search.html @@ -100,6 +100,8 @@ Store map + +