Skip to content
m1francePublic

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

LevelUp

L'outil des éducateurs du club : planifier les entraînements dans un calendrier, préparer les séances avec l'éditeur d'exercices visuel, puis les animer au bord du terrain. Les convocations et la messagerie restent dans SportEasy.

Fonctionnalités

V8 : recentrage sur l'entraînement

  • Accueil = calendrier du mois, façon SportEasy : une grille du lundi au dimanche avec, dans chaque case, l'heure et le titre des entraînements, matchs, plateaux, tournois et réunions de toutes les équipes encadrées (filtre par équipe, mémorisé sur l'appareil). Sur téléphone, des pastilles de couleur, et la journée choisie s'affiche dessous.
  • Un clic sur un jour montre sa journée ; le + de la case (ou un double-clic) ajoute un événement à cette date. Flèches ← → du clavier pour changer de mois, « T » pour revenir à aujourd'hui.
  • Un clic sur un événement : ses horaires, son lieu, sa répétition, puis Préparer la séance (crée la séance et ouvre le choix des exercices), Voir la séance ou Lancer, Modifier (cette date ou toute la série) et Supprimer.
  • Joueurs devient une petite page discrète (menu de l'équipe › Joueurs) : prénom, nom, année de naissance, catégorie et aisance, de quoi faire l'appel et équilibrer les groupes en séance.
  • Retirés : messagerie et annonces, album souvenir, page Club (statistiques, import), convocations, mode match, cartes et entrée sur le terrain, covoiturage, temps de jeu, fiches joueurs détaillées, espace parents et inscription libre, notifications push. Les anciens comptes « parent » ne peuvent plus se connecter. Les données déjà enregistrées restent dans la base, simplement plus utilisées.

Séances et exercices

  • Éditeur d'exercices visuel : terrains prédéfinis (foot à 5, à 8, à 11, demi-terrain, carré d'atelier, zone libre), 13 types d'éléments (joueurs par couleur de chasuble, ballons, coupelles, plots, piquets, cerceaux, haies, échelles, mini-buts, buts, mannequins, zones, éducateur), glisser-déposer, aimantation à la grille, sélection multiple, duplication, annuler/rétablir.
  • Flèches reconnues automatiquement : un trait droit devient une passe, un trait sinueux une conduite. On peut aussi choisir course (pointillés) ou tir.
  • Outils rapides : « Ligne » (répartit N coupelles, plots ou piquets entre deux points) et « Carré » (4 coupelles d'un geste).
  • Animation
    • Étapes : on déplace les joueurs, et les transitions sont calculées automatiquement.
    • Enregistrement au doigt : on appuie sur ●, on déplace les joueurs en temps réel, à plusieurs doigts.
    • Ballon intelligent : il suit son porteur. Pour faire une passe, on glisse le ballon sur un joueur.
    • Lecture ×0,5, pas à pas et en boucle, avec les positions fantômes de l'étape précédente.
  • Fiche exercice : objectif, consignes, variantes plus facile / plus difficile, thèmes, et matériel calculé automatiquement (dont le nombre de chasubles par couleur).
  • Séances : échauffement, ateliers tournants, jeu, pause, retour au calme. La durée totale est calculée, et le matériel de la séance aussi (les ateliers simultanés s'additionnent).
  • Séance live
    • Appel en 10 secondes, puis groupes équilibrés (par aisance, par année ou au hasard) qu'on peut ajuster au doigt.
    • Chrono en anneau, rotation automatique des ateliers avec sifflet (« Bleus → Atelier 2 »), +1 min, écran maintenu allumé.
    • L'état est conservé si on recharge la page.
  • Mode tableau : l'exercice s'affiche en plein écran pour le montrer aux enfants, et le terrain pivote automatiquement sur un téléphone tenu verticalement.
  • Hors ligne : l'app est installable (PWA), les données déjà consultées restent disponibles, et les modifications sont mises en file puis envoyées au retour du réseau.

Club et équipes

  • Administrateur unique et rôles Dirigeant et Éducateur, avec une matrice de permissions modifiable.
  • Équipes : la catégorie (U6 à Seniors, Féminines, Futsal…) sert de nom à l'équipe. Chaque équipe a aussi sa saison, sa couleur et ses éducateurs.
  • Paramètres : le profil et, selon les droits, l'administration (membres, équipes, permissions, club).
  • Invitations par lien à envoyer par SMS, WhatsApp ou e-mail.
  • Mot de passe oublié : depuis la connexion ou Paramètres › Profil (lien par e-mail si configuré), et lien de réinitialisation à créer depuis Paramètres › Membres.
  • Calendrier : chaque événement a des horaires, un lieu, un adversaire et domicile/extérieur pour les matchs, une couleur et des notes. Répétitions : chaque jour, chaque semaine (jours au choix), toutes les 2 semaines, chaque mois ou un rythme personnalisé, avec une fin à une date ou après N fois. On peut modifier ou annuler une seule date d'une série.
  • Lien public de séance, sans compte, à partager (SportEasy, WhatsApp…).
  • Export vidéo (MP4/WebM) d'un exercice animé, avec partage natif sur mobile.
  • Impression de la fiche de séance, mode sombre.

Navigation

Deux cases flottantes, en icônes seules : Équipe | Calendrier · Exercices. Sur téléphone, elles passent en bas de l'écran. Le bouton Équipe permet de changer d'équipe et donne accès aux Joueurs et aux Paramètres.

Démarrer en local

Il faut Node.js 22.13 ou plus récent. La base SQLite est intégrée à Node, il n'y a rien d'autre à installer.

npm install
npm run dev

Ouvrez http://localhost:5173. Au premier lancement, vous créez le club et votre compte administrateur. La case « équipe d'exemple » ajoute un groupe U8/U9 de 18 joueurs, un entraînement chaque mercredi avec sa séance prête à lancer, et un match.

Production

npm run build
PORT=3000 npm start

Un seul processus sert l'application et l'API. Les données sont dans data/atelier.db (modifiable avec DATABASE_FILE).

  • HTTPS obligatoire en production : les cookies de session sont marqués Secure. Pour un test sur le réseau local en HTTP, lancez avec INSECURE_COOKIES=1.

  • Hébergement gratuit ou presque :

    • une VM « Always Free » (Oracle Cloud) ;
    • un Raspberry Pi au club avec Cloudflare Tunnel pour le HTTPS ;
    • un petit VPS.

    Évitez les offres sans disque persistant : la base serait effacée à chaque redémarrage.

  • E-mails (facultatif) : avec RESEND_API_KEY et MAIL_FROM (ex. LevelUp <noreply@mondomaine.fr>, domaine vérifié sur resend.com), le lien « mot de passe oublié » part par e-mail. APP_URL fixe l'adresse utilisée dans les liens. Sans configuration, l'administrateur crée le lien depuis Paramètres › Membres.

  • Fuseau horaire : le serveur fonctionne à l'heure de Paris. Utilisez TZ pour un autre fuseau.

  • Sauvegarde : copiez data/atelier.db* serveur arrêté, ou utilisez sqlite3 data/atelier.db ".backup sauvegarde.db".

  • Sur téléphone : dans Safari ou Chrome, faites « Ajouter à l'écran d'accueil » pour obtenir l'app plein écran.

Architecture

server/        API Express + SQLite (node:sqlite)
  auth.js      sessions (cookie httpOnly), mots de passe scrypt, rôles et permissions
  api.js       routes REST, contrôle d'accès par équipe et par rôle
  players.js   effectif des équipes
  password.js  mot de passe oublié
  demo.js      bibliothèque de démarrage et équipe d'exemple
src/
  pitch/       moteur terrain : géométrie, rendu canvas, animation, édition, export vidéo
  pages/       écrans (calendrier, éditeur, séances, live, joueurs, paramètres…)
  lib/         API (file d'attente hors-ligne), contexte, types

Les identifiants sont générés côté client et les écritures sont des PUT idempotents : une modification faite hors ligne peut être rejouée sans risque de doublon.

Confidentialité (données de mineurs)

  • Seuls les éducateurs et dirigeants du club ont un compte ; chacun ne voit que les équipes qu'il encadre (sauf permission « toutes les équipes »).
  • L'effectif ne contient que le prénom, le nom, l'année de naissance et le niveau d'aisance.
  • Le lien public d'une séance ne contient ni présences, ni groupes, ni notes des éducateurs.

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages