From 11bb4f9b30eb880b2d2368bc7f17046bd26c84a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Gorej?= Date: Thu, 11 May 2023 17:20:23 +0200 Subject: [PATCH] feat(oas31): add support for Schema Object discriminator keyword (#8658) Refs #8513 --- src/core/plugins/oas31/index.js | 2 + .../keywords/Discriminator/Discriminator.jsx | 76 +++++++++++++++++++ .../Discriminator/DiscriminatorMapping.jsx | 36 +++++++++ .../components/keywords/Example.jsx | 2 +- .../components/keywords/Xml.jsx | 6 +- .../wrap-components/keywords/Default.jsx | 8 +- 6 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/Discriminator.jsx create mode 100644 src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/DiscriminatorMapping.jsx diff --git a/src/core/plugins/oas31/index.js b/src/core/plugins/oas31/index.js index 90c10d6a631..2b235c927a6 100644 --- a/src/core/plugins/oas31/index.js +++ b/src/core/plugins/oas31/index.js @@ -52,6 +52,7 @@ import { import { selectLicenseUrl as selectOAS31LicenseUrl } from "./selectors" import JSONSchema202012KeywordExample from "./json-schema-2020-12-extensions/components/keywords/Example" import JSONSchema202012KeywordXml from "./json-schema-2020-12-extensions/components/keywords/Xml" +import JSONSchema202012KeywordDiscriminator from "./json-schema-2020-12-extensions/components/keywords/Discriminator/Discriminator" import JSONSchema202012KeywordDescriptionWrapper from "./json-schema-2020-12-extensions/wrap-components/keywords/Description" import JSONSchema202012KeywordDefaultWrapper from "./json-schema-2020-12-extensions/wrap-components/keywords/Default" import { makeIsExpandable } from "./json-schema-2020-12-extensions/fn" @@ -86,6 +87,7 @@ const OAS31Plugin = ({ getSystem }) => { OAS31Models: Models, JSONSchema202012KeywordExample, JSONSchema202012KeywordXml, + JSONSchema202012KeywordDiscriminator, }, wrapComponents: { InfoContainer: InfoWrapper, diff --git a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/Discriminator.jsx b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/Discriminator.jsx new file mode 100644 index 00000000000..21c13b8587c --- /dev/null +++ b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/Discriminator.jsx @@ -0,0 +1,76 @@ +/** + * @prettier + */ +import React, { useCallback, useState } from "react" +import PropTypes from "prop-types" +import classNames from "classnames" + +import DiscriminatorMapping from "./DiscriminatorMapping" + +const Discriminator = ({ schema, getSystem }) => { + const discriminator = schema?.discriminator || {} + const { fn, getComponent } = getSystem() + const { useIsExpandedDeeply, useComponent } = fn.jsonSchema202012 + const isExpandedDeeply = useIsExpandedDeeply() + const [expanded, setExpanded] = useState(isExpandedDeeply) + const [expandedDeeply, setExpandedDeeply] = useState(false) + const Accordion = useComponent("Accordion") + const ExpandDeepButton = useComponent("ExpandDeepButton") + const JSONSchemaDeepExpansionContext = getComponent( + "JSONSchema202012DeepExpansionContext" + )() + + /** + * Event handlers. + */ + const handleExpansion = useCallback(() => { + setExpanded((prev) => !prev) + }, []) + const handleExpansionDeep = useCallback((e, expandedDeepNew) => { + setExpanded(expandedDeepNew) + setExpandedDeeply(expandedDeepNew) + }, []) + + /** + * Rendering. + */ + if (Object.keys(discriminator).length === 0) { + return null + } + + return ( + +
+ + + Discriminator + + + + {discriminator.propertyName && ( + + {discriminator.propertyName} + + )} +
    + {expanded && ( +
  • + +
  • + )} +
+
+
+ ) +} + +Discriminator.propTypes = { + schema: PropTypes.oneOfType([PropTypes.object, PropTypes.bool]), + getSystem: PropTypes.func.isRequired, +} + +export default Discriminator diff --git a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/DiscriminatorMapping.jsx b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/DiscriminatorMapping.jsx new file mode 100644 index 00000000000..e71105eaf1e --- /dev/null +++ b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Discriminator/DiscriminatorMapping.jsx @@ -0,0 +1,36 @@ +/** + * @prettier + */ +import React from "react" +import PropTypes from "prop-types" + +const DiscriminatorMapping = ({ discriminator }) => { + const mapping = discriminator?.mapping || {} + + if (Object.keys(mapping).length === 0) { + return null + } + + return Object.entries(mapping).map(([key, value]) => ( +
+ + {key} + + + {value} + +
+ )) +} + +DiscriminatorMapping.propTypes = { + discriminator: PropTypes.shape({ + mapping: PropTypes.any, + }), +} + +DiscriminatorMapping.defaultProps = { + mapping: undefined, +} + +export default DiscriminatorMapping diff --git a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Example.jsx b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Example.jsx index 44c1f5a18e3..9cc126f60c0 100644 --- a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Example.jsx +++ b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Example.jsx @@ -12,7 +12,7 @@ const Example = ({ schema, getSystem }) => { return (
- + Example diff --git a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Xml.jsx b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Xml.jsx index 834a1ee56d2..1b15dbbffa4 100644 --- a/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Xml.jsx +++ b/src/core/plugins/oas31/json-schema-2020-12-extensions/components/keywords/Xml.jsx @@ -76,7 +76,8 @@ const Xml = ({ schema, getSystem }) => {
)} - + +
  • {xml.namespace && (
    @@ -87,7 +88,8 @@ const Xml = ({ schema, getSystem }) => {
    )} - +
  • +
  • {xml.prefix && (
    diff --git a/src/core/plugins/oas31/json-schema-2020-12-extensions/wrap-components/keywords/Default.jsx b/src/core/plugins/oas31/json-schema-2020-12-extensions/wrap-components/keywords/Default.jsx index d7f405049b6..92c46ff9050 100644 --- a/src/core/plugins/oas31/json-schema-2020-12-extensions/wrap-components/keywords/Default.jsx +++ b/src/core/plugins/oas31/json-schema-2020-12-extensions/wrap-components/keywords/Default.jsx @@ -7,14 +7,18 @@ import { createOnlyOAS31ComponentWrapper } from "../../../fn" const DefaultWrapper = createOnlyOAS31ComponentWrapper( ({ schema, getSystem, originalComponent: KeywordDefault }) => { const { getComponent } = getSystem() - const KeywordExample = getComponent("JSONSchema202012KeywordExample") + const KeywordDiscriminator = getComponent( + "JSONSchema202012KeywordDiscriminator" + ) const KeywordXml = getComponent("JSONSchema202012KeywordXml") + const KeywordExample = getComponent("JSONSchema202012KeywordExample") return ( <> - + + ) }