diff --git a/Dockerfile.business b/Dockerfile.business index 0210847..57506f3 100644 --- a/Dockerfile.business +++ b/Dockerfile.business @@ -99,6 +99,12 @@ RUN echo "📊 Comptage des fichiers .md dans .techradar/data/radar" && \ RUN mkdir -p .techradar/src/pages COPY docker/team-page.tsx .techradar/src/pages/team.tsx +# Modifier _document.tsx pour charger team-block-script.js en premier (avant le rendu) +COPY docker/patch_document.py /tmp/patch_document.py +RUN python3 /tmp/patch_document.py && \ + echo "📄 _document.tsx apres modification:" && \ + cat .techradar/src/pages/_document.tsx + # Script Python pour ajouter le lien Équipe dans Navigation.tsx (supprime TOUS les doublons) COPY docker/add_team_link.py /tmp/add_team_link.py diff --git a/docker/patch_document.py b/docker/patch_document.py new file mode 100644 index 0000000..0eec752 --- /dev/null +++ b/docker/patch_document.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +# Script pour modifier _document.tsx et charger team-block-script.js en premier + +import sys + +doc_path = ".techradar/src/pages/_document.tsx" + +try: + with open(doc_path, "r") as f: + content = f.read() + + # Ajouter l'import de Script si pas present + if "import Script from 'next/script'" not in content and 'import Script from "next/script"' not in content: + content = content.replace( + 'import { Head, Html, Main, NextScript } from "next/document";', + 'import { Head, Html, Main, NextScript } from "next/document";\nimport Script from "next/script";' + ) + + # Ajouter le script dans
avec strategy="beforeInteractive" + if "team-block-script.js" not in content: + # Trouver la fin deet la remplacer par un
avec contenu + if "
" in content: + content = content.replace( + "
", + '
\n \n ' + ) + elif "
" in content and "" in content: + # Ajouter avant + content = content.replace( + "", + ' \n ' + ) + + with open(doc_path, "w") as f: + f.write(content) + + print("_document.tsx modifie pour charger team-block-script.js en premier") + sys.exit(0) +except Exception as e: + print(f"Erreur: {e}") + sys.exit(1) + diff --git a/public/team-block-script.js b/public/team-block-script.js index aa3d095..8cc8572 100644 --- a/public/team-block-script.js +++ b/public/team-block-script.js @@ -1,4 +1,4 @@ -// SCRIPT ÉQUIPE - Affichage direct dans iframe +// SCRIPT EQUIPE - Remplacement DOM apres chargement (function() { 'use strict'; @@ -6,198 +6,323 @@ var isTeamRoute = path === '/team' || path === '/team/' || path.startsWith('/team/'); if (!isTeamRoute) { - console.log('Page normale - team-block-script inactif'); return; } - console.log('ÉQUIPE: Page team détectée'); + console.log('EQUIPE: Page team detectee, preparation du remplacement DOM'); - // Éviter les boucles avec sessionStorage - var loadKey = 'team_page_loaded_' + Date.now().toString().slice(0,-3); - if (sessionStorage.getItem('team_loading')) { - console.log('ÉQUIPE: Chargement déjà en cours, abandon'); - return; + // Fonction pour charger un script externe + function loadScript(src) { + return new Promise(function(resolve, reject) { + var script = document.createElement('script'); + script.src = src; + script.onload = resolve; + script.onerror = reject; + document.head.appendChild(script); + }); } - sessionStorage.setItem('team_loading', 'true'); - - // Nettoyer après 2 secondes - setTimeout(function() { - sessionStorage.removeItem('team_loading'); - }, 2000); - // Stopper le chargement Next.js - window.stop(); + // Fonction pour initialiser la page equipe + async function initTeamPage() { + console.log('EQUIPE: Initialisation de la page'); + + // CSS de la page + var css = '*{margin:0;padding:0;box-sizing:border-box}' + + 'body{font-family:system-ui,sans-serif;background:#1a4d3a;color:#e0e0e0;padding:20px}' + + '.container{max-width:1400px;margin:0 auto}' + + 'header{text-align:center;margin-bottom:30px;padding:20px;background:rgba(26,77,58,0.5);border-radius:8px}' + + 'h1{color:#4ade80;margin-bottom:10px}' + + '.tabs{display:flex;gap:10px;margin-bottom:20px;flex-wrap:wrap}' + + '.tab-btn{padding:12px 24px;background:rgba(74,222,128,0.2);border:2px solid #4ade80;color:#4ade80;border-radius:6px;cursor:pointer;font-size:14px;font-weight:600}' + + '.tab-btn:hover{background:rgba(74,222,128,0.3)}' + + '.tab-btn.active{background:#4ade80;color:#1a4d3a}' + + '.tab-content{display:none;background:rgba(26,77,58,0.3);border-radius:8px;padding:20px;margin-bottom:20px}' + + '.tab-content.active{display:block}' + + '#network-graph{width:100%;height:700px;background:rgba(0,0,0,0.2);border-radius:8px;border:1px solid rgba(74,222,128,0.3)}' + + '#congestion-matrix{width:100%;height:600px;background:rgba(0,0,0,0.2);border-radius:8px}' + + '.genesis-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:15px;margin-bottom:30px}' + + '.stat-card{background:rgba(74,222,128,0.1);border:1px solid rgba(74,222,128,0.3);border-radius:6px;padding:15px}' + + '.stat-value{font-size:32px;font-weight:bold;color:#4ade80}' + + '.stat-label{font-size:14px;color:#a0a0a0;margin-top:5px}' + + '.member-card{background:rgba(26,77,58,0.5);border:1px solid rgba(74,222,128,0.3);border-radius:6px;padding:15px;margin-bottom:15px}' + + '.member-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}' + + '.member-name{font-size:18px;font-weight:bold;color:#4ade80}' + + '.member-avail{background:rgba(74,222,128,0.2);padding:5px 12px;border-radius:4px;font-size:14px}' + + '.tech-list{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}' + + '.tech-tag{background:rgba(74,222,128,0.2);border:1px solid rgba(74,222,128,0.4);padding:4px 10px;border-radius:4px;font-size:12px}' + + '.warning-box{background:rgba(255,68,68,0.2);border:1px solid rgba(255,68,68,0.5);border-radius:6px;padding:15px;margin-top:20px}' + + '.warning-title{color:#ff6b6b;font-weight:bold;margin-bottom:10px}' + + '.uncovered{background:rgba(255,68,68,0.1);border-left:3px solid #ff6b6b;padding:10px;margin:8px 0;border-radius:4px}' + + '.legend{display:flex;gap:20px;margin:20px 0;flex-wrap:wrap}' + + '.legend-item{display:flex;align-items:center;gap:8px}' + + '.legend-color{width:20px;height:20px;border-radius:4px}' + + '.loading{text-align:center;padding:40px;color:#4ade80}'; - // Créer la page directement - var teamHTML = '
' + - '' + - '' + - '
' + - '