templates/pages/ddd.html.twig line 1

Open in your IDE?
  1. {% set url = app.request.server.get('REQUEST_SCHEME') ~ '://' ~ app.request.server.get('SERVER_NAME') ~ app.request.server.get('REQUEST_URI') %}
  2. {% set cruise = cruise|default(app.request.get('croisiere') ? getCruiseById(app.request.get('croisiere')) : null) %}
  3. {% set cabinDatasTree = cabinDatasTree|default(cruise ? getCabinDatasTreeForCruise(cruise) : []) %}
  4. {% set cabinDatasTreeJson = cabinDatasTreeJson|default(cruise ? getCabinDatasTreeJsonForCruise(cruise) : []) %}
  5. {% set hasAtmospheres = hasAtmospheres|default(cruise ? cruiseHasAtmospheres(cruise) : false) %}
  6. {% block stylesheets %}
  7. <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" crossorigin=""/>
  8. {% endblock %}
  9. {% block content %}
  10. {% set countries = [] %}
  11. {% set drinks_packages = [] %}
  12. {% set segments = (cruise.itinerary.itinerarySegments|default([])) %}
  13. {% set atmospheres = [] %}
  14. {% set pathImage = '/img/photos-temporaires/cruise/' %}
  15. {# Utiliser cruise depuis le controller #}
  16. {% set nb_days = cruise.itinerary.numberOfDays|default(1) %}
  17. {# Calcul des dates de départ et d'arrivée #}
  18. {% set departure_date = cruise.date|default('') %}
  19. {% set arrival_date = '' %}
  20. {% set departurePort = get_departure_port(cruise.itinerary).name|default('') %}
  21. {% set arrivalPort = get_arrival_port(cruise.itinerary).name|default(departurePort) %}
  22. <div id="loader-wrapper" class="loader-container">
  23. <div class="loader"></div>
  24. </div>
  25. {% set services = [] %}
  26. {% set dddI18n = {
  27. step_names: {
  28. '1': 'ddd.step.type'|trans,
  29. '2': 'ddd.step.atmosphere'|trans,
  30. '3': 'ddd.step.cabin'|trans,
  31. '4': 'ddd.step.quote'|trans,
  32. '5': 'ddd.js.step_confirmation'|trans,
  33. },
  34. step_title: {
  35. type: 'ddd.step_title.type'|trans,
  36. atmosphere: 'ddd.step_title.atmosphere'|trans,
  37. selection: 'ddd.step_title.selection'|trans,
  38. quote: 'ddd.step_title.quote'|trans,
  39. },
  40. choose_cabin_type: 'ddd.choose_cabin_type'|trans,
  41. choose_atmosphere: 'ddd.choose_atmosphere'|trans,
  42. atmosphere_no_available: 'ddd.atmosphere.no_available'|trans,
  43. atmosphere_title_short: 'ddd.atmosphere.title_short'|trans,
  44. validate_choice: 'ddd.validate_choice'|trans,
  45. accessibility: {
  46. step_1: 'ddd.accessibility.step_1'|trans,
  47. step_2: 'ddd.accessibility.step_2'|trans,
  48. step_3: 'ddd.accessibility.step_3'|trans,
  49. step_4: 'ddd.accessibility.step_4'|trans,
  50. confirmation: 'ddd.accessibility.confirmation'|trans,
  51. reservation_progress: 'ddd.accessibility.reservation_progress'|trans,
  52. },
  53. js: {
  54. unknown: 'ddd.js.unknown'|trans,
  55. cabin_fallback: 'ddd.js.cabin_fallback'|trans,
  56. atmosphere_fallback: 'ddd.js.atmosphere_fallback'|trans,
  57. parent_benefits_single: 'ddd.js.parent_benefits_single'|trans,
  58. parent_benefits_multiple: 'ddd.js.parent_benefits_multiple'|trans,
  59. quote_error: 'ddd.js.quote_error'|trans,
  60. copy_file_error: 'ddd.js.copy_file_error'|trans,
  61. copy_file_manual: 'ddd.js.copy_file_manual'|trans,
  62. copy_error_manual: 'ddd.js.copy_error_manual'|trans,
  63. copy_success: 'ddd.js.copy_success'|trans,
  64. pdf_no_data: 'ddd.js.pdf_no_data'|trans,
  65. cabin_details_title: 'ddd.js.cabin_details_title'|trans,
  66. step_fallback: 'ddd.js.step_fallback'|trans,
  67. surface_label: 'ddd.cabin_characteristics.surface_label'|trans,
  68. deck_label: 'ddd.cabin_characteristics.decks'|trans,
  69. },
  70. } %}
  71. <div
  72. class="content container-fluid cruise-container"
  73. data-ddd-i18n="{{ dddI18n|json_encode|e('html_attr') }}"
  74. data-ddd-lazy="1"
  75. data-cruise-id="{{ cruise.id|default('') }}"
  76. data-has-atmospheres="{{ hasAtmospheres ? '1' : '0' }}"
  77. data-cabin-datas-tree='{{ cabinDatasTreeJson|json_encode(constant('JSON_UNESCAPED_UNICODE'))|e('html_attr') }}'>
  78. <div class="col-right">
  79. <h1 class="text-xl-bd color-secondary-dark">{{ 'ddd.trip_summary'|trans }}</h1>
  80. <div class="ddd-aside">
  81. {% include 'pages/_includes/ddd/_summary.html.twig' with {
  82. cruise: cruise,
  83. itinerary: cruise.itinerary,
  84. company: company|default(null),
  85. hasAtmospheres: hasAtmospheres,
  86. companyLogoUrl: companyLogoUrl|default(null),
  87. shipMainImageUrl: shipMainImageUrl|default(null),
  88. } %}
  89. </div>
  90. </div>
  91. <div
  92. class="col-left">
  93. {# ---------- Fil du parcours ---------- #}
  94. <div class="thread">
  95. {# Retour desktop uniquement — mobile : #mobile-back-btn #}
  96. <button id="btn-back" type="button" class="btn medium style2 transparent-white text-md-sbd thread-back-desktop">
  97. <div class="icon">{{ getLucidIcon('arrow-left') }}</div>
  98. <span>{{ 'common.back'|trans }}</span>
  99. </button>
  100. <div class="mobile-thread">
  101. <div class="mobile-thread-nav">
  102. <button type="button" class="mobile-back-btn" id="mobile-back-btn" aria-label="{{ 'common.back'|trans }}">
  103. <div class="icon">{{ getLucidIcon('arrow-left') }}</div>
  104. </button>
  105. <div class="step-name" id="mobile-step-name">{{ 'ddd.step.type'|trans }}</div>
  106. <div class="step-number" id="mobile-step-number">1/{{ hasAtmospheres ? 4 : 3 }}</div>
  107. </div>
  108. <button type="button" class="mobile-recap-btn" id="mobile-recap-btn">
  109. {{ 'ddd.mobile.recap_full'|trans }}
  110. </button>
  111. </div>
  112. <div id="reservation-thread" class="" data-visible-steps="{{ hasAtmospheres ? 4 : 3 }}">
  113. <div id="reservation-step-1" class="current" data-logical-step="1">
  114. <div class="icon br2">{{ getLucidIcon('ratio') }}</div>
  115. <div class="step step br1 text-xs-md color-secondary-dark">{{ 'ddd.step.type'|trans }}</div>
  116. </div>
  117. {% if hasAtmospheres %}
  118. <div id="reservation-step-2" class="" data-logical-step="2">
  119. <div class="icon br2">{{ getLucidIcon('sparkle') }}</div>
  120. <div class="step br1 text-xs-md color-secondary-dark">{{ 'ddd.step.atmosphere'|trans }}</div>
  121. </div>
  122. {% endif %}
  123. <div id="reservation-step-3" class="" data-logical-step="3">
  124. <div class="icon br2">{{ getLucidIcon('bed-double') }}</div>
  125. <div class="step br1 text-xs-md color-secondary-dark">{{ 'ddd.step.cabin'|trans }}</div>
  126. </div>
  127. <div id="reservation-step-4" class="" data-logical-step="4">
  128. <div class="icon br2">{{ getLucidIcon('file-text') }}</div>
  129. <div class="step br1 text-xs-md color-secondary-dark">{{ 'ddd.step.quote'|trans }}</div>
  130. </div>
  131. </div>
  132. </div>
  133. <div id="ddd-step-title-icons" hidden aria-hidden="true">
  134. <span data-step="1">{{ getLucidIcon('ratio') }}</span>
  135. <span data-step="2">{{ getLucidIcon('sparkle') }}</span>
  136. <span data-step="3">{{ getLucidIcon('bed-double') }}</span>
  137. <span data-step="4">{{ getLucidIcon('file-text') }}</span>
  138. </div>
  139. <h2 id="step-title" class="step-title text-xl-bd color-secondary-dark">
  140. <span class="step-title__leading" aria-hidden="true">{{ getLucidIcon('ratio') }}</span>
  141. <span class="step-title__text">{{ 'ddd.step_title.type'|trans }} </span>
  142. <select name="select_cabin_type" class="select-cabin-type">
  143. <option disabled selected value="">{{ 'ddd.choose_cabin_type'|trans|default('Choisissez un type de cabine') }}</option>
  144. {% for cabinTypeNode in cabinDatasTree %}
  145. {% for subTypeNode in cabinTypeNode.cabinSubTypes|default([]) %}
  146. <option value="{{ subTypeNode.cabinSubType.id }}">{{ subTypeNode.cabinSubType.name }}</option>
  147. {% endfor %}
  148. {% endfor %}
  149. </select>
  150. <select name="select_atmosphere" class="select-atmosphere"{% if not hasAtmospheres %} hidden{% endif %}>
  151. <option disabled selected value="">{{ 'ddd.choose_atmosphere'|trans }}</option>
  152. </select>
  153. </h2>
  154. <div class="ddd-main">
  155. {# ---------- Étape 1 : choix du type de cabine ---------- #}
  156. <div id="step-type" class="ddd-step-panel is-active">
  157. <div class="ddd-step-loader text-sm-md color-grey-text" aria-live="polite">
  158. {{ 'common.loading'|trans|default('Chargement...') }}
  159. </div>
  160. </div>
  161. {# ---------- Étape 2 : choix de l'ambiance (si applicable) ---------- #}
  162. {% if hasAtmospheres %}
  163. <div id="step-atmosphere" class="ddd-step-panel">
  164. <div class="ddd-step-loader text-sm-md color-grey-text" aria-live="polite">
  165. {{ 'common.loading'|trans|default('Chargement...') }}
  166. </div>
  167. </div>
  168. {% endif %}
  169. {# ---------- Étape 3 : choix de la cabine ---------- #}
  170. <div id="step-subtype" class="ddd-step-panel">
  171. <div class="ddd-step-loader text-sm-md color-grey-text" aria-live="polite">
  172. {{ 'common.loading'|trans|default('Chargement...') }}
  173. </div>
  174. </div>
  175. {# ---------- Étape 4 : formulaire de demande de devis ---------- #}
  176. <div id="step-quote-form" class="ddd-step-panel">
  177. <div class="ddd-step-loader text-sm-md color-grey-text" aria-live="polite">
  178. {{ 'common.loading'|trans|default('Chargement...') }}
  179. </div>
  180. </div>
  181. {# ---------- Confirmation après envoi du devis ---------- #}
  182. <div id="step-quote-summary" style="display: none;">
  183. {% include 'pages/_includes/ddd/_quote_summary.html.twig' %}
  184. </div>
  185. </div>
  186. </div>
  187. </div>
  188. {# <div class="validation" style="">
  189. <div class="floa">
  190. {{ 'ddd.pay_in_installments'|trans }}
  191. <img src="https://www.croisiland.com/_imgs/floa/4X-bleu.svg?1710340929" alt="FLOA"/>
  192. </div>
  193. <div class="total-amount">
  194. <div class="final-price amount">
  195. <span></span>{{ 'common.per_person_short'|trans }}
  196. </div>
  197. <button class="btn medium style5 disabled" disabled>{{ 'ddd.validate_choice'|trans }}</button>
  198. </div>
  199. </div> #}
  200. {% endblock %}