'use strict'; import React, {Component} from "react"; import jsonLogic from 'json-logic-js'; // https://stackoverflow.com/a/70511311 const trueTypeOf = (obj) => Object.prototype.toString.call(obj).slice(8, -1).toLowerCase(); class Radio extends Component { constructor(props) { super(props); // Initialize the state object with the initial values from the props this.state = { variant: props.outvar in props.data ? props.data[props.outvar] : props.variants[0], }; // Bind the event handler to this this.handleClick = this.handleClick.bind(this); this.props.target(this.props.outvar, this.state.variant); } handleClick(variant) { // Update the state object with the new value for outvar this.setState({ ...this.state, variant: variant }); this.props.target(this.props.outvar, variant); } render() { let key = this.props.id + this.props.outvar; return (
{this.props.title} {this.props.variants.map((variant, _) => (
this.handleClick(variant)} onChange={() => this.handleClick(variant)} />
))}
); } } function RadioWrapper(target, id, data, {title, variants, outvar}) { return ; } class Switch extends Component { constructor(props) { super(props); // Initialize the state object with the initial values from the props this.state = { checked: props.outvar in props.data ? props.data[props.outvar] : !!(props.fallback) }; // Bind the event handler to this this.handleClick = this.handleClick.bind(this); this.props.target(this.props.outvar, this.state.checked); } handleClick() { // Update the state object with the new value for outvar let new_checked = !this.state.checked; this.setState({ checked: new_checked }); this.props.target(this.props.outvar, new_checked); } render() { let key = this.props.id + this.props.outvar; return (
); } } function SwitchWrapper(target, id, data, {title, fallback, outvar}) { return ; } class Line extends Component { constructor(props) { super(props); // Initialize the state object with the initial values from the props this.state = { text: props.outvar in props.data ? props.data[props.outvar] : (props.fallback ? props.fallback : "") }; // Bind the event handler to this this.handleClick = this.handleClick.bind(this); this.props.target(this.props.outvar, this.state.text); } handleClick(element) { let text = element.target.value; this.setState({ text: text }); this.props.target(this.props.outvar, text); } render() { let key = this.props.id + this.props.outvar; return (
); } } function LineWrapper(target, id, data, {title, fallback, outvar}) { return ; } class SwitchLine extends Component { constructor(props) { super(props); // Initialize the state object with the initial values from the props this.state = { text: props.outvar in props.data ? props.data[props.outvar].text : (props.fallback ? props.fallback.text : ""), checked: props.outvar in props.data ? props.data[props.outvar].checked : (props.fallback ? props.fallback.checked : false) }; // Bind the event handler to this this.handleText = this.handleText.bind(this); this.handleCheck = this.handleCheck.bind(this); this.props.target(this.props.outvar, this.state); } handleText(element) { let new_state = { ...this.state, text: element.target.value } this.setState(new_state); this.props.target(this.props.outvar, new_state); } handleCheck() { // Update the state object with the new value for outvar let new_state = { text: !this.state.checked ? this.state.text : "", checked: !this.state.checked } this.setState(new_state); this.props.target(this.props.outvar, new_state); } render() { let key = this.props.id + this.props.outvar; return (
); } } function SwitchLineWrapper(target, id, data, {title, fallback, outvar}) { return ; } function UnimplementedComponent(type, id) { //console.error("Missing component with type:", type) return
UNIMPLEMENTED
} const componentsList = { "Radio": RadioWrapper, "Switch": SwitchWrapper, "Line": LineWrapper, "SwitchLine": SwitchLineWrapper, "Default": UnimplementedComponent, }; export default function ProcessOptions({options, data, target, id}) { let options_t = trueTypeOf(options); if (options_t === "array") { return Array.from( options.map((option_item, i) => ProcessOptions({ options: option_item, data: data, target: target, id: id + i })) ); } else if (options_t === "object") { if ( trueTypeOf(options.type) === "string" && trueTypeOf(options.args) === "object" ) { if (options.type in componentsList) { return componentsList[options.type](target, id + options.type, data, options.args); } else { return componentsList["Default"](options.type, id + "missing"); } } else { return ProcessOptions({options: jsonLogic.apply(options, data), data: data, target: target, id: id}); } } }