diff --git a/src/components/Fields/FieldDetails.tsx b/src/components/Fields/FieldDetails.tsx index b7f5afed..d7b7aa65 100644 --- a/src/components/Fields/FieldDetails.tsx +++ b/src/components/Fields/FieldDetails.tsx @@ -34,6 +34,7 @@ export const FieldDetailsComponent = observer((props: FieldProps) => { schema, description, deprecated, + m2m, extensions, in: _in, const: _const, @@ -105,6 +106,11 @@ export const FieldDetailsComponent = observer((props: FieldProps) => { {l('deprecated')} )} + {m2m && ( +
+ M2M +
+ )} {!renderDiscriminatorSwitch && ( diff --git a/src/components/Operation/Operation.tsx b/src/components/Operation/Operation.tsx index b6904f62..cdcbc916 100644 --- a/src/components/Operation/Operation.tsx +++ b/src/components/Operation/Operation.tsx @@ -28,7 +28,15 @@ export interface OperationProps { } export const Operation = observer(({ operation }: OperationProps): JSX.Element => { - const { name: summary, description, deprecated, externalDocs, isWebhook, httpVerb } = operation; + const { + name: summary, + description, + deprecated, + externalDocs, + isWebhook, + httpVerb, + m2m, + } = operation; const hasDescription = !!(description || externalDocs); const { showWebhookVerb } = React.useContext(OptionsContext); return ( @@ -39,6 +47,7 @@ export const Operation = observer(({ operation }: OperationProps): JSX.Element =

{summary} {deprecated && Deprecated } + {m2m && M2M } {isWebhook && ( {' '} diff --git a/src/components/Schema/OneOfSchema.tsx b/src/components/Schema/OneOfSchema.tsx index 311a3258..cdeb6457 100644 --- a/src/components/Schema/OneOfSchema.tsx +++ b/src/components/Schema/OneOfSchema.tsx @@ -60,6 +60,7 @@ export class OneOfSchema extends React.Component {
{oneOf[schema.activeOneOf].deprecated && Deprecated} + {oneOf[schema.activeOneOf].m2m && M2M}
diff --git a/src/services/models/Field.ts b/src/services/models/Field.ts index c502947f..f2df447b 100644 --- a/src/services/models/Field.ts +++ b/src/services/models/Field.ts @@ -51,6 +51,7 @@ export class FieldModel { example?: string; examples?: Record | any[]; deprecated: boolean; + m2m: boolean; in?: OpenAPIParameterLocation; kind: string; extensions?: Record; @@ -119,6 +120,7 @@ export class FieldModel { } this.deprecated = info.deprecated === undefined ? !!this.schema.deprecated : info.deprecated; + this.m2m = info.m2m === undefined ? !!this.schema.m2m : info.m2m; if (options.showExtensions) { this.extensions = extractExtensions(info, options.showExtensions); diff --git a/src/services/models/Operation.ts b/src/services/models/Operation.ts index e26b4a4c..04da3a64 100644 --- a/src/services/models/Operation.ts +++ b/src/services/models/Operation.ts @@ -25,6 +25,7 @@ import type { OpenAPIParser } from '../OpenAPIParser'; import type { RedocNormalizedOptions } from '../RedocNormalizedOptions'; import type { MediaContentModel } from './MediaContent'; import type { ContentItemModel, ExtendedOpenAPIOperation, IMenuItem } from '../types'; +import { MilesConstants } from '../../types'; export interface XPayloadSample { lang: 'payload'; @@ -72,6 +73,7 @@ export class OperationModel implements IMenuItem { operationHash?: string; httpVerb: string; deprecated: boolean; + m2m: boolean; path: string; servers: OpenAPIServer[]; security: SecurityRequirementModel[]; @@ -96,6 +98,9 @@ export class OperationModel implements IMenuItem { this.externalDocs = operationSpec.externalDocs; this.deprecated = !!operationSpec.deprecated; + this.m2m = !!extractExtensions(operationSpec, [MilesConstants.MILES_M2M])?.[ + MilesConstants.MILES_M2M + ]; this.httpVerb = operationSpec.httpVerb; this.deprecated = !!operationSpec.deprecated; this.operationId = operationSpec.operationId; diff --git a/src/services/models/Schema.ts b/src/services/models/Schema.ts index 5bd42245..1ab9e7f8 100644 --- a/src/services/models/Schema.ts +++ b/src/services/models/Schema.ts @@ -44,6 +44,7 @@ export class SchemaModel { displayFormat?: string; nullable: boolean; deprecated: boolean; + m2m: boolean; pattern?: string; example?: any; examples?: any[]; @@ -126,6 +127,9 @@ export class SchemaModel { this.example = schema.example; this.examples = schema.examples; this.deprecated = !!schema.deprecated; + this.m2m = !!extractExtensions(this.schema, [MilesConstants.MILES_M2M])?.[ + MilesConstants.MILES_M2M + ]; this.pattern = schema.pattern; this.externalDocs = schema.externalDocs; diff --git a/src/theme.ts b/src/theme.ts index b65546fa..36efed13 100644 --- a/src/theme.ts +++ b/src/theme.ts @@ -21,9 +21,15 @@ const defaultTheme: ThemeInterface = { }, secondary: { main: '#D47D17', - light: ({ colors }) => lighten(colors.tonalOffset, colors.primary.main), - dark: ({ colors }) => darken(colors.tonalOffset, colors.primary.main), - contrastText: ({ colors }) => readableColor(colors.primary.main), + light: ({ colors }) => lighten(colors.tonalOffset, colors.secondary.main), + dark: ({ colors }) => darken(colors.tonalOffset, colors.secondary.main), + contrastText: ({ colors }) => readableColor(colors.secondary.main), + }, + m2m: { + main: '#343A40', + light: ({ colors }) => lighten(colors.tonalOffset, colors.m2m.main), + dark: ({ colors }) => darken(colors.tonalOffset, colors.m2m.main), + contrastText: ({ colors }) => readableColor(colors.m2m.main), }, success: { main: '#1d8127', @@ -271,6 +277,7 @@ export interface ResolvedThemeInterface { tonalOffset: number; primary: ColorSetting; secondary: ColorSetting; + m2m: ColorSetting; success: ColorSetting; warning: ColorSetting; error: ColorSetting; diff --git a/src/types/miles.constants.ts b/src/types/miles.constants.ts index 4d73cdc3..720d4bab 100644 --- a/src/types/miles.constants.ts +++ b/src/types/miles.constants.ts @@ -1,4 +1,5 @@ export const MilesConstants = { MILES_EXTRA_DESCRIPTION_PROPERTY_NAME: 'x-miles-extra-description', + MILES_M2M: 'x-miles-m2m', HIDE_LOGO_QUERY_PARAM: 'hideLogo', }; diff --git a/src/types/open-api.ts b/src/types/open-api.ts index 62a1d584..2ef302f7 100644 --- a/src/types/open-api.ts +++ b/src/types/open-api.ts @@ -93,6 +93,7 @@ export interface OpenAPIParameter { description?: string; required?: boolean; deprecated?: boolean; + m2m?: boolean; allowEmptyValue?: boolean; style?: OpenAPIParameterStyle; explode?: boolean;