86 lines
4.5 KiB
Python
86 lines
4.5 KiB
Python
from nicegui import ui, app
|
|
from gui import gui_style
|
|
from data import data_api
|
|
from match_calculations import calc_match
|
|
|
|
def setup_routes():
|
|
|
|
# 1. Die {}-Klammern definieren eine dynamische Variable in der URL
|
|
@ui.page('/add-match/{systemname}', dark=True)
|
|
def match_form_page(systemname: str): # <--- WICHTIG: Hier fangen wir das Wort aus der URL auf!
|
|
gui_style.apply_design()
|
|
|
|
# --- SICHERHEITS-CHECK ---
|
|
if not app.storage.user.get('authenticated', False):
|
|
ui.label('Access Denied. Please log in first.').classes('text-red-500')
|
|
ui.button('Back to Home', on_click=lambda: ui.navigate.to('/'))
|
|
return
|
|
|
|
# ÄNDERUNG: w-full (für Handy) + max-w-md (für PC) + mx-auto (Zentrieren) + p-6 (Innenabstand)
|
|
with ui.card().classes('w-full max-w-md mx-auto items-center mt-10 p-6 shadow-xl'):
|
|
|
|
# Text-Center hinzugefügt, falls der Systemname sehr lang ist und auf dem Handy umbricht
|
|
ui.label(f'Neues Spiel für {systemname} eintragen').classes('text-2xl font-bold text-center mb-6')
|
|
|
|
ui.label("Meine Punkte:").classes('text-xl font-bold w-full text-left')
|
|
|
|
# ÄNDERUNG: h-60 entfernt, stattdessen gap-6 (Abstand zwischen den Elementen)
|
|
with ui.column().classes("w-full items-center gap-6"):
|
|
|
|
# 1. Daten aus der DB holen
|
|
raw_players = data_api.get_all_players_from_system(systemname)
|
|
my_id = app.storage.user.get('db_id')
|
|
|
|
# 3. Eine saubere Optionen-Liste für NiceGUI bauen
|
|
dropdown_options = {}
|
|
|
|
for p in raw_players:
|
|
if p['player_id'] == my_id:
|
|
continue
|
|
dropdown_options[p['player_id']] = f"{p['display_name']} 'aka' {p['discord_name']}"
|
|
|
|
# ÄNDERUNG: .classes('w-full') hinzugefügt, damit der Slider sich anpasst
|
|
p1_points = ui.slider(min=0, max=100, value=10).props("label-always").classes('w-full')
|
|
|
|
ui.separator().classes('w-full mt-4') # Ein schöner Trennstrich für die Optik
|
|
|
|
# 5. Dropdown und Gegner Punkte
|
|
ui.label("Gegner:").classes('text-xl font-bold w-full text-left')
|
|
|
|
# ÄNDERUNG: w-64 durch w-full ersetzt
|
|
opponent_select = ui.select(options=dropdown_options, label='Gegner auswählen').classes('w-full')
|
|
|
|
# ÄNDERUNG: .classes('w-full') hinzugefügt
|
|
p2_points = ui.slider(min=0, max=100, value=10).props("label-always").classes('w-full')
|
|
|
|
ui.space()
|
|
|
|
# Das Match in die Datenbank eintragen lassen und die MMR Berechnung triggern.
|
|
def input_match_to_database():
|
|
p2_id = opponent_select.value
|
|
if p2_id is None:
|
|
ui.notify("Bitte wähle zuerst einen Gegner aus!", color="red", position="top")
|
|
return
|
|
|
|
score_p1 = p1_points.value
|
|
score_p2 = p2_points.value
|
|
|
|
match_id = data_api.add_new_match(systemname, my_id, p2_id, score_p1, score_p2)
|
|
|
|
# 4. Erfolgsmeldung und Berechnung
|
|
ui.notify("Match erfolgreich eingetragen!", color="green")
|
|
ui.navigate.to(f'/statistic/{systemname}')
|
|
|
|
|
|
with ui.dialog().classes("w-full items-center") as form_info, ui.card():
|
|
ui.label('Um ein Spiel einzutragen einfach deine erspielten Punkte, deinen Gegner und die Punkte von deinem Gegner eintragen').classes("font-bold text-white text-l")
|
|
ui.label('ACHTUNG: Damit ein Spieler als Gegner ausgewählt werden kann, muss er der Liga beigetreten sein!').classes("font-bold text-white text-l")
|
|
ui.label('Nach dem Absenden muss dein Gegner in seiner Liga App das Spiel noch kurz bestätigen. Solltest du einen Fehler gemacht haben, kannst du das Spiel (bevor es bestätigt wurde) auf der Hauptseite selber löschen.').classes("font-bold text-white text-l")
|
|
ui.button(icon="close", on_click=form_info.close).classes("w-10 h-8 rounded-full")
|
|
|
|
# Buttons ganz unten in einer Reihe
|
|
with ui.row().classes("w-full items-center justify-between mt-8"):
|
|
ui.button(icon="close", on_click=lambda: ui.navigate.to(f'/statistic/{systemname}')).classes("w-10 h-8 rounded-full")
|
|
ui.button(icon="help", color="information" ,on_click=form_info.open).classes("w-10 h-8 rounded-full")
|
|
ui.button(text="Absenden", color="positive", on_click=lambda: input_match_to_database())
|