Skip to content

Commit 77d0bb9

Browse files
twjasatim-lai
andauthoredMar 21, 2022
feat: add modelcollapse to primitive models (#7557)
* update: primitive-model test with modelcollapse Co-authored-by: Tim Lai <timothy.lai@gmail.com>
1 parent c81d7f0 commit 77d0bb9

File tree

2 files changed

+49
-37
lines changed

2 files changed

+49
-37
lines changed
 

‎src/core/components/primitive-model.jsx

+35-27
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,12 @@ export default class Primitive extends Component {
1111
getConfigs: PropTypes.func.isRequired,
1212
name: PropTypes.string,
1313
displayName: PropTypes.string,
14-
depth: PropTypes.number
14+
depth: PropTypes.number,
15+
expandDepth: PropTypes.number
1516
}
1617

1718
render(){
18-
let { schema, getComponent, getConfigs, name, displayName, depth } = this.props
19+
let { schema, getComponent, getConfigs, name, displayName, depth, expandDepth } = this.props
1920

2021
const { showExtensions } = getConfigs()
2122

@@ -37,33 +38,40 @@ export default class Primitive extends Component {
3738
const Markdown = getComponent("Markdown", true)
3839
const EnumModel = getComponent("EnumModel")
3940
const Property = getComponent("Property")
41+
const ModelCollapse = getComponent("ModelCollapse")
42+
const titleEl = title &&
43+
<span className="model-title">
44+
<span className="model-title__text">{ title }</span>
45+
</span>
4046

4147
return <span className="model">
42-
<span className="prop">
43-
{ name && <span className={`${depth === 1 && "model-title"} prop-name`}>{ title }</span> }
44-
<span className="prop-type">{ type }</span>
45-
{ format && <span className="prop-format">(${format})</span>}
46-
{
47-
properties.size ? properties.entrySeq().map( ( [ key, v ] ) => <Property key={`${key}-${v}`} propKey={ key } propVal={ v } propClass={ propClass } />) : null
48-
}
49-
{
50-
showExtensions && extensions.size ? extensions.entrySeq().map( ( [ key, v ] ) => <Property key={`${key}-${v}`} propKey={ key } propVal={ v } propClass={ propClass } />) : null
51-
}
52-
{
53-
!description ? null :
54-
<Markdown source={ description } />
55-
}
56-
{
57-
xml && xml.size ? (<span><br /><span className={ propClass }>xml:</span>
58-
{
59-
xml.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} className={ propClass }><br/>&nbsp;&nbsp;&nbsp;{key}: { String(v) }</span>).toArray()
60-
}
61-
</span>): null
62-
}
63-
{
64-
enumArray && <EnumModel value={ enumArray } getComponent={ getComponent } />
65-
}
66-
</span>
48+
<ModelCollapse title={titleEl} expanded={depth >= expandDepth} collapsedContent=" " hideSelfOnExpand={expandDepth !== depth}>
49+
<span className="prop">
50+
{name && depth > 1 && <span className={`${depth === 1 && "model-title"} prop-name`}>{ title }</span> }
51+
<span className="prop-type">{ type }</span>
52+
{ format && <span className="prop-format">(${format})</span>}
53+
{
54+
properties.size ? properties.entrySeq().map( ( [ key, v ] ) => <Property key={`${key}-${v}`} propKey={ key } propVal={ v } propClass={ propClass } />) : null
55+
}
56+
{
57+
showExtensions && extensions.size ? extensions.entrySeq().map( ( [ key, v ] ) => <Property key={`${key}-${v}`} propKey={ key } propVal={ v } propClass={ propClass } />) : null
58+
}
59+
{
60+
!description ? null :
61+
<Markdown source={ description } />
62+
}
63+
{
64+
xml && xml.size ? (<span><br /><span className={ propClass }>xml:</span>
65+
{
66+
xml.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} className={ propClass }><br/>&nbsp;&nbsp;&nbsp;{key}: { String(v) }</span>).toArray()
67+
}
68+
</span>): null
69+
}
70+
{
71+
enumArray && <EnumModel value={ enumArray } getComponent={ getComponent } />
72+
}
73+
</span>
74+
</ModelCollapse>
6775
</span>
6876
}
6977
}

‎test/unit/components/primitive-model.jsx

+14-10
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import React from "react"
22
import { shallow } from "enzyme"
33
import { fromJS } from "immutable"
44
import PrimitiveModel from "components/primitive-model"
5+
import ModelCollapse from "components/model-collapse"
56

67
describe("<PrimitiveModel/>", function () {
7-
describe("Model name", function () {
88
const dummyComponent = () => null
99
const components = {
1010
Markdown: dummyComponent,
1111
EnumModel: dummyComponent,
1212
Property: dummyComponent,
13+
"ModelCollapse" : ModelCollapse,
1314
}
1415
const props = {
1516
getComponent: c => components[c],
@@ -21,17 +22,16 @@ describe("<PrimitiveModel/>", function () {
2122
schema: fromJS({
2223
type: "string",
2324
title: "Custom model title"
24-
})
25+
}),
26+
expandDepth: 1
2527
}
2628

2729
it("renders the schema's title", function () {
2830
// When
2931
const wrapper = shallow(<PrimitiveModel {...props} />)
30-
const modelTitleEl = wrapper.find("span.model-title")
31-
expect(modelTitleEl.length).toEqual(1)
32+
const modelTitleEl = wrapper.find("ModelCollapse").prop("title").props.children.props.children
3233

33-
// Then
34-
expect(modelTitleEl.text()).toEqual("Custom model title")
34+
expect(modelTitleEl).toEqual("Custom model title")
3535
})
3636

3737
it("falls back to the passed-in `name` prop for the title", function () {
@@ -40,12 +40,16 @@ describe("<PrimitiveModel/>", function () {
4040
type: "string"
4141
})
4242
const wrapper = shallow(<PrimitiveModel {...props} />)
43-
const modelTitleEl = wrapper.find("span.model-title")
44-
expect(modelTitleEl.length).toEqual(1)
43+
const modelTitleEl = wrapper.find("ModelCollapse").prop("title").props.children.props.children
4544

4645
// Then
47-
expect(modelTitleEl.text()).toEqual("Name from props")
46+
expect(modelTitleEl).toEqual("Name from props")
47+
4848
})
4949

50-
})
50+
it("renders a collapsible header", function(){
51+
const wrapper = shallow(<PrimitiveModel {...props}/>)
52+
const renderedModelCollapse = wrapper.find(ModelCollapse)
53+
expect(renderedModelCollapse.length).toEqual(1)
54+
})
5155
})

0 commit comments

Comments
 (0)
Please sign in to comment.