diff --git a/src/core/components/object-model.jsx b/src/core/components/object-model.jsx
index a50478d1..e62516e8 100644
--- a/src/core/components/object-model.jsx
+++ b/src/core/components/object-model.jsx
@@ -5,6 +5,7 @@ import ImPropTypes from "react-immutable-proptypes"
const braceOpen = "{"
const braceClose = "}"
+const propStyle = { color: "#6b6b6b", fontStyle: "italic" }
export default class ObjectModel extends Component {
static propTypes = {
@@ -40,11 +41,14 @@ export default class ObjectModel extends Component {
let additionalProperties = schema.get("additionalProperties")
let title = schema.get("title") || displayName || name
let requiredProperties = schema.get("required")
+ let infoProperties = schema
+ .filter( ( v, key) => ["nullable"].indexOf(key) !== -1 )
const JumpToPath = getComponent("JumpToPath", true)
const Markdown = getComponent("Markdown", true)
const Model = getComponent("Model")
const ModelCollapse = getComponent("ModelCollapse")
+ const Property = getComponent("Property")
const JumpToPathSection = () => {
return
@@ -217,6 +221,9 @@ export default class ObjectModel extends Component {
{ braceClose }
+ {
+ infoProperties.size ? infoProperties.entrySeq().map( ( [ key, v ] ) => ) : null
+ }
}
}
diff --git a/test/e2e-cypress/static/documents/bugs/5660-model.yaml b/test/e2e-cypress/static/documents/bugs/5660-model.yaml
new file mode 100644
index 00000000..35b04ef1
--- /dev/null
+++ b/test/e2e-cypress/static/documents/bugs/5660-model.yaml
@@ -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
diff --git a/test/e2e-cypress/static/documents/bugs/5660-property.yaml b/test/e2e-cypress/static/documents/bugs/5660-property.yaml
new file mode 100644
index 00000000..19c81f76
--- /dev/null
+++ b/test/e2e-cypress/static/documents/bugs/5660-property.yaml
@@ -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
diff --git a/test/e2e-cypress/tests/bugs/5660.js b/test/e2e-cypress/tests/bugs/5660.js
new file mode 100644
index 00000000..98aa8dba
--- /dev/null
+++ b/test/e2e-cypress/tests/bugs/5660.js
@@ -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)
+ })
+})
diff --git a/test/mocha/components/object-model.jsx b/test/mocha/components/object-model.jsx
index 9a9388fd..892e1ee8 100644
--- a/test/mocha/components/object-model.jsx
+++ b/test/mocha/components/object-model.jsx
@@ -7,6 +7,7 @@ import ModelExample from "components/model-example"
import Immutable from "immutable"
import Model from "components/model"
import ModelCollapse from "components/model-collapse"
+import Property from "components/property"
import { inferSchema } from "corePlugins/samples/fn"
describe("", function() {
@@ -15,7 +16,8 @@ describe("", function() {
"JumpToPath" : dummyComponent,
"Markdown" : dummyComponent,
"Model" : Model,
- "ModelCollapse" : ModelCollapse
+ "ModelCollapse" : ModelCollapse,
+ "Property" : Property
}
const props = {
getComponent: c => components[c],
@@ -52,6 +54,11 @@ describe("", function() {
},
className: "for-test"
}
+ const propsNullable = {
+ ...props,
+ schema: props.schema.set("nullable", true)
+ }
+
it("renders a collapsible header", function(){
const wrapper = shallow()
const renderedModelCollapse = wrapper.find(ModelCollapse)
@@ -66,4 +73,18 @@ describe("", function() {
expect(renderedModel.get(1).props.schema.get("name")).toEqual("b")
expect(renderedModel.get(2).props.schema.get("name")).toEqual("a")
})
+
+ it("doesn't render `nullable` for model when it absent", function() {
+ const wrapper = shallow()
+ const renderProperties = wrapper.find(Property)
+ expect(renderProperties.length).toEqual(0)
+ })
+
+ it("renders `nullable` for model", function() {
+ const wrapper = shallow()
+ 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)
+ })
})