redoc/lib/services/options.service.ts

101 lines
2.8 KiB
TypeScript
Raw Normal View History

'use strict';
2016-05-06 12:46:41 +03:00
import { Injectable } from '@angular/core';
import { isFunction, isString } from '../utils/helpers';
2016-08-28 21:46:10 +03:00
import { BrowserDomAdapter as DOM } from '../utils/browser-adapter';
2016-05-06 12:46:41 +03:00
const defaults = {
scrollYOffset: 0,
2016-08-28 21:46:10 +03:00
disableLazySchemas: false
};
2015-12-30 02:29:29 +03:00
2016-11-30 14:23:24 +03:00
const OPTION_NAMES = new Set([
'scrollYOffset',
'disableLazySchemas',
'specUrl',
'suppressWarnings',
'hideHostname',
2016-12-14 15:49:02 +03:00
'lazyRendering',
'expandResponses'
2016-11-30 14:23:24 +03:00
]);
interface Options {
scrollYOffset?: any;
disableLazySchemas?: boolean;
specUrl?: string;
suppressWarnings?: boolean;
hideHostname?: boolean;
lazyRendering?: boolean;
2016-12-14 15:49:02 +03:00
expandResponses?: Set<string> | 'all';
2016-11-30 14:23:24 +03:00
$scrollParent?: HTMLElement | Window;
}
2016-05-06 12:46:41 +03:00
@Injectable()
export class OptionsService {
2016-11-30 14:23:24 +03:00
private _options: Options;
2016-06-13 20:54:24 +03:00
2016-08-28 21:46:10 +03:00
constructor() {
this._options = defaults;
2016-11-24 16:29:29 +03:00
this._normalizeOptions();
}
2016-12-14 15:49:02 +03:00
get options(): Options {
2015-12-30 02:29:29 +03:00
return this._options;
}
2016-11-30 14:23:24 +03:00
set options(opts:Options) {
this._options = Object.assign(this._options, opts);
}
2016-11-30 14:23:24 +03:00
parseOptions(el:HTMLElement):void {
let parsedOpts;
2016-08-28 21:46:10 +03:00
let attributesMap = DOM.attributeMap(el);
parsedOpts = {};
Array.from(attributesMap.keys())
//camelCasify
.map(k => ({
attrName: k,
2016-12-02 12:59:29 +03:00
name: k.replace(/-(.)/g, (_, $1) => $1.toUpperCase())
})
)
.filter(option => OPTION_NAMES.has(option.name))
.forEach(option => {
parsedOpts[option.name] = attributesMap.get(option.attrName);
});
this.options = parsedOpts;
this._normalizeOptions();
}
2016-11-30 14:23:24 +03:00
_normalizeOptions():void {
// modify scrollYOffset to always be a function
if (!isFunction(this._options.scrollYOffset)) {
if (isFinite(this._options.scrollYOffset)) {
// if number specified create function that returns this value
let numberOffset = parseFloat(this._options.scrollYOffset);
this.options.scrollYOffset = () => numberOffset;
} else {
// if selector or node function that returns bottom offset of this node
let el = this._options.scrollYOffset;
if (!(el instanceof Node)) {
2016-08-28 21:46:10 +03:00
el = DOM.query(el);
}
if (!el) {
this._options.scrollYOffset = () => 0;
} else {
this._options.scrollYOffset = () => el.offsetTop + el.offsetHeight;
}
}
}
if (isString(this._options.disableLazySchemas)) this._options.disableLazySchemas = true;
if (isString(this._options.suppressWarnings)) this._options.suppressWarnings = true;
if (isString(this._options.hideHostname)) this._options.hideHostname = true;
2016-11-30 14:23:24 +03:00
if (isString(this._options.lazyRendering)) this._options.lazyRendering = true;
2016-12-14 15:49:02 +03:00
if (isString(this._options.expandResponses)) {
let str = this._options.expandResponses as string;
if (str === 'all') return;
this._options.expandResponses = new Set(str.split(','));
}
}
2015-12-30 02:29:29 +03:00
}