angular-tradingview-widget
Version:
Angular component for rendering the TradingView Advanced Real-Time Chart Widget
142 lines • 15.5 kB
JavaScript
import { Component, Input } from '@angular/core';
import { BarStyles, CONTAINER_ID, IntervalTypes, SCRIPT_ID, Themes } from './tradingview-widget.model';
import * as i0 from "@angular/core";
export class TradingviewWidgetComponent {
constructor() {
this._defaultConfig = {
symbol: 'NASDAQ:AAPL',
allow_symbol_change: true,
autosize: false,
enable_publishing: false,
height: 610,
hideideas: true,
hide_legend: false,
hide_side_toolbar: true,
hide_top_toolbar: false,
interval: IntervalTypes.D,
locale: 'en',
save_image: true,
show_popup_button: false,
style: BarStyles.CANDLES,
theme: Themes.LIGHT,
timezone: 'Etc/UTC',
toolbar_bg: '#F1F3F6',
widgetType: 'widget',
width: 980,
withdateranges: false
};
this.style = {};
this.containerId = CONTAINER_ID;
}
set widgetConfig(value) {
this._widgetConfig = value;
this.cleanWidget();
this.initWidget();
}
get widgetConfig() {
return this._widgetConfig || this._defaultConfig;
}
ngOnInit() {
this.appendScript(this.initWidget.bind(this));
}
initWidget() {
/* global TradingView */
if (typeof TradingView === 'undefined' || !this.getContainer())
return;
const { widgetType, ...widgetConfig } = this.widgetConfig;
const config = { ...widgetConfig, container_id: this.containerId };
if (config.autosize) {
delete config.width;
delete config.height;
}
if (config.popup_width && typeof config.popup_width === 'number') {
config.popup_width = config.popup_width.toString();
}
if (config.popup_height && typeof config.popup_height === 'number') {
config.popup_height = config.popup_height.toString();
}
if (config.autosize) {
this.style = {
width: '100%',
height: '100%'
};
}
/* global TradingView */
if (!!widgetType)
new TradingView[widgetType](config);
else
console.error(`Can not create "TradingView", because "widgetType" is missing`);
}
;
appendScript(onload) {
if (!this.canUseDOM()) {
onload();
return;
}
if (this.scriptExists()) {
/* global TradingView */
if (typeof TradingView === 'undefined') {
this.updateOnloadListener(onload);
return;
}
onload();
return;
}
const script = document.createElement('script');
script.id = SCRIPT_ID;
script.type = 'text/javascript';
script.async = true;
script.src = 'https://s3.tradingview.com/tv.js';
script.onload = onload;
document.getElementsByTagName('head')[0].appendChild(script);
}
;
canUseDOM() {
return typeof window !== 'undefined' &&
window.document &&
window.document.createElement;
}
scriptExists() {
return this.getScriptElement() !== null;
}
updateOnloadListener(onload) {
const script = this.getScriptElement() || {};
const oldOnload = script.onload.bind(this);
return script.onload = () => {
oldOnload();
onload();
};
}
;
getScriptElement() {
return document.getElementById(SCRIPT_ID);
}
cleanWidget() {
if (!this.canUseDOM())
return;
const container = this.getContainer();
if (container) {
container.innerHTML = '';
}
}
;
getContainer() {
return document.getElementById(this.containerId);
}
}
TradingviewWidgetComponent.ɵfac = function TradingviewWidgetComponent_Factory(t) { return new (t || TradingviewWidgetComponent)(); };
TradingviewWidgetComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TradingviewWidgetComponent, selectors: [["tradingview-widget"]], inputs: { widgetConfig: "widgetConfig" }, decls: 1, vars: 1, consts: [[3, "id"]], template: function TradingviewWidgetComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "section", 0);
} if (rf & 2) {
i0.ɵɵproperty("id", ctx.containerId);
} }, encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TradingviewWidgetComponent, [{
type: Component,
args: [{ selector: 'tradingview-widget', template: `
<section [id]="containerId"> </section>
` }]
}], function () { return []; }, { widgetConfig: [{
type: Input,
args: ['widgetConfig']
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhZGluZ3ZpZXctd2lkZ2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdHJhZGluZ3ZpZXctd2lkZ2V0L3NyYy9saWIvdHJhZGluZ3ZpZXctd2lkZ2V0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQXNCLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFXM0gsTUFBTSxPQUFPLDBCQUEwQjtJQXVDckM7UUFwQ1EsbUJBQWMsR0FBdUI7WUFDM0MsTUFBTSxFQUFFLGFBQWE7WUFDckIsbUJBQW1CLEVBQUUsSUFBSTtZQUN6QixRQUFRLEVBQUUsS0FBSztZQUNmLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsTUFBTSxFQUFFLEdBQUc7WUFDWCxTQUFTLEVBQUUsSUFBSTtZQUNmLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsZ0JBQWdCLEVBQUUsS0FBSztZQUN2QixRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDekIsTUFBTSxFQUFFLElBQUk7WUFDWixVQUFVLEVBQUUsSUFBSTtZQUNoQixpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLEtBQUssRUFBRSxTQUFTLENBQUMsT0FBTztZQUN4QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7WUFDbkIsUUFBUSxFQUFFLFNBQVM7WUFDbkIsVUFBVSxFQUFFLFNBQVM7WUFDckIsVUFBVSxFQUFFLFFBQVE7WUFDcEIsS0FBSyxFQUFFLEdBQUc7WUFDVixjQUFjLEVBQUUsS0FBSztTQUN0QixDQUFDO1FBRUYsVUFBSyxHQUFPLEVBQUUsQ0FBQztRQUNmLGdCQUFXLEdBQUcsWUFBWSxDQUFDO0lBWVgs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QUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCYXJTdHlsZXMsIENPTlRBSU5FUl9JRCwgSW50ZXJ2YWxUeXBlcywgSVRyYWRpbmdWaWV3V2lkZ2V0LCBTQ1JJUFRfSUQsIFRoZW1lcyB9IGZyb20gJy4vdHJhZGluZ3ZpZXctd2lkZ2V0Lm1vZGVsJztcclxuXHJcbmRlY2xhcmUgY29uc3QgVHJhZGluZ1ZpZXc6IGFueTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHJhZGluZ3ZpZXctd2lkZ2V0JyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPHNlY3Rpb24gW2lkXT1cImNvbnRhaW5lcklkXCI+IDwvc2VjdGlvbj5cclxuICBgLFxyXG4gIHN0eWxlczogW11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRyYWRpbmd2aWV3V2lkZ2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgcHJpdmF0ZSBfd2lkZ2V0Q29uZmlnITogSVRyYWRpbmdWaWV3V2lkZ2V0O1xyXG4gIHByaXZhdGUgX2RlZmF1bHRDb25maWc6IElUcmFkaW5nVmlld1dpZGdldCA9IHtcclxuICAgIHN5bWJvbDogJ05BU0RBUTpBQVBMJyxcclxuICAgIGFsbG93X3N5bWJvbF9jaGFuZ2U6IHRydWUsXHJcbiAgICBhdXRvc2l6ZTogZmFsc2UsXHJcbiAgICBlbmFibGVfcHVibGlzaGluZzogZmFsc2UsXHJcbiAgICBoZWlnaHQ6IDYxMCxcclxuICAgIGhpZGVpZGVhczogdHJ1ZSxcclxuICAgIGhpZGVfbGVnZW5kOiBmYWxzZSxcclxuICAgIGhpZGVfc2lkZV90b29sYmFyOiB0cnVlLFxyXG4gICAgaGlkZV90b3BfdG9vbGJhcjogZmFsc2UsXHJcbiAgICBpbnRlcnZhbDogSW50ZXJ2YWxUeXBlcy5ELFxyXG4gICAgbG9jYWxlOiAnZW4nLFxyXG4gICAgc2F2ZV9pbWFnZTogdHJ1ZSxcclxuICAgIHNob3dfcG9wdXBfYnV0dG9uOiBmYWxzZSxcclxuICAgIHN0eWxlOiBCYXJTdHlsZXMuQ0FORExFUyxcclxuICAgIHRoZW1lOiBUaGVtZXMuTElHSFQsXHJcbiAgICB0aW1lem9uZTogJ0V0Yy9VVEMnLFxyXG4gICAgdG9vbGJhcl9iZzogJyNGMUYzRjYnLFxyXG4gICAgd2lkZ2V0VHlwZTogJ3dpZGdldCcsXHJcbiAgICB3aWR0aDogOTgwLFxyXG4gICAgd2l0aGRhdGVyYW5nZXM6IGZhbHNlXHJcbiAgfTtcclxuXHJcbiAgc3R5bGU6IHt9ID0ge307XHJcbiAgY29udGFpbmVySWQgPSBDT05UQUlORVJfSUQ7XHJcblxyXG4gIEBJbnB1dCgnd2lkZ2V0Q29uZmlnJykgc2V0IHdpZGdldENvbmZpZyAodmFsdWU6IElUcmFkaW5nVmlld1dpZGdldCkge1xyXG4gICAgICB0aGlzLl93aWRnZXRDb25maWcgPSB2YWx1ZTtcclxuICAgICAgdGhpcy5jbGVhbldpZGdldCgpO1xyXG4gICAgICB0aGlzLmluaXRXaWRnZXQoKTtcclxuICAgfVxyXG5cclxuICAgZ2V0IHdpZGdldENvbmZpZyAoKTogSVRyYWRpbmdWaWV3V2lkZ2V0IHtcclxuICAgIHJldHVybiB0aGlzLl93aWRnZXRDb25maWcgfHwgdGhpcy5fZGVmYXVsdENvbmZpZztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hcHBlbmRTY3JpcHQodGhpcy5pbml0V2lkZ2V0LmJpbmQodGhpcykpO1xyXG4gIH1cclxuXHJcbiAgaW5pdFdpZGdldCAoKSB7XHJcbiAgICAvKiBnbG9iYWwgVHJhZGluZ1ZpZXcgKi9cclxuICAgIGlmICh0eXBlb2YgVHJhZGluZ1ZpZXcgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmdldENvbnRhaW5lcigpKSByZXR1cm47XHJcbiAgICBcclxuICAgIGNvbnN0IHsgd2lkZ2V0VHlwZSwgLi4ud2lkZ2V0Q29uZmlnIH0gPSB0aGlzLndpZGdldENvbmZpZztcclxuICAgIGNvbnN0IGNvbmZpZyA9IHsgLi4ud2lkZ2V0Q29uZmlnLCBjb250YWluZXJfaWQ6IHRoaXMuY29udGFpbmVySWQgfTtcclxuXHJcbiAgICBpZiAoY29uZmlnLmF1dG9zaXplKSB7XHJcbiAgICAgIGRlbGV0ZSBjb25maWcud2lkdGg7XHJcbiAgICAgIGRlbGV0ZSBjb25maWcuaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpZiAoY29uZmlnLnBvcHVwX3dpZHRoICYmIHR5cGVvZiBjb25maWcucG9wdXBfd2lkdGggPT09ICdudW1iZXInKSB7XHJcbiAgICAgIGNvbmZpZy5wb3B1cF93aWR0aCA9IGNvbmZpZy5wb3B1cF93aWR0aC50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25maWcucG9wdXBfaGVpZ2h0ICYmIHR5cGVvZiBjb25maWcucG9wdXBfaGVpZ2h0ID09PSAnbnVtYmVyJykge1xyXG4gICAgICBjb25maWcucG9wdXBfaGVpZ2h0ID0gY29uZmlnLnBvcHVwX2hlaWdodC50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKGNvbmZpZy5hdXRvc2l6ZSkge1xyXG4gICAgICB0aGlzLnN0eWxlID0ge1xyXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXHJcbiAgICAgICAgaGVpZ2h0OiAnMTAwJSdcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIC8qIGdsb2JhbCBUcmFkaW5nVmlldyAqL1xyXG4gICAgaWYoISF3aWRnZXRUeXBlKVxyXG4gICAgICBuZXcgVHJhZGluZ1ZpZXdbd2lkZ2V0VHlwZV0oY29uZmlnKTtcclxuICAgIGVsc2UgXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoYENhbiBub3QgY3JlYXRlIFwiVHJhZGluZ1ZpZXdcIiwgYmVjYXVzZSBcIndpZGdldFR5cGVcIiBpcyBtaXNzaW5nYClcclxuICB9O1xyXG5cclxuICBhcHBlbmRTY3JpcHQgKG9ubG9hZCA6ICgoKSA9PiBhbnkpKSB7XHJcbiAgICBpZiAoIXRoaXMuY2FuVXNlRE9NKCkpIHtcclxuICAgICAgb25sb2FkKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zY3JpcHRFeGlzdHMoKSkge1xyXG4gICAgICAvKiBnbG9iYWwgVHJhZGluZ1ZpZXcgKi9cclxuICAgICAgaWYgKHR5cGVvZiBUcmFkaW5nVmlldyA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU9ubG9hZExpc3RlbmVyKG9ubG9hZCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIG9ubG9hZCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgIHNjcmlwdC5pZCA9IFNDUklQVF9JRDtcclxuICAgIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XHJcbiAgICBzY3JpcHQuYXN5bmMgPSB0cnVlO1xyXG4gICAgc2NyaXB0LnNyYyA9ICdodHRwczovL3MzLnRyYWRpbmd2aWV3LmNvbS90di5qcyc7XHJcbiAgICBzY3JpcHQub25sb2FkID0gb25sb2FkO1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpO1xyXG4gIH07XHJcbiAgXHJcbiAgY2FuVXNlRE9NICgpIHtcclxuICAgIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxyXG4gICAgd2luZG93LmRvY3VtZW50ICYmXHJcbiAgICB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudFxyXG4gIH1cclxuXHJcbiAgc2NyaXB0RXhpc3RzICgpIHtcclxuICAgIHJldHVybiB0aGlzLmdldFNjcmlwdEVsZW1lbnQoKSAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU9ubG9hZExpc3RlbmVyIChvbmxvYWQ6ICgoKSA9PiBhbnkpKSB7XHJcbiAgICBjb25zdCBzY3JpcHQgPSB0aGlzLmdldFNjcmlwdEVsZW1lbnQoKSB8fCB7fSBhcyBhbnk7XHJcbiAgICBjb25zdCBvbGRPbmxvYWQgPSBzY3JpcHQub25sb2FkLmJpbmQodGhpcyk7XHJcbiAgICByZXR1cm4gc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgb2xkT25sb2FkKCk7XHJcbiAgICAgIG9ubG9hZCgpO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBnZXRTY3JpcHRFbGVtZW50ICgpIHtcclxuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChTQ1JJUFRfSUQpO1xyXG4gIH1cclxuXHJcbiAgY2xlYW5XaWRnZXQgKCkge1xyXG4gICAgaWYgKCF0aGlzLmNhblVzZURPTSgpKSByZXR1cm47XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lcigpO1xyXG4gICAgaWYoY29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBnZXRDb250YWluZXIgKCkge1xyXG4gICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuY29udGFpbmVySWQpO1xyXG4gIH1cclxuXHJcbiAgICBcclxuXHJcbn1cclxuIl19