Merge pull request #3926 from swagger-api/bug/editor-1565-callback-expansion

Callback expansion issues
This commit is contained in:
kyle
2017-11-17 19:12:46 -08:00
committed by GitHub
7 changed files with 147 additions and 14 deletions

View File

@@ -27,6 +27,16 @@ export default class ContentType extends React.Component {
} }
} }
componentWillReceiveProps(nextProps) {
if(!nextProps.contentTypes || !nextProps.contentTypes.size) {
return
}
if(!nextProps.contentTypes.includes(nextProps.value)) {
nextProps.onChange(nextProps.contentTypes.first())
}
}
onChangeWrapper = e => this.props.onChange(e.target.value) onChangeWrapper = e => this.props.onChange(e.target.value)
render() { render() {

View File

@@ -57,6 +57,8 @@ export default class OperationContainer extends PureComponent {
const operationId = op.getIn(["operation", "operationId"]) || op.getIn(["operation", "__originalOperationId"]) || opId(op.get("operation"), props.path, props.method) || op.get("id") const operationId = op.getIn(["operation", "operationId"]) || op.getIn(["operation", "__originalOperationId"]) || opId(op.get("operation"), props.path, props.method) || op.get("id")
const isShownKey = ["operations", props.tag, operationId] const isShownKey = ["operations", props.tag, operationId]
const isDeepLinkingEnabled = deepLinking && deepLinking !== "false" const isDeepLinkingEnabled = deepLinking && deepLinking !== "false"
const allowTryItOut = typeof props.allowTryItOut === "undefined" ?
props.specSelectors.allowTryItOutFor(props.path, props.method) : props.allowTryItOut
return { return {
operationId, operationId,
@@ -64,9 +66,9 @@ export default class OperationContainer extends PureComponent {
showSummary, showSummary,
displayOperationId, displayOperationId,
displayRequestDuration, displayRequestDuration,
allowTryItOut,
isShown: layoutSelectors.isShown(isShownKey, docExpansion === "full" ), isShown: layoutSelectors.isShown(isShownKey, docExpansion === "full" ),
jumpToKey: `paths.${props.path}.${props.method}`, jumpToKey: `paths.${props.path}.${props.method}`,
allowTryItOut: props.specSelectors.allowTryItOutFor(props.path, props.method),
response: props.specSelectors.responseFor(props.path, props.method), response: props.specSelectors.responseFor(props.path, props.method),
request: props.specSelectors.requestFor(props.path, props.method) request: props.specSelectors.requestFor(props.path, props.method)
} }

View File

@@ -1,10 +1,12 @@
import React from "react" import React from "react"
import PropTypes from "prop-types" import PropTypes from "prop-types"
import ImPropTypes from "react-immutable-proptypes"
import { fromJS } from "immutable"
const Callbacks = (props) => { const Callbacks = (props) => {
let { callbacks, getComponent } = props let { callbacks, getComponent } = props
// const Markdown = getComponent("Markdown") // const Markdown = getComponent("Markdown")
const Operation = getComponent("operation", true) const OperationContainer = getComponent("OperationContainer", true)
if(!callbacks) { if(!callbacks) {
return <span>No callbacks</span> return <span>No callbacks</span>
@@ -16,24 +18,22 @@ const Callbacks = (props) => {
{ callback.map((pathItem, pathItemName) => { { callback.map((pathItem, pathItemName) => {
return <div key={pathItemName}> return <div key={pathItemName}>
{ pathItem.map((operation, method) => { { pathItem.map((operation, method) => {
return <Operation let op = fromJS({
operation={operation} operation
})
return <OperationContainer
{...props}
op={op}
key={method} key={method}
tag={""}
method={method} method={method}
isShownKey={["callbacks", operation.get("id"), callbackName]}
path={pathItemName} path={pathItemName}
allowTryItOut={false} allowTryItOut={false}
{...props}></Operation> />
// return <pre>{JSON.stringify(operation)}</pre>
}) } }) }
</div> </div>
}) } }) }
</div> </div>
// return <div>
// <h2>{name}</h2>
// {callback.description && <Markdown source={callback.description}/>}
// <pre>{JSON.stringify(callback)}</pre>
// </div>
}) })
return <div> return <div>
{callbackElements} {callbackElements}
@@ -42,7 +42,7 @@ const Callbacks = (props) => {
Callbacks.propTypes = { Callbacks.propTypes = {
getComponent: PropTypes.func.isRequired, getComponent: PropTypes.func.isRequired,
callbacks: PropTypes.array.isRequired callbacks: ImPropTypes.iterable.isRequired
} }

View File

@@ -48,6 +48,13 @@ export default class RequestBodyEditor extends PureComponent {
} }
} }
componentDidUpdate(prevProps) {
if(this.props.requestBody !== prevProps.requestBody) {
// force recalc of value if the request body definition has changed
this.setValueToSample(this.props.mediaType)
}
}
setValueToSample = (explicitMediaType) => { setValueToSample = (explicitMediaType) => {
this.onChange(this.sample(explicitMediaType)) this.onChange(this.sample(explicitMediaType))
} }

View File

@@ -22,6 +22,10 @@ const RequestBody = ({
const mediaTypeValue = requestBodyContent.get(contentType) const mediaTypeValue = requestBodyContent.get(contentType)
if(!mediaTypeValue) {
return null
}
return <div> return <div>
{ requestBodyDescription && { requestBodyDescription &&
<Markdown source={requestBodyDescription} /> <Markdown source={requestBodyDescription} />

View File

@@ -120,5 +120,5 @@ export const getComponent = (getSystem, getStore, getComponents, componentName,
return makeContainer(getSystem, component, getStore()) return makeContainer(getSystem, component, getStore())
// container == truthy // container == truthy
return makeContainer(getSystem, component) return makeContainer(getSystem, wrapRender(component))
} }

View File

@@ -571,6 +571,116 @@ describe("bound system", function(){
// Then // Then
expect(renderedComponent.text()).toEqual("This came from mapStateToProps and this came from the system and this came from my own props") expect(renderedComponent.text()).toEqual("This came from mapStateToProps and this came from the system and this came from my own props")
}) })
it("should catch errors thrown inside of React Component Class render methods", function() {
// Given
// eslint-disable-next-line react/require-render-return
class BrokenComponent extends React.Component {
render() {
throw new Error("This component is broken")
}
}
const system = new System({
plugins: [
ViewPlugin,
{
components: {
BrokenComponent
}
}
]
})
// When
var Component = system.getSystem().getComponent("BrokenComponent")
const renderedComponent = render(<Component />)
// Then
expect(renderedComponent.text()).toEqual("😱 Could not render BrokenComponent, see the console.")
})
it("should catch errors thrown inside of pure component render methods", function() {
// Given
// eslint-disable-next-line react/require-render-return
class BrokenComponent extends PureComponent {
render() {
throw new Error("This component is broken")
}
}
const system = new System({
plugins: [
ViewPlugin,
{
components: {
BrokenComponent
}
}
]
})
// When
var Component = system.getSystem().getComponent("BrokenComponent")
const renderedComponent = render(<Component />)
// Then
expect(renderedComponent.text()).toEqual("😱 Could not render BrokenComponent, see the console.")
})
it("should catch errors thrown inside of stateless component functions", function() {
// Given
// eslint-disable-next-line react/require-render-return
let BrokenComponent = function BrokenComponent() { throw new Error("This component is broken") }
const system = new System({
plugins: [
ViewPlugin,
{
components: {
BrokenComponent
}
}
]
})
// When
var Component = system.getSystem().getComponent("BrokenComponent")
const renderedComponent = render(<Component />)
// Then
expect(renderedComponent.text().startsWith("😱 Could not render")).toEqual(true)
})
it("should catch errors thrown inside of container components", function() {
// Given
// eslint-disable-next-line react/require-render-return
class BrokenComponent extends React.Component {
render() {
throw new Error("This component is broken")
}
}
const system = new System({
plugins: [
ViewPlugin,
{
components: {
BrokenComponent
}
}
]
})
// When
var Component = system.getSystem().getComponent("BrokenComponent", true)
const renderedComponent = render(
<Provider store={system.getStore()}>
<Component />
</Provider>
)
// Then
expect(renderedComponent.text()).toEqual("😱 Could not render BrokenComponent, see the console.")
})
}) })
}) })