templates/reservation/tunnel/tunnel.html.twig line 1

Open in your IDE?
  1. {% extends 'vitrine/base.html.twig' %}
  2. {% import 'vitrine/macros/svg_illustration_macros.twig' as svg %}
  3. {% block title "Réserver" %}
  4. {% block description %}{% trans %}Réservez votre moment de détente{% endtrans %}{% endblock %}
  5. {% block stylesheets %}
  6.     {{ parent() }}
  7.     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />
  8.     {{ encore_entry_link_tags('tunnel') }}
  9. {% endblock %}
  10. {% block javascripts %}
  11.     {{ parent() }}
  12.     {{ encore_entry_script_tags('tunnel') }}
  13.     <script src="https://unpkg.com/swiper/swiper-bundle.min.js"></script>
  14.     <script type="text/javascript" src="https://api.payplug.com/js/1/form.latest.js"></script>
  15.     
  16.     <script async defer src="https://api.mapbox.com/mapbox-assembly/v1.5.1/assembly.js"></script>
  17.     <script id="search-js" defer="" src="https://api.mapbox.com/search-js/v1.0.0-beta.21/web.js"></script>
  18.     <script>
  19.         const ACCESS_TOKEN = '{{ mapbox_access_token }}';
  20.         const COUNTRIES = '{{ mapbox_countries  }}'.split(',');
  21.         const script = document.getElementById('search-js');
  22.         script.onload = () => {
  23.             const collection = mapboxsearch.autofill({
  24.                 accessToken: ACCESS_TOKEN,
  25.                 options: { COUNTRIES }
  26.             });
  27.         };
  28.     </script>
  29.     {% include 'form/components/js-translations.html.twig' %}
  30. {% endblock %}
  31. {% block main %}
  32.     <div id="background-override">
  33.         <video data-step="start" class="background-video" src="https://i.gyazo.com/d9d0bd5636691cfdf72d4db0a4132c09.mp4" muted playsinline autoplay loop></video>
  34.         <div data-step="second-step" class="tunnel-hidden background-image swiper-full">
  35.             <div class="swiper swiper-bath">
  36.                 <div class="swiper-wrapper">
  37.                     <div class="swiper-slide">
  38.                         <img src="https://i.gyazo.com/b7d32e07063d6a51fc24bfe3b70da6ca.jpg" alt="Baignoire 1">
  39.                     </div>
  40.                     <div class="swiper-slide">
  41.                         <img src="https://i.gyazo.com/b7d32e07063d6a51fc24bfe3b70da6ca.jpg" alt="Baignoire 1">
  42.                     </div>
  43.                     <div class="swiper-slide">
  44.                         <img src="https://i.gyazo.com/b7d32e07063d6a51fc24bfe3b70da6ca.jpg" alt="Baignoire 3">
  45.                     </div>
  46.                 </div>
  47.                 <div class="swiper-pagination"></div>
  48.             </div>
  49.         </div>
  50.         <div data-step="fourth-step" class="tunnel-hidden background-image swiper-full">
  51.             <div class="swiper swiper-extra">
  52.                 <div class="swiper-wrapper">
  53.                     <div class="swiper-slide">
  54.                         <img src="https://i.gyazo.com/84c7b90fc6ff6c31478eae19f38bd03d.jpg" alt="Extra 1">
  55.                     </div>
  56.                     <div class="swiper-slide">
  57.                         <img src="https://i.gyazo.com/84c7b90fc6ff6c31478eae19f38bd03d.jpg" alt="Extra 2">
  58.                     </div>
  59.                     <div class="swiper-slide">
  60.                         <img src="https://i.gyazo.com/84c7b90fc6ff6c31478eae19f38bd03d.jpg" alt="Extra 3">
  61.                     </div>
  62.                 </div>
  63.                 <div class="swiper-pagination"></div>
  64.             </div>
  65.         </div>
  66.     </div>
  67.     {% form_theme form 'form/theme_tunnel.html.twig' %}
  68.     {{ form_start(form, { 'attr': {
  69.         'class': 'to-submit w-full',
  70.         'data-entity-id': edit is defined and reservationId is defined ? reservationId : null
  71.     }}) }}
  72.     <div class="not-animate-childs md:pt-32 pt-24 justify-items-center">
  73.         
  74.         <div id="progress-bar" class="progress-bar-container tunnel-hidden" style="{{ code is defined ? "display: none" : "" }}">
  75.             <p class="progress-bar-steps">
  76.                 {% trans %}Étape{% endtrans %} <span id="step-count">1</span> {% trans %}sur{% endtrans %} 6
  77.             </p>
  78.             <div class="progress-bar">
  79.                 <div class="progress-bar-fill"></div>
  80.             </div>
  81.         </div>
  82.         <section id="start" class="tunnel-hidden content-column-center-48 tunnel-step">
  83.             {% if code is defined %}
  84.                 <h2 class="title text-center mt-24 text-4xl">
  85.                     {% trans %}Votre carte cadeau{% endtrans %}
  86.                 </h2>
  87.                 <div class="recapitulatif-container content-column-24 max-w-400">
  88.                     <div class="content-column-8">
  89.                         <h3>
  90.                             {% if token.offer == 90 %}
  91.                                 La Grande Bulle (90 min)
  92.                             {% else %}
  93.                                 La Bulle (60 min)
  94.                             {% endif %}
  95.                         </h3>
  96.                         <p class="text-opacity-70">
  97.                             {{ token.nbParticipants }} {% trans %}personne(s){% endtrans %}
  98.                             · {{ token.solo + token.duo }} {% trans %}baignoire(s){% endtrans %}
  99.                         </p>
  100.                     </div>
  101.                     {% if services is defined and services|length > 0 %}
  102.                         <div class="content-column-8">
  103.                             <h4>{% trans %}Extras inclus{% endtrans %}</h4>
  104.                             {% for service in services %}
  105.                                 <p class="text-opacity-70">{{ service.name }} × {{ service.quantity }}</p>
  106.                             {% endfor %}
  107.                         </div>
  108.                     {% endif %}
  109.                     <div class="flex-between w-full">
  110.                         <p><b>{% trans %}Valeur{% endtrans %}</b></p>
  111.                         <p><b>{{ priceOffered }}€</b></p>
  112.                     </div>
  113.                 </div>
  114.                 <div class="tunnel-footer m-auto content-column-8">
  115.                     {% include "tunnel/components/primary-button.html.twig" with {
  116.                         'action': 'goToDateStep', 'label': 'Choisir la date'
  117.                     } %}
  118.                     {% include "tunnel/components/secondary-button.html.twig" with {
  119.                         'action': 'goToFirstStep', 'label': 'Modifier l\'offre'
  120.                     } %}
  121.                 </div>
  122.             {% else %}
  123.                 <h2 class="title text-center mt-24 text-4xl">
  124.                     {% trans %}Offrez-vous un moment de détente avec vos proches{% endtrans %}
  125.                 </h2>
  126.                 <div class="tunnel-footer m-auto">
  127.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Commencer' } %}
  128.                     <a href="{{ path('reservation_carte_cadeau_tunnel') }}">
  129.                         <button class="rounded-btn-secondary btn" type="button">
  130.                             <span>{{ "J'ai une carte cadeau"|trans }}</span>
  131.                         </button>
  132.                     </a>
  133.                 </div>
  134.             {% endif %}
  135.         </section>
  136.         <section id="first-step" class="tunnel-hidden tunnel-step">
  137.             <div class="content-column-center-48 ">
  138.                 <div class="content-column-8-center">
  139.                     <h2 class="title text-center">
  140.                         {% trans %}Combien serez-vous ?{% endtrans %}
  141.                     </h2>
  142.                     <p class="text-opacity-70 text-center">
  143.                         {% trans %}Vous profiterez de votre espace en toute intimité, quel que soit votre nombre.{% endtrans %}
  144.                     </p>
  145.                 </div>
  146.                 <div class="my-6">
  147.                     {{ form_widget(form.nbParticipants) }}
  148.                 </div>
  149.                 <div class="tunnel-footer">
  150.                     <div class="infoContainer w-full text-center" style="display: none">
  151.                         <p class="stepInfo">
  152.                         </p>
  153.                     </div>
  154.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  155.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'goToPrivatisation', 'label': 'Privatiser le spa' } %}
  156.                 </div>
  157.             </div>
  158.         </section>
  159.         <section id="second-step" class="tunnel-hidden tunnel-step">
  160.             <div class="swiper-button-prev-bath swiper-button-prev"></div>
  161.             <div class="swiper-button-next-bath swiper-button-next"></div>
  162.             <div class="content-column-center-48 ">
  163.                 <div class="content-column-8-center">
  164.                     <h2 class="title text-center">
  165.                         {% trans %}Combien de baignoires voulez-vous utiliser ?{% endtrans %}
  166.                     </h2>
  167.                     <p class="text-opacity-70 text-center">
  168.                         {% trans %}Nos baignoires sont conçues pour accueillir 2 personnes confortablement.{% endtrans %}
  169.                     </p>
  170.                 </div>
  171.                 <div class="max-w-400">
  172.                     {{ form_widget(form.nbBath) }}
  173.                 </div>
  174.                 <div class="tunnel-footer">
  175.                     <div class="totalDifferencePriceContainer w-full flex-between" style="display: none">
  176.                         <p class="small-text-opacity-70">
  177.                             {% trans %}Supplément à régler{% endtrans %}
  178.                         </p>
  179.                         <p>
  180.                             <b>+</b><b class="totalDifferencePrice"></b>
  181.                         </p>
  182.                     </div>
  183.                     <div class="totalContainer w-full flex-between" style="display: none">
  184.                         <p class="small-text-opacity-70">
  185.                             {% trans %}Total pour{% endtrans %} <span class="totalPerson">1</span> {% trans %}personne(s){% endtrans %}
  186.                         </p>
  187.                         <p>
  188.                             <b class="totalPrice"></b>
  189.                         </p>
  190.                     </div>
  191.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  192.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'previousStep', 'label': 'Précédent' } %}
  193.                 </div>
  194.             </div>
  195.         </section>
  196.         <section id="third-step" class="tunnel-hidden tunnel-step">
  197.             <div class="content-column-center-48">
  198.                 <h2 class="title text-center">
  199.                     {% trans %}Choisissez une offre{% endtrans %}
  200.                 </h2>
  201.                 <div class="w-full">
  202.                     {{ form_widget(form.offer) }}
  203.                 </div>
  204.                 <div class="tunnel-footer">
  205.                     <div class="totalDifferencePriceContainer w-full flex-between" style="display: none">
  206.                         <p class="small-text-opacity-70">
  207.                             {% trans %}Supplément à régler{% endtrans %}
  208.                         </p>
  209.                         <p>
  210.                             <b>+</b><b class="totalDifferencePrice"></b>
  211.                         </p>
  212.                     </div>
  213.                     <div class="totalContainer w-full flex-between" style="display: none">
  214.                         <p class="small-text-opacity-70">
  215.                             {% trans %}Total pour{% endtrans %} <span class="totalPerson">1</span> {% trans %}personne(s){% endtrans %}
  216.                         </p>
  217.                         <p>
  218.                             <b class="totalPrice"></b>
  219.                         </p>
  220.                     </div>
  221.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  222.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'previousStep', 'label': 'Précédent' } %}
  223.                 </div>
  224.             </div>
  225.         </section>
  226.         <section id="fourth-step" class="tunnel-hidden tunnel-step">
  227.             <div class="swiper-button-prev-extra swiper-button-prev"></div>
  228.             <div class="swiper-button-next-extra swiper-button-next"></div>
  229.             <div class="content-column-center-48 ">
  230.                 <div class="content-column-8">
  231.                     <h2 class="title text-center">
  232.                         {% trans %}Un petit plaisir à ajouter ?{% endtrans %}
  233.                     </h2>
  234.                 </div>
  235.                 <div class="extra-container max-w-400">
  236.                     {{ form_row(form.extraReservations) }}
  237.                 </div>
  238.                 <div class="tunnel-footer">
  239.                     <div class="totalDifferencePriceContainer w-full flex-between" style="display: none">
  240.                         <p class="small-text-opacity-70">
  241.                             {% trans %}Supplément à régler{% endtrans %}
  242.                         </p>
  243.                         <p>
  244.                             <b>+</b><b class="totalDifferencePrice"></b>
  245.                         </p>
  246.                     </div>
  247.                     <div class="totalContainer w-full flex-between" style="display: none">
  248.                         <p class="small-text-opacity-70">
  249.                             {% trans %}Total pour{% endtrans %} <span class="totalPerson">1</span> {% trans %}personne(s){% endtrans %}
  250.                         </p>
  251.                         <p>
  252.                             <b class="totalPrice"></b>
  253.                         </p>
  254.                     </div>
  255.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  256.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'previousStep', 'label': 'Précédent' } %}
  257.                 </div>
  258.             </div>
  259.         </section>
  260.         <section id="fifth-step" class="tunnel-hidden tunnel-step">
  261.             <div class="content-column-center-48 ">
  262.                 <div class="content-column-8">
  263.                     <h2 class="title text-center">
  264.                         {% trans %}Choisissez une date{% endtrans %}
  265.                     </h2>
  266.                 </div>
  267.                 <div class="date-container max-w-400 content-column-16">
  268.                     {{ form_widget(form.date) }}
  269.                 </div>
  270.                 <div class="tunnel-footer">
  271.                     <div class="totalDifferencePriceContainer w-full flex-between" style="display: none">
  272.                         <p class="small-text-opacity-70">
  273.                             {% trans %}Supplément à régler{% endtrans %}
  274.                         </p>
  275.                         <p>
  276.                             <b>+</b><b class="totalDifferencePrice"></b>
  277.                         </p>
  278.                     </div>
  279.                     <div class="totalContainer w-full flex-between" style="display: none">
  280.                         <p class="small-text-opacity-70">
  281.                             {% trans %}Total pour{% endtrans %} <span class="totalPerson">1</span> {% trans %}personne(s){% endtrans %}
  282.                         </p>
  283.                         <p>
  284.                             <b class="totalPrice"></b>
  285.                         </p>
  286.                     </div>
  287.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'nextStep', 'label': 'Suivant' } %}
  288.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'previousStep', 'label': 'Précédent' } %}
  289.                 </div>
  290.             </div>
  291.         </section>
  292.         <section id="sixth-step" class="tunnel-hidden tunnel-step">
  293.             <div class="content-column-center-48">
  294.                 <div class="content-column-8-center">
  295.                     <h2 class="title text-center">
  296.                         {% trans %}Récapitulons{% endtrans %}
  297.                     </h2>
  298.                 </div>
  299.                 <div class="content-row-48-center max-w-1200">
  300.                     <div class="gsap-sticky">
  301.                         {% include "tunnel/components/recapitulatif.html.twig" %}
  302.                     </div>
  303.                     <div class="contact-container wrapper-form-right flex-1">
  304.                         <div class="content-column-16">
  305.                             <h2 class="p-16-0">
  306.                                 {% trans %}Contact{% endtrans %}
  307.                             </h2>
  308.                             {{ form_row(form.contact) }}
  309.                             <h2 class="p-16-0">
  310.                                 {% trans %}Participants{% endtrans %}
  311.                             </h2>
  312.                             {{ form_row(form.participants) }}
  313.                             {{ form_row(form.cgv) }}
  314.                             <p style="font-size: 14px;">
  315.                                 (*) {% trans %}Champs obligatoires{% endtrans %}
  316.                             </p>
  317.                         </div>
  318.                     </div>
  319.                 </div>
  320.                 <div class="tunnel-footer">
  321.                     <div class="infoContainer w-full text-center" style="display: none">
  322.                         <p class="stepInfo">
  323.                         </p>
  324.                     </div>
  325.                     {% include 'form/components/rgpd.html.twig' with {'sujet': 'réservation'} %}
  326.                     {% include "tunnel/components/primary-button.html.twig" with {'action': 'createPayment', 'label': 'payment.pay'|trans } %}
  327.                     {% include "tunnel/components/secondary-button.html.twig" with {'action': 'goToFirstStep', 'label': 'Modifier' } %}
  328.                 </div>
  329.             </div>
  330.         </section>
  331.     </div>
  332.     {{ form_end(form) }}
  333.     <script src="{{ asset('js/tunnel.js') }}"></script>
  334.     <script src="{{ asset('js/tunnel/swiper.js') }}"></script>
  335.     <script>
  336.         const oldPrice = {{ priceOffered|default(0) }};
  337.         const usingCode = {{ code is defined ? "true" : "false" }};
  338.         const editMode = {{ edit is defined ? "true" : "false" }};
  339.         const entityId = {{ edit is defined and reservationId is defined ? reservationId : "null" }};
  340.         // Make editMode and entityId available globally for offer availability checks
  341.         window.editMode = editMode;
  342.         window.entityId = entityId;
  343.         const waitlistData = {{ waitlistData|default(null)|json_encode|raw }};
  344.         let submitButton = document.querySelector(".submit-btn");
  345.         // on dom ready
  346.         document.addEventListener('DOMContentLoaded', function() {
  347.             if (usingCode) {
  348.                 updateUI(0);
  349.             }
  350.             if (editMode) {
  351.                 updateUI(1);
  352.                 // Initialize offer availability check for edit mode
  353.                 if (typeof initializeOfferAvailabilityForEdit === 'function') {
  354.                     initializeOfferAvailabilityForEdit();
  355.                 }
  356.             }
  357.             if (waitlistData) {
  358.                 window.waitlistData = waitlistData;
  359.                 // Pre-fill form fields from waitlist data
  360.                 const soloInput = document.querySelector('.solo');
  361.                 const duoInput = document.querySelector('.duo');
  362.                 const nbBathInput = document.querySelector('.nbBath');
  363.                 const nbParticipantsInput = document.querySelector('.nbParticipants');
  364.                 if (soloInput) soloInput.value = waitlistData.solo;
  365.                 if (duoInput) duoInput.value = waitlistData.duo;
  366.                 if (nbBathInput) nbBathInput.value = waitlistData.solo + waitlistData.duo;
  367.                 if (nbParticipantsInput) nbParticipantsInput.value = waitlistData.solo + (waitlistData.duo * 2);
  368.                 // Set offer radio button
  369.                 const offerInput = document.querySelector('input.offer-option[value="' + waitlistData.offer + '"]');
  370.                 if (offerInput) {
  371.                     offerInput.checked = true;
  372.                     offerInput.dispatchEvent(new Event('change', { bubbles: true }));
  373.                 }
  374.                 // Navigate to date step (step 5)
  375.                 updateUI(5);
  376.             }
  377.         });
  378.         window.addEventListener('message', function (event) {
  379.             // Check if the message is coming from the PayPlug origin
  380.             if (event.origin === "https://secure.payplug.com") {
  381.                 // Check if the message data indicates the lightbox was closed
  382.                 if (event.data === "closePayPlugFrame") {
  383.                     // Re-enable the submit button
  384.                     submitButton.removeAttribute("disabled");
  385.                     submitButton.querySelector(".spinner").style.display = "none";
  386.                 }
  387.             }
  388.         });
  389.         function openCarteCadeauModal() {
  390.             const tokenValue = prompt("Entrez le code de votre carte cadeau");
  391.             // Check if the user provided a value
  392.             if (tokenValue) {
  393.                 const baseUrl = "{{ path('reservation_carte_cadeau_tunnel') }}";
  394.                 window.location.href = `${baseUrl}?code=${encodeURIComponent(tokenValue)}`;
  395.             }
  396.         }
  397.         function createPayment() {
  398.             let form = document.querySelector("form.to-submit");
  399.             let formExtras = new FormData(form);
  400.             let formData = {};
  401.             submitButton.removeAttribute("disabled");
  402.             displayStepInfo(submitButton, "");
  403.             for (let entry of formExtras.entries()) {
  404.                 formData[entry[0]] = entry[1];
  405.             }
  406.             if (!form.checkValidity()) {
  407.                 displayStepInfo(submitButton, "Veuillez remplir tous les champs obligatoires");
  408.                 form.reportValidity();
  409.                 return;
  410.             }
  411.             {% if code is defined %}
  412.             formData["code"] = "{{ code }}";
  413.             {% endif %}
  414.             submitButton.disabled = true;
  415.             submitButton.querySelector(".spinner").style.display = "block";
  416.             $.ajax({
  417.                 url: "{{ paymentUrl }}",
  418.                 dataType: "json",
  419.                 type: "Post",
  420.                 async: true,
  421.                 data: formData,
  422.                 success: function (data) {
  423.                     if(data.action === 'payment') {
  424.                         Payplug.showPayment(data.url);
  425.                     } else if (data.action === 'redirect') {
  426.                         window.location.href = data.url;
  427.                     } else if (data.action === 'error') {
  428.                         alert(data.message);
  429.                         submitButton.removeAttribute("disabled");
  430.                         submitButton.querySelector(".spinner").style.display = "none";
  431.                     } else {
  432.                         alert('Nous sommes désolés, une erreur est survenue lors de la prise de votre réservation, nous avons besoin que vous recommenciez.');
  433.                         submitButton.removeAttribute("disabled");
  434.                         submitButton.querySelector(".spinner").style.display = "none";
  435.                         // window.location.reload();
  436.                     }
  437.                 },
  438.                 error: function (data) {
  439.                     alert(data);
  440.                 }
  441.             });
  442.         }
  443.     </script>
  444. {% endblock %}