From 54387702677cf738c4201695344b7335338705a3 Mon Sep 17 00:00:00 2001 From: Roman Hotsiy Date: Mon, 20 Nov 2017 12:44:55 +0200 Subject: [PATCH] Filter readOnly and writeOnly fields from request/response --- demo/openapi.yaml | 1 + demo/playground/hmr-playground.tsx | 2 +- src/components/Parameters/Parameters.tsx | 2 +- src/components/Responses/Response.tsx | 2 +- src/components/Schema/ObjectSchema.tsx | 13 +++++++++- src/components/Schema/Schema.tsx | 2 ++ .../DiscriminatorDropdown.test.tsx.snap | 24 +++++++++++++++++++ src/services/models/Schema.ts | 4 ++++ 8 files changed, 46 insertions(+), 4 deletions(-) diff --git a/demo/openapi.yaml b/demo/openapi.yaml index 84eaa787..39f41989 100644 --- a/demo/openapi.yaml +++ b/demo/openapi.yaml @@ -748,6 +748,7 @@ components: Id: type: integer format: int64 + readOnly: true Order: type: object properties: diff --git a/demo/playground/hmr-playground.tsx b/demo/playground/hmr-playground.tsx index d3336ba1..1839dc63 100644 --- a/demo/playground/hmr-playground.tsx +++ b/demo/playground/hmr-playground.tsx @@ -20,7 +20,7 @@ const renderRoot = (Component: typeof Redoc, props: { store: AppStore }) => const big = window.location.search.indexOf('big') > -1; const swagger = window.location.search.indexOf('swagger') > -1; //compatibility mode ? -const specUrl = swagger ? 'swagger.yaml' : big ? 'big-openapi.json' : 'swagger.yaml'; +const specUrl = swagger ? 'swagger.yaml' : big ? 'big-openapi.json' : 'openapi.yaml'; let store; diff --git a/src/components/Parameters/Parameters.tsx b/src/components/Parameters/Parameters.tsx index 924ea705..305051cb 100644 --- a/src/components/Parameters/Parameters.tsx +++ b/src/components/Parameters/Parameters.tsx @@ -66,7 +66,7 @@ function BodyContent(props: { content: MediaContentModel }): JSX.Element { )} > {({ schema }) => { - return ; + return ; }} ); diff --git a/src/components/Responses/Response.tsx b/src/components/Responses/Response.tsx index b52449c8..ccfbb419 100644 --- a/src/components/Responses/Response.tsx +++ b/src/components/Responses/Response.tsx @@ -46,7 +46,7 @@ export class ResponseView extends React.Component<{ response: ResponseModel }> { )} > {({ schema }) => { - return ; + return ; }} diff --git a/src/components/Schema/ObjectSchema.tsx b/src/components/Schema/ObjectSchema.tsx index 1d0f7a69..8ecbde50 100644 --- a/src/components/Schema/ObjectSchema.tsx +++ b/src/components/Schema/ObjectSchema.tsx @@ -62,11 +62,22 @@ export class ObjectSchema extends React.Component { render() { const { schema: { fields = [] }, showTitle, discriminator } = this.props; + const needFilter = this.props.skipReadOnly || this.props.skipWriteOnly; + + const filteredFields = needFilter + ? fields.filter(item => { + return ( + (this.props.skipReadOnly && !item.schema.readOnly) || + (this.props.skipWriteOnly && !item.schema.writeOnly) + ); + }) + : fields; + return ( {showTitle && {this.props.schema.title}} - {mapWithLast(fields, (field, isLast) => + {mapWithLast(filteredFields, (field, isLast) => this.renderField( field, isLast, diff --git a/src/components/Schema/Schema.tsx b/src/components/Schema/Schema.tsx index 73410a4d..09a12655 100644 --- a/src/components/Schema/Schema.tsx +++ b/src/components/Schema/Schema.tsx @@ -13,6 +13,8 @@ import { ArraySchema } from './ArraySchema'; export interface SchemaProps { schema: SchemaModel; showTitle?: boolean; + skipReadOnly?: boolean; + skipWriteOnly?: boolean; } @observer diff --git a/src/components/Schema/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap b/src/components/Schema/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap index e5b75640..f9531263 100644 --- a/src/components/Schema/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap +++ b/src/components/Schema/__tests__/__snapshots__/DiscriminatorDropdown.test.tsx.snap @@ -59,6 +59,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "default": undefined, "type": "number", }, + "readOnly": false, "schema": Object { "default": undefined, "type": "number", @@ -66,6 +67,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "title": "", "type": "number", "typePrefix": "", + "writeOnly": false, }, }, FieldModel { @@ -95,6 +97,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "default": undefined, "type": "string", }, + "readOnly": false, "schema": Object { "default": undefined, "type": "string", @@ -102,6 +105,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "title": "", "type": "string", "typePrefix": "", + "writeOnly": false, }, }, ], @@ -123,6 +127,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView }, "type": "object", }, + "readOnly": false, "schema": Object { "allOf": undefined, "discriminator": Object { @@ -148,6 +153,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "title": "Dog", "type": "object", "typePrefix": "", + "writeOnly": false, }, SchemaModel { "_$ref": "#/components/schemas/Cat", @@ -187,6 +193,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "default": undefined, "type": "string", }, + "readOnly": false, "schema": Object { "default": undefined, "type": "string", @@ -194,6 +201,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "title": "", "type": "string", "typePrefix": "", + "writeOnly": false, }, }, FieldModel { @@ -223,6 +231,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "default": undefined, "type": "number", }, + "readOnly": false, "schema": Object { "default": undefined, "type": "number", @@ -230,6 +239,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "title": "", "type": "number", "typePrefix": "", + "writeOnly": false, }, }, ], @@ -253,6 +263,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView ], "type": "object", }, + "readOnly": false, "schema": Object { "allOf": undefined, "discriminator": Object { @@ -278,6 +289,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "title": "Cat", "type": "object", "typePrefix": "", + "writeOnly": false, }, ], "pattern": undefined, @@ -295,6 +307,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView ], "type": "object", }, + "readOnly": false, "schema": Object { "discriminator": Object { "propertyName": "type", @@ -312,6 +325,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "title": "Pet", "type": "object", "typePrefix": "", + "writeOnly": false, }, } } @@ -354,6 +368,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "default": undefined, "type": "number", }, + "readOnly": false, "schema": Object { "default": undefined, "type": "number", @@ -361,6 +376,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "title": "", "type": "number", "typePrefix": "", + "writeOnly": false, }, }, FieldModel { @@ -390,6 +406,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "default": undefined, "type": "string", }, + "readOnly": false, "schema": Object { "default": undefined, "type": "string", @@ -397,6 +414,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "title": "", "type": "string", "typePrefix": "", + "writeOnly": false, }, }, ], @@ -418,6 +436,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView }, "type": "object", }, + "readOnly": false, "schema": Object { "allOf": undefined, "discriminator": Object { @@ -443,6 +462,7 @@ exports[`Components SchemaView discriminator should correctly render SchemaView "title": "Dog", "type": "object", "typePrefix": "", + "writeOnly": false, } } /> @@ -480,6 +500,7 @@ exports[`Components SchemaView discriminator should correctly render discriminat "default": undefined, "type": "number", }, + "readOnly": false, "schema": Object { "default": undefined, "type": "number", @@ -487,6 +508,7 @@ exports[`Components SchemaView discriminator should correctly render discriminat "title": "", "type": "number", "typePrefix": "", + "writeOnly": false, }, } } @@ -523,6 +545,7 @@ exports[`Components SchemaView discriminator should correctly render discriminat "default": undefined, "type": "string", }, + "readOnly": false, "schema": Object { "default": undefined, "type": "string", @@ -530,6 +553,7 @@ exports[`Components SchemaView discriminator should correctly render discriminat "title": "", "type": "string", "typePrefix": "", + "writeOnly": false, }, } } diff --git a/src/services/models/Schema.ts b/src/services/models/Schema.ts index d19f96bf..1929460b 100644 --- a/src/services/models/Schema.ts +++ b/src/services/models/Schema.ts @@ -33,6 +33,8 @@ export class SchemaModel { example?: any; enum: any[]; default?: any; + readOnly: boolean; + writeOnly: boolean; constraints: string[]; @@ -101,6 +103,8 @@ export class SchemaModel { this.displayType = this.title === '' ? this.type : `${this.title} (${this.type})`; this.isPrimitive = isPrimitiveType(schema); this.default = schema.default; + this.readOnly = !!schema.readOnly; + this.writeOnly = !!schema.writeOnly; if (this.isCircular) { return;