import React, { Component, PropTypes } from "react" import ImPropTypes from "react-immutable-proptypes" import { List } from "immutable" const braceOpen = "{" const braceClose = "}" const EnumModel = ({ value }) => { let collapsedContent = Array [ { value.count() } ] return Enum:
[ { value.join(", ") } ]
} EnumModel.propTypes = { value: ImPropTypes.iterable } class ObjectModel extends Component { static propTypes = { schema: PropTypes.object.isRequired, getComponent: PropTypes.func.isRequired, specSelectors: PropTypes.object.isRequired, name: PropTypes.string, isRef: PropTypes.bool, expandDepth: PropTypes.number, depth: PropTypes.number } render(){ let { schema, name, isRef, getComponent, depth, ...props } = this.props let { expandDepth } = this.props const JumpToPath = getComponent("JumpToPath", true) let description = schema.get("description") let properties = schema.get("properties") let additionalProperties = schema.get("additionalProperties") let title = schema.get("title") || name let required = schema.get("required") const JumpToPathSection = ({ name }) => let collapsedContent = ( { braceOpen }...{ braceClose } { isRef ? : "" } ) return { title && { isRef && schema.get("$$ref") && { schema.get("$$ref") } } { title } } expandDepth } collapsedContent={ collapsedContent }> { braceOpen } { !isRef ? null : } { { !description ? null : } { !(properties && properties.size) ? null : properties.entrySeq().map( ([key, value]) => { let isRequired = List.isList(required) && required.contains(key) let propertyStyle = { verticalAlign: "top", paddingRight: "0.2em" } if ( isRequired ) { propertyStyle.fontWeight = "bold" } return () }).toArray() } { !additionalProperties || !additionalProperties.size ? null : }
description: { description }
{ key }:
{ "< * >:" }
}
{ braceClose }
} } class Primitive extends Component { static propTypes = { schema: PropTypes.object.isRequired, required: PropTypes.bool } render(){ let { schema, required } = this.props if(!schema || !schema.get) { // don't render if schema isn't correctly formed return
} let type = schema.get("type") let format = schema.get("format") let xml = schema.get("xml") let enumArray = schema.get("enum") let properties = schema.filter( ( v, key) => ["enum", "type", "format", "$$ref"].indexOf(key) === -1 ) let style = required ? { fontWeight: "bold" } : {} let propStyle = { color: "#999", fontStyle: "italic" } return { type } { required && *} { format && (${format})} { properties.size ? properties.entrySeq().map( ( [ key, v ] ) =>
{ key !== "description" && key + ": " }{ String(v) }
) : null } { xml && xml.size ? (
xml: { xml.entrySeq().map( ( [ key, v ] ) =>
   {key}: { String(v) }
).toArray() }
): null } { enumArray && }
} } class ArrayModel extends Component { static propTypes = { schema: PropTypes.object.isRequired, getComponent: PropTypes.func.isRequired, specSelectors: PropTypes.object.isRequired, name: PropTypes.string, required: PropTypes.bool, expandDepth: PropTypes.number, depth: PropTypes.number } render(){ let { required, schema, depth, expandDepth } = this.props let items = schema.get("items") return { schema.get("title") } expandDepth } collapsedContent="[...]"> [ ] { required && *} } } class Model extends Component { static propTypes = { schema: PropTypes.object.isRequired, getComponent: PropTypes.func.isRequired, specSelectors: PropTypes.object.isRequired, name: PropTypes.string, isRef: PropTypes.bool, required: PropTypes.bool, expandDepth: PropTypes.number, depth: PropTypes.number } getModelName =( ref )=> { if ( ref.indexOf("#/definitions/") !== -1 ) { return ref.replace(/^.*#\/definitions\//, "") } } getRefSchema =( model )=> { let { specSelectors } = this.props return specSelectors.findDefinition(model) } render () { let { schema, required, name, isRef } = this.props let $$ref = schema && schema.get("$$ref") let modelName = $$ref && this.getModelName( $$ref ) let modelSchema, type if ( schema && (schema.get("type") || schema.get("properties")) ) { modelSchema = schema } else if ( $$ref ) { modelSchema = this.getRefSchema( modelName ) } type = modelSchema && modelSchema.get("type") if ( !type && modelSchema && modelSchema.get("properties") ) { type = "object" } switch(type) { case "object": return case "array": return case "string": case "number": case "integer": case "boolean": default: return } } } export default class ModelComponent extends Component { static propTypes = { schema: PropTypes.object.isRequired, name: PropTypes.string, getComponent: PropTypes.func.isRequired, specSelectors: PropTypes.object.isRequired, expandDepth: PropTypes.number } render(){ return
} } class Collapse extends Component { static propTypes = { collapsedContent: PropTypes.any, collapsed: PropTypes.bool, children: PropTypes.any } static defaultProps = { collapsedContent: "{...}", collapsed: true, } constructor(props, context) { super(props, context) let { collapsed, collapsedContent } = this.props this.state = { collapsed: collapsed !== undefined ? collapsed : Collapse.defaultProps.collapsed, collapsedContent: collapsedContent || Collapse.defaultProps.collapsedContent } } toggleCollapsed=()=>{ this.setState({ collapsed: !this.state.collapsed }) } render () { return ( { this.state.collapsed ? this.state.collapsedContent : this.props.children } ) } }