From fdb0d13089adc58bb30020e317950c823f7017e7 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Wed, 2 Aug 2017 22:07:48 -0600 Subject: [PATCH 1/4] Fixes #3511 - Update changeParameter calls to accept `in` value to identify parameters based on `name` plus `in` value --- src/core/components/param-body.jsx | 4 ++-- src/core/components/parameter-row.jsx | 8 ++++++-- src/core/components/parameters.jsx | 4 ++-- src/core/plugins/oas3/wrap-components/parameters.jsx | 2 +- src/core/plugins/spec/actions.js | 5 ++--- src/core/plugins/spec/reducers.js | 5 +++-- src/core/plugins/spec/selectors.js | 4 ++-- 7 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/core/components/param-body.jsx b/src/core/components/param-body.jsx index e64a65cc..a6fa893e 100644 --- a/src/core/components/param-body.jsx +++ b/src/core/components/param-body.jsx @@ -47,7 +47,7 @@ export default class ParamBody extends PureComponent { updateValues = (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"), param.get("in")) : {} let isXml = /xml/i.test(consumesValue) let isJson = /json/i.test(consumesValue) let paramValue = isXml ? parameter.get("value_xml") : parameter.get("value") @@ -105,7 +105,7 @@ export default class ParamBody extends PureComponent { const HighlightCode = getComponent("highlightCode") const ContentType = getComponent("contentType") // for domains where specSelectors not passed - let parameter = specSelectors ? specSelectors.getParameter(pathMethod, param.get("name")) : param + let parameter = specSelectors ? specSelectors.getParameter(pathMethod, param.get("name"), param.get("in")) : param let errors = parameter.get("errors", List()) let consumesValue = specSelectors.contentTypeValues(pathMethod).get("requestContentType") let consumes = this.props.consumes && this.props.consumes.size ? this.props.consumes : ParamBody.defaultProp.consumes diff --git a/src/core/components/parameter-row.jsx b/src/core/components/parameter-row.jsx index 7db5e4ee..d8cf37b9 100644 --- a/src/core/components/parameter-row.jsx +++ b/src/core/components/parameter-row.jsx @@ -19,13 +19,17 @@ export default class ParameterRow extends Component { let { specSelectors, pathMethod, param } = props let defaultValue = param.get("default") - let parameter = specSelectors.getParameter(pathMethod, param.get("name")) + let parameter = specSelectors.getParameter(pathMethod, param.get("name"), param.get("in")) let value = parameter ? parameter.get("value") : "" if ( defaultValue !== undefined && value === undefined ) { this.onChangeWrapper(defaultValue) } } + shouldComponentUpdate(nextProps) { + return nextProps.param !== this.props.param + } + componentWillReceiveProps(props) { let { specSelectors, pathMethod, param } = props let example = param.get("example") @@ -84,7 +88,7 @@ export default class ParameterRow extends Component { let isFormDataSupported = "FormData" in win let required = param.get("required") let itemType = param.getIn(["items", "type"]) - let parameter = specSelectors.getParameter(pathMethod, param.get("name")) + let parameter = specSelectors.getParameter(pathMethod, param.get("name"), param.get("in")) let value = parameter ? parameter.get("value") : "" return ( diff --git a/src/core/components/parameters.jsx b/src/core/components/parameters.jsx index a6b981e6..c2cae178 100644 --- a/src/core/components/parameters.jsx +++ b/src/core/components/parameters.jsx @@ -37,7 +37,7 @@ export default class Parameters extends Component { onChangeKey, } = this.props - changeParam( onChangeKey, param.get("name"), value, isXml) + changeParam( onChangeKey, param.get("name"), param.get("in"), value, isXml) } onChangeConsumesWrapper = ( val ) => { @@ -94,7 +94,7 @@ export default class Parameters extends Component { { diff --git a/src/core/plugins/spec/actions.js b/src/core/plugins/spec/actions.js index 31671b87..3372ad61 100644 --- a/src/core/plugins/spec/actions.js +++ b/src/core/plugins/spec/actions.js @@ -128,10 +128,10 @@ export const formatIntoYaml = () => ({specActions, specSelectors}) => { } } -export function changeParam( path, paramName, value, isXml ){ +export function changeParam( path, paramName, paramIn, value, isXml ){ return { type: UPDATE_PARAM, - payload:{ path, value, paramName, isXml } + payload:{ path, value, paramName, paramIn, isXml } } } @@ -195,7 +195,6 @@ export const executeRequest = (req) => ({fn, specActions, specSelectors}) => { // if url is relative, parseUrl makes it absolute by inferring from `window.location` req.contextUrl = parseUrl(specSelectors.url()).toString() - if(op && op.operationId) { req.operationId = op.operationId } else if(op && pathName && method) { diff --git a/src/core/plugins/spec/reducers.js b/src/core/plugins/spec/reducers.js index d9670d7b..3ea5a30a 100644 --- a/src/core/plugins/spec/reducers.js +++ b/src/core/plugins/spec/reducers.js @@ -39,9 +39,10 @@ export default { }, [UPDATE_PARAM]: ( state, {payload} ) => { - let { path, paramName, value, isXml } = payload + let { path, paramName, paramIn, value, isXml } = payload + return state.updateIn( [ "resolved", "paths", ...path, "parameters" ], fromJS([]), parameters => { - const index = parameters.findIndex(p => p.get( "name" ) === paramName ) + const index = parameters.findIndex(p => p.get( "name" ) === paramName && p.get("in") === paramIn ) if (!(value instanceof win.File)) { value = fromJSOrdered( value ) } diff --git a/src/core/plugins/spec/selectors.js b/src/core/plugins/spec/selectors.js index fbc12764..728caf56 100644 --- a/src/core/plugins/spec/selectors.js +++ b/src/core/plugins/spec/selectors.js @@ -251,10 +251,10 @@ export const allowTryItOutFor = () => { } // Get the parameter value by parameter name -export function getParameter(state, pathMethod, name) { +export function getParameter(state, pathMethod, name, inType) { let params = spec(state).getIn(["paths", ...pathMethod, "parameters"], fromJS([])) return params.filter( (p) => { - return Map.isMap(p) && p.get("name") === name + return Map.isMap(p) && p.get("name") === name && p.get("in") === inType }).first() } From 51016c33f4a9c6997d65c48e5bc4ff46e99a74f1 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Wed, 2 Aug 2017 22:37:31 -0600 Subject: [PATCH 2/4] Attach `in` value to parameters map so parameters with the same name from different `in` types do not override each other. --- src/core/plugins/spec/selectors.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/plugins/spec/selectors.js b/src/core/plugins/spec/selectors.js index 728caf56..3a2cc39c 100644 --- a/src/core/plugins/spec/selectors.js +++ b/src/core/plugins/spec/selectors.js @@ -271,7 +271,7 @@ export function parameterValues(state, pathMethod, isXml) { let params = spec(state).getIn(["paths", ...pathMethod, "parameters"], fromJS([])) return params.reduce( (hash, p) => { let value = isXml && p.get("in") === "body" ? p.get("value_xml") : p.get("value") - return hash.set(p.get("name"), value) + return hash.set(`${p.get("name")}-${p.get("in")}`, value) }, fromJS({})) } From ce8adb91a574ce20b91722b3c92ad88b3b0d9296 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Thu, 3 Aug 2017 07:14:03 -0600 Subject: [PATCH 3/4] Fix failing selector test --- test/core/plugins/spec/selectors.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/core/plugins/spec/selectors.js b/test/core/plugins/spec/selectors.js index 7519a42e..1816f16e 100644 --- a/test/core/plugins/spec/selectors.js +++ b/test/core/plugins/spec/selectors.js @@ -29,8 +29,8 @@ describe("spec plugin - selectors", function(){ "/one": { get: { parameters: [ - { name: "one", value: 1}, - { name: "two", value: "duos"} + { name: "one", in: "query", value: 1}, + { name: "two", in: "query", value: "duos"} ] } } @@ -43,8 +43,8 @@ describe("spec plugin - selectors", function(){ // Then expect(paramValues.toJS()).toEqual({ - one: 1, - two: "duos" + "one-query": 1, + "two-query": "duos" }) }) From 7a694e287a8e0f31b985090f488078e66ecc42a1 Mon Sep 17 00:00:00 2001 From: Owen Conti Date: Thu, 3 Aug 2017 19:29:49 -0600 Subject: [PATCH 4/4] Change name format to `in.name` and update tests --- src/core/components/parameters.jsx | 2 +- src/core/plugins/spec/selectors.js | 2 +- test/core/plugins/spec/selectors.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/components/parameters.jsx b/src/core/components/parameters.jsx index c2cae178..eff94f65 100644 --- a/src/core/components/parameters.jsx +++ b/src/core/components/parameters.jsx @@ -94,7 +94,7 @@ export default class Parameters extends Component { { let value = isXml && p.get("in") === "body" ? p.get("value_xml") : p.get("value") - return hash.set(`${p.get("name")}-${p.get("in")}`, value) + return hash.set(`${p.get("in")}.${p.get("name")}`, value) }, fromJS({})) } diff --git a/test/core/plugins/spec/selectors.js b/test/core/plugins/spec/selectors.js index 1816f16e..df6b1c21 100644 --- a/test/core/plugins/spec/selectors.js +++ b/test/core/plugins/spec/selectors.js @@ -43,8 +43,8 @@ describe("spec plugin - selectors", function(){ // Then expect(paramValues.toJS()).toEqual({ - "one-query": 1, - "two-query": "duos" + "query.one": 1, + "query.two": "duos" }) })