mirror of
https://github.com/Redocly/redoc.git
synced 2025-02-07 13:30:33 +03:00
parent
ffcedeeb8e
commit
c724df48f4
|
@ -138,6 +138,7 @@ ReDoc makes use of the following [vendor extensions](http://swagger.io/specifica
|
||||||
* `lazy-rendering` - if set, enables lazy rendering mode in ReDoc. This mode is useful for APIs with big number of operations (e.g. > 50). In this mode ReDoc shows initial screen ASAP and then renders the rest operations asynchronously while showing progress bar on the top. Check out the [demo](\\rebilly.github.io/ReDoc) for the example.
|
* `lazy-rendering` - if set, enables lazy rendering mode in ReDoc. This mode is useful for APIs with big number of operations (e.g. > 50). In this mode ReDoc shows initial screen ASAP and then renders the rest operations asynchronously while showing progress bar on the top. Check out the [demo](\\rebilly.github.io/ReDoc) for the example.
|
||||||
* `hide-hostname` - if set, the protocol and hostname is not shown in the method definition.
|
* `hide-hostname` - if set, the protocol and hostname is not shown in the method definition.
|
||||||
* `expand-responses` - specify which responses to expand by default by response codes. Values should be passed as comma-separated list without spaces e.g. `expand-responses="200,201"`. Special value `"all"` expands all responses by default. Be careful: this option can slow-down documentation rendering time.
|
* `expand-responses` - specify which responses to expand by default by response codes. Values should be passed as comma-separated list without spaces e.g. `expand-responses="200,201"`. Special value `"all"` expands all responses by default. Be careful: this option can slow-down documentation rendering time.
|
||||||
|
* `required-props-first` - show required properties first ordered in the same order as in `required` array.
|
||||||
|
|
||||||
## Advanced usage
|
## Advanced usage
|
||||||
Instead of adding `spec-url` attribute to the `<redoc>` element you can initialize ReDoc via globally exposed `Redoc` object:
|
Instead of adding `spec-url` attribute to the `<redoc>` element you can initialize ReDoc via globally exposed `Redoc` object:
|
||||||
|
|
|
@ -10,7 +10,7 @@ import { Component,
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
|
|
||||||
import { BaseSearchableComponent, SpecManager } from '../base';
|
import { BaseSearchableComponent, SpecManager } from '../base';
|
||||||
import { SchemaNormalizer, SchemaHelper, AppStateService } from '../../services/';
|
import { SchemaNormalizer, SchemaHelper, AppStateService, OptionsService } from '../../services/';
|
||||||
import { JsonPointer, DescendantInfo } from '../../utils/';
|
import { JsonPointer, DescendantInfo } from '../../utils/';
|
||||||
import { Zippy } from '../../shared/components';
|
import { Zippy } from '../../shared/components';
|
||||||
import { JsonSchemaLazy } from './json-schema-lazy';
|
import { JsonSchemaLazy } from './json-schema-lazy';
|
||||||
|
@ -39,11 +39,12 @@ export class JsonSchema extends BaseSearchableComponent implements OnInit {
|
||||||
descendants: DescendantInfo[];
|
descendants: DescendantInfo[];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
specMgr:SpecManager,
|
specMgr: SpecManager,
|
||||||
app: AppStateService,
|
app: AppStateService,
|
||||||
private _renderer: Renderer,
|
private _renderer: Renderer,
|
||||||
private cdr: ChangeDetectorRef,
|
private cdr: ChangeDetectorRef,
|
||||||
private _elementRef: ElementRef) {
|
private _elementRef: ElementRef,
|
||||||
|
private optionsService: OptionsService) {
|
||||||
super(specMgr, app);
|
super(specMgr, app);
|
||||||
this.normalizer = new SchemaNormalizer(specMgr);
|
this.normalizer = new SchemaNormalizer(specMgr);
|
||||||
}
|
}
|
||||||
|
@ -126,7 +127,11 @@ export class JsonSchema extends BaseSearchableComponent implements OnInit {
|
||||||
|
|
||||||
this.properties = this.schema._properties || [];
|
this.properties = this.schema._properties || [];
|
||||||
if (this.isRequestSchema) {
|
if (this.isRequestSchema) {
|
||||||
this.properties = this.properties && this.properties.filter(prop => !prop.readOnly);
|
this.properties = this.properties.filter(prop => !prop.readOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.optionsService.options.requiredPropsFirst) {
|
||||||
|
SchemaHelper.moveRequiredPropsFirst(this.properties, this.schema.required);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._hasSubSchemas = this.properties && this.properties.some(
|
this._hasSubSchemas = this.properties && this.properties.some(
|
||||||
|
|
|
@ -15,7 +15,8 @@ const OPTION_NAMES = new Set([
|
||||||
'suppressWarnings',
|
'suppressWarnings',
|
||||||
'hideHostname',
|
'hideHostname',
|
||||||
'lazyRendering',
|
'lazyRendering',
|
||||||
'expandResponses'
|
'expandResponses',
|
||||||
|
'requiredPropsFirst'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
interface Options {
|
interface Options {
|
||||||
|
@ -27,6 +28,7 @@ interface Options {
|
||||||
lazyRendering?: boolean;
|
lazyRendering?: boolean;
|
||||||
expandResponses?: Set<string> | 'all';
|
expandResponses?: Set<string> | 'all';
|
||||||
$scrollParent?: HTMLElement | Window;
|
$scrollParent?: HTMLElement | Window;
|
||||||
|
requiredPropsFirst?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -91,6 +93,7 @@ export class OptionsService {
|
||||||
if (isString(this._options.suppressWarnings)) this._options.suppressWarnings = true;
|
if (isString(this._options.suppressWarnings)) this._options.suppressWarnings = true;
|
||||||
if (isString(this._options.hideHostname)) this._options.hideHostname = true;
|
if (isString(this._options.hideHostname)) this._options.hideHostname = true;
|
||||||
if (isString(this._options.lazyRendering)) this._options.lazyRendering = true;
|
if (isString(this._options.lazyRendering)) this._options.lazyRendering = true;
|
||||||
|
if (isString(this._options.requiredPropsFirst)) this._options.requiredPropsFirst = true;
|
||||||
if (isString(this._options.expandResponses)) {
|
if (isString(this._options.expandResponses)) {
|
||||||
let str = this._options.expandResponses as string;
|
let str = this._options.expandResponses as string;
|
||||||
if (str === 'all') return;
|
if (str === 'all') return;
|
||||||
|
|
|
@ -86,4 +86,49 @@ describe('Spec Helper', () => {
|
||||||
(() => SchemaHelper.preprocessProperties(schema, '#/', {})).should.not.throw();
|
(() => SchemaHelper.preprocessProperties(schema, '#/', {})).should.not.throw();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('moveRequiredPropsFirst', () => {
|
||||||
|
it('should move required props to the top', () => {
|
||||||
|
let props = [{
|
||||||
|
name: 'prop2',
|
||||||
|
type: 'string'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'prop1',
|
||||||
|
type: 'number',
|
||||||
|
_required: true
|
||||||
|
}];
|
||||||
|
|
||||||
|
let required = ['prop1'];
|
||||||
|
|
||||||
|
SchemaHelper.moveRequiredPropsFirst(props, required);
|
||||||
|
props[0].name.should.be.equal('prop1');
|
||||||
|
props[1].name.should.be.equal('prop2');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should sort required props by the order or required', () => {
|
||||||
|
var props = [{
|
||||||
|
name: 'prop2',
|
||||||
|
type: 'string'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'prop1',
|
||||||
|
type: 'number',
|
||||||
|
_required: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'prop3',
|
||||||
|
type: 'number',
|
||||||
|
_required: true
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
let required = ['prop3', 'prop1'];
|
||||||
|
|
||||||
|
SchemaHelper.moveRequiredPropsFirst(props, required);
|
||||||
|
props[0].name.should.be.equal('prop3');
|
||||||
|
props[1].name.should.be.equal('prop1');
|
||||||
|
props[2].name.should.be.equal('prop2');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -327,4 +327,19 @@ export class SchemaHelper {
|
||||||
|
|
||||||
return tags;
|
return tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static moveRequiredPropsFirst(properties: any[], _required: string[]|null) {
|
||||||
|
let required = _required || [];
|
||||||
|
properties.sort((a, b) => {
|
||||||
|
if ((!a._required && b._required)) {
|
||||||
|
return 1;
|
||||||
|
} else if (a._required && !b._required) {
|
||||||
|
return -1;
|
||||||
|
} else if (a._required && b._required) {
|
||||||
|
return required.indexOf(a.name) > required.indexOf(b.name) ? 1 : -1;
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user