slugger_controller.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { Controller } from '@hotwired/stimulus'
  2. export default class extends Controller {
  3. static targets = ['title', 'slug', 'bouton']
  4. async open() {
  5. if (this.slugTarget.hasAttribute('readonly')) {
  6. sessionStorage.setItem('oldSlugValue', this.slugTarget.value)
  7. this.slugTarget.removeAttribute('readonly');
  8. this.slugTarget.value = await this.getSlug(this.titleTarget.value);
  9. this.slugTarget.focus();
  10. this.boutonTarget.innerText = 'Annuler la modification';
  11. } else {
  12. this.slugTarget.value = sessionStorage.getItem('oldSlugValue')
  13. sessionStorage.removeItem('oldSlugValue')
  14. this.slugTarget.setAttribute('readonly', true);
  15. this.boutonTarget.innerText = 'Générer le slug';
  16. }
  17. }
  18. async getSlug(text) {
  19. // Envoyer le titre au serveur pour générer le slug
  20. const response = await fetch('/generate-slug', {
  21. method: 'POST',
  22. headers: {
  23. 'Content-Type': 'application/json',
  24. 'X-Requested-With': 'XMLHttpRequest'
  25. },
  26. body: JSON.stringify({ title: text })
  27. })
  28. const data = await response.json()
  29. return data.slug
  30. }
  31. generateSlug(text) {
  32. return text.toString().toLowerCase()
  33. .replace(/\s+/g, '-') // Remplace les espaces par des tirets
  34. .replace(/[^\w\-]+/g, '') // Enlève les caractères non alphanumériques
  35. .replace(/\-\-+/g, '-') // Remplace les tirets doubles
  36. .replace(/^-+/, '') // Enlève les tirets au début
  37. .replace(/-+$/, ''); // Enlève les tirets à la fin
  38. }
  39. }