from typing import Optional from bson import ObjectId from rio import Component, Rectangle, Column, Text, Row, PointerEventListener, TextInput from rio.event import on_populate from elm.types import UserSession, Ticket, Seat from elm.components import ElmButton from elm.services import UserService class AccountInfoBox(Component): mail: str = "" new_password: str = "" account_info_text: str = " " account_info_is_error: bool = False password_input_blocked: bool = False password_change_in_progress: bool = False ticket: Optional[Ticket] = None seat: Optional[Seat] = None @on_populate async def on_populate(self) -> None: try: user = await self.session[UserService].get_user(self.session[UserSession].user_name) if user: self.mail = user.user_mail self.ticket = await Ticket.find_one({"owner.$id": user.id}) self.seat = await Seat.find_one({"user.$id": ObjectId(user.id)}) else: self.session.navigate_to("./login") except KeyError: self.session.navigate_to("./login") async def set_new_password(self) -> None: self.password_change_in_progress = True self.password_input_blocked = True if len(self.new_password) == 0: self.account_info_is_error = True self.account_info_text = "Kein Passwort gesetzt" self.password_input_blocked = False self.password_change_in_progress = False return user = await self.session[UserService].get_user(self.session[UserSession].user_name) if not user: self.account_info_is_error = True self.account_info_text = "Unbekannter Fehler" self.password_input_blocked = False self.password_change_in_progress = False return result = await self.session[UserService].change_user_password(user.user_name, self.new_password) if result: self.account_info_is_error = False self.account_info_text = "Passwort geƤndert" self.password_input_blocked = False self.password_change_in_progress = False else: self.account_info_is_error = True self.account_info_text = "Unbekannter Fehler" self.password_input_blocked = False self.password_change_in_progress = False def build(self) -> Component: row_col = Row ticket_text = "-" seat_text = "-" if self.ticket: ticket_text = self.ticket.category if self.seat: seat_text = self.seat.seat_id if self.session.is_mobile(): row_col = Column return Rectangle( content=Column( Rectangle( content=Rectangle( content=Text("Account Informationen", margin=0.5, selectable=False, overflow="wrap"), fill=self.session.theme.header_box_background_color, margin=0.4 ), stroke_width=0.1, stroke_color=self.session.theme.box_border_color, ), Column( TextInput(text=self.session[UserSession].user_name, label="Nutzername", is_sensitive=False), TextInput(text=self.mail, label="E-Mail Adresse", is_sensitive=False), row_col( PointerEventListener( Rectangle( content=Row(Text("Ticket:", margin=1, overflow="wrap", justify="left"), Text(ticket_text, margin=1, overflow="wrap", justify="right")), fill=self.session.theme.success_color if self.ticket else self.session.theme.danger_color_dark, stroke_width=0.1, stroke_color=self.session.theme.success_color if self.ticket else self.session.theme.danger_color, hover_fill=self.session.theme.success_color if self.ticket else self.session.theme.danger_color, hover_stroke_width=0.1, hover_stroke_color=self.session.theme.success_color if self.ticket else self.session.theme.danger_color_dark, transition_time=0.2, cursor="pointer" ), on_press=lambda _: self.session.navigate_to("./tickets") ), PointerEventListener( Rectangle( content=Row(Text("Sitzplatz:", margin=1, overflow="wrap", justify="left"), Text(seat_text, margin=1, overflow="wrap", justify="right")), fill=self.session.theme.success_color if self.seat else self.session.theme.danger_color_dark, stroke_width=0.1, stroke_color=self.session.theme.success_color if self.seat else self.session.theme.danger_color, hover_fill=self.session.theme.success_color if self.seat else self.session.theme.danger_color, hover_stroke_width=0.1, hover_stroke_color=self.session.theme.success_color if self.seat else self.session.theme.danger_color_dark, transition_time=0.2, cursor="pointer" ), on_press=lambda _: self.session.navigate_to("./seating") ), spacing=1 ), row_col( TextInput(text=self.bind().new_password, label="Neues Passwort", is_secret=True, is_sensitive=not self.password_input_blocked, grow_x=True), ElmButton( text="Speichern", style="normal", wrap=self.session.is_mobile(), on_press=self.set_new_password, is_loading=self.password_change_in_progress ), spacing=1 ), Text(text=self.account_info_text, fill=self.session.theme.danger_color if self.account_info_is_error else self.session.theme.success_color), spacing=1, margin=1 ) ), fill=self.session.theme.box_color, stroke_width=0.1, stroke_color=self.session.theme.box_border_color )