Displaying in-body param schema

This commit is contained in:
Roman Gotsiy 2015-10-17 21:12:46 +03:00
parent aa04a7c01c
commit 094c42f07a
5 changed files with 55 additions and 14 deletions

View File

@ -10,7 +10,7 @@ h4 {
.param > span {
padding: 5px 10px;
vertical-align: middle;
vertical-align: top;
}
.param-name {
@ -18,7 +18,12 @@ h4 {
}
.param-type {
padding: 2px 10px;
background-color: #EAEAEA;
border: silver 1px solid;
}
.body-schema {
display: inline-block;
vertical-align: top;
padding: 0 10px;
}

View File

@ -1,5 +1,6 @@
<h4> Parameters </h4>
<small class="no-params" *ng-if="data.noParams"> No parameters </small>
<!-- General parameters -->
<div *ng-for="#param of data.params">
<div class="param">
<span class="param-name">{{param.name}}</span>
@ -7,12 +8,14 @@
<span class="param-description">{{param.description}}</span>
</div>
</div>
<!-- in-body parameter -->
<div class="param body-param" *ng-if="data.bodyParam">
<span class="param-name">{{data.bodyParam.name}}</span>
<span class="param-type" *ng-if="data.bodyParam.type"
[ng-class]="data.bodyParam.type">{{data.bodyParam.type}}</span>
<span class="param-description" *ng-if="data.bodyParamdescription" >
{{data.bodyParam.description}}
</span>
<span> <em>Body Schema would be somewhere here (unimplemented yet) </em></span>
<div class="body-schema">
<schema
[title]="data.bodyParam.type"
[description]="data.bodyParam.description"
pointer="{{data.bodyParam.pointer}}/schema">
</schema>
</div>
</div>

View File

@ -2,11 +2,22 @@
import {JsonPointer} from '../../utils/JsonPointer';
import {RedocComponent, BaseComponent} from '../base';
import {JsonSchemaView} from '../JsonSchemaView/json-schema-view';
/* inject JsonPointer into array elements */
function injectPointers(array, root) {
if (!array) return array;
return array.map((element, idx) => {
element.$$pointer = JsonPointer.join(root, idx);
return element;
});
}
@RedocComponent({
selector: 'params-list',
templateUrl: './lib/components/ParamsList/params-list.html',
styleUrls: ['./lib/components/ParamsList/params-list.css']
styleUrls: ['./lib/components/ParamsList/params-list.css'],
directives: [JsonSchemaView]
})
export class ParamsList extends BaseComponent {
constructor(schemaMgr) {
@ -15,17 +26,18 @@ export class ParamsList extends BaseComponent {
prepareModel() {
this.data = {};
let params = this.componentSchema || [];
let params = injectPointers(this.componentSchema, this.pointer) || [];
let pathParams = this.getPathParams() || [];
params = params.concat(pathParams);
params = this.resolveRefs(params);
this.sortParams(params);
// temporary hanlde body param
// temporary handle body param
if (params.length && params[params.length - 1].in === 'body') {
let bodyParam = params.pop();
bodyParam.type = bodyParam.schema.type
|| `Object(${JsonPointer.baseName(bodyParam.schema.$ref)})`;
|| JsonPointer.baseName(bodyParam.schema.$ref);
bodyParam.pointer = bodyParam.$$pointer;
this.data.bodyParam = bodyParam;
}
@ -37,10 +49,10 @@ export class ParamsList extends BaseComponent {
let ptr = JsonPointer.dirName(this.pointer, 2) + '/parameters';
let pathParams = this.schemaMgr.byPointer(ptr);
if (Array.isArray(pathParams)) {
return pathParams;
return injectPointers(pathParams, ptr);
}
if (pathParams && pathParams.$ref) {
return this.schemaMgr.byPointer(pathParams.$ref);
return injectPointers(this.schemaMgr.byPointer(pathParams.$ref), pathParams.$ref);
}
return [];

View File

@ -71,6 +71,7 @@ export class BaseComponent {
onInit() {
this.componentSchema = this.schemaMgr.byPointer(this.pointer || '');
this.prepareModel();
this.init();
}
/**
@ -78,5 +79,11 @@ export class BaseComponent {
* @abstract
*/
prepareModel() {}
/**
* Used to initialize component. Run after prepareModel
* @abstract
*/
init() {}
}
BaseComponent.parameters = [[SchemaManager]];

View File

@ -44,6 +44,20 @@ export class JsonPointer extends JsonPointerLib {
}
return JsonPointerLib._origParse(ptr);
}
/**
* Creates a JSON pointer path, by joining one or more tokens to a base path.
*
* @param {string} base - The base path
* @param {string|string[]} tokens - The token(s) to append (e.g. ["name", "first"])
* @returns {string}
*/
static join(base, tokens) {
// TODO: optimize
let baseTokens = JsonPointer.parse(base);
let resTokens = baseTokens.concat(tokens);
return JsonPointer.compile(resTokens);
}
}
JsonPointerLib._origParse = JsonPointerLib.parse;