BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
Désignation des arbitres - CD45
Translation pending
Sports & fitnessTypeScript · PLpgSQLGitHub @Bourama-devOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Outil de désignation des arbitres pour le CD45. Next.js (App Router) + TypeScript + Supabase (Postgres + Auth), via @supabase/supabase-js.Read the full README ↗
Outil de désignation des arbitres pour le CD45. Next.js (App Router) +
TypeScript + Supabase (Postgres + Auth), via @supabase/supabase-js.
/admin/import, réservé ADMIN) :
colonnes Équipe domicile / Équipe extérieur / Date / Heure / Lieu / Niveau,
avec alias reconnus (Equipe 1/Equipe 2, Salle, Code) pour être compatible
directement avec l'export "Recherche désignation" de FFBB Compet.
Idempotent - un match déjà présent (même date, mêmes équipes, même niveau)
est complété/mis à jour plutôt que dupliqué, donc le même fichier peut être
réimporté sans risque. Les niveaux de compétition inconnus sont créés
automatiquement./matchs/nouveau, /matchs/[id]/modifier) et des
arbitres (/arbitres/nouveau, /arbitres/[id]/modifier) : créer, modifier,
annuler/désactiver, supprimer/admin/utilisateurs, réservé ADMIN)/matchs/incomplets) : sélection de matchs via
cases à cocher, assigne directement la meilleure suggestion à chaque
créneau vacant sans écran de confirmation intermédiairesrc/lib/designation-rules.ts, page /reglement) :
quotas par arbitre (max 3 désignations/semaine, max 3/week-end) vérifiés
avant toute désignation (manuelle ou auto), avec pop-up d'alerte en cas de
blocage. Liste vouée à être complétée au fur et à mesure des règles du CD45Le projet parle directement à Supabase via @supabase/supabase-js (pas
d'ORM). Deux clients :
src/lib/supabase/server.ts : client lié à la session du visiteur
(cookies), utilisé uniquement pour l'authentification (login/signup/
session Supabase Auth)src/lib/supabase/admin.ts : client "service_role", utilisé pour toutes
les données applicatives (matchs, arbitres, désignations...). Contourne
volontairement les policies RLS - l'autorisation (qui peut faire quoi)
est vérifiée par notre propre code (getCurrentUser() + rôle), jamais
par la basesupabase/schema.sql et supabase/seed.sql documentent le schéma et les
données de référence (déjà appliqués sur le projet). Ce ne sont pas des
migrations exécutées automatiquement : toute évolution de schéma se fait
en SQL direct sur le projet Supabase (dashboard > SQL editor, ou les
outils MCP Supabase), puis en mettant à jour supabase/schema.sql.
L'authentification passe entièrement par le service Auth natif de Supabase
(GoTrue), via @supabase/ssr. Deux pages : /login et /signup
(inscription libre, ouverte à qui a l'URL - pas de code d'invitation).
Un nouveau compte créé via /signup obtient le rôle REPARTITEUR par
défaut ; à évaluer si un contrôle d'accès plus strict devient nécessaire
(code d'invitation, validation manuelle...).
Table Profile (schéma public) : id = auth.users.id, email, name,
role (ADMIN ou REPARTITEUR, défaut REPARTITEUR). Un trigger Postgres
(handle_new_user, voir supabase/schema.sql) crée automatiquement la
ligne Profile à chaque nouvelle inscription dans auth.users, que ce
soit via /signup ou créée manuellement depuis le dashboard Supabase.
Créer un compte manuellement (alternative à /signup) : dashboard
Supabase > Authentication > Users > Add user (cocher "Auto Confirm User"
pour se connecter immédiatement sans email de confirmation).
Promouvoir un compte en ADMIN (accès à /admin/niveaux) :
UPDATE "Profile" SET role = 'ADMIN' WHERE email = '[email protected]';
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY : URL et clé
publique du projet Supabase (Project Settings > API)SUPABASE_SERVICE_ROLE_KEY : clé secrète (même page, section
"service_role") - ne jamais l'exposer côté client, uniquement utilisée
dans du code serveur (src/lib/supabase/admin.ts)GOOGLE_MAPS_API_KEY (optionnelle) : clé API Google Cloud avec la
Geocoding API activée. Sert à convertir l'adresse d'un arbitre et
l'adresse d'un gymnase en coordonnées GPS, pour prioriser les
suggestions par proximité et estimer la rémunération (40€/match +
0,35€/km aller-retour). Sans cette variable, l'app fonctionne
normalement, juste sans ce tri par distance ni cette estimation.Piège fréquent en collant une valeur dans les Environment Variables de
Vercel : ne pas inclure les guillemets (le format .env en a, Vercel
non) - une URL du genre "https://...supabase.co" avec les guillemets
inclus est invalide et fait planter toutes les pages (500 générique). Le
code tente de nettoyer ça automatiquement (src/lib/supabase/env.ts),
mais autant coller la valeur propre dès le départ.
npm install
npm run dev
Créer ensuite un compte via /signup ou le dashboard Supabase (voir
section Authentification ci-dessus) pour pouvoir te connecter.
claude/referee-assignment-system-zy1i9t (ou main une fois mergé),
renseigner les trois variables d'environnement ci-dessus (cocher
Production + Preview pour chacune), puis déployer.