PageSourceSearch

https://www.tangol.com/js/paquete-step-traslado.42y0yk7tbr.js

js tangol.com collected 2026-10-01 13:53:19 UTC 5,787 bytes, 109 lines download raw bytes

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.