Schemas disclosure label causing client error (#3192)

This commit is contained in:
Nolann B.
2025-04-29 16:16:58 +02:00
committed by GitHub
parent 81b4a4db53
commit 580101d04e
6 changed files with 85 additions and 40 deletions
+6
View File
@@ -0,0 +1,6 @@
---
'@gitbook/react-openapi': patch
'gitbook': patch
---
Fix schemas disclosure label causing client error
@@ -755,11 +755,16 @@ body:has(.openapi-select-popover) {
.openapi-disclosure:not( .openapi-disclosure:not(
.openapi-disclosure-group .openapi-disclosure, .openapi-disclosure-group .openapi-disclosure,
.openapi-schema-alternatives .openapi-disclosure .openapi-schema-alternatives .openapi-disclosure,
.openapi-schemas-disclosure .openapi-schema.openapi-disclosure
) { ) {
@apply rounded-xl; @apply rounded-xl;
} }
.openapi-disclosure .openapi-schemas-disclosure .openapi-schema.openapi-disclosure {
@apply !rounded-none;
}
.openapi-disclosure:has(> .openapi-disclosure-trigger:hover) { .openapi-disclosure:has(> .openapi-disclosure-trigger:hover) {
@apply bg-tint-subtle; @apply bg-tint-subtle;
} }
+6 -22
View File
@@ -13,6 +13,7 @@ import { OpenAPIDisclosure } from './OpenAPIDisclosure';
import { OpenAPISchemaName } from './OpenAPISchemaName'; import { OpenAPISchemaName } from './OpenAPISchemaName';
import type { OpenAPIClientContext } from './context'; import type { OpenAPIClientContext } from './context';
import { retrocycle } from './decycle'; import { retrocycle } from './decycle';
import { getDisclosureLabel } from './getDisclosureLabel';
import { stringifyOpenAPI } from './stringifyOpenAPI'; import { stringifyOpenAPI } from './stringifyOpenAPI';
import { tString } from './translate'; import { tString } from './translate';
import { checkIsReference, resolveDescription, resolveFirstExample } from './utils'; import { checkIsReference, resolveDescription, resolveFirstExample } from './utils';
@@ -606,6 +607,11 @@ function getSchemaTitle(schema: OpenAPIV3.SchemaObject): string {
if (schema.format) { if (schema.format) {
type += ` · ${schema.format}`; type += ` · ${schema.format}`;
} }
// Only add the title if it's an object (no need for the title of a string, number, etc.)
if (type === 'object' && schema.title) {
type += ` · ${schema.title.replaceAll(' ', '')}`;
}
} }
if ('anyOf' in schema) { if ('anyOf' in schema) {
@@ -620,25 +626,3 @@ function getSchemaTitle(schema: OpenAPIV3.SchemaObject): string {
return type; return type;
} }
function getDisclosureLabel(props: {
schema: OpenAPIV3.SchemaObject;
isExpanded: boolean;
context: OpenAPIClientContext;
}) {
const { schema, isExpanded, context } = props;
let label: string;
if (schema.type === 'array' && !!schema.items) {
if (schema.items.oneOf) {
label = tString(context.translation, 'available_items').toLowerCase();
} else if (schema.items.enum || schema.items.type === 'object') {
label = tString(context.translation, 'properties').toLowerCase();
} else {
label = schema.items.title ?? schema.title ?? getSchemaTitle(schema.items);
}
} else {
label = schema.title || tString(context.translation, 'properties').toLowerCase();
}
return tString(context.translation, isExpanded ? 'hide' : 'show', label);
}
@@ -0,0 +1,25 @@
'use client';
import type { OpenAPIV3 } from '@gitbook/openapi-parser';
import type { OpenAPIClientContext } from './context';
import { tString } from './translate';
export function getDisclosureLabel(props: {
schema: OpenAPIV3.SchemaObject;
isExpanded: boolean;
context: OpenAPIClientContext;
}) {
const { schema, isExpanded, context } = props;
let label: string;
if (schema.type === 'array' && !!schema.items) {
if (schema.items.oneOf) {
label = tString(context.translation, 'available_items').toLowerCase();
} else {
label = tString(context.translation, 'properties').toLowerCase();
}
} else {
label = tString(context.translation, 'properties').toLowerCase();
}
return tString(context.translation, isExpanded ? 'hide' : 'show', label);
}
@@ -0,0 +1,34 @@
'use client';
import { SectionBody } from '../StaticSection';
import type { OpenAPIV3 } from '@gitbook/openapi-parser';
import { OpenAPIDisclosure } from '../OpenAPIDisclosure';
import { OpenAPIRootSchema } from '../OpenAPISchemaServer';
import { Section } from '../StaticSection';
import type { OpenAPIClientContext } from '../context';
import { getDisclosureLabel } from '../getDisclosureLabel';
export function OpenAPISchemaItem(props: {
name: string;
schema: OpenAPIV3.SchemaObject;
context: OpenAPIClientContext;
}) {
const { schema, context, name } = props;
return (
<OpenAPIDisclosure
className="openapi-schemas-disclosure"
key={name}
icon={context.icons.plus}
header={name}
label={(isExpanded) => getDisclosureLabel({ schema, isExpanded, context })}
>
<Section className="openapi-section-schemas">
<SectionBody>
<OpenAPIRootSchema schema={schema} context={context} />
</SectionBody>
</Section>
</OpenAPIDisclosure>
);
}
@@ -1,16 +1,16 @@
import type { OpenAPISchema } from '@gitbook/openapi-parser'; import type { OpenAPISchema } from '@gitbook/openapi-parser';
import clsx from 'clsx'; import clsx from 'clsx';
import { OpenAPIDisclosure } from '../OpenAPIDisclosure';
import { OpenAPIExample } from '../OpenAPIExample'; import { OpenAPIExample } from '../OpenAPIExample';
import { OpenAPIRootSchema } from '../OpenAPISchemaServer'; import { OpenAPIRootSchema } from '../OpenAPISchemaServer';
import { Section, SectionBody, StaticSection } from '../StaticSection'; import { StaticSection } from '../StaticSection';
import { import {
type OpenAPIContextInput, type OpenAPIContextInput,
getOpenAPIClientContext, getOpenAPIClientContext,
resolveOpenAPIContext, resolveOpenAPIContext,
} from '../context'; } from '../context';
import { t, tString } from '../translate'; import { t } from '../translate';
import { getExampleFromSchema } from '../util/example'; import { getExampleFromSchema } from '../util/example';
import { OpenAPISchemaItem } from './OpenAPISchemaItem';
/** /**
* OpenAPI Schemas component. * OpenAPI Schemas component.
@@ -85,21 +85,12 @@ export function OpenAPISchemas(props: {
<div className={clsx('openapi-schemas', className)}> <div className={clsx('openapi-schemas', className)}>
{schemas.map(({ name, schema }) => { {schemas.map(({ name, schema }) => {
return ( return (
<OpenAPIDisclosure <OpenAPISchemaItem
className="openapi-schemas-disclosure"
key={name} key={name}
icon={context.icons.chevronRight} name={name}
header={name} context={clientContext}
label={(isExpanded) => schema={schema}
tString(context.translation, isExpanded ? 'hide' : 'show') />
}
>
<Section className="openapi-section-schemas">
<SectionBody>
<OpenAPIRootSchema schema={schema} context={clientContext} />
</SectionBody>
</Section>
</OpenAPIDisclosure>
); );
})} })}
</div> </div>