fix: return FT components directly for proper toast injection
POST routes were returning HTMLResponse(content=to_xml(...)) which bypassed FastHTML's toast middleware. The middleware only injects toasts for tuple, FT, or FtResponse responses. Changed 12 routes to return render_page() directly: - actions.py: 7 routes (cohort, hatch, tag-add, tag-end, attrs, outcome, status-correct) - eggs.py: 2 routes (product-collected, product-sold) - feed.py: 2 routes (feed-given, feed-purchased) - move.py: 1 route (animal-move) Updated tests to check for toast content in response body instead of session cookie, since middleware now renders toasts inline. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -206,15 +206,11 @@ async def animal_cohort(request: Request, session):
|
||||
)
|
||||
|
||||
# Success: re-render fresh form
|
||||
return HTMLResponse(
|
||||
content=to_xml(
|
||||
render_page(
|
||||
request,
|
||||
cohort_form(locations, species_list),
|
||||
title="Create Cohort - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
),
|
||||
return render_page(
|
||||
request,
|
||||
cohort_form(locations, species_list),
|
||||
title="Create Cohort - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -349,15 +345,11 @@ async def hatch_recorded(request: Request, session):
|
||||
)
|
||||
|
||||
# Success: re-render fresh form
|
||||
return HTMLResponse(
|
||||
content=to_xml(
|
||||
render_page(
|
||||
request,
|
||||
hatch_form(locations, species_list),
|
||||
title="Record Hatch - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
),
|
||||
return render_page(
|
||||
request,
|
||||
hatch_form(locations, species_list),
|
||||
title="Record Hatch - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -694,15 +686,11 @@ async def animal_tag_add(request: Request, session):
|
||||
)
|
||||
|
||||
# Success: re-render fresh form
|
||||
return HTMLResponse(
|
||||
content=to_xml(
|
||||
render_page(
|
||||
request,
|
||||
tag_add_form(),
|
||||
title="Add Tag - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
),
|
||||
return render_page(
|
||||
request,
|
||||
tag_add_form(),
|
||||
title="Add Tag - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -947,15 +935,11 @@ async def animal_tag_end(request: Request, session):
|
||||
)
|
||||
|
||||
# Success: re-render fresh form
|
||||
return HTMLResponse(
|
||||
content=to_xml(
|
||||
render_page(
|
||||
request,
|
||||
tag_end_form(),
|
||||
title="End Tag - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
),
|
||||
return render_page(
|
||||
request,
|
||||
tag_end_form(),
|
||||
title="End Tag - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -1183,15 +1167,11 @@ async def animal_attrs(request: Request, session):
|
||||
)
|
||||
|
||||
# Success: re-render fresh form
|
||||
return HTMLResponse(
|
||||
content=to_xml(
|
||||
render_page(
|
||||
request,
|
||||
attrs_form(),
|
||||
title="Update Attributes - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
),
|
||||
return render_page(
|
||||
request,
|
||||
attrs_form(),
|
||||
title="Update Attributes - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -1468,22 +1448,18 @@ async def animal_outcome(request: Request, session):
|
||||
product_repo = ProductRepository(db)
|
||||
products = [(p.code, p.name) for p in product_repo.list_all() if p.active]
|
||||
|
||||
return HTMLResponse(
|
||||
content=to_xml(
|
||||
render_page(
|
||||
request,
|
||||
outcome_form(
|
||||
filter_str="",
|
||||
resolved_ids=[],
|
||||
roster_hash="",
|
||||
ts_utc=int(time.time() * 1000),
|
||||
resolved_count=0,
|
||||
products=products,
|
||||
),
|
||||
title="Record Outcome - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
return render_page(
|
||||
request,
|
||||
outcome_form(
|
||||
filter_str="",
|
||||
resolved_ids=[],
|
||||
roster_hash="",
|
||||
ts_utc=int(time.time() * 1000),
|
||||
resolved_count=0,
|
||||
products=products,
|
||||
),
|
||||
title="Record Outcome - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
|
||||
|
||||
@@ -1692,21 +1668,17 @@ async def animal_status_correct(req: Request, session):
|
||||
)
|
||||
|
||||
# Success: re-render fresh form
|
||||
return HTMLResponse(
|
||||
content=to_xml(
|
||||
render_page(
|
||||
req,
|
||||
status_correct_form(
|
||||
filter_str="",
|
||||
resolved_ids=[],
|
||||
roster_hash="",
|
||||
ts_utc=int(time.time() * 1000),
|
||||
resolved_count=0,
|
||||
),
|
||||
title="Correct Status - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
return render_page(
|
||||
req,
|
||||
status_correct_form(
|
||||
filter_str="",
|
||||
resolved_ids=[],
|
||||
roster_hash="",
|
||||
ts_utc=int(time.time() * 1000),
|
||||
resolved_count=0,
|
||||
),
|
||||
title="Correct Status - AnimalTrack",
|
||||
active_nav=None,
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -209,22 +209,18 @@ async def product_collected(request: Request, session):
|
||||
)
|
||||
|
||||
# Success: re-render form with location sticking, qty cleared
|
||||
return HTMLResponse(
|
||||
content=to_xml(
|
||||
render_page(
|
||||
request,
|
||||
eggs_page(
|
||||
locations,
|
||||
products,
|
||||
active_tab="harvest",
|
||||
selected_location_id=location_id,
|
||||
harvest_action=product_collected,
|
||||
sell_action=product_sold,
|
||||
),
|
||||
title="Eggs - AnimalTrack",
|
||||
active_nav="eggs",
|
||||
)
|
||||
return render_page(
|
||||
request,
|
||||
eggs_page(
|
||||
locations,
|
||||
products,
|
||||
active_tab="harvest",
|
||||
selected_location_id=location_id,
|
||||
harvest_action=product_collected,
|
||||
sell_action=product_sold,
|
||||
),
|
||||
title="Eggs - AnimalTrack",
|
||||
active_nav="eggs",
|
||||
)
|
||||
|
||||
|
||||
@@ -320,22 +316,18 @@ async def product_sold(request: Request, session):
|
||||
)
|
||||
|
||||
# Success: re-render form with product sticking
|
||||
return HTMLResponse(
|
||||
content=to_xml(
|
||||
render_page(
|
||||
request,
|
||||
eggs_page(
|
||||
locations,
|
||||
products,
|
||||
active_tab="sell",
|
||||
selected_product_code=product_code,
|
||||
harvest_action=product_collected,
|
||||
sell_action=product_sold,
|
||||
),
|
||||
title="Eggs - AnimalTrack",
|
||||
active_nav="eggs",
|
||||
)
|
||||
return render_page(
|
||||
request,
|
||||
eggs_page(
|
||||
locations,
|
||||
products,
|
||||
active_tab="sell",
|
||||
selected_product_code=product_code,
|
||||
harvest_action=product_collected,
|
||||
sell_action=product_sold,
|
||||
),
|
||||
title="Eggs - AnimalTrack",
|
||||
active_nav="eggs",
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -245,25 +245,21 @@ async def feed_given(request: Request, session):
|
||||
)
|
||||
|
||||
# Success: re-render form with location/type sticking, amount reset
|
||||
return HTMLResponse(
|
||||
content=str(
|
||||
render_page(
|
||||
request,
|
||||
feed_page(
|
||||
locations,
|
||||
feed_types,
|
||||
active_tab="give",
|
||||
selected_location_id=location_id,
|
||||
selected_feed_type_code=feed_type_code,
|
||||
default_amount_kg=default_amount_kg,
|
||||
balance_warning=balance_warning,
|
||||
give_action=feed_given,
|
||||
purchase_action=feed_purchased,
|
||||
),
|
||||
title="Feed - AnimalTrack",
|
||||
active_nav="feed",
|
||||
)
|
||||
return render_page(
|
||||
request,
|
||||
feed_page(
|
||||
locations,
|
||||
feed_types,
|
||||
active_tab="give",
|
||||
selected_location_id=location_id,
|
||||
selected_feed_type_code=feed_type_code,
|
||||
default_amount_kg=default_amount_kg,
|
||||
balance_warning=balance_warning,
|
||||
give_action=feed_given,
|
||||
purchase_action=feed_purchased,
|
||||
),
|
||||
title="Feed - AnimalTrack",
|
||||
active_nav="feed",
|
||||
)
|
||||
|
||||
|
||||
@@ -404,21 +400,17 @@ async def feed_purchased(request: Request, session):
|
||||
)
|
||||
|
||||
# Success: re-render form with fields cleared
|
||||
return HTMLResponse(
|
||||
content=str(
|
||||
render_page(
|
||||
request,
|
||||
feed_page(
|
||||
locations,
|
||||
feed_types,
|
||||
active_tab="purchase",
|
||||
give_action=feed_given,
|
||||
purchase_action=feed_purchased,
|
||||
),
|
||||
title="Feed - AnimalTrack",
|
||||
active_nav="feed",
|
||||
)
|
||||
return render_page(
|
||||
request,
|
||||
feed_page(
|
||||
locations,
|
||||
feed_types,
|
||||
active_tab="purchase",
|
||||
give_action=feed_given,
|
||||
purchase_action=feed_purchased,
|
||||
),
|
||||
title="Feed - AnimalTrack",
|
||||
active_nav="feed",
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -299,18 +299,14 @@ async def animal_move(request: Request, session):
|
||||
)
|
||||
|
||||
# Success: re-render fresh form (nothing sticks per spec)
|
||||
return HTMLResponse(
|
||||
content=to_xml(
|
||||
render_page(
|
||||
request,
|
||||
move_form(
|
||||
locations,
|
||||
action=animal_move,
|
||||
),
|
||||
title="Move - AnimalTrack",
|
||||
active_nav="move",
|
||||
)
|
||||
return render_page(
|
||||
request,
|
||||
move_form(
|
||||
locations,
|
||||
action=animal_move,
|
||||
),
|
||||
title="Move - AnimalTrack",
|
||||
active_nav="move",
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user