fix: use specPath prop to resolve operations in OperationContainer (#4272)

* Use `parameterWithMeta` to get parameter data in <ParameterRow>

* Prefer specPath when fetching resolved subtrees in OperationContainer

* Add test for OAS3 callback rendering

* Remove debugger statement
This commit is contained in:
kyle
2018-02-28 17:50:08 -08:00
committed by GitHub
parent 22036b1fbf
commit 8777d8b9ff
6 changed files with 128 additions and 11 deletions

View File

@@ -156,7 +156,7 @@ export default class Operation extends PureComponent {
<Collapse isOpened={isShown}>
<div className="opblock-body">
{ operation && operation.size ? null :
{ (operation && operation.size) || operation === null ? null :
<img height={"32px"} width={"32px"} src={require("core/../img/rolling-load.svg")} className="opblock-loading-animation" />
}
{ deprecated && <h4 className="opblock-title_normal"> Warning: Deprecated</h4>}

View File

@@ -82,23 +82,23 @@ export default class OperationContainer extends PureComponent {
}
componentWillReceiveProps(nextProps) {
const { path, method, specActions, specSelectors, response, isShown } = nextProps
const resolvedSubtree = specSelectors.specResolvedSubtree(["paths", path, method])
const { response, isShown } = nextProps
const resolvedSubtree = this.getResolvedSubtree()
if(response !== this.props.response) {
this.setState({ executeInProgress: false })
}
if(isShown && resolvedSubtree === undefined) {
specActions.requestResolvedSubtree(["paths", path, method])
this.requestResolvedSubtree()
}
}
toggleShown =() => {
let { layoutActions, specActions, tag, operationId, path, method, isShown } = this.props
let { layoutActions, tag, operationId, isShown } = this.props
if(!isShown) {
// transitioning from collapsed to expanded
specActions.requestResolvedSubtree(["paths", path, method])
this.requestResolvedSubtree()
}
layoutActions.show(["operations", tag, operationId], !isShown)
}
@@ -117,6 +117,37 @@ export default class OperationContainer extends PureComponent {
this.setState({ executeInProgress: true })
}
getResolvedSubtree = () => {
const {
specSelectors,
path,
method,
specPath
} = this.props
if(specPath) {
return specSelectors.specResolvedSubtree(specPath.toJS()) || Map()
}
return specSelectors.specResolvedSubtree(["paths", path, method]) || Map()
}
requestResolvedSubtree = () => {
const {
specActions,
path,
method,
specPath
} = this.props
if(specPath) {
return specActions.requestResolvedSubtree(specPath.toJS())
}
return specActions.requestResolvedSubtree(["paths", path, method])
}
render() {
let {
op: unresolvedOp,
@@ -151,7 +182,7 @@ export default class OperationContainer extends PureComponent {
const Operation = getComponent( "operation" )
const resolvedSubtree = specSelectors.specResolvedSubtree(["paths", path, method]) || Map()
const resolvedSubtree = this.getResolvedSubtree()
const operationProps = fromJS({
op: resolvedSubtree || Map(),

View File

@@ -4,7 +4,7 @@ import ImPropTypes from "react-immutable-proptypes"
import { fromJS } from "immutable"
const Callbacks = (props) => {
let { callbacks, getComponent } = props
let { callbacks, getComponent, specPath } = props
// const Markdown = getComponent("Markdown")
const OperationContainer = getComponent("OperationContainer", true)
@@ -28,6 +28,7 @@ const Callbacks = (props) => {
tag={""}
method={method}
path={pathItemName}
specPath={specPath.push(callbackName, pathItemName, method)}
allowTryItOut={false}
/>
}) }
@@ -42,8 +43,8 @@ const Callbacks = (props) => {
Callbacks.propTypes = {
getComponent: PropTypes.func.isRequired,
callbacks: ImPropTypes.iterable.isRequired
callbacks: ImPropTypes.iterable.isRequired,
specPath: ImPropTypes.list.isRequired,
}
export default Callbacks

View File

@@ -161,7 +161,10 @@ class Parameters extends Component {
</div> : "" }
{this.state.callbackVisible ? <div className="callbacks-container opblock-description-wrapper">
<Callbacks callbacks={Map(operation.get("callbacks"))} />
<Callbacks
callbacks={Map(operation.get("callbacks"))}
specPath={specPath.slice(0, -1).push("callbacks")}
/>
</div> : "" }
{
isOAS3() && requestBody && this.state.parametersVisible &&