form-submission-handler.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. (function () {
  2. // get all data in form and return object
  3. function getFormData(form) {
  4. const elements = form.elements;
  5. let itsatrap;
  6. const fields = Object.keys(elements).filter((k) => {
  7. if (elements[k].name === "itsatrap") {
  8. itsatrap = elements[k].value;
  9. return false;
  10. }
  11. return true;
  12. }).map((k) => {
  13. if (elements[k].name !== undefined) {
  14. return elements[k].name;
  15. // special case for Edge's html collection
  16. } else if (elements[k].length > 0) {
  17. return elements[k].item(0).name;
  18. }
  19. }).filter((item, pos, self) => {
  20. return self.indexOf(item) == pos && item;
  21. });
  22. const formData = {};
  23. fields.forEach((name) => {
  24. const element = elements[name];
  25. // singular form elements just have one value
  26. formData[name] = element.value;
  27. // when our element has multiple items, get their values
  28. if (element.length) {
  29. const data = [];
  30. for (let i = 0; i < element.length; i++) {
  31. const item = element.item(i);
  32. if (item.checked || item.selected) {
  33. data.push(item.value);
  34. }
  35. }
  36. formData[name] = data.join(', ');
  37. }
  38. });
  39. // add form-specific values into the data
  40. formData.formDataNameOrder = JSON.stringify(fields);
  41. formData.formGoogleSheetName = form.dataset.sheet || "responses"; // default sheet name
  42. formData.formGoogleSendEmail
  43. = form.dataset.email || ""; // no email by default
  44. return { data: formData, itsatrap };
  45. }
  46. function handleFormSubmit(event) {
  47. event.preventDefault(); // we are submitting via fetch below
  48. const form = event.target;
  49. const formData = getFormData(form);
  50. const data = formData.data;
  51. // If a itsatrap field is filled, assume it was done so by a spam bot.
  52. if (formData.itsatrap || data.submit) {
  53. return false;
  54. }
  55. disableAllButtons(form);
  56. const url = `https://script.google.com/macros/s/${form.dataset.scriptId}/exec`;
  57. fetch(url, {
  58. method: 'POST',
  59. headers: {
  60. 'Content-Type': 'application/x-www-form-urlencoded',
  61. },
  62. body: new URLSearchParams(data).toString(),
  63. })
  64. .then((response) => {
  65. if (response.ok) {
  66. form.reset();
  67. const formElements = form.querySelector(".form-elements");
  68. if (formElements) {
  69. formElements.style.display = "none"; // hide form
  70. }
  71. const thankYouMessage = form.querySelector(".thankyou-message");
  72. if (thankYouMessage) {
  73. thankYouMessage.style.display = "block";
  74. }
  75. }
  76. })
  77. .catch((error) => {
  78. console.error('Error submitting the form:', error);
  79. });
  80. }
  81. function loaded() {
  82. // bind to the submit event of our form
  83. const forms = document.querySelectorAll("form.contact-form");
  84. forms.forEach((form) => {
  85. form.addEventListener("submit", handleFormSubmit, false);
  86. });
  87. };
  88. document.addEventListener("DOMContentLoaded", loaded, false);
  89. function disableAllButtons(form) {
  90. const buttons = form.querySelectorAll("button");
  91. buttons.forEach((button) => {
  92. button.disabled = true;
  93. });
  94. }
  95. })();