import React, { PureComponent, Component } from "react" import PropTypes from "prop-types" import { List, fromJS } from "immutable" import cx from "classnames" import ImPropTypes from "react-immutable-proptypes" import DebounceInput from "react-debounce-input" import { stringify } from "core/utils" //import "less/json-schema-form" const noop = ()=> {} const JsonSchemaPropShape = { getComponent: PropTypes.func.isRequired, value: PropTypes.any, onChange: PropTypes.func, keyName: PropTypes.any, fn: PropTypes.object.isRequired, schema: PropTypes.object, errors: ImPropTypes.list, required: PropTypes.bool, dispatchInitialValue: PropTypes.bool, description: PropTypes.any, disabled: PropTypes.bool, } const JsonSchemaDefaultProps = { value: "", onChange: noop, schema: {}, keyName: "", required: false, errors: List() } export class JsonSchemaForm extends Component { static propTypes = JsonSchemaPropShape static defaultProps = JsonSchemaDefaultProps componentDidMount() { const { dispatchInitialValue, value, onChange } = this.props if(dispatchInitialValue) { onChange(value) } } render() { let { schema, errors, value, onChange, getComponent, fn, disabled } = this.props if(schema.toJS) schema = schema.toJS() let { type, format="" } = schema // In the json schema rendering code, we optimistically query our system for a number of components. // If the component doesn't exist, we optionally suppress these warnings. let getComponentSilently = (name) => getComponent(name, false, { failSilently: true }) let Comp = (format ? getComponentSilently(`JsonSchema_${type}_${format}`) : getComponentSilently(`JsonSchema_${type}`)) || getComponentSilently("JsonSchema_string") return } } export class JsonSchema_string extends Component { static propTypes = JsonSchemaPropShape static defaultProps = JsonSchemaDefaultProps onChange = (e) => { const value = this.props.schema["type"] === "file" ? e.target.files[0] : e.target.value this.props.onChange(value, this.props.keyName) } onEnumChange = (val) => this.props.onChange(val) render() { let { getComponent, value, schema, errors, required, description, disabled } = this.props let enumValue = schema["enum"] errors = errors.toJS ? errors.toJS() : [] if ( enumValue ) { const Select = getComponent("Select") return () } else { return () } } } export class JsonSchema_array extends PureComponent { static propTypes = JsonSchemaPropShape static defaultProps = JsonSchemaDefaultProps constructor(props, context) { super(props, context) this.state = { value: valueOrEmptyList(props.value)} } componentWillReceiveProps(props) { if(props.value !== this.state.value) this.setState({value: props.value}) } onChange = () => this.props.onChange(this.state.value) onItemChange = (itemVal, i) => { this.setState(state => ({ value: state.value.set(i, itemVal) }), this.onChange) } removeItem = (i) => { this.setState(state => ({ value: state.value.remove(i) }), this.onChange) } addItem = () => { this.setState(state => { state.value = valueOrEmptyList(state.value) return { value: state.value.push("") } }, this.onChange) } onEnumChange = (value) => { this.setState(() => ({ value: value }), this.onChange) } render() { let { getComponent, required, schema, errors, fn, disabled } = this.props errors = errors.toJS ? errors.toJS() : [] let itemSchema = fn.inferSchema(schema.items) const JsonSchemaForm = getComponent("JsonSchemaForm") const Button = getComponent("Button") let enumValue = itemSchema["enum"] let value = this.state.value if ( enumValue ) { const Select = getComponent("Select") return () } } export class JsonSchema_object extends PureComponent { constructor() { super() } static propTypes = JsonSchemaPropShape static defaultProps = JsonSchemaDefaultProps onChange = (value) => { this.props.onChange(value) } handleOnChange = e => { const inputValue = e.target.value this.onChange(inputValue) } render() { let { getComponent, value, errors, disabled } = this.props const TextArea = getComponent("TextArea") return (