From 1d56ee70aa449772729b77532bdbcf407f70db52 Mon Sep 17 00:00:00 2001 From: Till Kolter Date: Sat, 22 Aug 2020 14:36:56 +0200 Subject: [PATCH] feat: Add options expandAllFields hideShelfIcon hideHttpVerbs --- demo/playground/hmr-playground.tsx | 10 +++++++++- src/components/Fields/Field.tsx | 14 +++++++++++--- src/components/Schema/ObjectSchema.tsx | 2 ++ src/components/Schema/Schema.tsx | 1 + src/components/SideMenu/MenuItem.tsx | 13 +++++++++++-- src/services/RedocNormalizedOptions.ts | 11 ++++++++++- src/services/models/Field.ts | 9 +++++---- 7 files changed, 49 insertions(+), 11 deletions(-) diff --git a/demo/playground/hmr-playground.tsx b/demo/playground/hmr-playground.tsx index 737c3db6..39ddfa51 100644 --- a/demo/playground/hmr-playground.tsx +++ b/demo/playground/hmr-playground.tsx @@ -26,7 +26,15 @@ const specUrl = (userUrl && userUrl[1]) || (swagger ? 'swagger.yaml' : big ? 'big-openapi.json' : 'openapi.yaml'); let store; -const options: RedocRawOptions = { nativeScrollbars: false, maxDisplayedEnumValues: 3 }; +const options: RedocRawOptions = { + nativeScrollbars: false, + maxDisplayedEnumValues: 3, + expandAllSchemaFields: true, + hideShelfIcon: true, + hideHttpVerbs: true +}; + +console.log('options', options) async function init() { const spec = await loadAndBundleSpec(specUrl); diff --git a/src/components/Fields/Field.tsx b/src/components/Fields/Field.tsx index 53bedc77..25b037cf 100644 --- a/src/components/Fields/Field.tsx +++ b/src/components/Fields/Field.tsx @@ -24,6 +24,7 @@ export interface FieldProps extends SchemaOptions { field: FieldModel; expandByDefault?: boolean; + expandAllFields?: boolean; renderDiscriminatorSwitch?: (opts: FieldProps) => JSX.Element; } @@ -31,7 +32,11 @@ export interface FieldProps extends SchemaOptions { @observer export class Field extends React.Component { toggle = () => { - if (this.props.field.expanded === undefined && this.props.expandByDefault) { + if ( + this.props.field.expanded === undefined && + !this.props.field.expandAll && + this.props.expandByDefault + ) { this.props.field.expanded = false; } else { this.props.field.toggle(); @@ -46,11 +51,13 @@ export class Field extends React.Component { }; render() { - const { className, field, isLast, expandByDefault } = this.props; + const { className, field, isLast, expandByDefault, expandAllFields } = this.props; const { name, deprecated, required, kind } = field; const withSubSchema = !field.schema.isPrimitive && !field.schema.isCircular; - const expanded = field.expanded === undefined ? expandByDefault : field.expanded; + const expandChildren = field.expandAll === undefined ? expandAllFields : field.expandAll; + const expanded = + field.expanded === undefined ? expandChildren || expandByDefault : field.expanded; const paramName = withSubSchema ? ( { { : fields; const expandByDefault = this.context.expandSingleSchemaField && filteredFields.length === 1; + const expandAllFields = this.context.expandAllSchemaFields; return ( @@ -57,6 +58,7 @@ export class ObjectSchema extends React.Component { isLast={isLast} field={field} expandByDefault={expandByDefault} + expandAllFields={expandAllFields} renderDiscriminatorSwitch={ (discriminator && discriminator.fieldName === field.name && diff --git a/src/components/Schema/Schema.tsx b/src/components/Schema/Schema.tsx index 91553ce8..cccc5af0 100644 --- a/src/components/Schema/Schema.tsx +++ b/src/components/Schema/Schema.tsx @@ -13,6 +13,7 @@ import { OneOfSchema } from './OneOfSchema'; import { l } from '../../services/Labels'; export interface SchemaOptions { + expandAllFields?: boolean | string showTitle?: boolean; skipReadOnly?: boolean; skipWriteOnly?: boolean; diff --git a/src/components/SideMenu/MenuItem.tsx b/src/components/SideMenu/MenuItem.tsx index 9a19fa07..4ad91b8b 100644 --- a/src/components/SideMenu/MenuItem.tsx +++ b/src/components/SideMenu/MenuItem.tsx @@ -8,6 +8,7 @@ import { shortenHTTPVerb } from '../../utils/openapi'; import { MenuItems } from './MenuItems'; import { MenuItemLabel, MenuItemLi, MenuItemTitle, OperationBadge } from './styled.elements'; import { l } from '../../services/Labels'; +import { OptionsContext } from '../OptionsProvider'; export interface MenuItemProps { item: IMenuItem; @@ -17,6 +18,8 @@ export interface MenuItemProps { @observer export class MenuItem extends React.Component { + static contextType = OptionsContext; + ref = React.createRef(); activate = (evt: React.MouseEvent) => { @@ -40,6 +43,7 @@ export class MenuItem extends React.Component { render() { const { item, withoutChildren } = this.props; + const hideShelfIcon = this.context.hideShelfIcon; return ( {item.type === 'operation' ? ( @@ -50,7 +54,7 @@ export class MenuItem extends React.Component { {item.name} {this.props.children} - {(item.depth > 0 && item.items.length > 0 && ( + {(!hideShelfIcon && item.depth > 0 && item.items.length > 0 && ( )) || null} @@ -74,6 +78,8 @@ export interface OperationMenuItemContentProps { @observer export class OperationMenuItemContent extends React.Component { + static contextType = OptionsContext; + ref = React.createRef(); componentDidUpdate() { @@ -84,6 +90,7 @@ export class OperationMenuItemContent extends React.Component{l('webhook')} ) : ( - {shortenHTTPVerb(item.httpVerb)} + !hideHttpVerbsMenu && ( + {shortenHTTPVerb(item.httpVerb)} + ) )} {item.name} diff --git a/src/services/RedocNormalizedOptions.ts b/src/services/RedocNormalizedOptions.ts index 574b060e..cd511b9f 100644 --- a/src/services/RedocNormalizedOptions.ts +++ b/src/services/RedocNormalizedOptions.ts @@ -1,10 +1,10 @@ import defaultTheme, { ResolvedThemeInterface, resolveTheme, ThemeInterface } from '../theme'; import { querySelector } from '../utils/dom'; import { isNumeric, mergeObjects } from '../utils/helpers'; - import { LabelsConfigRaw, setRedocLabels } from './Labels'; import { MDXComponentMeta } from './MarkdownRenderer'; + export interface RedocRawOptions { theme?: ThemeInterface; scrollYOffset?: number | string | (() => number); @@ -29,6 +29,9 @@ export interface RedocRawOptions { simpleOneOfTypeLabel?: boolean | string; payloadSampleIdx?: number; expandSingleSchemaField?: boolean | string; + expandAllSchemaFields?: boolean | string; + hideShelfIcon?: boolean | string; + hideHttpVerbs?: boolean | string; unstable_ignoreMimeParameters?: boolean; @@ -184,6 +187,9 @@ export class RedocNormalizedOptions { simpleOneOfTypeLabel: boolean; payloadSampleIdx: number; expandSingleSchemaField: boolean; + expandAllSchemaFields: boolean; + hideShelfIcon: boolean; + hideHttpVerbs: boolean; /* tslint:disable-next-line */ unstable_ignoreMimeParameters: boolean; @@ -240,6 +246,9 @@ export class RedocNormalizedOptions { this.simpleOneOfTypeLabel = argValueToBoolean(raw.simpleOneOfTypeLabel); this.payloadSampleIdx = RedocNormalizedOptions.normalizePayloadSampleIdx(raw.payloadSampleIdx); this.expandSingleSchemaField = argValueToBoolean(raw.expandSingleSchemaField); + this.expandAllSchemaFields = argValueToBoolean(raw.expandAllSchemaFields); + this.hideShelfIcon = argValueToBoolean(raw.hideShelfIcon); + this.hideHttpVerbs = argValueToBoolean(raw.hideHttpVerbs); this.unstable_ignoreMimeParameters = argValueToBoolean(raw.unstable_ignoreMimeParameters); diff --git a/src/services/models/Field.ts b/src/services/models/Field.ts index 1f5eccb3..2f5e19eb 100644 --- a/src/services/models/Field.ts +++ b/src/services/models/Field.ts @@ -1,17 +1,17 @@ import { action, observable } from 'mobx'; - import { OpenAPIParameter, OpenAPIParameterLocation, OpenAPIParameterStyle, - Referenced, + Referenced } from '../../types'; -import { RedocNormalizedOptions } from '../RedocNormalizedOptions'; - import { extractExtensions } from '../../utils/openapi'; import { OpenAPIParser } from '../OpenAPIParser'; +import { RedocNormalizedOptions } from '../RedocNormalizedOptions'; import { SchemaModel } from './Schema'; + + const DEFAULT_SERIALIZATION: Record< OpenAPIParameterLocation, { explode: boolean; style: OpenAPIParameterStyle } @@ -51,6 +51,7 @@ export class FieldModel { kind: string; extensions?: Record; explode: boolean; + expandAll: boolean; style?: OpenAPIParameterStyle; serializationMime?: string;