feat: add modelcollapse to primitive models (#7557)
* update: primitive-model test with modelcollapse Co-authored-by: Tim Lai <timothy.lai@gmail.com>
This commit is contained in:
@@ -11,11 +11,12 @@ export default class Primitive extends Component {
|
|||||||
getConfigs: PropTypes.func.isRequired,
|
getConfigs: PropTypes.func.isRequired,
|
||||||
name: PropTypes.string,
|
name: PropTypes.string,
|
||||||
displayName: PropTypes.string,
|
displayName: PropTypes.string,
|
||||||
depth: PropTypes.number
|
depth: PropTypes.number,
|
||||||
|
expandDepth: PropTypes.number
|
||||||
}
|
}
|
||||||
|
|
||||||
render(){
|
render(){
|
||||||
let { schema, getComponent, getConfigs, name, displayName, depth } = this.props
|
let { schema, getComponent, getConfigs, name, displayName, depth, expandDepth } = this.props
|
||||||
|
|
||||||
const { showExtensions } = getConfigs()
|
const { showExtensions } = getConfigs()
|
||||||
|
|
||||||
@@ -37,33 +38,40 @@ export default class Primitive extends Component {
|
|||||||
const Markdown = getComponent("Markdown", true)
|
const Markdown = getComponent("Markdown", true)
|
||||||
const EnumModel = getComponent("EnumModel")
|
const EnumModel = getComponent("EnumModel")
|
||||||
const Property = getComponent("Property")
|
const Property = getComponent("Property")
|
||||||
|
const ModelCollapse = getComponent("ModelCollapse")
|
||||||
|
const titleEl = title &&
|
||||||
|
<span className="model-title">
|
||||||
|
<span className="model-title__text">{ title }</span>
|
||||||
|
</span>
|
||||||
|
|
||||||
return <span className="model">
|
return <span className="model">
|
||||||
<span className="prop">
|
<ModelCollapse title={titleEl} expanded={depth >= expandDepth} collapsedContent=" " hideSelfOnExpand={expandDepth !== depth}>
|
||||||
{ name && <span className={`${depth === 1 && "model-title"} prop-name`}>{ title }</span> }
|
<span className="prop">
|
||||||
<span className="prop-type">{ type }</span>
|
{name && depth > 1 && <span className={`${depth === 1 && "model-title"} prop-name`}>{ title }</span> }
|
||||||
{ format && <span className="prop-format">(${format})</span>}
|
<span className="prop-type">{ type }</span>
|
||||||
{
|
{ format && <span className="prop-format">(${format})</span>}
|
||||||
properties.size ? properties.entrySeq().map( ( [ key, v ] ) => <Property key={`${key}-${v}`} propKey={ key } propVal={ v } propClass={ propClass } />) : null
|
{
|
||||||
}
|
properties.size ? properties.entrySeq().map( ( [ key, v ] ) => <Property key={`${key}-${v}`} propKey={ key } propVal={ v } propClass={ propClass } />) : null
|
||||||
{
|
}
|
||||||
showExtensions && extensions.size ? extensions.entrySeq().map( ( [ key, v ] ) => <Property key={`${key}-${v}`} propKey={ key } propVal={ v } propClass={ propClass } />) : null
|
{
|
||||||
}
|
showExtensions && extensions.size ? extensions.entrySeq().map( ( [ key, v ] ) => <Property key={`${key}-${v}`} propKey={ key } propVal={ v } propClass={ propClass } />) : null
|
||||||
{
|
}
|
||||||
!description ? null :
|
{
|
||||||
<Markdown source={ description } />
|
!description ? null :
|
||||||
}
|
<Markdown source={ description } />
|
||||||
{
|
}
|
||||||
xml && xml.size ? (<span><br /><span className={ propClass }>xml:</span>
|
{
|
||||||
{
|
xml && xml.size ? (<span><br /><span className={ propClass }>xml:</span>
|
||||||
xml.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} className={ propClass }><br/> {key}: { String(v) }</span>).toArray()
|
{
|
||||||
}
|
xml.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} className={ propClass }><br/> {key}: { String(v) }</span>).toArray()
|
||||||
</span>): null
|
}
|
||||||
}
|
</span>): null
|
||||||
{
|
}
|
||||||
enumArray && <EnumModel value={ enumArray } getComponent={ getComponent } />
|
{
|
||||||
}
|
enumArray && <EnumModel value={ enumArray } getComponent={ getComponent } />
|
||||||
</span>
|
}
|
||||||
|
</span>
|
||||||
|
</ModelCollapse>
|
||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,14 +2,15 @@ import React from "react"
|
|||||||
import { shallow } from "enzyme"
|
import { shallow } from "enzyme"
|
||||||
import { fromJS } from "immutable"
|
import { fromJS } from "immutable"
|
||||||
import PrimitiveModel from "components/primitive-model"
|
import PrimitiveModel from "components/primitive-model"
|
||||||
|
import ModelCollapse from "components/model-collapse"
|
||||||
|
|
||||||
describe("<PrimitiveModel/>", function () {
|
describe("<PrimitiveModel/>", function () {
|
||||||
describe("Model name", function () {
|
|
||||||
const dummyComponent = () => null
|
const dummyComponent = () => null
|
||||||
const components = {
|
const components = {
|
||||||
Markdown: dummyComponent,
|
Markdown: dummyComponent,
|
||||||
EnumModel: dummyComponent,
|
EnumModel: dummyComponent,
|
||||||
Property: dummyComponent,
|
Property: dummyComponent,
|
||||||
|
"ModelCollapse" : ModelCollapse,
|
||||||
}
|
}
|
||||||
const props = {
|
const props = {
|
||||||
getComponent: c => components[c],
|
getComponent: c => components[c],
|
||||||
@@ -21,17 +22,16 @@ describe("<PrimitiveModel/>", function () {
|
|||||||
schema: fromJS({
|
schema: fromJS({
|
||||||
type: "string",
|
type: "string",
|
||||||
title: "Custom model title"
|
title: "Custom model title"
|
||||||
})
|
}),
|
||||||
|
expandDepth: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
it("renders the schema's title", function () {
|
it("renders the schema's title", function () {
|
||||||
// When
|
// When
|
||||||
const wrapper = shallow(<PrimitiveModel {...props} />)
|
const wrapper = shallow(<PrimitiveModel {...props} />)
|
||||||
const modelTitleEl = wrapper.find("span.model-title")
|
const modelTitleEl = wrapper.find("ModelCollapse").prop("title").props.children.props.children
|
||||||
expect(modelTitleEl.length).toEqual(1)
|
|
||||||
|
|
||||||
// Then
|
expect(modelTitleEl).toEqual("Custom model title")
|
||||||
expect(modelTitleEl.text()).toEqual("Custom model title")
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it("falls back to the passed-in `name` prop for the title", function () {
|
it("falls back to the passed-in `name` prop for the title", function () {
|
||||||
@@ -40,12 +40,16 @@ describe("<PrimitiveModel/>", function () {
|
|||||||
type: "string"
|
type: "string"
|
||||||
})
|
})
|
||||||
const wrapper = shallow(<PrimitiveModel {...props} />)
|
const wrapper = shallow(<PrimitiveModel {...props} />)
|
||||||
const modelTitleEl = wrapper.find("span.model-title")
|
const modelTitleEl = wrapper.find("ModelCollapse").prop("title").props.children.props.children
|
||||||
expect(modelTitleEl.length).toEqual(1)
|
|
||||||
|
|
||||||
// Then
|
// Then
|
||||||
expect(modelTitleEl.text()).toEqual("Name from props")
|
expect(modelTitleEl).toEqual("Name from props")
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
})
|
it("renders a collapsible header", function(){
|
||||||
|
const wrapper = shallow(<PrimitiveModel {...props}/>)
|
||||||
|
const renderedModelCollapse = wrapper.find(ModelCollapse)
|
||||||
|
expect(renderedModelCollapse.length).toEqual(1)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user