let date = new Date(); function dataToDataTimeLocal(date) { let timeStamp = date.getTime(); let timeZoneoffset = -date.getTimezoneOffset() * 60 * 1000; let localTime = timeStamp + timeZoneoffset; return new Date(localTime).toISOString().slice(0, -1); } function Form(el, data, okCallback, cancelCallback) { let formBody = document.createElement('div') let okButton = document.createElement('button') okButton.innerHTML = 'OK' let cancelButton = document.createElement('button') cancelButton.innerHTML = 'Cancel'; let inputCreators = { String(key, value, oninput) { let input = document.createElement('input') if (key[0] == '*'){ let reqSpan = document.createElement('span'); reqSpan.style.color = 'red'; reqSpan.style.display ='none'; reqSpan.innerText = ` ${key[0]} `; formBody.append(reqSpan); key = key.slice(1); input.setAttribute("required", ""); } input.placeholder = key; console.log(key) input.value = value input.oninput = () => { /* if(this.validators[key] && this.validators[key] == [key]){ value = this.validators[key](value, key, data, input) ? input.value: value; } else if (this.validators) { errorSpan.style.backgroundColor = 'red'; errorSpan.innerText = `Error ${newValue}`; } */ if(value == '*****'){ input.type = 'password' } else input.type = 'text'; if (!value.trim()){ return value; } if (input.value.length == 0){ input.style.border = '1px solid red'; okButton.setAttribute('disabled','disabled') } else if (value.trim() !== '') { /* if (this.validators[key](value, key, data, input)){ console.log('test') } */ console.log('ok') input.style.border = '1px solid black' okButton.removeAttribute('disabled','') } oninput(input.value) } return input }, Boolean(key, value, oninput) { let input = document.createElement('input') if (key[0] == '*')input.setAttribute("required", ""); input.type = 'checkbox' input.placeholder = key input.checked = value input.oninput = () => oninput(input.checked) return input }, Date(key, value, oninput) { console.log(this.validators); let input = document.createElement('input') console.log(key[0]) if (key[0] == '*')input.setAttribute("required", ""); input.type = 'datetime-local' input.placeholder = key input.value = dataToDataTimeLocal(value) input.onchange = () => { /* if (typeof this.validators === 'function') { if(this.validators == [key]){ this.validators[key](value, key, data, input)? data[key] = newValue: data[key]; } else { errorSpan.style.backgroundColor = 'red'; errorSpan.innerText = `Error ${newValue}`; } */ oninput(new Date(input.value)) } // } return input }, } function createForm(initialState) { let formBody = document.createElement('div') let okButton = document.createElement('button') okButton.innerHTML = 'OK' let cancelButton = document.createElement('button') cancelButton.innerHTML = 'Cancel'; for (let [key, value] of Object.entries(initialState)) { let errorSpan = document.createElement('span'); let input = inputCreators[value.constructor.name](key, value, newValue => { initialState[key] = newValue; }); formBody.append(input, errorSpan, okButton, cancelButton ); el.appendChild(formBody) this.okCallback = okCallback this.cancelCallback = cancelCallback; this.data = data this.validators = { } } } for (let [key, value] of Object.entries(data)) { let errorSpan = document.createElement('span'); let input = inputCreators[value.constructor.name](key, value, newValue => { data[key] = newValue; }); formBody.append(input); formBody.append(errorSpan); } if (typeof okCallback === 'function') { okButton.setAttribute('disabled','') formBody.appendChild(okButton); okButton.onclick = (e) => { this.okCallback(e) } } if (typeof cancelCallback === 'function') { formBody.appendChild(cancelButton); cancelButton.onclick = () => { formBody.remove(); createForm(initialState); this.cancelCallback(); } } el.appendChild(formBody) this.okCallback = okCallback this.cancelCallback = cancelCallback; let initialState = Object.assign({}, data); this.initialState = initialState; this.data = data this.validators = { } } let form = new Form(formContainer, { '*name': 'Anakin', '*surname': 'Skywalker', married: true, birthday: new Date((new Date).getTime() - 86400000 * 30 * 365) }, () => console.log('ok'), () =>{console.log('ok') } ) form.okCallback = () => console.log('ok2') /* form.cancelCallback = () => { console.log('datainit') // form = new Form(data); } */ form.validators.surname = (value, key, data, input) => value.length > 2 && value[0].toUpperCase() == value[0] && !value.includes(' ') ? true : 'Wrong name' console.log(form);