From f04871c3b3428a271a34702ac45c2ecf3016127a Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Mon, 1 Jun 2026 14:13:44 -0400 Subject: [PATCH] Ajouter charte et confidentialite --- backend/app/routers/accueil.py | 3 +- frontend/src/App.jsx | 4 +++ frontend/src/pages/Accueil.jsx | 4 +-- frontend/src/pages/Confidentialite.jsx | 39 +++++++++++++++++++++ frontend/src/pages/Login.jsx | 8 +++++ frontend/src/pages/PrincipesUtilisation.jsx | 23 ++++++------ 6 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 frontend/src/pages/Confidentialite.jsx diff --git a/backend/app/routers/accueil.py b/backend/app/routers/accueil.py index 566482e..319cb28 100644 --- a/backend/app/routers/accueil.py +++ b/backend/app/routers/accueil.py @@ -21,7 +21,8 @@ MODULES_CONSULTATION = [ ModuleTuile(code="C5", nom="Gouvernance", description="Décisions du groupe", icone="📌", couleur="red"), ModuleTuile(code="C7", nom="Mon profil", description="Modifier, PIN, notifications", icone="👤", couleur="gray"), ModuleTuile(code="C9", nom="Postes à pourvoir", description="Postes disponibles, candidature", icone="🙋", couleur="yellow"), - ModuleTuile(code="C11", nom="Principes d'utilisation", description="L'application comme outil de service", icone="🧭", couleur="indigo"), + ModuleTuile(code="C11", nom="Charte d'utilisation", description="Outil de service et limites", icone="🧭", couleur="indigo"), + ModuleTuile(code="C13", nom="Confidentialité", description="Données, accès et journal", icone="🔒", couleur="gray"), ModuleTuile(code="C12", nom="Mode papier", description="Formulaires de reprise en main", icone="🖨️", couleur="gray"), ModuleTuile(code="S1T", nom="Trésorerie", description="État des résultats, soldes, registre", icone="🏦", couleur="green"), ] diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 40bc945..2038b22 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -32,6 +32,7 @@ import AssembleeInvite from './pages/AssembleeInvite'; import JournalActions from './pages/JournalActions'; import GestionGroupes from './pages/GestionGroupes'; import PrincipesUtilisation from './pages/PrincipesUtilisation'; +import Confidentialite from './pages/Confidentialite'; import ModePapier from './pages/ModePapier'; import BottomNav from './components/BottomNav'; @@ -102,6 +103,7 @@ export default function App() { case 'G8': pageActive = ; break; case 'C9': pageActive = ; break; case 'C11': pageActive = ; break; + case 'C13': pageActive = ; break; case 'C12': pageActive = ; break; case 'C10': pageActive = ; break; default: pageActive = ; @@ -120,6 +122,8 @@ export default function App() { // Pages publiques switch (page) { case 'inscription': return ; + case 'charte': return ; + case 'confidentialite': return ; default: return ; } } diff --git a/frontend/src/pages/Accueil.jsx b/frontend/src/pages/Accueil.jsx index d0e6a7c..639f52d 100644 --- a/frontend/src/pages/Accueil.jsx +++ b/frontend/src/pages/Accueil.jsx @@ -12,7 +12,7 @@ const COULEURS = { gray: 'bg-gray-50 border-gray-200 text-gray-700', }; -const NAVIGABLE = ['C7', 'S1', 'S1T', 'S2', 'S3', 'S4', 'S5', 'C1', 'C2', 'C4', 'C5', 'C9', 'C11', 'C12', 'G2', 'G9', 'G11', 'G12', 'G13', 'G14', 'M0', 'M1', 'M2', 'M3', 'M4', 'M5', 'M6']; +const NAVIGABLE = ['C7', 'S1', 'S1T', 'S2', 'S3', 'S4', 'S5', 'C1', 'C2', 'C4', 'C5', 'C9', 'C11', 'C12', 'C13', 'G2', 'G9', 'G11', 'G12', 'G13', 'G14', 'M0', 'M1', 'M2', 'M3', 'M4', 'M5', 'M6']; const MODULES_CONTEXTE = new Set(['S0', 'M0', 'M1', 'M2']); const MODULE_INVENTAIRES = { code: 'M5', @@ -29,7 +29,7 @@ const CONTEXTES = { sections: [ { titre: 'À faire maintenant', codes: ['S5', 'C5', 'C9'] }, { titre: 'État', codes: ['S1T', 'C2', 'C1', 'C4'] }, - { titre: 'Mon espace', codes: ['C7', 'C11', 'C12'] }, + { titre: 'Mon espace', codes: ['C7', 'C11', 'C13', 'C12'] }, ], }, reunion: { diff --git a/frontend/src/pages/Confidentialite.jsx b/frontend/src/pages/Confidentialite.jsx new file mode 100644 index 0000000..d8ecb2c --- /dev/null +++ b/frontend/src/pages/Confidentialite.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import PageHeader from '../components/PageHeader'; + +const SECTIONS = [ + ['Données recueillies', "L'application conserve les renseignements nécessaires au fonctionnement du groupe: prénom, coordonnées utiles, identifiant de connexion, date d'abstinence optionnelle, rôles, présences, décisions, finances du groupe et historique des changements."], + ['Utilisation', "Les données servent à soutenir les rencontres, assemblées, mandats, rapports, finances, communications internes, sauvegardes et reprises d'historique."], + ['Accès', "Les membres voient les informations nécessaires à leur participation. Les exécutifs et les postes autorisés ont des accès plus larges selon leurs responsabilités. Le sysadmin technique agit seulement pour soutenir l'application."], + ['Journal', "Les changements réussis sont journalisés pour comprendre ce qui a été modifié, par qui et quand. Ce journal existe pour protéger l'historique et corriger les erreurs, pas pour surveiller les membres."], + ['Isolation des groupes', "Les groupes sont isolés. Un membre connecté dans un groupe ne doit pas accéder aux données d'un autre groupe."], + ['Sauvegardes', "Les sauvegardes contiennent des données personnelles et doivent être protégées. Elles servent à restaurer le service en cas d'erreur ou d'incident."], + ["Droit à l'oubli", "Un membre peut demander l'anonymisation de ses renseignements. L'enregistrement n'est pas supprimé afin de préserver l'historique; l'ID technique et le prénom peuvent demeurer."], + ['Notifications', "Les notifications push sont optionnelles. Le membre choisit les catégories qu'il souhaite recevoir et peut les désactiver."], + ['Limites', "Aucun système n'est parfait. Les groupes doivent conserver leurs rapports importants et pouvoir reprendre les processus sur papier au besoin."], +]; + +export default function Confidentialite() { + return ( +
+ +
+
+

+ Cette politique résume comment l'application traite les données des groupes et des membres. + Elle doit rester simple, compréhensible et conforme à l'esprit de service. +

+
+ +
+ {SECTIONS.map(([titre, texte]) => ( +
+

{titre}

+

{texte}

+
+ ))} +
+
+
+ ); +} diff --git a/frontend/src/pages/Login.jsx b/frontend/src/pages/Login.jsx index a71b143..7c8319f 100644 --- a/frontend/src/pages/Login.jsx +++ b/frontend/src/pages/Login.jsx @@ -223,6 +223,14 @@ export default function Login() { Sysadmin )} +
+ + +

