Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
3881a82
Create OAS3 plugin
shockey May 17, 2017
1f314dd
Add wrapSelectors functionality
shockey May 18, 2017
6093410
Add base wrapSelectors for OAS3; implement definitions selector for OAS3
shockey May 18, 2017
3b62a93
Create providers directory; Markdown provider
shockey May 19, 2017
2f527b1
Move system tests to directory
shockey May 20, 2017
614c1ae
basic wrapComponent
shockey May 20, 2017
88848d0
Extended getComponent: system availability
shockey May 23, 2017
31abbb7
Finish rewiring Markdown provider
shockey May 23, 2017
128b910
Reorganize wrapComponents, fix CommonMark
shockey May 24, 2017
032c0a0
Basic request body
shockey May 26, 2017
66321c8
tabs added
Minasokoni May 26, 2017
3297772
Dev server: remove 'watch' call
shockey Jun 1, 2017
e55a604
Merge branch 'ft/oas3' of github.com:swagger-api/swagger-ui into ft/oas3
shockey Jun 1, 2017
dd256a4
Working callback display
shockey Jun 1, 2017
e387da0
Merge branch 'ft/dev-server-watch' into ft/oas3
shockey Jun 1, 2017
38d2a2a
Update package-lock.json
shockey Jun 1, 2017
a0fbcc5
Add OAS3 indicator
shockey Jun 1, 2017
5511aa9
Fix react-markdown empty prop error
shockey Jun 1, 2017
27f8030
Use SUPPORTED_OPENAPI_VERSIONS in selector wrapper
shockey Jun 1, 2017
845965c
Reorganize Parameters component for OAS3
shockey Jun 1, 2017
ff39d07
Provide system as props to OAS3 wrapper components
shockey Jun 1, 2017
7deff73
(Actually) display callbacks
shockey Jun 1, 2017
ccda3df
Merge branch 'master' of github.com:swagger-api/swagger-ui into ft/oas3
shockey Jun 6, 2017
840e174
Use <Operation> in callbacks
shockey Jun 2, 2017
72fb75c
Merge branch 'master' of github.com:swagger-api/swagger-ui into ft/oas3
shockey Jun 9, 2017
81408cf
Merge branch 'master' of github.com:swagger-api/swagger-ui into ft/oas3
shockey Jun 14, 2017
e415ec7
Add schema object deprecation display
shockey Jun 14, 2017
9dc9a85
Squash commit: Links reimplementation; OAS interface improvements
shockey Jun 16, 2017
716e0b8
Adjust style
shockey Jun 16, 2017
541f3e9
Tweak deprecated display
shockey Jun 16, 2017
e3ae1ee
MOAR rendering (improve media type detection; render object model
shockey Jun 16, 2017
0ee3bcc
Nullify Swagger 2.0-specific selectors
shockey Jun 17, 2017
fc26ffb
Hide Callbacks operation tab if there are no callbacks
shockey Jun 28, 2017
b1956d0
Remove `Headers` from Link display
shockey Jun 28, 2017
6e301aa
Don't allow Try It Out in callbacks
shockey Jun 28, 2017
2b37e7c
Render markdown more normally
shockey Jun 29, 2017
61de35d
Render request bodies correctly (minus Example Value + editable funct…
shockey Jun 30, 2017
50c0d39
MOAR alignment
shockey Jun 30, 2017
1e40a20
Add switching logic for each Response Code to have its own content types
shockey Jul 3, 2017
1090279
Hide main Responses ContentType picker for OAS3
shockey Jul 3, 2017
1970b2c
Disable Online Validation badge for OAS3
shockey Jul 4, 2017
6070196
Nullify Schemes selector in OAS3
shockey Jul 4, 2017
8ed43a1
Ensure OAS3 Markdown fields are sanitized
shockey Jul 5, 2017
4e80e29
Merge branch 'master' into ft/oas3
shockey Jul 5, 2017
189f048
Stashed: move anyOf/oneOf/not into core
shockey Jul 5, 2017
0ebea56
Display example values for Request Bodies
shockey Jul 6, 2017
f2b40a4
Rebuild dist
shockey Jul 6, 2017
f0332d9
add isSwagger2 selector
shockey Jul 6, 2017
a1ce0e7
Rebuild dist (for editor)
shockey Jul 6, 2017
298835a
Assign unique isShownKey values to Callback operation displays
shockey Jul 26, 2017
f0038b0
Array value for isShownKey (oops)
shockey Jul 26, 2017
c7020d9
Fix TryItOut button layout in Swagger2
shockey Jul 26, 2017
8bbe706
Disable Try-It-Out button in OAS3
shockey Jul 26, 2017
ee37e30
Remove config filtering
shockey Jul 27, 2017
412a9cd
Rebuild dist (for Editor)
shockey Jul 27, 2017
afcc35b
Indicate required request bodies (fixes #3449)
shockey Jul 28, 2017
e7e03f2
Generate XML examples for request bodies (fixes #3448)
shockey Jul 28, 2017
9c31b14
Resolve model names in OAS3 (fixes #3457)
shockey Jul 28, 2017
2173900
Remove console.log
shockey Jul 29, 2017
f7018bc
Merge branch 'master' of github.com:swagger-api/swagger-ui into ft/oas3
shockey Jul 29, 2017
b373182
ESLint fixes
shockey Jul 29, 2017
84f6653
Merge branch 'master' into ft/oas3
shockey Jul 29, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 16 additions & 8 deletions dist/swagger-ui-bundle.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/swagger-ui-bundle.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/swagger-ui.css

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions dist/swagger-ui.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/swagger-ui.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
"react-height": "^2.0.0",
"react-hot-loader": "1.3.1",
"react-immutable-proptypes": "2.1.0",
"react-markdown": "^2.5.0",
"react-motion": "0.4.4",
"react-object-inspector": "0.2.1",
"react-redux": "^4.x.x",
Expand Down
6 changes: 4 additions & 2 deletions src/core/components/content-type.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const noop = ()=>{}
export default class ContentType extends React.Component {

static propTypes = {
contentTypes: PropTypes.oneOfType([ImPropTypes.list, ImPropTypes.set]),
contentTypes: PropTypes.oneOfType([ImPropTypes.list, ImPropTypes.set, ImPropTypes.seq]),
value: PropTypes.string,
onChange: PropTypes.func,
className: PropTypes.string
Expand All @@ -22,7 +22,9 @@ export default class ContentType extends React.Component {

componentDidMount() {
// Needed to populate the form, initially
this.props.onChange(this.props.contentTypes.first())
if(this.props.contentTypes) {
this.props.onChange(this.props.contentTypes.first())
}
}

onChangeWrapper = e => this.props.onChange(e.target.value)
Expand Down
3 changes: 2 additions & 1 deletion src/core/components/info.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,13 @@ export default class Info extends React.Component {
const { url:externalDocsUrl, description:externalDocsDescription } = (externalDocs || fromJS({})).toJS()

const Markdown = getComponent("Markdown")
const VersionStamp = getComponent("VersionStamp")

return (
<div className="info">
<hgroup className="main">
<h2 className="title" >{ title }
{ version && <small><pre className="version"> { version } </pre></small> }
{ version && <VersionStamp version={version}></VersionStamp> }
</h2>
{ host || basePath ? <Path host={ host } basePath={ basePath } /> : null }
{ url && <a target="_blank" href={ url }><span className="url"> { url } </span></a> }
Expand Down
4 changes: 2 additions & 2 deletions src/core/components/model-example.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ export default class ModelExample extends React.Component {
<li className={ "tabitem" + ( isExecute || this.state.activeTab === "example" ? " active" : "") }>
<a className="tablinks" data-name="example" onClick={ this.activeTab }>Example Value</a>
</li>
<li className={ "tabitem" + ( !isExecute && this.state.activeTab === "model" ? " active" : "") }>
{ schema ? <li className={ "tabitem" + ( !isExecute && this.state.activeTab === "model" ? " active" : "") }>
<a className={ "tablinks" + ( isExecute ? " inactive" : "" )} data-name="model" onClick={ this.activeTab }>Model</a>
</li>
</li> : null }
</ul>
<div>
{
Expand Down
34 changes: 26 additions & 8 deletions src/core/components/model.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ export default class Model extends Component {
if ( ref.indexOf("#/definitions/") !== -1 ) {
return ref.replace(/^.*#\/definitions\//, "")
}
if ( ref.indexOf("#/components/schemas/") !== -1 ) {
return ref.replace("#/components/schemas/", "")
}
}

getRefSchema =( model )=> {
Expand All @@ -26,14 +29,16 @@ export default class Model extends Component {
}

render () {
let { schema, getComponent, required, name, isRef } = this.props
let { getComponent, specSelectors, schema, required, name, isRef } = this.props
let ObjectModel = getComponent("ObjectModel")
let ArrayModel = getComponent("ArrayModel")
let PrimitiveModel = getComponent("PrimitiveModel")
let $$ref = schema && schema.get("$$ref")
let modelName = $$ref && this.getModelName( $$ref )
let modelSchema, type

const deprecated = specSelectors.isOAS3() && schema.get("deprecated")

if ( schema && (schema.get("type") || schema.get("properties")) ) {
modelSchema = schema
} else if ( $$ref ) {
Expand All @@ -47,17 +52,30 @@ export default class Model extends Component {

switch(type) {
case "object":
return <ObjectModel className="object" { ...this.props } schema={ modelSchema }
name={ name || modelName } required={ required }
isRef={ isRef!== undefined ? isRef : !!$$ref }/>
return <ObjectModel
className="object" { ...this.props }
schema={ modelSchema }
name={ name || modelName }
deprecated={deprecated}
isRef={ isRef!== undefined ? isRef : !!$$ref } />
case "array":
return <ArrayModel className="array" { ...this.props } schema={ modelSchema } required={ required } />
return <ArrayModel
className="array" { ...this.props }
schema={ modelSchema }
name={ name || modelName }
deprecated={deprecated}
required={ required } />
case "string":
case "number":
case "integer":
case "boolean":
default:
return <PrimitiveModel getComponent={ getComponent } schema={ modelSchema } required={ required }/>
}
return <PrimitiveModel
{ ...this.props }
getComponent={ getComponent }
schema={ modelSchema }
name={ name || modelName }
deprecated={deprecated}
required={ required }/> }
}
}
}
1 change: 1 addition & 0 deletions src/core/components/operation.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ export default class Operation extends PureComponent {
}
<Parameters
parameters={parameters}
operation={operation}
onChangeKey={onChangeKey}
onTryoutClick = { this.onTryoutClick }
onCancelClick = { this.onCancelClick }
Expand Down
4 changes: 3 additions & 1 deletion src/core/components/parameters.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,9 @@ export default class Parameters extends Component {
return (
<div className="opblock-section">
<div className="opblock-section-header">
<h4 className="opblock-title">Parameters</h4>
<div className="tab-header">
<h4 className="opblock-title">Parameters</h4>
</div>
{ allowTryItOut ? (
<TryItOutButton enabled={ tryItOutEnabled } onCancelClick={ onCancelClick } onTryoutClick={ onTryoutClick } />
) : null }
Expand Down
20 changes: 12 additions & 8 deletions src/core/components/providers/markdown.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,8 @@ import PropTypes from "prop-types"
import Remarkable from "react-remarkable"
import sanitize from "sanitize-html"

const sanitizeOptions = {
textFilter: function(text) {
return text
.replace(/&quot;/g, "\"")
}
}

function Markdown({ source }) {
const sanitized = sanitize(source, sanitizeOptions)
const sanitized = sanitizer(source)

// sometimes the sanitizer returns "undefined" as a string
if(!source || !sanitized || sanitized === "undefined") {
Expand All @@ -31,3 +24,14 @@ Markdown.propTypes = {
}

export default Markdown

const sanitizeOptions = {
textFilter: function(text) {
return text
.replace(/&quot;/g, "\"")
}
}

export function sanitizer(str) {
return sanitize(str, sanitizeOptions)
}
43 changes: 38 additions & 5 deletions src/core/components/response.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from "react"
import PropTypes from "prop-types"
import { fromJS } from "immutable"
import { fromJS, Seq } from "immutable"
import { getSampleSchema } from "core/utils"

const getExampleComponent = ( sampleResponse, examples, HighlightCode ) => {
Expand Down Expand Up @@ -31,6 +31,13 @@ const getExampleComponent = ( sampleResponse, examples, HighlightCode ) => {
}

export default class Response extends React.Component {
constructor(props, context) {
super(props, context)

this.state = {
responseContentType: ""
}
}

static propTypes = {
code: PropTypes.string.isRequired,
Expand Down Expand Up @@ -59,16 +66,29 @@ export default class Response extends React.Component {
} = this.props

let { inferSchema } = fn
let { isOAS3 } = specSelectors

let schema = inferSchema(response.toJS())
let headers = response.get("headers")
let examples = response.get("examples")
let links = response.get("links")
const Headers = getComponent("headers")
const HighlightCode = getComponent("highlightCode")
const ModelExample = getComponent("modelExample")
const Markdown = getComponent( "Markdown" )

let sampleResponse = schema ? getSampleSchema(schema, contentType, { includeReadOnly: true }) : null
const OperationLink = getComponent("operationLink")
const ContentType = getComponent("contentType")

var sampleResponse
var schema

if(isOAS3()) {
let oas3SchemaForContentType = response.getIn(["content", this.state.responseContentType, "schema"])
sampleResponse = oas3SchemaForContentType ? getSampleSchema(oas3SchemaForContentType.toJS(), this.state.responseContentType, { includeReadOnly: true }) : null
schema = oas3SchemaForContentType ? inferSchema(oas3SchemaForContentType.toJS()) : null
} else {
sampleResponse = schema ? getSampleSchema(schema, contentType, { includeReadOnly: true }) : null
schema = inferSchema(response.toJS())
}
let example = getExampleComponent( sampleResponse, examples, HighlightCode )

return (
Expand All @@ -82,6 +102,12 @@ export default class Response extends React.Component {
<Markdown source={ response.get( "description" ) } />
</div>

{ isOAS3 ? <ContentType
value={this.state.responseContentType}
contentTypes={ response.get("content") ? response.get("content").keySeq() : Seq() }
onChange={(val) => this.setState({ responseContentType: val })}
className="response-content-type" /> : null }

{ example ? (
<ModelExample
getComponent={ getComponent }
Expand All @@ -94,8 +120,15 @@ export default class Response extends React.Component {
<Headers headers={ headers }/>
) : null}

</td>

</td>
{specSelectors.isOAS3() ? <td>
{ links ?
links.toSeq().map((link, key) => {
return <OperationLink key={key} name={key} link={ link }/>
})
: <i>No links</i>}
</td> : null}
</tr>
)
}
Expand Down
5 changes: 3 additions & 2 deletions src/core/components/responses.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,13 @@ export default class Responses extends React.Component {
<div className="responses-wrapper">
<div className="opblock-section-header">
<h4>Responses</h4>
<label>
{ specSelectors.isOAS3() ? null : <label>
<span>Response content type</span>
<ContentType value={producesValue}
onChange={this.onChangeProducesWrapper}
contentTypes={produces}
className="execute-content-type"/>
</label>
</label> }
</div>
<div className="responses-inner">
{
Expand All @@ -68,6 +68,7 @@ export default class Responses extends React.Component {
<tr className="responses-header">
<td className="col col_header response-col_status">Code</td>
<td className="col col_header response-col_description">Description</td>
{ specSelectors.isOAS3() ? <td className="col col_header response-col_description">Links</td> : null }
</tr>
</thead>
<tbody>
Expand Down
12 changes: 12 additions & 0 deletions src/core/components/version-stamp.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import React from "react"
import PropTypes from "prop-types"

const VersionStamp = ({ version }) => {
return <small><pre className="version"> { version } </pre></small>
}

VersionStamp.propTypes = {
version: PropTypes.string.isRequired
}

export default VersionStamp
49 changes: 49 additions & 0 deletions src/core/plugins/oas3/components/callbacks.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import React from "react"
import PropTypes from "prop-types"

const Callbacks = (props) => {
let { callbacks, getComponent } = props
// const Markdown = getComponent("Markdown")
const Operation = getComponent("operation", true)

if(!callbacks) {
return <span>No callbacks</span>
}

let callbackElements = callbacks.map((callback, callbackName) => {
return <div key={callbackName}>
<h2>{callbackName}</h2>
{ callback.map((pathItem, pathItemName) => {
return <div key={pathItemName}>
{ pathItem.map((operation, method) => {
return <Operation
operation={operation}
key={method}
method={method}
isShownKey={["callbacks", operation.get("id"), callbackName]}
path={pathItemName}
allowTryItOut={false}
{...props}></Operation>
// return <pre>{JSON.stringify(operation)}</pre>
}) }
</div>
}) }
</div>
// return <div>
// <h2>{name}</h2>
// {callback.description && <Markdown source={callback.description}/>}
// <pre>{JSON.stringify(callback)}</pre>
// </div>
})
return <div>
{callbackElements}
</div>
}

Callbacks.propTypes = {
getComponent: PropTypes.function.isRequired,
callbacks: PropTypes.array.isRequired

}

export default Callbacks
9 changes: 9 additions & 0 deletions src/core/plugins/oas3/components/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import Callbacks from "./callbacks"
import RequestBody from "./request-body"
import OperationLink from "./operation-link.jsx"

export default {
Callbacks,
RequestBody,
operationLink: OperationLink
}
Loading