@@ -5,6 +5,7 @@ import ImPropTypes from "react-immutable-proptypes"
|
|||||||
|
|
||||||
const braceOpen = "{"
|
const braceOpen = "{"
|
||||||
const braceClose = "}"
|
const braceClose = "}"
|
||||||
|
const propStyle = { color: "#6b6b6b", fontStyle: "italic" }
|
||||||
|
|
||||||
export default class ObjectModel extends Component {
|
export default class ObjectModel extends Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
@@ -40,11 +41,14 @@ export default class ObjectModel extends Component {
|
|||||||
let additionalProperties = schema.get("additionalProperties")
|
let additionalProperties = schema.get("additionalProperties")
|
||||||
let title = schema.get("title") || displayName || name
|
let title = schema.get("title") || displayName || name
|
||||||
let requiredProperties = schema.get("required")
|
let requiredProperties = schema.get("required")
|
||||||
|
let infoProperties = schema
|
||||||
|
.filter( ( v, key) => ["nullable"].indexOf(key) !== -1 )
|
||||||
|
|
||||||
const JumpToPath = getComponent("JumpToPath", true)
|
const JumpToPath = getComponent("JumpToPath", true)
|
||||||
const Markdown = getComponent("Markdown", true)
|
const Markdown = getComponent("Markdown", true)
|
||||||
const Model = getComponent("Model")
|
const Model = getComponent("Model")
|
||||||
const ModelCollapse = getComponent("ModelCollapse")
|
const ModelCollapse = getComponent("ModelCollapse")
|
||||||
|
const Property = getComponent("Property")
|
||||||
|
|
||||||
const JumpToPathSection = () => {
|
const JumpToPathSection = () => {
|
||||||
return <span className="model-jump-to-path"><JumpToPath specPath={specPath} /></span>
|
return <span className="model-jump-to-path"><JumpToPath specPath={specPath} /></span>
|
||||||
@@ -217,6 +221,9 @@ export default class ObjectModel extends Component {
|
|||||||
</span>
|
</span>
|
||||||
<span className="brace-close">{ braceClose }</span>
|
<span className="brace-close">{ braceClose }</span>
|
||||||
</ModelCollapse>
|
</ModelCollapse>
|
||||||
|
{
|
||||||
|
infoProperties.size ? infoProperties.entrySeq().map( ( [ key, v ] ) => <Property key={`${key}-${v}`} propKey={ key } propVal={ v } propStyle={ propStyle } />) : null
|
||||||
|
}
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
14
test/e2e-cypress/static/documents/bugs/5660-model.yaml
Normal file
14
test/e2e-cypress/static/documents/bugs/5660-model.yaml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
openapi: 3.0.2
|
||||||
|
info:
|
||||||
|
title: test
|
||||||
|
description: Nullable model itself
|
||||||
|
version: '1.0'
|
||||||
|
paths: {}
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
SomeObject:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
nullable: true
|
||||||
17
test/e2e-cypress/static/documents/bugs/5660-property.yaml
Normal file
17
test/e2e-cypress/static/documents/bugs/5660-property.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
openapi: 3.0.2
|
||||||
|
info:
|
||||||
|
title: test
|
||||||
|
description: Nullable object in model property
|
||||||
|
version: '1.0'
|
||||||
|
paths: {}
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
SomeObject:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
meta:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
tag:
|
||||||
|
type: string
|
||||||
|
nullable: true
|
||||||
20
test/e2e-cypress/tests/bugs/5660.js
Normal file
20
test/e2e-cypress/tests/bugs/5660.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// http://github.com/swagger-api/swagger-ui/issues/5660
|
||||||
|
|
||||||
|
const expectedValue = "nullable: true"
|
||||||
|
|
||||||
|
describe("#5660: Nullable object", () => {
|
||||||
|
it("should render `nullable` marker for object ifself", () => {
|
||||||
|
cy.visit("/?url=/documents/bugs/5660-model.yaml")
|
||||||
|
.get("#model-SomeObject .model-toggle")
|
||||||
|
.click()
|
||||||
|
.get("#model-SomeObject > .model-box")
|
||||||
|
.contains(expectedValue)
|
||||||
|
})
|
||||||
|
it("should render `nullable` marker for nexted object in property", () => {
|
||||||
|
cy.visit("/?url=/documents/bugs/5660-property.yaml")
|
||||||
|
.get("#model-SomeObject .model-toggle")
|
||||||
|
.click()
|
||||||
|
.get("#model-SomeObject > .model-box")
|
||||||
|
.contains(expectedValue)
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -7,6 +7,7 @@ import ModelExample from "components/model-example"
|
|||||||
import Immutable from "immutable"
|
import Immutable from "immutable"
|
||||||
import Model from "components/model"
|
import Model from "components/model"
|
||||||
import ModelCollapse from "components/model-collapse"
|
import ModelCollapse from "components/model-collapse"
|
||||||
|
import Property from "components/property"
|
||||||
import { inferSchema } from "corePlugins/samples/fn"
|
import { inferSchema } from "corePlugins/samples/fn"
|
||||||
|
|
||||||
describe("<ObjectModel />", function() {
|
describe("<ObjectModel />", function() {
|
||||||
@@ -15,7 +16,8 @@ describe("<ObjectModel />", function() {
|
|||||||
"JumpToPath" : dummyComponent,
|
"JumpToPath" : dummyComponent,
|
||||||
"Markdown" : dummyComponent,
|
"Markdown" : dummyComponent,
|
||||||
"Model" : Model,
|
"Model" : Model,
|
||||||
"ModelCollapse" : ModelCollapse
|
"ModelCollapse" : ModelCollapse,
|
||||||
|
"Property" : Property
|
||||||
}
|
}
|
||||||
const props = {
|
const props = {
|
||||||
getComponent: c => components[c],
|
getComponent: c => components[c],
|
||||||
@@ -52,6 +54,11 @@ describe("<ObjectModel />", function() {
|
|||||||
},
|
},
|
||||||
className: "for-test"
|
className: "for-test"
|
||||||
}
|
}
|
||||||
|
const propsNullable = {
|
||||||
|
...props,
|
||||||
|
schema: props.schema.set("nullable", true)
|
||||||
|
}
|
||||||
|
|
||||||
it("renders a collapsible header", function(){
|
it("renders a collapsible header", function(){
|
||||||
const wrapper = shallow(<ObjectModel {...props}/>)
|
const wrapper = shallow(<ObjectModel {...props}/>)
|
||||||
const renderedModelCollapse = wrapper.find(ModelCollapse)
|
const renderedModelCollapse = wrapper.find(ModelCollapse)
|
||||||
@@ -66,4 +73,18 @@ describe("<ObjectModel />", function() {
|
|||||||
expect(renderedModel.get(1).props.schema.get("name")).toEqual("b")
|
expect(renderedModel.get(1).props.schema.get("name")).toEqual("b")
|
||||||
expect(renderedModel.get(2).props.schema.get("name")).toEqual("a")
|
expect(renderedModel.get(2).props.schema.get("name")).toEqual("a")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it("doesn't render `nullable` for model when it absent", function() {
|
||||||
|
const wrapper = shallow(<ObjectModel {...props}/>)
|
||||||
|
const renderProperties = wrapper.find(Property)
|
||||||
|
expect(renderProperties.length).toEqual(0)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("renders `nullable` for model", function() {
|
||||||
|
const wrapper = shallow(<ObjectModel {...propsNullable}/>)
|
||||||
|
const renderProperties = wrapper.find(Property)
|
||||||
|
expect(renderProperties.length).toEqual(1)
|
||||||
|
expect(renderProperties.get(0).props.propKey).toEqual("nullable")
|
||||||
|
expect(renderProperties.get(0).props.propVal).toEqual(true)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user