script.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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. function Form(el, data, okCallback, cancelCallback) {
  9. let formBody = document.createElement('div')
  10. let okButton = document.createElement('button')
  11. okButton.innerHTML = 'OK'
  12. let cancelButton = document.createElement('button')
  13. cancelButton.innerHTML = 'Cancel';
  14. let inputCreators = {
  15. String(key, value, oninput) {
  16. let input = document.createElement('input')
  17. if (key[0] == '*'){
  18. let reqSpan = document.createElement('span');
  19. reqSpan.style.color = 'red';
  20. reqSpan.style.display ='none';
  21. reqSpan.innerText = ` ${key[0]} `;
  22. formBody.append(reqSpan);
  23. key = key.slice(1);
  24. input.setAttribute("required", "");
  25. }
  26. input.placeholder = key;
  27. input.value = value
  28. input.oninput = () => {
  29. /*
  30. if(this.validators[key] && this.validators[key] == [key]){
  31. value = this.validators[key](value, key, data, input) ? input.value: value;
  32. } else if (this.validators) {
  33. errorSpan.style.backgroundColor = 'red';
  34. errorSpan.innerText = `Error ${newValue}`;
  35. } */
  36. if(value == '*****'){
  37. input.type = 'password'
  38. } else input.type = 'text';
  39. if (!value.trim()){
  40. return value;
  41. }
  42. if (input.value.length == 0){
  43. input.style.border = '1px solid red';
  44. okButton.setAttribute('disabled','disabled')
  45. } else if (value.trim() !== '') {
  46. /* if (this.validators[key](value, key, data, input)){
  47. console.log('test')
  48. } */
  49. console.log('ok')
  50. input.style.border = '1px solid black'
  51. okButton.removeAttribute('disabled','')
  52. }
  53. oninput(input.value)
  54. }
  55. return input
  56. },
  57. Boolean(key, value, oninput) {
  58. let input = document.createElement('input')
  59. if (key[0] == '*')input.setAttribute("required", "");
  60. input.type = 'checkbox'
  61. input.placeholder = key
  62. input.checked = value
  63. input.oninput = () => oninput(input.checked)
  64. return input
  65. },
  66. Date(key, value, oninput) {
  67. console.log(this.validators);
  68. let input = document.createElement('input')
  69. console.log(key[0])
  70. if (key[0] == '*')input.setAttribute("required", "");
  71. input.type = 'datetime-local'
  72. input.placeholder = key
  73. input.value = dataToDataTimeLocal(value)
  74. input.onchange = () => {
  75. /* if (typeof this.validators === 'function') {
  76. if(this.validators == [key]){
  77. this.validators[key](value, key, data, input)? data[key] = newValue: data[key];
  78. } else {
  79. errorSpan.style.backgroundColor = 'red';
  80. errorSpan.innerText = `Error ${newValue}`;
  81. } */
  82. oninput(new Date(input.value))
  83. }
  84. // }
  85. return input
  86. },
  87. }
  88. for (let [key, value] of Object.entries(data)) {
  89. let errorSpan = document.createElement('span');
  90. let input = inputCreators[value.constructor.name](key, value, newValue => {
  91. data[key] = newValue;
  92. });
  93. input.placeholder = key;
  94. formBody.append(input);
  95. formBody.append(errorSpan);
  96. }
  97. if (typeof okCallback === 'function') {
  98. okButton.setAttribute('disabled','')
  99. formBody.appendChild(okButton);
  100. okButton.onclick = (e) => {
  101. this.okCallback(e)
  102. }
  103. }
  104. if (typeof cancelCallback === 'function') {
  105. formBody.appendChild(cancelButton);
  106. cancelButton.onclick = cancelCallback
  107. }
  108. el.appendChild(formBody)
  109. this.okCallback = okCallback
  110. this.cancelCallback = cancelCallback;
  111. let initialState = Object.assign({}, {el, data, okCallback, cancelCallback});
  112. this.initialState = initialState;
  113. this.data = data
  114. this.validators = {
  115. }
  116. }
  117. let form = new Form(formContainer, {
  118. '*name': 'Anakin',
  119. '*surname': 'Skywalker',
  120. married: true,
  121. birthday: new Date((new Date).getTime() - 86400000 * 30 * 365)
  122. }, () => console.log('ok'), () =>{
  123. let {el, data, okCallback, cancelCallback} = form.initialState;
  124. console.log(el, data, okCallback, cancelCallback);
  125. } )
  126. form.okCallback = () => console.log('ok2')
  127. form.cancelCallback = () => {
  128. console.log('datainit')
  129. // form = new Form(data);
  130. }
  131. form.validators.surname = (value, key, data, input) => value.length > 2 &&
  132. value[0].toUpperCase() == value[0] &&
  133. !value.includes(' ') ? true : 'Wrong name'
  134. console.log(form);