2016-01-24 20:02:02 +03:00
|
|
|
'use strict';
|
|
|
|
|
2017-01-19 00:48:55 +03:00
|
|
|
import { Component, ElementRef, ViewContainerRef, OnDestroy, OnInit, Input,
|
2016-08-22 12:12:13 +03:00
|
|
|
AfterViewInit, ComponentFactoryResolver, Renderer } from '@angular/core';
|
2016-02-10 14:19:50 +03:00
|
|
|
|
2016-05-06 12:46:41 +03:00
|
|
|
import { JsonSchema } from './json-schema';
|
2016-05-25 18:34:31 +03:00
|
|
|
import { OptionsService } from '../../services/options.service';
|
2016-10-23 20:18:42 +03:00
|
|
|
import { SpecManager } from '../../utils/spec-manager';
|
2016-02-07 17:11:15 +03:00
|
|
|
|
|
|
|
var cache = {};
|
|
|
|
|
2016-01-24 20:02:02 +03:00
|
|
|
@Component({
|
|
|
|
selector: 'json-schema-lazy',
|
2016-08-22 12:12:13 +03:00
|
|
|
entryComponents: [ JsonSchema ],
|
2016-11-23 02:23:32 +03:00
|
|
|
template: '',
|
|
|
|
styles: [':host { display:none }']
|
2016-01-24 20:02:02 +03:00
|
|
|
})
|
2017-01-19 00:48:55 +03:00
|
|
|
export class JsonSchemaLazy implements OnDestroy, OnInit, AfterViewInit {
|
2016-05-25 18:34:31 +03:00
|
|
|
@Input() pointer: string;
|
2017-01-19 00:48:55 +03:00
|
|
|
@Input() absolutePointer: string;
|
2016-05-25 18:34:31 +03:00
|
|
|
@Input() auto: boolean;
|
|
|
|
@Input() isRequestSchema: boolean;
|
2016-06-29 18:02:19 +03:00
|
|
|
@Input() final: boolean = false;
|
|
|
|
@Input() nestOdd: boolean;
|
|
|
|
@Input() childFor: string;
|
|
|
|
@Input() isArray: boolean;
|
2016-07-28 19:59:42 +03:00
|
|
|
disableLazy: boolean = false;
|
2016-05-25 18:34:31 +03:00
|
|
|
loaded: boolean = false;
|
2016-06-29 18:02:19 +03:00
|
|
|
constructor(private specMgr:SpecManager, private location:ViewContainerRef, private elementRef:ElementRef,
|
2016-08-22 12:12:13 +03:00
|
|
|
private resolver:ComponentFactoryResolver, private optionsService:OptionsService, private _renderer: Renderer) {
|
2016-07-28 19:59:42 +03:00
|
|
|
this.disableLazy = this.optionsService.options.disableLazySchemas;
|
2016-01-24 20:02:02 +03:00
|
|
|
}
|
|
|
|
|
2016-02-07 17:11:15 +03:00
|
|
|
normalizePointer() {
|
2016-06-23 17:36:38 +03:00
|
|
|
let schema = this.specMgr.byPointer(this.pointer);
|
2016-02-07 17:11:15 +03:00
|
|
|
return schema && schema.$ref || this.pointer;
|
|
|
|
}
|
|
|
|
|
2016-05-20 19:28:16 +03:00
|
|
|
_loadAfterSelf() {
|
2016-08-22 12:12:13 +03:00
|
|
|
var componentFactory = this.resolver.resolveComponentFactory(JsonSchema);
|
|
|
|
let contextInjector = this.location.parentInjector;
|
|
|
|
let compRef = this.location.createComponent(componentFactory, null, contextInjector, null);
|
2016-10-23 20:18:42 +03:00
|
|
|
this.projectComponentInputs(compRef.instance);
|
2016-08-22 12:12:13 +03:00
|
|
|
this._renderer.setElementAttribute(compRef.location.nativeElement, 'class', this.location.element.nativeElement.className);
|
|
|
|
compRef.changeDetectorRef.detectChanges();
|
2016-07-10 16:05:28 +03:00
|
|
|
this.loaded = true;
|
2016-08-22 12:12:13 +03:00
|
|
|
return compRef;
|
2016-05-20 19:28:16 +03:00
|
|
|
}
|
|
|
|
|
2016-01-24 20:02:02 +03:00
|
|
|
load() {
|
2016-09-01 09:53:42 +03:00
|
|
|
if (this.disableLazy) return;
|
2016-01-24 22:27:15 +03:00
|
|
|
if (this.loaded) return;
|
|
|
|
if (this.pointer) {
|
2016-05-20 19:28:16 +03:00
|
|
|
this._loadAfterSelf();
|
2016-01-24 22:27:15 +03:00
|
|
|
}
|
2016-01-24 20:02:02 +03:00
|
|
|
}
|
2016-02-07 17:11:15 +03:00
|
|
|
|
|
|
|
// cache JsonSchema view
|
|
|
|
loadCached() {
|
2016-05-25 18:34:31 +03:00
|
|
|
this.pointer = this.normalizePointer();
|
2016-02-07 17:11:15 +03:00
|
|
|
if (cache[this.pointer]) {
|
2016-08-22 12:12:13 +03:00
|
|
|
let compRef = cache[this.pointer];
|
2016-10-23 20:18:42 +03:00
|
|
|
let $element = compRef.location.nativeElement;
|
2016-02-07 17:11:15 +03:00
|
|
|
|
2016-10-23 20:18:42 +03:00
|
|
|
// skip caching view with descendant schemas
|
|
|
|
// as it needs attached controller
|
|
|
|
if (!this.disableLazy && (compRef.instance.hasDescendants || compRef.instance._hasSubSchemas)) {
|
|
|
|
this._loadAfterSelf();
|
|
|
|
return;
|
|
|
|
}
|
2016-12-02 13:02:40 +03:00
|
|
|
insertAfter($element.cloneNode(true), this.elementRef.nativeElement);
|
2016-10-23 20:18:42 +03:00
|
|
|
this.loaded = true;
|
2016-02-07 17:11:15 +03:00
|
|
|
} else {
|
2016-05-20 19:28:16 +03:00
|
|
|
cache[this.pointer] = this._loadAfterSelf();
|
2016-02-07 17:11:15 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-23 20:18:42 +03:00
|
|
|
projectComponentInputs(instance:JsonSchema) {
|
2016-06-29 18:02:19 +03:00
|
|
|
Object.assign(instance, this);
|
2016-04-27 22:34:27 +03:00
|
|
|
}
|
|
|
|
|
2017-01-19 00:48:55 +03:00
|
|
|
ngOnInit() {
|
|
|
|
if (!this.absolutePointer) this.absolutePointer = this.pointer;
|
|
|
|
}
|
|
|
|
|
2016-02-07 17:11:15 +03:00
|
|
|
ngAfterViewInit() {
|
2016-07-28 19:59:42 +03:00
|
|
|
if (!this.auto && !this.disableLazy) return;
|
2016-02-07 17:11:15 +03:00
|
|
|
this.loadCached();
|
|
|
|
}
|
2016-02-10 16:48:07 +03:00
|
|
|
|
|
|
|
ngOnDestroy() {
|
|
|
|
// clear cache
|
|
|
|
cache = {};
|
|
|
|
}
|
2016-02-07 17:11:15 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
function insertAfter(newNode, referenceNode) {
|
|
|
|
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
|
2016-01-24 20:02:02 +03:00
|
|
|
}
|