From 446956f72169c984a6b532633ac746e1d1236ba6 Mon Sep 17 00:00:00 2001 From: David Rodenkirchen Date: Sat, 24 Aug 2024 01:57:47 +0200 Subject: [PATCH] add WIP frontend --- requirements.txt | Bin 68 -> 88 bytes src/EzLanManager.py | 58 +++++++++------- src/ez_lan_manager/__init__.py | 28 ++++++++ src/ez_lan_manager/assets/fonts/joystix.otf | Bin 0 -> 37268 bytes .../components/DesktopNavigation.py | 60 ++++++++++++++++ src/ez_lan_manager/components/LoginBox.py | 56 +++++++++++++++ src/ez_lan_manager/components/NewsPost.py | 54 +++++++++++++++ src/ez_lan_manager/components/__init__.py | 0 src/ez_lan_manager/pages/BasePage.py | 65 ++++++++++++++++++ src/ez_lan_manager/pages/NewsPage.py | 29 ++++++++ src/ez_lan_manager/pages/__init__.py | 2 + 11 files changed, 328 insertions(+), 24 deletions(-) create mode 100644 src/ez_lan_manager/assets/fonts/joystix.otf create mode 100644 src/ez_lan_manager/components/DesktopNavigation.py create mode 100644 src/ez_lan_manager/components/LoginBox.py create mode 100644 src/ez_lan_manager/components/NewsPost.py create mode 100644 src/ez_lan_manager/components/__init__.py create mode 100644 src/ez_lan_manager/pages/BasePage.py create mode 100644 src/ez_lan_manager/pages/NewsPage.py create mode 100644 src/ez_lan_manager/pages/__init__.py diff --git a/requirements.txt b/requirements.txt index c5cde3760f3f37ebd29b72e2a460e87a6566d180..8199663ecf874f1ebeb56b12743fbdcd11037474 100644 GIT binary patch delta 25 ccmZ>XnBXG9%fQ7@#E{95&!Edt3Zy}N06$v<2mk;8 delta 4 Lcma!WncxBd1C#-A diff --git a/src/EzLanManager.py b/src/EzLanManager.py index e2ab361..f24e660 100644 --- a/src/EzLanManager.py +++ b/src/EzLanManager.py @@ -1,33 +1,43 @@ +from __future__ import annotations import logging +from pathlib import Path +from typing import * # type: ignore + +import rio from from_root import from_root -from src.ez_lan_manager.services.AccountingService import AccountingService -from src.ez_lan_manager.services.CateringService import CateringService -from src.ez_lan_manager.services.ConfigurationService import ConfigurationService -from src.ez_lan_manager.services.DatabaseService import DatabaseService -from src.ez_lan_manager.services.MailingService import MailingService -from src.ez_lan_manager.services.NewsService import NewsService -from src.ez_lan_manager.services.SeatingService import SeatingService -from src.ez_lan_manager.services.TicketingService import TicketingService -from src.ez_lan_manager.services.UserService import UserService -from src.ez_lan_manager.types.CateringMenuItem import CateringMenuItemCategory, CateringMenuItem -from src.ez_lan_manager.types.CateringOrder import CateringOrderStatus +from src.ez_lan_manager import pages, init_services logger = logging.getLogger(__name__.split(".")[-1]) if __name__ == "__main__": - logging.basicConfig(level=logging.DEBUG) - configuration_service = ConfigurationService(from_root("config.toml")) - lan_info = configuration_service.get_lan_info() - seating_config = configuration_service.get_seating_configuration() - db_config = configuration_service.get_database_configuration() - db_service = DatabaseService(db_config) - user_service = UserService(db_service) - accounting_service = AccountingService(db_service) - news_service = NewsService(db_service) - mailing_service = MailingService(configuration_service.get_mailing_service_configuration()) - ticketing_service = TicketingService(lan_info, db_service, accounting_service) - seating_service = SeatingService(seating_config, lan_info, db_service, ticketing_service) - catering_service = CateringService(db_service, accounting_service, user_service) + theme = rio.Theme.from_colors( + primary_color=rio.Color.from_hex("ffffff"), + secondary_color=rio.Color.from_hex("018786"), + neutral_color=rio.Color.from_hex("1e1e1e"), + background_color=rio.Color.from_hex("121212"), + hud_color=rio.Color.from_hex("02dac5"), + text_color=rio.Color.from_hex("018786"), + mode="dark", + corner_radius_small=0, + corner_radius_medium=0, + corner_radius_large=0, + font=rio.Font(from_root("src/ez_lan_manager/assets/fonts/joystix.otf")) + ) + app = rio.App( + name='', + pages=[ + rio.Page( + name="News", + page_url='', + build=pages.NewsPage, + ), + ], + theme=theme, + assets_dir=Path(__file__).parent / "assets", + default_attachments=init_services() + ) + + app.run_as_web_server() diff --git a/src/ez_lan_manager/__init__.py b/src/ez_lan_manager/__init__.py index 8ba3caa..28b5bb0 100644 --- a/src/ez_lan_manager/__init__.py +++ b/src/ez_lan_manager/__init__.py @@ -1,2 +1,30 @@ +import logging + +from from_root import from_root + from src.ez_lan_manager.services import * +from src.ez_lan_manager.services.AccountingService import AccountingService +from src.ez_lan_manager.services.CateringService import CateringService +from src.ez_lan_manager.services.ConfigurationService import ConfigurationService +from src.ez_lan_manager.services.DatabaseService import DatabaseService +from src.ez_lan_manager.services.MailingService import MailingService +from src.ez_lan_manager.services.NewsService import NewsService +from src.ez_lan_manager.services.SeatingService import SeatingService +from src.ez_lan_manager.services.TicketingService import TicketingService +from src.ez_lan_manager.services.UserService import UserService from src.ez_lan_manager.types import * + +# Inits services in the correct order +def init_services() -> tuple[AccountingService, CateringService, ConfigurationService, DatabaseService, MailingService, NewsService, SeatingService, TicketingService, UserService]: + logging.basicConfig(level=logging.DEBUG) + configuration_service = ConfigurationService(from_root("config.toml")) + db_service = DatabaseService(configuration_service.get_database_configuration()) + user_service = UserService(db_service) + accounting_service = AccountingService(db_service) + news_service = NewsService(db_service) + mailing_service = MailingService(configuration_service.get_mailing_service_configuration()) + ticketing_service = TicketingService(configuration_service.get_lan_info(), db_service, accounting_service) + seating_service = SeatingService(configuration_service.get_seating_configuration(), configuration_service.get_lan_info(), db_service, ticketing_service) + catering_service = CateringService(db_service, accounting_service, user_service) + + return accounting_service, catering_service, configuration_service, db_service, mailing_service, news_service, seating_service, ticketing_service, user_service diff --git a/src/ez_lan_manager/assets/fonts/joystix.otf b/src/ez_lan_manager/assets/fonts/joystix.otf new file mode 100644 index 0000000000000000000000000000000000000000..20a3100fb5a778e03bf130027ce1b1c01444e24b GIT binary patch literal 37268 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 KWdi<#z5fSo7^(aK literal 0 HcmV?d00001 diff --git a/src/ez_lan_manager/components/DesktopNavigation.py b/src/ez_lan_manager/components/DesktopNavigation.py new file mode 100644 index 0000000..6067368 --- /dev/null +++ b/src/ez_lan_manager/components/DesktopNavigation.py @@ -0,0 +1,60 @@ +from rio import * + +from src.ez_lan_manager import ConfigurationService +from src.ez_lan_manager.components.LoginBox import LoginBox + + +class DesktopNavigationButton(Component): + STYLE = TextStyle(fill=Color.from_hex("02dac5"), font_size=0.9) + label: str + target_url: str + open_new_tab: bool = False + + def build(self) -> Component: + return Link( + content=Button( + content=Text(self.label, style=self.STYLE), + shape="rectangle", + style="minor", + color="secondary", + grow_x=True, + margin_left=0.6, + margin_right=0.6, + margin_top=0.6 + ), + target_url=self.target_url, + open_in_new_tab=self.open_new_tab + ) + + +class DesktopNavigation(Component): + def build(self) -> Component: + lan_info = self.session[ConfigurationService].get_lan_info() + return Card( + Column( + Text(lan_info.name, align_x=0.5, margin_top=0.3, style=TextStyle(fill=self.session.theme.hud_color, font_size=2.5)), + Text(f"Edition {lan_info.iteration}", align_x=0.5, style=TextStyle(fill=self.session.theme.hud_color, font_size=1.2), margin_top=0.3, margin_bottom=2), + LoginBox(), + DesktopNavigationButton("News", "./news"), + Spacer(min_height=1), + DesktopNavigationButton(f"Über {lan_info.name} {lan_info.iteration}", "./overview"), + DesktopNavigationButton("Ticket kaufen", "./buy_ticket"), + DesktopNavigationButton("Sitzplan", "./seating"), + DesktopNavigationButton("Catering", "./catering"), + DesktopNavigationButton("Teilnehmer", "./guests"), + DesktopNavigationButton("Turniere", "./tournaments"), + DesktopNavigationButton("FAQ", "./faq"), + DesktopNavigationButton("Regeln & AGB", "./rules-and-agb"), + Spacer(min_height=1), + DesktopNavigationButton("Die EZ GG e.V.", "https://ezgg-ev.de/about", open_new_tab=True), + DesktopNavigationButton("Kontakt", "./contact"), + DesktopNavigationButton("Impressum & DSGVO", "./imprint"), + Spacer(min_height=1), + align_y=0 + ), + color=self.session.theme.neutral_color, + min_width=15, + grow_y=True, + corner_radius=(0.5, 0, 0, 0), + margin_right=0.1 + ) diff --git a/src/ez_lan_manager/components/LoginBox.py b/src/ez_lan_manager/components/LoginBox.py new file mode 100644 index 0000000..01b97cf --- /dev/null +++ b/src/ez_lan_manager/components/LoginBox.py @@ -0,0 +1,56 @@ +from rio import Component, Card, Column, Text, Row, Rectangle, Button, TextStyle, Color, Spacer, TextInput + + +class LoginBox(Component): + TEXT_STYLE = TextStyle(fill=Color.from_hex("02dac5"), font_size=0.9) + def build(self) -> Component: + return Rectangle( + content=Column( + TextInput( + text="", + label="Benutzername", + accessibility_label = "Benutzername", + min_height=0.5 + ), + TextInput( + text="", + label="Passwort", + accessibility_label="Passwort", + is_secret=True + ), + Column( + Row( + Button( + Text("LOGIN", style=self.TEXT_STYLE, justify="center"), + shape="rectangle", + style="minor", + color="secondary", + margin_bottom=0.4 + ) + ), + Row( + Button( + Text("REG", style=self.TEXT_STYLE, justify="center"), + shape="rectangle", + style="minor", + color="secondary" + ), + Spacer(), + Button( + Text("LST PWD",style=self.TEXT_STYLE, justify="center"), + shape="rectangle", + style="minor", + color="secondary" + ), + proportions=(49, 2, 49) + ) + ), + spacing=0.4 + ), + fill=Color.TRANSPARENT, + min_height=8, + min_width=12, + align_x=0.5, + margin_top=0.3, + margin_bottom=2 + ) diff --git a/src/ez_lan_manager/components/NewsPost.py b/src/ez_lan_manager/components/NewsPost.py new file mode 100644 index 0000000..edf6f8e --- /dev/null +++ b/src/ez_lan_manager/components/NewsPost.py @@ -0,0 +1,54 @@ +from rio import Component, Rectangle, Text, TextStyle, Column, Row + + +class NewsPost(Component): + title: str = "" + text: str = "" + date: str = "" + + def build(self) -> Component: + return Rectangle( + content=Column( + Row( + Text( + self.title, + align_x=0, + grow_x=True, + margin=2, + margin_bottom=0, + style=TextStyle( + fill=self.session.theme.background_color, + font_size=1.3 + ), + wrap=False + ), + Text( + self.date, + margin=2, + align_x=1, + style=TextStyle( + fill=self.session.theme.background_color, + font_size=0.6 + ), + wrap=True + ) + ), + Text( + self.text, + margin=2, + style=TextStyle( + fill=self.session.theme.background_color + ), + wrap=True + ) + ), + fill=self.session.theme.primary_color, + margin_left=1, + margin_right=1, + margin_top=2, + margin_bottom=1, + shadow_radius=0.5, + shadow_color=self.session.theme.hud_color, + shadow_offset_y=0, + corner_radius=0.2 + ) diff --git a/src/ez_lan_manager/components/__init__.py b/src/ez_lan_manager/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/ez_lan_manager/pages/BasePage.py b/src/ez_lan_manager/pages/BasePage.py new file mode 100644 index 0000000..48332b1 --- /dev/null +++ b/src/ez_lan_manager/pages/BasePage.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +from typing import * # type: ignore + +from rio import Component, event, Spacer, Card, Container, Column, Row, Rectangle, TextStyle, Color, Text + +from src.ez_lan_manager.components.DesktopNavigation import DesktopNavigation + +class BasePage(Component): + content: Component + + @event.on_window_size_change + async def on_window_size_change(self): + await self.force_refresh() + + def build(self) -> Component: + if self.content is None: + content = Spacer() + else: + content = Card( + self.content, + color="secondary", + min_width=38, + corner_radius=(0, 0.5, 0, 0) + ) + if self.session.window_width > 28: + return Container( + content=Column( + Row(), + Column( + Row( + Spacer(grow_x=True, grow_y=True), + DesktopNavigation(), + content, + Spacer(grow_x=True, grow_y=True), + grow_y=True + ), + Row( + Spacer(grow_x=True, grow_y=False), + Card( + content=Text("EZ LAN Manager Version 0.0.1 © EZ GG e.V.", align_x=0.5, align_y=0.5, style=TextStyle(fill=self.session.theme.primary_color, font_size=0.5)), + color=self.session.theme.neutral_color, + corner_radius=(0, 0, 0.5, 0.5), + grow_x=False, + grow_y=False, + min_height=1.2, + min_width=53.1 + ), + Spacer(grow_x=True, grow_y=False), + grow_y=False + ) + ), + Row(), + proportions=[4, 92, 4] + ), + grow_x=True, + grow_y=True + ) + else: + return Text( + "Der EZ LAN Manager wird\nauf mobilen Endgeräten nur\nim Querformat unterstützt.\nBitte drehe dein Gerät.", + align_x=0.5, + align_y=0.5, + style=TextStyle(fill=Color.from_hex("FFFFFF"), font_size=0.8) + ) diff --git a/src/ez_lan_manager/pages/NewsPage.py b/src/ez_lan_manager/pages/NewsPage.py new file mode 100644 index 0000000..ab000dd --- /dev/null +++ b/src/ez_lan_manager/pages/NewsPage.py @@ -0,0 +1,29 @@ +from rio import Text, Column, Rectangle, TextStyle, Component + +from src.ez_lan_manager.components.NewsPost import NewsPost +from src.ez_lan_manager.pages import BasePage + +class NewsPage(Component): + def build(self) -> Component: + return BasePage( + content=Column( + NewsPost( + title="EZ LAN Manager", + text="Der EZ LAN Manager ist die offizielle Software der EZ GG e.V. um LAn-Parties zu verwalten." + "Ist schon echt cool wie der funktioniert! So kann LAN Party richtig geschmeidig ablaufen.", + date="23.08.2024" + ), + NewsPost( + title="Alkohöl", + text="Der Verein 'EZ GG e.V.' ist bekannt für seinen unstillbaren Durst. " + "Bei jedem Treffen fließt der Alkohol in Strömen – egal ob Bier, Wein oder Hochprozentiges. " + "Kein Glas bleibt lange leer, und bevor der Pegel auch nur ansatzweise sinkt, " + "wird schon nachgefüllt. Die Mitglieder feiern ausgiebig und trinken dabei so viel, " + "dass die Vorräte nie lange halten. Bei jeder Gelegenheit wird angestoßen, " + "die Stimmung steigt und der Alkohol fließt ohne Ende. " + "Ihr Motto: 'Kein Abend ohne reichlich Alkohol!'", + date="23.08.2024" + ), + align_y=0, + ) + ) diff --git a/src/ez_lan_manager/pages/__init__.py b/src/ez_lan_manager/pages/__init__.py new file mode 100644 index 0000000..8ba84d0 --- /dev/null +++ b/src/ez_lan_manager/pages/__init__.py @@ -0,0 +1,2 @@ +from .BasePage import BasePage +from .NewsPage import NewsPage