diff --git a/src/EzLanManager.py b/src/EzLanManager.py index 40fb59c..64b25c3 100644 --- a/src/EzLanManager.py +++ b/src/EzLanManager.py @@ -69,12 +69,12 @@ if __name__ == "__main__": Page( name="Guests", page_url="guests", - build=lambda: pages.PlaceholderPage(placeholder_name="Teilnehmer"), + build=pages.GuestsPage, ), Page( name="Tournaments", page_url="tournaments", - build=lambda: pages.PlaceholderPage(placeholder_name="Turniere"), + build=pages.TournamentsPage, ), Page( name="FAQ", diff --git a/src/ez_lan_manager/pages/GuestsPage.py b/src/ez_lan_manager/pages/GuestsPage.py new file mode 100644 index 0000000..363a556 --- /dev/null +++ b/src/ez_lan_manager/pages/GuestsPage.py @@ -0,0 +1,83 @@ +from typing import Optional + +from rio import Column, Component, event, TextStyle, Text, Button, Row, TextInput, Spacer, TextInputChangeEvent + +from src.ez_lan_manager import ConfigurationService, UserService, TicketingService, SeatingService +from src.ez_lan_manager.components.MainViewContentBox import MainViewContentBox +from src.ez_lan_manager.pages import BasePage +from src.ez_lan_manager.types.User import User + + +class GuestsPage(Component): + table_elements: list[Button] = [] + users_with_tickets: list[User] = [] + user_filter: Optional[str] = None + + + def __post_init__(self) -> None: + user_service = self.session[UserService] + all_users = user_service.get_all_users() + ticketing_service = self.session[TicketingService] + self.users_with_tickets = list(filter(lambda user: ticketing_service.get_user_ticket(user.user_id) is not None, all_users)) + + @event.on_populate + async def on_populate(self) -> None: + await self.session.set_title(f"{self.session[ConfigurationService].get_lan_info().name} - Teilnehmer") + + def on_searchbar_content_change(self, change_event: TextInputChangeEvent) -> None: + self.user_filter = change_event.text + + def build(self) -> Component: + seating_service = self.session[SeatingService] + if self.user_filter: + users = [user for user in self.users_with_tickets if self.user_filter.lower() in user.user_name or self.user_filter.lower() in str(user.user_id)] + else: + users = self.users_with_tickets + self.table_elements.clear() + for idx, user in enumerate(users): + seat = seating_service.get_user_seat(user.user_id) + self.table_elements.append( + Button( + content=Row(Text(text=f"{user.user_id:0>4}", align_x=0, margin_right=1), Text(text=user.user_name, grow_x=True, wrap="ellipsize"), Text(text="-" if seat is None else seat.seat_id, align_x=1)), + shape="rectangle", + grow_x=True, + color=self.session.theme.hud_color if idx % 2 == 0 else self.session.theme.primary_color + ) + ) + + return BasePage( + content=Column( + MainViewContentBox( + Column( + Text( + text="Teilnehmer", + style=TextStyle( + fill=self.session.theme.background_color, + font_size=1.2 + ), + margin_top=2, + margin_bottom=2, + align_x=0.5 + ), + TextInput( + label="Suche nach Name oder ID", + margin=1, + margin_left=3, + margin_right=3, + on_change=self.on_searchbar_content_change + ), + Button( + content=Row(Text(text="ID ", align_x=0, margin_right=1), Text(text="Benutzername", grow_x=True), Text(text="Sitzplatz", align_x=1)), + shape="rectangle", + grow_x=True, + color=self.session.theme.primary_color, + style="plain", + is_sensitive=False + ), + *self.table_elements, + Spacer(min_height=1) + ) + ), + align_y=0 + ) + ) diff --git a/src/ez_lan_manager/pages/TEMPLATE.py b/src/ez_lan_manager/pages/TEMPLATE.py new file mode 100644 index 0000000..1380947 --- /dev/null +++ b/src/ez_lan_manager/pages/TEMPLATE.py @@ -0,0 +1,40 @@ +from rio import Column, Component, event, TextStyle, Text + +from src.ez_lan_manager import ConfigurationService +from src.ez_lan_manager.components.MainViewContentBox import MainViewContentBox +from src.ez_lan_manager.pages import BasePage + +class PAGENAME(Component): + @event.on_populate + async def on_populate(self) -> None: + await self.session.set_title(f"{self.session[ConfigurationService].get_lan_info().name} - PAGENAME") + + def build(self) -> Component: + return BasePage( + content=Column( + MainViewContentBox( + Column( + Text( + text="HEADER", + style=TextStyle( + fill=self.session.theme.background_color, + font_size=1.2 + ), + margin_top=2, + margin_bottom=0, + align_x=0.5 + ), + Text( + text="BASIC TEXT", + style=TextStyle( + fill=self.session.theme.background_color, + font_size=0.9 + ), + margin=1, + wrap=True + ) + ) + ), + align_y=0 + ) + ) diff --git a/src/ez_lan_manager/pages/TournamentsPage.py b/src/ez_lan_manager/pages/TournamentsPage.py new file mode 100644 index 0000000..ec04017 --- /dev/null +++ b/src/ez_lan_manager/pages/TournamentsPage.py @@ -0,0 +1,40 @@ +from rio import Column, Component, event, TextStyle, Text + +from src.ez_lan_manager import ConfigurationService +from src.ez_lan_manager.components.MainViewContentBox import MainViewContentBox +from src.ez_lan_manager.pages import BasePage + +class TournamentsPage(Component): + @event.on_populate + async def on_populate(self) -> None: + await self.session.set_title(f"{self.session[ConfigurationService].get_lan_info().name} - Turniere") + + def build(self) -> Component: + return BasePage( + content=Column( + MainViewContentBox( + Column( + Text( + text="Turniere", + style=TextStyle( + fill=self.session.theme.background_color, + font_size=1.2 + ), + margin_top=2, + margin_bottom=0, + align_x=0.5 + ), + Text( + text="Aktuell ist noch kein Turnierplan hinterlegt.", + style=TextStyle( + fill=self.session.theme.background_color, + font_size=0.9 + ), + margin=1, + wrap=True + ) + ) + ), + align_y=0 + ) + ) diff --git a/src/ez_lan_manager/pages/__init__.py b/src/ez_lan_manager/pages/__init__.py index 59e7ffc..e4d2c66 100644 --- a/src/ez_lan_manager/pages/__init__.py +++ b/src/ez_lan_manager/pages/__init__.py @@ -9,4 +9,6 @@ from .RegisterPage import RegisterPage from .ImprintPage import ImprintPage from .ContactPage import ContactPage from .RulesPage import RulesPage -from .FaqPage import FaqPage \ No newline at end of file +from .FaqPage import FaqPage +from .TournamentsPage import TournamentsPage +from .GuestsPage import GuestsPage diff --git a/src/ez_lan_manager/services/DatabaseService.py b/src/ez_lan_manager/services/DatabaseService.py index 9c70795..943b81a 100644 --- a/src/ez_lan_manager/services/DatabaseService.py +++ b/src/ez_lan_manager/services/DatabaseService.py @@ -518,3 +518,18 @@ class DatabaseService: except Exception as e: logger.warning(f"Error setting user profile picture: {e}") return None + + def get_all_users(self) -> list[User]: + results = [] + cursor = self._get_cursor() + try: + cursor.execute("SELECT * FROM users;") + self._connection.commit() + except Exception as e: + logger.warning(f"Error getting all users: {e}") + return results + + for user_raw in cursor.fetchall(): + results.append(self._map_db_result_to_user(user_raw)) + + return results diff --git a/src/ez_lan_manager/services/UserService.py b/src/ez_lan_manager/services/UserService.py index 2e4fc68..aa00be4 100644 --- a/src/ez_lan_manager/services/UserService.py +++ b/src/ez_lan_manager/services/UserService.py @@ -16,6 +16,9 @@ class UserService: def __init__(self, db_service: DatabaseService) -> None: self._db_service = db_service + def get_all_users(self) -> list[User]: + return self._db_service.get_all_users() + def get_user(self, accessor: Optional[Union[str, int]]) -> Optional[User]: if accessor is None: return