feat(DISPLAY-001): add underlying mode switching
This commit is contained in:
@@ -5,6 +5,7 @@ import logging
|
||||
from fastapi.responses import RedirectResponse
|
||||
from nicegui import ui
|
||||
|
||||
from app.domain.conversions import collateral_to_display_units, format_display_quantity, get_display_mode_label
|
||||
from app.domain.portfolio_math import resolve_portfolio_spot_from_quote
|
||||
from app.models.workspace import get_workspace_repository
|
||||
from app.pages.common import (
|
||||
@@ -121,16 +122,25 @@ async def _render_hedge_page(workspace_id: str | None = None) -> None:
|
||||
)
|
||||
updated_label = f"Quote timestamp: {quote_updated_at}" if quote_updated_at else "Quote timestamp: unavailable"
|
||||
|
||||
# Get underlying for display
|
||||
# Get underlying and display mode for display
|
||||
underlying = "GLD"
|
||||
display_mode = "GLD"
|
||||
display_label = "GLD Shares"
|
||||
if workspace_id:
|
||||
try:
|
||||
repo = get_workspace_repository()
|
||||
config = repo.load_portfolio_config(workspace_id)
|
||||
underlying = config.underlying or "GLD"
|
||||
display_mode = config.display_mode or "GLD"
|
||||
display_label = get_display_mode_label(display_mode)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Compute display unit values
|
||||
collateral_qty, collateral_unit = collateral_to_display_units(
|
||||
float(portfolio.get("gold_units", 0.0)), display_mode
|
||||
)
|
||||
|
||||
with dashboard_page(
|
||||
"Hedge Analysis",
|
||||
f"Compare hedge structures across scenarios, visualize cost-benefit tradeoffs, and inspect net equity impacts for {underlying}.",
|
||||
@@ -138,7 +148,10 @@ async def _render_hedge_page(workspace_id: str | None = None) -> None:
|
||||
workspace_id=workspace_id,
|
||||
):
|
||||
with ui.row().classes("w-full items-center justify-between gap-4 max-md:flex-col max-md:items-start"):
|
||||
ui.label(f"Active underlying: {underlying}").classes("text-sm text-slate-500 dark:text-slate-400")
|
||||
ui.label(
|
||||
f"Active underlying: {underlying} · Display mode: {display_label} · "
|
||||
f"Collateral: {format_display_quantity(collateral_qty, collateral_unit)} {collateral_unit}"
|
||||
).classes("text-sm text-slate-500 dark:text-slate-400")
|
||||
|
||||
left_pane, right_pane = split_page_panes(
|
||||
left_testid="hedge-left-pane",
|
||||
@@ -249,11 +262,15 @@ async def _render_hedge_page(workspace_id: str | None = None) -> None:
|
||||
"text-sm text-slate-500 dark:text-slate-400"
|
||||
)
|
||||
ui.label(strategy["description"]).classes("text-sm text-slate-600 dark:text-slate-300")
|
||||
# Compute display unit values for summary
|
||||
collateral_qty, collateral_unit = collateral_to_display_units(
|
||||
float(portfolio.get("gold_units", 0.0)), display_mode
|
||||
)
|
||||
with ui.grid(columns=1).classes("w-full gap-4 sm:grid-cols-2 lg:grid-cols-1 xl:grid-cols-2"):
|
||||
cards = [
|
||||
("Start value", f"${portfolio['gold_value']:,.0f}"),
|
||||
("Start price", f"${portfolio['spot_price']:,.2f}/oz"),
|
||||
("Weight", f"{portfolio['gold_units']:,.0f} oz"),
|
||||
("Weight", f"{format_display_quantity(collateral_qty, collateral_unit)} {collateral_unit}"),
|
||||
("Loan amount", f"${portfolio['loan_amount']:,.0f}"),
|
||||
("Margin call LTV", f"{portfolio['margin_call_ltv']:.1%}"),
|
||||
("Monthly hedge budget", f"${portfolio['hedge_budget']:,.0f}"),
|
||||
|
||||
Reference in New Issue
Block a user