addCollectionVanilla.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { autocomplete } from './autocomplete.js'
  2. const initCollectionForms = () => {
  3. document
  4. .querySelectorAll('ul.collection-form li')
  5. .forEach(item => {
  6. // Élément déjà initialisé (page restaurée depuis le cache Turbo)
  7. if (item.dataset.collectionFormInit) {
  8. return
  9. }
  10. item.dataset.collectionFormInit = 'true'
  11. const input = item.querySelector('input')
  12. if (input) {
  13. input.readOnly = true
  14. addDeleteLink(item)
  15. }
  16. });
  17. document
  18. .querySelectorAll('.add_item_link')
  19. .forEach(btn => {
  20. if (btn.dataset.collectionFormInit) {
  21. return
  22. }
  23. btn.dataset.collectionFormInit = 'true'
  24. btn.addEventListener("click", addFormToCollection)
  25. });
  26. function addFormToCollection(e) {
  27. const collectionHolder = document.querySelector('#' + e.currentTarget.dataset.collectionHolderId);
  28. const path = e.currentTarget.dataset.path ?? '';
  29. const item = document.createElement('li');
  30. item.className = collectionHolder.dataset.classLi
  31. item.innerHTML = collectionHolder
  32. .dataset
  33. .prototype
  34. .replace(
  35. /__name__/g,
  36. collectionHolder.dataset.index
  37. );
  38. if (path !== '') {
  39. autocomplete(item, path);
  40. }
  41. collectionHolder.appendChild(item);
  42. addDeleteLink(item);
  43. collectionHolder.dataset.index++;
  44. };
  45. function addDeleteLink(item) {
  46. const input = item.querySelector('input') ?? item.querySelector('select');
  47. const deleteLink = document.createElement('button');
  48. deleteLink.type = 'button';
  49. deleteLink.className = 'btn btn-outline-secondary';
  50. const i = document.createElement('i');
  51. i.className = 'fa-solid fa-trash fa-lg text-danger';
  52. deleteLink.appendChild(i);
  53. deleteLink.addEventListener("click", (event) => {
  54. item.remove();
  55. event.preventDefault(); // évite qu'un # apparaisse dans l'URL
  56. });
  57. input.after(deleteLink);
  58. };
  59. };
  60. initCollectionForms();
  61. document.addEventListener('turbo:load', initCollectionForms);