From 0b230483d9071c77660633b1fee30189a00b60eb Mon Sep 17 00:00:00 2001 From: Yvv Date: Mon, 2 Mar 2026 08:52:56 +0100 Subject: [PATCH] UX: texte valorise, vote discret, inertie visuelle, genese repliable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - EngagementCard: texte agrandi (15-16px), vote board discret (opacity, scale) - MiniVoteBoard: badge Adopte/En attente apres "Vote permanent :", board compact - InertiaSlider: labels descriptifs (inertie pour le remplacement), schema SVG avec courbe de seuil, formule simplifiee et legende parametres - GenesisBlock: toggle repliement individuel par section (source, outils, forum, processus, contributeurs) - Votes varies dans Conseils et bonnes pratiques (non-adoptes inclus) - Seed: Certification responsable → Reciprocite, ordonnancement inertie standard, notes variables K1/K2 (vote porte sur l'inclusion, pas les valeurs), init_db() dans seed.py pour DB vierge Co-Authored-By: Claude Opus 4.6 --- backend/seed.py | 22 +- .../components/documents/EngagementCard.vue | 50 +++- .../app/components/documents/GenesisBlock.vue | 278 ++++++++++++------ .../components/documents/InertiaSlider.vue | 222 +++++++++++++- .../components/documents/MiniVoteBoard.vue | 46 ++- 5 files changed, 469 insertions(+), 149 deletions(-) diff --git a/backend/seed.py b/backend/seed.py index c130bfd..67f4dc3 100644 --- a/backend/seed.py +++ b/backend/seed.py @@ -27,7 +27,7 @@ from datetime import datetime, timedelta, timezone from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from app.database import async_session, engine, Base +from app.database import async_session, engine, Base, init_db from app.models.protocol import FormulaConfig, VotingProtocol from app.models.document import Document, DocumentItem from app.models.decision import Decision, DecisionStep @@ -351,7 +351,7 @@ ENGAGEMENT_CERTIFICATION_ITEMS: list[dict] = [ { "position": "E2", "item_type": "clause", - "title": "Certification responsable", + "title": "Reciprocite", "sort_order": 5, "section_tag": "fondamental", "inertia_preset": "standard", @@ -534,7 +534,10 @@ ENGAGEMENT_CERTIFICATION_ITEMS: list[dict] = [ "- Sentinelle : membre ayant recu et emis >= Y[N] certifs " "(Y = ceil(N^(1/5)))\n" "- Certifications actives valables **2 ans**\n" - "- Renouvellement de l'accord tous les **12 mois**" + "- Renouvellement de l'accord tous les **12 mois**\n\n" + "*Note : le vote porte sur l'inclusion de ces regles dans le document, " + "pas sur les valeurs des variables protocolaires elles-memes, " + "qui sont fixees par le protocole Duniter.*" ), }, { @@ -549,7 +552,10 @@ ENGAGEMENT_CERTIFICATION_ITEMS: list[dict] = [ "- 1 Dividende Universel (DU) par personne par jour\n" "- Reevaluation a chaque equinoxe : " "`DU(n+1) = DU(n) + c² × (M/N) / 182.625` avec c = 4.88%\n" - "- DU(0) = 10.00 G1" + "- DU(0) = 10.00 G1\n\n" + "*Note : le vote porte sur l'inclusion de ces parametres dans le document, " + "pas sur les valeurs monetaires elles-memes, " + "qui decoulent de la TRM et du bloc 0.*" ), }, # =================================================================== @@ -790,11 +796,11 @@ ENGAGEMENT_CERTIFICATION_ITEMS: list[dict] = [ "title": "Ordonnancement du document", "sort_order": 33, "section_tag": "ordonnancement", - "inertia_preset": "high", + "inertia_preset": "standard", "current_text": ( "L'ordre de presentation des items dans le document est " "lui-meme soumis au vote. Toute proposition de reorganisation " - "doit atteindre le seuil d'adoption avec l'inertie haute." + "doit atteindre le seuil d'adoption avec l'inertie standard." ), }, ] @@ -1442,6 +1448,10 @@ async def run_seed(): print("Glibredecision - Seed Database") print("=" * 60) + # Ensure tables exist + await init_db() + print("[0/7] Tables created.\n") + async with async_session() as session: async with session.begin(): print("\n[1/7] Formula Configs...") diff --git a/frontend/app/components/documents/EngagementCard.vue b/frontend/app/components/documents/EngagementCard.vue index 0996363..4d5e565 100644 --- a/frontend/app/components/documents/EngagementCard.vue +++ b/frontend/app/components/documents/EngagementCard.vue @@ -46,6 +46,23 @@ const itemTypeLabel = computed(() => { } }) +// Mock vote data varies by item for demo — items in "bonnes pratiques" (E8-E11) get lower/mixed votes +const mockVotes = computed(() => { + const order = props.item.sort_order + const pos = props.item.position + + // Conseils et bonnes pratiques: varied votes, some non-adopted + if (pos === 'E8') return { votesFor: 4, votesAgainst: 3 } // contested + if (pos === 'E9') return { votesFor: 2, votesAgainst: 5 } // rejected + if (pos === 'E10') return { votesFor: 6, votesAgainst: 2 } // borderline + if (pos === 'E11') return { votesFor: 3, votesAgainst: 4 } // rejected + + // Default: well-adopted items + const base = ((order * 7 + 13) % 5) + 8 // 8-12 + const against = (order % 3) // 0-2 + return { votesFor: base, votesAgainst: against } +}) + function navigateToItem() { navigateTo(`/documents/${props.documentSlug}/items/${props.item.id}`) } @@ -102,8 +119,8 @@ function navigateToItem() {