mirror of
				https://github.com/Redocly/redoc.git
				synced 2025-11-04 09:47:31 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			127 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
import {ChangeDetectionStrategy, provide, enableProdMode} from 'angular2/core';
 | 
						|
import {ElementRef} from 'angular2/core';
 | 
						|
import {BrowserDomAdapter, bootstrap} from 'angular2/platform/browser';
 | 
						|
import detectScollParent from 'scrollparent';
 | 
						|
import {RedocComponent, BaseComponent} from '../base';
 | 
						|
import SchemaManager from '../../utils/SchemaManager';
 | 
						|
 | 
						|
import ApiInfo from '../ApiInfo/api-info';
 | 
						|
import ApiLogo from '../ApiLogo/api-logo';
 | 
						|
import MethodsList from '../MethodsList/methods-list';
 | 
						|
import SideMenu from '../SideMenu/side-menu';
 | 
						|
import StickySidebar from '../../common/components/StickySidebar/sticky-sidebar';
 | 
						|
import OptionsManager from '../../options';
 | 
						|
import {redocEvents} from '../../events';
 | 
						|
 | 
						|
import './redoc-loading-styles.css!css';
 | 
						|
 | 
						|
var dom = new BrowserDomAdapter();
 | 
						|
var _modeLocked = false;
 | 
						|
 | 
						|
@RedocComponent({
 | 
						|
  selector: 'redoc',
 | 
						|
  providers: [
 | 
						|
    SchemaManager,
 | 
						|
    BrowserDomAdapter
 | 
						|
  ],
 | 
						|
  templateUrl: './lib/components/Redoc/redoc.html',
 | 
						|
  styleUrls: ['./lib/components/Redoc/redoc.css'],
 | 
						|
  directives: [ApiInfo, ApiLogo, MethodsList, SideMenu, StickySidebar],
 | 
						|
  changeDetection: ChangeDetectionStrategy.Default
 | 
						|
})
 | 
						|
@Reflect.metadata('parameters', [
 | 
						|
  [SchemaManager], [OptionsManager], [ElementRef]])
 | 
						|
export default class Redoc extends BaseComponent {
 | 
						|
  constructor(schemaMgr, optionsMgr, elementRef) {
 | 
						|
    super(schemaMgr);
 | 
						|
    this.element = elementRef.nativeElement;
 | 
						|
    //parse options (top level component doesn't support inputs)
 | 
						|
    optionsMgr.parseOptions( this.element );
 | 
						|
    optionsMgr.options.$scrollParent = detectScollParent( this.element );
 | 
						|
    this.options = optionsMgr.options;
 | 
						|
  }
 | 
						|
 | 
						|
  static showLoadingAnimation() {
 | 
						|
    let elem = dom.query('redoc');
 | 
						|
    dom.addClass(elem, 'loading');
 | 
						|
  }
 | 
						|
 | 
						|
  static hideLoadingAnimation() {
 | 
						|
    let redocEl = dom.query('redoc');
 | 
						|
    dom.addClass(redocEl, 'loading-remove');
 | 
						|
    setTimeout(() => {
 | 
						|
      dom.removeClass(redocEl, 'loading-remove');
 | 
						|
      dom.removeClass(redocEl, 'loading');
 | 
						|
    }, 400);
 | 
						|
  }
 | 
						|
 | 
						|
  static init(specUrl, options) {
 | 
						|
    var optionsMgr = new OptionsManager();
 | 
						|
    optionsMgr.options = options;
 | 
						|
    optionsMgr.options.specUrl = optionsMgr.options.specUrl || specUrl;
 | 
						|
    var providers = [
 | 
						|
      provide(OptionsManager, {useValue: optionsMgr})
 | 
						|
    ];
 | 
						|
 | 
						|
    if (Redoc.appRef) {
 | 
						|
      Redoc.destroy();
 | 
						|
    }
 | 
						|
    Redoc.showLoadingAnimation();
 | 
						|
    return SchemaManager.instance().load(specUrl)
 | 
						|
    .then(() => {
 | 
						|
      if (!_modeLocked && !optionsMgr.options.debugMode) {
 | 
						|
        enableProdMode();
 | 
						|
        _modeLocked = true;
 | 
						|
      }
 | 
						|
      return bootstrap(Redoc, providers);
 | 
						|
    })
 | 
						|
    .then(
 | 
						|
      (appRef) => {
 | 
						|
        Redoc.hideLoadingAnimation();
 | 
						|
        Redoc.appRef = appRef;
 | 
						|
        // setTimeout to allow cached elements to init
 | 
						|
        setTimeout(() => redocEvents.bootstrapped.next());
 | 
						|
        console.log('ReDoc bootstrapped!');
 | 
						|
      },
 | 
						|
      error => {
 | 
						|
        console.log(error);
 | 
						|
        throw error;
 | 
						|
      }
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  static autoInit() {
 | 
						|
    const specUrlAttributeName = 'spec-url';
 | 
						|
    let redocEl = dom.query('redoc');
 | 
						|
    if (!redocEl) return;
 | 
						|
    if (dom.hasAttribute(redocEl, specUrlAttributeName)) {
 | 
						|
      let url = dom.getAttribute(redocEl, specUrlAttributeName);
 | 
						|
      Redoc.init(url);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  static destroy() {
 | 
						|
    let el = dom.query('redoc');
 | 
						|
    let elClone;
 | 
						|
    let parent;
 | 
						|
    let nextSibling;
 | 
						|
    if (el) {
 | 
						|
      parent = el.parentElement;
 | 
						|
      nextSibling = el.nextElementSibling;
 | 
						|
    }
 | 
						|
 | 
						|
    elClone = el.cloneNode(false);
 | 
						|
 | 
						|
    if (Redoc.appRef) {
 | 
						|
      Redoc.appRef.destroy();
 | 
						|
      Redoc.appRef = null;
 | 
						|
 | 
						|
      // Redoc destroy removes host element, so need to restore it
 | 
						|
      elClone.innerHTML = 'Loading...';
 | 
						|
      parent && parent.insertBefore(elClone, nextSibling);
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |