Compare commits

...

2 Commits

Author SHA1 Message Date
David Rodenkirchen
f58a7872ef periodically refresh order status 2025-03-26 00:07:04 +01:00
David Rodenkirchen
23e903a207 add additional info to seating plan 2025-03-25 23:59:10 +01:00
4 changed files with 60 additions and 17 deletions

View File

@ -1,6 +1,6 @@
from typing import Callable from typing import Callable
from rio import Component, Rectangle, Grid, Column, Row, Text, TextStyle, Color from rio import Component, Rectangle, Grid, Column, Row, Text, TextStyle, Color, PointerEventListener
from src.ez_lan_manager.components.SeatingPlanPixels import SeatPixel, WallPixel, InvisiblePixel, TextPixel from src.ez_lan_manager.components.SeatingPlanPixels import SeatPixel, WallPixel, InvisiblePixel, TextPixel
from src.ez_lan_manager.types.Seat import Seat from src.ez_lan_manager.types.Seat import Seat
@ -71,6 +71,7 @@ class SeatingPlanLegend(Component):
class SeatingPlan(Component): class SeatingPlan(Component):
seat_clicked_cb: Callable seat_clicked_cb: Callable
seating_info: list[Seat] seating_info: list[Seat]
info_clicked_cb: Callable
def get_seat(self, seat_id: str) -> Seat: def get_seat(self, seat_id: str) -> Seat:
seat = next(filter(lambda seat_: seat_.seat_id == seat_id, self.seating_info), None) seat = next(filter(lambda seat_: seat_.seat_id == seat_id, self.seating_info), None)
@ -208,23 +209,44 @@ class SeatingPlan(Component):
grid.add(SeatPixel("E15", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("E15")), row=25, column=17, width=3, height=2) grid.add(SeatPixel("E15", on_press_cb=self.seat_clicked_cb, seat=self.get_seat("E15")), row=25, column=17, width=3, height=2)
# Stage # Stage
grid.add(TextPixel(text="Bühne"), row=16, column=1, width=29, height=4) grid.add(PointerEventListener(
# TextPixel(text="Bühne"),
on_press=lambda _: self.info_clicked_cb("Hier darf ab Freitag 20 Uhr ebenfalls geschlafen werden.")
), row=16, column=1, width=29, height=4)
# Drinks # Drinks
grid.add(TextPixel(text="G\ne\nt\nr\nä\nn\nk\ne"), row=20, column=30, width=4, height=12) grid.add(PointerEventListener(
TextPixel(text="G\ne\nt\nr\nä\nn\nk\ne"),
on_press=lambda _: self.info_clicked_cb("Ich mag Bier, B - I - R")
), row=20, column=30, width=4, height=12)
# Main Entrance # Main Entrance
grid.add(TextPixel(text="H\na\nl\nl\ne\nn\n\ne\ni\nn\ng\na\nn\ng"), row=33, column=56, width=4, height=27) grid.add(PointerEventListener(
# TextPixel(text="H\na\nl\nl\ne\nn\n\ne\ni\nn\ng\na\nn\ng"),
on_press=lambda _: self.info_clicked_cb("Hallo, ich bin ein Haupteingang")
), row=33, column=56, width=4, height=27)
# Sleeping # Sleeping
grid.add(TextPixel(icon_name="material/bed"), row=1, column=1, width=20, height=14) grid.add(PointerEventListener(
TextPixel(icon_name="material/bed"),
on_press=lambda _: self.info_clicked_cb("In diesem Raum kann geschlafen werden.\nAchtung: Hier werden nicht alle Teilnehmer Platz finden.")
), row=1, column=1, width=20, height=14)
# Toilet # Toilet
grid.add(TextPixel(icon_name="material/wc"), row=1, column=42, width=19, height=10) grid.add(PointerEventListener(
grid.add(TextPixel(icon_name="material/wc"), row=12, column=42, width=19, height=10) TextPixel(icon_name="material/wc"),
on_press=lambda _: self.info_clicked_cb("Damen Toilette")
), row=1, column=42, width=19, height=10)
grid.add(PointerEventListener(
TextPixel(icon_name="material/wc"),
on_press=lambda _: self.info_clicked_cb("Herren Toilette")
), row=12, column=42, width=19, height=10)
# Entry/Helpdesk # Entry/Helpdesk
grid.add(TextPixel(text="Einlass\n &Orga"), row=40, column=22, width=8, height=12) grid.add(PointerEventListener(
TextPixel(text="Einlass\n &Orga"),
on_press=lambda _: self.info_clicked_cb("Für alle Anliegen findest du hier rund um die Uhr jemanden vom Team.")
), row=40, column=22, width=8, height=12)
return Rectangle( return Rectangle(

View File

@ -16,8 +16,9 @@ class SeatingPlanInfoBox(Component):
seat_occupant: Optional[str] = None seat_occupant: Optional[str] = None
seat_price: Decimal = Decimal("0") seat_price: Decimal = Decimal("0")
is_blocked: bool = False is_blocked: bool = False
has_user_ticket = False has_user_ticket: bool = False
booking_button_text = "" booking_button_text: str = ""
override_text: str = "" # If this is set, all other functionality is disabled and the text is shown
@event.on_populate @event.on_populate
async def check_ticket(self) -> None: async def check_ticket(self) -> None:
@ -34,6 +35,11 @@ class SeatingPlanInfoBox(Component):
self.session.navigate_to("./buy_ticket") self.session.navigate_to("./buy_ticket")
def build(self) -> Component: def build(self) -> Component:
if self.override_text:
return Column(Text(self.override_text, margin=1,
style=TextStyle(fill=self.session.theme.neutral_color, font_size=1.4), overflow="wrap",
justify="center"), min_height=10)
if not self.show: if not self.show:
return Spacer() return Spacer()
if self.is_blocked: if self.is_blocked:
@ -69,7 +75,9 @@ class SeatingPlanInfoBox(Component):
grow_y=False, grow_y=False,
is_sensitive=not self.is_booking_blocked, is_sensitive=not self.is_booking_blocked,
on_press=self.purchase_clicked on_press=self.purchase_clicked
) if self.session[SessionStorage].user_id else Text(f"Du musst eingeloggt sein um einen Sitzplatz zu buchen", margin=1, ) if self.session[SessionStorage].user_id else Text(f"Du musst eingeloggt sein um einen Sitzplatz zu buchen",
style=TextStyle(fill=self.session.theme.neutral_color), overflow="wrap", justify="center"), margin=1,
style=TextStyle(fill=self.session.theme.neutral_color),
overflow="wrap", justify="center"),
min_height=10 min_height=10
) )

View File

@ -2,7 +2,7 @@ from asyncio import sleep, create_task
from decimal import Decimal from decimal import Decimal
import rio import rio
from rio import Component, Column, Text, TextStyle, Button, Row, ScrollContainer, Spacer, Popup, Table from rio import Component, Column, Text, TextStyle, Button, Row, ScrollContainer, Spacer, Popup, Table, event
from src.ez_lan_manager.components.CateringCartItem import CateringCartItem from src.ez_lan_manager.components.CateringCartItem import CateringCartItem
from src.ez_lan_manager.components.CateringOrderItem import CateringOrderItem from src.ez_lan_manager.components.CateringOrderItem import CateringOrderItem
@ -21,6 +21,11 @@ class ShoppingCartAndOrders(Component):
popup_is_shown: bool = False popup_is_shown: bool = False
popup_is_error: bool = True popup_is_error: bool = True
@event.periodic(5)
async def periodic_refresh_of_orders(self) -> None:
if not self.show_cart and not self.popup_is_shown:
self.orders = await self.session[CateringService].get_orders_for_user(self.session[SessionStorage].user_id)
async def switch(self) -> None: async def switch(self) -> None:
self.show_cart = not self.show_cart self.show_cart = not self.show_cart
self.orders = await self.session[CateringService].get_orders_for_user(self.session[SessionStorage].user_id) self.orders = await self.session[CateringService].get_orders_for_user(self.session[SessionStorage].user_id)

