mirror of
https://github.com/Redocly/redoc.git
synced 2025-07-29 17:40:05 +03:00
Merge pull request #3 from sofico-global/feat/add-reference-to-api-on-schema
feat(): Add custom extensions for validations
This commit is contained in:
commit
bbd1464674
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "redoc",
|
"name": "redoc",
|
||||||
"version": "2.0.0-0.3.0",
|
"version": "2.0.0-0.4.0",
|
||||||
"description": "ReDoc",
|
"description": "ReDoc",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
23
src/components/Custom/ExtraOperationInformation.tsx
Normal file
23
src/components/Custom/ExtraOperationInformation.tsx
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
import * as React from 'react';
|
||||||
|
|
||||||
|
import { MenuItemTitle, OperationBadge } from '../SideMenu';
|
||||||
|
import { observer } from 'mobx-react';
|
||||||
|
import { shortenHTTPVerb } from '../../utils';
|
||||||
|
|
||||||
|
export interface ExtraOperationInformationProps {
|
||||||
|
description: string;
|
||||||
|
httpVerb: string;
|
||||||
|
label: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ExtraOperationInformation = observer((props: ExtraOperationInformationProps) => {
|
||||||
|
return (
|
||||||
|
<div style={{ padding: '12.5px 0', margin: '0.5rem 0' }}>
|
||||||
|
<div>{props.description}</div>
|
||||||
|
<div style={{ display: 'flex' }}>
|
||||||
|
<OperationBadge type={props.httpVerb}>{shortenHTTPVerb(props.httpVerb)}</OperationBadge>
|
||||||
|
<MenuItemTitle width="calc(100% - 38px)">{props.label}</MenuItemTitle>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
});
|
|
@ -13,7 +13,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 { ExtraDescription } from '../Custom/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';
|
||||||
|
@ -25,6 +25,7 @@ import { l } from '../../services/Labels';
|
||||||
import { OptionsContext } from '../OptionsProvider';
|
import { OptionsContext } from '../OptionsProvider';
|
||||||
import { Pattern } from './Pattern';
|
import { Pattern } from './Pattern';
|
||||||
import { ArrayItemDetails } from './ArrayItemDetails';
|
import { ArrayItemDetails } from './ArrayItemDetails';
|
||||||
|
import { ExtraOperationInformation } from '../Custom/ExtraOperationInformation';
|
||||||
|
|
||||||
export const FieldDetailsComponent = observer((props: FieldProps) => {
|
export const FieldDetailsComponent = observer((props: FieldProps) => {
|
||||||
const { enumSkipQuotes, hideSchemaTitles } = React.useContext(OptionsContext);
|
const { enumSkipQuotes, hideSchemaTitles } = React.useContext(OptionsContext);
|
||||||
|
@ -39,6 +40,7 @@ export const FieldDetailsComponent = observer((props: FieldProps) => {
|
||||||
in: _in,
|
in: _in,
|
||||||
const: _const,
|
const: _const,
|
||||||
extraDescription,
|
extraDescription,
|
||||||
|
extraApiReferenceForValidation,
|
||||||
} = field;
|
} = field;
|
||||||
const isArrayType = schema.type === 'array';
|
const isArrayType = schema.type === 'array';
|
||||||
|
|
||||||
|
@ -126,6 +128,13 @@ export const FieldDetailsComponent = observer((props: FieldProps) => {
|
||||||
)}
|
)}
|
||||||
{(renderDiscriminatorSwitch && renderDiscriminatorSwitch(props)) || null}
|
{(renderDiscriminatorSwitch && renderDiscriminatorSwitch(props)) || null}
|
||||||
{(_const && <FieldDetail label={l('const') + ':'} value={_const} />) || null}
|
{(_const && <FieldDetail label={l('const') + ':'} value={_const} />) || null}
|
||||||
|
{!!extraApiReferenceForValidation && (
|
||||||
|
<ExtraOperationInformation
|
||||||
|
httpVerb={extraApiReferenceForValidation.httpVerb}
|
||||||
|
label={extraApiReferenceForValidation.label}
|
||||||
|
description={extraApiReferenceForValidation.description}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
|
@ -259,7 +259,6 @@ export class MenuStore {
|
||||||
) {
|
) {
|
||||||
// item here can be a copy from search results so find corresponding item from menu
|
// item here can be a copy from search results so find corresponding item from menu
|
||||||
const menuItem = (item && this.getItemById(item.id)) || item;
|
const menuItem = (item && this.getItemById(item.id)) || item;
|
||||||
console.log('activateAndScroll', menuItem?.id, updateLocation, rewriteHistory);
|
|
||||||
this.activate(menuItem, updateLocation, rewriteHistory);
|
this.activate(menuItem, updateLocation, rewriteHistory);
|
||||||
this.scrollToActive();
|
this.scrollToActive();
|
||||||
if (!menuItem || !menuItem.items.length) {
|
if (!menuItem || !menuItem.items.length) {
|
||||||
|
|
|
@ -61,6 +61,11 @@ export class FieldModel {
|
||||||
|
|
||||||
serializationMime?: string;
|
serializationMime?: string;
|
||||||
extraDescription: Record<string, boolean>;
|
extraDescription: Record<string, boolean>;
|
||||||
|
extraApiReferenceForValidation: {
|
||||||
|
httpVerb: string;
|
||||||
|
label: string;
|
||||||
|
description: string;
|
||||||
|
};
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
parser: OpenAPIParser,
|
parser: OpenAPIParser,
|
||||||
|
@ -105,6 +110,17 @@ export class FieldModel {
|
||||||
this.extraDescription = info[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME];
|
this.extraDescription = info[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
info[MilesConstants.MILES_VALIDATION_MODEL_PROPERTY_NAME] !== undefined &&
|
||||||
|
info[MilesConstants.MILES_VALIDATION_MODEL_PROPERTY_NAME]?.label
|
||||||
|
) {
|
||||||
|
this.extraApiReferenceForValidation = {
|
||||||
|
label: info[MilesConstants.MILES_VALIDATION_MODEL_PROPERTY_NAME]?.label,
|
||||||
|
httpVerb: info[MilesConstants.MILES_VALIDATION_MODEL_PROPERTY_NAME]?.httpVerb,
|
||||||
|
description: info[MilesConstants.MILES_VALIDATION_MODEL_PROPERTY_NAME]?.description,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
if (serializationMime) {
|
if (serializationMime) {
|
||||||
this.serializationMime = serializationMime;
|
this.serializationMime = serializationMime;
|
||||||
} else if (info.style) {
|
} else if (info.style) {
|
||||||
|
|
|
@ -461,6 +461,14 @@ function buildFields(
|
||||||
field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME] != null
|
field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME] != null
|
||||||
? field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME]
|
? field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME]
|
||||||
: {},
|
: {},
|
||||||
|
[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME]:
|
||||||
|
field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME] != null
|
||||||
|
? field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME]
|
||||||
|
: {},
|
||||||
|
[MilesConstants.MILES_VALIDATION_MODEL_PROPERTY_NAME]:
|
||||||
|
field[MilesConstants.MILES_VALIDATION_MODEL_PROPERTY_NAME] != null
|
||||||
|
? field[MilesConstants.MILES_VALIDATION_MODEL_PROPERTY_NAME]
|
||||||
|
: {},
|
||||||
},
|
},
|
||||||
$ref + '/properties/' + fieldName,
|
$ref + '/properties/' + fieldName,
|
||||||
options,
|
options,
|
||||||
|
@ -498,6 +506,14 @@ function buildFields(
|
||||||
field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME] != null
|
field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME] != null
|
||||||
? field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME]
|
? field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME]
|
||||||
: {},
|
: {},
|
||||||
|
[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME]:
|
||||||
|
field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME] != null
|
||||||
|
? field[MilesConstants.MILES_EXTRA_DESCRIPTION_PROPERTY_NAME]
|
||||||
|
: {},
|
||||||
|
[MilesConstants.MILES_VALIDATION_MODEL_PROPERTY_NAME]:
|
||||||
|
field[MilesConstants.MILES_VALIDATION_MODEL_PROPERTY_NAME] != null
|
||||||
|
? field[MilesConstants.MILES_VALIDATION_MODEL_PROPERTY_NAME]
|
||||||
|
: {},
|
||||||
},
|
},
|
||||||
`${$ref}/patternProperties/${fieldName}`,
|
`${$ref}/patternProperties/${fieldName}`,
|
||||||
options,
|
options,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
export const MilesConstants = {
|
export const MilesConstants = {
|
||||||
MILES_EXTRA_DESCRIPTION_PROPERTY_NAME: 'x-miles-extra-description',
|
MILES_EXTRA_DESCRIPTION_PROPERTY_NAME: 'x-miles-extra-description',
|
||||||
|
MILES_VALIDATION_MODEL_PROPERTY_NAME: 'x-miles-validation-model',
|
||||||
MILES_M2M: 'x-miles-m2m',
|
MILES_M2M: 'x-miles-m2m',
|
||||||
HIDE_LOGO_QUERY_PARAM: 'hideLogo',
|
HIDE_LOGO_QUERY_PARAM: 'hideLogo',
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user