From e9f46e6f5e954fd94b7af6370bd401b4ba4597ae Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Fri, 8 Sep 2017 17:59:41 -0600 Subject: [PATCH] Working on refactoring of model.jsx --- src/core/components/model.jsx | 102 +++++++++++++++++++++++++-------- src/core/components/models.jsx | 1 - 2 files changed, 77 insertions(+), 26 deletions(-) diff --git a/src/core/components/model.jsx b/src/core/components/model.jsx index 639751f4..8fe25219 100644 --- a/src/core/components/model.jsx +++ b/src/core/components/model.jsx @@ -28,41 +28,25 @@ export default class Model extends Component { return specSelectors.findDefinition(model) } - render () { - let { getComponent, specSelectors, schema, required, name, isRef } = this.props - let ObjectModel = getComponent("ObjectModel") - let ArrayModel = getComponent("ArrayModel") - let PrimitiveModel = getComponent("PrimitiveModel") - let $$ref = schema && schema.get("$$ref") - let modelName = $$ref && this.getModelName( $$ref ) - let modelSchema, type - - const deprecated = specSelectors.isOAS3() && schema.get("deprecated") - - 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" - } + renderModel( type, props, modelSchema, modelName, isRef, required, getComponent, specSelectors ) { + const ObjectModel = getComponent("ObjectModel") + const ArrayModel = getComponent("ArrayModel") + const PrimitiveModel = getComponent("PrimitiveModel") + const deprecated = specSelectors.isOAS3() && modelSchema.get("deprecated") switch(type) { case "object": return + isRef={ isRef } /> case "array": return case "string": @@ -76,6 +60,74 @@ export default class Model extends Component { schema={ modelSchema } name={ modelName } deprecated={deprecated} - required={ required }/> } + required={ required }/> + } + } + + render () { + let { getComponent, specSelectors, schema, required, name, isRef } = this.props + let modelName, modelSchema, type + let $$ref = schema && schema.get("$$ref") + + console.log("Rendering model", this.getModelName( $$ref ), name, $$ref, schema.toJS()) + + if ( schema && (schema.get("type") || schema.get("properties")) ) { + // props.schema is a normal schema + modelName = name + modelSchema = schema + } else if ( $$ref ) { + // props.schema is not a normal schema, most likely a $ref + modelName = this.getModelName( $$ref ) + modelSchema = this.getRefSchema( modelName ) + } + + if ( !modelSchema ) { + // Don't bother rendering an invalid schema + return null + } + + // Default `type` to object + type = modelSchema.get("type") || "object" + isRef = isRef !== undefined ? isRef : !!$$ref + + // If the model is `oneOf` or `anyOf`, go through its available types + // and render each type as part of an array + // if ( this.props.schema.get("oneOf") || this.props.schema.get("anyOf") ) { + // const isOneOf = this.props.schema.get("oneOf") + // const options = this.props.schema.get("oneOf") || this.props.schema.get("anyOf") + // return ( + // + // { isOneOf ? "One of: " : "Any of: " } + // { options.map( (typeOption, i) => { + // const type = typeOption.get("type") + // const $$ref = typeOption.get("$$ref") + + // // Override modelName if the typeOption is a $$ref to another Model + // if ( $$ref ) { + // console.log("reassigning model name from", typeOption.toJS(), modelName, this.getModelName( $$ref )) + // // modelName = $$ref && this.getModelName( $$ref ) + // } + + // let result = [] + // // "join" together the options with " or "/" and " + // if ( i > 0 ) { + // result.push(  or  ) + // } + + // // Render the Model component, overriding the props.schema and modelSchema properties + // // with the proper type from the current iteration of the available types + // result.push( + // { this.renderModel( type, { + // ...this.props, + // schema: typeOption + // }, typeOption, modelName, name, deprecated, isRef, $$ref, required, getComponent ) } + // ) + // return result + // } ).toJS() } + // + // ) + // } + + return this.renderModel( type, this.props, modelSchema, modelName, isRef, required, getComponent, specSelectors ) } } diff --git a/src/core/components/models.jsx b/src/core/components/models.jsx index 1af412ab..29ac96d0 100644 --- a/src/core/components/models.jsx +++ b/src/core/components/models.jsx @@ -34,7 +34,6 @@ export default class Models extends Component { return