* add opt-in Prettier config * remove legacy `examples` implementation * create ExamplesSelect * support `Response.examples` in OpenAPI 3 * create response controls group * prettier reformat * prepare to break up Parameters * reunify Parameters and OAS3 Parameters * Parameter Examples * Example component * handle parameter value stringification correctly * FOR REVIEW: add prop for controlling Select * use regular header for param examples in Try-It-Out * manage active examples member via Redux * Request Body Try-It-Out examples * remove special Response description styling * omit Example value display in Try-It-Out * support disabled text inputs in JsonSchemaForm * Example.omitValue => Example.showValue * ExamplesSelectValueRetainer * styling for disabled inputs * remove console.log * support "Modified Values" in ExamplesSelect * remove Examples component (wasn't used anywhere) * use ParameterRow.getParamKey for active examples member keying * split-rendering of examples in ParameterRow * send disabled prop to JsonSchemaForm * use content type to key request body active examples members * remove debugger * rewire RequestBodyEditor to be a controlled component REVIEW: does this have perf implications? * trigger synthetic onSelect events in ExamplesSelect * prettier updates * remove outdated Examples usage in RequestBody * don't handle examples changes in ESVR * make RequestBodyEditor semi-controlled * don't default to an empty Map for request bodies * add namespaceKey to ESVR for state mgmt * don't key RequestBody activeExampleKeys on media type * tweak ESVR isModifiedValueSelected calculation * add trace class to ExamplesSelect * remove usage of ESVR.currentNamespace * reset to first example if currentExampleKey is invalid * add default values to RequestBody rendering * stringify things in ESVR * avoid null select value (silences React warning) * detect user inputs that match any examples member's value * add trace class for json-schema-array * shallowly convert namespace state, to preserve Immutable stucts in state * stringify RBE values; don't trim JSON in editor * match user input to an example when non-primitives are expressed in state as strings * update Cypress * don't apply sample values in JsonSchema_Object * support disabling all JsonSchemaForm subcomponents * Core tests * style changes to accomodate Examples * fix version-checking error in Response * disable SCU for Responses * don't stringify Select values * ModelExample: default to Model tab if no example is available; provide a default no example message * don't trim JSON ParamBody inputs * read directly from 2.0 Response.schema instead of inferring a value * show current Example information in RequestBody * show label for Examples dropdown by default * rework Response content ordering * style disabled textareas like other read-only blocks * meta: fix sourcemaps * refactor ESVR setNameForNamespace * protect second half of ternary expession * cypress: `select.examples-select` => `.examples-select > select` * clarify ModelExample.componentWillReceiveProps * add gates/defaults to prevent issues in very bare-boned documents * fix test block organization problem * simplify RequestBodyEditor interface * linter fixes * prettier updates * use plugin system for new components * move ME Cypress helpers to other file
139 lines
3.9 KiB
JavaScript
139 lines
3.9 KiB
JavaScript
/**
|
|
* @prettier
|
|
*/
|
|
|
|
import React from "react"
|
|
import Im from "immutable"
|
|
import PropTypes from "prop-types"
|
|
import ImPropTypes from "react-immutable-proptypes"
|
|
|
|
export default class ExamplesSelect extends React.PureComponent {
|
|
static propTypes = {
|
|
examples: ImPropTypes.map.isRequired,
|
|
onSelect: PropTypes.func,
|
|
currentExampleKey: PropTypes.string,
|
|
isModifiedValueAvailable: PropTypes.bool,
|
|
isValueModified: PropTypes.bool,
|
|
showLabels: PropTypes.bool,
|
|
}
|
|
|
|
static defaultProps = {
|
|
examples: Im.Map({}),
|
|
onSelect: (...args) =>
|
|
console.log( // eslint-disable-line no-console
|
|
// FIXME: remove before merging to master...
|
|
`DEBUG: ExamplesSelect was not given an onSelect callback`,
|
|
...args
|
|
),
|
|
currentExampleKey: null,
|
|
showLabels: true,
|
|
}
|
|
|
|
_onSelect = (key, { isSyntheticChange = false } = {}) => {
|
|
if (typeof this.props.onSelect === "function") {
|
|
this.props.onSelect(key, {
|
|
isSyntheticChange,
|
|
})
|
|
}
|
|
}
|
|
|
|
_onDomSelect = e => {
|
|
if (typeof this.props.onSelect === "function") {
|
|
const element = e.target.selectedOptions[0]
|
|
const key = element.getAttribute("value")
|
|
|
|
this._onSelect(key, {
|
|
isSyntheticChange: false,
|
|
})
|
|
}
|
|
}
|
|
|
|
getCurrentExample = () => {
|
|
const { examples, currentExampleKey } = this.props
|
|
|
|
const currentExamplePerProps = examples.get(currentExampleKey)
|
|
|
|
const firstExamplesKey = examples.keySeq().first()
|
|
const firstExample = examples.get(firstExamplesKey)
|
|
|
|
return currentExamplePerProps || firstExample || Map({})
|
|
}
|
|
|
|
componentDidMount() {
|
|
// this is the not-so-great part of ExamplesSelect... here we're
|
|
// artificially kicking off an onSelect event in order to set a default
|
|
// value in state. the consumer has the option to avoid this by checking
|
|
// `isSyntheticEvent`, but we should really be doing this in a selector.
|
|
// TODO: clean this up
|
|
// FIXME: should this only trigger if `currentExamplesKey` is nullish?
|
|
const { onSelect, examples } = this.props
|
|
|
|
if (typeof onSelect === "function") {
|
|
const firstExample = examples.first()
|
|
const firstExampleKey = examples.keyOf(firstExample)
|
|
|
|
this._onSelect(firstExampleKey, {
|
|
isSyntheticChange: true,
|
|
})
|
|
}
|
|
}
|
|
|
|
componentWillReceiveProps(nextProps) {
|
|
const { currentExampleKey, examples } = nextProps
|
|
if (examples !== this.props.examples && !examples.has(currentExampleKey)) {
|
|
// examples have changed from under us, and the currentExampleKey is no longer
|
|
// valid.
|
|
const firstExample = examples.first()
|
|
const firstExampleKey = examples.keyOf(firstExample)
|
|
|
|
this._onSelect(firstExampleKey, {
|
|
isSyntheticChange: true,
|
|
})
|
|
}
|
|
}
|
|
|
|
render() {
|
|
const {
|
|
examples,
|
|
currentExampleKey,
|
|
isValueModified,
|
|
isModifiedValueAvailable,
|
|
showLabels,
|
|
} = this.props
|
|
|
|
return (
|
|
<div className="examples-select">
|
|
{
|
|
showLabels ? (
|
|
<span className="examples-select__section-label">Examples: </span>
|
|
) : null
|
|
}
|
|
<select
|
|
onChange={this._onDomSelect}
|
|
value={
|
|
isModifiedValueAvailable && isValueModified
|
|
? "__MODIFIED__VALUE__"
|
|
: (currentExampleKey || "")
|
|
}
|
|
>
|
|
{isModifiedValueAvailable ? (
|
|
<option value="__MODIFIED__VALUE__">[Modified value]</option>
|
|
) : null}
|
|
{examples
|
|
.map((example, exampleName) => {
|
|
return (
|
|
<option
|
|
key={exampleName} // for React
|
|
value={exampleName} // for matching to select's `value`
|
|
>
|
|
{example.get("summary") || exampleName}
|
|
</option>
|
|
)
|
|
})
|
|
.valueSeq()}
|
|
</select>
|
|
</div>
|
|
)
|
|
}
|
|
}
|