Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.81 KB | None | 0 0
  1. import validate from 'validate.js';
  2.  
  3. interface ErrorObject {
  4. [fieldId: string]: string[]
  5. }
  6.  
  7. export default class ValidationHandler {
  8. private fieldElements: HTMLCollectionOf<HTMLInputElement>;
  9. private errors: ErrorObject;
  10.  
  11. constructor(className: string) {
  12. this.fields = className;
  13. }
  14.  
  15. validateForm(constraints: object) {
  16. return new Promise((resolve, reject) => {
  17. // Use validate.js to create an obejct of errors.
  18. const errors = validate(this.fieldValues, constraints);
  19. console.log(this.fieldValues)
  20. if (!errors) {
  21. resolve();
  22. } else {
  23. this.errors = errors;
  24. reject();
  25. }
  26. });
  27. }
  28.  
  29. refreshErrorMessages() {
  30. // Loop through the keys of the errors and for each one
  31. // create a new wrror message.
  32. for (const errorField in this.errors) {
  33. const inputField = this.fieldElements.namedItem(errorField);
  34.  
  35. if (!inputField) {
  36. throw Error(`Input tag with id '${errorField}' not found`)
  37. }
  38.  
  39. const message = this.errors[errorField][0];
  40. this._createErrorMessage(inputField, message);
  41. }
  42.  
  43. for (const fieldName of Object.keys(this.fieldValues)) {
  44. if (Object.keys(this.errors).indexOf(fieldName) === -1) {
  45. this._removeErrorMessage(this.fieldElements.namedItem(fieldName));
  46. }
  47. }
  48. }
  49.  
  50. private get fieldValues() {
  51. // Turn into a normal array so we can iterate over it.
  52. const elementArray = Array.from(this.fieldElements);
  53.  
  54. return elementArray.reduce((fields, field) => {
  55. return {
  56. ...fields,
  57. [field.id]: field.value
  58. };
  59. }, {});
  60. }
  61.  
  62. private set fields(className: string) {
  63. // Using the class we can get all the form inputs automatically.
  64. const elements = <HTMLCollectionOf<HTMLInputElement>>document.getElementsByClassName(className);
  65. this.fieldElements = elements;
  66. }
  67.  
  68.  
  69. private _createErrorMessage(inputField: HTMLInputElement, message: string) {
  70. // The actual error message will be the input's sibling.
  71. let errorMessageElement = inputField.nextElementSibling;
  72. // If we've already created the element we just need to
  73. // update the text, assuming it's a different error.
  74. if (errorMessageElement) {
  75. if (errorMessageElement.textContent !== message) {
  76. errorMessageElement.textContent = message;
  77. }
  78. } else {
  79. // Otherwise create it from scratch.
  80. errorMessageElement = document.createElement('span');
  81. errorMessageElement.appendChild(document.createTextNode(message));
  82. errorMessageElement.classList.add('message', 'message__error');
  83. inputField.insertAdjacentElement('afterend', errorMessageElement);
  84. }
  85. }
  86.  
  87. private _removeErrorMessage(inputField: HTMLInputElement) {
  88. const errorMessageElement = inputField.nextElementSibling;
  89. if (errorMessageElement) {
  90. errorMessageElement.remove();
  91. }
  92. }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement