@@ -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> | ||||
} | } | ||||
} | } |
@@ -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 |
@@ -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 |
@@ -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) | |||||
}) | |||||
}) | }) |