From 7782d187b50e7bb747112ab19f34ff56f056bafb Mon Sep 17 00:00:00 2001 From: Sven Depickere Date: Fri, 28 Jan 2022 08:22:32 +0100 Subject: [PATCH] feat(): Add logic to see extra description extension This logic will make sure that every extensions with x-miles-extra-description is shown in the UI --- src/components/Fields/ExtraDescriptions.tsx | 34 +++++++++++++++++++++ src/components/Fields/FieldDetails.tsx | 12 +++++++- src/services/models/Field.ts | 8 +++++ src/services/models/Schema.ts | 12 +++++++- src/types/index.ts | 1 + src/types/miles.constants.ts | 3 ++ src/types/open-api.ts | 1 + 7 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 src/components/Fields/ExtraDescriptions.tsx create mode 100644 src/types/miles.constants.ts diff --git a/src/components/Fields/ExtraDescriptions.tsx b/src/components/Fields/ExtraDescriptions.tsx new file mode 100644 index 00000000..86020387 --- /dev/null +++ b/src/components/Fields/ExtraDescriptions.tsx @@ -0,0 +1,34 @@ +import * as React from 'react'; + +import { ExtensionValue, FieldLabel } from '../../common-elements/fields'; +import styled from '../../styled-components'; + +const Div = styled.div` + padding-top: 2px; + padding-bottom: 2px; + + &:last-child { + padding-top: 2px; + padding-bottom: 4px; + } +`; + +export interface ExtraDescriptionProps { + extraDescriptions: Record; +} + +export class ExtraDescription extends React.PureComponent { + render() { + const desc = this.props.extraDescriptions; + + return ( +
+ {Object.keys(desc).map(key => ( +
+ {key}: {desc[key]} +
+ ))} +
+ ); + } +} diff --git a/src/components/Fields/FieldDetails.tsx b/src/components/Fields/FieldDetails.tsx index c04a5b0f..9b488c8a 100644 --- a/src/components/Fields/FieldDetails.tsx +++ b/src/components/Fields/FieldDetails.tsx @@ -12,6 +12,7 @@ import { ExternalDocumentation } from '../ExternalDocumentation/ExternalDocument import { Markdown } from '../Markdown/Markdown'; import { EnumValues } from './EnumValues'; import { Extensions } from './Extensions'; +import { ExtraDescription } from './ExtraDescriptions'; import { FieldProps } from './Field'; import { Examples } from './Examples'; import { ConstraintsView } from './FieldContstraints'; @@ -28,7 +29,15 @@ function FieldDetailsComponent(props: FieldProps) { const { enumSkipQuotes, hideSchemaTitles } = React.useContext(OptionsContext); const { showExamples, field, renderDiscriminatorSwitch } = props; - const { schema, description, deprecated, extensions, in: _in, const: _const } = field; + const { + schema, + description, + deprecated, + extensions, + in: _in, + const: _const, + extraDescription, + } = field; const isArrayType = schema.type === 'array'; const rawDefault = enumSkipQuotes || _in === 'header'; // having quotes around header field default values is confusing and inappropriate @@ -95,6 +104,7 @@ function FieldDetailsComponent(props: FieldProps) { {!renderDiscriminatorSwitch && ( )}{' '} + {extraDescription && } {renderedExamples}
diff --git a/src/services/models/Field.ts b/src/services/models/Field.ts index 84efa5f0..86aa6019 100644 --- a/src/services/models/Field.ts +++ b/src/services/models/Field.ts @@ -1,6 +1,7 @@ import { action, observable, makeObservable } from 'mobx'; import { + MilesConstants, OpenAPIParameter, OpenAPIParameterLocation, OpenAPIParameterStyle, @@ -58,6 +59,7 @@ export class FieldModel { const?: any; serializationMime?: string; + extraDescription: Record; constructor( parser: OpenAPIParser, @@ -92,6 +94,12 @@ export class FieldModel { ); } + if (info[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME] == undefined) { + this.extraDescription = info.extraDescription; + } else { + this.extraDescription = info[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME]; + } + if (serializationMime) { this.serializationMime = serializationMime; } else if (info.style) { diff --git a/src/services/models/Schema.ts b/src/services/models/Schema.ts index b48f232c..2cd990c0 100644 --- a/src/services/models/Schema.ts +++ b/src/services/models/Schema.ts @@ -1,6 +1,11 @@ import { action, observable, makeObservable } from 'mobx'; -import { OpenAPIExternalDocumentation, OpenAPISchema, Referenced } from '../../types'; +import { + MilesConstants, + OpenAPIExternalDocumentation, + OpenAPISchema, + Referenced, +} from '../../types'; import { OpenAPIParser } from '../OpenAPIParser'; import { RedocNormalizedOptions } from '../RedocNormalizedOptions'; @@ -388,6 +393,10 @@ function buildFields( ...field, default: field.default === undefined && defaults ? defaults[fieldName] : field.default, }, + extraDescription: + field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME] != null + ? field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME] + : {}, }, $ref + '/properties/' + fieldName, options, @@ -414,6 +423,7 @@ function buildFields( required: false, schema: additionalProps === true ? {} : additionalProps, kind: 'additionalProperties', + extraDescription: {}, }, $ref + '/additionalProperties', options, diff --git a/src/types/index.ts b/src/types/index.ts index c02a721c..849f90ed 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,3 +1,4 @@ export * from './open-api'; +export * from './miles.constants'; export type Omit = Pick>; diff --git a/src/types/miles.constants.ts b/src/types/miles.constants.ts new file mode 100644 index 00000000..4b541bc9 --- /dev/null +++ b/src/types/miles.constants.ts @@ -0,0 +1,3 @@ +export const MilesConstants = { + MILES_EXTRA_DESCRIPTION_PROPERTY_NAME: 'x-miles-extra-description', +}; diff --git a/src/types/open-api.ts b/src/types/open-api.ts index 7038aa7a..0b4d4bf4 100644 --- a/src/types/open-api.ts +++ b/src/types/open-api.ts @@ -100,6 +100,7 @@ export interface OpenAPIParameter { content?: { [media: string]: OpenAPIMediaType }; encoding?: Record; const?: any; + extraDescription: Record; } export interface OpenAPIExample {