Merge branch 'master' into feature/apisSorter
This commit is contained in:
@@ -22,7 +22,7 @@ The OpenAPI Specification has undergone 4 revisions since initial creation in 20
|
|||||||
|
|
||||||
Swagger UI Version | Release Date | OpenAPI Spec compatibility | Notes | Status
|
Swagger UI Version | Release Date | OpenAPI Spec compatibility | Notes | Status
|
||||||
------------------ | ------------ | -------------------------- | ----- | ------
|
------------------ | ------------ | -------------------------- | ----- | ------
|
||||||
3.0.17 | 2017-06-23 | 2.0 | [tag v3.0.17](https://github.com/swagger-api/swagger-ui/tree/v3.0.17) |
|
3.0.18 | 2017-07-07 | 2.0 | [tag v3.0.18](https://github.com/swagger-api/swagger-ui/tree/v3.0.18) |
|
||||||
2.2.10 | 2017-01-04 | 1.1, 1.2, 2.0 | [tag v2.2.10](https://github.com/swagger-api/swagger-ui/tree/v2.2.10) |
|
2.2.10 | 2017-01-04 | 1.1, 1.2, 2.0 | [tag v2.2.10](https://github.com/swagger-api/swagger-ui/tree/v2.2.10) |
|
||||||
2.1.5 | 2016-07-20 | 1.1, 1.2, 2.0 | [tag v2.1.5](https://github.com/swagger-api/swagger-ui/tree/v2.1.5) |
|
2.1.5 | 2016-07-20 | 1.1, 1.2, 2.0 | [tag v2.1.5](https://github.com/swagger-api/swagger-ui/tree/v2.1.5) |
|
||||||
2.0.24 | 2014-09-12 | 1.1, 1.2 | [tag v2.0.24](https://github.com/swagger-api/swagger-ui/tree/v2.0.24) |
|
2.0.24 | 2014-09-12 | 1.1, 1.2 | [tag v2.0.24](https://github.com/swagger-api/swagger-ui/tree/v2.0.24) |
|
||||||
|
|||||||
16
dist/swagger-ui-bundle.js
vendored
16
dist/swagger-ui-bundle.js
vendored
File diff suppressed because one or more lines are too long
2
dist/swagger-ui-bundle.js.map
vendored
2
dist/swagger-ui-bundle.js.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;;;;;AAsyKA;;;;;;AAmqEA;;;;;;;;;;;;;;;;;;;;;;;;;;AA6nTA;;;;;;;;;;;;;;AAu8JA;;;;;;;;;AA8/mBA;;;;;AA6/PA;;;;;;AAqpVA","sourceRoot":""}
|
{"version":3,"file":"swagger-ui-bundle.js","sources":["webpack:///swagger-ui-bundle.js"],"mappings":"AAAA;;;;;AAsyKA;;;;;;AA8qEA;;;;;;;;;;;;;;;;;;;;;;;;;;AA6nTA;;;;;;;;;;;;;;AAu8JA;;;;;;;;;AAkgnBA;;;;;AAigQA;;;;;;AAqpVA","sourceRoot":""}
|
||||||
6
dist/swagger-ui-standalone-preset.js
vendored
6
dist/swagger-ui-standalone-preset.js
vendored
File diff suppressed because one or more lines are too long
2
dist/swagger-ui.css
vendored
2
dist/swagger-ui.css
vendored
File diff suppressed because one or more lines are too long
4
dist/swagger-ui.js
vendored
4
dist/swagger-ui.js
vendored
File diff suppressed because one or more lines are too long
2
dist/swagger-ui.js.map
vendored
2
dist/swagger-ui.js.map
vendored
@@ -1 +1 @@
|
|||||||
{"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;;;;;;AAkoaA","sourceRoot":""}
|
{"version":3,"file":"swagger-ui.js","sources":["webpack:///swagger-ui.js"],"mappings":"AAAA;;;;;;AAopaA","sourceRoot":""}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "swagger-ui",
|
"name": "swagger-ui",
|
||||||
"version": "3.0.17",
|
"version": "3.0.18",
|
||||||
"main": "dist/swagger-ui.js",
|
"main": "dist/swagger-ui.js",
|
||||||
"repository": "git@github.com:swagger-api/swagger-ui.git",
|
"repository": "git@github.com:swagger-api/swagger-ui.git",
|
||||||
"contributors": [
|
"contributors": [
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
"sanitize-html": "^1.14.1",
|
"sanitize-html": "^1.14.1",
|
||||||
"serialize-error": "2.0.0",
|
"serialize-error": "2.0.0",
|
||||||
"shallowequal": "0.2.2",
|
"shallowequal": "0.2.2",
|
||||||
"swagger-client": "3.0.16",
|
"swagger-client": "3.0.17",
|
||||||
"url-parse": "^1.1.8",
|
"url-parse": "^1.1.8",
|
||||||
"whatwg-fetch": "0.11.1",
|
"whatwg-fetch": "0.11.1",
|
||||||
"worker-loader": "^0.7.1",
|
"worker-loader": "^0.7.1",
|
||||||
|
|||||||
44
src/core/components/array-model.jsx
Normal file
44
src/core/components/array-model.jsx
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
import React, { Component } from "react"
|
||||||
|
import PropTypes from "prop-types"
|
||||||
|
|
||||||
|
const propStyle = { color: "#999", fontStyle: "italic" }
|
||||||
|
|
||||||
|
export default class ArrayModel extends Component {
|
||||||
|
static propTypes = {
|
||||||
|
schema: PropTypes.object.isRequired,
|
||||||
|
getComponent: PropTypes.func.isRequired,
|
||||||
|
specSelectors: PropTypes.object.isRequired,
|
||||||
|
name: PropTypes.string,
|
||||||
|
required: PropTypes.bool,
|
||||||
|
expandDepth: PropTypes.number,
|
||||||
|
depth: PropTypes.number
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
let { getComponent, required, schema, depth, expandDepth } = this.props
|
||||||
|
let items = schema.get("items")
|
||||||
|
let properties = schema.filter( ( v, key) => ["type", "items", "$$ref"].indexOf(key) === -1 )
|
||||||
|
|
||||||
|
const ModelCollapse = getComponent("ModelCollapse")
|
||||||
|
const Model = getComponent("Model")
|
||||||
|
|
||||||
|
return <span className="model">
|
||||||
|
<span className="model-title">
|
||||||
|
<span className="model-title__text">{ schema.get("title") }</span>
|
||||||
|
</span>
|
||||||
|
<ModelCollapse collapsed={ depth > expandDepth } collapsedContent="[...]">
|
||||||
|
[
|
||||||
|
<span><Model { ...this.props } schema={ items } required={ false }/></span>
|
||||||
|
]
|
||||||
|
{
|
||||||
|
properties.size ? <span>
|
||||||
|
{ properties.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} style={propStyle}>
|
||||||
|
<br />{ `${key}:`}{ String(v) }</span>)
|
||||||
|
}<br /></span>
|
||||||
|
: null
|
||||||
|
}
|
||||||
|
</ModelCollapse>
|
||||||
|
{ required && <span style={{ color: "red" }}>*</span>}
|
||||||
|
</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
19
src/core/components/enum-model.jsx
Normal file
19
src/core/components/enum-model.jsx
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import React from "react"
|
||||||
|
import ImPropTypes from "react-immutable-proptypes"
|
||||||
|
|
||||||
|
const EnumModel = ({ value, getComponent }) => {
|
||||||
|
let ModelCollapse = getComponent("ModelCollapse")
|
||||||
|
let collapsedContent = <span>Array [ { value.count() } ]</span>
|
||||||
|
return <span className="prop-enum">
|
||||||
|
Enum:<br />
|
||||||
|
<ModelCollapse collapsedContent={ collapsedContent }>
|
||||||
|
[ { value.join(", ") } ]
|
||||||
|
</ModelCollapse>
|
||||||
|
</span>
|
||||||
|
}
|
||||||
|
EnumModel.propTypes = {
|
||||||
|
value: ImPropTypes.iterable,
|
||||||
|
getComponent: ImPropTypes.func
|
||||||
|
}
|
||||||
|
|
||||||
|
export default EnumModel
|
||||||
@@ -26,7 +26,7 @@ export default class BaseLayout extends React.Component {
|
|||||||
|
|
||||||
let Info = getComponent("info")
|
let Info = getComponent("info")
|
||||||
let Operations = getComponent("operations", true)
|
let Operations = getComponent("operations", true)
|
||||||
let Models = getComponent("models", true)
|
let Models = getComponent("Models", true)
|
||||||
let AuthorizeBtn = getComponent("authorizeBtn", true)
|
let AuthorizeBtn = getComponent("authorizeBtn", true)
|
||||||
let Row = getComponent("Row")
|
let Row = getComponent("Row")
|
||||||
let Col = getComponent("Col")
|
let Col = getComponent("Col")
|
||||||
|
|||||||
41
src/core/components/model-collapse.jsx
Normal file
41
src/core/components/model-collapse.jsx
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import React, { Component } from "react"
|
||||||
|
import PropTypes from "prop-types"
|
||||||
|
|
||||||
|
export default class ModelCollapse extends Component {
|
||||||
|
static propTypes = {
|
||||||
|
collapsedContent: PropTypes.any,
|
||||||
|
collapsed: PropTypes.bool,
|
||||||
|
children: PropTypes.any
|
||||||
|
}
|
||||||
|
|
||||||
|
static defaultProps = {
|
||||||
|
collapsedContent: "{...}",
|
||||||
|
collapsed: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(props, context) {
|
||||||
|
super(props, context)
|
||||||
|
|
||||||
|
let { collapsed, collapsedContent } = this.props
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
collapsed: collapsed !== undefined ? collapsed : ModelCollapse.defaultProps.collapsed,
|
||||||
|
collapsedContent: collapsedContent || ModelCollapse.defaultProps.collapsedContent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleCollapsed=()=>{
|
||||||
|
this.setState({
|
||||||
|
collapsed: !this.state.collapsed
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return (<span>
|
||||||
|
<span onClick={ this.toggleCollapsed } style={{ "cursor": "pointer" }}>
|
||||||
|
<span className={ "model-toggle" + ( this.state.collapsed ? " collapsed" : "" ) }></span>
|
||||||
|
</span>
|
||||||
|
{ this.state.collapsed ? this.state.collapsedContent : this.props.children }
|
||||||
|
</span>)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,7 +28,7 @@ export default class ModelExample extends React.Component {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
let { getComponent, specSelectors, schema, example, isExecute } = this.props
|
let { getComponent, specSelectors, schema, example, isExecute } = this.props
|
||||||
const Model = getComponent("model")
|
const ModelWrapper = getComponent("ModelWrapper")
|
||||||
|
|
||||||
return <div>
|
return <div>
|
||||||
<ul className="tab">
|
<ul className="tab">
|
||||||
@@ -44,7 +44,7 @@ export default class ModelExample extends React.Component {
|
|||||||
(isExecute || this.state.activeTab === "example") && example
|
(isExecute || this.state.activeTab === "example") && example
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
!isExecute && this.state.activeTab === "model" && <Model schema={ schema }
|
!isExecute && this.state.activeTab === "model" && <ModelWrapper schema={ schema }
|
||||||
getComponent={ getComponent }
|
getComponent={ getComponent }
|
||||||
specSelectors={ specSelectors }
|
specSelectors={ specSelectors }
|
||||||
expandDepth={ 1 } />
|
expandDepth={ 1 } />
|
||||||
|
|||||||
23
src/core/components/model-wrapper.jsx
Normal file
23
src/core/components/model-wrapper.jsx
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import React, { Component, } from "react"
|
||||||
|
import PropTypes from "prop-types"
|
||||||
|
|
||||||
|
export default class ModelComponent extends Component {
|
||||||
|
static propTypes = {
|
||||||
|
schema: PropTypes.object.isRequired,
|
||||||
|
name: PropTypes.string,
|
||||||
|
getComponent: PropTypes.func.isRequired,
|
||||||
|
specSelectors: PropTypes.object.isRequired,
|
||||||
|
expandDepth: PropTypes.number
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
let { getComponent } = this.props
|
||||||
|
const Model = getComponent("Model")
|
||||||
|
|
||||||
|
return <div className="model-box">
|
||||||
|
<Model { ...this.props } depth={ 1 } expandDepth={ this.props.expandDepth || 0 }/>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1,219 +1,7 @@
|
|||||||
import React, { Component } from "react"
|
import React, { Component } from "react"
|
||||||
import PropTypes from "prop-types"
|
import PropTypes from "prop-types"
|
||||||
import ImPropTypes from "react-immutable-proptypes"
|
|
||||||
import { List } from "immutable"
|
|
||||||
const braceOpen = "{"
|
|
||||||
const braceClose = "}"
|
|
||||||
|
|
||||||
const propStyle = { color: "#999", fontStyle: "italic" }
|
export default class Model extends Component {
|
||||||
|
|
||||||
const EnumModel = ({ value }) => {
|
|
||||||
let collapsedContent = <span>Array [ { value.count() } ]</span>
|
|
||||||
return <span className="prop-enum">
|
|
||||||
Enum:<br />
|
|
||||||
<Collapse collapsedContent={ collapsedContent }>
|
|
||||||
[ { value.join(", ") } ]
|
|
||||||
</Collapse>
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
|
|
||||||
EnumModel.propTypes = {
|
|
||||||
value: ImPropTypes.iterable
|
|
||||||
}
|
|
||||||
|
|
||||||
class ObjectModel extends Component {
|
|
||||||
static propTypes = {
|
|
||||||
schema: PropTypes.object.isRequired,
|
|
||||||
getComponent: PropTypes.func.isRequired,
|
|
||||||
specSelectors: PropTypes.object.isRequired,
|
|
||||||
name: PropTypes.string,
|
|
||||||
isRef: PropTypes.bool,
|
|
||||||
expandDepth: PropTypes.number,
|
|
||||||
depth: PropTypes.number
|
|
||||||
}
|
|
||||||
|
|
||||||
render(){
|
|
||||||
let { schema, name, isRef, getComponent, depth, ...props } = this.props
|
|
||||||
let { expandDepth } = this.props
|
|
||||||
const JumpToPath = getComponent("JumpToPath", true)
|
|
||||||
let description = schema.get("description")
|
|
||||||
let properties = schema.get("properties")
|
|
||||||
let additionalProperties = schema.get("additionalProperties")
|
|
||||||
let title = schema.get("title") || name
|
|
||||||
let required = schema.get("required")
|
|
||||||
const Markdown = getComponent("Markdown")
|
|
||||||
const JumpToPathSection = ({ name }) => <span className="model-jump-to-path"><JumpToPath path={`definitions.${name}`} /></span>
|
|
||||||
let collapsedContent = (<span>
|
|
||||||
<span>{ braceOpen }</span>...<span>{ braceClose }</span>
|
|
||||||
{
|
|
||||||
isRef ? <JumpToPathSection name={ name }/> : ""
|
|
||||||
}
|
|
||||||
</span>)
|
|
||||||
|
|
||||||
return <span className="model">
|
|
||||||
{
|
|
||||||
title && <span className="model-title">
|
|
||||||
{ isRef && schema.get("$$ref") && <span className="model-hint">{ schema.get("$$ref") }</span> }
|
|
||||||
<span className="model-title__text">{ title }</span>
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
<Collapse collapsed={ depth > expandDepth } collapsedContent={ collapsedContent }>
|
|
||||||
<span className="brace-open object">{ braceOpen }</span>
|
|
||||||
{
|
|
||||||
!isRef ? null : <JumpToPathSection name={ name }/>
|
|
||||||
}
|
|
||||||
<span className="inner-object">
|
|
||||||
{
|
|
||||||
<table className="model" style={{ marginLeft: "2em" }}><tbody>
|
|
||||||
{
|
|
||||||
!description ? null : <tr style={{ color: "#999", fontStyle: "italic" }}>
|
|
||||||
<td>description:</td>
|
|
||||||
<td>
|
|
||||||
<Markdown source={ description } />
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
{
|
|
||||||
!(properties && properties.size) ? null : properties.entrySeq().map(
|
|
||||||
([key, value]) => {
|
|
||||||
let isRequired = List.isList(required) && required.contains(key)
|
|
||||||
let propertyStyle = { verticalAlign: "top", paddingRight: "0.2em" }
|
|
||||||
if ( isRequired ) {
|
|
||||||
propertyStyle.fontWeight = "bold"
|
|
||||||
}
|
|
||||||
|
|
||||||
return (<tr key={key}>
|
|
||||||
<td style={ propertyStyle }>{ key }:</td>
|
|
||||||
<td style={{ verticalAlign: "top" }}>
|
|
||||||
<Model key={ `object-${name}-${key}_${value}` } { ...props }
|
|
||||||
required={ isRequired }
|
|
||||||
getComponent={ getComponent }
|
|
||||||
schema={ value }
|
|
||||||
depth={ depth + 1 } />
|
|
||||||
</td>
|
|
||||||
</tr>)
|
|
||||||
}).toArray()
|
|
||||||
}
|
|
||||||
{
|
|
||||||
!additionalProperties || !additionalProperties.size ? null
|
|
||||||
: <tr>
|
|
||||||
<td>{ "< * >:" }</td>
|
|
||||||
<td>
|
|
||||||
<Model { ...props } required={ false }
|
|
||||||
getComponent={ getComponent }
|
|
||||||
schema={ additionalProperties }
|
|
||||||
depth={ depth + 1 } />
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
</tbody></table>
|
|
||||||
}
|
|
||||||
</span>
|
|
||||||
<span className="brace-close">{ braceClose }</span>
|
|
||||||
</Collapse>
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Primitive extends Component {
|
|
||||||
static propTypes = {
|
|
||||||
schema: PropTypes.object.isRequired,
|
|
||||||
name: PropTypes.string,
|
|
||||||
getComponent: PropTypes.func.isRequired,
|
|
||||||
required: PropTypes.bool
|
|
||||||
}
|
|
||||||
|
|
||||||
render(){
|
|
||||||
let { schema, getComponent, name, required } = this.props
|
|
||||||
|
|
||||||
if(!schema || !schema.get) {
|
|
||||||
// don't render if schema isn't correctly formed
|
|
||||||
return <div></div>
|
|
||||||
}
|
|
||||||
|
|
||||||
let type = schema.get("type")
|
|
||||||
let format = schema.get("format")
|
|
||||||
let xml = schema.get("xml")
|
|
||||||
let enumArray = schema.get("enum")
|
|
||||||
let title = schema.get("title") || name
|
|
||||||
let description = schema.get("description")
|
|
||||||
let properties = schema.filter( ( v, key) => ["enum", "type", "format", "description", "$$ref"].indexOf(key) === -1 )
|
|
||||||
let style = required ? { fontWeight: "bold" } : {}
|
|
||||||
const Markdown = getComponent("Markdown")
|
|
||||||
|
|
||||||
return <span className="model">
|
|
||||||
{
|
|
||||||
title && <span className="model-title" style={{ marginRight: "2em" }}>
|
|
||||||
<span className="model-title__text">{ title }</span>
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
<span className="prop-type" style={ style }>{ type }</span> { required && <span style={{ color: "red" }}>*</span>}
|
|
||||||
{ format && <span className="prop-format">(${format})</span>}
|
|
||||||
{
|
|
||||||
properties.size ? properties.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} style={ propStyle }>
|
|
||||||
<br />{ key }: { String(v) }</span>)
|
|
||||||
: null
|
|
||||||
}
|
|
||||||
{
|
|
||||||
!description ? null :
|
|
||||||
<Markdown source={ description } />
|
|
||||||
}
|
|
||||||
{
|
|
||||||
xml && xml.size ? (<span><br /><span style={ propStyle }>xml:</span>
|
|
||||||
{
|
|
||||||
xml.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} style={ propStyle }><br/> {key}: { String(v) }</span>).toArray()
|
|
||||||
}
|
|
||||||
</span>): null
|
|
||||||
}
|
|
||||||
{
|
|
||||||
enumArray && <EnumModel value={ enumArray } />
|
|
||||||
}
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ArrayModel extends Component {
|
|
||||||
static propTypes = {
|
|
||||||
schema: PropTypes.object.isRequired,
|
|
||||||
getComponent: PropTypes.func.isRequired,
|
|
||||||
specSelectors: PropTypes.object.isRequired,
|
|
||||||
name: PropTypes.string,
|
|
||||||
required: PropTypes.bool,
|
|
||||||
expandDepth: PropTypes.number,
|
|
||||||
depth: PropTypes.number
|
|
||||||
}
|
|
||||||
|
|
||||||
render(){
|
|
||||||
let { required, schema, depth, name, expandDepth } = this.props
|
|
||||||
let items = schema.get("items")
|
|
||||||
let title = schema.get("title") || name
|
|
||||||
let properties = schema.filter( ( v, key) => ["type", "items", "$$ref"].indexOf(key) === -1 )
|
|
||||||
|
|
||||||
return <span className="model">
|
|
||||||
{
|
|
||||||
title && <span className="model-title">
|
|
||||||
<span className="model-title__text">{ title }</span>
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
<Collapse collapsed={ depth > expandDepth } collapsedContent="[...]">
|
|
||||||
[
|
|
||||||
<span><Model { ...this.props } name="" schema={ items } required={ false }/></span>
|
|
||||||
]
|
|
||||||
{
|
|
||||||
properties.size ? <span>
|
|
||||||
{ properties.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} style={propStyle}>
|
|
||||||
<br />{ `${key}:`}{ String(v) }</span>)
|
|
||||||
}<br /></span>
|
|
||||||
: null
|
|
||||||
}
|
|
||||||
</Collapse>
|
|
||||||
{ required && <span style={{ color: "red" }}>*</span>}
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class Model extends Component {
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
schema: PropTypes.object.isRequired,
|
schema: PropTypes.object.isRequired,
|
||||||
getComponent: PropTypes.func.isRequired,
|
getComponent: PropTypes.func.isRequired,
|
||||||
@@ -239,6 +27,9 @@ class Model extends Component {
|
|||||||
|
|
||||||
render () {
|
render () {
|
||||||
let { schema, getComponent, required, name, isRef } = this.props
|
let { schema, getComponent, required, name, isRef } = this.props
|
||||||
|
let ObjectModel = getComponent("ObjectModel")
|
||||||
|
let ArrayModel = getComponent("ArrayModel")
|
||||||
|
let PrimitiveModel = getComponent("PrimitiveModel")
|
||||||
let $$ref = schema && schema.get("$$ref")
|
let $$ref = schema && schema.get("$$ref")
|
||||||
let modelName = $$ref && this.getModelName( $$ref )
|
let modelName = $$ref && this.getModelName( $$ref )
|
||||||
let modelSchema, type
|
let modelSchema, type
|
||||||
@@ -260,69 +51,13 @@ class Model extends Component {
|
|||||||
name={ name || modelName }
|
name={ name || modelName }
|
||||||
isRef={ isRef!== undefined ? isRef : !!$$ref }/>
|
isRef={ isRef!== undefined ? isRef : !!$$ref }/>
|
||||||
case "array":
|
case "array":
|
||||||
return <ArrayModel className="array" { ...this.props } schema={ modelSchema } name={ name || modelName } required={ required } />
|
return <ArrayModel className="array" { ...this.props } schema={ modelSchema } required={ required } />
|
||||||
case "string":
|
case "string":
|
||||||
case "number":
|
case "number":
|
||||||
case "integer":
|
case "integer":
|
||||||
case "boolean":
|
case "boolean":
|
||||||
default:
|
default:
|
||||||
return <Primitive { ...this.props } getComponent={ getComponent } schema={ modelSchema } name={ name || modelName } required={ required }/>
|
return <PrimitiveModel getComponent={ getComponent } schema={ modelSchema } required={ required }/>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export default class ModelComponent extends Component {
|
|
||||||
static propTypes = {
|
|
||||||
schema: PropTypes.object.isRequired,
|
|
||||||
name: PropTypes.string,
|
|
||||||
getComponent: PropTypes.func.isRequired,
|
|
||||||
specSelectors: PropTypes.object.isRequired,
|
|
||||||
expandDepth: PropTypes.number
|
|
||||||
}
|
|
||||||
|
|
||||||
render(){
|
|
||||||
return <div className="model-box">
|
|
||||||
<Model { ...this.props } depth={ 1 } expandDepth={ this.props.expandDepth || 0 }/>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Collapse extends Component {
|
|
||||||
static propTypes = {
|
|
||||||
collapsedContent: PropTypes.any,
|
|
||||||
collapsed: PropTypes.bool,
|
|
||||||
children: PropTypes.any
|
|
||||||
}
|
|
||||||
|
|
||||||
static defaultProps = {
|
|
||||||
collapsedContent: "{...}",
|
|
||||||
collapsed: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(props, context) {
|
|
||||||
super(props, context)
|
|
||||||
|
|
||||||
let { collapsed, collapsedContent } = this.props
|
|
||||||
|
|
||||||
this.state = {
|
|
||||||
collapsed: collapsed !== undefined ? collapsed : Collapse.defaultProps.collapsed,
|
|
||||||
collapsedContent: collapsedContent || Collapse.defaultProps.collapsedContent
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
toggleCollapsed=()=>{
|
|
||||||
this.setState({
|
|
||||||
collapsed: !this.state.collapsed
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
render () {
|
|
||||||
return (<span>
|
|
||||||
<span onClick={ this.toggleCollapsed } style={{ "cursor": "pointer" }}>
|
|
||||||
<span className={ "model-toggle" + ( this.state.collapsed ? " collapsed" : "" ) }></span>
|
|
||||||
</span>
|
|
||||||
{ this.state.collapsed ? this.state.collapsedContent : this.props.children }
|
|
||||||
</span>)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export default class Models extends Component {
|
|||||||
let { docExpansion } = getConfigs()
|
let { docExpansion } = getConfigs()
|
||||||
let showModels = layoutSelectors.isShown("models", docExpansion === "full" || docExpansion === "list" )
|
let showModels = layoutSelectors.isShown("models", docExpansion === "full" || docExpansion === "list" )
|
||||||
|
|
||||||
const Model = getComponent("model")
|
const ModelWrapper = getComponent("ModelWrapper")
|
||||||
const Collapse = getComponent("Collapse")
|
const Collapse = getComponent("Collapse")
|
||||||
|
|
||||||
if (!definitions.size) return null
|
if (!definitions.size) return null
|
||||||
@@ -24,15 +24,15 @@ export default class Models extends Component {
|
|||||||
return <section className={ showModels ? "models is-open" : "models"}>
|
return <section className={ showModels ? "models is-open" : "models"}>
|
||||||
<h4 onClick={() => layoutActions.show("models", !showModels)}>
|
<h4 onClick={() => layoutActions.show("models", !showModels)}>
|
||||||
<span>Models</span>
|
<span>Models</span>
|
||||||
<svg className="arrow" width="20" height="20">
|
<svg width="20" height="20">
|
||||||
<use xlinkHref={showModels ? "#large-arrow-down" : "#large-arrow"} />
|
<use xlinkHref="#large-arrow" />
|
||||||
</svg>
|
</svg>
|
||||||
</h4>
|
</h4>
|
||||||
<Collapse isOpened={showModels} animated>
|
<Collapse isOpened={showModels} animated>
|
||||||
{
|
{
|
||||||
definitions.entrySeq().map( ( [ name, model ])=>{
|
definitions.entrySeq().map( ( [ name, model ])=>{
|
||||||
return <div className="model-container" key={ `models-section-${name}` }>
|
return <div className="model-container" key={ `models-section-${name}` }>
|
||||||
<Model name={ name }
|
<ModelWrapper name={ name }
|
||||||
schema={ model }
|
schema={ model }
|
||||||
isRef={ true }
|
isRef={ true }
|
||||||
getComponent={ getComponent }
|
getComponent={ getComponent }
|
||||||
|
|||||||
105
src/core/components/object-model.jsx
Normal file
105
src/core/components/object-model.jsx
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
import React, { Component, } from "react"
|
||||||
|
import PropTypes from "prop-types"
|
||||||
|
import { List } from "immutable"
|
||||||
|
|
||||||
|
const braceOpen = "{"
|
||||||
|
const braceClose = "}"
|
||||||
|
|
||||||
|
export default class ObjectModel extends Component {
|
||||||
|
static propTypes = {
|
||||||
|
schema: PropTypes.object.isRequired,
|
||||||
|
getComponent: PropTypes.func.isRequired,
|
||||||
|
specSelectors: PropTypes.object.isRequired,
|
||||||
|
name: PropTypes.string,
|
||||||
|
isRef: PropTypes.bool,
|
||||||
|
expandDepth: PropTypes.number,
|
||||||
|
depth: PropTypes.number
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
let { schema, name, isRef, getComponent, depth, ...props } = this.props
|
||||||
|
let { expandDepth } = this.props
|
||||||
|
let description = schema.get("description")
|
||||||
|
let properties = schema.get("properties")
|
||||||
|
let additionalProperties = schema.get("additionalProperties")
|
||||||
|
let title = schema.get("title") || name
|
||||||
|
let required = schema.get("required")
|
||||||
|
|
||||||
|
const JumpToPath = getComponent("JumpToPath", true)
|
||||||
|
const Markdown = getComponent("Markdown")
|
||||||
|
const Model = getComponent("Model")
|
||||||
|
const ModelCollapse = getComponent("ModelCollapse")
|
||||||
|
|
||||||
|
const JumpToPathSection = ({ name }) => <span className="model-jump-to-path"><JumpToPath path={`definitions.${name}`} /></span>
|
||||||
|
const collapsedContent = (<span>
|
||||||
|
<span>{ braceOpen }</span>...<span>{ braceClose }</span>
|
||||||
|
{
|
||||||
|
isRef ? <JumpToPathSection name={ name }/> : ""
|
||||||
|
}
|
||||||
|
</span>)
|
||||||
|
|
||||||
|
|
||||||
|
return <span className="model">
|
||||||
|
{
|
||||||
|
title && <span className="model-title">
|
||||||
|
{ isRef && schema.get("$$ref") && <span className="model-hint">{ schema.get("$$ref") }</span> }
|
||||||
|
<span className="model-title__text">{ title }</span>
|
||||||
|
</span>
|
||||||
|
}
|
||||||
|
<ModelCollapse collapsed={ depth > expandDepth } collapsedContent={ collapsedContent }>
|
||||||
|
<span className="brace-open object">{ braceOpen }</span>
|
||||||
|
{
|
||||||
|
!isRef ? null : <JumpToPathSection name={ name }/>
|
||||||
|
}
|
||||||
|
<span className="inner-object">
|
||||||
|
{
|
||||||
|
<table className="model" style={{ marginLeft: "2em" }}><tbody>
|
||||||
|
{
|
||||||
|
!description ? null : <tr style={{ color: "#999", fontStyle: "italic" }}>
|
||||||
|
<td>description:</td>
|
||||||
|
<td>
|
||||||
|
<Markdown source={ description } />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
{
|
||||||
|
!(properties && properties.size) ? null : properties.entrySeq().map(
|
||||||
|
([key, value]) => {
|
||||||
|
let isRequired = List.isList(required) && required.contains(key)
|
||||||
|
let propertyStyle = { verticalAlign: "top", paddingRight: "0.2em" }
|
||||||
|
if ( isRequired ) {
|
||||||
|
propertyStyle.fontWeight = "bold"
|
||||||
|
}
|
||||||
|
|
||||||
|
return (<tr key={key}>
|
||||||
|
<td style={ propertyStyle }>{ key }:</td>
|
||||||
|
<td style={{ verticalAlign: "top" }}>
|
||||||
|
<Model key={ `object-${name}-${key}_${value}` } { ...props }
|
||||||
|
required={ isRequired }
|
||||||
|
getComponent={ getComponent }
|
||||||
|
schema={ value }
|
||||||
|
depth={ depth + 1 } />
|
||||||
|
</td>
|
||||||
|
</tr>)
|
||||||
|
}).toArray()
|
||||||
|
}
|
||||||
|
{
|
||||||
|
!additionalProperties || !additionalProperties.size ? null
|
||||||
|
: <tr>
|
||||||
|
<td>{ "< * >:" }</td>
|
||||||
|
<td>
|
||||||
|
<Model { ...props } required={ false }
|
||||||
|
getComponent={ getComponent }
|
||||||
|
schema={ additionalProperties }
|
||||||
|
depth={ depth + 1 } />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody></table>
|
||||||
|
}
|
||||||
|
</span>
|
||||||
|
<span className="brace-close">{ braceClose }</span>
|
||||||
|
</ModelCollapse>
|
||||||
|
</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -49,10 +49,11 @@ export default class ParamBody extends PureComponent {
|
|||||||
let { specSelectors, pathMethod, param, isExecute, consumesValue="" } = props
|
let { specSelectors, pathMethod, param, isExecute, consumesValue="" } = props
|
||||||
let parameter = specSelectors ? specSelectors.getParameter(pathMethod, param.get("name")) : {}
|
let parameter = specSelectors ? specSelectors.getParameter(pathMethod, param.get("name")) : {}
|
||||||
let isXml = /xml/i.test(consumesValue)
|
let isXml = /xml/i.test(consumesValue)
|
||||||
|
let isJson = /json/i.test(consumesValue)
|
||||||
let paramValue = isXml ? parameter.get("value_xml") : parameter.get("value")
|
let paramValue = isXml ? parameter.get("value_xml") : parameter.get("value")
|
||||||
|
|
||||||
if ( paramValue !== undefined ) {
|
if ( paramValue !== undefined ) {
|
||||||
let val = !paramValue && !isXml ? "{}" : paramValue
|
let val = !paramValue && isJson ? "{}" : paramValue
|
||||||
this.setState({ value: val })
|
this.setState({ value: val })
|
||||||
this.onChange(val, {isXml: isXml, isEditBox: isExecute})
|
this.onChange(val, {isXml: isXml, isEditBox: isExecute})
|
||||||
} else {
|
} else {
|
||||||
@@ -79,8 +80,11 @@ export default class ParamBody extends PureComponent {
|
|||||||
_onChange = (val, isXml) => { (this.props.onChange || NOOP)(this.props.param, val, isXml) }
|
_onChange = (val, isXml) => { (this.props.onChange || NOOP)(this.props.param, val, isXml) }
|
||||||
|
|
||||||
handleOnChange = e => {
|
handleOnChange = e => {
|
||||||
let {consumesValue} = this.props
|
const {consumesValue} = this.props
|
||||||
this.onChange(e.target.value.trim(), {isXml: /xml/i.test(consumesValue)})
|
const isJson = /json/i.test(consumesValue)
|
||||||
|
const isXml = /xml/i.test(consumesValue)
|
||||||
|
const inputValue = isJson ? e.target.value.trim() : e.target.value
|
||||||
|
this.onChange(inputValue, {isXml})
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleIsEditBox = () => this.setState( state => ({isEditBox: !state.isEditBox}))
|
toggleIsEditBox = () => this.setState( state => ({isEditBox: !state.isEditBox}))
|
||||||
|
|||||||
55
src/core/components/primitive-model.jsx
Normal file
55
src/core/components/primitive-model.jsx
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
import React, { Component } from "react"
|
||||||
|
import PropTypes from "prop-types"
|
||||||
|
|
||||||
|
const propStyle = { color: "#999", fontStyle: "italic" }
|
||||||
|
|
||||||
|
export default class Primitive extends Component {
|
||||||
|
static propTypes = {
|
||||||
|
schema: PropTypes.object.isRequired,
|
||||||
|
getComponent: PropTypes.func.isRequired,
|
||||||
|
required: PropTypes.bool
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
let { schema, getComponent, required } = this.props
|
||||||
|
|
||||||
|
if(!schema || !schema.get) {
|
||||||
|
// don't render if schema isn't correctly formed
|
||||||
|
return <div></div>
|
||||||
|
}
|
||||||
|
|
||||||
|
let type = schema.get("type")
|
||||||
|
let format = schema.get("format")
|
||||||
|
let xml = schema.get("xml")
|
||||||
|
let enumArray = schema.get("enum")
|
||||||
|
let description = schema.get("description")
|
||||||
|
let properties = schema.filter( ( v, key) => ["enum", "type", "format", "description", "$$ref"].indexOf(key) === -1 )
|
||||||
|
let style = required ? { fontWeight: "bold" } : {}
|
||||||
|
const Markdown = getComponent("Markdown")
|
||||||
|
const EnumModel = getComponent("EnumModel")
|
||||||
|
|
||||||
|
return <span className="prop">
|
||||||
|
<span className="prop-type" style={ style }>{ type }</span> { required && <span style={{ color: "red" }}>*</span>}
|
||||||
|
{ format && <span className="prop-format">(${format})</span>}
|
||||||
|
{
|
||||||
|
properties.size ? properties.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} style={ propStyle }>
|
||||||
|
<br />{ key }: { String(v) }</span>)
|
||||||
|
: null
|
||||||
|
}
|
||||||
|
{
|
||||||
|
!description ? null :
|
||||||
|
<Markdown source={ description } />
|
||||||
|
}
|
||||||
|
{
|
||||||
|
xml && xml.size ? (<span><br /><span style={ propStyle }>xml:</span>
|
||||||
|
{
|
||||||
|
xml.entrySeq().map( ( [ key, v ] ) => <span key={`${key}-${v}`} style={ propStyle }><br/> {key}: { String(v) }</span>).toArray()
|
||||||
|
}
|
||||||
|
</span>): null
|
||||||
|
}
|
||||||
|
{
|
||||||
|
enumArray && <EnumModel value={ enumArray } getComponent={ getComponent } />
|
||||||
|
}
|
||||||
|
</span>
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -41,9 +41,15 @@ import Footer from "core/components/footer"
|
|||||||
import ParamBody from "core/components/param-body"
|
import ParamBody from "core/components/param-body"
|
||||||
import Curl from "core/components/curl"
|
import Curl from "core/components/curl"
|
||||||
import Schemes from "core/components/schemes"
|
import Schemes from "core/components/schemes"
|
||||||
|
import ModelCollapse from "core/components/model-collapse"
|
||||||
import ModelExample from "core/components/model-example"
|
import ModelExample from "core/components/model-example"
|
||||||
|
import ModelWrapper from "core/components/model-wrapper"
|
||||||
import Model from "core/components/model"
|
import Model from "core/components/model"
|
||||||
import Models from "core/components/models"
|
import Models from "core/components/models"
|
||||||
|
import EnumModel from "core/components/enum-model"
|
||||||
|
import ObjectModel from "core/components/object-model"
|
||||||
|
import ArrayModel from "core/components/array-model"
|
||||||
|
import PrimitiveModel from "core/components/primitive-model"
|
||||||
import TryItOutButton from "core/components/try-it-out-button"
|
import TryItOutButton from "core/components/try-it-out-button"
|
||||||
|
|
||||||
import Markdown from "core/components/providers/markdown"
|
import Markdown from "core/components/providers/markdown"
|
||||||
@@ -88,8 +94,14 @@ export default function() {
|
|||||||
curl: Curl,
|
curl: Curl,
|
||||||
schemes: Schemes,
|
schemes: Schemes,
|
||||||
modelExample: ModelExample,
|
modelExample: ModelExample,
|
||||||
model: Model,
|
ModelWrapper,
|
||||||
models: Models,
|
ModelCollapse,
|
||||||
|
Model,
|
||||||
|
Models,
|
||||||
|
EnumModel,
|
||||||
|
ObjectModel,
|
||||||
|
ArrayModel,
|
||||||
|
PrimitiveModel,
|
||||||
TryItOutButton,
|
TryItOutButton,
|
||||||
Markdown,
|
Markdown,
|
||||||
BaseLayout
|
BaseLayout
|
||||||
|
|||||||
Reference in New Issue
Block a user