100% logiciel libre · Hébergé au Québec

diff --git a/frontend/src/pages/PrincipesUtilisation.jsx b/frontend/src/pages/PrincipesUtilisation.jsx index d758340..4bc38d5 100644 --- a/frontend/src/pages/PrincipesUtilisation.jsx +++ b/frontend/src/pages/PrincipesUtilisation.jsx @@ -2,22 +2,25 @@ import React from 'react'; import PageHeader from '../components/PageHeader'; const PRINCIPES = [ - ['Outil de service', "L'application soutient les serviteurs; elle ne remplace jamais la conscience de groupe."], - ['Reprise sur papier', "Les rencontres, assemblées et rapports doivent pouvoir continuer même si l'informatique tombe."], - ['Sobriété des données', "On conserve seulement les renseignements utiles au fonctionnement du groupe."], - ['Transparence', "Le journal sert à comprendre les changements et protéger l'historique, pas à surveiller les membres."], + ['Outil de service', "L'application soutient les tâches du groupe. Elle ne remplace jamais la conscience de groupe, les réunions, ni les décisions prises par les membres."], + ['Autonomie du groupe', "Chaque groupe demeure responsable de ses données, de ses usages, de ses décisions et de ses comptes rendus."], + ['Limites du service', "Le soutien technique est offert au meilleur effort. Aucune disponibilité continue ou intervention d'urgence n'est promise."], + ['Reprise sur papier', "Les rencontres, assemblées, rapports et décisions doivent pouvoir continuer même si l'informatique devient indisponible."], + ['Sobriété des données', "On conserve seulement les renseignements utiles au fonctionnement du groupe et à la continuité de son historique."], + ['Transparence', "Le journal sert à comprendre les changements, corriger les erreurs et protéger l'historique. Il ne doit pas servir à surveiller les membres."], ['Pouvoirs visibles', "Les accès viennent des postes occupés. Les actions sensibles doivent rester explicables au groupe."], - ['Participation libre', "L'application ne doit jamais devenir nécessaire pour assister à une réunion ou participer au groupe."], + ['Participation libre', "L'application ne doit jamais devenir nécessaire pour assister à une réunion, participer au groupe ou demander de l'aide."], + ['Frais éventuels', "S'il y a contribution financière, elle sert à couvrir l'hébergement, les sauvegardes et l'entretien minimal."], ]; export default function PrincipesUtilisation() { return (
- +

- Cette application aide le groupe à alléger les tâches, préserver l'historique et soutenir la transparence. + Cette application est offerte comme outil de service. Elle aide à alléger les tâches, préserver l'historique et soutenir la transparence. Elle ne gouverne pas le groupe. Les décisions demeurent prises par les membres, selon les pratiques du groupe.

@@ -32,10 +35,10 @@ export default function PrincipesUtilisation() {
-

Boussole simple

+

Acceptation

- Une fonctionnalité est saine si elle augmente la capacité du groupe à se servir lui-même. - Elle devient fragile si elle augmente surtout le contrôle sur les membres. + Utiliser l'application implique d'accepter ces principes. Une fonctionnalité est saine si elle augmente + la capacité du groupe à se servir lui-même. Elle devient fragile si elle augmente surtout le contrôle sur les membres.