1/** 2 * @file 3 * Global utilities. 4 * 5 */ 6(function ($, Drupal) { 7 8 'use strict'; 9 10 $(document).ready(function () { 11 $('[data-toggle="tooltip"]').tooltip(); 12 }); 13 14 Drupal.behaviors.header_mega_menu = { 15 attach: function (context, settings) { 16 once('header_mega_menu', 'header #block-meta-header ', context).forEach((element) => { 17 $("ul li .productos-menu").parent('li').addClass('menu-iconos'); 18 }) 19 } 20 }; 21 22 Drupal.behaviors.radio_destacado_background = { 23 attach: function (context, settings) { 24 if ($('.l-page--pagina_gutenberg .l-page__content .block-views-blocklistado-post-home-radio-block-2 .content').children().length > 0) { 25 $('.l-page--pagina_gutenberg .l-page__content .block-views-blocklistado-post-home-radio-block-2 .content').parent().css('background-color', '#F1F3F4'); 26 $('.l-page--pagina_gutenberg .l-page__content .block-views-blocklistado-post-home-radio-block-2 .content').parent().css('padding-top', '2rem') 27 } 28 } 29 }; 30 31 Drupal.behaviors.search_form_radio = { 32 attach: function (context, settings) { 33 once('search_form_radio', '.l-page__before-footer-radio-domain .search-block-form #search-block-form ', context).forEach((element) => { 34 $("#search-block-form div.form-actions").remove(); 35 $("#search-block-form").append('<input type="submit" class="submit button visually-hidden" value="buscar"></input>'); 36 }) 37 } 38 }; 39 40 Drupal.behaviors.comment_form_text = { 41 attach: function (context, settings) { 42 once('comment_form_text', '.l-page--agenda_vista_comentario .view-agenda-vista-comentario .node--type-agenda-comentarios .comments .field--name-field-comentarios article.comment .card-body .inline__links .comment-reply ', context).forEach((element) => { 43 $(".comment-reply a").text("Responder"); 44 }) 45 } 46 }; 47 48 Drupal.behaviors.comment_form_text_page = { 49 attach: function (context, settings) { 50 once('comment_form_text_page', '.l-page--agendas-domain #block-meta-content .comment .inline__links .comment-reply ', context).forEach((element) => { 51 $(".comment-reply a").text("Responder"); 52 }) 53 } 54 }; 55 56 Drupal.behaviors.search_validation_agendas = { 57 attach: function (context, settings) { 58 $('.view-busqueda-general-agendas form.views-exposed-form', context).submit(function () { 59 var box = $(this).find('.js-form-type-textfield #edit-keys'); 60 var searchBox = $.trim(box.val()); 61 var searchLen = searchBox.length; 62 if (searchLen < 3) { 63 searchBox = ""; 64 } 65 if (searchBox != undefined && (searchBox == '' || searchBox == $(this).find('input.default-text').val())) { 66 $(this).find('.js-form-type-textfield').addClass('error'); 67 if ($(this).find('.error-message')) { 68 $(this).find('.js-form-type-textfield .error-message').remove(); 69 } 70 $(this).find('.js-form-type-textfield').prepend('<div class="error-message">Debe introducir 3 o mas caracteres para buscar..</div>'); 71 return false; 72 } else { 73 return true; 74 } 75 }) 76 77 $('.view-busqueda-interna-agendas form.views-exposed-form', context).submit(function () { 78 var box = $(this).find('.js-form-type-textfield #edit-keys'); 79 var searchBox = $.trim(box.val()); 80 var searchLen = searchBox.length; 81 if (searchLen < 3) { 82 searchBox = ""; 83 } 84 if (searchBox != undefined && (searchBox == '' || searchBox == $(this).find('input.default-text').val())) { 85 $(this).find('.js-form-type-textfield').addClass('error'); 86 if ($(this).find('.error-message')) { 87 $(this).find('.js-form-type-textfield .error-message').remove(); 88 } 89 $(this).find('.js-form-type-textfield').prepend('<div class="error-message">Debe introducir 3 o mas caracteres para buscar..</div>'); 90 return false; 91 } else { 92 return true; 93 } 94 }) 95 } 96 }; 97 98 Drupal.behaviors.search_form_order_view_radio = { 99 attach: function (context, settings) { 100 $(".l-page--pagina_gutenberg .view-id-listado_programas_home_radio .view-content .views-form form").append('<input type="submit" class="submit button visually-hidden" value="Guardar orden del Listado"></input>'); 101 } 102 }; 103 104 Drupal.behaviors.burger_button_radio = { 105 attach: function (context, settings) { 106 once('burger_button_radio', '.l-page__header-costas-domain header #block-meta-mainmenucostas .content .tbm-main-menu-costas', context).forEach((element) => { 107 $("button.tbm-button").append(' <span class="visually-hidden sr-only">Menú Responsive</span>'); 108 }) 109 } 110 }; 111 112 Drupal.behaviors.search_form_sabores_header = { 113 attach: function (context, settings) { 114 once('search_form_sabores_header', '.l-page__header-sabores-domain .region-header-navegation .search-block-form #search-block-form ', context).forEach((element) => { 115 $("#search-block-form").append('<input type="submit" class="submit button visually-hidden" value="buscar"></input>'); 116 }) 117 } 118 }; 119 120 Drupal.behaviors.search_inputs_title = { 121 attach: function (context, settings) { 122 once('search_inputs_title', '.view-listado-de-productores .views-exposed-form .js-form-item-combine, ' + 123 '.view-busqueda-general .views-exposed-form .form-type-textfield, ' + 124 '.view-listado-de-productos .views-exposed-form .form-type-textfield ,' + 125 '.view-listado-de-hostales .views-exposed-form .form-type-textfield,' + 126 '.view-listado-de-comercios .views-exposed-form .form-type-textfield ', context).forEach((element) => { 127 $("input.form-control").attr('title', 'Palabras claves de búsqueda'); 128 }) 129 } 130 }; 131 132 Drupal.behaviors.header_mega_menu_img = { 133 attach: function (context, settings) { 134 once('header_mega_menu_img', 'header #block-meta-header #superfish-header .menu-iconos ul ', context).forEach((element) => { 135 $('a.aceite-oliva ').prepend('<img src="/themes/custom/meta/images/png-menu/olive-oil.png" class="attachment-full size-full" alt="" loading="lazy">'); 136 $('a.carnes ').prepend('<img src="/themes/custom/meta/images/png-menu/carne.png" class="attachment-full size-full" alt="" loading="lazy">'); 137 $('a.frutos-secos ').prepend('<img src="/themes/custom/meta/images/png-menu/frutos-secos.png" class="attachment-full size-full" alt="" loading="lazy">'); 138 $('a.cervezas ').prepend('<img src="/themes/custom/meta/images/png-menu/cerveza.png" class="attachment-full size-full" alt="" loading="lazy">'); 139 $('a.conservas-confituras ').prepend('<img src="/themes/custom/meta/images/png-menu/tarro-de-mermelada.png" class="attachment-full size-full" alt="" loading="lazy">'); 140 $('a.encurtidos ').prepend('<img src="/themes/custom/meta/images/png-menu/mermelada.png" class="attachment-full size-full" alt="" loading="lazy">'); 141 $('a.frutas ').prepend('<img src="/themes/custom/meta/images/png-menu/comida-sana.png" class="attachment-full size-full" alt="" loading="lazy">'); 142 $('a.embutidos ').prepend('<img src="/themes/custom/meta/images/png-menu/embutido.png" class="attachment-full size-full" alt="" loading="lazy">'); 143 $('a.mantecados ').prepend('<img src="/themes/custom/meta/images/png-menu/mantecados.png" class="attachment-full size-full" alt="" loading="lazy">'); 144 $('a.mieles ').prepend('<img src="/themes/custom/meta/images/png-menu/miel.png" class="attachment-full size-full" alt="" loading="lazy">'); 145 $('a.panaderia ').prepend('<img src="/themes/custom/meta/images/png-menu/panaderia.png" class="attachment-full size-full" alt="" loading="lazy">'); 146 $('a.pescados ').prepend('<img src="/themes/custom/meta/images/png-menu/pescados-y-mariscos.png" class="attachment-full size-full" alt="" loading="lazy">'); 147 $('a.quesos ').prepend('<img src="/themes/custom/meta/images/png-menu/queso.png" class="attachment-full size-full" alt="" loading="lazy">'); 148 $('a.salsas ').prepend('<img src="/themes/custom/meta/images/png-menu/salazones.png" class="attachment-full size-full" alt="" loading="lazy">'); 149 $('a.vinos ').prepend('<img src="/themes/custom/meta/images/png-menu/vino.png" class="attachment-full size-full" alt="" loading="lazy">'); 150 $('a.helados ').prepend('<img src="/themes/custom/meta/images/png-menu/helados.png" class="attachment-full size-full" alt="" loading="lazy">'); 151 $('a.condimentos ').prepend('<img src="/themes/custom/meta/images/png-menu/condimentos.png" class="attachment-full size-full" alt="" loading="lazy">'); 152 153 }) 154 } 155 }; 156 157 Drupal.behaviors.costas_mapa_home = { 158 attach: function (context, settings) { 159 $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .js-form-type-select select option[value="All"]').hide(); 160 if ($('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .js-form-type-select select').val() == "All") { 161 $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .js-form-type-select select option[value="All"]').hide(); 162 $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .js-form-type-select select option[value="All"]').attr("selected", false); 163 $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .js-form-type-select select option[value="playa"]').attr("selected", true); 164 $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .form-actions .button').click(); 165 $('#gutenmberg--page-costas-domain .view-id-mapa_costas .view-filters .views-exposed-form .form-actions .button').hide(); 166 } 167 } 168 }; 169 170 171 // Drupal.behaviors.submit_map = { 172 // attach: function (context, settings) { 173 // once('submit_map', '.l-page-gastronomia .view-id-interactive_map .view-filters', context).forEach((element) => { 174 // var municipio = $('.form-item-field-municipio-target-id .form-select option:selected').val(); 175 // var tipo = $(".form-item-field-term-reference-target-id .form-select option:selected").val(); 176 // let args = tipo + '/' + municipio; 177 // $.ajax({ 178 // url: '/views/ajax', 179 // type: 'get', 180 // data: { 181 // view_name: 'interactive_map', 182 // view_display_id: 'embed_1', 183 // view_args: args, 184 // }, 185 // dataType: 'json', 186 // success: function (response) { 187 // if (response[3] !== undefined) { 188 // var viewHtml = response[3].data; 189 // $('.l-page-gastronomia .view-id-interactive_map .groupy .view-filters').append('<div class="advanced-search"></div>'); 190 // $('.l-page-gastronomia .view-id-interactive_map .groupy .view-filters .advanced-search').append(viewHtml); 191 // } 192 // } 193 // }); 194 // }) 195 // } 196 // }; 197 198 // Drupal.behaviors.costas_nodos_asociados_list = { 199 // attach: function (context, settings) { 200 // once('costas_nodos_asociados_list', '.node--type-playa-full ', context).forEach((element) => { 201 // var element = $(".lugares .list .elemento").detach(); 202 // $('.lugares-general .content-flex').append(element); 203 // }) 204 // } 205 // }; 206 207 Drupal.behaviors.cambiarLogoCustomCuevas = { 208 attach: (context, settings) => { 209 // Usamos once() para asegurarnos de que el cambio solo ocurra una vez 210 const umbral = 1200; 211 212 // Solo actuamos si el ancho de la ventana es mayor a 1200px 213 if (window.innerWidth > umbral) { 214 const logos = once('cambiar-logo', '.l-page--front-gutenberg-cuevas-domain .site-branding .site-logo, .l-page--cuevas-domain-listado_de_playas .site-branding .site-logo, .l-page--cuevas-domain-playa .site-branding .site-logo ,\n' + 215 '.l-page--cuevas-domain-listado_de_senderos .site-branding .site-logo, .l-page--cuevas-domain-sendero .site-branding .site-logo, .l-page--cuevas-domain-listado_lugares_de_interes .site-branding .site-logo,\n' + 216 '.l-page--cuevas-domain-lugares_de_interes .site-branding .site-logo, .l-page--cuevas-domain-listado_hospedajes .site-branding .site-logo, .l-page--cuevas-domain-hospedaje .site-branding .site-logo,\n' + 217 '.l-page--cuevas-domain-listado_donde_comer .site-branding .site-logo, .l-page--cuevas-domain-donde_o .site-branding .site-logo, .l-page--cuevas-domain-listado_de_planes .site-branding .site-logo,\n' + 218 '.l-page--cuevas-domain-planes .site-branding .site-logo, .l-page---actualidad-cuevas .site-branding .site-logo, .l-page---eventos-cuevas .site-branding .site-logo, .l-page--cuevas-domain-evento .site-branding .site-logo', context); 219 220 logos.forEach((logo) => { 221 // Definimos la nueva ruta de la imagen 222 const nuevaRuta = '/themes/custom/meta/images/logo-cuevas-blanco.png'; 223 224 // Cambiamos el atributo src 225 logo.setAttribute('src', nuevaRuta); 226 227 // Opcional: imprimir en consola para verificar 228 console.log('Logo actualizado a:', nuevaRuta); 229 }); 230 } 231 } 232 }; 233 234 Drupal.behaviors.cambiarLogoCustom = { 235 attach: (context, settings) => { 236 // Usamos once() para asegurarnos de que el cambio solo ocurra una vez 237 const umbral = 1200; 238 239 // Solo actuamos si el ancho de la ventana es mayor a 1200px 240 if (window.innerWidth > umbral) { 241 const logos = once('cambiar-logo', '.l-page--front-gutenberg-benahadux-domain .site-branding .site-logo', context); 242 243 logos.forEach((logo) => { 244 // Definimos la nueva ruta de la imagen 245 const nuevaRuta = '/themes/custom/meta/images/logo-benadux.png'; 246 247 // Cambiamos el atributo src 248 logo.setAttribute('src', nuevaRuta); 249 250 // Opcional: imprimir en consola para verificar 251 console.log('Logo actualizado a:', nuevaRuta); 252 }); 253 } 254 } 255 }; 256 257 Drupal.behaviors.stickyMenuBenahadux = { 258 attach: function (context, settings) { 259 const umbral = 1200; 260 261 // Solo actuamos si el ancho de la ventana es mayor a 1200px 262 if (window.innerWidth > umbral) { 263 // Seleccionamos el contenedor una sola vez 264 once('stickyMenu', '.l-page--front-gutenberg-benahadux-domain .contenido', context).forEach(function (element) { 265 266 // Buscamos el logo una sola vez para no repetir la consulta al DOM en cada scroll 267 const $logo = $(element).find('.site-logo'); 268 const rutaOriginal = '/themes/custom/meta/images/logo-benadux.png'; 269 const rutaNegro = '/themes/custom/meta/images/logo-negro.png'; 270 271 $(window).on('scroll', function () { 272 const scrollTop = $(window).scrollTop(); 273 274 if (scrollTop > 100) { 275 $(element).addClass('is-fixed'); 276 277 // Cambiamos el src solo si no es ya el logo negro (para optimizar) 278 if ($logo.attr('src') !== rutaNegro) { 279 $logo.attr('src', rutaNegro); 280 } 281 } else { 282 $(element).removeClass('is-fixed'); 283 284 // Volvemos al logo original 285 if ($logo.attr('src') !== rutaOriginal) { 286 $logo.attr('src', rutaOriginal); 287 } 288 } 289 }); 290 }); 291 } 292 } 293 }; 294 295 //Ayuntamiento cuevas************************************************* 296 297 Drupal.behaviors.cambiarLogoCustomAyuntCuevas = { 298 attach: (context, settings) => { 299 // Usamos once() para asegurarnos de que el cambio solo ocurra una vez 300 const umbral = 1200; 301 302 // Solo actuamos si el ancho de la ventana es mayor a 1200px 303 if (window.innerWidth > umbral) { 304 const logos = once('cambiar-logo', '.l-page--front-gutenberg-ayuntamiento-cuevas-domain .site-branding .site-logo', context); 305 306 logos.forEach((logo) => { 307 // Definimos la nueva ruta de la imagen 308 const nuevaRuta = '/themes/custom/meta/images/ayuntcuevas.png'; 309 310 // Cambiamos el atributo src 311 logo.setAttribute('src', nuevaRuta); 312 313 // Opcional: imprimir en consola para verificar 314 console.log('Logo actualizado a:', nuevaRuta); 315 }); 316 } 317 } 318 }; 319 320 //Ayuntamiento cuevas 321 Drupal.behaviors.stickyMenuAyuntCuevas = { 322
322 attach: function (context, settings) { 323 const umbral = 1200; 324 325 // Solo actuamos si el ancho de la ventana es mayor a 1200px 326 if (window.innerWidth > umbral) { 327 // Seleccionamos el contenedor una sola vez 328 once('stickyMenu', '.l-page--front-gutenberg-ayuntamiento-cuevas-domain .contenido', context).forEach(function (element) { 329 330 // Buscamos el logo una sola vez para no repetir la consulta al DOM en cada scroll 331 const $logo = $(element).find('.site-logo'); 332 const rutaOriginal = '/themes/custom/meta/images/ayuntcuevas.png'; 333 const rutaNegro = '/themes/custom/meta/images/ayuntcuevasnegro.png'; 334 335 $(window).on('scroll', function () { 336 const scrollTop = $(window).scrollTop(); 337 338 if (scrollTop > 100) { 339 $(element).addClass('is-fixed'); 340 // Cambiamos el src solo si no es ya el logo negro (para optimizar) 341 if ($logo.attr('src') !== rutaNegro) { 342 $logo.attr('src', rutaNegro); 343 } 344 345 } else { 346 $(element).removeClass('is-fixed'); 347 // Volvemos al logo original 348 if ($logo.attr('src') !== rutaOriginal) { 349 $logo.attr('src', rutaOriginal); 350 } 351 } 352 }); 353 }); 354 } 355 } 356 }; 357 Drupal.behaviors.stickyMenuAyuntCuevas_demas_paginas = { 358 attach: function (context, settings) { 359 const umbral = 1200; 360 361 // Solo actuamos si el ancho de la ventana es mayor a 1200px 362 if (window.innerWidth > umbral) { 363 // Seleccionamos el contenedor una sola vez 364 once('stickyMenu', '.l-page--ayuntamiento-cuevas-domain .contenido', context).forEach(function (element) { 365 366 $(window).on('scroll', function () { 367 const scrollTop = $(window).scrollTop(); 368 369 if (scrollTop > 100) { 370 $(element).addClass('is-fixed'); 371 // Cambiamos el src solo si no es ya el logo negro (para optimizar) 372 373 } else { 374 $(element).removeClass('is-fixed'); 375 // Volvemos al logo original 376 } 377 }); 378 }); 379 } 380 } 381 }; 382 383 //Castillo Velez 384 Drupal.behaviors.stickyMenuVelez = { 385 attach: function (context, settings) { 386 const umbral = 1200; 387 388 // Solo actuamos si el ancho de la ventana es mayor a 1200px 389 if (window.innerWidth > umbral) { 390 // Seleccionamos el contenedor una sola vez 391 once('stickyMenu', '.l-page--castillo-velez-domain .contenido', context).forEach(function (element) { 392 393 394 395 $(window).on('scroll', function () { 396 const scrollTop = $(window).scrollTop(); 397 398 if (scrollTop > 100) { 399 $(element).addClass('is-fixed'); 400 401 } else { 402 $(element).removeClass('is-fixed'); 403 // Volvemos al logo original 404 } 405 }); 406 }); 407 } 408 } 409 }; 410 411 //Castillo Villaricos 412 Drupal.behaviors.stickyMenuVillaricos = { 413 attach: function (context, settings) { 414 const umbral = 1200; 415 416 // Solo actuamos si el ancho de la ventana es mayor a 1200px 417 if (window.innerWidth > umbral) { 418 // Seleccionamos el contenedor una sola vez 419 once('stickyMenu', '.l-page--castillo-villaricos-domain .contenido', context).forEach(function (element) { 420 421 422 423 $(window).on('scroll', function () { 424 const scrollTop = $(window).scrollTop(); 425 426 if (scrollTop > 100) { 427 $(element).addClass('is-fixed'); 428 429 } else { 430 $(element).removeClass('is-fixed'); 431 // Volvemos al logo original 432 } 433 }); 434 }); 435 } 436 } 437 }; 438 439 //Museo AMC 440 Drupal.behaviors.stickyMenuMuseoAMC = { 441 attach: function (context, settings) { 442 const umbral = 1200; 443 444 // Solo actuamos si el ancho de la ventana es mayor a 1200px 445 if (window.innerWidth > umbral) { 446 // Seleccionamos el contenedor una sola vez 447 once('stickyMenu', '.l-page--museo-arte-contemp-domain .contenido', context).forEach(function (element) { 448 449 450 451 $(window).on('scroll', function () { 452 const scrollTop = $(window).scrollTop(); 453 454 if (scrollTop > 100) { 455 $(element).addClass('is-fixed'); 456 457 } else { 458 $(element).removeClass('is-fixed'); 459 // Volvemos al logo original 460 } 461 }); 462 }); 463 } 464 } 465 }; 466 467 //Museo Sdun 468 Drupal.behaviors.stickyMenuMuseosdun = { 469 attach: function (context, settings) { 470 const umbral = 1200; 471 472 // Solo actuamos si el ancho de la ventana es mayor a 1200px 473 if (window.innerWidth > umbral) { 474 // Seleccionamos el contenedor una sola vez 475 once('stickyMenu', '.l-page--museo-emilio-dun-domain .contenido', context).forEach(function (element) { 476 477 478 479 $(window).on('scroll', function () { 480 const scrollTop = $(window).scrollTop(); 481 482 if (scrollTop > 100) { 483 $(element).addClass('is-fixed'); 484 485 } else { 486 $(element).removeClass('is-fixed'); 487 // Volvemos al logo original 488 } 489 }); 490 }); 491 } 492 } 493 }; 494 495 496 497 Drupal.behaviors.stickyMenuCuevas = { 498 attach: function (context, settings) { 499 const umbral = 1200; 500 501 // Solo actuamos si el ancho de la ventana es mayor a 1200px 502 if (window.innerWidth > umbral) { 503 // Seleccionamos el contenedor una sola vez 504 once('stickyMenu', '.l-page--front-gutenberg-cuevas-domain .contenido, .l-page--cuevas-domain-listado_de_playas .contenido, .l-page--cuevas-domain-playa .contenido ,\n' + 505 '.l-page--cuevas-domain-listado_de_senderos .contenido, .l-page--cuevas-domain-sendero .contenido, .l-page--cuevas-domain-listado_lugares_de_interes .contenido,\n' + 506 '.l-page--cuevas-domain-lugares_de_interes .contenido, .l-page--cuevas-domain-listado_hospedajes .contenido, .l-page--cuevas-domain-hospedaje .contenido,\n' + 507 '.l-page--cuevas-domain-listado_donde_comer .contenido, .l-page--cuevas-domain-donde_o .contenido, .l-page--cuevas-domain-listado_de_planes .contenido,\n' + 508 '.l-page--cuevas-domain-planes .contenido, .l-page---actualidad-cuevas .contenido, .l-page---eventos-cuevas .contenido, .l-page--cuevas-domain-evento .contenido, .l-page---castillosymuseos .contenido, .l-page--cuevas-domain-busqueda_turismo_cuevas .contenido', context).forEach(function (element) { 509 510 // Buscamos el logo una sola vez para no repetir la consulta al DOM en cada scroll 511 const $logo = $(element).find('.site-logo'); 512 const rutaOriginal = '/themes/custom/meta/images/logo-cuevas-blanco.png'; 513 const rutaNegro = '/themes/custom/meta/images/logo-cuevas.png'; 514 515 $(window).on('scroll', function () { 516 const scrollTop = $(window).scrollTop(); 517 518 if (scrollTop > 100) { 519 $(element).addClass('is-fixed'); 520 521 // Cambiamos el src solo si no es ya el logo negro (para optimizar) 522 if ($logo.attr('src') !== rutaNegro) { 523 $logo.attr('src', rutaNegro); 524 } 525 } else { 526 $(element).removeClass('is-fixed'); 527 528 // Volvemos al logo original 529 if ($logo.attr('src') !== rutaOriginal) { 530 $logo.attr('src', rutaOriginal); 531 } 532 } 533 }); 534 }); 535 } 536 } 537 }; 538 539 Drupal.behaviors.stickyMenuCuevasfloat = { 540 attach: function (context, settings) { 541 const umbral = 1200; 542 543 // Solo actuamos si el ancho de la ventana es mayor a 1200px 544 if (window.innerWidth > umbral) { 545 // Seleccionamos el contenedor una sola vez 546 once('stickyMenu', '.l-page--cuevas-domain .contenido', context).forEach(function (element) { 547 548 $(window).on('scroll', function () { 549 const scrollTop = $(window).scrollTop(); 550 551 if (scrollTop > 100) { 552 $(element).addClass('is-fixed'); 553 } else { 554 $(element).removeClass('is-fixed'); 555 } 556 }); 557 }); 558 } 559 } 560 }; 561 562 /** 563 * @file 564 * Comportamiento para añadir iconos a los tÃtulos de agrupación en Views. 565 */ 566 567 Drupal.behaviors.metaHeaderIcons = { 568 attach(context) { 569 // Usamos once() para asegurarnos de no poner el icono varias veces 570 // si la View se actualiza por AJAX. 571 const headers = once('meta-header-icons', '.view-id-actividades_por_plan .title-h2', context); 572
573 headers.forEach((header) => { 574 const text = header.innerText.trim().toLowerCase(); 575 let iconClass = ''; 576 577 // Definimos el icono según el texto 578 if (text.includes('mañana')) { 579 iconClass = 'fa-sun'; 580 } else if (text.includes('mediodia') || text.includes('mediodÃa')) { 581 iconClass = 'fa-utensils'; 582 } else if (text.includes('tarde')) { 583 iconClass = 'fa-cloud-sun'; 584 } 585 586 if (iconClass) { 587 // Creamos el elemento i de FontAwesome 588 const icon = document.createElement('i'); 589 // Añadimos las clases (fas para solid, o far para regular) 590 icon.classList.add('fas', iconClass, 'me-2'); // 'me-2' es margen a la derecha en Bootstrap 591 592 // Lo insertamos al inicio del h2 593 header.prepend(icon); 594 } 595 }); 596 } 597 }; 598 599 Drupal.behaviors.menuWidgetActiveRoute = { 600 attach: (context) => { 601 // Obtenemos la ruta actual del navegador (ej. "/playas") 602 const currentPath = window.location.pathname; 603 604 // Buscamos los enlaces dentro de nuestro widget de menú utilizando context para respetar el ciclo de vida de Drupal 605 const menuLinks = context.querySelectorAll('.menu-widget .menu-list .menu-item a, .menu-widget--2 .menu-list .menu-item a, .menu-widget--3 .menu-list .menu-item a'); 606 607 if (!menuLinks.length) return; 608 609 menuLinks.forEach(link => { 610 // Obtenemos el path del enlace (manejando rutas relativas o absolutas internas) 611 const linkPath = new URL(link.href, window.location.origin).pathname; 612 613 // Comparamos la ruta actual con la del enlace 614 if (currentPath === linkPath) { 615 const menuItem = link.closest('.menu-item'); 616 617 if (menuItem) { 618 // Remover la clase active de los hermanos por si acaso venÃa hardcodeada en el HTML 619 const listItems = menuItem.parentElement.querySelectorAll('.menu-item'); 620 listItems.forEach(item => item.classList.remove('active')); 621 622 // Añadir la clase active al elemento actual 623 menuItem.classList.add('active'); 624 } 625 } 626 }); 627 } 628 }; 629 630 Drupal.behaviors.transformShowHideButton = { 631 attach: function (context) { 632 const selector = '#show-hide'; 633 634 once('transformButton', selector, context).forEach(function (button) { 635 // Verificamos el body 636 const validBody = button.closest('body[data-domain="cuevasdelalmanzora_labmetacms_es"]'); 637 if (!validBody) return; 638 639 const svgPath = '/themes/custom/meta/images/ayunt-cuevas/ayunt-cuevas-acces.svg'; 640 641 // Función que realiza el cambio de texto a SVG 642 const injectSvg = () => { 643 // Si ya tiene la imagen dentro, no hacemos nada para evitar bucles infinitos 644 if (button.querySelector('.button-icon-svg')) return; 645 646 const svgIcon = document.createElement('img'); 647 svgIcon.src = svgPath; 648 svgIcon.alt = button.getAttribute('aria-label') || 'Preferencias'; 649 svgIcon.classList.add('button-icon-svg'); 650 651 button.textContent = ''; // Limpia texto 652 button.appendChild(svgIcon); // Inserta SVG 653 console.log('¡SVG Inyectado con éxito!'); 654 }; 655 656 // 1. Intentamos inyectarlo inmediatamente 657 injectSvg(); 658 659 // 2. Creamos un observador por si un script externo altera el botón más tarde 660 const observer = new MutationObserver((mutations) => { 661 // Si el texto cambia o el script externo regenera el contenido, lo volvemos a cambiar 662 injectSvg(); 663 }); 664 665 // Configuramos el observador para que mire los cambios en el texto y elementos hijos del botón 666 observer.observe(button, {childList: true, characterData: true, subtree: true}); 667 }); 668 } 669 }; 670 671 Drupal.behaviors.listToggle = { 672 attach: function (context) { 673 674 once('list-toggle', '.list-toggle', context).forEach(function (button) { 675 676 $(button).on('click', function (e) { 677 e.preventDefault(); 678 679 const $wrapper = $('.view-mapa-playas, .view-mapa-senderos, .view-mapa-lugares-interes, .view-mapa-hospedajes, .view-mapa-donde-comer'); 680 681 // Toggle de clase 682 $wrapper.toggleClass('collapsed'); 683 684 if ($wrapper.hasClass('collapsed')) { 685 686 // ð½ ESTADO COLAPSADO 687 $('.contenido-hidden').hide(); 688 $('.view-mapa-playas .groupy, .view-mapa-senderos .groupy, .view-mapa-lugares-interes .groupy, .view-mapa-hospedajes .groupy, .view-mapa-donde-comer .groupy').css('width', '100%'); 689 $('.view-mapa-playas .groupy .view-mapa-parametros .view-content, .view-mapa-senderos .groupy .view-mapa-parametros .view-content, .view-mapa-lugares-interes .groupy .view-mapa-parametros .view-content, .view-mapa-hospedajes .groupy .view-mapa-parametros .view-content, .view-mapa-donde-comer .groupy .view-mapa-parametros .view-content') 690 .css('grid-template-columns', 'repeat(4, 1fr)'); 691 $('.view-mapa-playas .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-senderos .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-lugares-interes .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-hospedajes .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-donde-comer .groupy .view-mapa-parametros .view-content .views-row').css('width', '23%'); 692 693 } else { 694 695 // ð¼ ESTADO NORMAL 696 $('.contenido-hidden').show(); 697 $('.view-mapa-playas .groupy, .view-mapa-senderos .groupy, .view-mapa-lugares-interes .groupy, .view-mapa-hospedajes .groupy, .view-mapa-donde-comer .groupy').css('width', ''); 698 $('.view-mapa-playas .groupy .view-mapa-parametros .view-content, .view-mapa-senderos .groupy .view-mapa-parametros .view-content, .view-mapa-lugares-interes .groupy .view-mapa-parametros .view-content, .view-mapa-hospedajes .groupy .view-mapa-parametros .view-content, .view-mapa-donde-comer .groupy .view-mapa-parametros .view-content') 699 .css('grid-template-columns', ''); 700 $('.view-mapa-playas .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-senderos .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-lugares-interes .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-hospedajes .groupy .view-mapa-parametros .view-content .views-row, .view-mapa-donde-comer .groupy .view-mapa-parametros .view-content .views-row').css('width', ''); 701 702 } 703 704 // ð Leaflet: recalcular tamaño (SIN reinicializar) 705 setTimeout(function () { 706 if (Drupal.Leaflet && Drupal.Leaflet.maps) {
707 Object.values(Drupal.Leaflet.maps).forEach(function (map) { 708 map.invalidateSize(); 709 }); 710 } 711 }, 350); 712 }); 713 714 }); 715 } 716 }; 717 718 Drupal.behaviors.scrollAjustadoPlayas = { 719 attach: function (context, settings) { 720 721 // Uso correcto de once en Drupal moderno: 722 // once('id-unico', selector, contexto) 723 const forms = once('scroll-ajustado', '.views-exposed-form', context); 724 725 // 'once' devuelve un Array nativo de elementos, mapeamos con jQuery si hace falta 726 $(forms).each(function () { 727 if (context !== document) { 728 $('html, body').animate({ 729 scrollTop: $('.view-filters').offset().top - 150 730 }, 300); 731 } 732 }); 733 734 } 735 }; 736 737 Drupal.behaviors.hvModalClose = { 738 attach: function (context, settings) { 739 // Usamos 'once' para asegurarnos de que el evento click se asigne una sola vez 740 $(once('hv-modal-close-event', '.hv-btn--secondary', context)).on('click', function (e) { 741 e.preventDefault(); 742 743 // 1. Intentar cerrar usando la API nativa de Bootstrap si está disponible en el JS global 744 var $modalElement = $(this).closest('.modal'); 745 746 if ($modalElement.length) { 747 if (typeof bootstrap !== 'undefined' && bootstrap.Modal) { 748 // Bootstrap 5 749 var modalInstance = bootstrap.Modal.getInstance($modalElement[0]); 750 if (modalInstance) { 751 modalInstance.hide(); 752 return; 753 } 754 } else if ($.fn.modal) { 755 // Bootstrap 4 / jQuery fallback 756 $modalElement.modal('hide'); 757 return; 758 } 759 } 760 761 // 2. Fallback: Si Bootstrap no responde por conflicto de librerÃas, 762 // simulamos el click en el botón de cerrar nativo de la cabecera de Drupal 763 var $nativeClose = $(this).closest('.modal-content').find('.js-modal-page-ok-button'); 764 if ($nativeClose.length) { 765 $nativeClose.trigger('click'); 766 } 767 }); 768 } 769 }; 770 771 Drupal.behaviors.searchIconInjector = { 772 attach: function (context, settings) { 773 774 // La nueva sintaxis de once() recibe un identificador y el selector 775 const elements = once('search-init', '.l-page--castillo-velez-domain #search-block-form #edit-keys', context); 776 777 // 'once' ahora devuelve un array nativo de JavaScript, asà que lo recorremos 778 elements.forEach(function (element) { 779 var $input = $(element); // Lo envolvemos en jQuery 780 781 // 1. Envolvemos el input en el contenedor 782 $input.wrap('<div class="search-wrapper"></div>'); 783 784 // 2. Creamos e inyectamos el icono (por defecto empieza con la lupa) 785 var $icon = $('<i class="fas fa-search search-trigger-icon"></i>'); 786 $input.after($icon); 787 788 // 3. Evento de clic 789 $icon.on('click', function () { 790 var $thisIcon = $(this); // El icono que recibió el clic 791 792 // Alternamos la clase activa en el input 793 $input.toggleClass('search-input-active'); 794 795 if ($input.hasClass('search-input-active')) { 796 $input.focus(); 797 // Si está activo, quitamos la lupa y ponemos la cruz 798 $thisIcon.removeClass('fa-search').addClass('fa-times'); 799 } else { 800 // Si se cierra, volvemos a poner la lupa 801 $thisIcon.removeClass('fa-times').addClass('fa-search'); 802 } 803 }); 804 }); 805 806 } 807 }; 808 809 Drupal.behaviors.cambiarTituloArchivo = { 810 attach: function (context, settings) { 811 // 1. Validar si la URL actual empieza por /archivo/ 812 if (window.location.pathname.startsWith('/archivo/')) { 813 814 // 2. Seleccionar el bloque especÃfico usando 'once' 815 const blocks = once( 816 'cambiar-titulo-vista', 817 '#block-meta-views-block-ultimos-archivos-documentales-block-2', 818 context 819 ); 820 821 // 3. Modificar el elemento interno .title-block 822 blocks.forEach(function (block) { 823 const titleElement = block.querySelector('.title-block'); 824 if (titleElement) { 825 titleElement.textContent = 'Ãltimos Plenos'; // Pon aquà el tÃtulo que quieras 826 } 827 }); 828 829 } 830 } 831 }; 832 833 document.addEventListener('DOMContentLoaded', function () { 834 const btn = document.getElementById('project-desc-btn'); 835 const wrapper = document.getElementById('project-desc-wrapper'); 836 837 if (btn && wrapper) { 838 btn.addEventListener('click', function () { 839 // Alternamos la clase que expande el contenedor 840 wrapper.classList.toggle('is-expanded'); 841 842 // Cambiamos el texto del botón según el estado 843 if (wrapper.classList.contains('is-expanded')) { 844 btn.textContent = 'Leer menos'; 845 } else { 846 btn.textContent = 'Leer más'; 847
848 // Opcional: Desplazar la pantalla suavemente hacia arriba si al cerrarlo queda desubicado 849 wrapper.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); 850 } 851 }); 852 } 853 }); 854 855 document.addEventListener('DOMContentLoaded', function () { 856 // Buscamos todos los enlaces de colorbox dentro de nuestro slider de obra 857 const colorboxLinks = document.querySelectorAll('.view-slider-de-obra-y-proyecto .colorbox'); 858 859 if (colorboxLinks.length > 0) { 860 colorboxLinks.forEach(function(link) { 861 // Les asignamos exactamente el mismo nombre de galerÃa a todos 862 link.setAttribute('data-colorbox-gallery', 'galeria-proyectos-unica'); 863 }); 864 } 865 }); 866 867})(jQuery, Drupal); 868 869(function (Drupal) { 870 'use me' 871 Drupal.behaviors.protegerIconosTraduccion = { 872 attach: function (context, settings) { 873 // Busca todos los span de Material Symbols o Material Icons 874 const iconos = context.querySelectorAll('.material-symbols-outlined, .material-icons'); 875 876 iconos.forEach(function (icono) { 877 // Les añade la clase y el atributo para frenar a Google Translate 878 icono.classList.add('notranslate'); 879 icono.setAttribute('translate', 'no'); 880 }); 881 } 882 }; 883})(Drupal);
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.