{"version":3,"file":"ChartsLib.bundle.js","mappings":"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","sources":["webpack://advfnweb/webpack/runtime/chunk loaded","webpack://advfnweb/./advfn3/content/_common/charts/src/js/api/ApiWrapper.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/api/PriceHistory.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/lib/helpers.js","webpack://advfnweb/./advfn3/content/_common/elements/translator/js/BaseTranslationService.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/lib/TranslationService.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/lib/ChartSettings.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/lib/Locale.js","webpack://advfnweb/./advfn3/content/_common/streaming/src/classes/Formatter.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/api/QuoteInfo.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/charts/BaseChart.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/charts/StockPriceChart.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/triggers/TriggersContainer.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/charts/InteractiveStockPriceChart.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/api/FinancialsData.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/charts/CompanyFinancialsChart.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/charts/MonitoringChart.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/charts/MiniStockPriceChart.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/charts/CommoditiesChart.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/charts/ForexMultiRatesChart.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/charts/StreamingStockPriceChart.js","webpack://advfnweb/./advfn3/content/_common/charts/src/js/ChartsManager.js","webpack://advfnweb/./advfn3/content/_common/charts/src/app.js","webpack://advfnweb/./advfn3/content/_common/charts/src/scss/main.scss?db13","webpack://advfnweb/webpack/bootstrap","webpack://advfnweb/webpack/runtime/compat get default export","webpack://advfnweb/webpack/runtime/define property getters","webpack://advfnweb/webpack/runtime/global","webpack://advfnweb/webpack/runtime/hasOwnProperty shorthand","webpack://advfnweb/webpack/runtime/make namespace object","webpack://advfnweb/webpack/runtime/node module decorator","webpack://advfnweb/webpack/runtime/runtimeId","webpack://advfnweb/webpack/runtime/jsonp chunk loading","webpack://advfnweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import axios from 'axios';\n\nexport const BASE_ENDPOINT = '/common/api/charts';\n\nclass CustomError extends Error\n{\n constructor(message, code)\n {\n super();\n this.message = message;\n this.code = code;\n }\n}\n\n/**\n * @template P, O\n * @param {string} endpoint\n * @param {string} method\n * @param {P} params\n * @returns {Promise|null}\n */\nexport const getData = async (endpoint, method, params) =>\n{\n let response;\n let code = -1;\n let reason = 'unknown';\n\n if (method === 'GET')\n {\n response = await axios.get(endpoint, params);\n }\n else if (method === 'POST')\n {\n response = await axios.post(endpoint, params);\n }\n else\n {\n throw new CustomError(\n 'unknown method',\n code,\n );\n }\n\n const { status, data } = response;\n if (status === 200)\n {\n if (data.status === 'success')\n {\n return data.result.data;\n }\n\n if (data.status === 'fail')\n {\n code = data.result.errorCode;\n reason = data.result.errorMessage;\n }\n }\n\n throw new CustomError(\n reason,\n code,\n );\n};\n","import { BASE_ENDPOINT, getData } from './ApiWrapper';\n\n/**\n * @param {GetHistoryRequest} params\n * @returns {Promise|null}\n */\nconst getPriceHistory = async (params) => getData(`${BASE_ENDPOINT}/GetHistory`, 'GET', {\n params: {\n ...params,\n volume: params.volume ? 'true' : 'false',\n afterhours: params.afterhours ? 'true' : 'false',\n },\n});\n\nexport default getPriceHistory;\n\n/** * TYPE DEFINITIONS ** */\n/**\n * @typedef {{\n* symbol: string;\n* frequency: string;\n* resolution: string;\n* latest: number;\n* volume?: boolean;\n* afterhours?: boolean;\n* debug?: boolean;\n* }} GetHistoryRequest\n*/\n\n/**\n * @typedef {{\n * data: GetPriceHistoryData\n * request: {\n * symbol: string;\n * frequency: string;\n * resolution: string;\n * to: number;\n * volume?: boolean;\n * afterhours?: boolean;\n * }\n * }} GetHistoryResult\n */\n\n/**\n * @typedef {{\n * count: number;\n * t: number[];\n * o: number[];\n * h: number[];\n * l: number[];\n * c: number[];\n * v?: number[];\n * from: number;\n * to: number;\n * dataLast: number;\n * marketHours?: {\n * premarket_open: number,\n * regular_open: number,\n * regular_close: number,\n * afterhours_close: number,\n * };\n * volumeAvailable: boolean\n * }} GetPriceHistoryData\n */\n","const HOURLY_INTERVAL = 60 * 60 * 1000;\n\n/**\n * @param {number[][]} dataSeries\n * @returns {number}\n */\nexport function getSeriesTimeInterval(dataSeries)\n{\n if (!dataSeries || !dataSeries.length || dataSeries[0].length < 2 || dataSeries.length < 2) return undefined;\n const dataInterval = dataSeries[1][0] - dataSeries[0][0];\n return (dataInterval <= HOURLY_INTERVAL) ? HOURLY_INTERVAL : dataInterval;\n}\n\nexport function getTimezoneIANAName(timezoneName)\n{\n if (timezoneName === 'US/Eastern')\n {\n return 'America/New_York';\n } if (timezoneName === 'GB-Eire')\n {\n return 'Europe/London';\n }\n\n return timezoneName;\n}\n","const DEFAULT_LOCALE = 'en_GB';\n\nconst FALLBACK_LOCALES = {\n en_CA: ['en_US', 'en_GB'],\n en_AU: ['en_US', 'en_GB'],\n // Add other specific fallbacks for each language as needed\n // Default fallback is en_GB\n};\n\nclass BaseTranslationService\n{\n setLocale(locale)\n {\n this.locale = this.getValidLocale(locale);\n }\n\n setLangFile(file)\n {\n this.lang = file;\n }\n\n getLangFile()\n {\n return this.lang ? this.lang : null;\n }\n\n getResource()\n {\n return this.lang[this.locale];\n }\n\n getValidLocale(locale)\n {\n const localesToCheck = [locale, ...(FALLBACK_LOCALES[locale] || [])];\n const validLocale = localesToCheck.find((fallbackLocale) => (this.lang).hasOwnProperty(fallbackLocale));\n return validLocale || DEFAULT_LOCALE;\n }\n\n getLocale()\n {\n return this.locale ? this.locale : DEFAULT_LOCALE;\n }\n\n getTranslation(txt)\n {\n if ((this.lang[this.locale]).hasOwnProperty(txt))\n {\n return this.lang[this.locale][txt];\n }\n if ((this.lang[this.locale].general).hasOwnProperty(txt))\n {\n return this.lang[this.locale].general[txt];\n }\n\n return txt;\n }\n\n}\n\nexport default BaseTranslationService;\n","import lang from '../../lang/chart.json';\nimport BaseTranslationService from '../../../../elements/translator/js/BaseTranslationService';\n\nconst CHART_TRANSLATIONS = [\n 'weekdays',\n 'months',\n 'shortMonths',\n 'viewFullscreen',\n 'printChart',\n 'downloadCSV',\n 'downloadJPEG',\n 'downloadPDF',\n 'downloadPNG',\n 'downloadSVG',\n 'downloadXLS',\n 'financials',\n];\n\nclass TranslationService extends BaseTranslationService\n{\n constructor(locale)\n {\n super();\n this.setLangFile(lang);\n this.setLocale(locale);\n }\n\n getChartTranslations()\n {\n const translationObject = {};\n\n CHART_TRANSLATIONS.forEach((key) =>\n {\n if (lang[this.locale] && lang[this.locale][key])\n {\n const translationValue = lang[this.locale][key];\n translationObject[key] = (typeof lang[this.locale][key] === 'object')\n ? Object.values(lang[this.locale][key])\n : translationValue;\n }\n });\n return translationObject;\n\n }\n}\n\nexport default TranslationService;\n","/* global Highcharts */\nimport { getTimezoneIANAName } from './helpers';\nimport TranslationService from './TranslationService';\n\nconst GetDefaultSettings = ({\n type = 'line',\n styledMode = true,\n animation = true,\n timezone = 'UTC',\n spacing = [10, 0, 0, 0],\n exporting = false,\n locale = 'en_GB',\n} = {}) =>\n{\n const translationService = new TranslationService(locale);\n\n Highcharts.setOptions({\n time: {\n timezone: getTimezoneIANAName(timezone),\n },\n lang: translationService.getChartTranslations(),\n });\n\n return {\n navigator: { enabled: false },\n accessibility: { enabled: false },\n exporting: {\n enabled: exporting,\n buttons: {\n contextButton: {\n x: -40,\n },\n },\n },\n rangeSelector: { enabled: false },\n scrollbar: { enabled: false },\n credits: { enabled: false },\n turboThreshold: 0,\n title: {\n text: '',\n },\n // Chart settings\n chart: {\n type,\n styledMode,\n zooming: { mouseWheel: false },\n animation,\n ...(spacing ? { spacing } : {}),\n },\n // The X axis\n xAxis: {\n tickLength: 0,\n crosshair: true,\n },\n // The Y axis\n yAxis: [\n {\n opposite: true,\n title: {\n align: 'left',\n text: '',\n },\n labels: {\n align: 'left',\n x: 5,\n y: 3,\n },\n showFirstLabel: true,\n showLastLabel: true,\n },\n ],\n legend: {\n useHTML: true,\n symbolRadius: 2,\n symbolHeight: 10,\n symbolWidth: 10,\n },\n tooltip: {\n shared: true,\n split: false,\n useHTML: true,\n followPointer: true,\n followTouchMove: true,\n outside: true,\n },\n series: [],\n plotOptions: {},\n };\n};\n\nexport default GetDefaultSettings;\n","class Locale\n{\n /**\n * @param {string} code\n */\n constructor({\n code = 'en-GB',\n timezone = 'UTC',\n } = {\n })\n {\n /** @type {string} */\n this._code = code;\n\n /** @type {string} */\n this._timezone = timezone;\n }\n\n getTimezone()\n {\n return this._timezone;\n }\n\n /**\n * @returns {string}\n */\n getCode()\n {\n return this._code;\n }\n\n /**\n * @param {string|number} value\n * @returns {string}\n */\n formatNumber(value)\n {\n if (typeof value === 'string')\n {\n value = parseFloat(value);\n }\n return value.toLocaleString();\n }\n\n /**\n * @param {number} timestamp\n * @returns {string}\n */\n formatDate(timestamp)\n {\n const date = new Date(timestamp);\n const day = date.getDate();\n const month = date.toLocaleString('default', { month: 'short' });\n const year = date.getFullYear().toString().slice(-2);\n return `${day} ${month} ${year}`;\n }\n\n _padTime(num)\n {\n return num < 10 ? `0${num}` : num;\n }\n\n /**\n * @param {number} timestamp\n * @returns {string}\n */\n formatHour(timestamp)\n {\n const date = new Date(timestamp);\n const options = { timeZone: this._timezone, hour: 'numeric', minute: 'numeric' };\n const formatter = new Intl.DateTimeFormat(this._code, options);\n const formattedTime = formatter.format(date);\n return formattedTime;\n }\n}\n\nexport default Locale;\n","/* eslint no-undef: 0 */\nclass Formatter\n{\n /**\n *\n * @param {*} value\n * @param {*} quoteType\n * @param {abbreviated: boolean, currency?: string} options\n * @returns\n */\n formatNumber(value, quoteType, options = {})\n {\n if (typeof LocaleFormat !== 'undefined')\n {\n const { currency, abbreviated } = options;\n const showCurrency = typeof currency !== 'undefined';\n let schema;\n if (abbreviated)\n {\n schema = 'abbreviated';\n }\n return this._localeFormat(value, quoteType, schema, currency, showCurrency);\n }\n return value;\n }\n\n formatPrice(value, quoteType)\n {\n if (typeof LocaleFormat !== 'undefined')\n {\n return this._localeFormat(value, quoteType, 'price');\n }\n return value;\n }\n\n formatChange(value, quoteType, percentage = false)\n {\n if (typeof LocaleFormat !== 'undefined')\n {\n if (percentage)\n {\n return this._localeFormat(value, quoteType, 'change', 'percent', true);\n }\n return this._localeFormat(value, quoteType, 'change');\n }\n if (percentage)\n {\n return `${value} %`;\n }\n return value;\n }\n\n formatVolume(value, quoteType, currency = null, showCurrency = false)\n {\n if (typeof LocaleFormat !== 'undefined')\n {\n if (currency !== null)\n {\n return this._localeFormat(value, quoteType, 'volume', currency, showCurrency);\n }\n\n return this._localeFormat(value, quoteType, 'volume');\n }\n return value;\n }\n\n formatTradeSizeWide(value, quoteType, currency = null, showCurrency = false)\n {\n if (typeof LocaleFormat !== 'undefined')\n {\n if (currency !== null)\n {\n return this._localeFormat(value, quoteType, 'vwap', currency, showCurrency);\n }\n\n return this._localeFormat(value, quoteType, 'vwap');\n }\n return value;\n }\n\n formatAbbreviated(value, quoteType)\n {\n if (value === null) return '-';\n\n if (typeof LocaleFormat !== 'undefined')\n {\n return this._localeFormat(value, quoteType, 'abbreviated');\n }\n return value;\n }\n\n formatDate(timestamp, locale = null, offset = null, displayTime = false, displayTypeDate = null)\n {\n if (Number.isNaN(timestamp)) return '-';\n\n const date = this._getDateWithOffset(timestamp, offset);\n\n if (date.toUTCString() === 'Invalid Date') return '-';\n\n if (locale === null)\n {\n locale = 'en-GB';\n }\n\n if (displayTypeDate)\n {\n let formattedDate;\n const timeOptions = { hour: 'numeric', minute: 'numeric', second: 'numeric' };\n const dateOptions = this._getDateType(displayTypeDate);\n\n if (!displayTime)\n {\n formattedDate = date.toLocaleDateString(locale, dateOptions);\n }\n else\n {\n formattedDate = `${date.toLocaleDateString(locale, dateOptions)} ${date.toLocaleTimeString(locale, timeOptions)}`;\n }\n return formattedDate;\n }\n\n const dateDisplay = date.toLocaleDateString(locale);\n if (!displayTime)\n {\n return dateDisplay;\n }\n\n return `${dateDisplay} ${this.formatTime(timestamp, locale, offset)}`;\n }\n\n formatTime(timestamp, offset = null, displaySeconds = false)\n {\n if (Number.isNaN(timestamp)) return '-';\n\n const date = this._getDateWithOffset(timestamp, offset);\n\n let hours = date.getUTCHours();\n let minutes = date.getUTCMinutes();\n let seconds = date.getUTCSeconds();\n\n if (Number.isNaN(hours) || Number.isNaN(minutes) || Number.isNaN(seconds))\n {\n return '-';\n }\n\n if (hours < 10)\n {\n hours = `0${hours}`;\n }\n\n if (minutes < 10)\n {\n minutes = `0${minutes}`;\n }\n\n if (!displaySeconds)\n {\n return `${hours}:${minutes}`;\n }\n\n if (seconds < 10)\n {\n seconds = `0${seconds}`;\n }\n return `${hours}:${minutes}:${seconds}`;\n }\n\n _getDateType(dateType)\n {\n switch (dateType)\n {\n case 'short':\n return { month: 'short', day: 'numeric', year: 'numeric' };\n case 'long':\n return { month: 'long', day: 'numeric', year: 'numeric' };\n default:\n return null;\n }\n }\n\n _getDateWithOffset(timestamp, offset)\n {\n let newTimestamp = parseInt(timestamp, 10);\n if (offset !== null && !Number.isNaN(offset))\n {\n newTimestamp += parseInt(offset, 10);\n }\n return new Date(newTimestamp * 1000);\n }\n\n _localeFormat(value, quoteType, schema, currency = '', showCurrency = false)\n {\n return LocaleFormat.formatForInstrumentType(value, quoteType, schema, currency, showCurrency);\n }\n}\n\nexport default Formatter;\n","import { BASE_ENDPOINT, getData } from './ApiWrapper';\n\n/**\n * @param {GetQuoteInfoRequest} params\n * @returns {Promise|null}\n */\nconst getQuoteInfo = async (params) => getData(`${BASE_ENDPOINT}/QuoteInfo`, 'GET', {\n params,\n});\n\nexport default getQuoteInfo;\n\n/** * TYPE DEFINITIONS ** */\n/**\n * @typedef {{\n* symbol: string;\n* }} GetQuoteInfoRequest\n*/\n\n/**\n * @typedef {{\n * data: QuoteInfo;\n * request: {\n * symbol: string;\n * }\n * }} GetQuoteInfoResult\n */\n","import Locale from '../lib/Locale';\nimport Formatter from '../../../../streaming/src/classes/Formatter';\nimport getQuoteInfo from '../api/QuoteInfo';\nimport TranslationService from '../lib/TranslationService';\nimport { getTimezoneIANAName } from '../lib/helpers';\n\nexport const TIME_FORMAT = '%H:%M';\nexport const DATE_FORMAT = '%A, %b %e, %Y';\nexport const DATE_HOUR_FORMAT = '%A, %b %e, %Y %H:%M';\nexport const DATE_HOUR_COMPACT_FORMAT = '%Y-%m-%d %H:%M';\n\nexport class BaseChart\n{\n /**\n * @param {HTMLElement} element\n */\n constructor(element, chartConfig)\n {\n /** @type {HTMLElement} */\n this._element = element;\n\n this._chartId = this._element.id;\n\n /** @type {Highcharts|null} */\n this._chart = null;\n\n /** @type {string} */\n this._id = this._element.id;\n\n this._chartConfig = chartConfig;\n\n this._setSize();\n\n this._formatter = new Formatter();\n\n const chartInfo = this.getChartInfo();\n this.translationService = new TranslationService(this.getQuoteInfo().locale);\n\n /** @type {Locale} */\n this._locale = new Locale({\n timezone: chartInfo.timezone,\n });\n\n this._element.classList.add('chart-container');\n this._element.classList.add(chartInfo.boxed ? 'delight-bordered-container' : 'delight-container');\n\n if (chartInfo.streaming)\n {\n this._element.classList.add('chart-streaming');\n }\n\n if (this._chartConfig.classes)\n {\n this._element.classList.add(...this._chartConfig.classes);\n }\n\n // State management flags\n this._hasError = false;\n this._dataReady = false;\n this._fetchingData = false;\n this._chartReady = false;\n this._needsRefresh = false;\n this._isEmptyCS = false;\n\n if (chartInfo.header)\n {\n this._headerContainer = this._createHeaderContainer();\n this._element.appendChild(this._headerContainer);\n }\n\n this._chartContainer = this._createChartContainer();\n this._element.appendChild(this._chartContainer);\n\n try\n {\n this.renderHeader();\n if (!this._chartConfig.isEmptySymbol)\n {\n this.displayLoadingBox();\n }\n // Intervals\n this._chartRefreshInterval = setInterval(() => this.refreshChart(), 150);\n }\n catch (e)\n {\n console.error(e);\n this.displayErrorBox('Rendering Error');\n }\n }\n\n getQuoteInfo()\n {\n return this._chartConfig.quoteInfo;\n }\n\n getChartInfo()\n {\n return this._chartConfig.chartInfo;\n }\n\n getChartText(key)\n {\n return this.translationService.getTranslation(key);\n }\n\n getChartLocale()\n {\n return this.translationService.getLocale();\n }\n\n isEmbed()\n {\n return this._chartConfig.is_embed;\n }\n\n _setSize()\n {\n /** @type {number} */\n const { width, height } = this._chartConfig;\n\n if (width === 0 && height === 0)\n {\n this._width = 0;\n this._height = 0;\n }\n else\n {\n this._width = width;\n this._height = height || this._width * 0.818;\n\n this._element.style.width = `${this._width}px`;\n this._element.style.height = `${this._height}px`;\n }\n }\n\n _createHeaderContainer()\n {\n const el = document.createElement('div');\n el.classList.add('delight-bordered-container-header');\n return el;\n }\n\n _createChartContainer()\n {\n const el = document.createElement('div');\n el.classList.add('delight-bordered-content', 'highcharts-light');\n return el;\n }\n\n /**\n * @returns {HTMLElement}\n */\n getElement()\n {\n return this._element;\n }\n\n /**\n * @returns {string}\n */\n getID()\n {\n return this._id;\n }\n\n /**\n * @returns {number}\n */\n getWidth()\n {\n return this._width;\n }\n\n /**\n * @returns {number}\n */\n getHeight()\n {\n return this._height;\n }\n\n /**\n * returns a promise that resolves when the chart is loaded for the first time\n * @returns Promise\n */\n onLoaded()\n {\n return new Promise((resolve) =>\n {\n this._onLoaded = resolve;\n });\n }\n\n /**\n * @protected\n */\n resetState()\n {\n this.hideErrorBox();\n }\n\n /**\n * @abstract\n */\n async loadData()\n {\n throw new Error('Not implemented');\n }\n\n /**\n * @abstract\n */\n getChartSettings()\n {\n throw new Error('Not implemented');\n }\n\n /**\n * @param {Highcharts.Options} chartSettings\n * @abstract\n */\n renderChart()\n {\n throw new Error('Not implemented');\n }\n\n setForRefresh()\n {\n this._needsRefresh = true;\n }\n\n /**\n * @param {UpdatableChartConfig} chartConfig\n */\n async updateConfig(chartConfig)\n {\n let quoteInfo = {};\n if (chartConfig.symbol !== this._chartConfig.symbol)\n {\n quoteInfo = await getQuoteInfo({\n symbol: chartConfig.symbol,\n });\n\n this._chartConfig = {\n ...this._chartConfig,\n ...chartConfig,\n ...{\n quoteInfo,\n },\n };\n\n this._setSize();\n this._dataReady = false;\n }\n }\n\n /**\n * @param {Highcharts.Options} chartSettings\n * @abstract\n */\n updateChart(chartSettings)\n {\n this._chart.update(chartSettings, true, true, false);\n }\n\n setChartTitle(title)\n {\n if (this._headerContainer)\n {\n const el = document.createElement('h3');\n el.className = 'chart-title heading-xs text-semibold';\n el.innerText = title;\n this._headerContainer.appendChild(el);\n }\n }\n\n createTitleEl(title, link = '#')\n {\n let titleEl;\n if (title)\n {\n titleEl = document.createElement('div');\n titleEl.className = 'chart-title-container';\n\n const mainTitleEl = document.createElement('a');\n mainTitleEl.href = link;\n mainTitleEl.classList.add('chart-title', 'heading-xs');\n mainTitleEl.innerText = title;\n titleEl.appendChild(mainTitleEl);\n }\n return titleEl;\n }\n\n renderCornerButton(text, target = '#', extraClass = '')\n {\n const link = document.createElement('a');\n link.innerHTML = text;\n link.href = target;\n link.classList = 'btn-main btn-32 chart-container-btn btn-accent-tertiary';\n if (extraClass)\n {\n link.classList.add(extraClass);\n }\n this._headerContainer.appendChild(link);\n }\n\n formatTooltipLine(text, value, className = '')\n {\n return `${text}: ${value}
`;\n }\n\n /**\n * @protected\n */\n renderHeader()\n {\n // No controls by default\n }\n\n /**\n * @protected\n */\n async refreshChart()\n {\n // Return if chart is in error state\n if (this._hasError && !this._needsRefresh) return;\n\n // Needs to fetch data\n if (!this._dataReady && !this._fetchingData)\n {\n // Destroy chart if it exists\n if (this._chartReady)\n {\n this._chart.destroy();\n this._chartReady = false;\n }\n\n try\n {\n if (this._fetchingData) return;\n this._fetchingData = true;\n\n this.hideErrorBox();\n if (!this._chartConfig.isEmptySymbol)\n {\n this.displayLoadingBox();\n }\n await this.loadData();\n this.hideLoadingBox();\n }\n catch (e)\n {\n console.warn(e);\n this._hasError = true;\n this.displayErrorBox(`Error: ${e.code || e.message}`);\n this.hideLoadingBox();\n }\n finally\n {\n this._fetchingData = false;\n }\n }\n else if (!this._chartReady)\n {\n // Initialize Chart\n if (this._dataReady)\n {\n try\n {\n const chartSettings = this.getChartSettings();\n this.renderChart(chartSettings);\n this._chartReady = true;\n if (this._chartConfig.isEmptySymbol)\n {\n this._chartConfig.isEmptySymbol = false;\n this.hideChartBox();\n }\n if (this._onLoaded)\n {\n this._onLoaded();\n this._onLoaded = null;\n }\n }\n catch (e)\n {\n console.error(e);\n this.displayErrorBox('Rendering Error');\n }\n }\n }\n else if (this._chartReady && this._needsRefresh)\n {\n // Refresh Chart\n const chartSettings = this.getChartSettings();\n this.updateChart(chartSettings);\n this._needsRefresh = false;\n }\n }\n\n /**\n * Prepares static historical data for the chart if there is no result from CS.\n *\n * @protected\n */\n prepareDataForEmptyCS()\n {\n const startTime = this._history.marketHours && this._history.marketHours.premarket_open ? this._history.marketHours.premarket_open : this._history.dataFirst;\n const endTime = this._history.to;\n const history = {\n c: [],\n h: [],\n l: [],\n o: [],\n t: [],\n v: [],\n };\n\n const { currentPrice } = this.getQuoteInfo();\n\n // Iterate through the timestamps with 15-minute intervals\n for (let timestamp = startTime; timestamp <= endTime; timestamp += 300)\n {\n const timestampMs = timestamp * 1000;\n history.c.push(currentPrice);\n history.h.push(currentPrice);\n history.l.push(currentPrice);\n history.o.push(currentPrice);\n history.t.push(timestampMs);\n history.v.push(0);\n }\n this._history = {\n ...this._history,\n history,\n };\n this._dataSeries = history.t.map((timestamp, index) => [\n timestamp,\n history.c[index],\n history.h[index],\n history.l[index],\n history.o[index],\n ]);\n }\n\n hideChartBox()\n {\n const container = this._element.querySelector('.highcharts-container');\n if (container)\n {\n container.style.display = 'none';\n }\n }\n\n showChartBox()\n {\n const container = this._element.querySelector('.highcharts-container');\n if (container)\n {\n container.style.display = 'block';\n }\n }\n\n displayLoadingBox()\n {\n this.hideChartBox();\n this._loadingBox = this._element.querySelector('.loading-box');\n if (!this._loadingBox)\n {\n this._loadingBox = document.createElement('div');\n this._loadingBox.classList.add('chart-box');\n this._loadingBox.classList.add('loading-box');\n this._chartContainer.appendChild(this._loadingBox);\n }\n if (this._loadingBox.style.display === 'none')\n {\n this._loadingBox.style.display = '';\n }\n }\n\n hideLoadingBox()\n {\n this.showChartBox();\n if (this._loadingBox)\n {\n this._loadingBox.style.display = 'none';\n }\n }\n\n deleteChart()\n {\n if (this._chart)\n {\n this._chart.destroy();\n this._chart = null;\n }\n }\n\n /**\n * @param {string} message\n */\n displayErrorBox(message = 'Error loading chart...')\n {\n this.hideLoadingBox();\n this.hideChartBox();\n this._errorBox = this._element.querySelector('.error-box');\n if (!this._errorBox)\n {\n this._errorBox = document.createElement('div');\n this._errorBox.classList.add('chart-box');\n this._errorBox.classList.add('error-box');\n this._chartContainer.appendChild(this._errorBox);\n }\n if (this._errorBox.style.display === 'none')\n {\n this._errorBox.style.display = '';\n }\n\n this._errorBox.innerHTML = message;\n }\n\n hideErrorBox()\n {\n this._hasError = false;\n if (this._errorBox)\n {\n this._errorBox.style.display = 'none';\n }\n this.showChartBox();\n }\n\n /**\n * @param {ChartResolution} resolution\n * @returns {ChartFrequency}\n */\n convertResolutionToFrequency(resolution)\n {\n let val;\n switch (resolution)\n {\n case 'INTRA':\n val = '5';\n break;\n case 'W':\n case '7D':\n val = '15';\n break;\n case 'M':\n case '1M':\n val = '60';\n break;\n case '3M':\n case '6M':\n case 'YTD':\n case 'Y':\n case '1Y':\n val = 'DAILY';\n break;\n case '3Y':\n case '5Y':\n val = 'WEEKLY';\n break;\n }\n return val;\n }\n\n /**\n * @param {{ value: number }} param0\n * @returns {string}\n * @protected\n */\n formatNumber({ value })\n {\n return this._locale.formatNumber(value);\n }\n\n /**\n * @param value timestamp\n * @param resolution resolution\n * @param format format\n * @returns {string}\n * @protected\n */\n formatDate(value, resolution, format)\n {\n const timezone = getTimezoneIANAName(this._locale.getTimezone());\n const date = new Date(value);\n const locale = window.ADVFN.LOCALE ? window.ADVFN.LOCALE.replace('_', '-') : 'en-US';\n\n const dateOptions = {\n weekday: 'long',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour12: false,\n timeZone: resolution === '1Y' ? 'UTC' : timezone,\n };\n\n const weekday = date.toLocaleDateString(locale, { weekday: 'long', timeZone: dateOptions.timeZone });\n const month = date.toLocaleDateString(locale, { month: 'short', timeZone: dateOptions.timeZone });\n const day = date.getDate();\n const year = date.getFullYear();\n\n // Initialize the formatted string with the date parts\n let formattedDate = `${weekday.charAt(0).toUpperCase() + weekday.slice(1)}, ${month.charAt(0).toUpperCase() + month.slice(1)} ${day}, ${year}`;\n\n // If the format includes time, add it to the formatted string\n if (format === DATE_HOUR_FORMAT)\n {\n const hour = date.toLocaleTimeString(locale, { hour: '2-digit', timeZone: dateOptions.timeZone, hour12: false });\n const minute = date.toLocaleTimeString(locale, { minute: '2-digit', timeZone: dateOptions.timeZone });\n formattedDate += ` ${hour}:${minute}`;\n }\n\n return formattedDate;\n }\n\n /**\n * @param {{ value: number }} param0\n * @returns {string}\n * @protected\n */\n formatHour({ value })\n {\n return this._locale.formatHour(value);\n }\n}\n","/* global Highcharts */\n/* global moment */\nimport getPriceHistory from '../api/PriceHistory';\nimport GetDefaultSettings from '../lib/ChartSettings';\nimport\n{\n getSeriesTimeInterval,\n} from '../lib/helpers';\nimport { BaseChart, DATE_FORMAT, DATE_HOUR_FORMAT } from './BaseChart';\n\nconst DEFAULT_CHART_TYPE = 'candlestick';\nconst DEFAULT_RESOLUTION = 'INTRA';\n\nexport default class StockPriceChart extends BaseChart\n{\n /**\n * @param {HTMLElement} element\n */\n constructor(element, chartConfig)\n {\n super(element, chartConfig);\n\n this._dataSeries = null;\n this._volumeSeries = null;\n this._xRange = {};\n this._yRange = {};\n this.smallWidthTickerPixelInterval = 50;\n this.setDefaultOptions();\n }\n\n setDefaultOptions(defaultOptions = {\n resolution: DEFAULT_RESOLUTION,\n chartType: DEFAULT_CHART_TYPE,\n volume: true,\n symbol: undefined,\n marginTop: undefined,\n animation: true,\n })\n {\n this._defaultOptions = defaultOptions;\n }\n\n getVolume()\n {\n return this._chartConfig.volume !== undefined ? this._chartConfig.volume : this._defaultOptions.volume;\n }\n\n isVolumeAvailable()\n {\n if (this._chartConfig.volume === false) return false;\n\n return this._history.volumeAvailable;\n }\n\n setResolution(resolution)\n {\n this._chartConfig = {\n ...this._chartConfig,\n resolution,\n };\n }\n\n setChartType(chartType)\n {\n this._chartConfig = {\n ...this._chartConfig,\n chartType,\n };\n }\n\n getResolution()\n {\n return this._chartConfig.resolution ? this._chartConfig.resolution : this._defaultOptions.resolution;\n }\n\n getFrequency()\n {\n const resolution = this.getResolution();\n return this.convertResolutionToFrequency(resolution);\n }\n\n getSymbol()\n {\n return this._chartConfig.symbol ? this._chartConfig.symbol : this._defaultOptions.symbol;\n }\n\n getChartType()\n {\n return this._chartConfig.chartType ? this._chartConfig.chartType : this._defaultOptions.chartType;\n }\n\n _createTriggerContainer()\n {\n const triggersContainer = document.createElement('div');\n triggersContainer.className = 'triggers-container';\n return triggersContainer;\n }\n\n renderHeader()\n {\n const { symbolDisplayName, symbolCompanyName } = this.getQuoteInfo();\n const { headerChart, customTitle, quoteLink } = this.getChartInfo();\n if (headerChart)\n {\n this._headerContainer.classList.add('header-chart');\n const titleEl = document.createElement('div');\n titleEl.className = 'chart-title-container';\n\n const mainTitleEl = document.createElement('a');\n mainTitleEl.href = quoteLink;\n mainTitleEl.className = 'chart-title';\n mainTitleEl.innerText = `${symbolCompanyName}`;\n if (this.isEmbed()) mainTitleEl.setAttribute('target', '_blank');\n titleEl.appendChild(mainTitleEl);\n\n const subtitleEl = document.createElement('div');\n subtitleEl.className = 'chart-subtitle';\n subtitleEl.innerText = `${symbolDisplayName}`;\n titleEl.appendChild(subtitleEl);\n\n this._headerContainer.appendChild(titleEl);\n }\n else if (customTitle)\n {\n const titleEl = this.createTitleEl(customTitle, quoteLink);\n\n this._headerContainer.appendChild(titleEl);\n }\n }\n\n renderChart(chartSettings)\n {\n const { headerChart } = this.getChartInfo();\n\n if (headerChart)\n {\n const streamingPriceEl = this.createStreamingPriceEl();\n this._headerContainer.appendChild(streamingPriceEl);\n\n if (this.getChartInfo().streaming)\n {\n this.listenToPriceChanges(streamingPriceEl);\n }\n }\n\n this._chart = Highcharts.stockChart(this._chartContainer, chartSettings);\n }\n\n updateChart(chartSettings)\n {\n this._chart.update(chartSettings, true, true);\n }\n\n async loadData()\n {\n const { toTimestamp } = this.getChartInfo();\n const clientTo = toTimestamp || Math.round(moment.utc().valueOf() / 1000);\n const data = await getPriceHistory({\n symbol: this.getSymbol(),\n frequency: this.getFrequency(),\n resolution: this.getResolution(),\n to: clientTo,\n volume: true,\n afterhours: this._isIntraDay(),\n errorMode: true,\n });\n this._isEmptyCS = data.code && data.code === 610;\n this._history = data;\n this._prepareData();\n this._dataReady = true;\n }\n\n prepareDataForEmptyCS()\n {\n super.prepareDataForEmptyCS();\n this._getXRange();\n }\n\n _isIntraDay()\n {\n return this.getResolution() === 'INTRA';\n }\n\n _getXRange()\n {\n const { dataFirst, dataLast } = this._history;\n this._xRange = {\n min: dataFirst * 1000,\n max: dataLast * 1000,\n };\n\n const { marketHours } = this._history;\n if (this._isIntraDay() && marketHours)\n {\n const {\n premarket_open: premarketOpen,\n regular_open: regularOpen,\n regular_close: regularClose,\n afterhours_close: afterhoursClose,\n } = marketHours;\n\n this._xRange.min = regularOpen * 1000;\n this._xRange.max = regularClose * 1000;\n\n if (premarketOpen !== regularOpen)\n {\n this._xRange.min = premarketOpen * 1000;\n }\n\n if (dataLast > regularClose && regularClose !== afterhoursClose)\n {\n this._xRange.max = afterhoursClose * 1000;\n }\n\n // during market open hours we need actual range\n // to avoid inconsistency between chart data and x-axis values\n if (dataLast < regularClose)\n {\n this.smallWidthTickerPixelInterval = 70;\n this._xRange.max = dataLast * 1000;\n }\n }\n }\n\n _getYRange()\n {\n this._yRange = {\n min: Infinity,\n max: -Infinity,\n };\n\n const count = this._history.t.length;\n for (let i = 0; i < count; i++)\n {\n if (this._history.c[i] < this._yRange.min)\n {\n this._yRange.min = this._history.c[i];\n }\n if (this._history.c[i] > this._yRange.max)\n {\n this._yRange.max = this._history.c[i];\n }\n }\n\n const { yesterdayClosePrice } = this.getQuoteInfo();\n if (yesterdayClosePrice < this._yRange.min)\n {\n this._yRange.min = yesterdayClosePrice;\n }\n if (yesterdayClosePrice > this._yRange.max)\n {\n this._yRange.max = yesterdayClosePrice;\n }\n }\n\n _prepareData()\n {\n if (this._isEmptyCS)\n {\n this.prepareDataForEmptyCS();\n return;\n }\n const dataSeries = [];\n const volumeSeries = [];\n const { marketHours } = this._history;\n const { premarket_open: premarketOpen } = marketHours || {};\n\n if (!this._history.t)\n {\n throw new Error('No data');\n }\n\n const count = this._history.t.length;\n for (let i = 0; i < count; i++)\n {\n if (!premarketOpen || this._history.t[i] >= premarketOpen)\n {\n const timestamp = this._history.t[i] * 1000;\n if (this.getChartType() === 'candlestick')\n {\n dataSeries.push([\n timestamp,\n this._history.o[i],\n this._history.h[i],\n this._history.l[i],\n this._history.c[i],\n ]);\n }\n else if (this.getChartType() === 'hlc')\n {\n dataSeries.push([\n timestamp,\n this._history.h[i],\n this._history.l[i],\n this._history.c[i],\n ]);\n }\n else\n {\n dataSeries.push([\n timestamp,\n this._history.c[i],\n ]);\n }\n\n // If close is greater than open, the bar is positive\n const closePrice = parseFloat(this._history.c[i]);\n const openPrice = parseFloat(this._history.o[i]);\n const volumeBarClassName = closePrice > openPrice ? 'custom-volume-up' : 'custom-volume-down';\n\n volumeSeries.push({\n x: timestamp,\n y: this._history.v[i],\n className: volumeBarClassName,\n });\n }\n }\n this._getXRange();\n this._getYRange();\n\n this._dataSeries = dataSeries;\n this._volumeSeries = volumeSeries;\n }\n\n _getAbsPrice()\n {\n if (this._absDeltaEl)\n {\n return this._absDeltaEl.innerText;\n } if (this.getQuoteInfo())\n {\n return this.getQuoteInfo().currentPrice;\n }\n return 0;\n }\n\n renderLabel(chart, streaming = false)\n {\n const that = this;\n const { renderer } = chart;\n const yAxis = chart.yAxis[0];\n\n const yAxisLabelsBox = yAxis.labelGroup.getBBox();\n\n // Calculate the position of the custom label\n const labelX = yAxisLabelsBox.x;\n const lastPoint = that._dataSeries[that._dataSeries.length - 1];\n\n let labelValue;\n let labelY;\n if (streaming)\n {\n labelValue = chart.numberFormatter(lastPoint[4]);\n labelY = yAxis.toPixels(lastPoint[4]);\n }\n else\n {\n const p = lastPoint[1] ? lastPoint[1].toFixed(2) : 0;\n labelValue = chart.numberFormatter(p);\n labelY = yAxis.toPixels(lastPoint[1]);\n }\n\n const absPrice = that._getAbsPrice();\n if (!labelY)\n {\n console.warn('Failed to render label');\n return;\n }\n\n // Create the custom label using the renderer\n if (chart.customLabel)\n {\n chart.customLabel.destroy();\n }\n chart.customLabel = renderer\n .text(labelValue, labelX, labelY)\n .attr({\n class: 'chart-custom-label',\n zIndex: 1001,\n })\n .add();\n\n const labelWidth = chart.customLabel.getBBox().width;\n\n if (chart.customLabelBackground)\n {\n chart.customLabelBackground.destroy();\n }\n chart.customLabelBackground = renderer\n .rect(labelX - 1, labelY - 10, labelWidth + 2, 14)\n .attr({\n class: that.getPriceTrendClass(absPrice),\n rx: 2,\n ry: 2,\n zIndex: 1000,\n })\n .add();\n }\n\n _addCurPriceLabel(chartSettings)\n {\n const that = this;\n\n chartSettings.chart.events = {\n load()\n {\n const chart = this;\n that.renderLabel(chart);\n },\n redraw()\n {\n const chart = this;\n that.renderLabel(chart);\n },\n };\n }\n\n getPlotBands()\n {\n const plotBands = [];\n const { marketHours, dataLast } = this._history;\n if (marketHours)\n {\n const {\n premarket_open: premarketOpen,\n regular_open: regularOpen,\n regular_close: regularClose,\n afterhours_close: afterhoursClose,\n } = marketHours;\n\n const extendedSession = (premarketOpen !== regularOpen || regularClose !== afterhoursClose);\n if (extendedSession)\n {\n if (premarketOpen !== regularOpen)\n {\n // Premarket shades the whole chart before regular open\n const premarketTo = ((dataLast > regularOpen) ? regularOpen : dataLast);\n\n plotBands.push({\n from: premarketOpen * 1000,\n to: premarketTo * 1000,\n });\n }\n\n if (dataLast > regularClose && regularClose !== afterhoursClose)\n {\n plotBands.push({\n from: regularClose * 1000,\n to: afterhoursClose * 1000,\n });\n }\n }\n }\n return plotBands;\n }\n\n _getDataGrouping()\n {\n let grouping;\n if (this.getChartType() === 'candlestick')\n {\n if (['YTD'].indexOf(this.getResolution()) > -1)\n {\n grouping = {\n ...{\n enabled: true,\n forced: false,\n },\n units: [\n ['day', [1, 3, 5]],\n ['week', [1, 2]],\n ['month', [1]],\n ],\n approximation: 'end',\n };\n }\n else if (['5Y'].indexOf(this.getResolution()) > -1)\n {\n grouping = {\n ...{\n enabled: true,\n forced: true,\n },\n units: [\n ['month', [1]],\n ],\n approximation: 'end',\n };\n }\n }\n else\n {\n grouping = {\n enabled: false,\n };\n }\n return grouping;\n }\n\n _getAreaConfig()\n {\n return {\n gradient0: {\n tagName: 'linearGradient',\n id: 'gradient-0',\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 1,\n children: [{\n tagName: 'stop',\n offset: 0,\n }, {\n tagName: 'stop',\n offset: 1,\n }],\n },\n };\n\n }\n\n /**\n * @returns {Highcharts.Options}\n */\n getChartSettings()\n {\n const that = this;\n\n const yVolumeHeightPercent = 12;\n const yVolumeTopPercent = 100 - yVolumeHeightPercent;\n const yPriceHeightPercent = this.isVolumeAvailable() ? 100 - yVolumeHeightPercent : 100;\n\n const formatter = this._formatter;\n const chartDefaultOverride = {\n ...this._defaultOptions.marginTop !== undefined ? {\n marginTop: this._defaultOptions.marginTop,\n } : {},\n ...this._defaultOptions.animation !== undefined ? {\n animation: this._defaultOptions.animation,\n } : {},\n };\n\n const chartSettings = GetDefaultSettings({\n type: this.getChartType(),\n timezone: this._locale.getTimezone(),\n spacing: [10, 10, 0, 0],\n locale: this.getChartLocale(),\n ...chartDefaultOverride,\n });\n\n const { type } = this.getQuoteInfo();\n\n chartSettings.chart.numberFormatter = (value) => formatter.formatPrice(value, type);\n\n chartSettings.tooltip = {\n ...chartSettings.tooltip,\n formatter()\n {\n const { point } = this;\n const volPoint = this.points[1];\n const { name: seriesName, points } = point.series;\n const avgInterval = (points[points.length - 1].x - points[0].x) / points.length;\n const avgDurationDays = avgInterval / (1000 * 60 * 60);\n const dateFormatString = avgDurationDays >= 23 ? DATE_FORMAT : DATE_HOUR_FORMAT;\n\n const priceText = point.open ? `\n ${that.formatTooltipLine(that.getChartText('Open'), `${formatter.formatPrice(point.open)}`, 'tooltip-value')}\n ${that.formatTooltipLine(that.getChartText('High'), `${formatter.formatPrice(point.high)}`, 'tooltip-value')}\n ${that.formatTooltipLine(that.getChartText('Low'), `${formatter.formatPrice(point.low)}`, 'tooltip-value')}\n ${that.formatTooltipLine(that.getChartText('Close'), `${formatter.formatPrice(point.close)}`, 'tooltip-value')}\n ` : `\n ${that.formatTooltipLine(that.getChartText('Price'), `${formatter.formatPrice(point.y)}`, 'tooltip-value')}\n `;\n\n const volText = volPoint ? `\n ${that.formatTooltipLine(that.getChartText('Volume'), formatter.formatAbbreviated(volPoint.y, type), 'tooltip-value')}\n ` : '';\n\n // Customize the tooltip content\n const tooltipText = `\n ${seriesName}
\n ${that.formatTooltipLine(that.getChartText('Date'), that.formatDate(point.x, that.getResolution(), dateFormatString), 'tooltip-value')}\n ${priceText}\n ${volText}\n `;\n\n return tooltipText;\n },\n distance: this.isEmbed() ? 0 : 30,\n };\n\n if (!this.isEmbed() && (this.getChartInfo().responsive || ['line', 'area'].includes(chartSettings.chart.type)))\n {\n chartSettings.tooltip = {\n ...chartSettings.tooltip,\n positioner(labelWidth, labelHeight, point)\n {\n const tooltipArea = 50;\n let chartX = point.plotX + this.chart.plotLeft;\n const pointY = point.plotY < 0 ? Math.abs(point.plotY) : point.plotY;\n let chartY = pointY + this.chart.plotTop - tooltipArea;\n\n // Default offsets for tooltip from cursor\n const offsetX = document.body.clientWidth > 1200 ? 30 : 20;\n const offsetY = 20;\n const maxLabelWidth = 218;\n\n // If tooltip overflows chart area we want it to place on the right side of the cursor\n if (chartX - maxLabelWidth - offsetX < 0)\n {\n // If the device screen is small, or the chart width is restricted, or the tooltip extends beyond the chart boundaries,\n // resulting in horizontal scrolling, we move the tooltip to the top of the chart.\n if ((chartX + maxLabelWidth + tooltipArea) > this.chart.chartWidth && (document.body.clientWidth <= 400 || this.chart.chartWidth < 540))\n {\n chartX = point.plotX - (labelWidth / 2);\n // for area chart, as well as for charts which does not have a volume(including area),\n // Y point will be calculated based on pointY\n if (chartSettings.chart.type !== 'area' || (chartSettings.series && chartSettings.series.length === 1))\n {\n chartY = pointY - labelHeight - offsetY;\n }\n else\n {\n chartY = 0 - labelHeight - 10;\n }\n }\n // Otherwise, the tooltip will be positioned to the right of the cursor.\n else\n {\n chartX += offsetX;\n }\n }\n // Position tooltip on the left side of cursor\n else\n {\n chartX -= labelWidth + offsetX;\n }\n\n // Return tooltip position\n return {\n x: chartX,\n y: chartY,\n };\n },\n followPointer: false,\n distance: '0',\n };\n }\n\n // Disable legend\n chartSettings.legend.enabled = false;\n\n // X Axis\n const interval = getSeriesTimeInterval(this._dataSeries);\n chartSettings.xAxis = {\n ...chartSettings.xAxis,\n type: 'datetime',\n plotBands: this.getPlotBands(),\n tickPixelInterval: this._width <= 200 ? this.smallWidthTickerPixelInterval : 100,\n ...this._xRange,\n };\n if (this._isIntraDay())\n {\n chartSettings.xAxis.labels = {\n format: '{value:%H:%M}',\n };\n }\n\n // Y Axis\n const { yesterdayClosePrice } = this.getQuoteInfo();\n chartSettings.yAxis[0] = {\n ...chartSettings.yAxis[0],\n ...this._yRange,\n height: `${yPriceHeightPercent}%`,\n plotLines: [{\n value: yesterdayClosePrice,\n className: 'plot-line-yesterday-close',\n }],\n };\n\n // If we don't have an interval, draw a plot line at the current price.\n if (interval === undefined)\n {\n chartSettings.yAxis[0].plotLines = [\n ...chartSettings.yAxis[0].plotLines,\n {\n value: this._dataSeries[0][1],\n className: 'plot-line-today-price',\n },\n ];\n }\n\n // if CS returns an empty result, we will need to adjust yAxis range based on the current price\n if (this._isEmptyCS)\n {\n const price = this.getQuoteInfo().currentPrice;\n chartSettings.yAxis[0].plotLines = false;\n chartSettings.yAxis[0].min = price - (price * 0.1);\n chartSettings.yAxis[0].max = price + (price * 0.1);\n }\n\n this._addCurPriceLabel(chartSettings);\n\n const animation = this._defaultOptions.animation !== undefined ? {\n animation: this._defaultOptions.animation,\n } : {};\n\n const dataGrouping = this._getDataGrouping();\n chartSettings.defs = this._getAreaConfig();\n\n // The main series (line, candlestick, area, etc.)\n chartSettings.series.push({\n yAxis: 0,\n id: 'main_symbol',\n className: 'series-main-symbol',\n name: this.getSymbol().split('^')[1],\n formatter: chartSettings.chart.numberFormatter,\n data: this._dataSeries,\n dataGrouping,\n ...animation,\n });\n\n // Volume bars\n if (this.isVolumeAvailable())\n {\n chartSettings.series.push({\n yAxis: 1,\n id: 'volume_bars',\n className: 'series-volume-bars',\n type: 'column',\n name: 'Volume',\n data: this._volumeSeries,\n pointInterval: interval,\n borderRadius: 0,\n groupPadding: 0,\n // Display even small amounts of volume\n minPointLength: 2,\n dataGrouping,\n ...animation,\n });\n\n // add axis\n chartSettings.yAxis.push({\n labels: { enabled: false },\n top: `${yVolumeTopPercent}%`,\n height: `${yVolumeHeightPercent}%`,\n });\n }\n\n return chartSettings;\n }\n\n createStreamingPriceEl()\n {\n const {\n currentPrice, priceChange, priceChangePercent, type,\n } = this.getQuoteInfo();\n\n // Price info\n const infoDiv = document.createElement('div');\n infoDiv.className = 'chart-info';\n\n this._priceEl = this.createStreamingSpan('CUR_PRICE', '$AFNStreamingRenderer.renderPrice');\n this._priceEl.className = 'chart-info-price';\n\n this._priceEl.innerText = this._formatter.formatPrice(currentPrice, type);\n\n this._deltaEl = document.createElement('div');\n this._deltaEl.classList.add('chart-info-deltas');\n\n this._absDeltaEl = this.createStreamingSpan('CHANGE', '$AFNStreamingRenderer.renderChange');\n this._absDeltaEl.innerText = this._formatter.formatChange(priceChange, type);\n\n const percentDeltaEl = this.createStreamingSpan('CHANGE_PC', '$AFNStreamingRenderer.renderChangePercentage');\n percentDeltaEl.classList.add('chart-info-deltas-percent');\n percentDeltaEl.innerText = this._formatter.formatChange(priceChangePercent, type, true);\n\n this._deltaEl.appendChild(this._absDeltaEl);\n this._deltaEl.appendChild(percentDeltaEl);\n\n this.setPriceTrend(priceChange);\n\n infoDiv.appendChild(this._priceEl);\n infoDiv.appendChild(this._deltaEl);\n\n return infoDiv;\n }\n\n /**\n * @param {string} priceDeltaStr\n * @returns\n */\n getPriceTrendClass(priceDelta)\n {\n const priceDeltaTrend = priceDelta;\n if (typeof priceDelta === 'string')\n {\n // in some locales (ge), parseFloat can't be used to parse negative numbers\n priceDelta = (priceDelta.indexOf('-') > -1) ? -1 : 1;\n }\n\n let trendClass = 'unchanged';\n if (priceDeltaTrend > 0)\n {\n trendClass = 'up';\n }\n else if (priceDeltaTrend < 0)\n {\n trendClass = 'down';\n }\n\n return `element-${trendClass}-color`;\n }\n\n /**\n * @param {string} priceDeltaStr\n * @returns\n */\n setPriceTrend(priceDeltaStr)\n {\n const trendClass = this.getPriceTrendClass(priceDeltaStr);\n this._deltaEl.classList.remove('element-unchanged-color', 'element-up-color', 'element-down-color');\n this._deltaEl.classList.add(trendClass);\n if (this._chart && this._chart.customLabelBackground)\n {\n this._chart.customLabelBackground.classList.remove(\n 'element-unchanged-color',\n 'element-up-color',\n 'element-down-color',\n );\n this._chart.customLabelBackground.classList.add(trendClass);\n }\n }\n\n createStreamingSpan(param, render)\n {\n const { type, feedSymbol } = this.getQuoteInfo();\n const el = document.createElement('span');\n el.setAttribute('data-asc-symbol', feedSymbol);\n el.setAttribute('data-asr-quote-type', type);\n el.setAttribute('data-asc-param', param);\n el.setAttribute('data-asc-render', render);\n\n return el;\n }\n\n listenToPriceChanges(el)\n {\n const observer = new MutationObserver((mutationsList) =>\n {\n mutationsList.forEach((mutation) =>\n {\n this.setPriceTrend(mutation.target.textContent);\n });\n });\n\n observer.observe(el, { childList: true, characterData: true });\n }\n}\n","export default class TriggersContainer\n{\n /**\n *\n * @param {*} element\n * @param {*} chartId\n * @param {{className: string}} triggerOptions\n */\n constructor(element, chartId, options = {})\n {\n this._element = element;\n\n const { className } = options;\n if (className)\n {\n this._element.classList.add(className);\n }\n this._chartId = chartId;\n this._clickHandlers = {};\n }\n\n _createTriggerGroup(id, optionName)\n {\n const triggerGroup = document.createElement('div');\n triggerGroup.id = id;\n triggerGroup.className = 'delight-trigger-group';\n triggerGroup.setAttribute('data-trigger', optionName);\n return triggerGroup;\n }\n\n _getGroupId(groupName)\n {\n return `${this._chartId}-trigger-${groupName}`;\n }\n\n _triggerClickHandler(event)\n {\n event.stopPropagation();\n const el = event.target;\n const group = el.parentElement;\n const groupName = group.dataset.trigger;\n\n group.querySelectorAll('.trigger.active').forEach((trigger) =>\n {\n trigger.classList.remove('active');\n });\n el.classList.add('active');\n this._clickHandlers[groupName](event);\n }\n\n _setDrowdownActiveOption(dropdownButton, activeOption)\n {\n if (activeOption)\n {\n if (activeOption.type === 'icon')\n {\n dropdownButton.setAttribute('data-value', activeOption.value);\n dropdownButton.classList.add('icon');\n }\n else\n {\n dropdownButton.innerText = activeOption.fullText || activeOption.text;\n }\n }\n }\n\n /**\n * @public\n * @param {string} groupName\n * @param {Array} options\n * @returns\n */\n _addTriggerDropdown(groupName, options, clickHandler)\n {\n const { resolution, chartType } = this._getLocalStorageValue();\n\n const activeOption = options.find((option) => option.active);\n const dropdownRoot = document.createElement('div');\n\n dropdownRoot.id = this._getGroupId(groupName);\n dropdownRoot.classList.add('dropdown');\n\n const dropdownButton = document.createElement('button');\n dropdownButton.classList.add('btn', 'btn-secondary', 'dropdown-toggle');\n dropdownButton.setAttribute('type', 'button');\n dropdownButton.setAttribute('data-bs-toggle', 'dropdown');\n dropdownButton.setAttribute('aria-haspopup', 'true');\n dropdownButton.setAttribute('aria-expanded', 'false');\n dropdownButton.setAttribute('aria-label', 'Chart Type');\n this._setDrowdownActiveOption(dropdownButton, activeOption);\n dropdownRoot.appendChild(dropdownButton);\n\n const onClick = (e) =>\n {\n const el = e.target;\n const selectedOption = options.find((option) => option.value === el.getAttribute('data-value'));\n this._setDrowdownActiveOption(dropdownButton, selectedOption);\n clickHandler(e);\n };\n\n const dropdownMenu = document.createElement('div');\n dropdownMenu.className = 'dropdown-menu';\n dropdownMenu.setAttribute('aria-labelledby', 'dropdownMenuButton');\n dropdownRoot.appendChild(dropdownMenu);\n\n options.forEach((option) =>\n {\n const dropdownItem = document.createElement('span');\n dropdownItem.classList.add('dropdown-item', 'trigger');\n dropdownItem.setAttribute('data-value', option.value);\n dropdownItem.setAttribute('aria-label', option.text);\n if (option.type === 'icon')\n {\n dropdownItem.classList.add('image-trigger');\n }\n dropdownItem.innerText = option.fullText || option.text;\n\n option.active = false;\n const conditions = {\n resolution,\n type: chartType,\n };\n\n option.active = option.value === conditions[groupName];\n\n dropdownItem.addEventListener('click', onClick);\n dropdownMenu.appendChild(dropdownItem);\n });\n\n this._element.appendChild(dropdownRoot);\n }\n\n /**\n * @public\n * @param {string} groupName\n * @param {Array} options\n * @param {Function} clickHandler\n * @param {boolean} isResponsive\n */\n addTriggerGroup(groupName, options, clickHandler, isResponsive)\n {\n const { resolution, chartType } = this._getLocalStorageValue();\n\n if (isResponsive)\n {\n this._addTriggerDropdown(groupName, options, clickHandler);\n }\n else\n {\n const id = this._getGroupId(groupName);\n this._clickHandlers[groupName] = clickHandler;\n this._element.appendChild(this._createTriggerGroup(id, groupName));\n\n options.forEach((option) =>\n {\n option.active = false;\n const conditions = {\n resolution,\n type: chartType,\n };\n\n option.active = option.value === conditions[groupName];\n\n this._addTrigger(groupName, option);\n });\n }\n }\n\n /**\n * @public\n * @param {string} groupName\n * @param {TriggerOptions} triggerOptions\n * @returns\n */\n _addTrigger(groupName, triggerOptions)\n {\n const id = this._getGroupId(groupName);\n const triggerGroup = this._element.querySelector(`#${id}`);\n if (!triggerGroup) return;\n\n const {\n text, value, type, active, enabled,\n } = triggerOptions;\n const trigger = document.createElement('button');\n trigger.className = 'trigger';\n if (type === 'icon')\n {\n trigger.classList.add('image-trigger');\n }\n else\n {\n trigger.innerText = text;\n }\n trigger.setAttribute('data-value', value);\n trigger.setAttribute('aria-label', text);\n\n if (active)\n {\n trigger.classList.add('active');\n }\n\n if (enabled === false)\n {\n trigger.setAttribute('disabled', 'disabled');\n }\n\n trigger.addEventListener('click', this._triggerClickHandler.bind(this));\n triggerGroup.appendChild(trigger);\n }\n\n /**\n * @public\n * @returns {Object}\n */\n _getLocalStorageValue()\n {\n // Default values\n let resolution = '7D';\n let chartType = 'candlestick';\n\n const storedResolution = localStorage.getItem('chartSettingResolution');\n const storedChartType = localStorage.getItem('chartSettingChartType');\n\n if (storedResolution)\n {\n resolution = JSON.parse(localStorage.getItem('chartSettingResolution'));\n }\n\n if (storedChartType)\n {\n chartType = localStorage.getItem('chartSettingChartType');\n }\n\n return { resolution, chartType };\n }\n}\n","import StockPriceChart from './StockPriceChart';\nimport TriggersContainer from '../triggers/TriggersContainer';\n\nconst DEFAULT_TRIGGERS = ['resolution', 'type', 'action'];\nconst RESOLUTIONS = {\n INTRA: 'Today',\n '7D': '7D',\n '1M': '1M',\n '3M': '3M',\n '6M': '6M',\n YTD: 'YTD',\n '1Y': '1Y',\n '3Y': '3Y',\n '5Y': '5Y',\n};\n\nconst CHART_TYPES = {\n candlestick: 'Candlestick',\n area: 'Area',\n};\nconst DEFAULT_CHART_TYPE = 'candlestick';\nconst DEFAULT_RESOLUTION = 'INTRA';\n\nexport default class InteractiveStockPriceChart extends StockPriceChart\n{\n constructor(element, chartConfig)\n {\n super(element, chartConfig);\n this.setDefaultOptions({\n resolution: DEFAULT_RESOLUTION,\n chartType: DEFAULT_CHART_TYPE,\n });\n }\n\n _createTriggerContainer()\n {\n const triggersContainer = document.createElement('div');\n triggersContainer.className = 'triggers-container';\n return triggersContainer;\n }\n\n /**\n * @param {ChartResolution} resolution\n */\n onResolutionTriggerChange(resolution)\n {\n localStorage.setItem('chartSettingResolution', JSON.stringify(resolution));\n\n if (this.getResolution() === resolution) return;\n\n this.resetState();\n\n this.setResolution(resolution);\n\n this._dataReady = false; // Needs to fetch data\n }\n\n /**\n * @param {ChartType} chartType\n */\n onChartTypeTriggerChange(chartType)\n {\n localStorage.setItem('chartSettingChartType', chartType);\n if (this.getChartType() === chartType) return;\n\n this.setChartType(chartType);\n this._prepareData();\n this._needsRefresh = true;\n }\n\n _addResolutionTrigger()\n {\n const that = this;\n\n if (localStorage.getItem('chartSettingResolution'))\n {\n this._chartConfig.resolution = JSON.parse(localStorage.getItem('chartSettingResolution'));\n }\n const options = Object.keys(RESOLUTIONS).map((key) => ({\n value: key,\n text: that.getChartText(RESOLUTIONS[key]),\n fullText: this.getChartText(this._mapResolutionToText(RESOLUTIONS[key])),\n active: key === this.getResolution(),\n }));\n\n const callback = (e) =>\n {\n const val = e.srcElement.dataset.value;\n this.onResolutionTriggerChange(val);\n };\n\n this._triggers.addTriggerGroup('resolution', options, callback, this.getChartInfo().responsive);\n\n }\n\n _addChartTypeTrigger()\n {\n if (localStorage.getItem('chartSettingChartType'))\n {\n this._chartConfig.chartType = localStorage.getItem('chartSettingChartType');\n }\n\n const options = Object.keys(CHART_TYPES).map((key) => ({\n value: key,\n text: CHART_TYPES[key],\n type: 'icon',\n active: key === this.getChartType(),\n }));\n\n const callback = (e) =>\n {\n const val = e.srcElement.dataset.value;\n this.onChartTypeTriggerChange(val);\n };\n\n this._triggers.addTriggerGroup('type', options, callback, this.getChartInfo().responsive);\n\n }\n\n _mapResolutionToText(resolution)\n {\n switch (resolution)\n {\n case '7D':\n return '1 Week';\n case '1M':\n return '1 Month';\n case '3M':\n return '3 Months';\n case '6M':\n return '6 Months';\n case '1Y':\n return '1 Year';\n case '3Y':\n return '3 Years';\n case '5Y':\n return '5 Years';\n case 'YTD':\n return 'Year to Date';\n default:\n return resolution;\n }\n }\n\n renderHeader()\n {\n if (!this._headerContainer) return;\n\n const {\n customTitle, quoteLink, urls, crypto = null,\n } = this.getChartInfo();\n const { isCryptocurrency } = this.getQuoteInfo();\n this.titleEl = this.createTitleEl(customTitle, quoteLink);\n this.titleEl = this.createTitleEl();\n if (this.titleEl)\n {\n this._headerContainer.appendChild(this.titleEl);\n const lineBreak = document.createElement('br');\n this._headerContainer.appendChild(lineBreak);\n }\n\n this._triggerContainer = this._createTriggerContainer();\n this._headerContainer.appendChild(this._triggerContainer);\n\n this._triggers = new TriggersContainer(this._triggerContainer, this._chartId);\n\n const triggersConfig = this.getChartInfo().triggers ? this.getChartInfo().triggers.split(',') : DEFAULT_TRIGGERS;\n\n if (triggersConfig.indexOf('resolution') !== -1)\n {\n this._addResolutionTrigger();\n }\n\n if (triggersConfig.indexOf('type') !== -1)\n {\n this._addChartTypeTrigger();\n }\n\n // Don't render advanced chart button if responsive or if not specified in triggers\n if (triggersConfig.indexOf('action') !== -1 && !this.getChartInfo().responsive)\n {\n if (isCryptocurrency)\n {\n this.renderCornerButton(this.getChartText('Advanced chart'), crypto.urlStreaming, 'chart-button-advanced');\n }\n else\n {\n this.renderCornerButton(this.getChartText('Advanced chart'), urls.streaming, 'chart-button-advanced');\n }\n }\n }\n\n updateChart(chartSettings)\n {\n this._chart.update(chartSettings, true, true);\n }\n}\n","import { BASE_ENDPOINT, getData } from './ApiWrapper';\n\n/**\n * @param {GetFinancialsDataRequest} params\n * @returns {Promise|null}\n */\nconst getFinancialsData = async (params) => getData(`${BASE_ENDPOINT}/Financials`, 'GET', { params });\n\nexport default getFinancialsData;\n\n/** * TYPE DEFINITIONS ** */\n\n/**\n * @typedef {{\n* count: number;\n* interval: number[];\n* titles: string[];\n* revenue?: number[];\n* op_income?: number[];\n* net_income?: number[];\n* assets?: number[];\n* liabilities?: number[];\n* equity?: number[];\n* operating?: number[];\n* investing?: number[];\n* financing?: number[];\n* }} FinancialsData\n*/\n\n/**\n * @typedef {{\n * symbol: string;\n * period: string;\n * amount: number;\n * values: string[];\n * }} GetFinancialsDataRequest\n */\n\n/**\n * @typedef {{\n * data: FinancialsData\n * request: GetFinancialsDataRequest\n * }} GetFinancialsDataResult\n */\n","/* global Highcharts */\nimport getFinancialsData from '../api/FinancialsData';\nimport GetDefaultSettings from '../lib/ChartSettings';\nimport TriggersContainer from '../triggers/TriggersContainer';\nimport { BaseChart } from './BaseChart';\n\nconst PERIODS = {\n annual: 'Annual',\n quarterly: 'Quarterly',\n};\n\nconst DEFAULT_PERIOD = 'annual';\nconst DEFAULT_LOOKBACK_YEARS = 5;\nconst DEFAULT_LOOKBACK_QUARTERS = 4;\n\nexport default class CompanyFinancialsChart extends BaseChart\n{\n /**\n * @param {HTMLElement} element\n */\n constructor(element, chartConfig)\n {\n super(element, chartConfig);\n\n /** @type {GetFinancialsData | null} */\n this._data = null;\n }\n\n getSymbol()\n {\n return this._chartConfig.symbol;\n }\n\n getPeriod()\n {\n return this.getChartInfo().period || DEFAULT_PERIOD;\n }\n\n setPeriod(period)\n {\n if (this.getPeriod() === period) return;\n\n this._chartConfig.chartInfo = {\n ...this.getChartInfo(),\n period,\n };\n\n this._dataReady = false;\n }\n\n getLookbackYears()\n {\n return this.getChartInfo().lookbackYears || DEFAULT_LOOKBACK_YEARS;\n }\n\n getLookbackQuarters()\n {\n return this.getChartInfo().lookbackQuarters || DEFAULT_LOOKBACK_QUARTERS;\n }\n\n getValues()\n {\n return this.getChartInfo().values || ['revenue', 'op_income', 'net_income'];\n }\n\n renderHeader()\n {\n const that = this;\n const chartInfo = this.getChartInfo();\n if (!chartInfo.header) return;\n const headerChart = chartInfo.headerChart ? chartInfo.headerChart : null;\n\n const { symbolDisplayName } = this.getQuoteInfo();\n const { urls } = chartInfo;\n if (headerChart)\n {\n this.setChartTitle(headerChart);\n }\n else\n {\n this.setChartTitle(`${symbolDisplayName} ${this.translationService.getChartTranslations().financials}`);\n }\n\n if (!this.isEmbed())\n {\n this.renderCornerButton(this.translationService.getChartTranslations().financials, urls.financials, 'delight-more-button');\n }\n\n const lineBreak = document.createElement('br');\n this._headerContainer.appendChild(lineBreak);\n\n this._triggerContainer = this._createTriggerContainer();\n this._headerContainer.appendChild(this._triggerContainer);\n\n this._triggers = new TriggersContainer(this._triggerContainer, this._chartId, { className: 'tabbed-triggers' });\n\n const options = Object.keys(PERIODS).map((value) =>\n {\n const enabled = value === 'annual' || this.getQuoteInfo().isAnnualMarket;\n return {\n value,\n text: that.getChartText(PERIODS[value]),\n active: value === DEFAULT_PERIOD,\n enabled,\n };\n });\n this._triggers.addTriggerGroup('period', options, (e) =>\n {\n const val = e.srcElement.dataset.value;\n this.setPeriod(val);\n });\n\n }\n\n _createTriggerContainer()\n {\n const triggersContainer = document.createElement('div');\n triggersContainer.className = 'triggers-container';\n return triggersContainer;\n }\n\n renderChart(chartSettings)\n {\n this._chart = Highcharts.chart(this._chartContainer, chartSettings);\n }\n\n async loadData()\n {\n this._data = await getFinancialsData({\n symbol: this.getSymbol(),\n period: this.getPeriod(),\n amount: this.getPeriod() === 'annual' ? this.getLookbackYears() : this.getLookbackQuarters(),\n values: this.getValues(),\n });\n\n this._dataReady = true;\n }\n\n /**\n * @returns {Highcharts.Options}\n */\n getChartSettings()\n {\n const that = this;\n\n const chartSettings = GetDefaultSettings({\n type: 'column',\n exporting: this.getChartInfo().export,\n locale: this.getChartLocale(),\n });\n\n // X Axis\n chartSettings.xAxis.categories = this._data.intervals;\n\n const formatter = this._formatter;\n\n // eslint-disable-next-line func-names\n const numberFormatter = function (value)\n {\n return formatter.formatNumber(value, formatter, {\n abbreviated: true,\n });\n };\n\n chartSettings.chart.numberFormatter = (value) => numberFormatter(value);\n\n chartSettings.yAxis[0] = {\n ...chartSettings.yAxis[0],\n labels: {\n formatter()\n {\n return numberFormatter(this.value);\n },\n },\n };\n\n this.getValues().forEach((value) =>\n {\n const title = that.getChartText(this._data.titles[value]);\n\n chartSettings.series.push({\n name: title,\n className: 'series-financials',\n colorIndex: `fun-${value}`,\n data: this._data[value],\n });\n });\n\n return chartSettings;\n }\n}\n","import StockPriceChart from './StockPriceChart';\n\nexport default class MonitoringChart extends StockPriceChart\n{\n renderHeader()\n {\n const info = this.getQuoteInfo();\n this.setChartTitle(`${info.symbolCompanyName} (${info.symbolDisplayName})`);\n\n const { realtimeEntitlement } = this._chartConfig;\n const statusDiv = document.createElement('div');\n statusDiv.classList.add('chart-status');\n statusDiv.classList.add('chart-container-btn');\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add(realtimeEntitlement ? 'dot-real-time' : 'dot-delayed');\n statusSpan.innerText = realtimeEntitlement ? 'Real-time' : 'Delayed';\n statusDiv.appendChild(statusSpan);\n\n this._headerContainer.appendChild(statusDiv);\n }\n}\n","/* global Highcharts */\n/* global moment */\nimport getPriceHistory from '../api/PriceHistory';\nimport GetDefaultSettings from '../lib/ChartSettings';\nimport {\n getSeriesTimeInterval,\n} from '../lib/helpers';\nimport StockPriceChart from './StockPriceChart';\n\nconst DEFAULT_CHART_TYPE = 'line';\nconst DEFAULT_RESOLUTION = 'INTRA';\n\nexport default class MiniStockPriceChart extends StockPriceChart\n{\n /**\n * @param {HTMLElement} element\n */\n constructor(element, chartConfig)\n {\n super(element, chartConfig);\n this.setDefaultOptions({\n resolution: DEFAULT_RESOLUTION,\n chartType: DEFAULT_CHART_TYPE,\n });\n }\n\n renderHeader()\n {\n const { quoteLink } = this.getChartInfo();\n const { symbolCompanyName } = this.getQuoteInfo();\n const titleEl = this.createTitleEl(symbolCompanyName, quoteLink);\n\n if (titleEl)\n {\n this._headerContainer.appendChild(titleEl);\n }\n\n const streamingPriceEl = this.createStreamingPriceEl();\n this._chartContainer.appendChild(streamingPriceEl);\n if (this.getChartInfo().streaming)\n {\n this.listenToPriceChanges(streamingPriceEl);\n }\n }\n\n renderChart(chartSettings)\n {\n const innerContainer = document.createElement('div');\n innerContainer.className = 'chart-inner-box';\n this._chartContainer.appendChild(innerContainer);\n\n this._chart = Highcharts.stockChart(innerContainer, chartSettings);\n }\n\n async loadData()\n {\n const { toTimestamp } = this.getChartInfo();\n const clientTo = toTimestamp || Math.round(moment.utc().valueOf() / 1000);\n const data = await getPriceHistory({\n symbol: this.getSymbol(),\n frequency: this.getFrequency(),\n resolution: this.getResolution(),\n to: clientTo,\n volume: false,\n afterhours: true,\n });\n this._history = data;\n this._prepareData();\n\n this._dataReady = true;\n }\n\n _prepareData()\n {\n const dataSeries = [];\n\n if (!this._history.t)\n {\n throw new Error('No data');\n }\n const count = this._history.t.length;\n for (let i = 0; i < count; i++)\n {\n dataSeries.push([\n this._history.t[i] * 1000,\n this._history.c[i],\n ]);\n }\n\n this._getXRange();\n this._getYRange();\n this.dataSeries = dataSeries;\n }\n\n /**\n * @returns {Highcharts.Options}\n */\n getChartSettings()\n {\n const { dataSeries } = this;\n\n const { yesterdayClosePrice, priceChange } = this.getQuoteInfo();\n\n const chartSettings = GetDefaultSettings({\n type: this.getChartType(),\n spacing: [0, 0, 0, 0],\n locale: this.getChartLocale(),\n });\n\n // X Axis\n chartSettings.xAxis = {\n ...chartSettings.xAxis,\n ...this._xRange,\n title: {\n enabled: false,\n },\n labels: {\n enabled: false,\n },\n crosshair: false,\n plotBands: this.getPlotBands(),\n };\n\n // Y Axis\n chartSettings.yAxis[0] = {\n ...chartSettings.yAxis[0],\n ...this._yRange,\n plotLines: [{\n value: yesterdayClosePrice,\n className: 'plot-line-yesterday-close',\n }],\n labels: {\n enabled: false,\n },\n };\n\n chartSettings.tooltip = {\n enabled: false,\n };\n\n const { symbolDisplayName: name } = this.getQuoteInfo();\n chartSettings.series.push({\n id: 'main_symbol',\n className: this.getPriceTrendClass(priceChange),\n name,\n yAxis: 0,\n data: dataSeries,\n pointInterval: getSeriesTimeInterval(dataSeries),\n states: {\n hover: {\n enabled: false,\n },\n },\n });\n\n return chartSettings;\n }\n}\n","/* global Highcharts */\nimport StockPriceChart from './StockPriceChart';\nimport { DATE_HOUR_COMPACT_FORMAT } from './BaseChart';\n\nconst DEFAULT_CHART_TYPE = 'area';\nconst DEFAULT_RESOLUTION = 'INTRA';\nexport default class CommoditiesChart extends StockPriceChart\n{\n /**\n * @param {HTMLElement} element\n */\n constructor(element, chartConfig)\n {\n super(element, chartConfig);\n this._priceEl = null;\n this.setDefaultOptions({\n chartType: DEFAULT_CHART_TYPE,\n resolution: DEFAULT_RESOLUTION,\n volume: false,\n animation: false,\n marginTop: 5,\n timezone: 'UTC',\n });\n }\n\n renderHeader()\n {\n const { symbolDisplayName } = this.getQuoteInfo();\n const { customTitle, quoteLink } = this.getChartInfo();\n const titleEl = document.createElement('div');\n titleEl.className = 'chart-title-container';\n\n const mainTitleEl = document.createElement('a');\n mainTitleEl.href = quoteLink;\n mainTitleEl.className = 'chart-title';\n mainTitleEl.innerText = `${customTitle}`;\n titleEl.appendChild(mainTitleEl);\n\n const subtitleEl = document.createElement('div');\n subtitleEl.className = 'chart-subtitle';\n subtitleEl.innerText = `${symbolDisplayName}`;\n titleEl.appendChild(subtitleEl);\n\n this._headerContainer.appendChild(titleEl);\n }\n\n renderChart(chartSettings)\n {\n const streamingPriceEl = this.createStreamingPriceEl();\n this._headerContainer.appendChild(streamingPriceEl);\n\n if (this.getChartInfo().streaming)\n {\n this.listenToPriceChanges(streamingPriceEl);\n }\n\n super.renderChart(chartSettings);\n }\n\n getChartSettings()\n {\n const that = this;\n const formatter = this._formatter;\n const settings = super.getChartSettings();\n settings.tooltip = {\n ...settings.tooltip,\n formatter()\n {\n const { point } = this;\n const textDate = that.getChartText('Date');\n const textPrice = that.getChartText('Price');\n return `\n ${that.formatTooltipLine(textDate, Highcharts.dateFormat(DATE_HOUR_COMPACT_FORMAT, point.x), 'tooltip-value')}\n ${that.formatTooltipLine(textPrice, `${formatter.formatPrice(point.y)}`, 'tooltip-value')}\n `;\n },\n\n };\n return settings;\n }\n}\n","/* global Highcharts */\n/* global moment */\nimport { BaseChart, TIME_FORMAT } from './BaseChart';\nimport GetDefaultSettings from '../lib/ChartSettings';\nimport getPriceHistory from '../api/PriceHistory';\n\nconst DEFAULT_FREQUENCY = 5;\nconst DEFAULT_RESOLUTION = 'INTRA';\n\nexport default class ForexMultiRatesChart extends BaseChart\n{\n constructor(element, chartConfig)\n {\n super(element, chartConfig);\n this._refresh = false;\n this._addDataState = false;\n this._dataSeries = [];\n this._symbolToLoad = [];\n\n this.setDefaultOptions();\n this._initializeCTrendButton();\n this._initializeCursorButton();\n this._initializeList();\n }\n\n setDefaultOptions(defaultOptions = {\n resolution: 'INTRA',\n chartType: 'line',\n volume: false,\n })\n {\n this._defaultOptions = defaultOptions;\n }\n\n getChartSettings()\n {\n const chartSettings = GetDefaultSettings({\n timezone: this._locale.getTimezone(),\n locale: this.getChartLocale(),\n });\n\n chartSettings.tooltip = {\n ...chartSettings.tooltip,\n split: true,\n formatter()\n {\n const time = Highcharts.dateFormat(TIME_FORMAT, this.x);\n return [`${time}`].concat(\n\n this.points\n ? this.points.map((p) => `${p.series.name}`) : [],\n );\n },\n };\n\n chartSettings.chart = {\n zooming: {\n mouseWheel: false,\n },\n spacing: [10, 24, 10, 24],\n };\n\n chartSettings.plotOptions = {\n series: {\n lineWidth: 1,\n states: {\n hover: {\n enabled: false,\n },\n },\n },\n };\n\n chartSettings.xAxis = {\n ...chartSettings.xAxis,\n plotBands: [],\n labels: {\n style: {\n fontSize: '12px',\n },\n },\n lineColor: '#F18D13',\n };\n\n if (!this._refresh)\n {\n chartSettings.yAxis = this._generate_yAxis();\n chartSettings.series = this._generate_series();\n }\n\n return chartSettings;\n }\n\n async loadData()\n {\n const info = this._addDataState === true ? this._symbolToLoad : this.getQuoteInfo();\n const { toTimestamp } = this.getChartInfo();\n const clientTo = toTimestamp || Math.round(moment.utc().valueOf() / 1000);\n\n for (let i = 0; i < info.length; i++)\n {\n // eslint-disable-next-line no-await-in-loop\n const data = await getPriceHistory({\n symbol: info[i].feedSymbol,\n frequency: DEFAULT_FREQUENCY,\n resolution: DEFAULT_RESOLUTION,\n to: clientTo,\n volume: false,\n afterhours: true,\n });\n\n this._prepareData(info[i], data);\n }\n this._dataReady = true;\n }\n\n async addSymbol(symbol, name, color)\n {\n if (!this._updateSymbol(name, true))\n {\n this._addDataState = true;\n this._symbolToLoad = [\n {\n feedSymbol: symbol,\n symbolName: name,\n symbolColor: color,\n },\n ];\n\n await this.loadData();\n const chartSettings = this.getChartSettings();\n\n chartSettings.series = this._generate_series();\n chartSettings.yAxis = this._generate_yAxis();\n this.updateChart(chartSettings);\n this._addDataState = false;\n this._renderCTrendAreas();\n }\n }\n\n removeSymbol(symbol, name)\n {\n this._updateSymbol(name, false);\n }\n\n renderChart(chartSettings)\n {\n this._chart = Highcharts.stockChart(this._chartContainer, chartSettings);\n }\n\n _findFirstActive()\n {\n const span = document.querySelector('.checkbox-wrapper.checklist-item span.checked');\n\n return span.getAttribute('data-value');\n\n }\n\n _generate_yAxis()\n {\n const activeSymbol = this._findFirstActive();\n return this._dataSeries.map((item) =>\n {\n const yAxisData = {\n opposite: false,\n gridLineDashStyle: 'longdash',\n tickAmount: 8,\n crosshair: {\n width: 1,\n dashStyle: 'LongDash',\n color: item.color,\n label: {\n enabled: true,\n style: {\n fontSize: '12px',\n },\n },\n },\n labels: {\n style: {\n fontSize: '12px',\n },\n zIndex: 1,\n },\n scrollbar: {\n enabled: false,\n },\n visible: item.feedSymbol === activeSymbol,\n };\n\n return yAxisData;\n });\n }\n\n _generate_series()\n {\n return this._dataSeries.map((item, index) => ({\n yAxis: index,\n name: item.name,\n data: item.data,\n color: item.color,\n }));\n }\n\n _updateSymbol(symbol, status)\n {\n const chartSettings = this.getChartSettings();\n const index = chartSettings.series.findIndex((series) => series.name === symbol);\n\n if (index !== -1)\n {\n chartSettings.series[index].visible = status;\n this.updateChart(chartSettings);\n\n if (status === true)\n {\n this._renderCTrendAreas();\n }\n\n return true;\n }\n\n return false;\n }\n\n _prepareData(symbol, data)\n {\n if (!data.t || data.t.length === 0)\n {\n throw new Error('No data');\n }\n\n const dataSymbol = data.t.map((timestamp, i) => [timestamp * 1000, data.c[i]]);\n\n this._dataSeries.push({\n data: dataSymbol,\n name: symbol.symbolName,\n color: symbol.symbolColor,\n feedSymbol: symbol.feedSymbol,\n });\n }\n\n _initializeCTrendButton()\n {\n const that = this;\n const btn = document.getElementById('c-trend-button');\n if (btn)\n {\n btn.addEventListener('click', () =>\n {\n const checkbox = btn.querySelector('.checkbox');\n checkbox.classList.toggle('checked');\n that._renderCTrendAreas();\n });\n }\n }\n\n _renderCTrendAreas()\n {\n const that = this;\n const btn = document.getElementById('c-trend-button');\n if (btn)\n {\n const checkbox = btn.querySelector('.checkbox');\n const paths = that._chartContainer.querySelectorAll('.highcharts-series.highcharts-line-series');\n paths.forEach((item) =>\n {\n const path = item.querySelector('path');\n if (path)\n {\n if (checkbox.classList.contains('checked'))\n {\n const color = path.getAttribute('stroke');\n path.style.fill = color;\n path.style.fillOpacity = 0.5;\n }\n else\n {\n path.style.fill = 'transparent';\n }\n }\n });\n }\n }\n\n _initializeCursorButton()\n {\n const that = this;\n const btn = document.getElementById('cursor-button');\n\n if (btn)\n {\n btn.addEventListener('click', () =>\n {\n const checkbox = btn.querySelector('.checkbox');\n checkbox.classList.toggle('checked');\n\n const chartSettings = that.getChartSettings();\n chartSettings.plotOptions.series.enableMouseTracking = checkbox.classList.contains('checked');\n that.updateChart(chartSettings);\n });\n }\n }\n\n _initializeList()\n {\n const that = this;\n const list = document.querySelectorAll('.checkbox-wrapper.checklist-item');\n\n if (list)\n {\n list.forEach((item) =>\n {\n item.addEventListener('click', () =>\n {\n const checkbox = item.querySelector('span.checkbox');\n const s = checkbox.getAttribute('data-value');\n const n = checkbox.getAttribute('data-name');\n const c = checkbox.getAttribute('data-color');\n checkbox.classList.toggle('checked');\n\n if (checkbox.classList.contains('checked'))\n {\n that.addSymbol(s, n, c);\n }\n else\n {\n that.removeSymbol(s, n);\n }\n\n that._updatePlaceholder();\n });\n });\n }\n }\n\n _updatePlaceholder()\n {\n const list = document.querySelectorAll('.checkbox-wrapper.checklist-item .checkbox.checked');\n const placeholder = document.querySelector('.forex-cross-rate-chart .checkbox-marker-input');\n let names = '';\n list.forEach((item) =>\n {\n names += `${item.getAttribute('data-name')}`;\n });\n placeholder.innerHTML = names;\n }\n}\n","/* global moment */\nimport InteractiveStockPriceChart from './InteractiveStockPriceChart';\nimport getPriceHistory from '../api/PriceHistory';\nimport { DATE_FORMAT, DATE_HOUR_FORMAT } from './BaseChart';\n\nconst INTERVAL = 5000;\n\nexport default class StreamingStockPriceChart extends InteractiveStockPriceChart\n{\n constructor(element, chartConfig)\n {\n super(element, chartConfig);\n this._chartConfig = chartConfig;\n this._setInterval = false;\n this._interval = null;\n this.lastUpdatedPrice = 0;\n this.lastUpdatedTime = 0;\n this.isMarketOpen = false;\n this.lastUpdatedVolume = 0;\n this.candle = {\n tmp: {},\n data: {},\n };\n this.volume = {\n lastUpdatedBuyVolume: '0',\n lastUpdatedSellVolume: '0',\n lastUpdatedUnknownVolume: '0',\n };\n this.min = 0;\n\n this.startAtRoundedMinute();\n }\n\n hasIndicators()\n {\n return !this.isEmbed();\n }\n\n startAtRoundedMinute()\n {\n const now = new Date();\n const secondsToNextMinute = 59 - now.getSeconds();\n const millisecondsToNextMinute = secondsToNextMinute * 1000;\n const that = this;\n\n setTimeout(() =>\n {\n that._setVolume();\n that.candle.data = that.candle.tmp;\n setInterval(() =>\n {\n that._setVolume();\n that.candle.data = that.candle.tmp;\n that._renderStream();\n }, 60000); // 60,000 milliseconds = 1 minute\n }, millisecondsToNextMinute);\n }\n\n _setVolume()\n {\n this.volume.buy = this.volume.lastUpdatedBuyVolume ? this.volume.lastUpdatedBuyVolume : '0';\n this.volume.sell = this.volume.lastUpdatedSellVolume ? this.volume.lastUpdatedSellVolume : '0';\n this.volume.unknown = this.volume.lastUpdatedUnknownVolume ? this.volume.lastUpdatedUnknownVolume : '0';\n }\n\n setPrice(content, type)\n {\n content = Number(parseFloat(content).toFixed(4));\n switch (type)\n {\n case 'open':\n this.candle.tmp.open = content;\n break;\n case 'high':\n this.candle.tmp.high = content;\n break;\n case 'low':\n this.candle.tmp.low = content;\n break;\n case 'close':\n this.candle.tmp.close = content;\n break;\n }\n }\n\n setBuyVolume(content)\n {\n this.volume.lastUpdatedBuyVolume = content;\n }\n\n setSellVolume(content)\n {\n this.volume.lastUpdatedSellVolume = content;\n }\n\n setUnknownVolume(content)\n {\n this.volume.lastUpdatedUnknownVolume = content;\n }\n\n getMinute()\n {\n switch (this.getResolution())\n {\n case '7D':\n case 'INTRA':\n const date = new Date();\n const minutes = date.getMinutes();\n const roundedMinutes = Math.floor(minutes);\n date.setMinutes(roundedMinutes, 0, 0);\n return date.getTime();\n default:\n return this._dataSeries[this._dataSeries.length - 1][0];\n }\n }\n\n _renderStream()\n {\n const time = this.getMinute();\n\n if ((!this.isMarketOpen && !this.marketHours)\n || (this.marketHours && (time < this.marketHours.premarket_open * 1000 || time > this.marketHours.afterhours_close * 1000))) return;\n\n this._updateData(time);\n this._updateVolume(time);\n }\n\n _updateData(time)\n {\n if (!this._chart.series) return;\n\n let lastHistoryData = this._dataSeries[this._dataSeries.length - 1];\n\n if (lastHistoryData[0] !== time)\n {\n // create new record\n const c = lastHistoryData[4];\n this._dataSeries.push([time, c, c, c, c]);\n this.candle.data = {};\n this._refreshYaxisRange(c);\n }\n else\n {\n const h = this.candle.data.high ? this.candle.data.high : this.candle.tmp.high;\n const l = this.candle.data.low ? this.candle.data.low : this.candle.tmp.low;\n const c = this.candle.data.close ? this.candle.data.close : this.candle.tmp.close;\n\n // update record\n lastHistoryData = [lastHistoryData[0], lastHistoryData[1], h, l, c];\n this._dataSeries[this._dataSeries.length - 1] = lastHistoryData;\n this._refreshYaxisRange(c);\n }\n this._chart.series[0].setData(this._dataSeries);\n }\n\n _updateVolume(time)\n {\n if (!this.isVolumeAvailable() || !this._chart.series) return;\n\n const lastHistoryVolume = this._volumeSeries[this._volumeSeries.length - 1];\n const buyVolume = this.volume.buy ? Number(this.volume.buy.replace(',', '')) : Number(this.volume.lastUpdatedBuyVolume.replace(',', ''));\n const sellVolume = this.volume.sell ? Number(this.volume.sell.replace(',', '')) : Number(this.volume.lastUpdatedSellVolume.replace(',', ''));\n const unknownVolume = this.volume.unknown ? Number(this.volume.unknown.replace(',', '')) : Number(this.volume.lastUpdatedUnknownVolume.replace(',', ''));\n const volumeBarClassName = buyVolume > sellVolume ? 'custom-volume-up' : 'custom-volume-down';\n\n if (lastHistoryVolume.x !== time)\n {\n // create new record\n this._volumeSeries.push({\n x: time,\n y: 0,\n className: volumeBarClassName,\n });\n\n this.volume.buy = 0;\n this.volume.sell = 0;\n this.volume.unknown = 0;\n }\n else\n {\n // update record\n lastHistoryVolume.y = buyVolume + sellVolume + unknownVolume;\n lastHistoryVolume.className = volumeBarClassName;\n this._volumeSeries[this._volumeSeries.length - 1] = lastHistoryVolume;\n }\n this._chart.series[1].setData(this._volumeSeries);\n }\n\n renderHeader()\n {\n super.renderHeader();\n\n const triggersConfig = this.getChartInfo().triggers ? this.getChartInfo().triggers.split(',') : null;\n\n if (triggersConfig.indexOf('streaming') !== -1)\n {\n this._addStreamingHeader();\n }\n }\n\n _loadFrequencyForStreaming()\n {\n switch (this.getResolution())\n {\n case '7D':\n const { isCryptocurrency } = this.getQuoteInfo();\n return isCryptocurrency ? 60 : 15;\n case 'INTRA':\n return 5;\n case '1M':\n return 60;\n default:\n return 'DAILY';\n }\n }\n\n async loadData()\n {\n this.min = 0;\n const resolution = this.getResolution();\n // const frequency = this._loadFrequencyForStreaming();\n const frequency = this.getFrequency();\n const { toTimestamp } = this.getChartInfo();\n const clientTo = toTimestamp || Math.round(moment.utc().valueOf() / 1000);\n const data = await getPriceHistory({\n symbol: this.getSymbol(),\n frequency,\n resolution,\n to: clientTo,\n volume: true,\n afterhours: this._isIntraDay(),\n indicators: this.hasIndicators(),\n });\n this._history = data;\n this._prepareData();\n this._dataReady = true;\n }\n\n _prepareData()\n {\n if (this._isEmptyCS)\n {\n this.prepareDataForEmptyCS();\n return;\n }\n const dataSeries = [];\n const volumeSeries = [];\n const { marketHours, from } = this._history;\n const { premarket_open: premarketOpen } = marketHours || {};\n\n if (!this._history.t)\n {\n throw new Error('No data');\n }\n\n const count = this._history.t.length;\n for (let i = 0; i < count; i++)\n {\n if (!this.min && from < this._history.t[i])\n {\n this.min = this._history.t[i];\n }\n\n if (!premarketOpen || this._history.t[i] >= premarketOpen)\n {\n const timestamp = this._history.t[i] * 1000;\n\n if (this.getChartType() === 'candlestick')\n {\n dataSeries.push([\n timestamp,\n this._history.o[i],\n this._history.h[i],\n this._history.l[i],\n this._history.c[i],\n ]);\n }\n else if (this.getChartType() === 'hlc')\n {\n dataSeries.push([\n timestamp,\n this._history.h[i],\n this._history.l[i],\n this._history.c[i],\n ]);\n }\n else\n {\n dataSeries.push([\n timestamp,\n this._history.c[i],\n ]);\n }\n\n // If close is greater than open, the bar is positive\n const closePrice = parseFloat(this._history.c[i]);\n const openPrice = parseFloat(this._history.o[i]);\n const volumeBarClassName = closePrice > openPrice ? 'custom-volume-up' : 'custom-volume-down';\n\n volumeSeries.push({\n x: timestamp,\n y: this._history.v[i],\n className: volumeBarClassName,\n });\n }\n }\n this._getXRange();\n this._getYRange();\n\n this._dataSeries = dataSeries;\n this._volumeSeries = volumeSeries;\n }\n\n _getYRange()\n {\n this._yRange = {\n min: Infinity,\n max: -Infinity,\n };\n\n const { from } = this._history;\n const count = this._history.t.length;\n for (let i = 0; i < count; i++)\n {\n if (from < this._history.t[i])\n {\n if (this._history.c[i] < this._yRange.min)\n {\n this._yRange.min = this._history.c[i];\n }\n if (this._history.c[i] > this._yRange.max)\n {\n this._yRange.max = this._history.c[i];\n }\n }\n }\n\n const { yesterdayClosePrice } = this.getQuoteInfo();\n if (yesterdayClosePrice < this._yRange.min)\n {\n this._yRange.min = yesterdayClosePrice;\n }\n if (yesterdayClosePrice > this._yRange.max)\n {\n this._yRange.max = yesterdayClosePrice;\n }\n }\n\n getChartSettings()\n {\n const that = this;\n const formatter = this._formatter;\n that.isMarketOpen = this.getQuoteInfo().isMarketOpen;\n this.marketHours = this._history.marketHours;\n\n this._chartSettings = super.getChartSettings();\n\n this._chartSettings.xAxis.min = this.min * 1000;\n delete this._chartSettings.xAxis.max;\n\n const yAxisLabelX = this.hasIndicators() ? 50 : 40;\n this._chartSettings.yAxis[0] = {\n ...this._chartSettings.yAxis[0],\n labels: { x: yAxisLabelX, y: 3 },\n };\n\n this._chartSettings.chart = {\n ...this._chartSettings.chart,\n spacingRight: 40,\n };\n\n this._chartSettings.plotOptions = {\n ...this._chartSettings.plotOptions,\n series: {\n turboThreshold: 0,\n dataGrouping: this._getDataGrouping(),\n },\n };\n\n const { type } = this.getQuoteInfo();\n\n this._chartSettings.tooltip = {\n ...that._chartSettings.tooltip,\n formatter()\n {\n const { point } = this;\n const volumeAvailable = that.isVolumeAvailable();\n const indicatorStartIndex = volumeAvailable ? 2 : 1;\n const volPoint = volumeAvailable ? this.points[1] : null;\n const macdPoint = this.points[indicatorStartIndex];\n const rsiPoint = this.points[indicatorStartIndex + 1];\n const { name: seriesName, points } = point.series;\n const avgInterval = (points[points.length - 1].x - points[0].x) / points.length;\n const avgDurationDays = avgInterval / (1000 * 60 * 60);\n const dateFormatString = avgDurationDays >= 23 ? DATE_FORMAT : DATE_HOUR_FORMAT;\n\n const priceText = point.open ? `\n ${that.formatTooltipLine(that.getChartText('Open'), `${formatter.formatPrice(point.open)}`, 'tooltip-value')}\n ${that.formatTooltipLine(that.getChartText('High'), `${formatter.formatPrice(point.high)}`, 'tooltip-value')}\n ${that.formatTooltipLine(that.getChartText('Low'), `${formatter.formatPrice(point.low)}`, 'tooltip-value')}\n ${that.formatTooltipLine(that.getChartText('Close'), `${formatter.formatPrice(point.close)}`, 'tooltip-value')}\n ` : `\n ${that.formatTooltipLine(that.getChartText('Price'), `${formatter.formatPrice(point.y)}`, 'tooltip-value')}\n `;\n\n const volText = volPoint ? `\n ${that.formatTooltipLine(that.getChartText('Volume'), formatter.formatAbbreviated(volPoint.y, type), 'tooltip-value')}\n ` : '';\n\n const macdText = macdPoint ? `\n
MACD:
\n ${that.formatTooltipLine(that.getChartText('Value'), `${formatter.formatPrice(macdPoint.point.MACD)}`, 'tooltip-value')}\n ${that.formatTooltipLine(that.getChartText('Signal'), `${formatter.formatPrice(macdPoint.point.signal)}`, 'tooltip-value')}\n ${that.formatTooltipLine(that.getChartText('Histogram'), `${formatter.formatPrice(macdPoint.point.y)}`, 'tooltip-value')}\n ` : '';\n\n const rsiText = rsiPoint ? `\n
RSI:
\n ${that.formatTooltipLine(that.getChartText('Value'), `${formatter.formatPrice(rsiPoint.point.y)}`, 'tooltip-value')}\n ` : '';\n\n // Customize the tooltip content\n const tooltipText = `\n ${seriesName}
\n ${that.formatTooltipLine(that.getChartText('Date'), that.formatDate(point.x, that.getResolution(), dateFormatString), 'tooltip-value')}\n ${priceText}\n ${volText}\n ${macdText}\n ${rsiText}\n `;\n\n return tooltipText;\n },\n distance: 30,\n };\n\n this._chartSettings.chart.events = {\n load()\n {\n const chart = this;\n that.renderLabel(chart, true);\n const data = chart.series[0];\n const yData = data.yData[data.yData.length - 1];\n // const xData = data.xData[data.xData.length - 1];\n that.candle.tmp = {\n open: yData[0],\n high: yData[1],\n low: yData[2],\n close: yData[3],\n };\n\n if (!that._setInterval)\n {\n that._stream();\n that._setInterval = true;\n }\n },\n redraw()\n {\n const chart = this;\n that.renderLabel(chart, true);\n },\n };\n\n if (this.getChartInfo().responsive || ['line', 'area'].includes(this._chartSettings.chart.type))\n {\n this._chartSettings.tooltip = {\n ...this._chartSettings.tooltip,\n };\n }\n\n this._chartSeriesId = this._chartSettings.series[0].id;\n\n if (this.hasIndicators())\n {\n this._addIndicators(['macd', 'rsi']);\n }\n\n return this._chartSettings;\n }\n\n _getDataGrouping()\n {\n let units = null;\n const { isCryptocurrency } = this.getQuoteInfo();\n let freq = 0;\n switch (this.getResolution())\n {\n case 'INTRA':\n units = {\n forced: true,\n units: [\n [\n 'minute',\n [5, 10, 15],\n ],\n ],\n };\n break;\n case '7D':\n freq = isCryptocurrency ? ['hour', [1, 2]] : ['minute', [15, 30]];\n units = {\n forced: true,\n units: [freq],\n };\n break;\n case '1M':\n freq = isCryptocurrency ? 6 : 2;\n units = {\n forced: true,\n units: [\n [\n 'hour',\n [freq],\n ],\n ],\n };\n break;\n case 'YTD':\n units = {\n ...{\n enabled: true,\n forced: false,\n },\n units: [\n ['day', [1, 3, 5]],\n ['week', [2]],\n ['month', [1]],\n ],\n groupAll: true,\n approximation: 'end',\n };\n break;\n case '5Y':\n units = {\n ...{\n enabled: true,\n forced: false,\n },\n units: [\n ['month', [1]],\n ],\n groupAll: true,\n };\n break;\n }\n\n return units || {\n enabled: false,\n };\n }\n\n _addIndicators(indicators)\n {\n const volumeAvailable = this.isVolumeAvailable();\n let index = this._chartSettings.yAxis.length;\n const chartHeight = 60;\n const volumeHeight = !volumeAvailable ? 0 : 10;\n const spacing = 2;\n const indicatorHeight = (100 - chartHeight - volumeHeight - (spacing * indicators.length)) / indicators.length;\n this._chartSettings.yAxis[0].height = `${chartHeight}%`;\n if (volumeAvailable)\n {\n // adjust volume height and top positioning\n this._chartSettings.yAxis[1].top = `${chartHeight}%`;\n this._chartSettings.yAxis[1].height = `${volumeHeight}%`;\n }\n\n let top = chartHeight + spacing + volumeHeight;\n // eslint-disable-next-line guard-for-in,no-restricted-syntax\n for (const i in indicators)\n {\n const yAxisData = {\n labels: { x: 30, y: 3 },\n offset: 0,\n height: `${indicatorHeight}%`,\n top: `${top}%`,\n title: {\n text: indicators[i],\n x: 30,\n },\n };\n const seriesData = {\n type: indicators[i],\n yAxis: index,\n linkedTo: this._chartSeriesId,\n id: `indicator_${indicators[i]}`,\n visible: true,\n };\n\n switch (indicators[i])\n {\n case 'macd':\n seriesData.className = 'streaming-indicator-macd';\n break;\n case 'rsi':\n seriesData.className = 'streaming-indicator-rsi';\n let decimals = 4;\n if (this._dataSeries[0][1])\n {\n const dataSeries = this._dataSeries[0][1].toString().split('.');\n decimals = dataSeries.length === 1 ? 2 : dataSeries.length;\n }\n seriesData.params = {\n decimals,\n };\n break;\n }\n\n this._chartSettings.series.push(seriesData);\n this._chartSettings.yAxis[index] = yAxisData;\n index++;\n top += (indicatorHeight + spacing);\n }\n\n return this._chartSettings;\n }\n\n _addStreamingHeader()\n {\n const streamingPriceEl = super.createStreamingPriceEl();\n this._headerContainer.appendChild(streamingPriceEl);\n\n super.listenToPriceChanges(streamingPriceEl);\n }\n\n _stream()\n {\n const _this = this;\n // Set interval to 1 minute, and fetch data from CandleService\n _this._interval = setInterval(() =>\n {\n _this._renderStream();\n }, INTERVAL);\n }\n\n _refreshYaxisRange(c)\n {\n const { min, max } = this._chartSettings.yAxis[0];\n let updated = false;\n if (c > max)\n {\n this._chartSettings.yAxis[0].max = c;\n updated = true;\n }\n if (c < min)\n {\n this._chartSettings.yAxis[0].min = c;\n updated = true;\n }\n\n if (updated)\n {\n this.updateChart(this._chartSettings);\n this._needsRefresh = false;\n }\n }\n}\n","// eslint-disable-next-line import/no-extraneous-dependencies\nimport { kebabCase } from 'lodash';\nimport StockPriceChart from './charts/StockPriceChart';\nimport InteractiveStockPriceChart from './charts/InteractiveStockPriceChart';\nimport CompanyFinancialsChart from './charts/CompanyFinancialsChart';\nimport MonitoringChart from './charts/MonitoringChart';\nimport MiniStockPriceChart from './charts/MiniStockPriceChart';\nimport CommoditiesChart from './charts/CommoditiesChart';\nimport ForexMultiRatesChart from './charts/ForexMultiRatesChart';\nimport StreamingStockPriceChart from './charts/StreamingStockPriceChart';\n\n/**\n * @type Record\n */\nconst ChartConfigs = {\n InteractiveStockPriceChart,\n StockPriceChart,\n CompanyFinancialsChart,\n MonitoringChart,\n MiniStockPriceChart,\n CommoditiesChart,\n ForexMultiRatesChart,\n StreamingStockPriceChart,\n};\n\nexport default class ChartsManager\n{\n constructor()\n {\n /** @type {Object} */\n this._charts = {};\n this._chartLoading = [];\n }\n\n addChartByElement(chartElement)\n {\n const chartId = chartElement.id;\n const chartConfig = atob(chartElement.dataset.config);\n this.addChart(chartId, JSON.parse(chartConfig));\n }\n\n /**\n * @param {string} chartId\n * @param {ChartConfig} chartConfig\n * @returns {void}\n */\n addChart(chartId, chartConfig)\n {\n const chartElement = document.getElementById(chartId);\n if (!chartElement)\n {\n console.error(`Chart container not found: ${chartId}`);\n return;\n }\n\n if (!chartConfig)\n {\n console.error(`Chart config not provided: ${chartConfig}`);\n return;\n }\n\n const chartName = chartConfig.chart || 'StockPriceChart';\n chartElement.classList.add(`chart-${kebabCase(chartName)}`);\n if (!ChartConfigs.hasOwnProperty(chartName))\n {\n throw new Error(`Unknown chart name: ${chartName}`);\n }\n\n /** @type {BaseChart} */\n const chartCls = ChartConfigs[chartName];\n // eslint-disable-next-line new-cap\n const chart = new chartCls(chartElement, chartConfig);\n\n let chartID = chart.getID();\n if (this._charts.hasOwnProperty(chartID))\n {\n console.warn(`Chart with ID ${chartID} already exists!`);\n chartID = `${chartID}_${Object.keys(this._charts).length}`;\n }\n this._charts[chartID] = chart;\n this._chartLoading.push(chart.onLoaded());\n }\n\n /**\n * @param {string} chartId\n * @param {UpdatableChartConfig} chartConfig\n * @returns {void}\n */\n updateChart(chartId, chartConfig)\n {\n const chart = this._charts[chartId];\n chart.updateConfig(chartConfig);\n chart.setForRefresh();\n }\n\n hideChart(chartId)\n {\n this.getChart(chartId).hideChartBox();\n }\n\n showChart(chartId)\n {\n this.getChart(chartId).showChartBox();\n }\n\n getChart(chartId)\n {\n return this._charts[chartId];\n }\n\n hasChart(chartId)\n {\n return this._charts.hasOwnProperty(chartId);\n }\n\n /**\n * @returns {Promise}\n */\n async getLoaded()\n {\n return new Promise((resolve, reject) =>\n {\n let retryCount = 0;\n const interval = setInterval(async () =>\n {\n const interactiveCharts = document.querySelectorAll('[data-app=\"interactive-chart\"]');\n if (interactiveCharts.length === this._chartLoading.length)\n {\n clearInterval(interval);\n await Promise.allSettled(this._chartLoading);\n resolve();\n }\n else\n {\n retryCount++;\n if (retryCount > 50)\n {\n clearInterval(interval);\n reject();\n }\n }\n }, 100);\n });\n }\n\n async initStreaming()\n {\n if (typeof window.$AFNStreamer !== 'undefined')\n {\n window.$AFNStreamer.init();\n }\n }\n}\n","import './scss/main.scss';\n\nimport ChartsManager from './js/ChartsManager';\n\nwindow.ADVFN_CHARTS_MANAGER = new ChartsManager();\n\ndocument.addEventListener('DOMContentLoaded', () =>\n{\n const charts = document.querySelectorAll('[data-app=\"interactive-chart\"]');\n if (charts.length > 0)\n {\n charts.forEach((chartElement) =>\n {\n window.ADVFN_CHARTS_MANAGER.addChartByElement(chartElement);\n });\n }\n\n window.ADVFN_CHARTS_MANAGER.getLoaded().then(() =>\n {\n window.ADVFN_CHARTS_MANAGER.initStreaming();\n });\n});\n","// style-loader: Adds some css to the DOM by adding a