import * as React from "react"; import UpFormGroup from "./UpFormGroup"; import UpSchemaArray from "./UpSchemaArray"; import UpSchemaObject from "./UpSchemaObject"; import ComponentRegistery from "./ComponentRegistery"; import JsonSchemaHelper from "../helper/JsonSchemaHelper"; export interface PropertyViewModel { order: number; colspan: number; component?: string; name: string; } export interface UpSchemaFormComponentSelectorProps { value: any; schema: JsonSchema; node: string; name?: string; onChange: ( e: React.ChangeEvent, newValue: any, hasError: boolean, node: string ) => void; isRequired: boolean; showError: boolean; ignoredProperties?: string[]; viewModels: PropertyViewModel[]; translate: (text: string) => any; onSearchButtonClick: (text: string) => any; } export default class UpSchemaFormComponentSelector extends React.Component< UpSchemaFormComponentSelectorProps, {} > { constructor(p, c) { super(p, c); this.onElementChange = this.onElementChange.bind(this); } Component: { [key: string]: React.ComponentClass } = {}; Register(key: string, Component: React.ComponentClass) { this.Component[key] = Component; } GetComponent(ComponentKey: string): React.ComponentClass { return this.Component[ComponentKey]; } private findGetParameter(parameterName) { var result = null, tmp = []; var items = location.search.substr(1).split("&"); for (var index = 0; index < items.length; index++) { tmp = items[index].split("="); if (tmp[0] === parameterName) result = decodeURIComponent(tmp[1]); } return result; } render() { var element = null; var isControl = true; var isArray = false; var parameters = this.props.node.split("."); if (parameters.length !== 0 && this.props.node !== "") { var parameter = this.findGetParameter(parameters[parameters.length - 1]); if (parameter != null) { this.props.schema.default = parameter; this.props.schema.readonly = true; } } var type = JsonSchemaHelper.getBaseType(this.props.schema); switch (type) { case "object": element = ( ); isControl = false; break; case "array": element = ( ); isArray = true; break; default: element = ComponentRegistery.GetComponentInstance( this.onElementChange, this.props.isRequired, this.props.schema, this.props.showError, this.props.value, this.props.name, this.props.translate, this.props.onSearchButtonClick ); break; } if (isControl) { return ( {element} ); } return element; } private onElementChange = ( e: React.ChangeEvent, value: any, hasError: boolean ) => { this.props.onChange(e, value, hasError, this.props.node); }; }