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 (
{ format(key) } { Object.keys(struct).map((key, index) => { return (
{ this.section(struct[key], key, level + 1) }
); }) }
); } 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" value={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 = (