// password
function Password(parent, open=false) {
let _isVisible = open
let _value = ''
let input = document.createElement('input')
input.placeholder = 'password'
let wrapper = document.createElement('div')
let btn = document.createElement('button')
btn.innerText = 'Hide/Show'
this.getHTMLElements = function() {
return {
Password_wrapper: wrapper,
Password_input: input,
Password_btn: btn
}
}
this.getValue = function() {
return _value
}
this.setValue = function(newValue) {
_value = newValue
input.value = _value
}
this.setOpen = (bool) => {
_isVisible = bool
let _type = _isVisible? 'text' : 'password'
input.setAttribute('type', `${_type}`)
this.onOpenChange()
}
this.getOpen = function() {
return _isVisible
}
this.onChange = function(event) {
_value = event.target.value
}
let closed = () => {}
this.onOpenChange = (func=null, ...args) => {
let lockfunc = func
if(func) {
(function(){
closed = lockfunc
closed(...args)
})()
} else {
closed(...args)
}
}
input.addEventListener('input', this.onChange)
btn.addEventListener('click', () => {
this.setOpen(!_isVisible)
})
wrapper.setAttribute('class', 'Password')
this.setOpen(open)
wrapper.append(input, btn)
parent.append(wrapper)
}
let pass = new Password(document.body, true)
// login form
function Login (parent) {
let _value = ''
let input = document.createElement('input')
input.type = 'text'
input.placeholder = 'login'
input.style.display = 'block'
parent.append(input)
this.getHTMLElement = function() {
return input
}
this.getValue = function() {
return _value
}
this.setValue = function(newValue) {
_value = newValue
input.value = _value
}
this.onChange = function(event) {
_value = event.target.value
}
input.addEventListener('input', this.onChange)
}
// loginForm Constructor
function loginForm(parent, heading='loginForm Constructor') {
let form = document.createElement('div')
form.id = 'loginForm'
form.style.border = '5px double black'
form.style.width = 'fit-content'
form.style.textAlign = 'center'
form.style.padding = '15px'
form.style.margin = '15px'
let h2 = document.createElement('h2')
h2.innerText = heading
form.append(heading)
let _login = new Login(form)
let _password = new Password(form)
let login_btn = document.createElement('button')
login_btn.innerText = 'Log in'
login_btn.disabled = true
form.append(login_btn)
for(let item of form.children) {
item.style.margin = '10px'
}
this.getLogin = function() {
return _login.getValue()
}
this.getPassword = function() {
return _password.getValue()
}
this.isPasswordOpened = function() {
return _password.getOpen()
}
this.setPasswordOpened = function(bool) {
_password.setOpen(bool)
}
this.setLogin = function(newLogin) {
_login.setValue(newLogin)
checkFields()
}
this.setPass = function(newPass) {
_password.setValue(newPass)
checkFields()
}
function checkFields() {
if (_login.getValue() && _password.getValue()) {
login_btn.disabled = false
} else {
login_btn.disabled = true
}
}
_login.getHTMLElement().addEventListener('input', checkFields)
_password.getHTMLElements().Password_input.addEventListener('input', checkFields)
parent.append(form)
}
let login_form = new loginForm(document.body)
// Password Verify
class PasswordVerify extends Password {
constructor(parent, open=false) {
super(parent, open);
let _repeatWrapper = document.createElement('div')
let _repeatField = document.createElement('input')
let _successBtn = document.createElement('button')
let displayRepeat = () => {
if(this.getOpen() === false) {
_repeatField.style.marginTop = '10px'
_repeatField.type = 'password'
_repeatField.placeholder = 'repeat password'
_repeatField.value = ''
_successBtn.innerText = 'no match!'
_successBtn.disabled = true
_successBtn.style.display = 'inline-block'
_successBtn.style.backgroundColor = 'transparent'
_repeatWrapper.append(_repeatField)
_repeatWrapper.append(_successBtn)
this.getHTMLElements().Password_wrapper.append(_repeatWrapper)
} else {
try {
for(let child of _repeatWrapper.children) {
_repeatWrapper.remove(child)
}
} catch(e){}
}
}
this.onOpenChange(displayRepeat)
let isMatch= () => {
if(this.getHTMLElements().Password_input.value && _repeatField.value) {
if(this.getHTMLElements().Password_input.value === _repeatField.value) {
return true
}
}
return false
}
let btnActivate = (bool) => {
if(bool) {
_successBtn.disabled = false
_successBtn.style.backgroundColor = 'chartreuse'
_successBtn.innerText = 'passwords match'
} else {
_successBtn.disabled = true
_successBtn.style.backgroundColor = 'transparent'
_successBtn.innerText = 'no match!'
}
}
this.getHTMLElements().Password_input.addEventListener('input', () => {
btnActivate(isMatch())
})
_repeatField.addEventListener('input',() => {
btnActivate(isMatch())
})
}
}
document.body.insertAdjacentHTML('beforeend', `
`)
let verif = document.getElementById('verif')
let passverif = new PasswordVerify(verif, true)
// login form
function Form(el, data, okCallback, cancelCallback){
let formBody = document.createElement('div')
let okButton = document.createElement('button')
okButton.innerHTML = 'OK'
this.validators = {isValid:{}}
let cancelButton = document.createElement('button')
cancelButton.innerHTML = 'Cancel'
formBody.innerHTML = 'Form
'
if (typeof okCallback === 'function'){
formBody.appendChild(okButton);
okButton.onclick = (e) => {
console.log(this)
this.okCallback(this.data)
}
}
if (typeof cancelCallback === 'function'){
formBody.appendChild(cancelButton);
cancelButton.onclick = () => {
this.cancelCallback(data)
okButton.disabled = true
}
}
el.appendChild(formBody)
this.checkInfo = (value, key, data, input, err) => {
let validCheck
let keyFormated = key
okButton.disabled = true
try {
if(key[0] === "*") {
keyFormated = key.substring(1)
if(this.validators.mandatoryErr(value, key) === true) {
validCheck = this.validators[keyFormated]? this.validators[keyFormated](value, keyFormated) : true
input.style.backgroundColor = 'transparent'
input.style.color = 'black'
err.innerText = ''
} else {
err.innerText = this.validators.mandatoryErr(value, keyFormated)
this.validators.isValid[key] = false
}
} else {
validCheck = this.validators[keyFormated]? this.validators[keyFormated](value, keyFormated) : false
}
if(typeof validCheck === 'string') {
input.style.backgroundColor = 'firebrick'
input.style.color = 'white'
err.innerText = validCheck
this.validators.isValid[key] = validCheck
} else if(typeof validCheck === 'boolean' && validCheck === true) {
input.style.backgroundColor = 'transparent'
input.style.color = 'black'
err.innerText = ''
this.validators.isValid[key] = validCheck
}
if(Object.values(this.validators.isValid).every((item) => item === true)) {
okButton.disabled = false
} else {
okButton.disabled = true
}
} catch(e){/*sample text*/}
// try {
// if(Object.values(this.validators.isValid).every((item) => item === true)) {
// okButton.disabled = false
// } else {
// okButton.disabled = true
// }
// } catch(e) {}
}
let inputCreators = {
string: (key, value, func ) => {
let wrap = document.createElement('div')
let input
let small = document.createElement('small')
small.style.color = 'red'
small.innerText = ''
if(/^[*]+$/.test(this.data[key])) {
let div = document.createElement('div')
input = new Password(div, true)
input.getHTMLElements().Password_input.value = ''
wrap.append(input.getHTMLElements().Password_wrapper, small)
this.validators.isValid[key] = false
input.getHTMLElements().Password_input.oninput = (e) => {
func(input.getHTMLElements().Password_input.value)
this.checkInfo(input.getHTMLElements().Password_input.value, key, {}, input.getHTMLElements().Password_input, small)
}
} else {
input = document.createElement('input')
input.type = 'text'
input.style.display = 'block'
input.placeholder = key
input.value = value
wrap.append(input, small)
input.oninput = () => {
func(input.value)
this.checkInfo(input.value, key, {}, input, small)
}
}
return wrap
},
boolean: (key, value, func) => {
let wrap = document.createElement('div')
let input = document.createElement('input')
input.type = 'checkbox'
input.placeholder = key
input.checked = value
let small = document.createElement('small')
small.style.color = 'red'
small.innerText = ''
wrap.append(input, small)
input.onchange = (e) => {
func(input.checked)
this.checkInfo(input.checked, key, {}, input, small)
}
return wrap
},
date: (key, value, func) => {
let wrap = document.createElement('div')
let input = document.createElement('input')
input.type = 'datetime-local'
input.style.display = 'block'
input.placeholder = key
input.value = new Date(value).toISOString().slice(0, -1)
let small = document.createElement('small')
small.style.color = 'red'
small.innerText = ''
wrap.append(input, small)
input.onchange = () => {
func(new Date(input.value))
this.checkInfo(input.value, key, {}, input, small)
}
return wrap
},
}
let formTable = document.createElement('table')
formTable.border = 1
this.insertInTable = (data) => {
for(let i = formTable.children.length-1; i >= 0; i--) {
formTable.removeChild(formTable.children[i])
}
this.validators.isValid = {}
this.initialData = Object.assign({}, this.initialData)
this.data = data
for(let key in data) {
let tr = document.createElement('tr')
let tdKey = document.createElement('td')
let tdInput = document.createElement('td')
let input = inputCreators[(data[key].constructor.name).toLowerCase()](key, data[key],(value) => {
data[key] = value
})
this.checkInfo(data[key], key)
tdKey.innerHTML = key[0] ==='*'? `* ${key.substring(1)}`:`${key}`
tdInput.append(input)
tr.append(tdKey, tdInput)
formTable.append(tr)
}
okButton.before(formTable)
}
this.insertInTable(data)
this.okCallback = okCallback
this.cancelCallback = cancelCallback
this.initialData = Object.assign({}, data)
this.data = data
}
let formContainer = document.createElement('div')
formContainer.id = 'formContainer'
document.body.append(formContainer)
let form = new Form(formContainer, {
"*name": 'Anakin',
surname: 'Skywalker',
"*married": true,
birthday: new Date((new Date).getTime() - 86400000 * 30*365),
"*password": '**'
}, () => console.log('ok'),() => console.log('cancel') )
form.okCallback = (obj) => console.log('your data:', obj)
form.cancelCallback = () => form.insertInTable(form.initialData)
form.validators.surname = (value, key, data, input) => value !== '' && value.length > 2 &&
value[0].toUpperCase() == value[0] &&
!/[0-9 \W]/.test(value) ? true : `Wrong ${key}`
form.validators.name = form.validators.surname
form.validators.mandatoryErr = (value, key, data, input) => {
if(typeof value === 'boolean') {
return value === true? value : `${key} is mandatory`
} else {
return value === ''? `${key} is mandatory`: value.length > 0 && value !== '' && /^([^\W\s]+)$/.test(value)? true : `invalid ${key} format`
}
}
form.validators.birthday = (value, key, data, input) => {
let today = new Date()
let given = new Date(value)
let lowest = new Date()
lowest.setFullYear(1900)
lowest.setHours(0,0,0,0)
today.setHours(0,0,0,0)
given.setHours(0,0,0,0)
if(given >= today || given < lowest || value === '') {
return `Wrong ${key}`
}else {
return true
}
}
for(let key in form) {
form.checkInfo(form[key], key,)
}
console.log(form)