templates/prestations/prestations.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block title %}Consultations Tarots Téléphone, Visio, Email, Domicile | Les Ailes Dorées{% endblock %}
  3. {% block metas %}
  4. <meta name="title" content="Consultations Tarots Téléphone, Visio, Email, Domicile | Les Ailes Dorées">
  5. <meta name="description" content="Je vous propose trois types de consultations de tarots selon vos besoins et votre budget : consulation rapide de 1 heure, consultation 1 question de 30 minutes, et une consultation complète de 3 heures. A mon domicile ou au votre dans l'Allier, ou par téléphone, e-mail, fichier audio, visio conférence.">
  6. {% endblock %}
  7. {% block stylesheets %}
  8. {{ parent() }}
  9. {{ encore_entry_link_tags('prestation_page') }}
  10. {% endblock %}
  11. {% block body %}
  12. {% include '/partials/header.html.twig' with {'current_page':'prestations'} %}
  13. <!-- Main Content -->
  14. <main class="main-content app_prestation">
  15. <div class="tm-section contact-area tm-padding-section">
  16. <div class="container position-relative">
  17. <div class="row">
  18. <div class="col-lg-12">
  19. <h2 class="text-yellow text-uppercase">Prestations</h2>
  20. <form action="{{path('app_appointment')}}" method="GET">
  21. <div class="accordion" id="prestationAccordion">
  22. {% for cat in categories %}
  23. {% if cat.valid %}
  24. <div class="accordion-item">
  25. <h2 class="accordion-header" id="heading{{cat.id}}">
  26. <button class="accordion-button my-categorie" type="button" data-bs-toggle="collapse" data-bs-target="#{{cat.slug}}" aria-expanded="false" aria-controls="{{cat.slug}}">
  27. {{cat.nom}}
  28. </button>
  29. </h2>
  30. <div id="{{cat.slug}}" class="accordion-collapse collapse" aria-labelledby="heading{{cat.id}}" data-bs-parent="#prestationAccordion">
  31. <div class="accordion-body">
  32. <a href="{{ path('app_prestations_category_details', {'id': cat.id}) }}"
  33. class="tm-button tm-button-yellow text-yellow">En savoir plus</a>
  34. <!-- PRESTATION ITEM DETAILS -->
  35. <div class="accordion" id="prestationDetails{{cat.id}}Accordion">
  36. {% for prest in cat.prestations|sort((a, b) => a.ordre <=> b.ordre) %} {% if prest.valid %}
  37. <div class="accordion-item accordion-item--sub">
  38. <h2 class="accordion-header" id="prestationDetailsHeading{{prest.id}}">
  39. <button class="accordion-button my-prestation py-2" type="button" data-bs-toggle="collapse" data-bs-target="#prestationDetailsCollapse{{prest.id}}" aria-expanded="{% if loop.index0 == 0 %}true{% else %}false{% endif %}" aria-controls="prestationDetailsCollapse{{prest.id}}" data-prestation-id={{prest.id}}>
  40. <div class="d-block">
  41. <span>{{prest.nom}} </span>
  42. <div>({{prest.prix | number_format(2, ',', ' ') }} €)</div>
  43. </div>
  44. </button>
  45. </h2>
  46. <div id="prestationDetailsCollapse{{prest.id}}" class="accordion-collapse collapse {% if loop.index0 == 0 %}show{% endif %}" aria-labelledby="prestationDetailsHeading{{prest.id}}" data-bs-parent="#prestationDetails{{cat.id}}Accordion">
  47. <div class="accordion-body">
  48. <div class="row">
  49. <div class="col-lg-5">
  50. {# <p>Une question, un domaine de vie, un bilan : un jeu complet et précis C'est la consultation la plus c...</p> #}
  51. {% for type in prest.types %}
  52. {% if type.statut == 1 %}
  53. <div class="form-check">
  54. <input class="form-check-input" type="radio" name="typeConsultation{{prest.id}}" id="typeConsultation{{type.id}}" {% if loop.index0 == 0 %}checked {% endif %} value="{{type.typeConsultation.id}}">
  55. <label class="form-check-label" for="typeConsultation{{type.id}}">
  56. {{type.typeConsultation.nom}} {% if type.typeConsultation.description %} ({{type.typeConsultation.description}}) {% endif %}
  57. </label>
  58. </div>
  59. {% endif %}
  60. {% endfor %}
  61. </div>
  62. <div class="col-lg-7">
  63. <ul class="list-group">
  64. {% for opt in prest.options %} {% if opt.valid %}
  65. <li class="list-group-item">
  66. <div>
  67. <span>{{opt.nom}}</span>
  68. <div>{% if (opt.prix and opt.prix > 0) %}{{opt.prix | number_format(2, ',', ' ') }} € {% endif %}</div>
  69. </div>
  70. <div>
  71. <div class="form-check">
  72. <input class="form-check-input my-option prestationDetailsCollapse{{prest.id}}" name="prestationDetailsCollapseFlexCheckDefault{{prest.id}}" type="checkbox" id="prestationDetailsCollapseFlexCheckDefault{{opt.id}}" value="{{opt.id}}" {% if opt.defaut %}checked{% endif %} {% if prest.nbMax and prest.nbMax > 0 %} onchange="checkMax({{prest.nbMax}}, 'prestationDetailsCollapse{{prest.id}}')" {% endif %}>
  73. <label class="form-check-label" for="prestationDetailsCollapseFlexCheckDefault{{opt.id}}">
  74. </label>
  75. </div>
  76. </div>
  77. {% if opt.avecChoix %}
  78. <div class="d-flex align-items-center flex-wrap atelier-wrapper" id="atelier-wrapper-{{opt.id}}">
  79. {% for i in opt.debutChoix..(opt.debutChoix + opt.nbrChoix - 1) %}
  80. <button type="button" data-numero="{{i}}" class="option-atelier tm-button tm-button-yellow mt-30 {% if i == opt.debutChoix %}active{% endif %}" style="margin-right: 8px;">Atelier {{i}}</button>
  81. {% endfor %}
  82. </div>
  83. {% endif %}
  84. </li>
  85. {% endif %} {% endfor %}
  86. </ul>
  87. </div>
  88. </div>
  89. </div>
  90. </div>
  91. </div>
  92. {% endif %} {% endfor %}
  93. </div>
  94. <!-- PRESTATION ITEM DETAILS -->
  95. </div>
  96. </div>
  97. </div>
  98. {% endif %}
  99. {% endfor %}
  100. </div>
  101. <div class="d-flex align-items-center justify-content-center py-4">
  102. <button type="submit" id="take-appointment-btn" class="tm-button tm-button-yellow active button--loading d-flex align-items-center">
  103. <span>Prendre un rendez-vous</span>
  104. <div class="spinner-border ms-2 my-spinner d-none" role="status">
  105. <span class="sr-only">Chargement...</span>
  106. </div>
  107. </button>
  108. </div>
  109. </form>
  110. </div>
  111. </div>
  112. </div>
  113. </main>
  114. <!--// Main Content -->
  115. {% endblock %}
  116. {% block javascripts %}
  117. {{ parent() }}
  118. <script>
  119. function expandPrestation(){
  120. if (location.hash !== null && location.hash !== "") {
  121. let sectionToExpand = location.hash;
  122. const section = document.querySelector(sectionToExpand);
  123. console.log(section);
  124. if (section) {
  125. const collapse = new bootstrap.Collapse(section, { parent: '#prestationAccordion' });
  126. collapse.show();
  127. section.scrollIntoView({ behavior: "smooth", block: 'center' });
  128. }
  129. }
  130. }
  131. expandPrestation();
  132. window.addEventListener('hashchange', () => {
  133. expandPrestation();
  134. }, false);
  135. var classLoad = '.my-spinner';
  136. function load(btn, is = true){
  137. if(is){
  138. $(btn).find(classLoad).removeClass('d-none');
  139. } else{
  140. $(btn).find(classLoad).addClass('d-none');
  141. }
  142. $(btn).attr('disabled', is);
  143. }
  144. $(document).ready(function () {
  145. const error = () => {
  146. alert('Choisissez une prestation');
  147. }
  148. $('#take-appointment-btn').click(function (e){
  149. e.preventDefault();
  150. let ariaControlsCat = $('.my-categorie[aria-expanded="true"]').attr('aria-controls');
  151. if(!ariaControlsCat){
  152. return error();
  153. }
  154. let prestationId = $(`#${ariaControlsCat} .my-prestation[aria-expanded="true"]`).data('prestationId');
  155. if(!prestationId){
  156. return error();
  157. }
  158. let typeConsultationId = $(`input[name="typeConsultation${prestationId}"]:checked`).val();
  159. if(!typeConsultationId){
  160. alert('Choisissez la type de consultation');
  161. }
  162. let options = [];
  163. $(`#prestationDetailsCollapse${prestationId} input.my-option:checked`).each(function (){
  164. const opt = {id: $(this).val()};
  165. const numero = $('#atelier-wrapper-'+opt.id+' .option-atelier.active').data('numero');
  166. opt.numero = numero ?? null;
  167. options.push(opt);
  168. });
  169. console.log('prestationId', prestationId);
  170. console.log('typeConsultationId', typeConsultationId);
  171. console.log('options', options);
  172. let params = {prestationId, typeConsultationId, options};
  173. let request = $.ajax({
  174. url: "{{path('app_take_appointment')}}",
  175. type: 'POST',
  176. data : JSON.stringify(params),
  177. contentType: 'application/json; charset=utf-8',
  178. dataType: "json"
  179. });
  180. let btn = $(this);
  181. request.done(function(data) {
  182. load(btn, false);
  183. console.log(data);
  184. let pathname = "{{path('app_take_appointment_step_1', {id: 'reservationId'})}}";
  185. window.location.pathname = pathname.replace('reservationId', data.reservationId);
  186. });
  187. request.fail(function(jqXHR, textStatus) {
  188. load(btn, false);
  189. let data = jqXHR.responseJSON;
  190. alert('Erreur: '+data.message);
  191. });
  192. load(btn);
  193. });
  194. const optionsDOM = $('.my-option');
  195. const blockAvecChoixDOM = $('#block-avec-choix');
  196. function openChoix(target = null){
  197. target = target ?? optionsDOM;
  198. $(target).each(function (){
  199. const block = $('#atelier-wrapper-'+$(this).val());
  200. /*if($(this).is(':checked')){
  201. $(block).removeClass('d-none');
  202. } else{
  203. $(block).addClass('d-none');
  204. }*/
  205. })
  206. }
  207. $(optionsDOM).change(function (e){
  208. openChoix(e.target);
  209. });
  210. $('.option-atelier').click(function (){
  211. $(this).siblings().removeClass('active');
  212. $(this).addClass('active');
  213. });
  214. openChoix();
  215. });
  216. function checkMax(max, className){
  217. if(max && max > 0){
  218. let casesCochees = document.querySelectorAll('.'+className);
  219. let nombreCasesCochees = 0;
  220. // Parcourez les cases à cocher et comptez celles qui sont cochées
  221. for (let i = 0; i < casesCochees.length; i++) {
  222. if (casesCochees[i].checked) {
  223. nombreCasesCochees++;
  224. if(nombreCasesCochees > max) {
  225. casesCochees [i].checked = false;
  226. alert("Vous ne pouvez pas choisir plus de " + max + " option(s).");
  227. break;
  228. }
  229. }
  230. }
  231. }
  232. }
  233. </script>
  234. {% endblock %}