from typing import Optional from rio import Column, Component, event, TextStyle, Text, ScrollContainer, Row, Button, Spacer, IconButton from src.ez_lan_manager import ConfigurationService, CateringService, AccountingService from src.ez_lan_manager.components.CateringCartItem import CateringCartItem from src.ez_lan_manager.components.MainViewContentBox import MainViewContentBox from src.ez_lan_manager.pages import BasePage from src.ez_lan_manager.types.CateringMenuItem import CateringMenuItem from src.ez_lan_manager.types.SessionStorage import SessionStorage class CateringPage(Component): def __post_init__(self) -> None: self.session[SessionStorage].subscribe_to_logged_in_or_out_event(self.__class__.__name__, self.on_user_logged_in_status_changed) @event.on_populate async def on_populate(self) -> None: await self.session.set_title(f"{self.session[ConfigurationService].get_lan_info().name} - Catering") async def on_user_logged_in_status_changed(self) -> None: await self.force_refresh() async def on_remove_item(self, list_id: int) -> None: catering_service = self.session[CateringService] user_id = self.session[SessionStorage].user_id cart = catering_service.get_cart(user_id) try: cart.pop(list_id) except IndexError: return catering_service.save_cart(user_id, cart) await self.force_refresh() async def on_empty_cart_pressed(self) -> None: self.session[CateringService].save_cart(self.session[SessionStorage].user_id, []) await self.force_refresh() def build(self) -> Component: user_id = self.session[SessionStorage].user_id catering_service = self.session[CateringService] cart = catering_service.get_cart(user_id) cart_container = ScrollContainer( content=Column( *[CateringCartItem( article_name=cart_item.name, article_price=cart_item.price, article_id=cart_item.item_id, remove_item_cb=self.on_remove_item, list_id=idx ) for idx, cart_item in enumerate(cart)], Spacer(grow_y=True) ), min_height=8, min_width=33, margin=1 ) shopping_cart = MainViewContentBox( Column( Text( text="Catering", style=TextStyle( fill=self.session.theme.background_color, font_size=1.2 ), margin_top=2, margin_bottom=0, align_x=0.5 ), Text( text="Warenkorb", style=TextStyle( fill=self.session.theme.background_color, font_size=0.8 ), margin_top=0.2, margin_bottom=0, align_x=0.5 ), cart_container, Row( Text( text=f"Preis: {AccountingService.make_euro_string_from_int(sum(cart_item.price for cart_item in cart))}", style=TextStyle( fill=self.session.theme.background_color, font_size=0.8 ), margin=1 ), Button( content=Text( "Warenkorb leeren", style=TextStyle(fill=self.session.theme.danger_color, font_size=0.9), align_x=0.2 ), margin=1, margin_left=0, shape="rectangle", style="major", color="primary", on_press=self.on_empty_cart_pressed ), Button( content=Text( "Bestellen", style=TextStyle(fill=self.session.theme.success_color, font_size=0.9), align_x=0.2 ), margin=1, margin_left=0, shape="rectangle", style="major", color="primary" ), ) ) ) if user_id else Spacer() return BasePage( content=Column( # SHOPPING CART shopping_cart, # ITEM SELECTION MainViewContentBox( ), align_y=0 ) )