form-wizard.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // 1. horizontal wizard
  2. "use strict";
  3. var currentTab = 0;
  4. let nextBtn;
  5. let submitBtn;
  6. showTab(currentTab);
  7. function showTab(n) {
  8. var x = document.getElementsByClassName("tab");
  9. x[n].style.display = "block";
  10. if (n == 0) {
  11. document.getElementById("prevBtn").style.display = "none";
  12. } else {
  13. document.getElementById("prevBtn").style.display = "inline";
  14. }
  15. if (n == x.length - 1) {
  16. // document.getElementById("nextBtn").innerHTML = "Invia";
  17. document.getElementById("nextBtn").innerHTML = "Avanti";
  18. } else {
  19. document.getElementById("nextBtn").innerHTML = "Avanti";
  20. }
  21. fixStepIndicator(n);
  22. }
  23. function nextPrev(n) {
  24. nextBtn = document.getElementById("nextBtn");
  25. submitBtn = document.getElementById("submitBtn");
  26. var x = document.getElementsByClassName("tab");
  27. if (n == 1 && !validateForm()) return false;
  28. x[currentTab].style.display = "none";
  29. currentTab = currentTab + n;
  30. if (currentTab == x.length - 1) {
  31. nextBtn.style.display = "none";
  32. submitBtn.style.display = "";
  33. } else {
  34. submitBtn.style.display = "none";
  35. nextBtn.style.display = "";
  36. }
  37. if (currentTab >= x.length) {
  38. document.getElementById("regForm").submit();
  39. return false;
  40. }
  41. showTab(currentTab);
  42. }
  43. function validateForm() {
  44. var x,
  45. y,
  46. i,
  47. valid = true;
  48. x = document.getElementsByClassName("tab");
  49. y = x[currentTab].getElementsByTagName("input");
  50. for (i = 0; i < y.length; i++) {
  51. if (y[i].value == "") {
  52. y[i].className += " invalid";
  53. valid = false;
  54. }
  55. }
  56. if (valid) {
  57. document.getElementsByClassName("step")[currentTab].className +=
  58. " finish";
  59. }
  60. return valid;
  61. }
  62. function fixStepIndicator(n) {
  63. var i,
  64. x = document.getElementsByClassName("step");
  65. for (i = 0; i < x.length; i++) {
  66. x[i].className = x[i].className.replace(" active", "");
  67. }
  68. x[n].className += " active";
  69. }
  70. // 2. Numbering wizard
  71. var form = document.getElementById("msform");
  72. var fieldsets = form.querySelectorAll("form");
  73. var currentStep = 0;
  74. var numSteps = 5;
  75. for (var i = 1; i < fieldsets.length; i++) {
  76. fieldsets[i].style.display = "none";
  77. }
  78. function nextStep() {
  79. document.getElementById("backbtn").disabled = false;
  80. currentStep++;
  81. if (currentStep > numSteps) {
  82. currentStep = 1;
  83. }
  84. var stepper = document.getElementById("stepper1");
  85. var steps = stepper.getElementsByClassName("step");
  86. Array.from(steps).forEach((step, index) => {
  87. let stepNum = index + 1;
  88. let stepLength = steps.length;
  89. if (stepNum === currentStep && currentStep < stepLength) {
  90. addClass(step, "editing");
  91. fieldsets[currentStep].style.display = "flex";
  92. } else {
  93. removeClass(step, "editing");
  94. }
  95. if (stepNum <= currentStep && currentStep < stepLength) {
  96. addClass(step, "done");
  97. addClass(step, "active");
  98. removeClass(step, "editing");
  99. fieldsets[currentStep - 1].style.display = "none";
  100. } else {
  101. removeClass(step, "done");
  102. }
  103. if (currentStep == stepLength - 1) {
  104. document.getElementById("nextbtn").textContent = "Avanti";
  105. }
  106. if (currentStep > stepLength - 1) {
  107. document.getElementById("nextbtn").textContent = "Avanti";
  108. addClass(step, "done");
  109. addClass(step, "active");
  110. removeClass(step, "editing");
  111. document.getElementById("nextbtn").disabled = true;
  112. }
  113. });
  114. }
  115. function backStep() {
  116. currentStep--;
  117. var stepper = document.getElementById("stepper1");
  118. var steps = stepper.getElementsByClassName("step");
  119. let stepLength = steps.length;
  120. document.getElementById("nextbtn").textContent = "Next";
  121. document.getElementById("nextbtn").disabled = false;
  122. if (currentStep < stepLength - 1) {
  123. document.getElementById("backbtn").disabled = false;
  124. fieldsets[currentStep + 1].style.display = "none";
  125. fieldsets[currentStep].style.display = "flex";
  126. removeClass(steps[currentStep], "done");
  127. removeClass(steps[currentStep], "active");
  128. if (currentStep == 0) {
  129. document.getElementById("backbtn").disabled = true;
  130. }
  131. } else {
  132. removeClass(steps[currentStep], "done");
  133. removeClass(steps[currentStep], "active");
  134. }
  135. }
  136. // function prevStep(){
  137. // fieldsets[currentStep].style.display = "none";
  138. // currentStep--;
  139. // fieldsets[currentStep].style.display = "block";
  140. // }
  141. /* get, set class, see https://ultimatecourses.com/blog/javascript-hasclass-addclass-removeclass-toggleclass */
  142. function hasClass(elem, className) {
  143. return new RegExp(" " + className + " ").test(" " + elem.className + " ");
  144. }
  145. function addClass(elem, className) {
  146. if (!hasClass(elem, className)) {
  147. elem.className += " " + className;
  148. }
  149. }
  150. function removeClass(elem, className) {
  151. console.log("elem, className", elem, className);
  152. var newClass = " " + elem.className.replace(/[\t\r\n]/g, " ") + " ";
  153. if (hasClass(elem, className)) {
  154. while (newClass.indexOf(" " + className + " ") >= 0) {
  155. newClass = newClass.replace(" " + className + " ", " ");
  156. }
  157. elem.className = newClass.replace(/^\s+|\s+$/g, "");
  158. }
  159. console.log("elem.className", elem.className);
  160. }