templates/SCRIPTS/control_filters.html.twig line 1

Open in your IDE?
  1. <script type="text/javascript">
  2.     $(document).ready(function () {
  3.         // Función para obtener los filtros de cualquier bloque/formulario
  4.         function getFiltersAsParams($block) {
  5.             const params = new URLSearchParams();
  6.             $block.find('input[name^="filter["], select[name^="filter["], textarea[name^="filter["]').each(function () {
  7.                 const $input = $(this);
  8.                 if (($input.is(":checkbox") || $input.is(":radio")) && !$input.is(":checked")) return;
  9.                 if ($input.attr("name").endsWith("[]")) {
  10.                     const values = Array.isArray($input.val()) ? $input.val() : [$input.val()];
  11.                     values.forEach(val => { if (val !== "") params.append($input.attr("name"), val); });
  12.                 } else if ($input.val() !== "") {
  13.                     params.append($input.attr("name"), $input.val());
  14.                 }
  15.             });
  16.             return params;
  17.         }
  18.         // Copiar filtros de todos los bloques a un formulario antes de submit
  19.         function copyFiltersToForm($form) {
  20.             $form.find(".__cloned-filter").remove();
  21.             $('[id^="filter-"], .prometeo-filters').each(function () {
  22.                 const $block = $(this);
  23.                 $block.find('input[name^="filter["], select[name^="filter["], textarea[name^="filter["]').each(function () {
  24.                     const $input = $(this);
  25.                     if (($input.is(":checkbox") || $input.is(":radio")) && !$input.is(":checked")) return;
  26.                     if ($input.attr("name").endsWith("[]")) {
  27.                         const values = Array.isArray($input.val()) ? $input.val() : [$input.val()];
  28.                         values.forEach(val => {
  29.                             if (val === "") return;
  30.                             $("<input>").attr({
  31.                                 type: "hidden",
  32.                                 name: $input.attr("name"),
  33.                                 value: val,
  34.                                 class: "__cloned-filter"
  35.                             }).appendTo($form);
  36.                         });
  37.                     } else if ($input.val() !== "") {
  38.                         $("<input>").attr({
  39.                             type: "hidden",
  40.                             name: $input.attr("name"),
  41.                             value: $input.val(),
  42.                             class: "__cloned-filter"
  43.                         }).appendTo($form);
  44.                     }
  45.                 });
  46.             });
  47.         }
  48.         // Detectar cualquier submit de formulario y copiar filtros
  49.         $("form").on("submit", function () {
  50.             copyFiltersToForm($(this));
  51.         });
  52.         // Actualizar enlaces de exportación para incluir todos los filtros
  53.         function updateExportLinks() {
  54.             $('a[href*="/export"]').each(function () {
  55.                 const $link = $(this);
  56.                 $link.off("click.updateFilters").on("click.updateFilters", function () {
  57.                     const url = new URL($link.attr("href"), window.location.origin);
  58.                     const params = new URLSearchParams(url.search);
  59.                     $('[id^="filter-"], .prometeo-filters').each(function () {
  60.                         getFiltersAsParams($(this)).forEach((value, key) => params.append(key, value));
  61.                     });
  62.                     $link.attr("href", url.pathname + "?" + params.toString());
  63.                 });
  64.             });
  65.         }
  66.         updateExportLinks();
  67.         // Observador para nuevos enlaces de exportación que se agreguen dinámicamente
  68.         const observer = new MutationObserver(() => updateExportLinks());
  69.         observer.observe(document.body, { childList: true, subtree: true });
  70.     });
  71. </script>