83 lines
4.5 KiB
Python
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)
|