Skip to content

Commit febd5ff

Browse files
authored
Merge pull request #3452 from shockey/v/3.0.21
v3.0.21 (hotfix release)
2 parents e45edc5 + b834833 commit febd5ff

File tree

15 files changed

+109
-393
lines changed

15 files changed

+109
-393
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ The OpenAPI Specification has undergone 4 revisions since initial creation in 20
2222

2323
Swagger UI Version | Release Date | OpenAPI Spec compatibility | Notes | Status
2424
------------------ | ------------ | -------------------------- | ----- | ------
25-
3.0.20 | 2017-07-21 | 2.0 | [tag v3.0.20](https://github.com/swagger-api/swagger-ui/tree/v3.0.20) |
25+
3.0.21 | 2017-07-24 | 2.0 | [tag v3.0.21](https://github.com/swagger-api/swagger-ui/tree/v3.0.21) |
2626
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) |
2727
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) |
2828
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) |

dist/swagger-ui-bundle.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/swagger-ui-bundle.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/swagger-ui.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/swagger-ui.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/swagger-ui.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "swagger-ui",
3-
"version": "3.0.20",
3+
"version": "3.0.21",
44
"main": "dist/swagger-ui.js",
55
"repository": "[email protected]:swagger-api/swagger-ui.git",
66
"contributors": [

src/core/components/layout-utils.jsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,7 @@ export class Select extends React.Component {
129129
value: PropTypes.any,
130130
onChange: PropTypes.func,
131131
multiple: PropTypes.bool,
132-
allowEmptyValue: PropTypes.bool,
133-
className: PropTypes.string
132+
allowEmptyValue: PropTypes.bool
134133
}
135134

136135
static defaultProps = {
@@ -143,7 +142,7 @@ export class Select extends React.Component {
143142

144143
let value
145144

146-
if (props.value) {
145+
if (props.value !== undefined) {
147146
value = props.value
148147
} else {
149148
value = props.multiple ? [""] : ""
@@ -179,7 +178,7 @@ export class Select extends React.Component {
179178
let value = this.state.value.toJS ? this.state.value.toJS() : this.state.value
180179

181180
return (
182-
<select className={this.props.className} multiple={ multiple } value={ value } onChange={ this.onChange } >
181+
<select multiple={ multiple } value={ value } onChange={ this.onChange } >
183182
{ allowEmptyValue ? <option value="">--</option> : null }
184183
{
185184
allowedValues.map(function (item, key) {

src/core/json-schema-components.js

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ export class JsonSchema_string extends Component {
5757

5858
if ( enumValue ) {
5959
const Select = getComponent("Select")
60-
return (<Select className={ errors.length ? "invalid" : ""}
61-
allowedValues={ enumValue }
60+
return (<Select allowedValues={ enumValue }
6261
value={ value }
6362
allowEmptyValue={ !required }
6463
onChange={ this.onEnumChange }/>)
@@ -122,7 +121,6 @@ export class JsonSchema_array extends PureComponent {
122121
render() {
123122
let { getComponent, required, schema, fn } = this.props
124123

125-
let errors = schema.errors || []
126124
let itemSchema = fn.inferSchema(schema.items)
127125

128126
const JsonSchemaForm = getComponent("JsonSchemaForm")
@@ -133,17 +131,19 @@ export class JsonSchema_array extends PureComponent {
133131

134132
if ( enumValue ) {
135133
const Select = getComponent("Select")
136-
return (<Select className={ errors.length ? "invalid" : ""}
137-
multiple={ true }
134+
return (<Select multiple={ true }
138135
value={ value }
139136
allowedValues={ enumValue }
140137
allowEmptyValue={ !required }
141138
onChange={ this.onEnumChange }/>)
142139
}
143140

141+
let errors = schema.errors || []
142+
144143
return (
145144
<div>
146-
{ !value || value.count() < 1 ? null :
145+
{ !value || value.count() < 1 ?
146+
(errors.length ? <span style={{ color: "red", fortWeight: "bold" }}>{ errors[0] }</span> : null) :
147147
value.map( (item,i) => {
148148
let schema = Object.assign({}, itemSchema)
149149
if ( errors.length ) {
@@ -153,12 +153,12 @@ export class JsonSchema_array extends PureComponent {
153153
return (
154154
<div key={i} className="json-schema-form-item">
155155
<JsonSchemaForm fn={fn} getComponent={getComponent} value={item} onChange={(val) => this.onItemChange(val, i)} schema={schema} />
156-
<Button className="btn btn-sm json-schema-form-item-remove" onClick={()=> this.removeItem(i)} > - </Button>
156+
<Button className="json-schema-form-item-remove" onClick={()=> this.removeItem(i)} > - </Button>
157157
</div>
158158
)
159159
}).toArray()
160160
}
161-
<Button className={`btn btn-sm json-schema-form-item-add ${errors.length ? "invalid" : null}`} onClick={this.addItem}> Add item </Button>
161+
<Button className="json-schema-form-item-add" onClick={this.addItem}> Add item </Button>
162162
</div>
163163
)
164164
}
@@ -170,14 +170,12 @@ export class JsonSchema_boolean extends Component {
170170

171171
onEnumChange = (val) => this.props.onChange(val)
172172
render() {
173-
let { getComponent, value, schema } = this.props
174-
let errors = schema.errors || []
173+
let { getComponent, required, value } = this.props
175174
const Select = getComponent("Select")
176175

177-
return (<Select className={ errors.length ? "invalid" : ""}
178-
value={ String(value) }
176+
return (<Select value={ String(value) }
179177
allowedValues={ fromJS(["true", "false"]) }
180-
allowEmptyValue={true}
178+
allowEmptyValue={ !required }
181179
onChange={ this.onEnumChange }/>)
182180
}
183181
}

src/core/utils.js

Lines changed: 45 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -468,85 +468,60 @@ export const validateFile = ( val ) => {
468468
}
469469
}
470470

471-
export const validateBoolean = ( val ) => {
472-
if ( !(val === "true" || val === "false" || val === true || val === false) ) {
473-
return "Value must be a boolean"
474-
}
475-
}
476-
477-
export const validateString = ( val ) => {
478-
if ( val && typeof val !== "string" ) {
479-
return "Value must be a string"
480-
}
481-
}
482-
483471
// validation of parameters before execute
484472
export const validateParam = (param, isXml) => {
485473
let errors = []
486474
let value = isXml && param.get("in") === "body" ? param.get("value_xml") : param.get("value")
487475
let required = param.get("required")
488476
let type = param.get("type")
489477

490-
// If the parameter is required OR the parameter has a value (meaning optional, but filled in)
491-
// then we should do our validation routine
492-
if ( required || value ) {
493-
// These checks should evaluate to true if the parameter's value is valid
494-
let stringCheck = type === "string" && value && !validateString(value)
495-
let arrayCheck = type === "array" && Array.isArray(value) && value.length
496-
let listCheck = type === "array" && Im.List.isList(value) && value.count()
497-
let fileCheck = type === "file" && value instanceof win.File
498-
let booleanCheck = type === "boolean" && !validateBoolean(value)
499-
let numberCheck = type === "number" && !validateNumber(value) // validateNumber returns undefined if the value is a number
500-
let integerCheck = type === "integer" && !validateInteger(value) // validateInteger returns undefined if the value is an integer
501-
502-
if ( required && !(stringCheck || arrayCheck || listCheck || fileCheck || booleanCheck || numberCheck || integerCheck) ) {
503-
errors.push("Required field is not provided")
504-
return errors
505-
}
478+
let stringCheck = type === "string" && !value
479+
let arrayCheck = type === "array" && Array.isArray(value) && !value.length
480+
let listCheck = type === "array" && Im.List.isList(value) && !value.count()
481+
let fileCheck = type === "file" && !(value instanceof win.File)
482+
let nullUndefinedCheck = value === null || value === undefined
506483

507-
if ( type === "string" ) {
508-
let err = validateString(value)
509-
if (!err) return errors
510-
errors.push(err)
511-
} else if ( type === "boolean" ) {
512-
let err = validateBoolean(value)
513-
if (!err) return errors
514-
errors.push(err)
515-
} else if ( type === "number" ) {
516-
let err = validateNumber(value)
517-
if (!err) return errors
518-
errors.push(err)
519-
} else if ( type === "integer" ) {
520-
let err = validateInteger(value)
521-
if (!err) return errors
522-
errors.push(err)
523-
} else if ( type === "array" ) {
524-
let itemType
525-
526-
if ( !value.count() ) { return errors }
527-
528-
itemType = param.getIn(["items", "type"])
529-
530-
value.forEach((item, index) => {
531-
let err
532-
533-
if (itemType === "number") {
534-
err = validateNumber(item)
535-
} else if (itemType === "integer") {
536-
err = validateInteger(item)
537-
} else if (itemType === "string") {
538-
err = validateString(item)
539-
}
484+
if ( required && (stringCheck || arrayCheck || listCheck || fileCheck || nullUndefinedCheck) ) {
485+
errors.push("Required field is not provided")
486+
return errors
487+
}
540488

541-
if ( err ) {
542-
errors.push({ index: index, error: err})
543-
}
544-
})
545-
} else if ( type === "file" ) {
546-
let err = validateFile(value)
547-
if (!err) return errors
548-
errors.push(err)
549-
}
489+
if ( value === null || value === undefined ) {
490+
return errors
491+
}
492+
493+
if ( type === "number" ) {
494+
let err = validateNumber(value)
495+
if (!err) return errors
496+
errors.push(err)
497+
} else if ( type === "integer" ) {
498+
let err = validateInteger(value)
499+
if (!err) return errors
500+
errors.push(err)
501+
} else if ( type === "array" ) {
502+
let itemType
503+
504+
if ( !value.count() ) { return errors }
505+
506+
itemType = param.getIn(["items", "type"])
507+
508+
value.forEach((item, index) => {
509+
let err
510+
511+
if (itemType === "number") {
512+
err = validateNumber(item)
513+
} else if (itemType === "integer") {
514+
err = validateInteger(item)
515+
}
516+
517+
if ( err ) {
518+
errors.push({ index: index, error: err})
519+
}
520+
})
521+
} else if ( type === "file" ) {
522+
let err = validateFile(value)
523+
if (!err) return errors
524+
errors.push(err)
550525
}
551526

552527
return errors

0 commit comments

Comments
 (0)