From 7a4fe740a5b04d2230509c2667a79afd487de70a Mon Sep 17 00:00:00 2001 From: Daniel Nagel Date: Tue, 27 Jan 2026 15:17:53 +0000 Subject: [PATCH] Halbes Admin Panel. Login. --- ats_doku.db | Bin 20480 -> 20480 bytes gui/__pycache__/main_gui.cpython-312.pyc | Bin 6977 -> 8367 bytes gui/main_gui.py | 114 ++++++++++++++--------- 3 files changed, 68 insertions(+), 46 deletions(-) diff --git a/ats_doku.db b/ats_doku.db index f5eab235c4fc88dd860969fdd6c56252158b1576..9bb2e983ec44285648f0c879ed6a385f43c60c0c 100644 GIT binary patch delta 226 zcmZozz}T>Wae_1>=R_H2M$U~1)9mHg*cq9H852v2nRyu)7})q0GVmYc@8Ngj=jXe@ zw{WwdKrdgtDH{iasInrXw5qn5sdhj{W{!eSVqSV`k&%Isv96(!u7Np|Yi3??Vo8-_ rNU(x?YSG~(B??BSthlwAg0)#-)y9IRO%2I9GhG8i9M(;C^WOykWae_1>+e8^>Mz)O!)9fXf*%_II852v2nRyu)7?}Cp82FFz_wc)I78J1H JpX}zp3jkH?41NFr diff --git a/gui/__pycache__/main_gui.cpython-312.pyc b/gui/__pycache__/main_gui.cpython-312.pyc index ee1f4d87cc4a328e75832ad75d775b0bb39b2b73..cf50edcc550e3d043ff0150ff2002188fd553a9a 100644 GIT binary patch delta 3149 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 diff --git a/gui/main_gui.py b/gui/main_gui.py index cfa350c..b3a00fa 100644 --- a/gui/main_gui.py +++ b/gui/main_gui.py @@ -24,59 +24,81 @@ def build_ui(): # 'overflow-hidden' verhindert, dass das ganze Fenster scrollt -> wir wollen nur die Tabelle scrollen. with ui.row().classes("w-full flex-1 p-4 gap-4 no-wrap overflow-hidden"): - # --- Linke Karte: Eingabemaske --- - # 'overflow-y-auto': Falls das Formular zu lang für kleine Bildschirme wird, bekommt nur diese Karte einen Scrollbalken. - with ui.card().classes('overflow-y-auto'): + with ui.column(): + # --- Linke Karte: Eingabemaske --- + # 'overflow-y-auto': Falls das Formular zu lang für kleine Bildschirme wird, bekommt nur diese Karte einen Scrollbalken. + with ui.card().classes('overflow-y-auto'): - traeger = database.get_ats_names() - input_name = ui.select(label="ATS Träger Name", options=traeger, with_input=True).classes('w-full') + traeger = database.get_ats_names() + input_name = ui.select(label="ATS Träger Name", options=traeger, with_input=True).classes('w-full') - input_location = ui.input(label='Einsatzort', placeholder='Adresse, oder Beschreibung').classes("w-full") + input_location = ui.input(label='Einsatzort', placeholder='Adresse, oder Beschreibung').classes("w-full") - with ui.row().classes('gap-10'): - today = datetime.now().strftime("%Y-%m-%d") - with ui.input('Datum', value=today).classes('flex-1') as date_input: - with date_input.add_slot('append'): - ui.icon('event').classes('cursor-pointer') \ - .on('click', lambda: menu.open()) - with ui.menu() as menu: - input_date = ui.date().bind_value(date_input) + with ui.row().classes('gap-10'): + today = datetime.now().strftime("%Y-%m-%d") + with ui.input('Datum', value=today).classes('flex-1') as date_input: + with date_input.add_slot('append'): + ui.icon('event').classes('cursor-pointer') \ + .on('click', lambda: menu.open()) + with ui.menu() as menu: + input_date = ui.date().bind_value(date_input) - input_time = ui.number(label="Dauer (Min)", value=0).classes('flex-1') + input_time = ui.number(label="Dauer (Min)", value=0).classes('flex-1') - with ui.row().classes("gap-10 w-full items-center"): - input_type = ui.toggle(["Einsatz", "Übung"]).classes('flex-1 center') - input_device = ui.select(["ATS Gerät 1", "ATS Gerät 2"], label="ATS Gerät auswählen").classes('flex-1') + with ui.row().classes("gap-10 w-full items-center"): + input_type = ui.toggle(["Einsatz", "Übung"]).classes('flex-1 center') + input_device = ui.select(["ATS Gerät 1", "ATS Gerät 2"], label="ATS Gerät auswählen").classes('flex-1') - def InputDataToTable(): - name = input_name.value - location = input_location.value - date = input_date.value - time = input_time.value - etype = input_type.value - device = input_device.value - # Hinweis: database Aufruf ist hier korrekt, sofern importiert - database.add_data_to_einsaetze(name, location, date, time, etype, device) + def InputDataToTable(): + name = input_name.value + location = input_location.value + date = input_date.value + time = input_time.value + etype = input_type.value + device = input_device.value + # Hinweis: database Aufruf ist hier korrekt, sofern importiert + database.add_data_to_einsaetze(name, location, date, time, etype, device) - einsaetze_table.rows = database.get_einsaetze() - einsaetze_table.update() - ui.notify("Eintrag in Datenbank erstellt.") + einsaetze_table.rows = database.get_einsaetze() + einsaetze_table.update() + ui.notify("Eintrag in Datenbank erstellt.") - def ClearForm(): - input_name.value = "" - input_location.value = "" - input_date.value = today - input_time.value = 0 - input_type.value = "Einsatz" # Achtung: Value sollte zum Toggle passen (String, nicht 0) - input_device.value = None # Select resetten - ui.notify("Gelöscht.") + def ClearForm(): + input_name.value = "" + input_location.value = "" + input_date.value = today + input_time.value = 0 + input_type.value = "Einsatz" # Achtung: Value sollte zum Toggle passen (String, nicht 0) + input_device.value = None # Select resetten + ui.notify("Gelöscht.") + ui.notify(admin_login.value) - ui.separator() - ui.space() # Drückt die Buttons nach unten (innerhalb der Formular-Karte) - with ui.row().classes('w-full'): - ui.button(text="Leeren", on_click=ClearForm) - ui.space() - ui.button(text="Eintragen", on_click=InputDataToTable) + ui.separator() + ui.space() # Drückt die Buttons nach unten (innerhalb der Formular-Karte) + with ui.row().classes('w-full'): + ui.button(text="Leeren", on_click=ClearForm) + ui.space() + ui.button(text="Eintragen", on_click=InputDataToTable) + + admin_container = ui.column().classes("w-full") + + with ui.card().classes("w-full"): + admin_login = ui.input(placeholder="Admin Passwort", password=True).props("clearable") + admin_loginbutton = ui.button(text="Login") + def check_login(): + print("geändert") + admin_container.clear() + print ("CHEEEECK!") + + if admin_login.value == "1234": + with admin_container: + ui.separator() + admin_loginbutton.on_click(check_login) + + + + + # --- Rechte Karte: Tabelle --- # 'flex-1': Diese Karte nimmt die restliche Breite der Reihe ein. @@ -87,8 +109,8 @@ def build_ui(): {'name': 'name', 'label': 'Name', 'field': 'name', 'sortable': True, 'align': 'left'}, {'name': 'location', 'label': 'Ort', 'field': 'location', 'align': 'left'}, {'name': 'time', 'label': 'Dauer', 'field': 'time'}, - {'name': 'etype', 'label': 'Art', 'field': 'etype'}, - {'name': 'device', 'label': 'Gerät', 'field': 'device'}, + {'name': 'etype', 'label': 'Art', 'field': 'etype', "sortable": True}, + {'name': 'device', 'label': 'Gerät', 'field': 'device', "sortable": True}, ] # Die Tabelle selbst bekommt auch h-full, damit sie die Karte ausfüllt einsaetze_table = ui.table(