eptm_dashboard/eptm_dashboard/eptm_dashboard.py
2026-05-11 14:45:42 +02:00

83 lines
4.5 KiB
Python

import reflex as rx
from .state import AuthState
from .pages.login import login_page
from .pages.accueil import accueil_page, AccueilState
from .pages.fiche import fiche_page, FicheState
from .pages.classe import classe_page, ClasseState
from .pages.escada import escada_page, EscadaState
from .pages.logs import logs_page, LogsState
from .pages.cron import cron_page, CronState
from .pages.users import users_page, UsersState
from .pages.params import params_page, ParamsState
from .pages.purge import purge_page, PurgeState
from .pages.doc import doc_page, DocState
from .pages.profile import profile_page, ProfileState
from .pages.password_set import password_set_page, PasswordSetState
# RetenueState et SanctionState sont utilisés via modal dans /fiche
from .pages.retenue import RetenueState
from .pages.sanction import SanctionState
TITLE = "EPTM Dashboard"
app = rx.App(
# Note: theme=... est configuré dans rxconfig.py via RadixThemesPlugin
# (force appearance="light", ignore dark mode OS). Les thèmes user sont
# gérés via tokens CSS dans responsive.css.
stylesheets=["/responsive.css"],
head_components=[
rx.el.link(rel="icon", type="image/png", href="/favicon.png"),
# iOS Safari : icône utilisée pour "Sur l'écran d'accueil"
rx.el.link(rel="apple-touch-icon", href="/apple-touch-icon.png"),
# Android Chrome / PWA : manifest avec icônes 192/512
rx.el.link(rel="manifest", href="/manifest.webmanifest"),
# Couleur de la barre d'adresse (Android) + barre de statut (iOS standalone)
rx.el.meta(name="theme-color", content="#dc000e"),
rx.el.meta(name="apple-mobile-web-app-capable", content="yes"),
rx.el.meta(name="apple-mobile-web-app-status-bar-style", content="default"),
rx.el.meta(name="apple-mobile-web-app-title", content="EPTM"),
# Préchargement des fonts (évite le FOIT, rendu instantané)
rx.el.link(
rel="preload",
href="/fonts/InterVariable.woff2",
as_="font",
type="font/woff2",
crossorigin="anonymous",
),
# Applique le thème stocké en localStorage avant le premier render —
# évite un flash au défaut EPTM puis bascule.
rx.el.script(
"""
(function() {
try {
var t = localStorage.getItem('theme');
if (t && t !== 'eptm') {
document.documentElement.setAttribute('data-theme', t);
document.body && document.body.setAttribute('data-theme', t);
}
} catch(e) {}
})();
"""
),
],
)
def index_page() -> rx.Component:
return rx.center(rx.spinner(size="3"), height="100vh")
app.add_page(index_page, route="/", on_load=AuthState.index_redirect, title=TITLE)
app.add_page(login_page, route="/login", on_load=AuthState.redirect_if_authenticated, title=TITLE)
app.add_page(accueil_page, route="/accueil", on_load=[AuthState.check_auth, AccueilState.load_data], title=TITLE)
app.add_page(fiche_page, route="/fiche", on_load=[AuthState.check_auth, FicheState.load_data], title=TITLE)
app.add_page(classe_page, route="/classe", on_load=[AuthState.check_auth, ClasseState.load_data], title=TITLE)
app.add_page(escada_page, route="/escada", on_load=[AuthState.check_auth, EscadaState.load_data], title=TITLE)
app.add_page(logs_page, route="/logs", on_load=[AuthState.check_auth, LogsState.load_data], title=TITLE)
app.add_page(cron_page, route="/cron", on_load=[AuthState.check_auth, CronState.load_data], title=TITLE)
app.add_page(users_page, route="/users", on_load=[AuthState.check_auth, UsersState.load_data], title=TITLE)
app.add_page(params_page, route="/params", on_load=[AuthState.check_auth, ParamsState.load_data], title=TITLE)
app.add_page(purge_page, route="/purge", on_load=[AuthState.check_auth, PurgeState.load_data], title=TITLE)
app.add_page(doc_page, route="/doc", on_load=[AuthState.check_auth, DocState.load_data], title=TITLE)
app.add_page(profile_page, route="/profile", on_load=[AuthState.check_auth, ProfileState.load_data], title=TITLE)
# Page publique (pas de check_auth — accessible via lien email)
app.add_page(password_set_page, route="/password-set", on_load=PasswordSetState.load_data, title=TITLE)