form-wizard.js 4.6 KB

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