templates/_partials/courses/_interes.html.twig line 1

Open in your IDE?
  1. {% trans_default_domain "intereses" %}
  2. {% if mostrar_boton is defined and mostrar_boton %}
  3. {% set btnColor = actividad.tieneInteres | default(false) ? 'btn-primary' : 'btn-secondary' %}
  4. {% if app.user and constant('App\\Enum\\RolEnum::EMPRESA') in app.user.roles %}
  5. {% if nombreCurso is not defined %}
  6. {% set nombreCurso = nombre[app.request.locale] | default(nombre | first) %}
  7. {% endif %}
  8. <button class="btn {{ btnColor }} mostrar-interes-empresa"
  9. data-actividad-id="{{ actividad.id }}"
  10. data-actividad-tipo="{{ actividad.tipo }}"
  11. data-curso-nombre="{{ nombreCurso }}">
  12. Mostrar interés
  13. </button>
  14. {% else %}
  15. <button class="btn {{ btnColor }} mostrar-interes"
  16. data-actividad-id="{{ actividad.id }}"
  17. data-actividad-tipo="{{ actividad.tipo }}">
  18. {{ "course.action.show_interest"|trans({}, "courses") }}
  19. </button>
  20. {% endif %}
  21. {% endif %}
  22. <script>
  23. document.addEventListener('DOMContentLoaded', function() {
  24. // Inicializar botón de interés para la actividad {{ actividad.tipo }}-{{ actividad.id }}
  25. const interesBtn = document.querySelector('[data-actividad-id="{{ actividad.id }}"][data-actividad-tipo="{{ actividad.tipo }}"].curso-interes, [data-actividad-id="{{ actividad.id }}"][data-actividad-tipo="{{ actividad.tipo }}"].mostrar-interes');
  26. const interesEmpresaBtn = document.querySelector('[data-actividad-id="{{ actividad.id }}"][data-actividad-tipo="{{ actividad.tipo }}"].mostrar-interes-empresa');
  27. if (interesBtn) {
  28. interesBtn.addEventListener('click', function(e) {
  29. e.preventDefault();
  30. {% if app.user %}
  31. // Usuario registrado: manejar con AJAX
  32. toggleInteres(interesBtn);
  33. {% else %}
  34. // Usuario no registrado: mostrar modal para recoger datos
  35. mostrarModalRegistroInteres(interesBtn);
  36. {% endif %}
  37. });
  38. }
  39. if (interesEmpresaBtn) {
  40. interesEmpresaBtn.addEventListener('click', function(e) {
  41. e.preventDefault();
  42. mostrarModalSeleccionEmpleados(interesEmpresaBtn, 'mostrarInteres');
  43. });
  44. }
  45. /**
  46. * Función para alternar el estado de interés de un curso (usuario registrado)
  47. *
  48. * @param {HTMLElement} button Botón de interés
  49. */
  50. function toggleInteres(button) {
  51. const actividadId = button.dataset.actividadId;
  52. const actividadTipo = button.dataset.actividadTipo;
  53. // URL del endpoint
  54. const url = `/${document.documentElement.lang}/courses/ajax/interes/${actividadTipo}/${actividadId}`;
  55. // Petición AJAX
  56. fetch(url, {
  57. method: 'POST',
  58. headers: {
  59. 'X-Requested-With': 'XMLHttpRequest',
  60. 'Content-Type': 'application/json'
  61. },
  62. credentials: 'same-origin'
  63. })
  64. .then(response => {
  65. if (!response.ok) {
  66. if (response.status === 403) {
  67. // Redirigir al login si no está autenticado
  68. window.location.href = `/${document.documentElement.lang}/login`;
  69. return Promise.reject('Redirect to login');
  70. }
  71. return Promise.reject(`Error: ${response.status}`);
  72. }
  73. return response.json();
  74. })
  75. .then(data => {
  76. if (data.success) {
  77. // Cambiar la clase del botón según el nuevo estado
  78. if (data.tieneInteres) {
  79. button.classList.add('active');
  80. // Si es un botón de "Mostrar interés", cambiar su clase
  81. if (button.classList.contains('mostrar-interes')) {
  82. button.classList.remove('btn-secondary');
  83. button.classList.add('btn-primary');
  84. }
  85. AlertUtils.success("{{ 'title.alert.interes' | trans }}", "{{ 'message.alert.interes_checked' | trans }}");
  86. } else {
  87. button.classList.remove('active');
  88. // Si es un botón de "Mostrar interés", cambiar su clase
  89. if (button.classList.contains('mostrar-interes')) {
  90. button.classList.remove('btn-primary');
  91. button.classList.add('btn-secondary');
  92. }
  93. AlertUtils.success("{{ 'title.alert.interes' | trans }}", "{{ 'message.alert.interes_unchecked' | trans }}");
  94. }
  95. }
  96. })
  97. .catch(error => {
  98. console.error('Error:', error);
  99. });
  100. }
  101. /**
  102. * Función para mostrar modal de registro de interés (usuario no registrado)
  103. *
  104. * @param {HTMLElement} button Botón de interés
  105. */
  106. function mostrarModalRegistroInteres(button) {
  107. const actividadId = button.dataset.actividadId;
  108. const actividadTipo = button.dataset.actividadTipo;
  109. var lang = `${document.documentElement.lang}`;
  110. // Comprobar si ya existe un modal o crearlo
  111. let modalId = 'modalInteres' + actividadTipo + actividadId;
  112. let modal = document.getElementById(modalId);
  113. if (!modal) {
  114. // Crear el modal si no existe
  115. modal = document.createElement('div');
  116. modal.id = modalId;
  117. modal.className = 'modal';
  118. modal.setAttribute('role', 'dialog');
  119. if(lang === "ca"){
  120. modal.innerHTML = `
  121. <div class="modal-dialog" role="document">
  122. <div class="modal-content">
  123. <div class="modal-header">
  124. <h5 class="modal-title">Mostrar interès en aquesta activitat.</h5>
  125. <button type="button" class="close action-close" aria-label="Close">
  126. <span aria-hidden="true">&times;</span>
  127. </button>
  128. </div>
  129. <div class="modal-body">
  130. <form id="formInteres${actividadTipo}${actividadId}">
  131. <div class="form-group">
  132. <label for="nombre">Nom complet</label>
  133. <input type="text" class="form-control" id="nombre" name="nombre" required>
  134. </div>
  135. <div class="form-group">
  136. <label for="email">Correu electrònic</label>
  137. <input type="email" class="form-control" id="email" name="email" required>
  138. </div>
  139. <div class="form-group">
  140. <label for="telefono">Telèfon</label>
  141. <input type="tel" class="form-control" id="telefono" name="telefono" required>
  142. </div>
  143. <div class="form-group">
  144. <label for="dni">DNI</label>
  145. <input type="text" class="form-control" id="dni" name="dni" required>
  146. </div>
  147. <div class="form-group">
  148. <label for="comentario">Comentari (opcional)</label>
  149. <textarea class="form-control" id="comentario" name="comentario" rows="3"></textarea>
  150. </div>
  151. </form>
  152. </div>
  153. <div class="modal-footer">
  154. <button type="button" class="btn btn-secondary cancel-modal">Cancelar</button>
  155. <button type="button" class="btn btn-primary action-save btnEnviarInteres" data-form="formInteres${actividadTipo}${actividadId}" data-actividad-id="${actividadId}" data-actividad-tipo="${actividadTipo}">Enviar</button>
  156. </div>
  157. </div>
  158. </div>
  159. `;
  160. }
  161. if(lang === "es"){
  162. modal.innerHTML = `
  163. <div class="modal-dialog" role="document">
  164. <div class="modal-content">
  165. <div class="modal-header">
  166. <h5 class="modal-title">Mostrar interés en esta actividad</h5>
  167. <button type="button" class="close action-close" aria-label="Close">
  168. <span aria-hidden="true">&times;</span>
  169. </button>
  170. </div>
  171. <div class="modal-body">
  172. <form id="formInteres${actividadTipo}${actividadId}">
  173. <div class="form-group">
  174. <label for="nombre">Nombre completo</label>
  175. <input type="text" class="form-control" id="nombre" name="nombre" required>
  176. </div>
  177. <div class="form-group">
  178. <label for="email">Email</label>
  179. <input type="email" class="form-control" id="email" name="email" required>
  180. </div>
  181. <div class="form-group">
  182. <label for="telefono">Teléfono</label>
  183. <input type="tel" class="form-control" id="telefono" name="telefono" required>
  184. </div>
  185. <div class="form-group">
  186. <label for="dni">DNI</label>
  187. <input type="text" class="form-control" id="dni" name="dni" required>
  188. </div>
  189. <div class="form-group">
  190. <label for="comentario">Comentario (opcional)</label>
  191. <textarea class="form-control" id="comentario" name="comentario" rows="3"></textarea>
  192. </div>
  193. </form>
  194. </div>
  195. <div class="modal-footer">
  196. <button type="button" class="btn btn-secondary cancel-modal">Cancelar</button>
  197. <button type="button" class="btn btn-primary action-save btnEnviarInteres" data-form="formInteres${actividadTipo}${actividadId}" data-actividad-id="${actividadId}" data-actividad-tipo="${actividadTipo}">Enviar</button>
  198. </div>
  199. </div>
  200. </div>
  201. `;
  202. }
  203. document.body.appendChild(modal);
  204. // Agregar evento al botón de enviar del modal
  205. const btnEnviar = modal.querySelector('.btnEnviarInteres');
  206. btnEnviar.addEventListener('click', function() {
  207. enviarInteresNoRegistrado(this);
  208. });
  209. // Agregar evento al botón de cancelar y cerrar del modal
  210. const btnCerrar = modal.querySelector('.close');
  211. btnCerrar.addEventListener('click', function() {
  212. modal.style.display = 'none';
  213. document.body.classList.remove('modal-open');
  214. // Eliminar cualquier backdrop que pudiera haber
  215. const backdrop = document.querySelector('.modal-backdrop');
  216. if (backdrop) {
  217. backdrop.parentNode.removeChild(backdrop);
  218. }
  219. });
  220. const btnCancelar = modal.querySelector('.cancel-modal');
  221. btnCancelar.addEventListener('click', function() {
  222. modal.style.display = 'none';
  223. document.body.classList.remove('modal-open');
  224. // Eliminar cualquier backdrop que pudiera haber
  225. const backdrop = document.querySelector('.modal-backdrop');
  226. if (backdrop) {
  227. backdrop.parentNode.removeChild(backdrop);
  228. }
  229. });
  230. }
  231. // Mostrar el modal manualmente sin Bootstrap
  232. modal.style.display = 'block';
  233. document.body.classList.add('modal-open');
  234. // Crear backdrop manualmente
  235. let backdrop = document.querySelector('.modal-backdrop');
  236. if (!backdrop) {
  237. backdrop = document.createElement('div');
  238. backdrop.className = 'modal-backdrop in';
  239. document.body.appendChild(backdrop);
  240. }
  241. // Añadir clase para que la animación funcione
  242. setTimeout(() => {
  243. modal.classList.add('in');
  244. }, 50);
  245. }
  246. /**
  247. * Función para enviar interés de usuario no registrado
  248. *
  249. * @param {HTMLElement} button Botón de enviar interés
  250. */
  251. function enviarInteresNoRegistrado(button) {
  252. const actividadId = button.dataset.actividadId;
  253. const actividadTipo = button.dataset.actividadTipo;
  254. const formId = button.dataset.form;
  255. const form = document.getElementById(formId);
  256. // Validar el formulario
  257. if (!form.checkValidity()) {
  258. form.reportValidity();
  259. return;
  260. }
  261. // Recoger datos del formulario
  262. const formData = {
  263. nombre: form.querySelector('#nombre').value,
  264. email: form.querySelector('#email').value,
  265. telefono: form.querySelector('#telefono').value,
  266. dni: form.querySelector('#dni').value,
  267. comentario: form.querySelector('#comentario').value
  268. };
  269. // URL del endpoint para usuarios no registrados
  270. const url = `/${document.documentElement.lang}/courses/ajax/interes-no-registrado/${actividadTipo}/${actividadId}`;
  271. // Petición AJAX
  272. fetch(url, {
  273. method: 'POST',
  274. headers: {
  275. 'X-Requested-With': 'XMLHttpRequest',
  276. 'Content-Type': 'application/json'
  277. },
  278. body: JSON.stringify(formData),
  279. credentials: 'same-origin'
  280. })
  281. .then(response => {
  282. if (!response.ok) {
  283. return Promise.reject(`Error: ${response.status}`);
  284. }
  285. return response.json();
  286. })
  287. .then(data => {
  288. if (data.success) {
  289. // Ocultar modal manualmente
  290. const modal = document.getElementById(`modalInteres${actividadTipo}${actividadId}`);
  291. if (modal) {
  292. modal.style.display = 'none';
  293. modal.classList.remove('in');
  294. document.body.classList.remove('modal-open');
  295. // Eliminar backdrop
  296. const backdrop = document.querySelector('.modal-backdrop');
  297. if (backdrop) {
  298. backdrop.parentNode.removeChild(backdrop);
  299. }
  300. }
  301. // Si es una solicitud, actualizar el botón
  302. const interesBtn = document.querySelector('.mostrar-interes[data-actividad-id="' + actividadId + '"][data-actividad-tipo="' + actividadTipo + '"]');
  303. if (interesBtn) {
  304. interesBtn.classList.remove('btn-secondary');
  305. interesBtn.classList.add('btn-primary');
  306. }
  307. // Mostrar mensaje de éxito
  308. alert('Gracias por mostrar tu interés. Te contactaremos pronto.');
  309. }
  310. })
  311. .catch(error => {
  312. console.error('Error:', error);
  313. alert('Ha ocurrido un error al registrar tu interés. Por favor, inténtalo de nuevo.');
  314. });
  315. }
  316. });
  317. </script>