form.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. function dateToDateTimeLocal(date) {
  2. let myDate = new Date(date.getTime() - date.getTimezoneOffset() * 60000);
  3. console.log(myDate.toISOString().slice(0, -1));
  4. return myDate.toISOString().slice(0, -1)
  5. }
  6. dateToDateTimeLocal(new Date);
  7. function Form(el, data, okCallback, cancelCallback) {
  8. let formBody = document.createElement('div')
  9. let okButton = document.createElement('button')
  10. okButton.innerHTML = 'OK'
  11. let cancelButton = document.createElement('button')
  12. cancelButton.innerHTML = 'Cancel'
  13. let inputCreators = {
  14. String(key, value, oninput){
  15. let input = document.createElement('input')
  16. input.type = 'text'
  17. input.placeholder = key
  18. input.value = value
  19. input.oninput = () => oninput(input.value)
  20. return input
  21. },
  22. Boolean(key, value, oninput) {
  23. //label for с input type='checkbox'
  24. let input = document.createElement('input')
  25. input.type = 'checkbox'
  26. input.placeholder = key
  27. input.checked = value
  28. input.onchange = () => oninput(input.checked)
  29. return input
  30. },
  31. Date(key, value, oninput) {
  32. let input = document.createElement('input')
  33. input.type = 'datetime-local'
  34. input.placeholder = key
  35. input.value = dateToDateTimeLocal(value);
  36. input.oninput = () => oninput(new Date(input.value))
  37. return input
  38. //используйте datetime-local
  39. },
  40. //и др. по вкусу, например textarea для длинных строк
  41. }
  42. formBody.innerHTML = '<h1>тут будет форма после перервы</h1>'
  43. for (const [key, value] of Object.entries(data)) {
  44. let input = inputCreators[value.constructor.name](key, value, newValue => { data[key] = newValue });
  45. // let input = document.createElement('input');
  46. formBody.append(input);
  47. input.placeholder = key;
  48. // input.oninput = () => {
  49. // data[key] = input.value;
  50. // }
  51. }
  52. if (typeof okCallback === 'function'){
  53. formBody.appendChild(okButton);
  54. okButton.onclick = (e) => {
  55. console.log(this)
  56. this.okCallback(e)
  57. }
  58. }
  59. if (typeof cancelCallback === 'function'){
  60. formBody.appendChild(cancelButton);
  61. cancelButton.onclick = cancelCallback
  62. }
  63. el.appendChild(formBody)
  64. this.okCallback = okCallback
  65. this.cancelCallback = cancelCallback
  66. this.data = data
  67. this.validators = {}
  68. }
  69. let form = new Form(formContainer, {
  70. name: 'Anakin',
  71. surname: 'Skywalker',
  72. married: true,
  73. birthday: new Date((new Date).getTime() - 86400000 * 30*365)
  74. }, () => console.log('ok'),() => console.log('cancel') )
  75. form.okCallback = () => console.log('ok2')
  76. form.validators.surname = (value, key, data, input) => value.length > 2 &&
  77. value[0].toUpperCase() == value[0] &&
  78. !value.includes(' ') ? true : 'Wrong name'
  79. console.log(form)