redoc/lib/components/SchemaSample/schema-sample.ts

152 lines
4.6 KiB
TypeScript
Raw Normal View History

2015-10-21 17:24:04 +03:00
'use strict';
2016-08-28 21:46:10 +03:00
import { Component, ElementRef, Input, ChangeDetectionStrategy, OnInit } from '@angular/core';
2015-10-21 17:24:04 +03:00
2016-05-29 20:26:20 +03:00
import * as OpenAPISampler from 'openapi-sampler';
import JsonPointer from '../../utils/JsonPointer';
2016-08-22 12:12:13 +03:00
import { BaseComponent, SpecManager } from '../base';
2016-06-22 21:17:48 +03:00
import { SchemaNormalizer } from '../../services/schema-normalizer.service';
import { getJsonLike } from '../../utils/helpers';
2016-08-22 12:12:13 +03:00
@Component({
2015-10-21 17:24:04 +03:00
selector: 'schema-sample',
templateUrl: './schema-sample.html',
2016-08-22 12:12:13 +03:00
styleUrls: ['./schema-sample.css'],
changeDetection: ChangeDetectionStrategy.OnPush
2015-10-21 17:24:04 +03:00
})
2016-08-28 21:46:10 +03:00
export class SchemaSample extends BaseComponent implements OnInit {
2016-08-22 12:12:13 +03:00
@Input() pointer:string;
@Input() skipReadOnly:boolean;
element: any;
sample: any;
2016-07-17 18:07:51 +03:00
enableButtons: boolean = false;
2016-06-22 19:13:57 +03:00
2016-06-22 21:17:48 +03:00
private _normalizer:SchemaNormalizer;
2016-06-22 19:13:57 +03:00
constructor(specMgr:SpecManager, elementRef:ElementRef) {
super(specMgr);
this.element = elementRef.nativeElement;
this._normalizer = new SchemaNormalizer(specMgr);
2015-10-21 17:24:04 +03:00
}
init() {
2016-06-22 19:13:57 +03:00
this.bindEvents();
let base:any = {};
let sample;
2015-10-25 14:26:38 +03:00
// got pointer not directly to the schema but e.g. to the response obj
2015-10-25 14:26:38 +03:00
if (this.componentSchema.schema) {
base = this.componentSchema;
this.componentSchema = this.componentSchema.schema;
this.pointer += '/schema';
2015-10-25 14:26:38 +03:00
}
// Support x-examples, allowing requests to specify an example.
let examplePointer:string = JsonPointer.join(JsonPointer.dirName(this.pointer), 'x-examples');
let requestExamples:any = this.specMgr.byPointer(examplePointer);
if (requestExamples) {
base.examples = requestExamples;
}
let jsonLikeSample = base.examples && getJsonLike(base.examples);
if (jsonLikeSample) {
sample = jsonLikeSample;
} else {
let selectedDescendant;
2016-06-22 19:13:57 +03:00
this.componentSchema = this._normalizer.normalize(this.componentSchema, this.pointer);
let discriminator = this.componentSchema.discriminator || this.componentSchema['x-discriminatorBasePointer'];
if (discriminator) {
let descendants = this.specMgr.findDerivedDefinitions(this.componentSchema._pointer || this.pointer, this.componentSchema);
if (descendants.length) {
// TODO: sync up with dropdown
selectedDescendant = descendants[0];
let descSchema = this.specMgr.getDescendant(selectedDescendant, this.componentSchema);
this.componentSchema = this._normalizer.normalize(Object.assign({}, descSchema), selectedDescendant.$ref,
{omitParent: false});
}
}
2016-06-22 19:13:57 +03:00
if (this.fromCache()) {
2016-07-17 19:44:36 +03:00
this.initButtons();
2016-06-22 19:13:57 +03:00
return;
}
2016-05-29 20:26:20 +03:00
try {
sample = OpenAPISampler.sample(this.componentSchema, {
skipReadOnly: this.skipReadOnly
});
2016-05-29 20:26:20 +03:00
} catch(e) {
2016-06-06 19:32:20 +03:00
// no sample available
2016-05-29 20:26:20 +03:00
}
if (selectedDescendant) {
sample[discriminator] = selectedDescendant.name;
}
}
2016-06-22 19:13:57 +03:00
this.cache(sample);
this.sample = sample;
2016-07-17 19:44:36 +03:00
this.initButtons();
}
2016-07-17 18:07:51 +03:00
2016-07-17 19:44:36 +03:00
initButtons() {
if (typeof this.sample === 'object') {
2016-07-17 18:07:51 +03:00
this.enableButtons = true;
}
2016-06-22 19:13:57 +03:00
}
2016-06-22 19:13:57 +03:00
cache(sample) {
if (this.skipReadOnly) {
this.componentSchema['x-redoc-ro-sample'] = sample;
} else {
this.componentSchema['x-redoc-rw-sample'] = sample;
}
}
fromCache() {
if (this.skipReadOnly && this.componentSchema['x-redoc-ro-sample']) {
this.sample = this.componentSchema['x-redoc-ro-sample'];
2016-06-22 19:13:57 +03:00
return true;
} else if (!this.skipReadOnly && this.componentSchema['x-redoc-rw-sample']) {
this.sample = this.componentSchema['x-redoc-rw-sample'];
2016-06-22 19:13:57 +03:00
return true;
}
return false;
}
2016-06-22 19:13:57 +03:00
bindEvents() {
this.element.addEventListener('click', (event) => {
var collapsed, target = event.target;
if (event.target.className === 'collapser') {
collapsed = target.parentNode.getElementsByClassName('collapsible')[0];
if (collapsed.parentNode.classList.contains('collapsed')) {
collapsed.parentNode.classList.remove('collapsed');
} else {
collapsed.parentNode.classList.add('collapsed');
}
}
});
2015-10-21 17:24:04 +03:00
}
2016-07-17 18:07:51 +03:00
expandAll() {
let elements = this.element.getElementsByClassName('collapsible');
for (let i = 0; i < elements.length; i++) {
let collapsed = elements[i];
collapsed.parentNode.classList.remove('collapsed');
}
}
collapseAll() {
let elements = this.element.getElementsByClassName('collapsible');
for (let i = 0; i < elements.length; i++) {
let expanded = elements[i];
if (expanded.parentNode.classList.contains('redoc-json')) continue;
expanded.parentNode.classList.add('collapsed');
}
}
2016-08-28 21:46:10 +03:00
ngOnInit() {
this.preinit();
}
2015-10-21 17:24:04 +03:00
}