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
This commit is contained in:
Sven Depickere 2022-01-28 08:22:32 +01:00
parent f43a030283
commit 7782d187b5
7 changed files with 69 additions and 2 deletions

View File

@ -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<string, boolean>;
}
export class ExtraDescription extends React.PureComponent<ExtraDescriptionProps> {
render() {
const desc = this.props.extraDescriptions;
return (
<div>
{Object.keys(desc).map(key => (
<Div key={key}>
<FieldLabel>{key}:</FieldLabel> <ExtensionValue>{desc[key]}</ExtensionValue>
</Div>
))}
</div>
);
}
}

View File

@ -12,6 +12,7 @@ import { ExternalDocumentation } from '../ExternalDocumentation/ExternalDocument
import { Markdown } from '../Markdown/Markdown'; import { Markdown } from '../Markdown/Markdown';
import { EnumValues } from './EnumValues'; import { EnumValues } from './EnumValues';
import { Extensions } from './Extensions'; import { Extensions } from './Extensions';
import { ExtraDescription } from './ExtraDescriptions';
import { FieldProps } from './Field'; import { FieldProps } from './Field';
import { Examples } from './Examples'; import { Examples } from './Examples';
import { ConstraintsView } from './FieldContstraints'; import { ConstraintsView } from './FieldContstraints';
@ -28,7 +29,15 @@ function FieldDetailsComponent(props: FieldProps) {
const { enumSkipQuotes, hideSchemaTitles } = React.useContext(OptionsContext); const { enumSkipQuotes, hideSchemaTitles } = React.useContext(OptionsContext);
const { showExamples, field, renderDiscriminatorSwitch } = props; 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 isArrayType = schema.type === 'array';
const rawDefault = enumSkipQuotes || _in === 'header'; // having quotes around header field default values is confusing and inappropriate 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 && ( {!renderDiscriminatorSwitch && (
<EnumValues isArrayType={isArrayType} values={schema.enum} /> <EnumValues isArrayType={isArrayType} values={schema.enum} />
)}{' '} )}{' '}
{extraDescription && <ExtraDescription extraDescriptions={extraDescription} />}
{renderedExamples} {renderedExamples}
<Extensions extensions={{ ...extensions, ...schema.extensions }} /> <Extensions extensions={{ ...extensions, ...schema.extensions }} />
<div> <div>

View File

@ -1,6 +1,7 @@
import { action, observable, makeObservable } from 'mobx'; import { action, observable, makeObservable } from 'mobx';
import { import {
MilesConstants,
OpenAPIParameter, OpenAPIParameter,
OpenAPIParameterLocation, OpenAPIParameterLocation,
OpenAPIParameterStyle, OpenAPIParameterStyle,
@ -58,6 +59,7 @@ export class FieldModel {
const?: any; const?: any;
serializationMime?: string; serializationMime?: string;
extraDescription: Record<string, boolean>;
constructor( constructor(
parser: OpenAPIParser, 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) { if (serializationMime) {
this.serializationMime = serializationMime; this.serializationMime = serializationMime;
} else if (info.style) { } else if (info.style) {

View File

@ -1,6 +1,11 @@
import { action, observable, makeObservable } from 'mobx'; import { action, observable, makeObservable } from 'mobx';
import { OpenAPIExternalDocumentation, OpenAPISchema, Referenced } from '../../types'; import {
MilesConstants,
OpenAPIExternalDocumentation,
OpenAPISchema,
Referenced,
} from '../../types';
import { OpenAPIParser } from '../OpenAPIParser'; import { OpenAPIParser } from '../OpenAPIParser';
import { RedocNormalizedOptions } from '../RedocNormalizedOptions'; import { RedocNormalizedOptions } from '../RedocNormalizedOptions';
@ -388,6 +393,10 @@ function buildFields(
...field, ...field,
default: field.default === undefined && defaults ? defaults[fieldName] : field.default, 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, $ref + '/properties/' + fieldName,
options, options,
@ -414,6 +423,7 @@ function buildFields(
required: false, required: false,
schema: additionalProps === true ? {} : additionalProps, schema: additionalProps === true ? {} : additionalProps,
kind: 'additionalProperties', kind: 'additionalProperties',
extraDescription: {},
}, },
$ref + '/additionalProperties', $ref + '/additionalProperties',
options, options,

View File

@ -1,3 +1,4 @@
export * from './open-api'; export * from './open-api';
export * from './miles.constants';
export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; export type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

View File

@ -0,0 +1,3 @@
export const MilesConstants = {
MILES_EXTRA_DESCRIPTION_PROPERTY_NAME: 'x-miles-extra-description',
};

View File

@ -100,6 +100,7 @@ export interface OpenAPIParameter {
content?: { [media: string]: OpenAPIMediaType }; content?: { [media: string]: OpenAPIMediaType };
encoding?: Record<string, OpenAPIEncoding>; encoding?: Record<string, OpenAPIEncoding>;
const?: any; const?: any;
extraDescription: Record<string, boolean>;
} }
export interface OpenAPIExample { export interface OpenAPIExample {