View File

@ -30,6 +30,7 @@ class SeatingPlanPage(Component):
purchase_box_loading: bool = False purchase_box_loading: bool = False
purchase_box_success_msg: Optional[str] = None purchase_box_success_msg: Optional[str] = None
purchase_box_error_msg: Optional[str] = None purchase_box_error_msg: Optional[str] = None
seating_info_text = ""
is_booking_blocked: bool = False is_booking_blocked: bool = False
@event.on_populate @event.on_populate
@ -47,6 +48,7 @@ class SeatingPlanPage(Component):
self.is_booking_blocked = True self.is_booking_blocked = True
async def on_seat_clicked(self, seat_id: str, _: PressEvent) -> None: async def on_seat_clicked(self, seat_id: str, _: PressEvent) -> None:
self.seating_info_text = ""
self.show_info_box = True self.show_info_box = True
self.show_purchase_box = False self.show_purchase_box = False
seat = next(filter(lambda s: s.seat_id == seat_id, self.seating_info), None) seat = next(filter(lambda s: s.seat_id == seat_id, self.seating_info), None)
@ -62,6 +64,12 @@ class SeatingPlanPage(Component):
else: else:
self.current_seat_occupant = None self.current_seat_occupant = None
async def on_info_clicked(self, text: str) -> None:
self.show_info_box = True
self.show_purchase_box = False
self.current_seat_id = None
self.seating_info_text = text
def set_error(self, msg: str) -> None: def set_error(self, msg: str) -> None:
self.purchase_box_error_msg = msg self.purchase_box_error_msg = msg
self.purchase_box_success_msg = None self.purchase_box_success_msg = None
@ -119,7 +127,7 @@ class SeatingPlanPage(Component):
Column( Column(
SeatingPlanInfoBox(seat_id=self.current_seat_id, seat_occupant=self.current_seat_occupant, seat_price=self.current_seat_price, SeatingPlanInfoBox(seat_id=self.current_seat_id, seat_occupant=self.current_seat_occupant, seat_price=self.current_seat_price,
is_blocked=self.current_seat_is_blocked, is_booking_blocked=self.is_booking_blocked, show=self.show_info_box, is_blocked=self.current_seat_is_blocked, is_booking_blocked=self.is_booking_blocked, show=self.show_info_box,
purchase_cb=self.on_purchase_clicked), purchase_cb=self.on_purchase_clicked, override_text=self.seating_info_text),
SeatingPurchaseBox( SeatingPurchaseBox(
show=self.show_purchase_box, show=self.show_purchase_box,
seat_id=self.current_seat_id, seat_id=self.current_seat_id,
@ -132,7 +140,7 @@ class SeatingPlanPage(Component):
) )
), ),
MainViewContentBox( MainViewContentBox(
SeatingPlan(seat_clicked_cb=self.on_seat_clicked, seating_info=self.seating_info) if self.seating_info else SeatingPlan(seat_clicked_cb=self.on_seat_clicked, seating_info=self.seating_info, info_clicked_cb=self.on_info_clicked) if self.seating_info else
Column(ProgressCircle(color=self.session.theme.secondary_color, margin=3), Column(ProgressCircle(color=self.session.theme.secondary_color, margin=3),
Text("Sitzplan wird geladen", style=TextStyle(fill=self.session.theme.neutral_color), align_x=0.5, margin=1)) Text("Sitzplan wird geladen", style=TextStyle(fill=self.session.theme.neutral_color), align_x=0.5, margin=1))
), ),