{"id":3775,"date":"2025-11-30T23:14:54","date_gmt":"2025-11-30T23:14:54","guid":{"rendered":"https:\/\/planifeducation.gouv.tg\/dpsse\/?page_id=3775"},"modified":"2026-04-01T09:21:06","modified_gmt":"2026-04-01T09:21:06","slug":"liste-des-ecoles","status":"publish","type":"page","link":"https:\/\/planifeducation.gouv.tg\/dpsse\/liste-des-ecoles\/","title":{"rendered":"Liste des \u00e9coles"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3775\" class=\"elementor elementor-3775\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9fd8d0b elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9fd8d0b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-599557b\" data-id=\"599557b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9983c62 elementor-widget elementor-widget-heading\" data-id=\"9983c62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Consulter la base de donn\u00e9es compl\u00e8te des \u00e9coles.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5c49874 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5c49874\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1fcce2b\" data-id=\"1fcce2b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-12cc110 elementor-widget__width-initial elementor-widget-tablet__width-initial elementor-widget elementor-widget-html\" data-id=\"12cc110\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"schools-directory\">\r\n    <div class=\"search-container\" style=\"display: none\">\r\n        <div class=\"search-filters\">\r\n            <input type=\"text\" id=\"school-search\" placeholder=\"Rechercher (nom, ville, r\u00e9gion)...\" \/>\r\n            <select id=\"region-filter\"><option value=\"\">Toutes les r\u00e9gions<\/option><\/select>\r\n            <select id=\"inspection-filter\"><option value=\"\">Toutes les inspections<\/option><\/select>\r\n            <select id=\"type-filter\"><option value=\"\">Tous les cycles<\/option><\/select> \r\n            <select id=\"statut-filter\"><option value=\"\">Tous les statuts<\/option><\/select>\r\n        <\/div>\r\n        <div class=\"results-info\">\r\n          <span id=\"results-count\"><\/span>\r\n          <button id=\"export-btn\" class=\"export-btn\">\r\n            <i class=\"fas fa-download\"><\/i> Exporter\r\n          <\/button>\r\n        <\/div>\r\n    <\/div>\r\n    \r\n    <div class=\"schools-table-container\" style=\"display: none\">\r\n        <table id=\"schools-table\" class=\"schools-table\">\r\n            <thead>\r\n                <tr>\r\n                    \r\n                    <th data-sort=\"code_administratif\">Code admin<\/th>\r\n                    <th data-sort=\"nom_etablissement\">Nom \u00e9tablissement<\/th>\r\n                    <th data-sort=\"libelle_type_systeme\">Type<\/th>\r\n                    <th data-sort=\"dre\">R\u00e9gion (DRE)<\/th>\r\n                    <th data-sort=\"inspection\">Inspection<\/th>\r\n                    <th data-sort=\"commune\">Commune<\/th>\r\n                    <th data-sort=\"ville_village_quartier\">Localit\u00e9<\/th>\r\n                    <th data-sort=\"libelle_type_statut_etab\">Statut<\/th>\r\n                <\/tr>\r\n            <\/thead>\r\n            <tbody id=\"schools-table-body\"><\/tbody>\r\n        <\/table>\r\n        <div id=\"no-results\" class=\"no-results\" style=\"display: none\">\r\n            <p>Aucun \u00e9tablissement trouv\u00e9 avec les crit\u00e8res s\u00e9lectionn\u00e9s.<\/p>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"pagination\" style=\"display: none\">\r\n        <button id=\"prev-page\" disabled><i class=\"fas fa-chevron-left\"><\/i><\/button>\r\n        <span id=\"page-info\">Page 1 sur 1<\/span>\r\n        <button id=\"next-page\" disabled><i class=\"fas fa-chevron-right\"><\/i><\/button>\r\n        <select id=\"page-size\">\r\n            <option value=\"10\">10<\/option>\r\n            <option value=\"20\" selected>20<\/option>\r\n            <option value=\"50\">50<\/option>\r\n            <option value=\"100\">100<\/option>\r\n        <\/select>\r\n    <\/div>\r\n\r\n    <div id=\"loading\" class=\"loading\">\r\n        <div class=\"spinner\"><\/div>\r\n        <span>Chargement des donn\u00e9es...<\/span>\r\n    <\/div>\r\n    \r\n\r\n    <div id=\"school-modal\" class=\"school-modal\" style=\"display: none\">\r\n        <div class=\"modal-overlay\"><\/div>\r\n        <div class=\"modal-content\">\r\n            <div class=\"modal-header\">\r\n                <div class=\"modal-title-group\">\r\n                    <h2 id=\"modal-school-name\">D\u00e9tails de l'\u00e9cole<\/h2>\r\n                    <span id=\"modal-badge-type\" class=\"header-badge\">Type<\/span>\r\n                <\/div>\r\n                <button class=\"modal-close\">&times;<\/button>\r\n            <\/div>\r\n            \r\n            <div class=\"modal-body\">\r\n                <div class=\"modal-layout\">\r\n                    <div class=\"modal-infos\">\r\n                        <div class=\"info-card\">\r\n                            <h3><i class=\"fas fa-school\"><\/i> Identit\u00e9<\/h3>\r\n                            <div class=\"detail-grid\">\r\n                                <div><small>Code admin.<\/small><div id=\"modal-code-admin\" class=\"val\"><\/div><\/div>\r\n                                <div><small>Statut<\/small><div id=\"modal-statut\" class=\"val\"><\/div><\/div>\r\n                                <div><small>Cycle<\/small><div id=\"modal-cycle\" class=\"val\"><\/div><\/div>\r\n                                <div><small>Milieu<\/small><div id=\"modal-milieu\" class=\"val\"><\/div><\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n\r\n                        <div class=\"info-card\">\r\n                            <h3><i class=\"fas fa-map-marked-alt\"><\/i> Localisation<\/h3>\r\n                            <div class=\"detail-list\">\r\n                                <div class=\"list-item\"><span>R\u00e9gion:<\/span> <strong id=\"modal-region\"><\/strong><\/div>\r\n                                <div class=\"list-item\"><span>Inspection:<\/span> <strong id=\"modal-inspection\"><\/strong><\/div>\r\n                                <div class=\"list-item\"><span>Pr\u00e9fecture:<\/span> <strong id=\"modal-prefecture\"><\/strong><\/div>\r\n                                <div class=\"list-item\"><span>Commune:<\/span> <strong id=\"modal-commune\"><\/strong><\/div>\r\n                                <div class=\"list-item\"><span>Localit\u00e9:<\/span> <strong id=\"modal-localite\"><\/strong><\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n\r\n                    <div class=\"modal-map-container\">\r\n                        <h3><i class=\"fas fa-location-dot\"><\/i> Position G\u00e9ographique<\/h3>\r\n                        <div id=\"map-container\" class=\"map-box\"><\/div>\r\n                        <div id=\"no-map-msg\" style=\"display:none; text-align:center; padding: 20px; color: #777;\">\r\n                            <i class=\"fas fa-map-slash\" style=\"font-size: 2em; margin-bottom:10px;\"><\/i><br>\r\n                            Coordonn\u00e9es GPS non disponibles\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\r\n\r\n<style>\r\n    \/* Reset & Base *\/\r\n    .schools-directory { max-width: 1400px; margin: 0 auto; background: white; border-radius: 12px; box-shadow: 0 5px 20px rgba(0,0,0,0.08); padding: 20px; font-family: 'Segoe UI', sans-serif; }\r\n    .schools-directory * { box-sizing: border-box; }\r\n\r\n    \/* Table & Badges *\/\r\n    .schools-table-container { overflow-x: auto; border: 1px solid #e0e0e0; border-radius: 8px; margin-bottom: 20px; }\r\n    .schools-table { width: 100%; border-collapse: collapse; min-width: 800px; }\r\n    .schools-table th { background: #2c3e50; color: rgb(233, 215, 215); padding: 15px; text-align: left; white-space: nowrap; cursor: pointer; position: sticky; top: 0; z-index: 10; }\r\n    .schools-table th:hover { background: #34495e; }\r\n    .schools-table td { padding: 12px 15px; border-bottom: 1px solid #eee; color: #333; font-size: 11px;\r\n}\r\n    .schools-table tbody tr:hover { background-color: #f1f9ff; cursor: pointer; transition: 0.2s; }\r\n    \r\n    .status-badge { padding: 4px 10px; border-radius: 15px; font-size: 0.8em; font-weight: 700; text-transform: uppercase; }\r\n    .status-badge.public { background: #e8f5e9; color: #2e7d32; }\r\n    .status-badge.prive, .status-badge.priv\u00e9 { background: #e3f2fd; color: #1565c0; }\r\n\r\n    \/* Filtres & Pagination *\/\r\n    .search-container { background: #f8f9fa; padding: 20px; border-radius: 8px; margin-bottom: 20px; display: flex; flex-wrap: wrap; gap: 15px; justify-content: space-between; }\r\n    .search-filters { display: flex; flex-grow: 1; }\r\n    .search-filters input, .search-filters select { padding: 10px; border: 1px solid #ddd; border-radius: 5px; width: 100%; margin-right: 5px;}\r\n    .results-info{\r\n        display: flex;\r\n        width: 100%;\r\n        justify-content: space-between;\r\n        align-items: center;\r\n        gap: 15px;\r\n        margin-left: 20px;\r\n     }\r\n    .pagination { display: flex; justify-content: center; gap: 10px; margin-top: 20px; }\r\n    .pagination button { padding: 8px 15px; background: #3498db; color: white; border: none; border-radius: 5px; cursor: pointer; }\r\n    .pagination button:disabled { background: #bdc3c7; cursor: not-allowed; }\r\n    .pagination select { background: #2c3e50; color: white ; width: 90px; }\r\n    .export-btn { background: #27ae60; color: white; border: none; padding: 10px 15px; border-radius: 5px; cursor: pointer; }\r\n    \r\n    \/* MODAL DESIGN AM\u00c9LIOR\u00c9 *\/\r\n    .school-modal { position: fixed; z-index: 99999; left: 0; top: 0; width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; padding: 20px; }\r\n    .modal-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.7); backdrop-filter: blur(4px); }\r\n    \r\n    .modal-content { \r\n        position: relative; background: #fff; width: 100%; max-width: 900px; height: 85vh; \r\n        border-radius: 12px; box-shadow: 0 25px 50px rgba(0,0,0,0.5); display: flex; flex-direction: column; overflow: hidden;\r\n    }\r\n\r\n    .modal-header { padding: 15px 25px; background: #2c3e50; color: white; display: flex; justify-content: space-between; align-items: center; }\r\n    .modal-title-group h2 { margin: 0; font-size: 1.4rem; }\r\n    .header-badge { background: rgba(255,255,255,0.2); padding: 6px 10px; border-radius: 4px; font-size: 0.8rem; margin-left: 10px; }\r\n    .modal-close { background: none; border: none; color: white; font-size: 28px; cursor: pointer; transition: 0.2s; }\r\n    .modal-close:hover { color: #e74c3c; transform: rotate(90deg); }\r\n\r\n    .modal-body { flex: 1; overflow-y: auto; background: #f4f6f8; padding: 25px; }\r\n    \r\n    .modal-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 25px; height: 100%; }\r\n    \r\n    .info-card { background: white; padding: 20px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.05); margin-bottom: 20px; }\r\n    .info-card h3 { margin-top: 0; border-bottom: 2px solid #f0f0f0; padding-bottom: 10px; color: #34495e; font-size: 1.1rem; }\r\n    .info-card h3 i { margin-right: 8px; color: #3498db; }\r\n\r\n    .detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 15px; }\r\n    .detail-grid small { color: #95a5a6; display: block; text-transform: uppercase; font-size: 0.75rem; letter-spacing: 0.5px; }\r\n    .detail-grid .val { font-weight: 600; color: #2c3e50; font-size: 1.05rem; }\r\n\r\n    .list-item { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #f8f9fa; }\r\n    .list-item:last-child { border-bottom: none; }\r\n    .list-item span { color: #7f8c8d; }\r\n    .list-item strong { color: #2c3e50; text-align: right; }\r\n\r\n    \/* CARTE *\/\r\n    .modal-map-container { display: flex; flex-direction: column; height: 100%; }\r\n    .map-box { flex: 1; min-height: 300px; border-radius: 10px; border: 4px solid white; box-shadow: 0 2px 10px rgba(0,0,0,0.1); overflow: hidden; }\r\n\r\n    \/* Responsive Mobile *\/\r\n    @media (max-width: 768px) {\r\n        .modal-layout { grid-template-columns: 1fr; display: flex; flex-direction: column; }\r\n        .modal-content { height: 95vh; }\r\n        .modal-map-container { min-height: 300px; }\r\n        .search-filters { grid-template-columns: 1fr; }\r\n    }\r\n    \r\n    .loading, .error-message { text-align: center; padding: 40px; }\r\n    .spinner { width: 40px; height: 40px; border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; animation: spin 1s linear infinite; margin: 0 auto 15px; }\r\n    @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\r\n<\/style>\r\n\r\n<script src=\"https:\/\/cdn.sheetjs.com\/xlsx-latest\/package\/dist\/xlsx.full.min.js\"><\/script>\r\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\r\n<script>\r\n    \/\/ Chargement FontAwesome dynamique\r\n    if (!document.querySelector('link[href*=\"font-awesome\"]')) {\r\n        let link = document.createElement('link');\r\n        link.rel = 'stylesheet'; link.href = 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0\/css\/all.min.css';\r\n        document.head.appendChild(link);\r\n    }\r\n<\/script>\r\n\r\n<script>\r\ndocument.addEventListener('DOMContentLoaded', function () {\r\n    const UI = {\r\n        loading: document.getElementById('loading'),\r\n        filters: document.querySelector('.search-container'),\r\n        table: document.querySelector('.schools-table-container'),\r\n        pagination: document.querySelector('.pagination'),\r\n        error: document.getElementById('error-message'),\r\n        modal: document.getElementById('school-modal'),\r\n        tbody: document.getElementById('schools-table-body'),\r\n        count: document.getElementById('results-count')\r\n    };\r\n    \r\n    let state = {\r\n        data: [], filtered: [], \r\n        page: 1, perPage: 20, \r\n        sortCol: 'nom_etablissement', sortDir: 'asc',\r\n        mapInstance: null \/\/ Pour stocker l'objet Leaflet\r\n    };\r\n\r\n   \/* const FILE_PATH = 'https:\/\/planifeducation.gouv.tg\/wp-content\/uploads\/2026\/02\/data-lat-25-02-2026.xlsx';*\/\r\n    \r\n  \/*  const FILE_PATH = 'https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vS8JpjcDaaxKcYKxeN98dwXP9FJtlZYL0yf-SDGgVGJi9P2d2uA8Hb_V_iQs4fG8Q\/pub?output=xlsx';*\/\r\n    \r\n    const FILE_PATH = 'https:\/\/docs.google.com\/spreadsheets\/d\/e\/2PACX-1vTj_FBDLy74rb2SqkzIT6pMgwW3PqF1YI4f5O1w0MoGeDxY8I2ap8hjAoi5iPTQqA\/pub?output=xlsx';\r\n\r\n    \/\/ --- 1. GESTION DE LA CARTE (LEAFLET) ---\r\n    function initMap(lat, lng, label) {\r\n        const mapContainer = document.getElementById('map-container');\r\n        const noMapMsg = document.getElementById('no-map-msg');\r\n\r\n        \/\/ V\u00e9rification des coordonn\u00e9es\r\n        if (!lat || !lng || isNaN(lat) || isNaN(lng)) {\r\n            mapContainer.style.display = 'none';\r\n            noMapMsg.style.display = 'block';\r\n            return;\r\n        }\r\n\r\n        mapContainer.style.display = 'block';\r\n        noMapMsg.style.display = 'none';\r\n\r\n        \/\/ Si une carte existe d\u00e9j\u00e0, on la nettoie pour \u00e9viter les conflits\r\n        if (state.mapInstance) {\r\n            state.mapInstance.remove();\r\n        }\r\n\r\n        \/\/ Cr\u00e9ation de la carte\r\n        state.mapInstance = L.map('map-container').setView([lat, lng], 15);\r\n\r\n        \/\/ Ajout des tuiles (OpenStreetMap)\r\n        L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\r\n            attribution: '\u00a9 OpenStreetMap contributors'\r\n        }).addTo(state.mapInstance);\r\n\r\n        \/\/ Ajout du marqueur\r\n        L.marker([lat, lng]).addTo(state.mapInstance)\r\n            .bindPopup(`<b>${label}<\/b>`)\r\n            .openPopup();\r\n        \r\n        \/\/ IMPORTANT: Leaflet a besoin de recalculer sa taille quand le modal s'ouvre\r\n        setTimeout(() => {\r\n            state.mapInstance.invalidateSize();\r\n        }, 300);\r\n    }\r\n\r\n    \/\/ --- 2. MODAL ---\r\n    function openModal(school) {\r\n        const safe = (val) => val || '-';\r\n        \r\n        \/\/ Remplissage textes\r\n        document.getElementById('modal-school-name').textContent = safe(school.nom_etablissement);\r\n        document.getElementById('modal-badge-type').textContent = safe(school.libelle_type_systeme);\r\n        \r\n        document.getElementById('modal-code-admin').textContent = safe(school.code_administratif);\r\n        document.getElementById('modal-statut').textContent = safe(school.libelle_type_statut_etab);\r\n        document.getElementById('modal-cycle').textContent = safe(school.libelle_type_systeme);\r\n        document.getElementById('modal-milieu').textContent = safe(school.libelle_type_milieu);\r\n        \r\n        document.getElementById('modal-region').textContent = safe(school.dre || school.region);\r\n        document.getElementById('modal-inspection').textContent = safe(school.inspection);\r\n        document.getElementById('modal-prefecture').textContent = safe(school.prefecture);\r\n        document.getElementById('modal-commune').textContent = safe(school.commune);\r\n        document.getElementById('modal-localite').textContent = safe(school.ville_village_quartier);\r\n\r\n        \/\/ Ouverture\r\n        UI.modal.style.display = 'flex';\r\n        document.body.style.overflow = 'hidden';\r\n\r\n        \/\/ Lancement carte\r\n        initMap(school.latitude, school.longitude, school.nom_etablissement);\r\n    }\r\n\r\n    function closeModal() {\r\n        UI.modal.style.display = 'none';\r\n        document.body.style.overflow = 'auto';\r\n    }\r\n\r\n    \/\/ Events Modal\r\n    UI.modal.querySelector('.modal-close').onclick = closeModal;\r\n    UI.modal.querySelector('.modal-overlay').onclick = closeModal;\r\n    document.addEventListener('keydown', e => { if(e.key === 'Escape') closeModal(); });\r\n\r\n    \/\/ --- 3. CHARGEMENT & LOGIQUE DONN\u00c9ES ---\r\n    async function loadData() {\r\n        toggleLoading(true);\r\n        try {\r\n            const resp = await fetch(FILE_PATH);\r\n            if (!resp.ok) throw new Error(\"Fichier introuvable\");\r\n            \r\n            const ab = await resp.arrayBuffer();\r\n            const wb = XLSX.read(ab, {type:'array'});\r\n            const json = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], {defval:''});\r\n            \r\n            if(!json.length) throw new Error(\"Fichier vide\");\r\n            \r\n            state.data = json;\r\n            state.filtered = [...json];\r\n            \r\n            initFilters();\r\n            renderTable();\r\n            toggleLoading(false);\r\n        } catch (e) {\r\n            console.error(e);\r\n            toggleLoading(false);\r\n            UI.error.style.display = 'block';\r\n        }\r\n    }\r\n\r\n    function exportToExcel(dataSource, fileName) {\r\n        if (!dataSource || dataSource.length === 0) {\r\n            alert(\"Aucune donn\u00e9e \u00e0 exporter !\");\r\n            return;\r\n        }\r\n\r\n        \/\/ 1. MAPPING : On transforme les donn\u00e9es brutes en format joli pour Excel\r\n        \/\/ C'est ici que vous choisissez l'ordre des colonnes et leurs titres\r\n        const formattedData = dataSource.map(item => ({\r\n            \"Code etablissement\": item.code_etablissement || '',\r\n            \"Nom \u00c9tablissement\": item.nom_etablissement || '',\r\n            \"Code admin\": item.code_administratif || '',\r\n            \"Type\": item.libelle_type_systeme || '',\r\n            \"Statut\": item.libelle_type_statut_etab || '',\r\n            \"R\u00e9gion (DRE)\": item.dre || item.region || '', \/\/ G\u00e8re les deux cas\r\n            \"Inspection\": item.inspection || '',\r\n            \"Pr\u00e9fecture\": item.prefecture || '',\r\n            \"Commune\": item.commune || '',\r\n            \"Canton\": item.canton_village_autonome || '',\r\n            \"Localit\u00e9\": item.ville_village_quartier || '',\r\n            \"Milieu\": item.libelle_type_milieu || '',\r\n            \"Latitude\": item.latitude || '',\r\n            \"Longitude\": item.longitude || ''\r\n        }));\r\n\r\n        \/\/ 2. Cr\u00e9ation de la feuille de calcul\r\n        const ws = XLSX.utils.json_to_sheet(formattedData);\r\n\r\n      \/\/ --- AJOUTEZ CE BLOC ICI ---\r\n        const range = XLSX.utils.decode_range(ws['!ref']);\r\n        const columnIndex = 2; \/\/ 0=A, 1=B, 2=C (votre colonne \"Code admin\")\r\n        \r\n        for (let R = range.s.r + 1; R <= range.e.r; ++R) { \/\/ On commence \u00e0 1 pour sauter l'ent\u00eate\r\n            const address = XLSX.utils.encode_cell({ r: R, c: columnIndex });\r\n            if (!ws[address]) continue;\r\n            \r\n            \/\/ On force le type en \"string\" et le format de cellule en \"texte\"\r\n            ws[address].t = 's'; \r\n            ws[address].z = '@'; \r\n        }\r\n        \r\n        \/\/ Auto-ajustement des colonnes\r\n        const colWidths = [];\r\n        const keys = Object.keys(formattedData[0]);\r\n        \r\n        keys.forEach(key => {\r\n            let maxLength = key.length;\r\n            \r\n            formattedData.forEach(row => {\r\n                const value = row[key];\r\n                if (value !== null && value !== undefined) {\r\n                    const length = value.toString().length;\r\n                    maxLength = Math.max(maxLength, length);\r\n                }\r\n            });\r\n            \r\n            \/\/ Limiter la largeur (min 8, max 50)\r\n            colWidths.push({ wch: Math.min(Math.max(maxLength, 8), 50) });\r\n        });\r\n        \r\n        ws['!cols'] = colWidths;\r\n\r\n        \/\/ 4. Cr\u00e9ation du classeur (Workbook) et ajout de la feuille\r\n        const wb = XLSX.utils.book_new();\r\n        XLSX.utils.book_append_sheet(wb, ws, \"Donn\u00e9es \u00c9coles\");\r\n\r\n        \/\/ 5. T\u00e9l\u00e9chargement\r\n        XLSX.writeFile(wb, fileName + \".xlsx\");\r\n    }\r\n    \r\n    document.getElementById('export-btn').addEventListener('click', function() {\r\n        \/\/ On utilise 'state.filtered' qui contient les donn\u00e9es actuelles du tableau\r\n        const date = new Date().toISOString().slice(0,10);\r\n        exportToExcel(state.filtered, `ecoles-export_${date}`);\r\n    });\r\n    \r\n    \/\/ Si vous connaissez le nom exact de la colonne \u00e0 formater\r\n    function formatColumnWithoutDecimals(ws, columnName) {\r\n        \/\/ Trouver l'index de la colonne\r\n        const headers = Object.keys(formattedData[0]);\r\n     \/\/   const columnIndex = headers.indexOf(columnName);\r\n        \r\n        if (columnIndex === -1) return;\r\n        \r\n        \/\/ Convertir l'index en lettre de colonne Excel (A, B, C, ...)\r\n        const columnLetter = String.fromCharCode(65 + columnIndex);\r\n        \r\n        \/\/ Parcourir les lignes de donn\u00e9es\r\n        for (let i = 1; i <= formattedData.length; i++) {\r\n            const cellRef = columnLetter + (i + 1); \/\/ +1 car ligne 1 est l'en-t\u00eate\r\n            if (ws[cellRef]) {\r\n                ws[cellRef].z = '0'; \/\/ Format nombre sans d\u00e9cimales\r\n            }\r\n        }\r\n    }\r\n\r\n    \r\n    function renderTable() {\r\n        UI.tbody.innerHTML = '';\r\n        const start = (state.page - 1) * state.perPage;\r\n        const pageData = state.filtered.slice(start, start + state.perPage);\r\n\r\n        if(!pageData.length) {\r\n            document.getElementById('no-results').style.display = 'block';\r\n            return;\r\n        }\r\n        document.getElementById('no-results').style.display = 'none';\r\n\r\n        pageData.forEach(row => {\r\n            const tr = document.createElement('tr');\r\n            tr.onclick = () => openModal(row);\r\n            \r\n            const isPublic = (row.libelle_type_statut_etab || '').toLowerCase().includes('public');\r\n            \r\n            tr.innerHTML = `\r\n                \r\n                <td>${row.code_administratif || ''}<\/td>\r\n                <td><strong>${row.nom_etablissement || ''}<\/strong><\/td>\r\n                <td>${row.libelle_type_systeme || ''}<\/td>\r\n                <td>${row.dre || row.region || ''}<\/td>\r\n                <td>${row.inspection || ''}<\/td>\r\n                <td>${row.commune || ''}<\/td>\r\n                <td>${row.ville_village_quartier || ''}<\/td>\r\n                <td>${row.libelle_type_statut_etab || ''}<\/td>\r\n            `;\r\n            UI.tbody.appendChild(tr);\r\n        });\r\n        \r\n        updatePagination();\r\n        UI.count.textContent = `${state.filtered.length} \u00e9coles`;\r\n    }\r\n\r\n    function updatePagination() {\r\n        const total = Math.ceil(state.filtered.length \/ state.perPage) || 1;\r\n        document.getElementById('page-info').textContent = `${state.page} \/ ${total}`;\r\n        document.getElementById('prev-page').disabled = state.page === 1;\r\n        document.getElementById('next-page').disabled = state.page === total;\r\n    }\r\n\r\n    function initFilters() {\r\n        const fill = (id, key) => {\r\n            const el = document.getElementById(id);\r\n            const vals = [...new Set(state.data.map(i => i[key]).filter(Boolean))].sort();\r\n            vals.forEach(v => el.innerHTML += `<option value=\"${v}\">${v}<\/option>`);\r\n            el.onchange = applyFilters;\r\n        };\r\n        fill('region-filter', 'dre');\r\n        fill('inspection-filter', 'inspection');\r\n        fill('type-filter', 'libelle_type_systeme');\r\n        fill('statut-filter', 'libelle_type_statut_etab');\r\n        \r\n        document.getElementById('school-search').oninput = applyFilters;\r\n        document.getElementById('page-size').onchange = (e) => { state.perPage = +e.target.value; state.page = 1; renderTable(); };\r\n        \r\n        \/\/ Boutons pagination\r\n        document.getElementById('prev-page').onclick = () => { if(state.page > 1) { state.page--; renderTable(); }};\r\n        document.getElementById('next-page').onclick = () => { if(state.page < Math.ceil(state.filtered.length\/state.perPage)) { state.page++; renderTable(); }};\r\n        \r\n        \/\/ Tri\r\n        document.querySelectorAll('th[data-sort]').forEach(th => {\r\n            th.onclick = () => {\r\n                const col = th.dataset.sort;\r\n                state.sortDir = (state.sortCol === col && state.sortDir === 'asc') ? 'desc' : 'asc';\r\n                state.sortCol = col;\r\n                \r\n                state.filtered.sort((a, b) => {\r\n                    const vA = (a[col]||'').toString().toLowerCase();\r\n                    const vB = (b[col]||'').toString().toLowerCase();\r\n                    return state.sortDir === 'asc' ? vA.localeCompare(vB) : vB.localeCompare(vA);\r\n                });\r\n                renderTable();\r\n            };\r\n        });\r\n        \r\n    }\r\n\r\n    function updateDependentFilters() {\r\n    const selectedRegion = document.getElementById('region-filter').value;\r\n    const selectedInsp = document.getElementById('inspection-filter').value;\r\n    const selectedType = document.getElementById('type-filter').value;\r\n\r\n    \/\/ --- 1. Filtrage des donn\u00e9es pour les options d'Inspection ---\r\n    \/\/ On regarde quelles inspections existent dans la r\u00e9gion choisie\r\n    const dataForInsp = selectedRegion \r\n        ? state.data.filter(d => d.dre === selectedRegion)\r\n        : state.data;\r\n    renderOptions('inspection-filter', dataForInsp, 'inspection', 'Toutes les inspections', selectedInsp);\r\n\r\n    \/\/ --- 2. Filtrage des donn\u00e9es pour les options de Cycle\/Type ---\r\n    \/\/ On regarde quels types existent selon la r\u00e9gion ET l'inspection choisie\r\n    const dataForType = state.data.filter(d => {\r\n        return (!selectedRegion || d.dre === selectedRegion) && \r\n               (!selectedInsp || d.inspection === selectedInsp);\r\n    });\r\n    renderOptions('type-filter', dataForType, 'libelle_type_systeme', 'Tous les cycles', selectedType);\r\n    }\r\n    \r\n    \/\/ Fonction utilitaire pour g\u00e9n\u00e9rer le HTML des <option>\r\n    function renderOptions(elementId, data, field, defaultText, currentValue) {\r\n        const select = document.getElementById(elementId);\r\n        const uniqueValues = [...new Set(data.map(d => d[field]).filter(v => v))].sort();\r\n    \r\n        let html = `<option value=\"\">${defaultText}<\/option>`;\r\n        uniqueValues.forEach(val => {\r\n            const selected = val === currentValue ? 'selected' : '';\r\n            html += `<option value=\"${val}\" ${selected}>${val}<\/option>`;\r\n        });\r\n        select.innerHTML = html;\r\n    }\r\n    \r\n    \r\n    \/\/ Quand on change la R\u00e9gion\r\n    document.getElementById('region-filter').addEventListener('change', (e) => {\r\n        \/\/ Si on change de r\u00e9gion, l'ancienne inspection n'est peut-\u00eatre plus valide\r\n        \/\/ On peut choisir de la r\u00e9initialiser :\r\n        document.getElementById('inspection-filter').value = \"\"; \r\n        updateDependentFilters();\r\n        applyFilters();\r\n    });\r\n    \r\n    \/\/ Quand on change l'Inspection\r\n    document.getElementById('inspection-filter').addEventListener('change', () => {\r\n        updateDependentFilters();\r\n        applyFilters();\r\n    });\r\n    \r\n    \/\/ Quand on change le Cycle\/Type\r\n    document.getElementById('type-filter').addEventListener('change', () => {\r\n        applyFilters();\r\n    });\r\n\r\n     \/\/ Quand on change le Cycle\/Type\r\n    document.getElementById('school-search').addEventListener('keydown', () => {\r\n        resetAllFilters();\r\n    });\r\n\r\n    function applyFilters() {\r\n        const search = document.getElementById('school-search').value.toLowerCase();\r\n        const region = document.getElementById('region-filter').value;\r\n        const insp = document.getElementById('inspection-filter').value;\r\n        const type = document.getElementById('type-filter').value;\r\n        const statut = document.getElementById('statut-filter').value;\r\n\r\n        state.filtered = state.data.filter(d => {\r\n            const matchS = !search || (d.nom_etablissement+' '+d.commune).toLowerCase().includes(search);\r\n            return matchS &&\r\n                (!region || d.dre === region) &&\r\n                (!insp || d.inspection === insp) &&\r\n                (!type || d.libelle_type_systeme === type) &&\r\n                (!statut || d.libelle_type_statut_etab === statut);\r\n        });\r\n        \r\n        state.page = 1;\r\n        renderTable();\r\n    }\r\n    \r\n    function resetAllFilters() {\r\n        \/\/ 1. On vide la barre de recherche\r\n      \/\/  document.getElementById('school-search').value = '';\r\n    \r\n        \/\/ 2. On remet tous les selects \u00e0 leur valeur par d\u00e9faut (vide)\r\n        document.getElementById('region-filter').value = '';\r\n        document.getElementById('inspection-filter').value = '';\r\n        document.getElementById('type-filter').value = '';\r\n        document.getElementById('statut-filter').value = '';\r\n    \r\n        \/\/ 3. On reconstruit les menus d\u00e9pendants (pour qu'ils r\u00e9affichent tout)\r\n        updateDependentFilters();\r\n    \r\n        \/\/ 4. On relance le filtrage global (qui affichera alors state.data complet)\r\n        applyFilters();\r\n        \r\n        \/\/ 5. On revient \u00e0 la page 1\r\n        state.page = 1;\r\n        renderTable();\r\n    }\r\n\r\n    function toggleLoading(show) {\r\n        UI.loading.style.display = show ? 'block' : 'none';\r\n        UI.filters.style.display = show ? 'none' : 'flex';\r\n        UI.table.style.display = show ? 'none' : 'block';\r\n        UI.pagination.style.display = show ? 'none' : 'flex';\r\n    }\r\n\r\n    loadData();\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Consulter la base de donn\u00e9es compl\u00e8te des \u00e9coles. Toutes les r\u00e9gions Toutes les inspections Tous les cycles Tous les statuts Exporter Code admin Nom \u00e9tablissement Type R\u00e9gion (DRE) Inspection Commune Localit\u00e9 Statut Aucun \u00e9tablissement trouv\u00e9 avec les crit\u00e8res s\u00e9lectionn\u00e9s. Page 1 sur 1 102050100 Chargement des donn\u00e9es&#8230; D\u00e9tails de l&rsquo;\u00e9cole Type &times; Identit\u00e9 Code admin. [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_eb_attr":"","footnotes":""},"class_list":["post-3775","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/planifeducation.gouv.tg\/dpsse\/wp-json\/wp\/v2\/pages\/3775","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/planifeducation.gouv.tg\/dpsse\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/planifeducation.gouv.tg\/dpsse\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/planifeducation.gouv.tg\/dpsse\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/planifeducation.gouv.tg\/dpsse\/wp-json\/wp\/v2\/comments?post=3775"}],"version-history":[{"count":507,"href":"https:\/\/planifeducation.gouv.tg\/dpsse\/wp-json\/wp\/v2\/pages\/3775\/revisions"}],"predecessor-version":[{"id":9487,"href":"https:\/\/planifeducation.gouv.tg\/dpsse\/wp-json\/wp\/v2\/pages\/3775\/revisions\/9487"}],"wp:attachment":[{"href":"https:\/\/planifeducation.gouv.tg\/dpsse\/wp-json\/wp\/v2\/media?parent=3775"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}