Skip to content

Commit ecf33d2

Browse files
committed
feat: reqired-first sort order for params
1 parent 8bd71de commit ecf33d2

File tree

4 files changed

+38
-18
lines changed

4 files changed

+38
-18
lines changed

src/components/SideMenu/MenuItem.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,20 @@ export class MenuItem extends React.Component<MenuItemProps> {
4747

4848
export interface OperationMenuItemContentProps {
4949
item: OperationModel;
50+
className?: string;
5051
}
5152

5253
@observer
5354
class OperationMenuItemContent extends React.Component<OperationMenuItemContentProps> {
5455
render() {
55-
const { item } = this.props;
56+
const { item, className } = this.props;
5657
return (
57-
<MenuItemLabel depth={item.depth} active={item.active} deprecated={item.deprecated}>
58+
<MenuItemLabel
59+
className={className}
60+
depth={item.depth}
61+
active={item.active}
62+
deprecated={item.deprecated}
63+
>
5864
<OperationBadge type={item.httpVerb} />
5965
<MenuItemTitle width="calc(100% - 32px)">{item.name}</MenuItemTitle>
6066
</MenuItemLabel>

src/services/models/Operation.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ import { SecurityRequirementModel } from './SecurityRequirement';
88

99
import { OpenAPIExternalDocumentation, OpenAPIServer } from '../../types';
1010

11-
import { getOperationSummary, isAbsolutePath, JsonPointer, stripTrailingSlash } from '../../utils';
11+
import {
12+
getOperationSummary,
13+
isAbsolutePath,
14+
JsonPointer,
15+
stripTrailingSlash,
16+
sortByRequired,
17+
} from '../../utils';
1218
import { ContentItemModel, ExtendedOpenAPIOperation } from '../MenuBuilder';
1319
import { OpenAPIParser } from '../OpenAPIParser';
1420
import { RedocNormalizedOptions } from '../RedocNormalizedOptions';
@@ -77,6 +83,10 @@ export class OperationModel implements IMenuItem {
7783
.concat(operationSpec.parameters || [])
7884
.map(paramOrRef => new FieldModel(parser, paramOrRef, this._$ref, options));
7985

86+
if (options.requiredPropsFirst) {
87+
sortByRequired(this.parameters);
88+
}
89+
8090
let hasSuccessResponses = false;
8191
this.responses = Object.keys(operationSpec.responses || [])
8292
.filter(code => {

src/services/models/Schema.ts

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
isNamedDefinition,
1414
isPrimitiveType,
1515
JsonPointer,
16+
sortByRequired,
1617
} from '../../utils/';
1718

1819
// TODO: refactor this model, maybe use getters instead of copying all the values
@@ -226,7 +227,7 @@ function buildFields(
226227
});
227228

228229
if (options.requiredPropsFirst) {
229-
sortFields(fields, schema.required);
230+
sortByRequired(fields, schema.required);
230231
}
231232

232233
if (typeof additionalProps === 'object') {
@@ -246,17 +247,3 @@ function buildFields(
246247

247248
return fields;
248249
}
249-
250-
function sortFields(fields: FieldModel[], order: string[] = []) {
251-
fields.sort((a, b) => {
252-
if (!a.required && b.required) {
253-
return 1;
254-
} else if (a.required && !b.required) {
255-
return -1;
256-
} else if (a.required && b.required) {
257-
return order.indexOf(a.name) > order.indexOf(b.name) ? 1 : -1;
258-
} else {
259-
return 0;
260-
}
261-
});
262-
}

src/utils/openapi.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,21 @@ export function humanizeConstraints(schema: OpenAPISchema): string[] {
161161
return res;
162162
}
163163

164+
export function sortByRequired(
165+
fields: { required: boolean; name: string }[],
166+
order: string[] = [],
167+
) {
168+
fields.sort((a, b) => {
169+
if (!a.required && b.required) {
170+
return 1;
171+
} else if (a.required && !b.required) {
172+
return -1;
173+
} else if (a.required && b.required) {
174+
return order.indexOf(a.name) > order.indexOf(b.name) ? 1 : -1;
175+
} else {
176+
return 0;
177+
}
178+
});
179+
}
180+
164181
export const SECURITY_SCHEMES_SECTION = 'section/Authentication/';

0 commit comments

Comments
 (0)