fix(oas31): allow override names of top level schemas (#9787)
Refs #9713 Co-authored-by: Oliwia Rogala <oliwia.rogala@smartbear.com>
This commit is contained in:
@@ -13,11 +13,7 @@ const Title = ({ title = "", schema }) => {
|
|||||||
|
|
||||||
if (!renderedTitle) return null
|
if (!renderedTitle) return null
|
||||||
|
|
||||||
return (
|
return <div className="json-schema-2020-12__title">{renderedTitle}</div>
|
||||||
<div className="json-schema-2020-12__title">
|
|
||||||
{title || fn.getTitle(schema)}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Title.propTypes = {
|
Title.propTypes = {
|
||||||
|
|||||||
@@ -10,12 +10,17 @@ export const upperFirst = (value) => {
|
|||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getTitle = (schema) => {
|
/**
|
||||||
|
* Lookup can be `basic` or `extended`. By default the lookup is `extended`.
|
||||||
|
*/
|
||||||
|
export const getTitle = (schema, { lookup = "extended" } = {}) => {
|
||||||
const fn = useFn()
|
const fn = useFn()
|
||||||
|
|
||||||
if (schema?.title) return fn.upperFirst(schema.title)
|
if (schema?.title != null) return fn.upperFirst(String(schema.title))
|
||||||
if (schema?.$anchor) return fn.upperFirst(schema.$anchor)
|
if (lookup === "extended") {
|
||||||
if (schema?.$id) return schema.$id
|
if (schema?.$anchor != null) return fn.upperFirst(String(schema.$anchor))
|
||||||
|
if (schema?.$id != null) return String(schema.$id)
|
||||||
|
}
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ const Models = ({
|
|||||||
layoutActions,
|
layoutActions,
|
||||||
getComponent,
|
getComponent,
|
||||||
getConfigs,
|
getConfigs,
|
||||||
|
fn,
|
||||||
}) => {
|
}) => {
|
||||||
const schemas = specSelectors.selectSchemas()
|
const schemas = specSelectors.selectSchemas()
|
||||||
const hasSchemas = Object.keys(schemas).length > 0
|
const hasSchemas = Object.keys(schemas).length > 0
|
||||||
@@ -23,6 +24,7 @@ const Models = ({
|
|||||||
const JSONSchema202012 = getComponent("JSONSchema202012")
|
const JSONSchema202012 = getComponent("JSONSchema202012")
|
||||||
const ArrowUpIcon = getComponent("ArrowUpIcon")
|
const ArrowUpIcon = getComponent("ArrowUpIcon")
|
||||||
const ArrowDownIcon = getComponent("ArrowDownIcon")
|
const ArrowDownIcon = getComponent("ArrowDownIcon")
|
||||||
|
const { getTitle } = fn.jsonSchema202012.useFn()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Effects.
|
* Effects.
|
||||||
@@ -86,15 +88,19 @@ const Models = ({
|
|||||||
</button>
|
</button>
|
||||||
</h4>
|
</h4>
|
||||||
<Collapse isOpened={isOpen}>
|
<Collapse isOpened={isOpen}>
|
||||||
{Object.entries(schemas).map(([schemaName, schema]) => (
|
{Object.entries(schemas).map(([schemaName, schema]) => {
|
||||||
|
const name = getTitle(schema, { lookup: "basic" }) || schemaName
|
||||||
|
|
||||||
|
return (
|
||||||
<JSONSchema202012
|
<JSONSchema202012
|
||||||
key={schemaName}
|
key={schemaName}
|
||||||
ref={handleJSONSchema202012Ref(schemaName)}
|
ref={handleJSONSchema202012Ref(schemaName)}
|
||||||
schema={schema}
|
schema={schema}
|
||||||
name={schemaName}
|
name={name}
|
||||||
onExpand={handleJSONSchema202012Expand(schemaName)}
|
onExpand={handleJSONSchema202012Expand(schemaName)}
|
||||||
/>
|
/>
|
||||||
))}
|
)
|
||||||
|
})}
|
||||||
</Collapse>
|
</Collapse>
|
||||||
</section>
|
</section>
|
||||||
)
|
)
|
||||||
@@ -117,6 +123,11 @@ Models.propTypes = {
|
|||||||
show: PropTypes.func.isRequired,
|
show: PropTypes.func.isRequired,
|
||||||
readyToScroll: PropTypes.func.isRequired,
|
readyToScroll: PropTypes.func.isRequired,
|
||||||
}).isRequired,
|
}).isRequired,
|
||||||
|
fn: PropTypes.shape({
|
||||||
|
jsonSchema202012: PropTypes.func.shape({
|
||||||
|
useFn: PropTypes.func.isRequired,
|
||||||
|
}).isRequired,
|
||||||
|
}).isRequired,
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Models
|
export default Models
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* @prettier
|
||||||
|
*/
|
||||||
|
|
||||||
|
describe("JSON Schema 2020-12 title keyword", () => {
|
||||||
|
it("should render a correct title for schemas", () => {
|
||||||
|
cy.visit("/?url=/documents/features/json-schema-2020-12-title.yaml")
|
||||||
|
.get(".json-schema-2020-12__title")
|
||||||
|
.eq(0)
|
||||||
|
.contains("My Pet")
|
||||||
|
.should("exist")
|
||||||
|
.get(".json-schema-2020-12__title")
|
||||||
|
.eq(1)
|
||||||
|
.contains("My Pets")
|
||||||
|
.should("exist")
|
||||||
|
.get(".json-schema-2020-12__title")
|
||||||
|
.eq(2)
|
||||||
|
.contains("Error")
|
||||||
|
.should("exist")
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
openapi: 3.1.0
|
||||||
|
info:
|
||||||
|
version: 1.0.0
|
||||||
|
title: Swagger Petstore
|
||||||
|
license:
|
||||||
|
name: MIT
|
||||||
|
url: https://opensource.org/licenses/MIT
|
||||||
|
servers:
|
||||||
|
- url: http://petstore.swagger.io/v1
|
||||||
|
paths:
|
||||||
|
/pets:
|
||||||
|
get:
|
||||||
|
summary: List all pets
|
||||||
|
operationId: listPets
|
||||||
|
tags:
|
||||||
|
- pets
|
||||||
|
parameters:
|
||||||
|
- name: limit
|
||||||
|
in: query
|
||||||
|
description: How many items to return at one time (max 100)
|
||||||
|
required: false
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: A paged array of pets
|
||||||
|
headers:
|
||||||
|
x-next:
|
||||||
|
description: A link to the next page of responses
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Pets'
|
||||||
|
default:
|
||||||
|
description: unexpected error
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Error'
|
||||||
|
post:
|
||||||
|
summary: Create a pet
|
||||||
|
operationId: createPets
|
||||||
|
tags:
|
||||||
|
- pets
|
||||||
|
responses:
|
||||||
|
'201':
|
||||||
|
description: Null response
|
||||||
|
default:
|
||||||
|
description: unexpected error
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Error'
|
||||||
|
/pets/{petId}:
|
||||||
|
get:
|
||||||
|
summary: Info for a specific pet
|
||||||
|
operationId: showPetById
|
||||||
|
tags:
|
||||||
|
- pets
|
||||||
|
parameters:
|
||||||
|
- name: petId
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
description: The id of the pet to retrieve
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Expected response to a valid request
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
default:
|
||||||
|
description: unexpected error
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Error'
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
Pet:
|
||||||
|
title: My Pet
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- id
|
||||||
|
- name
|
||||||
|
properties:
|
||||||
|
id:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
tag:
|
||||||
|
type: string
|
||||||
|
Pets:
|
||||||
|
title: My Pets
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/Pet'
|
||||||
|
Error:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- code
|
||||||
|
- message
|
||||||
|
properties:
|
||||||
|
code:
|
||||||
|
type: integer
|
||||||
|
format: int32
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
Reference in New Issue
Block a user