request_process_controller.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { Controller } from "@hotwired/stimulus"
  2. export default class extends Controller {
  3. connect() {
  4. // Écoute tous les clics sur .open-modal -> détournement vers #lastStep + MAJ des options du formulaire
  5. document.querySelectorAll('.planning-cell-free').forEach(element => {
  6. element.addEventListener('click', this.handleClick.bind(this))
  7. })
  8. }
  9. handleClick(event) {
  10. event.preventDefault()
  11. const slotId = event.currentTarget.dataset.id
  12. if (!slotId) return
  13. // A partir du slotId ->
  14. // 1. trouver les slots disponible suviants
  15. // 2. mettre à jour le formulaire
  16. // 3. forcer un scroll jusqu'à #lastStep
  17. // Etape 1
  18. fetch(`/admin/api/slot/${slotId}/nexts`, {
  19. method: 'POST',
  20. headers: {
  21. 'Accept': 'application/json'
  22. }
  23. })
  24. .then(response => {
  25. if (!response.ok) {
  26. throw new Error(`Erreur API: ${response.status}`);
  27. }
  28. return response.json();
  29. })
  30. .then(data => {
  31. // Etape 2
  32. console.log('ID du slot cliqué :', slotId);
  33. console.log('IDs des slots suivants :', data.next_slots);
  34. console.log('Horaire de début :', data.start_date);
  35. console.log('Horaires de fin :', data.end_dates);
  36. const select = document.querySelector('#party_slots');
  37. select.innerHTML = ''; // Vider les anciennes options
  38. const ids = data.next_slots; // ex: [1, 2, 3, 4]
  39. const labels = data.end_dates; // ex: ["07/08/25 14:00", "07/08/25 16:00", "07/08/25 18:00", "07/08/25 20:00"]
  40. let cumulativeIds = [];
  41. ids.forEach((id, index) => {
  42. cumulativeIds.push(id); // on ajoute l'ID courant à la liste
  43. const value = cumulativeIds.join('|'); // ex: "1|2|3"
  44. const label = labels[index] || `Créneau ${id}`; // on sécurise
  45. const option = document.createElement('option');
  46. option.value = value;
  47. option.textContent = label;
  48. select.appendChild(option);
  49. });
  50. const start = document.querySelector('#party_start');
  51. start.innerHTML = '';
  52. start.innerHTML = data.start_date;
  53. document.querySelector('#lastStep')?.scrollIntoView({ behavior: 'smooth' });
  54. })
  55. .catch(error => {
  56. console.error('Erreur lors de la récupération des slots :', error);
  57. });
  58. }
  59. disconnect() {
  60. this.element.querySelectorAll('.planning-cell-free').forEach(element => {
  61. element.removeEventListener('click', this.handleClick)
  62. })
  63. }
  64. }