Ajouter charte et confidentialite

This commit is contained in:
Daniel Allaire 2026-06-01 14:13:44 -04:00
parent 8de5e49200
commit f04871c3b3
6 changed files with 68 additions and 13 deletions

View file

@ -21,7 +21,8 @@ MODULES_CONSULTATION = [
ModuleTuile(code="C5", nom="Gouvernance", description="Décisions du groupe", icone="📌", couleur="red"), 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="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="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="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"), ModuleTuile(code="S1T", nom="Trésorerie", description="État des résultats, soldes, registre", icone="🏦", couleur="green"),
] ]

View file

@ -32,6 +32,7 @@ import AssembleeInvite from './pages/AssembleeInvite';
import JournalActions from './pages/JournalActions'; import JournalActions from './pages/JournalActions';
import GestionGroupes from './pages/GestionGroupes'; import GestionGroupes from './pages/GestionGroupes';
import PrincipesUtilisation from './pages/PrincipesUtilisation'; import PrincipesUtilisation from './pages/PrincipesUtilisation';
import Confidentialite from './pages/Confidentialite';
import ModePapier from './pages/ModePapier'; import ModePapier from './pages/ModePapier';
import BottomNav from './components/BottomNav'; import BottomNav from './components/BottomNav';
@ -102,6 +103,7 @@ export default function App() {
case 'G8': pageActive = <ConfigRepartition />; break; case 'G8': pageActive = <ConfigRepartition />; break;
case 'C9': pageActive = <Impliquer />; break; case 'C9': pageActive = <Impliquer />; break;
case 'C11': pageActive = <PrincipesUtilisation />; break; case 'C11': pageActive = <PrincipesUtilisation />; break;
case 'C13': pageActive = <Confidentialite />; break;
case 'C12': pageActive = <ModePapier />; break; case 'C12': pageActive = <ModePapier />; break;
case 'C10': pageActive = <Tresorerie />; break; case 'C10': pageActive = <Tresorerie />; break;
default: pageActive = <Accueil />; default: pageActive = <Accueil />;
@ -120,6 +122,8 @@ export default function App() {
// Pages publiques // Pages publiques
switch (page) { switch (page) {
case 'inscription': return <Inscription />; case 'inscription': return <Inscription />;
case 'charte': return <PrincipesUtilisation />;
case 'confidentialite': return <Confidentialite />;
default: return <Login />; default: return <Login />;
} }
} }

View file

@ -12,7 +12,7 @@ const COULEURS = {
gray: 'bg-gray-50 border-gray-200 text-gray-700', 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 MODULES_CONTEXTE = new Set(['S0', 'M0', 'M1', 'M2']);
const MODULE_INVENTAIRES = { const MODULE_INVENTAIRES = {
code: 'M5', code: 'M5',
@ -29,7 +29,7 @@ const CONTEXTES = {
sections: [ sections: [
{ titre: 'À faire maintenant', codes: ['S5', 'C5', 'C9'] }, { titre: 'À faire maintenant', codes: ['S5', 'C5', 'C9'] },
{ titre: 'État', codes: ['S1T', 'C2', 'C1', 'C4'] }, { titre: 'État', codes: ['S1T', 'C2', 'C1', 'C4'] },
{ titre: 'Mon espace', codes: ['C7', 'C11', 'C12'] }, { titre: 'Mon espace', codes: ['C7', 'C11', 'C13', 'C12'] },
], ],
}, },
reunion: { reunion: {

View file

@ -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 (
<div className="min-h-screen bg-gray-100">
<PageHeader titre="Confidentialité" sousTitre="Données, accès et journal" />
<div className="p-4 space-y-4">
<div className="bg-white rounded-2xl p-4 shadow-sm">
<p className="text-sm text-gray-700 leading-relaxed">
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.
</p>
</div>
<div className="space-y-2">
{SECTIONS.map(([titre, texte]) => (
<div key={titre} className="bg-white rounded-2xl p-4 shadow-sm">
<p className="font-bold text-gray-800">{titre}</p>
<p className="text-sm text-gray-600 mt-1 leading-relaxed">{texte}</p>
</div>
))}
</div>
</div>
</div>
);
}

View file

@ -223,6 +223,14 @@ export default function Login() {
Sysadmin Sysadmin
</button> </button>
)} )}
<div className="mb-3 flex items-center justify-center gap-4 text-xs">
<button type="button" onClick={() => setPage('charte')} className="font-medium text-blue-200/75 underline-offset-4 active:text-white">
Charte d'utilisation
</button>
<button type="button" onClick={() => setPage('confidentialite')} className="font-medium text-blue-200/75 underline-offset-4 active:text-white">
Confidentialité
</button>
</div>
<p className="text-center text-xs text-blue-300">100% logiciel libre · Hébergé au Québec</p> <p className="text-center text-xs text-blue-300">100% logiciel libre · Hébergé au Québec</p>
</div> </div>
</div> </div>

View file

@ -2,22 +2,25 @@ import React from 'react';
import PageHeader from '../components/PageHeader'; import PageHeader from '../components/PageHeader';
const PRINCIPES = [ const PRINCIPES = [
['Outil de service', "L'application soutient les serviteurs; elle ne remplace jamais la conscience de groupe."], ['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."],
['Reprise sur papier', "Les rencontres, assemblées et rapports doivent pouvoir continuer même si l'informatique tombe."], ['Autonomie du groupe', "Chaque groupe demeure responsable de ses données, de ses usages, de ses décisions et de ses comptes rendus."],
['Sobriété des données', "On conserve seulement les renseignements utiles au fonctionnement du groupe."], ['Limites du service', "Le soutien technique est offert au meilleur effort. Aucune disponibilité continue ou intervention d'urgence n'est promise."],
['Transparence', "Le journal sert à comprendre les changements et protéger l'historique, pas à surveiller les membres."], ['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."], ['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() { export default function PrincipesUtilisation() {
return ( return (
<div className="min-h-screen bg-gray-100"> <div className="min-h-screen bg-gray-100">
<PageHeader titre="Principes d'utilisation" sousTitre="L'application comme outil de service" /> <PageHeader titre="Charte d'utilisation" sousTitre="Outil de service et limites" />
<div className="p-4 space-y-4"> <div className="p-4 space-y-4">
<div className="bg-white rounded-2xl p-4 shadow-sm"> <div className="bg-white rounded-2xl p-4 shadow-sm">
<p className="text-sm text-gray-700 leading-relaxed"> <p className="text-sm text-gray-700 leading-relaxed">
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. Elle ne gouverne pas le groupe. Les décisions demeurent prises par les membres, selon les pratiques du groupe.
</p> </p>
</div> </div>
@ -32,10 +35,10 @@ export default function PrincipesUtilisation() {
</div> </div>
<div className="bg-blue-50 border border-blue-100 rounded-2xl p-4"> <div className="bg-blue-50 border border-blue-100 rounded-2xl p-4">
<p className="font-bold text-aa-blue">Boussole simple</p> <p className="font-bold text-aa-blue">Acceptation</p>
<p className="text-sm text-blue-900 mt-1 leading-relaxed"> <p className="text-sm text-blue-900 mt-1 leading-relaxed">
Une fonctionnalité est saine si elle augmente la capacité du groupe à se servir lui-même. Utiliser l'application implique d'accepter ces principes. Une fonctionnalité est saine si elle augmente
Elle devient fragile si elle augmente surtout le contrôle sur les membres. la capacité du groupe à se servir lui-même. Elle devient fragile si elle augmente surtout le contrôle sur les membres.
</p> </p>
</div> </div>
</div> </div>