templates/pages/list.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block page_class %}
  3. page list
  4. {% endblock %}
  5. {% set url = app.request.server.get('REQUEST_SCHEME') ~ '://' ~ app.request.server.get('SERVER_NAME') ~ app.request.server.get('REQUEST_URI') %}
  6. {% block stylesheets %}
  7. {{parent()}}
  8. {{ encore_entry_link_tags('list_styles') }}
  9. {# Leaflet chargé à la demande à l'ouverture de la modale carte (initModalLeaflet)
  10. <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" crossorigin=""/>
  11. #}
  12. {% endblock %}
  13. {# Simulation de pagination #}
  14. {# {% set cruisesPerPage = 8 %}
  15. {% set totalCruises = croisieres|length %}
  16. {% set totalPages = (totalCruises / cruisesPerPage)|round(0, 'ceil') %}
  17. {% set currentPage = 1 %}
  18. {% set pageRange = 3 %} #}{% block header_search %}
  19. {# Page liste : pas de barre de recherche #}
  20. {% endblock %}
  21. {% block header_search_mobile %}
  22. {# Page liste : pas de barre de recherche #}
  23. {% endblock %}
  24. {% block content %}
  25. {# Tri des navires #}
  26. {# {% set navires_top = navires|filter(n => n.top == 1) %}
  27. {% set navires_rest = navires|filter(n => n.top != 1) %}
  28. {% set sorted_navires = navires_top|merge(navires_rest) %} #}
  29. {# {% set cruises_number = companiesDatas|reduce((carry, company) => carry + (company.cruises|length), 0) %} #}
  30. {% set cruises_number = cruiseSearchResult.pagination.total_count|default(0) %}
  31. {# Fil d'Ariane #}
  32. <div class="container-fluid">
  33. <div class="row">
  34. <div class="col-lg-1 col-md-1 col-sm-12 list-page-gutter" aria-hidden="true"></div>
  35. <div class="col-lg-10 col-md-10 col-sm-12 list-page-main">
  36. {% set destinationData = null %}
  37. {% set companyData = null %}
  38. {% set destinationId = app.request.query.get('destination') %}
  39. {% set companyId = app.request.query.get('company') %}
  40. {% if destinationId is not null and destinationId is not empty %}
  41. {% set destination = getDestinationById(destinationId + 0) %}
  42. {% if destination %}
  43. {% set destinationData = { name: destination.name, url: '/croisieres?destination=' ~ destinationId } %}
  44. {% endif %}
  45. {% endif %}
  46. {% if companyId is not null and companyId is not empty %}
  47. {% set company = getCompanyById(companyId + 0) %}
  48. {% if company %}
  49. {% set companyData = { name: company.name, url: '/croisieres?company=' ~ companyId } %}
  50. {% endif %}
  51. {% endif %}
  52. {% include 'pages/_includes/_breadcrumb.html.twig' with {
  53. destination: destinationData,
  54. company: companyData
  55. } %}
  56. </div>
  57. <div class="col-lg-1 col-md-1 col-sm-12 list-page-gutter" aria-hidden="true"></div>
  58. </div>
  59. </div>
  60. <div class="container-fluid mb-5">
  61. <div class="row">
  62. <div class="col-lg-1 col-md-1 col-sm-12 list-page-gutter" aria-hidden="true"></div>
  63. <div class="col-lg-10 col-md-10 col-sm-12 list-page-main">
  64. <div id="title">
  65. {% block seo %}
  66. {% if searchMainSubjectInfos.subject is defined and searchMainSubjectInfos.subject is not empty %}
  67. {% include 'pages/_includes/list/seo_templates/_' ~ searchMainSubjectInfos.template ~ '.html.twig' with { content: searchMainSubjectInfos.subject } %}
  68. {% else%}
  69. {% include 'pages/_includes/list/seo_templates/_seo_default.html.twig' %}
  70. {% endif %}
  71. {% endblock %}
  72. </div>
  73. <div class="content layout container-fluid px-0">
  74. {% set filters = {
  75. 'ships' : [],
  76. 'companies' : [],
  77. 'destinations' : [],
  78. 'ports' : [],
  79. 'durations' : [],
  80. 'sort' : null,
  81. 'number_of_cruises' : 0
  82. }%}
  83. <div class="row">
  84. <div id="filters" class="col-lg-3 col-md-4 col-sm-12" data-search-url="{{ searchUrl|default(app.request.uri) }}">
  85. {% include 'pages/_includes/list/_filters.html.twig' %}
  86. </div>
  87. <div id="list" class="col-lg-9 col-md-8 col-sm-12">
  88. {% block tags %}
  89. {% include 'pages/_includes/list/_super-tags.html.twig' %}
  90. {% endblock %}
  91. <div class="tag_by_mobile mobile">
  92. <div class="tag_by accordion">
  93. <button class="tagBy accordion-trigger">
  94. <span>{{ 'list.sort.label'|trans }}</span>
  95. <div class="icon">{{ getLucidIcon('arrow-down-wide-narrow') }}</div>
  96. </button>
  97. <ul
  98. class=" br1 accordion-content"
  99. data-sort-label-date-desc="{{ 'list.sort.date_desc'|trans|e('html_attr') }}"
  100. data-sort-label-date-asc="{{ 'list.sort.date_asc'|trans|e('html_attr') }}"
  101. data-sort-label-price-asc="{{ 'list.sort.price_asc'|trans|e('html_attr') }}"
  102. data-sort-label-price-desc="{{ 'list.sort.price_desc'|trans|e('html_attr') }}"
  103. data-sort-label-duration-asc="{{ 'list.sort.duration_asc'|trans|e('html_attr') }}"
  104. data-sort-label-duration-desc="{{ 'list.sort.duration_desc'|trans|e('html_attr') }}"
  105. ></ul>
  106. </div>
  107. </div>
  108. {#
  109. {% block cruises %}
  110. {% include '_snippets/mocks/card_list.html.twig' %}
  111. {% endblock %} #}
  112. {# Zone AJAX (cf. _cruise_search_ajax.js) : au filtre / pagination,
  113. seuls #cruise_results, le scroll infini et la pagination sont mis à jour. #}
  114. {% set cruise_list = cruiseSearchResult.paginated_result|default([]) %}
  115. <div class="cruise-search-zone" data-cruise-search-zone>
  116. <div
  117. id="cruise_results"
  118. class="cruises-container"
  119. {% if cruiseSearchResult.pagination is defined %}
  120. data-cruise-per-page="{{ cruiseSearchResult.pagination.per_page|default(5) }}"
  121. data-cruise-total-count="{{ cruiseSearchResult.pagination.total_count|default(0) }}"
  122. data-cruise-total-pages="{{ cruiseSearchResult.pagination.total_pages|default(1) }}"
  123. data-cruise-current-page="{{ cruiseSearchResult.pagination.current_page|default(1) }}"
  124. {% endif %}
  125. >
  126. {% if cruise_list is not empty %}
  127. {% for cruise in cruise_list %}
  128. {% set content = { isFloa: true } %}
  129. {% include '_snippets/components/cards/list_card.html.twig' with {
  130. cruise: cruise,
  131. content: content
  132. } %}
  133. {% endfor %}
  134. {% else %}
  135. {% include 'pages/_includes/list/_no_results_card.html.twig' %}
  136. {% endif %}
  137. </div>
  138. {% if cruise_list is not empty %}
  139. <div class="cruise-infinite-scroll" data-cruise-infinite-scroll aria-live="polite">
  140. <div class="cruise-infinite-scroll__sentinel" data-cruise-infinite-sentinel></div>
  141. <div class="cruise-infinite-scroll__loading" data-cruise-infinite-loading hidden>
  142. <p class="cruise-infinite-scroll__status">Chargement des croisières…</p>
  143. {% for skeletonIndex in 1..3 %}
  144. <div class="cruise-skeleton" aria-hidden="true">
  145. <div class="cruise-skeleton__media"></div>
  146. <div class="cruise-skeleton__main">
  147. <div class="cruise-skeleton__line cruise-skeleton__line--xs"></div>
  148. <div class="cruise-skeleton__line cruise-skeleton__line--title"></div>
  149. <div class="cruise-skeleton__line"></div>
  150. <div class="cruise-skeleton__line cruise-skeleton__line--md"></div>
  151. <div class="cruise-skeleton__line cruise-skeleton__line--sm"></div>
  152. </div>
  153. <div class="cruise-skeleton__aside">
  154. <div class="cruise-skeleton__price"></div>
  155. <div class="cruise-skeleton__cta"></div>
  156. </div>
  157. </div>
  158. {% endfor %}
  159. </div>
  160. <p class="cruise-infinite-scroll__end" data-cruise-infinite-end hidden>Toutes les croisières sont affichées.</p>
  161. <p class="cruise-infinite-scroll__error" data-cruise-infinite-error hidden>Impossible de charger la page suivante.</p>
  162. </div>
  163. <div class="cruise-search-paging is-visually-hidden" data-cruise-search-paging aria-hidden="true">
  164. {% include '@CroisilandCommon/pagination/_pagination.html.twig' with {
  165. 'pagination': cruiseSearchResult.pagination
  166. } %}
  167. </div>
  168. {% endif %}
  169. </div>
  170. </div>
  171. </div>
  172. </div>
  173. </div>
  174. <div class="col-lg-1 col-md-1 col-sm-12 list-page-gutter" aria-hidden="true"></div>
  175. </div>
  176. <div class="list-footer-stack" data-list-footer-stack hidden>
  177. <div class="list-page-dock" data-list-page-dock>
  178. <button type="button" class="list-page-dock__footer" data-list-dock-footer aria-expanded="false" data-label-show="{{ 'list.dock.show_footer'|trans|e('html_attr') }}" data-label-hide="{{ 'list.dock.hide_footer'|trans|e('html_attr') }}">
  179. {{ 'list.dock.show_footer'|trans }}
  180. </button>
  181. </div>
  182. <div class="list-footer-panel" data-list-footer-panel inert>
  183. <footer class="footer list-footer-panel__footer">
  184. {% include 'pages/_includes/base/_footer.html.twig' with { showFloatingActions: false } %}
  185. </footer>
  186. </div>
  187. </div>
  188. <div
  189. id="cruise-search-loader-modal"
  190. class="cruise-search-loader-modal"
  191. hidden
  192. aria-hidden="true"
  193. role="alertdialog"
  194. aria-modal="true"
  195. aria-labelledby="cruise-search-loader-title"
  196. >
  197. <div class="cruise-search-loader-modal__panel" tabindex="-1">
  198. <div class="cruise-search-loader-modal__spinner" aria-hidden="true"></div>
  199. <p id="cruise-search-loader-title" class="cruise-search-loader-modal__text">
  200. {{ 'list.search.updating'|trans }}
  201. </p>
  202. </div>
  203. </div>
  204. {% endblock %}
  205. {% block javascripts %}
  206. {{ parent() }}
  207. {{ encore_entry_script_tags('list_page') }}
  208. {# Leaflet chargé à la demande — voir initModalLeaflet (map-bundle)
  209. <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" crossorigin=""></script>
  210. #}
  211. {% endblock %}