From 12c96e3190052b0c04acfab4866be097a5747e7e Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Sat, 9 Sep 2017 13:51:09 -0600 Subject: [PATCH] Add comment to array-model for to clarify change. Rework logic in `Model.render()` to fix bug with overriding name and schema from `$ref` definition. --- src/core/components/array-model.jsx | 7 +- src/core/components/model.jsx | 100 +++++++--------------------- 2 files changed, 30 insertions(+), 77 deletions(-) diff --git a/src/core/components/array-model.jsx b/src/core/components/array-model.jsx index f0046aec..a9c36a2c 100644 --- a/src/core/components/array-model.jsx +++ b/src/core/components/array-model.jsx @@ -28,10 +28,15 @@ export default class ArrayModel extends Component { { title } + /* + Note: we set `name={null}` in below because we don't want + the name of the current Model passed (and displayed) as the name of the array element Model + */ + return expandDepth } collapsedContent="[...]"> [ - + ] { properties.size ? diff --git a/src/core/components/model.jsx b/src/core/components/model.jsx index 8fe25219..73163388 100644 --- a/src/core/components/model.jsx +++ b/src/core/components/model.jsx @@ -28,25 +28,40 @@ export default class Model extends Component { return specSelectors.findDefinition(model) } - renderModel( type, props, modelSchema, modelName, isRef, required, getComponent, specSelectors ) { + render () { + let { getComponent, specSelectors, schema, required, name, isRef } = this.props const ObjectModel = getComponent("ObjectModel") const ArrayModel = getComponent("ArrayModel") const PrimitiveModel = getComponent("PrimitiveModel") - const deprecated = specSelectors.isOAS3() && modelSchema.get("deprecated") - + let type = "object" + let $$ref = schema && schema.get("$$ref") + + // If we weren't passed a `name` but have a ref, grab the name from the ref + if ( !name && $$ref ) { + name = this.getModelName( $$ref ) + } + // If we weren't passed a `schema` but have a ref, grab the schema from the ref + if ( !schema && $$ref ) { + schema = this.getRefSchema( name ) + } + + const deprecated = specSelectors.isOAS3() && schema.get("deprecated") + isRef = isRef !== undefined ? isRef : !!$$ref + type = schema && schema.get("type") || type + switch(type) { case "object": return case "array": return case "string": @@ -57,77 +72,10 @@ export default class Model extends Component { return } } - - 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 ) - } }