diff --git a/app/pages/settings.py b/app/pages/settings.py index 4cbec11..9f6251e 100644 --- a/app/pages/settings.py +++ b/app/pages/settings.py @@ -60,6 +60,15 @@ def settings_page(workspace_id: str) -> None: return None return parsed if parsed >= 0 else None + def display_number_input_value(value: object) -> str: + try: + parsed = float(value) + except (TypeError, ValueError): + return "" + if parsed.is_integer(): + return str(int(parsed)) + return str(parsed) + def build_preview_config() -> PortfolioConfig: parsed_loan_amount = as_non_negative_float(loan_amount.value) if parsed_loan_amount is None: @@ -132,7 +141,7 @@ def settings_page(workspace_id: str) -> None: loan_amount = ( ui.input( "Loan amount ($)", - value=str(config.loan_amount), + value=display_number_input_value(config.loan_amount), ) .props("type=number min=0 step=1000") .classes("w-full") @@ -345,9 +354,12 @@ def settings_page(workspace_id: str) -> None: if collateral_value is not None and collateral_value > 0 and loan is not None: ltv = (loan / collateral_value) * 100 - buffer = ((margin or 0.0) - loan / collateral_value) * 100 if margin is not None else 0.0 ltv_display.set_text(f"{ltv:.1f}%") - buffer_display.set_text(f"{buffer:.1f}%") + if margin is not None: + buffer = (margin - loan / collateral_value) * 100 + buffer_display.set_text(f"{buffer:.1f}%") + else: + buffer_display.set_text("—") else: ltv_display.set_text("—") buffer_display.set_text("—") diff --git a/tests/test_settings_validation_playwright.py b/tests/test_settings_validation_playwright.py index 5f9450a..31c135c 100644 --- a/tests/test_settings_validation_playwright.py +++ b/tests/test_settings_validation_playwright.py @@ -36,4 +36,7 @@ def test_settings_reject_invalid_loan_amount_without_silent_zero_fallback() -> N assert "Server error" not in settings_text assert "Traceback" not in settings_text + page.reload(wait_until="domcontentloaded", timeout=30000) + expect(page.get_by_label("Loan amount ($)")).to_have_value("145000") + browser.close()