class Invoice(PageState):
status: str = field(default="sent")
def set_status(status: str) -> None:
Invoice().status = status
@refreshable(deps=[Invoice])
def invoice_status() -> None:
label, color = {"sent": ("Sent", "info"), "paid": ("Paid", "success"),
"void": ("Void", "error")}[str(Invoice().status)]
with ui.hstack(gap="md"):
ui.text("INV-2041 · Northwind Traders", weight="medium")
ui.badge(label, color=color, variant="soft")
def change_status() -> None:
menu = ui.button("Change status", icon_right="chevron-down", variant="outline",
size="sm")
with ui.card(padding="sm", classes="w-full max-w-lg"), ui.hstack(justify="between"):
invoice_status()
with ui.dropdown(trigger=menu, align="end"):
ui.dropdown_item(label="Mark as paid", icon_left="circle-check",
color="success", on_click=partial(set_status, "paid"))
ui.dropdown_item(label="Back to sent", icon_left="send",
on_click=partial(set_status, "sent"))
ui.dropdown_item(label="Send a reminder", icon_left="bell-ring",
color="warning", disabled=True)
ui.dropdown_item(label="Void the invoice", icon_left="ban",
color="error", on_click=partial(set_status, "void"))