1jQuery(document).ready(function($) { 2 // Vérifier si l'on est sur les pages concernées 3 var path = window.location.pathname; 4 if (path !== "/ressources-ecoprod/" && path !== "/en/ecoprod-resources/") { 5 return; // Sortie immédiate si la page n'est pas celle souhaitée 6 } 7 8 // ð¹ Détection automatique de la langue via l'URL 9 var lang = window.location.pathname.includes('/en/') ? 'en' : 'fr'; 10 11 // Fonction pour récupérer les paramètres d'URL 12 function getUrlParameter(name) { 13 name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); 14 var regex = new RegExp('[\\?&]' + name + '=([^&#]*)'); 15 var results = regex.exec(location.search); 16 return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' ')); 17 } 18 19 // Fonction pour soumettre la requête AJAX 20 function submitFormAjax() { 21 var form = $('#filter-form'); 22 var ajaxurl = form.attr('action'); 23 var data = form.serialize(); 24 25 // Ajout du paramètre langue 26 data += '&lang=' + lang; 27 28 $.ajax({ 29 url: ajaxurl, 30 type: 'POST', 31 data: data, 32 success: function(response) { 33 // Insère le HTML des ressources 34 $('#resources-list').html(response); 35 36 // Déplace la pagination hors de #resources-list 37 var $pagination = $('#resources-list').find('.resources-pagination'); 38 if ($pagination.length) { 39 $('.resources-pagination-container').html($pagination); 40 } 41 42 initPaginationLinks(); // Réinitialise les liens de pagination 43 } 44 }); 45 } 46 47 // Gestion des dropdowns 48 $('.dropdown-check-list .anchor').on('click', function(e) { 49 var element = $(this).parent(); 50 if (element.hasClass('visible')) { 51 element.removeClass('visible'); 52 } else { 53 $('.dropdown-check-list').removeClass('visible'); 54 element.addClass('visible'); 55 } 56 }); 57 58 $(document).on('click', function(e) { 59 if (!$(e.target).closest('.dropdown-check-list').length) { 60 $('.dropdown-check-list').removeClass('visible'); 61 } 62 }); 63 64 $('.dropdown-check-list').on('click', function(e) { 65 e.stopPropagation(); 66 }); 67 68 // Pré-cocher les filtres à partir des paramètres d'URL 69 var format = getUrlParameter('format'); 70 var category = getUrlParameter('category'); 71 72 if (format) { 73 var formats = format.split(','); 74 formats.forEach(function(value) { 75 $('input[name="format[]"][value="' + value + '"]').prop('checked', true); 76 }); 77 } 78 if (category) { 79 var categories = category.split(','); 80 categories.forEach(function(value) { 81 $('input[name="category[]"][value="' + value + '"]').prop('checked', true); 82 }); 83 } 84 85 // Mise à jour des filtres sélectionnés et envoi AJAX 86 updateSelectedFilters(); 87 88 $('input[name="format[]"], input[name="category[]"]').on('change', function() { 89 $('#current-page').val(1); 90 updateSelectedFilters(); 91 submitFormAjax(); 92 }); 93 94 $('#filter-form').submit(function(e) { 95 e.preventDefault(); 96 $('#current-page').val(1); 97 submitFormAjax(); 98 }); 99 100 $('#filter-form').trigger('submit'); 101 102 function updateSelectedFilters() { 103 const selectedFiltersContainer = document.getElementById('selected-filters'); 104 const clearAllButton = document.getElementById('clear-all-filters'); 105 106 107 108 selectedFiltersContainer.innerHTML = ''; 109 110 let selectedFilters = []; 111 let formatCount = 0; 112 let categoryCount = 0; 113 114 document.querySelectorAll('input[name="format[]"]:checked').forEach(checkbox => { 115 let filterText = checkbox.parentNode.textContent.trim().replace(/\s*\(\d+\)\s*/g, ''); 116 selectedFilters.push({ name: filterText, value: checkbox.value, type: 'format' }); 117 formatCount++; 118 }); 119 120 document.querySelectorAll('input[name="category[]"]:checked').forEach(checkbox => { 121 let filterText = checkbox.parentNode.textContent.trim().replace(/\s*\(\d+\)\s
121*/g, ''); 122 selectedFilters.push({ name: filterText, value: checkbox.value, type: 'category' }); 123 categoryCount++; 124 }); 125 126 document.getElementById('format-count').textContent = formatCount; 127 document.getElementById('category-count').textContent = categoryCount; 128 129 clearAllButton.style.display = selectedFilters.length > 0 ? 'block' : 'none'; 130 131 selectedFilters.forEach(filter => { 132 const filterElement = document.createElement('div'); 133 filterElement.classList.add('selected-filter'); 134 filterElement.innerHTML = `${filter.name} <span class="remove-filter" data-type="${filter.type}" data-value="${filter.value}">×</span>`; 135 selectedFiltersContainer.appendChild(filterElement); 136 }); 137 } 138 139 140 // Fonction pour envoyer la requête AJAX 141 function submitFormAjax() { 142 var form = $('#filter-form'); 143 var ajaxurl = form.attr('action'); 144 var data = form.serialize(); 145 146 // Ajout de la langue au data 147 data += '&lang=' + lang; 148 149 $.ajax({ 150 url: ajaxurl, 151 type: 'POST', 152 data: data, 153 success: function(response) { 154 $('#resources-list').html(response); 155 } 156 }); 157 updateSelectedFilters(); 158 } 159 160 // Gestion de la suppression des filtres individuels 161 document.getElementById('selected-filters').addEventListener('click', function (event) { 162 if (event.target.classList.contains('selected-filter') || event.target.classList.contains('remove-filter')) { 163 const filterElement = event.target.closest('.selected-filter'); 164 const type = filterElement.querySelector('.remove-filter').getAttribute('data-type'); 165 const value = filterElement.querySelector('.remove-filter').getAttribute('data-value'); 166 removeFilter(type, value); 167 } 168 updateSelectedFilters(); 169 submitFormAjax(); 170 }); 171 172 // Fonction pour supprimer un filtre spécifique 173 function removeFilter(type, value) { 174 document.querySelectorAll('input[name="' + type + '[]"]').forEach(function (checkbox) { 175 if (checkbox.value === value) { 176 checkbox.checked = false; 177 } 178 }); 179 updateSelectedFilters(); 180 submitFormAjax(); 181 } 182 183 // Mettre à jour les filtres sélectionnés quand les cases à cocher changent 184 document.querySelectorAll('input[name="format[]"], input[name="category[]"]').forEach(function (checkbox) { 185 checkbox.addEventListener('change', function () { 186 updateSelectedFilters(); 187 }); 188 }); 189 190 191 192 // Gestion du bouton "Tout effacer" 193 document.getElementById('clear-all-filters').addEventListener('click', function () { 194 document.querySelectorAll('input[name="format[]"], input[name="category[]"]').forEach(function (checkbox) { 195 checkbox.checked = false; 196 }); 197 updateSelectedFilters(); 198 submitFormAjax(); 199 }); 200 201 updateSelectedFilters(); 202 203 function initPaginationLinks() { 204 $(document).off('click', '.resources-pagination .page-numbers'); 205 $(document).on('click', '.resources-pagination .page-numbers', function(e) { 206 e.preventDefault(); 207 var href = $(this).attr('href'); 208 var pageMatch = href.match(/paged=([0-9]+)/); 209 var pageNumber = 1; 210 if (pageMatch) { 211 pageNumber = parseInt(pageMatch[1]); 212 } 213 $('#current-page').val(pageNumber); 214 submitFormAjax(); 215 }); 216 } 217});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.