script.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. let date = new Date();
  2. function dataToDataTimeLocal(date) {
  3. let timeStamp = date.getTime();
  4. let timeZoneoffset = -date.getTimezoneOffset() * 60 * 1000;
  5. let localTime = timeStamp + timeZoneoffset;
  6. return new Date(localTime).toISOString().slice(0, -1);
  7. }
  8. /***********************************************/
  9. function Form(el, data, okCallback, cancelCallback) {
  10. let formBody = document.createElement('div')
  11. let okButton = document.createElement('button')
  12. okButton.innerHTML = 'OK'
  13. let cancelButton = document.createElement('button')
  14. cancelButton.innerHTML = 'Cancel'
  15. let inputCreators = {
  16. String(key, value, oninput) {
  17. let input = document.createElement('input')
  18. input.placeholder = key
  19. input.value = value
  20. input.oninput = () => {
  21. if(value == '*****'){
  22. input.type = 'password'
  23. } else input.type = 'text';
  24. if (!value.trim()){
  25. return value;
  26. } oninput(input.value)
  27. }
  28. return input
  29. },
  30. Boolean(key, value, oninput) {
  31. let input = document.createElement('input')
  32. input.type = 'checkbox'
  33. input.placeholder = key
  34. input.checked = value
  35. input.oninput = () => oninput(input.checked)
  36. return input
  37. },
  38. Date(key, value, oninput) {
  39. let input = document.createElement('input')
  40. input.type = 'datetime-local'
  41. input.placeholder = key
  42. input.value = dataToDataTimeLocal(value)
  43. input.onchange = () => {
  44. if (typeof this.validators === 'function') {
  45. if(this.validators[key](value, key, data, input) === true){
  46. //validator use oninput or onchnge
  47. data[key] = newValue;
  48. console.log(key)
  49. } else {
  50. errorSpan.style.backgroundColor = 'red';
  51. errorSpan.innerText = `Error ${newValue}`;
  52. }
  53. oninput(new Date(input.value))
  54. }
  55. }
  56. return input
  57. },
  58. }
  59. for (let [key, value] of Object.entries(data)) {
  60. let errorSpan = document.createElement('span');
  61. let input = inputCreators[value.constructor.name](key, value, newValue => {
  62. data[key] = newValue;
  63. });
  64. input.placeholder = key;
  65. formBody.append(input);
  66. formBody.append(errorSpan);
  67. //disabled for ok button and cancel
  68. }
  69. if (typeof okCallback === 'function') {
  70. formBody.appendChild(okButton);
  71. okButton.onclick = (e) => {
  72. console.log(this)
  73. this.okCallback(e)
  74. }
  75. }
  76. if (typeof cancelCallback === 'function') {
  77. formBody.appendChild(cancelButton);
  78. cancelButton.onclick = cancelCallback
  79. }
  80. el.appendChild(formBody)
  81. this.okCallback = okCallback
  82. this.cancelCallback = cancelCallback
  83. this.data = data
  84. this.validators = {
  85. }
  86. }
  87. let form = new Form(formContainer, {
  88. name: 'Anakin',
  89. surname: 'Skywalker',
  90. married: true,
  91. birthday: new Date((new Date).getTime() - 86400000 * 30 * 365)
  92. }, () => console.log('ok'), () => console.log('cancel'))
  93. form.okCallback = () => console.log('ok2')
  94. form.validators.surname = (value, key, data, input) => value.length > 2 &&
  95. value[0].toUpperCase() == value[0] &&
  96. !value.includes(' ') ? true : 'Wrong name'
  97. //if key[0] == '*' it is requred field