123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- //debugger;
- function Form(el, data, okCallback, cancelCallback){
- let inputCreators = {
- String(key, value, oninput){
- let input = document.createElement('input');
- input.type = 'text'
- input.placeholder = key.slice(1, key.length);
- input.id = `${key}`;
- if(value.charAt(0) === '*') {
- data[key] = '';
- input.type = 'password';
- input.placeholder = 'password';
- input.id = `${key}`;
- input.oninput = () => oninput(input.value);
- return input;
- }
- input.value = value
- input.oninput = () => oninput(input.value)
- return input
- },
- Boolean(key, value, oninput){
- //label for с input type='checkbox' внутри
- let input = document.createElement('input');
- input.type = 'checkbox'
- input.placeholder = key
- input.checked = value
- input.id = `${key}`;
- input.oninput = () => oninput(input.checked)
- return input
- },
- Date: function (key, value, oninput){
- //используйте datetime-local let input = document.createElement('input');
- let input = document.createElement('input')
- input.type = 'datetime-local'
- input.placeholder = key
- input.id = `${key}`;
- input.value = value.toISOString().slice(0,-1);
- input.oninput = () => oninput(Date(input.value))
- return input
- },
- //и др. по вкусу, например textarea для длинных строк
- }
- this.validators = {};
- let table = document.createElement('table');
- document.body.appendChild(table);
-
- for (let [key, value] of Object.entries(data)) {
- let tr = document.createElement('tr');
- let th = document.createElement('th');
- let td = document.createElement('td');
- let tdForWrong = document.createElement('td');
- const span = document.createElement('span');
- const spanKey = document.createElement('span');
- let input = inputCreators[value.constructor.name](key, value, function enterPlase (value){
- data[key] = value;
- })
-
- input.addEventListener('input', () => {
-
- let resultInputValue = input.value;
- let resultValadators = true;
- if (value.constructor.name === Boolean) {
- resultInputValue = input.checked;
- };
-
- if (typeof this.validators[key] === 'function') {
- resultValadators = this.validators[key](resultInputValue, key, data, input);
-
- if (typeof resultValadators === 'string') {
- resultValadators = false;
- input.style.backgroundColor = 'red';
- tdForWrong.innerHTML = ` ${this.validators[key](resultInputValue, key, data, input)}`
- }
- if (resultValadators) {
- input.style.backgroundColor = 'white';
- tdForWrong.innerHTML = ` `;
- }
- }
- resultInputValue === '' ? input.style.border = '3px solid red': input.style.border = null;
- })
- if (key.charAt(0) === '*') {
- const start = key.charAt(0);
- spanKey.innerHTML = `${key.slice(1, key.length)}`;
- span.style.color = 'red';
- span.innerText = `${start} `;
-
- } else {
- spanKey.innerHTML = key;
- }
-
- table.append(tr);
- tr.append(th);
- tr.append(td);
- th.appendChild(span);
- th.append(spanKey);
- td.appendChild(input);
- tr.append(tdForWrong);
- }
- this.copyData = {...data};
- this.checkInput = function () {
- let input = document.querySelector(input);
- input.value
- }
- let formBody = document.createElement('div')
- let okButton = document.createElement('button')
- okButton.innerHTML = 'OK';
-
- okButton.addEventListener('click', () => {
- let countKey = 0;
- let countvalidators = 0;
- for (let [key, value] of Object.entries(data)) {
- let resultInputValue = value;
- let resultValadators = true;
- let input = document.getElementById(value);
- if (typeof this.validators[key] === 'function') {
- resultValadators = this.validators[key](resultInputValue, key, data, input);
-
- if (typeof resultValadators === 'string') {
- resultValadators = false;
- }
- }
-
- if (resultValadators && resultInputValue ) {
- countvalidators++;
- }
- countKey++;
- }
- if (countKey === countvalidators) {
- this.okCallback(data);
- }
- })
- let cancelButton = document.createElement('button')
- cancelButton.innerHTML = 'Cancel'
- formBody.innerHTML = '<h1>тут будет форма после перервы</h1>'
- cancelButton.addEventListener('click', () => { console.log(this.copyData)
- for (let [key, value] of Object.entries(this.copyData)) {
- let input = document.getElementById(key);
- if( value.constructor.name === 'String') {
- input.value = `${value}`;
- }
- if (value.constructor.name === 'Boolean') {
- input.checked = `${value}`;
- }
- if (value.constructor.name === 'Date') {
- input.value = value.toISOString().slice(0,-1);
- }
- }
- })
-
- if (typeof okCallback === 'function'){
- formBody.appendChild(okButton);
- okButton.onclick = (e) => {
- //console.log(this)
- this.okCallback(e)
- }
- }
- if (typeof cancelCallback === 'function'){
- formBody.appendChild(cancelButton);
- cancelButton.onclick = cancelCallback
- }
- el.appendChild(formBody);
-
-
- this.okCallback;
- this.cancelCallback = cancelCallback
- this.data = data
-
- }
- let form = new Form(document.body, {
- '*name': 'Anaaa',
- surname: 'Skywalker',
- married: true,
- birthday: new Date((new Date).getTime() - 86400000 * 30*365)
- }, () => console.log('ok'),() => console.log('cancel') )
- form.okCallback = (what) => console.log(what)
- form.validators.surname = (value, key, data, input) => value.length > 2 &&
- value[0].toUpperCase() == value[0] &&
- !value.includes(' ') ? true : 'Wrong name'
- //console.log(form)
|