import React from 'react';
import { Input, Select, Enabler } from './';
import { FormObjToJSON, bcrypt_password, format } from '../helpers/';
import "./formbuilder.scss";
export class FormBuilder extends React.Component {
constructor(props){
super(props);
}
section(struct, key, level = 0){
if(struct == null) struct = "";
const isALeaf = function(struct){
if("label" in struct && "type" in struct &&
"value" in struct && "default" in struct){
return true;
}
return false;
};
if(Array.isArray(struct)) return null;
else if(isALeaf(struct) === false){
if(level <= 1){
return (
{
key ?
{ format(key) }
: ""
}
{
Object.keys(struct).map((key, index) => {
return (
{ this.section(struct[key], key, level + 1) }
);
})
}
);
}
return (
);
}
let id = {};
let target = [];
if(struct.id !== undefined){
id.id = this.props.idx === undefined ? struct.id : struct.id + "_" + this.props.idx;
}
if(struct.type === "enable"){
target = struct.target.map((target) => {
return this.props.idx === undefined ? target : target + "_" + this.props.idx;
});
}
const onChange = function(e, fn){
struct.value = e;
if(typeof fn === "function"){
fn(struct);
}
this.props.onChange.call(
this,
FormObjToJSON(this.props.form)
);
};
return ( );
}
render(){
return this.section(this.props.form || {});
}
}
const FormElement = (props) => {
const id = props.id !== undefined ? {id: props.id} : {};
let struct = props.params;
let $input = ( props.onChange(e.target.value)} {...id} name={props.name} type="text" defaultValue={struct.value} placeholder={struct.placeholder} /> );
switch(props.params["type"]){
case "text":
const onTextChange = (value) => {
if(value === ""){
value = null;
}
props.onChange(value);
};
$input = ( onTextChange(e.target.value)} {...id} name={props.name} type="text" value={struct.value || ""} placeholder={struct.placeholder}/> );
break;
case "number":
const onNumberChange = (value) => {
value = value === "" ? null : parseInt(value);
props.onChange(value);
};
$input = ( onNumberChange(e.target.value)} {...id} name={props.name} type="number" value={struct.value || ""} placeholder={struct.placeholder} /> );
break;
case "password":
const onPasswordChange = (value) => {
if(value === ""){
value = null;
}
props.onChange(value);
};
$input = ( onPasswordChange(e.target.value)} {...id} name={props.name} type="password" value={struct.value || ""} placeholder={struct.placeholder} /> );
break;
case "bcrypt":
const onBcryptChange = (value) => {
if(value === ""){
return props.onChange(null);
}
bcrypt_password(value).then((hash) => {
props.onChange(hash);
});
};
$input = ( onBcryptChange(e.target.value)} {...id} name={props.name} type="password" defaultValue={struct.value || ""} placeholder={struct.placeholder} /> );
break;
case "hidden":
$input = ( );
break;
case "boolean":
$input = ( props.onChange(e.target.checked)} {...id} name={props.name} type="checkbox" checked={struct.value === null ? !!struct.default : struct.value} /> );
break;
case "select":
$input = (