* default to empty `ImmutableMap` when grabbing op metadata
* pass `errors` into JsonSchema components
* Account for Immutable data structure in JavaScriptonSchema...
...and create empty Lists instead of Maps by default.
* Pass ImmutableList through to JsonSchema child components
* Add lazy resolving spec state extensions
* TEMPORARY: disable conventional resolved spec
* WIP
* Use resolveSubtree in Operation display
* Freebie: short-circuit Markdown component if it is given plaintext
* NEW DEFAULT BEHAVIOR: `defaultModelsExpandDepth: 1` does not expand individual models
* Render faked Model expander to trigger resolution
* Baseline support for Editor lifecycles
* Display operation summaries before the operation is resolved
* Test migrations
* WIP
* Swagger2 TIO Body params
* a bit of cleanup
* Debounce string param inputs
* Reach into unresolved operation for deprecated flag, if available
* Fire subtree request outside of render
* Remove debugging flags
* Fix logical errors in spec statePlugins
* TODOs become TODONEs!
* Migrate deeplinking feature to non-resolved spec action
* ESLint fixes
83 lines
2.2 KiB
JavaScript
83 lines
2.2 KiB
JavaScript
import React, { Component } from "react"
|
|
import PropTypes from "prop-types"
|
|
|
|
export default class ModelCollapse extends Component {
|
|
static propTypes = {
|
|
collapsedContent: PropTypes.any,
|
|
expanded: PropTypes.bool,
|
|
children: PropTypes.any,
|
|
title: PropTypes.element,
|
|
modelName: PropTypes.string,
|
|
classes: PropTypes.string,
|
|
onToggle: PropTypes.func,
|
|
hideSelfOnExpand: PropTypes.bool,
|
|
}
|
|
|
|
static defaultProps = {
|
|
collapsedContent: "{...}",
|
|
expanded: false,
|
|
title: null,
|
|
onToggle: () => {},
|
|
hideSelfOnExpand: false
|
|
}
|
|
|
|
constructor(props, context) {
|
|
super(props, context)
|
|
|
|
let { expanded, collapsedContent } = this.props
|
|
|
|
this.state = {
|
|
expanded : expanded,
|
|
collapsedContent: collapsedContent || ModelCollapse.defaultProps.collapsedContent
|
|
}
|
|
}
|
|
|
|
componentDidMount() {
|
|
const { hideSelfOnExpand, expanded, modelName } = this.props
|
|
if(hideSelfOnExpand && expanded) {
|
|
// We just mounted pre-expanded, and we won't be going back..
|
|
// So let's give our parent an `onToggle` call..
|
|
// Since otherwise it will never be called.
|
|
this.props.onToggle(modelName, expanded)
|
|
}
|
|
}
|
|
|
|
componentWillReceiveProps(nextProps){
|
|
if(this.props.expanded !== nextProps.expanded){
|
|
this.setState({expanded: nextProps.expanded})
|
|
}
|
|
}
|
|
|
|
toggleCollapsed=()=>{
|
|
if(this.props.onToggle){
|
|
this.props.onToggle(this.props.modelName,!this.state.expanded)
|
|
}
|
|
|
|
this.setState({
|
|
expanded: !this.state.expanded
|
|
})
|
|
}
|
|
|
|
render () {
|
|
const { title, classes } = this.props
|
|
|
|
if(this.state.expanded ) {
|
|
if(this.props.hideSelfOnExpand) {
|
|
return <span className={classes || ""}>
|
|
{this.props.children}
|
|
</span>
|
|
}
|
|
}
|
|
|
|
return (
|
|
<span className={classes || ""}>
|
|
{ title && <span onClick={this.toggleCollapsed} style={{ "cursor": "pointer" }}>{title}</span> }
|
|
<span onClick={ this.toggleCollapsed } style={{ "cursor": "pointer" }}>
|
|
<span className={ "model-toggle" + ( this.state.expanded ? "" : " collapsed" ) }></span>
|
|
</span>
|
|
{ this.state.expanded ? this.props.children :this.state.collapsedContent }
|
|
</span>
|
|
)
|
|
}
|
|
}
|