1(function () { 2 'use strict'; 3 4 window.tangolPaqueteQuoteRenderers = window.tangolPaqueteQuoteRenderers || {}; 5 6 function setSelectAndFire(select, value) { 7 if (!select) return; 8 select.value = value; 9 select.dispatchEvent(new Event('change', { bubbles: true })); 10 } 11 12 function traslado(bodyEl, step, ctx, onConfirm, onSkip) { 13 var modal = document.querySelector('[data-paquete-quote-modal]'); 14 var i18n = modal ? modal.dataset : {}; 15 16 var instance = document.querySelector('[data-paquete-traslado-instance="' + step.detId + '"]'); 17 if (!instance) { 18 bodyEl.textContent = i18n.i18nError; 19 return; 20 } 21 instance.hidden = false; 22 bodyEl.appendChild(instance); 23 24 var widget = instance.querySelector('[data-traslado-widget]'); 25 var origenSelect = widget.querySelector('[data-select-origen]'); 26 var destinoSelect = widget.querySelector('[data-select-destino-punto]'); 27 var fechaInput = widget.querySelector('[name="fecha"]'); 28 var paxStepper = widget.querySelector('[data-pax-stepper]'); 29 30 // Prefill: fecha del puntero de cascada, pax total del widget del paquete. La hora queda 31 // vacÃa (el detalle no la trae) para que el usuario la complete. 32 if (fechaInput && ctx.stepDate) { 33 var iso = ctx.stepDate.getFullYear() + '-' 34 + String(ctx.stepDate.getMonth() + 1).padStart(2, '0') + '-' 35 + String(ctx.stepDate.getDate()).padStart(2, '0'); 36 window.TangolDateField.setValue(fechaInput.closest('[data-tangol-date-field]'), iso); 37 } 38 if (paxStepper) { 39 var totalPax = ctx.rooms.reduce(function (sum, r) { return sum + r.adults + r.children; }, 0); 40 var countEl = paxStepper.querySelector('[data-pax-count]'); 41 if (countEl) countEl.textContent = String(Math.max(1, totalPax)); 42 } 43 44 // Los puntos de origen/destino cargan de forma asÃncrona al setear el destino (cascada 45 // paÃs->destino->puntos del propio widget, ver wireOrigenChange en traslado-quote- 46 // widget.js) â se espera a que las opciones existan antes de preseleccionar, reintentando 47 // brevemente; el destino depende de un segundo fetch disparado por el cambio de origen, 48 // asà que se le da un margen extra tras seleccionar el origen. 49 function tryPreselectPuntos(attemptsLeft) { 50 if (!origenSelect || !destinoSelect) return; 51 var hasOrigenOption = !!origenSelect.querySelector('option[value="' + step.traOrigenId + '"]'); 52 if (hasOrigenOption) { 53 setSelectAndFire(origenSelect, String(step.traOrigenId)); 54 setTimeout(function () { 55 var hasDestinoOption = !!destinoSelect.querySelector('option[value="' + step.traDestinoId + '"]'); 56 if (hasDestinoOption) setSelectAndFire(destinoSelect, String(step.traDestinoId)); 57 }, 500); 58 return; 59 } 60 if (attemptsLeft > 0) setTimeout(function () { tryPreselectPuntos(attemptsLeft - 1); }, 300); 61 } 62 tryPreselectPuntos(10); 63 64 // El widget en modo paquete (isPaqueteMode, ver traslado-quote-widget.js) no ofrece ida/ 65 // vuelta ni "Agregar al carrito": al hacer clic en "Seleccionar" dispara este evento con la 66 // tarjeta del vehÃculo elegido, y acá confirmamos el paso directamente (el alta real al 67 // carrito pasa recién en la confirmación final del itinerario, paquete-confirm-all.js). 68 function onVehicleSelected(evt) { 69 var card = evt.detail.card; 70 var origenNombre = origenSelect.options[origenSelect.selectedIndex].textContent; 71 var destinoNombre = destinoSelect.options[destinoSelect.selectedIndex].textContent; 72 var priceEl = card.querySelector('.traslado-quote__vehicle-price span'); 73 var totalDigits = priceEl ? priceEl.textContent.replace(/[^\d]/g, '') : ''; 74 var total = totalDigits ? parseInt(totalDigits, 10) : 0; 75 76 onConfirm({ 77 desId: step.desId, 78 servicioId: parseInt(card.getAttribute('data-servicio-id'), 10), 79 codServ: card.getAttribute('data-cod-serv'), 80 codCat: card.getAttribute('data-cod-cat'), 81 fecha: fechaInput.value, 82 hora: widget.querySelector('[data-input-hora]').value, 83 pax: parseInt(paxStepper.querySelector('[data-pax-count]').textContent, 10), 84 origenNombre: origenNombre, 85 destinoNombre: destinoNombre, 86 vehiculoNombre: card.getAttribute('data-vehiculo-nombre'), 87 obsServicio: card.getAttribute('data-obs-servicio') || null, 88 infoVuelo: (widget.querySelector('[data-input-vuelo-ida]') || {}).value || null, 89 total: total, 90 currencyCode: ctx.currencyCode, 91 summaryLabel: card.getAttribute('data-vehiculo-nombre') + ' â ' + origenNombre + ' â ' + destinoNombre, 92 }); 93 widget.removeEventListener('traslado-vehicle-selected', onVehicleSelected); 94 } 95 widget.addEventListener('traslado-vehicle-selected', onVehicleSelected); 96 97 var skipBtn = document.createElement('button'); 98 skipBtn.type = 'button'; 99 skipBtn.className = 'paquete-step__skip'; 100 skipBtn.textContent = i18n.i18nSkip; 101 skipBtn.addEventListener('click', function () { 102 widget.removeEventListener('traslado-vehicle-selected', onVehicleSelected); 103 onSkip(); 104 }); 105 bodyEl.appendChild(skipBtn); 106 } 107 108 window.tangolPaqueteQuoteRenderers.Traslado = traslado; 109})();
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.