{"version":3,"file":"4388.861b4dcc.js","mappings":"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","sources":["webpack://@finviz/website/../charts/app/lib/shims.ts","webpack://@finviz/website/../charts/app/logger.js","webpack://@finviz/website/../charts/app/chart-events/chart-event.ts","webpack://@finviz/website/../charts/app/chart-events/dividends.ts","webpack://@finviz/website/../charts/app/chart-events/earnings.ts","webpack://@finviz/website/../charts/app/chart-events/split.ts","webpack://@finviz/website/../charts/app/chart-events/index.ts","webpack://@finviz/website/../charts/app/helpers/get-canvas-element-by-type.ts","webpack://@finviz/website/../charts/app/models/chart.ts","webpack://@finviz/website/../charts/app/controllers/chart-events/async-modules.ts","webpack://@finviz/website/../charts/app/models/chart-event-element.ts","webpack://@finviz/website/../charts/app/models/chart_layout.ts","webpack://@finviz/website/../charts/app/utils/hlc.ts","webpack://@finviz/website/../charts/app/models/drawings-internal-store.ts","webpack://@finviz/website/../charts/app/models/indicator.ts","webpack://@finviz/website/../charts/app/models/overlay.ts","webpack://@finviz/website/../charts/app/models/relationships.ts","webpack://@finviz/website/../charts/app/index.ts","webpack://@finviz/website/../charts/app/modals/background.tsx","webpack://@finviz/website/../charts/app/modals/color_range_row.tsx","webpack://@finviz/website/../charts/app/modals/border.tsx","webpack://@finviz/website/../charts/app/modals/checkbox.tsx","webpack://@finviz/website/../charts/app/modals/font.tsx","webpack://@finviz/website/../charts/app/modals/line.tsx","webpack://@finviz/website/../charts/app/modals/multiline_string.tsx","webpack://@finviz/website/../charts/app/modals/number.tsx","webpack://@finviz/website/../charts/app/modals/string.tsx","webpack://@finviz/website/../charts/app/modals/trend.tsx","webpack://@finviz/website/../charts/app/modals/visibility/visibility-input.tsx","webpack://@finviz/website/../charts/app/modals/visibility/index.tsx","webpack://@finviz/website/../charts/app/modals/element_style.tsx","webpack://@finviz/website/../charts/app/controllers/autosave/utils.ts","webpack://@finviz/website/../charts/app/controllers/autosave/constants.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-drawing-autosave-api.tsx","webpack://@finviz/website/../charts/app/utils/string-byte-length.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-drawing-auto-save-controls.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-is-auto-save-active.ts","webpack://@finviz/website/../charts/app/controllers/autosave/with-auto-save.tsx","webpack://@finviz/website/../charts/app/utils/use-prev-state.ts","webpack://@finviz/website/../charts/app/modals/ideas/utils.ts","webpack://@finviz/website/../charts/app/modals/ideas/IdeaItem.tsx","webpack://@finviz/website/../charts/app/modals/ideas/IdeasTabs.tsx","webpack://@finviz/website/../charts/app/modals/ideas/Ideas.tsx","webpack://@finviz/website/../charts/app/controllers/header/ideas_dropdown.tsx","webpack://@finviz/website/../charts/app/modals/publish/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/header/publish.tsx","webpack://@finviz/website/../charts/app/controllers/header/tour_button.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/chart-type-select.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-chart-types.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/daily-change-display.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/draw-button.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/fullscreen-button.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/search.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/settings-button.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-chart-controls.ts","webpack://@finviz/website/../charts/app/model-hooks/useModelRef.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/chart-controls.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/constants.ts","webpack://@finviz/website/../charts/app/models/context_menu.ts","webpack://@finviz/website/../charts/app/controllers/context_menu.tsx","webpack://@finviz/website/../charts/app/controllers/pane/chart-event-popover-with-state.tsx","webpack://@finviz/website/../charts/app/utils/use-click-away.ts","webpack://@finviz/website/../charts/app/controllers/pane/load-latest-data-button.tsx","webpack://@finviz/website/../charts/app/utils/use-is-mounted.ts","webpack://@finviz/website/../charts/app/controllers/pane/zoom_controls.tsx","webpack://@finviz/website/../charts/app/controllers/pane/pane.tsx","webpack://@finviz/website/../charts/app/controllers/pane/with-pane-model.tsx","webpack://@finviz/website/../charts/app/controllers/chart/chart-spinner-overlay.tsx","webpack://@finviz/website/../charts/app/controllers/chart/constants.ts","webpack://@finviz/website/../charts/app/controllers/chart/chart.tsx","webpack://@finviz/website/../charts/app/controllers/chart/with-chart-init.tsx","webpack://@finviz/website/../charts/app/controllers/chart/with-watched-panes-on-chart-model.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/module-load-failed.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/portfolio-watchlist/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/modules.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/with-module-async-load.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar-content.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar-tabs.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar.tsx","webpack://@finviz/website/../charts/app/creators/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/toolbar/drawingActions.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/drawingSettings.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/drawingTools.ts","webpack://@finviz/website/../charts/app/controllers/toolbar/toolbar.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/index.ts","webpack://@finviz/website/../charts/app/controllers/toolbar/auto-save-notes/auto-save-notes.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/auto-save-notes/auto-save-notes-dialog.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/confirmation_dialog.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/mobile/tool-button.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/mobile/toolbar-mobile.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/auto-save-state-indicator.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart-layout-auto-save-note.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/publish_old_button_click_listener.tsx","webpack://@finviz/website/../charts/app/controllers/autosave/idea-leave-dialog.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-chart-route-change.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-complete-layout-model-init.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-cache-management.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-polling.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart_layout_component.tsx","webpack://@finviz/website/../charts/app/controllers/with_dialog_state_hook.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-chart-page-title.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-idea-model-state.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart_layout.tsx","webpack://@finviz/website/../charts/app/controllers/header/fullscreen_button.tsx","webpack://@finviz/website/../charts/app/controllers/header/layout_dropdown.tsx","webpack://@finviz/website/../charts/app/helpers/sorter.ts","webpack://@finviz/website/../charts/app/controllers/header/theme_toggle_button.tsx","webpack://@finviz/website/../charts/app/controllers/header/index.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/stock-detail-timeframe-bar.tsx","webpack://@finviz/website/../charts/app/utils/convert_ta.ts","webpack://@finviz/website/./js/app/charts-lib.ts","webpack://@finviz/website/./js/app/quote/create-alert/async-modules.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/main/components/portfolio/async-modules.ts","webpack://@finviz/website/./js/charts_lib_entry_do_not_directly_use_in_website.ts","webpack://@finviz/website/./js/main/hooks/use-track-pageview.ts","webpack://@finviz/website/../charts/app/canvas/arrow.ts","webpack://@finviz/website/../charts/app/canvas/brush/brush_v1.ts","webpack://@finviz/website/../charts/app/canvas/callout/callout_utils.ts","webpack://@finviz/website/../charts/app/canvas/callout/callout_v1.ts","webpack://@finviz/website/../charts/app/canvas/curve.ts","webpack://@finviz/website/../charts/app/canvas/ellipse.ts","webpack://@finviz/website/../charts/app/canvas/rotated_rectangle.ts","webpack://@finviz/website/../charts/app/canvas/symbol.ts","webpack://@finviz/website/../charts/app/canvas/drawingTools.ts","webpack://@finviz/website/../charts/app/canvas/element.ts","webpack://@finviz/website/../charts/app/canvas/elliott_waves/elliott_waves.ts","webpack://@finviz/website/../charts/app/canvas/ellipse/ellipse_v1.ts","webpack://@finviz/website/../charts/app/canvas/fibonacci_retracements.ts","webpack://@finviz/website/../charts/app/canvas/horizontal_line.ts","webpack://@finviz/website/../charts/app/canvas/line.ts","webpack://@finviz/website/../charts/app/canvas/measure.ts","webpack://@finviz/website/../charts/app/canvas/pitchfork/pitchfork_utils.ts","webpack://@finviz/website/../charts/app/canvas/pitchfork/pitchfork_v1.ts","webpack://@finviz/website/../charts/app/canvas/polygon.ts","webpack://@finviz/website/../charts/app/canvas/position.ts","webpack://@finviz/website/../charts/app/canvas/rectangle.ts","webpack://@finviz/website/../charts/app/canvas/rotated_rectangle/rotated_rectangle_v1.ts","webpack://@finviz/website/../charts/app/canvas/scaled_line.ts","webpack://@finviz/website/../charts/app/canvas/scaled_text.ts","webpack://@finviz/website/../charts/app/canvas/text.ts","webpack://@finviz/website/../charts/app/canvas/thumb.ts","webpack://@finviz/website/../charts/app/canvas/triangle.ts","webpack://@finviz/website/../charts/app/canvas/vertical_line.ts","webpack://@finviz/website/../charts/app/canvas/xabcd.ts","webpack://@finviz/website/../charts/app/canvas/cache.js","webpack://@finviz/website/../charts/app/models/chart_settings/interfaces.ts","webpack://@finviz/website/../charts/app/charts/utils.ts","webpack://@finviz/website/../charts/app/charts/base_chart.ts","webpack://@finviz/website/../charts/app/charts/candle_stick.ts","webpack://@finviz/website/../charts/app/charts/candle_stick_hollow.ts","webpack://@finviz/website/../charts/app/charts/heikin_ashi.ts","webpack://@finviz/website/../charts/app/charts/line_chart.ts","webpack://@finviz/website/../charts/app/charts/market_sentiment.ts","webpack://@finviz/website/../charts/app/charts/multi_line_chart.ts","webpack://@finviz/website/../charts/app/charts/ohlc_chart.ts","webpack://@finviz/website/../charts/app/charts/perf_chart.ts","webpack://@finviz/website/../charts/app/charts/charts.ts","webpack://@finviz/website/../charts/app/constants/common.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-chart-model-custom-date-range-values.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-charts-path-location.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/utils.ts","webpack://@finviz/website/../charts/app/controllers/chart-settings/async-modules.ts","webpack://@finviz/website/../charts/app/utils/chart-date-range-utils.ts","webpack://@finviz/website/../charts/app/controllers/renderUtils.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/constants.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/hooks/sidebar-context.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/interfaces.ts","webpack://@finviz/website/../charts/app/controllers/utils.ts","webpack://@finviz/website/../charts/app/helpers/atr.ts","webpack://@finviz/website/../charts/app/helpers/math.ts","webpack://@finviz/website/../charts/app/indicator-calculation/ema.ts","webpack://@finviz/website/../charts/app/indicator-calculation/main.ts","webpack://@finviz/website/../charts/app/indicators/indicator.ts","webpack://@finviz/website/../charts/app/utils/canvas-render.ts","webpack://@finviz/website/../charts/app/indicators/adx.ts","webpack://@finviz/website/../charts/app/indicator-calculation/aroon.ts","webpack://@finviz/website/../charts/app/indicators/aro.ts","webpack://@finviz/website/../charts/app/indicators/aroosc.ts","webpack://@finviz/website/../charts/app/indicators/atr.ts","webpack://@finviz/website/../charts/app/indicators/cci.ts","webpack://@finviz/website/../charts/app/indicators/cot.ts","webpack://@finviz/website/../charts/app/indicator-calculation/fi.ts","webpack://@finviz/website/../charts/app/indicators/fi.ts","webpack://@finviz/website/../charts/app/indicator-calculation/macd.ts","webpack://@finviz/website/../charts/app/indicators/macd.ts","webpack://@finviz/website/../charts/app/indicators/mfi.ts","webpack://@finviz/website/../charts/app/indicators/none.ts","webpack://@finviz/website/../charts/app/indicators/obv.ts","webpack://@finviz/website/../charts/app/indicators/perf.ts","webpack://@finviz/website/../charts/app/indicators/rmi.ts","webpack://@finviz/website/../charts/app/indicators/roc.ts","webpack://@finviz/website/../charts/app/indicator-calculation/rsi.ts","webpack://@finviz/website/../charts/app/indicators/rsi.ts","webpack://@finviz/website/../charts/app/indicators/rvol.ts","webpack://@finviz/website/../charts/app/indicators/rwi.ts","webpack://@finviz/website/../charts/app/indicators/stofu.ts","webpack://@finviz/website/../charts/app/indicators/stofa.ts","webpack://@finviz/website/../charts/app/indicators/stosl.ts","webpack://@finviz/website/../charts/app/indicator-calculation/trix.ts","webpack://@finviz/website/../charts/app/indicators/trix.ts","webpack://@finviz/website/../charts/app/indicators/ult.ts","webpack://@finviz/website/../charts/app/indicators/vol.ts","webpack://@finviz/website/../charts/app/indicators/wr.ts","webpack://@finviz/website/../charts/app/indicators/indicators.ts","webpack://@finviz/website/../charts/app/model-hooks/use-model-state.ts","webpack://@finviz/website/../charts/app/models/chart/contstants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/index.ts","webpack://@finviz/website/../charts/app/models/constants.ts","webpack://@finviz/website/../charts/app/models/element.ts","webpack://@finviz/website/../charts/app/models/mouse/mouse-utils.ts","webpack://@finviz/website/../charts/app/models/mouse/mouse.ts","webpack://@finviz/website/../charts/app/models/pane.ts","webpack://@finviz/website/../charts/app/models/quoteCache.ts","webpack://@finviz/website/../charts/app/models/quote.ts","webpack://@finviz/website/../charts/app/models/quote/constants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/constants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/interactive_chart_settings.ts","webpack://@finviz/website/../charts/app/models/settings.ts","webpack://@finviz/website/../charts/app/models/utils.ts","webpack://@finviz/website/../charts/app/indicator-calculation/bb.ts","webpack://@finviz/website/../charts/app/overlays/overlay.ts","webpack://@finviz/website/../charts/app/overlays/bb.ts","webpack://@finviz/website/../charts/app/overlays/dch.ts","webpack://@finviz/website/../charts/app/overlays/ema.ts","webpack://@finviz/website/../charts/app/overlays/ema2.ts","webpack://@finviz/website/../charts/app/overlays/hilo.ts","webpack://@finviz/website/../charts/app/overlays/hline.ts","webpack://@finviz/website/../charts/app/overlays/ic.ts","webpack://@finviz/website/../charts/app/overlays/icf.ts","webpack://@finviz/website/../charts/app/overlays/kch.ts","webpack://@finviz/website/../charts/app/overlays/none.ts","webpack://@finviz/website/../charts/app/overlays/patterns.ts","webpack://@finviz/website/../charts/app/overlays/pp.ts","webpack://@finviz/website/../charts/app/overlays/sar.ts","webpack://@finviz/website/../charts/app/indicator-calculation/sma.ts","webpack://@finviz/website/../charts/app/overlays/sma.ts","webpack://@finviz/website/../charts/app/overlays/sma2.ts","webpack://@finviz/website/../charts/app/overlays/str.ts","webpack://@finviz/website/../charts/app/overlays/vp.ts","webpack://@finviz/website/../charts/app/indicator-calculation/vwap.ts","webpack://@finviz/website/../charts/app/overlays/vwap.ts","webpack://@finviz/website/../charts/app/overlays/overlays.ts","webpack://@finviz/website/../charts/app/utils.ts","webpack://@finviz/website/../charts/app/utils/abort_controller.ts","webpack://@finviz/website/../charts/app/utils/async-modules-utils.ts","webpack://@finviz/website/../charts/app/utils/canvas.ts","webpack://@finviz/website/../charts/app/utils/chart-events-utils.ts","webpack://@finviz/website/../charts/app/utils/chart.ts","webpack://@finviz/website/../charts/app/utils/colors.ts","webpack://@finviz/website/../charts/app/utils/cursor.ts","webpack://@finviz/website/../charts/app/utils/draw_in_visible_area.ts","webpack://@finviz/website/../charts/app/utils/fetch_api.ts","webpack://@finviz/website/../charts/app/utils/force-update.ts","webpack://@finviz/website/../charts/app/utils/helpers.ts","webpack://@finviz/website/../charts/app/utils/useChartLayoutGlobalModelAsync.ts","webpack://@finviz/website/../charts/types/shared.ts"],"sourcesContent":["import Spine from '@finviz/spine'\r\n\r\n// eslint-disable-next-line no-extend-native\r\nArray.prototype.last = function () {\r\n return this[this.length - 1]\r\n}\r\n\r\n// eslint-disable-next-line no-extend-native\r\nString.prototype.padLeft = function (paddingValue) {\r\n return String(paddingValue + this).slice(-paddingValue.length)\r\n}\r\n\r\n// eslint-disable-next-line no-extend-native\r\nString.prototype.startsWith = function (str) {\r\n return this.indexOf(str) === 0\r\n}\r\n\r\ninterface CallbackCacheItem {\r\n newCb: (...args: any[]) => any\r\n origCb: (...args: any[]) => any\r\n}\r\n\r\nconst _callbackCache: CallbackCacheItem[] = []\r\nSpine.Collection.prototype.bind = function (ev, callback) {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const that = this\r\n const cb = (record: Spine.Model, ...rest: any[]) => {\r\n if (record[that.fkey as keyof Spine.Model] === that.record.id) {\r\n return callback(record, ...rest)\r\n }\r\n }\r\n _callbackCache.push({ newCb: cb, origCb: callback })\r\n this.model.bind(ev, cb)\r\n return this\r\n}\r\n\r\nSpine.Collection.prototype.unbind = function (ev, callback) {\r\n let cb\r\n for (const item of _callbackCache) {\r\n if (item.origCb === callback) {\r\n cb = item.newCb\r\n break\r\n }\r\n }\r\n return this.model.unbind(ev, cb)\r\n}\r\n\r\nSpine.Model.findIndex = function (element) {\r\n const iterable = this.all()\r\n for (let index = 0; index < iterable.length; index++) {\r\n const el = iterable[index]\r\n if (element.eql(el)) {\r\n return index\r\n }\r\n }\r\n}\r\n","import Spine from '@finviz/spine'\r\n\r\nexport const defaults = {\r\n enabled: false,\r\n collapsed: true,\r\n duration: false,\r\n timestamp: true,\r\n logErrors: true,\r\n withStackTrace: false,\r\n level: 'log',\r\n logger: console,\r\n filterChanges: (model, attrs) => {\r\n const props = Object.keys(attrs)\r\n return (\r\n model.constructor.name === 'Mouse' ||\r\n model.constructor.name === 'Quote' ||\r\n (props.length === 1 && (props[0] === 'scale' || props[0] === 'leftOffset'))\r\n )\r\n },\r\n errorTransformer: (error) => error,\r\n titleFormatter: ({ timestamp, duration }, title, time, took) => {\r\n const parts = ['model']\r\n parts.push(`%c${String(title)}`)\r\n if (timestamp) {\r\n parts.push(`%c@ ${time}`)\r\n }\r\n if (duration) {\r\n parts.push(`%c(in ${took.toFixed(2)} ms)`)\r\n }\r\n return parts.join(' ')\r\n },\r\n colors: {\r\n title: () => 'inherit',\r\n prevState: () => '#9E9E9E',\r\n action: () => '#03A9F4',\r\n nextState: () => '#4CAF50',\r\n error: () => '#F20404',\r\n },\r\n}\r\n\r\nconst repeat = (str, times) => new Array(times + 1).join(str)\r\nconst pad = (num, maxLength = 2) => repeat('0', maxLength - num.toString().length) + num\r\nconst formatTime = (time) =>\r\n `${pad(time.getHours())}:${pad(time.getMinutes())}:${pad(time.getSeconds())}.${pad(time.getMilliseconds(), 3)}`\r\n\r\nexport const printLogEntry = (logEntry, options = {}) => {\r\n const { logger, logErrors, titleFormatter, collapsed, timestamp, duration, withStackTrace, colors, level } = {\r\n ...defaults,\r\n ...options,\r\n }\r\n const { startedTime, title, prevState, data, error, nextState, took } = logEntry\r\n\r\n const formattedTime = formatTime(startedTime)\r\n const titleCSS = colors.title ? `color: ${colors.title(title)};` : ''\r\n const headerCSS = ['color: gray; font-weight: lighter;']\r\n headerCSS.push(titleCSS)\r\n if (timestamp) {\r\n headerCSS.push('color: gray; font-weight: lighter;')\r\n }\r\n if (duration) {\r\n headerCSS.push('color: gray; font-weight: lighter;')\r\n }\r\n const formattedTitle = titleFormatter(defaults, title, formattedTime, took)\r\n\r\n try {\r\n if (collapsed) {\r\n if (colors.title) {\r\n logger.groupCollapsed(`%c ${formattedTitle}`, ...headerCSS)\r\n } else {\r\n logger.groupCollapsed(formattedTitle)\r\n }\r\n } else if (colors.title) {\r\n logger.group(`%c ${formattedTitle}`, ...headerCSS)\r\n } else {\r\n logger.group(formattedTitle)\r\n }\r\n } catch (e) {\r\n logger.log(formattedTitle)\r\n }\r\n\r\n if (colors.prevState) {\r\n const styles = `color: ${colors.prevState(prevState)}; font-weight: bold`\r\n logger[level]('%c prev state', styles, prevState)\r\n } else {\r\n logger[level]('prev state', prevState)\r\n }\r\n\r\n if (colors.action) {\r\n const styles = `color: ${colors.action(data)}; font-weight: bold`\r\n logger[level]('%c arguments ', styles, data)\r\n } else {\r\n logger[level]('arguments ', data)\r\n }\r\n\r\n if (error && logErrors) {\r\n if (colors.error) {\r\n const styles = `color: ${colors.error(error, prevState)}; font-weight: bold;`\r\n logger['error']('%c error ', styles, error)\r\n } else {\r\n logger['error']('error ', error)\r\n }\r\n }\r\n\r\n if (colors.nextState) {\r\n const styles = `color: ${colors.nextState(nextState)}; font-weight: bold`\r\n logger[level]('%c next state', styles, nextState)\r\n } else {\r\n logger[level]('next state', nextState)\r\n }\r\n\r\n if (withStackTrace) {\r\n logger.groupCollapsed('TRACE')\r\n logger.trace()\r\n logger.groupEnd()\r\n }\r\n\r\n try {\r\n logger.groupEnd()\r\n } catch (e) {\r\n logger.log('—— log end ——')\r\n }\r\n}\r\n\r\nexport const initialize = () => {\r\n window['logger'] = defaults\r\n\r\n const protoModelLoad = Spine.Model.prototype.load\r\n Spine.Model.prototype.load = function (attrs) {\r\n if (defaults.enabled && !defaults.filterChanges(this, attrs)) {\r\n const started = Date.now()\r\n const logEntry = {\r\n title: `${this.constructor.name}[#${this.id || this.cid}]`,\r\n started: started,\r\n startedTime: new Date(started),\r\n prevState: this.attributes(),\r\n data: attrs,\r\n }\r\n\r\n let returnedValue\r\n try {\r\n returnedValue = protoModelLoad.apply(this, arguments)\r\n } catch (e) {\r\n logEntry.error = e\r\n }\r\n\r\n logEntry.nextState = this.attributes()\r\n logEntry.took = Date.now() - logEntry.started\r\n\r\n printLogEntry(logEntry)\r\n return returnedValue\r\n } else {\r\n return protoModelLoad.apply(this, arguments)\r\n }\r\n }\r\n}\r\n","import { PaneArea } from '../../types/shared'\r\nimport Element, { DefaultAttrs } from '../canvas/element'\r\nimport BaseChart from '../charts/base_chart'\r\nimport { ChartEventBadgeType, ChartEventType, TIMEFRAME } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport Chart from '../models/chart'\r\nimport ChartEventElement from '../models/chart-event-element'\r\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\r\nimport type PaneModel from '../models/pane'\r\nimport { ChartEventBadgeState } from '../utils/chart-events-utils'\r\n\r\ninterface ChartEventAttrs extends DefaultAttrs {\r\n x: number\r\n}\r\n\r\nfunction getChartEventState(chartEvent: ChartEvent): ChartEventBadgeState {\r\n if (chartEvent.isOpen) {\r\n return ChartEventBadgeState.selected\r\n }\r\n if (chartEvent.isHovered) {\r\n return ChartEventBadgeState.hover\r\n }\r\n return ChartEventBadgeState.default\r\n}\r\n\r\nclass ChartEvent extends Element {\r\n static type = ChartEventType.ChartEvent\r\n static label = 'ChartEvent'\r\n\r\n declare scaled: Pick\r\n\r\n declare chart: BaseChart\r\n\r\n declare model: PaneModel\r\n\r\n declare chartEventModel: ChartEventElement | undefined\r\n\r\n isOpen = false\r\n\r\n left = 0\r\n top = 0\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: [] })\r\n\r\n get type() {\r\n return (this.constructor as typeof ChartEvent).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof ChartEvent).label\r\n }\r\n\r\n getChartEvenBadgeType(): ChartEventBadgeType {\r\n switch (this.type) {\r\n case ChartEventType.Dividends:\r\n return ChartEventBadgeType.Dividends\r\n case ChartEventType.Split:\r\n return ChartEventBadgeType.Split\r\n }\r\n\r\n return ChartEventBadgeType.EarningsNeutral\r\n }\r\n\r\n getChartEventModel(): ChartEventElement | undefined {\r\n if (!this.chartEventModel) {\r\n this.chartEventModel = this.model.chartEvents()?.findByAttribute('instance', this)\r\n }\r\n\r\n return this.chartEventModel\r\n }\r\n\r\n getXYPosition() {\r\n const { top, bottom } = this.getChartLayoutSettings().ChartSettings\r\n const chartEventModel = this.getChartEventModel()\r\n const { x } = this.scaled\r\n const roundedXY = getRoundedObject({ x })\r\n const y =\r\n (this.model as PaneModel).height -\r\n top.height -\r\n bottom.height -\r\n CHART_EVENT_BADGE_SIZE -\r\n (chartEventModel?.yIndex ?? 0) * CHART_EVENT_BADGE_SIZE\r\n\r\n return { x: roundedXY.x - CHART_EVENT_BADGE_SIZE / 2, y }\r\n }\r\n\r\n getIsVisible() {\r\n return ![TIMEFRAME.w, TIMEFRAME.m].includes(this.model.chart().quote()?.timeframe)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (!this.getIsVisible() || !this.chartEventModel) return\r\n\r\n this.attrs.x = Math.round(this.attrs.x)\r\n const chart = this.model.chart()\r\n const chartLayout = chart.chart_layout()\r\n const { x, y } = this.getXYPosition()\r\n const buffer = 10 + CHART_EVENT_BADGE_SIZE\r\n if (x + chart.leftOffset < -buffer || x + chart.leftOffset > chart.width + buffer) {\r\n return\r\n }\r\n const item = this.chartEventModel.getChartEventBadgeImage({\r\n theme: chartLayout.theme,\r\n state: getChartEventState(this),\r\n badgeType: this.getChartEvenBadgeType(),\r\n })\r\n\r\n if (!item) return\r\n\r\n const { left, top } = this.getChartLayoutSettings().ChartSettings\r\n this.left = x + chart.leftOffset + left.width + CHART_EVENT_BADGE_SIZE / 2\r\n this.top = y + top.height\r\n context.drawImage(item, x, y, CHART_EVENT_BADGE_SIZE, CHART_EVENT_BADGE_SIZE)\r\n }\r\n\r\n setIsHovered(isHovered: boolean) {\r\n if (!this.getIsVisible()) return\r\n\r\n this.isHovered = isHovered\r\n this.model.updateChartEventsZIndexes()\r\n this.trigger('change')\r\n }\r\n\r\n // If isOpenOverride is undefined, the function works as toggle\r\n toggleIsOpen(isOpenOverride?: boolean) {\r\n const chartLayout = this.model.chart().chart_layout()\r\n const chartEventModel = this.getChartEventModel()\r\n\r\n const isCurrentEventActive = chartLayout.activeChartEvent?.elementId === chartEventModel?.elementId\r\n const isOpen = isOpenOverride ?? (isCurrentEventActive ? !chartEventModel?.instance.isOpen : true)\r\n this.isOpen = isOpen\r\n if (chartLayout.activeChartEvent?.instance.isOpen && !isCurrentEventActive) {\r\n chartLayout.activeChartEvent?.instance.toggleIsOpen(false)\r\n }\r\n if (isOpen || isCurrentEventActive) {\r\n chartLayout.updateAttribute('activeChartEvent', !isOpen && isCurrentEventActive ? undefined : chartEventModel)\r\n }\r\n\r\n this.model.updateChartEventsZIndexes()\r\n this.trigger('change')\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (!this.getIsVisible()) return false\r\n\r\n const scaledArea = area.scaled\r\n const { x, y } = this.getXYPosition()\r\n const isInArea =\r\n x <= scaledArea.x &&\r\n x + CHART_EVENT_BADGE_SIZE >= scaledArea.x &&\r\n y <= scaledArea.y &&\r\n y + CHART_EVENT_BADGE_SIZE >= scaledArea.y\r\n return isInArea\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (!this.getIsVisible()) return false\r\n\r\n const { x } = this.getXYPosition()\r\n const isInView = x + CHART_EVENT_BADGE_SIZE >= -chart.leftOffset && x <= -chart.leftOffset + chart.width\r\n return isInView\r\n }\r\n}\r\n\r\nexport default ChartEvent\r\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Dividends extends ChartEvent {\r\n static type = ChartEventType.Dividends\r\n static label = ChartEventLabels[ChartEventType.Dividends]\r\n}\r\n\r\nexport default Dividends\r\n","import { ChartEventBadgeType, ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport { IEarnings } from '../utils/chart-events-utils'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Earnings extends ChartEvent {\r\n static type = ChartEventType.Earnings\r\n static label = ChartEventLabels[ChartEventType.Earnings]\r\n\r\n getChartEvenBadgeType(): ChartEventBadgeType {\r\n const eventItem = this.getChartEventModel()?.getChartEventData() as IEarnings | undefined\r\n\r\n if (!eventItem) {\r\n return ChartEventBadgeType.EarningsNeutral\r\n }\r\n\r\n if (eventItem.epsActual === undefined || eventItem.epsEstimate === undefined) {\r\n const now = Date.now() / 1000\r\n return eventItem.dateTimestamp > now ? ChartEventBadgeType.EarningsFuture : ChartEventBadgeType.EarningsNeutral\r\n }\r\n return eventItem.epsActual - eventItem.epsEstimate < 0\r\n ? ChartEventBadgeType.EarningsNegative\r\n : ChartEventBadgeType.EarningsPositive\r\n }\r\n}\r\n\r\nexport default Earnings\r\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Split extends ChartEvent {\r\n static type = ChartEventType.Split\r\n static label = ChartEventLabels[ChartEventType.Split]\r\n}\r\n\r\nexport default Split\r\n","import { ChartEventType } from '../constants/common'\r\nimport chartEvent from './chart-event'\r\nimport dividends from './dividends'\r\nimport earnings from './earnings'\r\nimport split from './split'\r\n\r\nexport const chartEventsByType = Object.freeze({\r\n [ChartEventType.ChartEvent]: chartEvent,\r\n [ChartEventType.Dividends]: dividends,\r\n [ChartEventType.Split]: split,\r\n [ChartEventType.Earnings]: earnings,\r\n})\r\n","import { ChartConfigChartPaneElement } from '../../types/shared'\r\nimport { drawingToolsByType } from '../canvas/drawingTools'\r\nimport { chartEventsByType } from '../chart-events'\r\nimport { chartsByType } from '../charts/charts'\r\nimport { indicatorsByType } from '../indicators/indicators'\r\nimport { overlaysByType } from '../overlays/overlays'\r\n\r\nconst canvasElements = {\r\n ...overlaysByType,\r\n ...indicatorsByType,\r\n ...drawingToolsByType,\r\n ...chartsByType,\r\n ...chartEventsByType,\r\n}\r\n\r\nexport function getCanvasElementByType(elementType: ChartConfigChartPaneElement['type']) {\r\n return canvasElements[elementType]\r\n}\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport {\r\n ChartConfigChartPane,\r\n CustomSpineEvents,\r\n Instrument,\r\n ObjectHash,\r\n TodoObjectHashAnyType,\r\n} from '../../types/shared'\r\nimport BaseChart from '../charts/base_chart'\r\nimport PerfChart from '../charts/perf_chart'\r\nimport {\r\n DateRangeType,\r\n IndicatorType,\r\n QuotePollingIntervalInMs,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport { getCanvasElementByType } from '../helpers/get-canvas-element-by-type'\r\nimport COT from '../indicators/cot'\r\nimport PricePerformance from '../indicators/perf'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Utils from '../utils'\r\nimport { IDividends, IEarnings, ISplit } from '../utils/chart-events-utils'\r\nimport ChartEventElement from './chart-event-element'\r\nimport { ChartPartToAttrsSyncMap, ChartSyncablePart } from './chart/contstants'\r\nimport ChartLayout from './chart_layout'\r\nimport Pane from './pane'\r\nimport Quote from './quote'\r\n\r\nclass Chart extends Spine.Model {\r\n static initClass(paneModel: typeof Pane, quoteModel: typeof Quote, chartLayoutModel: typeof ChartLayout) {\r\n this.configure(\r\n 'Chart',\r\n 'width',\r\n 'height',\r\n 'timeframe',\r\n 'dateRange',\r\n 'scale',\r\n 'leftOffset',\r\n 'ticker',\r\n 'instrument',\r\n 'fx',\r\n 'fy',\r\n 'zoomFactor',\r\n 'refreshData',\r\n 'stretch',\r\n 'isHideDrawingsActive',\r\n 'isScrolled',\r\n 'firstBarClose',\r\n 'premarket',\r\n 'aftermarket',\r\n 'hasChartEvents'\r\n )\r\n this.hasMany('panes', paneModel)\r\n this.belongsTo('quote', quoteModel)\r\n this.belongsTo('chart_layout', chartLayoutModel)\r\n }\r\n\r\n declare stretch: boolean\r\n declare chart_layout_id: string\r\n declare chart_layout: () => ChartLayout\r\n declare quote_id: string\r\n declare quote: () => Quote\r\n declare panes: () => Collection\r\n declare refreshData: boolean | number\r\n declare dateRange: DateRangeType\r\n declare width: number\r\n declare height: number\r\n declare timeframe: TIMEFRAME\r\n declare leftOffset: number\r\n declare ticker: string\r\n declare instrument: Instrument\r\n declare fx: (x: number) => number\r\n declare fy: (x: number) => number\r\n declare zoomFactor: number\r\n declare isHideDrawingsActive: boolean\r\n declare isScrolled: boolean\r\n declare scale: ScaleType\r\n declare firstBarClose: number\r\n declare premarket: boolean\r\n declare aftermarket: boolean\r\n declare hasChartEvents: boolean\r\n\r\n getChartPane() {\r\n return this.panes()\r\n .all()\r\n .find((pane: Pane) =>\r\n pane\r\n .elements()\r\n .all()\r\n .some((el) => el.isChart())\r\n )\r\n }\r\n\r\n getChartElement() {\r\n for (const pane of this.panes().all()) {\r\n for (const el of pane.elements().all()) {\r\n if (el.isChart()) {\r\n return el\r\n }\r\n }\r\n }\r\n }\r\n\r\n getChartType() {\r\n return this.getChartElement()?.instance.type\r\n }\r\n\r\n getRefreshInterval() {\r\n let defaultRefreshInterval: number | null = null\r\n if (typeof this.refreshData === 'number') {\r\n defaultRefreshInterval = this.refreshData\r\n } else if (this.refreshData === true) {\r\n defaultRefreshInterval = QuotePollingIntervalInMs.Default\r\n }\r\n\r\n const isStock = this.instrument === Instrument.Stock\r\n const isPremium = window.FinvizSettings.hasUserPremium\r\n let customRefreshInterval = QuotePollingIntervalInMs.Elite\r\n if (!isPremium) {\r\n customRefreshInterval = QuotePollingIntervalInMs.Free\r\n } else if (isStock && !Utils.isStockFastRefreshAvailable()) {\r\n customRefreshInterval = QuotePollingIntervalInMs.EliteStocksReduced\r\n }\r\n\r\n return defaultRefreshInterval && Math.max(defaultRefreshInterval, customRefreshInterval)\r\n }\r\n\r\n toObject() {\r\n const panes = this.panes()\r\n .all()\r\n .map((pane) => pane.toObject())\r\n return {\r\n width: this.width,\r\n dateRange: this.dateRange,\r\n height: this.height,\r\n timeframe: this.timeframe,\r\n scale: this.scale,\r\n leftOffset: this.leftOffset,\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n zoomFactor: this.zoomFactor,\r\n refreshData: this.refreshData,\r\n stretch: this.stretch,\r\n chartId: this.cid,\r\n panes,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isScrolled: this.isScrolled,\r\n premarket: this.premarket,\r\n aftermarket: this.aftermarket,\r\n hasChartEvents: this.hasChartEvents,\r\n }\r\n }\r\n\r\n toConfig(omitKeys = [] as string[]) {\r\n const panes = this.panes()\r\n .all()\r\n .map((pane) => pane.toConfig(omitKeys))\r\n return omit(\r\n {\r\n width: this.width,\r\n height: this.height,\r\n timeframe: this.timeframe,\r\n scale: this.scale,\r\n leftOffset: this.leftOffset,\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n zoomFactor: this.zoomFactor,\r\n refreshData: this.refreshData,\r\n stretch: this.stretch,\r\n chartId: this.cid,\r\n panes,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isScrolled: this.isScrolled,\r\n premarket: this.premarket,\r\n aftermarket: this.aftermarket,\r\n hasChartEvents: this.hasChartEvents,\r\n },\r\n omitKeys\r\n )\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.panes()\r\n .all()\r\n .forEach((pane) => {\r\n pane.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.chart_layout())\r\n }\r\n\r\n getIsDisabled() {\r\n return this.quote()?.close.length === 0\r\n }\r\n\r\n getIsScrollable() {\r\n return this.chart_layout().scrollable\r\n }\r\n\r\n getAllPanes() {\r\n return this.panes().all()\r\n }\r\n\r\n getAllValidPanes() {\r\n const cotKeys = Object.keys(this.quote().COTs ?? {})\r\n return this.getAllPanes().filter((pane) => {\r\n const mainElement = pane.mainElement()\r\n if (mainElement?.instance.type === IndicatorType.Cot) {\r\n // Type of mainElement is `Element` but it can be an indicator too\r\n return cotKeys.includes((mainElement.instance as unknown as COT).attrs.code)\r\n }\r\n return true\r\n })\r\n }\r\n\r\n getAllElements() {\r\n return this.getAllPanes().flatMap((pane) => pane.getAllElements())\r\n }\r\n\r\n getAllQuotes(): Quote[] {\r\n const perfQuotes = this.getAllElements()\r\n .filter(({ instance }) => instance.type === IndicatorType.Perf)\r\n .flatMap(({ instance }) => Object.values((instance as unknown as PricePerformance).quotes))\r\n\r\n let quotePerfTickers: Quote[] = []\r\n if (this.chart_layout().specificChartFunctionality === SpecificChartFunctionality.quotePerf) {\r\n const perfChart = this.getChartElement()?.instance as PerfChart | undefined\r\n if (perfChart) {\r\n quotePerfTickers = Quote.select(\r\n (q: Quote) => perfChart.attrs.tickers.includes(q.ticker) && [TIMEFRAME.d, TIMEFRAME.m].includes(q.timeframe)\r\n )\r\n }\r\n }\r\n\r\n return [...perfQuotes, ...quotePerfTickers, this.quote()].filter(\r\n (quote, index, quotes) => quote && quotes.findIndex((q) => q?.id === quote.id) === index\r\n )\r\n }\r\n\r\n createPaneCascade(paneProperties: ChartConfigChartPane) {\r\n const paneModel = this.panes().create(paneProperties)\r\n\r\n paneProperties.elements?.forEach(({ zIndex, elementId, ...element }) => {\r\n const instance = getCanvasElementByType(element.type).fromObject(element, paneModel)\r\n paneModel.elements().create({ instance, zIndex, elementId })\r\n paneModel.chart().trigger(CustomSpineEvents.IndicatorsChange)\r\n })\r\n\r\n const chartOrIndicator = paneModel.getChartOrIndicatorElement()\r\n if (paneModel.mainElement()?.elementId !== chartOrIndicator?.elementId) {\r\n paneModel.updateAttributes({ mainElement: chartOrIndicator })\r\n }\r\n\r\n return paneModel\r\n }\r\n\r\n updateAttributesAndSync(value: T) {\r\n const attrsInSync = Object.entries(ChartPartToAttrsSyncMap)\r\n .filter(([key]) => this.getIsChartPartInSync(key as unknown as ChartSyncablePart))\r\n .flatMap(([_, modelAttr]) => modelAttr)\r\n this.updateAttributes(value)\r\n\r\n if (attrsInSync.length > 0) {\r\n this.chart_layout()\r\n .getAllCharts()\r\n .forEach((chartModel) => {\r\n if (this.eql(chartModel)) {\r\n return\r\n }\r\n const newAttrs: ObjectHash = {}\r\n attrsInSync.forEach((modelAttr) => {\r\n if (value.hasOwnProperty(modelAttr)) {\r\n newAttrs[modelAttr] = value[modelAttr]\r\n }\r\n })\r\n chartModel.updateAttributes(newAttrs)\r\n })\r\n }\r\n }\r\n\r\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\r\n this.chart_layout().setSyncChartParts(chartParts, isInSync)\r\n }\r\n\r\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\r\n return this.chart_layout().getIsChartPartInSync(chartPart)\r\n }\r\n\r\n getHasPatterns() {\r\n return this.getAllElements().some((element) => {\r\n if ('hasOverlay' in element.instance) {\r\n return (element.instance as BaseChart).hasOverlay?.('patterns')\r\n }\r\n\r\n return false\r\n })\r\n }\r\n\r\n getQuoteRawTicker(): string | null {\r\n return this.quote()?.getRawTicker() ?? null\r\n }\r\n\r\n setChartEvents(chartEvents?: Array, shouldClear = false) {\r\n const chartPane = this.getChartPane()\r\n if (!chartPane) {\r\n return\r\n }\r\n const allChartEvents = chartPane.chartEvents().all()\r\n if (shouldClear) {\r\n allChartEvents.forEach((chartEvent) => chartEvent.destroyCascade())\r\n }\r\n\r\n const events = shouldClear\r\n ? chartEvents\r\n : chartEvents?.filter((chartEvent) => !allChartEvents.some(({ elementId }) => chartEvent.elementId === elementId))\r\n\r\n events?.forEach(({ elementId, eventType, dateTimestamp }) => {\r\n const newChartEvent = chartPane.chartEvents().create({\r\n instance: getCanvasElementByType(eventType).fromObject({ positionTimestamps: { x: dateTimestamp } }, chartPane),\r\n elementId,\r\n })\r\n newChartEvent.instance.updateScales()\r\n })\r\n\r\n chartPane.updateChartEventsZIndexes()\r\n }\r\n}\r\n\r\nexport default Chart\r\n","export const chartEventsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"chart-events\" */ './module-entry'),\r\n cacheKey: 'chart-events',\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { Theme } from '../../types/shared'\r\nimport ChartEvent from '../chart-events/chart-event'\r\nimport { ChartEventBadgeType } from '../constants/common'\r\nimport { chartEventsAsyncModule } from '../controllers/chart-events/async-modules'\r\nimport ElementModel from '../models/element'\r\nimport { ChartEventBadgeState, IChartEventBadgeProps } from '../utils/chart-events-utils'\r\nimport { captureException } from '../utils/helpers'\r\nimport { CHART_EVENT_BADGE_SIZE } from './constants'\r\nimport Pane from './pane'\r\n\r\nconst badgeImages = {} as ObjectHash<{ image: HTMLImageElement; isLoaded?: boolean }, string>\r\n\r\ntype ChartEventBadgeCommonType = Omit & { badgeType: ChartEventBadgeType }\r\n\r\nfunction getSvgImageCacheKey(props: Pick) {\r\n return `${props.badgeType}-${props.theme}-${props.state}`\r\n}\r\n\r\nasync function fetchAndCacheChartEventBadges({ onBadgeInitLoad }: { onBadgeInitLoad: () => void }) {\r\n // Currently node charts don't render badges and if the code below is executed on server it will crash because of missing file which is not transpiled\r\n if (typeof window === 'undefined') {\r\n return\r\n }\r\n\r\n // Temp workaround to prevent node charts from crashing\r\n const { importWithRetry } = await import('@finviz/website')\r\n const { chartBadgeSvgByType } = await importWithRetry(chartEventsAsyncModule.importFn)\r\n\r\n const handleImageResolve = () => {\r\n const hasSomeUnresolvedImages = Object.values(badgeImages).some(({ isLoaded }) => isLoaded === undefined)\r\n if (!hasSomeUnresolvedImages) {\r\n onBadgeInitLoad()\r\n }\r\n }\r\n\r\n Object.values(ChartEventBadgeState).forEach((badgeState) => {\r\n Object.values(ChartEventBadgeType).forEach((badgeType) => {\r\n Object.values(Theme).forEach((theme) => {\r\n const cacheKey = getSvgImageCacheKey({\r\n badgeType,\r\n state: badgeState,\r\n theme,\r\n })\r\n const svgHTML = chartBadgeSvgByType[badgeType]({\r\n state: badgeState,\r\n theme,\r\n width: CHART_EVENT_BADGE_SIZE,\r\n })\r\n const img = new Image()\r\n img.src = `data:image/svg+xml,${encodeURIComponent(svgHTML)}`\r\n img.onload = () => {\r\n badgeImages[cacheKey].isLoaded = true\r\n handleImageResolve()\r\n }\r\n img.onerror = () => {\r\n badgeImages[cacheKey].isLoaded = false\r\n handleImageResolve()\r\n captureException(new Error(`Image with cache key ${cacheKey} is invalid`), { extra: { src: img.src } })\r\n }\r\n badgeImages[cacheKey] = {\r\n image: img,\r\n }\r\n })\r\n })\r\n })\r\n}\r\n\r\nclass ChartEventElement extends ElementModel {\r\n static initClass(paneModel: typeof Pane) {\r\n this.configure('ChartEventElement', 'instance', 'lastChange', 'zIndex', 'yIndex', 'elementId')\r\n this.belongsTo('pane', paneModel)\r\n }\r\n\r\n declare instance: ChartEvent\r\n yIndex = 0\r\n\r\n getChartEventBadgeImage(props: ChartEventBadgeCommonType) {\r\n const cacheKey = getSvgImageCacheKey(props)\r\n const badgeImage = badgeImages[cacheKey]\r\n if (badgeImage) {\r\n // Possible fix for https://finvizcom.sentry.io/issues/4737062163\r\n if (badgeImage.isLoaded && badgeImage.image.width > 0 && badgeImage.image.height > 0) {\r\n return badgeImage.image\r\n }\r\n return undefined\r\n }\r\n\r\n void fetchAndCacheChartEventBadges({\r\n onBadgeInitLoad: () => this.trigger('change', this),\r\n })\r\n }\r\n\r\n getChartEventData() {\r\n return this.instance.model\r\n .chart()\r\n .quote()\r\n ?.chartEvents?.find((stockEvent) => stockEvent.elementId === this?.elementId)\r\n }\r\n\r\n toObject() {\r\n return {\r\n ...super.toObject(),\r\n yIndex: this.yIndex,\r\n }\r\n }\r\n\r\n toConfig() {\r\n return {\r\n ...super.toConfig(),\r\n yIndex: this.yIndex,\r\n }\r\n }\r\n}\r\n\r\nexport default ChartEventElement\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport { IIdea, RootChartConfigObject, Theme, TodoObjectHashAnyType } from '../../types/shared'\r\nimport { ChartEditorEnum, IndicatorType, LayoutType, SpecificChartFunctionality } from '../constants/common'\r\nimport Indicator from '../indicators/indicator'\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport { ChartSyncablePart } from './chart/contstants'\r\nimport { ISettings } from './chart_settings/interfaces'\r\nimport DrawingsInternalStore from './drawings-internal-store'\r\nimport Pane from './pane'\r\nimport { QuoteFetchType } from './quote/constants'\r\n\r\nclass ChartLayout extends Spine.Model {\r\n static initClass(chartModel: typeof Chart, drawingsInternalStoreModel: typeof DrawingsInternalStore) {\r\n this.configure(\r\n 'ChartLayout',\r\n 'layout',\r\n 'activeChart',\r\n 'activePane',\r\n 'activeChartEvent',\r\n 'width',\r\n 'height',\r\n 'editable',\r\n 'canChangeTicker',\r\n 'scrollable',\r\n 'initialScrollable',\r\n 'cross',\r\n 'editors',\r\n 'theme',\r\n 'settings',\r\n 'isWheelZoomEnabled',\r\n 'specificChartFunctionality',\r\n 'isLargeChart',\r\n 'isHideDrawingsActive',\r\n 'isPreserveDrawingsActive',\r\n 'isLockDrawingsActive',\r\n 'isDrawingModeContinuousActive',\r\n 'uuid',\r\n 'isTouchCrossActive',\r\n 'defaultZoomFactor',\r\n 'syncChartParts',\r\n 'isInit',\r\n 'idea'\r\n )\r\n this.hasMany('charts', chartModel)\r\n this.belongsTo('drawingsInternalStore', drawingsInternalStoreModel)\r\n }\r\n\r\n declare layout: LayoutType\r\n declare activeChart: Chart\r\n declare activePane?: Pane\r\n declare activeChartEvent?: ChartEventElement\r\n declare width: number\r\n declare height: number\r\n declare editable: boolean\r\n declare canChangeTicker: boolean\r\n declare scrollable: boolean\r\n declare readonly initialScrollable: boolean\r\n declare cross: boolean\r\n declare editors: ChartEditorEnum[]\r\n declare theme: Theme\r\n declare settings: ISettings\r\n declare isWheelZoomEnabled: boolean\r\n declare specificChartFunctionality: SpecificChartFunctionality\r\n declare isLargeChart?: boolean\r\n declare charts: () => Collection\r\n declare isHideDrawingsActive: boolean\r\n declare isPreserveDrawingsActive: boolean\r\n declare isLockDrawingsActive: boolean\r\n declare isDrawingModeContinuousActive: boolean\r\n declare uuid: string\r\n declare isTouchCrossActive?: boolean\r\n declare defaultZoomFactor: number\r\n declare syncChartParts: ChartSyncablePart[]\r\n declare idea?: IIdea\r\n declare isInit?: boolean\r\n declare drawingsInternalStore: () => DrawingsInternalStore\r\n\r\n getPaneWithSelection() {\r\n for (const pane of this.getAllPanes()) {\r\n if (pane.selection) {\r\n return pane\r\n }\r\n }\r\n }\r\n\r\n toObject() {\r\n const charts = this.getAllCharts().map((chart) => chart.toObject())\r\n return {\r\n layout: this.layout,\r\n width: this.width,\r\n height: this.height,\r\n charts,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\r\n }\r\n }\r\n\r\n toConfig = RootChartConfigObject>(omitKeys = [] as string[]): T {\r\n const charts = this.getAllCharts().map((chart) => chart.toConfig(omitKeys))\r\n return JSON.parse(\r\n JSON.stringify(\r\n omit(\r\n {\r\n ...this.settings.ChartSettings.center,\r\n layout: this.layout,\r\n width: this.width,\r\n height: this.height,\r\n charts,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\r\n colors: this.settings.ChartSettings.general.Colors,\r\n specificChartFunctionality: this.specificChartFunctionality,\r\n editors: this.editors,\r\n editable: this.editable,\r\n scrollable: this.scrollable,\r\n theme: this.theme,\r\n newCharts: /\\bcharts\\b/.test(window.location.pathname),\r\n },\r\n omitKeys\r\n )\r\n )\r\n )\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.getAllCharts().forEach((chart) => {\r\n chart.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n getAllCharts() {\r\n return this.charts().all()\r\n }\r\n\r\n getAllPanes() {\r\n return this.getAllCharts().flatMap((chart) => chart.getAllPanes())\r\n }\r\n\r\n getAllElements() {\r\n return this.getAllCharts().flatMap((chart) => chart.getAllElements())\r\n }\r\n\r\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\r\n const chartPartsToSync = Array.isArray(chartParts) ? chartParts : [chartParts]\r\n\r\n const newSyncedChartParts = this.syncChartParts?.filter((chartPart) => !chartPartsToSync.includes(chartPart)) ?? []\r\n\r\n if (isInSync) {\r\n newSyncedChartParts.push(...chartPartsToSync)\r\n }\r\n\r\n this.updateAttributes({ syncChartParts: newSyncedChartParts })\r\n }\r\n\r\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\r\n return !!this.syncChartParts?.includes(chartPart)\r\n }\r\n\r\n getIsIndicatorPresent(type: IndicatorType) {\r\n return !!this.charts()\r\n .first()\r\n ?.getAllElements()\r\n .some((element) => element.isIndicator() && (element.instance as unknown as Indicator).type === type)\r\n }\r\n\r\n getHTMLElementId() {\r\n return `chart-layout-${this.id}`\r\n }\r\n\r\n exitIdea() {\r\n this.updateAttribute('idea', undefined)\r\n this.getAllCharts().forEach((chart) => {\r\n // Change all idea quotes to non idea quotes and refetch because we don't need them anymore, but they may cause inconsistencies if they are in cache\r\n chart.getAllQuotes().forEach((quote) => {\r\n if (quote.ideaID) {\r\n quote.updateAttributes({ ideaID: undefined })\r\n quote.fetchData({ fetchType: QuoteFetchType.Refetch })\r\n }\r\n })\r\n\r\n chart.updateAttributes({ refreshData: true })\r\n })\r\n }\r\n\r\n isIdeaId(id: number | null = null) {\r\n return (this.idea?.id ?? null) === id\r\n }\r\n}\r\n\r\nexport default ChartLayout\r\n","export type HLC = {\r\n ts: number\r\n count: number\r\n uuid: string\r\n}\r\n\r\nexport const serializeHlc = ({ ts, count, uuid }: HLC) =>\r\n ts.toString().padStart(15, '0') + ':' + count.toString(36).padStart(5, '0') + ':' + uuid\r\n\r\nexport const parseHlc = (serialized: string) => {\r\n const [ts, count, uuid] = serialized.split(':')\r\n return {\r\n ts: Number.parseInt(ts),\r\n count: Number.parseInt(count, 36),\r\n uuid,\r\n }\r\n}\r\n\r\nexport const initHlc = (uuid: string, now: number): HLC => ({\r\n ts: now,\r\n count: 0,\r\n uuid,\r\n})\r\n\r\nexport const compareHlc = (one: HLC, two: HLC) => {\r\n if (one.ts === two.ts) {\r\n if (one.count === two.count) {\r\n if (one.uuid === two.uuid) {\r\n return 0\r\n }\r\n return one.uuid < two.uuid ? -1 : 1\r\n }\r\n return one.count - two.count\r\n }\r\n return one.ts - two.ts\r\n}\r\n\r\nexport const incrementHlc = (local: HLC, now: number): HLC => {\r\n if (now > local.ts) {\r\n return { ts: now, count: 0, uuid: local.uuid }\r\n }\r\n\r\n return { ...local, count: local.count + 1 }\r\n}\r\n\r\nexport const receiveHlc = (local: HLC, remote: HLC): HLC => {\r\n if (compareHlc(local, remote) >= 0) {\r\n return local\r\n }\r\n return { ...local, ts: remote.ts, count: remote.count }\r\n}\r\n","import Spine from '@finviz/spine'\r\n\r\nimport { AutoSaveElement } from '../controllers/autosave/constants'\r\nimport { getUuid } from '../utils/helpers'\r\nimport { HLC, initHlc } from '../utils/hlc'\r\nimport { AutoSaveState } from './constants'\r\n\r\ninterface DrawingsInternalStateAttrs {\r\n elements: AutoSaveElement[]\r\n latestRemoteUpdateTimestamp: HLC\r\n latestLocalUpdateTimestamp: HLC\r\n instanceUUID: string\r\n autoSaveState: AutoSaveState\r\n}\r\n\r\nclass DrawingsInternalStore extends Spine.Model {\r\n static initClass() {\r\n this.configure(\r\n 'DrawingsInternalState',\r\n 'elements',\r\n 'latestRemoteUpdateTimestamp',\r\n 'latestLocalUpdateTimestamp',\r\n 'autoSaveState',\r\n 'instanceUUID'\r\n )\r\n }\r\n\r\n elements: AutoSaveElement[]\r\n latestRemoteUpdateTimestamp: HLC\r\n latestLocalUpdateTimestamp: HLC\r\n instanceUUID: string\r\n autoSaveState: AutoSaveState\r\n\r\n constructor(attrs: Partial = {}) {\r\n super(attrs)\r\n\r\n this.elements = attrs.elements ?? []\r\n this.instanceUUID = attrs.instanceUUID ?? getUuid()\r\n this.latestLocalUpdateTimestamp = attrs.latestLocalUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\r\n this.latestRemoteUpdateTimestamp = attrs.latestRemoteUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\r\n this.autoSaveState = attrs.autoSaveState ?? AutoSaveState.Off\r\n }\r\n\r\n setAutoSaveState = (newAutoSaveState: AutoSaveState) => {\r\n if (this.autoSaveState !== newAutoSaveState) {\r\n this.updateAttributes({ autoSaveState: newAutoSaveState })\r\n }\r\n }\r\n}\r\n\r\nexport default DrawingsInternalStore\r\n","import Spine from '@finviz/spine'\r\n\r\nimport Chart from './chart'\r\n\r\nclass Indicator extends Spine.Model {\r\n static initClass(chartModel: typeof Chart) {\r\n this.configure('Indicator', 'instance')\r\n this.belongsTo('chart', chartModel)\r\n }\r\n\r\n declare chart: () => Chart\r\n\r\n // instance - todo - not sure what instance type to put here\r\n}\r\n\r\nexport default Indicator\r\n","import Spine from '@finviz/spine'\r\n\r\nimport Chart from './chart'\r\n\r\nclass Overlay extends Spine.Model {\r\n static initClass(chartModel: typeof Chart) {\r\n this.configure('Overlay', 'overlay')\r\n this.belongsTo('chart', chartModel)\r\n }\r\n\r\n declare overlay: any\r\n declare chart: () => Chart\r\n}\r\n\r\nexport default Overlay\r\n","/**\r\n * This file sets up the relationships between models and solves circular dependencies\r\n * This file needs to be imported in the index file so that the relationships are\r\n * called in time for instantiation.\r\n */\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport ChartLayout from './chart_layout'\r\nimport DrawingsInternalStore from './drawings-internal-store'\r\nimport Element from './element'\r\nimport Indicator from './indicator'\r\nimport Overlay from './overlay'\r\nimport Pane from './pane'\r\nimport Quote from './quote'\r\n\r\nChart.initClass(Pane, Quote, ChartLayout)\r\nChartLayout.initClass(Chart, DrawingsInternalStore)\r\nDrawingsInternalStore.initClass()\r\nElement.initClass(Pane)\r\nChartEventElement.initClass(Pane)\r\nIndicator.initClass(Chart)\r\nOverlay.initClass(Chart)\r\nPane.initClass(Element, ChartEventElement, Chart)\r\n","import './lib/shims'\r\nimport { initialize } from './logger'\r\nimport './models/relationships'\r\n\r\nif (document.location.hostname === 'localhost') {\r\n initialize()\r\n}\r\n","import { InputColorPicker, convertColorToHEX } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\ninterface BackgroundInputProps {\r\n label: string\r\n value: string\r\n onChange: (color: string) => void\r\n}\r\n\r\nexport function BackgroundInput({ label = 'Background', value, onChange }: BackgroundInputProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import { InputColorPicker, Paragraph, RangeSlider } from '@finviz/website'\r\nimport React, { useCallback } from 'react'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\n\r\ninterface ColorRangeRowInputProps {\r\n label: string\r\n colorValue: string\r\n colorTestId: string\r\n rangeValue: string\r\n rangeTestId: string\r\n rangeLabel: string\r\n rangeProps: ObjectHash\r\n onChange: (colorValue: string, value: string) => void\r\n}\r\n\r\nexport function ColorRangeRowInput({\r\n label,\r\n colorValue,\r\n colorTestId,\r\n rangeValue,\r\n rangeTestId,\r\n rangeLabel,\r\n rangeProps,\r\n onChange,\r\n}: ColorRangeRowInputProps) {\r\n const handleRangeChange = useCallback(\r\n (ev) => {\r\n const value = ev.currentTarget.value\r\n onChange(colorValue, value)\r\n },\r\n [onChange, colorValue]\r\n )\r\n const handleColorChange = useCallback(\r\n (color) => {\r\n onChange(color, rangeValue)\r\n },\r\n [onChange, rangeValue]\r\n )\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n {rangeValue}\r\n \r\n }\r\n onChange={handleRangeChange}\r\n value={Number(rangeValue)}\r\n data-testid={rangeTestId}\r\n />\r\n
\r\n
\r\n )\r\n}\r\n","import { convertColorToHEX } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { ColorRangeRowInput } from './color_range_row'\r\n\r\ninterface Value {\r\n color: string\r\n width: string\r\n}\r\n\r\ninterface BorderInputProps {\r\n label: string\r\n value: Value\r\n min: number\r\n max: number\r\n onChange: (value: Value) => void\r\n}\r\n\r\nexport function BorderInput({ label = 'Border', value, onChange, min, max }: BorderInputProps) {\r\n return (\r\n onChange({ color, width })}\r\n />\r\n )\r\n}\r\n","import { Checkbox } from '@finviz/website'\r\nimport React from 'react'\r\n\r\ninterface CheckBoxProps {\r\n label: string\r\n value: boolean\r\n onChange: (isChecked: boolean) => void\r\n}\r\n\r\nexport function CheckBox({ label, value, onChange }: CheckBoxProps) {\r\n return (\r\n ) => onChange(ev.currentTarget.checked)}\r\n data-testid=\"chart-modal-checkbox\"\r\n >\r\n {label}\r\n \r\n )\r\n}\r\n","import { Checkbox, Input, Label, Select } from '@finviz/website'\r\nimport React, { useCallback, useState } from 'react'\r\n\r\nconst FONT_VALUES = [\r\n { value: 'Arial', label: 'Arial' },\r\n { value: 'Verdana', label: 'Verdana' },\r\n]\r\n\r\ninterface InputProps {\r\n family: string\r\n size: string\r\n style: string\r\n weight: string\r\n}\r\n\r\ninterface FontInputProps {\r\n value: InputProps\r\n onChange: (values: InputProps) => void\r\n}\r\n\r\nexport function FontInput({ value, onChange }: FontInputProps) {\r\n const [family, setFamily] = useState(value.family)\r\n const [size, setSize] = useState(value.size)\r\n const [style, setStyle] = useState(value.style)\r\n const [weight, setWeight] = useState(value.weight)\r\n\r\n const setValue = useCallback(\r\n (key, valueSetter, value) => {\r\n valueSetter(value)\r\n onChange({ family, size, style, weight, [key]: value })\r\n },\r\n [family, size, style, weight, onChange]\r\n )\r\n\r\n return (\r\n
\r\n
\r\n \r\n ) => setValue('size', setSize, ev.currentTarget.value)}\r\n value={size}\r\n data-testid=\"chart-modal-font-size\"\r\n />\r\n\r\n ) =>\r\n setValue('weight', setWeight, ev.currentTarget.checked ? 'bold' : 'normal')\r\n }\r\n data-testid=\"chart-modal-font-weight\"\r\n >\r\n Bold\r\n \r\n ) =>\r\n setValue('style', setStyle, ev.currentTarget.checked ? 'italic' : 'normal')\r\n }\r\n data-testid=\"chart-modal-font-style\"\r\n >\r\n Italic\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import { convertColorToHEX } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { ColorRangeRowInput } from './color_range_row'\r\n\r\ninterface LineInputValue {\r\n color: string\r\n width: string\r\n}\r\n\r\ninterface LineInputProps {\r\n label: string\r\n value: LineInputValue\r\n onChange: (value: LineInputValue) => void\r\n}\r\n\r\nexport function LineInput({ label = 'Line', value, onChange }: LineInputProps) {\r\n return (\r\n onChange({ color, width })}\r\n />\r\n )\r\n}\r\n","import { Textarea } from '@finviz/website'\r\nimport React from 'react'\r\n\r\ninterface MultilineStringInputProps {\r\n label: string\r\n value: string\r\n required: boolean\r\n onChange: (value: string) => void\r\n}\r\n\r\nexport function MultilineStringInput({ label, value, required, onChange }: MultilineStringInputProps) {\r\n return (\r\n ) => onChange(e.target.value)}\r\n value={value}\r\n autoFocus\r\n data-testid=\"chart-modal-multiline-string-textarea\"\r\n />\r\n )\r\n}\r\n","import { Input } from '@finviz/website'\r\nimport React from 'react'\r\n\r\ninterface NumberInputProps {\r\n label: string\r\n name: string\r\n value: number\r\n required: boolean\r\n min?: number\r\n max?: number\r\n allowDecimal?: boolean\r\n step?: number\r\n onChange: (value: number) => void\r\n}\r\n\r\nexport function NumberInput(props: NumberInputProps) {\r\n const { label, name, value, required, min, max, step, allowDecimal = false } = props\r\n\r\n return (\r\n ) =>\r\n props.onChange(allowDecimal ? parseFloat(e.target.value) : parseInt(e.target.value, 10))\r\n }\r\n data-testid=\"chart-modal-number-input\"\r\n />\r\n )\r\n}\r\n","import { Input } from '@finviz/website'\r\nimport React from 'react'\r\n\r\ninterface StringInputProps {\r\n label: string\r\n name: string\r\n value: string\r\n required: boolean\r\n onChange: (value: string) => void\r\n}\r\n\r\nexport function StringInput(props: StringInputProps) {\r\n const { label, name, value, required } = props\r\n\r\n return (\r\n ) => props.onChange(e.target.value)}\r\n data-testid=\"chart-modal-string-textinput\"\r\n />\r\n )\r\n}\r\n","import { Checkbox, Input, InputColorPicker, convertColorToHEX } from '@finviz/website'\r\nimport React from 'react'\r\n\r\ninterface InputProps {\r\n active: boolean\r\n trend: number\r\n color: string\r\n}\r\n\r\ninterface trendInputProps {\r\n value: InputProps\r\n onChange: (values: InputProps) => void\r\n}\r\n\r\nexport function Trend({ value, onChange }: trendInputProps) {\r\n return (\r\n
\r\n ) => onChange({ ...value, active: ev.currentTarget.checked })}\r\n data-testid=\"chart-modal-trend-active\"\r\n />\r\n ) =>\r\n onChange({ ...value, trend: ev.currentTarget.valueAsNumber })\r\n }\r\n value={value.trend}\r\n data-testid=\"chart-modal-trend-value\"\r\n />\r\n onChange({ ...value, color: color })}\r\n inputDataTestId=\"chart-modal-trend-color\"\r\n />\r\n
\r\n )\r\n}\r\n","import { Checkbox, Input, Paragraph } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { MacroTimeframe } from '../../constants/common'\r\nimport { DEFAULTS } from './index'\r\n\r\nexport interface InputProps {\r\n macroKey: MacroTimeframe\r\n isOff: boolean\r\n from: number\r\n to: number\r\n}\r\n\r\ninterface VisibilityInputProps {\r\n value: InputProps\r\n onChange: (value: InputProps) => void\r\n isCheckboxOnly: boolean\r\n}\r\n\r\nexport function VisibilityInput({ value, onChange, isCheckboxOnly }: VisibilityInputProps) {\r\n const [isOff, setIsOff] = React.useState(value.isOff)\r\n const [from, setFrom] = React.useState(value.from)\r\n const [to, setTo] = React.useState(value.to)\r\n const { macroKey } = value\r\n const macroLabel = macroKey.charAt(0).toUpperCase() + macroKey.slice(1)\r\n\r\n const setValue = React.useCallback(\r\n (key, valueSetter, value) => {\r\n valueSetter(value)\r\n onChange({ macroKey, isOff, from, to, [key]: value })\r\n },\r\n [macroKey, isOff, from, to, onChange]\r\n )\r\n return (\r\n
\r\n
\r\n ) => setValue('isOff', setIsOff, !e.target.checked)}\r\n >\r\n {isCheckboxOnly && macroLabel}\r\n \r\n {!isCheckboxOnly && (\r\n <>\r\n ) =>\r\n setValue('from', setFrom, Number(ev.currentTarget.value))\r\n }\r\n data-testid={`visibility-input-${macroKey}-from`}\r\n />\r\n -\r\n ) =>\r\n setValue('to', setTo, Number(ev.currentTarget.value))\r\n }\r\n data-testid={`visibility-input-${macroKey}-to`}\r\n />\r\n {macroLabel}\r\n \r\n )}\r\n
\r\n
\r\n )\r\n}\r\n","import merge from 'lodash.merge'\r\nimport React from 'react'\r\n\r\nimport { IVisibility, MacroTimeframe, MicroTimeframeRange } from '../../constants/common'\r\nimport { isInRange } from '../../utils/helpers'\r\nimport { InputProps, VisibilityInput } from './visibility-input'\r\n\r\ninterface VisibilityProps {\r\n label: string\r\n name: string\r\n value: IVisibility\r\n onChange: (value: IVisibility) => void\r\n handleDisableSubmit: (value: string | false) => void\r\n}\r\n\r\ntype Micro = { isOff: boolean; from: number; to: number }\r\nexport type DEFAULTS_TYPE = { [key in MacroTimeframe]: Micro }\r\n\r\nexport const DEFAULTS: DEFAULTS_TYPE = {\r\n // [MacroTimeframe.seconds]: { isOff: false, from: 1, to: 59 },\r\n [MacroTimeframe.minutes]: { isOff: false, from: 1, to: 59 },\r\n [MacroTimeframe.hours]: { isOff: false, from: 1, to: 24 },\r\n [MacroTimeframe.days]: { isOff: false, from: 1, to: 366 },\r\n [MacroTimeframe.weeks]: { isOff: false, from: 1, to: 52 },\r\n [MacroTimeframe.months]: { isOff: false, from: 1, to: 12 },\r\n}\r\n\r\nconst INPUTS_AVAILABLE = [MacroTimeframe.minutes, MacroTimeframe.hours]\r\n\r\nconst getInitialState = (value: IVisibility) => {\r\n const visibilities = merge({}, DEFAULTS)\r\n for (const visibility in visibilities) {\r\n const macroTimeframe = visibility as MacroTimeframe\r\n const valueMacroTimeframe = value?.[macroTimeframe]\r\n if (!valueMacroTimeframe) continue\r\n if (Object.keys(valueMacroTimeframe).length === 0) {\r\n visibilities[macroTimeframe] = { ...visibilities[macroTimeframe], isOff: true }\r\n } else {\r\n visibilities[macroTimeframe] = { ...visibilities[macroTimeframe], ...valueMacroTimeframe }\r\n }\r\n }\r\n return visibilities\r\n}\r\n\r\nconst getIsVisibilityOutsideAvailableTimeframes = (value: IVisibility) => {\r\n const result = Object.keys(MacroTimeframe).every((macrotimeframe) => {\r\n const macroRange = value[macrotimeframe as MacroTimeframe]\r\n\r\n return (\r\n macroRange &&\r\n (Object.keys(macroRange).length === 0 ||\r\n !MicroTimeframeRange[macrotimeframe as MacroTimeframe].some((item) =>\r\n isInRange({\r\n value: item,\r\n min: macroRange?.from ?? DEFAULTS[macrotimeframe as MacroTimeframe].from,\r\n max: macroRange?.to ?? DEFAULTS[macrotimeframe as MacroTimeframe].to,\r\n })\r\n ))\r\n )\r\n })\r\n return result\r\n}\r\n\r\nexport function Visibility(props: VisibilityProps) {\r\n const initialVisibilityRef = React.useRef(getInitialState(props.value))\r\n\r\n const handleChange = (value: InputProps) => {\r\n const result: IVisibility = props.value ? merge({}, props.value) : {}\r\n result[value.macroKey] = {}\r\n\r\n if (value.isOff) {\r\n props.onChange(result)\r\n } else if (value.from === DEFAULTS[value.macroKey].from && value.to === DEFAULTS[value.macroKey].to) {\r\n delete result[value.macroKey]\r\n props.onChange(result)\r\n } else {\r\n if (value.from !== DEFAULTS[value.macroKey].from) {\r\n result[value.macroKey]!.from = value.from\r\n }\r\n if (value.to !== DEFAULTS[value.macroKey].to) {\r\n result[value.macroKey]!.to = value.to\r\n }\r\n props.onChange(result)\r\n }\r\n\r\n props.handleDisableSubmit(\r\n getIsVisibilityOutsideAvailableTimeframes(result)\r\n ? 'The chosen timeframes would make the drawing invisible on all supported timeframes.'\r\n : false\r\n )\r\n }\r\n\r\n return Object.keys(initialVisibilityRef.current).map((macroKey) => (\r\n \r\n ))\r\n}\r\n","import {\r\n Button,\r\n ButtonGroup,\r\n Dialog,\r\n DialogBody,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogStateReturn,\r\n useDialogState,\r\n} from '@finviz/website'\r\nimport debounce from 'lodash.debounce'\r\nimport * as React from 'react'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport CanvasElement from '../canvas/element'\r\nimport { BackgroundInput } from './background'\r\nimport { BorderInput } from './border'\r\nimport { CheckBox } from './checkbox'\r\nimport { FontInput } from './font'\r\nimport { LineInput } from './line'\r\nimport { MultilineStringInput } from './multiline_string'\r\nimport { NumberInput } from './number'\r\nimport { StringInput } from './string'\r\nimport { Trend } from './trend'\r\nimport { Visibility } from './visibility'\r\n\r\nfunction getInputForType(type: string) {\r\n switch (type) {\r\n case 'number':\r\n return NumberInput\r\n case 'string':\r\n return StringInput\r\n case 'text':\r\n return StringInput\r\n case 'background':\r\n return BackgroundInput\r\n case 'border':\r\n return BorderInput\r\n case 'line':\r\n return LineInput\r\n case 'multiline_string':\r\n return MultilineStringInput\r\n case 'font':\r\n return FontInput\r\n case 'checkbox':\r\n return CheckBox\r\n case 'trend':\r\n return Trend\r\n case 'visibility':\r\n return Visibility\r\n default:\r\n return () =>
ERROR: Unknown input type
\r\n }\r\n}\r\n\r\nconst TAB_BUTTON_COMMON_PROPS = { type: 'button' as const, className: 'flex-1', contentClass: 'text-center' }\r\n\r\ntype OnSubmitType = ((value: ObjectHash) => void) | null\r\ntype OnDismissType = (() => void) | null\r\n\r\nexport interface ElementStyleDialogProps {\r\n state: DialogStateReturn\r\n element: ElementType\r\n onSubmit: ((values: ElementType['attrs']) => void) | null\r\n onDismiss: (() => void) | null\r\n onHide: () => void\r\n}\r\n\r\nexport type StyleDialogOpener = (\r\n element: ElementType,\r\n onSubmit: ElementStyleDialogProps['onSubmit'],\r\n onDismiss: ElementStyleDialogProps['onDismiss']\r\n) => void\r\n\r\nfunction getValuesFromFormState(formState: ObjectHash) {\r\n return formState.reduce((acc: ObjectHash, cur: ObjectHash) => {\r\n acc[cur.name] = cur.value\r\n return acc\r\n }, {} as ObjectHash)\r\n}\r\n\r\nenum DialogTabs {\r\n Style,\r\n Visibility,\r\n}\r\n\r\nexport function ElementStyleDialog(props: ElementStyleDialogProps) {\r\n const config = props.element.getModalConfig()\r\n const initialFormStateRef = React.useRef[]>(JSON.parse(JSON.stringify(config.inputs)))\r\n const [formState, setFormState] = React.useState[]>(config.inputs)\r\n const [selectedTab, setSelectedTab] = React.useState(DialogTabs.Style)\r\n const [isSubmitDisabled, setIsSubmitDisabled] = React.useState(false) // If string, the value is used as title for disabled button.\r\n\r\n const isDrawingElement = props.element.getIsDrawing()\r\n\r\n React.useEffect(() => {\r\n props.element.isEditInProgress = true\r\n return () => {\r\n props.element.isEditInProgress = false\r\n props.element.trigger('change', props.element)\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const handleValuesChange = React.useCallback(\r\n ({\r\n values,\r\n shouldSubmit = false,\r\n shouldDismiss = false,\r\n }: {\r\n values: ObjectHash\r\n shouldSubmit?: boolean\r\n shouldDismiss?: boolean\r\n }) => {\r\n const hasOnSubmit = typeof props.onSubmit === 'function'\r\n const hasOnDismiss = typeof props.onDismiss === 'function'\r\n\r\n props.element.set(values)\r\n if (shouldSubmit && hasOnSubmit) {\r\n props.onSubmit!(values)\r\n } else if (shouldDismiss && hasOnDismiss) {\r\n props.onDismiss!()\r\n }\r\n\r\n if (shouldSubmit || shouldDismiss) {\r\n props.state.hide()\r\n }\r\n },\r\n [props]\r\n )\r\n\r\n const handleValuesChangeDebounceRef = React.useRef(\r\n debounce(\r\n (newFormState) => {\r\n const values = getValuesFromFormState(newFormState)\r\n handleValuesChange({ values })\r\n },\r\n 50,\r\n { maxWait: 100 }\r\n )\r\n )\r\n\r\n React.useEffect(\r\n () => () => {\r\n handleValuesChangeDebounceRef.current.cancel()\r\n },\r\n []\r\n )\r\n\r\n const onSubmit: React.FormEventHandler = React.useCallback(\r\n (ev: React.FormEvent) => {\r\n ev.preventDefault()\r\n if (ev.currentTarget.checkValidity()) {\r\n const values = getValuesFromFormState(formState)\r\n handleValuesChange({ values, shouldSubmit: true })\r\n }\r\n },\r\n [formState, handleValuesChange]\r\n )\r\n\r\n const handleCloseDialog = React.useCallback(() => {\r\n const values = getValuesFromFormState(initialFormStateRef.current)\r\n handleValuesChange({ values, shouldDismiss: true })\r\n }, [handleValuesChange])\r\n\r\n const getShouldRenderInputForTab = (inputType: string) => {\r\n if (selectedTab === DialogTabs.Visibility && inputType === 'visibility') return true\r\n if (selectedTab !== DialogTabs.Visibility && inputType !== 'visibility') return true\r\n return false\r\n }\r\n\r\n return (\r\n }\r\n onFullyClosed={props.onHide}\r\n >\r\n {config.title}\r\n
\r\n \r\n {isDrawingElement && (\r\n \r\n setSelectedTab(DialogTabs.Style)}\r\n data-testid=\"dialog-tab-button-style\"\r\n >\r\n Style\r\n \r\n setSelectedTab(DialogTabs.Visibility)}\r\n data-testid=\"dialog-tab-button-visibility\"\r\n >\r\n Visibility\r\n \r\n \r\n )}\r\n\r\n {formState.map((input) => {\r\n const InputComponent = getInputForType(input.type) as React.FC<{\r\n onChange: (value: string) => void\r\n handleDisableSubmit?: typeof setIsSubmitDisabled\r\n }>\r\n return (\r\n getShouldRenderInputForTab(input.type) && (\r\n {\r\n setFormState((prevState) => {\r\n const newFormState = prevState.map((stateInput) => {\r\n if (stateInput.name === input.name) {\r\n return { ...stateInput, value }\r\n }\r\n return stateInput\r\n })\r\n handleValuesChangeDebounceRef.current(newFormState)\r\n return newFormState\r\n })\r\n }}\r\n handleDisableSubmit={setIsSubmitDisabled}\r\n />\r\n )\r\n )\r\n })}\r\n \r\n \r\n \r\n \r\n Save\r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nexport const ElementStyleDialogContext = React.createContext>(() => {})\r\n\r\nexport function withElementStyleDialogState

(Component: React.ComponentType

) {\r\n return function WrappedComponent(props: P) {\r\n const context = React.useContext(ElementStyleDialogContext)\r\n\r\n return \r\n }\r\n}\r\n\r\nexport function ElementStyleDialogWrapper(props: { children: React.ReactNode }) {\r\n const [element, setElement] = React.useState(null)\r\n const [onSubmit, setOnSubmit] = React.useState(null)\r\n const [onDismiss, setOnDismiss] = React.useState(null)\r\n const dialog = useDialogState()\r\n\r\n const openDialog = (element: CanvasElement, onSubmit?: OnSubmitType, onDismiss?: OnDismissType) => {\r\n if (onSubmit) {\r\n setOnSubmit(() => onSubmit)\r\n }\r\n if (onDismiss) {\r\n setOnDismiss(() => onDismiss)\r\n }\r\n\r\n setElement(element)\r\n dialog.show()\r\n }\r\n\r\n const onHide = () => {\r\n setElement(null)\r\n setOnSubmit(null)\r\n setOnDismiss(null)\r\n }\r\n\r\n return (\r\n \r\n {props.children}\r\n {element && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { ChartConfigChartPane } from '../../../types/shared'\r\nimport { IndicatorType } from '../../constants/common'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport Element from '../../models/element'\r\nimport PaneModel from '../../models/pane'\r\nimport { HLC, compareHlc, incrementHlc, receiveHlc } from '../../utils/hlc'\r\nimport {\r\n AutoSaveChangeType,\r\n AutoSaveElement,\r\n AutoSaveElementDBRecord,\r\n DrawingChangeTimestamp,\r\n DrawingContainerType,\r\n} from './constants'\r\n\r\nexport function getContainerTypeFromPaneConfig(pane: ChartConfigChartPane) {\r\n const indicatorElement = pane.elements.find((el) => el.type.startsWith('indicators/'))\r\n if (indicatorElement) {\r\n return indicatorElement.type as DrawingContainerType\r\n }\r\n const chartElement = pane.elements.find((el) => el.type.startsWith('charts/'))\r\n if (chartElement) {\r\n return 'chart'\r\n }\r\n return null\r\n}\r\n\r\nexport function getContainerType(model: PaneModel) {\r\n const mainElement = model.mainElement()\r\n const indicatorType = mainElement?.instance?.type ?? null\r\n if (mainElement?.isIndicator() && indicatorType !== IndicatorType.None) {\r\n return indicatorType as DrawingContainerType\r\n }\r\n if (mainElement?.isChart()) {\r\n return 'chart'\r\n }\r\n return null\r\n}\r\n\r\nexport function updateInternalStoreWithChangedElement({\r\n element,\r\n changeType,\r\n currentInternalStore,\r\n lastUpdateTimestamp,\r\n}: {\r\n element: Element\r\n changeType: AutoSaveChangeType\r\n currentInternalStore: AutoSaveElement[]\r\n lastUpdateTimestamp: HLC\r\n}) {\r\n const paneModel = element.pane()\r\n const ticker = paneModel.getQuoteRawTicker()\r\n const containerType = getContainerType(paneModel)\r\n if (ticker && paneModel && containerType && (!element.destroyed || changeType === 'destroy')) {\r\n const instanceJson = element.instance.toAutosaveConfig()\r\n const newDrawing: AutoSaveElement = {\r\n elementId: element.elementId!,\r\n zIndex: element.zIndex,\r\n ticker,\r\n lastChange: lastUpdateTimestamp,\r\n changeType,\r\n containerType,\r\n elementAttrs: JSON.stringify(instanceJson),\r\n }\r\n\r\n const newInternalStore = [...currentInternalStore]\r\n const updateDrawingIndex = newInternalStore.findIndex(\r\n (drawingElement) => drawingElement.elementId === newDrawing.elementId\r\n )\r\n\r\n let shouldSyncAndSave = false\r\n if (updateDrawingIndex > -1) {\r\n const updatedRecord = newInternalStore[updateDrawingIndex]\r\n const hasChangedZIndex = updatedRecord.zIndex !== newDrawing.zIndex\r\n const hasChangedType = updatedRecord.changeType !== newDrawing.changeType\r\n const hasChangedAttrs = updatedRecord.elementAttrs !== newDrawing.elementAttrs\r\n const hasChange = hasChangedType || hasChangedAttrs || hasChangedZIndex\r\n if (\r\n !element.instance.isEditInProgress &&\r\n updatedRecord.ticker === ticker &&\r\n hasChange &&\r\n updatedRecord.changeType !== 'destroy'\r\n ) {\r\n newInternalStore[updateDrawingIndex] = newDrawing\r\n shouldSyncAndSave = true\r\n }\r\n } else {\r\n newInternalStore.push(newDrawing)\r\n shouldSyncAndSave = true\r\n }\r\n\r\n return {\r\n newInternalStore,\r\n shouldSyncAndSave,\r\n newDrawing,\r\n }\r\n }\r\n}\r\n\r\nexport function getTickersAndContainerTypesInLayoutModel(chartLayout: ChartLayout) {\r\n const tickers: string[] = []\r\n const containerTypes: Array = ['note']\r\n\r\n chartLayout.getAllPanes().forEach((paneModel) => {\r\n const ticker = paneModel.getQuoteRawTicker()\r\n const containerType = getContainerType(paneModel)\r\n if (ticker && !tickers.includes(ticker)) {\r\n tickers.push(ticker)\r\n }\r\n if (containerType && !containerTypes.includes(containerType)) {\r\n containerTypes.push(containerType)\r\n }\r\n })\r\n return { tickers, containerTypes }\r\n}\r\n\r\nexport function mergeUpdatedDrawingsToInternalStore({\r\n updatedDrawings,\r\n currentInternalStore,\r\n lastUpdateTimestamp,\r\n isRefetchAll,\r\n}: {\r\n updatedDrawings: AutoSaveElement[]\r\n currentInternalStore: AutoSaveElement[]\r\n lastUpdateTimestamp: DrawingChangeTimestamp\r\n isRefetchAll: boolean\r\n}) {\r\n let newLastUpdateTimestamp = lastUpdateTimestamp\r\n const newInternalStore = [...currentInternalStore]\r\n const updatedElementIds: string[] = []\r\n\r\n updatedDrawings.forEach((drawing) => {\r\n newLastUpdateTimestamp = receiveHlc(newLastUpdateTimestamp, drawing.lastChange)\r\n const drawingIndex = newInternalStore.findIndex(({ elementId }) => drawing.elementId === elementId)\r\n const currentDrawing = drawingIndex > -1 ? newInternalStore[drawingIndex] : null\r\n if (currentDrawing === null) {\r\n newInternalStore.push(drawing)\r\n updatedElementIds.push(drawing.elementId)\r\n } else if (currentDrawing.containerType === 'note' && isRefetchAll) {\r\n const currentNote = getElementNoteText(currentDrawing)\r\n const autoSavedNote = getElementNoteText(drawing)\r\n if (currentNote !== autoSavedNote) {\r\n newInternalStore[drawingIndex] = {\r\n ...drawing,\r\n lastChange: incrementHlc(receiveHlc(currentDrawing.lastChange, drawing.lastChange), Date.now()),\r\n elementAttrs: JSON.stringify({\r\n ...JSON.parse(drawing.elementAttrs),\r\n text: `${currentNote}\\r\\n${autoSavedNote}`,\r\n }),\r\n }\r\n }\r\n updatedElementIds.push(drawing.elementId)\r\n } else if (compareHlc(newInternalStore[drawingIndex].lastChange, drawing.lastChange) < 0) {\r\n newInternalStore[drawingIndex] = drawing\r\n updatedElementIds.push(drawing.elementId)\r\n }\r\n })\r\n return { newLastUpdateTimestamp, newInternalStore, updatedElementIds }\r\n}\r\n\r\nexport function getInitialStoreDrawings(): null | AutoSaveElement[] {\r\n const initialDrawings = (\r\n window.FinvizSettings?.initialDrawingsStore ?? window.FinvizChartsSettings?.initialDrawingsStore\r\n )?.drawings as null | AutoSaveElementDBRecord[]\r\n\r\n return initialDrawings?.map((item) => getAutosaveElementFromDBRecord(item)) ?? null\r\n}\r\n\r\nexport function handleCallMethodOnAllDrawings({\r\n chartLayoutModel,\r\n elementMethod,\r\n}: {\r\n chartLayoutModel: ChartLayout\r\n elementMethod: keyof Pick\r\n}) {\r\n chartLayoutModel.getAllElements().forEach((element) => {\r\n if (element.isDrawing()) {\r\n element[elementMethod]()\r\n }\r\n })\r\n}\r\n\r\nexport function getNoteElementId(ticker: string) {\r\n return `note-${ticker}`\r\n}\r\n\r\nexport function getElementNoteText(noteElement?: AutoSaveElement) {\r\n return (noteElement ? JSON.parse(noteElement.elementAttrs)?.text : '') ?? ''\r\n}\r\n\r\nexport function getTickerNoteText({ ticker, elements }: { ticker: string; elements: AutoSaveElement[] }) {\r\n const noteElement = elements.find(({ elementId }) => elementId === getNoteElementId(ticker))\r\n return getElementNoteText(noteElement)\r\n}\r\n\r\nexport function getAutosaveElementFromDBRecord(item: AutoSaveElementDBRecord): AutoSaveElement {\r\n return {\r\n elementId: item.elementId,\r\n ticker: item.ticker,\r\n zIndex: item.zIndex,\r\n changeType: item.changeType,\r\n containerType: item.containerType,\r\n elementAttrs: item.elementAttrs,\r\n lastChange: {\r\n ts: item.lastChangeTimestamp,\r\n count: item.lastChangeCounter,\r\n uuid: item.lastChangeNodeUUID,\r\n },\r\n }\r\n}\r\n\r\nexport function getDBRecordFromAutosaveElement(item: AutoSaveElement): Omit {\r\n return {\r\n elementId: item.elementId,\r\n ticker: item.ticker,\r\n zIndex: item.zIndex,\r\n changeType: item.changeType,\r\n containerType: item.containerType,\r\n elementAttrs: JSON.stringify(item.elementAttrs),\r\n lastChangeTimestamp: item.lastChange.ts,\r\n lastChangeCounter: item.lastChange.count,\r\n lastChangeNodeUUID: item.lastChange.uuid,\r\n }\r\n}\r\n","import { IndicatorType } from '../../constants/common'\r\nimport { HLC } from '../../utils/hlc'\r\n\r\nexport type DrawingChangeTimestamp = HLC\r\nexport type DrawingContainerType = IndicatorType | 'chart' | 'note' | null\r\nexport type AutoSaveChangeType = 'update' | 'destroy'\r\n\r\nexport interface AutoSaveElement {\r\n elementId: string\r\n ticker: string\r\n zIndex: number\r\n lastChange: DrawingChangeTimestamp\r\n changeType: AutoSaveChangeType\r\n containerType: DrawingContainerType\r\n elementAttrs: string\r\n}\r\n\r\nexport type AutoSaveElementDBRecord = Omit & { lastChange: string } & {\r\n lastChangeTimestamp: number\r\n lastChangeCounter: number\r\n lastChangeNodeUUID: string\r\n}\r\n\r\nexport const DRAWINGS_UPDATE_INTERVAL_MS = process.env.IS_E2E_TESTING ? 3000 : 15000\r\nexport const DRAWINGS_SAVE_INTERVAL_MS = 250\r\n","import { Notification, Paragraph, useNotification } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport fetchApi, {\r\n ContentType,\r\n ForbiddenError,\r\n GenericStatusCodeError,\r\n GoneError,\r\n InternalServerError,\r\n} from '../../utils/fetch_api'\r\nimport { HLC, compareHlc, incrementHlc } from '../../utils/hlc'\r\nimport { getByteLengthOfString } from '../../utils/string-byte-length'\r\nimport { AutoSaveElement, AutoSaveElementDBRecord, DrawingContainerType } from './constants'\r\nimport { getAutosaveElementFromDBRecord, getDBRecordFromAutosaveElement } from './utils'\r\n\r\nconst RETRY_LIMIT = 5\r\n\r\nexport function useDrawingAutoSaveApi() {\r\n const postRetryCountRef = React.useRef(0)\r\n const deleteRetryCountRef = React.useRef(0)\r\n const notificationContext = useNotification()\r\n\r\n const fetchDrawings = React.useCallback(\r\n async ({\r\n tickers,\r\n containerTypes,\r\n lastChange,\r\n }: {\r\n tickers: string[]\r\n containerTypes: DrawingContainerType[]\r\n lastChange: HLC\r\n }) => {\r\n try {\r\n const data = await fetchApi<{\r\n drawings: AutoSaveElementDBRecord[]\r\n }>({\r\n location: '/api/auto_save.ashx',\r\n queryParameters: {\r\n ticker: tickers.join(','),\r\n containerTypes: containerTypes.join(',') || undefined,\r\n lastChangeTimestamp: lastChange.ts,\r\n lastChangeCounter: lastChange.count,\r\n lastChangeNodeUUID: lastChange.uuid,\r\n },\r\n throwOnStatusCodes: [403, 404],\r\n })\r\n return data.drawings.map((drawing) => getAutosaveElementFromDBRecord(drawing))\r\n } catch {\r\n // ignore error\r\n }\r\n\r\n return []\r\n },\r\n []\r\n )\r\n\r\n const saveDrawings = React.useCallback(\r\n async (drawings: AutoSaveElement[]): Promise => {\r\n if (drawings.length === 0) {\r\n return undefined\r\n }\r\n\r\n try {\r\n const bodyJsonString = JSON.stringify(drawings.map((item) => getDBRecordFromAutosaveElement(item)))\r\n let keepalive = false\r\n try {\r\n keepalive = getByteLengthOfString(bodyJsonString) < 64000\r\n } catch (error: any) {\r\n window.Sentry?.captureException(error)\r\n }\r\n await fetchApi({\r\n location: '/api/auto_save.ashx',\r\n method: 'POST',\r\n throwOnStatusCodes: [400, 403, 404, 410, 500],\r\n contentType: ContentType.ApplicationJson,\r\n body: bodyJsonString,\r\n keepalive,\r\n })\r\n const [latestChangeHlc] = [...drawings].sort((a, b) => compareHlc(b.lastChange, a.lastChange))\r\n postRetryCountRef.current = 0\r\n return latestChangeHlc.lastChange\r\n } catch (error) {\r\n if (error instanceof InternalServerError) {\r\n // try again\r\n if (postRetryCountRef.current < RETRY_LIMIT) {\r\n postRetryCountRef.current = postRetryCountRef.current + 1\r\n await new Promise((r) => setTimeout(r, 1000))\r\n return saveDrawings(drawings)\r\n } else {\r\n // continue to report to Sentry\r\n postRetryCountRef.current = 0\r\n }\r\n } else if (error instanceof ForbiddenError) {\r\n // ignore error\r\n return undefined\r\n } else if (error instanceof GoneError) {\r\n const newTicker = (error.response as ObjectHash).newTicker\r\n const message = newTicker\r\n ? `Ticker \"${drawings[0].ticker}\" was renamed to \"${newTicker}\"`\r\n : `Ticker \"${drawings[0].ticker}\" no longer exists.`\r\n notificationContext.show(\r\n } timeoutInMs={6000}>\r\n {message}\r\n \r\n )\r\n return undefined\r\n }\r\n\r\n // report error to Sentry\r\n window.Sentry?.captureException(error, {\r\n extra: (error instanceof GenericStatusCodeError\r\n ? (error.response as ObjectHash).invalidItems\r\n : drawings\r\n ).reduce(\r\n (acc: ObjectHash, cur: ObjectHash, index: number) => ({ ...acc, [`item-${index}`]: JSON.stringify(cur) }),\r\n {} as ObjectHash\r\n ),\r\n })\r\n\r\n return undefined\r\n }\r\n },\r\n [notificationContext]\r\n )\r\n\r\n const deleteAllDrawings = React.useCallback(\r\n async ({ tickers, lastLocalChange }: { tickers: string[]; lastLocalChange: HLC }): Promise => {\r\n try {\r\n const newHlc = incrementHlc(lastLocalChange, Date.now())\r\n await fetchApi({\r\n location: `/api/auto_save.ashx?ticker=${tickers.join(',')}&lastChangeTimestamp=${\r\n newHlc.ts\r\n }&lastChangeCounter=${newHlc.count}&lastChangeNodeUUID=${newHlc.uuid}`,\r\n method: 'DELETE',\r\n throwOnStatusCodes: [403, 404, 500],\r\n keepalive: true,\r\n })\r\n deleteRetryCountRef.current = 0\r\n } catch (error) {\r\n if (error instanceof InternalServerError) {\r\n // try again\r\n if (deleteRetryCountRef.current < RETRY_LIMIT) {\r\n deleteRetryCountRef.current = deleteRetryCountRef.current + 1\r\n await new Promise((r) => setTimeout(r, 1000))\r\n return deleteAllDrawings({ tickers, lastLocalChange })\r\n } else {\r\n // continue to report to Sentry\r\n deleteRetryCountRef.current = 0\r\n }\r\n } else if (error instanceof ForbiddenError) {\r\n // ignore error\r\n return\r\n }\r\n\r\n // report error to Sentry\r\n window.Sentry?.captureException(error)\r\n }\r\n },\r\n []\r\n )\r\n\r\n return { fetchDrawings, saveDrawings, deleteAllDrawings }\r\n}\r\n","// byteLengthCharCode2 from https://stackoverflow.com/a/63893237\r\n\r\nexport function getByteLengthOfString(s: string) {\r\n //assuming the String is UCS-2(aka UTF-16) encoded\r\n let n = 0\r\n for (let i = 0, l = s.length; i < l; i++) {\r\n const hi = s.charCodeAt(i)\r\n if (hi < 0x0080) {\r\n n += 1\r\n } else if (hi < 0x0800) {\r\n n += 2\r\n } else if (hi < 0xd800) {\r\n n += 3\r\n } else if (hi < 0xdc00) {\r\n const lo = s.charCodeAt(++i)\r\n if (i < l && lo >= 0xdc00 && lo <= 0xdfff) {\r\n n += 4\r\n } else {\r\n throw new Error('UCS-2 String malformed')\r\n }\r\n } else if (hi < 0xe000) {\r\n throw new Error('UCS-2 String malformed')\r\n } else {\r\n n += 3\r\n }\r\n }\r\n return n\r\n}\r\n","import React from 'react'\r\n\r\nimport { DrawingSpineOptions, DrawingSpineOptionsEvent } from '../../../types/shared'\r\nimport ElementCanvas from '../../canvas/element'\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { getCanvasElementByType } from '../../helpers/get-canvas-element-by-type'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { AutoSaveState } from '../../models/constants'\r\nimport Element from '../../models/element'\r\nimport { compareHlc, incrementHlc, initHlc, receiveHlc } from '../../utils/hlc'\r\nimport { AutoSaveChangeType, AutoSaveElement, DRAWINGS_SAVE_INTERVAL_MS } from './constants'\r\nimport { useDrawingAutoSaveApi } from './use-drawing-autosave-api'\r\nimport { useIsAutoSaveActive } from './use-is-auto-save-active'\r\nimport {\r\n getContainerType,\r\n getNoteElementId,\r\n getTickerNoteText,\r\n getTickersAndContainerTypesInLayoutModel,\r\n mergeUpdatedDrawingsToInternalStore,\r\n updateInternalStoreWithChangedElement,\r\n} from './utils'\r\n\r\nexport function useDrawingAutoSaveControls(chartLayout: ChartLayout) {\r\n const { fetchDrawings, saveDrawings, deleteAllDrawings } = useDrawingAutoSaveApi()\r\n const isAutoSaveActive = useIsAutoSaveActive(chartLayout)\r\n const drawingsInternalStore = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\r\n const saveTimeoutRef = React.useRef()\r\n\r\n React.useEffect(\r\n () => () => {\r\n if (saveTimeoutRef.current) {\r\n clearTimeout(saveTimeoutRef.current)\r\n }\r\n },\r\n []\r\n )\r\n\r\n const saveLatestChanges = React.useCallback(\r\n (\r\n withDelayInMs = DRAWINGS_SAVE_INTERVAL_MS,\r\n saveQueueExtraFilterCallback: ((item: AutoSaveElement) => boolean) | null = null\r\n ) => {\r\n if (saveTimeoutRef.current) {\r\n clearTimeout(saveTimeoutRef.current)\r\n }\r\n const saveQueue = drawingsInternalStore.elements.filter(\r\n (item) =>\r\n compareHlc(item.lastChange, drawingsInternalStore.latestLocalUpdateTimestamp) > 0 &&\r\n item.lastChange.uuid === drawingsInternalStore.instanceUUID &&\r\n (saveQueueExtraFilterCallback === null || saveQueueExtraFilterCallback(item))\r\n )\r\n if (saveQueue.length === 0) {\r\n return\r\n }\r\n\r\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Unsaved)\r\n\r\n const save = async () => {\r\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saving)\r\n const result = await saveDrawings(saveQueue)\r\n if (result) {\r\n drawingsInternalStore.updateAttributes({\r\n latestLocalUpdateTimestamp: receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, result),\r\n })\r\n }\r\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saved)\r\n\r\n return result\r\n }\r\n\r\n if (withDelayInMs === 0) {\r\n return save()\r\n }\r\n\r\n saveTimeoutRef.current = window.setTimeout(save, withDelayInMs)\r\n },\r\n [saveDrawings, drawingsInternalStore]\r\n )\r\n\r\n const syncChartLayoutDrawings = React.useCallback(\r\n (drawing: AutoSaveElement) => {\r\n if (drawing.containerType === 'note') {\r\n return\r\n }\r\n const isRemove = drawing.changeType === 'destroy'\r\n\r\n chartLayout.getAllPanes().forEach((paneModel) => {\r\n const ticker = paneModel.getQuoteRawTicker()\r\n const paneContainerType = getContainerType(paneModel)\r\n if (!paneContainerType || drawing.ticker !== ticker) {\r\n return\r\n }\r\n const paneInternalStoreElements = drawingsInternalStore.elements.filter(\r\n (autoSaveElement) => autoSaveElement.ticker === ticker && autoSaveElement.containerType === paneContainerType\r\n )\r\n const paneElements = paneModel.getAllElements()\r\n let element: Element | undefined\r\n paneElements.forEach((paneElement) => {\r\n if (paneElement.isDrawing() && !paneElement.instance.isCreator) {\r\n const paneDrawing = paneInternalStoreElements.find(({ elementId }) => elementId === paneElement.elementId)\r\n if (!paneDrawing || paneDrawing.changeType === 'destroy') {\r\n paneElement.destroyCascade()\r\n } else if (paneElement.elementId && paneElement.elementId === drawing.elementId) {\r\n element = paneElement\r\n }\r\n }\r\n })\r\n\r\n const parsedElementAttrs = JSON.parse(drawing.elementAttrs)\r\n if (element) {\r\n if (drawing.elementAttrs !== JSON.stringify(element.instance.toAutosaveConfig())) {\r\n if (element.pane().selection !== element.instance && !element.hasOngoingInteraction()) {\r\n element.instance.set(parsedElementAttrs)\r\n element.instance.updateScales()\r\n }\r\n }\r\n if (drawing.zIndex !== element.zIndex) {\r\n element.updateAttributes({ zIndex: drawing.zIndex })\r\n }\r\n if (isRemove || paneContainerType !== drawing.containerType) {\r\n element.destroyCascade()\r\n }\r\n } else if (!isRemove && paneContainerType === drawing.containerType) {\r\n const instance = getCanvasElementByType(parsedElementAttrs.type).fromObject(\r\n parsedElementAttrs,\r\n paneModel\r\n ) as ElementCanvas\r\n paneModel.elements().create({ elementId: drawing.elementId, instance, zIndex: drawing.zIndex })\r\n instance.updateScales()\r\n }\r\n })\r\n },\r\n [chartLayout, drawingsInternalStore]\r\n )\r\n\r\n const handleAutoSaveNoteChange = React.useCallback(\r\n (note: string, ticker?: string) => {\r\n if (ticker) {\r\n const newNoteElement: AutoSaveElement = {\r\n elementId: getNoteElementId(ticker),\r\n zIndex: 0,\r\n ticker: ticker,\r\n lastChange: incrementHlc(drawingsInternalStore.latestLocalUpdateTimestamp, Date.now()),\r\n changeType: 'update',\r\n containerType: 'note',\r\n elementAttrs: JSON.stringify({ text: note }),\r\n }\r\n\r\n drawingsInternalStore.updateAttributes({\r\n elements: [\r\n ...drawingsInternalStore.elements.filter(({ elementId }) => elementId !== newNoteElement.elementId),\r\n newNoteElement,\r\n ],\r\n })\r\n }\r\n },\r\n [drawingsInternalStore]\r\n )\r\n\r\n const handleIdeaNoteChange = React.useCallback(\r\n (note: string) => {\r\n if (chartLayout.idea?.note !== note && (chartLayout.idea || note)) {\r\n chartLayout.updateAttribute('idea', { ...chartLayout.idea, note })\r\n handleAutoSaveNoteChange(note, chartLayout.activeChart?.getQuoteRawTicker() ?? undefined)\r\n }\r\n },\r\n [chartLayout, handleAutoSaveNoteChange]\r\n )\r\n\r\n const checkDrawingUpdate = React.useCallback(\r\n async (isRefetchAll = false) => {\r\n const { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n if (isRefetchAll) {\r\n drawingsInternalStore.updateAttributes({\r\n latestRemoteUpdateTimestamp: initHlc(drawingsInternalStore.instanceUUID, 0),\r\n })\r\n }\r\n\r\n const updatedDrawings = await fetchDrawings({\r\n tickers,\r\n containerTypes,\r\n lastChange: drawingsInternalStore.latestRemoteUpdateTimestamp,\r\n })\r\n const { newLastUpdateTimestamp, updatedElementIds, newInternalStore } = mergeUpdatedDrawingsToInternalStore({\r\n updatedDrawings,\r\n currentInternalStore: drawingsInternalStore.elements,\r\n lastUpdateTimestamp: drawingsInternalStore.latestRemoteUpdateTimestamp,\r\n isRefetchAll,\r\n })\r\n\r\n drawingsInternalStore.updateAttributes({\r\n // Even if there are no changes in elements, newInternalStore is new array with the same content which may cause unnecessary rerenders\r\n ...(updatedElementIds.length > 0 ? { elements: newInternalStore } : {}),\r\n latestRemoteUpdateTimestamp: newLastUpdateTimestamp,\r\n latestLocalUpdateTimestamp:\r\n isRefetchAll && newInternalStore.length > 0\r\n ? receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, newLastUpdateTimestamp)\r\n : drawingsInternalStore.latestLocalUpdateTimestamp,\r\n })\r\n\r\n if (updatedElementIds.length > 0 || isRefetchAll) {\r\n saveLatestChanges(0)\r\n const allElements = chartLayout.getAllElements()\r\n updatedElementIds.forEach((elementId) => {\r\n const element = allElements.find((element) => element.elementId === elementId)\r\n\r\n if (element && element.isDrawing() && !element.hasOngoingInteraction()) {\r\n element.destroyCascade()\r\n }\r\n })\r\n\r\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\r\n chartLayout.getAllPanes().forEach((paneModel) => {\r\n paneModel.normalizeZIndexes()\r\n })\r\n\r\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage) {\r\n const activeTicker = chartLayout.activeChart?.getQuoteRawTicker() ?? ''\r\n handleIdeaNoteChange(getTickerNoteText({ ticker: activeTicker, elements: newInternalStore }))\r\n }\r\n }\r\n },\r\n [\r\n chartLayout,\r\n drawingsInternalStore,\r\n syncChartLayoutDrawings,\r\n fetchDrawings,\r\n handleIdeaNoteChange,\r\n saveLatestChanges,\r\n ]\r\n )\r\n\r\n const updateInternalStoreWithElement = React.useCallback(\r\n (element: Element, changeType: AutoSaveChangeType) => {\r\n const updateResult = updateInternalStoreWithChangedElement({\r\n element,\r\n changeType,\r\n currentInternalStore: drawingsInternalStore.elements,\r\n lastUpdateTimestamp: incrementHlc(\r\n receiveHlc(\r\n drawingsInternalStore.latestLocalUpdateTimestamp,\r\n drawingsInternalStore.latestRemoteUpdateTimestamp\r\n ),\r\n Date.now()\r\n ),\r\n })\r\n\r\n if (updateResult) {\r\n const { shouldSyncAndSave, newInternalStore, newDrawing } = updateResult\r\n if (shouldSyncAndSave) {\r\n drawingsInternalStore.updateAttributes({ elements: newInternalStore })\r\n syncChartLayoutDrawings(newDrawing)\r\n }\r\n }\r\n },\r\n [syncChartLayoutDrawings, drawingsInternalStore]\r\n )\r\n\r\n const deleteAllAutoSavedElements = React.useCallback(async () => {\r\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n\r\n await deleteAllDrawings({ tickers, lastLocalChange: drawingsInternalStore.latestLocalUpdateTimestamp })\r\n await checkDrawingUpdate()\r\n }, [chartLayout, deleteAllDrawings, drawingsInternalStore, checkDrawingUpdate])\r\n\r\n const onElementChange = React.useCallback(\r\n (element: Element, _?: any, options?: DrawingSpineOptions) => {\r\n const elementPane = element.pane()\r\n // This may happen if pane had been removed already, in most cases \"element.destroyed\" should be true,\r\n // but we would need to check if it was destroyed by delete drawing action or not, and checking if pane exists covers all cases\r\n if (!element.isDrawing() || element.instance.isCreator || !elementPane) {\r\n return\r\n }\r\n const elementContainerType = getContainerType(elementPane)\r\n const elementPaneTicker = elementPane.getQuoteRawTicker()\r\n const isElementInCurrentChartLayout = chartLayout\r\n .getAllPanes()\r\n .some(\r\n (model) => getContainerType(model) === elementContainerType && model.getQuoteRawTicker() === elementPaneTicker\r\n )\r\n if (isElementInCurrentChartLayout) {\r\n const isRemove = options?.eventType === DrawingSpineOptionsEvent.Remove\r\n updateInternalStoreWithElement(element, isRemove ? 'destroy' : 'update')\r\n }\r\n },\r\n [updateInternalStoreWithElement, chartLayout]\r\n )\r\n\r\n return {\r\n drawingsInternalStore,\r\n onElementChange,\r\n handleIdeaNoteChange,\r\n deleteAllAutoSavedElements,\r\n isAutoSaveActive,\r\n handleAutoSaveNoteChange,\r\n syncChartLayoutDrawings,\r\n saveLatestChanges,\r\n checkDrawingUpdate,\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { getIsPreserveDrawingsAndAutosaveAvailable } from '../../utils/chart'\r\n\r\nexport function useIsAutoSaveActive(chartLayout: ChartLayout) {\r\n const chartLayoutModel = useModelState(chartLayout, {\r\n watchProperties: ['isInit', 'isPreserveDrawingsActive', 'idea'],\r\n })\r\n const { idea, isInit, isPreserveDrawingsActive } = chartLayoutModel\r\n return React.useMemo(\r\n () =>\r\n getIsPreserveDrawingsAndAutosaveAvailable(chartLayoutModel) && isPreserveDrawingsActive && !!isInit && !idea?.id,\r\n [isPreserveDrawingsActive, isInit, idea?.id, chartLayoutModel]\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { CustomSpineEvents } from '../../../types/shared'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { AutoSaveState } from '../../models/constants'\r\nimport Element from '../../models/element'\r\nimport { usePrevious } from '../../utils/use-prev-state'\r\nimport { DRAWINGS_UPDATE_INTERVAL_MS } from './constants'\r\nimport { useDrawingAutoSaveControls } from './use-drawing-auto-save-controls'\r\nimport { getTickersAndContainerTypesInLayoutModel } from './utils'\r\n\r\nfunction useDrawingAutoSave(chartLayout: ChartLayout) {\r\n const {\r\n onElementChange,\r\n deleteAllAutoSavedElements,\r\n checkDrawingUpdate,\r\n syncChartLayoutDrawings,\r\n saveLatestChanges,\r\n isAutoSaveActive,\r\n } = useDrawingAutoSaveControls(chartLayout)\r\n\r\n const drawingsInternalStoreUnwatched = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\r\n const drawingsInternalStore = useModelState(drawingsInternalStoreUnwatched, { watchProperties: ['elements'] })\r\n const prevIsAutoSaveActive = usePrevious(isAutoSaveActive)\r\n\r\n const runInitialSaveAndRefetchUpdate = React.useCallback(async () => {\r\n chartLayout.getAllElements().forEach((element) => {\r\n // Adds drawings to internal store if isAutoSaveActive and they are not in the store yet\r\n if (!drawingsInternalStore.elements.some((drawing) => drawing.elementId === element.elementId)) {\r\n onElementChange(element)\r\n }\r\n })\r\n\r\n // We want to save everything except notes because saving notes can overwrite those already saved in db. Each drawing has different id but there is only one note per ticker\r\n // Notes are merged in checkDrawingUpdate fn\r\n await saveLatestChanges(0, (item) => item.containerType !== 'note')\r\n\r\n checkDrawingUpdate(true)\r\n }, [checkDrawingUpdate, chartLayout, onElementChange, drawingsInternalStore.elements, saveLatestChanges])\r\n\r\n React.useEffect(() => {\r\n if (isAutoSaveActive) {\r\n saveLatestChanges()\r\n }\r\n }, [saveLatestChanges, drawingsInternalStore.elements, isAutoSaveActive])\r\n\r\n React.useEffect(() => {\r\n if (!isAutoSaveActive) {\r\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Off)\r\n return\r\n }\r\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Saved)\r\n if (!prevIsAutoSaveActive && isAutoSaveActive) {\r\n runInitialSaveAndRefetchUpdate()\r\n }\r\n\r\n let { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n\r\n const onChartOrIndicatorChange = () => {\r\n const { tickers: newTickers, containerTypes: newContainerTypes } =\r\n getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n if (\r\n JSON.stringify(tickers) !== JSON.stringify(newTickers) ||\r\n JSON.stringify(containerTypes) !== JSON.stringify(newContainerTypes)\r\n ) {\r\n tickers = newTickers\r\n containerTypes = newContainerTypes\r\n checkDrawingUpdate(true)\r\n }\r\n }\r\n\r\n ChartModel.bind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\r\n Element.bind('change', onElementChange)\r\n\r\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\r\n const checkDrawingUpdateInterval = setInterval(checkDrawingUpdate, DRAWINGS_UPDATE_INTERVAL_MS)\r\n\r\n return () => {\r\n clearInterval(checkDrawingUpdateInterval)\r\n ChartModel.unbind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\r\n Element.unbind('change', onElementChange)\r\n }\r\n }, [\r\n chartLayout,\r\n drawingsInternalStore,\r\n checkDrawingUpdate,\r\n onElementChange,\r\n syncChartLayoutDrawings,\r\n isAutoSaveActive,\r\n prevIsAutoSaveActive,\r\n runInitialSaveAndRefetchUpdate,\r\n ])\r\n\r\n return { deleteAllAutoSavedElements, isAutoSaveActive }\r\n}\r\n\r\ninterface Props {\r\n chartLayoutModel: ChartLayout\r\n}\r\n\r\nexport const withDrawingsAutoSave = (Component: any) => (props: Props) => {\r\n const { deleteAllAutoSavedElements, isAutoSaveActive } = useDrawingAutoSave(props.chartLayoutModel)\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nexport function usePrevious(value: any) {\r\n const ref = React.useRef()\r\n React.useEffect(() => {\r\n ref.current = value\r\n }, [value])\r\n return ref.current\r\n}\r\n","import omit from 'lodash.omit'\r\nimport queryString from 'query-string'\r\n\r\nimport { Instrument, ObjectHash } from '../../../types/shared'\r\nimport { LayoutType } from '../../constants/common'\r\nimport { getTickerNoteText } from '../../controllers/autosave/utils'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport Quote from '../../models/quote'\r\nimport fetchApi, { getFormDataFromObject } from '../../utils/fetch_api'\r\nimport { captureException } from '../../utils/helpers'\r\n\r\nexport interface IIdea {\r\n ticker: string\r\n instrument: string\r\n period: string\r\n company?: string\r\n date: string\r\n time: string\r\n note: string\r\n id: string\r\n}\r\n\r\nexport interface IIdeaCategory {\r\n ticker: string\r\n ideas: IIdea[]\r\n}\r\n\r\nexport function getIdeaUrl({ ticker, instrument, period, id }: Pick) {\r\n const searchObject = { t: ticker, p: period, i: id }\r\n const isStock = instrument === Instrument.Stock\r\n const isQuotePage = /\\/quote\\b/.test(window.location.pathname)\r\n const isStockOnQute = isQuotePage && isStock\r\n const path = !isQuotePage || isStock ? window.location.pathname : '/charts.ashx'\r\n\r\n return `${path}?${queryString.stringify({ ...searchObject, ...(isStockOnQute ? { ta: '2' } : { l: '1h1v' }) })}`\r\n}\r\n\r\nexport async function saveIdea(layoutModel: ChartLayout) {\r\n const activeChart = layoutModel.activeChart\r\n const activeChartQuote = activeChart.quote().toJSON()\r\n const { ticker, instrument, cid } = activeChart\r\n const period = activeChartQuote.timeframe\r\n const { ChartSettings } = layoutModel.settings\r\n const layout: ObjectHash = layoutModel.toObject()\r\n layout.layout = LayoutType['1h1v']\r\n layout.barWidth = ChartSettings.center.barWidth\r\n layout.barMargin = ChartSettings.center.barMargin\r\n layout.charts = layout.charts\r\n .filter((c: ObjectHash) => c.chartId === cid)\r\n .map((c: ObjectHash) => ({ ...c, dateRange: null, refreshData: false }))\r\n\r\n delete layout.charts[0].chartId\r\n\r\n // TODO: replace with better solution after indicators overhaul\r\n const getChartTickers = (layoutModelObjectPanes: { elements: { type: string; tickers: string }[] }[]) => {\r\n let tickers = []\r\n let tickersString = ''\r\n for (const pane of layoutModelObjectPanes) {\r\n for (const element of pane.elements) {\r\n if (element.type === 'indicators/perf') {\r\n tickersString = element.tickers\r\n }\r\n }\r\n }\r\n tickers = tickersString.split(',').filter((item) => item)\r\n if (!tickers.includes(ticker)) {\r\n tickers.push(ticker.replace('@', ''))\r\n }\r\n return tickers\r\n }\r\n const tickers = getChartTickers(layout.charts[0].panes)\r\n const quotes = Quote.select(\r\n (quote: Quote) =>\r\n tickers.includes(quote.ticker) && quote.timeframe === activeChart.timeframe && layoutModel.isIdeaId(quote.ideaID)\r\n ).filter((element, index, array) => array.findIndex((t) => t.ticker === element.ticker) === index)\r\n const quotesJsonString = JSON.stringify(quotes.map((q) => omit(q.toJSON(), ['ideaID', 'chartUuid'])))\r\n\r\n const chart = JSON.stringify(layout)\r\n const note =\r\n layoutModel.idea?.note ||\r\n getTickerNoteText({ ticker, elements: layoutModel.drawingsInternalStore().elements }) ||\r\n ''\r\n window.gtag?.('event', 'save', { event_category: 'ideas' })\r\n\r\n if (tickers.length !== quotes.length) {\r\n captureException(new Error('Idea saved with inconsistent quotes data'), {\r\n extra: {\r\n tickers,\r\n quoteTickersTimeframes: quotes.map((quote) => ({ ticker: quote.ticker, timeframe: quote.timeframe })),\r\n chartLayout: layoutModel.toConfig(['colors', 'panes']),\r\n },\r\n })\r\n }\r\n\r\n const data = await fetchApi<{ id: string }>({\r\n location: '/api/idea_save.ashx',\r\n method: 'POST',\r\n body: getFormDataFromObject({ ticker, period, chart, quotes: quotesJsonString, note }),\r\n })\r\n\r\n const ideaUrl = getIdeaUrl({\r\n ticker,\r\n period,\r\n instrument,\r\n id: data.id,\r\n })\r\n\r\n if (process.env.IS_E2E_TESTING) {\r\n window.location.href = ideaUrl\r\n } else {\r\n // need to be in setTimeout because Safari block any call to window.open made in async,\r\n // this is hack to force run window.open in main thread\r\n setTimeout(() => {\r\n window.open(ideaUrl, 'FinvizSavedIdea')\r\n })\r\n }\r\n}\r\n\r\nexport function categorizeIdeas(ideas: IIdea[], tickers: string[]) {\r\n if (ideas.length <= 0) return []\r\n\r\n const categorizedIdeas = ideas.reduce((processed, idea) => {\r\n const tickerIdeas = processed.find((i) => i.ticker === idea.ticker)\r\n\r\n if (tickerIdeas) {\r\n tickerIdeas.ideas.push(idea)\r\n } else if (tickers.includes(idea.ticker)) {\r\n processed.push({\r\n ticker: idea.ticker,\r\n ideas: [idea],\r\n })\r\n }\r\n\r\n return processed\r\n }, [] as IIdeaCategory[])\r\n categorizedIdeas.unshift({\r\n ticker: 'All Ideas',\r\n ideas: ideas,\r\n })\r\n\r\n return categorizedIdeas\r\n}\r\n","import { Button, Icon, decodeQueryString } from '@finviz/website'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { ChartsOrQuotePageQueryParams, TIMEFRAME, TimeframeLabelShort } from '../../constants/common'\r\nimport { IIdea, getIdeaUrl } from './utils'\r\n\r\ntype IdeasListProps = {\r\n idea: IIdea\r\n onIdeaDeleted: (idea: IIdea) => void\r\n}\r\n\r\nexport default function IdeaItem({ idea, onIdeaDeleted }: IdeasListProps) {\r\n const [isDeleting, setIsDeleting] = React.useState(false)\r\n const [isConfirmDelete, setIsConfirmDelete] = React.useState(false)\r\n const { i: currentIdea } = decodeQueryString()\r\n\r\n const onDeleteIdeaClick = React.useRef(async (idea: IIdea) => {\r\n setIsDeleting(true)\r\n\r\n const body = [\r\n ['id', idea.id],\r\n ['ticker', idea.ticker],\r\n ['queryString', document.location.search],\r\n ['locationPathname', document.location.pathname],\r\n ['currentIdea', currentIdea],\r\n ]\r\n .map((row) => row.join('='))\r\n .join('&')\r\n\r\n const response = await fetch('/api/idea_delete.ashx', {\r\n body,\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n method: 'post',\r\n })\r\n\r\n if (currentIdea === String(idea.id)) {\r\n window.location.href = response.url\r\n return\r\n }\r\n\r\n // Check if the page was loaded with the idea which is going to be deleted here\r\n // If that's the case, refresh the page to remove idea data from the page so when user navigates back to idea page it shows idea 404\r\n const configIdeaId = window.FinvizChartsSettings?.ideaChart?.idea?.id ?? window.globalChartConfig?.idea?.id\r\n if (configIdeaId === idea.id) {\r\n window.location.reload()\r\n return\r\n }\r\n\r\n onIdeaDeleted(idea)\r\n })\r\n\r\n return (\r\n (document.location = getIdeaUrl(idea))}\r\n data-testid=\"charts-notice-idea-item\"\r\n >\r\n <>\r\n

\r\n

\r\n {idea.ticker}\r\n {idea.company && {idea.company}}\r\n

\r\n \r\n {idea.date}\r\n {idea.time}\r\n \r\n \r\n {TimeframeLabelShort[idea.period as TIMEFRAME]}\r\n \r\n \r\n {idea.note !== '' ? (\r\n

{idea.note}

\r\n ) : null}\r\n
\r\n\r\n ) => {\r\n ev.stopPropagation()\r\n setIsConfirmDelete(true)\r\n }}\r\n />\r\n \r\n\r\n {isConfirmDelete && (\r\n
\r\n
\r\n

\r\n Delete {idea.ticker} Idea from {idea.date}?\r\n

\r\n
\r\n\r\n
\r\n {\r\n setIsConfirmDelete(false)\r\n }}\r\n >\r\n Cancel\r\n \r\n {\r\n onDeleteIdeaClick.current(idea)\r\n }}\r\n >\r\n Delete\r\n \r\n
\r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { Badge, Tab, TabList, TabPanel, Tabs } from '@finviz/website'\r\nimport React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { getInstrument } from '../../utils/chart'\r\nimport fetchApi from '../../utils/fetch_api'\r\nimport IdeaItem from './IdeaItem'\r\nimport { IIdea, IIdeaCategory, categorizeIdeas } from './utils'\r\n\r\nexport default function IdeasTabs() {\r\n const [hasError, setHasError] = React.useState(false)\r\n const [hasFetched, setHasFetched] = React.useState(false)\r\n const [categorizedIdeas, setCategorizedIdeas] = React.useState([])\r\n const [params] = useSearchParams()\r\n const queryTickers = params.get('t')!.split(',') // there always be some t param defined\r\n\r\n React.useEffect(() => {\r\n async function fetchIdeas() {\r\n window.gtag?.('event', 'load', { event_category: 'ideas' })\r\n try {\r\n const data = await fetchApi({ location: '/api/ideas_load.ashx', throwOnStatusCodes: [404] })\r\n const ideas = data.ideas.map((idea: IIdea) => {\r\n const dateParts = idea.date.split(' ')\r\n return {\r\n ...idea,\r\n instrument: getInstrument(idea.ticker),\r\n date: dateParts[0].replace('-', ' ').replace('-', ', '),\r\n time: dateParts[1],\r\n }\r\n })\r\n\r\n setCategorizedIdeas(categorizeIdeas(ideas, queryTickers))\r\n setHasFetched(true)\r\n } catch {\r\n setHasError(true)\r\n }\r\n }\r\n\r\n fetchIdeas()\r\n\r\n // run only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const handleIdeaDeleted = (idea: IIdea) => {\r\n setCategorizedIdeas((prev) => {\r\n const modifiedCategories = [...prev]\r\n\r\n // remove from specific ticker category\r\n const categoryIndex = modifiedCategories.findIndex((c) => c.ticker === idea.ticker)\r\n if (categoryIndex >= 0) {\r\n const updatedCategory = {\r\n ...modifiedCategories[categoryIndex],\r\n ideas: modifiedCategories[categoryIndex].ideas.filter((i) => i.ticker !== idea.ticker),\r\n }\r\n modifiedCategories[categoryIndex] = updatedCategory\r\n }\r\n\r\n // remove from all\r\n const updatedAll = {\r\n ...modifiedCategories[0],\r\n ideas: modifiedCategories[0].ideas.filter((i) => i.ticker !== idea.ticker),\r\n }\r\n modifiedCategories[0] = updatedAll\r\n\r\n // remove empty categories\r\n return modifiedCategories.filter((c) => c.ideas.length !== 0)\r\n })\r\n }\r\n\r\n if (!hasFetched || hasError) {\r\n return (\r\n
\r\n {hasError ? 'Unexpected error occurred, please refresh the page.' : 'Loading…'}\r\n
\r\n )\r\n }\r\n\r\n if (categorizedIdeas.length === 0) {\r\n return (\r\n \r\n No saved ideas.\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n \r\n {categorizedIdeas.map((category) => (\r\n {category.ideas.length}}>\r\n {category.ticker}\r\n \r\n ))}\r\n \r\n {categorizedIdeas.map((category) => (\r\n \r\n
\r\n {category.ideas.map((idea) => (\r\n \r\n ))}\r\n
\r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n","import { Dialog, DialogBody, DialogHeader, DialogStateReturn } from '@finviz/website'\r\n\r\nimport IdeasTabs from './IdeasTabs'\r\n\r\ntype IdeasDialogProps = {\r\n state: DialogStateReturn\r\n}\r\n\r\nexport default function IdeasDialog({ state }: IdeasDialogProps) {\r\n return (\r\n \r\n Your Ideas\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n ButtonComponentProps,\r\n ButtonProps,\r\n Dropdown,\r\n DropdownItem,\r\n Spinner,\r\n Tooltip,\r\n TooltipTrigger,\r\n useDialogState,\r\n useDropdownState,\r\n useTooltipState,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport IdeasDialog from '../../modals/ideas/Ideas'\r\nimport { saveIdea } from '../../modals/ideas/utils'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport Quote from '../../models/quote'\r\nimport { getIsMobileScreenSize } from '../../utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\n\r\ninterface IdeaDropdownProps {\r\n model: ChartLayout\r\n rounding?: 'none' | 'regular'\r\n theme?: ButtonProps['theme']\r\n size?: ButtonProps['size']\r\n dropdownButtonClassName?: string\r\n}\r\n\r\nexport function IdeasDropdown({\r\n model,\r\n rounding,\r\n dropdownButtonClassName,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const tooltipState = useTooltipState({ placement: 'right-start' })\r\n const [isAnyQuoteLoading, setIsAnyQuoteLoading] = React.useState(false)\r\n const ref = React.useRef(null)\r\n const dialog = useDialogState()\r\n const dropdown = useDropdownState()\r\n const hideTooltip = tooltipState.hide\r\n\r\n const dropdownItemProps = isAnyQuoteLoading\r\n ? ({\r\n as: TooltipTrigger,\r\n state: tooltipState,\r\n } as ButtonComponentProps)\r\n : ({} as ButtonComponentProps)\r\n\r\n React.useEffect(() => {\r\n const checkIfAnyQuoteIsLoading = () => {\r\n const fetchingQuotes = Quote.select((quote) => quote.isFetching && quote.fetchedAt === -1)\r\n setIsAnyQuoteLoading(fetchingQuotes.length > 0)\r\n }\r\n\r\n Quote.bind('change', checkIfAnyQuoteIsLoading)\r\n return () => {\r\n Quote.unbind('change', checkIfAnyQuoteIsLoading)\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (!isAnyQuoteLoading || !dropdown.visible) {\r\n hideTooltip()\r\n }\r\n }, [isAnyQuoteLoading, dropdown.visible, hideTooltip])\r\n\r\n if (!window.FinvizSettings.hasUserPremium) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n \r\n }\r\n >\r\n {\r\n if (isAnyQuoteLoading) {\r\n tooltipState.show()\r\n return\r\n }\r\n saveIdea(model)\r\n }}\r\n >\r\n Save idea\r\n \r\n dialog.show()}>\r\n Load idea\r\n \r\n \r\n \r\n {isAnyQuoteLoading && (\r\n \r\n
\r\n \r\n
\r\n \r\n Some data is still loading. Please wait.\r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","export const publishModalAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"modals-publish\" */ './module-entry'),\r\n cacheKey: 'modals-publish',\r\n}\r\n","import { Button, ButtonComponentProps, Delayed, Icon, Spinner, useDialogState } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\n\r\ninterface PublishProps extends Pick {\r\n model: ChartLayout\r\n}\r\n\r\nexport function Publish({ model, ...props }: React.PropsWithChildren) {\r\n const dialog = useDialogState()\r\n const isDialogOpen = dialog.useState('open')\r\n const [publishModalModule, { isLoading }] = useAsyncModule({\r\n ...publishModalAsyncModule,\r\n shouldLoadModule: isDialogOpen,\r\n errorSeverity: 'medium',\r\n onError: () => dialog.hide(),\r\n })\r\n const PublishDialog = publishModalModule?.default\r\n\r\n return (\r\n <>\r\n dialog.show()}\r\n leftContent={\r\n isLoading ? (\r\n \r\n }\r\n >\r\n \r\n \r\n ) : (\r\n 'share'\r\n )\r\n }\r\n />\r\n {PublishDialog && }\r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n ButtonSizeType,\r\n ButtonThemeType,\r\n Delayed,\r\n Icon,\r\n Spinner,\r\n TourDefinition,\r\n useTour,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { getRequestFullscreen, isRedesignEnabled } from '../../utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\n\r\nconst isPremium = window.FinvizSettings.hasUserPremium\r\n\r\n// If we need to update / discontinue some tour we can use skip flag on legacy version to ensure that it won't reset users tour but won't include it in new tours\r\nfunction getTour(page: SpecificChartFunctionality): TourDefinition[] {\r\n return [\r\n {\r\n id: 'chart-tour',\r\n steps: [\r\n {\r\n title: 'Chart Tour',\r\n body: 'Discover powerful Chart features in the 2-min tour to master your analysis of trading opportunities.',\r\n },\r\n ...(isPremium\r\n ? [\r\n {\r\n title: 'Scale the Timeline',\r\n body: 'Grab the timeline to zoom it in and out. Double-click the timeline to reset the scaling.',\r\n target: '[data-testid=\"chart-0-pane-0-zoomer\"]',\r\n },\r\n {\r\n title: 'Scale the Price Axis',\r\n body: 'Grab the Price Axis to zoom it in and out. Move the chart around freely in any direction when Price Axis has custom scale. Double-click the Price Axis to reset the scaling.',\r\n target: '[data-testid=\"chart-0-pane-0-scaler\"]',\r\n },\r\n {\r\n title: 'Drawing tools & settings',\r\n body: 'Pick any Drawing Tool to analyze the market. Tailor your drawing experience with additional settings.',\r\n target: '#toolbar',\r\n },\r\n {\r\n title: 'Fine-tune Drawings',\r\n body: 'Double-click on a chart drawing to tweak its color and style. Right-click on a drawing to access other options, such as changing its visibility, order, and more.',\r\n target: '[data-testid=\"chart-0-pane-0\"]',\r\n },\r\n ]\r\n : [\r\n {\r\n title: 'Enable Drawing mode',\r\n body: (\r\n <>\r\n \r\n Finviz*Elite\r\n {' '}\r\n subscribers get access a whole suite of drawing tools which allow them to draw on and annotate the\r\n chart.
\r\n While in drawing mode, you can also pan the chart, scale the timeline and price axis and much more.\r\n \r\n ),\r\n target: '[data-testid=\"quote-toggle-draw-btn\"]',\r\n placement: 'bottom-start',\r\n },\r\n ]),\r\n {\r\n title: 'Save your best Ideas',\r\n body: isPremium\r\n ? 'Besides your drawings being autosaved, you can manually save ideas that you wish to revisit later.'\r\n : 'Your drawings will be saved automatically, but you can also manually save ideas that you wish to revisit later.',\r\n target: '[data-testid=\"chart-toolbar-ideas\"]',\r\n placement: 'bottom-start',\r\n },\r\n ...(page === SpecificChartFunctionality.quotePage\r\n ? []\r\n : [\r\n {\r\n title: 'Chart Layouts & Charts Sync',\r\n body: 'Switch between Chart Layouts to view multiple charts on your screen. Synchronize Ticker, Timeframe or Crosshair position across your charts.',\r\n target: '[data-testid=\"chart-layout-layout\"]',\r\n },\r\n ]),\r\n ...(!getRequestFullscreen(document.documentElement) && page === SpecificChartFunctionality.chartPage\r\n ? []\r\n : [\r\n {\r\n title: 'Fullscreen mode',\r\n body:\r\n page === SpecificChartFunctionality.quotePage\r\n ? 'Open the chart in an expanded view for full-page display and split-screen charts.'\r\n : 'Toggle the window to fill your entire screen.',\r\n target: '[data-testid=\"chart-layout-fullscreen\"]',\r\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\r\n },\r\n ]),\r\n {\r\n title: 'Share chart',\r\n body: 'Share a chart together with your analysis and ideas.',\r\n target: '[data-testid=\"chart-toolbar-publish\"]',\r\n overlayPadding: page === SpecificChartFunctionality.quotePage ? 3 : undefined,\r\n placement: 'bottom',\r\n },\r\n ...(isRedesignEnabled() || page === SpecificChartFunctionality.chartPage\r\n ? [\r\n {\r\n title: 'Theme',\r\n body: 'Switch between the Light and Dark theme.',\r\n target: '[data-testid=\"chart-layout-theme\"]',\r\n },\r\n ]\r\n : []),\r\n {\r\n title: 'Study Settings',\r\n body: 'Customize the Chart Type and appearance. Add Overlays, Indicators and toggle Extended Hours.',\r\n target: '[data-testid=\"chart-settings-open-btn\"]',\r\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\r\n },\r\n ],\r\n },\r\n page === SpecificChartFunctionality.chartPage && {\r\n id: 'sidebar-watchlist',\r\n steps: [\r\n {\r\n title: 'Explore Your Portfolios',\r\n body: 'Effortlessly navigate through your portfolio holdings. With just a click, visualize individual stock charts, gain insights, and stay updated on your investments.',\r\n target: '[data-testid=\"sidebar-portfolio-btn\"]',\r\n placement: 'left-start',\r\n },\r\n ],\r\n },\r\n ].filter(Boolean) as TourDefinition[]\r\n}\r\n\r\ninterface TourButtonProps {\r\n page: SpecificChartFunctionality\r\n rounding?: 'none' | 'regular'\r\n size?: ButtonSizeType\r\n theme?: ButtonThemeType\r\n className?: string\r\n}\r\n\r\nexport function TourButton({ page, className, theme, ...props }: React.PropsWithChildren) {\r\n const tour = useTour()\r\n const pageTours = getTour(page)\r\n const [userTour, setCurrentTour] = React.useState(tour.getStepsForUser(pageTours))\r\n const buttonTheme: ButtonThemeType = userTour.hasNewTours ? 'blue' : theme ?? 'headerItem'\r\n\r\n return (\r\n \r\n }\r\n >\r\n \r\n \r\n ) : (\r\n \r\n )\r\n }\r\n className={className}\r\n contentClass={page !== SpecificChartFunctionality.quotePage ? 'hidden lg:flex' : ''}\r\n title=\"Explore new features\"\r\n onClick={async () => {\r\n if (userTour) {\r\n const activeTour = await tour.startTour(userTour.tour)\r\n activeTour?.once('inactive', () => {\r\n setCurrentTour(tour.getStepsForUser(pageTours))\r\n })\r\n }\r\n }}\r\n />\r\n )\r\n}\r\n","import { ButtonComponentProps, Icon, Select, SelectListProps } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useChartTypes } from './use-chart-types'\r\n\r\ninterface Props extends Pick {\r\n isPremium: boolean\r\n model: ChartLayout\r\n rounding: SelectListProps['rounding']\r\n}\r\n\r\nexport function ChartTypesSelect({ isPremium, model, ...props }: Props) {\r\n const { chartTypes, getCurrentType } = useChartTypes({ isPremium, model })\r\n const currentType = getCurrentType()\r\n const [selectedType, setSelectedType] = React.useState(currentType)\r\n const icon = chartTypes.find((item) => item.value === selectedType)?.icon\r\n\r\n React.useEffect(() => {\r\n setSelectedType(currentType)\r\n }, [currentType])\r\n\r\n return (\r\n item.value === selectedType)?.icon} className=\"text-gray-300\" />\r\n )\r\n }\r\n nativeSelect=\"mobile\"\r\n onChange={(item) => setSelectedType(item.value)}\r\n />\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\nimport {\r\n DEFAULT_TYPES,\r\n FREE_TYPES_QUOTE,\r\n FREE_TYPES_QUOTE_VALUES,\r\n QuoteLongToShortType,\r\n QuoteNodeChartTypes,\r\n QuoteShortToLongType,\r\n QuoteUrlChartTypes,\r\n TypeBaseOption,\r\n} from './utils'\r\n\r\nexport function useChartTypes({ isPremium, model }: { isPremium: boolean; model: ChartLayout }) {\r\n const location = useLocation()\r\n const { b, t, ta, ty, p = 'd', r } = decodeQueryString(location.search)\r\n const taInt = ta ? Number.parseInt(ta) : 1\r\n const isQuotePage = model.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n\r\n const getCurrentType = React.useCallback(() => {\r\n const defaultType =\r\n ((ty as QuoteUrlChartTypes | undefined) && QuoteShortToLongType[ty as QuoteUrlChartTypes]) ??\r\n (window.FinvizQuoteTypeCurrent as QuoteNodeChartTypes)\r\n\r\n return !isPremium && defaultType === QuoteNodeChartTypes.candlestick && taInt === 0\r\n ? QuoteNodeChartTypes.candlesticksimple\r\n : defaultType\r\n }, [isPremium, taInt, ty])\r\n\r\n const generateRouterPath = React.useCallback(\r\n (type: QuoteNodeChartTypes) => {\r\n if (isPremium || FREE_TYPES_QUOTE_VALUES.includes(type)) {\r\n return `${location.pathname}?${encodeQueryString({\r\n b,\r\n t,\r\n r,\r\n ty:\r\n type === QuoteNodeChartTypes.candlesticksimple\r\n ? QuoteLongToShortType.candlestick\r\n : QuoteLongToShortType[type],\r\n ta: type === QuoteNodeChartTypes.candlestick ? '1' : '0',\r\n p,\r\n })}`\r\n }\r\n return `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: 'quote-chart-type-select',\r\n })}`\r\n },\r\n [isPremium, location.pathname, b, t, r, p]\r\n )\r\n\r\n const chartTypes = React.useMemo(() => {\r\n const options = isPremium || !isQuotePage ? DEFAULT_TYPES : FREE_TYPES_QUOTE\r\n\r\n return options.map((item) => ({\r\n ...item,\r\n href: generateRouterPath(item.value as QuoteNodeChartTypes),\r\n reloadDocument: !isPremium,\r\n })) as TypeBaseOption[]\r\n }, [generateRouterPath, isPremium, isQuotePage])\r\n\r\n return { getCurrentType, chartTypes }\r\n}\r\n","import { Paragraph, withSuspense } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport math from '../../helpers/math'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport { getTickerChange } from '../../utils/chart'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\n\r\ninterface Props {\r\n chartIndex: number\r\n}\r\n\r\ninterface ChangeLabelProps {\r\n children: React.ReactNode\r\n changePoints: number\r\n isTiny: boolean\r\n}\r\n\r\nconst CHANGE_UPATE_EVENTS = ['change', 'update']\r\nconst QUOTE_MODEL_CHANGE_EVENTS = [...CHANGE_UPATE_EVENTS, ...Object.values(QuoteFetchType)]\r\n\r\nfunction ChangeLabel({ children, changePoints, isTiny }: ChangeLabelProps) {\r\n return (\r\n 0,\r\n 'text-red-400': changePoints < 0,\r\n })}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport function DailyChangeDisplayComponent({ chartIndex }: Props) {\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const chartModel = useModelState(chartLayoutModel?.getAllCharts()[chartIndex] ?? null, {\r\n watchProperties: ['quote'],\r\n listenOnEvents: CHANGE_UPATE_EVENTS,\r\n })\r\n const quoteModel = useModelState(chartModel?.quote() ?? null, {\r\n watchProperties: ['lastClose', 'prevClose', 'afterClose'],\r\n listenOnEvents: QUOTE_MODEL_CHANGE_EVENTS,\r\n })\r\n\r\n const tickerChange = quoteModel && getTickerChange({ data: quoteModel })\r\n const isTiny =\r\n !!tickerChange?.tickerChange &&\r\n math.getInstrumentDecimalPlaces({\r\n instrument: quoteModel!.instrument,\r\n value: quoteModel!.lastClose,\r\n }) >= 6\r\n\r\n return (\r\n
\r\n {tickerChange?.tickerChange && (\r\n <>\r\n {tickerChange.tickerAfterChange && (\r\n \r\n {tickerChange.tickerAfterChange.string}\r\n \r\n )}\r\n \r\n {tickerChange.tickerChange.string}\r\n \r\n \r\n )}\r\n
\r\n )\r\n}\r\n\r\nexport const DailyChangeDisplay = React.memo(\r\n withSuspense(DailyChangeDisplayComponent),\r\n (prevProps, nextProps) => prevProps.chartIndex === nextProps.chartIndex\r\n)\r\n","import { Button, ButtonComponentProps, setCookieRequest } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport utils from '../../utils'\r\nimport { DRAWING_COOKIE_NAME, getIsDrawingEnabled } from '../../utils/chart'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\n\r\nconst utmCampaign: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-draw-button',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-interactive-chart',\r\n [SpecificChartFunctionality.forexPage]: 'forex-interactive-chart',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-interactive-chart',\r\n}\r\n\r\nconst testId: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-toggle-draw-btn',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-interactive',\r\n [SpecificChartFunctionality.forexPage]: 'forex-interactive',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-interactive',\r\n}\r\n\r\ninterface DrawButtonProps extends Pick {\r\n isPremium: boolean\r\n specificChartFunctionality: SpecificChartFunctionality\r\n active?: boolean\r\n}\r\n\r\nexport function DrawButton({\r\n isPremium,\r\n specificChartFunctionality,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const buttonProps = React.useMemo(() => {\r\n if (!isPremium) {\r\n return {\r\n as: 'a' as const,\r\n href: `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign[specificChartFunctionality],\r\n })}`,\r\n }\r\n }\r\n\r\n return {\r\n onClick: (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n const newValue = getIsDrawingEnabled() ? 'off' : 'on'\r\n\r\n setCookieRequest(DRAWING_COOKIE_NAME, newValue)\r\n .catch(() => {\r\n // fallback to JS otherwise draw toggle won't work if API don't work\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n utils.setCookie(DRAWING_COOKIE_NAME, newValue, expires)\r\n })\r\n .finally(() => {\r\n const { i: idea, ...rest } = decodeQueryString()\r\n if (idea) {\r\n document.location = `quote.ashx?${encodeQueryString(rest)}`\r\n } else {\r\n document.location.reload()\r\n }\r\n })\r\n },\r\n }\r\n }, [isPremium, specificChartFunctionality])\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Button, ButtonComponentProps } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\n\r\nfunction getTickersString(tickers: string[], tickersCount: number) {\r\n return Array.from({ length: Math.min(tickersCount, 6) })\r\n .map((_, index) => tickers[index] ?? tickers[tickers.length - 1])\r\n .join(',')\r\n}\r\n\r\nfunction getLayoutType(tickersCount: number) {\r\n switch (tickersCount) {\r\n case 0: // shouldn't happen\r\n case 1:\r\n return '1h1v'\r\n case 2:\r\n return '2h1v'\r\n case 3:\r\n return '3h1v'\r\n case 4:\r\n return '2h2v'\r\n case 5:\r\n default:\r\n // 6 and more\r\n return '3h2v'\r\n }\r\n}\r\n\r\nconst utmCampaign: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-fullscreen-button',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-fullscreen-button',\r\n [SpecificChartFunctionality.forexPage]: 'forex-fullscreen-button',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-fullscreen-button',\r\n}\r\n\r\ninterface FullscreenButtonProps extends Pick {\r\n model: ChartLayout\r\n isPremium: boolean\r\n title?: string\r\n}\r\n\r\nexport function FullscreenButton({ model, isPremium, ...props }: React.PropsWithChildren) {\r\n const location = useLocation()\r\n const { i, p = 'd', r } = decodeQueryString(location.search)\r\n const urlTickers = model\r\n .charts()\r\n .all()\r\n .map((chart) => chart.quote().getRawTicker())\r\n\r\n return (\r\n p).join(','),\r\n l: getLayoutType(urlTickers.length),\r\n r,\r\n })}`\r\n : `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign[model.specificChartFunctionality],\r\n })}`\r\n }\r\n />\r\n )\r\n}\r\n","import {\r\n Button,\r\n Dialog,\r\n Dropdown,\r\n DropdownItem,\r\n Icon,\r\n Spinner,\r\n Search as WebsiteSearchComponent,\r\n createAlertAsyncModule,\r\n saveToPortfolioAsyncModule,\r\n useDialogState,\r\n useDropdownState,\r\n} from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\n\r\ninterface SearchProps {\r\n ticker: string\r\n instrument: Instrument\r\n onTickerSelected: (ticker: string) => void\r\n chartIndex: number\r\n}\r\n\r\nexport default function Search({ ticker, instrument, onTickerSelected, chartIndex }: SearchProps) {\r\n const dropdownState = useDropdownState({ placement: 'bottom-end' })\r\n const saveToPortfolioDialogState = useDialogState()\r\n const isSaveToPortfolioVisible = saveToPortfolioDialogState.useState('open')\r\n const createAlertDialogState = useDialogState()\r\n const isCreateAlertVisible = createAlertDialogState.useState('open')\r\n const [saveToPortfolioModule, { isLoading: isLoadingSaveToPortfolio }] = useAsyncModule({\r\n ...saveToPortfolioAsyncModule,\r\n shouldLoadModule: isSaveToPortfolioVisible,\r\n onError: () => saveToPortfolioDialogState.hide(),\r\n })\r\n const [createAlertModule, { isLoading: isLoadingCreateAlert }] = useAsyncModule({\r\n ...createAlertAsyncModule,\r\n shouldLoadModule: isCreateAlertVisible,\r\n onError: () => createAlertDialogState.hide(),\r\n })\r\n const SaveToPortfolio = saveToPortfolioModule?.SaveToPortfolio\r\n const CreateAlert = createAlertModule?.CreateAlert\r\n\r\n const detailLink = React.useMemo(() => {\r\n const formattedTicker = ticker.replace('@', '')\r\n\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n return `/quote.ashx?t=${formattedTicker}`\r\n case Instrument.Futures:\r\n return `/futures_charts.ashx?t=${formattedTicker}`\r\n case Instrument.Forex:\r\n return `/forex_charts.ashx?t=${formattedTicker}`\r\n case Instrument.Crypto:\r\n return `/crypto_charts.ashx?t=${formattedTicker}`\r\n }\r\n }, [ticker, instrument])\r\n\r\n return (\r\n
\r\n }\r\n />\r\n }\r\n >\r\n {\r\n window.gtag?.('event', 'click', { event_category: 'open-stock-detail' })\r\n }}\r\n >\r\n {instrument === Instrument.Stock ? 'Open Stock Detail' : 'Open Detail'}\r\n \r\n {instrument === Instrument.Stock && (\r\n {\r\n saveToPortfolioDialogState.show()\r\n window.gtag?.('event', 'click', { event_category: 'save-to-portfolio' })\r\n }}\r\n >\r\n Save to Portfolio\r\n \r\n )}\r\n {instrument === Instrument.Stock && (\r\n {\r\n createAlertDialogState.show()\r\n window.gtag?.('event', 'click', { event_category: 'create-alert' })\r\n }}\r\n >\r\n Create Alert\r\n \r\n )}\r\n \r\n }\r\n />\r\n \r\n {isLoadingSaveToPortfolio && (\r\n
\r\n \r\n
\r\n )}\r\n {SaveToPortfolio && }\r\n
\r\n \r\n {isLoadingCreateAlert && (\r\n
\r\n \r\n
\r\n )}\r\n {CreateAlert && }\r\n
\r\n
\r\n )\r\n}\r\n","import {\r\n Button,\r\n ButtonComponentProps,\r\n Delayed,\r\n Popover,\r\n PopoverPlacement,\r\n PopoverTrigger,\r\n Spinner,\r\n getExtendedDialogState,\r\n useElementMeasure,\r\n usePopoverState,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport {\r\n chartSettingsAsyncModule,\r\n preventClosingUnsavedChangesAsyncModule,\r\n} from '../../controllers/chart-settings/async-modules'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\n\r\nconst SETTINGS_WIDTH = 580 // w-145\r\nconst BUTTON_POPOVER_GUTTER = 16\r\nconst SETTINGS_POPOVER_ID = 'settings-popover'\r\n\r\nconst utmCampaign: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-settings-button',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-settings-button',\r\n [SpecificChartFunctionality.forexPage]: 'forex-settings-button',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-settings-button',\r\n}\r\n\r\ntype PopoverStylesType = { body?: React.CSSProperties; wrapper?: React.CSSProperties }\r\n\r\nexport function ScrollableChartSettingsPopover({ state, model }: { state: any; model: ChartLayout }) {\r\n const { elementWidth: bodyWidth } = useElementMeasure(document.body)\r\n const [chartSettingsModule] = useAsyncModule({\r\n ...chartSettingsAsyncModule,\r\n shouldLoadModule: state.visible,\r\n errorSeverity: 'medium',\r\n onError: () => state.hide(),\r\n })\r\n const [preventClosingUnsavedChangesModule] = useAsyncModule({\r\n ...preventClosingUnsavedChangesAsyncModule,\r\n shouldLoadModule: state.visible,\r\n errorSeverity: 'medium',\r\n onError: () => state.hide(),\r\n })\r\n\r\n /**\r\n * The reason for this workaround is that the popover with a loader while fetching async modules remounts and resets\r\n * all animations when all async modules are loaded and the popover is rerendered inside PreventClosingUnsavedChanges\r\n * */\r\n const checkForUnsavedChangesAndCloseRef = React.useRef(() => {})\r\n\r\n const { ChartSettings } = chartSettingsModule ?? {}\r\n const { PreventClosingUnsavedChanges } = preventClosingUnsavedChangesModule ?? {}\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const chartElement = document.getElementById('chart')\r\n const popoverContentElement = document.getElementById(SETTINGS_POPOVER_ID)\r\n const settingsButton: HTMLButtonElement = state.unstable_referenceRef.current\r\n\r\n const popoverStyles = React.useMemo(() => {\r\n const newPopoverStyles: PopoverStylesType = {}\r\n if (!settingsButton || !chartElement) {\r\n return newPopoverStyles\r\n }\r\n const buttonRect = settingsButton.getBoundingClientRect()\r\n const topOffset = buttonRect.top + buttonRect.height\r\n newPopoverStyles.body = {\r\n maxHeight: window.innerHeight - topOffset - BUTTON_POPOVER_GUTTER * 2,\r\n position: 'sticky',\r\n top: -topOffset + BUTTON_POPOVER_GUTTER - window.scrollY,\r\n }\r\n if (!popoverContentElement) {\r\n return newPopoverStyles\r\n }\r\n const chartHeight = chartElement.clientHeight\r\n const popoverContentHeight = popoverContentElement.offsetHeight\r\n const emptySpaceDiff = bodyWidth - model.width\r\n const maxOffset = SETTINGS_WIDTH - buttonRect.width\r\n\r\n let rightOffset = emptySpaceDiff > 150 ? (emptySpaceDiff / 2) * -1 : 0\r\n if (emptySpaceDiff / 2 > maxOffset) rightOffset = maxOffset * -1\r\n\r\n newPopoverStyles.wrapper = {\r\n height: popoverContentHeight < chartHeight ? chartHeight : undefined,\r\n marginRight: rightOffset,\r\n }\r\n\r\n return newPopoverStyles\r\n }, [settingsButton, chartElement, popoverContentElement, model.width, bodyWidth])\r\n\r\n const hasAsyncModules = !!(PreventClosingUnsavedChanges && ChartSettings)\r\n\r\n return (\r\n \r\n {hasAsyncModules ? (\r\n \r\n {({ checkForUnsavedChangesAndClose }) => {\r\n checkForUnsavedChangesAndCloseRef.current = checkForUnsavedChangesAndClose\r\n return !isFullyClosed ? : null\r\n }}\r\n \r\n ) : (\r\n \r\n
\r\n \r\n
\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\ninterface ChartSettingsButtonProps extends Pick {\r\n isPremium: boolean\r\n placement?: PopoverPlacement\r\n model: ChartLayout\r\n}\r\n\r\nexport function ChartSettingsButton({\r\n isPremium,\r\n model,\r\n placement,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const settingsPopoverState = usePopoverState({ placement: placement ?? 'bottom-end' })\r\n\r\n const buttonProps = React.useMemo(() => {\r\n if (model.specificChartFunctionality !== SpecificChartFunctionality.quotePage && !isPremium) {\r\n return {\r\n as: 'a',\r\n href: `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign[model.specificChartFunctionality],\r\n })}`,\r\n } as ButtonComponentProps<'a'>\r\n }\r\n\r\n return {\r\n as: PopoverTrigger,\r\n state: settingsPopoverState,\r\n active: settingsPopoverState.visible,\r\n } as ButtonComponentProps\r\n }, [model, isPremium, settingsPopoverState])\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport { ChartsOrQuotePageQueryParams, SpecificChartFunctionality } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { useModelRef } from '../../model-hooks/useModelRef'\r\nimport Chart from '../../models/chart'\r\nimport Quote from '../../models/quote'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport { createRequestAbortController, removeFromAbortCache } from '../../utils/abort_controller'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\nimport { getLeftOffset } from '../renderUtils'\r\n\r\nconst getQuoteRequestKey = (chartModel: Chart) =>\r\n `quoteReq-${chartModel.ticker}-${chartModel.instrument}-${chartModel.id}`\r\n\r\nexport function useChartControls({\r\n chartModel: unwatchedChartModel,\r\n isInteractive,\r\n}: {\r\n chartModel: Chart | null\r\n isInteractive: boolean\r\n}) {\r\n const location = useLocation()\r\n const navigate = useNavigate()\r\n const chartModel = useModelState(unwatchedChartModel, {\r\n watchProperties: ['ticker', 'timeframe', 'dateRange'],\r\n })\r\n const chartLayoutModel = useModelState(chartModel?.chart_layout() ?? null, {\r\n watchProperties: ['idea', 'settings'],\r\n })\r\n const chartModelRef = useModelRef(chartModel)\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const abortControllerKeyRef = React.useRef('')\r\n const isIdeaChart = !!chartLayoutModel?.idea?.id\r\n\r\n const updateChartModelWithNewQuote = React.useCallback((quote: Quote) => {\r\n const chart = chartModelRef.current\r\n if (!chart) {\r\n return\r\n }\r\n\r\n const chartLayoutModel = chart.chart_layout()\r\n const isSameTicker = chart.getQuoteRawTicker() === quote.getRawTicker()\r\n\r\n chart.getAllPanes().forEach((pane) => {\r\n if (!!pane.getChartOrIndicatorElement()) {\r\n pane.updateAttribute('scaleRange', null)\r\n }\r\n })\r\n\r\n chart.updateAttributes({ leftOffset: getLeftOffset({ quote, chartModel: chart }), quote, isScrolled: true })\r\n\r\n // Refetch all other chart quotes as the main one is already refetched so we can filter it out but other quotes (from perf for example) should be refetched as well\r\n chart\r\n .getAllQuotes()\r\n .filter((chartQuote) => !chartQuote.eql(quote))\r\n .forEach((quote) => {\r\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\r\n })\r\n\r\n const chartPane = chart.getChartPane()\r\n chartLayoutModel.activeChartEvent?.instance.toggleIsOpen(false)\r\n\r\n const elements = [...chart.getAllElements(), ...(chartPane?.getAllChartEvents(false) ?? [])]\r\n for (const element of elements) {\r\n const isDrawing = element.isDrawing()\r\n const isChartEvent = element.isChartEvent()\r\n if (isDrawing || isChartEvent) {\r\n // We want to remove all drawings on ticker change but if autosave is enabled we let the autosave hook take care of that\r\n if (isSameTicker && (isChartEvent || chartLayoutModel.isPreserveDrawingsActive)) {\r\n element.instance.updateScales()\r\n } else {\r\n element.destroyCascade()\r\n }\r\n }\r\n }\r\n\r\n chart.setChartEvents(quote.chartEvents, true)\r\n\r\n chartPane?.updateChartEventsZIndexes()\r\n\r\n // The only dependency here is a ref , so no need to add it to dependencies\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const fetchQuote = React.useCallback(async () => {\r\n if (!isInteractive || !chartModel || isIdeaChart) {\r\n return\r\n }\r\n setIsLoading(true)\r\n\r\n const { ticker, instrument, timeframe, hasChartEvents } = chartModel\r\n const { premarket, aftermarket } = Quote.first()\r\n const patterns = chartModel.getHasPatterns()\r\n const currentQuote = chartModel.quote()\r\n if (currentQuote.getRawTicker() !== ticker || currentQuote.timeframe !== timeframe) {\r\n abortControllerKeyRef.current = getQuoteRequestKey(chartModel)\r\n const abortController = createRequestAbortController({\r\n key: abortControllerKeyRef.current,\r\n shouldAbortRunningRequest: !Quote.select(\r\n (quote) =>\r\n quote.ticker === ticker &&\r\n quote.timeframe === timeframe &&\r\n quote.isFetching &&\r\n chartModel.chart_layout().isIdeaId(quote.ideaID)\r\n ),\r\n })\r\n\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options: {\r\n premarket,\r\n aftermarket,\r\n events: hasChartEvents,\r\n patterns,\r\n cachePredicate: (quote) => quote.ideaID === undefined,\r\n fetchNewDataOnCachedQuote: true,\r\n },\r\n abortController,\r\n })\r\n\r\n if (quote.wasFetchAborted) {\r\n // Check if the quote is also used in other chars, as the quote may be reused if we already have a quote with the same options\r\n const isQuoteUsedInOtherCharts = chartModel\r\n .chart_layout()\r\n .getAllCharts()\r\n .filter((chart) => !chartModel.eql(chart))\r\n .some((chart) => quote.eql(chart.quote()))\r\n\r\n // If the quote hasn't been fetched yet and is not anywhere else we can destroy the model\r\n if (quote.fetchedAt === -1 && !isQuoteUsedInOtherCharts) {\r\n quote.destroy()\r\n }\r\n\r\n return\r\n }\r\n\r\n removeFromAbortCache(abortControllerKeyRef.current)\r\n\r\n updateChartModelWithNewQuote(quote)\r\n }\r\n\r\n setIsLoading(false)\r\n\r\n // We don't want to create new function on any chartModel change as it may be the same chart with different object instance\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n chartModel?.id,\r\n chartModel?.ticker,\r\n chartModel?.timeframe,\r\n chartModel?.instrument,\r\n isIdeaChart,\r\n updateChartModelWithNewQuote,\r\n isInteractive,\r\n ])\r\n\r\n React.useEffect(() => {\r\n fetchQuote()\r\n }, [fetchQuote])\r\n\r\n // There are several ways how to turn off dateRange, e.g. moving the charts\r\n // This effect listens to dateRange changes on chartmodel and updates the url if there's a change\r\n // Consider refactoring this part so we only update chart models on route changes not the other way around\r\n React.useEffect(() => {\r\n if (chartModel) {\r\n const decodedQueryString = decodeQueryString(location.search)\r\n const rangesArray = chartModel\r\n .chart_layout()\r\n .getAllCharts()\r\n .map((chart) => chart.dateRange)\r\n const ranges = rangesArray.every((i) => !i) ? undefined : rangesArray.join(',')\r\n\r\n if (decodedQueryString.r !== ranges) {\r\n navigate({\r\n search: `?${encodeQueryString({\r\n ...decodedQueryString,\r\n r: ranges,\r\n })}`,\r\n })\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [chartModel?.dateRange])\r\n\r\n // https://github.com/finvizhq/charts/pull/1253/files#r1052266805\r\n // React.useEffect(\r\n // () => () => {\r\n // if (isInteractive && abortControllerKeyRef.current !== '') {\r\n // abortRequest(abortControllerKeyRef.current)\r\n // }\r\n // },\r\n // [isInteractive]\r\n // )\r\n\r\n React.useEffect(() => {\r\n const chart = chartModelRef.current\r\n const quote = chart?.quote()\r\n\r\n let shouldRecalculateOnCharts = false\r\n if (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage && !isIdeaChart) {\r\n const settings = chartLayoutModel?.settings\r\n const barWidth = 3\r\n const barMargin = 1\r\n if (settings) {\r\n const hasSameBarWidth = [\r\n settings.ChartSettings.center.barWidth,\r\n settings.IndicatorSettings.center.barWidth,\r\n ].every((value) => value === barWidth)\r\n const hasSameBarMargin = [\r\n settings.ChartSettings.center.barMargin,\r\n settings.IndicatorSettings.center.barMargin,\r\n ].every((value) => value === barMargin)\r\n\r\n shouldRecalculateOnCharts = !hasSameBarWidth || !hasSameBarMargin\r\n if (shouldRecalculateOnCharts) {\r\n settings.ChartSettings.center.barWidth = barWidth\r\n settings.IndicatorSettings.center.barWidth = barWidth\r\n settings.ChartSettings.center.barMargin = barMargin\r\n settings.IndicatorSettings.center.barMargin = barMargin\r\n\r\n chartLayoutModel.updateAttributes({ settings })\r\n }\r\n }\r\n }\r\n\r\n if (\r\n chart &&\r\n quote &&\r\n (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.quotePage ||\r\n shouldRecalculateOnCharts) &&\r\n !isIdeaChart\r\n ) {\r\n const leftOffset = getLeftOffset({ quote, chartModel: chart })\r\n chart.updateAttributes({ leftOffset })\r\n }\r\n // This effect should run only on timeframe change & idea change\r\n // The reason we need to recalculate the left offset is that quote timeframe change changes chart and chart bars sizes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [chartModel?.quote()?.timeframe, chartLayoutModel?.settings, isIdeaChart])\r\n\r\n return { isLoading }\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport * as React from 'react'\r\n\r\nexport function useModelRef(model: Model | null) {\r\n const modelRef = React.useRef(model)\r\n\r\n React.useEffect(() => {\r\n modelRef.current = model\r\n }, [model])\r\n\r\n return modelRef\r\n}\r\n","import {\r\n ButtonRoundingType,\r\n ButtonSizeType,\r\n CustomDateRange,\r\n Heading,\r\n TimeframeBar,\r\n useCustomDateRangeDialog,\r\n useFavoriteTimeframes,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { ChartEditorEnum, SpecificChartFunctionality, TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Chart from '../../models/chart'\r\nimport { IdeasDropdown } from '../header/ideas_dropdown'\r\nimport { Publish } from '../header/publish'\r\nimport { TourButton } from '../header/tour_button'\r\nimport { ChartTypesSelect } from './chart-type-select'\r\nimport { DailyChangeDisplay } from './daily-change-display'\r\nimport { DrawButton } from './draw-button'\r\nimport { FullscreenButton } from './fullscreen-button'\r\nimport Search from './search'\r\nimport { ChartSettingsButton } from './settings-button'\r\nimport { useChartControls } from './use-chart-controls'\r\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\r\n\r\ninterface SettingsComponentProps {\r\n chartModel: Chart\r\n chartIndex: number\r\n}\r\n\r\nconst isPremium = window.FinvizSettings.hasUserPremium\r\nconst hasRedesignEnabled = window.FinvizSettings.hasRedesignEnabled\r\n\r\nexport function ChartControls({ chartIndex, chartModel: unwatchedChartModel }: SettingsComponentProps) {\r\n const rounding: ButtonRoundingType | undefined = hasRedesignEnabled ? undefined : 'none'\r\n // This memo is required for publish, otherwise it ends up in a loop\r\n const chartLayout = React.useMemo(() => unwatchedChartModel.chart_layout(), [unwatchedChartModel])\r\n const chartModel = useModelState(unwatchedChartModel, {\r\n watchProperties: ['ticker', 'quote', 'dateRange'],\r\n })\r\n const { instrument } = chartModel?.quote() || {}\r\n const isQuotePage = chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n\r\n const navigate = useNavigate()\r\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes()\r\n const { isLoading } = useChartControls({\r\n chartModel,\r\n isInteractive: true,\r\n })\r\n const {\r\n anchorDate,\r\n generateChartLayoutRouterPath,\r\n timeframeGroupsWithHref,\r\n dateRangeGroupsWithHref,\r\n isFetching,\r\n handleCustomDateRangeValidation,\r\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\r\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\r\n useCustomDateRangeDialog({\r\n instrument,\r\n anchorDate,\r\n pathGenerator: generateChartLayoutRouterPath,\r\n })\r\n\r\n const handleTickerSelect = React.useCallback(\r\n (ticker: string) => {\r\n const upperCaseTicker = ticker.toUpperCase()\r\n\r\n navigate(\r\n generateChartLayoutRouterPath({\r\n ticker: upperCaseTicker,\r\n timeframe: chartModel.timeframe,\r\n dateRange: chartModel.dateRange,\r\n })\r\n )\r\n },\r\n [chartModel, generateChartLayoutRouterPath, navigate]\r\n )\r\n\r\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\r\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\r\n if (!dateRangeTimeframe) return\r\n\r\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\r\n if (isValid) onDialogSubmit(dateRangeTimeframe)\r\n }\r\n\r\n const timeframeBarProps = React.useMemo(\r\n () => ({\r\n size: 'medium' as ButtonSizeType,\r\n chartIndex: chartIndex,\r\n timeFrameGroups: timeframeGroupsWithHref(isPremium),\r\n dateRangeGroups: dateRangeGroupsWithHref({ isPremium, customRange: chartModel.dateRange, instrument }),\r\n selectedTimeframe: chartModel.timeframe,\r\n onTimeframeSelect: () => {},\r\n selectedDateRange: chartModel.dateRange,\r\n favoriteTimeframes: favoriteTimeframes,\r\n loadingTimeframe: isLoading ? chartModel.timeframe : undefined,\r\n onDateRangeSelect: handleDateRangeSelect,\r\n onCustomDateRangeClick: () => {\r\n if (isPremium) customDateRangeDialogState.show()\r\n },\r\n isFavoritesEnabled: isPremium,\r\n onFavoriteTimeframeToggle: ({ value }: { value: TIMEFRAME | 'intraday' }) => {\r\n toggleFavoriteTimeframe(value)\r\n },\r\n }),\r\n [\r\n chartIndex,\r\n chartModel.dateRange,\r\n chartModel.timeframe,\r\n customDateRangeDialogState,\r\n dateRangeGroupsWithHref,\r\n favoriteTimeframes,\r\n handleDateRangeSelect,\r\n instrument,\r\n isLoading,\r\n timeframeGroupsWithHref,\r\n toggleFavoriteTimeframe,\r\n ]\r\n )\r\n\r\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n return (\r\n
\r\n {chartModel.chart_layout().canChangeTicker && (\r\n \r\n )}\r\n\r\n \r\n\r\n \r\n\r\n \r\n
\r\n )\r\n }\r\n\r\n const hasTimeframe = chartLayout.editors.includes(ChartEditorEnum.timeframe)\r\n\r\n return (\r\n \r\n
\r\n {!isQuotePage && (\r\n \r\n {chartModel.quote().name ?? chartModel.ticker}\r\n \r\n )}\r\n {chartLayout.editors.includes(ChartEditorEnum.tools) && (\r\n \r\n Draw\r\n \r\n )}\r\n {chartLayout.editors.includes(ChartEditorEnum.ideas) && (\r\n \r\n Ideas\r\n \r\n )}\r\n {!hasTimeframe && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n\r\n {hasTimeframe && (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n )}\r\n\r\n
\r\n {chartLayout.editors.includes(ChartEditorEnum.publish) && (\r\n \r\n Share\r\n \r\n )}\r\n {isQuotePage && (\r\n \r\n )}\r\n \r\n {!isQuotePage && 'Fullscreen'}\r\n \r\n {chartLayout.editors.includes(ChartEditorEnum.settings) && (\r\n \r\n {!isQuotePage && 'Settings'}\r\n \r\n )}\r\n {!isQuotePage && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n \r\n )\r\n}\r\n","export const CHART_LAYOUT_CHILD_CHANGE_EVENT = 'chartLayoutChildChange'\r\n","import Spine from '@finviz/spine'\r\nimport { ContextMenuItem } from '@finviz/website'\r\n\r\nclass ContextMenu extends Spine.Model {\r\n static initClass() {\r\n this.configure('ContextMenu', 'shown', 'config', 'top', 'left')\r\n }\r\n\r\n declare shown: boolean\r\n declare config: ContextMenuItem[]\r\n declare top: number\r\n declare left: number\r\n}\r\n\r\nContextMenu.initClass()\r\n\r\nconst contextMenu = ContextMenu.create() as ContextMenu\r\ncontextMenu.save()\r\n\r\nexport default contextMenu\r\n","import { ContextMenu as ContextMenuComponent } from '@finviz/website'\r\nimport React from 'react'\r\nimport * as ReactDOM from 'react-dom'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport model from '../models/context_menu'\r\nimport { ready } from '../utils'\r\n\r\nconst selector = '.context-menu'\r\n\r\nclass ContextMenu extends React.Component {\r\n componentDidMount() {\r\n model.bind('update', this.update)\r\n }\r\n\r\n componentWillUnmount() {\r\n model.unbind('update', this.update)\r\n }\r\n\r\n update = () => {\r\n this.forceUpdate()\r\n }\r\n\r\n render() {\r\n if (model.shown) {\r\n document.querySelector(selector)?.classList.remove('hidden')\r\n } else {\r\n document.querySelector(selector)?.classList.add('hidden')\r\n return null\r\n }\r\n\r\n return (\r\n <>\r\n this.hide()}\r\n onContextMenu={(e) => e.preventDefault()}\r\n data-testid=\"charts-context-menu-overlay\"\r\n >\r\n \r\n \r\n )\r\n }\r\n\r\n hide() {\r\n model.updateAttribute('shown', false)\r\n }\r\n}\r\nready(() => {\r\n const el = document.querySelector(selector)\r\n if (el) {\r\n ReactDOM.render(, el)\r\n }\r\n})\r\n\r\nconst contextMenuControl = {\r\n show: (event: MouseEvent | React.MouseEvent, config: ObjectHash) => {\r\n model.updateAttributes({\r\n shown: true,\r\n config: config,\r\n top: event.clientY + window.pageYOffset,\r\n left: event.clientX,\r\n })\r\n },\r\n}\r\n\r\nexport default contextMenuControl\r\n","import {\r\n Delayed,\r\n DialogBody,\r\n Popover,\r\n PopoverTrigger,\r\n Spinner,\r\n ZIndexContext,\r\n getExtendedDialogState,\r\n usePopoverState,\r\n} from '@finviz/website'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { ChartEventBadgeType } from '../../constants/common'\r\nimport { chartEventsAsyncModule } from '../../controllers/chart-events/async-modules'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartModel from '../../models/chart'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { useClickAway } from '../../utils/use-click-away'\r\n\r\ninterface ChartEventPopoverWithStateProps {\r\n chartModel: ChartModel\r\n}\r\n\r\nconst POPOVER_ID = 'badge-popover'\r\n\r\nexport function ChartEventPopoverWithState({ chartModel }: ChartEventPopoverWithStateProps) {\r\n const unwatchedChartLayout = React.useMemo(() => chartModel.chart_layout() ?? null, [chartModel])\r\n const { activeChartEvent, theme } = useModelState(unwatchedChartLayout, { watchProperties: ['activeChartEvent'] })\r\n const popoverState = usePopoverState({ placement: 'top' })\r\n const { isFullyClosed } = getExtendedDialogState(popoverState)\r\n const [style, setStyle] = React.useState({\r\n top: 0,\r\n left: 0,\r\n })\r\n const [chartEventsModule] = useAsyncModule({\r\n ...chartEventsAsyncModule,\r\n shouldLoadModule: !isFullyClosed,\r\n errorSeverity: 'medium',\r\n onError: () => popoverState.hide(),\r\n })\r\n const elementId = activeChartEvent?.elementId\r\n const isChartEventOfThisChart = activeChartEvent?.pane().chart().eql(chartModel)\r\n const [data, setData] = React.useState(null)\r\n const clickAwayRef = useClickAway(() => {\r\n const isAnyBadgeHovered = !!chartModel\r\n .getChartPane()\r\n ?.getAllChartEvents()\r\n .some((chartEvent) => chartEvent.instance.isHovered)\r\n\r\n if (!isAnyBadgeHovered && activeChartEvent && isChartEventOfThisChart) {\r\n activeChartEvent.instance.toggleIsOpen(false)\r\n }\r\n }, !!activeChartEvent && isChartEventOfThisChart)\r\n // This is intentional, it doesn't need to be in useEffect, it would just call effect function which is redundant\r\n clickAwayRef.current = popoverState.unstable_popoverRef.current\r\n const popoverShow = popoverState.show\r\n const popoverHide = popoverState.hide\r\n\r\n React.useEffect(() => {\r\n if (!activeChartEvent?.instance.isOpen || !isChartEventOfThisChart) {\r\n if (isFullyClosed) {\r\n return setData(null)\r\n }\r\n return popoverHide()\r\n }\r\n if (!isChartEventOfThisChart) return\r\n const { top, left } = activeChartEvent.instance\r\n const newData = activeChartEvent.getChartEventData()\r\n if (newData?.elementId !== data?.elementId) {\r\n setData({\r\n ...newData,\r\n badgeType: activeChartEvent.instance.getChartEvenBadgeType(),\r\n })\r\n }\r\n\r\n if (style.top !== top || style.left !== left) {\r\n popoverHide()\r\n setStyle({\r\n top,\r\n left,\r\n })\r\n }\r\n if (!popoverState.visible) {\r\n popoverShow()\r\n }\r\n }, [\r\n elementId,\r\n isFullyClosed,\r\n data,\r\n style,\r\n popoverShow,\r\n popoverHide,\r\n popoverState.visible,\r\n activeChartEvent,\r\n chartModel,\r\n isChartEventOfThisChart,\r\n ])\r\n\r\n return (\r\n <>\r\n \r\n {data && !isFullyClosed && (\r\n \r\n \r\n \r\n {chartEventsModule ? (\r\n \r\n ) : (\r\n
\r\n \r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport Utils from '../utils'\r\n\r\nexport function useClickAway(callback: (event: MouseEvent | TouchEvent) => void, isListening = true) {\r\n const ref = React.useRef(null)\r\n const refCallback = React.useRef(callback)\r\n\r\n React.useLayoutEffect(() => {\r\n refCallback.current = callback\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isListening) {\r\n return\r\n }\r\n const isMobile = Utils.isMobile()\r\n const handler = (e: MouseEvent | TouchEvent) => {\r\n const element = ref.current\r\n if (element && e.target && !element.contains(e.target as HTMLElement)) {\r\n refCallback.current(e)\r\n }\r\n }\r\n\r\n document.addEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\r\n\r\n return () => {\r\n document.removeEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\r\n }\r\n }, [callback, isListening])\r\n\r\n return ref\r\n}\r\n","import { Button, ButtonGroup, Delayed, Icon, Spinner } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Chart from '../../models/chart'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport { useIsMounted } from '../../utils/use-is-mounted'\r\n\r\ninterface LoadLatestDataButtonProps {\r\n chartModel: Chart\r\n}\r\n\r\nexport function LoadLatestDataButton({ chartModel: chartModelUnwatched }: LoadLatestDataButtonProps) {\r\n const getIsMounted = useIsMounted()\r\n const chartModel = useModelState(chartModelUnwatched, { watchProperties: ['quote'] })\r\n const quoteModel = useModelState(chartModel.quote(), { watchProperties: ['isFetching'] })\r\n const [hasNewDataAvailable, setHasNewDataAvailable] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (!chartModel.getRefreshInterval()) {\r\n // We will do a check here if we have correct new data\r\n chartModel\r\n .quote()\r\n .isPossibleToFetchSequentialData()\r\n .then((hasNewData) => {\r\n if (getIsMounted()) {\r\n setHasNewDataAvailable(hasNewData)\r\n }\r\n })\r\n }\r\n // We need to run it only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const handleLoadLatestData = async () => {\r\n const promises = chartModel\r\n .getAllQuotes()\r\n .map(async (quote) => quote.fetchData({ fetchType: QuoteFetchType.NewerData }))\r\n chartModel.updateAttributes({ refreshData: true })\r\n await Promise.all(promises)\r\n if (getIsMounted()) {\r\n setHasNewDataAvailable(false)\r\n window.gtag?.('event', 'load-latest-data', { event_category: 'ideas' })\r\n }\r\n }\r\n\r\n if (!hasNewDataAvailable) {\r\n return null\r\n }\r\n\r\n return (\r\n \r\n }>\r\n \r\n \r\n ) : (\r\n 'refresh'\r\n )\r\n }\r\n disabled={quoteModel?.isFetching}\r\n title=\"Load latest data\"\r\n onClick={handleLoadLatestData}\r\n data-testid=\"load-latest-data-button\"\r\n >\r\n Load latest data\r\n \r\n \r\n )\r\n}\r\n","// Copy if this file is in Website repo in Website/js/main/hooks/ folder\r\nimport * as React from 'react'\r\n\r\nexport function useIsMounted() {\r\n const isMountedRef = React.useRef(false)\r\n const getIsMounted = React.useCallback(() => isMountedRef.current, [])\r\n\r\n React.useEffect(() => {\r\n isMountedRef.current = true\r\n return () => {\r\n isMountedRef.current = false\r\n }\r\n }, [])\r\n\r\n return getIsMounted\r\n}\r\n","import { Button, ButtonGroup, ButtonSizeType, Icon } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport debounce from 'lodash.debounce'\r\nimport React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Chart from '../../models/chart'\r\nimport Utils from '../../utils'\r\nimport { getLeftOffset } from '../renderUtils'\r\nimport { LoadLatestDataButton } from './load-latest-data-button'\r\n\r\nexport const ZOOM_CONTROLS_ACTIVE_CLASS = 'is-active'\r\nexport const ZOOM_CONTROLS_IS_IN_AREA_CLASS = 'is-in-area'\r\n\r\nconst buttonCommonProps: { size: ButtonSizeType; className: string; contentClass: string } = {\r\n size: 'none',\r\n className: 'w-7 h-6',\r\n contentClass: 'flex justify-center',\r\n}\r\n\r\nconst isMobile = Utils.isMobile()\r\n\r\ninterface ZoomControlsProps {\r\n zoomControlsRef: React.RefObject\r\n isVisible: boolean\r\n chartModel: Chart\r\n onZoomIn: () => void\r\n onZoomOut: () => void\r\n onZoomReset: () => void\r\n}\r\n\r\nconst getDefaultLeftOffset = (chartModel: Chart) =>\r\n getLeftOffset({\r\n quote: chartModel.quote(),\r\n chartModel,\r\n config: {},\r\n })\r\n\r\nexport function ZoomControls({\r\n zoomControlsRef,\r\n chartModel,\r\n isVisible,\r\n onZoomIn,\r\n onZoomOut,\r\n onZoomReset,\r\n}: ZoomControlsProps) {\r\n const chartLayoutModel = useModelState(chartModel.chart_layout(), { watchProperties: ['idea'] })\r\n const [isGoToRecentVisible, setIsGoToRecentVisible] = React.useState(false)\r\n const { defaultZoomFactor } = chartLayoutModel\r\n const [isZoomResetVisible, setIsZoomResetVisible] = React.useState(chartModel.zoomFactor !== defaultZoomFactor)\r\n const handleGoToMostRecent = React.useCallback(() => {\r\n chartModel.updateAttributes({ leftOffset: getDefaultLeftOffset(chartModel), dateRange: null })\r\n }, [chartModel])\r\n\r\n React.useEffect(() => {\r\n const handleChartModelChangeDebounced = debounce(\r\n () => {\r\n setIsZoomResetVisible(chartModel.zoomFactor !== defaultZoomFactor)\r\n setIsGoToRecentVisible(chartModel.leftOffset !== getDefaultLeftOffset(chartModel))\r\n },\r\n 100,\r\n { maxWait: 333 }\r\n )\r\n chartModel.bind('change', handleChartModelChangeDebounced)\r\n return () => {\r\n handleChartModelChangeDebounced.cancel()\r\n chartModel.unbind('change', handleChartModelChangeDebounced)\r\n }\r\n }, [defaultZoomFactor, chartModel])\r\n\r\n return (\r\n \r\n {!isMobile && (\r\n
\r\n {isZoomResetVisible && (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n )}\r\n\r\n
\r\n {!!chartLayoutModel.idea?.id && }\r\n\r\n {isGoToRecentVisible && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { Button, Notification, NotificationContextType, Paragraph, withNotificationContext } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport Hammer from 'hammerjs'\r\nimport debounce from 'lodash.debounce'\r\nimport React from 'react'\r\n\r\nimport { CustomSpineEvents, DrawingSpineOptionsEvent, EmptyObject, ObjectHash, PaneArea } from '../../../types/shared'\r\nimport CanvasElement from '../../canvas/element'\r\nimport ChartEvent from '../../chart-events/chart-event'\r\nimport { IndicatorType, ScaleType, SetVisibilityTo, SpecificChartFunctionality } from '../../constants/common'\r\nimport IndicatorElement from '../../indicators/indicator'\r\nimport { withElementStyleDialogState } from '../../modals/element_style'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartEventElement from '../../models/chart-event-element'\r\nimport ElementModel from '../../models/element'\r\nimport MouseModel from '../../models/mouse'\r\nimport PaneModel from '../../models/pane'\r\nimport Quote from '../../models/quote'\r\nimport { handleRemoveIndicatorPane } from '../../models/utils'\r\nimport Utils, { isRedesignedPage } from '../../utils'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport { getBarWidthWithMargin, unmountCanvas } from '../../utils/chart'\r\nimport { setElementCursor } from '../../utils/cursor'\r\nimport { getValueInRange, isPrimaryClick } from '../../utils/helpers'\r\nimport { getInitialStoreDrawings } from '../autosave/utils'\r\nimport { CHART_LAYOUT_CHILD_CHANGE_EVENT } from '../chart_layout/constants'\r\nimport ContextMenu from '../context_menu'\r\nimport { getMinMaxLeftOffset, getSettings, recountScale, renderPane } from '../renderUtils'\r\nimport { DrawingTool } from '../toolbar/interfaces'\r\nimport { getChartAlt } from '../utils'\r\nimport { ChartEventPopoverWithState } from './chart-event-popover-with-state'\r\nimport { withPaneModel } from './with-pane-model'\r\nimport { ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS, ZoomControls } from './zoom_controls'\r\n\r\n// Indicates how many time lower/higher can new scale be compared to original one\r\nconst ALLOWED_MIN_MAX_ZOOM = 10000\r\n\r\ninterface PaneProps {\r\n model: PaneModel\r\n chartModel: ChartModel\r\n activeTool: DrawingTool\r\n activeChartInteraction: string | null\r\n chartIndex: number\r\n paneIndex: number\r\n touchEventsDisabled: boolean\r\n onPaneClick: (model: PaneModel) => void\r\n onZoomerReset: () => void\r\n onZoomerMouseDown: React.MouseEventHandler\r\n onZoomerTouchStart: React.TouchEventHandler\r\n onAddToZoomFactor: (data: { diff: number; shouldCalculateRightAlign: boolean }) => void\r\n onResizerMouseDown: (e: React.MouseEvent, model: PaneModel) => void\r\n onPaneDestroy: (paneId: string) => void\r\n setActiveChartInteraction: (value: string | null) => void\r\n openElementStyleDialog?: (element: CanvasElement | IndicatorElement) => void\r\n notificationContext: NotificationContextType\r\n}\r\n\r\ninterface PaneState {\r\n hasSeenCrossNotification: boolean\r\n}\r\n\r\nfunction toggleE2eRenderInProgress({ id, isInProgress }: { id: number; isInProgress: boolean }) {\r\n if (process.env.IS_E2E_TESTING) {\r\n window.rendersInProgress = window.rendersInProgress ?? []\r\n\r\n if (isInProgress) {\r\n window.isRenderInProgress = true\r\n window.rendersInProgress.push(id)\r\n } else {\r\n window.rendersInProgress = window.rendersInProgress.filter((progressId) => id !== progressId)\r\n\r\n if (window.rendersInProgress.length === 0) {\r\n window.isRenderInProgress = Date.now()\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass Pane extends React.Component {\r\n rafId?: number | null = null\r\n crossRafId?: number | null = null\r\n quoteModel: Quote\r\n paneRef = React.createRef()\r\n scalerRef = React.createRef()\r\n zoomerRef = React.createRef()\r\n zoomControlsRef = React.createRef()\r\n canvasWrapperRef = React.createRef()\r\n canvasRef = React.createRef()\r\n crossCanvasRef = React.createRef()\r\n chartLayoutModel = this.props.chartModel.chart_layout()\r\n paneHammer!: HammerManager\r\n scalerHammer!: HammerManager\r\n zoomerHammer!: HammerManager\r\n canvasWrapperHammer!: HammerManager\r\n mouseDown = false\r\n lastClientX?: number\r\n lastClientY?: number\r\n currentViewRange: { min: number; max: number } | null = null\r\n lastX!: number\r\n lastY!: number\r\n lastActiveTool: DrawingTool\r\n scalerLastY: number | null = null\r\n isElementHovered = false\r\n hoveredElement: CanvasElement | null = null\r\n isMobile: boolean\r\n isDisableTouchCrossAvailable = true\r\n\r\n canvas: HTMLCanvasElement | null = null\r\n canvasCtx: CanvasRenderingContext2D | null = null\r\n crossCanvas: HTMLCanvasElement | null = null\r\n crossCanvasCtx: CanvasRenderingContext2D | null = null\r\n isIndicatorPane = false\r\n\r\n state: PaneState = {\r\n hasSeenCrossNotification: !!window.localStorage?.getItem('hasSeenCrossNotification'),\r\n }\r\n\r\n // expects chartModel, model, onResizerMouseDown, onPaneDestroy\r\n constructor(props: PaneProps) {\r\n super(props)\r\n\r\n this.quoteModel = this.props.chartModel.quote()\r\n props.model.updateAttribute('instance', this)\r\n props.model.bind('update', this.onModelUpdate)\r\n props.model\r\n .elements()\r\n .bind('create', this.onElementCreate)\r\n .bind('destroy', this.onElementDestroy)\r\n .bind('replace', this.onElementReplace)\r\n .bind('select', this.onElementSelect)\r\n .bind('makeClone', this.onElementClone)\r\n .bind('change', this.immediateRecountScaleOnChartIndicatorChange)\r\n .bind('change', debounce(this.recountScale, 50))\r\n props.model.bind(CustomSpineEvents.ManualChange, this.recountScale)\r\n\r\n props.model.chartEvents().bind('create', this.onElementCreate).bind('change', debounce(this.recountScale, 50))\r\n\r\n this.props.chartModel.bind('update', this.onChartUpdate)\r\n this.props.chartModel.bind(`change ${CustomSpineEvents.IndicatorsChange}`, this.recountScale)\r\n this.quoteModel.bind('change', this.recountScale)\r\n this.isMobile = !!Utils.isMobile()\r\n this.lastActiveTool = props.activeTool\r\n if (!MouseModel.pane()) {\r\n MouseModel.updateAttribute('pane', props.model)\r\n }\r\n this.isIndicatorPane = props.model.getIsIndicatorPane()\r\n this.recountScale()\r\n }\r\n\r\n componentDidMount() {\r\n const { model } = this.props\r\n this.chartLayoutModel.bind('theme', this.renderAll)\r\n this.chartLayoutModel.bind('theme', this.renderCross)\r\n\r\n const initialStoreDrawings = getInitialStoreDrawings() ?? []\r\n const elements = [...model.getAllElements(), ...model.getAllChartEvents(false)]\r\n elements.forEach((element) => {\r\n this.onElementCreate(element)\r\n if (element.isDrawing()) {\r\n const hasDrawingInInitialCache = initialStoreDrawings.some(({ elementId }) => element.elementId === elementId)\r\n if (hasDrawingInInitialCache) {\r\n element.instance?.updateScales()\r\n }\r\n element.instance.cachePointPositionTimestamp()\r\n } else if (element.isChartEvent()) {\r\n element.instance?.updateScales()\r\n }\r\n })\r\n\r\n model?.updateChartEventsZIndexes()\r\n\r\n this.canvas = this.canvasRef.current\r\n this.canvasCtx = getContextWithCache(this.canvasRef.current)\r\n this.crossCanvas = this.crossCanvasRef.current\r\n this.crossCanvasCtx = getContextWithCache(this.crossCanvasRef.current)\r\n\r\n this.paneHammer = new Hammer.Manager(this.paneRef.current!, { touchAction: 'none' })\r\n this.paneHammer.add(new Hammer.Press({ threshold: 5, time: 500 })) // chrome simulator \"long touch\" -> \"oncontextmenu\" is 680ms +- 2ms\r\n this.paneHammer.on('press', this.onPress)\r\n this.canvasWrapperHammer = new Hammer(this.canvasWrapperRef.current!, { touchAction: 'none' })\r\n this.canvasWrapperHammer.on('tap', this.onClick)\r\n this.canvasWrapperRef.current?.addEventListener('touchmove', this.onTouchMove, { passive: false })\r\n\r\n if (this.chartLayoutModel.scrollable || !this.isMobile) {\r\n if (this.scalerRef.current) {\r\n this.scalerHammer = new Hammer(this.scalerRef.current, { touchAction: 'none' })\r\n this.scalerHammer.on('doubletap', this.onScalerReset)\r\n }\r\n if (this.zoomerRef.current) {\r\n this.zoomerHammer = new Hammer(this.zoomerRef.current, { touchAction: 'none' })\r\n this.zoomerHammer.on('doubletap', this.props.onZoomerReset)\r\n }\r\n this.canvasWrapperHammer.on('doubletap', this.onDoubleClick)\r\n }\r\n\r\n this.onChartUpdate({ width: this.props.chartModel.width })\r\n this.onModelUpdate({ height: model.height })\r\n this.forceUpdate()\r\n this.chartLayoutModel.trigger(CHART_LAYOUT_CHILD_CHANGE_EVENT)\r\n }\r\n\r\n componentWillUnmount() {\r\n this.canvasWrapperRef.current?.removeEventListener('touchmove', this.onTouchMove)\r\n unmountCanvas(this.canvas)\r\n unmountCanvas(this.crossCanvas)\r\n this.props.chartModel.unbind('update', this.onChartUpdate)\r\n this.props.chartModel.unbind('change', this.recountScale)\r\n this.quoteModel.unbind('change', this.recountScale)\r\n }\r\n\r\n render() {\r\n const { activeTool, touchEventsDisabled, onPaneClick, paneIndex, chartIndex, model, chartModel } = this.props\r\n if (touchEventsDisabled) {\r\n this.paneHammer?.set({ touchAction: 'auto' })\r\n this.scalerHammer?.set({ touchAction: 'auto' })\r\n this.zoomerHammer?.set({ touchAction: 'auto' })\r\n this.canvasWrapperHammer?.set({ touchAction: 'auto' })\r\n } else {\r\n const touchAction = this.getIsHammerAllowScrollActive() ? 'auto' : 'none'\r\n this.scalerHammer?.set({ touchAction: 'none' })\r\n this.zoomerHammer?.set({ touchAction: 'none' })\r\n this.paneHammer?.set({ touchAction })\r\n this.canvasWrapperHammer?.set({ touchAction })\r\n }\r\n\r\n const isChartPane = model.getIsChartPane()\r\n\r\n return (\r\n onPaneClick(model)}\r\n onTouchStart={() => onPaneClick(model)}\r\n onContextMenu={this.onContextMenu}\r\n data-testid={`chart-${chartIndex}-pane-${paneIndex}`}\r\n >\r\n {isChartPane && }\r\n {paneIndex !== 0 && (\r\n this.props.onResizerMouseDown(e, model)}\r\n data-testid={`chart-${chartIndex}-pane-${paneIndex}-resizer`}\r\n />\r\n )}\r\n {this.chartLayoutModel.initialScrollable && (\r\n \r\n )}\r\n\r\n {this.chartLayoutModel.initialScrollable && isChartPane && (\r\n <>\r\n \r\n {\r\n this.props.onAddToZoomFactor({ diff: 0.1, shouldCalculateRightAlign: true })\r\n }}\r\n onZoomOut={() => {\r\n this.props.onAddToZoomFactor({ diff: -0.1, shouldCalculateRightAlign: true })\r\n }}\r\n onZoomReset={this.props.onZoomerReset}\r\n />\r\n \r\n )}\r\n \r\n {getChartAlt(this.quoteModel)}\r\n {this.chartLayoutModel.cross && }\r\n \r\n \r\n )\r\n }\r\n\r\n getIsHammerAllowScrollActive = () =>\r\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.chartPage &&\r\n !this.chartLayoutModel.isTouchCrossActive &&\r\n !this.chartLayoutModel.scrollable\r\n\r\n onElementCreate = (el: ElementModel | ChartEventElement) => {\r\n el.instance.bind('change', this.renderAll)\r\n this.renderAll()\r\n }\r\n\r\n onElementReplace = (el: ElementModel, oldElementInstance: CanvasElement) => {\r\n oldElementInstance.unbind('change', this.renderAll)\r\n el.instance.bind('change', this.renderAll)\r\n if (oldElementInstance === this.props.model.selection && !this.chartLayoutModel.isDrawingModeContinuousActive) {\r\n this.setSelection(el.instance)\r\n } else {\r\n this.setSelection(null)\r\n }\r\n this.renderAll()\r\n }\r\n\r\n onElementDestroy = (el: ElementModel) => {\r\n const { type } = el.instance\r\n el.instance.unbind('change', this.renderAll)\r\n if (el.instance === this.props.model.selection) {\r\n this.setSelection(null)\r\n }\r\n if (type.startsWith('charts/') || type.startsWith('indicators/')) {\r\n this.props.onPaneDestroy(el['pane_id'])\r\n }\r\n this.renderAll()\r\n }\r\n\r\n onElementSelect = (el: ElementModel) => {\r\n this.setSelectedElement(el.instance)\r\n }\r\n\r\n onElementClone = (_: unknown, clonedElementInstance: CanvasElement) => {\r\n this.setSelectedElement(clonedElementInstance)\r\n }\r\n\r\n onModelUpdate = ({ height }: { height: number }) => {\r\n this.setCanvasSize({\r\n width: this.props.chartModel.width,\r\n height,\r\n })\r\n }\r\n\r\n onChartUpdate = ({ width }: { width: number }) => {\r\n const { model, chartModel } = this.props\r\n this.setCanvasSize({\r\n width,\r\n height: model.height,\r\n })\r\n const quote = chartModel.quote()\r\n if (!this.quoteModel.eql(quote)) {\r\n this.quoteModel.unbind('change', this.recountScale)\r\n if (quote) {\r\n this.quoteModel = quote\r\n this.quoteModel.bind('change', this.recountScale)\r\n }\r\n }\r\n }\r\n\r\n onZoomerMouseMove: React.MouseEventHandler = (e) => {\r\n if (!this.chartLayoutModel.scrollable || (this.isMobile && !this.chartLayoutModel.isTouchCrossActive)) return\r\n const area = this.getArea(e)\r\n MouseModel.updateAttributes({\r\n position: { x: area.x, y: null },\r\n pane: this.props.model,\r\n })\r\n }\r\n\r\n onMouseMoveOnScrolling = (event: TouchEvent | MouseEvent) => {\r\n if (this.props.activeChartInteraction) {\r\n return\r\n }\r\n\r\n let { clientX, clientY } = event as MouseEvent\r\n const { model } = this.props\r\n\r\n const isTouch = typeof TouchEvent !== 'undefined' && event instanceof TouchEvent\r\n if (isTouch && event.targetTouches?.length > 0) {\r\n clientX = event.targetTouches[0].clientX\r\n clientY = event.targetTouches[0].clientY\r\n }\r\n if (!model.selection && !this.chartLayoutModel.activeChartEvent) {\r\n if (this.lastClientX != null) {\r\n const dif = this.lastClientX - clientX\r\n this.addToLeftOffset(-dif)\r\n }\r\n if (model.scaleRange && this.lastClientY != null) {\r\n let { min, max } = model.scaleRange\r\n let difY\r\n switch (this.props.chartModel.scale) {\r\n case ScaleType.Logarithmic: {\r\n difY = this.lastClientY - clientY\r\n min = model.scale.y.invert(model.scale.y(min) + difY)\r\n max = model.scale.y.invert(model.scale.y(max) + difY)\r\n break\r\n }\r\n default: {\r\n difY = (this.lastClientY - clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\r\n min -= difY\r\n max -= difY\r\n break\r\n }\r\n }\r\n\r\n model.updateAttribute('scaleRange', { min, max })\r\n this.recountScale()\r\n this.currentViewRange = this.props.model.getChartOrIndicatorElement()?.instance?.getMinMax?.() ?? null\r\n }\r\n }\r\n this.lastClientX = clientX\r\n this.lastClientY = clientY\r\n }\r\n\r\n onScalerTouchStart: React.TouchEventHandler = (e) => {\r\n if (!this.chartLayoutModel.scrollable || this.props.touchEventsDisabled) return\r\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\r\n this.onScalerMouseDown(e.targetTouches[0])\r\n }\r\n }\r\n\r\n onScalerTouchMove = (e: TouchEvent) => {\r\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\r\n this.onScalerMouseMove(e.targetTouches[0])\r\n }\r\n }\r\n\r\n onScalerTouchEnd = () => {\r\n if (this.chartLayoutModel.scrollable) {\r\n this.onScalerMouseUp()\r\n }\r\n }\r\n\r\n onScalerMouseEnter = () => {\r\n MouseModel.updateAttributes({\r\n position: null,\r\n pane: null,\r\n })\r\n }\r\n\r\n onScalerMouseDown = (event: React.MouseEvent | React.Touch) => {\r\n const { activeChartInteraction, setActiveChartInteraction, model } = this.props\r\n if ((event instanceof MouseEvent && event.button) || activeChartInteraction || !this.chartLayoutModel.scrollable) {\r\n return\r\n }\r\n setActiveChartInteraction('scaler')\r\n\r\n this.scalerLastY = event.clientY\r\n // here we need current domain scale or former \"nice\" value\r\n const [currentDomainMax, currentDomainMin] = model.scale.y.domain()\r\n this.currentViewRange = { min: currentDomainMin, max: currentDomainMax }\r\n document.addEventListener<'mousemove'>('mousemove', this.onScalerMouseMove)\r\n document.addEventListener('mouseup', this.onScalerMouseUp)\r\n document.addEventListener('touchmove', this.onScalerTouchMove)\r\n document.addEventListener('touchend', this.onScalerTouchEnd)\r\n }\r\n\r\n onScalerMouseMove = (event: MouseEvent | Touch) => {\r\n const { model, chartModel } = this.props\r\n if (model.scaleRange === null && this.currentViewRange === null) {\r\n return\r\n }\r\n let { min, max } = model.scaleRange || this.currentViewRange!\r\n let difY\r\n switch (this.props.chartModel.scale) {\r\n case ScaleType.Logarithmic: {\r\n difY = this.scalerLastY! - event.clientY\r\n min = model.scale.y.invert(model.scale.y(min) - difY)\r\n max = model.scale.y.invert(model.scale.y(max) + difY)\r\n break\r\n }\r\n default: {\r\n difY = -(this.scalerLastY! - event.clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\r\n min -= difY\r\n max += difY\r\n break\r\n }\r\n }\r\n this.scalerLastY = event.clientY\r\n\r\n const originalMinMax = model.getChartOrIndicatorElement()?.instance?.getMinMax?.()\r\n if (originalMinMax) {\r\n const currentDiff = Math.abs(max - min)\r\n const originalDiff = Math.abs(originalMinMax.max - originalMinMax.min)\r\n\r\n if (currentDiff > originalDiff * ALLOWED_MIN_MAX_ZOOM || currentDiff < originalDiff / ALLOWED_MIN_MAX_ZOOM) {\r\n return\r\n }\r\n }\r\n\r\n model.updateAttribute('scaleRange', { min, max })\r\n chartModel.updateAttribute('dateRange', null)\r\n this.recountScale()\r\n }\r\n\r\n onScalerMouseUp = () => {\r\n this.scalerLastY = null\r\n\r\n document.removeEventListener('mousemove', this.onScalerMouseMove)\r\n document.removeEventListener('mouseup', this.onScalerMouseUp)\r\n document.removeEventListener('touchmove', this.onScalerTouchMove)\r\n document.removeEventListener('touchend', this.onScalerTouchEnd)\r\n this.props.setActiveChartInteraction(null)\r\n }\r\n\r\n onScalerReset = () => {\r\n const { model, chartModel } = this.props\r\n if (!this.chartLayoutModel.scrollable) return\r\n chartModel.updateAttribute('dateRange', null)\r\n model.updateAttribute('scaleRange', null)\r\n this.recountScale()\r\n }\r\n\r\n addToLeftOffset = (n: number) => {\r\n const quote = this.props.chartModel.quote()\r\n const barWidth = getBarWidthWithMargin({\r\n chartLayout: this.chartLayoutModel,\r\n zoomFactor: this.props.chartModel.zoomFactor,\r\n })\r\n const leftOffset = getMinMaxLeftOffset({\r\n newLeftOffset: this.props.chartModel.leftOffset + n,\r\n chartModel: this.props.chartModel,\r\n barWidth,\r\n barIndex: quote.barIndex[quote.open.length - 1],\r\n })\r\n\r\n if (leftOffset > barWidth) {\r\n quote.fetchOlderData()\r\n }\r\n this.props.chartModel.updateAttributes({\r\n leftOffset,\r\n dateRange: null,\r\n })\r\n }\r\n\r\n onDoubleClick = (event: HammerInput) => {\r\n event.preventDefault()\r\n const area = this.getArea(event)\r\n const element = this.props.model.selection || this.getElement(area)\r\n if (element && element.type !== IndicatorType.Cot && !element.isCreator) {\r\n setTimeout(() => {\r\n this.props.openElementStyleDialog!(element)\r\n }, 0)\r\n element.trigger('dblclick', event)\r\n }\r\n }\r\n\r\n onPress = (e: ObjectHash) => {\r\n if (e.pointerType !== 'touch') return\r\n\r\n e.clientX = e.center.x\r\n e.clientY = e.center.y\r\n\r\n const el = this.props.model.selection || this.getElement(this.getArea(e))\r\n if (!this.chartLayoutModel.isTouchCrossActive) {\r\n if (!el) {\r\n this.onCanvasPress(e as React.MouseEvent)\r\n } else {\r\n this.onContextMenu(e as React.MouseEvent, el)\r\n }\r\n }\r\n }\r\n\r\n onContextMenu = (e: React.MouseEvent, element?: IndicatorElement | CanvasElement) => {\r\n e.preventDefault()\r\n const area = this.getArea(e)\r\n const elementInArea = this.getElement(area)\r\n const el = element ?? elementInArea\r\n if (!el || el.thumbsAreInArea(area)) {\r\n return\r\n }\r\n const elementModel = ElementModel.findByAttribute('instance', el)\r\n if (!elementModel) return\r\n this.setSelectedElement(el)\r\n const hasProperties =\r\n ['indicator', 'canvas'].some((type) => el.type.startsWith(type)) && el.type !== IndicatorType.Cot\r\n const isElementDrawing = elementModel.isDrawing()\r\n\r\n return ContextMenu.show(\r\n e,\r\n [\r\n hasProperties && {\r\n id: 'edit',\r\n label: 'Edit style',\r\n onClick: () => this.props.openElementStyleDialog!(el),\r\n },\r\n\r\n !(elementModel.isChart() || elementModel?.isIndicator()) && {\r\n id: 'clone',\r\n label: 'Clone',\r\n onClick: () => elementModel.makeClone(),\r\n },\r\n\r\n ...(isElementDrawing\r\n ? [\r\n { type: 'divider', label: 'Visibility' },\r\n\r\n {\r\n id: 'visibility-current-and-above',\r\n label: 'Current interval and above',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndAbove),\r\n },\r\n\r\n {\r\n id: 'visibility-current-and-below',\r\n label: 'Current interval and below',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndBelow),\r\n },\r\n\r\n {\r\n id: 'visibility-current-only',\r\n label: 'Current interval only',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentOnly),\r\n },\r\n\r\n {\r\n id: 'visibility-all-intervals',\r\n label: 'All intervals',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.all),\r\n },\r\n ]\r\n : []),\r\n\r\n (isElementDrawing || hasProperties) && { type: 'divider' },\r\n\r\n {\r\n id: 'bring-to-front',\r\n label: 'Bring to Front',\r\n onClick: () => elementModel.bringToFront(),\r\n },\r\n {\r\n id: 'send-to-back',\r\n label: 'Send to Back',\r\n onClick: () => elementModel.sendToBack(),\r\n },\r\n {\r\n id: 'bring-forward',\r\n label: 'Bring Forward',\r\n onClick: () => elementModel.bringForward(),\r\n },\r\n {\r\n id: 'send-backward',\r\n label: 'Send Backward',\r\n onClick: () => elementModel.sendBackward(),\r\n },\r\n\r\n { type: 'divider' },\r\n\r\n {\r\n id: 'remove',\r\n label: 'Remove',\r\n onClick: () => {\r\n if (elementModel.isIndicator()) {\r\n handleRemoveIndicatorPane({ paneIndex: this.props.paneIndex, chartLayoutModel: this.chartLayoutModel })\r\n } else {\r\n elementModel.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\r\n this.props.model.normalizeZIndexes()\r\n }\r\n },\r\n },\r\n ]\r\n .filter(Boolean)\r\n .map((item) => ({ ...item, gtag: { element_type: el.type } }))\r\n )\r\n }\r\n\r\n immediateRecountScaleOnChartIndicatorChange = (element?: ElementModel) => {\r\n if (element?.isChart() || element?.isIndicator()) {\r\n this.recountScale()\r\n }\r\n }\r\n\r\n recountScale = (_?: unknown, updateType?: Spine.Event) => {\r\n const { model } = this.props\r\n const chartModel = model.chart()\r\n if (updateType === 'destroy' || !chartModel || !chartModel.quote()) {\r\n return\r\n }\r\n\r\n recountScale({ chartModel, paneModel: model })\r\n\r\n if (this.canvasCtx) {\r\n this.renderAll()\r\n }\r\n }\r\n\r\n onBlur = () => {\r\n if (this.props.model.selection?.getIsCreator?.()) {\r\n this.setSelection(null)\r\n } else {\r\n this.setSelectedElement(null)\r\n }\r\n if (this.hoveredElement) {\r\n this.hoveredElement.setIsHovered(false)\r\n this.hoveredElement = null\r\n }\r\n this.props.model.getAllElements().forEach((element) => {\r\n if (element.instance.getIsCreator?.() && !element.instance.getIsCreatorDialogOpen?.()) {\r\n element.destroyCascade()\r\n }\r\n })\r\n }\r\n\r\n renderAll = (type?: string) => {\r\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = true\r\n\r\n if (type === 'cross' && this.chartLayoutModel.cross) {\r\n if (this.crossRafId === null) {\r\n const crossRafId = window.requestAnimationFrame(() => {\r\n this.renderCross()\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: crossRafId, isInProgress: false })\r\n }\r\n })\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: crossRafId, isInProgress: true })\r\n }\r\n this.crossRafId = crossRafId\r\n }\r\n } else if (this.rafId == null && this.canvasCtx) {\r\n const rafId = window.requestAnimationFrame(() => {\r\n this._renderAll()\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: rafId, isInProgress: false })\r\n }\r\n })\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: rafId, isInProgress: true })\r\n }\r\n this.rafId = rafId\r\n }\r\n }\r\n\r\n _renderAll = () => {\r\n const { model } = this.props\r\n // _renderAll may be called after Chart was deleted because of requestAnimationFrame\r\n if (model.chart() === null || this.canvasRef.current === null || !this.canvasCtx) {\r\n return\r\n }\r\n if (this.getIsUpdatedDesign()) {\r\n if (this.crossRafId === null) {\r\n this.crossRafId = window.requestAnimationFrame(this.renderCross)\r\n }\r\n }\r\n this.rafId = undefined\r\n\r\n renderPane({\r\n chartLayoutModel: this.chartLayoutModel,\r\n chartModel: this.props.chartModel,\r\n paneModel: model,\r\n canvasCtx: this.canvasCtx,\r\n })\r\n }\r\n\r\n getIsUpdatedDesign() {\r\n const { specificChartFunctionality } = this.chartLayoutModel\r\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isRedesignedFuturesForexCrypto = isRedesignedPage({ specificChartFunctionality })\r\n\r\n return isCharts || isRedesignedFuturesForexCrypto\r\n }\r\n\r\n renderCross = () => {\r\n const { model } = this.props\r\n const isMouseInPane = MouseModel.getShouldRenderCrossInPane(model)\r\n this.crossRafId = null\r\n if (!this.crossCanvasCtx) {\r\n return\r\n }\r\n this.crossCanvasCtx.clearRect(0, 0, this.props.chartModel.width, model.height)\r\n const isCrossDisabled =\r\n PaneModel.select((p) => !!p.selection && !p.selection.type.startsWith('indicators/')).length !== 0 ||\r\n this.props.chartModel.getIsDisabled() ||\r\n !isMouseInPane\r\n\r\n for (const { instance: elementInstance } of model.getAllElements()) {\r\n if (\r\n (!isCrossDisabled && elementInstance.renderCross != null) ||\r\n (isCrossDisabled && elementInstance.renderCrossText != null)\r\n ) {\r\n this.crossCanvasCtx.save()\r\n if (isCrossDisabled) {\r\n elementInstance.renderCrossText!(this.crossCanvasCtx, Number.NaN)\r\n } else {\r\n elementInstance.renderCross!(this.crossCanvasCtx)\r\n }\r\n this.crossCanvasCtx.restore()\r\n }\r\n }\r\n }\r\n\r\n getArea = (e: ObjectHash, additionalData?: T): PaneArea => {\r\n const { model } = this.props\r\n const clientX = e.clientX || additionalData?.clientX\r\n const clientY = e.clientY || additionalData?.clientY\r\n const Settings = getSettings(model)\r\n const areaRectangle = this.canvas!.getBoundingClientRect()\r\n const areaRectangleCursorX = clientX - areaRectangle.left\r\n const areaRectangleCursorY = clientY - areaRectangle.top\r\n const x = areaRectangleCursorX - model.chart().leftOffset - Settings.left.width\r\n const y = areaRectangleCursorY - Settings.top.height\r\n const scale = model.scale\r\n const chartLeftX = areaRectangle.left + Settings.left.width\r\n const chartRightX = areaRectangle.right - Settings.right.width\r\n return {\r\n ...(additionalData as T),\r\n // TODO: rewrite if canvas uses padding/border\r\n x: scale.x.invert(x),\r\n y: scale.y.invert(y),\r\n scaled: {\r\n x,\r\n y,\r\n },\r\n width: 1,\r\n height: 1,\r\n cursorX: areaRectangleCursorX,\r\n cursorY: areaRectangleCursorY,\r\n isCursorInChartWidthBoundaries: clientX > chartLeftX && clientX < chartRightX,\r\n }\r\n }\r\n\r\n setCanvasSize = ({ width, height }: { width: number; height: number }) => {\r\n const ratio = Utils.getScaleRatio()\r\n const canvasElement = this.canvasRef.current\r\n\r\n /**\r\n * It seems that value passed into element attr (e.g. height) is ceiled down,\r\n * so if you provide canvas element with height 100.5 we'll get integer 100 from canvasElement.height\r\n * If the difference in values between \"new height\" and canvasElement.height is less than 1, I treat it as the same value\r\n */\r\n if (\r\n this.canvasCtx &&\r\n canvasElement &&\r\n (Math.abs(height * ratio - canvasElement.height) >= 1 || Math.abs(width * ratio - canvasElement.width) >= 1)\r\n ) {\r\n Utils.setSizeOnCanvasElement({ canvasElement, width, height })\r\n this.canvasCtx.scale(ratio, ratio)\r\n if (this.chartLayoutModel.cross && this.crossCanvasCtx) {\r\n Utils.setSizeOnCanvasElement({\r\n canvasElement: this.crossCanvasRef.current,\r\n width,\r\n height,\r\n })\r\n this.crossCanvasCtx.scale(ratio, ratio)\r\n }\r\n setTimeout(() => {\r\n this.recountScale()\r\n })\r\n }\r\n }\r\n\r\n onClick = (event: HammerInput) => {\r\n const area = this.getArea(event, {\r\n clientX: event.center.x,\r\n clientY: event.center.y,\r\n })\r\n const element = this.props.model.selection || this.getElement(area)\r\n element?.trigger('click', area)\r\n\r\n if (!this.isDisableTouchCrossAvailable) {\r\n this.isDisableTouchCrossAvailable = true\r\n return\r\n }\r\n\r\n if (this.chartLayoutModel.isTouchCrossActive) {\r\n MouseModel.updateAttributes({\r\n position: null,\r\n pane: null,\r\n })\r\n this.chartLayoutModel.updateAttributes({\r\n scrollable: this.chartLayoutModel.initialScrollable,\r\n isTouchCrossActive: false,\r\n })\r\n } else if (\r\n this.isMobile &&\r\n !this.state.hasSeenCrossNotification &&\r\n this.lastActiveTool === DrawingTool.Mouse &&\r\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.smallIndex\r\n ) {\r\n const isChartsPage = this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n\r\n this.setState({ hasSeenCrossNotification: true })\r\n this.props.notificationContext.show(\r\n {\r\n this.props.notificationContext.hide()\r\n window.localStorage.setItem('hasSeenCrossNotification', 'true')\r\n }}\r\n theme=\"dark\"\r\n >\r\n Got it\r\n \r\n }\r\n >\r\n Long press the chart to show the crosshair.\r\n ,\r\n { inline: !isChartsPage }\r\n )\r\n }\r\n\r\n this.lastActiveTool = this.props.activeTool\r\n }\r\n\r\n onPaneMouseLeave = () => {\r\n // timout in onPaneMouseMove may cause racecondition where active class is added right after it's been removed\r\n setTimeout(() => {\r\n this.zoomControlsRef.current?.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS)\r\n })\r\n if (this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n this.renderCross()\r\n }\r\n }\r\n\r\n onPaneMouseMove = (e: React.MouseEvent | React.Touch, isMouseDownIgnored = false) => {\r\n const { model, chartModel } = this.props\r\n const zoomControls = this.zoomControlsRef.current\r\n const paneHeight = model.height\r\n if (zoomControls) {\r\n const area = this.getArea<{ mouseDown: boolean; clientX: number; clientY: number }>(e, {\r\n mouseDown: !isMouseDownIgnored && this.mouseDown,\r\n clientX: e.clientX,\r\n clientY: e.clientY,\r\n })\r\n\r\n // timeout is needed here as adding a classname on parent element of a button where we are listening on a click is not working properly if done synchrnousely\r\n setTimeout(() => {\r\n // 103 is the destance between pane bottom and zoom-controls top\r\n // zoomer bottom (8 px) + zoomer height (20px) - 13px + zoom controls height (75px) = 90px\r\n const isInArea = model.height - 90 <= area.cursorY && paneHeight > 210\r\n\r\n if (\r\n isInArea &&\r\n !zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS) &&\r\n !chartModel.getIsDisabled()\r\n ) {\r\n zoomControls.classList.add(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\r\n } else if (!isInArea && zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS)) {\r\n zoomControls.classList.remove(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\r\n }\r\n\r\n if (!area.mouseDown && !model.selection && isInArea && !chartModel.getIsDisabled()) {\r\n if (!zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\r\n zoomControls.classList.add(ZOOM_CONTROLS_ACTIVE_CLASS)\r\n }\r\n } else if (zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\r\n zoomControls.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS)\r\n }\r\n })\r\n }\r\n }\r\n\r\n onMouseLeave = () => {\r\n this.mouseDown = false\r\n }\r\n\r\n onTouchStart = (e: React.TouchEvent) => {\r\n if (!this.props.touchEventsDisabled && e.targetTouches.length === 1) {\r\n const touchEvent = e.targetTouches[0]\r\n if (this.chartLayoutModel.scrollable) {\r\n this.onCanvasInteractionStart(touchEvent)\r\n } else if (this.chartLayoutModel.isTouchCrossActive) {\r\n this.lastClientX = touchEvent.clientX\r\n this.lastClientY = touchEvent.clientY\r\n if (!MouseModel.pane()?.eql(this.props.model)) {\r\n const area = this.getArea(touchEvent, {\r\n mouseDown: this.mouseDown,\r\n clientX: touchEvent.clientX,\r\n clientY: touchEvent.clientY,\r\n })\r\n this.setMousePosition(this.getMousePositionInBoundaries(area))\r\n this.isDisableTouchCrossAvailable = false\r\n }\r\n } else {\r\n const area = this.getArea(touchEvent, { isTouch: true }) // passing isTouch is pretty confusing, it's used in Tools.jsx -> onMouseDown method\r\n const element = this.getElement(area)\r\n if (element?.getIsChartEvent?.()) {\r\n const chartEventElement = element as ChartEvent\r\n chartEventElement.toggleIsOpen()\r\n }\r\n }\r\n this.onPaneMouseMove(touchEvent, true)\r\n }\r\n }\r\n\r\n onTouchMove = (e: TouchEvent) => {\r\n if (!this.props.touchEventsDisabled) {\r\n if (!this.getIsHammerAllowScrollActive()) {\r\n e.preventDefault()\r\n }\r\n if (!this.props.touchEventsDisabled && e.targetTouches.length === 1) {\r\n this.onCanvasInteractionMove(e.targetTouches[0])\r\n }\r\n }\r\n }\r\n\r\n onTouchEnd = (e: React.TouchEvent) => {\r\n if (!this.props.touchEventsDisabled && this.chartLayoutModel.scrollable) {\r\n this.onCanvasInteractionEnd(e)\r\n }\r\n }\r\n\r\n onCanvasPress = (e: React.MouseEvent) => {\r\n if (this.chartLayoutModel.scrollable) {\r\n this.chartLayoutModel.updateAttribute('scrollable', false)\r\n document.removeEventListener('touchmove', this.onMouseMoveOnScrolling)\r\n }\r\n if (!this.chartLayoutModel.isTouchCrossActive) {\r\n this.chartLayoutModel.updateAttribute('isTouchCrossActive', true)\r\n this.onCanvasInteractionMove(e)\r\n }\r\n }\r\n\r\n onCanvasInteractionStart = (e: React.Touch | React.MouseEvent) => {\r\n const { activeTool, activeChartInteraction, chartModel, model } = this.props\r\n const isTouch = typeof Touch !== 'undefined' && e instanceof Touch\r\n this.lastActiveTool = activeTool\r\n\r\n if (isPrimaryClick(e) && !activeChartInteraction && !chartModel.getIsDisabled()) {\r\n const area = this.getArea(e, { isTouch }) // passing isTouch is pretty confusing, it's used in Tools.jsx -> onMouseDown method\r\n const element = this.getElement(area)\r\n\r\n // if user click outside of drawable area but still inside canvas creator would hang unfinised,\r\n // it that case we want to cancel element creation, same as we do on click outside of canvas / onBlur\r\n if (model.selection?.isCreator && !area.isCursorInChartWidthBoundaries && element !== model.selection) {\r\n model.getAllElements().forEach((element) => {\r\n if (element.instance.getIsCreator?.() && !element.instance.getIsCreatorDialogOpen?.()) {\r\n element.destroyCascade()\r\n }\r\n })\r\n }\r\n if (this.chartLayoutModel.scrollable) {\r\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'grabbing' })\r\n if (model.scaleRange) {\r\n this.currentViewRange = model.getChartOrIndicatorElement()?.instance?.getMinMax?.() ?? null\r\n }\r\n document.addEventListener(isTouch ? 'touchmove' : 'mousemove', this.onMouseMoveOnScrolling)\r\n document.addEventListener(isTouch ? 'touchend' : 'mouseup', this.onCanvasInteractionEnd)\r\n }\r\n if (element?.getIsChartEvent?.()) {\r\n this.setSelectedElement(null)\r\n const chartEventElement = element as ChartEvent\r\n chartEventElement.toggleIsOpen()\r\n } else if (\r\n activeTool === DrawingTool.Mouse ||\r\n model.getAllElements().some(({ instance }) => instance.isCreator)\r\n ) {\r\n element?.trigger('mousedown', area)\r\n this.setSelectedElement(element)\r\n }\r\n model.trigger('mousedown', model, area, element)\r\n this.mouseDown = true\r\n this.lastX = area.x\r\n this.lastY = area.y\r\n }\r\n\r\n this.lastClientX = e.clientX\r\n this.lastClientY = e.clientY\r\n }\r\n\r\n onCanvasInteractionMove = (e: React.MouseEvent | React.Touch) => {\r\n const area = this.getArea(e, {\r\n mouseDown: this.mouseDown,\r\n clientX: e.clientX,\r\n clientY: e.clientY,\r\n })\r\n if (!area.isCursorInChartWidthBoundaries) {\r\n MouseModel.updateAttributes({\r\n position: null,\r\n pane: null,\r\n })\r\n return\r\n }\r\n\r\n const { model } = this.props\r\n const hoveredElement = this.getElement(area)\r\n const element = model.selection || hoveredElement\r\n\r\n if (!(this.isMobile && !this.chartLayoutModel.isTouchCrossActive)) {\r\n this.isDisableTouchCrossAvailable = true\r\n this.setMousePosition(\r\n this.lastClientX && this.lastClientY && this.chartLayoutModel.isTouchCrossActive && MouseModel.position\r\n ? this.getMousePositionInBoundaries({\r\n x: MouseModel.position.x + (model.scale.x.invert(area.clientX) - model.scale.x.invert(this.lastClientX)),\r\n y: MouseModel.position.y + (model.scale.y.invert(area.clientY) - model.scale.y.invert(this.lastClientY)),\r\n })\r\n : { x: area.x, y: area.y }\r\n )\r\n }\r\n\r\n if (!this.chartLayoutModel.scrollable) {\r\n this.lastClientX = area.clientX\r\n this.lastClientY = area.clientY\r\n }\r\n\r\n element?.trigger('mousemove', area)\r\n if (\r\n this.mouseDown &&\r\n model.selection instanceof CanvasElement &&\r\n !model.selection.activeThumb &&\r\n !this.chartLayoutModel.activeChartEvent\r\n ) {\r\n if (!model.selection.getIsCreator?.()) {\r\n model.selection.moveBy(area.x - this.lastX, area.y - this.lastY)\r\n }\r\n this.lastX = area.x\r\n this.lastY = area.y\r\n this.renderAll()\r\n }\r\n const isElementHovered =\r\n this.props.activeTool === DrawingTool.Mouse &&\r\n ((element && element === hoveredElement) || hoveredElement instanceof CanvasElement)\r\n\r\n if (hoveredElement !== this.hoveredElement && this.hoveredElement instanceof CanvasElement) {\r\n this.hoveredElement.setIsHovered(false)\r\n this.hoveredElement = null\r\n }\r\n\r\n if (isElementHovered && hoveredElement instanceof CanvasElement) {\r\n if (!hoveredElement.isHovered && !hoveredElement.isSelected) {\r\n hoveredElement.setIsHovered(true)\r\n this.hoveredElement = hoveredElement\r\n }\r\n }\r\n\r\n if (isElementHovered !== this.isElementHovered && this.canvas && hoveredElement?.type !== IndicatorType.Cot) {\r\n this.canvas.className = isElementHovered ? 'hover' : ''\r\n if (this.chartLayoutModel.cross && this.crossCanvas) {\r\n this.crossCanvas.className = `second${isElementHovered ? ' hover' : ''}`\r\n }\r\n this.isElementHovered = isElementHovered\r\n }\r\n }\r\n\r\n onCanvasInteractionEnd = (event: TouchEvent | MouseEvent | React.TouchEvent) => {\r\n if (MouseModel.position) {\r\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'crosshair' })\r\n } else {\r\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'default' })\r\n }\r\n const isTouch = typeof TouchEvent !== 'undefined' && event instanceof TouchEvent\r\n this.mouseDown = false\r\n const area = this.getArea(event)\r\n const element = this.props.model.selection || this.getElement(area)\r\n element?.trigger('mouseup', area)\r\n document.removeEventListener(isTouch ? 'touchmove' : 'mousemove', this.onMouseMoveOnScrolling)\r\n document.removeEventListener(isTouch ? 'touchend' : 'mouseup', this.onCanvasInteractionEnd)\r\n }\r\n\r\n getMousePositionInBoundaries = ({ x, y }: { x: number; y: number }) => {\r\n const { model } = this.props\r\n const Settings = getSettings(model)\r\n const canvasAreaRectangle = this.canvas!.getBoundingClientRect()\r\n const chartLeft = model.scale.x.invert(-model.chart().leftOffset + 1)\r\n const chartRight = model.scale.x.invert(\r\n canvasAreaRectangle.width - Settings.right.width - Settings.left.width - model.chart().leftOffset - 1\r\n )\r\n const chartTop = model.scale.y.invert(0)\r\n const chartBottom = model.scale.y.invert(canvasAreaRectangle.height - Settings.bottom.height - Settings.top.height)\r\n\r\n return {\r\n x: getValueInRange({\r\n value: x,\r\n min: chartLeft,\r\n max: chartRight,\r\n }),\r\n y: getValueInRange({\r\n value: y,\r\n min: chartBottom,\r\n max: chartTop,\r\n }),\r\n }\r\n }\r\n\r\n setMousePosition = ({ x, y }: { x: number; y: number }) => {\r\n const isSameMouseModel = !!MouseModel.pane()?.eql(this.props.model)\r\n MouseModel.updateAttributes({\r\n position: { x, y },\r\n ...(isSameMouseModel ? {} : { pane: this.props.model }),\r\n })\r\n }\r\n\r\n setSelection = (selection: IndicatorElement | CanvasElement | null) => {\r\n if (selection instanceof CanvasElement) {\r\n selection?.setIsSelected(true)\r\n }\r\n\r\n this.props.model.updateAttribute('selection', selection)\r\n }\r\n\r\n setSelectedElement = (element: IndicatorElement | CanvasElement | null) => {\r\n const { selection } = this.props.model\r\n const isSelectionCanvas = selection instanceof CanvasElement\r\n if (element !== selection || (isSelectionCanvas && element && !selection?.isSelected)) {\r\n if (isSelectionCanvas) {\r\n selection?.setIsSelected(false)\r\n }\r\n if (isSelectionCanvas && selection?.isCreator) {\r\n this.setSelection(null)\r\n } else {\r\n this.setSelection(element)\r\n }\r\n }\r\n }\r\n\r\n getElement = (area: PaneArea) => {\r\n const chartEvents = this.props.model.getAllChartEvents(false)\r\n\r\n for (let i = chartEvents.length - 1; i >= 0; i--) {\r\n const el = chartEvents[i].instance\r\n if (el.getIsInChartView(this.props.chartModel) && el.isInArea(area)) {\r\n return el\r\n }\r\n }\r\n\r\n const elements = this.props.model.getAllElements()\r\n\r\n for (let i = elements.length - 1; i >= 0; i--) {\r\n const el = elements[i].instance\r\n if (el.getIsInChartView(this.props.chartModel) && el.isInArea(area)) {\r\n return el\r\n }\r\n }\r\n return null\r\n }\r\n\r\n getCanvasDOMNode = () =>\r\n // This is used in app/modals/publish/publish.jsx\r\n this.canvasRef.current\r\n}\r\n\r\nexport default withNotificationContext(withElementStyleDialogState(withPaneModel(Pane)))\r\n","import React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport PaneModel from '../../models/pane'\r\n\r\nexport function withPaneModel

(Component: React.ComponentType

) {\r\n return function WrappedComponent(props: P) {\r\n const model = useModelState(props.model, { watchProperties: ['selection'] })\r\n\r\n return \r\n }\r\n}\r\n","import { Spinner } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nexport function ChartSpinnerOverlay({ shouldDisplay, className }: { shouldDisplay: boolean; className: string }) {\r\n const [isVisible, setIsVisible] = React.useState(shouldDisplay)\r\n React.useEffect(() => {\r\n let timeout: number\r\n if (!shouldDisplay) {\r\n timeout = window.setTimeout(() => {\r\n setIsVisible(false)\r\n }, 400)\r\n }\r\n return () => {\r\n clearTimeout(timeout)\r\n }\r\n }, [shouldDisplay])\r\n\r\n return (\r\n <>\r\n {isVisible && (\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { RootChartConfigObjectChart } from '../../../types/shared'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { DrawingTool } from '../toolbar/interfaces'\r\n\r\nexport const CHART_CLASS_NAMES = 'chart flex-1 relative'\r\nexport const DEFAULT_WRAPPER_COMPONENT = 'div'\r\n\r\nexport interface ChartProps {\r\n chartIndex: number\r\n gridArea?: string\r\n WrapperComp?: React.RefForwardingComponent\r\n config: RootChartConfigObjectChart\r\n chartModel: ChartModel\r\n layoutModel: ChartLayout\r\n setActiveChartInteraction: (interaction: string | null) => void\r\n activeChartInteraction: string | null\r\n activeTool: DrawingTool\r\n touchEventsDisabled: boolean\r\n hasOutline?: boolean\r\n shouldResize?: boolean\r\n renderChartToolbar?: () => React.ReactNode\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { ChartEditorEnum, SpecificChartFunctionality } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport MouseModel from '../../models/mouse'\r\nimport PaneModel from '../../models/pane'\r\nimport Quote from '../../models/quote'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport utils, { isRedesignEnabled } from '../../utils'\r\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../../utils/chart'\r\nimport { ChartControls } from '../chart-controls'\r\nimport Pane from '../pane'\r\nimport {\r\n getBarIndex,\r\n getIsSmallIndexChart,\r\n getLeftOffset,\r\n getMinMaxLeftOffset,\r\n updateZoomAndLeftOffsetByDateRange,\r\n} from '../renderUtils'\r\nimport { ChartProps } from './constants'\r\nimport { withChartInit } from './with-chart-init'\r\nimport { withWatchedPanesOnChartModel } from './with-watched-panes-on-chart-model'\r\n\r\nfunction preventDefaultFunc(event: Event) {\r\n event.preventDefault()\r\n}\r\n\r\nfunction getZoomFactor({\r\n chartLayout,\r\n currentZoomFactor,\r\n diff,\r\n minBarWidthInPx = 1,\r\n maxBarWidthInPx = 66,\r\n}: {\r\n chartLayout: ChartLayout\r\n currentZoomFactor: number\r\n diff: number\r\n minBarWidthInPx?: number\r\n maxBarWidthInPx?: number\r\n}) {\r\n const minZoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth: minBarWidthInPx,\r\n numOfVisibleBars: 1,\r\n })\r\n const maxZoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth: maxBarWidthInPx,\r\n numOfVisibleBars: 1,\r\n })\r\n const isNegativeDirection = diff < 0\r\n const newZoomFactor = currentZoomFactor + diff\r\n const newZoomFactorInRange = Math.min(Math.max(minZoomFactor, newZoomFactor), maxZoomFactor)\r\n\r\n if (newZoomFactor > newZoomFactorInRange && currentZoomFactor > newZoomFactorInRange) {\r\n return isNegativeDirection ? newZoomFactor : currentZoomFactor\r\n }\r\n\r\n if (newZoomFactor < newZoomFactorInRange && currentZoomFactor < newZoomFactorInRange) {\r\n return !isNegativeDirection ? newZoomFactor : currentZoomFactor\r\n }\r\n\r\n return newZoomFactorInRange\r\n}\r\n\r\ninterface ChartState {\r\n panesWrapperElement: HTMLDivElement | null\r\n}\r\n\r\nclass Chart extends React.Component {\r\n lastWidth: number\r\n mouseWheelTimeout?: number\r\n setStateWithPanesTimeout?: number\r\n lastHeight = 0\r\n lastY: number | null = null\r\n lastX: number | null = null\r\n resizerPaneIndex = -1\r\n minimalPaneHeight = 0\r\n zoomerRightAlign: {\r\n barIndex?: number\r\n index: number\r\n offsetDiff: number\r\n } | null = null\r\n\r\n // expects model, config, layoutModel\r\n constructor(props: ChartProps) {\r\n super(props)\r\n\r\n this.lastWidth = props.chartModel.width\r\n this.props.layoutModel.bind('change', this.onLayoutModelChange)\r\n this.state = { panesWrapperElement: null }\r\n }\r\n\r\n componentDidMount() {\r\n const { chartModel } = this.props\r\n this.lastWidth = this.props.layoutModel.width\r\n\r\n chartModel.trigger('change', chartModel)\r\n chartModel.bind('createPane', this.onPaneCreate)\r\n\r\n this.calculateMinimalPaneHeight()\r\n this.handleQuoteChange(chartModel.quote()!)\r\n this.onModelChange()\r\n\r\n chartModel.bind('update', this.onModelChange)\r\n chartModel.bind('destroy', () => {\r\n Quote.unbind('olderData', this.onOlderDataLoaded)\r\n Quote.unbind(`${QuoteFetchType.Refetch} ${QuoteFetchType.NewerData}`, this.onDataLoaded)\r\n })\r\n\r\n Quote.bind('olderData', this.onOlderDataLoaded)\r\n Quote.bind(`${QuoteFetchType.Refetch} ${QuoteFetchType.NewerData}`, this.onDataLoaded)\r\n }\r\n\r\n componentDidUpdate(prevProps: Readonly, prevState: Readonly) {\r\n if (\r\n prevState.panesWrapperElement !== this.state.panesWrapperElement ||\r\n prevProps.layoutModel.isWheelZoomEnabled !== this.props.layoutModel.isWheelZoomEnabled\r\n ) {\r\n prevState.panesWrapperElement?.removeEventListener('wheel', preventDefaultFunc)\r\n\r\n if (this.props.layoutModel.isWheelZoomEnabled) {\r\n // can't use onWheel as it has passive: true\r\n this.state.panesWrapperElement?.addEventListener('wheel', preventDefaultFunc, { passive: false })\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n const { chartModel, layoutModel } = this.props\r\n if (this.setStateWithPanesTimeout) {\r\n clearTimeout(this.setStateWithPanesTimeout)\r\n }\r\n layoutModel.unbind('change', this.onLayoutModelChange)\r\n chartModel.unbind('update', this.onModelChange)\r\n\r\n this.state.panesWrapperElement?.removeEventListener('wheel', preventDefaultFunc)\r\n }\r\n\r\n handleSetPanesWrapperRef = (panesWrapperElement: HTMLDivElement | null) => {\r\n this.setState({ panesWrapperElement })\r\n }\r\n\r\n render() {\r\n const { activeTool, chartIndex, layoutModel, chartModel, renderChartToolbar } = this.props\r\n const panes =\r\n layoutModel.specificChartFunctionality === SpecificChartFunctionality.futuresPage\r\n ? chartModel.getAllValidPanes()\r\n : chartModel.getAllPanes()\r\n const showSettings = layoutModel.editors.includes(ChartEditorEnum.settings)\r\n\r\n return (\r\n <>\r\n this.onClick(undefined)}\r\n data-testid={`chart-${chartIndex}-settings`}\r\n onMouseEnter={this.resetMouseModel}\r\n >\r\n {showSettings && }\r\n \r\n {layoutModel.editable && showSettings && renderChartToolbar && (\r\n \r\n {renderChartToolbar()}\r\n \r\n )}\r\n \r\n {panes.map((pane, index) => (\r\n \r\n ))}\r\n \r\n \r\n )\r\n }\r\n\r\n onMouseWheel = (e: React.WheelEvent) => {\r\n const { chartModel, layoutModel } = this.props\r\n const isLoading = chartModel.panes().count() < 1\r\n if (!layoutModel.isWheelZoomEnabled || isLoading) {\r\n return\r\n }\r\n if (!this.zoomerRightAlign) {\r\n this.calcZoomerRightAlign()\r\n }\r\n clearTimeout(this.mouseWheelTimeout)\r\n this.mouseWheelTimeout = window.setTimeout(() => {\r\n this.zoomerRightAlign = null\r\n }, 250)\r\n this.onZoomerMouseMove(e, undefined, true)\r\n }\r\n\r\n onClick = (activePane: PaneModel | undefined) => {\r\n if (\r\n !this.props.layoutModel.activeChart.eql(this.props.chartModel) ||\r\n !(this.props.layoutModel.activePane?.eql(activePane) || this.props.layoutModel.activePane === activePane)\r\n ) {\r\n this.props.layoutModel.updateAttributes({ activeChart: this.props.chartModel, activePane })\r\n }\r\n }\r\n\r\n onPaneCreate = () => {\r\n const { chartModel } = this.props\r\n this.onModelChange()\r\n this.calculateMinimalPaneHeight()\r\n chartModel.trigger('change', chartModel)\r\n }\r\n\r\n onPaneDestroy = (paneId: string) => {\r\n const { chartModel } = this.props\r\n const pane = chartModel.panes().find(paneId)\r\n\r\n if (pane) {\r\n pane.destroyCascade()\r\n this.onModelChange()\r\n chartModel.trigger('change', chartModel)\r\n }\r\n }\r\n\r\n onModelChange = (chartModelParam?: ChartModel) => {\r\n const { chartModel, config } = this.props\r\n const panes = chartModel.getAllPanes()\r\n const quote = chartModel.quote()\r\n\r\n if (panes.length === 0 || !quote || chartModel.leftOffset === undefined) {\r\n return\r\n }\r\n\r\n const { width, height } = chartModel\r\n let panesHeight = panes.reduce((sum, pane) => sum + (pane.height ?? 0), 0)\r\n if (panesHeight !== height) {\r\n panesHeight = panes.reduce((sum, pane) => {\r\n const newPaneHeight = Math.round((pane.height / panesHeight) * height)\r\n if (!Number.isNaN(newPaneHeight)) {\r\n pane.updateAttribute('height', newPaneHeight)\r\n }\r\n return sum + newPaneHeight\r\n }, 0)\r\n const chartPane = chartModel.getChartPane()\r\n if (chartPane && panesHeight !== height) {\r\n const newChartPaneHeight = chartPane.height + height - panesHeight\r\n if (!Number.isNaN(newChartPaneHeight)) {\r\n chartPane.updateAttribute('height', newChartPaneHeight)\r\n }\r\n }\r\n }\r\n\r\n const newLeftOffset = getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: config,\r\n })\r\n const newIsScrolled = chartModel.leftOffset !== newLeftOffset\r\n const isScrolled = chartModel.isScrolled\r\n if (!isScrolled && this.lastWidth !== width) {\r\n this.lastWidth = width\r\n chartModel.updateAttribute('leftOffset', newLeftOffset)\r\n } else if (isScrolled !== newIsScrolled) {\r\n chartModel.updateAttributes({ isScrolled: newIsScrolled })\r\n }\r\n\r\n if (this.lastHeight !== height) {\r\n this.lastHeight = height\r\n this.calculateMinimalPaneHeight()\r\n }\r\n\r\n if (chartModelParam) {\r\n this.handleQuoteChange(chartModelParam.quote())\r\n }\r\n }\r\n\r\n onLayoutModelChange = ({ activeChart, activePane }: { activeChart: ChartModel; activePane: PaneModel }) => {\r\n const { chartModel } = this.props\r\n if (!activeChart) {\r\n return\r\n }\r\n for (const pane of chartModel.getAllPanes()) {\r\n if (activePane?.id !== pane.id && pane.selection?.isSelected === true) {\r\n pane.selection.setIsSelected(false)\r\n pane.updateAttribute('selection', undefined)\r\n }\r\n }\r\n }\r\n\r\n onResizerMouseDown = (e: React.MouseEvent | MouseEvent, model: PaneModel) => {\r\n if (e.button !== 0) {\r\n return\r\n }\r\n this.lastY = e.clientY\r\n this.resizerPaneIndex = this.props.chartModel\r\n .panes()\r\n .all()\r\n .findIndex((pane) => pane.eql(model))\r\n document.addEventListener('mousemove', this.onResizerMouseMove)\r\n document.addEventListener('mouseup', this.onResizerMouseUp)\r\n }\r\n\r\n onResizerMouseMove = (e: MouseEvent) => {\r\n if (this.resizerPaneIndex > 0 && this.lastY !== null && this.resizePanesAccordingly(this.lastY! - e.clientY)) {\r\n this.lastY = e.clientY\r\n }\r\n }\r\n\r\n onResizerMouseUp = (e: MouseEvent) => {\r\n const { chartModel } = this.props\r\n if (this.resizerPaneIndex > 0 && this.lastY !== null) {\r\n this.resizePanesAccordingly(this.lastY - e.clientY)\r\n this.lastY = null\r\n\r\n chartModel.trigger('change', chartModel)\r\n }\r\n\r\n document.removeEventListener('mousemove', this.onResizerMouseMove)\r\n document.removeEventListener('mouseup', this.onResizerMouseUp)\r\n }\r\n\r\n calculateMinimalPaneHeight() {\r\n const { chartModel } = this.props\r\n const { minHeight, total } = chartModel\r\n .panes()\r\n .all()\r\n .reduce(\r\n ({ minHeight, total }, pane) => {\r\n if (minHeight > pane.height) {\r\n minHeight = pane.height\r\n }\r\n total += pane.getIsChartPane() ? 3 : 1\r\n return { minHeight, total }\r\n },\r\n { minHeight: chartModel.height, total: 0 }\r\n )\r\n const optiMinHeight = Math.floor(chartModel.height / total)\r\n this.minimalPaneHeight = Math.min(minHeight, optiMinHeight)\r\n }\r\n\r\n resizePanesAccordingly(difY: number) {\r\n const { chartModel } = this.props\r\n const panes = chartModel.panes().all()\r\n let basePane = this.resizerPaneIndex\r\n if (!difY) {\r\n return true\r\n } else if (difY > 0) {\r\n let i = basePane\r\n let pane = panes[i]\r\n if (pane.height + difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height + difY)\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n for (--i; i >= 0; i--) {\r\n pane = panes[i]\r\n if (pane.height - difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height - difY)\r\n break\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n }\r\n } else if (difY < 0) {\r\n basePane = Math.max(0, basePane - 1)\r\n let i = basePane\r\n let pane = panes[i]\r\n if (pane.height - difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height - difY)\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n for (++i; i < panes.length; i++) {\r\n pane = panes[i]\r\n if (pane.height + difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height + difY)\r\n break\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n }\r\n }\r\n\r\n const panesHeight = panes.reduce((sum, pane) => sum + pane.height, 0)\r\n if (panesHeight !== chartModel.height) {\r\n difY = chartModel.height - panesHeight\r\n\r\n const pane = panes[basePane]\r\n pane.updateAttribute('height', pane.height + difY)\r\n\r\n // if we exceeded total height we need to stop updating lastY - return false\r\n return false\r\n }\r\n\r\n return true\r\n }\r\n\r\n onZoomerTouchStart = (e: React.TouchEvent | TouchEvent) => {\r\n if (!this.props.layoutModel.scrollable || e.touches.length !== 1 || this.props.touchEventsDisabled) {\r\n return\r\n }\r\n this.onZoomerMouseDown(e.targetTouches[0])\r\n }\r\n\r\n onZoomerTouchMove = (e: TouchEvent) => {\r\n if (!this.props.layoutModel.scrollable || e.touches.length !== 1) {\r\n return\r\n }\r\n this.onZoomerMouseMove(e.targetTouches[0])\r\n }\r\n\r\n onZoomerTouchEnd = () => {\r\n if (!this.props.layoutModel.scrollable) {\r\n return\r\n }\r\n this.onZoomerMouseUp()\r\n }\r\n\r\n getRawDistance = (e: Pick) => {\r\n const p1 = { x: e.touches[0].clientX, y: e.touches[0].clientY }\r\n const p2 = { x: e.touches[1].clientX, y: e.touches[1].clientY }\r\n return math.distance(p1, p2)\r\n }\r\n\r\n onPinchStart = (e: React.TouchEvent) => {\r\n const { chartModel } = this.props\r\n const { activeChartInteraction, setActiveChartInteraction, touchEventsDisabled } = this.props\r\n const isLoading = chartModel.panes().count() < 1\r\n\r\n if (\r\n this.props.layoutModel.scrollable &&\r\n e.touches.length === 2 &&\r\n !activeChartInteraction &&\r\n !isLoading &&\r\n !touchEventsDisabled\r\n ) {\r\n setActiveChartInteraction('pinch')\r\n this.onZoomerMouseDown({ clientX: this.getRawDistance(e as unknown as TouchEvent) })\r\n\r\n document.addEventListener('touchmove', this.onPinchMove)\r\n document.addEventListener('touchend', this.onPinchEnd)\r\n }\r\n }\r\n\r\n onPinchMove = (e: TouchEvent) => {\r\n if (e.touches.length === 2) {\r\n this.onZoomerMouseMove({ clientX: this.getRawDistance(e) })\r\n }\r\n }\r\n\r\n onPinchEnd = (e: TouchEvent) => {\r\n if (e.touches.length === 1) {\r\n this.onZoomerMouseUp()\r\n document.removeEventListener('touchmove', this.onPinchMove)\r\n document.removeEventListener('touchend', this.onPinchEnd)\r\n }\r\n }\r\n\r\n calcZoomerRightAlign = () => {\r\n const { chartModel } = this.props\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const quote = chartModel.quote()\r\n const fx = chartModel.panes().first().scale.x\r\n const barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: this.props.layoutModel })\r\n const currentLeftOffset = getLeftOffset({ quote, chartModel, config: this.props.config, barWidth })\r\n this.zoomerRightAlign = null\r\n\r\n if (quote.isIntraday && quote.instrument === Instrument.Stock) {\r\n const barIndex = quote.getBarIndex(quote.close.length - 1)\r\n let offsetDiff =\r\n chartModel.leftOffset -\r\n getLeftOffset({\r\n quote,\r\n chartModel: chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n barIndex,\r\n shouldAlignDaysToLeftApplied: false,\r\n })\r\n const offsetBars = ~~(offsetDiff / barWidth)\r\n offsetDiff -= offsetBars * barWidth\r\n this.zoomerRightAlign = {\r\n barIndex,\r\n index: barIndex - offsetBars,\r\n offsetDiff,\r\n }\r\n } else if (chartModel.leftOffset <= currentLeftOffset) {\r\n this.zoomerRightAlign = {\r\n index: quote.getBarIndex(quote.open.length - 1),\r\n offsetDiff: chartModel.leftOffset - currentLeftOffset,\r\n }\r\n } else {\r\n const offset = chartModel.leftOffset\r\n for (let i = 0; i < quote.open.length; i += 1) {\r\n const x = fx(i)\r\n if (x + offset < 0) {\r\n continue\r\n }\r\n if (x + offset > chartModel.width - ChartSettings.left.width - ChartSettings.right.width) {\r\n const barIndex = quote.getBarIndex(i - 1)\r\n let offsetDiff =\r\n offset -\r\n getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n barIndex,\r\n })\r\n const offsetBars = ~~(offsetDiff / barWidth)\r\n offsetDiff -= offsetBars * barWidth\r\n this.zoomerRightAlign = {\r\n barIndex,\r\n index: barIndex - offsetBars,\r\n offsetDiff,\r\n }\r\n break\r\n }\r\n }\r\n }\r\n }\r\n\r\n onZoomerMouseDown = (e: Partial) => {\r\n if ((e.button !== 0 && 'button' in e) || !this.props.layoutModel.scrollable) {\r\n return\r\n }\r\n switch (this.props.activeChartInteraction) {\r\n case 'pinch':\r\n break\r\n case null:\r\n this.props.setActiveChartInteraction('zoomer')\r\n break\r\n default:\r\n return\r\n }\r\n\r\n this.lastX = e.clientX ?? null\r\n this.calcZoomerRightAlign()\r\n\r\n document.addEventListener('mousemove', this.onZoomerMouseMove)\r\n document.addEventListener('mouseup', this.onZoomerMouseUp)\r\n document.addEventListener('touchmove', this.onZoomerTouchMove)\r\n document.addEventListener('touchend', this.onZoomerTouchEnd)\r\n }\r\n\r\n normalizeWheelDeltaY = (e: WheelEvent) => {\r\n // because wheel deltaY on mouse and touchpad is quite different we need to normalize it\r\n const abs = Math.abs(e.deltaY)\r\n if (abs === 0) return 0\r\n return Math.log(abs) * Math.sign(e.deltaY) * 10\r\n }\r\n\r\n onZoomerMouseMove = (\r\n e: React.WheelEvent | MouseEvent | Touch | { clientX: number },\r\n _?: unknown,\r\n isMouseWheel = false\r\n ) => {\r\n const { chartModel, layoutModel } = this.props\r\n let difX\r\n if (!layoutModel.scrollable) return\r\n if (!isMouseWheel && this.lastX !== null) {\r\n difX = (this.lastX - e.clientX) / chartModel.width\r\n this.lastX = e.clientX\r\n } else {\r\n // standard difX calculation result is around 0.00x, wheel deltaY is whole px\r\n // because of that we divide px with 1000\r\n difX = this.normalizeWheelDeltaY(e as WheelEvent) / 1000\r\n }\r\n\r\n this.addToZoomFactor({ diff: -difX })\r\n }\r\n\r\n addToZoomFactor = ({\r\n diff,\r\n shouldCalculateRightAlign = false,\r\n }: {\r\n diff: number\r\n shouldCalculateRightAlign?: boolean\r\n }) => {\r\n const { chartModel, layoutModel } = this.props\r\n if (shouldCalculateRightAlign) {\r\n this.calcZoomerRightAlign()\r\n }\r\n // 6 is default bar width with margin on charts page, so to get the similar feeling when zooming we're multiplying the zoom factor by the coefficient\r\n const diffCoefficient = chartModel.zoomFactor * (6 / getBarWidthWithMargin({ chartLayout: this.props.layoutModel }))\r\n const zoomFactor = getZoomFactor({\r\n chartLayout: layoutModel,\r\n currentZoomFactor: chartModel.zoomFactor,\r\n diff: diff * diffCoefficient,\r\n })\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: this.props.layoutModel,\r\n })\r\n\r\n let leftOffset\r\n if (this.props.config.stretch) {\r\n leftOffset = 0\r\n } else if (getIsSmallIndexChart(this.props.layoutModel.specificChartFunctionality)) {\r\n leftOffset = barWidth\r\n } else if (this.zoomerRightAlign) {\r\n leftOffset = getMinMaxLeftOffset({\r\n newLeftOffset:\r\n getLeftOffset({\r\n quote: chartModel.quote(),\r\n chartModel: chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n barIndex: this.zoomerRightAlign.index,\r\n shouldAlignDaysToLeftApplied: false,\r\n }) + this.zoomerRightAlign.offsetDiff,\r\n chartModel: chartModel,\r\n barWidth,\r\n barIndex: getBarIndex(chartModel.quote()),\r\n })\r\n } else {\r\n return\r\n }\r\n chartModel.updateAttributes({\r\n zoomFactor,\r\n leftOffset,\r\n dateRange: null,\r\n })\r\n if (shouldCalculateRightAlign) {\r\n this.zoomerRightAlign = null\r\n }\r\n }\r\n\r\n onZoomerMouseUp = () => {\r\n this.zoomerRightAlign = null\r\n document.removeEventListener('mousemove', this.onZoomerMouseMove)\r\n document.removeEventListener('mouseup', this.onZoomerMouseUp)\r\n document.removeEventListener('touchmove', this.onZoomerTouchMove)\r\n document.removeEventListener('touchend', this.onZoomerTouchEnd)\r\n this.props.setActiveChartInteraction(null)\r\n }\r\n\r\n onZoomerReset = () => {\r\n const { chartModel, layoutModel } = this.props\r\n const zoomFactor = chartModel.chart_layout().defaultZoomFactor\r\n const barWidth = getBarWidthWithMargin({ zoomFactor, chartLayout: layoutModel })\r\n const leftOffset = getLeftOffset({\r\n quote: chartModel.quote(),\r\n chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n })\r\n\r\n chartModel.updateAttributes({\r\n zoomFactor,\r\n leftOffset,\r\n dateRange: null,\r\n })\r\n }\r\n\r\n onOlderDataLoaded = () => {\r\n throw new Error('onOlderDataLoaded not implemented')\r\n // TODO implement similarly to onDataLoaded\r\n }\r\n\r\n resetMouseModel = () => {\r\n const isLoading = this.props.chartModel.panes().count() < 1\r\n if (!isLoading) {\r\n MouseModel.updateAttributes({\r\n position: null,\r\n pane: null,\r\n })\r\n }\r\n }\r\n\r\n handleQuoteChange = (quote: Quote) => {\r\n const { chartModel } = this.props\r\n\r\n // Update only date range chart\r\n if (chartModel.dateRange) {\r\n if (!quote.eql(chartModel.quote()) || chartModel.timeframe !== quote.timeframe || quote.date.length === 0) {\r\n return\r\n }\r\n updateZoomAndLeftOffsetByDateRange({ chartModel, quote })\r\n }\r\n }\r\n\r\n onDataLoaded = (newQuote: Quote, fetchType: QuoteFetchType) => {\r\n const { chartModel } = this.props\r\n const quote = chartModel.quote()\r\n if (!quote?.eql(newQuote)) {\r\n return\r\n }\r\n\r\n const shouldForceLeftOffsetUpdate = fetchType === QuoteFetchType.Refetch\r\n let newLeftOffset = chartModel.leftOffset // TODO find proper fix. If this line is removed (if we don't trigger leftOffset update), the chart stops being updated for the user until they move chart around.\r\n if (\r\n (this.props.layoutModel.scrollable === false && !this.props.layoutModel.isTouchCrossActive) ||\r\n !chartModel.isScrolled ||\r\n shouldForceLeftOffsetUpdate\r\n ) {\r\n newLeftOffset = getLeftOffset({\r\n quote,\r\n chartModel: chartModel,\r\n config: this.props.config,\r\n })\r\n }\r\n\r\n chartModel.setChartEvents(quote.chartEvents, !quote.events)\r\n\r\n if (newLeftOffset !== chartModel.leftOffset) {\r\n chartModel.getAllElements().forEach((element) => {\r\n if (element.isDrawing() && !element.isMouseDown()) {\r\n element.instance.updateScales()\r\n }\r\n })\r\n }\r\n\r\n chartModel.updateAttribute('leftOffset', newLeftOffset)\r\n\r\n this.handleQuoteChange(quote)\r\n }\r\n}\r\n\r\nexport default withChartInit(withWatchedPanesOnChartModel(Chart))\r\n","import classNames from 'classnames'\r\nimport merge from 'lodash.merge'\r\nimport React from 'react'\r\n\r\nimport { ObjectHash } from '../../../types/shared'\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Quote from '../../models/quote'\r\nimport { getChartsDimensions, isRedesignEnabled } from '../../utils'\r\nimport { prefetchPerfIndicatorAllQuotes } from '../../utils/chart'\r\nimport { getLeftOffset } from '../renderUtils'\r\nimport { ChartSpinnerOverlay } from './chart-spinner-overlay'\r\nimport { CHART_CLASS_NAMES, ChartProps, DEFAULT_WRAPPER_COMPONENT } from './constants'\r\n\r\nexport function withChartInit(Component: React.ComponentType) {\r\n return function WrappedComponent(props: ChartProps) {\r\n const { WrapperComp = DEFAULT_WRAPPER_COMPONENT, gridArea } = props\r\n const isModelDestroyedRef = React.useRef(false)\r\n const model = useModelState(props.chartModel, { watchProperties: ['panes', 'quote'] })\r\n const layoutModel = useModelState(props.layoutModel, { watchProperties: ['activeChart'] })\r\n const quote = model.quote()\r\n\r\n const initChartRef = React.useRef(async () => {\r\n const { chartModel, config } = props\r\n const { premarket, hasChartEvents, aftermarket, ticker, instrument, timeframe, panes: panesConfig } = config\r\n\r\n const options = {\r\n premarket,\r\n aftermarket,\r\n events: hasChartEvents,\r\n patterns: panesConfig.some(\r\n (pane) =>\r\n pane.elements?.some(\r\n (element) => element.overlays?.some((overlay: ObjectHash) => overlay.type === 'overlays/patterns')\r\n )\r\n ),\r\n }\r\n\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options,\r\n })\r\n const panesWithPerfIndicator = panesConfig.filter(({ elements }) =>\r\n elements.some(({ type }) => type === 'indicators/perf')\r\n )\r\n\r\n if (panesWithPerfIndicator) {\r\n await Promise.allSettled(\r\n panesWithPerfIndicator.map((paneWithPerfIndicator) =>\r\n prefetchPerfIndicatorAllQuotes({ paneWithPerfIndicator, timeframe, options })\r\n )\r\n )\r\n }\r\n\r\n if (isModelDestroyedRef.current) {\r\n return\r\n }\r\n\r\n config.panes.forEach((pane) => {\r\n const paneProperties = merge({}, pane)\r\n paneProperties.chart = chartModel\r\n chartModel.createPaneCascade(paneProperties)\r\n })\r\n\r\n chartModel.updateAttributes({\r\n quote,\r\n premarket: options.premarket,\r\n aftermarket: options.aftermarket,\r\n })\r\n\r\n chartModel.setChartEvents(quote.chartEvents, true)\r\n\r\n if (props.shouldResize) {\r\n const chartsDimensions = getChartsDimensions(props.layoutModel.getHTMLElementId())\r\n props.layoutModel.updateAttributes(chartsDimensions)\r\n }\r\n\r\n if (chartModel.leftOffset == null) {\r\n const leftOffset = getLeftOffset({ quote, chartModel: chartModel, config: props.config })\r\n chartModel.updateAttribute('leftOffset', leftOffset)\r\n }\r\n })\r\n\r\n React.useEffect(() => {\r\n const handleModelBeforeDestroy = () => {\r\n isModelDestroyedRef.current = true\r\n }\r\n\r\n model.bind('beforeDestroy', handleModelBeforeDestroy)\r\n initChartRef.current()\r\n return () => {\r\n model.unbind('beforeDestroy', handleModelBeforeDestroy)\r\n }\r\n // We want to run it only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const isQuotePage = props.layoutModel.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isChartPage = props.layoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isFuturesForexCryptoPage = [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(props.layoutModel.specificChartFunctionality)\r\n const isModelReady =\r\n quote && ((quote.fetchedAt === undefined && quote.close.length > 0) || quote.fetchedAt > 0 || quote)\r\n const loadingStyle =\r\n !isModelReady && isQuotePage\r\n ? // 2px is border\r\n { width: model.width ? model.width + 2 : '100%', height: model.height + 2 }\r\n : undefined\r\n\r\n return (\r\n \r\n {isChartPage && (\r\n \r\n )}\r\n {isModelReady && }\r\n \r\n )\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartModel from '../../models/chart'\r\n\r\nexport function withWatchedPanesOnChartModel

(Component: React.ComponentType

) {\r\n return function WrappedComponent(props: P) {\r\n const model = useModelState(props.chartModel, { watchProperties: ['panes'] })\r\n\r\n return \r\n }\r\n}\r\n","import { DefaultErrorBoundary } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\n\r\nexport function ModuleLoadFailed(props: Partial) {\r\n return (\r\n \r\n )\r\n}\r\n","export const portfolioWatchlistAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist\" */ './portfolio-watchlist'),\r\n cacheKey: 'portfolio-watchlist',\r\n}\r\n","import { IconNameType } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { portfolioWatchlistAsyncModule } from './portfolio-watchlist/async-modules'\r\nimport { withModuleAsyncLoad } from './with-module-async-load'\r\n\r\nexport enum SidebarModule {\r\n portfolio = 'portfolio',\r\n}\r\n\r\nexport type SidebarModuleType = {\r\n key: SidebarModule\r\n icon: IconNameType\r\n description: string\r\n content: React.ComponentType\r\n width?: {\r\n min?: number | string\r\n max?: number | string\r\n default?: { desktop?: number; mobile?: number }\r\n }\r\n}\r\n\r\nexport const sidebarModules: Record = Object.freeze({\r\n [SidebarModule.portfolio]: {\r\n key: SidebarModule.portfolio,\r\n icon: 'briefcase',\r\n description: 'Portfolio watchlist',\r\n content: withModuleAsyncLoad(portfolioWatchlistAsyncModule, true),\r\n width: { min: 200, default: { mobile: 275 } },\r\n },\r\n})\r\n","import { Delayed, Spinner } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { useAsyncModule } from '../../../utils/async-modules-utils'\r\nimport { ModuleLoadFailed } from './module-load-failed'\r\n\r\nexport function withModuleAsyncLoad<\r\n T extends { default: React.ComponentType<{ setIsComponentReady: React.Dispatch> }> },\r\n>(asyncModule: { importFn: () => Promise; cacheKey: string }, withInitialLoading = false) {\r\n return function InnerFunction() {\r\n const [isComponentReady, setIsComponentReady] = React.useState(false)\r\n const [sidebarModule, { isError }] = useAsyncModule({\r\n ...asyncModule,\r\n isSuspenseMode: true,\r\n })\r\n\r\n const SidebarModule = sidebarModule?.default\r\n\r\n if (isError) {\r\n return \r\n }\r\n\r\n return (\r\n <>\r\n {!isComponentReady && withInitialLoading && (\r\n \r\n

\r\n \r\n
\r\n \r\n )}\r\n {!!SidebarModule && }\r\n \r\n )\r\n }\r\n}\r\n","import { Resizable } from 're-resizable'\r\nimport React from 'react'\r\n\r\nimport Utils from '../../utils'\r\nimport { DEFAULT_WIDTHS, SidebarDirection } from './constants'\r\nimport { useSidebarContext } from './hooks/sidebar-context'\r\n\r\ntype SidebarContentProps = {\r\n children: React.ReactNode\r\n}\r\n\r\nexport default function SidebarContent({ children }: SidebarContentProps) {\r\n const { direction, onResize, close, width } = useSidebarContext()\r\n const minWidth = width?.min ?? DEFAULT_WIDTHS.min\r\n const maxWidth = width?.max ?? DEFAULT_WIDTHS.max\r\n const defaultMobile = width?.default?.mobile ?? minWidth\r\n const defaultDesktop = width?.default?.desktop ?? maxWidth\r\n\r\n return (\r\n <>\r\n {direction === SidebarDirection.vertical && (\r\n \r\n {children}\r\n \r\n )}\r\n {direction === SidebarDirection.horizontal && (\r\n <>\r\n
\r\n
\r\n {children}\r\n
\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { Button, Icon, Paragraph, Tooltip, TooltipTrigger, useTooltipState } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { SidebarDirection } from './constants'\r\nimport { useSidebarContext } from './hooks/sidebar-context'\r\nimport { sidebarModules } from './modules/modules'\r\n\r\nexport const MOBILE_TOOLBAR_DIV_ID = 'toolbar-mobile'\r\n\r\ntype SidebarTabsProps = {\r\n className?: string\r\n}\r\n\r\nexport default function SidebarTabs({ className }: SidebarTabsProps) {\r\n const { isOpen, direction, activeModule, selectModule } = useSidebarContext()\r\n const tooltipState = useTooltipState({ placement: 'left', unstable_timeout: 300 })\r\n\r\n return (\r\n \r\n {/* reserved space for drawing button on mobile devices */}\r\n {direction === SidebarDirection.horizontal && (\r\n \r\n )}\r\n\r\n {Object.entries(sidebarModules).map(([key, value]) => {\r\n const isActive = activeModule?.key === key\r\n return (\r\n \r\n \r\n {\r\n selectModule(isActive ? undefined : value.key)\r\n }}\r\n className={classnames({ 'ml-2': direction === SidebarDirection.horizontal })}\r\n data-testid={`sidebar-${key}-btn`}\r\n >\r\n \r\n \r\n \r\n \r\n {value.description}\r\n \r\n \r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import { Delayed, Spinner, localStorage } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\nimport { useNavigate, useSearchParams } from 'react-router-dom'\r\n\r\nimport { getIsMobilePortrait } from '../../utils'\r\nimport { SidebarDirection } from './constants'\r\nimport { SidebarContext, SidebarContextType } from './hooks/sidebar-context'\r\nimport { ModuleLoadFailed } from './modules/module-load-failed'\r\nimport { SidebarModule, SidebarModuleType, sidebarModules } from './modules/modules'\r\nimport SidebarContent from './sidebar-content'\r\nimport SidebarTabs from './sidebar-tabs'\r\n\r\nexport const SIDEBAR_QUERY_PARAM = 'sidebar'\r\n\r\n// This is a temp function, to remove unused property from localstorage\r\nfunction removeSidebarFromLocalstorage() {\r\n const SIDEBAR_LOCAL_STORAGE_KEY = 'sidebarModule'\r\n localStorage.removeValue(SIDEBAR_LOCAL_STORAGE_KEY)\r\n}\r\nremoveSidebarFromLocalstorage()\r\n\r\ntype SidebarProps = {\r\n onShouldResize: () => void\r\n direction: SidebarDirection\r\n tabsClassName?: string\r\n}\r\n\r\n// Todo - this is not correct approach but this component can unmount/mount on mobile orientation change so we can't keep it inside the component\r\nlet isInit = false\r\n\r\nexport function Sidebar({ onShouldResize, direction, tabsClassName }: SidebarProps) {\r\n const navigate = useNavigate()\r\n const [urlSearchParams] = useSearchParams()\r\n const sidebarModuleKey = (urlSearchParams.get(SIDEBAR_QUERY_PARAM) as keyof typeof sidebarModules | null) || null\r\n const [activeModule, setActiveModule] = React.useState(null)\r\n\r\n const isOpen = !!activeModule\r\n const handleSelectModule = React.useCallback(\r\n (key?: SidebarModule) => {\r\n const newUrlSearchParams = new URLSearchParams(urlSearchParams)\r\n if (key) {\r\n newUrlSearchParams.set(SIDEBAR_QUERY_PARAM, key)\r\n } else {\r\n newUrlSearchParams.delete(SIDEBAR_QUERY_PARAM)\r\n }\r\n navigate({ search: newUrlSearchParams.toString() }, { replace: true })\r\n },\r\n [urlSearchParams, navigate]\r\n )\r\n\r\n const handleCloseSidebar = React.useCallback(() => {\r\n handleSelectModule(undefined)\r\n }, [handleSelectModule])\r\n\r\n // Resize charts every time the sidebar is opened/closed or active module is changed\r\n React.useEffect(() => {\r\n onShouldResize()\r\n }, [activeModule, onShouldResize])\r\n\r\n // Set active module based on sidebarModuleKey\r\n React.useEffect(() => {\r\n let sidebarModule = sidebarModuleKey && sidebarModules[sidebarModuleKey]\r\n\r\n if (!isInit && getIsMobilePortrait()) {\r\n sidebarModule = null\r\n handleCloseSidebar()\r\n }\r\n\r\n setActiveModule(sidebarModule)\r\n isInit = true\r\n }, [sidebarModuleKey, handleCloseSidebar])\r\n\r\n const contextValue: SidebarContextType = React.useMemo(\r\n () => ({\r\n direction,\r\n isOpen,\r\n isCloseVisible: direction === SidebarDirection.horizontal,\r\n width: activeModule?.width,\r\n activeModule,\r\n onResize: onShouldResize,\r\n close: handleCloseSidebar,\r\n selectModule: handleSelectModule,\r\n }),\r\n [direction, isOpen, onShouldResize, activeModule, handleCloseSidebar, handleSelectModule]\r\n )\r\n\r\n return (\r\n \r\n {activeModule && (\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n }\r\n >\r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n
\r\n )\r\n}\r\n","export const drawingCreatorsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"drawing-creators\" */ './module-entry'),\r\n cacheKey: 'drawing-creators',\r\n}\r\n","import { DrawingActions, IToolbarDrawingAction, IToolbarDrawingActionItem } from './interfaces'\r\n\r\nexport const drawingActions: Record = {\r\n [DrawingActions.AddNote]: {\r\n id: DrawingActions.AddNote,\r\n title: 'Add note',\r\n icon: 'note',\r\n },\r\n [DrawingActions.DeleteDrawings]: {\r\n id: DrawingActions.DeleteDrawings,\r\n title: 'Remove all drawings',\r\n icon: 'drawingActionDelete',\r\n },\r\n [DrawingActions.DeleteAutoSavedDrawings]: {\r\n id: DrawingActions.DeleteAutoSavedDrawings,\r\n title: 'Remove all autosaved drawings',\r\n icon: 'drawingActionDelete',\r\n },\r\n}\r\n\r\nexport const getToolbarDrawingActions = ({\r\n isAutoSaveActive,\r\n isAddNoteAvailable = false,\r\n isIdea,\r\n}: {\r\n isAutoSaveActive: boolean\r\n isAddNoteAvailable?: boolean\r\n isIdea?: boolean\r\n}): Array => [\r\n ...(isAddNoteAvailable\r\n ? [\r\n {\r\n defaultItem: drawingActions[DrawingActions.AddNote],\r\n isDisabled: isIdea,\r\n disabledTooltip: 'Add note is not available in ideas',\r\n },\r\n ]\r\n : []),\r\n {\r\n defaultItem:\r\n drawingActions[isAutoSaveActive ? DrawingActions.DeleteAutoSavedDrawings : DrawingActions.DeleteDrawings],\r\n },\r\n]\r\n","import { DrawingSetting, IToolbarDrawingSetting, IToolbarDrawingsSettingItem } from './interfaces'\r\n\r\nconst drawingSettings: Record = {\r\n [DrawingSetting.PreserveDrawings]: {\r\n id: DrawingSetting.PreserveDrawings,\r\n icon: 'drawingSettingPreserveDrawings',\r\n iconActive: 'drawingSettingPreserveDrawingsActive',\r\n title: 'Preserve drawings: Off',\r\n titleActive: 'Preserve drawings: On',\r\n },\r\n [DrawingSetting.DrawingModeContinuous]: {\r\n id: DrawingSetting.DrawingModeContinuous,\r\n icon: 'drawingSettingDrawingMode',\r\n iconActive: 'drawingSettingDrawingModeActive',\r\n title: 'Drawing mode: Single',\r\n titleActive: 'Drawing mode: Continuous',\r\n },\r\n [DrawingSetting.HideDrawings]: {\r\n id: DrawingSetting.HideDrawings,\r\n icon: 'drawingSettingHide',\r\n iconActive: 'drawingSettingShow',\r\n title: 'Hide drawings',\r\n titleActive: 'Show drawings',\r\n },\r\n [DrawingSetting.LockDrawings]: {\r\n id: DrawingSetting.LockDrawings,\r\n icon: 'drawingSettingLock',\r\n iconActive: 'drawingSettingUnlock',\r\n title: 'Lock drawings',\r\n titleActive: 'Unlock drawings',\r\n },\r\n}\r\n\r\nconst preserveDrawingsAutosaveOverride: IToolbarDrawingSetting = {\r\n id: DrawingSetting.PreserveDrawings, // DrawingSetting.PreserveDrawings so it works with current settings sync to DB\r\n icon: 'drawingSettingAutosaveOff',\r\n iconActive: 'drawingSettingAutosaveOn',\r\n iconAction: 'drawingSettingAutosaveSaving',\r\n title: 'Drawings autosave: Off',\r\n titleActive: 'Drawings Autosave: On',\r\n titleAction: 'Drawings Autosave: Saving',\r\n}\r\n\r\nexport const getToolbarDrawingSettings = ({\r\n isPreserveDrawingsAndAutosaveAvailable,\r\n isIdea,\r\n isAutoSaveInProgress,\r\n}: {\r\n isPreserveDrawingsAndAutosaveAvailable?: boolean\r\n isIdea?: boolean\r\n isAutoSaveInProgress?: boolean\r\n}): Array => {\r\n const toolbarSettings = [\r\n {\r\n defaultItem: drawingSettings[DrawingSetting.DrawingModeContinuous],\r\n },\r\n ...(isPreserveDrawingsAndAutosaveAvailable\r\n ? [\r\n {\r\n defaultItem: preserveDrawingsAutosaveOverride,\r\n isDisabled: isIdea,\r\n isInAction: isAutoSaveInProgress,\r\n disabledTooltip: 'Autosave is not available in ideas',\r\n },\r\n ]\r\n : []),\r\n {\r\n defaultItem: drawingSettings[DrawingSetting.HideDrawings],\r\n },\r\n {\r\n defaultItem: drawingSettings[DrawingSetting.LockDrawings],\r\n },\r\n ]\r\n\r\n return toolbarSettings\r\n}\r\n","import { DrawingTool, IToolbarDrawingTool, IToolbarDrawingToolItem } from './interfaces'\r\n\r\nexport const drawingTools: Record = {\r\n [DrawingTool.Mouse]: {\r\n id: DrawingTool.Mouse,\r\n title: 'Mouse',\r\n icon: 'toolMouse',\r\n },\r\n [DrawingTool.Measure]: {\r\n id: DrawingTool.Measure,\r\n title: 'Measure',\r\n icon: 'toolMeasure',\r\n },\r\n [DrawingTool.ScaledLine]: {\r\n id: DrawingTool.ScaledLine,\r\n title: 'Line',\r\n icon: 'toolLine',\r\n },\r\n [DrawingTool.Arrow]: {\r\n id: DrawingTool.Arrow,\r\n title: 'Arrow',\r\n icon: 'toolArrow',\r\n },\r\n [DrawingTool.VerticalLine]: {\r\n id: DrawingTool.VerticalLine,\r\n title: 'Vertical line',\r\n icon: 'toolMidLineV',\r\n },\r\n [DrawingTool.HorizontalLine]: {\r\n id: DrawingTool.HorizontalLine,\r\n title: 'Horizontal line',\r\n icon: 'toolMidLineH',\r\n },\r\n [DrawingTool.Rectangle]: {\r\n id: DrawingTool.Rectangle,\r\n title: 'Rectangle',\r\n icon: 'toolRect',\r\n },\r\n [DrawingTool.RotatedRectangle]: {\r\n id: DrawingTool.RotatedRectangle,\r\n title: 'Rotated rectangle',\r\n icon: 'toolRectRotated',\r\n },\r\n [DrawingTool.Triangle]: {\r\n id: DrawingTool.Triangle,\r\n title: 'Triangle',\r\n icon: 'toolTriangle',\r\n },\r\n [DrawingTool.Ellipse]: {\r\n id: DrawingTool.Ellipse,\r\n title: 'Ellipse',\r\n icon: 'toolEllipse',\r\n },\r\n [DrawingTool.Curve]: {\r\n id: DrawingTool.Curve,\r\n title: 'Curve',\r\n icon: 'toolCurve',\r\n },\r\n [DrawingTool.Pitchfork]: {\r\n id: DrawingTool.Pitchfork,\r\n title: 'Pitchfork',\r\n icon: 'toolPitchfork',\r\n },\r\n [DrawingTool.Polygon]: {\r\n id: DrawingTool.Polygon,\r\n title: 'Polygon',\r\n icon: 'toolPolygon',\r\n },\r\n [DrawingTool.Xabcd]: {\r\n id: DrawingTool.Xabcd,\r\n title: 'XABCD',\r\n icon: 'toolXABCD',\r\n },\r\n [DrawingTool.ScaledText]: {\r\n id: DrawingTool.ScaledText,\r\n title: 'Text',\r\n icon: 'toolText',\r\n },\r\n [DrawingTool.Brush]: {\r\n id: DrawingTool.Brush,\r\n title: 'Brush',\r\n icon: 'toolBrush',\r\n },\r\n [DrawingTool.ElliottWaves]: {\r\n id: DrawingTool.ElliottWaves,\r\n title: 'Elliott waves',\r\n icon: 'toolElliottWave',\r\n },\r\n [DrawingTool.FibonacciRetracements]: {\r\n id: DrawingTool.FibonacciRetracements,\r\n title: 'Fibonacci retracements',\r\n icon: 'toolFibonacci',\r\n },\r\n [DrawingTool.Position]: {\r\n id: DrawingTool.Position,\r\n title: 'Position',\r\n icon: 'toolPosition',\r\n },\r\n [DrawingTool.Callout]: {\r\n id: DrawingTool.Callout,\r\n title: 'Callout',\r\n icon: 'toolCallout',\r\n },\r\n}\r\n\r\nexport const toolbarDrawingTools: Array = [\r\n {\r\n defaultItem: drawingTools[DrawingTool.Mouse],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Measure],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.ScaledLine],\r\n toolGroup: [\r\n drawingTools[DrawingTool.ScaledLine],\r\n drawingTools[DrawingTool.VerticalLine],\r\n drawingTools[DrawingTool.HorizontalLine],\r\n drawingTools[DrawingTool.Curve],\r\n ],\r\n toolGroupTitle: 'Line tools',\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Arrow],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Rectangle],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.RotatedRectangle],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Triangle],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Ellipse],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Polygon],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Xabcd],\r\n toolGroup: [drawingTools[DrawingTool.Xabcd], drawingTools[DrawingTool.Pitchfork]],\r\n toolGroupTitle: 'XABCD tools',\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.ScaledText],\r\n toolGroup: [drawingTools[DrawingTool.ScaledText], drawingTools[DrawingTool.Callout]],\r\n toolGroupTitle: 'Text tools',\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Brush],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.ElliottWaves],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.FibonacciRetracements],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Position],\r\n },\r\n]\r\n","import { Toolbar as ToolbarComponent, ToolbarDivider, ToolbarGroupProps, ToolbarItem } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { PaneArea } from '../../../types/shared'\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { drawingCreatorsAsyncModule } from '../../creators/async-modules'\r\nimport { ElementStyleDialogContext } from '../../modals/element_style'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { AutoSaveState } from '../../models/constants'\r\nimport PaneModel from '../../models/pane'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { getIsPreserveDrawingsAndAutosaveAvailable } from '../../utils/chart'\r\nimport { getToolbarDrawingActions } from './drawingActions'\r\nimport { getToolbarDrawingSettings } from './drawingSettings'\r\nimport { drawingTools, toolbarDrawingTools } from './drawingTools'\r\nimport { DrawingSetting, DrawingTool, IToolBarProps } from './interfaces'\r\n\r\nexport const DISABLED_ITEM_TOOLTIP_LABEL = \"Disabled due 'lock/hide' drawings active\"\r\n\r\nexport default function Toolbar({\r\n isSidebar,\r\n isHorizontal,\r\n isMobileOverlay,\r\n activeTool,\r\n chartLayoutModel,\r\n onActiveToolChange,\r\n onDrawingActionClick,\r\n onDrawingSettingClick,\r\n onDrawingEnd,\r\n drawingSettings,\r\n isAlternativeTheme,\r\n areToolsDisabled,\r\n}: IToolBarProps) {\r\n const [drawingCreatorsModule, { isLoading: isDrawingCreatorsModuleLoading }] = useAsyncModule({\r\n ...drawingCreatorsAsyncModule,\r\n shouldLoadModule: true,\r\n })\r\n const { autoSaveState } = useModelState(\r\n React.useMemo(() => chartLayoutModel.drawingsInternalStore(), [chartLayoutModel]),\r\n { watchProperties: ['autoSaveState'] }\r\n )\r\n const [isDrawing, setIsDrawing] = React.useState(false)\r\n const openElementStyleDialog = React.useContext(ElementStyleDialogContext)\r\n\r\n const availableDrawingSettings = getToolbarDrawingSettings({\r\n isPreserveDrawingsAndAutosaveAvailable: getIsPreserveDrawingsAndAutosaveAvailable(chartLayoutModel),\r\n isAutoSaveInProgress: autoSaveState === AutoSaveState.Saving,\r\n isIdea: !!chartLayoutModel.idea?.id,\r\n })\r\n\r\n const availableDrawingActions = getToolbarDrawingActions({\r\n isAutoSaveActive: autoSaveState !== AutoSaveState.Off,\r\n isAddNoteAvailable: chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage,\r\n isIdea: !!chartLayoutModel.idea?.id,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!drawingCreatorsModule) {\r\n return\r\n }\r\n\r\n const onMouseDown = (model: PaneModel, area: PaneArea & { isTouch: boolean }) => {\r\n const isDrawingModeContinuous = drawingSettings[DrawingSetting.DrawingModeContinuous]\r\n const hasData = model.chart().quote().close.length > 0\r\n const hasHiddenDrawings = drawingSettings[DrawingSetting.HideDrawings]\r\n const tool = drawingTools[activeTool].id\r\n\r\n if (tool === DrawingTool.Mouse || isDrawing || hasHiddenDrawings || !hasData) {\r\n return\r\n }\r\n\r\n setIsDrawing(true)\r\n const { drawingToolsTouchCreatorsByType, drawingToolsCreatorsByType } = drawingCreatorsModule\r\n const ToolClass = area.isTouch ? drawingToolsTouchCreatorsByType[tool] : drawingToolsCreatorsByType[tool]\r\n const element = model.elements().create({\r\n instance: new ToolClass(area, {}, model, openElementStyleDialog, () => {\r\n if (!isDrawingModeContinuous) {\r\n onActiveToolChange(DrawingTool.Mouse)\r\n }\r\n setIsDrawing(false)\r\n onDrawingEnd?.()\r\n }),\r\n })\r\n element.one('destroy', ({ instance }) => {\r\n if (instance.getIsCreator()) {\r\n setIsDrawing(false)\r\n onDrawingEnd?.()\r\n }\r\n })\r\n\r\n element.trigger('select', element)\r\n }\r\n PaneModel.bind('mousedown', onMouseDown)\r\n return () => {\r\n PaneModel.unbind('mousedown', onMouseDown)\r\n }\r\n }, [\r\n activeTool,\r\n onActiveToolChange,\r\n openElementStyleDialog,\r\n onDrawingEnd,\r\n drawingCreatorsModule,\r\n drawingSettings,\r\n isDrawing,\r\n ])\r\n\r\n return (\r\n \r\n {toolbarDrawingTools.map((item) => {\r\n const isActive = activeTool === item.defaultItem.id || item.toolGroup?.some((tool) => tool.id === activeTool)\r\n const isToolLoading = isDrawingCreatorsModuleLoading && isActive\r\n\r\n return (\r\n \r\n )\r\n })}\r\n \r\n {availableDrawingSettings.map((item) => (\r\n \r\n ))}\r\n {availableDrawingActions.map((item) => (\r\n \r\n ))}\r\n \r\n )\r\n}\r\n","import Toolbar from './toolbar'\r\n\r\nexport default Toolbar\r\n","import { Textarea } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { ObjectHash } from '../../../../types/shared'\r\nimport { useModelState } from '../../../model-hooks/use-model-state'\r\nimport Chart from '../../../models/chart'\r\nimport ChartLayout from '../../../models/chart_layout'\r\nimport { useDrawingAutoSaveControls } from '../../autosave/use-drawing-auto-save-controls'\r\nimport { getElementNoteText, getTickersAndContainerTypesInLayoutModel } from '../../autosave/utils'\r\n\r\ninterface ChartAutoSaveNoteProps {\r\n ticker: string\r\n note: string\r\n onNoteChange: (note: string, ticker: string) => void\r\n}\r\n\r\nfunction ChartAutoSaveNote({ ticker, note, onNoteChange }: ChartAutoSaveNoteProps) {\r\n return (\r\n ) => {\r\n onNoteChange(e.target.value, ticker)\r\n }}\r\n />\r\n )\r\n}\r\n\r\ninterface Props {\r\n chartLayoutModel: ChartLayout\r\n}\r\n\r\nexport function ChartAutoSaveNotes({ chartLayoutModel }: Props) {\r\n const { handleAutoSaveNoteChange } = useDrawingAutoSaveControls(chartLayoutModel)\r\n const [tickers, setTickers] = React.useState([])\r\n const unwatchedInternalStore = React.useMemo(() => chartLayoutModel.drawingsInternalStore(), [chartLayoutModel])\r\n const drawingsInternalStore = useModelState(unwatchedInternalStore, { watchProperties: ['elements'] })\r\n\r\n React.useEffect(() => {\r\n // There was no better way how to listen on ticker changes which is necessary for displaying correct text areas\r\n const handleChartChange = () => {\r\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayoutModel)\r\n setTickers(tickers)\r\n }\r\n\r\n Chart.bind('change', handleChartChange)\r\n handleChartChange()\r\n return () => {\r\n Chart.unbind('change', handleChartChange)\r\n }\r\n }, [chartLayoutModel])\r\n\r\n const tickerNoteMap = React.useMemo(() => {\r\n const map: ObjectHash = {}\r\n drawingsInternalStore.elements.forEach((element) => {\r\n if (element.containerType === 'note' && tickers.includes(element.ticker)) {\r\n map[element.ticker] = getElementNoteText(element)\r\n }\r\n })\r\n\r\n return map\r\n }, [drawingsInternalStore.elements, tickers])\r\n\r\n return (\r\n
\r\n {tickers.map((ticker) => (\r\n \r\n ))}\r\n
\r\n )\r\n}\r\n","import { Dialog, DialogBody, DialogHeader, DialogStateReturn } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport ChartLayout from '../../../models/chart_layout'\r\nimport { ChartAutoSaveNotes } from './auto-save-notes'\r\n\r\ninterface INoteDialog {\r\n state: DialogStateReturn\r\n chartLayoutModel: ChartLayout\r\n}\r\n\r\nexport function AutoSaveNotesDialog({ state, chartLayoutModel }: INoteDialog) {\r\n const isOpen = state.useState('open')\r\n const isAnimating = state.useState('animating')\r\n const isFullyClosed = !isOpen && !isAnimating\r\n\r\n return (\r\n \r\n Notes\r\n {!isFullyClosed && }\r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n ConfirmationDialog as ConfirmationDialogComponent,\r\n DialogDismiss,\r\n DialogStateReturn,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\n\r\nconst getDialogContent = ({\r\n isAutosaveDialogContent,\r\n tickers,\r\n}: {\r\n isAutosaveDialogContent: boolean\r\n tickers: string[]\r\n}) => {\r\n if (isAutosaveDialogContent) {\r\n return {\r\n title: 'Remove all autosaved drawings?',\r\n message: (\r\n <>\r\n Do you really want to remove all autosaved drawings? This action is irreversible and will remove all\r\n non-idea drawings for {tickers.join(', ')}.\r\n \r\n ),\r\n }\r\n }\r\n return {\r\n title: 'Remove all drawings?',\r\n message: `Do you really want to remove all drawings? This action only affects the current page and visible tickers. This action doesn't remove autosaved drawings or ideas.`,\r\n }\r\n}\r\n\r\nexport interface IConfirmationDialog {\r\n state: DialogStateReturn\r\n onAction: () => void\r\n onCancel?: () => void\r\n isAutosaveDialogContent: boolean\r\n tickers: string[]\r\n}\r\n\r\nexport function ConfirmationDialog({\r\n state,\r\n onAction,\r\n onCancel,\r\n isAutosaveDialogContent = false,\r\n tickers,\r\n}: IConfirmationDialog) {\r\n const dialogContent = getDialogContent({ isAutosaveDialogContent, tickers })\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n }\r\n >\r\n {dialogContent.message}\r\n \r\n )\r\n}\r\n","import { Button, Icon } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { drawingTools } from '../drawingTools'\r\nimport { DrawingTool } from '../interfaces'\r\n\r\ntype ToolButtonProps = {\r\n onClick: () => void\r\n activeTool: DrawingTool\r\n}\r\n\r\nexport default function ToolButton({ activeTool, onClick }: ToolButtonProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import { Button } from '@finviz/website'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { SIDEBAR_QUERY_PARAM } from '../../sidebar/sidebar'\r\nimport { MOBILE_TOOLBAR_DIV_ID } from '../../sidebar/sidebar-tabs'\r\nimport { DrawingActions, DrawingTool, IToolBarProps } from '../interfaces'\r\nimport Toolbar from '../toolbar'\r\nimport ToolButton from './tool-button'\r\n\r\ntype ToolbarMobileProps = Omit\r\n\r\nexport default function ToolbarMobile({\r\n activeTool,\r\n onActiveToolChange,\r\n onDrawingActionClick,\r\n ...rest\r\n}: ToolbarMobileProps) {\r\n const [isToolbarVisible, setIsToolbarVisible] = React.useState(false)\r\n const [urlSearchParams, setUrlSearchParams] = useSearchParams()\r\n const [toolbarMobileElement, setToolbarMobileElement] = React.useState(null)\r\n\r\n // get toolbar mobile element on first render\r\n React.useEffect(() => {\r\n setToolbarMobileElement(document.getElementById(MOBILE_TOOLBAR_DIV_ID))\r\n }, [])\r\n\r\n const handleActiveToolChange = React.useCallback(\r\n (drawingTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => {\r\n onActiveToolChange(drawingTool, trigger)\r\n\r\n if (trigger !== 'group') return setIsToolbarVisible(false)\r\n },\r\n [onActiveToolChange]\r\n )\r\n\r\n // Hide toolbar on click outside\r\n const wrapperRef = React.useRef(null)\r\n React.useEffect(() => {\r\n if (!isToolbarVisible) return\r\n\r\n function handleClickOutside(event: TouchEvent | MouseEvent) {\r\n // Get the currently open select\r\n const openSelect = document.querySelector('.finviz-popover[data-enter]')\r\n if (wrapperRef.current?.contains(event.target as Node) || openSelect?.contains(event.target as Node)) return\r\n setIsToolbarVisible(false)\r\n }\r\n\r\n document.addEventListener('mousedown', handleClickOutside)\r\n document.addEventListener('touchstart', handleClickOutside)\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside)\r\n document.removeEventListener('touchstart', handleClickOutside)\r\n }\r\n }, [isToolbarVisible])\r\n\r\n const handleDrawingActionClick = (actionId: DrawingActions) => {\r\n onDrawingActionClick?.(actionId)\r\n setIsToolbarVisible(false)\r\n }\r\n\r\n if (!toolbarMobileElement) return null\r\n\r\n return ReactDOM.createPortal(\r\n <>\r\n \r\n \r\n \r\n {urlSearchParams.has(SIDEBAR_QUERY_PARAM) || activeTool === DrawingTool.Mouse ? (\r\n {\r\n setIsToolbarVisible(true)\r\n setUrlSearchParams((params) => {\r\n params.delete(SIDEBAR_QUERY_PARAM)\r\n return params\r\n })\r\n }}\r\n >\r\n Draw\r\n \r\n ) : (\r\n {\r\n setIsToolbarVisible(true)\r\n }}\r\n />\r\n )}\r\n ,\r\n toolbarMobileElement\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { AutoSaveState } from '../../models/constants'\r\n\r\ninterface LoadLatestDataButtonProps {\r\n chartLayoutModel: ChartLayout\r\n}\r\n\r\nexport function AutoSaveStateIndicator({ chartLayoutModel }: LoadLatestDataButtonProps) {\r\n const drawingsInternalStoreUnwatched = React.useMemo(\r\n () => chartLayoutModel.drawingsInternalStore(),\r\n [chartLayoutModel]\r\n )\r\n const { autoSaveState } = useModelState(drawingsInternalStoreUnwatched, { watchProperties: ['autoSaveState'] })!\r\n const [isVisible, setIsVisible] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (autoSaveState === AutoSaveState.Off) {\r\n return\r\n }\r\n\r\n let setVisibilityTimeout: number | null = null\r\n const newIsVisible = autoSaveState !== AutoSaveState.Saved\r\n\r\n setVisibilityTimeout = window.setTimeout(\r\n () => {\r\n setIsVisible(newIsVisible)\r\n },\r\n newIsVisible ? 0 : 3000\r\n )\r\n\r\n const checkIfNeededPreventLeaving = (event: BeforeUnloadEvent) => {\r\n if (autoSaveState === AutoSaveState.Saved) {\r\n return undefined\r\n }\r\n\r\n const message = `Your latest changes haven't been saved yet. If you leave now, your changes might be lost.`\r\n event.returnValue = message\r\n return message\r\n }\r\n\r\n window.addEventListener('beforeunload', checkIfNeededPreventLeaving)\r\n\r\n return () => {\r\n window.removeEventListener('beforeunload', checkIfNeededPreventLeaving)\r\n if (setVisibilityTimeout) {\r\n clearTimeout(setVisibilityTimeout)\r\n }\r\n }\r\n }, [autoSaveState])\r\n\r\n if (!isVisible) {\r\n return null\r\n }\r\n\r\n // @todo - add proper indicator component here\r\n return null\r\n}\r\n","import { Textarea } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { isRedesignEnabled } from '../../utils'\r\nimport { useDrawingAutoSaveControls } from '../autosave/use-drawing-auto-save-controls'\r\n\r\ninterface Props {\r\n chartLayoutModel: ChartLayout\r\n ideaNoteRef?: React.RefObject\r\n}\r\n\r\nconst hasRedesign = isRedesignEnabled()\r\n\r\nexport function ChartLayoutAutoSaveNote({ chartLayoutModel: chartLayoutModelUnwatched, ideaNoteRef }: Props) {\r\n const chartLayoutModel = useModelState(chartLayoutModelUnwatched, {\r\n watchProperties: ['idea'],\r\n })!\r\n const { handleIdeaNoteChange } = useDrawingAutoSaveControls(chartLayoutModel)\r\n\r\n if (!chartLayoutModel.editable) {\r\n return null\r\n }\r\n\r\n return (\r\n
\r\n {!hasRedesign &&
Note:
}\r\n
\r\n ) => {\r\n handleIdeaNoteChange(e.target.value)\r\n }}\r\n />\r\n
\r\n
\r\n )\r\n}\r\n","import { useDialogState } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\n\r\ninterface PublishOldButtonClickListenerProps {\r\n isListening: boolean\r\n layoutModel: ChartLayout\r\n}\r\n\r\nexport function getPublishChartHtmlElements() {\r\n const publishChartElements = document.getElementsByClassName('js-publish-chart')\r\n const publishChartHtmlElements = Array.from(publishChartElements) as HTMLElement[]\r\n\r\n return publishChartHtmlElements\r\n}\r\n\r\nfunction getChartImgUrl(index: number) {\r\n const imgElement = document.getElementById(`chart${index}`) as HTMLImageElement | null\r\n return imgElement?.src ?? null\r\n}\r\n\r\nexport function PublishOldButtonClickListener({ isListening, layoutModel }: PublishOldButtonClickListenerProps) {\r\n const dialog = useDialogState()\r\n const isOpen = dialog.useState('open')\r\n const [dialogConfig, setDialogConfig] = React.useState({\r\n isCanvas: true,\r\n chartImgUrl: null as null | string,\r\n timeframe: '',\r\n ticker: '',\r\n })\r\n const [publishModalModule] = useAsyncModule({\r\n ...publishModalAsyncModule,\r\n shouldLoadModule: isOpen,\r\n })\r\n const PublishDialog = publishModalModule?.default\r\n\r\n React.useEffect(() => {\r\n const publishChartHtmlElements = getPublishChartHtmlElements()\r\n const clickHandler = (event: MouseEvent) => {\r\n const { index, ticker, timeframe } = (event.currentTarget as HTMLElement).dataset\r\n if (index && ticker && timeframe) {\r\n const indexInt = Number.parseInt(index)\r\n setDialogConfig({\r\n ticker,\r\n timeframe,\r\n isCanvas: indexInt === 0,\r\n chartImgUrl: indexInt > 0 ? getChartImgUrl(indexInt) : null,\r\n })\r\n dialog.show()\r\n }\r\n }\r\n\r\n if (isListening) {\r\n publishChartHtmlElements.forEach((el) => {\r\n el.addEventListener('click', clickHandler)\r\n })\r\n }\r\n\r\n return () => {\r\n publishChartHtmlElements.forEach((el) => {\r\n el.removeEventListener('click', clickHandler)\r\n })\r\n }\r\n }, [dialog, isListening])\r\n\r\n return PublishDialog ? : null\r\n}\r\n","import {\r\n Button,\r\n Dialog,\r\n DialogBody,\r\n DialogDismiss,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogStateReturn,\r\n Paragraph,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\n\r\nexport enum IdeaDrawingsConfirmationOptions {\r\n Merge,\r\n Override,\r\n Nothing,\r\n Cancel,\r\n}\r\n\r\ninterface IIdeaLeaveDialog {\r\n state: DialogStateReturn\r\n actionCallback: (action: IdeaDrawingsConfirmationOptions) => void\r\n}\r\n\r\nexport function IdeaLeaveDialog({ state, actionCallback }: IIdeaLeaveDialog) {\r\n return (\r\n actionCallback(IdeaDrawingsConfirmationOptions.Cancel)} />}\r\n >\r\n actionCallback(IdeaDrawingsConfirmationOptions.Cancel)}>\r\n You’re About to Leave your Idea\r\n \r\n \r\n
\r\n What would you like to do with the drawings from your current Idea?\r\n \r\n Replace Drawings\r\n
\r\n Your Autosaved Drawings for this ticker will be deleted, and the Idea Drawings will be copied to the live\r\n chart.\r\n
\r\n \r\n Combine Drawings\r\n
\r\n The Idea Drawings will be copied to the live chart without changing the positions or settings of any\r\n Autosaved Drawings. This may cause duplicates if some drawings were also autosaved.\r\n
\r\n \r\n Do Nothing\r\n
\r\n Close the idea without changing any Autosaved Drawings.\r\n
\r\n
\r\n
\r\n \r\n actionCallback(IdeaDrawingsConfirmationOptions.Override)}\r\n >\r\n Replace\r\n \r\n actionCallback(IdeaDrawingsConfirmationOptions.Merge)}\r\n >\r\n Combine\r\n \r\n actionCallback(IdeaDrawingsConfirmationOptions.Nothing)}\r\n >\r\n Do Nothing\r\n \r\n \r\n \r\n )\r\n}\r\n","import { useDialogState, useTrackPageView } from '@finviz/website'\r\nimport * as dateFns from 'date-fns'\r\nimport React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport {\r\n ChartElementType,\r\n ChartsOrQuotePageQueryParams,\r\n ChartsPageQueryParams,\r\n QuotePageQueryChartTypes,\r\n QuotePageQueryParams,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../../constants/common'\r\nimport Chart from '../../models/chart'\r\nimport ChartLayoutModel from '../../models/chart_layout'\r\nimport { getRawTickerForInstrument } from '../../models/utils'\r\nimport utils from '../../utils'\r\nimport { getInstrument, handleTypeChange } from '../../utils/chart'\r\nimport { getUuid } from '../../utils/helpers'\r\nimport { initHlc } from '../../utils/hlc'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\nimport { IdeaLeaveDialog } from '../autosave/idea-leave-dialog'\r\nimport { IdeaDrawingsConfirmationOptions } from '../autosave/idea-leave-dialog'\r\nimport { useDrawingAutoSaveApi } from '../autosave/use-drawing-autosave-api'\r\nimport { getTickersAndContainerTypesInLayoutModel, handleCallMethodOnAllDrawings } from '../autosave/utils'\r\nimport { getChartElementTypeFromResponseType } from '../utils'\r\n\r\nconst getChartElementTypeFromQueryType = (queryType: QuotePageQueryChartTypes | null) => {\r\n switch (queryType) {\r\n case QuotePageQueryChartTypes.l:\r\n return ChartElementType.LineChart\r\n case QuotePageQueryChartTypes.hc:\r\n return ChartElementType.HollowCandleStick\r\n case QuotePageQueryChartTypes.ha:\r\n return ChartElementType.HeikinAshi\r\n case QuotePageQueryChartTypes.o:\r\n return ChartElementType.OhlcChart\r\n case QuotePageQueryChartTypes.p:\r\n return ChartElementType.PerfChart\r\n case QuotePageQueryChartTypes.c:\r\n case QuotePageQueryChartTypes.cs:\r\n return ChartElementType.CandleStick\r\n default:\r\n return (\r\n getChartElementTypeFromResponseType(window.FinvizSettings?.TA?.style ?? null) ?? ChartElementType.CandleStick\r\n )\r\n }\r\n}\r\n\r\nconst useChartRouteChange = (chartLayoutModel: ChartLayoutModel | null) => {\r\n useTrackPageView({ trackInitial: false })\r\n const location = useLocation()\r\n const navigate = useNavigate()\r\n const { deleteAllDrawings } = useDrawingAutoSaveApi()\r\n const dialog = useDialogState()\r\n const isIdeasDialogOpen = dialog.useState('open')\r\n\r\n const isQuotePage = chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isChartPage = chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isFuturesForexCryptoPage = [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(chartLayoutModel?.specificChartFunctionality as SpecificChartFunctionality)\r\n\r\n React.useEffect(() => {\r\n if (isChartPage) {\r\n utils.setCookie(\r\n 'chartsUrl',\r\n `?${encodeQueryString({ ...decodeQueryString(location.search), i: undefined, settings: undefined })}`,\r\n dateFns.add(new Date(), { months: 1 })\r\n )\r\n }\r\n }, [isChartPage, location.search])\r\n\r\n React.useEffect(() => {\r\n const decodedQueryString = decodeQueryString(location.search)\r\n // We can navigate to idea chart without a refresh e.g. using browser back button\r\n // It breaks charts because we don't have idea data & idea quote anymore\r\n // So if we end up on a page with idea in the url and we don't have any idea data in chartLayout model we'll refresh the page\r\n if (chartLayoutModel && decodedQueryString.i && !chartLayoutModel.idea?.id) {\r\n window.location.reload()\r\n }\r\n // No need to have chartLayoutModel as dependecny here , I'm only interested in idea on the model\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [location.search, chartLayoutModel?.idea?.id])\r\n\r\n const updateChartConfig = React.useCallback(() => {\r\n if (!chartLayoutModel) return\r\n\r\n const decodedSearch = decodeQueryString(location.search)\r\n\r\n const urlType = (decodedSearch as QuotePageQueryParams).ty ?? null\r\n handleTypeChange({\r\n type: getChartElementTypeFromQueryType(urlType),\r\n chartLayoutModel,\r\n })\r\n\r\n if (isChartPage && chartLayoutModel.layout !== (decodedSearch as ChartsPageQueryParams).l) {\r\n chartLayoutModel.updateAttributes({ layout: (decodedSearch as ChartsPageQueryParams).l })\r\n }\r\n\r\n chartLayoutModel.getAllCharts().forEach((chartModel, chartIndex) => {\r\n const urlTicker = decodedSearch.t.split(',')[chartIndex] ?? null\r\n const urlTimeframe = decodedSearch.p?.split(',')[chartIndex] ?? null\r\n const urlDateRange = decodedSearch.r?.split(',')[chartIndex] ?? null\r\n const upperCaseTicker = urlTicker?.toUpperCase()\r\n\r\n /**\r\n * Only Charts page charts can change instruments. Other pages need forced\r\n * instrument because we might not be able to guess it from urlTicker\r\n */\r\n let instrument = getInstrument(upperCaseTicker)\r\n if (chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.chartPage) {\r\n instrument = chartModel.instrument\r\n }\r\n\r\n const newChartConfig = {\r\n instrument,\r\n ticker: getRawTickerForInstrument(instrument, upperCaseTicker),\r\n timeframe: urlTimeframe,\r\n dateRange: urlDateRange,\r\n }\r\n\r\n if (Object.entries(newChartConfig).some(([key, value]) => chartModel[key as keyof Chart] !== value)) {\r\n chartModel.updateAttributesAndSync(newChartConfig)\r\n }\r\n })\r\n }, [chartLayoutModel, location.search, isChartPage])\r\n\r\n React.useEffect(() => {\r\n const decodedSearch = decodeQueryString(location.search)\r\n\r\n if (\r\n !chartLayoutModel ||\r\n !decodedSearch.p ||\r\n !decodedSearch.t ||\r\n !(isQuotePage || isChartPage || isFuturesForexCryptoPage)\r\n ) {\r\n if (!decodedSearch.p && isQuotePage) {\r\n navigate(\r\n {\r\n search: `?${encodeQueryString({\r\n ...decodedSearch,\r\n p: window.FinvizSettings.defaultPeriod ?? TIMEFRAME.d,\r\n r: window.FinvizSettings.defaultDateRange,\r\n })}`,\r\n },\r\n {\r\n replace: true,\r\n }\r\n )\r\n }\r\n return\r\n }\r\n if (chartLayoutModel.idea?.id && isIdeasDialogOpen) {\r\n dialog.hide()\r\n }\r\n\r\n if (!decodedSearch.i && chartLayoutModel.idea?.id) {\r\n const urlTicker = decodedSearch.t.split(',')\r\n const isSameTicker = chartLayoutModel\r\n .getAllCharts()\r\n .every((chart, i) => chart.getQuoteRawTicker() === urlTicker[i])\r\n\r\n if (isSameTicker && window.FinvizSettings.hasUserPremium && chartLayoutModel.isPreserveDrawingsActive) {\r\n dialog.show()\r\n return\r\n }\r\n if (!chartLayoutModel.isPreserveDrawingsActive || !isSameTicker) {\r\n handleCallMethodOnAllDrawings({ chartLayoutModel, elementMethod: 'destroyCascade' })\r\n }\r\n chartLayoutModel.exitIdea()\r\n }\r\n updateChartConfig()\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n location.search,\r\n navigate,\r\n chartLayoutModel,\r\n isQuotePage,\r\n isChartPage,\r\n isFuturesForexCryptoPage,\r\n updateChartConfig,\r\n ])\r\n\r\n const handleIdeaLeave = React.useCallback(\r\n async (action: IdeaDrawingsConfirmationOptions) => {\r\n if (!chartLayoutModel) return\r\n if (action === IdeaDrawingsConfirmationOptions.Cancel) {\r\n navigate(-1)\r\n return\r\n }\r\n switch (action) {\r\n case IdeaDrawingsConfirmationOptions.Merge: {\r\n handleCallMethodOnAllDrawings({\r\n chartLayoutModel,\r\n elementMethod: 'refreshElementId',\r\n })\r\n break\r\n }\r\n case IdeaDrawingsConfirmationOptions.Override: {\r\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayoutModel)\r\n await deleteAllDrawings({ tickers, lastLocalChange: initHlc(getUuid(), Date.now()) })\r\n break\r\n }\r\n case IdeaDrawingsConfirmationOptions.Nothing: {\r\n handleCallMethodOnAllDrawings({\r\n chartLayoutModel,\r\n elementMethod: 'destroyCascade',\r\n })\r\n break\r\n }\r\n default:\r\n break\r\n }\r\n chartLayoutModel.exitIdea()\r\n updateChartConfig()\r\n },\r\n [chartLayoutModel, updateChartConfig, deleteAllDrawings, navigate]\r\n )\r\n\r\n return {\r\n dialog,\r\n handleIdeaLeave,\r\n }\r\n}\r\n\r\nfunction getChartLayoutWithChartRouteChange

(\r\n Component: React.ComponentType

\r\n) {\r\n return function WrappedComponent(props: P) {\r\n const { dialog, handleIdeaLeave } = useChartRouteChange(props.chartLayoutModel)\r\n return (\r\n <>\r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport function withChartRouteChange

(\r\n Component: React.ComponentType

\r\n) {\r\n // Chart layout is used in ReactRouter context and also outside of RR context\r\n // if we use RR hooks outside the context it will crash so this function will return different component for quote & chart pages than for other usecases\r\n const ChartLayoutComponent = getChartLayoutWithChartRouteChange(Component)\r\n return function WrappedComponent(props: P) {\r\n const { ty } = decodeQueryString()\r\n const isChartPage = props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isQuotePage = props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isFuturesForexCryptoPage = [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(props.chartLayoutModel.specificChartFunctionality)\r\n if (isChartPage || (isQuotePage && ty !== 'p') || isFuturesForexCryptoPage) {\r\n return \r\n }\r\n\r\n return \r\n }\r\n}\r\n","import merge from 'lodash.merge'\r\nimport React from 'react'\r\n\r\nimport { RootChartConfigObject, Theme } from '../../../types/shared'\r\nimport {\r\n ChartEditorEnum,\r\n MOBILE_BARS_TO_VIEW,\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n SpecificChartFunctionality,\r\n} from '../../constants/common'\r\nimport ChartLayoutModel from '../../models/chart_layout'\r\nimport DrawingsInternalStore from '../../models/drawings-internal-store'\r\nimport { getSettings } from '../../models/settings'\r\nimport utils, { isRedesignedPage } from '../../utils'\r\nimport { getIsPreserveDrawingsAndAutosaveAvailable, getZoomFactorForBarsToDisplay } from '../../utils/chart'\r\nimport { getContainerTypeFromPaneConfig, getInitialStoreDrawings } from '../autosave/utils'\r\nimport { DrawingSetting } from '../toolbar/interfaces'\r\nimport { CHART_LAYOUT_CHILD_CHANGE_EVENT } from './constants'\r\n\r\ninterface Props {\r\n config: RootChartConfigObject\r\n onRegisterChartLayoutModel?: (chartLayoutModel: ChartLayoutModel) => void\r\n parentElement?: HTMLElement\r\n}\r\n\r\nfunction getDefaultZoomFactor(chartLayout: ChartLayoutModel) {\r\n const innerWidth = window.innerWidth\r\n if (\r\n innerWidth >= MOBILE_VIEW_BREAKPOINT_WIDTH ||\r\n chartLayout.specificChartFunctionality !== SpecificChartFunctionality.chartPage\r\n ) {\r\n return 1\r\n }\r\n\r\n return getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n numOfVisibleBars: MOBILE_BARS_TO_VIEW,\r\n chartVisibleWidth: innerWidth,\r\n })\r\n}\r\n\r\nfunction OnInitListener({\r\n chartLayoutModel,\r\n config,\r\n onRegisterChartLayoutModel,\r\n parentElement,\r\n}: Props & { chartLayoutModel: ChartLayoutModel; parentElement?: HTMLElement }) {\r\n const [isInit, setIsInit] = React.useState(false)\r\n\r\n /*\r\n * This entire effect is used to check for updates in entire chart layout obj tree.\r\n * Once config object matches object generated from chart layout, the layout model is completely initialised.\r\n *\r\n * We couldn't just add a callback to `componentDidMount` (or equivalent) because its children are rendered asynchronously.\r\n *\r\n * */\r\n React.useEffect(() => {\r\n if (onRegisterChartLayoutModel && chartLayoutModel && !isInit) {\r\n const checkIfInitIsComplete = () => {\r\n const { charts } = chartLayoutModel.toConfig()\r\n const isReady =\r\n charts.length === config.charts.length &&\r\n charts.every(\r\n (chart, chartIndex) =>\r\n chart.panes.length === config.charts[chartIndex].panes.length &&\r\n chart.panes.every(\r\n (pane, paneIndex) =>\r\n pane.elements.length === config.charts[chartIndex].panes[paneIndex].elements.length &&\r\n pane.elements.every(\r\n (element, elementIndex) =>\r\n element.overlays?.length ===\r\n config.charts[chartIndex].panes[paneIndex].elements[elementIndex].overlays?.length\r\n )\r\n )\r\n )\r\n\r\n if (isReady) {\r\n setIsInit(true)\r\n chartLayoutModel.updateAttributes({ isInit: true })\r\n onRegisterChartLayoutModel(chartLayoutModel)\r\n if (parentElement) {\r\n parentElement.style.opacity = 'unset'\r\n parentElement.style.minHeight = 'unset'\r\n parentElement.style.minWidth = 'unset'\r\n }\r\n }\r\n }\r\n\r\n chartLayoutModel.bind(CHART_LAYOUT_CHILD_CHANGE_EVENT, checkIfInitIsComplete)\r\n\r\n checkIfInitIsComplete()\r\n\r\n return () => {\r\n chartLayoutModel.unbind(CHART_LAYOUT_CHILD_CHANGE_EVENT, checkIfInitIsComplete)\r\n }\r\n }\r\n }, [chartLayoutModel, config, isInit, onRegisterChartLayoutModel, parentElement])\r\n\r\n return null\r\n}\r\n\r\nexport const withCompleteLayoutModelInit = (Component: any) => (props: Props) => {\r\n const config = React.useMemo(() => {\r\n const newConfig = merge({}, props.config, {\r\n editable: props.config.editable ?? true,\r\n canChangeTicker: props.config.canChangeTicker ?? true,\r\n scrollable: props.config.scrollable ?? true,\r\n cross: props.config.cross ?? true,\r\n theme:\r\n props.config.theme && [Theme.light, Theme.dark].includes(props.config.theme) ? props.config.theme : Theme.light,\r\n editors: props.config.editors ?? [ChartEditorEnum.publish, ChartEditorEnum.tools, ChartEditorEnum.ideas],\r\n ideas: props.config.ideas ?? true,\r\n specificChartFunctionality: props.config.specificChartFunctionality ?? SpecificChartFunctionality.default,\r\n initialStoreDrawings: [],\r\n })\r\n\r\n if (!newConfig.ideas) {\r\n newConfig.editors = newConfig.editors.filter((x) => x !== 'ideas')\r\n }\r\n\r\n // We need to add these because ideas might not have them and chart controls wouldn’t render properly\r\n if (isRedesignedPage(newConfig, [SpecificChartFunctionality.quotePage])) {\r\n newConfig.editors = newConfig.editors.concat([ChartEditorEnum.settings, ChartEditorEnum.timeframe])\r\n }\r\n\r\n const initialStoreDrawings = getInitialStoreDrawings()?.filter(({ changeType }) => changeType !== 'destroy') ?? []\r\n const isQuotePage = newConfig.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isQuotePageWithDrawingsOff = isQuotePage && utils.getCookie('charts-draw') !== 'on'\r\n\r\n if (initialStoreDrawings.length === 0 || isQuotePageWithDrawingsOff) {\r\n return newConfig\r\n }\r\n\r\n const noteDrawing = initialStoreDrawings.find(\r\n ({ containerType, ticker }) =>\r\n containerType === 'note' && props.config.charts.some((chart) => chart.ticker === ticker)\r\n )\r\n\r\n const note = noteDrawing && JSON.parse(noteDrawing.elementAttrs)?.text\r\n const ideaObject = isQuotePage && note ? { note } : undefined\r\n\r\n return {\r\n ...newConfig,\r\n initialStoreDrawings,\r\n idea: newConfig.idea ?? ideaObject,\r\n charts: newConfig.charts.map((chart) => {\r\n const { ticker, panes } = chart\r\n return {\r\n ...chart,\r\n panes: panes.map((pane) => {\r\n const containerType = getContainerTypeFromPaneConfig(pane)\r\n const newElements = initialStoreDrawings\r\n .filter(\r\n (drawing) =>\r\n drawing.containerType === containerType &&\r\n drawing.ticker === ticker &&\r\n !pane.elements.some((paneElement) => paneElement.elementId === drawing.elementId)\r\n )\r\n .map(({ elementId, zIndex, elementAttrs }) => ({\r\n elementId,\r\n zIndex,\r\n ...JSON.parse(elementAttrs),\r\n }))\r\n return {\r\n ...pane,\r\n elements: [...pane.elements, ...newElements],\r\n }\r\n }),\r\n }\r\n }),\r\n }\r\n // We need to disable the eslint check because the hook is supposed to run only once on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const chartLayoutModel = React.useMemo(() => {\r\n const settings = getSettings({ ...config, theme: config.theme! })\r\n const chartLayout = ChartLayoutModel.create({\r\n layout: config.layout,\r\n width: config.width,\r\n height: config.height,\r\n editable: config.editable,\r\n canChangeTicker: config.canChangeTicker,\r\n scrollable: config.scrollable,\r\n initialScrollable: config.scrollable,\r\n cross: config.cross,\r\n editors: config.editors,\r\n theme: config.theme,\r\n idea: config.idea,\r\n settings,\r\n isWheelZoomEnabled: config.specificChartFunctionality === SpecificChartFunctionality.chartPage,\r\n specificChartFunctionality: config.specificChartFunctionality,\r\n isHideDrawingsActive: false,\r\n isPreserveDrawingsActive: !!(\r\n getIsPreserveDrawingsAndAutosaveAvailable(config) &&\r\n window.FinvizSettings.toolsState?.[DrawingSetting.PreserveDrawings]\r\n ),\r\n isLockDrawingsActive: false,\r\n uuid: config.uuid,\r\n drawingsInternalStore: DrawingsInternalStore.create({\r\n elements: config.initialStoreDrawings,\r\n }),\r\n })\r\n\r\n chartLayout.updateAttributes({ defaultZoomFactor: getDefaultZoomFactor(chartLayout) })\r\n\r\n return chartLayout\r\n\r\n // We need to disable the eslint check because the hook is supposed to run only once on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return chartLayoutModel ? (\r\n <>\r\n \r\n \r\n \r\n ) : null\r\n}\r\n","import debounce from 'lodash.debounce'\r\nimport React from 'react'\r\n\r\nimport Chart from '../../models/chart'\r\nimport Quote from '../../models/quote'\r\n\r\nconst MAX_QUOTE_CACHE_TIME_IN_MS = 300000 // 5 min\r\n\r\nexport const withQuoteCacheManagement = (Component: any) => (props: any) => {\r\n React.useEffect(() => {\r\n const cleanupQuoteCache = () => {\r\n const allQuotes = Quote.all()\r\n const allCharts = Chart.all()\r\n const allChartQuotes = allCharts.flatMap((chart) => chart.getAllQuotes())\r\n\r\n allQuotes.forEach((quote) => {\r\n if (\r\n !allChartQuotes.some((usedQuote) => usedQuote.eql(quote)) &&\r\n !quote.isFetching &&\r\n quote.fetchedAt > -1 &&\r\n quote.fetchedAt < Date.now() - MAX_QUOTE_CACHE_TIME_IN_MS\r\n ) {\r\n quote.destroy()\r\n }\r\n })\r\n }\r\n\r\n const checkQuoteCacheDebounce = debounce(cleanupQuoteCache, 500)\r\n\r\n Quote.bind('change', checkQuoteCacheDebounce)\r\n return () => {\r\n checkQuoteCacheDebounce.cancel()\r\n Quote.unbind('change', checkQuoteCacheDebounce)\r\n }\r\n }, [])\r\n\r\n return \r\n}\r\n","import debounce from 'lodash.debounce'\r\nimport React from 'react'\r\n\r\nimport { ObjectHash } from '../../../types/shared'\r\nimport { EXTRA_MARKET_BUFFER_MINUTES, QUOTE_FETCH_EVENT } from '../../constants/common'\r\nimport Chart from '../../models/chart'\r\nimport ChartLayoutModel from '../../models/chart_layout'\r\nimport Pane from '../../models/pane'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\n\r\ninterface Props {\r\n chartLayoutModel: ChartLayoutModel\r\n}\r\n\r\ntype PollingIntervalToChartsType = ObjectHash\r\n\r\n/*\r\n * This HOC loops through all charts and checks if they are supposed to be refetch in some interval\r\n * It creates groups of charts to be refreshed grouped by the refresh interval\r\n * */\r\nexport const withQuotePolling = (Component: any) => (props: Props) => {\r\n const [pollingIntervalToCharts, setPollingIntervalToCharts] = React.useState({})\r\n const checkForChartsWithPolling = React.useCallback(() => {\r\n // check for charts which have some refresh interval and group chart ids by the interval value e.g. { interval_in_ms: [id1, id2] }\r\n const newPollingIntervalToCharts: PollingIntervalToChartsType = {} // example { 60000: ['c-0', 'c-1'], 9000: ['c-4'] }\r\n props.chartLayoutModel.getAllCharts().forEach((chart) => {\r\n const chartRefreshInterval = chart.getRefreshInterval()\r\n\r\n if (chartRefreshInterval) {\r\n newPollingIntervalToCharts[chartRefreshInterval] = newPollingIntervalToCharts[chartRefreshInterval] ?? []\r\n newPollingIntervalToCharts[chartRefreshInterval].push(chart.id)\r\n }\r\n })\r\n\r\n if (JSON.stringify(newPollingIntervalToCharts) !== JSON.stringify(pollingIntervalToCharts)) {\r\n setPollingIntervalToCharts(newPollingIntervalToCharts)\r\n }\r\n }, [props.chartLayoutModel, pollingIntervalToCharts])\r\n const intervalIdsRef = React.useRef([])\r\n\r\n React.useEffect(() => {\r\n const checkForChartsWithPollingDebounced = debounce(checkForChartsWithPolling)\r\n const chartsCheckerIntervalId = window.setInterval(\r\n checkForChartsWithPollingDebounced,\r\n EXTRA_MARKET_BUFFER_MINUTES * 1000\r\n )\r\n\r\n // listen on any changes in all charts & panes and call debounced check for charts/indicators with quotes that needs to be refetched periodically\r\n Chart.bind('change', checkForChartsWithPollingDebounced)\r\n Pane.bind('change', checkForChartsWithPollingDebounced)\r\n\r\n return () => {\r\n checkForChartsWithPollingDebounced.cancel()\r\n Chart.unbind('change', checkForChartsWithPollingDebounced)\r\n Pane.unbind('change', checkForChartsWithPollingDebounced)\r\n window.clearInterval(chartsCheckerIntervalId)\r\n }\r\n }, [checkForChartsWithPolling])\r\n\r\n React.useEffect(() => {\r\n const timeoutDurations = Object.keys(pollingIntervalToCharts).map(Number)\r\n const allCharts = props.chartLayoutModel.getAllCharts()\r\n const timeoutDurationsMin = Math.min(...timeoutDurations)\r\n\r\n timeoutDurations.forEach((duration) => {\r\n const timeoutId = window.setInterval(() => {\r\n const chartIds = pollingIntervalToCharts[duration]\r\n // get all UNIQUE quotes used in charts and refetch them\r\n allCharts\r\n .filter((chart) => chartIds.includes(chart.id))\r\n .flatMap((chart) => chart.getAllQuotes())\r\n .filter(\r\n (quote, index, quotesToUpdate) =>\r\n !quote.isFetching && index === quotesToUpdate.findIndex((quoteToUpdate) => quote.eql(quoteToUpdate))\r\n )\r\n .forEach((quote) => {\r\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\r\n })\r\n if (duration === timeoutDurationsMin) {\r\n document.dispatchEvent(new Event(QUOTE_FETCH_EVENT))\r\n }\r\n }, duration)\r\n intervalIdsRef.current.push(timeoutId)\r\n })\r\n\r\n return () => {\r\n if (intervalIdsRef.current.length > 0) {\r\n intervalIdsRef.current.forEach((timeoutId) => {\r\n window.clearInterval(timeoutId)\r\n })\r\n intervalIdsRef.current = []\r\n }\r\n }\r\n }, [props.chartLayoutModel, pollingIntervalToCharts])\r\n\r\n return \r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { ChartGrid, ChartGridCell, DialogStateReturn } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport flowRight from 'lodash.flowright'\r\nimport merge from 'lodash.merge'\r\nimport throttle from 'lodash.throttle'\r\nimport React from 'react'\r\nimport * as ReactDOM from 'react-dom'\r\n\r\nimport {\r\n ChartConfigObject,\r\n DrawingSpineOptionsEvent,\r\n IIdea,\r\n RootChartConfigObject,\r\n RootChartConfigObjectChart,\r\n} from '../../../types/shared'\r\nimport { ChartEditorEnum, LAYOUTS, LayoutType, SpecificChartFunctionality } from '../../constants/common'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartLayoutModel from '../../models/chart_layout'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { AutoSaveState } from '../../models/constants'\r\nimport ElementModel from '../../models/element'\r\nimport utils, {\r\n getChartsDimensions,\r\n getFullscreenStatus,\r\n getIsMobilePortrait,\r\n isRedesignEnabled,\r\n isRedesignedPage,\r\n} from '../../utils'\r\nimport { getIsPreserveDrawingsAndAutosaveAvailable, getIsSidebarEnabled } from '../../utils/chart'\r\nimport fetchApi from '../../utils/fetch_api'\r\nimport { getTickersAndContainerTypesInLayoutModel } from '../autosave/utils'\r\nimport { withDrawingsAutoSave } from '../autosave/with-auto-save'\r\nimport Chart from '../chart'\r\nimport { SidebarDirection } from '../sidebar/constants'\r\nimport { Sidebar } from '../sidebar/sidebar'\r\nimport Toolbar from '../toolbar'\r\nimport { AutoSaveNotesDialog } from '../toolbar/auto-save-notes'\r\nimport { ConfirmationDialog } from '../toolbar/confirmation_dialog'\r\nimport { DrawingActions, DrawingSetting, DrawingTool } from '../toolbar/interfaces'\r\nimport ToolbarMobile from '../toolbar/mobile/toolbar-mobile'\r\nimport { withDialogState } from '../with_dialog_state_hook'\r\nimport { AutoSaveStateIndicator } from './auto-save-state-indicator'\r\nimport { ChartLayoutAutoSaveNote } from './chart-layout-auto-save-note'\r\nimport { PublishOldButtonClickListener, getPublishChartHtmlElements } from './publish_old_button_click_listener'\r\nimport { withChartPageTitle } from './with-chart-page-title'\r\nimport { withChartRouteChange } from './with-chart-route-change'\r\nimport { withCompleteLayoutModelInit } from './with-complete-layout-model-init'\r\nimport { withIdeaModelState } from './with-idea-model-state'\r\nimport { withQuoteCacheManagement } from './with-quote-cache-management'\r\nimport { withQuotePolling } from './with-quote-polling'\r\n\r\ninterface ChartLayoutComponentProps {\r\n config: RootChartConfigObject\r\n confirmationDialogState: DialogStateReturn\r\n noteDialogState: DialogStateReturn\r\n shouldResize?: boolean\r\n chartLayoutModel: ChartLayoutModel\r\n idea?: IIdea\r\n deleteAllAutoSavedElements: () => void\r\n isAutoSaveActive: boolean\r\n}\r\n\r\ninterface ChartLayoutComponentState {\r\n editable: boolean\r\n editors: ChartEditorEnum[]\r\n layout: LayoutType\r\n activeChartInteraction: string | null\r\n touchEventsDisabled: boolean\r\n isToolbarHorizontal: boolean\r\n activeTool: DrawingTool\r\n drawingSettings: Record\r\n}\r\n\r\nclass ChartLayoutComponentBase extends React.Component {\r\n // expects config, bindPublic\r\n model: ChartLayoutModel\r\n isMobile = Boolean(utils.isMobile(true))\r\n charts: Array<{ model: ChartModel; config: RootChartConfigObjectChart }>\r\n orientationChangeTimeout: number | undefined\r\n preserveDrawingAbortController = new AbortController()\r\n\r\n constructor(props: ChartLayoutComponentProps) {\r\n super(props)\r\n\r\n this.model = props.chartLayoutModel\r\n const config = props.config\r\n\r\n this.charts = []\r\n for (const chartConfig of config.charts) {\r\n const modelProperties: Partial = merge({}, chartConfig)\r\n\r\n modelProperties.chart_layout = this.model\r\n delete modelProperties.panes\r\n if (modelProperties.zoomFactor == null) {\r\n modelProperties.zoomFactor = this.model.defaultZoomFactor\r\n }\r\n if (modelProperties.refreshData == null) {\r\n modelProperties.refreshData = true\r\n }\r\n if (!modelProperties.dateRange) {\r\n modelProperties.dateRange = null\r\n }\r\n modelProperties.isHideDrawingsActive = this.model.isHideDrawingsActive\r\n modelProperties.isScrolled = false\r\n const model = this.model.charts().create(modelProperties)\r\n this.charts.push({ model, config: chartConfig })\r\n }\r\n this.model.updateAttribute('activeChart', this.model.charts().first())\r\n\r\n this.state = {\r\n editable: this.model.editable,\r\n editors: this.model.editors,\r\n layout: this.model.layout,\r\n activeChartInteraction: null,\r\n activeTool: DrawingTool.Mouse,\r\n touchEventsDisabled: false,\r\n isToolbarHorizontal: true,\r\n drawingSettings: {\r\n [DrawingSetting.DrawingModeContinuous]: false,\r\n [DrawingSetting.PreserveDrawings]: this.handleInitialPreserveDrawingsState(),\r\n [DrawingSetting.HideDrawings]: false,\r\n [DrawingSetting.LockDrawings]: false,\r\n },\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n if (this.state.editable) {\r\n const DELETE = 46\r\n window.addEventListener('keyup', (e) => {\r\n const selected = this.model.getPaneWithSelection()\r\n if (e.keyCode === DELETE && selected) {\r\n const element = ElementModel.findByAttribute('instance', selected.selection)\r\n if (element) {\r\n const elementPane = element.pane()\r\n element.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\r\n elementPane.normalizeZIndexes()\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (this.isMobile) {\r\n this.model.settings.ThumbSettings.size = this.model.settings.ThumbSettings.touchSize\r\n }\r\n\r\n this.onModelChange()\r\n\r\n this.model.bind('change', this.onModelChange)\r\n this.model.charts().bind('destroy', this.onChartDestroy)\r\n\r\n this.setToolbarPosition()\r\n window.addEventListener('resize', this.onWindowResize)\r\n window.addEventListener('orientationchange', this.handleOrientationChange)\r\n\r\n if (this.isMobile) {\r\n this.checkTouchEventsDisabled()\r\n window.addEventListener('touchend', this.checkTouchEventsDisabled)\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: Readonly): void {\r\n if (prevProps.idea && !this.props.idea) {\r\n if (this.model.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n this.onWindowResize()\r\n }\r\n document.querySelector('#idea-title-container')?.remove()\r\n }\r\n\r\n this.setToolbarPosition()\r\n }\r\n\r\n componentWillUnmount() {\r\n this.preserveDrawingAbortController.abort()\r\n this.model.unbind('change', this.onModelChange)\r\n\r\n window.removeEventListener('resize', this.onWindowResize)\r\n window.removeEventListener('orientationchange', this.handleOrientationChange)\r\n\r\n if (this.isMobile) {\r\n window.removeEventListener('touchend', this.checkTouchEventsDisabled)\r\n }\r\n\r\n clearTimeout(this.orientationChangeTimeout)\r\n this.throttledResize.cancel()\r\n this.model.destroyCascade()\r\n }\r\n\r\n handleInitialPreserveDrawingsState = () => {\r\n let preserveDrawings = false\r\n if (getIsPreserveDrawingsAndAutosaveAvailable(this.model)) {\r\n if (window.FinvizSettings.toolsState?.[DrawingSetting.PreserveDrawings] !== undefined) {\r\n preserveDrawings = window.FinvizSettings.toolsState[DrawingSetting.PreserveDrawings]\r\n } else {\r\n this.handlePreserveDrawingsSettings()\r\n }\r\n }\r\n this.model.updateAttribute('isPreserveDrawingsActive', preserveDrawings)\r\n return preserveDrawings\r\n }\r\n\r\n handlePreserveDrawingsSettings = async (value?: boolean) => {\r\n const setPreserveDrawings = (val: boolean) => {\r\n this.model.updateAttribute('isPreserveDrawingsActive', val)\r\n this.setState((prevState) => ({\r\n drawingSettings: {\r\n ...prevState.drawingSettings,\r\n [DrawingSetting.PreserveDrawings]: val,\r\n },\r\n }))\r\n }\r\n\r\n try {\r\n this.preserveDrawingAbortController.abort()\r\n this.preserveDrawingAbortController = new AbortController()\r\n const response = await fetchApi({\r\n location: '/api/tools_state.ashx',\r\n method: value !== undefined ? 'POST' : 'GET',\r\n body:\r\n value !== undefined\r\n ? new URLSearchParams({ tools_state: JSON.stringify({ [DrawingSetting.PreserveDrawings]: value }) })\r\n : undefined,\r\n throwOnStatusCodes: [404],\r\n abortController: this.preserveDrawingAbortController,\r\n })\r\n\r\n if (value === undefined && response?.[DrawingSetting.PreserveDrawings] !== undefined) {\r\n setPreserveDrawings(response[DrawingSetting.PreserveDrawings])\r\n }\r\n } catch {\r\n if (value !== undefined) {\r\n setPreserveDrawings(!value)\r\n }\r\n }\r\n }\r\n\r\n handleOrientationChange = () => {\r\n this.orientationChangeTimeout = window.setTimeout(() => {\r\n this.setToolbarPosition()\r\n if (this.props.shouldResize) {\r\n this.handleResize()\r\n }\r\n })\r\n }\r\n\r\n onWindowResize = () => {\r\n this.setToolbarPosition()\r\n\r\n if (this.props.shouldResize) {\r\n this.throttledResize()\r\n }\r\n }\r\n\r\n handleResize = () => {\r\n const modelAttrs: Partial = getChartsDimensions(this.model.getHTMLElementId())\r\n this.model.updateAttributes(modelAttrs)\r\n }\r\n\r\n throttledResize = throttle(this.handleResize, 200)\r\n\r\n setToolbarPosition() {\r\n // quote page toolbar\r\n // 210px represents: (20px (toolbar left margin) + 80px (toolbar width) + 5px (toolbar rigth margin)) * 2 (both sides of chart)\r\n const newIsToolbarHorizontal = this.model.width + 210 > window.innerWidth || window.innerWidth < 1000\r\n if (newIsToolbarHorizontal !== this.state.isToolbarHorizontal) {\r\n this.setState({\r\n isToolbarHorizontal: newIsToolbarHorizontal,\r\n })\r\n }\r\n }\r\n\r\n checkTouchEventsDisabled = () => {\r\n if (!/\\bcharts\\b/.test(window.location.pathname) || getFullscreenStatus() || this.getVisualViewportScale() === 1) {\r\n this.state?.touchEventsDisabled && this.setState({ touchEventsDisabled: false })\r\n } else {\r\n !this.state?.touchEventsDisabled && this.setState({ touchEventsDisabled: true })\r\n }\r\n }\r\n\r\n getVisualViewportScale = () => {\r\n if (process.env.IS_E2E_TESTING) {\r\n return 1\r\n }\r\n if (window.visualViewport && this.isMobile) {\r\n return window.visualViewport.scale\r\n } else {\r\n return 1\r\n }\r\n }\r\n\r\n handleActiveToolChange = (activeTool: DrawingTool) => {\r\n if (!this.model.isLockDrawingsActive) {\r\n this.setState({ activeTool })\r\n }\r\n }\r\n\r\n handleDrawingAction = (actionId: DrawingActions) => {\r\n switch (actionId) {\r\n case DrawingActions.AddNote:\r\n this.props.noteDialogState.toggle()\r\n break\r\n case DrawingActions.DeleteDrawings:\r\n case DrawingActions.DeleteAutoSavedDrawings:\r\n this.props.confirmationDialogState.show()\r\n break\r\n default:\r\n return\r\n }\r\n }\r\n\r\n handleConfirmationDialogDeleteBtn = () => {\r\n if (this.model.drawingsInternalStore().autoSaveState !== AutoSaveState.Off) {\r\n this.props.deleteAllAutoSavedElements()\r\n }\r\n this.model.getAllElements().forEach((element) => {\r\n if (element.isDrawing()) {\r\n element.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\r\n const drawingToRemove = this.model\r\n .drawingsInternalStore()\r\n .elements.find(({ elementId }) => elementId === element.id)\r\n if (drawingToRemove) {\r\n drawingToRemove.changeType = 'destroy'\r\n }\r\n }\r\n })\r\n this.props.confirmationDialogState.hide()\r\n }\r\n\r\n handleDrawingsSetting = (settingId: DrawingSetting) => {\r\n const newObj = { ...this.state.drawingSettings, [settingId]: !this.state.drawingSettings[settingId] }\r\n\r\n switch (settingId) {\r\n case DrawingSetting.HideDrawings:\r\n this.handleActiveToolChange(DrawingTool.Mouse)\r\n this.toggleHideDrawings(newObj[DrawingSetting.HideDrawings])\r\n this.handleLockDrawings(newObj)\r\n break\r\n case DrawingSetting.PreserveDrawings:\r\n this.handlePreserveDrawingsSettings(newObj[DrawingSetting.PreserveDrawings])\r\n this.model.updateAttribute('isPreserveDrawingsActive', newObj[DrawingSetting.PreserveDrawings])\r\n break\r\n case DrawingSetting.LockDrawings:\r\n this.handleActiveToolChange(DrawingTool.Mouse)\r\n this.handleLockDrawings(newObj)\r\n break\r\n case DrawingSetting.DrawingModeContinuous:\r\n this.model.updateAttribute('isDrawingModeContinuousActive', newObj[DrawingSetting.DrawingModeContinuous])\r\n newObj[DrawingSetting.DrawingModeContinuous] === false && this.handleActiveToolChange(DrawingTool.Mouse)\r\n break\r\n default:\r\n break\r\n }\r\n\r\n this.setState({ drawingSettings: newObj })\r\n window.gtag?.('event', 'drawings_settings_toggle', {\r\n event_category: newObj[settingId] ? 'enable' : 'disable',\r\n event_label: settingId,\r\n })\r\n }\r\n\r\n handleLockDrawings = (drawingSettings: Record) => {\r\n this.model.updateAttribute(\r\n 'isLockDrawingsActive',\r\n !(!drawingSettings[DrawingSetting.HideDrawings] && !drawingSettings[DrawingSetting.LockDrawings])\r\n )\r\n }\r\n\r\n toggleHideDrawings(value: boolean) {\r\n this.model.updateAttribute('isHideDrawingsActive', value)\r\n this.model.getAllCharts().forEach((chart) => chart.updateAttribute('isHideDrawingsActive', value))\r\n }\r\n\r\n renderToolbar(args: any) {\r\n const { activeTool, drawingSettings } = this.state\r\n return args.isOverlayToolbar ? (\r\n \r\n ) : (\r\n \r\n )\r\n }\r\n\r\n render() {\r\n const { newCharts, useGrid } = this.props.config\r\n const { activeTool, editable, editors, isToolbarHorizontal } = this.state\r\n const publish = editors.includes(ChartEditorEnum.publish) && getPublishChartHtmlElements().length > 0\r\n const chartLayout = LAYOUTS[this.model.layout]\r\n const isMobilePortrait = getIsMobilePortrait(this.isMobile)\r\n const { tickers } = getTickersAndContainerTypesInLayoutModel(this.model)\r\n\r\n if (newCharts) {\r\n const isSidebarEnabled = getIsSidebarEnabled(SpecificChartFunctionality.chartPage)\r\n return (\r\n <>\r\n

\r\n {!isMobilePortrait &&\r\n // Due safari iOS flex-column bug not resizing height properly we need to render toolbar\r\n // outside of flex for portrait and inside for landscape\r\n // https://github.com/finvizhq/charts/pull/784\r\n this.renderToolbar({\r\n isSidebar: true,\r\n isHorizontal: false,\r\n })}\r\n \r\n \r\n \r\n {this.charts.map(({ model, config }, index) => (\r\n }\r\n gridArea={chartLayout.gridAreas?.[index]}\r\n setActiveChartInteraction={this.setActiveChartInteraction}\r\n activeTool={activeTool}\r\n activeChartInteraction={this.state.activeChartInteraction}\r\n touchEventsDisabled={this.state.touchEventsDisabled}\r\n shouldResize={this.props.shouldResize}\r\n />\r\n ))}\r\n \r\n \r\n
\r\n {isMobilePortrait && isSidebarEnabled && (\r\n \r\n )}\r\n {isMobilePortrait &&\r\n this.renderToolbar({\r\n isSidebar: false,\r\n isHorizontal: true,\r\n isOverlayToolbar: isSidebarEnabled,\r\n })}\r\n {this.props.idea?.note && (\r\n
\r\n
\r\n {this.props.idea.note}\r\n
\r\n
\r\n )}\r\n \r\n )\r\n }\r\n\r\n const hasRedesign = isRedesignEnabled()\r\n const hasChartTools = editable && editors.includes(ChartEditorEnum.tools)\r\n const renderTools = isRedesignedPage(this.model) ? hasChartTools && !isToolbarHorizontal : hasChartTools\r\n\r\n const ideaTitleContainer = document.querySelector('#idea-title-container')\r\n const ideaTitle = this.props.idea?.date &&\r\n this.model.specificChartFunctionality === SpecificChartFunctionality.quotePage && (\r\n

{`Your idea from ${this.props.idea.date}`}

\r\n )\r\n\r\n return (\r\n <>\r\n {ideaTitleContainer ? ReactDOM.createPortal(ideaTitle, ideaTitleContainer) : ideaTitle}\r\n \r\n {renderTools && (\r\n \r\n {this.renderToolbar({\r\n isHorizontal: isToolbarHorizontal,\r\n isAlternativeTheme: true,\r\n })}\r\n \r\n )}\r\n \r\n \r\n {this.charts.map(({ model, config }, index) => (\r\n \r\n this.renderToolbar({\r\n isHorizontal: true,\r\n isAlternativeTheme: true,\r\n })\r\n : undefined\r\n }\r\n />\r\n ))}\r\n \r\n
\r\n
\r\n
\r\n {this.model.specificChartFunctionality === SpecificChartFunctionality.quotePage && (\r\n \r\n )}\r\n \r\n \r\n )\r\n }\r\n\r\n setActiveChartInteraction = (value: string | null) => {\r\n this.setState({ activeChartInteraction: value })\r\n }\r\n\r\n updateLayout() {\r\n const layout = LAYOUTS[this.model.layout]\r\n const charts = this.model.charts().all()\r\n if (charts.length === 0) {\r\n return\r\n }\r\n\r\n if (charts.length > layout.count) {\r\n this.removeCharts(layout.count)\r\n } else if (charts.length < layout.count) {\r\n this.addCharts(layout.count - charts.length)\r\n }\r\n\r\n this.model\r\n .charts()\r\n .all()\r\n .forEach((chart, index) => {\r\n const [rowStart, columnStart, rowEnd, columnEnd] =\r\n layout.gridAreas?.[index]\r\n .replace(/ /g, '')\r\n .split('/')\r\n .map((num) => Number.parseInt(num)) || []\r\n const numOfRowsCovered = [rowEnd, rowStart].every((value) => value !== undefined) ? rowEnd - rowStart : 1\r\n const numOfColumnsCovered = [columnStart, columnEnd].every((value) => value !== undefined)\r\n ? columnEnd - columnStart\r\n : 1\r\n const percentageOfRowsCovered = numOfRowsCovered / layout.rows\r\n const percentageOfColumnsCovered = numOfColumnsCovered / layout.columns\r\n const newWidth = ~~(this.model.width * percentageOfColumnsCovered)\r\n const isChartPage = this.model.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const chartLayoutHeight = isChartPage\r\n ? this.model.height\r\n : this.model.charts().first().height || this.model.height\r\n let newHeight = ~~(chartLayoutHeight * percentageOfRowsCovered)\r\n\r\n if (this.model.editors.includes(ChartEditorEnum.settings) && isChartPage) {\r\n newHeight -= this.model.settings.ChartSettings.general.settingsHeight\r\n }\r\n if ((chart.width !== newWidth || chart.height !== newHeight) && newWidth > 0 && newHeight > 0) {\r\n chart.updateAttributes({ width: newWidth, height: newHeight })\r\n }\r\n })\r\n }\r\n\r\n addCharts(count: number) {\r\n const quote = this.model.charts().last().quote()\r\n if (!quote) return\r\n const config = {\r\n ...this.model.charts().last().toObject(),\r\n leftOffset: null,\r\n chart_layout: this.model,\r\n aftermarket: quote.aftermarket,\r\n premarket: quote.premarket,\r\n }\r\n for (let i = 0; i < count; i++) {\r\n const model = this.model.charts().create(config)\r\n this.charts.push({ model, config })\r\n }\r\n }\r\n\r\n removeCharts(wantedCount: number) {\r\n while (this.model.charts().count() > wantedCount) {\r\n const chart = this.model.charts().last()\r\n chart.destroyCascade()\r\n this.charts.pop()\r\n }\r\n }\r\n\r\n onChartDestroy = (chartModel: ChartModel) => {\r\n this.updateLayout()\r\n if (this.model.activeChart?.eql(chartModel)) {\r\n this.model.updateAttribute('activeChart', this.model.charts().last())\r\n }\r\n }\r\n\r\n onModelChange = (layoutModel?: ChartLayout, event?: Spine.Event) => {\r\n if (event === 'refresh') {\r\n return\r\n }\r\n this.updateLayout()\r\n\r\n if (layoutModel && event === 'update') {\r\n this.setState({\r\n editable: layoutModel.editable,\r\n editors: layoutModel.editors,\r\n layout: layoutModel.layout,\r\n })\r\n }\r\n }\r\n}\r\n\r\nexport const ChartLayoutComponent = flowRight(\r\n withQuoteCacheManagement,\r\n withDialogState,\r\n withCompleteLayoutModelInit,\r\n withChartPageTitle,\r\n withChartRouteChange,\r\n withIdeaModelState,\r\n withQuotePolling,\r\n withDrawingsAutoSave\r\n)(ChartLayoutComponentBase)\r\n","import { useDialogState } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nexport const withDialogState = (Component: any) => (props: any) => {\r\n const confirmationDialogState = useDialogState()\r\n const noteDialogState = useDialogState()\r\n\r\n return \r\n}\r\n","import * as React from 'react'\r\n\r\nimport { SpecificChartFunctionality, TIMEFRAME } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport ChartLayoutModel from '../../models/chart_layout'\r\nimport Quote from '../../models/quote'\r\n\r\nfunction useChartPageTitle() {\r\n const defaultDocumentTitleRef = React.useRef(document.title)\r\n\r\n const { current: updateChartsTitle } = React.useRef((chartLayoutModel: ChartLayoutModel) => {\r\n const charts = chartLayoutModel\r\n .getAllCharts()\r\n .reduce(\r\n (acc, current) => {\r\n if (acc.some(({ ticker }) => ticker === current.ticker)) {\r\n return acc\r\n }\r\n return [...acc, { ticker: current.ticker, timeframe: current.timeframe, instrument: current.instrument }]\r\n },\r\n [] as Array<{ ticker: string; timeframe: TIMEFRAME; instrument: string }>\r\n )\r\n .map((chart) => {\r\n const { ticker, timeframe, instrument } = chart\r\n const quotes = Quote.select(\r\n (quote: Quote) =>\r\n quote.ticker === ticker.replace('@', '') &&\r\n quote.timeframe === timeframe &&\r\n quote.instrument === instrument &&\r\n chartLayoutModel.isIdeaId(quote.ideaID)\r\n )\r\n if (quotes.length > 0) {\r\n const { lastClose, instrument, afterClose, prevClose, name } = quotes[0]\r\n let percentageChange: number\r\n if (!lastClose) {\r\n return null\r\n }\r\n if (prevClose !== null) {\r\n percentageChange = (lastClose / prevClose - 1) * 100\r\n }\r\n if (afterClose !== null && afterClose !== lastClose) {\r\n percentageChange = (afterClose / lastClose - 1) * 100\r\n }\r\n return `${name || ticker} ${math.round({\r\n value: lastClose,\r\n lastClose,\r\n instrument,\r\n overridePlaces: undefined,\r\n })} ${percentageChange! > 0 ? '+' : '-'}${math.round({\r\n value: Math.abs(percentageChange!),\r\n overridePlaces: 2,\r\n })}%`\r\n }\r\n return null\r\n })\r\n .filter((chart) => chart !== null)\r\n\r\n if (charts && charts.length > 0) {\r\n const title = charts.join(' | ')\r\n if (document.title !== title) {\r\n document.title = title\r\n }\r\n } else if (document.title !== defaultDocumentTitleRef.current) {\r\n document.title = defaultDocumentTitleRef.current\r\n }\r\n })\r\n\r\n return { updateChartsTitle }\r\n}\r\n\r\nexport function withChartPageTitle

(\r\n Component: React.ComponentType

\r\n) {\r\n return function WrappedComponent(props: P) {\r\n const { updateChartsTitle } = useChartPageTitle()\r\n\r\n const handleChartsUpdate = React.useCallback(() => {\r\n updateChartsTitle(props.chartLayoutModel)\r\n }, [props.chartLayoutModel, updateChartsTitle])\r\n\r\n React.useEffect(() => {\r\n if (props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n props.chartLayoutModel.charts().bind('change', handleChartsUpdate)\r\n\r\n handleChartsUpdate()\r\n\r\n return () => {\r\n props.chartLayoutModel.charts().unbind('change', handleChartsUpdate)\r\n }\r\n }\r\n }, [props.chartLayoutModel, handleChartsUpdate])\r\n\r\n return \r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayoutModel from '../../models/chart_layout'\r\n\r\nexport function withIdeaModelState

(\r\n Component: React.ComponentType

\r\n) {\r\n return function WrappedComponent(props: P) {\r\n const chartLayoutModel = useModelState(props.chartLayoutModel, { watchProperties: ['idea'] })\r\n return \r\n }\r\n}\r\n","import { NotificationWrapper, withSuspense } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { RootChartConfigObject } from '../../../types/shared'\r\nimport { ElementStyleDialogWrapper } from '../../modals/element_style'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\nimport { ChartLayoutComponent } from './chart_layout_component'\r\n\r\ninterface ChartLayoutProps {\r\n config: RootChartConfigObject\r\n shouldResize?: boolean\r\n parentElement?: HTMLElement\r\n isWithNotifications?: boolean\r\n}\r\n\r\nexport function ChartLayout({ config, shouldResize, isWithNotifications = true }: ChartLayoutProps) {\r\n const Wrapper = isWithNotifications ? NotificationWrapper : React.Fragment\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport function ChartLayoutWithGlobalStateRaw({\r\n config,\r\n shouldResize,\r\n parentElement,\r\n}: Omit) {\r\n const { setChartLayoutModel, getChartLayoutModelConfig, lastGlobalRerender } = useChartLayoutGlobalModelAsync()\r\n\r\n return (\r\n \r\n {config && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const ChartLayoutWithGlobalState = withSuspense(ChartLayoutWithGlobalStateRaw)\r\n","import { Button } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport Utils, { getExitFullscreen, getFullscreenStatus, getRequestFullscreen } from '../../utils'\r\n\r\nconst isIPad = Utils.isIPad()\r\nconst IPAD_FULLSCREEN_CLASS = 'is-ipad-fullscreen'\r\n\r\nexport function FullscreenButton() {\r\n const [isFullscreen, setIsFullscreen] = React.useState(getFullscreenStatus())\r\n const requestFullscreen = getRequestFullscreen(document.documentElement)\r\n const exitFullscreen = getExitFullscreen()\r\n\r\n const onClick = React.useRef(() => {\r\n if (getFullscreenStatus()) {\r\n exitFullscreen.call(document)\r\n } else {\r\n requestFullscreen.call(document.documentElement)\r\n }\r\n })\r\n\r\n React.useEffect(() => {\r\n const checkFullscreen = () => {\r\n if (isIPad) {\r\n if (getFullscreenStatus()) {\r\n document.body.classList.add(IPAD_FULLSCREEN_CLASS)\r\n } else {\r\n document.body.classList.remove(IPAD_FULLSCREEN_CLASS)\r\n }\r\n }\r\n setIsFullscreen(getFullscreenStatus())\r\n }\r\n\r\n document.addEventListener('webkitfullscreenchange', checkFullscreen)\r\n document.addEventListener('fullscreenchange', checkFullscreen)\r\n return () => {\r\n document.removeEventListener('webkitfullscreenchange', checkFullscreen)\r\n document.removeEventListener('fullscreenchange', checkFullscreen)\r\n }\r\n }, [])\r\n\r\n if (!requestFullscreen) return null\r\n\r\n return (\r\n \r\n {isFullscreen ? 'Exit Full screen' : 'Full screen'}\r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n Dropdown,\r\n DropdownItem,\r\n DropdownSeparator,\r\n Icon,\r\n IconNameType,\r\n Paragraph,\r\n useDropdownState,\r\n} from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport { LAYOUTS } from '../../constants/common'\r\nimport { sortObjects } from '../../helpers/sorter'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { ChartSyncableParts } from '../../models/chart/contstants'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { decodeQueryString } from '../../utils/query_string'\r\nimport { useChartsPathLocation } from '../chart-controls/use-charts-path-location'\r\n\r\nconst SORTED_LAYOUT_KEYS = sortObjects(\r\n Object.entries(LAYOUTS).map(([key, value]) => ({ ...value, key })),\r\n [{ sortBy: 'columns' }, { sortBy: 'count' }]\r\n).map(({ key }) => key)\r\n\r\nexport function ChartLayoutDropdown({ model }: { model: ChartLayout }) {\r\n const location = useLocation()\r\n const navigate = useNavigate()\r\n const parsedQuery = decodeQueryString(location.search)\r\n const chartLayoutModel = useModelState(model, { watchProperties: ['layout', 'syncChartParts'] })\r\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel })\r\n const state = useDropdownState({ placement: 'bottom', orientation: 'horizontal' })\r\n\r\n return (\r\n \r\n Layout\r\n \r\n }\r\n >\r\n

\r\n
\r\n {SORTED_LAYOUT_KEYS.map((layout) => (\r\n {\r\n navigate(getChartsToPath({ layout }))\r\n }}\r\n >\r\n \r\n \r\n ))}\r\n
\r\n \r\n
\r\n
\r\n Sync:\r\n
\r\n {ChartSyncableParts.map(({ value, label }) => {\r\n const isChartPartInSync = chartLayoutModel.getIsChartPartInSync(value)\r\n return (\r\n {\r\n chartLayoutModel.setSyncChartParts(value, !isChartPartInSync)\r\n if (!isChartPartInSync) window.gtag?.('event', 'sync', { event_label: value })\r\n }}\r\n >\r\n {label}\r\n \r\n )\r\n })}\r\n
\r\n
\r\n \r\n )\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { SORT_DIRECTION } from '../constants/common'\r\n\r\nexport function sortObjects(\r\n arr: ObjectHash[],\r\n options: Array<{ sortBy: string; sortDirection?: keyof typeof SORT_DIRECTION }> = []\r\n) {\r\n return arr.sort((a, b) =>\r\n options.reduce((acc, option) => {\r\n const { sortBy, sortDirection = SORT_DIRECTION.ASC } = option\r\n const directionMultiplier = sortDirection === SORT_DIRECTION.ASC ? 1 : -1\r\n return acc === 0 ? (a[sortBy] - b[sortBy]) * directionMultiplier : acc\r\n }, 0)\r\n )\r\n}\r\n","import { Button, setCookieRequest } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { updateSettings } from '../../models/settings'\r\n\r\nexport function ThemeToggleButton({ model }: { model: ChartLayout }) {\r\n const chartLayoutModel = useModelState(model, { watchProperties: ['theme'] })\r\n const isDarkMode = model.theme === 'dark'\r\n\r\n const onClick = () => {\r\n const theme = isDarkMode ? 'light' : 'dark'\r\n chartLayoutModel.updateAttributes({ theme, settings: updateSettings(chartLayoutModel, theme) })\r\n chartLayoutModel.trigger('theme', chartLayoutModel)\r\n setCookieRequest('chartsTheme', theme).catch(() => {})\r\n\r\n if (isDarkMode) {\r\n document.documentElement.classList.remove('dark')\r\n } else {\r\n document.documentElement.classList.add('dark')\r\n }\r\n }\r\n\r\n if (!chartLayoutModel) {\r\n return null\r\n }\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Button, Time, TimeBreakpoint } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { FullscreenButton } from './fullscreen_button'\r\nimport { IdeasDropdown } from './ideas_dropdown'\r\nimport { ChartLayoutDropdown } from './layout_dropdown'\r\nimport { Publish } from './publish'\r\nimport { ThemeToggleButton } from './theme_toggle_button'\r\nimport { TourButton } from './tour_button'\r\n\r\nconst BREAKPOINTS: TimeBreakpoint[] = [\r\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\r\n { minWidth: 550, marketBadgeText: false, timeFormat: 'short' },\r\n { minWidth: 700, marketBadgeText: false, timeFormat: 'long' },\r\n { minWidth: 768, marketBadgeText: true, timeFormat: 'long' },\r\n]\r\n\r\ninterface ChartLayoutHeaderProps {\r\n model: ChartLayout\r\n onSettingsOpen: () => void\r\n hasPublish: boolean\r\n}\r\n\r\nexport function ChartLayoutHeaderComponent({ model, onSettingsOpen = () => {}, hasPublish }: ChartLayoutHeaderProps) {\r\n const chartLayout = useModelState(model, { watchProperties: ['idea'] })!\r\n\r\n return (\r\n <>\r\n
\r\n \r\n Ideas\r\n \r\n
\r\n
\r\n \r\n Chart tour\r\n \r\n \r\n \r\n {hasPublish && (\r\n \r\n Share\r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nexport const ChartLayoutHeader = React.memo(\r\n ChartLayoutHeaderComponent,\r\n (prevProps, nextProps) =>\r\n prevProps.model === nextProps.model &&\r\n prevProps.onSettingsOpen === nextProps.onSettingsOpen &&\r\n prevProps.hasPublish === nextProps.hasPublish\r\n)\r\n","import {\r\n ButtonSizeType,\r\n CustomDateRange,\r\n TimeframeBar,\r\n useCustomDateRangeDialog,\r\n useFavoriteTimeframes,\r\n withSuspense,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { isRedesignEnabled } from '../../utils'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\nimport { useChartControls } from './use-chart-controls'\r\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\r\n\r\nfunction StockDetailTimeframeBarRaw({\r\n size = 'regular',\r\n className = '!m-0 space-x-2',\r\n isDateRangeAvailable,\r\n isPremium,\r\n isLoadingOverride,\r\n isScrollIntoViewEnabled = false,\r\n onTimeframeSelect = () => {},\r\n onDateRangeSelect = () => {},\r\n}: {\r\n size?: ButtonSizeType\r\n className?: string\r\n isDateRangeAvailable: boolean\r\n isPremium: boolean\r\n isLoadingOverride?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n onTimeframeSelect?: (timeframe: any) => void\r\n onDateRangeSelect?: (timeframe: any) => void\r\n}) {\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const chartModelUnwatched = React.useMemo(() => chartLayoutModel?.getAllCharts()[0] ?? null, [chartLayoutModel])\r\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes(isPremium)\r\n const chartModel = useModelState(chartModelUnwatched, {\r\n watchProperties: ['timeframe', 'dateRange'],\r\n })\r\n const { instrument = Instrument.Stock } = chartModel?.quote() || {}\r\n const { isLoading } = useChartControls({\r\n chartModel,\r\n isInteractive: isDateRangeAvailable,\r\n })\r\n\r\n const {\r\n anchorDate,\r\n generateChartLayoutRouterPath,\r\n timeframeGroupsWithHref,\r\n dateRangeGroupsWithHref,\r\n isFetching,\r\n handleCustomDateRangeValidation,\r\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\r\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\r\n useCustomDateRangeDialog({\r\n instrument,\r\n anchorDate,\r\n pathGenerator: generateChartLayoutRouterPath,\r\n })\r\n\r\n const dateRangeGroups = dateRangeGroupsWithHref({ isPremium, customRange: chartModel?.dateRange, instrument })\r\n const timeFrameGroups = timeframeGroupsWithHref(isPremium)\r\n\r\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\r\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\r\n if (!dateRangeTimeframe) return\r\n\r\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\r\n if (isValid) onDialogSubmit(dateRangeTimeframe)\r\n }\r\n\r\n return (\r\n <>\r\n {\r\n handleDateRangeSelect(value)\r\n onDateRangeSelect?.(value)\r\n }}\r\n onCustomDateRangeClick={() => {\r\n if (isPremium) customDateRangeDialogState.show()\r\n }}\r\n onTimeframeSelect={onTimeframeSelect}\r\n onFavoriteTimeframeToggle={({ value }: { value: string }) => {\r\n toggleFavoriteTimeframe(value as TIMEFRAME)\r\n }}\r\n isDateRangeAvailable={isDateRangeAvailable}\r\n containerElement={document.body}\r\n className={className}\r\n isFavoritesEnabled={isPremium}\r\n isScrollIntoViewEnabled={isScrollIntoViewEnabled}\r\n />\r\n\r\n {chartModel && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const StockDetailTimeframeBar = withSuspense(StockDetailTimeframeBarRaw)\r\n","import { ChartConfigChartPane, Position, RootChartConfigObject } from '../../types/shared'\r\nimport { ChartElementType, IndicatorType, OverlayType, PANE_HEIGHT_DEFAULT, ScaleType } from '../constants/common'\r\n\r\nfunction hasPaneWithCOTCode(panes: ChartConfigChartPane[], code: string) {\r\n return panes.some(({ elements }) =>\r\n elements.some((element) => element.type === IndicatorType.Cot && element.code === code)\r\n )\r\n}\r\nfunction pushIndicators(\r\n panes: ChartConfigChartPane[],\r\n indicator: { name: string; parameters: string },\r\n options?: { COTs?: string[] }\r\n) {\r\n if (indicator.name === 'cot') {\r\n const cotKeys = options?.COTs ?? []\r\n if (cotKeys.length === 0) {\r\n cotKeys.push('')\r\n }\r\n cotKeys.forEach(function (code: string) {\r\n if (!hasPaneWithCOTCode(panes, code)) {\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.indicator,\r\n elements: [\r\n {\r\n type: IndicatorType.Cot,\r\n code,\r\n },\r\n ],\r\n })\r\n }\r\n })\r\n } else {\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.indicator,\r\n elements: [\r\n {\r\n type: ('indicators/' + indicator.name) as IndicatorType,\r\n period: indicator.parameters,\r\n },\r\n ],\r\n })\r\n }\r\n}\r\n\r\nfunction getChartTypeByTaConfigStyle(style: string) {\r\n const chartTypeMap = {\r\n candlestick: ChartElementType.CandleStick,\r\n heikinashi: ChartElementType.HeikinAshi,\r\n hollowcandlestick: ChartElementType.HollowCandleStick,\r\n line: ChartElementType.LineChart,\r\n ohlc: ChartElementType.OhlcChart,\r\n }\r\n return chartTypeMap[style as keyof typeof chartTypeMap]\r\n}\r\n\r\nfunction getChartScaleByTaConfigScale(scale: string | undefined) {\r\n const chartScaleMap = {\r\n linear: ScaleType.Linear,\r\n percentage: ScaleType.Percentage,\r\n logarithmic: ScaleType.Logarithmic,\r\n }\r\n return chartScaleMap[scale as keyof typeof chartScaleMap] ?? ScaleType.Linear\r\n}\r\n\r\n/*\r\n * Merges chartConfig (in \"chart\" format) with taConfig (in format that TA is preserved in DB)\r\n */\r\nexport const mergeChartAndTAConfig = function convertTA(\r\n chartConfig: RootChartConfigObject,\r\n taConfig: TaConfigObject,\r\n options?: { COTs: string[] }\r\n) {\r\n const panes = chartConfig.charts[0].panes\r\n const chart = chartConfig.charts[0]\r\n\r\n chart.scale = getChartScaleByTaConfigScale(taConfig.scale)\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Above)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n const overlays = taConfig.overlays.map(function (overlay) {\r\n return {\r\n type: ('overlays/' + overlay.name) as OverlayType,\r\n period: overlay.parameters ?? '',\r\n color: overlay.color ?? '',\r\n }\r\n })\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.chart,\r\n elements: [\r\n {\r\n type: getChartTypeByTaConfigStyle(taConfig.style),\r\n overlays: overlays,\r\n },\r\n ],\r\n })\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Below)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n chartConfig.height = chart.height = PANE_HEIGHT_DEFAULT.chart + (panes.length - 1) * PANE_HEIGHT_DEFAULT.indicator\r\n}\r\n\r\nexport const getPanes = function getPanes(taConfig: TaConfigObject) {\r\n const options = {}\r\n const panes: ChartConfigChartPane[] = []\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Above)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n const overlays = taConfig.overlays.map(function (overlay) {\r\n return {\r\n type: ('overlays/' + overlay.name) as OverlayType,\r\n period: overlay.parameters ?? '',\r\n color: overlay.color ?? '',\r\n }\r\n })\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.chart,\r\n elements: [\r\n {\r\n type: getChartTypeByTaConfigStyle(taConfig.style),\r\n overlays: overlays,\r\n },\r\n ],\r\n })\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Below)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n return panes\r\n}\r\n","export * from 'finviz-charts/app/lib-export'\r\n\r\nexport enum SettingsTab {\r\n Chart = 'chart',\r\n Colors = 'colors',\r\n}\r\n\r\nexport enum SidebarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n","export const createAlertAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"create-alert\" */ './module-entry'),\r\n cacheKey: 'create-alert',\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","export const portfolioWatchlistTableAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist-table\" */ './PortfolioWatchlistTable'),\r\n cacheKey: 'portfolio-watchlist-table',\r\n}\r\n","import logo from './app/shared/assets/logo.png'\r\nimport logo_light from './app/shared/assets/logo_light.png'\r\n\r\nexport * from './main/components'\r\n\r\nexport { getSanitizedTicker } from './app/shared/ticker-sanitizer'\r\nexport * from './app/queryString'\r\nexport * from './main/modules/portfolio/types'\r\n\r\nexport { getFormattedDateString } from './app/header/utils'\r\nexport { decodeQueryString, encodeQueryString } from './app/queryString'\r\nexport { createAlertAsyncModule } from './app/quote/create-alert/async-modules'\r\nexport { saveToPortfolioAsyncModule } from './app/quote/save-to-portfolio/async-modules'\r\nexport { formatDateToStringUS } from './app/shared/utils'\r\nexport { portfolioWatchlistTableAsyncModule } from './main/components/portfolio/async-modules'\r\nexport { useTrackPageView } from './main/hooks/use-track-pageview'\r\nexport {\r\n useAsyncModule,\r\n withSuspense,\r\n type ControlledModuleConfig,\r\n type SuspenseModuleConfig,\r\n} from './main/services/async-modules-utils'\r\nexport { importWithRetry } from './main/services/import-with-retry'\r\nexport * as localStorage from './main/services/local-storage'\r\nexport { waitForPreviousPromise } from './main/services/wait-for-previous-promise'\r\nexport { setCookieRequest } from './main/services/api'\r\n\r\nexport const assets = { logo, logo_light }\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport * as tracking from '../../app/shared/tracking'\r\n\r\nexport function useTrackPageView(props?: { trackInitial?: boolean; trackAutomatically?: boolean }) {\r\n const { trackInitial = false, trackAutomatically = true } = props ?? {}\r\n const initialRender = React.useRef(trackInitial)\r\n const location = useLocation()\r\n\r\n const handleTrackView = React.useCallback(() => {\r\n tracking.trackPageView({ pathname: location.pathname, query: location.search })\r\n }, [location.pathname, location.search])\r\n\r\n React.useEffect(() => {\r\n if (!trackAutomatically) return\r\n if (initialRender.current) handleTrackView()\r\n initialRender.current = true\r\n }, [trackAutomatically, handleTrackView, trackInitial])\r\n\r\n return handleTrackView\r\n}\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IArrowAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n border: DrawingBorder\r\n}\r\n\r\nclass Arrow extends Element {\r\n static type = CanvasElementType.arrow\r\n\r\n declare scaled: Pick\r\n name = 'Arrow'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'l',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'r',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 3,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineCap', 'round')\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const angle = Math.PI / 8\r\n const d = 20\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n\r\n const lineAngle = Math.atan2(roundedXY.y2 - roundedXY.y1, roundedXY.x2 - roundedXY.x1)\r\n const h = Math.abs(d / Math.cos(angle))\r\n\r\n const angle1 = lineAngle + angle\r\n const topx = roundedXY.x1 + Math.cos(angle1) * h\r\n const topy = roundedXY.y1 + Math.sin(angle1) * h\r\n const angle2 = lineAngle - angle\r\n const botx = roundedXY.x1 + Math.cos(angle2) * h\r\n const boty = roundedXY.y1 + Math.sin(angle2) * h\r\n\r\n context.beginPath()\r\n context.moveTo(topx, topy)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(botx, boty)\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'l') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nArrow.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default Arrow\r\n","import { DrawingBorder, PaneArea, RequireByKey, ResizeByThumbFuncProps } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport Element, { EdgeValues } from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport type BrushPoints = Array<[x: number, y: number]>\r\n\r\nexport interface IBrushAttrs {\r\n points: BrushPoints\r\n fill: string\r\n border: DrawingBorder\r\n isPolyLineClosed: boolean\r\n positionPointsTimestamps: BrushPoints\r\n}\r\n\r\nclass Brush extends Element {\r\n static type = CanvasElementType.brushV1\r\n\r\n untranslatedContext: CanvasRenderingContext2D | null = null\r\n\r\n name = 'Brush'\r\n\r\n brushPath: Path2D | null = null\r\n\r\n cachedFill = {\r\n previousFill: '',\r\n shouldRenderFill: false,\r\n }\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\r\n this.setFillCache()\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultTransparentFill,\r\n border: {\r\n width: 3,\r\n color: ElementSettings.Colors.border,\r\n },\r\n isPolyLineClosed: false,\r\n } as Partial\r\n }\r\n\r\n setFillCache() {\r\n this.cachedFill.previousFill = this.attrs.fill\r\n if (this.attrs.fill.length === 9) {\r\n this.cachedFill.shouldRenderFill = this.attrs.fill.slice(7) !== '00'\r\n } else {\r\n this.cachedFill.shouldRenderFill = true\r\n }\r\n }\r\n\r\n getShouldRenderFill() {\r\n if (this.attrs.fill !== this.cachedFill.previousFill) {\r\n this.setFillCache()\r\n }\r\n return this.cachedFill.shouldRenderFill\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (this.attrs.border != null) {\r\n context.set('strokeStyle', this.attrs.border.color)\r\n }\r\n context.set('lineCap', 'round')\r\n context.set('lineJoin', 'round')\r\n\r\n const brushPath = new Path2D()\r\n const { points } = this.attrs\r\n context.beginPath()\r\n brushPath.moveTo(this.fx(points[0][0]), this.fy(points[0][1]))\r\n let i\r\n if (points.length > 3) {\r\n for (i = 0; i < points.length - 2; i++) {\r\n const xc = (this.fx(points[i][0]) + this.fx(points[i + 1][0])) / 2\r\n const yc = (this.fy(points[i][1]) + this.fy(points[i + 1][1])) / 2\r\n brushPath.quadraticCurveTo(this.fx(points[i][0]), this.fy(points[i][1]), xc, yc)\r\n }\r\n brushPath.quadraticCurveTo(\r\n this.fx(points[i][0]),\r\n this.fy(points[i][1]),\r\n this.fx(points[i + 1][0]),\r\n this.fy(points[i + 1][1])\r\n )\r\n } else {\r\n for (const point of points) {\r\n brushPath.lineTo(this.fx(point[0]), this.fy(point[1]))\r\n }\r\n }\r\n\r\n if (this.attrs.isPolyLineClosed) {\r\n brushPath.closePath()\r\n }\r\n this.brushPath = brushPath\r\n if (this.attrs.fill && this.getShouldRenderFill()) {\r\n context.set('fillStyle', this.attrs.fill)\r\n context.fill(brushPath)\r\n }\r\n if (this.attrs?.border?.width) {\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.stroke(brushPath)\r\n }\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n const [firstX, firstY] = this.attrs.points[0]\r\n const [lastX, lastY] = this.attrs.points[this.attrs.points.length - 1]\r\n\r\n return [\r\n new Thumb(\r\n 'first',\r\n () => firstX,\r\n () => firstY,\r\n this.moveByThumb,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'last',\r\n () => lastX,\r\n () => lastY,\r\n this.moveByThumb,\r\n this.model\r\n ),\r\n ]\r\n }\r\n\r\n moveByThumb = ({ difX, difY }: RequireByKey) => {\r\n this.moveBy(difX, difY)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n if (this.getIsCreator()) return\r\n for (const point of this.attrs.points) {\r\n point[0] += x\r\n point[1] += y\r\n }\r\n }\r\n\r\n onMouseUp() {\r\n const [currentDomainMax, currentDomainMin] = this.model.scale.y.domain()\r\n for (const point of this.attrs.points) {\r\n point[0] = this.roundToFixed(point[0], 2)\r\n point[1] = this.roundY(point[1], currentDomainMax - currentDomainMin)\r\n }\r\n super.onMouseUp()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const { points } = this.attrs\r\n if (\r\n (this.getShouldRenderFill() || this.attrs.isPolyLineClosed) &&\r\n this.brushPath &&\r\n this.untranslatedContext?.isPointInPath(this.brushPath, area.scaled.x, area.scaled.y)\r\n ) {\r\n return true\r\n } else if (points.length > 1) {\r\n for (let i = 0; i < points.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: this.fx(points[i][0]),\r\n y1: this.fy(points[i][1]),\r\n x2: this.fx(points[i + 1][0]),\r\n y2: this.fy(points[i + 1][1]),\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart()?.quote()\r\n if (quote) {\r\n const positionPointsTimestamps = this.attrs.points.map(([x, y]) => [quote.getTimestampFomPositionX(x), y])\r\n this.set({ positionPointsTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionPointsTimestamps } = this.attrs\r\n if (!quote || !positionPointsTimestamps) {\r\n // positionPointsTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const points = positionPointsTimestamps.map(([x, y]) => [quote.getPositionXFromTimestamp(x), y])\r\n this.set({ points } as Partial)\r\n }\r\n\r\n roundToFixed = (value: number, places: number) => Number.parseFloat(math.round({ value, overridePlaces: places }))\r\n\r\n roundY = (y: number, domainDiff: number) => {\r\n if (domainDiff < 1) {\r\n const numberOfLeadingZeros = Math.abs(Math.floor(Math.log10(Math.abs(domainDiff)) + 1))\r\n if (numberOfLeadingZeros > 0) {\r\n return this.roundToFixed(y, numberOfLeadingZeros + 4)\r\n } else {\r\n return this.roundToFixed(y, numberOfLeadingZeros + 3)\r\n }\r\n } else if (domainDiff < 10) {\r\n return this.roundToFixed(y, 3)\r\n }\r\n return this.roundToFixed(y, 2)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['points']\r\n }\r\n\r\n getEdgeXYValues() {\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n this.attrs.points.forEach(([x, y]) => {\r\n edgeXYValues.minX = Math.min(x, edgeXYValues.minX ?? x)\r\n edgeXYValues.minY = Math.min(y, edgeXYValues.minY ?? y)\r\n edgeXYValues.maxX = Math.max(x, edgeXYValues.maxX ?? x)\r\n edgeXYValues.maxY = Math.max(y, edgeXYValues.maxY ?? y)\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nBrush.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, max: 20, default: {} },\r\n { type: 'checkbox', name: 'isPolyLineClosed', label: 'Close line' },\r\n ],\r\n}\r\n\r\nexport default Brush\r\n","import math from '../../helpers/math'\r\n\r\ninterface ICoordinates {\r\n x: number\r\n y: number\r\n}\r\nexport interface IRectangleSidesCoordinates {\r\n topLeft: ICoordinates\r\n topRight: ICoordinates\r\n rightTop: ICoordinates\r\n rightBottom: ICoordinates\r\n bottomRight: ICoordinates\r\n bottomLeft: ICoordinates\r\n leftBottom: ICoordinates\r\n leftTop: ICoordinates\r\n}\r\n\r\nexport interface ITailCoordinates {\r\n tailRoot: ICoordinates\r\n tailTip: ICoordinates\r\n}\r\n\r\nexport enum TailDirection {\r\n noTail,\r\n topLeftCorner,\r\n topRightCorner,\r\n bottomLeftCorner,\r\n bottomRightCorner,\r\n topSide,\r\n rightSide,\r\n bottomSide,\r\n leftSide,\r\n}\r\n\r\nexport const getRectangleSidesCoordinates = ({\r\n padding,\r\n radius,\r\n x2,\r\n y2,\r\n textWidth,\r\n measuredHeight,\r\n}: {\r\n padding: number\r\n radius: number\r\n x2: number\r\n y2: number\r\n textWidth: number\r\n measuredHeight: number\r\n}): IRectangleSidesCoordinates => ({\r\n topLeft: {\r\n x: x2 - padding + radius,\r\n y: y2 - padding,\r\n },\r\n topRight: {\r\n x: x2 + textWidth + padding - radius,\r\n y: y2 - padding,\r\n },\r\n rightTop: {\r\n x: x2 + textWidth + padding,\r\n y: y2 - padding + radius,\r\n },\r\n rightBottom: {\r\n x: x2 + textWidth + padding,\r\n y: y2 + padding + measuredHeight - radius,\r\n },\r\n bottomRight: {\r\n x: x2 + textWidth + padding - radius,\r\n y: y2 + padding + measuredHeight,\r\n },\r\n bottomLeft: {\r\n x: x2 - padding + radius,\r\n y: y2 + padding + measuredHeight,\r\n },\r\n leftBottom: {\r\n x: x2 - padding,\r\n y: y2 + padding + measuredHeight - radius,\r\n },\r\n leftTop: {\r\n x: x2 - padding,\r\n y: y2 - padding + radius,\r\n },\r\n})\r\n\r\nexport const getTailCoordinates = ({\r\n rectangleSides,\r\n x1,\r\n y1,\r\n}: {\r\n rectangleSides: IRectangleSidesCoordinates\r\n x1: number\r\n y1: number\r\n}): ITailCoordinates => ({\r\n tailRoot: {\r\n x: rectangleSides.topLeft.x + (rectangleSides.topRight.x - rectangleSides.topLeft.x) / 2,\r\n y: rectangleSides.leftTop.y + (rectangleSides.leftBottom.y - rectangleSides.leftTop.y) / 2,\r\n },\r\n tailTip: {\r\n x: x1,\r\n y: y1,\r\n },\r\n})\r\n\r\nconst getTailHalfWidth = (halfWidth: number, p1: ICoordinates, p2: ICoordinates): number => {\r\n const dist = math.distance(p1, p2)\r\n if (dist < halfWidth * 2) {\r\n return dist / 2\r\n } else {\r\n return halfWidth\r\n }\r\n}\r\n\r\nexport const getTailToSideIntersection = ({\r\n tail,\r\n rectangleSides,\r\n}: {\r\n tail: ITailCoordinates\r\n rectangleSides: IRectangleSidesCoordinates\r\n}): TailDirection => {\r\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\r\n const { tailTip, tailRoot } = tail\r\n if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, leftTop)) {\r\n return TailDirection.topLeftCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topRight, rightTop)) {\r\n return TailDirection.topRightCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, leftBottom)) {\r\n return TailDirection.bottomLeftCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomRight, rightBottom)) {\r\n return TailDirection.bottomRightCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)) {\r\n return TailDirection.topSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)) {\r\n return TailDirection.rightSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, bottomRight)) {\r\n return TailDirection.bottomSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)) {\r\n return TailDirection.leftSide\r\n } else {\r\n return TailDirection.noTail\r\n }\r\n}\r\n\r\ninterface IRenderCallout {\r\n context: any\r\n radius: number\r\n requiredTailHalfWidth: number\r\n tail: ITailCoordinates\r\n rectangleSides: IRectangleSidesCoordinates\r\n tailDirection: TailDirection\r\n}\r\n\r\nexport const renderCallout = ({\r\n context,\r\n radius,\r\n requiredTailHalfWidth,\r\n tail,\r\n rectangleSides,\r\n tailDirection,\r\n}: IRenderCallout): void => {\r\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\r\n const { tailTip, tailRoot } = tail\r\n\r\n // draw rounded rectangle from top left corner clockwise\r\n // !!! ORDER OF RENDER MATTERS !!!\r\n\r\n // renderTopLeftCorner\r\n if (tailDirection === TailDirection.topLeftCorner) {\r\n context.moveTo(leftTop.x, leftTop.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topLeft.x, topLeft.y)\r\n } else {\r\n context.moveTo(leftTop.x, leftTop.y)\r\n context.arcTo(leftTop.x, topLeft.y, topLeft.x, topLeft.y, radius)\r\n }\r\n\r\n // renderTopLine\r\n if (tailDirection === TailDirection.topSide) {\r\n const tailLineToTopLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)\r\n if (!tailLineToTopLineIntersection) {\r\n context.lineTo(topRight.x, topRight.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, topLeft, topRight)\r\n if (tailLineToTopLineIntersection.x - tailHalfWidth < topLeft.x) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topLeft.x + tailHalfWidth * 2, tailLineToTopLineIntersection.y)\r\n } else if (tailLineToTopLineIntersection.x + tailHalfWidth > topRight.x) {\r\n context.lineTo(topRight.x - tailHalfWidth * 2, tailLineToTopLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topRight.x, tailLineToTopLineIntersection.y)\r\n } else {\r\n context.lineTo(tailLineToTopLineIntersection.x - tailHalfWidth, tailLineToTopLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToTopLineIntersection.x + tailHalfWidth, tailLineToTopLineIntersection.y)\r\n context.lineTo(topRight.x, topRight.y)\r\n }\r\n } else {\r\n context.lineTo(topRight.x, topRight.y)\r\n }\r\n\r\n // renderTopRightCorner\r\n if (tailDirection === TailDirection.topRightCorner) {\r\n context.lineTo(topRight.x, topRight.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightTop.x, rightTop.y)\r\n } else {\r\n context.arcTo(rightTop.x, topRight.y, rightTop.x, rightTop.y, radius)\r\n }\r\n\r\n // renderRightLine\r\n if (tailDirection === TailDirection.rightSide) {\r\n const tailLineToRightLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)\r\n if (!tailLineToRightLineIntersection) {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, rightTop, rightBottom)\r\n if (tailLineToRightLineIntersection.y - tailHalfWidth < rightTop.y) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightTop.x, rightTop.y + tailHalfWidth * 2)\r\n } else if (tailLineToRightLineIntersection.y + tailHalfWidth > rightBottom.y) {\r\n context.lineTo(rightBottom.x, rightBottom.y - tailHalfWidth * 2)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n } else {\r\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y - tailHalfWidth)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y + tailHalfWidth)\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n }\r\n } else {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n }\r\n\r\n // renderBottomRightCorner\r\n if (tailDirection === TailDirection.bottomRightCorner) {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomRight.x, bottomRight.y)\r\n } else {\r\n context.arcTo(rightBottom.x, bottomRight.y, bottomRight.x, bottomRight.y, radius)\r\n }\r\n\r\n // renderBottomLine\r\n if (tailDirection === TailDirection.bottomSide) {\r\n const tailLineToBottomLineIntersection = math.twoSegmentLinesIntersection(\r\n tailTip,\r\n tailRoot,\r\n bottomLeft,\r\n bottomRight\r\n )\r\n if (!tailLineToBottomLineIntersection) {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, bottomLeft, bottomRight)\r\n if (tailLineToBottomLineIntersection.x + tailHalfWidth > bottomRight.x) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomRight.x - tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\r\n } else if (tailLineToBottomLineIntersection.x - tailHalfWidth < bottomLeft.x) {\r\n context.lineTo(bottomLeft.x + tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomLeft.x, tailLineToBottomLineIntersection.y)\r\n } else {\r\n context.lineTo(tailLineToBottomLineIntersection.x + tailHalfWidth, tailLineToBottomLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToBottomLineIntersection.x - tailHalfWidth, tailLineToBottomLineIntersection.y)\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n }\r\n } else {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n }\r\n\r\n // renderBottomLeftCorner\r\n if (tailDirection === TailDirection.bottomLeftCorner) {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftBottom.x, leftBottom.y)\r\n } else {\r\n context.arcTo(leftBottom.x, bottomLeft.y, leftBottom.x, leftBottom.y, radius)\r\n }\r\n\r\n // renderLeftLine\r\n if (tailDirection === TailDirection.leftSide) {\r\n const tailLineToLeftLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)\r\n if (!tailLineToLeftLineIntersection) {\r\n context.lineTo(leftTop.x, leftTop.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, leftTop, leftBottom)\r\n if (tailLineToLeftLineIntersection.y + tailHalfWidth > leftBottom.y) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftBottom.x, leftBottom.y - tailHalfWidth * 2)\r\n } else if (tailLineToLeftLineIntersection.y - tailHalfWidth < leftTop.y) {\r\n context.lineTo(leftTop.x, leftTop.y + tailHalfWidth * 2)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftTop.x, leftTop.y)\r\n } else {\r\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y + tailHalfWidth)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y - tailHalfWidth)\r\n context.lineTo(leftTop.x, leftTop.y)\r\n }\r\n } else {\r\n context.lineTo(leftTop.x, leftTop.y)\r\n }\r\n}\r\n","import merge from 'lodash.merge'\r\n\r\nimport { PaneArea, RequireByKey, ResizeByThumbWithTypeAndDifs, TextAttrs } from '../../../types/shared'\r\nimport { PADDING } from '../../constants/common'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport Chart from '../../models/chart'\r\nimport PaneModel from '../../models/pane'\r\nimport Text from '../text'\r\nimport Thumb from '../thumb'\r\nimport {\r\n getRectangleSidesCoordinates,\r\n getTailCoordinates,\r\n getTailToSideIntersection,\r\n renderCallout,\r\n} from './callout_utils'\r\n\r\nexport interface ICalloutAttrs {\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n}\r\n\r\ninterface FontFamilyHeightCoefficient {\r\n Arial: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n Verdana: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n}\r\n\r\ntype CalloutTextAttrs = ICalloutAttrs & RequireByKey\r\n\r\nclass Callout extends Text {\r\n static type = CanvasElementType.calloutV1\r\n\r\n name = 'Callout'\r\n\r\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\r\n declare isActualBoundingBoxAvailable: boolean\r\n declare lastAttrs: Attrs\r\n declare scaled: Pick\r\n declare measuredHeight: number\r\n declare font: string\r\n declare context?: CanvasRenderingContext2D\r\n declare lines: {\r\n text: string\r\n metrics: TextMetrics\r\n }[]\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'tail',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n getModalConfigBase() {\r\n return {\r\n inputs: [\r\n { type: 'multiline_string', name: 'text', required: true },\r\n { type: 'font', name: 'font' },\r\n {\r\n type: 'background',\r\n name: 'fillStyle',\r\n label: 'Color',\r\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n {\r\n type: 'background',\r\n name: 'background',\r\n label: 'Background',\r\n default: 'rgba(0,0,0,0)',\r\n },\r\n {\r\n type: 'border',\r\n name: 'border',\r\n min: 0,\r\n },\r\n ],\r\n }\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n text: '',\r\n font: {\r\n size: 15,\r\n family: 'Arial',\r\n style: 'normal',\r\n weight: 'normal',\r\n },\r\n fillStyle: ElementSettings.Colors.textWithoutBackground,\r\n lineHeight: 15,\r\n // left | right | center | start | end\r\n textAlign: 'left',\r\n // top | middle | alphabetic | bottom\r\n textBaseline: 'alphabetic',\r\n padding: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n background: ElementSettings.defaultFill,\r\n border: { color: ElementSettings.Colors.line, width: 1 },\r\n } as Partial\r\n }\r\n\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle)\r\n context.set('textAlign', this.attrs.textAlign)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n this.setupTextMetricsCache()\r\n }\r\n\r\n setupTextMetricsCache() {\r\n const ctx = this.context\r\n\r\n if (\r\n (this.attrs.text !== this.lastAttrs?.text ||\r\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)) &&\r\n ctx\r\n ) {\r\n this.lastAttrs = merge({}, this.attrs)\r\n this.lines = this.getLines().map((line) => ({\r\n text: line,\r\n metrics: ctx.measureText(line),\r\n }))\r\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\r\n const lineHeight =\r\n current.metrics.actualBoundingBoxAscent +\r\n current.metrics.actualBoundingBoxDescent +\r\n (currentIndex !== this.lines.length - 1 ? PADDING.S : 0)\r\n return acc + lineHeight\r\n }, 0)\r\n }\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n this.render(context)\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n renderText() {\r\n if (!this.context) return\r\n let y = this.scaled.y2 + this.attrs.padding.top\r\n let previousDescent = 0\r\n for (let i = 0; i < this.lines.length; i++) {\r\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.S\r\n this.context.fillText(this.lines[i].text, this.scaled.x2 + this.attrs.padding.left, y)\r\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\r\n }\r\n }\r\n\r\n getCalloutProperties() {\r\n const textWidth = this.attrs.text === '' ? this.attrs.font.size * 2 : this.width\r\n const requiredTailHalfWidth = this.attrs.font.size * 0.5\r\n const padding = this.attrs.border.width / 2 + this.attrs.font.size * 0.5\r\n const radius = textWidth < requiredTailHalfWidth ? textWidth / 2 : requiredTailHalfWidth\r\n\r\n const measuredHeight = this.measuredHeight < requiredTailHalfWidth ? radius * 2 : this.measuredHeight\r\n const y2 = this.scaled.y2 - (this.lines?.[0]?.metrics.actualBoundingBoxAscent || measuredHeight)\r\n\r\n // Points diagram\r\n //.......X-----------------X.......\r\n //.................................\r\n //...X.........................X...\r\n //...|.........................|...\r\n //...|.........................|...\r\n //...X.........................X...\r\n //.................................\r\n //.......X-----------------X.......\r\n\r\n const rectangleSides = getRectangleSidesCoordinates({\r\n padding,\r\n radius,\r\n x2: this.scaled.x2,\r\n y2,\r\n textWidth,\r\n measuredHeight,\r\n })\r\n const tail = getTailCoordinates({ rectangleSides, x1: this.scaled.x1, y1: this.scaled.y1 })\r\n const tailDirection = getTailToSideIntersection({ tail, rectangleSides })\r\n\r\n return {\r\n radius,\r\n requiredTailHalfWidth,\r\n rectangleSides,\r\n tail,\r\n tailDirection,\r\n }\r\n }\r\n\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n\r\n const { radius, requiredTailHalfWidth, tail, tailDirection, rectangleSides } = this.getCalloutProperties()\r\n\r\n this.context.beginPath()\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.lineJoin = 'round'\r\n renderCallout({\r\n context: this.context,\r\n radius,\r\n requiredTailHalfWidth,\r\n tail,\r\n rectangleSides,\r\n tailDirection,\r\n })\r\n this.context.closePath()\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle)\r\n this.renderBorder()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n // is in rectangle\r\n const { tail, rectangleSides, requiredTailHalfWidth } = this.getCalloutProperties()\r\n if (\r\n this.lines &&\r\n rectangleSides &&\r\n rectangleSides.leftTop.x < area.scaled.x &&\r\n rectangleSides.topLeft.y < area.scaled.y &&\r\n rectangleSides.rightBottom.x > area.scaled.x &&\r\n rectangleSides.bottomRight.y > area.scaled.y\r\n ) {\r\n return true\r\n }\r\n // is in tail\r\n if (tail) {\r\n const tailP1 = math.perpendicularPointToLine({\r\n distance: requiredTailHalfWidth,\r\n line: { x1: tail.tailTip.x, y1: tail.tailTip.y, x2: tail.tailRoot.x, y2: tail.tailRoot.y },\r\n })\r\n const pointOffsetX = tailP1.x - tail.tailRoot.x\r\n const pointOffsetY = tailP1.y - tail.tailRoot.y\r\n const tailP2 = { x: tail.tailRoot.x + -1 * pointOffsetX, y: tail.tailRoot.y + -1 * pointOffsetY }\r\n const polygon = [tail.tailTip, tailP1, tailP2]\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tail') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n }\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator() || !this.lines) {\r\n return true\r\n }\r\n\r\n const { tail, rectangleSides } = this.getCalloutProperties()\r\n\r\n return [...Object.values(rectangleSides), tail.tailRoot, tail.tailTip].some(\r\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\r\n )\r\n }\r\n}\r\n\r\nexport default Callout\r\n","import { Bezier } from 'bezier-js'\r\n\r\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ICurveAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n cp1x: number\r\n cp2x: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n cp1y: number\r\n cp2y: number\r\n border: DrawingBorder\r\n}\r\n\r\nclass Curve extends Element {\r\n static type = CanvasElementType.curve\r\n\r\n name = 'Curve'\r\n declare scaled: Pick\r\n declare curve: Bezier\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.render = this.render.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x3 || this.attrs.x2,\r\n () => this.attrs.y3 || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n drawQuadraticCurve(context: CanvasRenderingContext2D, curve: Bezier) {\r\n const { points } = curve\r\n context.beginPath()\r\n context.moveTo(points[0].x, points[0].y)\r\n context.quadraticCurveTo(points[1].x, points[1].y, points[2].x, points[2].y)\r\n context.stroke()\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if (!x3 || !y3) {\r\n context.beginPath()\r\n context.moveTo(x1, y1)\r\n context.lineTo(x2, y2)\r\n context.lineTo(x3, y3)\r\n context.stroke()\r\n } else {\r\n this.curve = Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5)\r\n this.drawQuadraticCurve(context, this.curve)\r\n }\r\n\r\n context.translate(-0.5, -0.5)\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.x3 += x\r\n this.attrs.cp1x += x\r\n this.attrs.cp2x += x\r\n\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n this.attrs.y3 += y\r\n this.attrs.cp1y += y\r\n this.attrs.cp2y += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'a':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'b':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'c':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (this.curve && this.curve.project(area.scaled).d! <= 10) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n if (!x3 || !y3) {\r\n return true\r\n }\r\n const isInView =\r\n Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5).points.some(\r\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\r\n ) ?? true\r\n\r\n return isInView\r\n }\r\n}\r\n\r\nCurve.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default Curve\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IEllipseAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n cp1x: number\r\n cp2x: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n cp1y: number\r\n cp2y: number\r\n width: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\ninterface ICoordinates {\r\n topCenterX: number\r\n topCenterY: number\r\n topRightX: number\r\n topRightY: number\r\n topLeftX: number\r\n topLeftY: number\r\n centerLeftX: number\r\n centerLeftY: number\r\n centerRightX: number\r\n centerRightY: number\r\n bottomCenterX: number\r\n bottomCenterY: number\r\n bottomLeftX: number\r\n bottomLeftY: number\r\n bottomRightX: number\r\n bottomRightY: number\r\n}\r\n\r\n// OLD Ellipse \"v0\" kept for backward-compatibiluty for old saved ideas\r\n// current Ellipse tool located in ellipse folder\r\nclass Ellipse extends Element {\r\n static type = CanvasElementType.ellipse\r\n\r\n name = 'Ellipse'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'x1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'x2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'lw',\r\n () => this.model.scale.x.invert(this.getCoordinates().centerLeftX),\r\n () => this.model.scale.y.invert(this.getCoordinates().centerLeftY),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rw',\r\n () => this.model.scale.x.invert(this.getCoordinates().centerRightX),\r\n () => this.model.scale.y.invert(this.getCoordinates().centerRightY),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n const boundingPointKeys = this.getBoundingPointKeys()\r\n this.scale({ x: [...boundingPointKeys.x, 'width'], y: boundingPointKeys.y })\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const c = this.getCoordinates()\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.beginPath()\r\n context.moveTo(c.bottomCenterX, c.bottomCenterY)\r\n context.bezierCurveTo(c.bottomRightX, c.bottomRightY, c.topRightX, c.topRightY, c.topCenterX, c.topCenterY)\r\n context.bezierCurveTo(c.topLeftX, c.topLeftY, c.bottomLeftX, c.bottomLeftY, c.bottomCenterX, c.bottomCenterY)\r\n context.closePath()\r\n context.fill()\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'x1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'x2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'lw':\r\n this.attrs.width += difX\r\n break\r\n case 'rw':\r\n this.attrs.width -= difX\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n getCoordinates(): ICoordinates {\r\n // TODO cache?\r\n // http://stackoverflow.com/questions/14169234/the-relation-of-the-bezier-curve-and-ellipse\r\n const rotationAngle =\r\n Math.PI + Math.atan(-1 / ((this.scaled.y2 - this.scaled.y1) / (this.scaled.x2 - this.scaled.x1)))\r\n\r\n const sign = this.scaled.y1 > this.scaled.y2 ? 1 : -1\r\n const radiusX = this.scaled.width / 2\r\n let radiusY = (sign * Math.abs(this.scaled.y1 - this.scaled.y2)) / Math.cos(rotationAngle) / 2\r\n if (this.scaled.y1 === this.scaled.y2) {\r\n radiusY = Math.abs(this.scaled.x1 - this.scaled.x2) / 2\r\n }\r\n\r\n const width_two_thirds = (radiusX * 4) / 3\r\n\r\n const dx1 = Math.sin(rotationAngle) * radiusY\r\n const dy1 = Math.cos(rotationAngle) * radiusY\r\n const dx2 = Math.cos(rotationAngle) * width_two_thirds\r\n const dy2 = Math.sin(rotationAngle) * width_two_thirds\r\n\r\n const x = this.scaled.x1 + dx1\r\n const y = this.scaled.y1 - dy1\r\n\r\n const topCenterX = x - dx1\r\n const topCenterY = y + dy1\r\n const topRightX = topCenterX + dx2\r\n const topRightY = topCenterY + dy2\r\n const topLeftX = topCenterX - dx2\r\n const topLeftY = topCenterY - dy2\r\n\r\n const bottomCenterX = x + dx1\r\n const bottomCenterY = y - dy1\r\n const bottomRightX = bottomCenterX + dx2\r\n const bottomRightY = bottomCenterY + dy2\r\n const bottomLeftX = bottomCenterX - dx2\r\n const bottomLeftY = bottomCenterY - dy2\r\n\r\n const centerRightX = x + dx2\r\n const centerRightY = y + dy2\r\n const centerLeftX = x - dx2\r\n const centerLeftY = y - dy2\r\n\r\n return {\r\n topCenterX,\r\n topCenterY,\r\n topRightX,\r\n topRightY,\r\n topLeftX,\r\n topLeftY,\r\n centerLeftX,\r\n centerLeftY,\r\n centerRightX,\r\n centerRightY,\r\n bottomCenterX,\r\n bottomCenterY,\r\n bottomLeftX,\r\n bottomLeftY,\r\n bottomRightX,\r\n bottomRightY,\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const c = this.getCoordinates()\r\n const left = Math.min(this.scaled.x1, this.scaled.x2, c.centerRightX)\r\n const right = Math.max(this.scaled.x1, this.scaled.x2, c.centerLeftX)\r\n const top = Math.min(this.scaled.y1, this.scaled.y2, c.centerRightY)\r\n const bottom = Math.max(this.scaled.y1, this.scaled.y2, c.centerLeftY)\r\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nEllipse.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Ellipse\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\ntype RotatedRectangleCoordiantes = [[number, number], [number, number], [number, number], [number, number]]\r\n\r\nexport interface IRotatedRectangleAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n height: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\n// OLD RotatedRectangle \"v0\" kept for backward-compatibiluty for old saved ideas\r\n// current RotatedRectangle tool located in rotated_rectangle folder\r\nclass RotatedRectangle extends Element {\r\n static type = CanvasElementType.rotatedRectangle\r\n\r\n name = 'Rotated rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n const x = this.model.scale.x.invert\r\n const y = this.model.scale.y.invert\r\n this._thumbs = [\r\n new Thumb(\r\n 'ml',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'mr',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tl',\r\n () => x(this.getRectCoordinates()[0][0]),\r\n () => y(this.getRectCoordinates()[0][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tr',\r\n () => x(this.getRectCoordinates()[1][0]),\r\n () => y(this.getRectCoordinates()[1][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bl',\r\n () => x(this.getRectCoordinates()[2][0]),\r\n () => y(this.getRectCoordinates()[2][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'br',\r\n () => x(this.getRectCoordinates()[3][0]),\r\n () => y(this.getRectCoordinates()[3][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n const boundingPointKeys = this.getBoundingPointKeys()\r\n this.scale({ x: [...boundingPointKeys.x, 'height'], y: boundingPointKeys.y })\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.beginPath()\r\n const coords = this.getRectCoordinates()\r\n for (const point of coords) {\r\n context.lineTo(point[0], point[1])\r\n }\r\n context.lineTo(coords[0][0], coords[0][1])\r\n context.fill()\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRectCoordinates(): RotatedRectangleCoordiantes {\r\n const mx1 = this.scaled.x1\r\n const mx2 = this.scaled.x2\r\n const my1 = this.scaled.y1\r\n const my2 = this.scaled.y2\r\n const { height } = this.scaled\r\n\r\n const k = (my2 - my1) / (mx2 - mx1)\r\n const nk = -1 / k\r\n\r\n const sign = my1 > my2 ? 1 : -1\r\n const dx = (sign * Math.sqrt((height * height) / (1 + nk * nk))) / 2\r\n const dy = nk * dx\r\n\r\n let x1 = mx1 - dx\r\n let y1 = my1 - dy\r\n let x2 = mx2 - dx\r\n let y2 = my2 - dy\r\n\r\n let x3 = mx2 + dx\r\n let y3 = my2 + dy\r\n let x4 = mx1 + dx\r\n let y4 = my1 + dy\r\n\r\n if (my1 === my2) {\r\n x1 = mx1\r\n y1 = my1 - height / 2\r\n x2 = mx2\r\n y2 = my2 - height / 2\r\n\r\n x3 = mx2\r\n y3 = my2 + height / 2\r\n x4 = mx1\r\n y4 = my1 + height / 2\r\n }\r\n\r\n return [\r\n [x1, y1],\r\n [x2, y2],\r\n [x3, y3],\r\n [x4, y4],\r\n ]\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'ml':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'mr':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'tl':\r\n case 'tr':\r\n this.attrs.height += difY\r\n break\r\n case 'bl':\r\n case 'br':\r\n this.attrs.height -= difY\r\n break\r\n default:\r\n return\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const coords = this.getRectCoordinates()\r\n const polygon = coords.map((c) => ({ x: c[0], y: c[1] }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nRotatedRectangle.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default RotatedRectangle\r\n","// TODO FontAwesome font or similar needs to be loaded before using Symbol\r\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ISymbolAttrs {\r\n x1: number\r\n scaleX: number\r\n y1: number\r\n scaleY: number\r\n angle: number\r\n fill: string\r\n symbol: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass SymbolElement extends Element {\r\n static type = CanvasElementType.symbol\r\n\r\n name = 'Symbol'\r\n\r\n declare textWidth: number\r\n declare textHeight: number\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n const sx = (sign: number) =>\r\n this.getRotatedCoordinates(this.scaled.x1 + sign * (this.textWidth / 2) * this.attrs.scaleX, this.scaled.y1)\r\n const sy = (sign: number) =>\r\n this.getRotatedCoordinates(this.scaled.x1, this.scaled.y1 + sign * (this.textHeight / 2) * this.attrs.scaleY)\r\n this._thumbs = [\r\n new Thumb(\r\n 'xr',\r\n () => this.model.scale.x.invert(sx(+1).x),\r\n () => this.model.scale.y.invert(sx(+1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'xl',\r\n () => this.model.scale.x.invert(sx(-1).x),\r\n () => this.model.scale.y.invert(sx(-1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'yt',\r\n () => this.model.scale.x.invert(sy(+1).x),\r\n () => this.model.scale.y.invert(sy(+1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'yb',\r\n () => this.model.scale.x.invert(sy(-1).x),\r\n () => this.model.scale.y.invert(sy(-1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.attrs.angle = this.attrs.angle || 0\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1'], y: ['y1'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('font', '36px FontAwesome')\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('textAlign', 'left')\r\n context.set('textBaseline', 'top')\r\n\r\n this.textWidth = context.measureText(this.attrs.symbol).width\r\n this.textHeight = 36\r\n const xScale = this.attrs.scaleX\r\n const yScale = this.attrs.scaleY\r\n\r\n const xOffset = this.textWidth / -2\r\n const yOffset = this.textHeight / -2\r\n\r\n context.save()\r\n context.translate(this.scaled.x1, this.scaled.y1)\r\n context.rotate(this.attrs.angle)\r\n context.scale(xScale, yScale)\r\n context.fillText(this.attrs.symbol, xOffset, yOffset)\r\n context.restore()\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRotatedCoordinates(x: number, y: number) {\r\n const cx = this.scaled.x1\r\n const cy = this.scaled.y1\r\n const dx = x - cx\r\n const dy = y - cy\r\n const rx = dx * Math.cos(this.attrs.angle) - dy * Math.sin(this.attrs.angle)\r\n const ry = dy * Math.cos(this.attrs.angle) + dx * Math.sin(this.attrs.angle)\r\n return { x: cx + rx, y: cy + ry }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n return (this.attrs.y1 += y)\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'xl':\r\n this.attrs.scaleX -= difX\r\n break\r\n case 'xr':\r\n this.attrs.scaleX += difX\r\n break\r\n case 'yt':\r\n this.attrs.scaleY -= difY\r\n break\r\n case 'yb':\r\n this.attrs.scaleY += difY\r\n break\r\n case 'c':\r\n this.attrs.angle += difX / 5\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const halfWidth = (this.textWidth / 2) * this.attrs.scaleX\r\n const halfHeight = (this.textHeight / 2) * this.attrs.scaleY\r\n const left = Math.min(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\r\n const right = Math.max(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\r\n const top = Math.min(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\r\n const bottom = Math.max(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\r\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nSymbolElement.prototype.defaults = { fill: 'rgba(0,0,0,1)' }\r\n\r\nSymbolElement.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill', label: 'Fill' }],\r\n}\r\n\r\nexport default SymbolElement\r\n","import { CanvasElementType } from '../constants/common'\r\nimport arrow from './arrow'\r\nimport brush_v1 from './brush/brush_v1'\r\nimport callout_v1 from './callout/callout_v1'\r\nimport curve from './curve'\r\nimport element from './element'\r\nimport elliottWaves from './elliott_waves/elliott_waves'\r\nimport ellipse from './ellipse'\r\nimport ellipse_v1 from './ellipse/ellipse_v1'\r\nimport fibonacci from './fibonacci_retracements'\r\nimport horizontalLine from './horizontal_line'\r\nimport line from './line'\r\nimport measure from './measure'\r\nimport pitchfork_v1 from './pitchfork/pitchfork_v1'\r\nimport polygon from './polygon'\r\nimport position from './position'\r\nimport rectangle from './rectangle'\r\nimport rotatedRectangle from './rotated_rectangle'\r\nimport rotatedRectangle_v1 from './rotated_rectangle/rotated_rectangle_v1'\r\nimport scaledLine from './scaled_line'\r\nimport scaledText from './scaled_text'\r\nimport symbolElement from './symbol'\r\nimport text from './text'\r\nimport triangle from './triangle'\r\nimport verticalLine from './vertical_line'\r\nimport xabcd from './xabcd'\r\n\r\nexport const drawingToolsByType = Object.freeze({\r\n [CanvasElementType.element]: element,\r\n [CanvasElementType.arrow]: arrow,\r\n [CanvasElementType.brushV1]: brush_v1,\r\n [CanvasElementType.calloutV1]: callout_v1,\r\n [CanvasElementType.curve]: curve,\r\n [CanvasElementType.elliottWaves]: elliottWaves,\r\n [CanvasElementType.ellipse]: ellipse,\r\n [CanvasElementType.ellipseV1]: ellipse_v1,\r\n [CanvasElementType.fibonacciRetracements]: fibonacci,\r\n [CanvasElementType.horizontalLine]: horizontalLine,\r\n [CanvasElementType.line]: line,\r\n [CanvasElementType.measure]: measure,\r\n [CanvasElementType.pitchforkV1]: pitchfork_v1,\r\n [CanvasElementType.polygon]: polygon,\r\n [CanvasElementType.position]: position,\r\n [CanvasElementType.rectangle]: rectangle,\r\n [CanvasElementType.rotatedRectangle]: rotatedRectangle,\r\n [CanvasElementType.rotatedRectangleV1]: rotatedRectangle_v1,\r\n [CanvasElementType.scaledLine]: scaledLine,\r\n [CanvasElementType.scaledText]: scaledText,\r\n [CanvasElementType.symbol]: symbolElement,\r\n [CanvasElementType.text]: text,\r\n [CanvasElementType.triangle]: triangle,\r\n [CanvasElementType.verticalLine]: verticalLine,\r\n [CanvasElementType.xabcd]: xabcd,\r\n})\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\nimport mergewith from 'lodash.mergewith'\r\nimport omit from 'lodash.omit'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n ObjectHash,\r\n PaneArea,\r\n RequireByKey,\r\n TodoObjectHashAnyType,\r\n} from '../../types/shared'\r\nimport Thumb from '../canvas/thumb'\r\nimport {\r\n CanvasElementType,\r\n ChartElementType,\r\n ChartEventType,\r\n IVisibility,\r\n IndicatorType,\r\n MacroTimeframe,\r\n MicroMacroTimeframe,\r\n OverlayType,\r\n SetVisibilityTo,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport { isInRange } from '../utils/helpers'\r\n\r\nexport type TodoModalConfig = TodoObjectHashAnyType\r\ntype TodoPositionTimestamps = TodoObjectHashAnyType\r\n\r\nexport interface DefaultAttrs extends ObjectHash {\r\n positionTimestamps?: TodoPositionTimestamps\r\n visibility?: IVisibility\r\n}\r\n\r\nexport type EdgeValues = { minX?: number; maxX?: number; minY?: number; maxY?: number }\r\n\r\nclass Element extends Spine.Module {\r\n static type: CanvasElementType | OverlayType | ChartElementType | IndicatorType | ChartEventType =\r\n CanvasElementType.element\r\n\r\n static fromObject(obj: T['attrs'], model: T['model']) {\r\n return new this(obj, model) as T\r\n }\r\n\r\n static getNumOfBarsBuffer(\r\n _?: RequireByKey | RequireByKey\r\n ) {\r\n return 0\r\n }\r\n\r\n isCreator = false\r\n isCreatorDialogOpen = false\r\n attrs: Attrs = {} as Attrs\r\n\r\n model: any\r\n _thumbs: Thumb[]\r\n\r\n getDefaults?(): Partial\r\n renderCross?(ctx: RenderingContext2DType): void\r\n renderCrossText?(\r\n ctx: RenderingContext2DType,\r\n crossIndex: number,\r\n getDataByCrossIndex?: (key: keyof Quote, shouldReturnRoundedString?: boolean) => string | undefined\r\n ): void\r\n\r\n renderContent?(ctx: RenderingContext2DType): void\r\n renderGrid?(ctx: RenderingContext2DType): void\r\n renderLabels?(ctx: RenderingContext2DType): void\r\n declare defaults?: Partial\r\n getModalConfigBase?(): TodoModalConfig\r\n declare modalConfig?: TodoModalConfig\r\n getMinMax?(): { min: number; max: number }\r\n setupAxis?(fx: ScaleAxis): void | { min: number; max: number }\r\n\r\n activeThumb: Thumb | null = null\r\n isMouseDown = false\r\n isSelected = false\r\n isHovered = false\r\n isEditInProgress = false\r\n edgeXYValues: EdgeValues | null = null\r\n declare scaled?: ObjectHash | Partial\r\n\r\n declare toolsCallback: () => void\r\n\r\n constructor(values: Partial, model: Model) {\r\n super(values, model)\r\n this.model = model\r\n if (this.getDefaults) {\r\n this.set(this.getDefaults() || {})\r\n } else {\r\n this.set(this.defaults || {})\r\n }\r\n this.set(values)\r\n this._thumbs = []\r\n\r\n this.onMouseDown = this.onMouseDown.bind(this)\r\n this.onMouseMove = this.onMouseMove.bind(this)\r\n this.onMouseUp = this.onMouseUp.bind(this)\r\n this.bind('mousedown', this.onMouseDown)\r\n this.bind('mousemove', this.onMouseMove)\r\n this.bind('mouseup', this.onMouseUp)\r\n this.bind('change', () => {\r\n // elements is optional because this.model is not Pane in all usecases, e.g. base_chart extends this element and sets Chart as model\r\n const element = this.getIsChartEvent()\r\n ? this.model.chartEvents?.()?.findByAttribute('instance', this)\r\n : this.model.elements?.()?.findByAttribute('instance', this)\r\n\r\n element?.trigger('change', element)\r\n })\r\n }\r\n\r\n get type() {\r\n return (this.constructor as typeof Element).type\r\n }\r\n\r\n getThumbs() {\r\n return this._thumbs\r\n }\r\n\r\n moveBy(_: number, __: number) {}\r\n\r\n setIsSelected(isSelected: boolean) {\r\n this.isSelected = isSelected\r\n this.trigger('change')\r\n }\r\n\r\n setIsHovered(isHovered: boolean) {\r\n this.isHovered = isHovered\r\n this.trigger('change')\r\n }\r\n\r\n getShouldRenderThumbs() {\r\n return this.isSelected || this.isHovered\r\n }\r\n\r\n getIsPaneSelection(): boolean {\r\n const paneModel = this.model.elements().findByAttribute('instance', this)?.pane() as PaneModel | undefined\r\n return paneModel?.selection === this\r\n }\r\n\r\n set(obj: Partial) {\r\n const attrsSubset = Object.keys(obj).reduce(\r\n (acc, key) => ({ ...acc, [key]: this.attrs[key] }),\r\n {} as Partial\r\n )\r\n if (JSON.stringify(obj) !== JSON.stringify(attrsSubset)) {\r\n const customizer = (objValue: Partial, srcValue: Partial, key: keyof Attrs) => {\r\n if (this.getIsDrawing() && key === 'visibility') {\r\n return srcValue ?? {}\r\n }\r\n }\r\n mergewith(this.attrs, obj, customizer)\r\n if (this.getIsPaneSelection() && !this.getIsCreator()) {\r\n this.cachePointPositionTimestamp()\r\n }\r\n this.trigger('change', this)\r\n }\r\n this.edgeXYValues = null\r\n return this\r\n }\r\n\r\n get(key: T) {\r\n return this.attrs[key]\r\n }\r\n\r\n getBoundingPointKeys = (): { x: string[]; y: string[] } | void => {}\r\n\r\n fx = (x: number) => this.model.scale.x(x)\r\n\r\n fy = (y: number) => this.model.scale.y(y)\r\n\r\n scale({ x, y }: { x: string[]; y: string[] }) {\r\n this.scaled = {}\r\n x.forEach((el) => {\r\n Object.defineProperty(this.scaled, el, {\r\n get: () => this.fx(this.attrs[el]),\r\n })\r\n })\r\n\r\n y.forEach((el) => {\r\n Object.defineProperty(this.scaled, el, {\r\n get: () => this.fy(this.attrs[el]),\r\n })\r\n })\r\n }\r\n\r\n render(_: RenderingContext2DType) {}\r\n\r\n renderThumbs(context: CanvasRenderingContext2D) {\r\n const isHoveredThumbStyle = this.isHovered && !this.isSelected\r\n if (isHoveredThumbStyle) {\r\n context.globalAlpha = 0.5\r\n }\r\n this.getThumbs().map((thumb) => thumb.render(context))\r\n context.globalAlpha = 1\r\n }\r\n\r\n onMouseDown(area: PaneArea) {\r\n this.isMouseDown = true\r\n this.isEditInProgress = true\r\n for (const thumb of this.getThumbs()) {\r\n if (thumb.isInArea(area)) {\r\n this.activeThumb = thumb\r\n this.activeThumb.startEditing(area)\r\n return\r\n }\r\n }\r\n }\r\n\r\n onMouseMove(area: PaneArea) {\r\n if (!area.mouseDown) {\r\n return\r\n }\r\n if (this.activeThumb != null) {\r\n this.activeThumb.moveTo(area)\r\n this.trigger('change')\r\n }\r\n }\r\n\r\n onMouseUp(_?: PaneArea) {\r\n this.isMouseDown = false\r\n this.isEditInProgress = false\r\n this.activeThumb = null\r\n if (!this.getIsCreator() && !this.getIsChartEvent()) {\r\n this.cachePointPositionTimestamp()\r\n }\r\n this.trigger('change', this)\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart().quote()\r\n if (quote) {\r\n const { x: xPointKeys } = this.getBoundingPointKeys()!\r\n const positionTimestamps = xPointKeys.reduce((acc, key) => {\r\n const positionX = this.attrs[key]\r\n const timeStamp = positionX && quote.getTimestampFomPositionX(positionX)\r\n return {\r\n ...acc,\r\n [key]: timeStamp,\r\n }\r\n }, {}) as TodoPositionTimestamps\r\n this.set({ positionTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionTimestamps } = this.attrs\r\n if (!quote || !positionTimestamps) {\r\n // positionTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const pointPoitionsFromTimestamp = Object.entries(positionTimestamps).reduce(\r\n (acc, [key, timestamp]) => ({\r\n ...acc,\r\n [key]: timestamp && quote.getPositionXFromTimestamp(timestamp),\r\n }),\r\n {}\r\n )\r\n this.set(pointPoitionsFromTimestamp)\r\n }\r\n\r\n thumbsAreInArea(area: PaneArea) {\r\n for (const thumb of this.getThumbs()) {\r\n if (thumb.isInArea(area)) {\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n isDrawingElementLockedOrInvisible() {\r\n return this.model.chart().chart_layout().isLockDrawingsActive || !this.getIsVisible()\r\n }\r\n\r\n getModalConfig() {\r\n let config\r\n if (this.getModalConfigBase) {\r\n config = merge({}, this.getModalConfigBase())\r\n } else {\r\n config = merge({}, this.modalConfig)\r\n }\r\n if (this.getIsDrawing()) {\r\n config.inputs.push({ type: 'visibility', name: 'visibility', label: 'Visibility' })\r\n }\r\n if (config.title == null) {\r\n config.title = this.name\r\n }\r\n for (const input of config.inputs) {\r\n if (input.default != null) {\r\n input.value = input.default\r\n }\r\n if (this.attrs[input.name] != null) {\r\n input.value = this.attrs[input.name]\r\n }\r\n }\r\n return config\r\n }\r\n\r\n toObject() {\r\n return merge({}, this.attrs, { type: this.type })\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return this.toObject()\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return this.attrs.positionTimestamps ? Object.keys(this.attrs.positionTimestamps) : []\r\n }\r\n\r\n toAutosaveConfig() {\r\n // We don't want to save attrs which are stored in \"position timestamps\" because they are relative to timeframe for example\r\n // so in order to keep drawings in sync across different timeframes we can't rely on its position but we have to rely on \"position timestamps\" and then call updateScales to calculate correct positions for given timeframe\r\n return omit(this.toConfig(), this.getAutosaveOmittedProperties()) as Partial\r\n }\r\n\r\n replaceMyself(element: Element) {\r\n setTimeout(() => {\r\n element.cachePointPositionTimestamp()\r\n const el = this.model.elements().findByAttribute('instance', this)\r\n if (!el) {\r\n // Temporary code below\r\n // additional info gaining for https://finvizcom.sentry.io/issues/3990343438/events/e87ce8b4108341cf81f15ec78707c65e/?project=33153&query=is%3Aunresolved+Cannot+read+properties+of+undefined&referrer=previous-event&statsPeriod=14d&stream_index=0\r\n window.Sentry?.captureMessage('element.ts replaceMyself', {\r\n extra: {\r\n oldElement: {\r\n type: this?.type,\r\n isCreator: this?.isCreator,\r\n isMouseDown: this?.isMouseDown,\r\n isSelected: this?.isSelected,\r\n isHovered: this?.isHovered,\r\n isEditInProgress: this?.isEditInProgress,\r\n },\r\n newElement: {\r\n type: element?.type,\r\n isCreator: element?.isCreator,\r\n isMouseDown: element?.isMouseDown,\r\n isSelected: element?.isSelected,\r\n isHovered: element?.isHovered,\r\n isEditInProgress: element?.isEditInProgress,\r\n },\r\n },\r\n })\r\n } else {\r\n el.replace(element)\r\n }\r\n })\r\n }\r\n\r\n toString() {\r\n return this.name\r\n }\r\n\r\n getIsCreator() {\r\n return this.isCreator\r\n }\r\n\r\n getIsCreatorDialogOpen() {\r\n return this.isCreatorDialogOpen\r\n }\r\n\r\n release() {\r\n this.cachePointPositionTimestamp()\r\n this.unbind()\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart().chart_layout())\r\n }\r\n\r\n getIsDrawing() {\r\n return !!this.type.startsWith('canvas/')\r\n }\r\n\r\n getIsChartEvent() {\r\n return !!this?.type.startsWith('chartEvent/')\r\n }\r\n\r\n getIsVisible() {\r\n const { micro, macro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\r\n const visibility = this.attrs.visibility?.[macro]\r\n\r\n // this.attrs.visibility.minutes === undefined: drawing visible on any minutes timeframe\r\n if (visibility === undefined) return true\r\n // this.attrs.visibility.minutes === {}: drawing invisible on any minutes timeframe\r\n if (Object.keys(visibility).length === 0) return false\r\n // this.attrs.visibility.minutes === {from: 5, to: 15}: drawing visible on minutes TF between 5 & 15 interval\r\n return isInRange({ value: micro, min: visibility.from, max: visibility.to })\r\n }\r\n\r\n setVisibilityTo(setTo: SetVisibilityTo) {\r\n const { macro, micro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\r\n const currentIndex = Object.keys(MacroTimeframe).indexOf(macro)\r\n\r\n let timeframesToSet: string[] = []\r\n let attrsToSet: { from?: number; to?: number } = {}\r\n\r\n switch (setTo) {\r\n case SetVisibilityTo.currentAndAbove: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index < currentIndex)\r\n attrsToSet = { from: micro }\r\n break\r\n }\r\n case SetVisibilityTo.currentAndBelow: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index > currentIndex)\r\n attrsToSet = { to: micro }\r\n break\r\n }\r\n case SetVisibilityTo.currentOnly: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index !== currentIndex)\r\n attrsToSet = { from: micro, to: micro }\r\n break\r\n }\r\n case SetVisibilityTo.all:\r\n default: {\r\n this.set({ visibility: {} } as Partial)\r\n return\r\n }\r\n }\r\n\r\n this.set({\r\n visibility: Object.assign({}, ...timeframesToSet.map((item) => ({ [item]: {} })), { [macro]: attrsToSet }),\r\n } as Partial)\r\n }\r\n\r\n getEdgeXYValues() {\r\n const { x: xPoints, y: yPoints } = this.getBoundingPointKeys() ?? {}\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n xPoints?.forEach((key) => {\r\n const positionX = this.attrs[key]\r\n if (positionX !== undefined) {\r\n edgeXYValues.minX = Math.min(positionX, edgeXYValues.minX ?? positionX)\r\n edgeXYValues.maxX = Math.max(positionX, edgeXYValues.maxX ?? positionX)\r\n }\r\n })\r\n yPoints?.forEach((key) => {\r\n const positionY = this.attrs[key]\r\n if (positionY !== undefined) {\r\n edgeXYValues.minY = Math.min(positionY, edgeXYValues.minY ?? positionY)\r\n edgeXYValues.maxY = Math.max(positionY, edgeXYValues.maxY ?? positionY)\r\n }\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n\r\n getIsInChartView(chart: Chart, options?: { omitX?: boolean; omitY?: boolean }) {\r\n const { minX, maxX, minY, maxY } = this.getEdgeXYValues()\r\n\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n if (!options?.omitX) {\r\n const isMaxXInvalid = maxX === undefined || isNaN(maxX)\r\n const isMinXInvalid = minX === undefined || isNaN(minX)\r\n if (\r\n !isMaxXInvalid &&\r\n !isMinXInvalid &&\r\n !(this.fx(maxX) >= -chart.leftOffset && this.fx(minX) <= -chart.leftOffset + chart.width)\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if (!options?.omitY) {\r\n if (minY === undefined || maxY === undefined) {\r\n return true\r\n }\r\n\r\n const topBound = this.model.scale.y.invert(0)\r\n const bottomBound = this.model.scale.y.invert(this.model.height)\r\n return topBound >= minY && bottomBound <= maxY\r\n }\r\n\r\n // If all checks fall through, render element\r\n return true\r\n }\r\n}\r\n\r\nexport default Element\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../../constants/common'\r\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport Element from '../element'\r\nimport Text from '../text'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IElliottWavesAttrs {\r\n waves: Array<{ x: number; y: number }>\r\n positionWavesTimestamps?: Array<{ x: number; y: number }>\r\n border: DrawingBorder\r\n}\r\n\r\nclass ElliottWaves extends Element {\r\n static type = CanvasElementType.elliottWaves\r\n\r\n name = 'Elliott Wave'\r\n waves = ['', 'I', 'II', 'III', 'IV', 'V']\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 2,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n context.moveTo(Math.round(this.fx(this.attrs.waves[0].x)), Math.round(this.fy(this.attrs.waves[0].y)))\r\n for (const p of this.attrs.waves.slice(1)) {\r\n context.lineTo(Math.round(this.fx(p.x)), Math.round(this.fy(p.y)))\r\n }\r\n context.stroke()\r\n context.translate(offset * -1, offset * -1)\r\n\r\n const text = new Text(\r\n {\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.center,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n this.model\r\n )\r\n for (let i = 0; i < this.attrs.waves.length; i++) {\r\n let y\r\n const p = this.attrs.waves[i]\r\n if (i > 0 && this.attrs.waves[i - 1].y > p.y) {\r\n y = this.fy(p.y) + 8\r\n } else {\r\n y = this.fy(p.y) - 8\r\n }\r\n text.set({ text: this.waves[i], x: this.fx(p.x), y })\r\n text.render(context)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n return this.attrs.waves.map(\r\n (wave, index) =>\r\n new Thumb(\r\n `${index}`,\r\n () => wave.x,\r\n () => wave.y,\r\n this.resize,\r\n this.model\r\n )\r\n )\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart().quote()\r\n if (quote) {\r\n const positionWavesTimestamps = this.attrs.waves.map((wave) => ({\r\n ...wave,\r\n x: quote.getTimestampFomPositionX(wave.x),\r\n }))\r\n\r\n this.set({ positionWavesTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionWavesTimestamps } = this.attrs\r\n if (!quote || !positionWavesTimestamps) {\r\n // positionWavesTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const waves = positionWavesTimestamps.map((wave) => ({\r\n ...wave,\r\n x: quote.getPositionXFromTimestamp(wave.x),\r\n }))\r\n this.set({ waves } as Partial)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const point of this.attrs.waves) {\r\n point.x += x\r\n point.y += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n this.attrs.waves[+type].x += difX\r\n this.attrs.waves[+type].y += difY\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const waves = this.attrs.waves\r\n for (let i = 0; i < waves.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: this.fx(waves[i].x),\r\n y1: this.fy(waves[i].y),\r\n x2: this.fx(waves[i + 1].x),\r\n y2: this.fy(waves[i + 1].y),\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['waves']\r\n }\r\n}\r\n\r\nElliottWaves.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default ElliottWaves\r\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IEllipseAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n cursorTargetX: number\r\n cursorTargetY: number\r\n\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\ninterface Coordinates {\r\n P1: Point\r\n P2: Point\r\n P3: Point\r\n P4: Point\r\n CP1: Point\r\n CP2: Point\r\n CP3: Point\r\n CP4: Point\r\n}\r\n\r\nclass EllipseV1 extends Element {\r\n static type = CanvasElementType.ellipseV1\r\n\r\n name = 'Ellipse'\r\n\r\n untranslatedContext: CanvasRenderingContext2D | null = null\r\n declare ellipsePath: Path2D\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\r\n this._thumbs = [\r\n new Thumb(\r\n 'left',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'right',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'top',\r\n () => this.getEllipsePoints(true).P2.x || this.attrs.x1,\r\n () => this.getEllipsePoints(true).P2.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottom',\r\n () => this.getEllipsePoints(true).P4.x || this.attrs.x2,\r\n () => this.getEllipsePoints(true).P4.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const coordinates = this.getEllipsePoints() as Coordinates\r\n const ellipse = new Path2D()\r\n context.set('fillStyle', this.attrs.fill)\r\n context.beginPath()\r\n if (coordinates.P2.x === coordinates.P3.x || coordinates.P2.y === coordinates.P3.y) {\r\n ellipse.lineTo(coordinates.P1.x, coordinates.P1.y)\r\n ellipse.lineTo(coordinates.P2.x, coordinates.P2.y)\r\n } else {\r\n ellipse.moveTo(coordinates.P4.x, coordinates.P4.y)\r\n ellipse.bezierCurveTo(\r\n coordinates.CP4.x,\r\n coordinates.CP4.y,\r\n coordinates.CP1.x,\r\n coordinates.CP1.y,\r\n coordinates.P2.x,\r\n coordinates.P2.y\r\n )\r\n ellipse.bezierCurveTo(\r\n coordinates.CP2.x,\r\n coordinates.CP2.y,\r\n coordinates.CP3.x,\r\n coordinates.CP3.y,\r\n coordinates.P4.x,\r\n coordinates.P4.y\r\n )\r\n ellipse.closePath()\r\n this.ellipsePath = ellipse\r\n context.fill(ellipse)\r\n }\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n context.stroke(ellipse)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getEllipsePoints(inverted = false) {\r\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\r\n\r\n const P1 = { x: x2, y: y2 }\r\n const P3 = { x: x1, y: y1 }\r\n\r\n let perpendicularPoint\r\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\r\n const cursor = { x: cursorTargetX, y: cursorTargetY }\r\n const line = { x1, y1, x2, y2 }\r\n const distance = math.distanceToLine(cursor, line)\r\n perpendicularPoint = math.perpendicularPointToLine({\r\n distance,\r\n line,\r\n })\r\n } else {\r\n return {\r\n P1: P3,\r\n P2: P1,\r\n P3: P1,\r\n P4: P3,\r\n }\r\n }\r\n\r\n const lineCenterX = (P1.x + P3.x) / 2\r\n const lineCenterY = (P1.y + P3.y) / 2\r\n const pointOffsetX = perpendicularPoint.x - P1.x\r\n const pointOffsetY = perpendicularPoint.y - P1.y\r\n\r\n const P2 = { x: lineCenterX + pointOffsetX, y: lineCenterY + pointOffsetY }\r\n const P4 = { x: lineCenterX + -1 * pointOffsetX, y: lineCenterY + -1 * pointOffsetY }\r\n const invertX = this.model.scale.x.invert\r\n const invertY = this.model.scale.y.invert\r\n if (inverted) {\r\n return {\r\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\r\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\r\n }\r\n }\r\n\r\n const perpendicularPointEllipseOffsetX = (perpendicularPoint.x - P2.x) / 0.75 - (perpendicularPoint.x - P2.x)\r\n const perpendicularPointEllipseOffsetY = (perpendicularPoint.y - P2.y) / 0.75 - (perpendicularPoint.y - P2.y)\r\n\r\n const P1WithOffsetX = P1.x + perpendicularPointEllipseOffsetX\r\n const P1WithOffsetY = P1.y + perpendicularPointEllipseOffsetY\r\n\r\n const P3WithOffsetX = P3.x - perpendicularPointEllipseOffsetX\r\n const P3WithOffsetY = P3.y - perpendicularPointEllipseOffsetY\r\n\r\n const CP1 = {\r\n x: perpendicularPoint.x + perpendicularPointEllipseOffsetX,\r\n y: perpendicularPoint.y + perpendicularPointEllipseOffsetY,\r\n }\r\n const controlPointOffsetX = CP1.x - P1WithOffsetX\r\n const controlPointOffsetY = CP1.y - P1WithOffsetY\r\n\r\n const CP2 = { x: P3WithOffsetX + controlPointOffsetX, y: P3WithOffsetY + controlPointOffsetY }\r\n const CP3 = { x: P3WithOffsetX + -1 * controlPointOffsetX, y: P3WithOffsetY + -1 * controlPointOffsetY }\r\n const CP4 = { x: P1WithOffsetX + -1 * controlPointOffsetX, y: P1WithOffsetY + -1 * controlPointOffsetY }\r\n\r\n return {\r\n P1,\r\n P2,\r\n P3,\r\n P4,\r\n CP1,\r\n CP2,\r\n CP3,\r\n CP4,\r\n }\r\n }\r\n\r\n getRotatedPointCoordinates = ({\r\n rotationAxisPoint,\r\n pointToRotate,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n rotationAxisPoint: { x: number; y: number }\r\n pointToRotate: { x: number; y: number }\r\n oldLinePoint: { x: number; y: number }\r\n newLinePoint: { x: number; y: number }\r\n }) => {\r\n const angle = math.sharedPointLinesAngle({\r\n sharedPoint: rotationAxisPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n })\r\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n })\r\n return {\r\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\r\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.cursorTargetX += x\r\n this.attrs.cursorTargetY += y\r\n }\r\n\r\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'left':\r\n const newLeftPoint = {\r\n x: this.attrs.x1 + difX,\r\n y: this.attrs.y1 + difY,\r\n }\r\n const leftRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n newLinePoint: { x: this.model.scale.x(newLeftPoint.x), y: this.model.scale.y(newLeftPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x1: newLeftPoint.x,\r\n y1: newLeftPoint.y,\r\n cursorTargetX: leftRotatedCursorPoint.x,\r\n cursorTargetY: leftRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'right':\r\n const newRightPoint = {\r\n x: this.attrs.x2 + difX,\r\n y: this.attrs.y2 + difY,\r\n }\r\n const rightRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n newLinePoint: { x: this.model.scale.x(newRightPoint.x), y: this.model.scale.y(newRightPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x2: newRightPoint.x,\r\n y2: newRightPoint.y,\r\n cursorTargetX: rightRotatedCursorPoint.x,\r\n cursorTargetY: rightRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'top':\r\n case 'bottom':\r\n this.attrs = {\r\n ...this.attrs,\r\n cursorTargetX: area.x,\r\n cursorTargetY: area.y,\r\n }\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (this.ellipsePath && this.untranslatedContext?.isPointInPath(this.ellipsePath, area.scaled.x, area.scaled.y)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nEllipseV1.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default EllipseV1\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ntype Coefficients = string\r\n\r\nexport interface IFibonacciRetracementsAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n coefficients: Coefficients\r\n border: DrawingBorder\r\n}\r\n\r\nclass FibonacciRetracements<\r\n Attrs extends IFibonacciRetracementsAttrs = IFibonacciRetracementsAttrs,\r\n> extends Element {\r\n static type = CanvasElementType.fibonacciRetracements\r\n\r\n name = 'Fibonacci Retracements'\r\n declare coefficients: { default: string; parsed: number[]; max: number }\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'oneCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'oneCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'zeroCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'zeroCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.parseCoefficients(this.attrs.coefficients)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n coefficients: [0, 0.236, 0.382, 0.5, 0.618, 1].toString(),\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n parseCoefficients(coefficients: Coefficients) {\r\n if (!this.coefficients || coefficients !== this.coefficients.default) {\r\n const parsed = coefficients.split(',').map((x) => parseFloat(x.trim()))\r\n this.coefficients = { default: coefficients, parsed, max: Math.max(...parsed) }\r\n }\r\n }\r\n\r\n getMaxCoefficientUnscaledY() {\r\n return this.model.scale.y.invert(this.scaled.y2 - this.coefficients.max * (this.scaled.y2 - this.scaled.y1))\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY, y2: roundedXY.y1 })\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n this.parseCoefficients(this.attrs.coefficients)\r\n\r\n const height = this.attrs.y2 - this.attrs.y1\r\n const heightScaled = roundedXY.y2 - roundedXY.y1\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n for (const p of this.coefficients.parsed) {\r\n context.moveTo(roundedXY.x1, Math.round(y2 - p * heightScaled))\r\n context.lineTo(roundedXY.x2, Math.round(y2 - p * heightScaled))\r\n }\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n const text = new Text(\r\n {\r\n x: roundedXY.x1,\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: TextBaseline.bottom,\r\n fillStyle: this.attrs.border.color,\r\n textAlign: TextAlign.left,\r\n },\r\n this.model\r\n )\r\n if (roundedXY.x1 > roundedXY.x2) {\r\n text.set({ textAlign: TextAlign.right })\r\n }\r\n\r\n for (const p of this.coefficients.parsed) {\r\n const y = this.attrs.y2 - p * height\r\n text.set({\r\n text: (p * 100).toFixed(1) + '%: ' + y.toFixed(2),\r\n y: Math.round(this.fy(y) - this.attrs.border.width / 2),\r\n } as Partial)\r\n text.render(context)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n if (this.coefficients.max > 1 && this._thumbs.length < 6) {\r\n this._thumbs = [\r\n ...this._thumbs,\r\n new Thumb(\r\n 'maxCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.getMaxCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'maxCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.getMaxCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n if (this.coefficients.max <= 1 && this._thumbs.length > 4) {\r\n this._thumbs.splice(4)\r\n }\r\n\r\n return this._thumbs\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'oneCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'oneCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'zeroCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'zeroCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'maxCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY / this.coefficients.max\r\n break\r\n case 'maxCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y1 += difY / this.coefficients.max\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const maxCoefficientY = this.coefficients.max > 1 && this.getMaxCoefficientUnscaledY()\r\n const left = Math.min(this.attrs.x1, this.attrs.x2)\r\n const right = Math.max(this.attrs.x1, this.attrs.x2)\r\n const top = maxCoefficientY\r\n ? Math.min(this.attrs.y1, this.attrs.y2, maxCoefficientY)\r\n : Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = maxCoefficientY\r\n ? Math.max(this.attrs.y1, this.attrs.y2, maxCoefficientY)\r\n : Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nFibonacciRetracements.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'border' },\r\n { type: 'string', name: 'coefficients', label: 'Coefficients' },\r\n ],\r\n}\r\n\r\nexport default FibonacciRetracements\r\n","import { Maybe, RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\r\nimport Text from './text'\r\n\r\nconst DEFAULT_DECIMAL_PLACES = 2\r\n\r\nclass HorizontalLine extends ScaledLine {\r\n static type = CanvasElementType.horizontalLine\r\n\r\n name = 'Horizontal line'\r\n decimalPlaces = DEFAULT_DECIMAL_PLACES\r\n declare scaled: Pick\r\n declare model: PaneModel\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.updateDecimalPlaces()\r\n\r\n if (this.attrs.y1) {\r\n this.attrs.y1 = Number(math.round({ value: this.attrs.y1, overridePlaces: this.decimalPlaces }))\r\n }\r\n if (this.modalConfig) {\r\n const step = `0.${'0'.repeat(this.decimalPlaces - 1)}1`\r\n this.modalConfig.inputs[1] = {\r\n ...this.modalConfig.inputs[1],\r\n step,\r\n min: Number(step),\r\n }\r\n }\r\n this.renderContent = this.renderContent.bind(this)\r\n this._thumbs = []\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n updateDecimalPlaces() {\r\n const quote = this.model.chart().quote()\r\n this.decimalPlaces = quote\r\n ? math.getInstrumentDecimalPlaces({\r\n instrument: quote.instrument,\r\n value: quote.lastClose,\r\n })\r\n : DEFAULT_DECIMAL_PLACES\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n this.attrs.y2 = this.attrs.y1\r\n // mixing scaled and unscaled values, do not copy paste as solution\r\n this.attrs.x1 = ChartSettings.left.width * -1\r\n this.attrs.x2 =\r\n this.model\r\n .chart()\r\n .quote()\r\n .getBarIndex(this.model.chart().quote().close.length - 1) + this.model.chart().width\r\n super.renderContent(context)\r\n }\r\n\r\n renderLabels(context: CanvasRenderingContext2D) {\r\n if (this.attrs.y1) {\r\n this.updateDecimalPlaces()\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const isIndicatorPane = this.model\r\n .elements()\r\n .all()\r\n .some((element) => element.isIndicator())\r\n const settings = isIndicatorPane ? IndicatorSettings : ChartSettings\r\n context.translate(this.model.chart().width - settings.right.width, settings.top.height)\r\n new Text(\r\n {\r\n x: 6,\r\n y: this.scaled.y1,\r\n font: { size: 8, style: 'bold' },\r\n lineHeight: 8,\r\n padding: {\r\n top: 2,\r\n right: 2,\r\n bottom: 2,\r\n left: 2,\r\n },\r\n fillStyle: '#fff',\r\n background: '#000',\r\n textBaseline: TextBaseline.middle,\r\n text: this.attrs.y1.toFixed(this.decimalPlaces).toString(),\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n }\r\n\r\n moveBy(x: Maybe, y: number) {\r\n this.attrs.y1 += y\r\n }\r\n\r\n resize({ difY }: RequireByKey) {\r\n this.moveBy(0, difY)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n return super.getIsInChartView(chart, { omitX: true })\r\n }\r\n}\r\n\r\nHorizontalLine.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'border' },\r\n { type: 'number', name: 'y1', label: 'Price', allowDecimal: true },\r\n ],\r\n}\r\n\r\nexport default HorizontalLine\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\ninterface ILineAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n dashLength: number\r\n lineWidth: number\r\n strokeStyle: string\r\n}\r\n\r\nclass Line extends Element {\r\n static type = CanvasElementType.line\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.render = this.render.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'l',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'r',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n lineWidth: 1,\r\n strokeStyle: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { x1, y1, x2, y2, lineWidth } = this.attrs\r\n const roundedXY = getRoundedObject({ x1, y1, x2, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineWidth', this.attrs.lineWidth)\r\n context.set('strokeStyle', this.attrs.strokeStyle)\r\n\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([this.attrs.dashLength])\r\n }\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([])\r\n }\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'l') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area, this.attrs) <= 10) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nexport default Line\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport { numberToStringWithUnitsSuffix } from '../utils'\r\nimport { getRoundedString } from '../utils/helpers'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ninterface Coordinates {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport interface IMeasureAttrs extends Coordinates {\r\n fill: string\r\n}\r\n\r\nclass Measure extends Element {\r\n static type = CanvasElementType.measure\r\n\r\n name = 'Measure'\r\n declare scaled: Pick\r\n\r\n x1Dif: number\r\n x2Dif: number\r\n startingX1: number\r\n startingX2: number\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'tl',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'br',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.x1Dif = this.x2Dif = 0\r\n\r\n this.startingX1 = this.attrs.x1\r\n this.startingX2 = this.attrs.x2\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n getVolumeSumString = () => {\r\n const { volume, barIndex }: { volume: number[]; barIndex: number[] } = this.model.chart().quote()\r\n const roundedX1 = Math.round(this.attrs.x1)\r\n const roundedX2 = Math.round(this.attrs.x2)\r\n // min/max values are offset by 1 so there's no value on such index\r\n // and at the same time it won't iterate over unlimited number of nonexisting indexes\r\n const minIndexLimit = barIndex[0] - 1\r\n const maxIndexLimit = barIndex[barIndex.length - 1] + 1\r\n const volMinIndex = Math.min(Math.max(Math.min(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\r\n const volMaxIndex = Math.min(Math.max(Math.max(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\r\n\r\n let volumeSum = 0\r\n for (let i = volMinIndex; i <= volMaxIndex; i++) {\r\n const volumeIndex = barIndex.indexOf(i)\r\n if (volumeIndex >= 0) {\r\n volumeSum += volume[volumeIndex]\r\n }\r\n }\r\n\r\n return `Vol ${numberToStringWithUnitsSuffix(volumeSum)}`\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n\r\n const width = roundedXY.x2 - roundedXY.x1\r\n const height = roundedXY.y2 - roundedXY.y1\r\n context.fillRect(x1, roundedXY.y1, width, height)\r\n\r\n const priceDif = this.attrs.y2 - this.attrs.y1\r\n const percentage = (100 / this.attrs.y1) * priceDif\r\n const heightStr = `${priceDif.toFixed(2)} (${percentage.toFixed(2)}%)`\r\n\r\n const text = new Text(\r\n {\r\n text: `${getRoundedString({ number: Math.abs(this.attrs.x2 - this.attrs.x1), numOfDecimalPlaces: 2 })} bars`,\r\n fillStyle: '#333',\r\n font: { size: 10, family: 'Arial', weight: 'bold' },\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n const baseX = x1 + width / 2\r\n const baseY = roundedXY.y1 + height / 2\r\n let textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY - text.getHeight(),\r\n } as Partial)\r\n text.render(context)\r\n\r\n text.set({ text: heightStr })\r\n textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY,\r\n } as Partial)\r\n text.render(context)\r\n\r\n text.set({ text: this.getVolumeSumString() })\r\n textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY + text.getHeight(),\r\n } as Partial)\r\n text.render(context)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n addToCoordinates(difs: Partial) {\r\n this.attrs.y1 += difs.y1 || 0\r\n this.attrs.y2 += difs.y2 || 0\r\n\r\n this.x1Dif += difs.x1 || 0\r\n this.x2Dif += difs.x2 || 0\r\n\r\n // The reason for adding +1 is to \"ceil\" the number when moving to the left (decreasing bar index)\r\n const newX1 = ~~(this.startingX1 + this.x1Dif) + (this.x1Dif < 0 ? 1 : 0)\r\n if (~~this.attrs.x1 - newX1 !== 0) {\r\n this.attrs.x1 = newX1\r\n }\r\n const newX2 = ~~(this.startingX2 + this.x2Dif) + (this.x2Dif < 0 ? 1 : 0)\r\n if (~~this.attrs.x2 - newX2 !== 0) {\r\n this.attrs.x2 = newX2\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n return this.addToCoordinates({\r\n x1: x,\r\n y1: y,\r\n x2: x,\r\n y2: y,\r\n })\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tl') {\r\n this.addToCoordinates({ x1: difX, y1: difY })\r\n } else {\r\n this.addToCoordinates({ x2: difX, y2: difY })\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const x1 = Math.round(this.attrs.x1)\r\n const x2 = Math.round(this.attrs.x2)\r\n\r\n const left = Math.min(x1, x2)\r\n const right = Math.max(x1, x2)\r\n const top = Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n onMouseDown(paneArea: PaneArea) {\r\n super.onMouseDown(paneArea)\r\n this.startingX1 = this.attrs.x1\r\n this.startingX2 = this.attrs.x2\r\n }\r\n\r\n onMouseUp(paneArea?: PaneArea) {\r\n super.onMouseUp(paneArea)\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n}\r\n\r\nMeasure.prototype.defaults = { fill: 'rgba(180,220,255,0.8)' }\r\n\r\nMeasure.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill' }],\r\n}\r\n\r\nexport default Measure\r\n","import { Point } from '../../../types/shared'\r\nimport { getRoundedObject } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { isInRange } from '../../utils/helpers'\r\nimport { ITrendAttrs } from './pitchfork_v1'\r\n\r\ninterface IGetEdgeIntersectionPointArguments {\r\n sides: { x: number; y: number }[][]\r\n rayOrigin: Point\r\n rayDirection: Point\r\n}\r\n\r\nexport const getEdgeIntersectionPoint = ({ sides, rayOrigin, rayDirection }: IGetEdgeIntersectionPointArguments) => {\r\n if (rayOrigin.x === rayDirection.x && rayOrigin.y === rayDirection.y) return rayDirection\r\n\r\n let intersection = rayDirection\r\n let intersectionDistance = 0\r\n for (let index = 0; index < sides.length; index++) {\r\n const rayToLineIntersection = math.getRayToLineSegmentIntersection(\r\n rayOrigin,\r\n rayDirection,\r\n sides[index][0],\r\n sides[index][1]\r\n )\r\n if (rayToLineIntersection) {\r\n const distance = math.distance(rayToLineIntersection, rayOrigin)\r\n if (distance > intersectionDistance && isInRange({ value: distance })) {\r\n intersectionDistance = distance\r\n intersection = { x: rayToLineIntersection.x, y: rayToLineIntersection.y }\r\n }\r\n }\r\n }\r\n\r\n return intersection\r\n}\r\n\r\nexport const getChartVisibleAreaBoundaries = (paneModel: PaneModel) => {\r\n const { left, right, top, bottom } = paneModel.getChartLayoutSettings().ChartSettings\r\n const { leftOffset, width } = paneModel.chart()\r\n\r\n const chartVisibleAreaLeftX = Math.abs(leftOffset)\r\n const chartVisibleAreaRightX = chartVisibleAreaLeftX + width - left.width - right.width\r\n const chartVisibleAreaTopY = 0\r\n const chartVisibleAreaBottomY = paneModel.height - top.height - bottom.height\r\n\r\n const chartVisibleAreaTopLeftPoint = {\r\n x: chartVisibleAreaLeftX,\r\n y: chartVisibleAreaTopY,\r\n }\r\n const chartVisibleAreaTopRightPoint = {\r\n x: chartVisibleAreaRightX,\r\n y: chartVisibleAreaTopY,\r\n }\r\n const chartVisibleAreaBottomLeftPoint = {\r\n x: chartVisibleAreaLeftX,\r\n y: chartVisibleAreaBottomY,\r\n }\r\n const chartVisibleAreaBottomRightPoint = {\r\n x: chartVisibleAreaRightX,\r\n y: chartVisibleAreaBottomY,\r\n }\r\n const topSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaTopRightPoint]\r\n const rightSide = [chartVisibleAreaTopRightPoint, chartVisibleAreaBottomRightPoint]\r\n const bottomSide = [chartVisibleAreaBottomLeftPoint, chartVisibleAreaBottomRightPoint]\r\n const leftSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaBottomLeftPoint]\r\n\r\n const sides = [topSide, rightSide, bottomSide, leftSide]\r\n\r\n return sides\r\n}\r\n\r\ninterface IGetPitchforkCoordinates {\r\n paneModel: PaneModel\r\n rayOrigin: Point\r\n rayDirectionControlPoint1: Point\r\n rayDirectionControlPoint2?: Point\r\n trend1: ITrendAttrs\r\n trend2: ITrendAttrs\r\n}\r\n\r\ninterface ILineSegment {\r\n P1: Point\r\n P2: Point\r\n}\r\n\r\ninterface ICoordinates {\r\n medianRay: ILineSegment\r\n trend1Ray1: ILineSegment | undefined\r\n trend1Ray2: ILineSegment | undefined\r\n trend2Ray1: ILineSegment | undefined\r\n trend2Ray2: ILineSegment | undefined\r\n}\r\n\r\nexport const getPitchforkCoordinates = ({\r\n paneModel,\r\n rayOrigin,\r\n rayDirectionControlPoint1,\r\n rayDirectionControlPoint2,\r\n trend1,\r\n trend2,\r\n}: IGetPitchforkCoordinates) => {\r\n const sides = getChartVisibleAreaBoundaries(paneModel)\r\n\r\n const coordinates: ICoordinates = {\r\n medianRay: { P1: rayOrigin, P2: rayDirectionControlPoint1 },\r\n trend1Ray1: undefined,\r\n trend2Ray1: undefined,\r\n trend1Ray2: undefined,\r\n trend2Ray2: undefined,\r\n }\r\n\r\n // If rayDirectionControlPoint2 doesn't exist return only medianRay with rayDirectionControlPoint1 as rayDirection\r\n if (!rayDirectionControlPoint2) {\r\n coordinates.medianRay = {\r\n P1: getRoundedObject(rayOrigin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin,\r\n rayDirection: rayDirectionControlPoint1,\r\n })\r\n ),\r\n }\r\n return coordinates\r\n }\r\n\r\n const medianRayDirectionPoint = math.getMiddlePointOnLineSegment(rayDirectionControlPoint1, rayDirectionControlPoint2)\r\n const rayOriginToRayDirectionVector = {\r\n x: medianRayDirectionPoint.x - rayOrigin.x,\r\n y: medianRayDirectionPoint.y - rayOrigin.y,\r\n }\r\n\r\n const rayDirectionControlPoint1ToPoint2Vector = {\r\n x: rayDirectionControlPoint1.x - rayDirectionControlPoint2.x,\r\n y: rayDirectionControlPoint1.y - rayDirectionControlPoint2.y,\r\n }\r\n\r\n const normalizedRayDirectionControlPoint1ToPoint2Vector = math.normalizeVector(\r\n rayDirectionControlPoint1ToPoint2Vector\r\n )\r\n\r\n const medianRayDirectionPointToRayDirectionControlPoint1Distance = math.distance(\r\n medianRayDirectionPoint,\r\n rayDirectionControlPoint1\r\n )\r\n\r\n coordinates.medianRay = {\r\n P1: getRoundedObject(rayOrigin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin,\r\n rayDirection: medianRayDirectionPoint,\r\n })\r\n ),\r\n }\r\n if (trend1.active) {\r\n const trend1Ray = getTrendRayCoordinates({\r\n trend: trend1.trend,\r\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\r\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n })\r\n\r\n coordinates.trend1Ray1 = trend1Ray.trendRay1\r\n coordinates.trend1Ray2 = trend1Ray.trendRay2\r\n }\r\n if (trend2.active) {\r\n const trend2Ray = getTrendRayCoordinates({\r\n trend: trend2.trend,\r\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\r\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n })\r\n\r\n coordinates.trend2Ray1 = trend2Ray.trendRay1\r\n coordinates.trend2Ray2 = trend2Ray.trendRay2\r\n }\r\n\r\n return coordinates\r\n}\r\n\r\ninterface IGetTrendRayCoordinates {\r\n trend: number\r\n medianToControlPointDistance: number\r\n normalizedControlToControlPointVector: Point\r\n rayOriginToRayDirectionVector: Point\r\n medianRayDirectionPoint: Point\r\n sides: Point[][]\r\n}\r\n\r\nconst getTrendRayCoordinates = ({\r\n trend,\r\n medianToControlPointDistance,\r\n normalizedControlToControlPointVector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n}: IGetTrendRayCoordinates) => {\r\n const medianToTrendLineDistance = medianToControlPointDistance * trend\r\n\r\n const trendRayPoint1Origin = math.addPoints(\r\n medianRayDirectionPoint,\r\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\r\n )\r\n const trendPoint2RayOriginPoint2 = math.subtractPoints(\r\n medianRayDirectionPoint,\r\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\r\n )\r\n\r\n const trendRayPoint1DirectionPoint = {\r\n x: trendRayPoint1Origin.x + rayOriginToRayDirectionVector.x,\r\n y: trendRayPoint1Origin.y + rayOriginToRayDirectionVector.y,\r\n }\r\n const trendPoint2RayDirectionPoint = {\r\n x: trendPoint2RayOriginPoint2.x + rayOriginToRayDirectionVector.x,\r\n y: trendPoint2RayOriginPoint2.y + rayOriginToRayDirectionVector.y,\r\n }\r\n\r\n return {\r\n trendRay1: {\r\n P1: getRoundedObject(trendRayPoint1Origin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin: trendRayPoint1Origin,\r\n rayDirection: trendRayPoint1DirectionPoint,\r\n })\r\n ),\r\n },\r\n trendRay2: {\r\n P1: getRoundedObject(trendPoint2RayOriginPoint2),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin: trendPoint2RayOriginPoint2,\r\n rayDirection: trendPoint2RayDirectionPoint,\r\n })\r\n ),\r\n },\r\n }\r\n}\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport Chart from '../../models/chart'\r\nimport PaneModel from '../../models/pane'\r\nimport { getHEXWithSpecificAplha } from '../../utils/colors'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\nimport { getPitchforkCoordinates } from './pitchfork_utils'\r\n\r\nexport interface ITrendAttrs {\r\n active: boolean\r\n trend: number\r\n color: string\r\n}\r\n\r\nexport interface IPitchforkAttrs {\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n x3: number\r\n y3: number\r\n median: { color: string; width: number }\r\n trend1: ITrendAttrs\r\n trend2: ITrendAttrs\r\n}\r\n\r\nclass Pitchfork extends Element {\r\n static type = CanvasElementType.pitchforkV1\r\n\r\n declare scaled: Pick\r\n name = 'Pitchfork'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'medianRayOrigin',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rayDirectionControlPoint1',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rayDirectionControlPoint2',\r\n () => this.attrs.x3,\r\n () => this.attrs.y3,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n median: { color: '#e72f2f', width: 1 },\r\n trend1: {\r\n color: '#004ad31c',\r\n active: true,\r\n trend: 1,\r\n },\r\n trend2: {\r\n color: '#00ca4e1f',\r\n active: true,\r\n trend: 0.5,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.median.width)\r\n context.translate(offset, offset)\r\n\r\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\r\n paneModel: this.model,\r\n rayOrigin: { x: x1, y: y1 },\r\n rayDirectionControlPoint1: { x: x2, y: y2 },\r\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\r\n trend1: this.attrs.trend1,\r\n trend2: this.attrs.trend2,\r\n })\r\n\r\n context.set('lineWidth', this.attrs.median.width)\r\n\r\n const trendLines = [\r\n { trend: this.attrs.trend1, line1: trend1Ray1, line2: trend1Ray2 },\r\n { trend: this.attrs.trend2, line1: trend2Ray1, line2: trend2Ray2 },\r\n ].sort((a, b) => {\r\n if (Math.abs(a.trend.trend) > Math.abs(b.trend.trend)) {\r\n return -1\r\n }\r\n if (Math.abs(a.trend.trend) < Math.abs(b.trend.trend)) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n\r\n // Draw trend lines and fill\r\n trendLines.forEach((trendLine, trendLineIndex) => {\r\n if (trendLine.line1 && trendLine.line2) {\r\n const { line1, line2 } = trendLine\r\n const solidTrendColor = getHEXWithSpecificAplha(trendLine.trend.color)\r\n const nextTrendLine = trendLines[trendLineIndex + 1]\r\n\r\n context.beginPath()\r\n context.moveTo(line1.P1.x, line1.P1.y)\r\n context.lineTo(line1.P2.x, line1.P2.y)\r\n if (trendLineIndex !== trendLines.length - 1 && nextTrendLine.line1 && nextTrendLine.line2) {\r\n context.lineTo(nextTrendLine.line1.P2.x, nextTrendLine.line1.P2.y)\r\n context.lineTo(nextTrendLine.line1.P1.x, nextTrendLine.line1.P1.y)\r\n context.moveTo(nextTrendLine.line2.P1.x, nextTrendLine.line2.P1.y)\r\n context.lineTo(nextTrendLine.line2.P2.x, nextTrendLine.line2.P2.y)\r\n }\r\n context.lineTo(line2.P2.x, line2.P2.y)\r\n context.lineTo(line2.P1.x, line2.P1.y)\r\n context.closePath()\r\n context.set('fillStyle', trendLine.trend.color)\r\n context.fill()\r\n\r\n context.beginPath()\r\n context.moveTo(line1.P1.x, line1.P1.y)\r\n context.lineTo(line1.P2.x, line1.P2.y)\r\n context.moveTo(line2.P1.x, line2.P1.y)\r\n context.lineTo(line2.P2.x, line2.P2.y)\r\n context.set('strokeStyle', solidTrendColor)\r\n context.stroke()\r\n }\r\n })\r\n\r\n // Draw median ray line\r\n context.beginPath()\r\n context.moveTo(medianRay.P1.x, medianRay.P1.y)\r\n context.lineTo(medianRay.P2.x, medianRay.P2.y)\r\n\r\n // Draw line between outer trend lines origin points or if smaller than 1 between direction control points\r\n const outerTrendLines =\r\n trendLines.filter(\r\n (item) => item.line1 && item.line2 && item.trend.active && Math.abs(item.trend.trend) >= 1\r\n )[0] ?? {}\r\n\r\n if (outerTrendLines.line1 && outerTrendLines.line2) {\r\n context.moveTo(outerTrendLines.line1.P1.x, outerTrendLines.line1.P1.y)\r\n context.lineTo(outerTrendLines.line2.P1.x, outerTrendLines.line2.P1.y)\r\n } else if (!Number.isNaN(x3) && !Number.isNaN(y3)) {\r\n context.moveTo(x2, y2)\r\n context.lineTo(x3, y3)\r\n }\r\n\r\n context.set('strokeStyle', this.attrs.median.color)\r\n context.stroke()\r\n\r\n context.translate(offset * -1, offset * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.x3 += x\r\n this.attrs.y3 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'medianRayOrigin':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'rayDirectionControlPoint1':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'rayDirectionControlPoint2':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\r\n paneModel: this.model,\r\n rayOrigin: { x: x1, y: y1 },\r\n rayDirectionControlPoint1: { x: x2, y: y2 },\r\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\r\n trend1: this.attrs.trend1,\r\n trend2: this.attrs.trend2,\r\n })\r\n const outerTrendLines =\r\n Math.abs(this.attrs.trend1.trend) > Math.abs(this.attrs.trend2.trend)\r\n ? { line1: trend1Ray1, line2: trend1Ray2 }\r\n : { line1: trend2Ray1, line2: trend2Ray2 }\r\n\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: medianRay.P1.x,\r\n y1: medianRay.P1.y,\r\n x2: medianRay.P2.x,\r\n y2: medianRay.P2.y,\r\n }) <= 10\r\n ) {\r\n // cursor is near median ray\r\n return true\r\n } else if (\r\n !Number.isNaN(x3) &&\r\n !Number.isNaN(y3) &&\r\n math.distanceToSegment(area.scaled, {\r\n x1: x2,\r\n y1: y2,\r\n x2: x3,\r\n y2: y3,\r\n }) <= 10\r\n ) {\r\n // cursor is near line connecting direction control points\r\n return true\r\n } else if (\r\n outerTrendLines.line1 &&\r\n outerTrendLines.line2 &&\r\n math.pointInPolygon(area.scaled, [\r\n outerTrendLines.line1.P1,\r\n outerTrendLines.line1.P2,\r\n outerTrendLines.line2.P2,\r\n outerTrendLines.line2.P1,\r\n ])\r\n ) {\r\n // cursor is on polygon created by outer trend lines\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView(_: Chart) {\r\n return true\r\n }\r\n}\r\n\r\nPitchfork.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'median' },\r\n { type: 'trend', name: 'trend1' },\r\n { type: 'trend', name: 'trend2' },\r\n ],\r\n}\r\n\r\nexport default Pitchfork\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element, { EdgeValues } from './element'\r\nimport Thumb from './thumb'\r\n\r\ntype Points = Array<{ x: number; y: number }>\r\n\r\nexport interface IPolygonAttrs {\r\n points: Points\r\n fill: string\r\n border: DrawingBorder\r\n positionPointsTimestamps?: Points\r\n}\r\n\r\nclass Polygon extends Element {\r\n static type = CanvasElementType.polygon\r\n\r\n name = 'Polygon'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this.attrs.fill = this.attrs.fill || 'rgba(50, 60, 70, 0.8)'\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.translate(offset, offset)\r\n\r\n const { points } = this.attrs\r\n context.beginPath()\r\n context.moveTo(this.fx(points[0].x), this.fy(points[0].y))\r\n for (const p of points.slice(1)) {\r\n context.lineTo(this.fx(p.x), this.fy(p.y))\r\n }\r\n\r\n if (this.isPolygon()) {\r\n context.closePath()\r\n context.fill()\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n return this.attrs.points.map(\r\n (point, index) =>\r\n new Thumb(\r\n `${index}`,\r\n () => point.x,\r\n () => point.y,\r\n this.resize,\r\n this.model\r\n )\r\n )\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart()?.quote()\r\n if (quote) {\r\n const positionPointsTimestamps = this.attrs.points.map((point) => ({\r\n ...point,\r\n x: quote.getTimestampFomPositionX(point.x),\r\n }))\r\n\r\n this.set({ positionPointsTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionPointsTimestamps } = this.attrs\r\n if (!quote || !positionPointsTimestamps) {\r\n // positionWavesTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const points = positionPointsTimestamps.map((point) => ({\r\n ...point,\r\n x: quote.getPositionXFromTimestamp(point.x),\r\n }))\r\n this.set({ points } as Partial)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const point of this.attrs.points) {\r\n point.x += x\r\n point.y += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n const last = this.attrs.points.length - 1\r\n if (this.isPolygon() && (+type === 0 || +type === last)) {\r\n this.attrs.points[0].x += difX\r\n this.attrs.points[0].y += difY\r\n this.attrs.points[last].x += difX\r\n this.attrs.points[last].y += difY\r\n } else {\r\n this.attrs.points[+type].x += difX\r\n this.attrs.points[+type].y += difY\r\n }\r\n }\r\n\r\n isPolygon() {\r\n return (\r\n this.attrs.points[0].x === this.attrs.points.last()?.x && this.attrs.points[0].y === this.attrs.points.last()?.y\r\n )\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const scaledPoints = this.attrs.points.map((p) => ({\r\n x: this.fx(p.x),\r\n y: this.fy(p.y),\r\n }))\r\n if (this.isPolygon()) {\r\n if (math.pointInPolygon(area.scaled, scaledPoints)) {\r\n return true\r\n }\r\n } else {\r\n for (let i = 0; i < scaledPoints.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: scaledPoints[i].x,\r\n y1: scaledPoints[i].y,\r\n x2: scaledPoints[i + 1].x,\r\n y2: scaledPoints[i + 1].y,\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n }\r\n\r\n return super.isInArea(area)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['points']\r\n }\r\n\r\n getEdgeXYValues() {\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n this.attrs.points.forEach(({ x, y }) => {\r\n const xPoint = x\r\n const yPoint = y\r\n edgeXYValues.minX = Math.min(xPoint, edgeXYValues.minX ?? xPoint)\r\n edgeXYValues.minY = Math.min(yPoint, edgeXYValues.minY ?? yPoint)\r\n edgeXYValues.maxX = Math.max(xPoint, edgeXYValues.maxX ?? xPoint)\r\n edgeXYValues.maxY = Math.max(yPoint, edgeXYValues.maxY ?? yPoint)\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nPolygon.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Polygon\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ninterface Coordinates {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport interface IPositionAttrs extends Coordinates {\r\n targetColor: string\r\n stopColor: string\r\n targetY: number\r\n centerY: number\r\n stopY: number\r\n}\r\n\r\nclass Position extends Element {\r\n static type = CanvasElementType.position\r\n\r\n name = 'Position'\r\n\r\n declare scaled: Pick\r\n\r\n x1Dif: number\r\n x2Dif: number\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 't1',\r\n () => this.attrs.x1,\r\n () => this.attrs.targetY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 't2',\r\n () => this.attrs.x2,\r\n () => this.attrs.targetY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 's1',\r\n () => this.attrs.x1,\r\n () => this.attrs.stopY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 's2',\r\n () => this.attrs.x2,\r\n () => this.attrs.stopY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c1',\r\n () => this.attrs.x1,\r\n () => this.attrs.centerY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c2',\r\n () => this.attrs.x2,\r\n () => this.attrs.centerY,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['targetY', 'centerY', 'stopY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, targetY, centerY, stopY } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, targetY, centerY, stopY })\r\n let sign, stopBaseline, targetBaseline\r\n const width = roundedXY.x2 - roundedXY.x1\r\n\r\n context.set('fillStyle', this.attrs.targetColor)\r\n context.fillRect(roundedXY.x1, roundedXY.targetY, width, roundedXY.centerY - roundedXY.targetY)\r\n\r\n context.set('fillStyle', this.attrs.stopColor)\r\n context.fillRect(roundedXY.x1, roundedXY.centerY, width, roundedXY.stopY - roundedXY.centerY)\r\n\r\n const targetDif = Math.abs(this.attrs.targetY - this.attrs.centerY)\r\n const targetPerc = (100 / this.attrs.centerY) * targetDif\r\n const targetStr = `Target: ${targetDif.toFixed(2)} (${targetPerc.toFixed(2)}%)`\r\n\r\n const stopDif = Math.abs(this.attrs.stopY - this.attrs.centerY)\r\n const stopPerc = (100 / this.attrs.centerY) * stopDif\r\n const stopStr = `Stop: ${stopDif.toFixed(2)} (${stopPerc.toFixed(2)}%)`\r\n\r\n if (this.attrs.targetY > this.attrs.centerY) {\r\n sign = 1\r\n targetBaseline = TextBaseline.bottom\r\n stopBaseline = TextBaseline.top\r\n } else {\r\n sign = -1\r\n targetBaseline = TextBaseline.top\r\n stopBaseline = TextBaseline.bottom\r\n }\r\n\r\n const text = new Text(\r\n {\r\n text: targetStr,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n font: { size: 10, family: 'Arial', weight: 'bold' },\r\n y: roundedXY.targetY - sign * 4,\r\n textBaseline: targetBaseline,\r\n },\r\n this.model\r\n )\r\n let textWidth = text.measure(context)\r\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\r\n text.render(context)\r\n\r\n text.set({\r\n text: stopStr,\r\n y: roundedXY.stopY + sign * 4,\r\n textBaseline: stopBaseline,\r\n })\r\n textWidth = text.measure(context)\r\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\r\n text.render(context)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n addToCoordinates(difs: Partial) {\r\n let middle, middle1, result\r\n if (difs.targetY) {\r\n result = this.attrs.targetY + difs.targetY\r\n if (\r\n (this.attrs.targetY > this.attrs.centerY && result < this.attrs.centerY) ||\r\n (this.attrs.targetY < this.attrs.centerY && result > this.attrs.centerY)\r\n ) {\r\n this.attrs.stopY = this.attrs.centerY - (this.attrs.stopY - this.attrs.centerY) // swap target&stop\r\n }\r\n this.attrs.targetY = result\r\n }\r\n\r\n if (difs.stopY) {\r\n result = this.attrs.stopY + difs.stopY\r\n if (\r\n (this.attrs.stopY > this.attrs.centerY && result < this.attrs.centerY) ||\r\n (this.attrs.stopY < this.attrs.centerY && result > this.attrs.centerY)\r\n ) {\r\n this.attrs.targetY = this.attrs.centerY - (this.attrs.targetY - this.attrs.centerY) // swap target&stop\r\n }\r\n this.attrs.stopY = result\r\n }\r\n\r\n if (\r\n difs.centerY &&\r\n ((this.attrs.stopY < (middle = this.attrs.centerY + difs.centerY) && middle < this.attrs.targetY) ||\r\n (this.attrs.stopY > (middle1 = this.attrs.centerY + difs.centerY) && middle1 > this.attrs.targetY))\r\n ) {\r\n this.attrs.centerY += difs.centerY\r\n }\r\n\r\n this.x1Dif += difs.x1 || 0\r\n this.x2Dif += difs.x2 || 0\r\n const roundDif = ~~this.x1Dif || ~~this.x2Dif\r\n if (roundDif !== 0) {\r\n if (difs.x1 != null) {\r\n this.attrs.x1 += roundDif\r\n }\r\n if (difs.x2 != null) {\r\n this.attrs.x2 += roundDif\r\n }\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n return this.addToCoordinates({\r\n x1: x,\r\n x2: x,\r\n targetY: y,\r\n centerY: y,\r\n stopY: y,\r\n })\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n const [coordType, coordIndex] = (type as string).split('')\r\n const yPoints: Record = { t: 'targetY', c: 'centerY', s: 'stopY' }\r\n const obj: Partial = {\r\n [`x${coordIndex}`]: difX,\r\n [yPoints[coordType]]: difY,\r\n }\r\n return this.addToCoordinates(obj)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const x1 = Math.round(this.attrs.x1)\r\n const x2 = Math.round(this.attrs.x2)\r\n const left = Math.min(x1, x2)\r\n const right = Math.max(x1, x2)\r\n const top = Math.min(this.attrs.targetY, this.attrs.stopY)\r\n const bottom = Math.max(this.attrs.targetY, this.attrs.stopY)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nPosition.prototype.defaults = {\r\n targetColor: 'rgba(0,200,0,0.3)',\r\n stopColor: 'rgba(200,0,0,0.3)',\r\n}\r\n\r\nPosition.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'targetColor' },\r\n { type: 'background', name: 'stopColor' },\r\n ],\r\n}\r\n\r\nexport default Position\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IRectangleAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass Rectangle extends Element {\r\n static type = CanvasElementType.rectangle\r\n\r\n name = 'Rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'br',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tl',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const width = roundedXY.x2 - roundedXY.x1\r\n const height = roundedXY.y2 - roundedXY.y1\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.fillRect(roundedXY.x1, roundedXY.y1, width, height)\r\n\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.strokeRect(roundedXY.x1 + offset, roundedXY.y1 + offset, width, height)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n\r\n // @todo - Live sync of elements while they are being moved around\r\n // In order to have live sync across charts we need to trigger change so listeners can update other charts with new values\r\n // this.set(this.attrs)\r\n // this.trigger('change', this)\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tl') {\r\n this.attrs.x1 += difX\r\n return (this.attrs.y1 += difY)\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const left = Math.min(this.attrs.x1, this.attrs.x2)\r\n const right = Math.max(this.attrs.x1, this.attrs.x2)\r\n const top = Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nRectangle.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Rectangle\r\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IRotatedRectangleV1Attrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n cursorTargetX: number\r\n cursorTargetY: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass RotatedRectangleV1 extends Element {\r\n static type = CanvasElementType.rotatedRectangleV1\r\n\r\n name = 'New Rotated Rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'middleLeft',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'middleRight',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'topRight',\r\n () => this.getRectCoordinates(true).P1.x || this.attrs.x2,\r\n () => this.getRectCoordinates(true).P1.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'topLeft',\r\n () => this.getRectCoordinates(true).P2.x || this.attrs.x2,\r\n () => this.getRectCoordinates(true).P2.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottomLeft',\r\n () => this.getRectCoordinates(true).P3.x || this.attrs.x1,\r\n () => this.getRectCoordinates(true).P3.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottomRight',\r\n () => this.getRectCoordinates(true).P4.x || this.attrs.x1,\r\n () => this.getRectCoordinates(true).P4.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { P1, P2, P3, P4 } = this.getRectCoordinates()\r\n const roundedXY = {\r\n P1: getRoundedObject(P1),\r\n P2: getRoundedObject(P2),\r\n P3: getRoundedObject(P3),\r\n P4: getRoundedObject(P4),\r\n }\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n if (roundedXY.P1.x === roundedXY.P4.x && roundedXY.P1.y === roundedXY.P4.y) {\r\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\r\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\r\n } else {\r\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\r\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\r\n context.lineTo(roundedXY.P3.x, roundedXY.P3.y)\r\n context.lineTo(roundedXY.P4.x, roundedXY.P4.y)\r\n context.closePath()\r\n context.fill()\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n context.stroke()\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRectCoordinates(inverted = false) {\r\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\r\n let perpendicularPoint\r\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\r\n const cursor = { x: cursorTargetX, y: cursorTargetY }\r\n const line = { x1, y1, x2, y2 }\r\n const distance = math.distanceToLine(cursor, line)\r\n perpendicularPoint = math.perpendicularPointToLine({\r\n distance,\r\n line,\r\n })\r\n } else {\r\n return {\r\n P1: { x: x2, y: y2 },\r\n P2: { x: x1, y: y1 },\r\n P3: { x: x1, y: y1 },\r\n P4: { x: x2, y: y2 },\r\n }\r\n }\r\n\r\n const pointOffsetX = perpendicularPoint.x - x2\r\n const pointOffsetY = perpendicularPoint.y - y2\r\n\r\n const P1 = { x: x2 + pointOffsetX, y: y2 + pointOffsetY }\r\n const P2 = { x: x1 + pointOffsetX, y: y1 + pointOffsetY }\r\n const P3 = { x: x1 + -1 * pointOffsetX, y: y1 + -1 * pointOffsetY }\r\n const P4 = { x: x2 + -1 * pointOffsetX, y: y2 + -1 * pointOffsetY }\r\n\r\n const invertX = this.model.scale.x.invert\r\n const invertY = this.model.scale.y.invert\r\n if (inverted) {\r\n return {\r\n P1: { x: invertX(P1.x), y: invertY(P1.y) },\r\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\r\n P3: { x: invertX(P3.x), y: invertY(P3.y) },\r\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\r\n }\r\n }\r\n return { P1, P2, P3, P4 }\r\n }\r\n\r\n getRotatedPointCoordinates = ({\r\n rotationAxisPoint,\r\n pointToRotate,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n rotationAxisPoint: Point\r\n pointToRotate: Point\r\n oldLinePoint: Point\r\n newLinePoint: Point\r\n }) => {\r\n const angle = math.sharedPointLinesAngle({\r\n sharedPoint: rotationAxisPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n })\r\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n })\r\n return {\r\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\r\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.cursorTargetX += x\r\n this.attrs.cursorTargetY += y\r\n }\r\n\r\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'middleLeft':\r\n const newMiddleLeftPoint = {\r\n x: this.attrs.x1 + difX,\r\n y: this.attrs.y1 + difY,\r\n }\r\n const middleLeftRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n newLinePoint: { x: this.model.scale.x(newMiddleLeftPoint.x), y: this.model.scale.y(newMiddleLeftPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x1: newMiddleLeftPoint.x,\r\n y1: newMiddleLeftPoint.y,\r\n cursorTargetX: middleLeftRotatedCursorPoint.x,\r\n cursorTargetY: middleLeftRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'middleRight':\r\n const newMiddleRightPoint = {\r\n x: this.attrs.x2 + difX,\r\n y: this.attrs.y2 + difY,\r\n }\r\n const middleRightRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n newLinePoint: { x: this.model.scale.x(newMiddleRightPoint.x), y: this.model.scale.y(newMiddleRightPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x2: newMiddleRightPoint.x,\r\n y2: newMiddleRightPoint.y,\r\n cursorTargetX: middleRightRotatedCursorPoint.x,\r\n cursorTargetY: middleRightRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'topRight':\r\n case 'topLeft':\r\n case 'bottomLeft':\r\n case 'bottomRight':\r\n this.attrs = {\r\n ...this.attrs,\r\n cursorTargetX: area.x,\r\n cursorTargetY: area.y,\r\n }\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const coordinates = this.getRectCoordinates()\r\n const polygon = Object.keys(coordinates).map((point) => ({\r\n x: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].x,\r\n y: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].y,\r\n }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nRotatedRectangleV1.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default RotatedRectangleV1\r\n","import { DrawingBorder, PaneArea } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Line from './line'\r\n\r\nexport interface IScaledLineAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n dashLength: number\r\n lineWidth: number\r\n strokeStyle: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass ScaledLine extends Line {\r\n static type = CanvasElementType.scaledLine\r\n\r\n name = 'Line'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([this.attrs.dashLength])\r\n }\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n}\r\n\r\nScaledLine.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default ScaledLine\r\n","import merge from 'lodash.merge'\r\n\r\nimport { PaneArea } from '../../types/shared'\r\nimport { PADDING } from '../constants/common'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport Text, { ITextAttrs } from './text'\r\n\r\ninterface FontFamilyHeightCoefficient {\r\n Arial: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n Verdana: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n}\r\n\r\nclass ScaledText extends Text {\r\n static type = CanvasElementType.scaledText\r\n\r\n name = 'Text'\r\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\r\n declare lastAttrs: Attrs\r\n declare scaled: Partial\r\n declare measuredHeight: number\r\n\r\n declare font: string\r\n declare context?: CanvasRenderingContext2D\r\n declare lines: {\r\n text: string\r\n metrics: TextMetrics\r\n }[]\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.scale({ x: ['x'], y: ['y'] })\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n this.render(context)\r\n }\r\n\r\n setupTextMetricsCache() {\r\n const ctx = this.context\r\n\r\n if (\r\n (this.attrs.text !== this.lastAttrs?.text ||\r\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)) &&\r\n ctx\r\n ) {\r\n this.lastAttrs = merge({}, this.attrs)\r\n this.lines = this.getLines().map((line) => ({\r\n text: line,\r\n metrics: ctx.measureText(line),\r\n }))\r\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\r\n const lineHeight =\r\n current.metrics.actualBoundingBoxAscent +\r\n current.metrics.actualBoundingBoxDescent +\r\n (currentIndex !== this.lines.length - 1 ? PADDING.XXXS : 0)\r\n return acc + lineHeight\r\n }, 0)\r\n }\r\n }\r\n\r\n // private\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle!)\r\n context.set('textAlign', this.attrs.textAlign!)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n this.setupTextMetricsCache()\r\n }\r\n\r\n // private\r\n renderText() {\r\n if (!this.context) return\r\n let y = this.scaled.y! + this.attrs.padding.top\r\n let previousDescent = 0\r\n for (let i = 0; i < this.lines.length; i++) {\r\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.XXXS\r\n this.context.fillText(this.lines[i].text, this.scaled.x! + this.attrs.padding.left, y)\r\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\r\n }\r\n }\r\n\r\n // private\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\r\n\r\n this.context.beginPath()\r\n this.context.rect(\r\n this.scaled.x! - padding,\r\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding,\r\n this.width + padding * 2,\r\n this.measuredHeight + padding * 2\r\n )\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle!)\r\n this.renderBorder()\r\n this.context.closePath()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n // TODO\r\n // if @attrs.textBaseline == 'middle'\r\n // rect.y = @attrs.y - rect.height/2\r\n if (\r\n this.lines &&\r\n this.scaled.x! < area.scaled.x &&\r\n area.scaled.x < this.scaled.x! + this.width &&\r\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent < area.scaled.y &&\r\n area.scaled.y < this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent + this.measuredHeight\r\n ) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n if (!this.lines) {\r\n return true\r\n }\r\n\r\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\r\n const textBoxX = this.scaled.x! - padding\r\n const textBoxY = this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding\r\n const textBoxWidth = this.width + padding * 2\r\n const textBoxHeight = this.measuredHeight + padding * 2\r\n\r\n if (\r\n textBoxX <= -chart.leftOffset + chart.width &&\r\n textBoxX + textBoxWidth >= -chart.leftOffset &&\r\n textBoxY <= this.model.height &&\r\n textBoxY + textBoxHeight >= 0\r\n ) {\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x! += x\r\n this.attrs.y! += y\r\n }\r\n}\r\n\r\nexport default ScaledText\r\n","import { PaneArea, RequireByKey, TextAttrs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport Element, { TodoModalConfig } from './element'\r\n\r\nexport interface Area {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport type ITextAttrs = RequireByKey & Partial\r\n\r\nconst DEFAULTS: Partial = {\r\n text: '',\r\n font: {\r\n size: 20,\r\n family: 'Arial',\r\n style: 'normal',\r\n weight: 'normal',\r\n },\r\n lineHeight: 20,\r\n // left | right | center | start | end\r\n textAlign: TextAlign.left,\r\n // top | hanging | middle | alphabetic | ideographic | bottom\r\n textBaseline: TextBaseline.alphabetic,\r\n padding: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n}\r\n\r\nclass Text extends Element {\r\n static type = CanvasElementType.text\r\n\r\n static getMergedPropsWithDefaults>(\r\n propKey: T,\r\n props: Partial = {}\r\n ) {\r\n return {\r\n ...DEFAULTS[propKey],\r\n ...Object.entries(props).reduce((acc, [key, value]) => (value ? { ...acc, [key]: value } : acc), {}),\r\n }\r\n }\r\n\r\n name = 'Anchored text'\r\n declare context?: CanvasRenderingContext2D\r\n declare width: number\r\n declare height: number\r\n declare font: string\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n // TODO: revisit this getter, when you call `this.width` you don't expect/want context change\r\n if (this.context) {\r\n this.setupContext(this.context)\r\n }\r\n return this.measure() + this.attrs.padding.left + this.attrs.padding.right\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const count = this.getLines().length\r\n return this.attrs.lineHeight * count + this.attrs.padding.top + this.attrs.padding.bottom\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'font', {\r\n get() {\r\n const f = this.attrs.font\r\n return `${f.style} ${f.weight} ${f.size}pt ${f.family}`\r\n },\r\n })\r\n }\r\n\r\n getModalConfigBase() {\r\n return {\r\n inputs: [\r\n { type: 'multiline_string', name: 'text', required: true },\r\n { type: 'font', name: 'font' },\r\n {\r\n type: 'background',\r\n name: 'fillStyle',\r\n label: 'Color',\r\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n {\r\n type: 'background',\r\n name: 'background',\r\n label: 'Background',\r\n default: 'rgba(0,0,0,0)',\r\n },\r\n {\r\n type: 'border',\r\n name: 'border',\r\n min: 0,\r\n default: { color: 'rgba(0,0,0)', width: 0 },\r\n },\r\n ],\r\n } as unknown as TodoModalConfig\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n ...DEFAULTS,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (obj.font?.size && !obj.lineHeight) {\r\n this.attrs.lineHeight = Math.max(obj.font.size, this.attrs.lineHeight)\r\n }\r\n return this\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n this.setupContext(context)\r\n if (this.attrs.angle && this.context) {\r\n // TODO background & multiline text\r\n this.context.save()\r\n this.context.translate(this.attrs.x!, this.attrs.y!)\r\n this.context.rotate((this.attrs.angle * Math.PI) / 180)\r\n this.context.fillText(this.attrs.text, 0, 0)\r\n this.context.restore()\r\n } else {\r\n this.renderBackground()\r\n this.renderText()\r\n }\r\n }\r\n\r\n measure(context?: CanvasRenderingContext2D) {\r\n if (context) {\r\n this.setupContext(context)\r\n }\r\n const lines = this.getLines()\r\n let max = 0\r\n for (const line of lines) {\r\n max = Math.max(this.context?.measureText(line).width ?? Number.MIN_SAFE_INTEGER, max)\r\n }\r\n return ~~max\r\n }\r\n\r\n isInArea(testArea: PaneArea) {\r\n const area = this.convertArea(testArea)\r\n // TODO iny align\r\n if (\r\n this.attrs.x! < area.x &&\r\n area.x < this.attrs.x! + this.width &&\r\n this.attrs.y! - this.attrs.font.size < area.y &&\r\n area.y < this.attrs.y! - this.attrs.font.size + this.height\r\n ) {\r\n return true\r\n }\r\n return super.isInArea(testArea)\r\n }\r\n\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle)\r\n context.set('textAlign', this.attrs.textAlign)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n }\r\n\r\n getLines() {\r\n return this.attrs.text.toString().split('\\n')\r\n }\r\n\r\n renderText() {\r\n if (!this.context) return\r\n let { y } = this.attrs // + @attrs.padding.top\r\n for (const line of this.getLines()) {\r\n this.context.fillText(line, this.attrs.x! + this.attrs.padding.left, y!)\r\n y! += this.attrs.lineHeight\r\n }\r\n }\r\n\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n\r\n const { width } = this\r\n const { height } = this\r\n const rawHight = height - this.attrs.padding.top - this.attrs.padding.bottom\r\n const { x } = this.attrs\r\n let y = this.attrs.y! - height\r\n\r\n if (this.attrs.textBaseline === 'middle') {\r\n y = this.attrs.y! - rawHight / 2 - this.attrs.padding.top - 1\r\n } else if (this.attrs.textBaseline === 'alphabetic') {\r\n y = this.attrs.y! - this.attrs.lineHeight\r\n }\r\n\r\n this.context.beginPath()\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.rect(x!, y, width, height)\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle)\r\n this.renderBorder()\r\n this.context.closePath()\r\n }\r\n\r\n renderBorder() {\r\n const { lineWidth = 0, strokeStyle, border } = this.attrs\r\n const borderWidth = border?.width ?? 0\r\n\r\n if ((lineWidth || this.attrs.strokeStyle || borderWidth > 0) && this.context) {\r\n this.context.set('strokeStyle', strokeStyle ?? border?.color ?? '')\r\n this.context.set('lineWidth', Math.max(lineWidth, borderWidth))\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n private convertArea(area: PaneArea) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n return {\r\n x: this.model.scale.x(area.x) + this.model.chart().leftOffset + ChartSettings.left.width,\r\n y: this.model.scale.y(area.y) + ChartSettings.top.height,\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x! += this.model.scale.x(x) + 1\r\n this.attrs.y! += this.model.scale.y(y) - this.model.scale.y(0)\r\n }\r\n\r\n getHeight() {\r\n return this.height\r\n }\r\n}\r\n\r\nText.initClass()\r\n\r\nexport default Text\r\n","import { PaneArea, ResizeByThumbFuncProps, ThumbType } from '../../types/shared'\r\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\n\r\ntype Area = PaneArea\r\ntype ResizeFunc = (props: ResizeByThumbFuncProps) => void\r\ntype ScaleFunc = () => number\r\n\r\nclass Thumb {\r\n type: ThumbType\r\n lastX = 0\r\n lastY = 0\r\n fx: ScaleFunc\r\n fy: ScaleFunc\r\n resize: ResizeFunc\r\n model: PaneModel\r\n\r\n constructor(type: ThumbType, fx: ScaleFunc, fy: ScaleFunc, resize: ResizeFunc, model: PaneModel) {\r\n this.type = type\r\n this.fx = fx\r\n this.fy = fy\r\n this.resize = resize\r\n this.model = model\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n context.set('fillStyle', ThumbSettings.color)\r\n context.set('strokeStyle', ThumbSettings.borderColor)\r\n context.set('lineWidth', ThumbSettings.borderWidth)\r\n const x = ~~this.x()\r\n const y = ~~this.y()\r\n const thumbWidth = this.getThumbWidth()\r\n const offset = getOffsetFromLineWidth(ThumbSettings.borderWidth)\r\n context.beginPath()\r\n context.rect(x + offset, y + offset, thumbWidth, thumbWidth)\r\n context.fill()\r\n context.stroke()\r\n }\r\n\r\n startEditing(area: Area) {\r\n this.lastX = area.x\r\n return (this.lastY = area.y)\r\n }\r\n\r\n moveTo(area: Area) {\r\n const difX = area.x - this.lastX\r\n const difY = area.y - this.lastY\r\n this.resize({ type: this.type, difX, difY, area })\r\n this.lastX = area.x\r\n this.lastY = area.y\r\n }\r\n\r\n isInArea(area: Area) {\r\n const width = this.model.scale.x.invert(this.getThumbWidth())\r\n const height = this.model.scale.y.invert(0) - this.model.scale.y.invert(this.getThumbWidth())\r\n // +- width/2 because we have coordinates of a center\r\n if (\r\n this.fx() + width / 2 >= area.x &&\r\n this.fx() - width / 2 <= area.x &&\r\n this.fy() + height / 2 > area.y &&\r\n this.fy() - height / 2 < area.y\r\n ) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n getThumbWidth() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return ThumbSettings.size + ThumbSettings.borderWidth * 2\r\n }\r\n\r\n x() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return this.model.scale.x(this.fx()) - ThumbSettings.size / 2\r\n }\r\n\r\n y() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return this.model.scale.y(this.fy()) - ThumbSettings.size / 2\r\n }\r\n}\r\n\r\nexport default Thumb\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ITriangleAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n fill: string\r\n border: string\r\n}\r\n\r\nclass Triangle extends Element {\r\n static type = CanvasElementType.triangle\r\n\r\n declare scaled: Pick\r\n name = 'Triangle'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x3,\r\n () => this.attrs.y3,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return { fill: ElementSettings.defaultFill, border: ElementSettings.Colors.border } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, x3, y1, y2, y3 })\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n const offset = this.getShouldRenderThumbs() ? getOffsetFromLineWidth(1) : 0\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.lineTo(roundedXY.x3, roundedXY.y3)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.fill()\r\n context.translate(offset * -1, offset * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n context.set('strokeStyle', this.attrs.border)\r\n context.stroke()\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.x3 += x\r\n this.attrs.y3 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'a':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'b':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'c':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const polygon = [1, 2, 3].map((i) => ({\r\n x: this.scaled[`x${i}` as 'x1' | 'x2' | 'x3'],\r\n y: this.scaled[`y${i}` as 'y1' | 'y2' | 'y3'],\r\n }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nTriangle.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill' }],\r\n}\r\n\r\nexport default Triangle\r\n","import { RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\r\n\r\nclass VerticalLine extends ScaledLine {\r\n static type = CanvasElementType.verticalLine\r\n\r\n name = 'Vertical line'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.renderContent = this.renderContent.bind(this)\r\n\r\n this.attrs.x2 = this.attrs.x1\r\n this._thumbs = [this._thumbs[0]]\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const domain = this.model.scale.y.domain()\r\n this.attrs.y1 = domain[0]\r\n this.attrs.y2 = domain[1]\r\n this._thumbs[0].fy = () => (this.attrs.y1 + this.attrs.y2) / 2\r\n super.renderContent(context)\r\n }\r\n\r\n moveBy(x: number) {\r\n return (this.attrs.x1 = this.attrs.x2 += x)\r\n }\r\n\r\n resize({ difX }: RequireByKey) {\r\n return this.moveBy(difX)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n return super.getIsInChartView(chart, { omitY: true })\r\n }\r\n}\r\n\r\nexport default VerticalLine\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IXABCDPositionAttrs {\r\n xx: number\r\n xy: number\r\n ax: number\r\n ay: number\r\n bx: number\r\n by: number\r\n cx: number\r\n cy: number\r\n dx: number\r\n dy: number\r\n}\r\n\r\ntype xPoints = 'xx' | 'ax' | 'bx' | 'cx' | 'dx'\r\ntype yPoints = 'xy' | 'ay' | 'by' | 'cy' | 'dy'\r\n\r\nexport interface IXABCDAttrs extends IXABCDPositionAttrs {\r\n fill: string\r\n border: DrawingBorder\r\n lineWidth: number\r\n}\r\n\r\nclass XABCD extends Element {\r\n static type = CanvasElementType.xabcd\r\n\r\n name = 'XABCD pattern'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'x',\r\n () => this.attrs.xx,\r\n () => this.attrs.xy,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.ax,\r\n () => this.attrs.ay,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.bx,\r\n () => this.attrs.by,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.cx,\r\n () => this.attrs.cy,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'd',\r\n () => this.attrs.dx,\r\n () => this.attrs.dy,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n if (this.attrs.lineWidth == null) {\r\n this.attrs.lineWidth = 1\r\n }\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({\r\n x: ['xx', 'ax', 'bx', 'cx', 'dx'],\r\n y: ['xy', 'ay', 'by', 'cy', 'dy'],\r\n })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { xx, xy, ax, ay, bx, by, cx, cy, dx, dy } = this.scaled\r\n const roundedXY = getRoundedObject({ xx, xy, ax, ay, bx, by, cx, cy, dx, dy })\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.translate(offset, offset)\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.xx, roundedXY.xy)\r\n context.lineTo(roundedXY.ax, roundedXY.ay)\r\n context.lineTo(roundedXY.bx, roundedXY.by)\r\n context.lineTo(roundedXY.xx, roundedXY.xy)\r\n context.fill()\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.bx, roundedXY.by)\r\n context.lineTo(roundedXY.cx, roundedXY.cy)\r\n context.lineTo(roundedXY.dx, roundedXY.dy)\r\n context.lineTo(roundedXY.bx, roundedXY.by)\r\n context.fill()\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.ax, roundedXY.ay)\r\n context.lineTo(roundedXY.cx, roundedXY.cy)\r\n context.moveTo(roundedXY.xx, roundedXY.xy)\r\n context.lineTo(roundedXY.dx, roundedXY.dy)\r\n context.stroke()\r\n\r\n const text = new Text(\r\n {\r\n font: { size: 8, style: 'bold' },\r\n lineHeight: 8,\r\n padding: {\r\n top: 2,\r\n right: 2,\r\n bottom: 2,\r\n left: 2,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.start,\r\n fillStyle: '#ffffff',\r\n background: this.attrs.fill || '#000000',\r\n },\r\n this.model\r\n )\r\n\r\n for (const t of Array.from('xabcd')) {\r\n text\r\n .set({\r\n text: t.toUpperCase(),\r\n x: roundedXY[(t + 'x') as xPoints] - 6,\r\n y: roundedXY[(t + 'y') as yPoints] + 12,\r\n } as Partial)\r\n .render(context)\r\n }\r\n\r\n const retLabel = (y1: string, y2: string, y3: string) => {\r\n const len = Math.abs(this.attrs[(y1 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints])\r\n const ret = Math.abs(this.attrs[(y3 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints]) / len\r\n const x = (roundedXY[(y1 + 'x') as xPoints] + roundedXY[(y3 + 'x') as xPoints]) / 2\r\n const y = (roundedXY[(y1 + 'y') as yPoints] + roundedXY[(y3 + 'y') as yPoints]) / 2\r\n return text\r\n .set({\r\n text: ret.toFixed(3),\r\n x,\r\n y,\r\n })\r\n .render(context)\r\n }\r\n\r\n retLabel('x', 'a', 'b')\r\n retLabel('a', 'b', 'c')\r\n retLabel('b', 'c', 'd')\r\n retLabel('x', 'a', 'd')\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const t of Array.from('xabcd')) {\r\n this.attrs[(t + 'x') as xPoints] += x\r\n this.attrs[(t + 'y') as yPoints] += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n this.attrs[(type + 'x') as xPoints] += difX\r\n return (this.attrs[(type + 'y') as yPoints] += difY)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n let t\r\n const xab = (() => {\r\n const result = []\r\n for (t of Array.from('xab')) {\r\n result.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\r\n }\r\n return result\r\n })()\r\n const bcd = (() => {\r\n const result1 = []\r\n for (t of Array.from('bcd')) {\r\n result1.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\r\n }\r\n return result1\r\n })()\r\n if (math.pointInPolygon(area.scaled, xab) || math.pointInPolygon(area.scaled, bcd)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nXABCD.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1 },\r\n ],\r\n}\r\n\r\nexport default XABCD\r\n","import Utils from '../utils'\r\nimport { getContextWithCache } from '../utils/canvas'\r\nimport { captureException, getIsSSr } from '../utils/helpers'\r\n\r\nclass Cache {\r\n constructor() {\r\n this.canvas = getIsSSr() ? null : document.createElement('canvas')\r\n }\r\n\r\n set(callback, width, height) {\r\n this.callback = callback\r\n this.width = width\r\n this.height = height\r\n this.rendered = false\r\n }\r\n\r\n render(context, x, y) {\r\n if (x == null) {\r\n x = 0\r\n }\r\n if (y == null) {\r\n y = 0\r\n }\r\n if (!this.rendered) {\r\n this.refresh()\r\n }\r\n if (this.width < 1 || this.height < 1) {\r\n return\r\n }\r\n\r\n try {\r\n if (this.ratio >= 1 && this.canvas) {\r\n context.drawImage(\r\n this.canvas,\r\n 0,\r\n 0,\r\n ~~(this.width * this.ratio),\r\n ~~(this.height * this.ratio),\r\n x,\r\n y,\r\n this.width,\r\n this.height\r\n )\r\n } else {\r\n context.save()\r\n context.translate(x, y)\r\n this.callback(context)\r\n context.restore()\r\n }\r\n } catch (e) {\r\n captureException(\r\n e,\r\n this.canvas\r\n ? {\r\n extra: {\r\n width: this.width,\r\n height: this.height,\r\n ratio: this.ratio,\r\n cWidth: this.canvas.width,\r\n cHeight: this.canvas.height,\r\n sWidth: window.screen.width,\r\n sHeight: window.screen.height,\r\n },\r\n }\r\n : {}\r\n )\r\n }\r\n }\r\n\r\n refresh() {\r\n if (getIsSSr()) {\r\n return\r\n }\r\n this.canvas.width = this.width\r\n this.canvas.height = this.height\r\n this.context = getContextWithCache(this.canvas)\r\n this.ratio = Utils.getScaleRatio()\r\n Utils.setSizeOnCanvasElement({ canvasElement: this.canvas, width: this.width, height: this.height })\r\n this.context.scale(this.ratio, this.ratio)\r\n\r\n this.callback(this.context)\r\n this.rendered = true\r\n }\r\n}\r\n\r\nexport default Cache\r\n","import { ObjectHash, Theme } from '../../../types/shared'\r\nimport { TextAlign, TextBaseline } from '../../constants/common'\r\nimport { IChartThemeColors, IElementThemeColors, IIndicatorThemeColors } from '../constants'\r\n\r\nexport enum OHLCType {\r\n singleLine = 'singleLine',\r\n dateOnly = 'dateOnly',\r\n timeOnly = 'timeOnly',\r\n}\r\n\r\nexport interface IMargin {\r\n top?: number\r\n right?: number\r\n bottom?: number\r\n left?: number\r\n}\r\n\r\ninterface IPadding {\r\n top?: number\r\n right?: number\r\n bottom?: number\r\n left?: number\r\n}\r\n\r\ninterface IGenericText {\r\n margin: IMargin\r\n font: IFont\r\n}\r\n\r\ninterface IFont {\r\n size?: number\r\n style?: string\r\n weight?: string\r\n family?: string\r\n lineHeight?: number\r\n padding?: IPadding\r\n baseline?: TextBaseline\r\n textAlign?: TextAlign\r\n}\r\n\r\ninterface ISettingsGeneralBase {\r\n Colors: IChartThemeColors\r\n}\r\n\r\nexport interface ISettingsCenterBase {\r\n barWidth: number\r\n barMargin: number\r\n border: number\r\n volumeHeight?: number\r\n}\r\n\r\ninterface ISettingsTopBase {\r\n height: number\r\n}\r\n\r\ninterface ISettingsBottomBase {\r\n height: number\r\n}\r\n\r\ninterface ISettingsLeftBase {\r\n width: number\r\n}\r\n\r\ninterface ISettingsRightBase {\r\n width: number\r\n}\r\n\r\nexport interface ISettings {\r\n ChartSettings: IChartSettings\r\n IndicatorSettings: IIndicatorSettings\r\n MarketSentimentSettings: IMarketSentimentChartSettings\r\n ColorsSettings: Array\r\n ThumbSettings: IThumbSettings\r\n ElementSettings: IElementSettings\r\n isOurSiteRequest?: boolean\r\n}\r\n\r\nexport interface IChartSettings {\r\n general: IChartGeneral\r\n center: ISettingsCenterBase\r\n top: IChartTop\r\n bottom: IChartBottom\r\n left: IChartLeft\r\n right: IChartRight\r\n}\r\n\r\ninterface IChartGeneral {\r\n settingsHeight: number\r\n tickerTimeframeChangeHeight: number\r\n Colors: IChartThemeColors & ObjectHash\r\n}\r\n\r\ninterface IChartTop extends ISettingsTopBase {\r\n baseline: TextBaseline\r\n ticker: IGenericText\r\n ohlc: IOHLC\r\n change: IGenericText\r\n}\r\n\r\ninterface IOHLC extends IGenericText {\r\n type?: OHLCType\r\n}\r\n\r\ninterface IChartBottom extends ISettingsBottomBase {\r\n baseline: TextBaseline\r\n axis: IGenericText\r\n}\r\n\r\ninterface IChartLeft extends ISettingsLeftBase {\r\n overlayLabel: IOverlayLabel\r\n timeframe: IGenericText\r\n volumeAxis: IGenericText\r\n}\r\n\r\ninterface IOverlayLabel extends IGenericText {\r\n labelSpacing: number\r\n}\r\n\r\ninterface IChartRight extends ISettingsRightBase {\r\n axis: IGenericText\r\n}\r\n\r\nexport interface IIndicatorSettings {\r\n general: IIndicatorGeneral\r\n center: ISettingsCenterBase\r\n top: ISettingsTopBase\r\n bottom: ISettingsBottomBase\r\n left: IIndicatorLeft\r\n right: IIndicatorRight\r\n}\r\n\r\ninterface IIndicatorRight extends ISettingsRightBase {\r\n axis: IGenericText\r\n}\r\n\r\ninterface IIndicatorLeft extends ISettingsLeftBase {\r\n indicatorLabel: IIndicatorLabel\r\n}\r\n\r\ninterface IIndicatorLabel extends IGenericText {\r\n labelSpacing: number\r\n}\r\n\r\ninterface IIndicatorGeneral {\r\n Colors: IIndicatorThemeColors\r\n height: number\r\n}\r\n\r\ninterface IMarketSentimentChartSettings {\r\n general: ISettingsGeneralBase\r\n center: ISettingsCenterBase\r\n top: ISettingsTopBase\r\n bottom: ISettingsBottomBase\r\n left: ISettingsLeftBase\r\n right: ISettingsRightBase\r\n}\r\n\r\ninterface IThumbSettings {\r\n size: number\r\n touchSize: number\r\n color: string\r\n borderWidth: number\r\n borderColor: string\r\n}\r\n\r\ninterface IElementSettings {\r\n Colors: IElementThemeColors\r\n defaultFill: string\r\n defaultTransparentFill: string\r\n}\r\n","export enum ChartMinWidthBreakpoints {\r\n xs = 0,\r\n s = 480,\r\n m = 768,\r\n l = 1024,\r\n}\r\n\r\nexport function getChartBreakpoints(chartWidthInPx: number) {\r\n return {\r\n isXs: chartWidthInPx >= ChartMinWidthBreakpoints.xs,\r\n isS: chartWidthInPx >= ChartMinWidthBreakpoints.s,\r\n isM: chartWidthInPx >= ChartMinWidthBreakpoints.m,\r\n isL: chartWidthInPx >= ChartMinWidthBreakpoints.l,\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\nimport merge from 'lodash.merge'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n CustomSpineEvents,\r\n Instrument,\r\n Maybe,\r\n RequireByKey,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Cache from '../canvas/cache'\r\nimport Element from '../canvas/element'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport {\r\n CHART_MARGIN,\r\n ChartElementType,\r\n FONT_SIZE,\r\n IndicatorType,\r\n IntradayTimeframeInterval,\r\n LINE_HEIGHT,\r\n MONTHS,\r\n OFFSET,\r\n PADDING,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TIMEFRAMES_WITH_PRE_MARKET,\r\n TextAlign,\r\n TextBaseline,\r\n getTimeframeLabel,\r\n} from '../constants/common'\r\nimport {\r\n getIsSmallIndexChart,\r\n getPercentageFromValue,\r\n getTranslate,\r\n getValueFromPercentage,\r\n} from '../controllers/renderUtils'\r\nimport Chart from '../models/chart'\r\nimport { getColorOverwrites } from '../models/chart_settings'\r\nimport { ISettings, OHLCType } from '../models/chart_settings/interfaces'\r\nimport { darkerWickColors, thinBarColorsOverride } from '../models/constants'\r\nimport mouseModel from '../models/mouse'\r\nimport PaneModel, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Overlay from '../overlays/overlay'\r\nimport { overlaysByType } from '../overlays/overlays'\r\nimport utils, { dateFromDateString, isRedesignedPage, numberToStringWithUnitsSuffix } from '../utils'\r\nimport {\r\n ITickerChange,\r\n getBarWidthWithMargin,\r\n getBarWithoutMarginWidth,\r\n getChangeColor,\r\n getHalfBarWidth,\r\n getShouldUseDarkerWickColors,\r\n getTickerChange,\r\n getTickerChangeFromCloseValues,\r\n getVirtualTimeframeTradedDates,\r\n renderCross,\r\n round,\r\n unmountCanvas,\r\n} from '../utils/chart'\r\nimport { convertColorToHEX, getHEXWithSpecificAplha, getHSVAFromColor, stringifyHSVAColor } from '../utils/colors'\r\nimport { setElementCursor } from '../utils/cursor'\r\nimport { drawInVisibleArea, getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { getChartBreakpoints } from './utils'\r\n\r\nexport interface BaseChartAttrs {\r\n overlays: Required['overlays']\r\n}\r\n\r\ntype OhlcLineElements = Array<{ text: string; color: string } | 'space'>\r\n\r\ninterface LastOHLCAttrs {\r\n text: string\r\n x: number\r\n y: number\r\n width: number\r\n textBaseline: TextBaseline\r\n textAlign: TextAlign\r\n}\r\n\r\ninterface IRenderOHLCParameters {\r\n context: CanvasRenderingContext2D\r\n date: Maybe\r\n open?: Maybe\r\n high?: Maybe\r\n low?: Maybe\r\n close?: Maybe\r\n volume?: Maybe\r\n afterHour?: string\r\n isSmallIndexChart?: boolean\r\n isNewestOHLC?: boolean\r\n directRender?: boolean\r\n time?: string\r\n changePercentage?: Maybe\r\n}\r\n\r\ninterface XAxisLabel {\r\n x: number\r\n text: string\r\n textWidth: number\r\n hasPriority?: boolean\r\n allowedOverflow?: number\r\n}\r\n\r\ninterface IRenderXAxisProps {\r\n textRenderer: Text\r\n startBarIndex: number\r\n endBarIndex: number\r\n}\r\n\r\nconst getDateString = ({ date, timeframe }: { date: Date; timeframe: TIMEFRAME }) => {\r\n let dateString = ''\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n case TIMEFRAME.i10:\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n const t =\r\n (((date.getHours() + 11) % 12) + 1).toString().padLeft('00') +\r\n ':' +\r\n date.getMinutes().toString().padLeft('00') +\r\n (date.getHours() < 12 ? 'AM' : 'PM')\r\n dateString = `${MONTHS[month]} ${day} ${t}`\r\n break\r\n case TIMEFRAME.d:\r\n case TIMEFRAME.w:\r\n dateString = `${MONTHS[month]} ${day}`\r\n break\r\n case TIMEFRAME.m:\r\n dateString = `${MONTHS[month]} ${year}`\r\n break\r\n default:\r\n break\r\n }\r\n\r\n return dateString\r\n}\r\n\r\nconst getIsOverlapping = ({\r\n x,\r\n textWidth,\r\n renderedLabelRanges,\r\n}: {\r\n x: number\r\n textWidth: number\r\n renderedLabelRanges: Array<{ from: number; to: number }>\r\n}) =>\r\n renderedLabelRanges.some(({ from, to }) => {\r\n const minX = x - textWidth / 2\r\n const maxX = x + textWidth / 2\r\n return (from < maxX && maxX < to) || (from < minX && minX < to)\r\n })\r\n\r\nfunction getClosestDifferentMinMaxValueIndices(\r\n currentMinIndex: number,\r\n currentMaxIndex: number,\r\n high: number[],\r\n low: number[]\r\n): { minIndex: number; maxIndex: number } {\r\n const hasPreviousIndex = currentMinIndex > 0\r\n const hasNextIndex = currentMaxIndex < high.length - 1\r\n let minIndex = currentMinIndex\r\n let maxIndex = currentMaxIndex\r\n if (hasPreviousIndex) {\r\n minIndex -= 1\r\n }\r\n if (hasNextIndex) {\r\n maxIndex += 1\r\n }\r\n\r\n if (low[minIndex] === high[maxIndex] && (hasPreviousIndex || hasNextIndex)) {\r\n return getClosestDifferentMinMaxValueIndices(minIndex, maxIndex, high, low)\r\n }\r\n\r\n return low[minIndex] < high[maxIndex] ? { minIndex, maxIndex } : { minIndex: maxIndex, maxIndex: minIndex }\r\n}\r\n\r\nconst SMALL_INDEX_CHART_LABEL_BUFFER = 15\r\n\r\nconst gray300 = tailwindColors.gray[300]\r\n\r\nclass BaseChart extends Element {\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\r\n return this.model.width - ChartSettings.left.width - ChartSettings.right.width\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\r\n return this.paneModel.height - ChartSettings.top.height - ChartSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n static getNumOfBarsBuffer({ overlays }: RequireByKey) {\r\n return Math.max(0, ...overlays.map((overlay) => overlaysByType[overlay.type].getNumOfBarsBuffer(overlay)))\r\n }\r\n\r\n static label = 'Chart'\r\n static iconName = ''\r\n\r\n paneModel: PaneModel\r\n model: Chart\r\n data: Quote\r\n specificChartFunctionality: SpecificChartFunctionality\r\n tickerWidth = 0\r\n changeWidth = 0\r\n lastOhlc: Array> = []\r\n overlays: Overlay[] = []\r\n isLargeChart?: boolean\r\n shouldRenderVolume = true\r\n afterChange: {\r\n x: number\r\n y: number\r\n width: number\r\n } | null = null\r\n\r\n declare setupAxisTimeFrame: string\r\n declare volumeFY: d3.ScaleLinear\r\n declare tickerText: Text\r\n declare baseCache: Cache\r\n declare leftOffset: number\r\n declare context: CanvasRenderingContext2D\r\n declare width: number\r\n declare height: number\r\n declare isMobile: boolean\r\n\r\n constructor(values: Partial, paneModel: PaneModel) {\r\n super(values, paneModel)\r\n\r\n this.paneModel = paneModel\r\n this.model = this.paneModel.chart()\r\n this.data = this.model.quote()\r\n const chartLayoutModel = this.model.chart_layout()\r\n this.specificChartFunctionality = chartLayoutModel.specificChartFunctionality\r\n this.isLargeChart = chartLayoutModel.isLargeChart\r\n this.isMobile = utils.isMobile(true)\r\n\r\n this.overlays = []\r\n if (values.overlays) {\r\n for (const overlayDefinition of values.overlays) {\r\n // overlayDefinition.color coming from DB is always string however overlays\r\n // internaly didn't use format as in db (type, color, period) but rather\r\n // more overlay specific parameters eg. (BB: topColor, bottomColor, etc.)\r\n // thus overlayDefinition.color might be undefined\r\n // approach could be reworked in https://github.com/finvizhq/charts/issues/770\r\n // but for now (!overlayDefinition.color) check solve issue as well\r\n const overlay = overlaysByType[overlayDefinition.type].fromObject(\r\n {\r\n ...overlayDefinition,\r\n color:\r\n !overlayDefinition.color || overlayDefinition.color.includes('|')\r\n ? ''\r\n : convertColorToHEX(overlayDefinition.color),\r\n },\r\n this.paneModel\r\n )\r\n this.addOverlay(overlay)\r\n }\r\n delete values.overlays\r\n }\r\n\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderCrossText = this.renderCrossText.bind(this)\r\n this.setupCache = this.setupCache.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n\r\n // this.paneModel.bind('update', this.setupAxis.bind(this))\r\n this.paneModel.bind('update', this.setupCache)\r\n this.paneModel.bind('change', this.trigger.bind(this, 'change'))\r\n this.model = this.paneModel.chart()\r\n // this.model.bind('change', this.setupAxis.bind(this))\r\n this.model.bind('change', this.setupCache)\r\n this.model.bind('change', this.trigger.bind(this, 'change'))\r\n this.model.bind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\r\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\r\n this.model.bind('destroy', () => {\r\n this.model.unbind('change', this.setupCache)\r\n this.model.unbind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\r\n mouseModel.unbind('change', mouseModelChangeHandler)\r\n unmountCanvas(this.baseCache.canvas)\r\n })\r\n mouseModel.bind('change', mouseModelChangeHandler)\r\n\r\n this.model.chart_layout().bind('theme', this.setupCache)\r\n this.model.chart_layout().bind('update', this.updateShouldRenderVolume.bind(this))\r\n\r\n this.setupCache()\r\n }\r\n\r\n renderChart() {\r\n throw Error('Implement renderChart')\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n this.data = this.model.quote()\r\n this.leftOffset = this.model.leftOffset\r\n this.context = context\r\n\r\n if (this.data.close.length === 0) {\r\n this.renderChartNotAvailable()\r\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\r\n return\r\n }\r\n\r\n this.context.save()\r\n this.clip()\r\n this.renderVolume()\r\n this.renderChart()\r\n this.renderOverlays()\r\n this.renderPrevClose()\r\n this.renderFadeExtendedHours()\r\n this.context.restore()\r\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\r\n }\r\n\r\n renderGrid(context: CanvasRenderingContext2D) {\r\n this.data = this.model.quote()\r\n this.leftOffset = this.model.leftOffset\r\n this.context = context\r\n // text, xAxis, volumeAxis\r\n this.renderXAxis()\r\n this.baseCache.render(context)\r\n }\r\n\r\n renderTicker(context: CanvasRenderingContext2D) {\r\n if (this.tickerText) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n context.translate(ChartSettings.left.width, 0)\r\n this.tickerText.render(context)\r\n\r\n if (getIsSmallIndexChart(this.specificChartFunctionality) && this.data.ticker === 'RUSSELL 2000') {\r\n const { Colors } = ChartSettings.general\r\n new Text(\r\n {\r\n text: 'ETF',\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top! + FONT_SIZE.XXS + OFFSET.XXS,\r\n font: { size: FONT_SIZE.XXS },\r\n fillStyle: Colors.text,\r\n textBaseline: ChartSettings.top.baseline,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n context.translate(-ChartSettings.left.width, 0)\r\n }\r\n }\r\n\r\n renderTimeframe(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const quote = this.model.quote()\r\n const y = (this.height - this.volumeFY.range()[1] - 4) / 2\r\n\r\n return new Text(\r\n {\r\n text: quote.instrument === Instrument.Group ? 'YEAR PERFORMANCE %' : getTimeframeLabel(quote.timeframe),\r\n x: ChartSettings.left.timeframe.margin.left,\r\n y: ChartSettings.top.height + y + (ChartSettings.left.timeframe.margin.top ?? 0),\r\n angle: -90,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.timeframe.font),\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings, isOurSiteRequest } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n context.save()\r\n context.translate(ChartSettings.left.width, 0)\r\n\r\n if (!getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.tickerText = new Text(\r\n {\r\n text: this.data.name || this.data.ticker,\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.ticker.font),\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: Colors.text,\r\n },\r\n this.paneModel\r\n )\r\n } else {\r\n this.tickerText = new Text(\r\n {\r\n text: this.data.name || this.data.ticker,\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top,\r\n font: { size: FONT_SIZE.L, style: 'bold' },\r\n fillStyle: Colors.text,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n this.tickerWidth = this.tickerText.measure(context)\r\n\r\n // render watermark on backend chart\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n let yOffset = 0\r\n if (!isOurSiteRequest) {\r\n yOffset = this.isLargeChart ? -2 : -3\r\n }\r\n new Text(\r\n {\r\n text: '© finviz.com',\r\n x: this.width + ChartSettings.right.width - 2,\r\n y: 1 + yOffset,\r\n font: { size: isOurSiteRequest ? FONT_SIZE.XS : FONT_SIZE.M },\r\n textAlign: TextAlign.right,\r\n textBaseline: TextBaseline.top,\r\n fillStyle: isOurSiteRequest ? 'rgb(136, 193, 233)' : tailwindColors.finviz.blue,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderChange({ context })\r\n if (!this.lastOhlc[0]) {\r\n this.getOHLC({ context, directRender: false })\r\n }\r\n this.getOHLC({ context })\r\n }\r\n\r\n context.restore()\r\n if (!this.getIsRedesignedChart() && !getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderTimeframe(context)\r\n }\r\n }\r\n\r\n getOHLC({\r\n context,\r\n directRender = true,\r\n data,\r\n date,\r\n dateString = null,\r\n changePercentage = null,\r\n }: {\r\n context: CanvasRenderingContext2D\r\n directRender?: boolean\r\n data?: {\r\n open?: string\r\n high?: string\r\n low?: string\r\n close?: string\r\n volume?: string\r\n }\r\n date?: Date\r\n dateString?: string | null\r\n changePercentage?: ITickerChange | null\r\n }) {\r\n if (!this.data.lastDate) return\r\n\r\n // modulo \"parsing\" is 100% faster than with str.slice()\r\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${this.data.lastDate % 100}` // YYYYMMDD / 20211118 => Nov 18\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderOHLC({\r\n context,\r\n date: lastDate,\r\n isSmallIndexChart: true,\r\n isNewestOHLC: true,\r\n directRender,\r\n })\r\n } else if (data && date) {\r\n this.renderOHLC({\r\n context,\r\n date: getDateString({ date, timeframe: this.data.timeframe }),\r\n open: data.open,\r\n high: data.high,\r\n low: data.low,\r\n close: data.close,\r\n volume: numberToStringWithUnitsSuffix(Number(data.volume)),\r\n directRender,\r\n changePercentage,\r\n })\r\n } else if (dateString !== null) {\r\n this.renderOHLC({\r\n context,\r\n date: dateString,\r\n open: null,\r\n high: null,\r\n low: null,\r\n close: null,\r\n volume: null,\r\n directRender,\r\n })\r\n } else {\r\n this.renderOHLC({\r\n context,\r\n date: lastDate,\r\n afterHour:\r\n Number.isFinite(this.data.afterClose) && this.data.afterClose !== this.data.lastClose\r\n ? this.roundOhlc(this.data.afterClose)\r\n : undefined,\r\n volume: numberToStringWithUnitsSuffix(this.data.lastVolume),\r\n isNewestOHLC: true,\r\n time: utils.dateFromUnixTimestamp(this.data.date.last()!).toLocaleTimeString('en-US', {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n }),\r\n directRender,\r\n ...this.getRoundedLastData(),\r\n })\r\n }\r\n }\r\n\r\n getRoundedLastData() {\r\n return {\r\n open: this.roundOhlc(this.data.lastOpen),\r\n high: this.roundOhlc(this.data.lastHigh),\r\n low: this.roundOhlc(this.data.lastLow),\r\n close: this.roundOhlc(this.data.lastClose),\r\n }\r\n }\r\n\r\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabelsQuotePage(context)\r\n } else if (this.data.close.length !== 0) {\r\n this.renderOverlaysLabelsChartsPage(context)\r\n }\r\n }\r\n\r\n renderOverlaysLabelsQuotePage(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const text = new Text(\r\n {\r\n x: ChartSettings.left.overlayLabel.margin.left,\r\n y: ChartSettings.top.height + ChartSettings.left.overlayLabel.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.overlayLabel.font),\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n for (const overlay of this.overlays) {\r\n if (!overlay.isRenderedOverlaysLabel()) {\r\n continue\r\n }\r\n text\r\n .set({\r\n text: overlay.toString(),\r\n y: text.get('y')! + ChartSettings.left.overlayLabel.labelSpacing,\r\n fillStyle: overlay.getLabelColor(),\r\n })\r\n .render(context)\r\n }\r\n }\r\n\r\n getYAxisLeftMargin() {\r\n if (this.data.instrument === Instrument.Crypto && this.data.lastClose <= 0.001) {\r\n return 3\r\n }\r\n return 8\r\n }\r\n\r\n getYAxisLastCloseLabel({ lastClose, firstVisibleClose }: { lastClose: number; firstVisibleClose?: number | null }) {\r\n if (typeof firstVisibleClose === 'number' && this.model.scale === ScaleType.Percentage) {\r\n return `${this.round(getPercentageFromValue({ number: lastClose, base: firstVisibleClose }), 2)}%`\r\n }\r\n return this.round(lastClose)\r\n }\r\n\r\n renderYAxis(\r\n context: CanvasRenderingContext2D,\r\n { lastClose }: RequireByKey, 'lastClose'> = this.data,\r\n renderLabels = true\r\n ) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let y, lineTicks, textTicks, lastCloseLabel\r\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\r\n translate.do()\r\n const tickCount = Math.floor(this.paneModel.height / 35)\r\n const minMax = this.getMinMax()\r\n const { firstVisibleClose } = minMax\r\n const height = this.height\r\n let stepPrice = 0\r\n let placesAxis\r\n\r\n switch (this.model.scale) {\r\n case ScaleType.Percentage: {\r\n if (!firstVisibleClose) return\r\n\r\n const scaleRange = this.paneModel.scaleRange\r\n const { min, max } = scaleRange || minMax\r\n\r\n this.model.updateAttribute('firstBarClose', firstVisibleClose)\r\n\r\n const minPerc = getPercentageFromValue({ number: min, base: firstVisibleClose })\r\n const maxPerc = getPercentageFromValue({ number: max, base: firstVisibleClose })\r\n\r\n const percScale = d3.scaleLinear().range([0, this.height]).domain([maxPerc, minPerc]).nice(10)\r\n textTicks = percScale.ticks(Math.min(tickCount, 9))\r\n lineTicks = textTicks.map((tick) => getValueFromPercentage({ number: tick, base: firstVisibleClose }))\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\r\n break\r\n }\r\n case ScaleType.Logarithmic: {\r\n if (!firstVisibleClose) return\r\n\r\n const scaleRange = this.paneModel.scaleRange\r\n const { min, max } = scaleRange || minMax\r\n lineTicks = [Math.floor(min)]\r\n const pixelGap = 30\r\n\r\n const negativeScale = []\r\n if (min < 0) {\r\n let previousNegativeTick = Math.min(0, max)\r\n while (this.paneModel.scale.y(previousNegativeTick) + pixelGap < this.paneModel.scale.y(min)) {\r\n const tick = this.paneModel.scale.y.invert(this.paneModel.scale.y(previousNegativeTick) + pixelGap)\r\n if (previousNegativeTick === tick) {\r\n break\r\n }\r\n const range = d3.nice(-previousNegativeTick, -tick, 2)\r\n previousNegativeTick = -range[range.length - 1]\r\n negativeScale.unshift(previousNegativeTick)\r\n }\r\n }\r\n\r\n const positiveScale = []\r\n if (max > 0) {\r\n positiveScale.push(Math.max(this.paneModel.scale.y.invert(this.paneModel.scale.y(min) + pixelGap), 0))\r\n }\r\n while (this.paneModel.scale.y(positiveScale[positiveScale.length - 1]) - pixelGap > 0) {\r\n const previousTick = positiveScale[positiveScale.length - 1]\r\n const positiveScaleY = this.paneModel.scale.y(positiveScale[positiveScale.length - 1])\r\n const tick = this.paneModel.scale.y.invert(positiveScaleY - pixelGap)\r\n if (previousTick === tick) {\r\n break\r\n }\r\n\r\n const range = d3.nice(previousTick, tick, 2)\r\n positiveScale.push(range[range.length - 1])\r\n }\r\n lineTicks = [...negativeScale, ...positiveScale]\r\n textTicks = lineTicks\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\r\n break\r\n }\r\n default:\r\n // default to linear scale type\r\n lineTicks = this.paneModel.scale.y.ticks(Math.min(tickCount, 9))\r\n textTicks = lineTicks\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\r\n }\r\n\r\n if (textTicks.length >= 2) {\r\n stepPrice = Math.abs(textTicks[1] - textTicks[0])\r\n }\r\n if (\r\n stepPrice > 10 ||\r\n (getIsSmallIndexChart(this.specificChartFunctionality) && Math.round(textTicks[0]).toString().length > 3) // if small index chart max tick is less than 999 (3 digits) allow for decimals in axis labels\r\n ) {\r\n placesAxis = 0\r\n }\r\n\r\n const getYLineText = (val: number, places?: number) => {\r\n switch (this.model.scale) {\r\n case ScaleType.Percentage:\r\n return `${val}%`\r\n default:\r\n return this.round(val, places)\r\n }\r\n }\r\n\r\n const yTickText = new Text(\r\n {\r\n x: this.width + this.getYAxisLeftMargin() + ChartSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n )\r\n\r\n let yTickLine = this.getYLine()\r\n const resetYTicksStyles = () => {\r\n yTickText.set({\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n })\r\n yTickLine = this.getYLine()\r\n }\r\n for (let i = 0; i < lineTicks.length; i++) {\r\n y = Math.round(this.fy(lineTicks[i]))\r\n if (y < 0 || y > height) continue\r\n if (y === height) y -= 1 // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate, to compensate for this we subtract 1px\r\n yTickLine.set({ y1: y, y2: y })\r\n yTickText.set({\r\n text: getYLineText(textTicks[i], placesAxis),\r\n y,\r\n })\r\n if (this.model.scale === ScaleType.Percentage && textTicks[i] === 0) {\r\n yTickLine.set({ strokeStyle: Colors.text })\r\n yTickText.set({\r\n font: { weight: 'bold', size: yTickText.attrs.font.size },\r\n fillStyle: Colors.percentageZeroLineText,\r\n })\r\n yTickLine.render(context)\r\n yTickText.render(context)\r\n resetYTicksStyles()\r\n } else {\r\n yTickLine.render(context)\r\n yTickText.render(context)\r\n }\r\n }\r\n translate.undo()\r\n\r\n if (renderLabels) {\r\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: lastCloseLabel })\r\n // if (typeof this.data.afterClose === 'number') {\r\n // this.renderYAxisLabel({\r\n // context,\r\n // yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\r\n // mainLabelValue: lastClose,\r\n // secondaryLabelValue: this.data.afterClose,\r\n // }),\r\n // label: this.getYAxisLastCloseLabel({ lastClose: this.data.afterClose, firstVisibleClose }),\r\n // background: this.getSecondaryLabelBackgroundColor(),\r\n // })\r\n // }\r\n }\r\n }\r\n\r\n getSecondaryLabelBackgroundColor() {\r\n return stringifyHSVAColor(\r\n {\r\n ...getHSVAFromColor(this.getChartLayoutSettings().ChartSettings.general.Colors.currentBackground),\r\n s: 0.3,\r\n },\r\n 'hex'\r\n )\r\n }\r\n\r\n getYAxisSecondaryLabelYCoordinate({\r\n mainLabelValue,\r\n secondaryLabelValue,\r\n }: {\r\n mainLabelValue: number\r\n secondaryLabelValue: number\r\n }) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { lineHeight } = ChartSettings.right.axis.font\r\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\r\n\r\n const direction = Math.sign(mainLabelValue - secondaryLabelValue) || 1\r\n const offset = (lineHeight ?? LINE_HEIGHT.S) + (padding.top ?? PADDING.XXS) + (padding.bottom ?? PADDING.XXS)\r\n const mainLabelValuePosition = Math.round(this.fy(mainLabelValue))\r\n const secondaryLabelValuePosition = Math.round(this.fy(secondaryLabelValue))\r\n const offsetedY = mainLabelValuePosition + offset * direction\r\n\r\n return Math.abs(secondaryLabelValuePosition - mainLabelValuePosition) > offset\r\n ? secondaryLabelValuePosition\r\n : offsetedY\r\n }\r\n\r\n renderYAxisLabel({\r\n context,\r\n yCoordinate,\r\n label,\r\n background,\r\n }: {\r\n context: CanvasRenderingContext2D\r\n yCoordinate: number\r\n label: string\r\n background?: string\r\n }) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\r\n const { Colors } = ChartSettings.general\r\n const { size, lineHeight } = ChartSettings.right.axis.font\r\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\r\n\r\n translate.do()\r\n new Text(\r\n {\r\n text: label,\r\n x: this.width + this.getYAxisLeftMargin() - padding.left + ChartSettings.right.axis.margin.left!,\r\n y: yCoordinate,\r\n font: Text.getMergedPropsWithDefaults('font', { size, style: 'bold' }),\r\n lineHeight,\r\n padding,\r\n textBaseline: TextBaseline.middle,\r\n fillStyle:\r\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen ? 'black' : Colors.currentText,\r\n background: background || Colors.currentBackground,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n translate.undo()\r\n }\r\n\r\n renderXAxis() {\r\n const { leftOffset, width } = this\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n this.context.save()\r\n if (\r\n this.data.getDrawDays() !== 1 &&\r\n !getIsSmallIndexChart(this.specificChartFunctionality) &&\r\n this.data.instrument !== Instrument.MarketSentiment\r\n ) {\r\n this.clip(true)\r\n }\r\n this.context.translate(ChartSettings.left.width, ChartSettings.top.height)\r\n const textRenderer = new Text(\r\n {\r\n y: this.height + ChartSettings.bottom.axis.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.bottom.axis.font.size }),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.top,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n\r\n // Ticks are placed at the start of each timeframe period (hour/day/month/year).\r\n // The \"-1\" in the code ensures we start searching from one bar outside the visible area,\r\n // avoiding a tick on the first visible index unless it marks the start of a new timeframe period.\r\n // For example, if the start of December is on December 3rd and the first visible bar is on December 14th,\r\n // we won't display a tick.\r\n const startBarIndex = Math.max(\r\n getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset,\r\n }).index - 1,\r\n 0\r\n )\r\n\r\n const endBarIndex = Math.min(\r\n getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset,\r\n chartWidth: width,\r\n }).index + 1,\r\n this.data.close.length - 1\r\n )\r\n\r\n switch (this.data.timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n if (this.data.instrument === Instrument.Stock) {\r\n if (\r\n this.type === ChartElementType.LineChart &&\r\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen &&\r\n this.data.timeframe === 'i5'\r\n ) {\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n } else {\r\n this.renderIntradayXAxis(textRenderer)\r\n }\r\n } else {\r\n this.renderIntradayXAxisFutures({ textRenderer, startBarIndex, endBarIndex })\r\n }\r\n break\r\n case TIMEFRAME.i10:\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderIntradayXAxis(textRenderer)\r\n } else {\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n }\r\n break\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.d:\r\n this.renderDailyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.w:\r\n this.renderWeeklyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.m:\r\n this.renderMonthlyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n default:\r\n break\r\n }\r\n this.context.restore()\r\n }\r\n\r\n isXPointVisible(x: number, buffer = 0) {\r\n return x >= 0 - buffer && x <= this.width + buffer\r\n }\r\n\r\n renderXAxisLabels({\r\n labels,\r\n textRenderer,\r\n allowedOverflow = 0,\r\n }: {\r\n labels: Omit[]\r\n textRenderer: Text\r\n allowedOverflow?: number\r\n }) {\r\n const sortedLabels: XAxisLabel[] = []\r\n const renderedLabelRanges: Array<{ from: number; to: number }> = []\r\n labels.reverse().forEach((label) => {\r\n textRenderer.set({ text: label.text })\r\n const textWidth = Math.floor(textRenderer.measure(this.context))\r\n const newLabel = { ...label, textWidth }\r\n if (label.hasPriority) {\r\n sortedLabels.unshift(newLabel)\r\n } else {\r\n sortedLabels.push(newLabel)\r\n }\r\n })\r\n\r\n sortedLabels.forEach(({ x, text, textWidth }) => {\r\n if (!this.isXPointVisible(x, allowedOverflow)) {\r\n return\r\n }\r\n const halfOfTextWidth = textWidth / 2\r\n const overflowLeft = x - halfOfTextWidth + allowedOverflow\r\n const overflowRight = this.width - (x + halfOfTextWidth) + allowedOverflow\r\n let labelX = x\r\n if (overflowLeft < 0) {\r\n labelX = Math.round(x - overflowLeft)\r\n } else if (overflowRight < 0) {\r\n labelX = Math.round(x + overflowRight)\r\n }\r\n if (getIsOverlapping({ x: labelX, textWidth, renderedLabelRanges })) {\r\n return\r\n }\r\n renderedLabelRanges.push({\r\n from: labelX - halfOfTextWidth - OFFSET.M,\r\n to: labelX + halfOfTextWidth + OFFSET.M,\r\n })\r\n textRenderer.set({ text, x: labelX })\r\n textRenderer.render(this.context)\r\n })\r\n }\r\n\r\n renderIntradayXAxis(textRenderer: Text) {\r\n const interval = IntradayTimeframeInterval[this.data.timeframe as keyof typeof IntradayTimeframeInterval]\r\n const marketStartHour = ~~(this.data.marketStartMinutes / 60)\r\n let marketEndHour = 15 + Math.ceil(this.data.aftermarketLengthMinutes / 60)\r\n const labels = []\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n marketEndHour = 16\r\n }\r\n\r\n const xLine = this.getXLine()\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: this.model.zoomFactor,\r\n chartLayout: this.model.chart_layout(),\r\n })\r\n\r\n const dayToOffset = this.data.getDayToOffset()\r\n const isSmallIndexChart = getIsSmallIndexChart(this.specificChartFunctionality)\r\n const allowedOverflow = isSmallIndexChart ? SMALL_INDEX_CHART_LABEL_BUFFER : 0\r\n for (const day in dayToOffset) {\r\n const dayIndex = dayToOffset[day]\r\n const date = dateFromDateString(day)\r\n\r\n for (let i = marketStartHour; i <= marketEndHour; i++) {\r\n let x =\r\n ((i * 60 - this.data.marketStartMinutes) / interval) * barWidth +\r\n dayIndex * (this.data.drawMinutesPerDay / interval) * barWidth +\r\n this.leftOffset\r\n if (!this.isXPointVisible(x, allowedOverflow)) {\r\n continue\r\n }\r\n let roundedX = Math.round(x)\r\n\r\n if (i === marketStartHour) {\r\n if (isSmallIndexChart) {\r\n roundedX = Math.round(x - 3 + (30 / interval) * barWidth)\r\n // ~9:30AM\r\n xLine\r\n .set({\r\n x1: roundedX,\r\n x2: roundedX,\r\n })\r\n .render(this.context)\r\n continue\r\n }\r\n if (this.data.premarketLengthMinutes === 0) {\r\n // If there is no premarket, day starts at 9:30 AM\r\n x += (30 / interval) * barWidth\r\n }\r\n roundedX = Math.round(x)\r\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\r\n labels.push({\r\n hasPriority: true,\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n x: roundedX,\r\n })\r\n } else {\r\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\r\n labels.push({\r\n text: ((i + 11) % 12) + 1 + (i < 12 ? 'AM' : 'PM'),\r\n x: roundedX,\r\n })\r\n }\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer, allowedOverflow })\r\n }\r\n\r\n renderIntradayXAxisFutures({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastDay = ''\r\n let lastHours = NaN\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n const hours = date.getHours()\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n\r\n if (day !== lastDay) {\r\n lastDay = day\r\n lastHours = hours\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n x,\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n })\r\n } else if (hours % 2 === 0 && hours !== lastHours) {\r\n lastHours = hours\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({ x, text: ((hours + 11) % 12) + 1 + (hours < 12 ? 'AM' : 'PM') })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n render15MinXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastDay = ''\r\n let x = 0\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n if (day !== lastDay) {\r\n lastDay = day\r\n if (this.data.instrument === Instrument.Stock) {\r\n const barAtMinute = date.getMinutes() + date.getHours() * 60\r\n const indexOffset = (barAtMinute - this.data.marketStartMinutes) / this.data.interval\r\n x = Math.round(this.paneModel.scale.x(this.data.barIndex[i] - indexOffset) + this.leftOffset)\r\n } else {\r\n x = Math.round(this.fx(i) + this.leftOffset)\r\n }\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n x,\r\n })\r\n }\r\n }\r\n\r\n // Offscreen only - if lastDate !== lastBarDate add tick\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${(this.data.lastDate % 100)\r\n .toString()\r\n .padLeft('00')}` // YYYYMMDD / 20211118 => Nov 18\r\n\r\n if (labels.length > 0 && labels[labels.length - 1].text !== lastDate) {\r\n const barsInDay = this.data.getBarsInDay()!\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: this.model.zoomFactor,\r\n chartLayout: this.model.chart_layout(),\r\n })\r\n const dayWidth = barsInDay * barWidth\r\n x += dayWidth\r\n labels.push({\r\n text: lastDate,\r\n x,\r\n })\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n }\r\n }\r\n\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderDailyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n hasPriority: date.getMonth() === 0,\r\n text: date.getMonth() === 0 ? date.getFullYear().toString() : MONTHS[date.getMonth()],\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderWeeklyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n if (date.getMonth() % 3 === 0) {\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n } else {\r\n new Line(\r\n {\r\n x1: x,\r\n x2: x,\r\n y1: 0,\r\n y2: this.height,\r\n strokeStyle: Colors.gridSecondary,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n }\r\n const isYearLabel = date.getMonth() === 0\r\n labels.push({\r\n text: isYearLabel ? date.getFullYear().toString().substring(2) : MONTHS[date.getMonth()][0],\r\n hasPriority: isYearLabel,\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderMonthlyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastYear = null\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const year = date.getFullYear()\r\n const isJanuary = date.getMonth() === 0\r\n if (year !== lastYear && (labels.length !== 0 || isJanuary)) {\r\n lastYear = year\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n text: date.getFullYear().toString(),\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n handleIndicatorsChange() {\r\n this.updateShouldRenderVolume()\r\n this.setupCache()\r\n this.trigger('change')\r\n }\r\n\r\n updateShouldRenderVolume() {\r\n this.shouldRenderVolume = !this.model.chart_layout().getIsIndicatorPresent(IndicatorType.Vol)\r\n }\r\n\r\n getVolumeTicks(count: number, maxHeight: number, fontHeight: number): number[] {\r\n const maxCount = 5\r\n const minCount = 1\r\n if (count > maxCount) {\r\n count = maxCount\r\n }\r\n const ticks = this.volumeFY.ticks(count).filter((tick) => tick !== 0)\r\n if (count <= minCount) {\r\n return [ticks[ticks.length - 1]]\r\n }\r\n // ticks are rendered on middle line so we have +- 1/2 of font size above and below range[min,max]\r\n // so we already have +-1 fontsize space, but in some cases that wouldn't be enough so we need to scale\r\n // dynamically, we add 3px of space per tick gap\r\n if (ticks.length * fontHeight + (ticks.length - 1) * 3 > maxHeight) {\r\n return this.getVolumeTicks(count - 1, maxHeight, fontHeight)\r\n }\r\n return ticks\r\n }\r\n\r\n renderVolumeAxis(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n context.save()\r\n const relativeVolume = Math.max(0, Math.min(2, this.data.relativeVolume))\r\n\r\n const x = 20\r\n const fy = (y: number) => ChartSettings.top.height + this.height - this.height * (0.5 * y)\r\n const height = this.height * (0.5 * relativeVolume)\r\n\r\n const label = new Text(\r\n {\r\n x: 15,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n for (let i = 0.5; i <= 2; i += 0.5) {\r\n const y = Math.round(fy(i))\r\n label\r\n .set({\r\n text: i.toFixed(1),\r\n y: y,\r\n })\r\n .render(context)\r\n\r\n context.set('strokeStyle', 'rgb(130, 130, 130)')\r\n context.beginPath()\r\n context.setLineDash([2, 3])\r\n context.translate(0, 0.5)\r\n context.moveTo(x, y)\r\n context.lineTo(x + 7, y)\r\n context.translate(0, -0.5)\r\n context.stroke()\r\n }\r\n\r\n context.set('fillStyle', 'rgba(0, 135, 255, 0.58)')\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', Colors.grid)\r\n context.setLineDash([])\r\n\r\n context.fillRect(x, Math.round(ChartSettings.top.height + this.height - height), 7, Math.round(height))\r\n context.translate(0.5, 0.5)\r\n context.strokeRect(x, ChartSettings.top.height, 7, this.height)\r\n context.translate(-0.5, -0.5)\r\n\r\n new Text(\r\n {\r\n text: 'RELATIVE\\nVOLUME',\r\n x: 33,\r\n y: ChartSettings.top.height + this.height + 6,\r\n font: { size: FONT_SIZE.XXS },\r\n lineHeight: LINE_HEIGHT.XS,\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.top,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n context.restore()\r\n return\r\n }\r\n const rangeMax = this.volumeFY.range()[1]\r\n const volumeAxisFontSize = ChartSettings.left.volumeAxis.font.size!\r\n const tickCount = Math.floor(rangeMax / volumeAxisFontSize)\r\n const ticks = this.getVolumeTicks(tickCount, rangeMax, volumeAxisFontSize)\r\n const format = this.volumeFY.tickFormat(4, 's')\r\n const text = new Text(\r\n {\r\n x: ChartSettings.left.volumeAxis.margin.left,\r\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.left.volumeAxis.font.size }),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n ticks.forEach((tick) =>\r\n text\r\n .set({\r\n text: format(tick).replace(/G/, 'B'), // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\r\n y: ChartSettings.top.height + this.height - this.volumeFY(tick),\r\n })\r\n .render(context)\r\n )\r\n }\r\n\r\n renderVolume() {\r\n if (!this.shouldRenderVolume) return\r\n\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n // Return if the domain bounds are equal, this would put any value in the middle\r\n const [domainFrom, domainTo] = this.volumeFY.domain()\r\n if (this.setupAxisTimeFrame !== this.data.timeframe || domainFrom === domainTo) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height + this.height - 59,\r\n })\r\n translate.do()\r\n const halfBarWidth = getHalfBarWidth(this.model)\r\n const barWidthWithoutMargin = getBarWithoutMarginWidth(this.model)\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i, x) => {\r\n // Skip render if the value is <= 0\r\n if (this.data.volume[i] <= 0) {\r\n return\r\n }\r\n\r\n this.context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n const y = Math.round(this.volumeFY(this.data.volume[i]))\r\n this.context.fillRect(x - halfBarWidth, 60, barWidthWithoutMargin, -y)\r\n },\r\n })\r\n translate.undo()\r\n }\r\n\r\n renderOverlays() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n for (const overlay of this.overlays) {\r\n overlay.renderContent(this.context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderCross(context: CanvasRenderingContext2D) {\r\n const isRendered = renderCross({\r\n context,\r\n mouseModel,\r\n paneModel: this.paneModel,\r\n contentWidth: this.width,\r\n contentHeight: this.height,\r\n quote: this.data,\r\n getRoundDecimalPlaces: (price) => this.getPlacesLastClose(price),\r\n onRenderCrossText: !this.getIsRedesignedChart() ? this.renderCrossText : undefined,\r\n })\r\n if (this.getIsRedesignedChart()) {\r\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.paneModel))\r\n }\r\n\r\n if (isRendered !== undefined) {\r\n setElementCursor({\r\n elementId: this.model.chart_layout().getHTMLElementId(),\r\n cursor: isRendered ? 'crosshair' : 'default',\r\n conditionalCursor: 'grabbing',\r\n })\r\n }\r\n }\r\n\r\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\r\n const n = this.data.getDataByBarIndex(key, crossIndex)\r\n if (n !== null) {\r\n return shouldReturnRoundedString ? this.roundOhlc(n) : `${n}`\r\n }\r\n }\r\n\r\n getCrossIndexChange(crossIndex: number) {\r\n const crossDataIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n const crossClose = this.data.close[crossDataIndex] ?? null\r\n const previousClose = this.data.close[crossDataIndex - 1] ?? null\r\n if (crossClose !== null && previousClose !== null) {\r\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\r\n }\r\n\r\n return null\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n context.save()\r\n context.translate(ChartSettings.left.width, 0)\r\n\r\n if (this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabels(context)\r\n if (Number.isNaN(crossIndex)) {\r\n this.getOHLC({ context })\r\n context.restore()\r\n return\r\n }\r\n }\r\n\r\n const dateByBarIndex = this.data.getDataByBarIndex('date', crossIndex)\r\n const date = dateByBarIndex ? utils.dateFromUnixTimestamp(dateByBarIndex) : null\r\n\r\n if (date === null) {\r\n const virtualTradedDates =\r\n this.data.date.length > 0\r\n ? getVirtualTimeframeTradedDates({\r\n dateStart: this.data.date[0],\r\n dateEnd: this.data.date[this.data.date.length - 1],\r\n quote: this.data,\r\n })\r\n : []\r\n this.getOHLC({\r\n context,\r\n dateString: virtualTradedDates[crossIndex]\r\n ? getDateString({\r\n date: utils.dateFromUnixTimestamp(virtualTradedDates[crossIndex]),\r\n timeframe: this.data.timeframe,\r\n })\r\n : null,\r\n })\r\n context.restore()\r\n return\r\n }\r\n\r\n this.getOHLC({\r\n context,\r\n date,\r\n data: {\r\n open: this.getDataByCrossIndex(crossIndex, 'open'),\r\n high: this.getDataByCrossIndex(crossIndex, 'high'),\r\n low: this.getDataByCrossIndex(crossIndex, 'low'),\r\n close: this.getDataByCrossIndex(crossIndex, 'close'),\r\n volume: this.getDataByCrossIndex(crossIndex, 'volume', false),\r\n },\r\n changePercentage: this.getCrossIndexChange(crossIndex),\r\n })\r\n\r\n context.restore()\r\n }\r\n\r\n renderChange({ context }: { context: CanvasRenderingContext2D }) {\r\n const CHANGE_SPACER = 10\r\n const { ChartSettings, isOurSiteRequest } = this.getChartLayoutSettings()\r\n const { ticker, change, ohlc } = ChartSettings.top\r\n const { tickerChange, tickerAfterChange } = getTickerChange({ data: this.data })\r\n\r\n if (!tickerChange) {\r\n return\r\n }\r\n\r\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isGroupInstrument = this.data.instrument === Instrument.Group\r\n const finvizWatermarkOffset = !isOffscreen || isOurSiteRequest || this.isLargeChart ? 0 : 15\r\n const changeText = new Text(\r\n {\r\n text: isOffscreen && isGroupInstrument ? tickerChange.percentString : tickerChange.string,\r\n x: !getIsSmallIndexChart(this.specificChartFunctionality)\r\n ? this.width - ChartSettings.top.change.margin.right! - finvizWatermarkOffset\r\n : this.width,\r\n y: ChartSettings.top.change.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\r\n textAlign: TextAlign.right,\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: getChangeColor({ change: tickerChange.points, ChartSettings }),\r\n },\r\n this.paneModel\r\n )\r\n this.changeWidth = changeText.measure(context)\r\n changeText.render(context)\r\n\r\n if (isOffscreen && (!this.isLargeChart || isGroupInstrument)) {\r\n return\r\n }\r\n if (tickerAfterChange) {\r\n const afterChangeText = new Text(\r\n {\r\n text: tickerAfterChange?.string,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\r\n textAlign: TextAlign.right,\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: getChangeColor({ change: tickerAfterChange.points, ChartSettings }),\r\n },\r\n this.paneModel\r\n )\r\n const afterChangeTextWidth = afterChangeText.measure(context)\r\n const oneLineAHChangeWidth = this.changeWidth + CHANGE_SPACER + afterChangeTextWidth\r\n\r\n if (\r\n ChartSettings.left.width + this.tickerWidth + ticker.margin.left! + OFFSET.S <\r\n ChartSettings.left.width + this.width - oneLineAHChangeWidth - change.margin.right!\r\n ) {\r\n afterChangeText\r\n .set({\r\n x: this.width - ChartSettings.top.change.margin.right! - this.changeWidth - CHANGE_SPACER,\r\n y: ChartSettings.top.change.margin.top,\r\n })\r\n .render(context)\r\n this.afterChange = null\r\n this.changeWidth = oneLineAHChangeWidth\r\n } else if (\r\n this.lastOhlc[0] &&\r\n ChartSettings.left.width +\r\n this.tickerWidth +\r\n ticker.margin.left! +\r\n this.lastOhlc[0].width! +\r\n ohlc.margin.left! +\r\n ohlc.margin.right! <\r\n ChartSettings.left.width + this.width - afterChangeTextWidth - change.margin.right!\r\n ) {\r\n afterChangeText\r\n .set({\r\n x: this.width - ChartSettings.top.change.margin.right!,\r\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\r\n })\r\n .render(context)\r\n this.changeWidth = Math.max(this.changeWidth, afterChangeTextWidth)\r\n this.afterChange = {\r\n x: this.width - ChartSettings.top.change.margin.right!,\r\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\r\n width: afterChangeTextWidth,\r\n }\r\n }\r\n }\r\n }\r\n\r\n renderOHLC(parameters: IRenderOHLCParameters) {\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOHLCQuotePage(parameters)\r\n } else {\r\n this.renderOHLCChartsPage(parameters)\r\n }\r\n }\r\n\r\n renderOHLCChartsPage({ context, date, open, high, low, close, volume, changePercentage }: IRenderOHLCParameters) {\r\n const chartBreakpoints = getChartBreakpoints(this.width)\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n const OhlcText = new Text(\r\n {\r\n font: { size: FONT_SIZE.S },\r\n lineHeight: 18,\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\r\n },\r\n this.paneModel\r\n )\r\n\r\n const dateElements = date ? [{ text: date, color: gray300 }] : []\r\n const trendColor = (open ?? 0) > (close ?? 0) ? tailwindColors.red[400] : tailwindColors.green[400]\r\n const oElements = open\r\n ? [\r\n { text: 'O', color: gray300 },\r\n { text: open, color: trendColor },\r\n ]\r\n : []\r\n const hElements = high\r\n ? [\r\n { text: 'H', color: gray300 },\r\n { text: high, color: trendColor },\r\n ]\r\n : []\r\n const lElements = low\r\n ? [\r\n { text: 'L', color: gray300 },\r\n { text: low, color: trendColor },\r\n ]\r\n : []\r\n const cElements = close\r\n ? [\r\n { text: 'C', color: gray300 },\r\n { text: close, color: trendColor },\r\n ]\r\n : []\r\n const volElements = volume\r\n ? [\r\n { text: 'Vol', color: gray300 },\r\n { text: volume, color: trendColor },\r\n ]\r\n : []\r\n const changeElements = changePercentage != null ? [{ text: changePercentage.string, color: trendColor }] : []\r\n\r\n const lines: OhlcLineElements[] = []\r\n\r\n const getFlatLineArrayWithSpaces = (lineElements: OhlcLineElements[]) =>\r\n lineElements.flatMap((elements, index) =>\r\n index > 0 ? ([...(elements.length > 0 ? ['space'] : []), ...elements] as OhlcLineElements) : elements\r\n )\r\n if (chartBreakpoints.isM) {\r\n lines.push(\r\n getFlatLineArrayWithSpaces([\r\n dateElements,\r\n oElements,\r\n hElements,\r\n lElements,\r\n cElements,\r\n volElements,\r\n changeElements,\r\n ])\r\n )\r\n } else if (chartBreakpoints.isS) {\r\n lines.push(getFlatLineArrayWithSpaces([dateElements, changeElements]))\r\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements, volElements]))\r\n } else {\r\n lines.push(getFlatLineArrayWithSpaces([dateElements, volElements, changeElements]))\r\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements]))\r\n }\r\n\r\n const startX = OFFSET.M - ChartSettings.left.width\r\n let x = startX\r\n let y = OFFSET.M + OhlcText.attrs.lineHeight / 2\r\n\r\n lines.forEach((line) => {\r\n x = startX\r\n line.forEach((lineElement, index, lineElements) => {\r\n const padding = { left: 1, right: 1, top: 0, bottom: 0 }\r\n const { text = '', color = undefined } = lineElement === 'space' ? {} : lineElement\r\n if (index === 0) {\r\n padding.left = 5\r\n } else if (index === lineElements.length - 1) {\r\n padding.right = 5\r\n } else if (lineElement === 'space') {\r\n padding.left = 7\r\n padding.right = 7\r\n if (!chartBreakpoints.isS) {\r\n padding.left = 5\r\n padding.right = 5\r\n }\r\n }\r\n OhlcText.set({ text, fillStyle: color, x, y, padding })\r\n OhlcText.render(context)\r\n x += OhlcText.width\r\n })\r\n y += OhlcText.attrs.lineHeight\r\n })\r\n }\r\n\r\n renderOverlaysLabelsChartsPage(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const chartBreakpoints = getChartBreakpoints(this.width)\r\n const LabelsText = new Text(\r\n {\r\n font: { size: FONT_SIZE.S },\r\n lineHeight: 18,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(ChartSettings.general.Colors.canvasFill, 0.8),\r\n // this function gets (indirectly) called from renderCrossText which is already \"translateX\" by ChartSettings.left.width\r\n x: OFFSET.M - ChartSettings.left.width,\r\n padding: { left: PADDING.S, right: PADDING.S, top: 0, bottom: 0 },\r\n },\r\n this.paneModel\r\n )\r\n\r\n let numberOfNewOhlcLines = 2\r\n if (chartBreakpoints.isM) {\r\n numberOfNewOhlcLines = 1\r\n } else if (chartBreakpoints.isS) {\r\n numberOfNewOhlcLines = 2\r\n }\r\n\r\n // We assume lineheight is the same as OHLC text\r\n const { lineHeight } = LabelsText.attrs\r\n let y = lineHeight * numberOfNewOhlcLines + lineHeight / 2 + OFFSET.M\r\n\r\n for (const overlay of this.overlays) {\r\n if (!overlay.isRenderedOverlaysLabel()) {\r\n continue\r\n }\r\n LabelsText.set({\r\n text: overlay.toString(),\r\n y,\r\n fillStyle: overlay.getLabelColor(),\r\n }).render(context)\r\n y += lineHeight\r\n }\r\n }\r\n\r\n renderOHLCQuotePage({\r\n context,\r\n date,\r\n open,\r\n high,\r\n low,\r\n close,\r\n volume,\r\n afterHour,\r\n isSmallIndexChart = false,\r\n isNewestOHLC = false,\r\n time,\r\n directRender = false,\r\n changePercentage,\r\n }: IRenderOHLCParameters) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { ohlc } = ChartSettings.top\r\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isGroupInstrument = this.data.instrument === Instrument.Group\r\n if (isOffscreen && isGroupInstrument) {\r\n ohlc.type = OHLCType.dateOnly\r\n } else if (isOffscreen && this.data.instrument !== Instrument.Stock && time) {\r\n ohlc.type = OHLCType.timeOnly\r\n }\r\n\r\n const lineTopY = ohlc.type ? ohlc.margin.top : ohlc.margin.top! - ChartSettings.top.ticker.font.size!\r\n const OHLCFontSize = ohlc.font.size!\r\n const centerXOffset =\r\n this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n (this.width -\r\n (this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n this.changeWidth +\r\n (isSmallIndexChart ? 0 : ChartSettings.top.change.margin.right!))) / // smallIndexChart don't have change.margin.right\r\n 2\r\n const leftXOffset = this.tickerWidth + ChartSettings.top.ticker.margin.left! + ohlc.margin.left!\r\n const hasOhlc = ![open, high, low, close, volume].some((ohlcString) => !ohlcString)\r\n const OHLC = hasOhlc\r\n ? {\r\n date: [date ?? ''],\r\n singleLine: [\r\n `${date} O:${open} H:${high} L:${low} C:${close}${\r\n afterHour ? ` AH:${afterHour}` : ''\r\n } Vol:${volume} `,\r\n /*\r\n * this is needed because of the way we render ohlc text down below in renderOHLCToCanvas\r\n * undefined is used instead of null because TS had some issues with `null` even if it is filtered out\r\n * */\r\n changePercentage ? changePercentage.string : undefined,\r\n ].filter((value) => value !== undefined),\r\n }\r\n : {\r\n date: [date ?? ''],\r\n singleLine: [`${date ?? ''}`],\r\n }\r\n\r\n const OHLC_TEXT = new Text(\r\n {\r\n font: { size: OHLCFontSize },\r\n },\r\n this.paneModel\r\n )\r\n\r\n const getOHLCType = () => {\r\n if (!isSmallIndexChart) {\r\n return OHLCType.singleLine\r\n }\r\n return OHLCType.dateOnly\r\n }\r\n\r\n const getOHLCSettings = () => {\r\n switch (ohlc.type || getOHLCType()) {\r\n case OHLCType.singleLine:\r\n return {\r\n text: OHLC.singleLine,\r\n x: [leftXOffset, leftXOffset],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.left,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n case OHLCType.dateOnly:\r\n if (isOffscreen && isGroupInstrument) {\r\n const text = `${OHLC.date} Volume: ${volume}`\r\n const textWidth = OHLC_TEXT.set({ text }).measure(context)\r\n return {\r\n text: [text],\r\n x: [\r\n this.width - ChartSettings.top.change.margin.right! - this.changeWidth - textWidth - CHART_MARGIN.XXL,\r\n ],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.center,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n } else if (isSmallIndexChart) {\r\n return {\r\n text: OHLC.date,\r\n x: [centerXOffset],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.center,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n } else {\r\n const isEnoughSpace =\r\n this.width -\r\n (this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n ohlc.margin.left! +\r\n ohlc.margin.right! +\r\n this.changeWidth +\r\n ChartSettings.top.change.margin.right!) >\r\n OHLC_TEXT.set({ text: OHLC.date[0] }).measure(context)\r\n const alignTop = !isEnoughSpace || ohlc.font.baseline === TextBaseline.top\r\n return {\r\n text: OHLC.date,\r\n x: [leftXOffset],\r\n y: alignTop ? [lineTopY] : [ohlc.margin.top],\r\n textAlign: TextAlign.left,\r\n textBaseline: alignTop ? [TextBaseline.top] : [TextBaseline.alphabetic],\r\n }\r\n }\r\n case OHLCType.timeOnly:\r\n return {\r\n text: [time],\r\n x: [centerXOffset - OHLC_TEXT.set({ text: time }).measure(context) / 2],\r\n y: [lineTopY],\r\n textAlign: TextAlign.center,\r\n textBaseline: [ohlc.font.baseline],\r\n }\r\n default:\r\n return\r\n }\r\n }\r\n\r\n if (!isNewestOHLC) {\r\n context.fillStyle = Colors.canvasFill\r\n this.lastOhlc.forEach((line) => {\r\n const x = (line.textAlign === TextAlign.left ? line.x : line.x! - line.width! / 2)!\r\n const y = (line.textBaseline === TextBaseline.top ? line.y : line.y! - OHLCFontSize)!\r\n context.fillRect(\r\n x - PADDING.XXS,\r\n y - PADDING.XXS,\r\n PADDING.XXS + line.width! + PADDING.XXS,\r\n PADDING.XXS + OHLCFontSize + PADDING.XXS\r\n )\r\n })\r\n\r\n if (this.afterChange) {\r\n context.fillRect(\r\n this.afterChange.x - this.afterChange.width - PADDING.XXS,\r\n this.afterChange.y - ChartSettings.top.change.font.size! - PADDING.XXS,\r\n PADDING.XXS + this.afterChange.width + PADDING.XXS,\r\n PADDING.XXS + ChartSettings.top.change.font.size! + PADDING.XS\r\n )\r\n }\r\n } else {\r\n this.lastOhlc = []\r\n }\r\n\r\n const ohlcSettings = getOHLCSettings()\r\n\r\n const renderOHLCToCanvas = ({\r\n ohlcSet,\r\n render = true,\r\n }: {\r\n ohlcSet?: {\r\n text: (string | undefined)[]\r\n x: number[]\r\n y: (number | undefined)[]\r\n textAlign: TextAlign\r\n textBaseline: (TextBaseline | undefined)[]\r\n }\r\n render?: boolean\r\n }) => {\r\n const isSingleLineWithChange = (ohlc.type || getOHLCType()) === OHLCType.singleLine && changePercentage\r\n ohlcSet?.text.forEach((line: string | undefined, index: number) => {\r\n let i = index\r\n let leftOffset = 0\r\n let fillStyle = Colors.text\r\n let text = line\r\n if (index > 0 && isSingleLineWithChange) {\r\n i -= 1\r\n leftOffset = OHLC_TEXT.measure(context)\r\n text = line\r\n\r\n fillStyle = getChangeColor({ change: changePercentage.points, ChartSettings })\r\n }\r\n const options = {\r\n text,\r\n x: ohlcSet.x[i] + leftOffset,\r\n y: ohlcSet.y[i],\r\n textBaseline: ohlc.font.baseline ? ohlc.font.baseline : ohlcSet.textBaseline[i],\r\n textAlign: ohlc.font.textAlign ? ohlc.font.textAlign : ohlcSet.textAlign,\r\n fillStyle,\r\n }\r\n OHLC_TEXT.set(options)\r\n if (isNewestOHLC) {\r\n this.lastOhlc[i] = { width: OHLC_TEXT.measure(context), ...options }\r\n }\r\n if (render) {\r\n OHLC_TEXT.render(context)\r\n }\r\n })\r\n }\r\n renderOHLCToCanvas({ ohlcSet: ohlcSettings, render: directRender })\r\n\r\n return {\r\n ohlcSettings,\r\n renderOHLCToCanvas,\r\n }\r\n }\r\n\r\n // only for stocks on i1/i3/i5 and one day view\r\n renderFadeExtendedHours() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const period = this.model.quote().timeframe\r\n if (this.data.instrument !== Instrument.Stock) {\r\n return\r\n }\r\n if (![TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5].includes(period)) {\r\n return\r\n }\r\n\r\n const interval = parseInt(period.substring(1), 10)\r\n const dayToOffset = this.data.getDayToOffset()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const halfBarWidth = getHalfBarWidth(this.model)\r\n for (const day in dayToOffset) {\r\n // todo aftermarket\r\n const dayIndex = dayToOffset[day]\r\n let n0 = (this.data.drawMinutesPerDay / interval) * dayIndex\r\n let n1 = this.data.premarketLengthMinutes / interval + n0 // bars in 90mins from 8am to 9:30am\r\n let x0 = this.paneModel.scale.x(n0) - halfBarWidth\r\n let width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\r\n this.context.set('fillStyle', Colors.premarketFade)\r\n this.context.fillRect(x0, 0, width, this.height + 1)\r\n\r\n if (this.data.aftermarketLengthMinutes > 0) {\r\n n0 =\r\n (this.data.drawMinutesPerDay / interval) * dayIndex +\r\n (this.data.drawMinutesPerDay - this.data.aftermarketLengthMinutes) / interval\r\n n1 = this.data.aftermarketLengthMinutes / interval + n0 // bars in 90mins from 4pm to 5:30pm\r\n x0 = this.paneModel.scale.x(n0) - halfBarWidth\r\n width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\r\n\r\n this.context.set('fillStyle', Colors.aftermarketFade)\r\n this.context.fillRect(x0, 0, width, this.height + 1)\r\n }\r\n }\r\n translate.undo()\r\n }\r\n\r\n shouldShowPrevClose() {\r\n const quote = this.model.quote()\r\n const isStock = quote.instrument === Instrument.Stock\r\n const isIntradayWithPreMarket = TIMEFRAMES_WITH_PRE_MARKET.includes(quote.timeframe)\r\n const isIndexChart = this.specificChartFunctionality === SpecificChartFunctionality.smallIndex\r\n\r\n return isStock && (isIntradayWithPreMarket || isIndexChart)\r\n }\r\n\r\n renderPrevClose() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (!this.shouldShowPrevClose()) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n let y = Math.round(this.fy(this.model.quote().prevClose))\r\n if (y === this.height) y -= 1 // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate, to compensate for this we subtract 1px\r\n\r\n new Line(\r\n {\r\n x1: 0,\r\n x2: this.width,\r\n y1: y,\r\n y2: y,\r\n strokeStyle: Colors.prevClose,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n translate.undo()\r\n }\r\n\r\n renderChartNotAvailable() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const x = ~~((ChartSettings.left.width + ChartSettings.right.width + this.width) / 2)\r\n const y = ~~((ChartSettings.top.height + ChartSettings.bottom.height + this.height) / 2)\r\n new Text(\r\n {\r\n text: 'Chart not available',\r\n x,\r\n y,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n }\r\n\r\n // private\r\n setupCache() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n /*\r\n * Don't create new Cache instances, because Safari takes too long to free up memory\r\n * leading to canvas.getContext returning null. https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\r\n *\r\n * To further improve performance, cache.set shouldn't be called when unnecessary,\r\n * because setupCache is called for many model updates. The same applies for indicators/indicator.js.\r\n */\r\n this.baseCache = this.baseCache || new Cache()\r\n\r\n this.baseCache.set(\r\n (context: CanvasRenderingContext2D) => {\r\n if (this.data.close.length === 0) {\r\n this.renderText(context)\r\n return\r\n }\r\n this.renderYAxis(context)\r\n this.renderText(context)\r\n if (!this.getIsMobileChartPage() && this.shouldRenderVolume) {\r\n this.renderVolumeAxis(context)\r\n }\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabels(context)\r\n }\r\n },\r\n this.width + ChartSettings.left.width + ChartSettings.right.width,\r\n this.height + ChartSettings.top.height + ChartSettings.bottom.height\r\n )\r\n }\r\n\r\n // called by controllers/pane on recountScale\r\n setupAxis(fx: ScaleAxis) {\r\n this.data = this.model.quote()\r\n const { volumeHeight } = this.getChartLayoutSettings().ChartSettings.center\r\n\r\n if (typeof fx !== 'function') {\r\n return\r\n }\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n })\r\n\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n chartWidth: this.width,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n const volumes = []\r\n if (areNoBarsVisible) {\r\n volumes.push(\r\n this.data.volume[firstBarToRenderIndex.index],\r\n Math.min(lastBarToRenderIndex.index, this.data.barIndex.length - 1)\r\n )\r\n } else {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n volumes.push(this.data.volume[i])\r\n }\r\n }\r\n\r\n const max = utils.max(volumes) ?? 0\r\n const rangeMax = volumeHeight || 60\r\n this.volumeFY = d3.scaleLinear().range([0, rangeMax]).domain([0, max]).nice(4)\r\n this.setupAxisTimeFrame = this.data.timeframe\r\n }\r\n\r\n // private\r\n clip(addMarginBottom?: boolean) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n if (addMarginBottom == null) {\r\n addMarginBottom = false\r\n }\r\n this.context.beginPath()\r\n let marginBottom = 0\r\n if (addMarginBottom) {\r\n marginBottom = ChartSettings.bottom.height\r\n }\r\n this.context.rect(ChartSettings.left.width, ChartSettings.top.height, this.width, this.height + marginBottom)\r\n this.context.clip()\r\n }\r\n\r\n addOverlay(overlay: Overlay) {\r\n overlay.chart = this\r\n this.overlays.push(overlay)\r\n return this.trigger('change')\r\n }\r\n\r\n setOverlays(overlays: Overlay[]) {\r\n this.overlays = overlays\r\n return this.trigger('change')\r\n }\r\n\r\n removeOverlay(overlay: Overlay) {\r\n for (let index = 0; index < this.overlays.length; index++) {\r\n const el = this.overlays[index]\r\n if (el === overlay) {\r\n this.attrs.overlays.splice(index, 1)\r\n this.overlays.splice(index, 1)\r\n this.trigger('change')\r\n break\r\n }\r\n }\r\n }\r\n\r\n getMinMax(): { min: number; max: number; firstVisibleClose?: number | null } {\r\n this.data = this.model.quote()\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n let minIndex = -1\r\n let maxIndex = -1\r\n let firstVisibleClose = null\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n })\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n chartWidth: this.width,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n // If no bars are visible min/max are first available bar before visible and first after\r\n if (areNoBarsVisible) {\r\n min = this.data.low[firstBarToRenderIndex.index]\r\n max = this.data.high[Math.min(lastBarToRenderIndex.index, this.data.barIndex.length - 1)]\r\n firstVisibleClose = this.data.close[firstBarToRenderIndex.index]\r\n } else {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n if (minIndex === -1 || this.data.low[minIndex] > this.data.low[i]) {\r\n minIndex = i\r\n }\r\n if (maxIndex === -1 || this.data.high[maxIndex] < this.data.high[i]) {\r\n maxIndex = i\r\n }\r\n }\r\n\r\n // If only a single bar is visible get min/max index range from closes values outside of visible area\r\n if (this.data.low[minIndex] === this.data.high[maxIndex]) {\r\n const closestMinMaxIndices = getClosestDifferentMinMaxValueIndices(\r\n minIndex,\r\n maxIndex,\r\n this.data.high,\r\n this.data.low\r\n )\r\n minIndex = closestMinMaxIndices.minIndex\r\n maxIndex = closestMinMaxIndices.maxIndex\r\n }\r\n\r\n min = this.data.low[minIndex]\r\n max = this.data.high[maxIndex]\r\n\r\n firstVisibleClose = this.data.close[firstBarToRenderIndex.index]\r\n }\r\n\r\n // Update min/max so prevClose is in range and can be rendered if it should\r\n if (this.shouldShowPrevClose() && this.data.prevClose !== null) {\r\n min = Math.min(min, this.data.prevClose)\r\n max = Math.max(max, this.data.prevClose)\r\n }\r\n\r\n // Update min/max so lastClose is in range and can be rendered if it should\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen && !this.model.dateRange) {\r\n min = Math.min(min, this.data.lastClose)\r\n max = Math.max(max, this.data.lastClose)\r\n }\r\n\r\n return { min, max, firstVisibleClose }\r\n }\r\n\r\n moveBy() {}\r\n\r\n isInArea() {\r\n return false\r\n }\r\n\r\n fx = (x: number) => this.paneModel.scale.x(this.data.barIndex[x])\r\n\r\n fy = (y: number) => this.paneModel.scale.y(y)\r\n\r\n round(n: number, overridePlaces?: number) {\r\n return round({ data: this.data, num: n, overridePlaces: overridePlaces ?? this.getPlacesLastClose() })\r\n }\r\n\r\n roundOhlc(n: number) {\r\n const placesLastClose = this.getPlacesLastClose()\r\n return round({\r\n data: this.data,\r\n num: n,\r\n overridePlaces: placesLastClose ? Math.max(placesLastClose, 2) : undefined,\r\n })\r\n }\r\n\r\n toObject() {\r\n const overlays = this.overlays.map((overlay) => overlay.toObject())\r\n return merge({}, this.attrs, { type: this.type, overlays })\r\n }\r\n\r\n toConfig() {\r\n const overlays = this.overlays.map((overlay) => overlay.toConfig())\r\n return merge({}, this.attrs, { type: this.type, overlays })\r\n }\r\n\r\n getPlacesLastClose(price?: number) {\r\n const { lastClose, instrument } = this.data\r\n const priceAbs = price && Math.abs(price)\r\n if (lastClose >= 100000) {\r\n return 0\r\n } else if (lastClose >= 10000) {\r\n return 1\r\n } else if (instrument === Instrument.Stock && (priceAbs ?? lastClose) < 1) {\r\n return 4\r\n } else if (lastClose === undefined) {\r\n // if lastClose is not defined we'll always display 2 decimpal places, e.g. backtests, screener stats\r\n return 2\r\n }\r\n\r\n return undefined\r\n }\r\n\r\n hasOverlay(type: string) {\r\n return this.overlays.some((x) => x.type === 'overlays/' + type)\r\n }\r\n\r\n getXLine(): Line {\r\n return new Line(\r\n {\r\n y1: 0,\r\n y2: this.height,\r\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n\r\n getYLine(): Line {\r\n return new Line(\r\n {\r\n x1: 0,\r\n x2: this.width,\r\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart_layout())\r\n }\r\n\r\n getIsMobileChartPage() {\r\n return (\r\n this.isMobile && this.model.chart_layout().specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n )\r\n }\r\n\r\n getCandleLikeChartsRenderingColors() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { theme, specificChartFunctionality } = this.model.chart_layout()\r\n let colors = Colors\r\n const overwrittenColors = getColorOverwrites({\r\n colors,\r\n theme,\r\n })\r\n const overwrittenColorKeys = Object.keys(overwrittenColors)\r\n const hasOverwrittenCandleColor = ['borderUp', 'wickUp', 'borderDown', 'wickDown', 'trendUp', 'trendDown'].some(\r\n (colorKey) => overwrittenColorKeys.includes(colorKey)\r\n )\r\n\r\n const shouldUseDarkerColors =\r\n theme === Theme.light &&\r\n getShouldUseDarkerWickColors({\r\n specificChartFunctionality: specificChartFunctionality,\r\n totalBarWidth: ChartSettings.center.barWidth + ChartSettings.center.border * 2,\r\n })\r\n\r\n if (shouldUseDarkerColors && !hasOverwrittenCandleColor) {\r\n colors = { ...colors, ...darkerWickColors }\r\n }\r\n const isNodeChartWithThinBars =\r\n specificChartFunctionality === SpecificChartFunctionality.offScreen && ChartSettings.center.border === 0\r\n if (isNodeChartWithThinBars && !hasOverwrittenCandleColor) {\r\n colors = { ...colors, ...thinBarColorsOverride, ...overwrittenColors }\r\n }\r\n\r\n return colors\r\n }\r\n\r\n getIsRedesignedChart() {\r\n return this.specificChartFunctionality === SpecificChartFunctionality.chartPage || isRedesignedPage(this)\r\n }\r\n}\r\n\r\nBaseChart.initClass()\r\n\r\nexport default BaseChart\r\n","import { RendererChartBarProps } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport utils from '../utils'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport Chart from './base_chart'\r\n\r\nconst WICK_WIDTH = 1\r\n\r\nclass CandleStick extends Chart {\r\n static type = ChartElementType.CandleStick\r\n static label = 'Candle'\r\n static iconName = 'candleBarBasic'\r\n\r\n getRenderChartBarProps({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) {\r\n const { trendDown, trendUp, borderDown, borderUp, wickDown, wickUp } = chartSettingsColors\r\n const open = this.data.open[index]\r\n const close = this.data.close[index]\r\n const trendColor = close < open ? trendDown : trendUp\r\n const wickColor = close < open ? wickDown : wickUp\r\n return {\r\n open,\r\n close,\r\n high: this.data.high[index],\r\n low: this.data.low[index],\r\n barFillColor: trendColor,\r\n borderColor: close < open ? borderDown : borderUp,\r\n wickColor: hasFillAndBorder ? wickColor : trendColor,\r\n }\r\n }\r\n\r\n renderChart() {\r\n if (this.setupAxisTimeFrame !== this.data.timeframe) {\r\n return\r\n }\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n chartLayout: this.model.chart_layout(),\r\n zoomFactor: this.model.zoomFactor,\r\n })\r\n const shouldRenderFillAndBorder =\r\n barFillWidth + barBorderWidth * 2 >= 2 &&\r\n !(this.type === ChartElementType.HollowCandleStick && barBorderWidth === 0)\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n const translateForWick = getTranslate({\r\n context: this.context,\r\n xOffset: WICK_WIDTH / 2,\r\n yOffset: 0,\r\n })\r\n\r\n translate.do()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, center: number) => {\r\n const { open, close, high, low, wickColor, borderColor, barFillColor } = this.getRenderChartBarProps({\r\n index: i,\r\n chartSettingsColors: Colors,\r\n hasFillAndBorder: shouldRenderFillAndBorder,\r\n })\r\n\r\n const candleBodyHigh = Math.round(this.fy(utils.max(open, close)))\r\n const candleBodyLow = Math.round(this.fy(utils.min(open, close)))\r\n const candleWickHigh = Math.round(this.fy(high))\r\n const candleWickLow = Math.round(this.fy(low))\r\n\r\n const candleBodyHeight = candleBodyLow - candleBodyHigh\r\n const candleBodyLeftX = center - Math.floor(barBorderWidth + barFillWidth / 2)\r\n const halfBorderWidth = barBorderWidth / 2\r\n\r\n // TODO: revisit for better approach, this solve issue with candlesticks\r\n // with even width are shifted 1px to the left and thus first candle is vertically sliced\r\n if (getIsSSr() && candleBodyLeftX + this.leftOffset < 0) {\r\n return\r\n }\r\n\r\n const isBodyHeightGreaterOrEqualBorders = candleBodyHeight >= barBorderWidth * 2\r\n const isWickLineCandleLessThanOnePixel = !shouldRenderFillAndBorder && candleWickLow - candleWickHigh < 1\r\n\r\n translateForWick.do()\r\n this.context.set('strokeStyle', wickColor)\r\n this.context.beginPath()\r\n this.context.moveTo(center, candleWickHigh)\r\n if (shouldRenderFillAndBorder) {\r\n this.context.lineTo(center, candleBodyHigh)\r\n this.context.moveTo(\r\n center,\r\n candleBodyHigh + (isBodyHeightGreaterOrEqualBorders ? candleBodyHeight : WICK_WIDTH)\r\n )\r\n }\r\n this.context.lineTo(center, isWickLineCandleLessThanOnePixel ? candleWickHigh + 1 : candleWickLow)\r\n this.context.stroke()\r\n translateForWick.undo()\r\n\r\n if (shouldRenderFillAndBorder) {\r\n const hasBorder = barBorderWidth > 0\r\n if (hasBorder) {\r\n this.context.set('strokeStyle', borderColor)\r\n if (isBodyHeightGreaterOrEqualBorders) {\r\n this.context.set('lineWidth', barBorderWidth)\r\n this.context.strokeRect(\r\n candleBodyLeftX + halfBorderWidth,\r\n candleBodyHigh + halfBorderWidth,\r\n barFillWidth + 2 * halfBorderWidth,\r\n candleBodyHeight - 2 * halfBorderWidth\r\n )\r\n this.context.set('lineWidth', WICK_WIDTH)\r\n } else {\r\n this.context.beginPath()\r\n this.context.moveTo(candleBodyLeftX, candleBodyHigh + WICK_WIDTH / 2)\r\n this.context.lineTo(candleBodyLeftX + barFillWidth + 2 * barBorderWidth, candleBodyHigh + WICK_WIDTH / 2)\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n const fillHeight = candleBodyHeight - 2 * barBorderWidth\r\n const hasFill = fillHeight > 0\r\n if (hasFill || !hasBorder) {\r\n this.context.set('fillStyle', hasFill ? barFillColor : borderColor)\r\n this.context.fillRect(\r\n candleBodyLeftX + barBorderWidth,\r\n candleBodyHigh + barBorderWidth,\r\n barFillWidth,\r\n hasFill ? fillHeight : WICK_WIDTH\r\n )\r\n }\r\n }\r\n },\r\n })\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default CandleStick\r\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport CandleStick from './candle_stick'\r\n\r\nclass HollowCandleStick extends CandleStick {\r\n static type = ChartElementType.HollowCandleStick\r\n static label = 'Hollow Candle'\r\n static iconName = 'candleBarHollow'\r\n\r\n static getNumOfBarsBuffer(element: RequireByKey) {\r\n return Math.max(1, super.getNumOfBarsBuffer(element))\r\n }\r\n\r\n getRenderChartBarProps({ index, chartSettingsColors }: RendererChartBarProps) {\r\n const open = this.data.open[index]\r\n const close = this.data.close[index]\r\n const isHollow = close > open\r\n const generalTrendColor =\r\n close > this.data.close[index - 1] ? chartSettingsColors.ohlcTrendUp : chartSettingsColors.ohlcTrendDown\r\n const trendColor = index === 0 ? chartSettingsColors.zeroChange : generalTrendColor\r\n return {\r\n open,\r\n close,\r\n high: this.data.high[index],\r\n low: this.data.low[index],\r\n // hollow candles have transparend bodies that's why rgba is here\r\n barFillColor: isHollow ? 'rgba(0, 0, 0, 0)' : trendColor,\r\n borderColor: trendColor,\r\n wickColor: trendColor,\r\n }\r\n }\r\n\r\n toString() {\r\n return `Hollow Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default HollowCandleStick\r\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\r\nimport { ChartElementType, ScaleType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\nimport { getTickerChangeFromCloseValues } from '../utils/chart'\r\nimport CandleStick from './candle_stick'\r\n\r\ntype OhlcKeys = 'high' | 'low' | 'open' | 'close'\r\n\r\nclass HeikinAshi extends CandleStick {\r\n static type = ChartElementType.HeikinAshi\r\n static label = 'Heikin Ashi'\r\n static iconName = 'candleBarHeikinAshi'\r\n\r\n static getNumOfBarsBuffer(element: RequireByKey) {\r\n return Math.max(1, super.getNumOfBarsBuffer(element))\r\n }\r\n\r\n getRenderChartBarProps = ({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) => {\r\n const haData = this.data.getHeikinAshiData()\r\n\r\n const open = haData.open[index]\r\n const close = haData.close[index]\r\n const trendColor = close < open ? chartSettingsColors.trendDown : chartSettingsColors.trendUp\r\n const wickColor = close < open ? chartSettingsColors.wickDown : chartSettingsColors.wickUp\r\n return {\r\n open,\r\n close,\r\n high: Math.max(this.data.high[index], open, close),\r\n low: Math.min(open, close, this.data.low[index]),\r\n barFillColor: trendColor,\r\n borderColor: close < open ? chartSettingsColors.borderDown : chartSettingsColors.borderUp,\r\n wickColor: hasFillAndBorder ? wickColor : trendColor,\r\n }\r\n }\r\n\r\n getLastValues = () => {\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const {\r\n open: lastOpen,\r\n close: lastClose,\r\n high: lastHigh,\r\n low: lastLow,\r\n } = this.getRenderChartBarProps({\r\n index: this.data.date.length - 1,\r\n chartSettingsColors: Colors,\r\n })\r\n\r\n return { lastOpen, lastClose, lastHigh, lastLow }\r\n }\r\n\r\n getRoundedLastData() {\r\n const lastOhlc = this.getLastValues()\r\n return {\r\n open: this.roundOhlc(lastOhlc.lastOpen),\r\n high: this.roundOhlc(lastOhlc.lastHigh),\r\n low: this.roundOhlc(lastOhlc.lastLow),\r\n close: this.roundOhlc(lastOhlc.lastClose),\r\n }\r\n }\r\n\r\n renderYAxis = (context: CanvasRenderingContext2D) => {\r\n const { lastClose } = this.getLastValues()\r\n super.renderYAxis(context, { lastClose }, false)\r\n\r\n const { firstVisibleClose } = this.getMinMax()\r\n if (this.model.scale === ScaleType.Percentage && !firstVisibleClose) return\r\n\r\n const originalLatestClose = this.data.close[this.data.close.length - 1]\r\n const heikinLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\r\n const originalLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose: originalLatestClose, firstVisibleClose })\r\n\r\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: heikinLatestCloseLabel })\r\n\r\n if (heikinLatestCloseLabel === originalLatestCloseLabel) return\r\n\r\n this.renderYAxisLabel({\r\n context,\r\n yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\r\n mainLabelValue: lastClose,\r\n secondaryLabelValue: originalLatestClose,\r\n }),\r\n label: originalLatestCloseLabel,\r\n background: this.getSecondaryLabelBackgroundColor(),\r\n })\r\n }\r\n\r\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n if (barIndex > -1) {\r\n let value = null\r\n if (['high', 'low', 'open', 'close'].includes(key)) {\r\n const data = this.getRenderChartBarProps({ index: barIndex, chartSettingsColors: Colors })\r\n value = data[key as OhlcKeys]\r\n }\r\n value = value === null ? this.data.getDataByBarIndex(key, crossIndex) : value\r\n if (value !== null) {\r\n return shouldReturnRoundedString ? this.roundOhlc(value) : `${value}`\r\n }\r\n }\r\n }\r\n\r\n getCrossIndexChange(crossIndex: number) {\r\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n const haData = this.data.getHeikinAshiData()\r\n const crossClose = haData.close[barIndex] ?? null\r\n const previousClose = haData.close[barIndex - 1] ?? null\r\n if (crossClose !== null && previousClose !== null) {\r\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\r\n }\r\n\r\n return null\r\n }\r\n\r\n toString() {\r\n return `HA Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default HeikinAshi\r\n","import { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Chart from './base_chart'\r\n\r\nclass LineChart extends Chart {\r\n static type = ChartElementType.LineChart\r\n static label = 'Line'\r\n static iconName = 'lineChartType'\r\n\r\n renderChart() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let first: number | undefined, last: number | undefined\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n this.context.beginPath()\r\n this.context.set('lineWidth', 1)\r\n this.context.set('strokeStyle', Colors.line)\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const y = Math.round(this.fy(this.data.close[i]))\r\n this.context.lineTo(x, y)\r\n last = x\r\n if (first === undefined) {\r\n first = x\r\n }\r\n },\r\n })\r\n if (first !== undefined && last !== undefined) {\r\n this.context.stroke()\r\n this.context.set('fillStyle', Colors.background)\r\n this.context.lineTo(last!, this.height)\r\n this.context.lineTo(first!, this.height)\r\n this.context.fill()\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `Line chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default LineChart\r\n","import Text from '../canvas/text'\r\nimport { ChartElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport { isRedesignEnabled } from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\nconst interval = 3\r\nconst domainMin = -1\r\nconst domainMax = 1\r\nconst red = 'rgba(200, 0, 0, 0.392)'\r\nconst redLine = 'rgb(120, 0, 0)'\r\nconst green = 'rgba(0, 180, 0, 0.392)'\r\nconst greenLine = 'rgb(0, 100, 0)'\r\n\r\nclass MarketSentiment extends Chart {\r\n static type = ChartElementType.MarketSentiment\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n return this.model.width - MarketSentimentSettings.left.width - MarketSentimentSettings.right.width\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n return this.paneModel.height - MarketSentimentSettings.top.height - MarketSentimentSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n declare _data: number[]\r\n declare _dataLastIndex: number | null\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.setupCache = this.setupCache.bind(this)\r\n }\r\n\r\n setupCache() {\r\n super.setupCache()\r\n if (!this.data) {\r\n return\r\n }\r\n const arr: number[] = []\r\n this.data.close.forEach((sum, i) => {\r\n arr[i] = sum / this.data.volume[i]\r\n })\r\n this._data = arr\r\n\r\n let lastIndex = null\r\n for (let i = this.data.volume.length - 1; i >= 0; i--) {\r\n if (this.data.volume[i] !== 0) {\r\n lastIndex = i\r\n break\r\n }\r\n }\r\n this._dataLastIndex =\r\n lastIndex === null\r\n ? null\r\n : Math.min(lastIndex, Math.round((this.data.drawMinutesPerDay - this.data.marketStartMinutes) / interval))\r\n }\r\n\r\n renderChart() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + MarketSentimentSettings.left.width + 0.5,\r\n yOffset: MarketSentimentSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n this.renderLineBullBear(this.context, this._data, 0, 0, 0)\r\n translate.undo()\r\n }\r\n\r\n renderLineBullBear(\r\n context: CanvasRenderingContext2D,\r\n array: number[],\r\n from: number,\r\n oversold: number,\r\n overbought: number\r\n ) {\r\n if (this._dataLastIndex === null) {\r\n return\r\n }\r\n const isRedesign = isRedesignEnabled()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n const domain = [domainMax, domainMin]\r\n\r\n context.save()\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(domain[1]),\r\n this.fx(this._dataLastIndex),\r\n Math.round(this.fy(oversold) - this.fy(domain[1])) - 0.5\r\n )\r\n context.clip()\r\n context.set('fillStyle', red)\r\n context.set('strokeStyle', isRedesign ? Colors.marketDown : redLine)\r\n context.beginPath()\r\n context.moveTo(this.fx(0), Math.round(this.fy(domain[0])))\r\n for (let i = from; i < this.data.close.length; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\r\n }\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[0])))\r\n context.fill()\r\n context.stroke()\r\n context.restore()\r\n\r\n context.save()\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(domain[0]),\r\n this.fx(this._dataLastIndex),\r\n Math.round(this.fy(overbought)) - 0.5\r\n )\r\n context.clip()\r\n context.set('fillStyle', green)\r\n context.set('strokeStyle', isRedesign ? Colors.marketUp : greenLine)\r\n context.beginPath()\r\n context.moveTo(this.fx(0), Math.round(this.fy(domain[1])))\r\n for (let i = from; i < this.data.close.length; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\r\n }\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[1])))\r\n context.fill()\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n renderXAxis() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n const { Colors } = MarketSentimentSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + MarketSentimentSettings.left.width,\r\n yOffset: MarketSentimentSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const xLine = this.getXLine()\r\n const text = new Text(\r\n {\r\n y: this.height + 12,\r\n font: { size: 7 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.bottom,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n let x\r\n\r\n x = this.fx(0)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10) + 2 /* remove overflow */\r\n text.set({ text: '10AM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 20)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 40)\r\n text.set({ text: '12PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 60)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 80)\r\n text.set({ text: '2PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 100)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 120 - 1)\r\n text.set({ text: '4PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText() {}\r\n\r\n renderCrossText() {}\r\n\r\n renderOverlaysLabels() {}\r\n\r\n _compute() {\r\n return { min: domainMin, max: domainMax }\r\n }\r\n\r\n computeVisibleMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { MarketSentimentSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const isRedesign = isRedesignEnabled()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: MarketSentimentSettings.left.width,\r\n yOffset: MarketSentimentSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const yLine = this.getYLine()\r\n for (const tick of [domainMin, 0, domainMax]) {\r\n const y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n }\r\n\r\n const text = new Text(\r\n {\r\n x: this.width + 27,\r\n font: { size: 8 },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n\r\n const fillUp = isRedesign ? Colors.marketUp : greenLine\r\n const fillDown = isRedesign ? Colors.marketDown : redLine\r\n const last = this._data[this._dataLastIndex!]\r\n const percent = this._dataLastIndex !== null ? Math.floor(last * 50 + 50) : 50\r\n text.set({ y: this.fy(0) - 5, fillStyle: fillUp, text: `${percent}%` }).render(context)\r\n text.set({ y: this.fy(0) + 7, fillStyle: fillDown, text: `${100 - percent}%` }).render(context)\r\n\r\n translate.undo()\r\n }\r\n\r\n clip() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n this.context.beginPath()\r\n this.context.rect(MarketSentimentSettings.left.width, MarketSentimentSettings.top.height, this.width, this.height)\r\n this.context.clip()\r\n }\r\n\r\n getMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n toString() {\r\n return `Market sentiment chart`\r\n }\r\n}\r\nMarketSentiment.initClass()\r\n\r\nexport default MarketSentiment\r\n","import { ObjectHash } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { ChartElementType, FONT_SIZE, LINE_HEIGHT, PADDING, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\ninterface MultiLineChartAttrs extends BaseChartAttrs {\r\n tickers: string[]\r\n label?: string\r\n min?: number\r\n max?: number\r\n}\r\n\r\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nclass MultiLineChart extends Chart {\r\n static type = ChartElementType.MultiLineChart\r\n tickersDimensions: number[] = []\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n }\r\n\r\n renderChart() {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n\r\n this.context.set('lineWidth', 1)\r\n\r\n const quotes: ObjectHash = {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n\r\n for (let index = this.attrs.tickers.length - 1; index >= 0; index--) {\r\n const ticker = this.attrs.tickers[index]\r\n const quote = quotes[ticker]\r\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n this.context.beginPath()\r\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const x = this.fx(i)\r\n if (x + this.leftOffset < -10 || x + this.leftOffset > this.model.width + 10) {\r\n // margin?\r\n continue\r\n }\r\n const y = Math.round(this.fy(quote.close[i]))\r\n this.context.lineTo(x, y)\r\n }\r\n this.context.stroke()\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const text = this.attrs.label || ''\r\n const y = (this.height - 4) / 2\r\n new Text(\r\n {\r\n text,\r\n x: 28,\r\n y: ChartSettings.top.height + y,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n return this.renderCrossText(context, this.data.close.length - 1)\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const maxTickerLength = utils.max(this.attrs.tickers.map((t) => t.length))\r\n\r\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n const isLastDate = crossIndex === this.data.close.length - 1\r\n\r\n new Text(\r\n {\r\n text: `${months[month]} ${day} ${year} `,\r\n x: ChartSettings.left.width + (maxTickerLength > 15 ? 200 : 132),\r\n y: 30,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n background: Colors.canvasFill,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n\r\n const quotes: ObjectHash = {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const y = PADDING.S + (PADDING.S + LINE_HEIGHT.M) * index\r\n if (this.tickersDimensions[index]) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n ChartSettings.left.width - PADDING.XXXS,\r\n y - PADDING.XXXS,\r\n PADDING.XXXS + this.tickersDimensions[index] + PADDING.XXXS,\r\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\r\n )\r\n }\r\n const ticker = this.attrs.tickers[index]\r\n const closeValue = quotes[ticker].close[crossIndex]\r\n const text = new Text(\r\n {\r\n text: `${ticker} ${typeof closeValue === 'number' ? closeValue.toFixed(2) : NaN} `,\r\n x: ChartSettings.left.width,\r\n y,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n lineHeight: LINE_HEIGHT.M,\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n if (isLastDate) {\r\n this.tickersDimensions[index] = text.measure(context)\r\n }\r\n text.render(context)\r\n }\r\n }\r\n\r\n computeVisibleMinMax(...arrays: Array) {\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n\r\n const { leftOffset } = this.model\r\n for (const arr of arrays) {\r\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\r\n // margin?\r\n continue\r\n }\r\n\r\n if (min > arr[i]) {\r\n min = arr[i]\r\n }\r\n if (max < arr[i]) {\r\n max = arr[i]\r\n }\r\n }\r\n }\r\n\r\n return { min, max }\r\n }\r\n\r\n getMinMax() {\r\n const quotes = this.getQuotes()\r\n let { min, max } = this.computeVisibleMinMax(...quotes.map((q) => q.close))\r\n if (typeof this.attrs.min !== 'undefined') {\r\n min = this.attrs.min\r\n }\r\n if (typeof this.attrs.max !== 'undefined') {\r\n max = this.attrs.max\r\n }\r\n return { min, max }\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n getQuotes() {\r\n return Quote.select(\r\n (q: Quote) =>\r\n this.attrs.tickers.includes(q.ticker) &&\r\n q.timeframe === this.data?.timeframe &&\r\n this.model.chart_layout().isIdeaId(q.ideaID)\r\n )\r\n }\r\n\r\n toString() {\r\n return `Line chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default MultiLineChart\r\n","import { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { getBarWithoutMarginWidth } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Chart from './base_chart'\r\n\r\nclass OHLCChart extends Chart {\r\n static type = ChartElementType.OhlcChart\r\n static label = 'OHLC'\r\n static iconName = 'ohlcChartType'\r\n\r\n renderChart() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const barWithoutMarginWidth = getBarWithoutMarginWidth(this.model)\r\n\r\n let lineWidth = 1\r\n if (barWithoutMarginWidth >= 40) {\r\n lineWidth = 4\r\n } else if (barWithoutMarginWidth >= 30) {\r\n lineWidth = 3\r\n } else if (barWithoutMarginWidth >= 15) {\r\n lineWidth = 2\r\n }\r\n const lineThickness = lineWidth / 2\r\n const handleLengthFromWick = Math.round(barWithoutMarginWidth / 2 - lineThickness)\r\n const lineOffset = lineWidth % 2 === 0 ? 0 : 0.5\r\n this.context.set('lineWidth', lineWidth)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const barX = ~~(x + 1) + lineOffset // move 1px to right so cursor don't cover bar of ohlc-chart & round for pixel perfect render on zoom\r\n\r\n this.context.beginPath()\r\n this.context.set(\r\n 'strokeStyle',\r\n this.data.close[i] < this.data.open[i] ? Colors.ohlcTrendDown : Colors.ohlcTrendUp\r\n )\r\n\r\n this.context.moveTo(barX, Math.round(this.fy(this.data.high[i])))\r\n this.context.lineTo(barX, Math.round(this.fy(this.data.low[i])))\r\n\r\n if (handleLengthFromWick >= 1) {\r\n const open = Math.round(this.fy(this.data.open[i]))\r\n this.context.moveTo(barX + lineThickness, open + lineOffset) // move to right edge of wick\r\n this.context.lineTo(barX - lineThickness - handleLengthFromWick, open + lineOffset) // draw line to the left\r\n\r\n const close = Math.round(this.fy(this.data.close[i]))\r\n this.context.moveTo(barX - lineThickness, close + lineOffset) // move to left edge of wick\r\n this.context.lineTo(barX + lineThickness + handleLengthFromWick, close + lineOffset) // draw line to the right\r\n }\r\n\r\n this.context.stroke()\r\n },\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `OHLC ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default OHLCChart\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { ChartElementType, FONT_SIZE, MARGIN, OFFSET, PADDING, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\ninterface PerfChartAttrs extends BaseChartAttrs {\r\n tickers: string[]\r\n label?: string\r\n fromDate: string\r\n toDate: string\r\n min?: number\r\n max?: number\r\n}\r\n\r\nclass PerfChart extends Chart {\r\n static type = ChartElementType.PerfChart\r\n\r\n overlayLabelWidth: ObjectHash\r\n perf: ObjectHash = {}\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.overlayLabelWidth = {}\r\n }\r\n\r\n renderChart() {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n\r\n this.context.beginPath()\r\n this.context.set('lineWidth', 1)\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n if ((this.perf[ticker] != null ? this.perf[ticker].length : 0) > 0) {\r\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n this.context.beginPath()\r\n for (let i = 0, end = this.data.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n this.context.lineTo(this.fx(i), Math.round(this.fy(this.perf[ticker][i])))\r\n }\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const period = (() => {\r\n switch (this.model.quote().timeframe) {\r\n case 'd':\r\n return 'DAILY'\r\n case 'w':\r\n return 'WEEKLY'\r\n case 'm':\r\n return 'MONTHLY'\r\n default:\r\n return\r\n }\r\n })()\r\n const y = (this.height - 4) / 2\r\n new Text(\r\n {\r\n text: period,\r\n x: 28,\r\n y: ChartSettings.top.height + y,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\r\n let dateString = ''\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n switch (this.data.timeframe) {\r\n case 'd':\r\n case 'w':\r\n dateString = `${months[month]} ${day}`\r\n break\r\n case 'm':\r\n dateString = `${months[month]} ${year}`\r\n break\r\n default:\r\n return\r\n }\r\n\r\n let shouldRenderDate = false\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n const tickerData = this.perf[ticker]\r\n if (tickerData?.length) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n ChartSettings.left.width - PADDING.XXXS,\r\n OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index - PADDING.XXXS,\r\n PADDING.XXXS + this.overlayLabelWidth[ticker] + PADDING.XXXS,\r\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\r\n )\r\n const hasData = Number.isFinite(tickerData[crossIndex])\r\n const percentageText = hasData ? `${tickerData[crossIndex].toFixed(2)}%` : ''\r\n shouldRenderDate = shouldRenderDate || hasData\r\n new Text(\r\n {\r\n text: `${ticker} ${percentageText}`,\r\n x: ChartSettings.left.width,\r\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n }\r\n\r\n if (shouldRenderDate) {\r\n new Text(\r\n {\r\n text: `${dateString} `,\r\n x: ChartSettings.left.width + 132,\r\n y: 30,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n background: Colors.canvasFill,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n }\r\n\r\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\r\n super.renderOverlaysLabels(context)\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n const tickerData = this.perf[ticker]\r\n if (tickerData?.length) {\r\n const lastCrossIndex = this.perf[ticker].length - 1\r\n const hasData = Number.isFinite(tickerData[lastCrossIndex])\r\n const percentageText = hasData ? `${tickerData[lastCrossIndex].toFixed(2)}%` : ''\r\n const text = new Text(\r\n {\r\n text: `${ticker} ${percentageText}`,\r\n x: ChartSettings.left.width,\r\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n this.overlayLabelWidth = { ...this.overlayLabelWidth, [ticker]: text.measure(context) }\r\n text.render(context)\r\n }\r\n }\r\n }\r\n\r\n _compute() {\r\n this.perf = {}\r\n const quotes = this.getQuotes()\r\n\r\n const fromDate = new Date(this.attrs.fromDate + ' 00:00')\r\n const toDate = new Date(this.attrs.toDate + ' 23:59')\r\n const filteredQuotes = []\r\n for (const quote of quotes) {\r\n const closes = []\r\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const date = utils.dateFromUnixTimestamp(quote.date[i])\r\n if (fromDate <= date && date <= toDate) {\r\n closes.push(quote.close[i])\r\n }\r\n }\r\n filteredQuotes.push({ ticker: quote.ticker, close: closes })\r\n }\r\n\r\n const daysCount = d3.max(filteredQuotes, (q) => q.close.length) ?? 0\r\n for (const quote of filteredQuotes) {\r\n this.perf[quote.ticker] = []\r\n const first = quote.close[0]\r\n let offset = 0\r\n if (daysCount > quote.close.length) {\r\n offset = daysCount - quote.close.length\r\n for (let i = 0, end1 = offset, asc1 = end1 >= 0; asc1 ? i < end1 : i > end1; asc1 ? i++ : i--) {\r\n this.perf[quote.ticker][i] = NaN\r\n }\r\n }\r\n for (let i = 0, end2 = quote.close.length, asc2 = end2 >= 0; asc2 ? i < end2 : i > end2; asc2 ? i++ : i--) {\r\n this.perf[quote.ticker][offset + i] = (quote.close[i] * 100) / first - 100\r\n }\r\n }\r\n const { min, max } = this.computeVisibleMinMax(...Object.keys(this.perf).map((x) => this.perf[x]))\r\n return { min, max }\r\n }\r\n\r\n // TODO refactor into ?utils\r\n computeVisibleMinMax(...arrays: Array) {\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n\r\n const { leftOffset } = this.model\r\n for (const arr of arrays) {\r\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\r\n // margin?\r\n continue\r\n }\r\n\r\n if (min > arr[i]) {\r\n min = arr[i]\r\n }\r\n if (max < arr[i]) {\r\n max = arr[i]\r\n }\r\n }\r\n }\r\n\r\n return { min, max }\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context,\r\n xOffset: ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const ticks = this.paneModel.scale.y.ticks(10)\r\n const yLine = this.getYLine()\r\n const text = new Text(\r\n {\r\n x: this.width + 8,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n )\r\n for (const tick of ticks) {\r\n const y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n text.set({ text: tick.toFixed(2), y }).render(context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderXAxis() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n y: this.height + 18,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.bottom,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n const textWidth = text.set({ text: '2020' }).measure(this.context)\r\n\r\n let date = new Date(this.data.date[0] * 1000)\r\n let lastMonth = date.getMonth() + '-' + date.getFullYear()\r\n\r\n let monthsInData = 0\r\n this.data.date.forEach((d, index) => {\r\n if (index < 1) {\r\n return\r\n }\r\n\r\n const date = new Date(d * 1000)\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n monthsInData++\r\n }\r\n lastMonth = month\r\n })\r\n\r\n const availableTickSpots = ~~(this.width / textWidth)\r\n const monthsToAvail = monthsInData / availableTickSpots\r\n let renderMonth\r\n if (monthsToAvail <= 1) {\r\n renderMonth = () => true\r\n } else if (monthsToAvail <= 2) {\r\n renderMonth = (x: number) => x % 2 === 0\r\n } else if (monthsToAvail <= 3) {\r\n renderMonth = (x: number) => x % 3 === 0\r\n } else if (monthsToAvail <= 4) {\r\n renderMonth = (x: number) => x % 4 === 0\r\n } else if (monthsToAvail <= 6) {\r\n renderMonth = (x: number) => x % 6 === 0\r\n } else {\r\n renderMonth = (x: number) => x === 0\r\n }\r\n\r\n date = new Date(this.data.date[0] * 1000)\r\n lastMonth = date.getMonth() + '-' + date.getFullYear()\r\n\r\n const xLine = this.getXLine()\r\n\r\n for (let i = 0; i < this.data.date.length; i++) {\r\n date = new Date(this.data.date[i] * 1000)\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = this.fx(i)\r\n if (x + this.leftOffset < -15 || x + this.leftOffset > this.width + 15) {\r\n // margin?\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n if (!renderMonth(date.getMonth())) {\r\n continue\r\n }\r\n\r\n text\r\n .set({\r\n text: date.getMonth() === 0 ? date.getFullYear().toString() : months[date.getMonth()],\r\n x: x,\r\n })\r\n .render(this.context)\r\n }\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n getMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n getQuotes() {\r\n return Quote.select(\r\n (q: Quote) =>\r\n this.attrs.tickers.includes(q.ticker) &&\r\n q.timeframe === this.data?.timeframe &&\r\n this.model.chart_layout().isIdeaId(q.ideaID)\r\n )\r\n }\r\n\r\n toString() {\r\n return `Perf chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default PerfChart\r\n","import { ChartElementType } from '../constants/common'\r\nimport candleStick from './candle_stick'\r\nimport hollowCandleStick from './candle_stick_hollow'\r\nimport heikinAshi from './heikin_ashi'\r\nimport lineChart from './line_chart'\r\nimport marketSentiment from './market_sentiment'\r\nimport multiLineCharts from './multi_line_chart'\r\nimport ohlcChart from './ohlc_chart'\r\nimport perfChart from './perf_chart'\r\n\r\nexport const chartsByType = Object.freeze({\r\n [ChartElementType.CandleStick]: candleStick,\r\n [ChartElementType.HeikinAshi]: heikinAshi,\r\n [ChartElementType.HollowCandleStick]: hollowCandleStick,\r\n [ChartElementType.LineChart]: lineChart,\r\n [ChartElementType.MarketSentiment]: marketSentiment,\r\n [ChartElementType.MultiLineChart]: multiLineCharts,\r\n [ChartElementType.OhlcChart]: ohlcChart,\r\n [ChartElementType.PerfChart]: perfChart,\r\n})\r\n","export const FONT_SIZE = {\r\n XXS: 5,\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n L: 11,\r\n XXL: 18,\r\n XXXL: 23,\r\n}\r\nexport const LINE_HEIGHT = {\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n}\r\nexport const PADDING = {\r\n XXXS: 1,\r\n XXS: 2,\r\n XS: 3,\r\n S: 5,\r\n}\r\nexport const MARGIN = {\r\n XS: 4,\r\n}\r\nexport const CHART_MARGIN = {\r\n S: 15,\r\n M: 30,\r\n L: 35,\r\n XL: 38,\r\n XXL: 48,\r\n}\r\nexport const SETTINGS_HEIGHT = 44\r\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\r\nexport const OFFSET = {\r\n XXS: 2,\r\n XS: 4,\r\n S: 6,\r\n M: 8,\r\n XXL: 20,\r\n}\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nexport enum ChartEditorEnum {\r\n publish = 'publish',\r\n tools = 'tools',\r\n ideas = 'ideas',\r\n settings = 'settings',\r\n timeframe = 'timeframe',\r\n}\r\n\r\nexport enum LayoutType {\r\n '1h1v' = '1h1v',\r\n '1h2v' = '1h2v',\r\n '1h3v' = '1h3v',\r\n '2h1v' = '2h1v',\r\n '2h2v' = '2h2v',\r\n '3h1v' = '3h1v',\r\n '3h2v' = '3h2v',\r\n '1l2r' = '1l2r',\r\n '1t2b' = '1t2b',\r\n}\r\n\r\nexport enum CanvasElementType {\r\n element = 'canvas/element',\r\n arrow = 'canvas/arrow',\r\n brushV1 = 'canvas/brush/brush_v1',\r\n curve = 'canvas/curve',\r\n ellipse = 'canvas/ellipse',\r\n fibonacciRetracements = 'canvas/fibonacci_retracements',\r\n horizontalLine = 'canvas/horizontal_line',\r\n line = 'canvas/line',\r\n measure = 'canvas/measure',\r\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\r\n polygon = 'canvas/polygon',\r\n position = 'canvas/position',\r\n rectangle = 'canvas/rectangle',\r\n rotatedRectangle = 'canvas/rotated_rectangle',\r\n scaledLine = 'canvas/scaled_line',\r\n scaledText = 'canvas/scaled_text',\r\n symbol = 'canvas/symbol',\r\n text = 'canvas/text',\r\n triangle = 'canvas/triangle',\r\n verticalLine = 'canvas/vertical_line',\r\n xabcd = 'canvas/xabcd',\r\n calloutV1 = 'canvas/callout/callout_v1',\r\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\r\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\r\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\r\n}\r\n\r\nexport enum ChartElementType {\r\n CandleStick = 'charts/candle_stick',\r\n HeikinAshi = 'charts/heikin_ashi',\r\n HollowCandleStick = 'charts/candle_stick_hollow',\r\n LineChart = 'charts/line_chart',\r\n OhlcChart = 'charts/ohlc_chart',\r\n MarketSentiment = 'charts/market_sentiment',\r\n MultiLineChart = 'charts/multi_line_chart',\r\n PerfChart = 'charts/perf_chart',\r\n}\r\n\r\nexport enum IndicatorType {\r\n Indicator = 'indicators/indicator',\r\n None = 'indicators/none',\r\n Adx = 'indicators/adx',\r\n Aro = 'indicators/aro',\r\n Aroosc = 'indicators/aroosc',\r\n Atr = 'indicators/atr',\r\n Cci = 'indicators/cci',\r\n Cot = 'indicators/cot',\r\n Fi = 'indicators/fi',\r\n Macd = 'indicators/macd',\r\n Mfi = 'indicators/mfi',\r\n Obv = 'indicators/obv',\r\n Perf = 'indicators/perf',\r\n Rmi = 'indicators/rmi',\r\n Roc = 'indicators/roc',\r\n Rsi = 'indicators/rsi',\r\n Rvol = 'indicators/rvol',\r\n Rwi = 'indicators/rwi',\r\n Stofa = 'indicators/stofa',\r\n Stofu = 'indicators/stofu',\r\n Stosl = 'indicators/stosl',\r\n Trix = 'indicators/trix',\r\n Ult = 'indicators/ult',\r\n Vol = 'indicators/vol',\r\n Wr = 'indicators/wr',\r\n}\r\n\r\nexport enum OverlayType {\r\n Overlay = 'overlays/overlay',\r\n None = 'overlays/none',\r\n Bb = 'overlays/bb',\r\n Dch = 'overlays/dch',\r\n Ema = 'overlays/ema',\r\n Ema2 = 'overlays/ema2',\r\n Hilo = 'overlays/hilo',\r\n Hline = 'overlays/hline',\r\n Ic = 'overlays/ic',\r\n Icf = 'overlays/icf',\r\n Kch = 'overlays/kch',\r\n Patterns = 'overlays/patterns',\r\n Pp = 'overlays/pp',\r\n Sar = 'overlays/sar',\r\n Sma = 'overlays/sma',\r\n Sma2 = 'overlays/sma2',\r\n Str = 'overlays/str',\r\n Vp = 'overlays/vp',\r\n Vwap = 'overlays/vwap',\r\n}\r\n\r\nexport enum ChartEventDbType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventType {\r\n ChartEvent = 'chartEvent/chartEvent',\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventBadgeType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n EarningsPositive = 'chartEvent/earnings',\r\n EarningsNegative = 'chartEvent/earningsNegative',\r\n EarningsNeutral = 'chartEvent/earningsNeutral',\r\n EarningsFuture = 'chartEvent/earningsFuture',\r\n}\r\n\r\nexport const ChartEventLabels: Record = {\r\n [ChartEventBadgeType.Dividends]: 'Dividends',\r\n [ChartEventBadgeType.Split]: 'Split',\r\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\r\n}\r\n\r\ninterface LayoutRule {\r\n columns: number\r\n rows: number\r\n count: number\r\n gridAreas?: string[]\r\n}\r\n\r\nexport const LAYOUTS: Record = {\r\n '1h1v': { columns: 1, rows: 1, count: 1 },\r\n '1h2v': { columns: 1, rows: 2, count: 2 },\r\n '1h3v': { columns: 1, rows: 3, count: 3 },\r\n '2h1v': { columns: 2, rows: 1, count: 2 },\r\n '2h2v': { columns: 2, rows: 2, count: 4 },\r\n '3h1v': { columns: 3, rows: 1, count: 3 },\r\n '3h2v': { columns: 3, rows: 2, count: 6 },\r\n '1l2r': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\r\n },\r\n '1t2b': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\r\n },\r\n}\r\n\r\nexport const SORT_DIRECTION = {\r\n ASC: 'ASC',\r\n DESC: 'DESC',\r\n}\r\n\r\nexport const ICON_SIZE = {\r\n L: 32,\r\n}\r\n\r\n// Keep in sync with the copy in Website repo - Website/js/main/constants.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n\r\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\r\n\r\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\r\n\r\nexport const IntradayTimeframeInterval = {\r\n [TIMEFRAME.i1]: 1,\r\n [TIMEFRAME.i2]: 2,\r\n [TIMEFRAME.i3]: 3,\r\n [TIMEFRAME.i5]: 5,\r\n [TIMEFRAME.i10]: 10,\r\n [TIMEFRAME.i15]: 15,\r\n [TIMEFRAME.i30]: 30,\r\n [TIMEFRAME.h]: 60,\r\n [TIMEFRAME.h2]: 120,\r\n [TIMEFRAME.h4]: 240,\r\n}\r\n\r\nexport const TimeframeLabelShort = {\r\n [TIMEFRAME.i1]: '1M',\r\n [TIMEFRAME.i2]: '2M',\r\n [TIMEFRAME.i3]: '3M',\r\n [TIMEFRAME.i5]: '5M',\r\n [TIMEFRAME.i10]: '10M',\r\n [TIMEFRAME.i15]: '15M',\r\n [TIMEFRAME.i30]: '30M',\r\n [TIMEFRAME.h]: '1H',\r\n [TIMEFRAME.h2]: '2H',\r\n [TIMEFRAME.h4]: '4H',\r\n [TIMEFRAME.d]: 'D',\r\n [TIMEFRAME.w]: 'W',\r\n [TIMEFRAME.m]: 'M',\r\n}\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport const TIMEFRAME_SECONDS = {\r\n [TIMEFRAME.i1]: 60,\r\n [TIMEFRAME.i2]: 120,\r\n [TIMEFRAME.i3]: 180,\r\n [TIMEFRAME.i5]: 300,\r\n [TIMEFRAME.i10]: 600,\r\n [TIMEFRAME.i15]: 900,\r\n [TIMEFRAME.i30]: 1800,\r\n [TIMEFRAME.h]: 3600,\r\n [TIMEFRAME.h2]: 7200,\r\n [TIMEFRAME.h4]: 14400,\r\n [TIMEFRAME.d]: 86400,\r\n [TIMEFRAME.w]: 604800,\r\n [TIMEFRAME.m]: 2592000,\r\n}\r\n\r\nexport const CRYPTOS = {\r\n BTCUSD: 'BTCUSD',\r\n LTCUSD: 'LTCUSD',\r\n ETHUSD: 'ETHUSD',\r\n XRPUSD: 'XRPUSD',\r\n BCHUSD: 'BCHUSD',\r\n BTCEUR: 'BTCEUR',\r\n LTCEUR: 'LTCEUR',\r\n ETHEUR: 'ETHEUR',\r\n XRPEUR: 'XRPEUR',\r\n BCHEUR: 'BCHEUR',\r\n LTCBTC: 'LTCBTC',\r\n ETHBTC: 'ETHBTC',\r\n XRPBTC: 'XRPBTC',\r\n BCHBTC: 'BCHBTC',\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\nexport enum TextAlign {\r\n left = 'left',\r\n right = 'right',\r\n center = 'center',\r\n start = 'start',\r\n end = 'end',\r\n}\r\n\r\nexport enum TextBaseline {\r\n top = 'top',\r\n hanging_dont_use = 'hanging', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n middle = 'middle',\r\n alphabetic = 'alphabetic',\r\n ideographic_dont_use = 'ideographic', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n bottom = 'bottom',\r\n}\r\n\r\nexport enum ScaleType {\r\n Linear = 'linear',\r\n Percentage = 'percentage',\r\n Logarithmic = 'logarithmic',\r\n}\r\n\r\nexport enum QuotePollingIntervalInMs {\r\n Default = 3000,\r\n Free = 180000,\r\n Elite = 3000,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\r\n\r\nexport const ScaleLabel = {\r\n [ScaleType.Linear]: 'Linear',\r\n [ScaleType.Percentage]: 'Percentage',\r\n [ScaleType.Logarithmic]: 'Logarithmic',\r\n}\r\n\r\nexport const PANE_HEIGHT_DEFAULT = {\r\n chart: 400,\r\n indicator: 120,\r\n}\r\n\r\nexport const INDICATOR_LABEL_HEIGHT = 24\r\n\r\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\r\n\r\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\r\n\r\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\r\n\r\nexport const getTimeframeLabel = (timeframe: string) => {\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n return '1 MIN'\r\n case TIMEFRAME.i2:\r\n return '2 MIN'\r\n case TIMEFRAME.i3:\r\n return '3 MIN'\r\n case TIMEFRAME.i5:\r\n return '5 MIN'\r\n case TIMEFRAME.i10:\r\n return '10 MIN'\r\n case TIMEFRAME.i15:\r\n return '15 MIN'\r\n case TIMEFRAME.i30:\r\n return '30 MIN'\r\n case TIMEFRAME.h:\r\n return '1 HR'\r\n case TIMEFRAME.h2:\r\n return '2 HR'\r\n case TIMEFRAME.h4:\r\n return '4 HR'\r\n case TIMEFRAME.d:\r\n return 'DAILY'\r\n case TIMEFRAME.w:\r\n return 'WEEKLY'\r\n case TIMEFRAME.m:\r\n return 'MONTHLY'\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nexport type ChartsPageQueryParams = {\r\n p: string\r\n t: string\r\n l: string\r\n r?: string\r\n i?: string\r\n sidebar?: string\r\n}\r\n\r\nexport type QuotePageQueryParams = {\r\n p?: string\r\n t: string\r\n r?: string\r\n i?: string\r\n ty?: QuotePageQueryChartTypes\r\n}\r\n\r\nexport enum QuotePageQueryChartTypes {\r\n l = 'l',\r\n c = 'c',\r\n cs = 'cs',\r\n hc = 'hc',\r\n ha = 'ha',\r\n o = 'o',\r\n p = 'p',\r\n}\r\n\r\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\r\n\r\nexport enum MacroTimeframe {\r\n // seconds = 'seconds',\r\n minutes = 'minutes',\r\n hours = 'hours',\r\n days = 'days',\r\n weeks = 'weeks',\r\n months = 'months',\r\n}\r\n\r\nexport const MicroMacroTimeframe = {\r\n [TIMEFRAME.i1]: {\r\n micro: 1,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i3]: {\r\n micro: 3,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i5]: {\r\n micro: 5,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i10]: {\r\n micro: 10,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i15]: {\r\n micro: 15,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i30]: {\r\n micro: 30,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.h]: {\r\n micro: 1,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h4]: {\r\n micro: 4,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.d]: {\r\n micro: 1,\r\n macro: MacroTimeframe.days,\r\n },\r\n [TIMEFRAME.w]: {\r\n micro: 1,\r\n macro: MacroTimeframe.weeks,\r\n },\r\n [TIMEFRAME.m]: {\r\n micro: 1,\r\n macro: MacroTimeframe.months,\r\n },\r\n}\r\n\r\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\r\n (prev, curr) => ({\r\n ...prev,\r\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\r\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\r\n : [MicroMacroTimeframe[curr].micro],\r\n }),\r\n {} as { [key in MacroTimeframe]: number[] }\r\n)\r\n\r\ntype IRange = {\r\n from?: number\r\n to?: number\r\n}\r\n\r\nexport type IVisibility = {\r\n [key in MacroTimeframe]?: IRange\r\n}\r\n\r\nexport enum SetVisibilityTo {\r\n currentAndAbove,\r\n currentAndBelow,\r\n currentOnly,\r\n all,\r\n}\r\n\r\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\r\n\r\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n","import {\r\n Notification,\r\n Paragraph,\r\n generatePathForTimeframeDateRange,\r\n getDateRangeGroupsWithHref,\r\n timeframeUtm,\r\n useNotification,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { SpecificChartFunctionality, TIMEFRAME, TimeframeAndIntradayType } from '../../constants/common'\r\nimport Chart from '../../models/chart'\r\nimport Quote from '../../models/quote'\r\nimport { dateFromUnixTimestamp } from '../../utils'\r\nimport { getChartStartEndDates, getVisibleBarsNumber } from '../renderUtils'\r\nimport { useChartsPathLocation } from './use-charts-path-location'\r\nimport { getTimeframeGroupsWithHref } from './utils'\r\n\r\ninterface IPathForTimeframeDateRangeProps {\r\n timeframe: TimeframeAndIntradayType\r\n dateRange?: string | null\r\n ticker?: string\r\n}\r\n\r\nexport interface IDateRange {\r\n value: string\r\n timeframe: TIMEFRAME\r\n}\r\n\r\nexport function useChartModelCustomDateRangeValues({\r\n chartModel,\r\n isPremium,\r\n}: {\r\n chartModel: Chart | null\r\n isPremium: boolean\r\n}) {\r\n const notificationContext = useNotification()\r\n const location = useLocation()\r\n const [isFetching, setIsFetching] = React.useState(false)\r\n const chartLayoutModel = chartModel?.chart_layout() || null\r\n const chartIndex = chartLayoutModel?.getAllCharts().findIndex((chart) => chartModel!.eql(chart)) ?? -1\r\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel, chartIndex })\r\n const specificChartFunctionality = chartLayoutModel?.specificChartFunctionality ?? SpecificChartFunctionality.default\r\n\r\n const anchorDate = React.useMemo(() => {\r\n if (!chartModel) return new Date()\r\n const quote = chartModel.quote()\r\n return dateFromUnixTimestamp(quote.date[quote.date.length - 1])\r\n }, [chartModel])\r\n\r\n const generateChartLayoutRouterPath = React.useCallback(\r\n ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\r\n if (specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n return getChartsToPath({\r\n ticker: ticker,\r\n timeframe: timeframe as TIMEFRAME,\r\n dateRange: dateRange,\r\n })\r\n }\r\n\r\n return generatePathForTimeframeDateRange({\r\n isPremium,\r\n pathname: location.pathname,\r\n timeframe: timeframe,\r\n dateRange: dateRange,\r\n utmCampaign: timeframeUtm[specificChartFunctionality],\r\n })\r\n },\r\n [getChartsToPath, isPremium, specificChartFunctionality, location.pathname]\r\n )\r\n\r\n const timeframeGroupsWithHref = (isPremium: boolean) =>\r\n getTimeframeGroupsWithHref({\r\n isPremium,\r\n generatePath: (timeFrame) => generateChartLayoutRouterPath({ timeframe: timeFrame.value, dateRange: null }),\r\n })\r\n\r\n const dateRangeGroupsWithHref = ({\r\n isPremium,\r\n customRange,\r\n instrument,\r\n }: {\r\n isPremium: boolean\r\n customRange?: string\r\n instrument: Instrument\r\n }) =>\r\n getDateRangeGroupsWithHref({\r\n isPremium,\r\n customRange,\r\n instrument,\r\n generatePath: (dateRange: { timeframe?: TIMEFRAME; value: string }) =>\r\n generateChartLayoutRouterPath({ timeframe: dateRange.timeframe!, dateRange: dateRange.value }),\r\n })\r\n\r\n const handleCustomDateRangeValidation = async (dateRangeState: { value: string | null; timeframe: TIMEFRAME }) => {\r\n if (dateRangeState.value !== null) {\r\n const { timeframe, ticker, instrument, premarket, aftermarket } = chartModel?.quote() || {}\r\n const patterns = !!chartModel?.getHasPatterns()\r\n if (!anchorDate || !instrument || !ticker || !timeframe || !dateRangeState.value) return false\r\n setIsFetching(true)\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe: dateRangeState.timeframe,\r\n options: {\r\n premarket,\r\n aftermarket,\r\n patterns,\r\n cachePredicate: (quote) => quote.ideaID === undefined,\r\n fetchNewDataOnCachedQuote: true,\r\n },\r\n })\r\n setIsFetching(false)\r\n\r\n const { numOfVisibleBars } = getVisibleBarsNumber({\r\n ...getChartStartEndDates({ dateRange: dateRangeState.value, quote }),\r\n quote,\r\n dateRange: dateRangeState.value,\r\n })\r\n if (numOfVisibleBars === 0) {\r\n notificationContext.show(\r\n } timeoutInMs={6000}>\r\n \r\n There are no data for the selected date range. Try selecting different dates.\r\n \r\n \r\n )\r\n\r\n return false\r\n }\r\n }\r\n return true\r\n }\r\n\r\n return {\r\n anchorDate,\r\n generateChartLayoutRouterPath,\r\n timeframeGroupsWithHref,\r\n dateRangeGroupsWithHref,\r\n isFetching,\r\n handleCustomDateRangeValidation,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { ChartsPageQueryParams, LAYOUTS, LayoutType, TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { ChartSyncablePart } from '../../models/chart/contstants'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { getIsMobilePortrait } from '../../utils'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\n\r\nexport function useChartsPathLocation({\r\n chartLayoutModel: unwatchedChartLayoutModel,\r\n chartIndex = -1,\r\n}: {\r\n chartLayoutModel: ChartLayout | null\r\n chartIndex?: number\r\n}) {\r\n const location = useLocation()\r\n const chartLayoutModel = useModelState(unwatchedChartLayoutModel, {\r\n watchProperties: ['syncChartParts'],\r\n })\r\n const hasSyncedTimeframe = React.useMemo(\r\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Timeframe),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [chartLayoutModel?.syncChartParts]\r\n )\r\n const hasSyncedTicker = React.useMemo(\r\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Ticker),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [chartLayoutModel?.syncChartParts]\r\n )\r\n\r\n const getChartsToPath = React.useCallback(\r\n ({\r\n ticker,\r\n timeframe,\r\n dateRange,\r\n layout,\r\n }: {\r\n timeframe?: TIMEFRAME\r\n dateRange?: string | null\r\n ticker?: string\r\n layout?: LayoutType\r\n }) => {\r\n if (!chartLayoutModel) {\r\n return {\r\n pathname: location.pathname,\r\n search: '',\r\n }\r\n }\r\n\r\n const decodedSearch = decodeQueryString(location.search)\r\n const { count } = LAYOUTS[(layout ?? chartLayoutModel.layout) as LayoutType]\r\n const urlTickers = decodedSearch.t?.split(',') ?? []\r\n const urlTimeframes = decodedSearch.p?.split(',') ?? []\r\n const urlDateRanges = decodedSearch.r?.split(',')\r\n\r\n const chartsArrayPlaceholder = Array.from({ length: count })\r\n const tickers = chartsArrayPlaceholder\r\n .map((_, index) => {\r\n const currentTicker = urlTickers[index] ?? urlTickers[urlTickers.length - 1]\r\n return (chartIndex === index || hasSyncedTicker) && ticker ? ticker : currentTicker\r\n })\r\n .join(',')\r\n const timeframes = chartsArrayPlaceholder\r\n .map((_, index) => {\r\n const currentTimeframe = urlTimeframes[index] ?? urlTimeframes[urlTimeframes.length - 1]\r\n return (chartIndex === index || hasSyncedTimeframe) && timeframe ? timeframe : currentTimeframe\r\n })\r\n .join(',')\r\n const ranges = chartsArrayPlaceholder\r\n .map((_, index) => {\r\n const currentDaterange = urlDateRanges\r\n ? urlDateRanges[index] ?? urlDateRanges[urlDateRanges.length - 1]\r\n : undefined\r\n return (chartIndex === index || hasSyncedTimeframe) && dateRange !== undefined ? dateRange : currentDaterange\r\n })\r\n .join(',')\r\n\r\n return {\r\n pathname: location.pathname,\r\n search: `?${encodeQueryString({\r\n t: tickers,\r\n p: timeframes,\r\n r: ranges.split(',').some(Boolean) ? ranges : undefined,\r\n l: layout ?? chartLayoutModel.layout,\r\n sidebar: getIsMobilePortrait() ? undefined : decodedSearch.sidebar,\r\n })}`,\r\n }\r\n },\r\n [chartLayoutModel, chartIndex, location, hasSyncedTicker, hasSyncedTimeframe]\r\n )\r\n\r\n return { getChartsToPath }\r\n}\r\n","import { IconNameType, getTimeframeGroups } from '@finviz/website'\r\nimport { type To } from 'react-router-dom'\r\n\r\nimport { TimeframeAndIntradayType } from '../../constants/common'\r\n\r\ninterface ITimeFrame {\r\n value: TimeframeAndIntradayType\r\n label: string\r\n labelShort: string\r\n labelPageTitle?: string\r\n}\r\n\r\ninterface ITimeframeGroup {\r\n label: string\r\n timeframes: ITimeFrame[]\r\n}\r\n\r\nexport function getTimeframeGroupsWithHref({\r\n isPremium,\r\n generatePath,\r\n}: {\r\n isPremium: boolean\r\n generatePath: (timeframe: ITimeFrame) => To\r\n}) {\r\n return getTimeframeGroups(isPremium).map((timeFrameGroup: ITimeframeGroup) => ({\r\n label: timeFrameGroup.label,\r\n timeframes: timeFrameGroup.timeframes.map((timeFrame) => ({\r\n ...timeFrame,\r\n href: generatePath(timeFrame),\r\n })),\r\n }))\r\n}\r\n\r\nexport enum QuoteNodeChartTypes {\r\n candlesticksimple = 'candlesticksimple',\r\n candlestick = 'candlestick',\r\n line = 'line',\r\n ohlc = 'ohlc',\r\n heikinashi = 'heikinashi',\r\n hollowcandlestick = 'hollowcandlestick',\r\n}\r\n\r\nexport enum QuoteUrlChartTypes {\r\n cs = 'cs',\r\n c = 'c',\r\n l = 'l',\r\n o = 'o',\r\n ha = 'ha',\r\n hc = 'hc',\r\n}\r\n\r\nexport const QuoteShortToLongType = {\r\n [QuoteUrlChartTypes.cs]: QuoteNodeChartTypes.candlesticksimple,\r\n [QuoteUrlChartTypes.c]: QuoteNodeChartTypes.candlestick,\r\n [QuoteUrlChartTypes.l]: QuoteNodeChartTypes.line,\r\n [QuoteUrlChartTypes.o]: QuoteNodeChartTypes.ohlc,\r\n [QuoteUrlChartTypes.ha]: QuoteNodeChartTypes.heikinashi,\r\n [QuoteUrlChartTypes.hc]: QuoteNodeChartTypes.hollowcandlestick,\r\n} as const\r\n\r\nexport const QuoteLongToShortType = {\r\n [QuoteNodeChartTypes.candlesticksimple]: QuoteUrlChartTypes.cs,\r\n [QuoteNodeChartTypes.candlestick]: QuoteUrlChartTypes.c,\r\n [QuoteNodeChartTypes.line]: QuoteUrlChartTypes.l,\r\n [QuoteNodeChartTypes.ohlc]: QuoteUrlChartTypes.o,\r\n [QuoteNodeChartTypes.heikinashi]: QuoteUrlChartTypes.ha,\r\n [QuoteNodeChartTypes.hollowcandlestick]: QuoteUrlChartTypes.hc,\r\n} as const\r\n\r\nexport type TypeBaseOption = {\r\n label: string\r\n value: QuoteNodeChartTypes\r\n icon: IconNameType\r\n href?: string\r\n}\r\nexport const DEFAULT_TYPES: TypeBaseOption[] = [\r\n { icon: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle' },\r\n { icon: 'lineChartType', value: QuoteNodeChartTypes.line, label: 'Line' },\r\n { icon: 'ohlcChartType', value: QuoteNodeChartTypes.ohlc, label: 'OHLC' },\r\n { icon: 'candleBarHollow', value: QuoteNodeChartTypes.hollowcandlestick, label: 'Hollow Candle' },\r\n { icon: 'candleBarHeikinAshi', value: QuoteNodeChartTypes.heikinashi, label: 'Heikin Ashi' },\r\n]\r\n\r\nexport const FREE_TYPES_QUOTE: TypeBaseOption[] = [\r\n { icon: 'candleBarBasic', value: QuoteNodeChartTypes.candlesticksimple, label: 'Candle - simple' },\r\n { icon: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle - advanced' },\r\n // Filter out the candle from DEFAULT_TYPES, we’re naming it differently\r\n ...DEFAULT_TYPES.filter((type) => type.value !== QuoteNodeChartTypes.candlestick),\r\n]\r\n\r\nexport const FREE_TYPES_QUOTE_VALUES = ['candlesticksimple', 'candlestick', 'line']\r\n","export const chartSettingsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"chart-settings\" */ './module-entry'),\r\n cacheKey: 'chart-settings',\r\n}\r\n\r\nexport const useChartLayoutGlobalModelAsyncModule = {\r\n importFn: () =>\r\n import(/* webpackChunkName: \"use-chart-layout-global-model\" */ './useChartLayoutGlobalModel/module-entry'),\r\n cacheKey: 'use-chart-layout-global-model',\r\n}\r\n\r\nexport const preventClosingUnsavedChangesAsyncModule = {\r\n importFn: () =>\r\n import(/* webpackChunkName: \"prevent-closing-unsaved-changes\" */ './PreventClosingUnsavedChanges/module-entry'),\r\n cacheKey: 'prevent-closing-unsaved-changes',\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { getChartStartEndDates } from '../controllers/renderUtils'\r\nimport Quote from '../models/quote'\r\n\r\n// **************START**************\r\n// Functions from here until END have to be in sync with\r\n// Finviz-Website: components/timeframe-bar/custom-date-range-utils.ts\r\n// *********************************\r\n\r\nexport enum CustomDateRangePrefixEnum {\r\n Range = 'range',\r\n Prev = 'prev',\r\n}\r\n\r\nexport const CUSTOM_DATE_RANGE = 'custom'\r\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\r\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\r\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\r\n\r\nexport function getParsedDateRange(dateRange: string) {\r\n return dateRange.split(DATE_RANGE_PREFIX_DELMITER)\r\n}\r\n\r\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\r\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\r\n const dateFrom = dateFromString ? new Date(dateFromString) : null\r\n const dateTo = dateToString ? new Date(dateToString) : null\r\n return {\r\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\r\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\r\n }\r\n }\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\r\n\r\n if ([years, months, days].some(Number.isNaN)) {\r\n return { start: null, end: null }\r\n }\r\n\r\n return {\r\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\r\n end: anchorDate,\r\n }\r\n }\r\n\r\n return { start: null, end: anchorDate }\r\n}\r\n\r\n// **************END**************\r\n// Functions below don't need to be\r\n// in sync with Website repository\r\n// *******************************\r\n\r\nexport function getParsedDateRangeMetaData({ dateRange, quote }: { dateRange: string; quote: Quote }) {\r\n const parsedRange = getChartStartEndDates({ dateRange, quote })\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n\r\n let startQuoteDate: Date | null = null\r\n let endQuoteDate: Date | null = null\r\n let numOfDaysToRender: number | null = null\r\n\r\n if (parsedRange.start && dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const reversedDaysInQuote = [...daysInQuote].reverse()\r\n const startQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.start!.getTime())\r\n const endQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.end!.getTime())\r\n startQuoteDate = reversedDaysInQuote[startQuoteDayIndex] ?? null\r\n endQuoteDate = reversedDaysInQuote[endQuoteDayIndex] ?? null\r\n numOfDaysToRender = quote.interval <= 5 ? startQuoteDayIndex - endQuoteDayIndex + 1 : null\r\n }\r\n\r\n return {\r\n start: parsedRange.start,\r\n end: parsedRange.end,\r\n startQuoteDate,\r\n endQuoteDate,\r\n numOfDaysToRender,\r\n numOfBarsToRender: (numOfDaysToRender ?? 0) * (quote.getBarsInDay() ?? 0) || undefined,\r\n renderDateStart: parsedRange.start && dateFns.startOfDay(parsedRange.start),\r\n renderDateEnd: parsedRange.end && dateFns.endOfDay(parsedRange.end),\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\nimport * as dateFns from 'date-fns'\r\n\r\nimport { Instrument, ObjectHash } from '../../types/shared'\r\nimport {\r\n CHART_MARGIN,\r\n DateRangeType,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport ChartEventElement from '../models/chart-event-element'\r\nimport ChartLayout from '../models/chart_layout'\r\nimport { IChartSettings, IIndicatorSettings, ISettings } from '../models/chart_settings/interfaces'\r\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\r\nimport Element from '../models/element'\r\nimport Pane, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport Utils from '../utils'\r\nimport utils, { convertLocalToNyTime, dateFromUnixTimestamp, isRedesignedPage } from '../utils'\r\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../utils/chart'\r\nimport {\r\n DATE_RANGE_PREFIX_DELMITER,\r\n getParsedDateRangeMetaData,\r\n parseCustomDateRangeUrlParam,\r\n} from '../utils/chart-date-range-utils'\r\n\r\ninterface VisibleBarNumberProps {\r\n start: Date | null\r\n end: Date\r\n quote: Quote\r\n dateRange: string\r\n}\r\n\r\ninterface ChartZoomAndLeftOffsetProps extends Omit {\r\n chartVisibleWidth: number\r\n numOfBarsToRender?: number\r\n chartModel: Chart\r\n}\r\n\r\ninterface ChartStartEndDatesProps {\r\n dateRange: string\r\n quote: Quote\r\n}\r\n\r\nexport const getVisibleBarsNumber = ({ start, end, quote, dateRange }: VisibleBarNumberProps) => {\r\n const startInSec = start ? start.getTime() / 1000 : 0\r\n const endInSec = end.getTime() / 1000\r\n const isQuoteDateInRange = (quoteDate: number) => quoteDate >= startInSec && quoteDate <= endInSec\r\n const lastQuoteDateIndex = quote.date.length - 1\r\n let lastVisibleBarIndex = lastQuoteDateIndex\r\n let numOfVisibleBars = 0\r\n if (\r\n [DateRangeType.d1, DateRangeType.d5].includes(dateRange as DateRangeType) &&\r\n quote.instrument === Instrument.Stock\r\n ) {\r\n numOfVisibleBars = quote.drawMinutesPerDay\r\n } else {\r\n let firstVisibleBarIndex = -1\r\n lastVisibleBarIndex = -1\r\n quote.date.forEach((quoteDate, index) => {\r\n if (isQuoteDateInRange(quoteDate)) {\r\n if (firstVisibleBarIndex === -1) {\r\n firstVisibleBarIndex = index\r\n }\r\n lastVisibleBarIndex = index\r\n }\r\n })\r\n numOfVisibleBars = lastVisibleBarIndex - firstVisibleBarIndex + 1\r\n\r\n if (firstVisibleBarIndex === -1 && lastVisibleBarIndex === -1) {\r\n return { numOfVisibleBars: 0, numOfBarsOffset: 0 }\r\n }\r\n }\r\n\r\n return { numOfVisibleBars, numOfBarsOffset: lastQuoteDateIndex - lastVisibleBarIndex }\r\n}\r\n\r\nexport const getChartZoomAndLeftOffset = ({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n chartModel,\r\n numOfBarsToRender,\r\n}: ChartZoomAndLeftOffsetProps) => {\r\n const { numOfVisibleBars, numOfBarsOffset } = getVisibleBarsNumber({\r\n start,\r\n end,\r\n quote,\r\n dateRange: chartModel.dateRange,\r\n })\r\n if (numOfVisibleBars === 0) {\r\n return { zoomFactor: chartModel.zoomFactor, leftOffset: chartModel.leftOffset }\r\n }\r\n\r\n const chartLayout = chartModel.chart_layout()\r\n const zoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth,\r\n numOfVisibleBars: numOfBarsToRender ?? numOfVisibleBars,\r\n })\r\n const barWidth = getBarWidthWithMargin({ chartLayout, zoomFactor })\r\n const leftOffset =\r\n getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: {},\r\n barWidth,\r\n numberOfBarsToDraw: numOfBarsToRender,\r\n }) +\r\n numOfBarsOffset * barWidth\r\n return { zoomFactor, leftOffset }\r\n}\r\n\r\nexport const getChartStartEndDates = ({ dateRange, quote }: ChartStartEndDatesProps) => {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const lastDate = dateFromUnixTimestamp(quote.date[quote.date.length - 1])\r\n\r\n if (dateRange.includes(DATE_RANGE_PREFIX_DELMITER)) {\r\n const range = parseCustomDateRangeUrlParam({ dateRange, anchorDate: lastDate })\r\n const end = convertLocalToNyTime(\r\n range.end && range.end.getTime() <= lastDate.getTime() ? range.end : lastDate,\r\n false\r\n )\r\n return {\r\n start: range.start && convertLocalToNyTime(range.start, false),\r\n end,\r\n }\r\n }\r\n\r\n let start\r\n // No condition is needed here, but this would be dateRangePrefix === DateRangePrefixEnum.Enum\r\n switch (dateRange) {\r\n case DateRangeType.d1:\r\n lastDate.setHours(23, 59, 59, 999)\r\n start = daysInQuote.length === 0 ? lastDate : daysInQuote[daysInQuote.length - 1]\r\n break\r\n case DateRangeType.d5:\r\n lastDate.setHours(23, 59, 59, 999)\r\n const startDateIndex = daysInQuote.length === 0 ? -1 : Math.max(daysInQuote.length - 5, 0)\r\n start = startDateIndex === -1 ? lastDate : daysInQuote[startDateIndex]\r\n break\r\n case DateRangeType.m1:\r\n start = dateFns.subMonths(lastDate, 1)\r\n break\r\n case DateRangeType.m3:\r\n start = dateFns.subMonths(lastDate, 3)\r\n break\r\n case DateRangeType.m6:\r\n start = dateFns.subMonths(lastDate, 6)\r\n break\r\n case DateRangeType.ytd:\r\n start = dateFns.startOfYear(lastDate)\r\n break\r\n case DateRangeType.y1:\r\n start = dateFns.subYears(lastDate, 1)\r\n break\r\n case DateRangeType.y2:\r\n start = dateFns.subYears(lastDate, 2)\r\n break\r\n case DateRangeType.y5:\r\n start = dateFns.subYears(lastDate, 5)\r\n break\r\n case DateRangeType.max:\r\n default:\r\n start = null\r\n break\r\n }\r\n\r\n return { start: start && convertLocalToNyTime(start, false), end: convertLocalToNyTime(lastDate, false) }\r\n}\r\n\r\ninterface GetLeftOffsetProps {\r\n quote: Quote\r\n chartModel: Chart\r\n config?: { stretch?: boolean }\r\n barWidth?: number\r\n barIndex?: number\r\n numberOfBarsToDraw?: number\r\n shouldAlignDaysToLeftApplied?: boolean\r\n}\r\n\r\nexport const getMinMaxLeftOffset = ({\r\n newLeftOffset,\r\n chartModel,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex,\r\n}: {\r\n newLeftOffset: number\r\n chartModel: Chart\r\n barWidth?: number\r\n barIndex: number\r\n}) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const numOfBarsInView = Math.floor(width / barWidth)\r\n const fx = (index: number) => index * barWidth\r\n return ~~Utils.min(barWidth / 2, Utils.max(newLeftOffset, width - fx(barIndex + numOfBarsInView)))\r\n}\r\n\r\nexport function getFullChartWidth({\r\n hasAftermarket,\r\n hasPremarket,\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n}) {\r\n const premarketHoursLength = hasPremarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const aftermarketHoursLength = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const marketMinutesLength = (6.5 + premarketHoursLength + aftermarketHoursLength) * 60\r\n // CHART_MARGIN.L as left offset + CHART_MARGIN.XXL as right offset\r\n return CHART_MARGIN.L + CHART_MARGIN.XXL + (marketMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n}\r\n\r\nexport function getIntradayChartConfig({\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n hasPremarket,\r\n hasAftermarket,\r\n maxWidth,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n maxWidth: number\r\n}) {\r\n const fullChartWidth = getFullChartWidth({ hasPremarket, hasAftermarket, barWidthWithMargin, timeframeMinutes })\r\n const offsetChartAfter = 16 // Int from 0-23 , if last quote date is >= this constant `offsetInPx` is applied (chart is moved to the left)\r\n const cropChartMinutesLength = PREMARKET_AFTERMARKET_HOURS * 60\r\n const offsetInPx = (cropChartMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n const chartWidthWithOffset = fullChartWidth - offsetInPx\r\n const shouldCropChart =\r\n hasAftermarket && hasPremarket && maxWidth >= chartWidthWithOffset && maxWidth < fullChartWidth\r\n\r\n return {\r\n fullChartWidth,\r\n offsetInPx: shouldCropChart ? offsetInPx : 0,\r\n chartWidthWithOffset: shouldCropChart ? fullChartWidth - offsetInPx : fullChartWidth,\r\n offsetChartAfter,\r\n }\r\n}\r\n\r\nexport const getLeftOffset = ({\r\n quote,\r\n chartModel,\r\n config,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex = getBarIndex(quote),\r\n numberOfBarsToDraw,\r\n shouldAlignDaysToLeftApplied = true,\r\n}: GetLeftOffsetProps) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const specificChartFunctionality = chartModel.chart_layout().specificChartFunctionality\r\n if (config?.stretch) {\r\n return 0\r\n }\r\n if (getIsSmallIndexChart(specificChartFunctionality)) {\r\n return barWidth\r\n }\r\n const fx = (index: number) => index * barWidth\r\n let leftOffset = width - fx(barIndex) - Math.round(barWidth / 2)\r\n leftOffset = Math.round(Utils.min(barWidth / 2, Utils.max(leftOffset, width - fx(barIndex + 45))))\r\n if (\r\n shouldAlignDaysToLeftApplied &&\r\n shouldAlignDaysToLeft({\r\n quote,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n dateRange: chartModel.dateRange,\r\n })\r\n ) {\r\n let drawDaysInOneChart = 1\r\n if (numberOfBarsToDraw) {\r\n drawDaysInOneChart = Math.ceil(numberOfBarsToDraw / quote.getBarsInDay()!)\r\n } else if (quote.interval === 10 || chartModel.dateRange === DateRangeType.d5) {\r\n drawDaysInOneChart = 5\r\n } else if (quote.interval === 15) {\r\n drawDaysInOneChart = 6\r\n } else if (quote.interval === 30) {\r\n drawDaysInOneChart = 12\r\n } else if (quote.interval === 60) {\r\n drawDaysInOneChart = 22\r\n } else if (quote.interval === 120) {\r\n drawDaysInOneChart = 39\r\n } else if (quote.interval === 240) {\r\n drawDaysInOneChart = 78\r\n } else if (quote.interval > 240) {\r\n drawDaysInOneChart = (quote.interval / 30) * 10\r\n }\r\n const { offsetInPx, offsetChartAfter } = getIntradayChartConfig({\r\n hasPremarket: quote.premarket,\r\n hasAftermarket: quote.aftermarket,\r\n barWidthWithMargin: barWidth,\r\n timeframeMinutes: quote.interval,\r\n maxWidth: chartModel.width,\r\n })\r\n const drawDaysWidth = drawDaysInOneChart * quote.getBarsInDay()! * barWidth - offsetInPx\r\n\r\n // +1 is a buffer as it often happens drawDaysWidth is wider than width by tiny amount (< 1/10000 of px)\r\n if (drawDaysWidth <= width + 1) {\r\n const lastQuoteDate = quote.date.last() ? utils.dateFromUnixTimestamp(quote.date.last()!) : null\r\n // Align start of day to left if we have enough space to show all bars in day\r\n const barsToOffset = (Object.keys(quote.getDayToOffset()).length - drawDaysInOneChart) * quote.getBarsInDay()!\r\n const offsetChartInPx = (lastQuoteDate?.getHours() ?? 0) >= offsetChartAfter ? offsetInPx : 0\r\n // Math.max(1, ~~num) is to mimic imlementation from getHalfBarWidth(),\r\n // we never render bar with width < 1 but at the same time when we have and odd\r\n // width like 5, wa want to floor because of pixel perfect rendering\r\n leftOffset = Math.round(-fx(barsToOffset) + Math.max(1, ~~(barWidth / 2))) - offsetChartInPx\r\n }\r\n }\r\n // getMinMaxLeftOffset move left offset to keep at least one bar in view what isn't desired for offscreen charts\r\n if (specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n return leftOffset\r\n }\r\n return getMinMaxLeftOffset({\r\n newLeftOffset: leftOffset,\r\n chartModel,\r\n barWidth,\r\n barIndex,\r\n })\r\n}\r\n\r\nexport const getBarIndex = (quote: Quote) => quote?.getBarIndex(quote.open?.length ? quote.open.length - 1 : 0) || 0\r\n\r\nexport const getIsSmallIndexChart = (specificChartFunctionality: SpecificChartFunctionality) =>\r\n specificChartFunctionality === SpecificChartFunctionality.smallIndex\r\n\r\ninterface ShouldAlignDaysToLeftProps {\r\n quote: Quote\r\n numberOfBarsToDraw?: number\r\n specificChartFunctionality: SpecificChartFunctionality\r\n dateRange: DateRangeType | null\r\n}\r\n\r\n/**\r\n * Evaluate if days should be aligned to the left\r\n * @param {object} object.quote - Quote model\r\n * @param {string} object.specificChartFunctionality - SpecificChartFunctionality enum\r\n * @returns {boolean} boolean\r\n * */\r\nexport const shouldAlignDaysToLeft = ({\r\n quote,\r\n dateRange,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n}: ShouldAlignDaysToLeftProps) => {\r\n const isStockIntraday = quote.isIntraday && quote.instrument === Instrument.Stock\r\n // We don't want this to affect /charts page, only if intraday daterange is applied\r\n const isQuoteOrOffscreen = [SpecificChartFunctionality.quotePage, SpecificChartFunctionality.offScreen].includes(\r\n specificChartFunctionality\r\n )\r\n const isChartPage = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isChartsInradayDateRange =\r\n isChartPage && !!dateRange && [DateRangeType.d1, DateRangeType.d5].includes(dateRange)\r\n const isChartPageWithFixedBars = isChartPage && numberOfBarsToDraw\r\n return isStockIntraday && (isQuoteOrOffscreen || isChartsInradayDateRange || isChartPageWithFixedBars)\r\n}\r\n\r\ninterface ClipProps {\r\n canvasCtx: RenderingContext2DType\r\n width: number\r\n height: number\r\n Settings: ISettings['ChartSettings'] | ISettings['IndicatorSettings']\r\n}\r\n// pane canvasCtx clip\r\nexport const clip = ({ canvasCtx, width, height, Settings }: ClipProps) => {\r\n const contentWidth = width - Settings.left.width - Settings.right.width\r\n const contentHeight = height - Settings.top.height - Settings.bottom.height\r\n canvasCtx.beginPath()\r\n canvasCtx.rect(Settings.left.width, Settings.top.height, contentWidth, contentHeight)\r\n canvasCtx.clip()\r\n}\r\n\r\nexport const getSettings = (paneModel: Pane): IIndicatorSettings | IChartSettings => {\r\n const { ChartSettings, IndicatorSettings } = paneModel.chart().getChartLayoutSettings()\r\n for (const element of paneModel.elements().all()) {\r\n if (element.isIndicator()) {\r\n return IndicatorSettings\r\n }\r\n }\r\n return ChartSettings\r\n}\r\n\r\ninterface RecountScaleProps {\r\n chartModel: Chart\r\n paneModel: Pane\r\n}\r\n\r\ntype ScaledFn = Partial & (d3.ScaleLinear | d3.ScaleSymLog)\r\n\r\nconst getShouldOffsetChartDomain = (elementModel: Element | ChartEventElement) => {\r\n const quote = elementModel.pane().chart().quote()\r\n\r\n return quote.chartEvents.length > 0 && ![TIMEFRAME.w, TIMEFRAME.m].includes(quote.timeframe)\r\n}\r\n\r\nexport const recountScale = ({ chartModel, paneModel }: RecountScaleProps) => {\r\n const { ChartSettings, IndicatorSettings, MarketSentimentSettings } = chartModel.getChartLayoutSettings()\r\n const chartLayout = chartModel.chart_layout()\r\n const barWidthWithMargin = getBarWidthWithMargin({ chartLayout, zoomFactor: chartModel.zoomFactor })\r\n for (const elementModel of [...paneModel.getAllElements(), ...paneModel.getAllChartEvents(false)]) {\r\n const el = elementModel.instance\r\n const isChart = elementModel.isChart()\r\n if (isChart || elementModel.isIndicator()) {\r\n let fx: ScaledFn, Settings: ISettings['MarketSentimentSettings' | 'ChartSettings' | 'IndicatorSettings'], width\r\n const scaleType = isChart ? chartModel.scale : ScaleType.Linear\r\n if (isChart) {\r\n Settings = chartModel.instrument === Instrument.MarketSentiment ? MarketSentimentSettings : ChartSettings\r\n } else {\r\n Settings = IndicatorSettings as ISettings['IndicatorSettings']\r\n }\r\n const contentHeight = paneModel.height - Settings.top.height - Settings.bottom.height\r\n\r\n if (chartModel.stretch) {\r\n width = chartModel.width - Settings.left.width - Settings.right.width\r\n fx = d3\r\n .scaleLinear()\r\n .range([0, width])\r\n .domain([0, Math.max(0, chartModel.quote().close.length - 1)]) as ScaledFn\r\n } else {\r\n fx = ((index: number) => index * barWidthWithMargin) as ScaledFn\r\n fx.invert = (x: number) => x / barWidthWithMargin\r\n fx.width = function (w) {\r\n return this.invert(w) - this.invert(0)\r\n }\r\n }\r\n paneModel.updateAttribute('scale', { x: fx }) // some elements need fx to count getMinMax\r\n\r\n const { min, max } = paneModel.scaleRange || el.getMinMax!()\r\n let fy\r\n\r\n const handleDomainOffset = (currentScale: ScaledFn, scaleCreator: any) => {\r\n if (isChart && getShouldOffsetChartDomain(elementModel)) {\r\n const protectedHeightPx = contentHeight - CHART_EVENT_BADGE_SIZE\r\n const minPx = currentScale(min)\r\n const domain = currentScale.domain()\r\n if (minPx > protectedHeightPx) {\r\n const tempScale = scaleCreator().range([0, protectedHeightPx]).domain([max, min])\r\n const extendedMin = tempScale.invert(contentHeight)\r\n currentScale.domain([domain[0], extendedMin])\r\n }\r\n }\r\n }\r\n\r\n switch (scaleType) {\r\n case ScaleType.Logarithmic:\r\n fy = d3.scaleSymlog().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n handleDomainOffset(fy, d3.scaleSymlog)\r\n break\r\n default:\r\n fy = d3.scaleLinear().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n if (!paneModel.scaleRange) {\r\n fy = fy.nice(10)\r\n handleDomainOffset(fy, d3.scaleLinear)\r\n }\r\n break\r\n }\r\n fy.height = function (h: number) {\r\n return this.invert(h) - this.invert(0)\r\n }\r\n paneModel.updateAttribute('scale', {\r\n x: fx,\r\n y: fy,\r\n })\r\n\r\n if (isChart) {\r\n el.setupAxis!(fx as ScaleAxis)\r\n }\r\n break\r\n }\r\n }\r\n}\r\n\r\n// general, only when blurry ends won't be visible or didn't matter\r\nexport const getOffsetFromLineWidth = (lineWidth: number) => (lineWidth % 2 === 0 ? 0 : 0.5)\r\n\r\ninterface IXYOffsetFromLine {\r\n lineWidth: number\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n}\r\n\r\n// return x,y offsets for pixel perfect line rendering\r\nexport const getXYOffsetFromLine = ({ lineWidth, x1, y1, x2, y2 }: IXYOffsetFromLine) => {\r\n // don't add offset is lineWidth is even\r\n if (lineWidth % 2 === 0) {\r\n return { x: 0, y: 0 }\r\n }\r\n if (y1 === y2) {\r\n return { x: 0, y: 0.5 } // horizontal line\r\n } else if (x1 === x2) {\r\n return { x: 0.5, y: 0 } // vertical line\r\n } else {\r\n return { x: 0.5, y: 0.5 } // diagonal line\r\n }\r\n}\r\n\r\nexport const getRoundedObject = (obj: T): T => {\r\n const rounded = Object.entries(obj)\r\n for (let i = 0; i < rounded.length; i++) {\r\n rounded[i][1] = Math.round(rounded[i][1])\r\n }\r\n return Object.fromEntries(rounded) as T\r\n}\r\n\r\ninterface ITranslate {\r\n context: CanvasRenderingContext2D\r\n xOffset: number\r\n yOffset: number\r\n}\r\n\r\ninterface ITranslateObj {\r\n do: () => void\r\n undo: () => void\r\n}\r\n\r\nexport const getTranslate = ({ context, xOffset, yOffset }: ITranslate): ITranslateObj => ({\r\n do: () => context.translate(xOffset, yOffset),\r\n undo: () => context.translate(xOffset * -1, yOffset * -1),\r\n})\r\n\r\ninterface IPercentageScaleValue {\r\n number: number\r\n base: number\r\n}\r\n\r\nexport const getPercentageFromValue = ({ number, base }: IPercentageScaleValue) => ((number - base) / base) * 100\r\n\r\nexport const getValueFromPercentage = ({ number, base }: IPercentageScaleValue) => (number / 100) * base + base\r\n\r\ninterface UpdateZoomAndLeftOffsetByDateRangeProps {\r\n chartModel: Chart\r\n quote: Quote\r\n}\r\n\r\nexport function updateZoomAndLeftOffsetByDateRange({ chartModel, quote }: UpdateZoomAndLeftOffsetByDateRangeProps) {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const chartVisibleWidth = chartModel.width - (ChartSettings.left.width + ChartSettings.right.width)\r\n\r\n const { start, end, numOfBarsToRender } = getParsedDateRangeMetaData({\r\n dateRange: chartModel.dateRange,\r\n quote,\r\n })\r\n\r\n const { zoomFactor, leftOffset } = getChartZoomAndLeftOffset({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n numOfBarsToRender,\r\n chartModel: chartModel,\r\n })\r\n\r\n if (chartModel.zoomFactor !== zoomFactor || chartModel.leftOffset !== leftOffset) {\r\n chartModel.updateAttributes({ zoomFactor, leftOffset })\r\n }\r\n}\r\n\r\nexport function renderPane({\r\n chartLayoutModel,\r\n chartModel,\r\n paneModel,\r\n canvasCtx,\r\n shouldRenderCross = false,\r\n}: {\r\n chartLayoutModel: ChartLayout\r\n chartModel: Chart\r\n paneModel: Pane\r\n canvasCtx: CanvasRenderingContext2D\r\n shouldRenderCross?: boolean\r\n}) {\r\n if (paneModel.chart().instrument === Instrument.MarketSentiment) {\r\n canvasCtx.clearRect(0, 0, chartModel.width, paneModel.height)\r\n } else {\r\n canvasCtx.set('fillStyle', chartModel.getChartLayoutSettings().ChartSettings.general.Colors.canvasFill)\r\n canvasCtx.fillRect(0, 0, chartModel.width, paneModel.height)\r\n }\r\n const elements = paneModel.getAllElements()\r\n for (const { instance: elementInstance } of elements) {\r\n if (typeof elementInstance.renderGrid === 'function') {\r\n canvasCtx.save()\r\n elementInstance.renderGrid(canvasCtx)\r\n canvasCtx.restore()\r\n }\r\n }\r\n\r\n const chartEvents = paneModel.getAllChartEvents()\r\n const Settings = getSettings(paneModel)\r\n for (const { instance: elementInstance } of [...elements, ...chartEvents]) {\r\n const isDrawing = elementInstance.getIsDrawing()\r\n const isChartEvent = elementInstance.getIsChartEvent()\r\n\r\n if (isDrawing && (chartLayoutModel.isHideDrawingsActive || !elementInstance.getIsVisible())) {\r\n continue\r\n } else if ((isDrawing || isChartEvent) && !elementInstance.getIsInChartView(chartModel)) {\r\n continue\r\n }\r\n\r\n canvasCtx.save()\r\n if (elementInstance.renderContent != null) {\r\n canvasCtx.save()\r\n clip({\r\n canvasCtx,\r\n width: chartModel.width,\r\n height: paneModel.height,\r\n Settings,\r\n })\r\n canvasCtx.translate(paneModel.chart().leftOffset + Settings.left.width, Settings.top.height)\r\n elementInstance.renderContent(canvasCtx)\r\n canvasCtx.restore()\r\n if (typeof elementInstance.renderLabels === 'function') {\r\n elementInstance.renderLabels(canvasCtx)\r\n }\r\n } else {\r\n elementInstance.render(canvasCtx)\r\n }\r\n if (\r\n shouldRenderCross &&\r\n (chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage ||\r\n isRedesignedPage(chartLayoutModel)) &&\r\n elementInstance.renderCross != null\r\n ) {\r\n elementInstance.renderCross(canvasCtx)\r\n }\r\n canvasCtx.restore()\r\n }\r\n}\r\n","export const DEFAULT_WIDTHS = {\r\n min: 200,\r\n max: 400,\r\n}\r\n\r\nexport enum SidebarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n","import React from 'react'\r\n\r\nimport { DEFAULT_WIDTHS, SidebarDirection } from '../constants'\r\nimport { SidebarModule, SidebarModuleType } from '../modules/modules'\r\n\r\nexport type SidebarContextType = {\r\n isOpen: boolean\r\n isCloseVisible: boolean\r\n direction: SidebarDirection\r\n width?: {\r\n min?: number | string\r\n max?: number | string\r\n default?: { desktop?: number; mobile?: number }\r\n }\r\n activeModule: SidebarModuleType | null\r\n close: () => void\r\n onResize: () => void\r\n selectModule: (module?: SidebarModule) => void\r\n}\r\n\r\nconst DEFAULT_CONTEXT: SidebarContextType = {\r\n activeModule: null,\r\n isOpen: false,\r\n isCloseVisible: false,\r\n direction: SidebarDirection.horizontal,\r\n width: DEFAULT_WIDTHS,\r\n close: () => {},\r\n onResize: () => {},\r\n selectModule: () => {},\r\n}\r\n\r\nexport const SidebarContext = React.createContext(DEFAULT_CONTEXT)\r\nexport const useSidebarContext = () => React.useContext(SidebarContext)\r\n","import { IconNameType } from '@finviz/website'\r\n\r\nimport ChartLayout from '../../models/chart_layout'\r\n\r\nexport enum DrawingTool {\r\n Arrow = 'arrow',\r\n Brush = 'brush',\r\n Callout = 'callout',\r\n Curve = 'curve',\r\n ElliottWaves = 'elliott-wave',\r\n Ellipse = 'ellipse',\r\n FibonacciRetracements = 'fibonacci-retracements',\r\n HorizontalLine = 'horizontal-line',\r\n Measure = 'measure',\r\n Mouse = 'mouse',\r\n Pitchfork = 'pitchfork',\r\n Polygon = 'polygon',\r\n Position = 'position',\r\n Rectangle = 'rectangle',\r\n RotatedRectangle = 'rotated-rectangle',\r\n ScaledLine = 'scaled-line',\r\n ScaledText = 'scaled-text',\r\n Triangle = 'triangle',\r\n VerticalLine = 'vertical-line',\r\n Xabcd = 'xabcd',\r\n}\r\n\r\nexport enum DrawingActions {\r\n AddNote = 'add-note',\r\n DeleteDrawings = 'delete-drawings',\r\n DeleteAutoSavedDrawings = 'delete-autosaved-drawings',\r\n}\r\n\r\nexport enum DrawingSetting {\r\n PreserveDrawings = 'preserve-drawings',\r\n DrawingModeContinuous = 'drawing-mode-continuous',\r\n HideDrawings = 'hide-drawings',\r\n LockDrawings = 'lock-drawings',\r\n}\r\n\r\nexport interface IToolBarProps {\r\n chartLayoutModel: ChartLayout\r\n isSidebar?: boolean\r\n isHorizontal?: boolean\r\n isMobileOverlay?: boolean\r\n /**\r\n * Current selected tool id\r\n */\r\n activeTool: DrawingTool\r\n /**\r\n * On tool item select callback\r\n */\r\n onActiveToolChange: (activeTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => void\r\n /**\r\n * On drawing actions item select callback\r\n */\r\n onDrawingActionClick?: (actionId: DrawingActions) => void\r\n /**\r\n * On drawing settings item select callback\r\n */\r\n onDrawingSettingClick?: (settingId: DrawingSetting) => void\r\n /**\r\n * On drawing end callback\r\n */\r\n onDrawingEnd?: () => void\r\n /**\r\n * Current state of drawing settings\r\n */\r\n drawingSettings: Record\r\n isAlternativeTheme?: boolean\r\n /**\r\n * Are tools disabled\r\n */\r\n areToolsDisabled?: boolean\r\n}\r\n\r\nexport interface IToolbarItemProperties {\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport interface IToolbarDrawingTool extends IToolbarItemProperties {\r\n id: DrawingTool\r\n}\r\n\r\nexport interface IToolbarDrawingAction extends IToolbarItemProperties {\r\n id: DrawingActions\r\n}\r\n\r\nexport interface IToolbarDrawingSetting extends IToolbarItemProperties {\r\n id: DrawingSetting\r\n}\r\n\r\nexport interface IToolbarDrawingToolItem {\r\n defaultItem: IToolbarDrawingTool\r\n toolGroup?: Array\r\n toolGroupTitle?: string\r\n}\r\n\r\nexport interface IToolbarDrawingActionItem {\r\n defaultItem: IToolbarDrawingAction\r\n isDisabled?: boolean\r\n disabledTooltip?: string\r\n}\r\n\r\nexport interface IToolbarDrawingsSettingItem {\r\n defaultItem: IToolbarDrawingSetting\r\n isDisabled?: boolean\r\n isInAction?: boolean\r\n disabledTooltip?: string\r\n}\r\n","import { Instrument } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport QuoteModel from '../models/quote'\r\n\r\nexport function getInstrumentLabel(instrument: Instrument) {\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n return 'Stock'\r\n case Instrument.Futures:\r\n return 'Futures'\r\n case Instrument.Forex:\r\n return 'Forex'\r\n case Instrument.Crypto:\r\n return 'Crypto'\r\n case Instrument.MarketSentiment:\r\n return 'Market Sentiment'\r\n }\r\n}\r\n\r\nexport function getChartAlt(quoteModel: QuoteModel) {\r\n return `${quoteModel.name || quoteModel.ticker} - ${getInstrumentLabel(quoteModel.instrument)} Price Chart`\r\n}\r\n\r\nexport const getResponseChartType = (chartType: ChartElementType) => {\r\n switch (chartType) {\r\n case ChartElementType.HeikinAshi:\r\n return 'heikinashi'\r\n case ChartElementType.HollowCandleStick:\r\n return 'hollowcandlestick'\r\n case ChartElementType.LineChart:\r\n return 'line'\r\n case ChartElementType.OhlcChart:\r\n return 'ohlc'\r\n case ChartElementType.CandleStick:\r\n default:\r\n return 'candlestick'\r\n }\r\n}\r\n\r\nexport const getChartElementTypeFromResponseType = (chartResponseType: string | null) =>\r\n chartResponseType === null\r\n ? null\r\n : Object.values(ChartElementType).find(\r\n (chartType: ChartElementType) => chartResponseType === getResponseChartType(chartType)\r\n )\r\n","import utils from '../utils'\r\n\r\nclass AverageTrueRange {\r\n period: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(high: number, low: number, prevClose: number) {\r\n const tr = utils.max([high - low, Math.abs(high - prevClose), Math.abs(low - prevClose)])\r\n\r\n if (this.count < this.period) {\r\n this.sum += tr\r\n this.value = this.sum / (this.count + 1)\r\n if (this.count === this.period - 1) {\r\n this.sum /= this.period\r\n }\r\n } else {\r\n this.value = (this.value * (this.period - 1) + tr) / this.period\r\n }\r\n this.count++\r\n }\r\n}\r\n\r\nexport default AverageTrueRange\r\n","import { Instrument, Point } from '../../types/shared'\r\n\r\ninterface LinePoints {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport enum BigNumber {\r\n Thousand,\r\n Million,\r\n Billion,\r\n Trillion,\r\n}\r\n\r\nexport const BIG_NUMBER_VALUES = {\r\n [BigNumber.Thousand]: 1e3,\r\n [BigNumber.Million]: 1e6,\r\n [BigNumber.Billion]: 1e9,\r\n [BigNumber.Trillion]: 1e12,\r\n}\r\n\r\nconst BIG_NUMBER_ZEROES = {\r\n [BigNumber.Thousand]: 3,\r\n [BigNumber.Million]: 6,\r\n [BigNumber.Billion]: 9,\r\n [BigNumber.Trillion]: 12,\r\n}\r\n\r\nconst BIG_NUMBER_SUFFIX = {\r\n [BigNumber.Thousand]: 'K',\r\n [BigNumber.Million]: 'M',\r\n [BigNumber.Billion]: 'B',\r\n [BigNumber.Trillion]: 'T',\r\n}\r\n\r\nconst math = {\r\n dotProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.x + p1.y * p2.y\r\n },\r\n\r\n crossProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.y - p1.y * p2.x\r\n },\r\n\r\n distance(p1: Point, p2: Point) {\r\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2))\r\n },\r\n\r\n lineEquation(line: LinePoints) {\r\n // ax + by + c = 0\r\n if (line.x1 === line.x2) {\r\n return {\r\n a: 1,\r\n b: 0,\r\n c: -line.x1,\r\n }\r\n }\r\n const k = (line.y2 - line.y1) / (line.x2 - line.x1)\r\n return {\r\n a: -k,\r\n b: 1,\r\n c: k * line.x1 - line.y1,\r\n k,\r\n }\r\n },\r\n\r\n pointInPolygon(point: Point, polygon: Point[]) {\r\n // http://alienryderflex.com/polygon/\r\n let j = polygon.length - 1\r\n let oddNodes = false\r\n for (let i = 0; i < polygon.length; i++) {\r\n const p = polygon[i]\r\n if (\r\n ((p.y < point.y && polygon[j].y >= point.y) || (polygon[j].y < point.y && p.y >= point.y)) &&\r\n (p.x <= point.x || polygon[j].x <= point.x)\r\n ) {\r\n if (p.x + ((point.y - p.y) / (polygon[j].y - p.y)) * (polygon[j].x - p.x) < point.x) {\r\n oddNodes = !oddNodes\r\n }\r\n }\r\n j = i\r\n }\r\n return oddNodes\r\n },\r\n\r\n distanceToLine(point: Point, line: LinePoints) {\r\n const { a, b, c } = this.lineEquation(line)\r\n const dist = Math.abs(a * point.x + b * point.y + c) / Math.sqrt(a * a + b * b)\r\n return dist\r\n },\r\n\r\n distanceToSegment(point: Point, line: LinePoints) {\r\n const l2 = Math.pow(line.x1 - line.x2, 2) + Math.pow(line.y1 - line.y2, 2)\r\n if (l2 === 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n const t = ((point.x - line.x1) * (line.x2 - line.x1) + (point.y - line.y1) * (line.y2 - line.y1)) / l2\r\n if (t < 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n if (t > 1) {\r\n return Math.sqrt(Math.pow(point.x - line.x2, 2) + Math.pow(point.y - line.y2, 2))\r\n }\r\n const x = line.x1 + t * (line.x2 - line.x1)\r\n const y = line.y1 + t * (line.y2 - line.y1)\r\n return Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2))\r\n },\r\n\r\n getInstrumentDecimalPlaces({ value, instrument }: { value: number; instrument?: Instrument }) {\r\n if (instrument === Instrument.Crypto && value <= 0.001) {\r\n return 8\r\n }\r\n\r\n if ((instrument !== Instrument.Stock && value <= 6) || (instrument === Instrument.Stock && value < 1)) {\r\n return 4\r\n }\r\n\r\n return 2\r\n },\r\n\r\n formatBigNumber(number: number, toFixed?: number, minNumber?: BigNumber) {\r\n const absNum = Math.abs(number)\r\n const getString = ({ num, suffix, zeroes }: { num: number; suffix: string; zeroes: number }) => {\r\n const str = num.toString()\r\n if (str.includes('e')) {\r\n const splitString = str.split('e')\r\n const addZeroes = Number(splitString[1]) - zeroes\r\n return Math.round(Number(splitString[0])).toString().padEnd(Math.max(0, addZeroes), '0') + suffix\r\n }\r\n const sign = Math.sign(num)\r\n const numberByZeroesCount = Math.pow(10, zeroes)\r\n const result = (absNum / numberByZeroesCount) * sign\r\n return (Number.isInteger(result) ? result : result.toFixed(toFixed !== undefined ? toFixed : 1)) + suffix\r\n }\r\n\r\n if (absNum >= BIG_NUMBER_VALUES[BigNumber.Trillion] || minNumber === BigNumber.Trillion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Trillion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Trillion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Billion] || minNumber === BigNumber.Billion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Billion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Billion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Million] || minNumber === BigNumber.Million) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Million],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Million],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Thousand] || minNumber === BigNumber.Thousand) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Thousand],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Thousand],\r\n })\r\n } else {\r\n return toFixed !== undefined ? number.toFixed(toFixed) : number.toString()\r\n }\r\n },\r\n\r\n round({\r\n value,\r\n lastClose = 0,\r\n instrument,\r\n overridePlaces,\r\n }: {\r\n value: number\r\n lastClose?: number\r\n instrument?: Instrument\r\n overridePlaces?: number\r\n }) {\r\n if (Math.abs(value) >= BIG_NUMBER_VALUES[BigNumber.Million]) {\r\n return this.formatBigNumber(value, overridePlaces)\r\n }\r\n\r\n const places =\r\n typeof overridePlaces === 'number'\r\n ? overridePlaces\r\n : this.getInstrumentDecimalPlaces({ value: lastClose, instrument })\r\n\r\n if (value < 0.000001) {\r\n // There was an issue with getting NaN when rounding small numbers with latter method\r\n return value.toFixed(places)\r\n }\r\n return Number(`${Math.round(Number(`${value}e+${places}`))}e-${places}`).toFixed(places)\r\n },\r\n\r\n perpendicularPointToLine({ line, distance }: { line: LinePoints; distance: number }) {\r\n if (distance === 0) {\r\n return { x: line.x2, y: line.y2 }\r\n }\r\n\r\n let yAxisCoeficient\r\n let xAxisCoeficient\r\n\r\n if (line.x1 <= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 <= line.x2 && line.y1 <= line.y2) {\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 >= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = 1\r\n } else {\r\n // conditions falling to else: (line.x1 >= line.x2 && line.y1 <= line.y2)\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = 1\r\n }\r\n\r\n const radAngle = Math.atan2(Math.abs(line.x2 - line.x1), Math.abs(line.y2 - line.y1))\r\n const x = line.x2 + xAxisCoeficient * (distance * Math.cos(radAngle))\r\n const y = line.y2 + yAxisCoeficient * (distance * Math.sin(radAngle))\r\n return { x, y }\r\n },\r\n\r\n rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n }: {\r\n rotationAxisPoint: Point\r\n angle: number\r\n pointToRotate: Point\r\n }) {\r\n // return newCoordinates for pointToRotate after rotation defined by\r\n // angle around rotationAxisPoint\r\n const sin = Math.sin(angle)\r\n const cos = Math.cos(angle)\r\n const rotatedX =\r\n cos * (pointToRotate.x - rotationAxisPoint.x) +\r\n sin * (pointToRotate.y - rotationAxisPoint.y) +\r\n rotationAxisPoint.x\r\n const rotatedY =\r\n cos * (pointToRotate.y - rotationAxisPoint.y) -\r\n sin * (pointToRotate.x - rotationAxisPoint.x) +\r\n rotationAxisPoint.y\r\n return { x: rotatedX, y: rotatedY }\r\n },\r\n sharedPointLinesAngle({\r\n sharedPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n sharedPoint: Point\r\n oldLinePoint: Point\r\n newLinePoint: Point\r\n }) {\r\n // return angle between line from sharedPoint to oldLinePoint and\r\n // line from sharedPoint to newLinePoint\r\n const numerator =\r\n oldLinePoint.y * (sharedPoint.x - newLinePoint.x) +\r\n sharedPoint.y * (newLinePoint.x - oldLinePoint.x) +\r\n newLinePoint.y * (oldLinePoint.x - sharedPoint.x)\r\n const denominator =\r\n (oldLinePoint.x - sharedPoint.x) * (sharedPoint.x - newLinePoint.x) +\r\n (oldLinePoint.y - sharedPoint.y) * (sharedPoint.y - newLinePoint.y)\r\n const ratio = numerator / denominator\r\n\r\n return Math.atan(ratio)\r\n },\r\n\r\n twoSegmentLinesIntersection(p1: Point, p2: Point, p3: Point, p4: Point) {\r\n // line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/\r\n // Determine the intersection point of two line segments\r\n // Return FALSE if the lines don't intersect\r\n\r\n // Check if none of the lines are of length 0\r\n if ((p1.x === p2.x && p1.y === p2.y) || (p3.x === p4.x && p3.y === p4.y)) {\r\n return false\r\n }\r\n\r\n const denominator = (p4.y - p3.y) * (p2.x - p1.x) - (p4.x - p3.x) * (p2.y - p1.y)\r\n\r\n // Lines are parallel\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n const ua = ((p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x)) / denominator\r\n const ub = ((p2.x - p1.x) * (p1.y - p3.y) - (p2.y - p1.y) * (p1.x - p3.x)) / denominator\r\n\r\n // is the intersection along the segments\r\n if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\r\n return false\r\n }\r\n\r\n // Return a object with the x and y coordinates of the intersection\r\n const x = p1.x + ua * (p2.x - p1.x)\r\n const y = p1.y + ua * (p2.y - p1.y)\r\n\r\n return { x, y }\r\n },\r\n\r\n // https://stackoverflow.com/a/60368757\r\n checkLineIntersection(line1_p1: Point, line1_p2: Point, line2_p1: Point, line2_p2: Point) {\r\n // if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite) and booleans for whether line segment 1 or line segment 2 contain the point\r\n let a, b\r\n const result: { x: number; y: number; onLine1: boolean; onLine2: boolean } = {\r\n x: 0,\r\n y: 0,\r\n onLine1: false,\r\n onLine2: false,\r\n }\r\n const denominator =\r\n (line2_p2.y - line2_p1.y) * (line1_p2.x - line1_p1.x) - (line2_p2.x - line2_p1.x) * (line1_p2.y - line1_p1.y)\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n a = line1_p1.y - line2_p1.y\r\n b = line1_p1.x - line2_p1.x\r\n const numerator1 = (line2_p2.x - line2_p1.x) * a - (line2_p2.y - line2_p1.y) * b\r\n const numerator2 = (line1_p2.x - line1_p1.x) * a - (line1_p2.y - line1_p1.y) * b\r\n a = numerator1 / denominator\r\n b = numerator2 / denominator\r\n\r\n // if we cast these lines infinitely in both directions, they intersect here:\r\n result.x = line1_p1.x + a * (line1_p2.x - line1_p1.x)\r\n result.y = line1_p1.y + a * (line1_p2.y - line1_p1.y)\r\n\r\n // if line1 is a segment and line2 is infinite, they intersect if:\r\n if (a > 0 && a < 1) {\r\n result.onLine1 = true\r\n }\r\n // if line2 is a segment and line1 is infinite, they intersect if:\r\n if (b > 0 && b < 1) {\r\n result.onLine2 = true\r\n }\r\n // if line1 and line2 are segments, they intersect if both of the above are true\r\n return result\r\n },\r\n\r\n // ray is considered line1, segment is considered line2\r\n getRayToLineSegmentIntersection(rayOrigin: Point, rayEnd: Point, segmentStart: Point, segmentEnd: Point) {\r\n const lineIntersection = this.checkLineIntersection(rayOrigin, rayEnd, segmentStart, segmentEnd)\r\n\r\n if (\r\n !lineIntersection ||\r\n lineIntersection.onLine1 ||\r\n this.dotProduct(\r\n this.subtractPoints(rayOrigin, lineIntersection as Point),\r\n this.subtractPoints(rayOrigin, rayEnd)\r\n ) <= 0\r\n )\r\n return false\r\n return { ...lineIntersection, x: Math.round(lineIntersection.x), y: Math.round(lineIntersection.y) } // sometimes edge value can have crazy precision instead of `0` something like `5.684341886080802e-14` which is basically 0.00000000000005684341886080802 we should round it\r\n },\r\n\r\n getMiddlePointOnLineSegment(P1: Point, P2: Point) {\r\n const x = (P1.x - P2.x) / 2 + P2.x\r\n const y = (P1.y - P2.y) / 2 + P2.y\r\n return { x, y }\r\n },\r\n\r\n normalizeVector(v: Point) {\r\n const length = Math.sqrt(v.x * v.x + v.y * v.y)\r\n return { x: v.x / length, y: v.y / length }\r\n },\r\n\r\n multiplyVectorByScalar(v: Point, scalar: number) {\r\n return { x: v.x * scalar, y: v.y * scalar }\r\n },\r\n\r\n addPoints(P1: Point, P2: Point) {\r\n return { x: P1.x + P2.x, y: P1.y + P2.y }\r\n },\r\n\r\n subtractPoints(P1: Point, P2: Point): Point {\r\n return { x: P1.x - P2.x, y: P1.y - P2.y }\r\n },\r\n\r\n isSamePoint(P1: Point, P2: Point, margin = { x: 0, y: 0 }) {\r\n return P1.x - margin.x <= P2.x && P2.x <= P1.x + margin.x && P1.y - margin.y <= P2.y && P2.y <= P1.y + margin.y\r\n },\r\n}\r\n\r\nexport default math\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\nexport class ExponentialMovingAverage {\r\n period: number\r\n multiplier: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.multiplier = 2 / (this.period + 1)\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(d: number) {\r\n if (this.count < this.period) {\r\n this.sum += d\r\n this.count++\r\n this.value = this.sum / this.count\r\n } else {\r\n this.value = d * this.multiplier + this.value * (1 - this.multiplier)\r\n }\r\n }\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n ema: number[]\r\n}\r\n\r\nexport class EMACalculation extends MainCalculation {\r\n static type = OverlayType.Ema\r\n\r\n getDefaultCalculatedValues() {\r\n return { ema: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n const ema = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let index = 0; index <= lastIndex; index++) {\r\n ema.add(close[index])\r\n this.calculatedValues.ema[index] = ema.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { IndicatorType, OverlayType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\n\r\ntype OptionValuesType = ObjectHash\r\ntype CalculatedValuesType = ObjectHash\r\ninterface MainProps {\r\n quote?: Quote\r\n options: T\r\n}\r\n\r\nexport type OnValueCalculatedReturnValue = boolean | undefined\r\nexport type OnValueCalculated = ((value: T, dataIndex: number) => OnValueCalculatedReturnValue) | undefined\r\n\r\nexport class MainCalculation<\r\n TOptionValues extends OptionValuesType | undefined = undefined,\r\n TCalculatedValues extends CalculatedValuesType = CalculatedValuesType,\r\n> {\r\n static type: IndicatorType | OverlayType = IndicatorType.Indicator\r\n\r\n quote: NonNullable['quote']>\r\n options: MainProps['options']\r\n\r\n protected _calculatedValues: TCalculatedValues\r\n\r\n constructor({ quote, options }: MainProps) {\r\n this.quote = quote ?? new Quote()\r\n this.options = options\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n }\r\n\r\n get calculatedValues() {\r\n return this._calculatedValues\r\n }\r\n\r\n getDefaultCalculatedValues(): TCalculatedValues {\r\n throw Error('Implement getDefaultCalculatedValues')\r\n }\r\n\r\n calculate(_: OnValueCalculated) {\r\n throw Error('Implement calculate')\r\n }\r\n\r\n getAllCalculatedValues(lastNItems: number) {\r\n const calculatedValues = {} as TCalculatedValues\r\n Object.keys(this.calculatedValues).forEach((key) => {\r\n calculatedValues[key as keyof TCalculatedValues] = this.getCalculatedValues(key, lastNItems)\r\n })\r\n return calculatedValues\r\n }\r\n\r\n getCalculatedValues(key: keyof TCalculatedValues, lastNItems: number) {\r\n return (this.calculatedValues[key] as number[]).slice(-lastNItems) as TCalculatedValues[keyof TCalculatedValues]\r\n }\r\n\r\n /**\r\n * This function is used to construct sql script for db table creation\r\n * and also to build precalculated data object used on node server.\r\n *\r\n * Precalculated data object uses database column names as property keys to simplify data mapping on BE\r\n */\r\n getDbColumnName() {\r\n const { type } = this.constructor as typeof MainCalculation\r\n const typeLabel = type.split('/')[1]\r\n const optionKeys = Object.keys(this.options ?? {}).sort((key1, key2) => key1.localeCompare(key2))\r\n\r\n const optionsStrings = optionKeys.map((key) => `${key.slice(0, 1)}${this.options![key]}`)\r\n return [typeLabel, ...optionsStrings].join('_')\r\n }\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n CustomSpineEvents,\r\n IModalConfig,\r\n IModalConfigInput,\r\n ObjectHash,\r\n PaneArea,\r\n RequireByKey,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport {\r\n FONT_SIZE,\r\n INDICATOR_LABEL_HEIGHT,\r\n IndicatorType,\r\n OFFSET,\r\n PADDING,\r\n SpecificChartFunctionality,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport mouseModel from '../models/mouse'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport { isRedesignEnabled } from '../utils'\r\nimport { roundedRect } from '../utils/canvas-render'\r\nimport { renderCross } from '../utils/chart'\r\nimport {\r\n drawInVisibleArea,\r\n getAreNoBarsVisible,\r\n getCompensatedFirstBarToRenderIndex,\r\n getVisibleBarToRenderIndex,\r\n} from '../utils/draw_in_visible_area'\r\nimport { getIsSSr, getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\r\n\r\nconst MAX_POSITIVE_DEFAULT_VALUE = Number.MAX_VALUE\r\nconst MAX_NEGATIVE_DEFAULT_VALUE = -Number.MAX_VALUE\r\n\r\nconst INDICATOR_DEFAULT_DOMAIN = (indicator: IndicatorType) => {\r\n switch (indicator) {\r\n case IndicatorType.Rvol:\r\n return { min: 0, max: 2 }\r\n case IndicatorType.Atr:\r\n return { min: 0, max: 10 }\r\n case IndicatorType.Adx:\r\n case IndicatorType.Aro:\r\n case IndicatorType.Mfi:\r\n case IndicatorType.Perf:\r\n case IndicatorType.Rmi:\r\n case IndicatorType.Rsi:\r\n case IndicatorType.Stofu:\r\n case IndicatorType.Ult:\r\n return { min: 0, max: 100 }\r\n case IndicatorType.Macd:\r\n case IndicatorType.Rwi:\r\n case IndicatorType.Trix:\r\n return { min: -1, max: 1 }\r\n case IndicatorType.Wr:\r\n return { min: -100, max: 0 }\r\n case IndicatorType.Aroosc:\r\n case IndicatorType.Roc:\r\n return { min: -100, max: 100 }\r\n case IndicatorType.Cci:\r\n case IndicatorType.Fi:\r\n return { min: -200, max: 200 }\r\n default:\r\n return { min: 0, max: 100 }\r\n }\r\n}\r\n\r\nexport interface IIndicatorIsValid {\r\n getIsValid(key: string): boolean | void\r\n}\r\n\r\nclass Indicator extends Spine.Module implements IIndicatorIsValid {\r\n static type = IndicatorType.Indicator\r\n static label = 'Indicator'\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n return this.model.height\r\n },\r\n })\r\n Object.defineProperty(this.prototype, 'contentHeight', {\r\n get() {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n return this.height - IndicatorSettings.top.height - IndicatorSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n static fromObject(values: ObjectHash, model: Pane) {\r\n const indicator = new this(values, model)\r\n indicator.set(values)\r\n return indicator\r\n }\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt\r\n }\r\n\r\n declare data: Quote\r\n declare min: number\r\n declare max: number\r\n declare contentHeight: number\r\n declare height: number\r\n\r\n attrs: Attrs\r\n model: Pane\r\n labelWidth = 0\r\n fetchedAt = -1\r\n leftOffset = 0\r\n width = 0\r\n contentWidth = 0\r\n lastValue: number | null = null\r\n shouldUpdate = true\r\n tickers: string | null = null\r\n period?: string | number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.attrs = attrs\r\n this.model = model\r\n this.data = this.model.chart().quote()\r\n\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.renderCrossText = this.renderCrossText.bind(this)\r\n\r\n this.model.chart().bind('update', this.trigger.bind(this, 'change'))\r\n this.model.bind('update change', this.trigger.bind(this, 'change'))\r\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\r\n this.model.bind('destroy', () => {\r\n mouseModel.unbind('change', mouseModelChangeHandler)\r\n })\r\n mouseModel.bind('change', mouseModelChangeHandler)\r\n\r\n this.model.chart().chart_layout().bind('theme', this.setupCache.bind(this))\r\n }\r\n\r\n get type() {\r\n return (this.constructor as typeof Indicator).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Indicator).label\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n this.data = this.model.chart().quote()\r\n this.leftOffset = this.model.chart().leftOffset\r\n this.width = this.model.chart().width\r\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\r\n\r\n this.compute()\r\n\r\n this.setupCache()\r\n\r\n this.renderYAxis(context)\r\n\r\n context.save()\r\n this.clip(context)\r\n this.renderXAxis(context)\r\n const translate = getTranslate({\r\n context,\r\n xOffset: this.leftOffset + IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n this.renderIndicator(context)\r\n translate.undo()\r\n context.restore()\r\n\r\n if (!this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabel(context)\r\n }\r\n }\r\n\r\n isComputeNecessary() {\r\n // if quote was updated (this.fetchedAt !== this.data.fetchedAt)\r\n // or indicator setting was changed via modal (this.shouldUpdate)\r\n // allow compute and update variables to prevent another unless\r\n // those variables change again\r\n if (this.fetchedAt !== this.data.fetchedAt || this.shouldUpdate) {\r\n this.fetchedAt = this.data.fetchedAt\r\n this.shouldUpdate = false\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let y\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const ticks = this.model.scale.y.ticks(10)\r\n const tickTextStep = Math.abs(ticks[2] - ticks[0])\r\n const yLine = new Line(\r\n {\r\n x1: 0,\r\n x2: this.contentWidth,\r\n strokeStyle: Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.model\r\n )\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n for (let index = 0; index < ticks.length; index++) {\r\n const tick = ticks[index]\r\n y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n if (index % 2 === 0) {\r\n text.set({ text: this.formatAxis(tick, tickTextStep), y }).render(context)\r\n }\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.contentHeight\r\n const valueY = this.lastValue === null ? 0 : Math.round(this.fy(this.lastValue))\r\n if (this.lastValue != null && valueY >= minY && valueY <= maxY) {\r\n new Text(\r\n {\r\n text: math.formatBigNumber(this.lastValue, 2),\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n y: valueY,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n background: Colors.indicatorCurrentBackground,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderXAxis(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const xLine = new Line(\r\n {\r\n x1: 0,\r\n x2: 0,\r\n y1: 0,\r\n y2: this.contentHeight,\r\n strokeStyle: Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.model\r\n )\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n for (let tick = 0, end = this.data.date.length; tick < end; tick += 10) {\r\n const x = Math.round(this.fx(tick) + this.leftOffset)\r\n if (x < -15 || x > this.width + 15) {\r\n // margin?\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderLabel(context: CanvasRenderingContext2D) {\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabelChartsPage(context)\r\n } else {\r\n this.renderLabelQuotePage(context)\r\n }\r\n }\r\n\r\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const label = new Text(\r\n {\r\n text: this.toString(),\r\n x: IndicatorSettings.left.indicatorLabel.margin.left,\r\n y: IndicatorSettings.left.indicatorLabel.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n )\r\n this.labelWidth = label.measure(context)\r\n return label.render(context)\r\n }\r\n\r\n renderLabelChartsPage(context: CanvasRenderingContext2D): { x: number; y: number; labelWidth: number } | void {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const { theme, specificChartFunctionality } = this.model.chart().chart_layout()\r\n const isDarkMode = theme === Theme.dark\r\n const x =\r\n specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n ? OFFSET.S\r\n : IndicatorSettings.left.indicatorLabel.margin.left!\r\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\r\n const label = new Text(\r\n {\r\n text: this.toString(),\r\n x: x * 2,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n this.labelWidth = label.measure(context) + IndicatorSettings.left.indicatorLabel.margin.left! * 2\r\n label.set({ y: y + (INDICATOR_LABEL_HEIGHT - label.attrs.lineHeight / 2) })\r\n roundedRect({\r\n ctx: context,\r\n x,\r\n y,\r\n height: INDICATOR_LABEL_HEIGHT,\r\n width: this.labelWidth,\r\n radius: 6,\r\n color: `${tailwindColors.gray[isDarkMode ? 700 : 50]}cc`,\r\n })\r\n label.render(context)\r\n\r\n return { x, y, labelWidth: this.labelWidth }\r\n }\r\n\r\n renderCross(context: CanvasRenderingContext2D) {\r\n renderCross({\r\n context,\r\n mouseModel,\r\n paneModel: this.model,\r\n quote: this.data,\r\n contentWidth: this.contentWidth,\r\n contentHeight: this.contentHeight,\r\n isIndicator: true,\r\n isPerfIndicator: this.type === IndicatorType.Perf,\r\n onRenderCrossText: !this.getIsChartPageSpecificFunctionality() ? this.renderCrossText : undefined,\r\n })\r\n\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.model))\r\n }\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n this.data = this.model.chart().quote()\r\n const index = Number.isNaN(crossIndex) ? this.data.close.length - 1 : crossIndex\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabelChartsPage(context)\r\n\r\n this.renderCrossTextChartsPage(context, index)\r\n } else {\r\n this.renderCrossTextQuotePage(context, index)\r\n }\r\n }\r\n\r\n renderCrossTextChartsPage(_: CanvasRenderingContext2D, __: number) {}\r\n\r\n renderCrossTextQuotePage(_: CanvasRenderingContext2D, __: number) {}\r\n\r\n renderOversoldOverbought(\r\n context: CanvasRenderingContext2D,\r\n array: number[],\r\n from: number,\r\n oversold: number,\r\n zero: number,\r\n overbought: number,\r\n drawLines?: boolean\r\n ) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n if (this.data.close.length === 0) return\r\n const drawInVisibleAreaProps = {\r\n fromIndexOffset: from,\r\n leftOffset: this.leftOffset,\r\n paneModel: this.model,\r\n quote: this.data,\r\n width: this.width,\r\n }\r\n\r\n const firstBarToRenderIndex = getCompensatedFirstBarToRenderIndex(drawInVisibleAreaProps)\r\n\r\n if (drawLines == null) {\r\n drawLines = true\r\n }\r\n\r\n context.save()\r\n\r\n let clipHeight = Math.round(this.fy(oversold) - this.fy(this.model.scale.y.domain()[1]))\r\n if (clipHeight <= 0 || getIsSSr()) {\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(this.model.scale.y.domain()[1]) + 1, // compensation to addition of 1 in clip function\r\n this.contentWidth,\r\n clipHeight < 0 ? clipHeight - 1 : -1 // clipHeight - 1 is a compensation to addition of 1 in clip function ; fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\r\n )\r\n }\r\n context.clip()\r\n context.set('fillStyle', '#87ceef')\r\n\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRenderIndex), Math.round(this.fy(this.model.scale.y.domain()[0])))\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[0])))\r\n context.fill()\r\n context.restore()\r\n if (drawLines) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(oversold)),\r\n y2: Math.round(this.fy(oversold)),\r\n strokeStyle: '#69c1ea',\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n if (drawLines) {\r\n this.renderZeroLine(context, zero)\r\n }\r\n\r\n context.save()\r\n clipHeight = Math.round(this.fy(overbought))\r\n if (clipHeight >= 0 || getIsSSr()) {\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(this.model.scale.y.domain()[0]),\r\n this.contentWidth,\r\n clipHeight > 0 ? clipHeight : 1 // // fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\r\n )\r\n }\r\n\r\n context.clip()\r\n context.set('fillStyle', '#dc9fe5')\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRenderIndex), Math.round(this.fy(this.model.scale.y.domain()[1])))\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[1]) + 1))\r\n context.fill()\r\n context.restore()\r\n if (drawLines) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(overbought)),\r\n y2: Math.round(this.fy(overbought)),\r\n strokeStyle: '#d386df',\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\r\n context.set('fillStyle', '#dc9fe5')\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(Math.round(x), Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderZeroLine(context: CanvasRenderingContext2D, zero: number) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(zero)),\r\n y2: Math.round(this.fy(zero)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n setupCache() {}\r\n\r\n clip(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n context.beginPath()\r\n context.rect(IndicatorSettings.left.width, IndicatorSettings.top.height, this.contentWidth, this.contentHeight + 1) // +1 shows one more pixel which is needed to be able to see a line at very bottom of an indicaor\r\n return context.clip()\r\n }\r\n\r\n formatAxis(value: number, tickStep?: number) {\r\n if (tickStep !== undefined && 10 > tickStep) {\r\n return value.toFixed(2)\r\n }\r\n return value.toString()\r\n }\r\n\r\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\r\n\r\n fy = (y: number) => this.model.scale.y(y)\r\n\r\n set(values: Partial) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n this.shouldUpdate = true\r\n for (const key in values) {\r\n if (key !== 'type') {\r\n // @ts-expect-error - values keys don't have to always match variables on the instance\r\n this[key] = values[key]\r\n }\r\n }\r\n this.width = this.model.chart().width\r\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\r\n\r\n const newAttrs = this.getModalConfig()\r\n .inputs.map(({ value }) => value.toString())\r\n .join(',')\r\n if (newAttrs) this.attrs = { ...this.attrs, period: newAttrs }\r\n\r\n this.model.trigger(CustomSpineEvents.ManualChange)\r\n }\r\n\r\n parsePeriodInt(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n this.period = Number.parseInt(values.period, 10)\r\n this.model.trigger(CustomSpineEvents.ManualChange)\r\n }\r\n }\r\n\r\n setModel(model: Pane) {\r\n return (this.model = model)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const x = IndicatorSettings.left.indicatorLabel.margin.left!\r\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\r\n let width = OFFSET.M * 2 + this.labelWidth\r\n let height = OFFSET.S * 2 + FONT_SIZE.M\r\n\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n width = this.labelWidth\r\n height = INDICATOR_LABEL_HEIGHT\r\n }\r\n\r\n if (x < area.cursorX && area.cursorX < width + x && y < area.cursorY && area.cursorY < height + y) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n getIsInChartView(_: Chart) {\r\n return true\r\n }\r\n\r\n moveBy() {}\r\n\r\n thumbsAreInArea() {\r\n return false\r\n }\r\n\r\n computeVisibleMinMax(...arrays: number[][]) {\r\n let min = MAX_POSITIVE_DEFAULT_VALUE\r\n let max = MAX_NEGATIVE_DEFAULT_VALUE\r\n\r\n const { leftOffset } = this.model.chart()\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth: this.contentWidth,\r\n })\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n for (const arr of arrays) {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n if (!isNaN(arr[i])) {\r\n min = Math.min(min, arr[i])\r\n max = Math.max(max, arr[i])\r\n }\r\n }\r\n }\r\n\r\n return !areNoBarsVisible && min !== max && min !== MAX_POSITIVE_DEFAULT_VALUE && max !== MAX_NEGATIVE_DEFAULT_VALUE\r\n ? { min, max }\r\n : this.getDomainDefaults(this.type)\r\n }\r\n\r\n getModalConfig(): IModalConfig {\r\n return {\r\n title: '',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getDomainDefaults = (indicatorType: IndicatorType) => INDICATOR_DEFAULT_DOMAIN(indicatorType)\r\n\r\n getMinMax() {\r\n this.data = this.model.chart().quote()\r\n this.compute()\r\n return { min: this.min, max: this.max }\r\n }\r\n\r\n toObject() {\r\n return merge({}, this.attrs, { type: this.type, tickers: this.tickers })\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return {\r\n type: this.type,\r\n period: this.getModalConfig()\r\n .inputs.map((input: IModalConfigInput) => input.value.toString())\r\n .join(','),\r\n }\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart().chart_layout())\r\n }\r\n\r\n renderIndicator(_: CanvasRenderingContext2D) {\r\n throw Error('Implement renderIndicator method')\r\n }\r\n\r\n getIsValid(_: string): boolean | undefined {\r\n throw Error('Implement')\r\n }\r\n\r\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\r\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\r\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\r\n }\r\n\r\n getIsChartPageSpecificFunctionality() {\r\n const { specificChartFunctionality } = this.model.chart().chart_layout()\r\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isRedesignedFuturesForexCrypto =\r\n isRedesignEnabled() &&\r\n [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n SpecificChartFunctionality.quotePage,\r\n ].includes(specificChartFunctionality)\r\n\r\n return isCharts || isRedesignedFuturesForexCrypto\r\n }\r\n\r\n getIsDrawing() {\r\n return false\r\n }\r\n\r\n getIsChartEvent() {\r\n return false\r\n }\r\n\r\n compute() {\r\n throw Error('Implement compute method')\r\n }\r\n}\r\n\r\nIndicator.initClass()\r\n\r\nexport default Indicator\r\n","export function roundedRect({\r\n ctx,\r\n x,\r\n y,\r\n width,\r\n height,\r\n radius,\r\n color,\r\n}: {\r\n ctx: CanvasRenderingContext2D\r\n x: number\r\n y: number\r\n width: number\r\n height: number\r\n radius: number\r\n color: string\r\n}) {\r\n ctx.translate(0.5, 0.5)\r\n ctx.set('strokeStyle', color)\r\n ctx.set('fillStyle', color)\r\n ctx.beginPath()\r\n ctx.moveTo(x, y + radius)\r\n ctx.lineTo(x, y + height - radius)\r\n ctx.arcTo(x, y + height, x + radius, y + height, radius)\r\n ctx.lineTo(x + width - radius, y + height)\r\n ctx.arcTo(x + width, y + height, x + width, y + height - radius, radius)\r\n ctx.lineTo(x + width, y + radius)\r\n ctx.arcTo(x + width, y, x + width - radius, y, radius)\r\n ctx.lineTo(x + radius, y)\r\n ctx.arcTo(x, y, x, y + radius, radius)\r\n ctx.stroke()\r\n ctx.fill()\r\n ctx.translate(-0.5, -0.5)\r\n}\r\n","import { IndicatorType } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ADX extends Indicator {\r\n static type = IndicatorType.Adx\r\n static label = 'ADX'\r\n\r\n declare period: number\r\n pdi: number[] = []\r\n mdi: number[] = []\r\n adx: number[] = []\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n let adx, amdm, apdm, mdi, pdi\r\n this.pdi = []\r\n this.mdi = []\r\n this.adx = []\r\n let atr = (apdm = amdm = adx = 0)\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n const deltaHigh = this.data.high[i] - this.data.high[i - 1]\r\n const deltaLow = this.data.low[i - 1] - this.data.low[i]\r\n\r\n let pdm = 0\r\n if (deltaHigh > 0 && deltaHigh > deltaLow) {\r\n pdm = deltaHigh\r\n }\r\n\r\n let mdm = 0\r\n if (deltaLow > 0 && deltaLow > deltaHigh) {\r\n mdm = deltaLow\r\n }\r\n\r\n const tr = utils.max([\r\n this.data.high[i] - this.data.low[i],\r\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\r\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\r\n ])\r\n\r\n atr = (atr * (this.period - 1) + tr) / this.period\r\n apdm = (apdm * (this.period - 1) + pdm) / this.period\r\n amdm = (amdm * (this.period - 1) + mdm) / this.period\r\n\r\n pdi = atr > 0 ? (apdm * 100) / atr : 0\r\n mdi = atr > 0 ? (amdm * 100) / atr : 0\r\n const di = Math.abs(pdi - mdi)\r\n const dx = pdi + mdi > 0 ? (di * 100) / (pdi + mdi) : 0\r\n adx = (adx * (this.period - 1) + dx) / this.period\r\n\r\n this.pdi[i] = pdi\r\n this.mdi[i] = mdi\r\n this.adx[i] = adx\r\n }\r\n this.lastValue = this.adx.last() ?? null\r\n }\r\n const { min, max } =\r\n this.pdi.length > 0 || this.mdi.length > 0 || this.adx.length > 0\r\n ? this.computeVisibleMinMax(this.pdi, this.mdi, this.adx)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', '#2eb12e')\r\n context.beginPath()\r\n\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.pdi[i])))\r\n },\r\n })\r\n\r\n context.stroke()\r\n\r\n context.set('strokeStyle', '#d43737')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.mdi[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.beginPath()\r\n\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.adx[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ADX ${this.period}`\r\n }\r\n}\r\n\r\nexport default ADX\r\n","import { IndicatorType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n aroonUp: number[]\r\n aroonDown: number[]\r\n oscillator: number[]\r\n}\r\n\r\nexport class AroonCalculation extends MainCalculation {\r\n static type = IndicatorType.Aro\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n aroonUp: [],\r\n aroonDown: [],\r\n oscillator: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { low, high } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = period; i < high.length; i++) {\r\n const highPeriod = high.slice(i - period, i + 1)\r\n const highestInPeriod = Math.max(...highPeriod)\r\n const periodSinceHigh = period - highPeriod.lastIndexOf(highestInPeriod)\r\n this._calculatedValues.aroonUp[i] = 100 * ((period - periodSinceHigh) / period)\r\n\r\n const lowPeriod = low.slice(i - period, i + 1)\r\n const lowestInPeriod = Math.min(...lowPeriod)\r\n const periodSinceLow = period - lowPeriod.lastIndexOf(lowestInPeriod)\r\n this._calculatedValues.aroonDown[i] = 100 * ((period - periodSinceLow) / period)\r\n\r\n this._calculatedValues.oscillator[i] = this._calculatedValues.aroonUp[i] - this._calculatedValues.aroonDown[i]\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import Text from '../canvas/text'\r\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { AroonCalculation } from '../indicator-calculation/aroon'\r\nimport Pane from '../models/pane'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nconst COLORS = {\r\n aroonUp: '#00a000',\r\n aroonDown: '#c80000',\r\n}\r\n\r\nclass Aroon extends Indicator {\r\n static type = IndicatorType.Aro\r\n static label = 'Aroon'\r\n\r\n aroonCalculation: AroonCalculation | null = null\r\n declare period: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n }\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.aroonCalculation !== null) return\r\n\r\n this.aroonCalculation = new AroonCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.aroonCalculation.calculate()\r\n\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0 || !this.aroonCalculation) return\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', COLORS.aroonUp)\r\n context.beginPath()\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(aroonUp[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', COLORS.aroonDown)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(aroonDown[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n super.renderYAxis(context)\r\n if (!this.aroonCalculation) return\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n },\r\n this.model\r\n )\r\n const textLabels = []\r\n if (aroonDown.length > 0) {\r\n textLabels.push({\r\n text: aroonDown.last()!.toFixed(2),\r\n y: Math.round(this.fy(aroonDown.last()!)),\r\n background: COLORS.aroonDown,\r\n })\r\n }\r\n if (aroonUp.length > 0) {\r\n textLabels.push({\r\n text: aroonUp.last()!.toFixed(2),\r\n y: Math.round(this.fy(aroonUp.last()!)),\r\n background: COLORS.aroonUp,\r\n })\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 25,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Aroon ${this.period}`\r\n }\r\n}\r\n\r\nexport default Aroon\r\n","import { IndicatorType } from '../constants/common'\r\nimport { AroonCalculation } from '../indicator-calculation/aroon'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass AroonOscillator extends Indicator {\r\n static type = IndicatorType.Aroosc\r\n static label = 'Aroon Oscillator'\r\n\r\n aroonCalculation: AroonCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.aroonCalculation !== null) return\r\n\r\n this.aroonCalculation = new AroonCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.aroonCalculation.calculate()\r\n\r\n this.lastValue = this.aroonCalculation.calculatedValues.oscillator.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(\r\n context,\r\n this.aroonCalculation?.calculatedValues.oscillator ?? [],\r\n this.period,\r\n 0,\r\n 0,\r\n 0,\r\n false\r\n )\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 25,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Aroon Oscillator ${this.period}`\r\n }\r\n}\r\n\r\nexport default AroonOscillator\r\n","import { IndicatorType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ATR extends Indicator {\r\n static type = IndicatorType.Atr\r\n static label = 'Average True Range'\r\n\r\n atr: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.atr = []\r\n const atr = new AverageTrueRange(this.period)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\r\n this.atr[i] = atr.value\r\n }\r\n\r\n this.lastValue = this.atr.last() ?? null\r\n }\r\n const { min, max } = this.atr.length > 0 ? this.computeVisibleMinMax(this.atr) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.atr[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ATR ${this.period}`\r\n }\r\n}\r\n\r\nexport default ATR\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nconst constant = 0.015\r\nclass CommodityChannelIndex extends Indicator {\r\n static type = IndicatorType.Cci\r\n static label = 'Commodity Channel Index'\r\n\r\n cci: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n let smaCount\r\n const tp = []\r\n this.cci = []\r\n let smaSum = (smaCount = 0)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let devCount\r\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\r\n tp[i] = typicalPrice\r\n\r\n smaSum += typicalPrice\r\n smaCount++\r\n if (smaCount > this.period) {\r\n smaSum -= tp[i - this.period]\r\n smaCount--\r\n }\r\n const sma = smaSum / smaCount\r\n\r\n if (i < this.period - 1) {\r\n continue\r\n }\r\n\r\n let devSum = (devCount = 0)\r\n for (let j = i - this.period + 1; j <= i; j++) {\r\n devSum += Math.abs(tp[j] - sma)\r\n devCount++\r\n }\r\n\r\n const dev = devSum / devCount\r\n this.cci[i] = 0\r\n if (dev > 0) {\r\n this.cci[i] = (typicalPrice - sma) / (constant * dev)\r\n }\r\n }\r\n\r\n this.lastValue = this.cci.last() ?? null\r\n }\r\n\r\n const { min, max } = this.cci.length > 0 ? this.computeVisibleMinMax(this.cci) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.cci, this.period, -100, 0, 100)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 20,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `CCI ${this.period}`\r\n }\r\n}\r\n\r\nexport default CommodityChannelIndex\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash, Theme } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport { INDICATOR_LABEL_HEIGHT, IndicatorType, TextAlign, TextBaseline } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\nexport interface ICOT {\r\n code: string\r\n name: string\r\n units: string\r\n commercialHedgers: number[]\r\n largeTraders: number[]\r\n smallTraders: number[]\r\n}\r\n\r\ninterface Attrs {\r\n period: string\r\n code: string\r\n}\r\n\r\ntype ColorsKeys = keyof Pick\r\n\r\nclass COT extends Indicator {\r\n static type = IndicatorType.Cot\r\n static label = 'COT'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n declare colors: ObjectHash\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() || !this.data.COTs) return\r\n const cotQuoteCode = Object.keys(this.data.COTs)[0]\r\n if (!this.attrs.code && cotQuoteCode) {\r\n this.attrs.code = cotQuoteCode\r\n }\r\n const cot = this.data.COTs[this.attrs.code]\r\n const [min, max] = utils.minMax(cot.commercialHedgers, cot.largeTraders, cot.smallTraders)\r\n this.max = Math.max(Math.abs(max), Math.abs(min))\r\n this.min = -this.max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (!this.data.COTs) return\r\n context.translate(0.5, 0.5)\r\n for (const key in this.colors) {\r\n context.set('strokeStyle', this.colors[key as ColorsKeys])\r\n context.beginPath()\r\n const data = this.data.COTs[this.attrs.code][key as ColorsKeys]\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(data[i])))\r\n },\r\n })\r\n context.stroke()\r\n }\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderLabel(context: CanvasRenderingContext2D) {\r\n if (!this.data.COTs) return\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const name = new Text(\r\n {\r\n text: this.toString(),\r\n x: 8,\r\n y: 16,\r\n font: { size: 10, style: 'bold' },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n )\r\n name.render(context)\r\n\r\n new Text(\r\n {\r\n text: this.data.COTs[this.attrs.code].units as string,\r\n x: 38 + name.measure(),\r\n y: 16,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n this.renderAdditionalLabels(context)\r\n }\r\n\r\n renderLabelChartsPage(context: CanvasRenderingContext2D) {\r\n const { x, y, labelWidth } = super.renderLabelChartsPage(context) as { x: number; y: number; labelWidth: number }\r\n\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const isDarkMode = this.model.chart().chart_layout().theme === Theme.dark\r\n const secondarylabelX = labelWidth + x * 2\r\n const fontSettings = IndicatorSettings.left.indicatorLabel.font\r\n const scaleCoefficient = 0.7\r\n\r\n const secondarylabel = new Text(\r\n {\r\n text: this.data.COTs[this.attrs.code].units as string,\r\n x: secondarylabelX + x,\r\n font: Text.getMergedPropsWithDefaults('font', {\r\n ...fontSettings,\r\n size: fontSettings.size ? fontSettings.size * scaleCoefficient : undefined,\r\n style: 'normal',\r\n }),\r\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n secondarylabel.set({\r\n y: y + (INDICATOR_LABEL_HEIGHT * scaleCoefficient - (secondarylabel.attrs.lineHeight * scaleCoefficient) / 2),\r\n })\r\n secondarylabel.render(context)\r\n\r\n this.renderAdditionalLabels(context)\r\n }\r\n\r\n renderAdditionalLabels(context: CanvasRenderingContext2D) {\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n new Text(\r\n {\r\n text: 'COT',\r\n x: 23,\r\n y: IndicatorSettings.top.height + (IndicatorSettings.bottom.height + this.contentHeight) / 2,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n const text = new Text(\r\n {\r\n text: 'Commercial Hedgers',\r\n x: IndicatorSettings.left.width,\r\n y: IndicatorSettings.top.height + this.contentHeight + IndicatorSettings.bottom.height - 1, // allign to very bottom of indicator with 1 pixel bottom padding\r\n font: { size: 8, style: 'bold' },\r\n fillStyle: this.colors.commercialHedgers,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n )\r\n text.render(context)\r\n\r\n let x = text.get('x')! + 8 + text.measure()\r\n text.set({ text: 'Large Traders', x, fillStyle: this.colors.largeTraders })\r\n text.render(context)\r\n\r\n x += 8 + text.measure()\r\n text.set({ text: 'Small Traders', x, fillStyle: this.colors.smallTraders })\r\n text.render(context)\r\n }\r\n\r\n formatAxis(value: number) {\r\n // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\r\n const scaleY = this.model.scale.y as unknown as d3.ScaleLinear\r\n return scaleY.tickFormat(4, 's')(value).replace(/G/, 'B')\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: 'COT',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toString() {\r\n return this.data?.COTs ? (this.data.COTs[this.attrs.code].name as string) : undefined\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return {\r\n type: this.type,\r\n code: this.attrs.code,\r\n }\r\n }\r\n}\r\n\r\nCOT.prototype.colors = {\r\n commercialHedgers: '#10cc10',\r\n largeTraders: '#cc1010',\r\n smallTraders: '#1010cc',\r\n}\r\n\r\nexport default COT\r\n","import { IndicatorType } from '../constants/common'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n fi: number[]\r\n}\r\n\r\nexport class FICalculation extends MainCalculation {\r\n static type = IndicatorType.Fi\r\n\r\n getDefaultCalculatedValues() {\r\n return { fi: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close, volume } = this.quote\r\n const ema = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let index = 1; index < close.length; index++) {\r\n const value = ((close[index] - close[index - 1]) * volume[index]) / 1000000\r\n ema.add(value)\r\n this.calculatedValues.fi[index] = ema.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { IndicatorType } from '../constants/common'\r\nimport { FICalculation } from '../indicator-calculation/fi'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ForceIndex extends Indicator {\r\n static type = IndicatorType.Fi\r\n static label = 'Force Index'\r\n\r\n fiCalculation: FICalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.fiCalculation = new FICalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.period,\r\n },\r\n })\r\n this.fiCalculation.calculate()\r\n this.lastValue = this.fiCalculation.calculatedValues.fi.last() ?? null\r\n }\r\n const fi = this.fiCalculation?.calculatedValues.fi ?? []\r\n const { min, max } = fi.length > 0 ? this.computeVisibleMinMax(fi) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.fiCalculation?.calculatedValues.fi ?? [], 1, 0, 0, 0, false)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 13,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `FORCE ${this.period}`\r\n }\r\n}\r\n\r\nexport default ForceIndex\r\n","import { IndicatorType } from '../constants/common'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n fastPeriod: number\r\n slowPeriod: number\r\n signalPeriod: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n macd: number[]\r\n signal: number[]\r\n histogram: number[]\r\n}\r\n\r\nexport class MACDCalculation extends MainCalculation {\r\n static type = IndicatorType.Macd\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n macd: [],\r\n signal: [],\r\n histogram: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { close } = this.quote\r\n const { fastPeriod, slowPeriod, signalPeriod } = this.options\r\n const emaFast = new ExponentialMovingAverage(fastPeriod)\r\n const emaSlow = new ExponentialMovingAverage(slowPeriod)\r\n const emaSignal = new ExponentialMovingAverage(signalPeriod)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = 0; i < close.length; i++) {\r\n const d = close[i]\r\n\r\n emaFast.add(d)\r\n emaSlow.add(d)\r\n const macd = emaFast.value - emaSlow.value\r\n emaSignal.add(macd)\r\n\r\n this.calculatedValues.macd[i] = macd\r\n this.calculatedValues.signal[i] = emaSignal.value\r\n this.calculatedValues.histogram[i] = macd - emaSignal.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { MACDCalculation } from '../indicator-calculation/macd'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n fastPeriod: number\r\n slowPeriod: number\r\n signalPeriod: number\r\n}\r\n\r\nclass MACD extends Indicator {\r\n static type = IndicatorType.Macd\r\n static label = 'MACD'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(period)\r\n return Math.max(fastPeriod, slowPeriod, signalPeriod)\r\n }\r\n\r\n macdCalculation: MACDCalculation | null = null\r\n\r\n declare fastPeriod: number\r\n declare slowPeriod: number\r\n declare signalPeriod: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(this.attrs.period)\r\n super.set({ ...values, fastPeriod, slowPeriod, signalPeriod })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary() || this.macdCalculation === null) {\r\n this.macdCalculation = new MACDCalculation({\r\n quote: this.data,\r\n options: {\r\n signalPeriod: this.signalPeriod,\r\n fastPeriod: this.fastPeriod,\r\n slowPeriod: this.slowPeriod,\r\n },\r\n })\r\n this.macdCalculation.calculate()\r\n\r\n this.lastValue = this.macdCalculation.calculatedValues.macd.last() ?? null\r\n }\r\n\r\n const { macd, histogram, signal } = this.macdCalculation.calculatedValues\r\n\r\n const { min, max } =\r\n macd.length > 0 || signal.length > 0 || histogram.length > 0\r\n ? this.computeVisibleMinMax(macd, signal, histogram)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n if (this.macdCalculation === null || this.data.close.length === 0) return\r\n const y = Math.round(this.fy(0))\r\n const w = ChartSettings.center.barWidth + ChartSettings.center.border * 2\r\n const { macd, histogram, signal } = this.macdCalculation.calculatedValues\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n }\r\n\r\n context.set('fillStyle', '#79c3e8')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.rect(x - ~~(ChartSettings.center.barWidth / 2), y, w, Math.round(this.fy(histogram[i]) - y))\r\n },\r\n })\r\n context.fill()\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\r\n context.beginPath()\r\n\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(macd[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.signalLine)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(signal[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const fastPeriod = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'fastPeriod',\r\n value: this.fastPeriod ?? 12,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const slowPeriod = {\r\n type: 'number',\r\n label: 'Slow',\r\n name: 'slowPeriod',\r\n value: this.slowPeriod ?? 26,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const signalPeriod = {\r\n type: 'number',\r\n label: 'Signal',\r\n name: 'signalPeriod',\r\n value: this.signalPeriod ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [fastPeriod, slowPeriod, signalPeriod],\r\n inputsErrorMessages: {\r\n fastPeriod: `${fastPeriod.label} must be a whole number between ${fastPeriod.min} and ${fastPeriod.max}`,\r\n slowPeriod: `${slowPeriod.label} must be a whole number between ${slowPeriod.min} and ${slowPeriod.max}`,\r\n signalPeriod: `${signalPeriod.label} must be a whole number between ${signalPeriod.min} and ${signalPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'fastPeriod':\r\n case 'slowPeriod':\r\n case 'signalPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `MACD ${this.fastPeriod},${this.slowPeriod},${this.signalPeriod}`\r\n }\r\n}\r\n\r\nexport default MACD\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass MFI extends Indicator {\r\n static type = IndicatorType.Mfi\r\n static label = 'Money Flow Index'\r\n\r\n mfi: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n let negativeMoneyFlow\r\n const mf = []\r\n this.mfi = []\r\n let prevTypicalPrice = (this.data.close[0] + this.data.low[0] + this.data.high[0]) / 3\r\n let positiveMoneyFlow = (negativeMoneyFlow = 0)\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\r\n const moneyFlow = typicalPrice * this.data.volume[i]\r\n\r\n if (typicalPrice > prevTypicalPrice) {\r\n positiveMoneyFlow += moneyFlow\r\n mf[i] = moneyFlow\r\n } else if (typicalPrice < prevTypicalPrice) {\r\n negativeMoneyFlow += moneyFlow\r\n mf[i] = -moneyFlow\r\n }\r\n\r\n if (i > this.period) {\r\n const oldMF = mf[i - this.period]\r\n if (oldMF > 0) {\r\n positiveMoneyFlow -= oldMF\r\n } else if (oldMF < 0) {\r\n negativeMoneyFlow += oldMF\r\n }\r\n\r\n if (positiveMoneyFlow + negativeMoneyFlow > 0) {\r\n this.mfi[i] = (positiveMoneyFlow * 100) / (positiveMoneyFlow + negativeMoneyFlow)\r\n } else {\r\n this.mfi[i] = 50\r\n }\r\n }\r\n\r\n prevTypicalPrice = typicalPrice\r\n }\r\n\r\n this.lastValue = this.mfi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.mfi, this.period, 20, 50, 80)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `MFI ${this.period}`\r\n }\r\n}\r\n\r\nexport default MFI\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\nclass None extends Indicator {\r\n static type = IndicatorType.None\r\n static label = 'None'\r\n\r\n compute() {}\r\n\r\n renderIndicator() {}\r\n\r\n toString() {\r\n return ''\r\n }\r\n}\r\n\r\nexport default None\r\n","import { IndicatorType } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\nclass OBV extends Indicator {\r\n static type = IndicatorType.Obv\r\n static label = 'On-Balance Volume'\r\n\r\n obv: number[] = []\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.obv = [0]\r\n\r\n for (let i = 1; i < this.data.volume.length; i++) {\r\n let currentObv = this.obv[i - 1]\r\n if (this.data.close[i] > this.data.close[i - 1]) {\r\n currentObv += this.data.volume[i]\r\n } else if (this.data.close[i] < this.data.close[i - 1]) {\r\n currentObv -= this.data.volume[i]\r\n }\r\n\r\n this.obv[i] = currentObv\r\n }\r\n\r\n this.lastValue = this.obv.last() ?? null\r\n }\r\n const { min, max } = this.obv.length > 0 ? this.computeVisibleMinMax(this.obv) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.obv[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n formatAxis(value: number) {\r\n return math.formatBigNumber(value, 2)\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: this.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toString() {\r\n return 'OBV'\r\n }\r\n}\r\n\r\nexport default OBV\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport {\r\n INDICATOR_LABEL_HEIGHT,\r\n IndicatorType,\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n OFFSET,\r\n PADDING,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getSanitizedTicker } from '../utils'\r\nimport { getInstrument } from '../utils/chart'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n tickers?: string\r\n}\r\n\r\nconst DEFAULT_TICKERS = 'SPY,QQQ'\r\n\r\nclass PricePerformance extends Indicator {\r\n static type = IndicatorType.Perf\r\n static label = 'Price Performance %'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n timeframe: string\r\n tickers = ''\r\n ready = false\r\n firstFetchCalled = false\r\n first: ObjectHash = {}\r\n perf: ObjectHash = {}\r\n quotes: ObjectHash = {}\r\n indicatorLabelWidth: ObjectHash = {}\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n\r\n this.timeframe = this.model.chart().timeframe\r\n this.fy = d3.scaleLinear().range([0, this.contentHeight])\r\n if (this.attrs.period && !this.tickers) {\r\n this.tickers = this.attrs.period\r\n }\r\n }\r\n\r\n async compute() {\r\n const tickers = this.getTickers()\r\n const chartLayoutModel = this.model.chart().chart_layout()\r\n const chartUuid = chartLayoutModel.uuid\r\n const hasCachedData = this.getTickersAndTimeframe().every(\r\n ({ ticker, instrument, timeframe }) =>\r\n Quote.select(\r\n (q: Quote) =>\r\n q.ticker === ticker &&\r\n q.instrument === instrument &&\r\n q.timeframe === timeframe &&\r\n chartLayoutModel.isIdeaId(q.ideaID) &&\r\n chartUuid === q.chartUuid &&\r\n !q.isFetching\r\n ).length > 0\r\n )\r\n\r\n if (this.timeframe !== this.model.chart().quote().timeframe || (!this.ready && !this.firstFetchCalled)) {\r\n this.timeframe = this.model.chart().quote().timeframe\r\n this.firstFetchCalled = true\r\n\r\n if (!hasCachedData) {\r\n const data = await Quote.getAll(this.getTickersAndTimeframe())\r\n if (data) {\r\n this._compute(tickers, data)\r\n this.trigger('change')\r\n }\r\n } else {\r\n this.ready = true\r\n this.compute()\r\n }\r\n } else if (this.ready) {\r\n const data: ObjectHash = {}\r\n for (const ticker of tickers) {\r\n data[ticker] = Quote.select(\r\n (q: Quote) =>\r\n q.ticker === ticker &&\r\n q.timeframe === this.timeframe &&\r\n chartUuid === q.chartUuid &&\r\n chartLayoutModel.isIdeaId(q.ideaID)\r\n )[0]\r\n }\r\n this._compute(tickers, data)\r\n }\r\n }\r\n\r\n _compute(tickers: string[], data: ObjectHash) {\r\n const { leftOffset } = this.model.chart()\r\n let firstBarTime = null\r\n let lastBarTime = null\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.contentWidth) {\r\n // margin?\r\n continue\r\n }\r\n\r\n // Rendering one extra bar out of viewport ensures continuity of line, if there are missing data on intraday the indicator may have gaps\r\n if (firstBarTime === null) {\r\n firstBarTime = this.data.date[i]\r\n }\r\n\r\n lastBarTime = this.data.date[i]\r\n }\r\n\r\n data[this.data.ticker] = this.data\r\n this.quotes = data\r\n this.perf = {}\r\n const dateToIndex = this.data.getDateToIndex()\r\n for (const ticker of [this.data.ticker, ...tickers]) {\r\n this.perf[ticker] = []\r\n const d = data[ticker]\r\n if (!d) {\r\n continue\r\n }\r\n let first = null\r\n let index = -1\r\n for (let i = 0; i < d.close.length; i++) {\r\n const date = d.date[i]\r\n if (date < firstBarTime! || date > lastBarTime!) {\r\n continue\r\n }\r\n\r\n index = dateToIndex[date]\r\n if (index === undefined || index === null) {\r\n continue\r\n }\r\n\r\n if (first === null) {\r\n first = d.close[i]\r\n this.first[ticker] = first\r\n if (index > 0) {\r\n this.perf[ticker][index - 1] = (d.close[i] * 100) / first - 100\r\n }\r\n }\r\n\r\n this.perf[ticker][index] = (d.close[i] * 100) / first - 100\r\n }\r\n\r\n if (index < this.data.date.length - 1 && first !== null) {\r\n this.perf[ticker][index + 1] = this.perf[ticker][index]\r\n }\r\n }\r\n\r\n const perfArrays = Object.keys(this.perf).map((x) => this.perf[x])\r\n const { min, max } = perfArrays.some((array) => array.length > 0)\r\n ? this.computeVisibleMinMax(...perfArrays)\r\n : this.getDomainDefaults(this.type)\r\n\r\n this.min = min\r\n this.max = max\r\n\r\n const fy = d3\r\n .scaleLinear()\r\n .range([0, this.contentHeight])\r\n .domain([this.model.scaleRange?.max ?? this.max, this.model.scaleRange?.min ?? this.min])\r\n if (!this.model.scaleRange) {\r\n fy.nice(10)\r\n }\r\n // @ts-expect-error - TODO scale.y types dont match\r\n this.model.scale.y = this.fy = fy\r\n this.ready = true\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (!this.ready) {\r\n return\r\n }\r\n const { ColorsSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n context.translate(0.5, 0.5)\r\n const iterable = this.getTickers()\r\n for (let index = 0; index < iterable.length; index++) {\r\n const ticker = iterable[index]\r\n if (this.perf[ticker].length > 0) {\r\n context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n context.beginPath()\r\n for (let i = 0; i < this.perf[ticker].length; i++) {\r\n const y = Math.round(this.fy(this.perf[ticker][i]))\r\n context.lineTo(this.fx(i), y)\r\n }\r\n context.stroke()\r\n }\r\n }\r\n\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\r\n context.beginPath()\r\n for (let i = 0; i < this.perf[this.data.ticker].length; i++) {\r\n const y = Math.round(this.fy(this.perf[this.data.ticker][i]))\r\n if (!isNaN(y)) {\r\n context.lineTo(this.fx(i), y)\r\n }\r\n }\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderCrossTextQuotePage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n if (!context || !crossIndex) {\r\n return\r\n }\r\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const tickers = [this.data.ticker, ...this.getTickers()]\r\n tickers.forEach((key, index) => {\r\n const crossIndexTickerTimeStamp = this.quotes?.[this.data.ticker]?.getDataByBarIndex('date', crossIndex)\r\n const tickerDateToIndex = crossIndexTickerTimeStamp\r\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\r\n : null\r\n const tickerPerformance = tickerDateToIndex\r\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\r\n : null\r\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n IndicatorSettings.left.indicatorLabel.margin.left! - PADDING.XXXS,\r\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\r\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\r\n (index + 1) +\r\n IndicatorSettings.left.indicatorLabel.margin.top! -\r\n PADDING.XXXS,\r\n PADDING.XXXS + this.indicatorLabelWidth[key] + PADDING.XXXS,\r\n PADDING.XXXS + IndicatorSettings.left.indicatorLabel.font.size! + PADDING.XXXS\r\n )\r\n new Text(\r\n {\r\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\r\n x: IndicatorSettings.left.indicatorLabel.margin.left,\r\n y:\r\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\r\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\r\n (index + 1) +\r\n IndicatorSettings.left.indicatorLabel.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle:\r\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n })\r\n }\r\n\r\n renderCrossTextChartsPage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n if (!context || !crossIndex) {\r\n return\r\n }\r\n\r\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let isVertical = true\r\n const labelBottom = IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\r\n const tickers = [this.data.ticker, ...this.getTickers()]\r\n const tickerText = new Text(\r\n {\r\n font: Text.getMergedPropsWithDefaults('font', {\r\n ...IndicatorSettings.left.indicatorLabel.font,\r\n style: 'normal',\r\n }),\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\r\n padding: { top: 0, bottom: 0, left: 5, right: 5 },\r\n },\r\n this.model\r\n )\r\n let x = IndicatorSettings.left.indicatorLabel.margin.left!\r\n let y =\r\n IndicatorSettings.left.indicatorLabel.margin.top! + (2 * INDICATOR_LABEL_HEIGHT - tickerText.attrs.lineHeight) / 2\r\n\r\n const maxHeight = tickerText.attrs.lineHeight * tickers.length\r\n\r\n const canFitItemsVertically = maxHeight + labelBottom <= this.height\r\n if (this.width <= MOBILE_VIEW_BREAKPOINT_WIDTH || !canFitItemsVertically) {\r\n isVertical = false\r\n x += x + this.labelWidth\r\n } else {\r\n y += IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\r\n }\r\n\r\n const tickerQuote = this.quotes?.[this.data.ticker]\r\n const maxCrossIndex = Math.min(crossIndex, (tickerQuote?.close.length ?? Infinity) - 1)\r\n tickers.forEach((key, index) => {\r\n const crossIndexTickerTimeStamp = tickerQuote?.getDataByBarIndex('date', maxCrossIndex)\r\n const tickerDateToIndex = crossIndexTickerTimeStamp\r\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\r\n : null\r\n const tickerPerformance = tickerDateToIndex\r\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\r\n : null\r\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\r\n tickerText.set({\r\n x,\r\n y,\r\n fillStyle:\r\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\r\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\r\n })\r\n const tickerTextWidth =\r\n tickerText.measure(context) + tickerText.attrs.padding.left + tickerText.attrs.padding.right\r\n if (\r\n !isVertical &&\r\n this.width - IndicatorSettings.left.indicatorLabel.margin.left! - IndicatorSettings.right.width! <=\r\n x + tickerTextWidth\r\n ) {\r\n x = 2 * IndicatorSettings.left.indicatorLabel.margin.left! + this.labelWidth\r\n y += tickerText.attrs.lineHeight\r\n tickerText.set({ x, y })\r\n }\r\n tickerText.render(context)\r\n\r\n if (isVertical) {\r\n y += tickerText.attrs.lineHeight\r\n } else {\r\n x += tickerTextWidth\r\n }\r\n }\r\n })\r\n }\r\n\r\n renderXAxis(context: CanvasRenderingContext2D) {\r\n if (!this.ready) {\r\n return\r\n }\r\n return super.renderXAxis(context)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n let ticker\r\n super.renderYAxis(context)\r\n const { IndicatorSettings, ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (!this.ready) {\r\n return\r\n }\r\n if (this.perf[this.data.ticker].length === 0) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const { lineHeight, padding, size } = IndicatorSettings.right.axis.font\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - padding!.left! + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', { size }),\r\n lineHeight,\r\n padding: {\r\n left: padding!.left!,\r\n right: padding!.right!,\r\n top: padding!.top!,\r\n bottom: padding!.bottom!,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.crossText,\r\n },\r\n this.model\r\n )\r\n const iterable = this.getTickers()\r\n const textLabels = []\r\n for (let index = 0; index < iterable.length; index++) {\r\n ticker = iterable[index]\r\n if (this.perf[ticker].length > 0) {\r\n textLabels.push({\r\n text: this.perf[ticker].last().toFixed(2) + '%',\r\n y: Math.round(this.fy(this.perf[ticker].last())),\r\n background: ColorsSettings[index % ColorsSettings.length],\r\n })\r\n }\r\n }\r\n textLabels.push({\r\n text: this.perf[this.data.ticker].last().toFixed(2) + '%',\r\n y: Math.round(this.fy(this.perf[this.data.ticker].last())),\r\n background: Colors.performanceIndicatorLabel,\r\n })\r\n\r\n const minY = 0\r\n const maxY = this.contentHeight\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\r\n super.renderLabelQuotePage(context)\r\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (this.ready) {\r\n const tickers = this.getTickers()\r\n const tickerPerformance = [\r\n { [this.data.ticker]: this.perf[this.data.ticker][this.perf[this.data.ticker].length - 1] },\r\n ...tickers.map((ticker) => ({ [ticker]: this.perf[ticker][this.perf[ticker].length - 1] })),\r\n ].reduce((prev, current) => ({ ...prev, ...current }), {})\r\n Object.keys(tickerPerformance).forEach((key, index) => {\r\n if (tickerPerformance[key]) {\r\n const text = new Text(\r\n {\r\n text: `${key} ${tickerPerformance[key].toFixed(2)}%`,\r\n x: IndicatorSettings.left.indicatorLabel.margin.left,\r\n y:\r\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\r\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\r\n (index + 1) +\r\n IndicatorSettings.left.indicatorLabel.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle:\r\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n )\r\n this.indicatorLabelWidth = { ...this.indicatorLabelWidth, [key]: text.measure(context) }\r\n text.render(context)\r\n }\r\n })\r\n }\r\n }\r\n\r\n getTickers() {\r\n return this.tickers\r\n .split(',')\r\n .map((ticker) => ticker)\r\n .filter((x) => x)\r\n }\r\n\r\n getTickersAndTimeframe() {\r\n const { timeframe } = this.model.chart().quote()\r\n return this.getTickers().map((ticker) => ({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe,\r\n }))\r\n }\r\n\r\n set(values: Partial) {\r\n this.ready = false\r\n this.firstFetchCalled = false\r\n super.set({ ...values, tickers: values.period || (values.tickers ? getSanitizedTicker(values.tickers, true) : '') })\r\n this.tickers = (this.tickers || '').toUpperCase()\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: this.label,\r\n inputs: [\r\n {\r\n type: 'text',\r\n label: 'Tickers',\r\n name: 'tickers',\r\n value: !!this.tickers ? this.tickers : DEFAULT_TICKERS,\r\n required: true,\r\n },\r\n ],\r\n inputsErrorMessages: {\r\n tickers: 'At least one ticker has to be provided',\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'tickers':\r\n return this[key].length > 0\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return this.getIsChartPageSpecificFunctionality() ? 'PERF %' : `PERF% ${this.tickers}`\r\n }\r\n}\r\n\r\nexport default PricePerformance\r\n","import { IndicatorType } from '../constants/common'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: number | string\r\n momentum: number\r\n}\r\n\r\nclass RMI extends Indicator {\r\n static type = IndicatorType.Rmi\r\n static label = 'Relative Momentum Index'\r\n\r\n rmi: number[] = []\r\n declare momentum: number\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, momentum = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, momentum })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n this.rmi = []\r\n let count = 0\r\n let sumu = 0\r\n let sumd = 0\r\n let u: number, d: number, ad: number, au: number\r\n for (let i = this.momentum; i < this.data.close.length; i++) {\r\n u = d = 0\r\n if (this.data.close[i] > this.data.close[i - this.momentum]) {\r\n u = this.data.close[i] - this.data.close[i - this.momentum]\r\n }\r\n if (this.data.close[i] < this.data.close[i - this.momentum]) {\r\n d = this.data.close[i - this.momentum] - this.data.close[i]\r\n }\r\n\r\n if (count < this.period) {\r\n sumu += u\r\n sumd += d\r\n count++\r\n au = sumu / count\r\n ad = sumd / count\r\n } else {\r\n au = (au! * (this.period - 1) + u) / this.period\r\n ad = (ad! * (this.period - 1) + d) / this.period\r\n }\r\n\r\n const rs = ad > 0 ? au / ad : 1\r\n this.rmi[i] = 100 - 100 * (1 / (1 + rs))\r\n }\r\n\r\n this.lastValue = this.rmi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.rmi, this.momentum, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 20,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const momentum = {\r\n type: 'number',\r\n label: 'Momentum',\r\n name: 'momentum',\r\n value: this.momentum ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, momentum],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n momentum: `${momentum.label} must be a whole number between ${momentum.min} and ${momentum.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'momentum':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RMI ${this.period},${this.momentum}`\r\n }\r\n}\r\n\r\nexport default RMI\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ROC extends Indicator {\r\n static type = IndicatorType.Roc\r\n static label = 'Rate of Change %'\r\n\r\n roc: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.roc = []\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n this.roc[i] = ((this.data.close[i] - this.data.close[i - this.period]) / this.data.close[i - this.period]) * 100\r\n }\r\n\r\n this.lastValue = this.roc.last() ?? null\r\n }\r\n const { min, max } = this.roc.length > 0 ? this.computeVisibleMinMax(this.roc) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.roc[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 12,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ROC ${this.period}`\r\n }\r\n}\r\n\r\nexport default ROC\r\n","import { IndicatorType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n rsi: number[]\r\n}\r\n\r\nexport class RsiCalculation extends MainCalculation {\r\n static type = IndicatorType.Rsi\r\n\r\n getDefaultCalculatedValues() {\r\n return { rsi: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sumu = 0\r\n let sumd = 0\r\n let u: number, d: number, ad: number, au: number\r\n for (let i = 1; i < close.length; i++) {\r\n u = d = 0\r\n if (close[i] > close[i - 1]) {\r\n u = close[i] - close[i - 1]\r\n }\r\n if (close[i] < close[i - 1]) {\r\n d = close[i - 1] - close[i]\r\n }\r\n\r\n if (i <= period) {\r\n sumu += u\r\n sumd += d\r\n au = sumu / i\r\n ad = sumd / i\r\n } else {\r\n au = (au! * (period - 1) + u) / period\r\n ad = (ad! * (period - 1) + d) / period\r\n }\r\n\r\n const rs = ad > 0 ? au / ad : 1\r\n this.calculatedValues.rsi[i] = 100 - 100 * (1 / (1 + rs))\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { IndicatorType } from '../constants/common'\r\nimport { RsiCalculation } from '../indicator-calculation/rsi'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass RSI extends Indicator {\r\n static type = IndicatorType.Rsi\r\n static label = 'Relative Strength Index'\r\n\r\n rsiCalculation: RsiCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.rsiCalculation !== null) return\r\n\r\n this.rsiCalculation = new RsiCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.rsiCalculation.calculate()\r\n\r\n this.lastValue = this.rsiCalculation.calculatedValues.rsi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.rsiCalculation?.calculatedValues.rsi ?? [], this.period, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RSI ${this.period}`\r\n }\r\n}\r\n\r\nexport default RSI\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: number | string\r\n baseLine: number\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 50,\r\n BaseLine: 1.0,\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const baseLine = parseFloat(values[1]) || DEFAULT_PARAMETERS.BaseLine\r\n\r\n return [period, baseLine]\r\n}\r\n\r\nclass RelativeVolume extends Indicator {\r\n static type = IndicatorType.Rvol\r\n static label = 'Relative Volume'\r\n\r\n rvol: number[] = []\r\n declare period: number\r\n declare baseLine: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, baseLine = 0] = parsePeriod(values.period)\r\n super.set({ ...values, period, baseLine })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.rvol = []\r\n\r\n let sum = 0\r\n for (let i = 0; i < this.period; i++) {\r\n sum += this.data.volume[i]\r\n }\r\n for (let i = this.period; i < this.data.volume.length; i++) {\r\n sum = sum - this.data.volume[i - this.period] + this.data.volume[i]\r\n this.rvol[i] = this.data.volume[i] / (sum / this.period)\r\n }\r\n\r\n this.lastValue = this.rvol.last() ?? null\r\n }\r\n\r\n const { min, max } =\r\n this.rvol.length > 0\r\n ? this.computeVisibleMinMax([...this.rvol, this.baseLine])\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const chartModel = this.model.chart()\r\n const { zoomFactor } = chartModel\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\r\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period + 1,\r\n drawBarCallback: (i, x) => {\r\n if (this.rvol[i] === undefined) return\r\n\r\n const baseLine = Math.round(this.fy(this.baseLine))\r\n const y = Math.round(this.fy(this.rvol[i]))\r\n\r\n context.fillStyle = this.rvol[i] < this.baseLine ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n context.fillRect(x - halfBarWidth, baseLine, barWidthWithoutMargin, y - baseLine)\r\n },\r\n })\r\n\r\n const baseLineY = this.fy(this.baseLine)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(baseLineY),\r\n y2: Math.round(baseLineY),\r\n strokeStyle: getHEXWithSpecificAplha(Colors.zeroChange, 0.5),\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const baseLine = {\r\n type: 'number',\r\n label: 'Baseline',\r\n name: 'baseLine',\r\n value: this.baseLine ?? DEFAULT_PARAMETERS.BaseLine,\r\n required: true,\r\n step: 0.1,\r\n allowDecimal: true,\r\n min: 0,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, baseLine],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n baseLine: `${baseLine.label} must be a number between ${baseLine.min} and ${baseLine.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'baseLine':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RVOL ${this.period}, ${this.baseLine}, SMA`\r\n }\r\n}\r\n\r\nexport default RelativeVolume\r\n","import Text from '../canvas/text'\r\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass RWI extends Indicator {\r\n static type = IndicatorType.Rwi\r\n static label = 'Random Walk Index'\r\n\r\n tr: number[] = []\r\n atr: number[] = []\r\n rwiHi: number[] = []\r\n rwiLo: number[] = []\r\n declare period: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n }\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.tr = []\r\n this.atr = []\r\n this.rwiHi = []\r\n this.rwiLo = []\r\n let atr = 0\r\n\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n const tr = utils.max([\r\n this.data.high[i] - this.data.low[i],\r\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\r\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\r\n ])\r\n this.tr[i] = tr\r\n\r\n if (i < this.period) {\r\n atr += tr\r\n this.atr[i] = atr / (i + 1)\r\n if (i === this.period - 1) {\r\n atr /= this.period\r\n }\r\n } else {\r\n this.atr[i] = (this.atr[i - 1] * (this.period - 1) + tr) / this.period\r\n }\r\n }\r\n\r\n for (let i = this.period + 2; i < this.data.close.length; i++) {\r\n const h = this.data.high[i]\r\n const l = this.data.low[i]\r\n let trSum = this.tr[i - 1] + this.tr[i - 2]\r\n let count = 2\r\n let atrWeight = (trSum / count) * Math.sqrt(count)\r\n let maxHi = atrWeight > 0 ? (h - this.data.low[i - 1]) / atrWeight : -1\r\n let maxLo = atrWeight > 0 ? (this.data.high[i - 1] - l) / atrWeight : -1\r\n for (let j = i - 1; j > i - this.period + 1; j--) {\r\n trSum += this.tr[j - 2]\r\n count++\r\n atrWeight = (trSum / count) * Math.sqrt(count)\r\n if (atrWeight === 0) {\r\n continue\r\n }\r\n\r\n const hi = (h - this.data.low[j - 1]) / atrWeight\r\n if (hi > maxHi) {\r\n maxHi = hi\r\n }\r\n\r\n const lo = (this.data.high[j - 1] - l) / atrWeight\r\n if (lo > maxLo) {\r\n maxLo = lo\r\n }\r\n }\r\n this.rwiHi[i] = maxHi\r\n this.rwiLo[i] = maxLo\r\n }\r\n }\r\n const { min, max } =\r\n this.rwiHi.length > 0 || this.rwiLo.length > 0\r\n ? this.computeVisibleMinMax(this.rwiHi, this.rwiLo)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', '#c80000')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.rwiLo[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', '#00a000')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.rwiHi[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n super.renderYAxis(context)\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n },\r\n this.model\r\n )\r\n const textLabels = []\r\n if (this.rwiLo.length > 0) {\r\n textLabels.push({\r\n text: this.rwiLo.last()!.toFixed(2),\r\n y: Math.round(this.fy(this.rwiLo.last()!)),\r\n background: '#c80000',\r\n })\r\n }\r\n if (this.rwiHi.length > 0) {\r\n textLabels.push({\r\n text: this.rwiHi.last()!.toFixed(2),\r\n y: Math.round(this.fy(this.rwiHi.last()!)),\r\n background: '#00a000',\r\n })\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RWI ${this.period}`\r\n }\r\n}\r\n\r\nexport default RWI\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string | number\r\n dPeriod: number\r\n kPeriod: number\r\n}\r\n\r\nclass Stochastics extends Indicator {\r\n static type = IndicatorType.Stofu\r\n static label = 'Stochastics FULL'\r\n\r\n k: number[] = []\r\n k1: number[] = []\r\n d: number[] = []\r\n declare kPeriod: number\r\n declare period: number\r\n declare dPeriod: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, kPeriod = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n const period = Math.min(this.period, this.data.close.length - 1)\r\n let dCount, dSum, k\r\n this.k1 = []\r\n this.k = []\r\n this.d = []\r\n let kSum = (dSum = 0)\r\n let kCount = (dCount = 0)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n let lowestLow = this.data.low[i]\r\n\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n k = ((this.data.close[i] - lowestLow) / (highestHigh - lowestLow)) * 100\r\n if (highestHigh === lowestLow) {\r\n k = 100\r\n }\r\n this.k1[i] = k\r\n if (this.kPeriod > 1) {\r\n kSum += k\r\n kCount++\r\n if (kCount > this.kPeriod) {\r\n kSum -= this.k1[i - this.kPeriod]\r\n kCount--\r\n }\r\n k = kSum / kCount\r\n }\r\n\r\n dSum += k\r\n dCount++\r\n if (dCount > this.dPeriod) {\r\n dSum -= this.k[i - this.dPeriod]\r\n dCount--\r\n }\r\n\r\n const d = dSum / dCount\r\n this.k[i] = k\r\n this.d[i] = d\r\n }\r\n\r\n this.lastValue = this.k.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(50)),\r\n y2: Math.round(this.fy(50)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(20)),\r\n y2: Math.round(this.fy(20)),\r\n strokeStyle: '#69c1ea',\r\n },\r\n this.model\r\n ).render(context)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(80)),\r\n y2: Math.round(this.fy(80)),\r\n strokeStyle: '#d386df',\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.k[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', '#c80000')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.d[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const kPeriod = {\r\n type: 'number',\r\n label: 'K Period',\r\n name: 'kPeriod',\r\n value: this.kPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const dPeriod = {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, kPeriod, dPeriod],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\r\n kPeriod: `${kPeriod.label} must be a whole number between ${kPeriod.min} and ${kPeriod.max}`,\r\n } as {\r\n period: string\r\n dPeriod: string\r\n kPeriod?: string\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n case 'kPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Stochastics FULL ${this.period},${this.kPeriod},${this.dPeriod}`\r\n }\r\n}\r\n\r\nexport default Stochastics\r\n","import { IndicatorType } from '../constants/common'\r\nimport Pane from '../models/pane'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Stochastics from './stofu'\r\n\r\ninterface Attrs {\r\n period: string | number\r\n dPeriod: number\r\n kPeriod: number\r\n}\r\n\r\nclass StochasticsFast extends Stochastics {\r\n static type = IndicatorType.Stofa\r\n static label = 'Stochastics FAST'\r\n\r\n declare kPeriod: number\r\n declare period: number\r\n declare dPeriod: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.kPeriod = 1\r\n }\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod: 1 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const dPeriod = {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, dPeriod],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Stochastics FAST ${this.period},${this.dPeriod}`\r\n }\r\n}\r\n\r\nexport default StochasticsFast\r\n","import { IndicatorType } from '../constants/common'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Stochastics from './stofu'\r\n\r\ninterface Attrs {\r\n period: string | number\r\n dPeriod: number\r\n kPeriod: number\r\n}\r\n\r\nclass StochasticsSlow extends Stochastics {\r\n static type = IndicatorType.Stosl\r\n static label = 'Stochastics SLOW'\r\n\r\n kPeriod = 3\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod: 3 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const dPeriod = {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, dPeriod],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Stochastics SLOW ${this.period},${this.dPeriod}`\r\n }\r\n}\r\n\r\nexport default StochasticsSlow\r\n","import { IndicatorType } from '../constants/common'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n trix: number[]\r\n}\r\n\r\nexport class TrixCalculation extends MainCalculation {\r\n static type = IndicatorType.Trix\r\n\r\n getDefaultCalculatedValues() {\r\n return { trix: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n const ema1 = new ExponentialMovingAverage(period)\r\n const ema2 = new ExponentialMovingAverage(period)\r\n const ema3 = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let prev = 0\r\n for (let index = 0; index <= lastIndex; index++) {\r\n ema1.add(close[index])\r\n ema2.add(ema1.value)\r\n ema3.add(ema2.value)\r\n if (prev > 0) {\r\n this.calculatedValues.trix[index] = (ema3.value * 100) / prev - 100\r\n }\r\n prev = ema3.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { TrixCalculation } from '../indicator-calculation/trix'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass Trix extends Indicator {\r\n static type = IndicatorType.Trix\r\n static label = 'TRIX'\r\n\r\n trixCalculation: TrixCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.trixCalculation = new TrixCalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.period,\r\n },\r\n })\r\n this.trixCalculation.calculate()\r\n this.lastValue = this.trixCalculation.calculatedValues.trix.last() ?? null\r\n }\r\n const trix = this.trixCalculation?.calculatedValues.trix ?? []\r\n const { min, max } = trix.length > 0 ? this.computeVisibleMinMax(trix) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const value = this.trixCalculation?.calculatedValues.trix[i]\r\n if (value) context.lineTo(x, ~~this.fy(value))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `TRIX ${this.period}`\r\n }\r\n}\r\n\r\nexport default Trix\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n period1: number\r\n period2: number\r\n period3: number\r\n}\r\n\r\nclass UltimateOscillator extends Indicator {\r\n static type = IndicatorType.Ult\r\n static label = 'Ultimate Oscillator'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(period)\r\n return Math.max(period1, period2, period3)\r\n }\r\n\r\n declare period1: number\r\n declare period2: number\r\n declare period3: number\r\n ult: number[] = []\r\n tr: number[] = []\r\n bp: number[] = []\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period1, period2, period3 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n this.ult = []\r\n let bpSum2, bpSum3, count2, count3, trSum2, trSum3\r\n const tr = []\r\n const bp = []\r\n let bpSum1 = (bpSum2 = bpSum3 = 0)\r\n let trSum1 = (trSum2 = trSum3 = 0)\r\n let count1 = (count2 = count3 = 0)\r\n let avg2, avg3\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n bp[i] = this.data.close[i] - Math.min(this.data.low[i], this.data.close[i - 1])\r\n tr[i] = Math.max(this.data.high[i], this.data.close[i - 1]) - Math.min(this.data.low[i], this.data.close[i - 1])\r\n\r\n bpSum1 += bp[i]\r\n trSum1 += tr[i]\r\n count1++\r\n if (count1 > this.period1) {\r\n bpSum1 -= bp[i - this.period1]\r\n trSum1 -= tr[i - this.period1]\r\n }\r\n\r\n bpSum2 += bp[i]\r\n trSum2 += tr[i]\r\n count2++\r\n if (count2 > this.period2) {\r\n bpSum2 -= bp[i - this.period2]\r\n trSum2 -= tr[i - this.period2]\r\n }\r\n\r\n bpSum3 += bp[i]\r\n trSum3 += tr[i]\r\n count3++\r\n if (count3 > this.period3) {\r\n bpSum3 -= bp[i - this.period3]\r\n trSum3 -= tr[i - this.period3]\r\n }\r\n\r\n let avg1 = (avg2 = avg3 = 0)\r\n if (trSum1 > 0) {\r\n avg1 = bpSum1 / trSum1\r\n }\r\n if (trSum2 > 0) {\r\n avg2 = bpSum2 / trSum2\r\n }\r\n if (trSum3 > 0) {\r\n avg3 = bpSum3 / trSum3\r\n }\r\n\r\n this.ult[i] = (100 * (4 * avg1 + 2 * avg2 + avg3)) / 7\r\n }\r\n\r\n this.lastValue = this.ult.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.ult, 1, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const period1 = {\r\n type: 'number',\r\n label: 'Period 1',\r\n name: 'period1',\r\n value: this.period1 ?? 7,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const period2 = {\r\n type: 'number',\r\n label: 'Period 2',\r\n name: 'period2',\r\n value: this.period2 ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const period3 = {\r\n type: 'number',\r\n label: 'Period 3',\r\n name: 'period3',\r\n value: this.period3 ?? 28,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period1, period2, period3],\r\n inputsErrorMessages: {\r\n period1: `${period1.label} must be a whole number between ${period1.min} and ${period1.max}`,\r\n period2: `${period2.label} must be a whole number between ${period2.min} and ${period2.max}`,\r\n period3: `${period3.label} must be a whole number between ${period3.min} and ${period3.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period1':\r\n case 'period2':\r\n case 'period3':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ULT ${this.period1},${this.period2},${this.period3}`\r\n }\r\n}\r\n\r\nexport default UltimateOscillator\r\n","import { IndicatorType } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\nclass Volume extends Indicator {\r\n static type = IndicatorType.Vol\r\n static label = 'Volume'\r\n\r\n compute() {\r\n const { min, max } =\r\n this.data.volume.length > 0 ? this.computeVisibleMinMax(this.data.volume) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n this.lastValue = this.data.volume.last() ?? null\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const chartModel = this.model.chart()\r\n const { zoomFactor } = chartModel\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\r\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i, x) => {\r\n context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n const y = Math.round(this.fy(this.data.volume[i]))\r\n context.fillRect(x - halfBarWidth, y, barWidthWithoutMargin, context.canvas.height - y)\r\n },\r\n })\r\n }\r\n\r\n formatAxis(value: number) {\r\n return math.formatBigNumber(value, 2)\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: this.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toString() {\r\n return `Volume`\r\n }\r\n}\r\n\r\nexport default Volume\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass WilliamsR extends Indicator {\r\n static type = IndicatorType.Wr\r\n static label = 'Williams %R'\r\n\r\n declare period: number\r\n r: number[] = []\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.r = []\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n let lowestLow = this.data.low[i]\r\n for (let j = i - this.period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n this.r[i] = 0\r\n if (highestHigh - lowestLow > 0) {\r\n this.r[i] = ((highestHigh - this.data.close[i]) / (highestHigh - lowestLow)) * -100\r\n }\r\n }\r\n\r\n this.lastValue = this.r.last() ?? null\r\n }\r\n const { min, max } = this.r.length > 0 ? this.computeVisibleMinMax(this.r) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.r, this.period, -80, -50, -20)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `W%R ${this.period}`\r\n }\r\n}\r\n\r\nexport default WilliamsR\r\n","import { IndicatorType } from '../constants/common'\r\nimport adx from './adx'\r\nimport aro from './aro'\r\nimport aroosc from './aroosc'\r\nimport atr from './atr'\r\nimport cci from './cci'\r\nimport cot from './cot'\r\nimport fi from './fi'\r\nimport indicator from './indicator'\r\nimport macd from './macd'\r\nimport mfi from './mfi'\r\nimport none from './none'\r\nimport obv from './obv'\r\nimport perf from './perf'\r\nimport rmi from './rmi'\r\nimport roc from './roc'\r\nimport rsi from './rsi'\r\nimport rvol from './rvol'\r\nimport rwi from './rwi'\r\nimport stofa from './stofa'\r\nimport stofu from './stofu'\r\nimport stosl from './stosl'\r\nimport trix from './trix'\r\nimport ult from './ult'\r\nimport vol from './vol'\r\nimport wr from './wr'\r\n\r\n// TODO check if this doesn't break saved charts\r\nexport const indicatorsByType = Object.freeze({\r\n [IndicatorType.Indicator]: indicator,\r\n [IndicatorType.None]: none,\r\n [IndicatorType.Adx]: adx,\r\n [IndicatorType.Aro]: aro,\r\n [IndicatorType.Aroosc]: aroosc,\r\n [IndicatorType.Atr]: atr,\r\n [IndicatorType.Cci]: cci,\r\n [IndicatorType.Cot]: cot,\r\n [IndicatorType.Fi]: fi,\r\n [IndicatorType.Macd]: macd,\r\n [IndicatorType.Mfi]: mfi,\r\n [IndicatorType.Obv]: obv,\r\n [IndicatorType.Perf]: perf,\r\n [IndicatorType.Rmi]: rmi,\r\n [IndicatorType.Roc]: roc,\r\n [IndicatorType.Rsi]: rsi,\r\n [IndicatorType.Rvol]: rvol,\r\n [IndicatorType.Rwi]: rwi,\r\n [IndicatorType.Stofa]: stofa,\r\n [IndicatorType.Stofu]: stofu,\r\n [IndicatorType.Stosl]: stosl,\r\n [IndicatorType.Trix]: trix,\r\n [IndicatorType.Ult]: ult,\r\n [IndicatorType.Vol]: vol,\r\n [IndicatorType.Wr]: wr,\r\n})\r\n\r\nexport const indicatorsWithoutPeriod = Object.freeze([IndicatorType.Obv, IndicatorType.Vol])\r\n","import Spine from '@finviz/spine'\r\nimport * as React from 'react'\r\n\r\nimport { DefaultSpineEvents } from '../../types/shared'\r\nimport ElementModule from '../canvas/element'\r\nimport IndicatorModule from '../indicators/indicator'\r\nimport { useForceUpdate } from '../utils/force-update'\r\nimport { getJSONReplacerFunc } from '../utils/helpers'\r\n\r\ninterface UseModelStateOptions {\r\n watchProperties?: T extends null ? never[] : Array\r\n listenOnEvents?: string[]\r\n}\r\n\r\nconst getIsSpineObject = (value: any) =>\r\n [Spine.Model, Spine.Module, Spine.Collection].some((spineObject) => value instanceof spineObject)\r\n\r\nconst getWatchedPropValue = (\r\n watchedProp: Model[keyof Model] | ElementModule | IndicatorModule | undefined,\r\n model: Model | null\r\n) => {\r\n if (typeof watchedProp === 'function') {\r\n const value = watchedProp.call(model)\r\n\r\n if (value && !getIsSpineObject(value)) {\r\n throw Error('Watched prop should have a primitive value or a spine object')\r\n }\r\n\r\n if (typeof value?.all === 'function') {\r\n return value.all()\r\n }\r\n\r\n return value\r\n }\r\n\r\n if (typeof watchedProp === 'object') {\r\n const hasToObject = !!watchedProp && 'toObject' in watchedProp\r\n return JSON.stringify(hasToObject ? watchedProp.toObject() : watchedProp, getJSONReplacerFunc())\r\n }\r\n\r\n return watchedProp\r\n}\r\n\r\nconst getWatchedProps = (model: Model | null, props?: Array) =>\r\n props?.reduce(\r\n (acc, propKey) => ({\r\n ...acc,\r\n [propKey]: getWatchedPropValue(model?.[propKey], model),\r\n }),\r\n {} as Partial\r\n )\r\n\r\nconst getAreWatchedPropsEqual = (\r\n currentValue: Value,\r\n previousValue: Value\r\n) => {\r\n if (currentValue instanceof Spine.Model) {\r\n return currentValue.eql(previousValue)\r\n }\r\n\r\n return currentValue === previousValue\r\n}\r\n\r\nconst DEFAULT_SPINE_EVENTS = Object.values(DefaultSpineEvents)\r\n\r\nexport function useModelState(\r\n model: Model,\r\n options: UseModelStateOptions = {}\r\n) {\r\n const { watchProperties = [], listenOnEvents = DEFAULT_SPINE_EVENTS } = options\r\n const stringifiedOptions = JSON.stringify(options)\r\n const { forceUpdate } = useForceUpdate()\r\n const watchedPropertiesRef = React.useRef(getWatchedProps(model, watchProperties))\r\n\r\n React.useEffect(() => {\r\n const handleModelChange = () => {\r\n const hasChange = watchProperties.some((propKey) => {\r\n const currentValue = getWatchedPropValue(model?.[propKey], model)\r\n const previousValue = watchedPropertiesRef.current?.[propKey]\r\n\r\n if (Array.isArray(currentValue)) {\r\n return (\r\n !Array.isArray(previousValue) ||\r\n currentValue.length !== previousValue.length ||\r\n currentValue.some((record, index) => !getAreWatchedPropsEqual(record, previousValue[index]))\r\n )\r\n }\r\n\r\n return !getAreWatchedPropsEqual(currentValue, previousValue)\r\n })\r\n\r\n if (hasChange) {\r\n watchedPropertiesRef.current = getWatchedProps(model, watchProperties)\r\n forceUpdate()\r\n }\r\n }\r\n\r\n const spineEvents = listenOnEvents.join(' ')\r\n\r\n model?.bind(spineEvents, handleModelChange)\r\n\r\n forceUpdate()\r\n\r\n return () => {\r\n model?.unbind(spineEvents, handleModelChange)\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [model?.cid, stringifiedOptions, forceUpdate])\r\n\r\n return model\r\n}\r\n","/*\r\n * it converts it to numbered index and it causes problems later on\r\n * the reason it's not just numbered enum is that it when used in const below\r\n * */\r\nexport enum ChartSyncablePart {\r\n Crosshair = 'crosshair',\r\n Ticker = 'ticker',\r\n Timeframe = 'timeframe',\r\n}\r\n\r\nexport const ChartPartToAttrsSyncMap = {\r\n [ChartSyncablePart.Ticker]: ['ticker'],\r\n [ChartSyncablePart.Timeframe]: ['timeframe', 'dateRange'],\r\n}\r\n\r\nexport const ChartSyncableParts = [\r\n { value: ChartSyncablePart.Ticker, label: 'Ticker' },\r\n { value: ChartSyncablePart.Timeframe, label: 'Timeframe' },\r\n { value: ChartSyncablePart.Crosshair, label: 'Crosshair' },\r\n]\r\n","import { ObjectHash, Theme } from '../../../types/shared'\r\nimport { IChartThemeColors, chartDarkTheme, chartLightTheme } from '../constants'\r\n\r\nfunction normalizeHexAlpha(hexString = '') {\r\n const hexValue = hexString.replace('#', '')\r\n if (hexValue.length === 6) {\r\n return `${hexString}FF`\r\n }\r\n return hexString\r\n}\r\n\r\nexport const getColorOverwrites = ({\r\n theme,\r\n colors,\r\n}: {\r\n theme: Theme\r\n colors: ObjectHash, Theme>\r\n}) => {\r\n const customColors = colors[theme]\r\n const customColorKeys = Object.keys(customColors) as Array>\r\n const defaultColors = theme === Theme.light ? chartLightTheme : chartDarkTheme\r\n\r\n return customColorKeys.reduce((acc, colorKey) => {\r\n const isDefaultOverWritten =\r\n normalizeHexAlpha(customColors[colorKey]).toLowerCase() !==\r\n normalizeHexAlpha(defaultColors[colorKey]).toLowerCase()\r\n\r\n return isDefaultOverWritten\r\n ? {\r\n ...acc,\r\n [colorKey]: customColors[colorKey],\r\n }\r\n : acc\r\n }, {})\r\n}\r\n","import tailwindColors from '../constants/colors'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\n\r\nexport interface IChartThemeColors {\r\n aftermarketFade: string\r\n background: string\r\n borderDown: string\r\n borderUp: string\r\n canvasFill: string\r\n cross: string\r\n crossText: string\r\n crossTextBackground: string\r\n currentBackground: string\r\n currentText: string\r\n grid: string\r\n gridSecondary: string\r\n indicatorCurrentBackground: string\r\n indicatorCurrentText: string\r\n line: string\r\n marketDown: string\r\n marketUp: string\r\n negativeChange: string\r\n ohlcTrendDown: string\r\n ohlcTrendUp: string\r\n overlayTransparentBackground: string\r\n percentageZeroLineText: string\r\n performanceIndicatorLabel: string\r\n positiveChange: string\r\n premarketFade: string\r\n prevClose: string\r\n text: string\r\n textSecondary: string\r\n trendDown: string\r\n trendUp: string\r\n volumeTrendDown: string\r\n volumeTrendUp: string\r\n wickDown: string\r\n wickUp: string\r\n zeroChange: string\r\n}\r\n\r\nexport interface IIndicatorThemeColors {\r\n line: string\r\n signalLine: string\r\n}\r\n\r\nexport interface IElementThemeColors {\r\n line: string\r\n border: string\r\n textWithoutBackground: string\r\n}\r\n\r\ninterface IDarkerWickColors {\r\n borderUp: string\r\n wickUp: string\r\n borderDown: string\r\n wickDown: string\r\n}\r\n\r\nexport const chartLightTheme: IChartThemeColors = {\r\n aftermarketFade: '#FFFFFF99',\r\n background: '#008CFF0E',\r\n borderDown: '#000000FF',\r\n borderUp: '#000000FF',\r\n canvasFill: '#FFFFFFFF',\r\n cross: '#0000004C',\r\n crossText: '#fff',\r\n crossTextBackground: '#111',\r\n currentBackground: tailwindColors.brightYellow[100],\r\n currentText: tailwindColors.gray[800],\r\n grid: '#D2D2D2FF',\r\n gridSecondary: '#ECECEC',\r\n indicatorCurrentBackground: tailwindColors.gray[600],\r\n indicatorCurrentText: '#fff',\r\n line: '#1E6DC0FF',\r\n marketDown: tailwindColors.red[500],\r\n marketUp: tailwindColors.green[500],\r\n negativeChange: '#C80000FF',\r\n ohlcTrendDown: '#E54040FF',\r\n ohlcTrendUp: '#40A140FF',\r\n overlayTransparentBackground: getHEXWithSpecificAplha('#C9CCD6', 0.25),\r\n percentageZeroLineText: '#111',\r\n performanceIndicatorLabel: '#646464',\r\n positiveChange: '#009600FF',\r\n premarketFade: '#FFFFFF99',\r\n prevClose: '#C80000FF',\r\n text: '#828282',\r\n textSecondary: '#dedede',\r\n trendDown: '#FF0000FF',\r\n trendUp: '#00FF00FF',\r\n volumeTrendDown: '#ffc0c0',\r\n volumeTrendUp: '#a8e0a8',\r\n wickDown: '#000000FF',\r\n wickUp: '#000000FF',\r\n zeroChange: '#000',\r\n}\r\n\r\nexport const chartDarkTheme: IChartThemeColors = {\r\n aftermarketFade: '#4C526133',\r\n background: '#1E6DC019',\r\n borderDown: '#F63538FF',\r\n borderUp: '#30CC5AFF',\r\n canvasFill: tailwindColors.gray[800],\r\n cross: '#404553',\r\n crossText: '#fff',\r\n crossTextBackground: '#111',\r\n currentBackground: tailwindColors.yellow[200],\r\n currentText: tailwindColors.gray[700],\r\n grid: '#363A46FF',\r\n gridSecondary: '#2C303A',\r\n indicatorCurrentBackground: tailwindColors.gray[500],\r\n indicatorCurrentText: '#fff',\r\n line: '#1E6DC0FF',\r\n marketDown: tailwindColors.red[300],\r\n marketUp: tailwindColors.green[300],\r\n negativeChange: tailwindColors.red[400],\r\n ohlcTrendDown: '#E54040FF',\r\n ohlcTrendUp: '#40A140FF',\r\n overlayTransparentBackground: getHEXWithSpecificAplha('#0C0E13', 0.35),\r\n percentageZeroLineText: '#fff',\r\n performanceIndicatorLabel: '#646464',\r\n positiveChange: tailwindColors.green[400],\r\n premarketFade: '#4C526133',\r\n prevClose: '#C80000FF',\r\n text: '#929cb3',\r\n textSecondary: '#929CB399',\r\n trendDown: '#F63538FF',\r\n trendUp: '#30CC5AFF',\r\n volumeTrendDown: '#F635387F',\r\n volumeTrendUp: '#30CC5A7F',\r\n wickDown: '#F63538FF',\r\n wickUp: '#30CC5AFF',\r\n zeroChange: '#929cb3',\r\n}\r\n\r\nexport const darkerWickColors: IDarkerWickColors = {\r\n borderUp: '#006400FF',\r\n wickUp: '#006400',\r\n borderDown: '#6E0000FF',\r\n wickDown: '#6E0000FF',\r\n}\r\n\r\nexport const indicatorLightTheme: IIndicatorThemeColors = {\r\n line: '#000000',\r\n signalLine: tailwindColors.red[400],\r\n}\r\n\r\nexport const indicatorDarkTheme: IIndicatorThemeColors = {\r\n line: '#D07933',\r\n signalLine: tailwindColors.red[400],\r\n}\r\n\r\nexport const elementLightTheme: IElementThemeColors = {\r\n line: '#000000',\r\n border: '#000000',\r\n textWithoutBackground: '#000000',\r\n}\r\n\r\nexport const elementDarkTheme: IElementThemeColors = {\r\n line: '#5faaf4',\r\n border: '#5192D1',\r\n textWithoutBackground: '#929cb3',\r\n}\r\nexport const generalColors: Array = [\r\n '#1f77b4',\r\n '#ff7f0e',\r\n '#2ca02c',\r\n '#d62728',\r\n '#9467bd',\r\n '#8c564b',\r\n '#e377c2',\r\n '#7f7f7f',\r\n '#bcbd22',\r\n '#17becf',\r\n]\r\n\r\n// node chart with thin bars color override\r\nexport const thinBarColorsOverride = {\r\n trendUp: '#00b400',\r\n trendDown: '#b40000',\r\n}\r\n\r\nexport enum AutoSaveState {\r\n Off,\r\n Saved,\r\n Unsaved,\r\n Saving,\r\n}\r\n\r\nexport const CHART_EVENT_BADGE_SIZE = 24\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\n\r\nimport { TodoObjectHashAnyType } from '../../types/shared'\r\nimport { drawingToolsByType } from '../canvas/drawingTools'\r\nimport CanvasElement from '../canvas/element'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getIsSSr, getUuid } from '../utils/helpers'\r\nimport Pane from './pane'\r\nimport { changeElementZIndexes } from './utils'\r\n\r\nclass Element extends Spine.Model {\r\n static initClass(paneModel: typeof Pane) {\r\n this.configure('Element', 'instance', 'lastChange', 'zIndex', 'elementId')\r\n this.belongsTo('pane', paneModel)\r\n }\r\n\r\n declare instance: CanvasElement\r\n declare pane_id: string\r\n declare destroyed: true | undefined\r\n declare pane: () => Pane\r\n lastChange: number | null = null\r\n elementId: string | null = null\r\n zIndex = -1\r\n\r\n generateUuid = getIsSSr() ? undefined : getUuid\r\n\r\n constructor(...args: any[]) {\r\n super(...args)\r\n const elementAttrs = args[0]\r\n this.elementId = elementAttrs?.elementId ?? this.generateUuid?.()\r\n this.one('create', () => {\r\n this.updateAttributes({\r\n zIndex: elementAttrs?.zIndex ?? this.pane().getElementZIndexRange().max + 1,\r\n })\r\n })\r\n }\r\n\r\n replace(instance: CanvasElement) {\r\n const oldInstance = this.instance\r\n this.updateAttribute('instance', instance)\r\n this.trigger('replace', this, oldInstance)\r\n }\r\n\r\n makeClone() {\r\n const { instance, pane_id } = this\r\n const { attrs } = instance\r\n const { scale } = instance.model\r\n const clonedObj = merge({ pane_id }, attrs)\r\n const cloned = drawingToolsByType[instance.type as CanvasElementType].fromObject(clonedObj, instance.model)\r\n const { ThumbSettings } = this.pane().getChartLayoutSettings()\r\n const offset = ThumbSettings.size + ThumbSettings.borderWidth * 2\r\n cloned.moveBy(scale.x.invert(offset), scale.y.invert(offset) - scale.y.invert(0))\r\n cloned.cachePointPositionTimestamp()\r\n Element.create({ instance: cloned, pane_id })\r\n this.trigger('makeClone', this, cloned)\r\n }\r\n\r\n moveToZIndex(zIndex: number) {\r\n const currentZIndex = this.zIndex\r\n const directionCoef = zIndex > currentZIndex ? 1 : -1\r\n\r\n if (this.isChart() || this.isIndicator()) {\r\n if (this.zIndex !== 0) {\r\n this.updateAttributes({ zIndex: 0 })\r\n }\r\n this.pane()\r\n .getAllElements()\r\n .filter((element) => {\r\n const shouldMove = directionCoef === 1 ? element.zIndex <= zIndex : element.zIndex >= zIndex\r\n return shouldMove && element.isDrawing()\r\n })\r\n .forEach((element) => element.moveToZIndex(directionCoef * -1))\r\n\r\n return\r\n }\r\n\r\n const newZIndex = zIndex === 0 ? directionCoef : zIndex // 0 is protected value for chart/indicator element\r\n const { min, max } = this.pane().getElementZIndexRange()\r\n if (\r\n currentZIndex === newZIndex ||\r\n (currentZIndex === min && directionCoef === -1) ||\r\n (currentZIndex === max && directionCoef === 1)\r\n ) {\r\n return\r\n }\r\n const { elementsBelowZero, elementsAboveZero } = this.pane().getBelowAboveZeroElements()\r\n\r\n changeElementZIndexes({\r\n elementsArray: elementsBelowZero,\r\n addElement: newZIndex < 0 ? this : undefined,\r\n oldZIndex: currentZIndex,\r\n newZIndex,\r\n isBelowZero: true,\r\n })\r\n\r\n changeElementZIndexes({\r\n elementsArray: elementsAboveZero,\r\n addElement: newZIndex > 0 ? this : undefined,\r\n oldZIndex: currentZIndex,\r\n newZIndex,\r\n })\r\n }\r\n\r\n bringToFront() {\r\n this.moveToZIndex(this.pane().getElementZIndexRange().max + 1)\r\n }\r\n\r\n sendToBack() {\r\n this.moveToZIndex(this.pane().getElementZIndexRange().min - 1)\r\n }\r\n\r\n bringForward() {\r\n this.moveToZIndex(this.zIndex + 1)\r\n }\r\n\r\n sendBackward() {\r\n this.moveToZIndex(this.zIndex - 1)\r\n }\r\n\r\n isChart() {\r\n return !!this.instance?.type.startsWith('charts/')\r\n }\r\n\r\n isIndicator() {\r\n return !!this.instance?.type.startsWith('indicators/')\r\n }\r\n\r\n isOverlay() {\r\n return !!this.instance?.type.startsWith('overlays/')\r\n }\r\n\r\n isDrawing() {\r\n return !!this.instance?.type.startsWith('canvas/')\r\n }\r\n\r\n isChartEvent() {\r\n return !!this.instance?.type.startsWith('chartEvent/')\r\n }\r\n\r\n isMouseDown() {\r\n return !!this.instance?.isMouseDown\r\n }\r\n\r\n hasOngoingInteraction() {\r\n return this.isMouseDown() || this.instance.isEditInProgress\r\n }\r\n\r\n toObject() {\r\n return {\r\n ...this.instance.toObject(),\r\n elementId: this.elementId,\r\n zIndex: this.zIndex,\r\n }\r\n }\r\n\r\n toConfig() {\r\n return {\r\n ...this.instance.toConfig(),\r\n elementId: this.elementId,\r\n zIndex: this.zIndex,\r\n }\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n return this.destroy(options)\r\n }\r\n\r\n refreshElementId() {\r\n this.updateAttribute('elementId', this.generateUuid?.())\r\n }\r\n}\r\n\r\nexport default Element\r\n","import endOfDay from 'date-fns/endOfDay'\r\nimport lastDayOfMonth from 'date-fns/lastDayOfMonth'\r\nimport lastDayOfWeek from 'date-fns/lastDayOfWeek'\r\nimport setDate from 'date-fns/set'\r\n\r\nimport { TIMEFRAME, TIMEFRAMES_WITH_PRE_MARKET } from '../../constants/common'\r\nimport { convertLocalToNyTime, dateFromUnixTimestamp } from '../../utils'\r\nimport Chart from '../chart'\r\n\r\nconst MARKET_START = { hours: 9, minutes: 30 }\r\nconst END_OF_DAY = { hours: 23, minutes: 59 }\r\n\r\nfunction getIsDateBeforeMarketStart(date: Date) {\r\n const hours = date.getHours()\r\n const minutes = date.getMinutes()\r\n return hours < MARKET_START.hours || (hours === MARKET_START.hours && minutes < MARKET_START.minutes)\r\n}\r\n\r\nexport function roundTimeForSyncedPane({\r\n sourceChart,\r\n targetChart,\r\n timestamp,\r\n}: {\r\n sourceChart: Chart\r\n targetChart: Chart\r\n timestamp: number\r\n}) {\r\n let dateToReturn = dateFromUnixTimestamp(timestamp)\r\n const sourceChartHasPremarket =\r\n sourceChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(sourceChart.timeframe)\r\n const targetChartHasPremarket =\r\n targetChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(targetChart.timeframe)\r\n\r\n if ([TIMEFRAME.d, TIMEFRAME.w, TIMEFRAME.m].includes(sourceChart.timeframe)) {\r\n dateToReturn = setDate(dateToReturn, MARKET_START)\r\n }\r\n\r\n if (targetChart.timeframe === TIMEFRAME.m) {\r\n dateToReturn = setDate(lastDayOfMonth(dateToReturn), END_OF_DAY)\r\n } else if (targetChart.timeframe === TIMEFRAME.w) {\r\n dateToReturn = setDate(lastDayOfWeek(dateToReturn, { weekStartsOn: 1 }), END_OF_DAY)\r\n } else if (targetChart.timeframe === TIMEFRAME.d && targetChart.quote().instrument !== 'stock') {\r\n dateToReturn = endOfDay(dateToReturn)\r\n }\r\n\r\n if (sourceChartHasPremarket && !targetChartHasPremarket && targetChart.quote().instrument === 'stock') {\r\n dateToReturn = getIsDateBeforeMarketStart(dateToReturn) ? setDate(dateToReturn, MARKET_START) : dateToReturn\r\n }\r\n\r\n return ~~(convertLocalToNyTime(dateToReturn, false).getTime() / 1000)\r\n}\r\n","import Spine from '@finviz/spine'\r\n\r\nimport { ChartSyncablePart } from '../chart/contstants'\r\nimport Pane from '../pane'\r\nimport { roundTimeForSyncedPane } from './mouse-utils'\r\n\r\nexport class Mouse extends Spine.Model {\r\n static initClass() {\r\n this.configure('Mouse', 'position')\r\n this.belongsTo('pane', Pane)\r\n }\r\n\r\n declare position: { x: number; y: number } | undefined\r\n declare pane: () => Pane | null\r\n\r\n getIsCrossSyncOn = () => !!this.pane()?.chart().getIsChartPartInSync(ChartSyncablePart.Crosshair)\r\n\r\n getIsMouseInChartOfPane = (pane: Pane) => !!this.pane()?.chart().eql(pane.chart())\r\n\r\n getShouldRenderCrossInPane = (pane: Pane) => this.getIsCrossSyncOn() || this.getIsMouseInChartOfPane(pane)\r\n\r\n getCrossIndexForPane = (pane: Pane) => {\r\n if (this.position) {\r\n if (this.getIsMouseInChartOfPane(pane)) {\r\n return Math.round(this.position.x)\r\n }\r\n const paneOfMouse = this.pane()\r\n if (this.getIsCrossSyncOn() && paneOfMouse) {\r\n const mouseInChart = paneOfMouse.chart()\r\n const currentPaneChart = pane.chart()\r\n const mousePositionTimestamp = mouseInChart.quote().getTimestampFomPositionX(Math.round(this.position.x))\r\n const currentPanePositionX = currentPaneChart.quote().getPositionXFromTimestamp(\r\n roundTimeForSyncedPane({\r\n sourceChart: mouseInChart,\r\n targetChart: currentPaneChart,\r\n timestamp: mousePositionTimestamp,\r\n })\r\n )\r\n return Math.floor(currentPanePositionX)\r\n }\r\n }\r\n\r\n return Number.NaN\r\n }\r\n\r\n getPriceForPane = (pane: Pane) => {\r\n const positionY = this.position?.y ?? null\r\n\r\n if (this.pane()?.eql(pane)) {\r\n return positionY\r\n }\r\n\r\n if (this.getIsCrossSyncOn() && this.pane()) {\r\n const mousePaneIndex = this.pane()?.getIndexInChart()\r\n const currentPaneIndex = pane.getIndexInChart()\r\n return mousePaneIndex === currentPaneIndex ? positionY : null\r\n }\r\n\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Mouse is a singleton, so `initClass` must be called before we create the instance\r\n * otherwise it wouldn’t work\r\n */\r\nMouse.initClass()\r\n\r\nconst mouse = Mouse.create()\r\nmouse.save()\r\n\r\nexport default mouse as Mouse\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport { Position, TodoObjectHashAnyType } from '../../types/shared'\r\nimport CanvasElement from '../canvas/element'\r\nimport { ChartEventBadgeType, PANE_HEIGHT_DEFAULT } from '../constants/common'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport Element from './element'\r\nimport { rebuildElementZIndexes } from './utils'\r\n\r\nexport interface ScaleAxis {\r\n (index: number): number\r\n invert: (x: number) => number\r\n domain: () => [currentDomainMax: number, currentDomainMin: number]\r\n width: (x: number) => number\r\n height: (y: number) => number\r\n ticks: (y: number) => number[]\r\n}\r\n\r\nconst CHART_EVENT_BADGE_TYPE_ORDER = [\r\n ChartEventBadgeType.Split,\r\n ChartEventBadgeType.Dividends,\r\n ChartEventBadgeType.EarningsPositive,\r\n ChartEventBadgeType.EarningsNegative,\r\n ChartEventBadgeType.EarningsNeutral,\r\n ChartEventBadgeType.EarningsFuture,\r\n]\r\n\r\nclass Pane extends Spine.Model {\r\n static initClass(\r\n elementModel: typeof Element,\r\n chartEventElementModel: typeof ChartEventElement,\r\n chartModel: typeof Chart\r\n ) {\r\n this.configure('Pane', 'height', 'scale', 'scaleRange', 'instance', 'selection')\r\n this.hasMany('elements', elementModel)\r\n this.hasMany('chartEvents', chartEventElementModel)\r\n this.belongsTo('mainElement', elementModel)\r\n this.belongsTo('chart', chartModel)\r\n }\r\n\r\n declare id: string\r\n declare chart_id: string\r\n declare height: number\r\n declare scale: {\r\n x: ScaleAxis\r\n y: ScaleAxis\r\n }\r\n\r\n declare instance: any\r\n declare chart: () => Chart\r\n declare mainElement: () => T | null\r\n declare elements: () => Collection\r\n declare chartEvents: () => Collection\r\n selection: CanvasElement | null = null\r\n scaleRange: { min: number; max: number } | null = null\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.elements()\r\n .all()\r\n .forEach((element) => {\r\n element.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n toObject() {\r\n const elements = this.elements()\r\n .all()\r\n .map((el) => el.toObject())\r\n return {\r\n height: this.height,\r\n scale: this.scale,\r\n scaleRange: this.scaleRange,\r\n elements,\r\n }\r\n }\r\n\r\n toConfig(omitKeys = [] as string[]) {\r\n const elements = this.elements()\r\n .all()\r\n .map((el) => el.toConfig())\r\n return omit(\r\n {\r\n height: this.height,\r\n scaleRange: this.scaleRange,\r\n elements,\r\n },\r\n omitKeys\r\n )\r\n }\r\n\r\n move(direction: Position) {\r\n const chartPanes = this.chart().getAllPanes()\r\n const chartPane = chartPanes.find((pane) => !pane.getIsIndicatorPane())\r\n const targetPane = chartPanes.find((pane) => this.eql(pane))\r\n\r\n if (!chartPane || !targetPane) return\r\n\r\n const currentChartPaneRecords = Pane.records.filter((pane) => pane.chart_id === targetPane.chart_id)\r\n const ohterChartPaneRecords = Pane.records.filter((pane) => pane.chart_id !== targetPane.chart_id)\r\n\r\n const targetRecordIndex = currentChartPaneRecords.findIndex((record) => record.id === targetPane.id)\r\n const arrayWithoutTargetRecord = currentChartPaneRecords.filter((_, index) => index !== targetRecordIndex)\r\n const chartRecordIndex = arrayWithoutTargetRecord.findIndex((record) => record.id === chartPane.id)\r\n\r\n const panesAbove = arrayWithoutTargetRecord.slice(0, chartRecordIndex)\r\n const panesBelow = arrayWithoutTargetRecord.slice(chartRecordIndex + 1)\r\n if (direction === Position.Above) {\r\n panesAbove.push(currentChartPaneRecords[targetRecordIndex])\r\n panesAbove.sort((a, b) => a.getNumericId() - b.getNumericId())\r\n }\r\n if (direction === Position.Below) {\r\n panesBelow.push(currentChartPaneRecords[targetRecordIndex])\r\n panesBelow.sort((a, b) => a.getNumericId() - b.getNumericId())\r\n }\r\n\r\n Pane.records = ohterChartPaneRecords.concat([\r\n ...panesAbove,\r\n arrayWithoutTargetRecord[chartRecordIndex],\r\n ...panesBelow,\r\n ])\r\n this.chart().trigger('change', this.chart())\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.chart().chart_layout())\r\n }\r\n\r\n getAllElements() {\r\n return this.elements()\r\n .all()\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n }\r\n\r\n getAllChartEvents(isSorted = true) {\r\n const chartEvents = [...this.chartEvents().all()]\r\n return isSorted ? chartEvents.sort((a, b) => a.zIndex - b.zIndex) : chartEvents\r\n }\r\n\r\n getChartOrIndicatorElement() {\r\n return this.getAllElements().find((el) => el.isChart() || el.isIndicator()) ?? null\r\n }\r\n\r\n getIsIndicatorPane() {\r\n return !!this.mainElement()?.isIndicator()\r\n }\r\n\r\n getIsChartPane() {\r\n return !!this.mainElement()?.isChart()\r\n }\r\n\r\n resetHeight() {\r\n if (this.getIsIndicatorPane()) {\r\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.indicator)\r\n }\r\n if (this.getIsChartPane()) {\r\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.chart)\r\n }\r\n }\r\n\r\n getIndexInChart() {\r\n return this.chart()\r\n .getAllPanes()\r\n .findIndex((chartPane) => chartPane.eql(this))\r\n }\r\n\r\n getElementZIndexRange() {\r\n let max = -1\r\n let min = 1\r\n this.getAllElements().forEach((el) => {\r\n if (el.zIndex > max) {\r\n max = el.zIndex\r\n }\r\n if (el.zIndex < min) {\r\n min = el.zIndex\r\n }\r\n })\r\n return { min, max }\r\n }\r\n\r\n getBelowAboveZeroElements() {\r\n const allPaneElements = this.getAllElements()\r\n const elementsBelowZero: Element[] = []\r\n const elementsAboveZero: Element[] = []\r\n allPaneElements.forEach((el) => {\r\n if (el.zIndex < 0) {\r\n elementsBelowZero.push(el)\r\n }\r\n if (el.zIndex > 0) {\r\n elementsAboveZero.push(el)\r\n }\r\n })\r\n\r\n return { elementsBelowZero, elementsAboveZero }\r\n }\r\n\r\n normalizeZIndexes() {\r\n const { elementsBelowZero, elementsAboveZero } = this.getBelowAboveZeroElements()\r\n rebuildElementZIndexes({ elementsArray: elementsBelowZero, isBelowZero: true })\r\n rebuildElementZIndexes({ elementsArray: elementsAboveZero, isBelowZero: false })\r\n }\r\n\r\n getQuoteRawTicker() {\r\n return this.chart().getQuoteRawTicker()\r\n }\r\n\r\n getNumericId() {\r\n return Number(this.id.replace('c-', ''))\r\n }\r\n\r\n updateChartEventsZIndexes() {\r\n if (!this.scale || !this.scale.hasOwnProperty('x')) {\r\n return\r\n }\r\n\r\n const chartEvents = this.getAllChartEvents(false).sort(\r\n (a, b) => a.instance.attrs.positionTimestamps!.x - b.instance.attrs.positionTimestamps!.x\r\n )\r\n const hoveredChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isHovered)\r\n const openedChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isOpen)\r\n\r\n const hoveredTypeChartEventElements: ChartEventElement[] = []\r\n const openedTypeChartEventElements: ChartEventElement[] = []\r\n const nonActiveChartEventElements: ChartEventElement[] = []\r\n\r\n chartEvents.forEach((chartEvent, index) => {\r\n const chartEventsOnSameXPoint = chartEvents.filter(\r\n (chartEvent_B, i) =>\r\n i < index && Math.round(chartEvent.instance.attrs.x) === Math.round(chartEvent_B!.instance.attrs.x)\r\n )\r\n chartEvent.updateAttributes({ yIndex: chartEventsOnSameXPoint.length })\r\n const isHovered = chartEvent.instance === hoveredChartEvent?.instance\r\n const isOpened = chartEvent.instance === openedChartEvent?.instance\r\n const isHoveredType = chartEvent.instance.type === hoveredChartEvent?.instance.type\r\n const isOpenType = chartEvent.instance.type === openedChartEvent?.instance.type\r\n if (!isHovered || !isOpened) {\r\n if (isHoveredType) {\r\n hoveredTypeChartEventElements.push(chartEvent)\r\n } else if (isOpenType) {\r\n openedTypeChartEventElements.push(chartEvent)\r\n } else {\r\n nonActiveChartEventElements.push(chartEvent)\r\n }\r\n }\r\n })\r\n\r\n nonActiveChartEventElements.sort(\r\n (a, b) =>\r\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(a.instance.getChartEvenBadgeType()) -\r\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(b.instance.getChartEvenBadgeType())\r\n )\r\n\r\n const chartEventElements = [\r\n ...nonActiveChartEventElements,\r\n ...openedTypeChartEventElements,\r\n openedChartEvent,\r\n ...hoveredTypeChartEventElements,\r\n hoveredChartEvent,\r\n ].filter(Boolean)\r\n chartEventElements.forEach((chartEvent, index) => {\r\n chartEvent!.updateAttributes({ zIndex: index })\r\n })\r\n }\r\n}\r\n\r\nexport default Pane\r\n","import { ObjectHash, RequireByKey } from '../../types/shared'\r\n\r\ninterface HeikinAshiData {\r\n HAOpen: number[]\r\n HAClose: number[]\r\n}\r\n\r\ninterface QuoteValues {\r\n cachedAt: null | number\r\n dayToOffset: ObjectHash[]\r\n dateToIndex: ObjectHash[]\r\n heikinAshiData?: HeikinAshiData\r\n daysInQuote: Date[]\r\n}\r\n\r\ninterface QuoteCacheFunctionProps {\r\n cid: string\r\n key: keyof QuoteValues\r\n fetchedAt: number\r\n value: any\r\n}\r\n\r\nconst quoteCache = {} as ObjectHash\r\n\r\nexport function getCachedQuote({\r\n cid,\r\n key,\r\n fetchedAt,\r\n}: RequireByKey>, 'cid'>) {\r\n const quote = quoteCache[cid]\r\n if (quote?.cachedAt === fetchedAt && key) {\r\n return quote[key]\r\n } else if (!key) {\r\n return quote\r\n }\r\n return null\r\n}\r\n\r\nexport function setCachedQuote({\r\n cid,\r\n key,\r\n value,\r\n fetchedAt,\r\n}: Pick) {\r\n quoteCache[cid] = {\r\n ...(quoteCache[cid]?.cachedAt === fetchedAt ? quoteCache[cid] : {}),\r\n [key]: value,\r\n cachedAt: fetchedAt,\r\n } as QuoteValues\r\n}\r\n\r\nexport function deleteCachedQuote({ cid }: Pick) {\r\n delete quoteCache[cid]\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { isSameMonth, isSameWeek } from 'date-fns'\r\nimport queryString from 'query-string'\r\n\r\nimport { Instrument, ObjectHash, TodoObjectHashAnyType } from '../../types/shared'\r\nimport { ChartEventDbType, ChartEventType, IntradayTimeframeInterval, TIMEFRAME } from '../constants/common'\r\nimport type { ICOT } from '../indicators/cot'\r\nimport { dateFromUnixTimestamp, dateStringFromDate } from '../utils'\r\nimport { getIsAbortError } from '../utils/abort_controller'\r\nimport { getPositionXFromTimestamp, getTimestampFromPositionX } from '../utils/chart'\r\nimport { IDividends, IEarnings, ISplit } from '../utils/chart-events-utils'\r\nimport fetchApi, { NotFoundError } from '../utils/fetch_api'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport { QuoteFetchType, QuoteFetchTypeUrlOption, QuoteUrlOptions } from './quote/constants'\r\nimport { deleteCachedQuote, getCachedQuote, setCachedQuote } from './quoteCache'\r\nimport { getRawTickerForInstrument } from './utils'\r\n\r\nconst quoteRefreshChecksBeforeFullRefresh = 15\r\n\r\ntype TodoPattern = TodoObjectHashAnyType\r\n\r\nexport interface TickerTimeframesProps {\r\n ticker: string\r\n instrument: string\r\n timeframe: string\r\n}\r\n\r\ninterface QuoteFetchOptions {\r\n aftermarket?: boolean\r\n premarket?: boolean\r\n patterns?: boolean\r\n events?: boolean\r\n maxBars?: number\r\n}\r\n\r\ninterface QuoteInternalOptions {\r\n cachePredicate?: (quote: Quote) => boolean\r\n fetchNewDataOnCachedQuote?: boolean\r\n}\r\n\r\ninterface UrlOptions extends QuoteFetchOptions {\r\n ticker: string\r\n instrument: string\r\n timeframe: string\r\n}\r\n\r\ntype ChartEventDataRaw = Omit & { eventType: ChartEventDbType }\r\n\r\nexport interface DataResponse {\r\n COTs: COTData\r\n name: string\r\n ticker: string\r\n instrument: string\r\n interval: number\r\n timeframe: string\r\n open: number[]\r\n high: number[]\r\n low: number[]\r\n close: number[]\r\n date: number[]\r\n volume: number[]\r\n lastOpen: number\r\n lastHigh: number\r\n lastLow: number\r\n lastClose: number\r\n lastDate: number\r\n lastTime: string | null\r\n lastVolume: number\r\n dataId: string\r\n prevClose: number\r\n afterClose: number\r\n afterChange: number\r\n afterTime: string | null\r\n drawMinutesPerDay: number\r\n marketStartMinutes: number\r\n premarketLengthMinutes: number\r\n aftermarketLengthMinutes: number\r\n aftermarket: boolean\r\n premarket: boolean\r\n hasPatterns: boolean\r\n patterns: Array\r\n patternsMinRange: number\r\n patternsMaxRange: number\r\n relativeVolume: number\r\n isIntraday: boolean\r\n noNewData?: boolean\r\n chartEvents?: ChartEventDataRaw[]\r\n}\r\n\r\ninterface COTData {\r\n [code: string]: ICOT\r\n}\r\n\r\nconst emptyQuote = {\r\n open: [],\r\n high: [],\r\n low: [],\r\n close: [],\r\n volume: [],\r\n date: [],\r\n fetchedAt: -1,\r\n numberOfRefreshChecks: 0,\r\n isFetching: false,\r\n is404: false,\r\n COTs: undefined,\r\n name: undefined,\r\n drawMinutesPerDay: undefined,\r\n marketStartMinutes: undefined,\r\n premarketLengthMinutes: undefined,\r\n aftermarketLengthMinutes: undefined,\r\n patterns: [],\r\n patternsMinRange: undefined,\r\n patternsMaxRange: undefined,\r\n relativeVolume: undefined,\r\n lastOpen: undefined,\r\n lastHigh: undefined,\r\n lastLow: undefined,\r\n lastClose: undefined,\r\n lastVolume: undefined,\r\n dataId: undefined,\r\n lastDate: undefined,\r\n prevClose: undefined,\r\n afterClose: undefined,\r\n afterChange: undefined,\r\n chartEvents: [],\r\n}\r\n\r\ninterface ICacheAvailabilityCheckFunctionsArguments {\r\n quote: Quote\r\n options?: QuoteFetchOptions & QuoteInternalOptions\r\n}\r\n\r\nconst doesQuoteAndOptionsMatch = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\r\n !quote.premarket === !options?.premarket &&\r\n !quote.aftermarket === !options?.aftermarket &&\r\n !quote.hasPatterns === !options?.patterns &&\r\n // if options.events is false we can reuse quote with events\r\n (!options?.events || !!quote.events)\r\n\r\nconst doesQuoteAndFetchParamsMatch = ({\r\n quote,\r\n ticker,\r\n instrument,\r\n timeframe,\r\n}: {\r\n quote: Quote\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n}) => quote.ticker === ticker && quote.instrument === instrument && quote.timeframe === timeframe\r\n\r\n// either we don't care about matching uuid at all, or they have to match\r\nconst isSameOrNoChartUuid = ({ quote, uuid }: { quote: Quote; uuid?: string }) => !uuid || quote.chartUuid === uuid\r\n\r\nconst isCacheAllowed = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\r\n !options?.cachePredicate || options.cachePredicate(quote)\r\n\r\nconst isNotEmptyQuote = (quote: Quote) => quote.fetchedAt !== -1 || quote.isFetching\r\n\r\nexport type QuoteGetParams = {\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n options?: QuoteFetchOptions & QuoteInternalOptions\r\n abortController?: null | AbortController\r\n shouldUseCache?: boolean\r\n chartUuid?: string\r\n}\r\n\r\nfunction getChartEventsWithId({ ticker, chartEvents }: { ticker: string; chartEvents?: ChartEventDataRaw[] }) {\r\n return (\r\n chartEvents?.map((item) => {\r\n let eventType: ChartEventType\r\n switch (item.eventType) {\r\n case ChartEventDbType.Dividends:\r\n eventType = ChartEventType.Dividends\r\n break\r\n case ChartEventDbType.Split:\r\n eventType = ChartEventType.Split\r\n break\r\n case ChartEventDbType.Earnings:\r\n eventType = ChartEventType.Earnings\r\n break\r\n }\r\n return {\r\n ...item,\r\n elementId: `${ticker.toLowerCase()}-${item.eventType}-${item.dateTimestamp}`,\r\n eventType,\r\n }\r\n }) ?? []\r\n )\r\n}\r\n\r\nclass Quote extends Spine.Model {\r\n static initClass() {\r\n this.configure(\r\n 'Quote',\r\n 'ticker',\r\n 'name',\r\n 'instrument',\r\n 'timeframe',\r\n 'open',\r\n 'high',\r\n 'low',\r\n 'close',\r\n 'date',\r\n 'volume',\r\n 'lastOpen',\r\n 'lastHigh',\r\n 'lastLow',\r\n 'lastClose',\r\n 'lastDate',\r\n 'lastVolume',\r\n 'lastTime',\r\n 'dataId',\r\n 'prevClose',\r\n 'COTs',\r\n 'chartEvents',\r\n 'afterClose',\r\n 'afterChange',\r\n 'afterTime',\r\n 'drawMinutesPerDay',\r\n 'marketStartMinutes',\r\n 'premarketLengthMinutes',\r\n 'aftermarketLengthMinutes',\r\n 'aftermarket',\r\n 'premarket',\r\n 'events',\r\n 'hasPatterns',\r\n 'patterns',\r\n 'patternsMinRange',\r\n 'patternsMaxRange',\r\n 'relativeVolume',\r\n 'fetchedAt',\r\n 'isIntraday',\r\n 'interval',\r\n 'drawDays',\r\n 'barIndex',\r\n 'barToDataIndex',\r\n 'fetchingPromise',\r\n 'isFetching',\r\n 'wasFetchAborted',\r\n 'chartUuid',\r\n 'numberOfRefreshChecks',\r\n 'maxBars',\r\n 'ideaID',\r\n 'is404'\r\n )\r\n }\r\n\r\n static async get({\r\n ticker: tickerRaw,\r\n instrument,\r\n timeframe,\r\n options,\r\n abortController,\r\n shouldUseCache = true,\r\n chartUuid,\r\n }: QuoteGetParams): Promise {\r\n const ticker = tickerRaw.replace('@', '')\r\n const [quote] = shouldUseCache\r\n ? Quote.select(\r\n (q) =>\r\n doesQuoteAndFetchParamsMatch({ quote: q, ticker, instrument, timeframe }) &&\r\n isSameOrNoChartUuid({ quote: q, uuid: chartUuid }) &&\r\n isNotEmptyQuote(q) &&\r\n isCacheAllowed({ quote: q, options }) &&\r\n (q.instrument !== Instrument.Stock ||\r\n Number.isInteger(q.ideaID) ||\r\n doesQuoteAndOptionsMatch({ quote: q, options }))\r\n )\r\n : []\r\n\r\n if (quote) {\r\n if (quote.isFetching) {\r\n await quote.getResolvedFetchingPromise()\r\n } else if (options?.fetchNewDataOnCachedQuote) {\r\n await quote.fetchData({ fetchType: QuoteFetchType.NewerData, abortController })\r\n }\r\n return quote\r\n }\r\n\r\n const newQuote = Quote.create({\r\n ...emptyQuote,\r\n ticker,\r\n timeframe,\r\n instrument,\r\n chartUuid,\r\n maxBars: options?.maxBars,\r\n premarket: !!options?.premarket,\r\n aftermarket: !!options?.aftermarket,\r\n hasPatterns: !!options?.patterns,\r\n events: !!options?.events,\r\n })\r\n\r\n await newQuote.fetchData({ fetchType: QuoteFetchType.Refetch, abortController })\r\n\r\n return newQuote\r\n }\r\n\r\n static async getAll(tickersAndTimeframes: Array<{ ticker: string; instrument: Instrument; timeframe: TIMEFRAME }>) {\r\n // TODO: fetch in 1 request\r\n if (tickersAndTimeframes.length === 0) {\r\n return {}\r\n }\r\n\r\n try {\r\n await Promise.all(\r\n tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\r\n this.get({ ticker: ticker, instrument, timeframe })\r\n )\r\n )\r\n const data = tickersAndTimeframes.reduce(\r\n (accumulator, currentValue) => ({\r\n ...accumulator,\r\n [currentValue.ticker]: Quote.select(\r\n (q: Quote) =>\r\n q.ticker === currentValue.ticker &&\r\n q.instrument === currentValue.instrument &&\r\n q.timeframe === currentValue.timeframe\r\n )[0],\r\n }),\r\n {}\r\n )\r\n return data\r\n } catch (err) {\r\n // TODO: handle somehow\r\n }\r\n }\r\n\r\n declare ticker: string\r\n declare name: string\r\n declare instrument: Instrument\r\n declare interval: number\r\n declare timeframe: TIMEFRAME\r\n declare open: number[]\r\n declare high: number[]\r\n declare low: number[]\r\n declare close: number[]\r\n declare date: number[]\r\n declare volume: number[]\r\n declare lastOpen: number\r\n declare lastHigh: number\r\n declare lastLow: number\r\n declare lastClose: number\r\n declare lastDate: number\r\n declare lastVolume: number\r\n declare dataId: string\r\n declare prevClose: number\r\n declare COTs: COTData\r\n declare afterClose: number\r\n declare afterChange: number\r\n declare drawMinutesPerDay: number\r\n declare marketStartMinutes: number\r\n declare premarketLengthMinutes: number\r\n declare aftermarketLengthMinutes: number\r\n declare hasPatterns: boolean\r\n declare patterns: Array\r\n declare patternsMinRange: number\r\n declare patternsMaxRange: number\r\n declare relativeVolume: number\r\n declare isIntraday: boolean\r\n declare drawDays?: number\r\n declare barIndex: number[]\r\n /**\r\n * Array of length the same as number of bars\r\n *\r\n * If there's a gap and a bar index has no corresponding data index,\r\n * the last data index is used (or 0 if there's no last data index)\r\n *\r\n * @type {number[]}\r\n */\r\n declare barToDataIndex: number[]\r\n declare chartUuid?: string\r\n declare aftermarket: boolean\r\n declare premarket: boolean\r\n declare fetchedAt: number\r\n declare numberOfRefreshChecks: number\r\n declare isFetching: boolean\r\n declare fetchingPromise?: Promise\r\n declare wasFetchAborted: boolean\r\n declare maxBars?: number\r\n declare ideaID?: number\r\n declare is404?: boolean\r\n declare chartEvents: Array\r\n declare events?: boolean\r\n\r\n async fetchRequest({\r\n abortController,\r\n options = { type: QuoteFetchTypeUrlOption.New },\r\n }: {\r\n abortController?: null | AbortController\r\n options?: QuoteUrlOptions\r\n }) {\r\n let data: DataResponse | null = null\r\n let is404 = false\r\n let wasFetchAborted = false\r\n\r\n const fetchingPromise = fetchApi({\r\n location: this.getUrl(options),\r\n throwOnStatusCodes: [404],\r\n abortController,\r\n })\r\n\r\n this.updateAttributes({\r\n isFetching: true,\r\n fetchingPromise,\r\n })\r\n\r\n try {\r\n data = await fetchingPromise\r\n } catch (err) {\r\n if (getIsAbortError(err as Error)) {\r\n wasFetchAborted = true\r\n } else if (process.env.IS_E2E_TESTING) {\r\n throw new Error('Quote fetch error', { cause: err })\r\n }\r\n is404 = err instanceof NotFoundError\r\n // Ignore network/notfound errors\r\n }\r\n\r\n const shouldUseEmptyQuote = !data && !wasFetchAborted && options.type === QuoteFetchTypeUrlOption.New\r\n\r\n if (process.env.IS_E2E_TESTING && shouldUseEmptyQuote) {\r\n throw new Error('Quote fetch new fail', { cause: { options, is404, wasFetchAborted, data } })\r\n }\r\n\r\n this.updateAttributes({\r\n ...(shouldUseEmptyQuote ? emptyQuote : {}),\r\n is404,\r\n wasFetchAborted,\r\n isFetching: false,\r\n })\r\n\r\n return data\r\n }\r\n\r\n async isPossibleToFetchSequentialData({\r\n abortController,\r\n }: {\r\n abortController?: null | AbortController\r\n } = {}) {\r\n const data = await this.fetchRequest({ abortController })\r\n if (data && data.date.length > 0 && this.date.length > 0) {\r\n return this.date[this.date.length - 1] >= data.date[0]\r\n }\r\n return false\r\n }\r\n\r\n async fetchData({\r\n fetchType,\r\n abortController,\r\n }: {\r\n fetchType: QuoteFetchType\r\n abortController?: null | AbortController\r\n }) {\r\n let options: QuoteUrlOptions\r\n if (fetchType === QuoteFetchType.Refetch) {\r\n options = { type: QuoteFetchTypeUrlOption.New }\r\n } else if (fetchType === QuoteFetchType.NewerData) {\r\n options = { type: QuoteFetchTypeUrlOption.Newer }\r\n if ((this.numberOfRefreshChecks ?? 0) < quoteRefreshChecksBeforeFullRefresh) {\r\n options.dataId = this.dataId\r\n }\r\n } else {\r\n return\r\n }\r\n if (this.instrument === Instrument.Stock) {\r\n options.events = this.events == null ? true : this.events\r\n }\r\n\r\n const data = await this.fetchRequest({ abortController, options })\r\n\r\n if (!data || data.noNewData === true) {\r\n this.updateAttributes({\r\n numberOfRefreshChecks: (this.numberOfRefreshChecks ?? 0) + 1,\r\n })\r\n return\r\n }\r\n if (this.timeframe !== data.timeframe || this.ticker.toLowerCase() !== data.ticker?.toLowerCase()) {\r\n return\r\n }\r\n\r\n const newQuoteData = {\r\n COTs: data.COTs,\r\n name: data.name,\r\n open: data.open,\r\n high: data.high,\r\n low: data.low,\r\n close: data.close,\r\n volume: data.volume,\r\n date: data.date,\r\n drawMinutesPerDay: data.drawMinutesPerDay,\r\n marketStartMinutes: data.marketStartMinutes,\r\n premarketLengthMinutes: data.premarketLengthMinutes,\r\n aftermarketLengthMinutes: data.aftermarketLengthMinutes,\r\n patterns: data.patterns ?? [],\r\n patternsMinRange: data.patternsMinRange,\r\n patternsMaxRange: data.patternsMaxRange,\r\n relativeVolume: data.relativeVolume,\r\n lastOpen: data.lastOpen,\r\n lastHigh: data.lastHigh,\r\n lastLow: data.lastLow,\r\n lastClose: data.lastClose,\r\n lastVolume: data.lastVolume,\r\n dataId: data.dataId,\r\n lastDate: data.lastDate,\r\n lastTime: data.lastTime,\r\n prevClose: data.prevClose,\r\n afterClose: data.afterClose,\r\n afterChange: data.afterChange,\r\n afterTime: data.afterTime,\r\n numberOfRefreshChecks: 0,\r\n chartEvents: data.chartEvents ?? [],\r\n fetchedAt: Date.now(),\r\n }\r\n\r\n if (\r\n !(\r\n fetchType === QuoteFetchType.Refetch ||\r\n [Instrument.Futures, Instrument.Forex, Instrument.Crypto].includes(this.instrument)\r\n )\r\n ) {\r\n /*\r\n * Merges current and new data taking date as index\r\n */\r\n let AIndex = 0\r\n let BIndex = 0\r\n let mergeIndex = -1\r\n while (AIndex < this.date.length || BIndex < data.date.length) {\r\n const ADate = this.date[AIndex]\r\n const BDate = data.date[BIndex]\r\n if (BDate === undefined) {\r\n break\r\n } else if (ADate === BDate) {\r\n // Same date, update OHLCV\r\n this.open[AIndex] = data.open[BIndex]\r\n this.high[AIndex] = data.high[BIndex]\r\n this.low[AIndex] = data.low[BIndex]\r\n this.close[AIndex] = data.close[BIndex]\r\n this.volume[AIndex] = data.volume[BIndex]\r\n AIndex++\r\n BIndex++\r\n } else if (ADate > BDate || ADate === undefined) {\r\n // New bar for a date not yet in our dataset\r\n // If weekly or monthly timeframe & wasn't merged on AIndex\r\n if (mergeIndex === -1 && [TIMEFRAME.w, TIMEFRAME.m].includes(this.timeframe)) {\r\n const prevAIndex = AIndex - 1\r\n const prevDate = dateFromUnixTimestamp(this.date[prevAIndex])\r\n const newDate = dateFromUnixTimestamp(data.date[BIndex])\r\n // If merge bar for weekly is sameWeek or for monthly is sameMonth perform merge on AIndex\r\n if (\r\n (TIMEFRAME.w === this.timeframe && isSameWeek(prevDate, newDate, { weekStartsOn: 1 })) ||\r\n (TIMEFRAME.m === this.timeframe && isSameMonth(prevDate, newDate))\r\n ) {\r\n this.date[prevAIndex] = data.date[BIndex]\r\n this.open[prevAIndex] = data.open[BIndex]\r\n this.high[prevAIndex] = data.high[BIndex]\r\n this.low[prevAIndex] = data.low[BIndex]\r\n this.close[prevAIndex] = data.close[BIndex]\r\n this.volume[prevAIndex] = data.volume[BIndex]\r\n mergeIndex = prevAIndex\r\n // Incrementing BIndex only because we're mergin arrays on AIndex\r\n BIndex++\r\n continue\r\n }\r\n }\r\n this.date.splice(AIndex, 0, data.date[BIndex])\r\n this.open.splice(AIndex, 0, data.open[BIndex])\r\n this.high.splice(AIndex, 0, data.high[BIndex])\r\n this.low.splice(AIndex, 0, data.low[BIndex])\r\n this.close.splice(AIndex, 0, data.close[BIndex])\r\n this.volume.splice(AIndex, 0, data.volume[BIndex])\r\n // Incrementing AIndex because we're changing the array in-place\r\n AIndex++\r\n BIndex++\r\n } else if (ADate < BDate) {\r\n AIndex++\r\n } else {\r\n console.warn('fetchNewerData merge warning')\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData merge warning', {\r\n extra: {\r\n thisDateLength: this.date.length,\r\n dataDateLength: data.date.length,\r\n AIndex,\r\n BIndex,\r\n ADate,\r\n BDate,\r\n },\r\n })\r\n }\r\n }\r\n\r\n newQuoteData.date = this.date\r\n newQuoteData.open = this.open\r\n newQuoteData.high = this.high\r\n newQuoteData.low = this.low\r\n newQuoteData.close = this.close\r\n newQuoteData.volume = this.volume\r\n }\r\n\r\n const hasUpdatedSuccessfully = this.updateAttributes(newQuoteData)\r\n // https://github.com/finvizhq/charts/issues/510\r\n if (!hasUpdatedSuccessfully) {\r\n // attempt to find if this.model.quote() => null is comming from this.save() validation fail\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData save() validation failed', { extra: this })\r\n }\r\n if (!this) {\r\n // or this somehow became null / falsy\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData this is falsy', { extra: this })\r\n }\r\n this.trigger(fetchType, this, fetchType)\r\n }\r\n\r\n async getResolvedFetchingPromise() {\r\n try {\r\n return await this.fetchingPromise\r\n } catch {\r\n // do nothing\r\n }\r\n }\r\n\r\n fetchOlderData() {\r\n return // not yet implemented\r\n // TODO cancel previous request\r\n }\r\n\r\n load(atts: ObjectHash) {\r\n super.load(atts)\r\n const { fetchedAt = 0 } = atts\r\n const { cachedAt } = (getCachedQuote({ cid: this.cid }) as { cachedAt: number } | null) || {}\r\n if (this.timeframe && cachedAt !== fetchedAt) {\r\n setCachedQuote({ cid: this.cid, key: 'cachedAt', value: fetchedAt, fetchedAt })\r\n this.isIntraday = [\r\n TIMEFRAME.i1,\r\n TIMEFRAME.i2,\r\n TIMEFRAME.i3,\r\n TIMEFRAME.i5,\r\n TIMEFRAME.i10,\r\n TIMEFRAME.i15,\r\n TIMEFRAME.i30,\r\n TIMEFRAME.h,\r\n TIMEFRAME.h2,\r\n TIMEFRAME.h4,\r\n ].includes(this.timeframe)\r\n this.interval = this.isIntraday\r\n ? IntradayTimeframeInterval[this.timeframe as keyof typeof IntradayTimeframeInterval]\r\n : 0\r\n this.drawDays = this.getDrawDays()\r\n this.barIndex = this.getBarIndexes()\r\n this.patterns = this.patterns ?? []\r\n this.barToDataIndex = this.barIndex.flatMap((barIndex, index) => {\r\n const lastIndex = this.barIndex[index - 1] ?? -1\r\n return [...Array.from({ length: barIndex - lastIndex - 1 }).fill(Math.max(0, index - 1)), index] as number[]\r\n })\r\n }\r\n if (this.timeframe && this.ticker) {\r\n this.chartEvents = getChartEventsWithId({\r\n ticker: this.ticker,\r\n chartEvents: this.chartEvents as unknown as ChartEventDataRaw[],\r\n })\r\n }\r\n return this\r\n }\r\n\r\n destroy(options?: ObjectHash) {\r\n super.destroy(options)\r\n deleteCachedQuote({ cid: this.cid })\r\n return this\r\n }\r\n\r\n getDrawDays() {\r\n if (this.instrument !== Instrument.Stock) {\r\n return Infinity\r\n }\r\n switch (this.timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n case TIMEFRAME.i10:\r\n return 10\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n return 15\r\n default:\r\n break\r\n }\r\n }\r\n\r\n getHeikinAshiData() {\r\n const cachedHeikinAshiData = getCachedQuote({ cid: this.cid, key: 'heikinAshiData', fetchedAt: this.fetchedAt })\r\n if (cachedHeikinAshiData) {\r\n return cachedHeikinAshiData as unknown as { open: number[]; close: number[] }\r\n }\r\n\r\n const HAClose = this.open.map((_, i) => (this.open[i] + this.high[i] + this.close[i] + this.low[i]) / 4)\r\n const HAOpen = this.open.reduce(\r\n (acc, open, i) => [...acc, (i === 0 ? open + HAClose[0] : acc[i - 1] + HAClose[i - 1]) / 2],\r\n [] as number[]\r\n )\r\n\r\n const heikAshiData = { open: HAOpen, close: HAClose }\r\n\r\n setCachedQuote({ cid: this.cid, key: 'heikinAshiData', value: heikAshiData, fetchedAt: this.fetchedAt })\r\n\r\n return heikAshiData\r\n }\r\n\r\n getDayToOffset(): ObjectHash {\r\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'dayToOffset', fetchedAt: this.fetchedAt })\r\n if (cachedDayToOffset) {\r\n return cachedDayToOffset as unknown as ObjectHash\r\n }\r\n const dayToOffset: ObjectHash = {}\r\n let day = 0\r\n let lastDay\r\n for (let i = 0, end = this.date.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const date = dateFromUnixTimestamp(this.date[i])\r\n const dateString = dateStringFromDate(date)\r\n if (dateString !== lastDay) {\r\n dayToOffset[dateString] = day\r\n day++\r\n lastDay = dateString\r\n }\r\n }\r\n // for ofscreen renderer we need to add lastDate to have correct dayToOffset because if\r\n // premarket=false in fetch query there isn't other way to distinguish that\r\n if (getIsSSr() && this.lastDate) {\r\n // YYYYMMDD / 20211118 => YYYY-MM-DD\r\n const [yyyy, mm, dd] = [~~(this.lastDate / 10000), ~~(this.lastDate / 100) % 100, this.lastDate % 100]\r\n const lastDate = `${yyyy}-${String(mm).padStart(2, '0')}-${String(dd).padStart(2, '0')}`\r\n\r\n if (lastDay !== lastDate) {\r\n dayToOffset[lastDate] = day\r\n }\r\n }\r\n\r\n setCachedQuote({ cid: this.cid, key: 'dayToOffset', value: dayToOffset, fetchedAt: this.fetchedAt })\r\n return dayToOffset\r\n }\r\n\r\n getDaysInQuote() {\r\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'daysInQuote', fetchedAt: this.fetchedAt })\r\n if (cachedDayToOffset) {\r\n return cachedDayToOffset as unknown as Date[]\r\n }\r\n const dayToOffset = this.getDayToOffset()\r\n const daysInQuote = Object.keys(dayToOffset)\r\n .map((dateString) => {\r\n const [year, month, day] = dateString.split('-')\r\n return new Date(Number.parseInt(year), Number.parseInt(month) - 1, Number.parseInt(day))\r\n })\r\n .sort((a, b) => a.getTime() - b.getTime())\r\n\r\n setCachedQuote({ cid: this.cid, key: 'daysInQuote', value: daysInQuote, fetchedAt: this.fetchedAt })\r\n return daysInQuote\r\n }\r\n\r\n getBarIndexes() {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return Array.from({ length: this.date.length }).map((_, index) => index)\r\n }\r\n\r\n const barIndex = []\r\n const dayToOffset = this.getDayToOffset()\r\n\r\n for (let i = 0; i < this.date.length; i += 1) {\r\n const date = dateFromUnixTimestamp(this.date[i])\r\n let x = Math.ceil((date.getHours() * 60 + date.getMinutes() - this.marketStartMinutes) / this.interval)\r\n x += dayToOffset[dateStringFromDate(date)] * this.getBarsInDay()! // add days\r\n barIndex[i] = x\r\n }\r\n\r\n return barIndex\r\n }\r\n\r\n getBarIndex(i: number) {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return i\r\n }\r\n return this.barIndex[i]\r\n }\r\n\r\n getBarsInDay() {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return\r\n }\r\n return Math.ceil(this.drawMinutesPerDay / this.interval)\r\n }\r\n\r\n getDataIndexByBarIndex(index: number) {\r\n if (this.barIndex) {\r\n for (let i = 0; i < this.barIndex.length; i++) {\r\n if (this.barIndex[i] === index) {\r\n return i\r\n }\r\n }\r\n }\r\n return -1\r\n }\r\n\r\n getDataByBarIndex(key: keyof Quote, index: number) {\r\n const dataIndex = this.getDataIndexByBarIndex(index)\r\n if (dataIndex > -1) {\r\n const quoteData = this[key as keyof Quote]! as number[]\r\n return quoteData[dataIndex] ?? null\r\n }\r\n return null\r\n }\r\n\r\n getDateToIndex() {\r\n const cachedDateToIndex = getCachedQuote({ cid: this.cid, key: 'dateToIndex', fetchedAt: this.fetchedAt })\r\n if (cachedDateToIndex) {\r\n return cachedDateToIndex as unknown as ObjectHash\r\n }\r\n const dateToIndex: ObjectHash = {}\r\n for (let i = 0; i < this.date.length; i++) {\r\n dateToIndex[this.date[i]] = i\r\n }\r\n setCachedQuote({ cid: this.cid, key: 'dateToIndex', value: dateToIndex, fetchedAt: this.fetchedAt })\r\n return dateToIndex\r\n }\r\n\r\n getTimestampFomPositionX(positionX: number) {\r\n if (this.date.length === 0) {\r\n return 0\r\n }\r\n return getTimestampFromPositionX({\r\n positionX,\r\n quote: this,\r\n })\r\n }\r\n\r\n getPositionXFromTimestamp(timestamp: number) {\r\n if (this.date.length === 0) {\r\n return 0\r\n }\r\n return getPositionXFromTimestamp({\r\n timestamp,\r\n quote: this,\r\n })\r\n }\r\n\r\n getUrl(options: QuoteUrlOptions) {\r\n const config: UrlOptions = {\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n timeframe: this.timeframe || 'd1',\r\n aftermarket: this.aftermarket,\r\n premarket: this.premarket,\r\n patterns: this.hasPatterns,\r\n maxBars: this.maxBars,\r\n ...options,\r\n }\r\n\r\n const isStock = config.instrument === Instrument.Stock\r\n const isBrowserElite = !getIsSSr() && document.location.host === 'elite.finviz.com'\r\n let domain = isBrowserElite && isStock ? 'https://api.finviz.com' : ''\r\n\r\n if (getIsSSr()) {\r\n domain = process.env.BE_API_URL!\r\n }\r\n\r\n return `${domain}/api/quote.ashx?${queryString.stringify({ rev: Date.now(), ...config })}`\r\n }\r\n\r\n getRawTicker() {\r\n return getRawTickerForInstrument(this.instrument, this.ticker)\r\n }\r\n\r\n clearData() {\r\n this.updateAttributes(emptyQuote)\r\n }\r\n}\r\n\r\nQuote.initClass()\r\n\r\nexport default Quote\r\n","export enum QuoteFetchType {\r\n Refetch = 'refetch',\r\n NewerData = 'newerData',\r\n}\r\n\r\nexport enum QuoteFetchTypeUrlOption {\r\n New = 'new',\r\n Newer = 'newer',\r\n}\r\n\r\nexport interface QuoteUrlOptions {\r\n type: QuoteFetchTypeUrlOption\r\n dataId?: string\r\n events?: boolean\r\n}\r\n","export const largeChartFontSize = {\r\n S: 8,\r\n M: 10,\r\n XXL: 16,\r\n XXXL: 24,\r\n}\r\n","import { Theme } from '../../../types/shared'\r\nimport {\r\n CHART_MARGIN,\r\n FONT_SIZE,\r\n LINE_HEIGHT,\r\n OFFSET,\r\n PADDING,\r\n SETTINGS_HEIGHT,\r\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\r\n TextBaseline,\r\n} from '../../constants/common'\r\nimport {\r\n chartDarkTheme,\r\n chartLightTheme,\r\n elementDarkTheme,\r\n elementLightTheme,\r\n generalColors,\r\n indicatorDarkTheme,\r\n indicatorLightTheme,\r\n} from '../constants'\r\nimport { ISettings } from './interfaces'\r\n\r\nexport const INTERACTIVE_CHART_SETTINGS = (theme: Theme): ISettings => ({\r\n ChartSettings: {\r\n general: {\r\n Colors: {\r\n ...(theme === Theme.light ? chartLightTheme : chartDarkTheme),\r\n [Theme.light]: chartLightTheme,\r\n [Theme.dark]: chartDarkTheme,\r\n },\r\n settingsHeight: SETTINGS_HEIGHT,\r\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 1,\r\n border: 1,\r\n },\r\n top: {\r\n height: CHART_MARGIN.XL,\r\n baseline: TextBaseline.alphabetic,\r\n ticker: {\r\n margin: {\r\n top: 30,\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.XXXL,\r\n style: 'bold',\r\n },\r\n },\r\n ohlc: {\r\n margin: {\r\n top: 30,\r\n left: 30,\r\n right: 30,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n change: {\r\n margin: {\r\n top: 30,\r\n right: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n style: 'bold',\r\n },\r\n },\r\n },\r\n right: {\r\n width: CHART_MARGIN.XXL,\r\n axis: {\r\n margin: {\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n lineHeight: LINE_HEIGHT.S,\r\n padding: {\r\n top: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n right: PADDING.XXS,\r\n },\r\n },\r\n },\r\n },\r\n bottom: {\r\n height: CHART_MARGIN.M,\r\n baseline: TextBaseline.top,\r\n axis: {\r\n margin: {\r\n top: 8,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n },\r\n left: {\r\n width: CHART_MARGIN.L,\r\n overlayLabel: {\r\n labelSpacing: 12,\r\n margin: {\r\n top: -8,\r\n left: 6,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n weight: 'bold',\r\n },\r\n },\r\n timeframe: {\r\n margin: {\r\n top: 0,\r\n left: 28,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n weight: '900',\r\n family: 'Lato, sans-serif',\r\n },\r\n },\r\n volumeAxis: {\r\n margin: {\r\n left: 33,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n },\r\n },\r\n IndicatorSettings: {\r\n general: {\r\n height: 140,\r\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 2,\r\n border: 1,\r\n },\r\n top: {\r\n height: CHART_MARGIN.S,\r\n },\r\n right: {\r\n width: CHART_MARGIN.XXL,\r\n axis: {\r\n margin: {\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n lineHeight: LINE_HEIGHT.S,\r\n padding: {\r\n top: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n right: PADDING.XXS,\r\n },\r\n },\r\n },\r\n },\r\n bottom: {\r\n height: CHART_MARGIN.S,\r\n },\r\n left: {\r\n width: CHART_MARGIN.L,\r\n indicatorLabel: {\r\n labelSpacing: 4,\r\n margin: {\r\n top: OFFSET.S,\r\n left: OFFSET.M,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n style: 'bold',\r\n lineHeight: LINE_HEIGHT.M,\r\n },\r\n },\r\n },\r\n },\r\n MarketSentimentSettings: {\r\n general: {\r\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 1,\r\n border: 1,\r\n },\r\n top: {\r\n height: 0,\r\n },\r\n bottom: {\r\n height: 12,\r\n },\r\n left: {\r\n width: 0,\r\n },\r\n right: {\r\n width: 30,\r\n },\r\n },\r\n ColorsSettings: generalColors,\r\n ThumbSettings: {\r\n size: 8,\r\n touchSize: 16,\r\n color: '#ddd',\r\n borderWidth: 1,\r\n borderColor: '#999',\r\n },\r\n ElementSettings: {\r\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\r\n defaultFill: '#1e6dc066',\r\n defaultTransparentFill: '#1e6dc000',\r\n },\r\n})\r\n","import merge from 'lodash.merge'\r\n\r\nimport { ChartConfigChart } from '../../server/chartConfig'\r\nimport { Instrument, ObjectHash, Theme } from '../../types/shared'\r\nimport { SpecificChartFunctionality } from '../constants/common'\r\nimport Utils, { isRedesignedPage } from '../utils'\r\nimport LayoutModel from './chart_layout'\r\nimport { getColorOverwrites } from './chart_settings'\r\nimport { largeChartFontSize } from './chart_settings/constants'\r\nimport { INTERACTIVE_CHART_SETTINGS } from './chart_settings/interactive_chart_settings'\r\nimport { ISettings } from './chart_settings/interfaces'\r\nimport {\r\n IChartThemeColors,\r\n chartDarkTheme,\r\n chartLightTheme,\r\n elementDarkTheme,\r\n elementLightTheme,\r\n indicatorDarkTheme,\r\n indicatorLightTheme,\r\n} from './constants'\r\n\r\ninterface Config {\r\n theme: Theme\r\n barMargin?: number\r\n barWidth?: number\r\n border?: number\r\n charts?: ChartConfigChart[]\r\n colorsOverride?: Array\r\n volumeHeight?: number\r\n colors?: ObjectHash, Theme>\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n isOurSiteRequest?: boolean\r\n}\r\n\r\nexport function getSettings(config: Config, chartSettings?: ISettings): ISettings {\r\n const settings = merge({}, chartSettings ?? INTERACTIVE_CHART_SETTINGS(config.theme))\r\n\r\n if (config.barWidth != null) {\r\n settings.ChartSettings.center.barWidth = config.barWidth\r\n settings.IndicatorSettings.center.barWidth = config.barWidth\r\n }\r\n if (config.barMargin != null) {\r\n settings.ChartSettings.center.barMargin = config.barMargin\r\n settings.IndicatorSettings.center.barMargin = config.barMargin\r\n }\r\n if (config.border != null) {\r\n settings.ChartSettings.center.border = config.border\r\n settings.IndicatorSettings.center.border = config.border\r\n }\r\n if (config.colorsOverride) {\r\n settings.ColorsSettings = config.colorsOverride\r\n }\r\n if (config.volumeHeight) {\r\n settings.ChartSettings.center.volumeHeight = config.volumeHeight\r\n }\r\n if (config.colors) {\r\n const settingColors = settings.ChartSettings.general.Colors\r\n settings.ChartSettings.general.Colors = {\r\n ...settingColors,\r\n [Theme.light]: {\r\n ...settingColors[Theme.light],\r\n ...getColorOverwrites({ theme: Theme.light, colors: config.colors }),\r\n },\r\n [Theme.dark]: {\r\n ...settingColors[Theme.dark],\r\n ...getColorOverwrites({ theme: Theme.dark, colors: config.colors }),\r\n },\r\n }\r\n }\r\n if (config.specificChartFunctionality === SpecificChartFunctionality.chartPage && Utils.isMobile()) {\r\n settings.ChartSettings.left.width = 0\r\n settings.ChartSettings.top.ticker.margin.left = settings.ChartSettings.left.overlayLabel.margin.left\r\n settings.IndicatorSettings.left.width = 0\r\n }\r\n if (SpecificChartFunctionality.chartPage === config.specificChartFunctionality || isRedesignedPage(config)) {\r\n settings.ChartSettings.top.height = 10\r\n }\r\n\r\n if (config.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n const isGroupInstrument = config.charts?.some(({ instrument }) => instrument === Instrument.Group)\r\n if (isGroupInstrument) {\r\n settings.ChartSettings.top.ohlc.margin.top = 4\r\n settings.ChartSettings.top.ticker.margin.top = 0\r\n settings.ChartSettings.top.ticker.font = {\r\n size: largeChartFontSize.XXL,\r\n style: 'bold',\r\n }\r\n settings.ChartSettings.left.timeframe.margin.top = 12\r\n settings.ChartSettings.left.timeframe.font = {\r\n size: largeChartFontSize.S,\r\n style: 'bold',\r\n }\r\n }\r\n }\r\n\r\n if (config.isOurSiteRequest !== undefined) {\r\n settings.isOurSiteRequest = config.isOurSiteRequest\r\n }\r\n\r\n return settings\r\n}\r\n\r\nexport function updateSettings(chart_layout: LayoutModel, theme: string): ISettings {\r\n const settings = merge({}, chart_layout.settings)\r\n const isLight = theme === Theme.light\r\n settings.MarketSentimentSettings.general.Colors = isLight ? { ...chartLightTheme } : { ...chartDarkTheme }\r\n settings.IndicatorSettings.general.Colors = isLight ? { ...indicatorLightTheme } : { ...indicatorDarkTheme }\r\n settings.ElementSettings.Colors = isLight ? { ...elementLightTheme } : { ...elementDarkTheme }\r\n\r\n return settings\r\n}\r\n\r\nexport function getChartLayoutSettings(chart_layout: LayoutModel): ISettings {\r\n const settings = chart_layout.settings\r\n\r\n return {\r\n ...settings,\r\n ChartSettings: {\r\n ...settings.ChartSettings,\r\n general: {\r\n ...settings.ChartSettings.general,\r\n Colors: {\r\n ...settings.ChartSettings.general.Colors,\r\n ...settings.ChartSettings.general.Colors[chart_layout.theme],\r\n },\r\n },\r\n },\r\n }\r\n}\r\n","import { Instrument } from '../../types/shared'\r\nimport ChartLayoutModel from './chart_layout'\r\nimport Element from './element'\r\n\r\nexport const handleRemoveIndicatorPane = ({\r\n paneIndex,\r\n chartLayoutModel,\r\n}: {\r\n paneIndex: number\r\n chartLayoutModel: ChartLayoutModel\r\n}) => {\r\n const charts = chartLayoutModel.getAllCharts()\r\n charts.forEach((chart) => chart.getAllPanes()[paneIndex].destroyCascade())\r\n}\r\n\r\nexport function getNormalizedZIndex({ index, isBelowZero }: { index: number; isBelowZero: boolean }) {\r\n return (index + 1) * (isBelowZero ? -1 : 1)\r\n}\r\n\r\nexport function rebuildElementZIndexes({\r\n elementsArray,\r\n isBelowZero,\r\n}: {\r\n elementsArray: Element[]\r\n isBelowZero: boolean\r\n}) {\r\n const elements = isBelowZero ? [...elementsArray].reverse() : elementsArray\r\n elements.forEach((element, index) => {\r\n const newZIndex = getNormalizedZIndex({ index, isBelowZero })\r\n if (newZIndex !== element.zIndex) {\r\n element.updateAttributes({ zIndex: newZIndex })\r\n }\r\n })\r\n}\r\n\r\nexport function changeElementZIndexes({\r\n elementsArray,\r\n addElement,\r\n oldZIndex,\r\n newZIndex,\r\n isBelowZero = false,\r\n}: {\r\n elementsArray: Element[]\r\n addElement: Element | undefined\r\n oldZIndex: number\r\n newZIndex: number\r\n isBelowZero?: boolean\r\n}) {\r\n const array = isBelowZero ? [...elementsArray].reverse() : elementsArray\r\n const elements =\r\n elementsArray.length === 0 && addElement\r\n ? [...array, addElement]\r\n : array\r\n .filter((_, index) => getNormalizedZIndex({ index, isBelowZero }) !== oldZIndex)\r\n .flatMap((el, index) =>\r\n getNormalizedZIndex({ index, isBelowZero }) === newZIndex && addElement ? [addElement, el] : el\r\n )\r\n\r\n // If there are only 2 drawings and we move a drawing from index 1 to index 2 to have to push it to the array because it's the last element and it didn't get into the array in the flatMap above\r\n if (elements.length < Math.abs(newZIndex) && addElement) {\r\n elements.push(addElement)\r\n }\r\n\r\n rebuildElementZIndexes({ elementsArray: isBelowZero ? [...elements].reverse() : elements, isBelowZero })\r\n}\r\n\r\nexport function getRawTickerForInstrument(instrument: Instrument, ticker: string) {\r\n return `${\r\n [Instrument.Crypto, Instrument.Forex, Instrument.Futures].includes(instrument) && !ticker.includes('@') ? '@' : ''\r\n }${ticker}`\r\n}\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n deviations: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n stdDev: number[]\r\n upperBand: number[]\r\n lowerBand: number[]\r\n}\r\n\r\nexport class BbCalculation extends MainCalculation {\r\n static type = OverlayType.Bb\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n sma: [],\r\n stdDev: [],\r\n upperBand: [],\r\n lowerBand: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period, deviations } = this.options\r\n const { close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sum = 0\r\n for (let i = 0; i < period; i++) {\r\n sum += close[i]\r\n }\r\n for (let i = period; i < close.length; i++) {\r\n sum = sum - close[i - period] + close[i]\r\n this.calculatedValues.sma[i] = sum / period\r\n\r\n let stdDevSum = 0\r\n for (let j = i - period + 1; j <= i; j++) {\r\n stdDevSum += Math.pow(close[j] - this.calculatedValues.sma[i], 2)\r\n }\r\n this.calculatedValues.stdDev[i] = Math.sqrt(stdDevSum / period)\r\n\r\n this.calculatedValues.upperBand[i] = this.calculatedValues.sma[i] + this.calculatedValues.stdDev[i] * deviations\r\n this.calculatedValues.lowerBand[i] = this.calculatedValues.sma[i] - this.calculatedValues.stdDev[i] * deviations\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n ChartConfigChartPaneElement,\r\n IModalConfig,\r\n IModalConfigInput,\r\n ObjectHash,\r\n RequireByKey,\r\n} from '../../types/shared'\r\nimport Element from '../canvas/element'\r\nimport BaseChart from '../charts/base_chart'\r\nimport { OverlayType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\nimport { convertColorToHEX, getRGBAValueFromValidColorString } from '../utils/colors'\r\nimport { getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\r\n\r\nexport interface IOverlayIsValid {\r\n getIsValid(key: string): boolean | void\r\n}\r\n\r\nconst DEFAULT_LABEL_COLOR = '#0587cd'\r\n\r\nclass Overlay extends Element implements IOverlayIsValid {\r\n static type = OverlayType.Overlay\r\n static label = 'Overlay'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt] = getParsedIntegersFromPeriodString(period)\r\n return periodInt\r\n }\r\n\r\n declare data: Quote\r\n declare chart: BaseChart\r\n\r\n get type() {\r\n return (this.constructor as typeof Overlay).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Overlay).label\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.color ? convertColorToHEX(this.attrs.color) : DEFAULT_LABEL_COLOR\r\n }\r\n\r\n getFreeColor() {\r\n return this.getChartLayoutSettings().ColorsSettings[0]\r\n // TODO proper implementation - example how this could be done:\r\n // let colorsUsed = []\r\n // for (let overlay of this.chart.overlays) {\r\n // let object = overlay.getModalConfig().inputs\r\n // for (let _ in object) {\r\n // let input = object[_]\r\n // if (input.type === 'color') {\r\n // colorsUsed.push(input.value)\r\n // }\r\n // }\r\n // }\r\n // for (let color of colors) {\r\n // if (!colorsUsed.includes(color)) {\r\n // return color\r\n // }\r\n // }\r\n // return colors[0]\r\n }\r\n\r\n renderContent(_?: RenderingContext2DType) {\r\n this.data = this.model.chart().quote()\r\n }\r\n\r\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\r\n\r\n getIsValid(_: string): boolean | undefined {\r\n throw Error('Implement')\r\n }\r\n\r\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\r\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\r\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\r\n }\r\n\r\n isRendered() {\r\n return true\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return this.isRendered()\r\n }\r\n\r\n getModalConfig(): IModalConfig {\r\n return {\r\n title: '',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toConfig() {\r\n const colors: string[] = []\r\n const periods: string[] = []\r\n\r\n this.getModalConfig().inputs.forEach((input: IModalConfigInput) => {\r\n if (input.type === 'color') {\r\n colors.push(getRGBAValueFromValidColorString(input.value.toString()))\r\n } else {\r\n periods.push(input.value.toString())\r\n }\r\n })\r\n\r\n return { type: this.type, period: periods.join(','), color: colors.join('|') }\r\n }\r\n}\r\n\r\nexport default Overlay\r\n","import { ChartConfigChartPaneElement, RequireByKey, Theme } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { BbCalculation } from '../indicator-calculation/bb'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\nconst BB_COLORS = {\r\n [Theme.light]: {\r\n TOP: '#D386DF',\r\n BOTTOM: '#69C1EA',\r\n MIDDLE: '#CFD2F2',\r\n },\r\n [Theme.dark]: {\r\n TOP: '#D38BFB',\r\n BOTTOM: '#57AEFB',\r\n MIDDLE: '#E1B6FC',\r\n },\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 20,\r\n Deviations: 2.0,\r\n}\r\n\r\ninterface Attrs {\r\n period: number | string\r\n deviations: number\r\n topColor?: string\r\n bottomColor?: string\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const deviations = parseFloat(values[1]) || DEFAULT_PARAMETERS.Deviations\r\n\r\n return [period, deviations]\r\n}\r\n\r\nclass BollingerBands extends Overlay {\r\n static type = OverlayType.Bb\r\n static label = 'Bollinger Bands'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, deviations] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.deviations = deviations\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (typeof this.attrs.period !== 'number') {\r\n return\r\n }\r\n super.renderContent()\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n const theme = this.model.chart().chart_layout().theme as Theme\r\n const { leftOffset, width } = this.model.chart()\r\n const [top, bottom] = this.model.scale.y.domain()\r\n const scaledTop = this.fy(top)\r\n const scaledBottom = this.fy(bottom)\r\n const { close } = this.data\r\n const period = Math.min(this.attrs.period, close.length - 1)\r\n\r\n let firstBarToRender: number | undefined\r\n let lastBarToRender = 0\r\n\r\n // middle line && find first & last bar to render\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', BB_COLORS[theme].MIDDLE)\r\n\r\n const bbCalculation = new BbCalculation({\r\n quote: this.data,\r\n options: {\r\n period,\r\n deviations: this.attrs.deviations,\r\n },\r\n })\r\n\r\n bbCalculation.calculate(({ sma }, dataIndex) => {\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = dataIndex\r\n\r\n context.lineTo(this.fx(dataIndex), Math.round(this.fy(sma[dataIndex])))\r\n\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n lastBarToRender = dataIndex\r\n })\r\n\r\n if (firstBarToRender === undefined) return\r\n context.stroke()\r\n context.set('fillStyle', Colors.overlayTransparentBackground)\r\n\r\n // top line\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRender), scaledTop)\r\n context.set('strokeStyle', BB_COLORS[theme].TOP)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(bbCalculation.calculatedValues.upperBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), scaledTop)\r\n context.fill()\r\n\r\n // bottom line\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRender), scaledBottom)\r\n context.set('strokeStyle', BB_COLORS[theme].BOTTOM)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(bbCalculation.calculatedValues.lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), scaledBottom)\r\n context.fill()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const deviations = {\r\n type: 'number',\r\n label: 'Deviations',\r\n name: 'deviations',\r\n value: this.attrs.deviations ?? DEFAULT_PARAMETERS.Deviations,\r\n required: true,\r\n min: 0.1,\r\n max: 999,\r\n step: 0.1,\r\n }\r\n const topColor = {\r\n type: 'color',\r\n label: 'Top Color',\r\n name: 'topColor',\r\n value: this.attrs.topColor ?? this.getFreeColor(),\r\n }\r\n const bottomColor = {\r\n type: 'color',\r\n label: 'Bottom Color',\r\n name: 'bottomColor',\r\n value: this.attrs.bottomColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, deviations, topColor, bottomColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n deviations: `${deviations.label} must be a number between ${deviations.min} and ${deviations.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'deviations':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'topColor':\r\n case 'bottomColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n const theme = this.model.chart().chart_layout().theme as Theme\r\n return this.attrs.topColor || BB_COLORS[theme].TOP\r\n }\r\n\r\n toString() {\r\n return `BB ${this.attrs.period},${this.attrs.deviations}`\r\n }\r\n}\r\n\r\nBollingerBands.prototype.defaults = { topColor: '#69c1ea', bottomColor: '#d386df' }\r\n\r\nexport default BollingerBands\r\n","import { OverlayType } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n channelStrokeColor: string\r\n channelFillColor: string\r\n medianBandColor: string\r\n}\r\n\r\nconst DEFAULT_PERIOD = 20\r\n\r\nconst COLORS = {\r\n ChannelStroke: '#69c1ea',\r\n ChannelFill: '#69C1EA12',\r\n MedianBandStroke: '#ffa75f',\r\n}\r\n\r\nclass DonchianChannels extends Overlay {\r\n static type = OverlayType.Dch\r\n static label = 'Donchian Channels'\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { period } = this.attrs\r\n const upperBand: number[] = []\r\n const lowerBand: number[] = []\r\n const medianBand: number[] = []\r\n let firstBarToRender = -1\r\n let lastBarToRender = 0\r\n if (this.data.close.length === undefined) {\r\n return\r\n }\r\n\r\n context.save()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', COLORS.ChannelStroke)\r\n context.set('fillStyle', COLORS.ChannelFill)\r\n\r\n //upper band + clip\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n firstBarToRender = firstBarToRender === -1 ? i : firstBarToRender\r\n upperBand[i] = utils.max(this.data.high.slice(Math.max(0, i - period), i + 1))\r\n lowerBand[i] = utils.min(this.data.low.slice(Math.max(0, i - period), i + 1))\r\n medianBand[i] = (upperBand[i] + lowerBand[i]) / 2\r\n\r\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\r\n lastBarToRender = i\r\n },\r\n })\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\r\n context.clip()\r\n\r\n // lower band + fill\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), 0)\r\n context.lineTo(0, 0)\r\n context.fill()\r\n\r\n // median band\r\n context.set('strokeStyle', COLORS.MedianBandStroke)\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(medianBand[i])))\r\n }\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PERIOD,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const strokeColor = {\r\n type: 'color',\r\n label: 'Channels Stroke Color',\r\n name: 'strokeColor',\r\n value: this.attrs.channelStrokeColor ?? this.getFreeColor(),\r\n }\r\n const fillColor = {\r\n type: 'color',\r\n label: 'Channels Fill Color',\r\n name: 'fillColor',\r\n value: this.attrs.channelFillColor ?? this.getFreeColor(),\r\n }\r\n const medianBandColor = {\r\n type: 'color',\r\n label: 'Median Band Color',\r\n name: 'medianBandColor',\r\n value: this.attrs.medianBandColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, medianBandColor, strokeColor, fillColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'medianBandColor':\r\n case 'strokeColor':\r\n case 'fillColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.medianBandColor\r\n }\r\n\r\n toString() {\r\n return `Donchian ${this.attrs.period}`\r\n }\r\n}\r\n\r\nDonchianChannels.prototype.defaults = {\r\n medianBandColor: COLORS.MedianBandStroke,\r\n channelStrokeColor: COLORS.ChannelStroke,\r\n channelFillColor: COLORS.ChannelFill,\r\n}\r\n\r\nexport default DonchianChannels\r\n","import { OverlayType } from '../constants/common'\r\nimport { EMACalculation } from '../indicator-calculation/ema'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n deviations: number\r\n color: string\r\n}\r\n\r\nclass EMA extends Overlay {\r\n static type = OverlayType.Ema\r\n static label = 'Exponential Moving Average'\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n const emaCalculation = new EMACalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.attrs.period,\r\n },\r\n })\r\n emaCalculation.calculate(({ ema }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n context.lineTo(x, Math.round(this.fy(ema[dataIndex])))\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, color],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `EMA ${this.attrs.period}`\r\n }\r\n}\r\n\r\nEMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default EMA\r\n","import { OverlayType } from '../constants/common'\r\nimport EMA from './ema'\r\n\r\nclass EMA2 extends EMA {\r\n static type = OverlayType.Ema2\r\n}\r\n\r\nEMA2.prototype.defaults = { color: '#ff6400' }\r\n\r\nexport default EMA2\r\n","import { OverlayType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport { getBarWidthWithMargin } from '../utils/chart'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n lowColor: string\r\n highColor: string\r\n}\r\n\r\nclass HighLow extends Overlay {\r\n static type = OverlayType.Hilo\r\n static label = 'High/Low'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const chartModel = this.model.chart()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { leftOffset, width, zoomFactor } = chartModel\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const halfWidth = barWidth / 2\r\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n context.translate(0.5, 0.5)\r\n context.set('fillStyle', Colors.overlayTransparentBackground)\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.highColor)\r\n let prevHigh = -1\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n }\r\n\r\n const x = this.fx(i)\r\n if (this.fx(i + 1) + leftOffset < -10) {\r\n prevHigh = highestHigh\r\n continue\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n\r\n const diff = this.data.barIndex[i] - this.data.barIndex[lastBarToRender]\r\n if (diff > 1 && prevHigh !== highestHigh && prevHigh > 0) {\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevHigh)))\r\n }\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(highestHigh)))\r\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(highestHigh)))\r\n\r\n prevHigh = highestHigh\r\n lastBarToRender = i\r\n }\r\n context.stroke()\r\n if (firstBarToRender === undefined) return\r\n\r\n // return to start and fill with background color\r\n context.lineTo(this.fx(lastBarToRender) + halfWidth, 0)\r\n context.lineTo(this.fx(firstBarToRender) - halfWidth, 0)\r\n context.fill()\r\n\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.lowColor)\r\n let prevLow = -1\r\n let prevBar = firstBarToRender\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n let lowestLow = this.data.low[i]\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n const x = this.fx(i)\r\n const diff = this.data.barIndex[i] - this.data.barIndex[prevBar]\r\n if (diff > 1 && prevLow !== lowestLow && prevLow > 0) {\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevLow)))\r\n }\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(lowestLow)))\r\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(lowestLow)))\r\n\r\n prevLow = lowestLow\r\n prevBar = i\r\n }\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n\r\n // return to start and fill with background color\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender) - halfWidth, context.canvas.height)\r\n context.fill()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 50,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const highColor = {\r\n type: 'color',\r\n label: 'High Color',\r\n name: 'highColor',\r\n value: this.attrs.highColor ?? this.getFreeColor(),\r\n }\r\n const lowColor = {\r\n type: 'color',\r\n label: 'Low Color',\r\n name: 'lowColor',\r\n value: this.attrs.lowColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, highColor, lowColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'highColor':\r\n case 'lowColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.highColor\r\n }\r\n\r\n toString() {\r\n return `HILO ${this.attrs.period}`\r\n }\r\n}\r\n\r\nHighLow.prototype.defaults = {\r\n lowColor: '#69c1ea',\r\n highColor: '#d386df',\r\n}\r\n\r\nexport default HighLow\r\n","import { OverlayType } from '../constants/common'\r\nimport { isPositiveFloat } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n price: number\r\n color: string\r\n}\r\n\r\nclass HorizontalLine extends Overlay {\r\n static type = OverlayType.Hline\r\n static label = 'Horizontal Line'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (typeof this.attrs.period === 'string' && this.attrs.price === undefined) {\r\n this.attrs.price = parseFloat(this.attrs.period)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const y = Math.round(this.fy(this.attrs.price))\r\n context.set('strokeStyle', this.attrs.color)\r\n context.translate(0, 0.5)\r\n context.beginPath()\r\n context.moveTo(-this.model.chart().leftOffset, y)\r\n context.lineTo(-this.model.chart().leftOffset + this.model.chart().width, y)\r\n context.stroke()\r\n context.translate(0, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const price = {\r\n type: 'number',\r\n label: 'Price',\r\n name: 'price',\r\n value: this.attrs.price || this.model?.scale?.y?.domain().reduce((a: number, b: number) => a + b, 0) / 2,\r\n required: true,\r\n step: 0.1,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [price, color],\r\n inputsErrorMessages: {\r\n price: `${price.label} must be number`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'price':\r\n return isPositiveFloat(this.attrs[key])\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `HL ${this.attrs.price}`\r\n }\r\n}\r\n\r\nHorizontalLine.prototype.defaults = { color: '#0587cd' }\r\n\r\nexport default HorizontalLine\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period?: string\r\n conversion: number\r\n base: number\r\n spanB: number\r\n spanAStrokeColor: string\r\n spanAFillColor: string\r\n spanBStrokeColor: string\r\n spanBFillColor: string\r\n conversionLineColor: string\r\n baseLineColor: string\r\n laggingSpanColor: string\r\n}\r\n\r\nconst COLORS = {\r\n SpanA: {\r\n Stroke: '#009600',\r\n Fill: '#00960022',\r\n },\r\n SpanB: {\r\n Stroke: '#C80000',\r\n Fill: '#C8000022',\r\n },\r\n ConversionLine: '#69C1EA',\r\n BaseLine: '#E54040',\r\n LaggingSpan: '#FFA75F',\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Conversion: 9,\r\n Base: 26,\r\n SpanB: 52,\r\n}\r\n\r\nfunction parsePeriod(period: string) {\r\n const [conversion = DEFAULT_PARAMETERS.Conversion, base = DEFAULT_PARAMETERS.Base, spanB = DEFAULT_PARAMETERS.SpanB] =\r\n getParsedIntegersFromPeriodString(period)\r\n return [conversion, base, spanB]\r\n}\r\n\r\nclass IchimokuCloud extends Overlay {\r\n static type = OverlayType.Ic\r\n static label = 'Ichimoku Cloud'\r\n static renderFull = false\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n return Math.max(...parsePeriod(period))\r\n }\r\n\r\n get renderFull() {\r\n return (this.constructor as typeof IchimokuCloud).renderFull\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (\r\n typeof this.attrs.period === 'string' &&\r\n (this.attrs.conversion === undefined || this.attrs.base === undefined || this.attrs.spanB === undefined)\r\n ) {\r\n const [conversion, base, spanB] = parsePeriod(this.attrs.period)\r\n this.attrs.conversion = conversion\r\n this.attrs.base = base\r\n this.attrs.spanB = spanB\r\n }\r\n this.trigger('change')\r\n return this\r\n }\r\n\r\n fx = (x: number) => {\r\n const lastIndex = this.data.close.length - 1\r\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\r\n\r\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { high, low, close } = this.data\r\n\r\n const {\r\n conversion,\r\n base,\r\n spanB,\r\n spanAFillColor,\r\n spanAStrokeColor,\r\n spanBFillColor,\r\n spanBStrokeColor,\r\n baseLineColor,\r\n conversionLineColor,\r\n laggingSpanColor,\r\n } = this.attrs\r\n\r\n const conversionLine: number[] = []\r\n const baseLine: number[] = []\r\n const senkouSpanA: number[] = []\r\n const senkouSpanB: number[] = []\r\n const conversionStartIndex = conversion - 1\r\n const baseStartIndex = base - 1\r\n const spanBIndex = spanB - 1\r\n const start = Math.min(baseStartIndex, conversionStartIndex)\r\n const end = close.length + baseStartIndex\r\n\r\n if (this.data.close.length === 0) return\r\n\r\n // Calculation\r\n for (let i = start; i < end; i++) {\r\n if (i >= conversionStartIndex && i < close.length) {\r\n const highestHi = Math.max(...high.slice(i - conversionStartIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - conversionStartIndex, i + 1))\r\n conversionLine[i] = (highestHi + lowestLo) / 2\r\n }\r\n\r\n if (i >= baseStartIndex && i < close.length) {\r\n const highestHi = Math.max(...high.slice(i - baseStartIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - baseStartIndex, i + 1))\r\n baseLine[i] = (highestHi + lowestLo) / 2\r\n\r\n senkouSpanA[i + baseStartIndex] = (baseLine[i] + conversionLine[i]) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n\r\n if (i >= spanBIndex) {\r\n const highestHi = Math.max(...high.slice(i - spanBIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - spanBIndex, i + 1))\r\n senkouSpanB[i + baseStartIndex] = (highestHi + lowestLo) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n }\r\n\r\n let lastSpanAX = 0\r\n let lastSpanBX = 0\r\n const cloudStartingX = this.fx(spanBIndex + baseStartIndex)\r\n\r\n const drawInVisibleAreaProps = {\r\n toIndexOffset: baseStartIndex,\r\n leftOffset,\r\n paneModel: this.model,\r\n quote: this.data,\r\n width,\r\n fxOverride: this.fx,\r\n }\r\n\r\n context.set('lineWidth', 1)\r\n context.translate(0.5, 0.5)\r\n context.save()\r\n // 1. Senkou Span A\r\n // 1.1 Stroke\r\n context.set('strokeStyle', spanAStrokeColor)\r\n context.set('fillStyle', spanAFillColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\r\n lastSpanAX = x\r\n },\r\n })\r\n context.stroke()\r\n // 1.2 Clipping area\r\n context.lineTo(lastSpanAX, context.canvas.height)\r\n context.lineTo(cloudStartingX, context.canvas.height)\r\n context.clip()\r\n // 1.3 Fill\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n if (i >= senkouSpanA.length) return\r\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\r\n lastSpanBX = x\r\n },\r\n })\r\n context.lineTo(lastSpanBX, 0)\r\n context.lineTo(cloudStartingX, 0)\r\n context.fill()\r\n context.restore()\r\n\r\n // 2. Senkou Span B\r\n // 2.1 Stroke\r\n context.save()\r\n context.set('strokeStyle', spanBStrokeColor)\r\n context.set('fillStyle', spanBFillColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n if (i >= senkouSpanA.length) return\r\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\r\n },\r\n })\r\n context.stroke()\r\n // 2.2 Clipping area\r\n context.lineTo(lastSpanBX, context.canvas.height)\r\n context.lineTo(cloudStartingX, context.canvas.height)\r\n context.clip()\r\n // 2.3 Fill\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\r\n },\r\n })\r\n context.lineTo(lastSpanBX, 0)\r\n context.lineTo(cloudStartingX, 0)\r\n context.fill()\r\n context.restore()\r\n context.translate(-0.5, -0.5)\r\n\r\n if (this.renderFull) {\r\n // conversion line\r\n context.set('strokeStyle', conversionLineColor)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(conversionLine[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n // base line\r\n context.set('strokeStyle', baseLineColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(baseLine[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n // lagging span\r\n context.set('strokeStyle', laggingSpanColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n fxOverride: (x: number) => this.fx(x - base),\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.data.close[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const conversion = {\r\n type: 'number',\r\n label: 'Conversion Line',\r\n name: 'conversion',\r\n value: this.attrs.conversion ?? DEFAULT_PARAMETERS.Conversion,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const base = {\r\n type: 'number',\r\n label: 'Base Line Length',\r\n name: 'base',\r\n value: this.attrs.base ?? DEFAULT_PARAMETERS.Base,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const spanB = {\r\n type: 'number',\r\n label: 'Leading Span B Length',\r\n name: 'spanB',\r\n value: this.attrs.spanB ?? DEFAULT_PARAMETERS.SpanB,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const spanAStrokeColor = {\r\n type: 'color',\r\n label: 'Span A Stroke Color',\r\n name: 'spanAStrokeColor',\r\n value: this.attrs.spanAStrokeColor ?? this.getFreeColor(),\r\n }\r\n const spanAFillColor = {\r\n type: 'color',\r\n label: 'Span A Fill Color',\r\n name: 'spanAFillColor',\r\n value: this.attrs.spanAFillColor ?? this.getFreeColor(),\r\n }\r\n const spanBStrokeColor = {\r\n type: 'color',\r\n label: 'Span B Stroke Color',\r\n name: 'spanBStrokeColor',\r\n value: this.attrs.spanBStrokeColor ?? this.getFreeColor(),\r\n }\r\n const spanBFillColor = {\r\n type: 'color',\r\n label: 'Span B Fill Color',\r\n name: 'spanBFillColor',\r\n value: this.attrs.spanBFillColor ?? this.getFreeColor(),\r\n }\r\n const conversionLineColor = {\r\n type: 'color',\r\n label: 'Conversion Line Color',\r\n name: 'conversionLineColor',\r\n value: this.attrs.conversionLineColor ?? this.getFreeColor(),\r\n }\r\n const baseLineColor = {\r\n type: 'color',\r\n label: 'Base Line Color',\r\n name: 'baseLineColor',\r\n value: this.attrs.baseLineColor ?? this.getFreeColor(),\r\n }\r\n const laggingSpanColor = {\r\n type: 'color',\r\n label: 'Lagging Span Color',\r\n name: 'laggingSpanColor',\r\n value: this.attrs.laggingSpanColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [\r\n conversion,\r\n base,\r\n spanB,\r\n spanAStrokeColor,\r\n spanAFillColor,\r\n spanBStrokeColor,\r\n spanBFillColor,\r\n conversionLineColor,\r\n baseLineColor,\r\n laggingSpanColor,\r\n ],\r\n inputsErrorMessages: {\r\n conversion: `${conversion.label} must be a whole number between ${conversion.min} and ${conversion.max}`,\r\n base: `${base.label} must be a whole number between ${base.min} and ${base.max}`,\r\n spanB: `${spanB.label} must be a whole number between ${spanB.min} and ${spanB.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'conversion':\r\n case 'base':\r\n case 'spanB':\r\n case 'lagging':\r\n return this.getIsNumberInputValid({ key })\r\n case 'spanAStrokeColor':\r\n case 'spanAFillColor':\r\n case 'spanBStrokeColor':\r\n case 'spanBFillColor':\r\n case 'conversionLineColor':\r\n case 'baseLineColor':\r\n case 'laggingSpanColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.spanAStrokeColor\r\n }\r\n\r\n toString() {\r\n return `Ichimoku ${this.attrs.conversion},${this.attrs.base},${this.attrs.spanB}`\r\n }\r\n}\r\n\r\nIchimokuCloud.prototype.defaults = {\r\n spanAStrokeColor: COLORS.SpanA.Stroke,\r\n spanAFillColor: COLORS.SpanA.Fill,\r\n spanBStrokeColor: COLORS.SpanB.Stroke,\r\n spanBFillColor: COLORS.SpanB.Fill,\r\n conversionLineColor: COLORS.ConversionLine,\r\n baseLineColor: COLORS.BaseLine,\r\n laggingSpanColor: COLORS.LaggingSpan,\r\n}\r\n\r\nexport default IchimokuCloud\r\n","import { OverlayType } from '../constants/common'\r\nimport IchimokuCloud from './ic'\r\n\r\nclass IchimokuCloudFull extends IchimokuCloud {\r\n static type = OverlayType.Icf\r\n static label = 'Ichimoku Cloud (Full)'\r\n static renderFull = true\r\n}\r\n\r\nexport default IchimokuCloudFull\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { ExponentialMovingAverage } from '../indicator-calculation/ema'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period?: string\r\n emaPeriod: number\r\n multiplier: number\r\n atrPeriod: number\r\n strokeColor: string\r\n fillColor: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n emaPeriod: 20,\r\n multiplier: 2.0,\r\n atrPeriod: 10,\r\n}\r\n\r\nconst COLORS = {\r\n Stroke: '#69C1EA',\r\n Fill: '#69C1EA33',\r\n}\r\n\r\nfunction parsePeriod(period: string) {\r\n const values = period.split(',')\r\n const emaPeriod = parseInt(values[0])\r\n const multiplier = parseFloat(values[1])\r\n const atrPeriod = parseInt(values[2])\r\n\r\n return [emaPeriod, multiplier, atrPeriod]\r\n}\r\n\r\nclass KeltnerChannel extends Overlay {\r\n static type = OverlayType.Kch\r\n static label = 'Keltner Channel'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n return Math.max(...parsePeriod(period)) * 2\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (\r\n typeof this.attrs.period === 'string' &&\r\n (this.attrs.emaPeriod === undefined || this.attrs.multiplier === undefined || this.attrs.atrPeriod === undefined)\r\n ) {\r\n const [emaPeriod, multiplier, atrPeriod] = parsePeriod(this.attrs.period)\r\n this.attrs.emaPeriod = emaPeriod\r\n this.attrs.multiplier = multiplier\r\n this.attrs.atrPeriod = atrPeriod\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { emaPeriod, multiplier, atrPeriod, strokeColor, fillColor } = this.attrs\r\n const ema = new ExponentialMovingAverage(emaPeriod)\r\n const atr = new AverageTrueRange(atrPeriod)\r\n const middleLine: number[] = []\r\n const upperBand: number[] = []\r\n const lowerBand: number[] = []\r\n const start = Math.max(emaPeriod, atrPeriod)\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n\r\n context.save()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', strokeColor)\r\n context.set('fillStyle', fillColor)\r\n\r\n //top line + clip\r\n context.beginPath()\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n ema.add(this.data.close[i])\r\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\r\n if (i < start) {\r\n continue\r\n }\r\n\r\n const x = this.fx(i)\r\n if (this.fx(i + 1) + leftOffset < 0) {\r\n continue\r\n }\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n\r\n middleLine[i] = ema.value\r\n upperBand[i] = ema.value + multiplier * atr.value\r\n lowerBand[i] = ema.value - multiplier * atr.value\r\n\r\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\r\n lastBarToRender = i\r\n }\r\n if (firstBarToRender === undefined) {\r\n context.restore()\r\n return\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\r\n context.clip()\r\n\r\n // bottom line + fill\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), 0)\r\n context.lineTo(0, 0)\r\n context.fill()\r\n\r\n // middle line\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(middleLine[i])))\r\n }\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n getModalConfig() {\r\n const emaPeriod = {\r\n type: 'number',\r\n label: 'EMA Period',\r\n name: 'emaPeriod',\r\n value: this.attrs.emaPeriod ?? DEFAULT_PARAMETERS.emaPeriod,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const multiplier = {\r\n type: 'number',\r\n label: 'Multiplier',\r\n name: 'multiplier',\r\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.multiplier,\r\n required: true,\r\n step: 0.1,\r\n min: 0.0,\r\n max: 999,\r\n }\r\n\r\n const atrPeriod = {\r\n type: 'number',\r\n label: 'ATR Period',\r\n name: 'atrPeriod',\r\n value: this.attrs.atrPeriod ?? DEFAULT_PARAMETERS.atrPeriod,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const strokeColor = {\r\n type: 'color',\r\n label: 'Stroke Color',\r\n name: 'strokeColor',\r\n value: this.attrs.strokeColor ?? this.getFreeColor(),\r\n }\r\n const fillColor = {\r\n type: 'color',\r\n label: 'Fill Color',\r\n name: 'fillColor',\r\n value: this.attrs.fillColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [emaPeriod, multiplier, atrPeriod, strokeColor, fillColor],\r\n inputsErrorMessages: {\r\n emaPeriod: `${emaPeriod.label} must be a whole number between ${emaPeriod.min} and ${emaPeriod.max}`,\r\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\r\n atrPeriod: `${atrPeriod.label} must be a whole number between ${atrPeriod.min} and ${atrPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'emaPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n case 'multiplier':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'atrPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n case 'strokeColor':\r\n case 'fillColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.strokeColor\r\n }\r\n\r\n toString() {\r\n return `Keltner Channel ${this.attrs.emaPeriod},${this.attrs.multiplier},${this.attrs.atrPeriod}`\r\n }\r\n}\r\n\r\nKeltnerChannel.prototype.defaults = { strokeColor: COLORS.Stroke, fillColor: COLORS.Fill }\r\n\r\nexport default KeltnerChannel\r\n","import { OverlayType } from '../constants/common'\r\nimport Overlay from './overlay'\r\n\r\n// This indicator is used as a placeholder when we need to render TA like chart but don't need any overlay or indicator in the chart\r\nclass None extends Overlay {\r\n static type = OverlayType.None\r\n static label = 'None'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n isRendered() {\r\n return false\r\n }\r\n\r\n getIsValid() {\r\n return true\r\n }\r\n}\r\n\r\nexport default None\r\n","import Text from '../canvas/text'\r\nimport { OverlayType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport Overlay from './overlay'\r\n\r\ntype aboveBelowType = 'above' | 'below'\r\n\r\nclass Patterns extends Overlay {\r\n static type = OverlayType.Patterns\r\n static label = 'Patterns (daily charts)'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const data = this.data\r\n if (data.patterns.length === 0) {\r\n return\r\n }\r\n\r\n const originalScale = {\r\n width: 600,\r\n height: 300,\r\n barsInDay: Math.min(data.close.length, 200),\r\n high: data.patternsMaxRange,\r\n low: data.patternsMinRange,\r\n barWidth: 0,\r\n }\r\n originalScale.barWidth = originalScale.width / 200\r\n\r\n const scaleY = (originalScale.high - originalScale.low) / originalScale.height\r\n const fx = (x: number) => {\r\n if (x === 0) {\r\n return this.fx(0)\r\n }\r\n return this.fx(data.close.length - 1 - ~~(originalScale.barsInDay - x / originalScale.barWidth))\r\n }\r\n const fy = (y: number) => this.fy(originalScale.high - y * scaleY)\r\n const line = (color: string, x1: number, y1: number, x2: number, y2: number) => {\r\n const roundedXY = getRoundedObject({\r\n x1: fx(x1),\r\n y1: fy(y1),\r\n x2: fx(x2),\r\n y2: fy(y2),\r\n })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: 1, ...roundedXY })\r\n context.translate(translateXY.x, translateXY.y)\r\n\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', color)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n }\r\n const text = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, x2: number, y1: number) => {\r\n new Text(\r\n {\r\n x: fx((x1 + x2) / 2),\r\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\r\n fillStyle: color,\r\n textAlign: TextAlign.center,\r\n text,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n const textHS = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, y1: number) => {\r\n new Text(\r\n {\r\n x: fx(x1) + 5,\r\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\r\n font: { size: 9, style: 'bold' },\r\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\r\n fillStyle: color,\r\n textAlign: TextAlign.center,\r\n text,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n const above = (y: number) =>\r\n fy(y) + 10 >= this.model.height - ChartSettings.top.height - ChartSettings.bottom.height ? 'above' : 'below'\r\n const below = (y: number) => (fy(y) <= 15 ? 'below' : 'above')\r\n\r\n const supportColor = 'rgb(0, 150, 220)'\r\n const resistColor = 'rgb(180, 50, 200)'\r\n\r\n for (const pattern of data.patterns) {\r\n const { x1, x2, x3, y3 } = pattern\r\n let { y1, y2 } = pattern\r\n switch (pattern.kind) {\r\n case 1: // Horiz S/R\r\n line('rgba(50, 50, 180, 0.588)', x1, y1, x2, y2)\r\n break\r\n\r\n case 2: // tl resist\r\n line(resistColor, x1, y1, x2, y2)\r\n break\r\n\r\n case 3: // tl support\r\n if (y1 === originalScale.height && y2 === originalScale.height) {\r\n y1 = y2 = originalScale.height - 1\r\n // Maybe just need to check on the new scale?\r\n } // support \"pod grafom\"\r\n line(supportColor, x1, y1, x2, y2)\r\n break\r\n\r\n case 12: // double top\r\n text('Double Top', below(y1), resistColor, x1, x2, y1)\r\n break\r\n\r\n case 13: // double bottom\r\n text('Double Bottom', above(y1), supportColor, x1, x2, y1)\r\n break\r\n\r\n case 14: // multi top\r\n text('Multiple Top', below(y1), resistColor, x1, x2, y1)\r\n break\r\n\r\n case 15: // multi bottom\r\n text('Multiple Bottom', above(y1), supportColor, x1, x2, y1)\r\n break\r\n\r\n case 16: // h&s top\r\n textHS('L', below(y1), resistColor, x1, y1)\r\n textHS('H', below(y2), resistColor, x2, y2)\r\n textHS('R', below(y3), resistColor, x3, y3)\r\n break\r\n\r\n case 17: // h&s bot\r\n textHS('L', above(y1), supportColor, x1, y1)\r\n textHS('H', above(y2), supportColor, x2, y2)\r\n textHS('R', above(y3), supportColor, x3, y3)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const supportColor = {\r\n type: 'color',\r\n label: 'Support Color',\r\n name: 'supportColor',\r\n value: this.attrs.supportColor ?? this.getFreeColor(),\r\n }\r\n const resistColor = {\r\n type: 'color',\r\n label: 'Resist Color',\r\n name: 'resistColor',\r\n value: this.attrs.resistColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [supportColor, resistColor],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid() {\r\n return true\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return false\r\n }\r\n\r\n toString() {\r\n return ''\r\n }\r\n}\r\n\r\nPatterns.prototype.defaults = { supportColor: '#69c1ea', resistColor: '#d386df' }\r\n\r\nexport default Patterns\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { Instrument } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { OverlayType, TIMEFRAME, TextBaseline } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport Utils from '../utils'\r\nimport { getBarWidthWithMargin, round } from '../utils/chart'\r\nimport { getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport Overlay from './overlay'\r\n\r\nenum Calculation {\r\n standard = 'Standard',\r\n fibonacci = 'Fibonacci',\r\n}\r\ntype CalculationType = keyof typeof Calculation\r\n\r\nenum PivotPeriod {\r\n day,\r\n week,\r\n month,\r\n year,\r\n}\r\n\r\ntype PivotPointType = {\r\n pivot: number\r\n res1: number\r\n res2: number\r\n res3: number\r\n sup1: number\r\n sup2: number\r\n sup3: number\r\n}\r\n\r\ninterface Attrs {\r\n period?: string\r\n calculationType: CalculationType\r\n color: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n CalculationType: 'standard' as CalculationType,\r\n Color: '#FFA75F',\r\n}\r\nconst FIB_LVL_1 = 0.382\r\nconst FIB_LVL_2 = 0.618\r\nconst DAY_SECONDS = 86400\r\nconst MINUTES_PER_DAY = 1440\r\n\r\nclass PivotPoints extends Overlay {\r\n static type = OverlayType.Pp\r\n static label = 'Pivot Points'\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (period) {\r\n this.attrs.calculationType = period as CalculationType\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n getPeriodType() {\r\n switch (this.data.timeframe) {\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n return PivotPeriod.week\r\n case TIMEFRAME.h4:\r\n case TIMEFRAME.d:\r\n return PivotPeriod.month\r\n case TIMEFRAME.w:\r\n case TIMEFRAME.m:\r\n return PivotPeriod.year\r\n default:\r\n return PivotPeriod.day\r\n }\r\n }\r\n\r\n getIsEnoughData(startIndex: number, endIndex: number, periodType: PivotPeriod) {\r\n let dayGap = 7 // one week for week period\r\n if (periodType === PivotPeriod.month) dayGap = 28 // shortest month\r\n if (periodType === PivotPeriod.year) dayGap = 365\r\n\r\n if (startIndex !== endIndex) {\r\n if (startIndex === 0) {\r\n const daysDiff = (this.data.date[endIndex] - this.data.date[startIndex]) / DAY_SECONDS\r\n // we need to somehow determine if we have data if it starts from index 0\r\n // and we can't easily check if day before is different (different month/week/year)\r\n // so we are at least checking if it is [dayGap] days between start and end date\r\n return daysDiff >= dayGap\r\n } else {\r\n const startDay = Utils.dateFromUnixTimestamp(this.data.date[startIndex])\r\n const beforeDay = Utils.dateFromUnixTimestamp(this.data.date[startIndex - 1])\r\n if (periodType === PivotPeriod.week) {\r\n return beforeDay.getDate() !== startDay.getDate()\r\n } else {\r\n return beforeDay.getMonth() !== startDay.getMonth()\r\n }\r\n }\r\n }\r\n return false\r\n }\r\n\r\n fx = (x: number) => {\r\n const lastIndex = this.data.close.length - 1\r\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\r\n\r\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n if (this.data.close.length === 0) return\r\n\r\n const chartModel = this.model.chart() as Chart\r\n const { leftOffset, width, zoomFactor } = chartModel\r\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\r\n const chartWidth = width - left.width - right.width\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n\r\n const firstBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n const lastBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRender, lastBarToRender)\r\n if (areNoBarsVisible) return\r\n\r\n const text = (label: string, price: number, calculatedX: number) => {\r\n new Text(\r\n {\r\n x: calculatedX,\r\n y: this.fy(price) - 13,\r\n font: { size: 8, weight: '900' },\r\n textBaseline: TextBaseline.top,\r\n fillStyle: this.attrs.color,\r\n text: `${label} (${round({ data: this.data, num: price })})`,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n const line = (fromX: number, toX: number, y: number) => {\r\n context.moveTo(fromX, this.fy(y))\r\n context.lineTo(toX, this.fy(y))\r\n }\r\n\r\n let startIndex = -1\r\n let endIndex = -1\r\n const isStock = this.data.instrument === Instrument.Stock\r\n const periodType = this.getPeriodType()\r\n let currentDate = new Date()\r\n let lastDate: Date | undefined\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n for (let index = firstBarToRender.index; index <= lastBarToRender.index; index++) {\r\n currentDate = Utils.dateFromUnixTimestamp(this.data.date[index])\r\n\r\n // check if new calculation/render is necessary\r\n switch (periodType) {\r\n case PivotPeriod.day: // only if it is a new day\r\n if (currentDate.getDate() === lastDate?.getDate()) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.week: // only if it is a new week\r\n if (lastDate && dateFns.isSameWeek(lastDate, currentDate, { weekStartsOn: 1 })) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.month: // only if it is a new month\r\n if (currentDate.getMonth() === lastDate?.getMonth()) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.year: // only if it is a new year\r\n if (currentDate.getFullYear() === lastDate?.getFullYear()) {\r\n continue\r\n }\r\n break\r\n }\r\n lastDate = currentDate\r\n\r\n // Find start/end indexes for the entire previous period\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n if (index > 0) {\r\n let previousTradingDay = new Date()\r\n for (let i = index - 1; i >= 0; i--) {\r\n previousTradingDay = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (previousTradingDay.getDate() !== currentDate.getDate()) break\r\n }\r\n previousTradingDay.setHours(0, 0, 0, 0)\r\n const previousNYMidnightTimestamp = Utils.convertLocalToNyTime(previousTradingDay, false).getTime() / 1000\r\n const currentMidnight = new Date(currentDate)\r\n currentMidnight.setHours(0, 0, 0, 0)\r\n const currentNYMidnightTimestamp = Utils.convertLocalToNyTime(currentMidnight, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= previousNYMidnightTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > currentNYMidnightTimestamp)\r\n\r\n // check if we have data for entire day\r\n if (startIndex !== endIndex) {\r\n const diff = this.data.date[endIndex] - this.data.date[startIndex]\r\n const isNonStockFullDay = !isStock && diff >= DAY_SECONDS\r\n const isStockFullDay = isStock && previousTradingDay.getDate() !== currentDate.getDate()\r\n if (!isNonStockFullDay && !isStockFullDay) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n }\r\n }\r\n break\r\n case PivotPeriod.week:\r\n const firstDayCurrentWeek = dateFns.startOfWeek(currentDate, { weekStartsOn: 1 })\r\n const firstDayCurrentWeekTimestamp = Utils.convertLocalToNyTime(firstDayCurrentWeek, false).getTime() / 1000\r\n const firstDayPreviousWeek = dateFns.sub(firstDayCurrentWeek, { weeks: 1 })\r\n const firstDayPreviousWeekTimestamp = Utils.convertLocalToNyTime(firstDayPreviousWeek, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousWeekTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentWeekTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n case PivotPeriod.month:\r\n const firstDayCurrentMonth = dateFns.startOfMonth(currentDate)\r\n const firstDayCurrentMonthTimestamp = Utils.convertLocalToNyTime(firstDayCurrentMonth, false).getTime() / 1000\r\n const firstDayPreviousMonth = dateFns.sub(firstDayCurrentMonth, { months: 1 })\r\n const firstDayPreviousMonthTimestamp =\r\n Utils.convertLocalToNyTime(firstDayPreviousMonth, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousMonthTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentMonthTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n case PivotPeriod.year:\r\n const firstDayCurrentYear = dateFns.startOfYear(currentDate)\r\n const firstDayCurrentYearTimestamp = Utils.convertLocalToNyTime(firstDayCurrentYear, false).getTime() / 1000\r\n const firstDayPreviousYear = dateFns.sub(firstDayCurrentYear, { years: 1 })\r\n const firstDayPreviousYearTimestamp = Utils.convertLocalToNyTime(firstDayPreviousYear, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousYearTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentYearTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n }\r\n\r\n // calculate pivot point if it was found\r\n if (!(startIndex !== -1 && endIndex !== -1 && startIndex < endIndex)) continue\r\n\r\n let pivot, sup1, sup2, sup3, res1, res2, res3\r\n const previousHigh = Math.max(...this.data.high.slice(startIndex, endIndex))\r\n const previousLow = Math.min(...this.data.low.slice(startIndex, endIndex))\r\n const previousClose = this.data.close[endIndex - 1] // endIndex is the beginning of the next period\r\n\r\n if (this.attrs.calculationType === 'standard') {\r\n pivot = (previousHigh + previousLow + previousClose) / 3\r\n sup1 = 2 * pivot - previousHigh\r\n sup2 = pivot - (previousHigh - previousLow)\r\n sup3 = previousLow - 2 * (previousHigh - pivot)\r\n res1 = 2 * pivot - previousLow\r\n res2 = pivot + (previousHigh - previousLow)\r\n res3 = previousHigh + 2 * (pivot - previousLow)\r\n } else {\r\n pivot = (previousHigh + previousLow + previousClose) / 3\r\n sup1 = pivot - (previousHigh - previousLow) * FIB_LVL_1\r\n sup2 = pivot - (previousHigh - previousLow) * FIB_LVL_2\r\n sup3 = pivot - (previousHigh - previousLow)\r\n res1 = pivot + (previousHigh - previousLow) * FIB_LVL_1\r\n res2 = pivot + (previousHigh - previousLow) * FIB_LVL_2\r\n res3 = pivot + (previousHigh - previousLow)\r\n }\r\n\r\n const pivotPoint: PivotPointType = { pivot, sup1, sup2, sup3, res1, res2, res3 }\r\n\r\n // prepare x coordinates for lines rendering\r\n let fromX = this.fx(index)\r\n let toX = this.fx(index)\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n const interval = this.data.interval\r\n const currentX = fromX\r\n\r\n const toDate = new Date(currentDate)\r\n toDate.setHours(16, 0, 0, 0)\r\n if (this.data.aftermarket && interval <= 5) toDate.setHours(18, 30, 0, 0)\r\n if (interval <= 15 && !isStock) toDate.setHours(23, 59, 59, 99)\r\n const toTimestamp = toDate.getTime() / 1000\r\n const toDiffMinutes = (toTimestamp - currentDate.getTime() / 1000) / 60\r\n const toBars = toDiffMinutes / interval\r\n toX = Math.min(currentX + toBars * barWidth, -leftOffset + width)\r\n\r\n const fromDate = new Date(currentDate)\r\n fromDate.setHours(9, 30, 0, 0)\r\n if (this.data.premarket && interval <= 5) fromDate.setHours(7, 0, 0, 0)\r\n if (interval <= 15 && !isStock) fromDate.setHours(0, 0, 0, 0)\r\n const fromTimestamp = fromDate.getTime() / 1000\r\n const fromDiffMinutes = (fromTimestamp - currentDate.getTime() / 1000) / 60\r\n const fromBars = fromDiffMinutes / interval\r\n fromX = currentX + fromBars * barWidth\r\n break\r\n\r\n case PivotPeriod.week:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (!dateFns.isSameWeek(currentDate, nextDate, { weekStartsOn: 1 })) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (!dateFns.isSameWeek(currentDate, nextDate, { weekStartsOn: 1 })) {\r\n fromX = this.fx(i + 1) // because we need start from current week\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the week\r\n const barsPerDay = Math.ceil((this.data.drawMinutesPerDay ?? MINUTES_PER_DAY) / this.data.interval)\r\n toX += (isStock ? 5 : 7) * barsPerDay * barWidth\r\n }\r\n break\r\n\r\n case PivotPeriod.month:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getMonth() !== currentDate.getMonth()) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getMonth() !== currentDate.getMonth()) {\r\n fromX = this.fx(i + 1) // because we need start from current month\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the month\r\n const barsPerDay = this.data.isIntraday\r\n ? Math.ceil((this.data.drawMinutesPerDay ?? MINUTES_PER_DAY) / this.data.interval)\r\n : 1\r\n toX += (isStock ? 20 : 30) * barsPerDay * barWidth\r\n }\r\n break\r\n default:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getFullYear() !== currentDate.getFullYear()) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getFullYear() !== currentDate.getFullYear()) {\r\n fromX = this.fx(i + 1) // because we need start from current year\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the year\r\n toX += (this.data.timeframe === TIMEFRAME.w ? 49 : 12) * barWidth\r\n }\r\n break\r\n }\r\n fromX = Math.max(fromX, -leftOffset)\r\n\r\n // render pivot line\r\n context.beginPath()\r\n line(fromX, toX, pivotPoint.pivot)\r\n context.stroke()\r\n\r\n // render resistance and support lines\r\n context.save()\r\n context.setLineDash([3, 3])\r\n context.beginPath()\r\n line(fromX, toX, pivotPoint.res1)\r\n line(fromX, toX, pivotPoint.res2)\r\n line(fromX, toX, pivotPoint.res3)\r\n line(fromX, toX, pivotPoint.sup1)\r\n line(fromX, toX, pivotPoint.sup2)\r\n line(fromX, toX, pivotPoint.sup3)\r\n context.stroke()\r\n context.restore()\r\n\r\n // render labels if there is enough space\r\n if (toX - fromX >= 48) {\r\n text('P', pivotPoint.pivot, fromX)\r\n text('R1', pivotPoint.res1, fromX)\r\n text('R2', pivotPoint.res2, fromX)\r\n text('R3', pivotPoint.res3, fromX)\r\n text('S1', pivotPoint.sup1, fromX)\r\n text('S2', pivotPoint.sup2, fromX)\r\n text('S3', pivotPoint.sup3, fromX)\r\n }\r\n }\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const calculationType = {\r\n type: 'select',\r\n label: 'Calculation Type',\r\n name: 'calculationType',\r\n value: this.attrs.calculationType ?? DEFAULT_PARAMETERS.CalculationType,\r\n required: true,\r\n items: [\r\n {\r\n value: 'standard',\r\n label: 'Standard',\r\n },\r\n {\r\n value: 'fibonacci',\r\n label: 'Fibonacci',\r\n },\r\n ],\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [calculationType, color],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'calculationType':\r\n case 'color':\r\n return !!this.attrs[key]\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Pivot Points (${Calculation[this.attrs.calculationType]})`\r\n }\r\n}\r\n\r\nPivotPoints.prototype.defaults = {\r\n calculationType: DEFAULT_PARAMETERS.CalculationType,\r\n color: DEFAULT_PARAMETERS.Color,\r\n}\r\n\r\nexport default PivotPoints\r\n","import { OverlayType } from '../constants/common'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n step: number\r\n period: string\r\n maxStep: number\r\n risingColor: string\r\n fallingColor: string\r\n}\r\n\r\nclass SAR extends Overlay {\r\n static type = OverlayType.Sar\r\n static label = 'Parabolic SAR'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (typeof this.attrs.period === 'string' && (this.attrs.step === undefined || this.attrs.maxStep === undefined)) {\r\n const [step = 0, maxStep = 0] = this.attrs.period.split(',').map((x) => parseFloat(x))\r\n this.attrs.step = step\r\n this.attrs.maxStep = maxStep\r\n }\r\n this.trigger('change')\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const data = this.data\r\n const deltaHigh = data.high[1] - data.high[0]\r\n const deltaLow = data.low[0] - data.low[1]\r\n const pdm = deltaHigh > 0 && deltaHigh > deltaLow ? deltaHigh : 0\r\n const mdm = deltaLow > 0 && deltaLow > deltaHigh ? deltaLow : 0\r\n let isLong = pdm >= mdm\r\n\r\n let sar = isLong ? data.low[0] : data.high[0]\r\n let ep = isLong ? data.high[1] : data.low[1]\r\n let newHigh = data.high[0]\r\n let newLow = data.low[0]\r\n let af = this.attrs.step\r\n\r\n for (let i = 1, end = data.close.length, asc = end >= 1; asc ? i < end : i > end; asc ? i++ : i--) {\r\n let sarToDraw\r\n const prevHigh = newHigh\r\n const prevLow = newLow\r\n newHigh = data.high[i]\r\n newLow = data.low[i]\r\n\r\n if (isLong) {\r\n if (newLow <= sar) {\r\n isLong = false\r\n sar = ep\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n\r\n sarToDraw = sar\r\n\r\n af = this.attrs.step\r\n ep = newLow\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n } else {\r\n sarToDraw = sar\r\n\r\n if (newHigh > ep) {\r\n ep = newHigh\r\n af += this.attrs.step\r\n if (af > this.attrs.maxStep) {\r\n af = this.attrs.maxStep\r\n }\r\n }\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n }\r\n } else {\r\n if (newHigh >= sar) {\r\n isLong = true\r\n sar = ep\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n\r\n sarToDraw = sar\r\n\r\n af = this.attrs.step\r\n ep = newHigh\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n } else {\r\n sarToDraw = sar\r\n\r\n if (newLow < ep) {\r\n ep = newLow\r\n af += this.attrs.step\r\n if (af > this.attrs.maxStep) {\r\n af = this.attrs.maxStep\r\n }\r\n }\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n }\r\n }\r\n\r\n const x = Math.round(this.fx(i) - 1.5)\r\n const y = Math.round(this.fy(sarToDraw) - 1.5)\r\n context.set('fillStyle', isLong ? this.attrs.risingColor : this.attrs.fallingColor)\r\n context.fillRect(x, y, 3, 3)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const step = {\r\n type: 'number',\r\n step: 0.01,\r\n min: 0.01,\r\n max: 999,\r\n label: 'Step',\r\n name: 'step',\r\n value: this.attrs.step ?? 0.02,\r\n required: true,\r\n }\r\n const maxStep = {\r\n type: 'number',\r\n step: 0.01,\r\n min: 0.01,\r\n max: 999,\r\n label: 'Maximum Step',\r\n name: 'maxStep',\r\n value: this.attrs.maxStep ?? 0.2,\r\n required: true,\r\n }\r\n const risingColor = {\r\n type: 'color',\r\n label: 'Rising Color',\r\n name: 'risingColor',\r\n value: this.attrs.risingColor ?? this.getFreeColor(),\r\n customizable: false,\r\n }\r\n const fallingColor = {\r\n type: 'color',\r\n label: 'Falling Color',\r\n name: 'fallingColor',\r\n value: this.attrs.fallingColor ?? this.getFreeColor(),\r\n customizable: false,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [step, maxStep, risingColor, fallingColor],\r\n inputsErrorMessages: {\r\n step: `${step.label} must be a number between ${step.min} and ${step.max}`,\r\n maxStep: `${maxStep.label} must be a number between ${maxStep.min} and ${maxStep.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'step':\r\n case 'maxStep': {\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n }\r\n case 'risingColor':\r\n case 'fallingColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.risingColor\r\n }\r\n\r\n toString() {\r\n return `SAR ${this.attrs.step},${this.attrs.maxStep}`\r\n }\r\n}\r\n\r\nSAR.prototype.defaults = {\r\n risingColor: '#69c1ea',\r\n fallingColor: '#d386df',\r\n}\r\n\r\nexport default SAR\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n}\r\n\r\nexport class SMACalculation extends MainCalculation {\r\n static type = OverlayType.Sma\r\n declare options: Options\r\n\r\n getDefaultCalculatedValues() {\r\n return { sma: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sum = 0\r\n for (let i = 0; i < this.options.period; i++) {\r\n sum += close[i]\r\n }\r\n for (let i = this.options.period; i <= lastIndex; i++) {\r\n sum = sum - close[i - this.options.period] + close[i]\r\n this.calculatedValues.sma[i] = sum / this.options.period\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { SMACalculation } from '../indicator-calculation/sma'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n step: number\r\n period: string\r\n maxStep: number\r\n risingColor: string\r\n color: string\r\n}\r\n\r\nclass SMA extends Overlay {\r\n static type = OverlayType.Sma\r\n static label = 'Simple Moving Average'\r\n\r\n static getNumOfBarsBuffer(chartConfig: RequireByKey) {\r\n const numOfBarsBuffer = Overlay.getNumOfBarsBuffer(chartConfig)\r\n return numOfBarsBuffer + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\r\n context.beginPath()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n const smaCalculation = new SMACalculation({\r\n quote: this.data,\r\n options: { period },\r\n })\r\n\r\n smaCalculation.calculate(({ sma }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n context.lineTo(x, Math.round(this.fy(sma[dataIndex])))\r\n })\r\n\r\n context.translate(-0.5, -0.5)\r\n context.stroke()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, color],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `SMA ${this.attrs.period}`\r\n }\r\n}\r\n\r\nSMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default SMA\r\n","import { OverlayType } from '../constants/common'\r\nimport SMA from './sma'\r\n\r\nclass SMA2 extends SMA {\r\n static type = OverlayType.Sma2\r\n}\r\n\r\nSMA2.prototype.defaults = { color: '#ff6400' }\r\n\r\nexport default SMA2\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n multiplier: number\r\n uptrendColor: string\r\n downtrendColor: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 7,\r\n Multiplier: 3.0,\r\n}\r\n\r\nconst COLORS = {\r\n Uptrend: '#00a000',\r\n Downtrend: '#c80000',\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const multiplier = parseFloat(values[1]) || DEFAULT_PARAMETERS.Multiplier\r\n\r\n return [period, multiplier]\r\n}\r\n\r\nclass Supertrend extends Overlay {\r\n static type = OverlayType.Str\r\n static label = 'Supertrend'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt] = parsePeriod(period)\r\n return periodInt + 1\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, multiplier] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.multiplier = multiplier\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { period, multiplier } = this.attrs\r\n const { high, low, close } = this.data\r\n const atr = new AverageTrueRange(period)\r\n const finalUpperBand: number[] = []\r\n const finalLowerBand: number[] = []\r\n const supertrend: boolean[] = []\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.uptrendColor)\r\n for (let i = 1; i < close.length; i++) {\r\n atr.add(high[i], low[i], close[i - 1])\r\n\r\n // compute bands\r\n const avg = (high[i] + low[i]) / 2\r\n const upperBand = avg + multiplier * atr.value\r\n const lowerBand = avg - multiplier * atr.value\r\n\r\n finalUpperBand[i] = upperBand\r\n finalLowerBand[i] = lowerBand\r\n\r\n // identify supertrend\r\n if (close[i] > finalUpperBand[i - 1]) {\r\n supertrend[i] = true\r\n } else if (close[i] < finalLowerBand[i - 1]) {\r\n supertrend[i] = false\r\n } else {\r\n supertrend[i] = supertrend[i - 1]\r\n }\r\n\r\n // adjust bands\r\n if (supertrend[i] && finalLowerBand[i] < finalLowerBand[i - 1]) {\r\n finalLowerBand[i] = finalLowerBand[i - 1]\r\n }\r\n if (!supertrend[i] && finalUpperBand[i] > finalUpperBand[i - 1]) {\r\n finalUpperBand[i] = finalUpperBand[i - 1]\r\n }\r\n\r\n const x = this.fx(i)\r\n if (i < period || x + leftOffset < 0) {\r\n continue\r\n }\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n\r\n if (supertrend[i] && !supertrend[i - 1]) {\r\n // buy\r\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalUpperBand[i - 1])))\r\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n } else if (supertrend[i]) {\r\n // keep buying\r\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n } else {\r\n // keep selling\r\n context.moveTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n }\r\n lastBarToRender = i\r\n }\r\n context.stroke()\r\n\r\n if (firstBarToRender === undefined) {\r\n context.translate(-0.5, -0.5)\r\n return\r\n }\r\n\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.downtrendColor)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n if (!supertrend[i] && supertrend[i - 1]) {\r\n // sell\r\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalLowerBand[i - 1])))\r\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n } else if (!supertrend[i]) {\r\n // keep selling\r\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n } else {\r\n // keep buying\r\n context.moveTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n }\r\n }\r\n context.stroke()\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const multiplier = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'multiplier',\r\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.Multiplier,\r\n required: true,\r\n step: 0.1,\r\n min: 0.0,\r\n max: 999,\r\n }\r\n\r\n const uptrendColor = {\r\n type: 'color',\r\n label: 'Uptrend Color',\r\n name: 'uptrendColor',\r\n value: this.attrs.uptrendColor ?? this.getFreeColor(),\r\n }\r\n const downtrendColor = {\r\n type: 'color',\r\n label: 'Downtrend Color',\r\n name: 'downtrendColor',\r\n value: this.attrs.downtrendColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, multiplier, uptrendColor, downtrendColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'multiplier':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'uptrendColor':\r\n case 'downtrendColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor(): string {\r\n return this.attrs.uptrendColor\r\n }\r\n\r\n toString() {\r\n return `Supertrend ${this.attrs.period},${this.attrs.multiplier}`\r\n }\r\n}\r\n\r\nSupertrend.prototype.defaults = {\r\n uptrendColor: COLORS.Uptrend,\r\n downtrendColor: COLORS.Downtrend,\r\n}\r\n\r\nexport default Supertrend\r\n","import * as d3 from 'd3'\r\n\r\nimport { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport utils from '../utils'\r\nimport { convertColorToHEX, getHEXWithSpecificAplha } from '../utils/colors'\r\nimport { getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\nconst VP_COLORS = {\r\n UP: '#00FF00',\r\n DOWN: '#FF0000',\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 20,\r\n Opacity: 0.3,\r\n}\r\n\r\ninterface Attrs {\r\n period: number | string\r\n opacity: number\r\n upColor?: string\r\n downColor?: string\r\n}\r\n\r\nfunction applyOpacityToColor(color: string, opacity: number) {\r\n return getHEXWithSpecificAplha(convertColorToHEX(color), opacity)\r\n}\r\n\r\nfunction getColorsWithAppliedOpacity(attrs: Attrs) {\r\n return [\r\n applyOpacityToColor(attrs.upColor ?? VP_COLORS.UP, attrs.opacity),\r\n applyOpacityToColor(attrs.downColor ?? VP_COLORS.DOWN, attrs.opacity),\r\n ]\r\n}\r\n\r\n// Only time when we want value to be able to equal start of segment is first segment,\r\n// because start of next segment is equal to end of previous and value would match two segments\r\nfunction isInSegment(val: number, start: number, end: number, notEqualStart: boolean) {\r\n return (notEqualStart ? val > start : val >= start) && val <= end\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const opacity = parseFloat(values[1]) || DEFAULT_PARAMETERS.Opacity\r\n\r\n return [period, opacity]\r\n}\r\n\r\nclass VolumeProfile extends Overlay {\r\n static type = OverlayType.Vp\r\n static label = 'Volume Profile'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, opacity] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.opacity = opacity\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (typeof this.attrs.period !== 'number') {\r\n return\r\n }\r\n super.renderContent()\r\n\r\n const chartModel = this.model.chart() as Chart\r\n const { leftOffset, width } = chartModel\r\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\r\n const chartWidth = width - left.width - right.width\r\n\r\n if (this.data.close.length === 0) return\r\n\r\n const firstBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n\r\n const lastBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRender, lastBarToRender)\r\n if (areNoBarsVisible) return\r\n\r\n const [upColor, downColor] = getColorsWithAppliedOpacity(this.attrs)\r\n const [minClose, maxClose] = utils.minMax(this.data.close.slice(firstBarToRender.index, lastBarToRender.index))\r\n\r\n const segment = Math.abs(maxClose - minClose) / this.attrs.period\r\n const segments = [] // create an empty array to hold the segments\r\n\r\n for (let i = 0; i < this.attrs.period; i++) {\r\n const segmentStart = minClose + segment * i // calculate start of current segment\r\n const segmentEnd = segmentStart + segment // calculate end of current segment\r\n segments.push({ start: segmentStart, end: segmentEnd, up: 0, down: 0 }) // add segment to array\r\n }\r\n\r\n // loop through visible bars and assign volumes to segments\r\n for (let i = firstBarToRender.index; i <= lastBarToRender.index; i++) {\r\n const segmentIndex: number = segments.findIndex((item, segmentIndex) =>\r\n isInSegment(this.data.close[i], item.start, item.end, !!segmentIndex)\r\n )\r\n if (segmentIndex === -1) continue\r\n const volumeTrend = this.data.close[i] < this.data.open[i] ? 'down' : 'up'\r\n segments[segmentIndex][volumeTrend] += this.data.volume[i]\r\n }\r\n\r\n const max = utils.max(segments.map((item) => item.up + item.down))\r\n const rangeMax = chartWidth * 0.4 // maximum range in pixels where longest bar would reach (now it's 40% of chart width)\r\n const volumeFX = d3.scaleLinear().range([0, rangeMax]).domain([0, max])\r\n\r\n segments.forEach((item) => {\r\n const y = Math.round(this.fy(item.start))\r\n const segmentHeightRaw = Math.round(this.fy(item.end)) - y // raw segment height without gap between segments\r\n const segmentHeight = segmentHeightRaw + (Math.abs(segmentHeightRaw) > 5 ? 2 : 1) // apply gap to segment based on how high segment is\r\n const x = Math.abs(leftOffset) // segments are alligned to left side of chart which equal to absoulute value of leftOffset\r\n const upSegmentWidth = Math.round(volumeFX(item.up))\r\n const downSegmentWidth = Math.round(volumeFX(item.down))\r\n\r\n context.fillStyle = upColor\r\n context.fillRect(x, y, upSegmentWidth, segmentHeight)\r\n context.fillStyle = downColor\r\n context.fillRect(x + upSegmentWidth, y, downSegmentWidth, segmentHeight)\r\n })\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Zones',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const opacity = {\r\n type: 'number',\r\n label: 'Opacity',\r\n name: 'opacity',\r\n value: this.attrs.opacity ?? DEFAULT_PARAMETERS.Opacity,\r\n required: true,\r\n min: 0,\r\n max: 1,\r\n step: 0.1,\r\n }\r\n const upColor = {\r\n type: 'color',\r\n label: 'Up Color',\r\n name: 'upColor',\r\n value: this.attrs.upColor ?? VP_COLORS.UP,\r\n }\r\n const downColor = {\r\n type: 'color',\r\n label: 'Down Color',\r\n name: 'downColor',\r\n value: this.attrs.downColor ?? VP_COLORS.DOWN,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, opacity, upColor, downColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n opacity: `${opacity.label} must be a number between ${opacity.min} and ${opacity.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'opacity':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'upColor':\r\n case 'downColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.upColor || VP_COLORS.UP\r\n }\r\n\r\n toString() {\r\n return `VP ${this.attrs.period}`\r\n }\r\n}\r\n\r\nVolumeProfile.prototype.defaults = { upColor: VP_COLORS.UP, downColor: VP_COLORS.DOWN }\r\n\r\nexport default VolumeProfile\r\n","import { OverlayType } from '../constants/common'\r\nimport { dateFromUnixTimestamp } from '../utils'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\nconst datesAreOnSameDay = (first: Date, second: Date) =>\r\n first.getFullYear() === second.getFullYear() &&\r\n first.getMonth() === second.getMonth() &&\r\n first.getDate() === second.getDate()\r\n\r\ntype DefaultCalculatedValuesType = {\r\n vwap: number[]\r\n}\r\n\r\nexport class VWapCalculation extends MainCalculation {\r\n static type = OverlayType.Vwap\r\n\r\n getDefaultCalculatedValues() {\r\n return { vwap: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { date, close, low, high, volume } = this.quote\r\n const lastIndex = date.length - 1\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let cumulativePV = 0\r\n let cumulativeVolume = 0\r\n\r\n for (let i = 0; i <= lastIndex; i++) {\r\n if (i > 0) {\r\n const prevDate = dateFromUnixTimestamp(date[i - 1])\r\n if (!datesAreOnSameDay(prevDate, dateFromUnixTimestamp(date[i]))) {\r\n cumulativePV = 0\r\n cumulativeVolume = 0\r\n }\r\n }\r\n\r\n const typicalPrice = (close[i] + low[i] + high[i]) / 3\r\n const pv = typicalPrice * volume[i]\r\n\r\n cumulativePV += pv\r\n cumulativeVolume += volume[i]\r\n\r\n this.calculatedValues.vwap[i] = cumulativePV / cumulativeVolume\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { OverlayType } from '../constants/common'\r\nimport { VWapCalculation } from '../indicator-calculation/vwap'\r\nimport PaneModel from '../models/pane'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n color: string\r\n}\r\n\r\nclass VWAP extends Overlay {\r\n static type = OverlayType.Vwap\r\n static label = 'VWAP (intraday charts)'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 1\r\n }\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.attrs.period = 5\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n if (!this.isRendered()) {\r\n return\r\n }\r\n\r\n const { leftOffset, width } = this.model.chart()\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n const vwapCalculation = new VWapCalculation({\r\n quote: this.data,\r\n options: { period: this.attrs.period },\r\n })\r\n\r\n vwapCalculation.calculate(({ vwap }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return // continue\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false // break\r\n }\r\n const y = Math.round(this.fy(vwap[dataIndex]))\r\n context.lineTo(x, y)\r\n })\r\n\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [color],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'color':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n isRendered() {\r\n return this.model.chart().quote().isIntraday\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return this.isRendered()\r\n }\r\n\r\n toString() {\r\n return `VWAP`\r\n }\r\n}\r\n\r\nVWAP.prototype.defaults = { color: '#9467bd' }\r\n\r\nexport default VWAP\r\n","import { OverlayType } from '../constants/common'\r\nimport bb from './bb'\r\nimport dch from './dch'\r\nimport ema from './ema'\r\nimport ema2 from './ema2'\r\nimport hilo from './hilo'\r\nimport hline from './hline'\r\nimport ic from './ic'\r\nimport icf from './icf'\r\nimport kch from './kch'\r\nimport none from './none'\r\nimport overlay from './overlay'\r\nimport patterns from './patterns'\r\nimport pp from './pp'\r\nimport sar from './sar'\r\nimport sma from './sma'\r\nimport sma2 from './sma2'\r\nimport str from './str'\r\nimport vp from './vp'\r\nimport vwap from './vwap'\r\n\r\nexport const overlaysByType = Object.freeze({\r\n [OverlayType.Overlay]: overlay,\r\n [OverlayType.None]: none,\r\n [OverlayType.Bb]: bb,\r\n [OverlayType.Dch]: dch,\r\n [OverlayType.Ema]: ema,\r\n [OverlayType.Ema2]: ema2,\r\n [OverlayType.Hilo]: hilo,\r\n [OverlayType.Hline]: hline,\r\n [OverlayType.Ic]: ic,\r\n [OverlayType.Icf]: icf,\r\n [OverlayType.Kch]: kch,\r\n [OverlayType.Patterns]: patterns,\r\n [OverlayType.Pp]: pp,\r\n [OverlayType.Sar]: sar,\r\n [OverlayType.Sma]: sma,\r\n [OverlayType.Sma2]: sma2,\r\n [OverlayType.Str]: str,\r\n [OverlayType.Vp]: vp,\r\n [OverlayType.Vwap]: vwap,\r\n})\r\n","import {\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n SpecificChartFunctionality,\r\n} from './constants/common'\r\nimport { captureException, getIsSSr } from './utils/helpers'\r\n\r\nexport { getSanitizedTicker } from './utils/ticker-sanitizer'\r\n\r\nfunction getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nclass Utils {\r\n static min(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] < +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let min = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el < min) {\r\n min = el\r\n }\r\n }\r\n }\r\n return min\r\n }\r\n\r\n static max(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] > +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let max = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return max\r\n }\r\n\r\n static minMax(...args: number[][]) {\r\n let max\r\n let min = (max = args[0][0] as number)\r\n for (const arg of args) {\r\n for (const el of arg) {\r\n if (el < min) {\r\n min = el\r\n }\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return [min, max]\r\n }\r\n\r\n static getScaleRatio() {\r\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\r\n }\r\n\r\n static setSizeOnCanvasElement({\r\n canvasElement,\r\n width,\r\n height,\r\n ratio = Utils.getScaleRatio(),\r\n }: {\r\n canvasElement: HTMLCanvasElement | null\r\n width: number\r\n height: number\r\n ratio?: number\r\n }) {\r\n if (canvasElement) {\r\n canvasElement.width = width * ratio\r\n canvasElement.height = height * ratio\r\n canvasElement.style.width = width + 'px'\r\n canvasElement.style.height = height + 'px'\r\n }\r\n }\r\n\r\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\r\n const date = referenceDate || new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n return (isDst ? 4 : 5) * 60 * 60\r\n }\r\n\r\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\r\n const date = new Date(referenceDate)\r\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\r\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\r\n const offsetDirectionCoefficient = addOffset ? 1 : -1\r\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\r\n return date\r\n }\r\n\r\n // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\r\n static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = convertLocalToNyTime(new Date(), true)\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n }\r\n\r\n static dateFromUnixTimestamp(timestamp: number) {\r\n /*\r\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\r\n * The function adds seconds to the date instance if it exceeds 60.\r\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\r\n * */\r\n const date = new Date(0)\r\n date.setUTCSeconds(timestamp)\r\n return Utils.convertLocalToNyTime(date, true)\r\n }\r\n\r\n static dateStringFromDate(date: Date) {\r\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\r\n 2,\r\n '0'\r\n )}`\r\n }\r\n\r\n static dateFromDateString(dateString: string) {\r\n const [yyyy, mm, dd] = dateString.split('-')\r\n\r\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\r\n if (Number.isNaN(date.getTime())) {\r\n captureException(new Error('Invalid Date'), { extra: { date } })\r\n }\r\n\r\n return date\r\n }\r\n\r\n static isMobile(testTouchPoints?: boolean) {\r\n if (getIsSSr()) return false\r\n let isMobileOs = false\r\n\r\n // New iOS versions no longer report iPad in user agent\r\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\r\n try {\r\n document.createEvent('TouchEvent')\r\n isMobileOs = true\r\n } catch (e) {}\r\n } else {\r\n isMobileOs = !!navigator.userAgent.match(\r\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\r\n )\r\n }\r\n\r\n if (testTouchPoints) {\r\n try {\r\n return (\r\n isMobileOs &&\r\n (window.navigator.msMaxTouchPoints ||\r\n window.navigator.maxTouchPoints ||\r\n 'ontouchstart' in document.createElement('div'))\r\n )\r\n } catch (e) {}\r\n }\r\n\r\n return isMobileOs\r\n }\r\n\r\n static isIPad() {\r\n const matchesIPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\r\n }\r\n\r\n static getCookie(name: string) {\r\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n }\r\n\r\n static setCookie(name: string, value: string, expires: Date) {\r\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (document.location.hostname !== 'localhost') {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n }\r\n}\r\n\r\nexport default Utils\r\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\r\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\r\nexport const dateStringFromDate = Utils.dateStringFromDate\r\nexport const dateFromDateString = Utils.dateFromDateString\r\n\r\nexport function getFullscreenStatus(): boolean {\r\n return (\r\n document.fullscreenElement ??\r\n document.webkitFullscreenElement ??\r\n document.mozFullScreenElement ??\r\n document.msFullscreenElement ??\r\n false\r\n )\r\n}\r\n\r\nexport function getRequestFullscreen(element: HTMLElement) {\r\n return (\r\n element.requestFullscreen ??\r\n element.webkitRequestFullScreen ??\r\n element.mozRequestFullScreen ??\r\n element.msRequestFullscreen\r\n )\r\n}\r\n\r\nexport function getExitFullscreen() {\r\n return (\r\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\r\n )\r\n}\r\n\r\nexport function ready(fn: () => void) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n\r\nexport function getChartsDimensions(chartElementId: string) {\r\n const PADDING = 2 // Border widths\r\n const containerElement = document.getElementById(chartElementId)\r\n\r\n const box = containerElement?.getBoundingClientRect()\r\n\r\n return {\r\n width: Math.max((box?.width ?? 0) - PADDING, 0),\r\n height: Math.max((box?.height ?? 0) - PADDING, 0),\r\n }\r\n}\r\n\r\nexport function getIsMobileScreenSize() {\r\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\r\n}\r\n\r\nexport function getIsMobilePortrait(isMobile?: boolean) {\r\n if (isMobile ?? Utils.isMobile()) {\r\n return window.orientation % 180 === 0\r\n }\r\n return false\r\n}\r\n\r\nexport function numberToStringWithUnitsSuffix(value: number) {\r\n let suffix = ''\r\n if (value >= 1000000000) {\r\n value /= 1000000000\r\n suffix = 'B'\r\n } else if (value >= 1000000) {\r\n value /= 1000000\r\n suffix = 'M'\r\n } else if (value >= 1000) {\r\n value /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n return value.toFixed(2) + suffix\r\n}\r\n\r\nexport function isRedesignEnabled() {\r\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\r\n}\r\n\r\nexport function isRedesignedPage(\r\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\r\n matchingPages = [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ]\r\n) {\r\n return (\r\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\r\n // Legacy design on quote uses redesigned elements (page header + chart controls)\r\n obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n )\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\n\r\nconst requestsAbortControllersCache: ObjectHash = {}\r\n\r\nexport function removeFromAbortCache(key: string) {\r\n delete requestsAbortControllersCache[key]\r\n}\r\n\r\nexport function abortRequest(key: string) {\r\n requestsAbortControllersCache[key]?.abort()\r\n removeFromAbortCache(key)\r\n}\r\n\r\nexport function getIsAbortError(error: Error) {\r\n return error.name === 'AbortError'\r\n}\r\n\r\nexport function createRequestAbortController({\r\n key,\r\n shouldAbortRunningRequest = false,\r\n}: {\r\n key: string\r\n shouldAbortRunningRequest?: boolean\r\n}) {\r\n if (shouldAbortRunningRequest) {\r\n abortRequest(key)\r\n }\r\n const controller = 'AbortController' in window ? new AbortController() : undefined\r\n if (controller) {\r\n requestsAbortControllersCache[key] = controller\r\n }\r\n return controller\r\n}\r\n","import * as websiteShared from '@finviz/website'\r\n\r\nimport { captureException } from './helpers'\r\n\r\n/**\r\n * Hook used to asynchronously load a module\r\n *\r\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#useasyncmodule)\r\n */\r\nexport const useAsyncModule = (\r\n props: {\r\n importFn: () => Promise\r\n onError?: () => void\r\n cacheKey: string\r\n captureException?: (exception: Error, captureContext?: { extra: Record }) => void\r\n errorSeverity?: 'medium' | 'high'\r\n } & (websiteShared.ControlledModuleConfig | websiteShared.SuspenseModuleConfig)\r\n) =>\r\n websiteShared.useAsyncModule({ captureException, ...props }) as [\r\n SuspenseMode extends true ? T : T | null,\r\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\r\n ]\r\n","import { getIsSSr } from './helpers'\r\n\r\n// Extracted from isMobile, and modified to fit usage\r\nfunction isFirefoxDesktop() {\r\n const matchesAndroid = navigator.userAgent.match(/Android/i)\r\n const matchesWebOS = navigator.userAgent.match(/webOS/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesiPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesBlackBerry = navigator.userAgent.match(/BlackBerry/i)\r\n const matchesWindowsPhone = navigator.userAgent.match(/Windows Phone/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n const isMobileDevice =\r\n matchesAndroid ||\r\n matchesWebOS ||\r\n matchesIPhone ||\r\n matchesiPad ||\r\n matchesIPod ||\r\n matchesBlackBerry ||\r\n matchesWindowsPhone ||\r\n matchesIOSLike\r\n\r\n const matchesFirefox = !!navigator.userAgent.match(/firefox/i)\r\n\r\n return matchesFirefox && !isMobileDevice\r\n}\r\n\r\n// Due bug in FireFox, when if HW acceleration is used canvas is blurry\r\n// we need to set canvas as CPU only\r\nconst shouldUseCPUOnly = getIsSSr() ? false : isFirefoxDesktop()\r\n\r\nexport function getContextWithCache(canvas: HTMLCanvasElement | null): CanvasRenderingContext2D | null {\r\n if (!canvas) {\r\n return null\r\n }\r\n\r\n const context = canvas.getContext('2d', shouldUseCPUOnly ? { willReadFrequently: true } : undefined)\r\n if (!context) {\r\n window.Sentry?.captureMessage('Context unavailable')\r\n return null\r\n }\r\n\r\n context._cache = {}\r\n\r\n const _restore = CanvasRenderingContext2D.prototype.restore\r\n context.restore = function () {\r\n this._cache = {}\r\n return _restore.apply(this)\r\n }\r\n\r\n context.set = function (key, value) {\r\n if (this._cache[key] !== value) {\r\n this[key] = value\r\n this._cache[key] = value\r\n }\r\n }\r\n\r\n return context\r\n}\r\n","import { Theme } from '../../types/shared'\r\nimport twColors from '../constants/colors'\r\nimport { ChartEventType } from '../constants/common'\r\nimport math, { BIG_NUMBER_VALUES, BigNumber } from '../helpers/math'\r\nimport utils from '../utils'\r\nimport { formatDateToStringUS } from '../utils/helpers'\r\n\r\ninterface IChartEventBase {\r\n elementId: string\r\n eventType: ChartEventType\r\n dateTimestamp: number // represent 'earningsDate' column of earnings and 'exdate' column for dividends & split\r\n}\r\n\r\nexport interface IEarnings extends IChartEventBase {\r\n epsActual?: number\r\n epsEstimate?: number\r\n epsReportedActual?: number\r\n epsReportedEstimate?: number\r\n fiscalEndDate: number\r\n fiscalPeriod: string\r\n salesActual?: number\r\n salesEstimate?: number\r\n}\r\n\r\nexport interface IDividends extends IChartEventBase {\r\n ordinary: number\r\n special: number\r\n}\r\n\r\nexport interface ISplit extends IChartEventBase {\r\n factorFrom: number\r\n factorTo: number\r\n}\r\n\r\nexport enum ChartEventBadgeState {\r\n default = 'default',\r\n hover = 'hover',\r\n selected = 'selected',\r\n}\r\n\r\nexport interface IChartEventBadgeProps {\r\n theme: Theme\r\n state: ChartEventBadgeState\r\n width: number\r\n}\r\n\r\ninterface IGetChartEventBadgeColors {\r\n theme: Theme\r\n state: ChartEventBadgeState\r\n colors: IBadgeColors\r\n}\r\n\r\ninterface IBadgeStateColors {\r\n default: string\r\n hover: string\r\n selected: string\r\n}\r\n\r\ninterface IBadgeThemeColors {\r\n outerStroke: string\r\n innerStroke: string\r\n innerFill: IBadgeStateColors\r\n textFill: IBadgeStateColors\r\n}\r\n\r\ninterface IBadgeColors {\r\n light: IBadgeThemeColors\r\n dark: IBadgeThemeColors\r\n}\r\n\r\nexport function getChartEventBadgeColors({ theme, state, colors }: IGetChartEventBadgeColors) {\r\n return {\r\n outerStroke: colors[theme].outerStroke,\r\n innerStroke: colors[theme].innerStroke,\r\n innerFill: colors[theme].innerFill[state],\r\n textFill: colors[theme].textFill[state],\r\n }\r\n}\r\n\r\nexport function getFormattedEventDate(\r\n exdate: number,\r\n hasEarningsDateSuffix = false,\r\n options: ObjectHash = {\r\n month: 'short',\r\n }\r\n) {\r\n const parsedDate = utils.dateFromUnixTimestamp(exdate)\r\n\r\n const hours = parsedDate.getHours()\r\n const formattedDate = formatDateToStringUS(parsedDate, options)\r\n\r\n if (hasEarningsDateSuffix) {\r\n let suffix = ''\r\n\r\n if (hours <= 9) {\r\n suffix = 'BMO'\r\n } else if (hours >= 16) {\r\n suffix = 'AMC'\r\n }\r\n\r\n return `${formattedDate} ${suffix}`\r\n }\r\n\r\n return formattedDate\r\n}\r\n\r\nexport function getFormattedValue({\r\n value,\r\n bigNumberUnit,\r\n maxDecimalPlaces = 3,\r\n}: {\r\n value: number\r\n bigNumberUnit?: BigNumber\r\n maxDecimalPlaces?: number\r\n}) {\r\n let numberString = ''\r\n let suffix = ''\r\n\r\n if (bigNumberUnit === undefined) {\r\n numberString = math.round({ value, overridePlaces: 3 })\r\n } else {\r\n const bigNumber = math.formatBigNumber(value * BIG_NUMBER_VALUES[bigNumberUnit], 3, BigNumber.Million)\r\n numberString = parseFloat(bigNumber.substring(0, bigNumber.length - 1)).toString() // parseFloat with toString are removing trailing zeroes\r\n suffix = bigNumber.substring(bigNumber.length - 1)\r\n }\r\n\r\n const [wholeNumber, decimalNumber] = numberString.split('.')\r\n\r\n if (decimalNumber === undefined) return `${wholeNumber}${suffix}`\r\n\r\n let formattedDecimalNumber = decimalNumber\r\n if (maxDecimalPlaces === 2 || decimalNumber[decimalNumber.length - 1] === '0') {\r\n formattedDecimalNumber = decimalNumber.slice(0, -1)\r\n }\r\n\r\n return `${[wholeNumber, formattedDecimalNumber].join('.')}${suffix}`\r\n}\r\n\r\nexport function getChartEventBageColors(colorKey: 'violet' | 'blue' | 'red' | 'gray' | 'purple' | 'green') {\r\n return {\r\n light: {\r\n outerStroke: twColors.white,\r\n innerStroke: twColors[colorKey][400],\r\n innerFill: {\r\n default: twColors[colorKey][50],\r\n hover: twColors[colorKey][100],\r\n selected: twColors[colorKey][400],\r\n },\r\n textFill: {\r\n default: twColors[colorKey][500],\r\n hover: twColors[colorKey][600],\r\n selected: twColors.white,\r\n },\r\n },\r\n dark: {\r\n outerStroke: twColors.gray[900],\r\n innerStroke: twColors[colorKey][400],\r\n innerFill: {\r\n default: twColors[colorKey][800],\r\n hover: twColors[colorKey][600],\r\n selected: twColors[colorKey][400],\r\n },\r\n textFill: {\r\n default: twColors.white,\r\n hover: twColors.white,\r\n selected: twColors.white,\r\n },\r\n },\r\n } as IBadgeColors\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { ChartConfigChartPane, Instrument, ObjectHash } from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport { chartsByType } from '../charts/charts'\r\nimport {\r\n CRYPTOS,\r\n ChartEditorEnum,\r\n ChartElementType,\r\n OFFSET,\r\n PADDING,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TIMEFRAME_SECONDS,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getPercentageFromValue } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport ChartLayoutModel from '../models/chart_layout'\r\nimport { IChartSettings } from '../models/chart_settings/interfaces'\r\nimport { Mouse } from '../models/mouse'\r\nimport Pane from '../models/pane'\r\nimport Quote, { QuoteGetParams } from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Utils, { dateFromUnixTimestamp } from '../utils'\r\nimport { captureException } from './helpers'\r\n\r\nconst DAY_IN_SECONDS = 86400\r\nconst TWO_MIN_IN_MS = 2 * 60 * 1000\r\nconst virtualDatesCache: ObjectHash<{\r\n fromSeconds: number\r\n toSeconds: number\r\n lastUsed: number\r\n virtualDates: number[]\r\n}> = {}\r\n\r\n// The reason to use this func instead of dateFns.isSameDay is performance as this is way faster\r\nfunction areTimestampsFromSameDay({ ts1, ts2 }: { ts1: number; ts2: number }) {\r\n const ts1Utc = ts1\r\n const ts2Utc = ts2\r\n return Math.floor(ts1Utc / DAY_IN_SECONDS) === Math.floor(ts2Utc / DAY_IN_SECONDS)\r\n}\r\n\r\nfunction getVirtualDatesCacheId({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n}) {\r\n return `${ticker}-${timeframe}-${idRevision}`\r\n}\r\n\r\nfunction getCachedVirtualDates({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n fromSeconds,\r\n toSeconds,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n fromSeconds: number\r\n toSeconds: number\r\n}) {\r\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\r\n const cache = virtualDatesCache[id]\r\n if (cache?.fromSeconds <= fromSeconds && cache?.toSeconds >= toSeconds) {\r\n cache.lastUsed = Date.now()\r\n if (cache.fromSeconds === fromSeconds && cache.toSeconds === toSeconds) {\r\n return cache.virtualDates\r\n }\r\n return cache.virtualDates.filter(\r\n (virtualDateSeconds) => virtualDateSeconds >= fromSeconds && virtualDateSeconds <= toSeconds\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction checkVirtualCacheSize() {\r\n const now = Date.now()\r\n Object.keys(virtualDatesCache).forEach((virtualDatesCacheId) => {\r\n if (virtualDatesCache[virtualDatesCacheId].lastUsed < now - TWO_MIN_IN_MS) {\r\n delete virtualDatesCache[virtualDatesCacheId]\r\n }\r\n })\r\n}\r\n\r\nfunction setCachedVirtualDates({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n fromSeconds,\r\n toSeconds,\r\n virtualDates,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n fromSeconds: number\r\n toSeconds: number\r\n virtualDates: number[]\r\n}) {\r\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\r\n checkVirtualCacheSize()\r\n virtualDatesCache[id] = {\r\n fromSeconds,\r\n toSeconds,\r\n virtualDates,\r\n lastUsed: Date.now(),\r\n }\r\n}\r\n\r\nconst MAX_BAR_BORDER_WIDTH = 1\r\nconst MIN_BAR_MARGIN_WIDTH = 0\r\nconst MAX_BAR_MARGIN_WIDTH = 16\r\n\r\nexport function getBarWidthWithMarginByParts({\r\n zoomFactor = 1,\r\n chartLayout,\r\n}: {\r\n zoomFactor?: number\r\n chartLayout: ChartLayoutModel\r\n}) {\r\n const { ChartSettings } = chartLayout.settings\r\n const settingsCenter = ChartSettings.center\r\n const barMargin =\r\n zoomFactor > 1 && settingsCenter.barMargin === 0\r\n ? Math.min(settingsCenter.barWidth, 1 - 1 / zoomFactor)\r\n : settingsCenter.barMargin\r\n\r\n const barFillWidth = settingsCenter.barWidth * zoomFactor\r\n const barBorderWidth = Math.min(settingsCenter.border * zoomFactor, MAX_BAR_BORDER_WIDTH)\r\n const barMarginWidth = Math.max(MIN_BAR_MARGIN_WIDTH, Math.min(barMargin * zoomFactor, MAX_BAR_MARGIN_WIDTH))\r\n\r\n return {\r\n barFillWidth,\r\n barBorderWidth,\r\n barMarginWidth,\r\n }\r\n}\r\n\r\nexport function getBarWidthWithMargin({\r\n zoomFactor = 1,\r\n chartLayout,\r\n shouldRound = true,\r\n}: {\r\n zoomFactor?: number\r\n chartLayout: ChartLayoutModel\r\n shouldRound?: boolean\r\n}) {\r\n const { barFillWidth, barBorderWidth, barMarginWidth } = getBarWidthWithMarginByParts({ zoomFactor, chartLayout })\r\n\r\n const barWidth = barFillWidth + barBorderWidth * 2 + barMarginWidth\r\n if (!shouldRound) {\r\n return barWidth\r\n }\r\n const roundDecimalPlaces = barWidth > 100 ? 10 : 10000\r\n return Math.round(barWidth * roundDecimalPlaces) / roundDecimalPlaces\r\n}\r\n\r\nexport function getBarWithoutMarginWidth(chartModel: Chart) {\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n chartLayout: chartModel.chart_layout(),\r\n zoomFactor: chartModel.zoomFactor,\r\n })\r\n return barFillWidth + barBorderWidth * 2\r\n}\r\n\r\nexport function getHalfBarWidth(chartModel: Chart, floor = true) {\r\n // Math.max(1, num) is kept from previous implementation, it is highly likely\r\n // that some function which use getHalfBarWidth expect return to be >= 1,\r\n // because we never render bar with width < 1 but at the same time when we have and odd\r\n // width like 5, wa want to floor because of pixel perfect rendering\r\n // but some function require raw not floored number to be able to do it's calculations\r\n // TODO: it would be good to possibly revisit this and check usage if we do need\r\n // to perform floor as well as limit result to be >= 1 but it is most likely necessary\r\n const halfBarWidthRaw = Math.max(1, getBarWithoutMarginWidth(chartModel) / 2)\r\n return floor ? ~~halfBarWidthRaw : halfBarWidthRaw\r\n}\r\n\r\nconst DEFAULT_ZOOM_GUESS_INCREMENT = 0.001\r\n\r\nconst zoomFactorForBarsToDisplayCache: ObjectHash = {}\r\nconst zoomFactorForBarsToDisplayCacheKeys: string[] = []\r\nconst NUMBER_OF_CACHED_ZOOM_FACTORS = 10\r\nconst getZoomFactorFromCache = (key: string) => zoomFactorForBarsToDisplayCache[key] ?? null\r\nconst setZoomFactorToCache = (key: string, value: number) => {\r\n if (!zoomFactorForBarsToDisplayCacheKeys.includes(key)) {\r\n zoomFactorForBarsToDisplayCacheKeys.unshift(key)\r\n if (zoomFactorForBarsToDisplayCacheKeys.length > NUMBER_OF_CACHED_ZOOM_FACTORS) {\r\n const poppedKey = zoomFactorForBarsToDisplayCacheKeys.pop()\r\n if (poppedKey) {\r\n delete zoomFactorForBarsToDisplayCache[poppedKey]\r\n }\r\n }\r\n }\r\n\r\n zoomFactorForBarsToDisplayCache[key] = value\r\n}\r\n\r\nexport function getZoomFactorForBarsToDisplay({\r\n chartVisibleWidth,\r\n numOfVisibleBars,\r\n chartLayout,\r\n}: {\r\n chartVisibleWidth: number\r\n numOfVisibleBars: number\r\n chartLayout: ChartLayoutModel\r\n}) {\r\n const defaultBarWidthWithMargin = getBarWidthWithMargin({ chartLayout })\r\n const barWidthWithMargin = chartVisibleWidth / numOfVisibleBars\r\n const cacheKey = `${defaultBarWidthWithMargin}-${barWidthWithMargin}`\r\n let zoomIncrement = 0\r\n let currentZoomFactor = 1\r\n let finalZoomFactor = getZoomFactorFromCache(cacheKey)\r\n let iteration = 0\r\n if (barWidthWithMargin <= defaultBarWidthWithMargin) {\r\n finalZoomFactor = barWidthWithMargin / defaultBarWidthWithMargin\r\n }\r\n while (finalZoomFactor === null) {\r\n iteration += 1\r\n const threshold = 0.01\r\n currentZoomFactor += zoomIncrement\r\n const barWidth = getBarWidthWithMargin({ zoomFactor: currentZoomFactor, chartLayout, shouldRound: false })\r\n const barWidthDiff = barWidthWithMargin - barWidth\r\n if (barWidthDiff > threshold) {\r\n zoomIncrement = zoomIncrement > 0 ? zoomIncrement * 2 : DEFAULT_ZOOM_GUESS_INCREMENT\r\n } else if (barWidthDiff < -threshold) {\r\n zoomIncrement = zoomIncrement < 0 ? zoomIncrement * 2 : -DEFAULT_ZOOM_GUESS_INCREMENT\r\n } else {\r\n finalZoomFactor = currentZoomFactor\r\n }\r\n\r\n if (iteration === 1000) {\r\n captureException(new Error('Invalid zoom factor from getZoomFactorForBarsToDisplay'), {\r\n extra: {\r\n iteration,\r\n zoomIncrement,\r\n barWidthWithMargin,\r\n barWidth,\r\n barWidthDiff,\r\n currentZoomFactor,\r\n chartLayout: chartLayout.toConfig(['colors', 'panes']),\r\n },\r\n })\r\n return currentZoomFactor\r\n }\r\n }\r\n\r\n setZoomFactorToCache(cacheKey, finalZoomFactor)\r\n\r\n return finalZoomFactor\r\n}\r\n\r\nexport function getTimeframeSeconds({\r\n lowerIndex,\r\n dates,\r\n timeframe,\r\n}: {\r\n lowerIndex: number\r\n dates: number[]\r\n timeframe: TIMEFRAME\r\n}) {\r\n const upperIndex = lowerIndex + 1\r\n const areBoundsDefined = ![dates[upperIndex], dates[lowerIndex]].some((index) => index === undefined)\r\n return areBoundsDefined ? dates[upperIndex] - dates[lowerIndex] : TIMEFRAME_SECONDS[timeframe]\r\n}\r\n\r\nfunction getVirtualTradedDays({\r\n dateStartSeconds,\r\n dateEndSeconds,\r\n datesSeconds,\r\n marketStartMinutes,\r\n}: {\r\n dateStartSeconds: number\r\n dateEndSeconds: number\r\n datesSeconds: number[]\r\n marketStartMinutes: number\r\n}) {\r\n const dateStart = dateFromUnixTimestamp(dateStartSeconds)\r\n const dateEnd = dateFromUnixTimestamp(dateEndSeconds)\r\n const isStartBeforeDates = dateStartSeconds < datesSeconds[0]\r\n const isEndAfterDates = datesSeconds.length > 0 && datesSeconds[datesSeconds.length - 1] < dateEndSeconds\r\n const firstDate = dateFromUnixTimestamp(datesSeconds[0])\r\n const lastDate = dateFromUnixTimestamp(datesSeconds[datesSeconds.length - 1])\r\n return dateFns\r\n .eachDayOfInterval({\r\n start:\r\n isStartBeforeDates && (dateFns.isWeekend(dateStart) || dateStart.getMinutes() < marketStartMinutes)\r\n ? dateFns.addBusinessDays(dateStart, -1)\r\n : dateStart,\r\n end: isEndAfterDates ? dateFns.addBusinessDays(dateEnd, 1) : dateEnd,\r\n })\r\n .filter((date) => {\r\n const ts2 = date.getTime() / 1000 - date.getTimezoneOffset() * 60\r\n return (\r\n !dateFns.isWithinInterval(date, { start: dateFns.startOfDay(firstDate), end: dateFns.endOfDay(lastDate) }) ||\r\n datesSeconds.some((dateTime) =>\r\n areTimestampsFromSameDay({\r\n ts1: dateTime - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateTime * 1000)),\r\n ts2,\r\n })\r\n )\r\n )\r\n })\r\n}\r\n\r\nexport function getVirtualTimeframeTradedDates({\r\n dateStart,\r\n dateEnd,\r\n quote,\r\n}: {\r\n dateStart: number\r\n dateEnd: number\r\n quote: Quote\r\n}) {\r\n const { date: dates, ticker, timeframe, instrument, isIntraday, marketStartMinutes } = quote\r\n const barsInDay = quote.getBarsInDay() ?? 0\r\n\r\n // Currently we're passing first and last quote dates to dateStart / dateEnd so this is always true\r\n // but this function can be used on other places in the future where it will work with dates out of quote dates range\r\n const isWithinRangeOfQuoteDate = dateStart === dates[0] && dateEnd === dates[dates.length - 1]\r\n\r\n const commonVirtualCacheProps = {\r\n idRevision: dates.length,\r\n ticker,\r\n timeframe,\r\n fromSeconds: dateStart,\r\n toSeconds: dateEnd,\r\n }\r\n const cachedDates = getCachedVirtualDates(commonVirtualCacheProps)\r\n if (cachedDates) {\r\n return cachedDates\r\n }\r\n if (!isIntraday || instrument !== Instrument.Stock) {\r\n if (isWithinRangeOfQuoteDate) {\r\n return dates\r\n }\r\n const timeframeSeconds = TIMEFRAME_SECONDS[timeframe]\r\n const firstDate = dates[0]\r\n const lastDate = dates[dates.length - 1]\r\n const numOfDatesBefore = Math.ceil((firstDate - dateStart) / timeframeSeconds)\r\n const numOfDatesAfter = Math.ceil((dateEnd - lastDate) / timeframeSeconds)\r\n return [\r\n ...Array.from({ length: numOfDatesBefore })\r\n .map((_, index) => firstDate - (index + 1) * timeframeSeconds)\r\n .reverse(),\r\n ...dates,\r\n ...Array.from({ length: numOfDatesAfter }).map((_, index) => lastDate + (index + 1) * timeframeSeconds),\r\n ]\r\n }\r\n\r\n const virtualTradedDays = isWithinRangeOfQuoteDate\r\n ? quote.getDaysInQuote()\r\n : getVirtualTradedDays({\r\n dateStartSeconds: dateStart,\r\n dateEndSeconds: dateEnd,\r\n datesSeconds: dates,\r\n marketStartMinutes,\r\n })\r\n\r\n const marketStartSeconds = marketStartMinutes * 60\r\n const barTimeframeSeconds = Array.from({ length: barsInDay }).map((_, i) => i * TIMEFRAME_SECONDS[timeframe])\r\n const quoteDatesTimestampOffset = Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateStart * 1000))\r\n const virtualDates = virtualTradedDays.flatMap((date) => {\r\n const daySeconds =\r\n date.getTime() / 1000 + Utils.getQuoteDateTimestampOffsetInSeconds(date) - date.getTimezoneOffset() * 60\r\n const dayStartSeconds = daySeconds + marketStartSeconds\r\n return barTimeframeSeconds.map(\r\n // Hourly market starts at 9:30 but all other time ticks should be rounded down to :00 of the current hour\r\n (barSeconds, index) =>\r\n ([TIMEFRAME.h, TIMEFRAME.h2, TIMEFRAME.h4].includes(timeframe) && index > 0 ? -1800 : 0) +\r\n dayStartSeconds +\r\n barSeconds\r\n )\r\n })\r\n\r\n if (!isWithinRangeOfQuoteDate) {\r\n virtualDates.filter((date, index, virtualTimeframeTradedDates) => {\r\n const isLowerBounded =\r\n date >= dateStart ||\r\n areTimestampsFromSameDay({\r\n ts1: date - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(date * 1000)),\r\n ts2: dateStart - quoteDatesTimestampOffset,\r\n })\r\n const isOneBeforeLowerBoundStarts = dateStart > date && dateStart < virtualTimeframeTradedDates[index + 1]\r\n return isLowerBounded || isOneBeforeLowerBoundStarts\r\n })\r\n }\r\n\r\n setCachedVirtualDates({\r\n ...commonVirtualCacheProps,\r\n virtualDates,\r\n })\r\n\r\n return virtualDates\r\n}\r\n\r\ninterface TimestampPositionGettersProps {\r\n quote: Quote\r\n}\r\n\r\nexport function getTimestampFromPositionX({ positionX, quote }: TimestampPositionGettersProps & { positionX: number }) {\r\n const { date, timeframe } = quote\r\n const dates = getVirtualTimeframeTradedDates({\r\n dateStart: date[0],\r\n dateEnd: date[date.length - 1],\r\n quote,\r\n })\r\n const dateStart = dates[0]\r\n const dateEnd = dates[dates.length - 1]\r\n const lastDateIndex = dates.length - 1\r\n if (positionX >= 0 && positionX <= lastDateIndex) {\r\n const lowerIndex = Math.floor(positionX)\r\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex, dates, timeframe })\r\n return dates[lowerIndex] + (positionX - lowerIndex) * timeframeSeconds\r\n }\r\n const isLookingBack = positionX < 0\r\n const averageBarDate = (dateEnd - dateStart) / dates.length\r\n const numOfSecondsOutOfBounds = isLookingBack\r\n ? Math.abs(positionX) * averageBarDate\r\n : (positionX - lastDateIndex) * averageBarDate\r\n return Math.round(isLookingBack ? dateStart - numOfSecondsOutOfBounds : dateEnd + numOfSecondsOutOfBounds)\r\n}\r\n\r\nexport function getPositionXFromTimestamp({ timestamp, quote }: TimestampPositionGettersProps & { timestamp: number }) {\r\n const { date, timeframe } = quote\r\n const dates = getVirtualTimeframeTradedDates({\r\n dateStart: date[0],\r\n dateEnd: date[date.length - 1],\r\n quote,\r\n })\r\n const dateStart = dates[0]\r\n const dateEnd = dates[dates.length - 1]\r\n const lastDateIndex = dates.length - 1\r\n if (timestamp >= dates[0] && timestamp <= dates[dates.length - 1]) {\r\n const upperIndex = timestamp === dateEnd ? lastDateIndex : dates.findIndex((date) => date > timestamp)\r\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex: upperIndex - 1, dates, timeframe })\r\n const positionDiffUpperTimestamp = (dates[upperIndex] - timestamp) / timeframeSeconds\r\n return upperIndex - positionDiffUpperTimestamp\r\n }\r\n const isLookingBack = timestamp < dateStart\r\n const averageBarDate = (dateEnd - dateStart) / dates.length\r\n return isLookingBack\r\n ? -((dateStart - timestamp) / averageBarDate)\r\n : lastDateIndex + (timestamp - dateEnd) / averageBarDate\r\n}\r\n\r\n// counterpart in Finviz-Website 'Finviz-Website/js/main/util.ts'\r\nexport function getInstrument(tickerRaw: string) {\r\n if (tickerRaw.indexOf('@') === 0) {\r\n const ticker = tickerRaw.substring(1) as keyof typeof CRYPTOS\r\n\r\n if (CRYPTOS[ticker]) {\r\n return Instrument.Crypto\r\n } else if (ticker.length === 6) {\r\n return Instrument.Forex\r\n } else {\r\n return Instrument.Futures\r\n }\r\n }\r\n return Instrument.Stock\r\n}\r\n\r\nexport function getPerfIndicatorTickerAndTimeframes({\r\n paneWithPerfIndicator,\r\n timeframe,\r\n}: {\r\n paneWithPerfIndicator: ChartConfigChartPane\r\n timeframe: TIMEFRAME\r\n}) {\r\n const { elements } = paneWithPerfIndicator\r\n const perfIndicatorElement = elements.find(({ type }) => type === 'indicators/perf')\r\n const tickers = perfIndicatorElement?.period?.split(',') ?? []\r\n return tickers.map((ticker) => ({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe,\r\n }))\r\n}\r\n\r\ninterface PrefetchPerfIndicatorAllQuotesProps extends Pick {\r\n paneWithPerfIndicator: ChartConfigChartPane\r\n chartUuid?: string\r\n}\r\n\r\nexport async function prefetchPerfIndicatorAllQuotes({\r\n paneWithPerfIndicator,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n}: PrefetchPerfIndicatorAllQuotesProps) {\r\n const tickersAndTimeframes = getPerfIndicatorTickerAndTimeframes({ paneWithPerfIndicator, timeframe })\r\n\r\n if (tickersAndTimeframes.length > 0) {\r\n const promises = tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\r\n Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n })\r\n )\r\n return Promise.all(promises)\r\n }\r\n return Promise.resolve([])\r\n}\r\n\r\ninterface RenderCrossProps {\r\n context: CanvasRenderingContext2D\r\n mouseModel: Mouse\r\n paneModel: Pane\r\n quote: Quote\r\n contentWidth: number\r\n contentHeight: number\r\n onRenderCrossText?: (context: CanvasRenderingContext2D, crossIndex: number) => void\r\n getRoundDecimalPlaces?: (price?: number) => number | undefined\r\n isIndicator?: boolean\r\n isPerfIndicator?: boolean\r\n}\r\n\r\nexport function renderCross({\r\n context,\r\n mouseModel,\r\n paneModel,\r\n quote,\r\n contentWidth,\r\n contentHeight,\r\n onRenderCrossText,\r\n getRoundDecimalPlaces,\r\n isIndicator = false,\r\n isPerfIndicator = false,\r\n}: RenderCrossProps) {\r\n const crossIndex = mouseModel.getCrossIndexForPane(paneModel)\r\n const chartModel = paneModel.chart()\r\n const { ChartSettings, IndicatorSettings } = getChartLayoutSettings(chartModel.chart_layout())\r\n const settings = isIndicator ? IndicatorSettings : ChartSettings\r\n const { Colors } = ChartSettings.general\r\n\r\n if (!mouseModel.getShouldRenderCrossInPane(paneModel)) {\r\n return false\r\n }\r\n\r\n const price = mouseModel.getPriceForPane(paneModel)\r\n const middle = paneModel.scale.x(crossIndex) + chartModel.leftOffset\r\n const isXAxisInView = middle > 0 && middle <= contentWidth\r\n if (isXAxisInView) {\r\n const x = middle + settings.left.width\r\n new Line(\r\n {\r\n x1: x,\r\n x2: x,\r\n y1: settings.top.height,\r\n y2: settings.top.height + contentHeight,\r\n strokeStyle: Colors.cross,\r\n },\r\n paneModel\r\n ).render(context)\r\n\r\n onRenderCrossText?.(context, crossIndex)\r\n }\r\n\r\n const domainRange = paneModel.scale.y\r\n .domain()\r\n .slice()\r\n .sort((a, b) => a - b)\r\n\r\n if (price === null || !(domainRange[0] <= price && price <= domainRange[1])) {\r\n return isXAxisInView\r\n }\r\n\r\n const priceFy = paneModel.scale.y(price)\r\n const y = Math.round(priceFy + settings.top.height)\r\n new Line(\r\n {\r\n x1: settings.left.width,\r\n x2: settings.left.width + contentWidth,\r\n y1: y,\r\n y2: y,\r\n strokeStyle: Colors.cross,\r\n },\r\n paneModel\r\n ).render(context)\r\n const YAxisLeftMargin = quote.instrument === Instrument.Crypto && quote.lastClose <= 0.001 ? 3 : 8\r\n\r\n const getCrossText = () => {\r\n if (chartModel.scale === ScaleType.Percentage && !isIndicator) {\r\n return `${math.round({\r\n value: getPercentageFromValue({ number: price, base: chartModel.firstBarClose }),\r\n lastClose: quote.lastClose,\r\n instrument: quote.instrument,\r\n overridePlaces: 2,\r\n })}%`\r\n }\r\n return `${math.round({\r\n value: price,\r\n lastClose: quote.lastClose,\r\n instrument: quote.instrument,\r\n overridePlaces: getRoundDecimalPlaces?.(price) ?? (paneModel.getIsChartPane() ? undefined : 2),\r\n })}${isPerfIndicator ? '%' : ''}`\r\n }\r\n\r\n new Text(\r\n {\r\n text: getCrossText(),\r\n x:\r\n settings.left.width +\r\n settings.right.axis.margin.left! +\r\n contentWidth +\r\n (isIndicator ? OFFSET.S : YAxisLeftMargin - PADDING.XXS),\r\n padding: isIndicator\r\n ? Text.getMergedPropsWithDefaults('padding', IndicatorSettings.right.axis.font.padding)\r\n : {\r\n top: PADDING.XXS,\r\n right: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n },\r\n ...{\r\n y,\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.crossText,\r\n background: Colors.crossTextBackground,\r\n font: Text.getMergedPropsWithDefaults('font', { ...settings.right.axis.font, style: 'bold' }),\r\n lineHeight: settings.right.axis.font.lineHeight,\r\n },\r\n },\r\n paneModel\r\n ).render(context)\r\n\r\n return true\r\n}\r\n\r\n/**\r\n * Set canvas width and height to 0 which fixes Safari memory problems\r\n *\r\n * @see https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\r\n */\r\nexport function unmountCanvas(canvas?: HTMLCanvasElement | null) {\r\n if (!canvas) return\r\n\r\n canvas.width = 0\r\n canvas.height = 0\r\n canvas.style.width = '0px'\r\n canvas.style.height = '0px'\r\n}\r\n\r\nexport function getChangeColor({ change, ChartSettings }: { change: number; ChartSettings: IChartSettings }) {\r\n const { Colors } = ChartSettings.general\r\n if (change === 0) {\r\n return Colors.zeroChange\r\n }\r\n return change > 0 ? Colors.positiveChange : Colors.negativeChange\r\n}\r\n\r\nexport function round({ data, num, overridePlaces }: { data: Quote; num: number; overridePlaces?: number }) {\r\n return math.round({\r\n value: num,\r\n lastClose: data.lastClose,\r\n instrument: data.instrument,\r\n overridePlaces: overridePlaces,\r\n })\r\n}\r\n\r\nexport interface ITickerChange {\r\n points: number\r\n string: string\r\n percentString: string\r\n}\r\ninterface ITickerChangeResult {\r\n tickerChange: ITickerChange | null\r\n tickerAfterChange: ITickerChange | null\r\n}\r\n\r\nexport function getTickerChangeFromCloseValues({\r\n anchorClose,\r\n prevClose,\r\n data,\r\n}: {\r\n anchorClose: number\r\n prevClose: number\r\n data: Quote\r\n}): ITickerChange {\r\n const changePoints = anchorClose - prevClose\r\n const changePercent = (anchorClose / prevClose - 1) * 100\r\n const sign = changePoints < 0 ? '-' : changePoints > 0 ? '+' : ''\r\n const changePercentString = `${round({\r\n data,\r\n num: Math.abs(changePercent),\r\n overridePlaces: 2,\r\n })}%`\r\n const changePointsString = `${sign}${round({\r\n data,\r\n num: Math.abs(changePoints),\r\n })} (${changePercentString})`\r\n\r\n return {\r\n points: changePoints,\r\n string: changePointsString,\r\n percentString: `${sign}${changePercentString}`,\r\n }\r\n}\r\nexport function getTickerChange({ data }: { data: Quote }) {\r\n const result: ITickerChangeResult = { tickerChange: null, tickerAfterChange: null }\r\n const isChange = Number.isFinite(data.prevClose) // if not new stock always present\r\n if (isChange) {\r\n result.tickerChange = getTickerChangeFromCloseValues({\r\n data,\r\n anchorClose: data.lastClose,\r\n prevClose: data.prevClose,\r\n })\r\n }\r\n\r\n const isAfterChange = Number.isFinite(data.afterClose) && data.afterClose !== data.lastClose\r\n if (isAfterChange) {\r\n const tickerAfterChange = getTickerChangeFromCloseValues({\r\n data,\r\n anchorClose: data.afterClose,\r\n prevClose: data.lastClose,\r\n })\r\n result.tickerAfterChange = {\r\n ...tickerAfterChange,\r\n string: `AH: ${tickerAfterChange.string}`,\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport function isForexFuturesCryptoPage(specificChartFunctionality: SpecificChartFunctionality) {\r\n return [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n SpecificChartFunctionality.futuresPage,\r\n ].includes(specificChartFunctionality)\r\n}\r\n\r\nexport function getShouldUseDarkerWickColors({\r\n specificChartFunctionality,\r\n totalBarWidth,\r\n}: {\r\n specificChartFunctionality: SpecificChartFunctionality\r\n timeFrame?: TIMEFRAME\r\n totalBarWidth: number\r\n}) {\r\n const isForexFuturesCrypto = isForexFuturesCryptoPage(specificChartFunctionality)\r\n const isOffscreenChartWithNarrowBars =\r\n specificChartFunctionality === SpecificChartFunctionality.offScreen && totalBarWidth < 5\r\n const isQuoteChartWithNarrowBars =\r\n specificChartFunctionality === SpecificChartFunctionality.quotePage && totalBarWidth < 5\r\n\r\n return isForexFuturesCrypto || isOffscreenChartWithNarrowBars || isQuoteChartWithNarrowBars\r\n}\r\n\r\nexport const DRAWING_COOKIE_NAME = 'charts-draw'\r\nexport function getIsDrawingEnabled() {\r\n return Utils.getCookie(DRAWING_COOKIE_NAME) === 'on'\r\n}\r\n\r\nexport function setIsDrawingEnabled(value: boolean) {\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n Utils.setCookie(DRAWING_COOKIE_NAME, value ? 'on' : 'off', expires)\r\n}\r\n\r\nexport function getIsSidebarEnabled(specificChartFunctionality?: SpecificChartFunctionality) {\r\n return specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n}\r\n\r\nexport const handleTypeChange = ({\r\n type,\r\n chartLayoutModel,\r\n}: {\r\n type: ChartElementType\r\n chartLayoutModel: ChartLayoutModel\r\n}) => {\r\n const elements = chartLayoutModel.getAllElements()\r\n elements.forEach((element) => {\r\n if (element.isChart() && element.instance.attrs.type !== type) {\r\n const pane = element.pane()\r\n const instance = chartsByType[type].fromObject(\r\n {\r\n ...element.instance.attrs,\r\n type,\r\n },\r\n pane\r\n )\r\n element.replace(instance)\r\n }\r\n })\r\n}\r\n\r\nexport const getIsPreserveDrawingsAndAutosaveAvailable = (args: {\r\n specificChartFunctionality: SpecificChartFunctionality\r\n editable: boolean\r\n editors: ChartEditorEnum[]\r\n}) => {\r\n const { specificChartFunctionality, editable, editors } = args\r\n\r\n return (\r\n editable &&\r\n editors?.includes(ChartEditorEnum.tools) &&\r\n specificChartFunctionality &&\r\n [\r\n SpecificChartFunctionality.chartPage,\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(specificChartFunctionality)\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `Website/js/main/components/color-picker/util.ts` in website repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string, allowAlpha = true) {\r\n const isRgb = getIsRgb(strColor)\r\n const hexColor = isRgb ? rgbaToHexString(rgbaStringToObject(strColor), allowAlpha) : strColor\r\n\r\n if (allowAlpha) {\r\n return hexColor\r\n }\r\n return hexColor.slice(0, 7)\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","// if conditionalCursor provided, cursor is set only if current cursor !== conditionalCursor\r\n// otherwise cursor is set if element exists\r\nexport const setElementCursor = ({\r\n elementId,\r\n cursor,\r\n conditionalCursor,\r\n}: {\r\n elementId: string\r\n cursor: string\r\n conditionalCursor?: string\r\n}) => {\r\n const element = document.getElementById(elementId)\r\n if (element && (conditionalCursor ? element.style.cursor !== conditionalCursor : true)) {\r\n element.style.cursor = cursor\r\n }\r\n}\r\n","/*\r\n * We want to be able to render only bars/parts of line that are visible to users,\r\n * but without introducing visual artifacts like bars missing in front of users while scrolling\r\n * or lines that start in middle of chart for sparse intraday stock data.\r\n *\r\n * In general we want to start rendering lines one bar sooner than what is visible to user and stop rendering\r\n * one bar outside of visible area to create a continuous line.\r\n */\r\nimport type Pane from '../models/pane'\r\nimport type Quote from '../models/quote'\r\nimport { getHalfBarWidth } from './chart'\r\n\r\ninterface IBarToRender {\r\n index: number\r\n isBarVisible: boolean\r\n}\r\n\r\nexport const drawInVisibleArea = ({\r\n drawBarCallback,\r\n fromIndexOffset = 0,\r\n fxOverride,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n toIndexOffset = 0,\r\n width,\r\n}: {\r\n drawBarCallback: (i: number, x: number) => void\r\n fromIndexOffset?: number\r\n fxOverride?: (index: number) => number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n toIndexOffset?: number\r\n width: number\r\n}) => {\r\n const fx = fxOverride ?? ((index: number) => paneModel.scale.x(quote.barIndex[index]))\r\n\r\n // We want to start rendering one bar outside of the visible area for two reasons:\r\n // 1. To create a seamless transition for bars entering/leaving the view, avoiding them from\r\n // abruptly dis/appearing when half the bar is outside.\r\n // 2. To prevent disconnected lines in case there's a bar gap.\r\n // However, if a `fromIndex` is provided and it's higher than the first visible bar,\r\n // we need to start rendering from that specific index. This ensures correct starting\r\n // points for elements like indicators that rely on this value.\r\n const firstBarToRenderIndex = getCompensatedFirstBarToRenderIndex({ quote, paneModel, leftOffset, fromIndexOffset })\r\n\r\n let lastBarToRender = -1\r\n for (let i = firstBarToRenderIndex; i < quote.close.length + toIndexOffset; i++) {\r\n const x = fx(i)\r\n if (x + leftOffset > width) {\r\n lastBarToRender = i\r\n break\r\n }\r\n drawBarCallback(i, x)\r\n }\r\n\r\n if (lastBarToRender > -1) {\r\n const x = fx(lastBarToRender)\r\n drawBarCallback(lastBarToRender, x)\r\n }\r\n}\r\n\r\n/**\r\n * Get first or last visible bar index.\r\n * IMPORTANT: If chartWidth provided return is lastVisibleBarIndex\r\n */\r\nexport function getVisibleBarToRenderIndex({\r\n chartWidth,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n}: {\r\n chartWidth?: number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n}) {\r\n const chartModel = paneModel.chart()\r\n\r\n // not all the time there is bar present on barIndex calculated via inverted leftOffset\r\n // there might be a gap between bars, if there is, barToDataIndex on that gap spot will have value of\r\n // previous bar which isn't visible\r\n\r\n const barIndex = Math.round(paneModel.scale.x.invert(-leftOffset + (chartWidth !== undefined ? chartWidth : 0)))\r\n const dataBarIndex = quote.barToDataIndex[Math.min(Math.max(barIndex, 0), quote.barToDataIndex.length - 1)]\r\n const halfBarWidth = getHalfBarWidth(chartModel, false)\r\n\r\n const isBarVisible = Math.round(paneModel.scale.x(quote.barIndex[dataBarIndex]) + halfBarWidth) + leftOffset > 0\r\n\r\n return {\r\n index:\r\n chartWidth === undefined\r\n ? isBarVisible\r\n ? dataBarIndex\r\n : Math.max(Math.min(dataBarIndex + 1, quote.barIndex.length - 1), 0)\r\n : dataBarIndex,\r\n isBarVisible,\r\n }\r\n}\r\n\r\n// Get first bar to render compensated for fromIndexOffset\r\nexport function getCompensatedFirstBarToRenderIndex({\r\n fromIndexOffset = 0,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n}: {\r\n fromIndexOffset?: number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n}) {\r\n return Math.max(0, getVisibleBarToRenderIndex({ quote, leftOffset, paneModel }).index - 1, fromIndexOffset)\r\n}\r\n\r\n/**\r\n * Checks if there are no visible bars between the specified first and last bars to render.\r\n * IMPORTANT: Provided indexes should be without bar gap compensation.\r\n *\r\n * @param {IBarToRender} firstBarToRenderIndex The index of the first bar to render.\r\n * @param {IBarToRender} lastBarToRenderIndex The index of the last bar to render.\r\n * @returns {boolean} True if there are no visible bars between the first and last bars, false otherwise.\r\n */\r\nexport function getAreNoBarsVisible(firstBarToRenderIndex: IBarToRender, lastBarToRenderIndex: IBarToRender): boolean {\r\n return (\r\n !firstBarToRenderIndex.isBarVisible &&\r\n !lastBarToRenderIndex.isBarVisible &&\r\n firstBarToRenderIndex.index > lastBarToRenderIndex.index\r\n )\r\n}\r\n","import queryString from 'query-string'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\n\r\ninterface FetchApiProps {\r\n location: string\r\n queryParameters?: ObjectHash\r\n method?: string\r\n body?: RequestInit['body']\r\n contentType?: ContentType\r\n abortController?: null | AbortController\r\n throwOnStatusCodes?: number[]\r\n throwOnPredicate?: (response: Response) => boolean\r\n keepalive?: boolean\r\n}\r\n\r\nexport const getFormDataFromObject = (object: ObjectHash) =>\r\n Object.keys(object).reduce((formData, key) => {\r\n formData.append(key, object[key])\r\n return formData\r\n }, new FormData())\r\n\r\n// Keep in sync with ContentType in https://github.com/finvizhq/Finviz-Website/blob/master/Website/js/main/services/api.ts\r\n// START\r\nexport enum ContentType {\r\n ApplicationJson = 'application/json',\r\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\r\n FormUrlEncoded = 'application/x-www-form-urlencoded',\r\n Html = 'text/html; charset=utf-8',\r\n}\r\n\r\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\r\n switch (contentType) {\r\n case ContentType.ApplicationJson:\r\n case ContentType.ApplicationJsonUTF:\r\n case ContentType.FormUrlEncoded:\r\n return JSON.parse(response)\r\n default:\r\n return response\r\n }\r\n}\r\n// END\r\n\r\nconst fetchApi = async ({\r\n location,\r\n queryParameters,\r\n method,\r\n body,\r\n contentType,\r\n abortController,\r\n throwOnStatusCodes,\r\n throwOnPredicate,\r\n keepalive = false,\r\n}: FetchApiProps) => {\r\n const url = `${location}${queryParameters ? `?${queryString.stringify(queryParameters)}` : ''}`\r\n const parameters: RequestInit = {\r\n method: method || 'GET',\r\n credentials: 'include',\r\n headers: contentType && {\r\n 'Content-Type': contentType,\r\n },\r\n signal: abortController?.signal,\r\n body: body,\r\n keepalive,\r\n }\r\n try {\r\n const response = await fetch(url, parameters)\r\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\r\n const responseData = parseResponseForContentType(await response.text(), responseContentType)\r\n if (throwOnStatusCodes?.includes(response.status) || throwOnPredicate?.(response)) {\r\n const StatusCodeError = getStatusCodeError(response.status)\r\n throw new StatusCodeError(`${url} returned ${response.status}`, responseData as T, response.status)\r\n }\r\n return responseData as T\r\n } catch (err) {\r\n throw err\r\n }\r\n}\r\n\r\nfunction getStatusCodeError(statusCode: number): typeof GenericStatusCodeError {\r\n switch (statusCode) {\r\n case 403:\r\n return ForbiddenError\r\n case 404:\r\n return NotFoundError\r\n case 410:\r\n return GoneError\r\n case 500:\r\n return InternalServerError\r\n default:\r\n return GenericStatusCodeError\r\n }\r\n}\r\n\r\nexport class GenericStatusCodeError extends Error {\r\n response: ObjectHash | string\r\n statusCode: number\r\n\r\n constructor(message: string, response: ObjectHash | string, statusCode: number) {\r\n super(message)\r\n this.response = response\r\n this.statusCode = statusCode\r\n }\r\n}\r\nexport class ForbiddenError extends GenericStatusCodeError {}\r\nexport class NotFoundError extends GenericStatusCodeError {}\r\nexport class InternalServerError extends GenericStatusCodeError {}\r\nexport class GoneError extends GenericStatusCodeError {}\r\n\r\nexport default fetchApi\r\n","import React from 'react'\r\n\r\nexport function useForceUpdate() {\r\n const [forceUpdateKey, increment] = React.useState(0)\r\n const forceUpdate = React.useCallback(() => {\r\n increment((prev) => prev + 1)\r\n }, [])\r\n return { forceUpdate, forceUpdateKey }\r\n}\r\n","import { EmptyObject, ObjectHash } from '../../types/shared'\r\n\r\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\r\n const precision = Math.pow(10, numOfDecimalPlaces)\r\n return String(Math.round(number * precision) / precision)\r\n}\r\n\r\nexport function getIsSSr() {\r\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\r\n}\r\n\r\nexport function isValidHexColor(color: string) {\r\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\r\n return !!color && regex.test(color)\r\n}\r\n\r\nexport function getParsedIntegersFromPeriodString(periodString: string) {\r\n const periodParts = periodString.split(',')\r\n return periodParts.map((part) => Number.parseInt(part, 10))\r\n}\r\n\r\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\r\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\r\n console.error(exception)\r\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\r\n import('@sentry/node').then((client) => {\r\n client.captureException(exception, captureContext)\r\n })\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport function isPositiveFloat(value: string | number) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\r\n}\r\n\r\nexport function isPositiveInteger(value: string | number) {\r\n const string = `${value}`\r\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\r\n}\r\n\r\nexport function isInRange({\r\n value,\r\n min = Number.MIN_SAFE_INTEGER,\r\n max = Number.MAX_SAFE_INTEGER,\r\n}: {\r\n value: string | number\r\n min?: number\r\n max?: number\r\n}) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\r\n}\r\n\r\nexport function tryJsonParse(json: string | null = '') {\r\n try {\r\n return JSON.parse(json ?? '') as Result\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\r\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\r\n // as cy.get('.target').trigger('mousedown', { button: 0 })\r\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\r\n return (e as unknown as MouseEvent).button === 0\r\n } else {\r\n return true\r\n }\r\n}\r\n\r\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\r\nexport function getJSONReplacerFunc() {\r\n const visited = new WeakSet()\r\n return (key: string, value: any) => {\r\n if (typeof value === 'object' && value !== null) {\r\n if (visited.has(value)) {\r\n return\r\n }\r\n visited.add(value)\r\n }\r\n return value\r\n }\r\n}\r\n\r\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\r\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options,\r\n })\r\n\r\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n","import { useChartLayoutGlobalModelAsyncModule } from '../controllers/chart-settings/async-modules'\r\nimport { useAsyncModule } from './async-modules-utils'\r\n\r\nexport function useChartLayoutGlobalModelAsync() {\r\n const [useChartLayoutGlobalModelModule] = useAsyncModule({\r\n ...useChartLayoutGlobalModelAsyncModule,\r\n isSuspenseMode: true,\r\n })\r\n return useChartLayoutGlobalModelModule.useChartLayoutGlobalModel()\r\n}\r\n","import { CanvasRenderingContext2D as NodeCanvasRenderingContext2D } from 'skia-canvas'\r\n\r\nimport {\r\n CanvasElementType,\r\n ChartEditorEnum,\r\n ChartElementType,\r\n ChartEventType,\r\n IndicatorType,\r\n LayoutType,\r\n OverlayType,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../app/constants/common'\r\nimport ChartModel from '../app/models/chart'\r\nimport ChartLayout from '../app/models/chart_layout'\r\nimport { IChartThemeColors } from '../app/models/constants'\r\n\r\ninterface ISentry {\r\n captureException: (exception: any, captureContext?: { extra: ObjectHash }) => any\r\n captureMessage: (message: string, captureContext?: { extra: ObjectHash }) => any\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n Sentry: ISentry\r\n FinvizSettings: ObjectHash\r\n FinvizChartsSettings: ObjectHash\r\n globalChartConfig: RootChartConfigObject\r\n isRenderInProgress: boolean | number\r\n rendersInProgress: number[]\r\n FinvizQuoteTypeCurrent: string\r\n handleScriptNotLoaded: () => void\r\n renderScriptNotLoaded: () => void\r\n gtag?: any\r\n }\r\n\r\n interface Document {\r\n fullscreenElement: any\r\n webkitFullscreenElement?: () => void\r\n mozFullScreenElement?: () => void\r\n msFullscreenElement?: () => void\r\n\r\n webkitExitFullscreen?: () => void\r\n mozExitFullScreen?: () => void\r\n msExitFullscreen?: () => void\r\n }\r\n\r\n interface HTMLElement {\r\n webkitRequestFullScreen?: () => void\r\n mozRequestFullScreen?: () => void\r\n msRequestFullscreen?: () => void\r\n }\r\n\r\n interface Navigator {\r\n msMaxTouchPoints: any\r\n }\r\n\r\n interface Array {\r\n last(): T | undefined\r\n }\r\n\r\n interface String {\r\n padLeft(paddingValue: string): string\r\n startsWith(str: string): boolean\r\n }\r\n\r\n type CanvasCache = Partial>\r\n\r\n interface CanvasRenderingContext2D {\r\n _cache: CanvasCache\r\n // We need to omit `canvas` because it is read only\r\n set>(\r\n key: Key,\r\n value: CanvasRenderingContext2D[Key]\r\n ): void\r\n }\r\n\r\n interface HTMLCanvasElement {\r\n _cache: CanvasCache\r\n }\r\n\r\n interface ImageBitmapRenderingContext {\r\n _cache: CanvasCache\r\n }\r\n\r\n type RenderingContext2DType = CanvasRenderingContext2D | NodeCanvasRenderingContext2D\r\n}\r\n\r\ndeclare module 'skia-canvas' {\r\n interface CanvasRenderingContext2D {\r\n _cache: CanvasCache\r\n\r\n set>(\r\n key: Key,\r\n value: CanvasRenderingContext2D[Key]\r\n ): void\r\n }\r\n}\r\n\r\nexport type TodoObjectHashAnyType = Record\r\nexport type TodoAreaObject = Record\r\nexport type ObjectHash = Record\r\nexport type EmptyObject = Record\r\n\r\nexport type TodoAnyType = any\r\n\r\nexport type ThumbType = string\r\n\r\nexport type PaneArea = {\r\n mouseDown?: boolean\r\n x: number\r\n y: number\r\n scaled: {\r\n x: number\r\n y: number\r\n }\r\n width: number\r\n height: number\r\n cursorX: number\r\n cursorY: number\r\n isCursorInChartWidthBoundaries: boolean\r\n} & T\r\n\r\nexport type Maybe = T | null | undefined\r\n\r\nexport interface DrawingBorder {\r\n color: string\r\n width: number\r\n}\r\n\r\nexport interface TextAttrs {\r\n text?: string\r\n background: string\r\n border?: { width: number; color: string }\r\n lineWidth?: number\r\n font: {\r\n size: number\r\n family?: string\r\n style?: string\r\n weight?: string\r\n }\r\n fillStyle?: string\r\n strokeStyle?: string\r\n angle?: number\r\n lineHeight: number\r\n textAlign?: TextAlign\r\n textBaseline: TextBaseline\r\n padding: {\r\n top: number\r\n right: number\r\n bottom: number\r\n left: number\r\n }\r\n}\r\n\r\nexport interface Point {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport type RequireByKey = Omit & Required>\r\n\r\nexport interface ResizeByThumbFuncProps {\r\n type: ThumbType\r\n difX: number\r\n difY: number\r\n area: PaneArea\r\n}\r\n\r\nexport type ResizeByThumbWithTypeAndDifs = RequireByKey\r\n\r\nexport interface ChartConfigChartPaneElement {\r\n type: ChartElementType | CanvasElementType | IndicatorType | OverlayType | ChartEventType\r\n overlays?: OverlayConfigObject[]\r\n period?: string\r\n code?: string\r\n elementId?: string | null\r\n zIndex?: number\r\n}\r\n\r\nexport interface RendererChartBarProps {\r\n index: number\r\n chartSettingsColors: IChartThemeColors\r\n hasFillAndBorder?: boolean\r\n}\r\n\r\nexport interface ChartConfigChartPane {\r\n elements: ChartConfigChartPaneElement[]\r\n height: number\r\n chart?: ChartConfigObject | ChartModel\r\n}\r\n\r\nexport interface IIdea {\r\n id?: number\r\n date?: string\r\n note: string\r\n}\r\n\r\nexport interface ChartConfigObjectExtended {\r\n editable: boolean\r\n canChangeTicker: boolean\r\n scrollable: boolean\r\n cross: boolean\r\n ideas: boolean\r\n editors: ChartEditorEnum[]\r\n specificChartFunctionality: SpecificChartFunctionality\r\n theme: Theme\r\n layout: LayoutType\r\n uuid?: string\r\n idea?: IIdea\r\n}\r\n\r\nexport interface ChartConfigObject {\r\n width: number\r\n height: number\r\n panes: ChartConfigChartPane[]\r\n premarket: boolean\r\n aftermarket: boolean\r\n dateRange: string | null\r\n hasChartEvents?: boolean\r\n stretch?: boolean\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n chart_layout: ChartLayout\r\n zoomFactor: number\r\n leftOffset: number | null\r\n refreshData: boolean | number\r\n isHideDrawingsActive: boolean\r\n isScrolled?: boolean\r\n scale: ScaleType\r\n}\r\n\r\nexport type RootChartConfigObjectChart = Omit<\r\n ChartConfigObject,\r\n 'chart_layout' | 'leftOffset' | 'zoomFactor' | 'isHideDrawingsActive'\r\n>\r\nexport interface RootChartConfigObject extends Partial {\r\n charts: Array\r\n width: number\r\n height: number\r\n newCharts?: boolean\r\n useGrid?: boolean\r\n}\r\n\r\nexport interface OverlayConfigObject {\r\n color: string\r\n period: string\r\n type: OverlayType\r\n}\r\n\r\nexport enum Instrument {\r\n Stock = 'stock',\r\n Crypto = 'crypto',\r\n MarketSentiment = 'market_sentiment',\r\n Futures = 'futures',\r\n Forex = 'forex',\r\n Group = 'group',\r\n}\r\n\r\nexport enum Theme {\r\n light = 'light',\r\n dark = 'dark',\r\n}\r\n\r\nexport interface IModalConfig {\r\n title: string\r\n inputs: IModalConfigInput[]\r\n inputsErrorMessages: ObjectHash\r\n}\r\nexport interface IOptionType {\r\n value: string | number\r\n label: string\r\n}\r\nexport interface IModalConfigInput {\r\n type: React.HTMLInputTypeAttribute\r\n label: string\r\n name: string\r\n value: number | string\r\n required?: boolean\r\n min?: number\r\n color?: string\r\n step?: number\r\n items?: IOptionType[]\r\n}\r\n\r\n// Keep in sync with config/types/globals.d.ts\r\nexport enum Position {\r\n Above = 'above',\r\n Below = 'below',\r\n}\r\n\r\nexport enum DefaultSpineEvents {\r\n Change = 'change',\r\n Destroy = 'destroy',\r\n Refresh = 'refresh',\r\n Update = 'update',\r\n}\r\n\r\nexport enum CustomSpineEvents {\r\n IndicatorsChange = 'indicatorsChange',\r\n ManualChange = 'manualChange',\r\n}\r\n\r\nexport enum DrawingSpineOptionsEvent {\r\n Remove = 'remove',\r\n}\r\n\r\nexport interface DrawingSpineOptions {\r\n eventType: DrawingSpineOptionsEvent\r\n}\r\n\r\nexport type TodoButtonProps = ObjectHash\r\nexport type TodoButtonTheme = string\r\n"],"names":["Array","prototype","last","this","length","String","padLeft","paddingValue","slice","startsWith","str","indexOf","_callbackCache","Spine","bind","ev","callback","that","cb","record","fkey","id","_len","arguments","rest","_key","push","newCb","origCb","model","unbind","item","findIndex","element","iterable","all","index","el","eql","defaults","enabled","collapsed","duration","timestamp","logErrors","withStackTrace","level","logger","console","filterChanges","attrs","props","Object","keys","constructor","name","errorTransformer","error","titleFormatter","title","time","took","parts","toFixed","join","colors","prevState","action","nextState","pad","num","maxLength","repeat","times","toString","printLogEntry","logEntry","options","startedTime","data","formattedTime","getHours","getMinutes","getSeconds","getMilliseconds","titleCSS","headerCSS","formattedTitle","groupCollapsed","group","e","log","styles","trace","groupEnd","initialize","window","protoModelLoad","load","started","Date","now","cid","attributes","returnedValue","apply","ChartEvent","Element","values","super","_defineProperty","x","y","scale","getBoundingPointKeys","type","label","getChartEvenBadgeType","ChartEventType","Dividends","ChartEventBadgeType","Split","EarningsNeutral","getChartEventModel","_this$model$chartEven","chartEventModel","chartEvents","findByAttribute","getXYPosition","_chartEventModel$yInd","top","bottom","getChartLayoutSettings","ChartSettings","scaled","roundedXY","getRoundedObject","height","CHART_EVENT_BADGE_SIZE","yIndex","getIsVisible","_this$model$chart$quo","TIMEFRAME","w","m","includes","chart","quote","timeframe","renderContent","context","Math","round","chartLayout","chart_layout","buffer","leftOffset","width","getChartEventBadgeImage","theme","state","chartEvent","isOpen","ChartEventBadgeState","selected","isHovered","hover","default","badgeType","left","drawImage","setIsHovered","updateChartEventsZIndexes","trigger","toggleIsOpen","isOpenOverride","_chartLayout$activeCh","_chartLayout$activeCh2","isCurrentEventActive","activeChartEvent","elementId","instance","_chartLayout$activeCh3","updateAttribute","undefined","isInArea","area","scaledArea","getIsInChartView","ChartEventLabels","Earnings","_this$getChartEventMo","eventItem","getChartEventData","epsActual","epsEstimate","dateTimestamp","EarningsFuture","EarningsNegative","EarningsPositive","chartEventsByType","freeze","dividends","split","earnings","canvasElements","overlaysByType","indicatorsByType","drawingToolsByType","chartsByType","getCanvasElementByType","elementType","Chart","initClass","paneModel","quoteModel","chartLayoutModel","configure","hasMany","belongsTo","getChartPane","panes","find","pane","elements","some","isChart","getChartElement","getChartType","_this$getChartElement","getRefreshInterval","defaultRefreshInterval","refreshData","QuotePollingIntervalInMs","Default","isStock","instrument","Instrument","Stock","isPremium","FinvizSettings","hasUserPremium","customRefreshInterval","Elite","Utils","isStockFastRefreshAvailable","EliteStocksReduced","Free","max","toObject","map","dateRange","ticker","zoomFactor","stretch","chartId","isHideDrawingsActive","isScrolled","premarket","aftermarket","hasChartEvents","toConfig","omitKeys","omit","destroyCascade","forEach","destroy","getIsDisabled","_this$quote","close","getIsScrollable","scrollable","getAllPanes","getAllValidPanes","_this$quote$COTs","cotKeys","COTs","filter","mainElement","IndicatorType","Cot","code","getAllElements","flatMap","getAllQuotes","perfQuotes","_ref","Perf","_ref2","quotes","quotePerfTickers","specificChartFunctionality","SpecificChartFunctionality","quotePerf","_this$getChartElement2","perfChart","Quote","select","q","tickers","d","createPaneCascade","paneProperties","_paneProperties$eleme","_paneModel$mainElemen","create","_ref3","zIndex","fromObject","CustomSpineEvents","IndicatorsChange","chartOrIndicator","getChartOrIndicatorElement","updateAttributes","updateAttributesAndSync","value","attrsInSync","entries","ChartPartToAttrsSyncMap","_ref4","key","getIsChartPartInSync","_ref5","_","modelAttr","getAllCharts","chartModel","newAttrs","hasOwnProperty","setSyncChartParts","chartParts","isInSync","chartPart","getHasPatterns","_hasOverlay","_ref6","hasOverlay","call","getQuoteRawTicker","_this$quote$getRawTic","_this$quote2","getRawTicker","setChartEvents","shouldClear","chartPane","allChartEvents","events","_ref7","_ref8","eventType","positionTimestamps","updateScales","chartEventsAsyncModule","importFn","cacheKey","badgeImages","getSvgImageCacheKey","concat","ChartEventElement","ElementModel","badgeImage","isLoaded","image","async","onBadgeInitLoad","importWithRetry","chartBadgeSvgByType","handleImageResolve","badgeState","Theme","svgHTML","img","Image","src","encodeURIComponent","onload","onerror","captureException","Error","extra","fetchAndCacheChartEventBadges","_this$instance$model$","stockEvent","ChartLayout","drawingsInternalStoreModel","getPaneWithSelection","selection","charts","layout","isPreserveDrawingsActive","JSON","parse","stringify","settings","center","general","Colors","editors","editable","newCharts","test","location","pathname","_this$syncChartParts$","_this$syncChartParts","chartPartsToSync","isArray","newSyncedChartParts","syncChartParts","_this$syncChartParts2","getIsIndicatorPresent","_this$charts$first","first","isIndicator","getHTMLElementId","exitIdea","ideaID","fetchData","fetchType","QuoteFetchType","Refetch","isIdeaId","_this$idea$id","_this$idea","idea","initHlc","uuid","ts","count","compareHlc","one","two","incrementHlc","local","receiveHlc","remote","DrawingsInternalStore","_attrs$elements","_attrs$instanceUUID","_attrs$latestLocalUpd","_attrs$latestRemoteUp","_attrs$autoSaveState","newAutoSaveState","autoSaveState","instanceUUID","getUuid","latestLocalUpdateTimestamp","latestRemoteUpdateTimestamp","AutoSaveState","Off","Indicator","Overlay","Pane","document","hostname","BackgroundInput","onChange","_jsx","InputColorPicker","inputDataTestId","toLocaleLowerCase","color","convertColorToHEX","ColorRangeRowInput","colorValue","colorTestId","rangeValue","rangeTestId","rangeLabel","rangeProps","handleRangeChange","useCallback","currentTarget","handleColorChange","_jsxs","className","children","RangeSlider","rightContent","Paragraph","as","size","Number","BorderInput","min","step","CheckBox","Checkbox","checked","FONT_VALUES","FontInput","family","setFamily","useState","setSize","style","setStyle","weight","setWeight","setValue","valueSetter","Label","Select","items","Input","LineInput","MultilineStringInput","required","Textarea","placeholder","target","autoFocus","NumberInput","allowDecimal","pattern","parseFloat","parseInt","StringInput","Trend","active","trend","valueAsNumber","VisibilityInput","isCheckboxOnly","isOff","setIsOff","React","from","setFrom","to","setTo","macroKey","macroLabel","charAt","toUpperCase","_Fragment","disabled","DEFAULTS","MacroTimeframe","minutes","hours","days","weeks","months","INPUTS_AVAILABLE","getInitialState","visibilities","merge","visibility","macroTimeframe","valueMacroTimeframe","getIsVisibilityOutsideAvailableTimeframes","every","macrotimeframe","macroRange","MicroTimeframeRange","_macroRange$from","_macroRange$to","isInRange","Visibility","initialVisibilityRef","handleChange","result","handleDisableSubmit","current","TAB_BUTTON_COMMON_PROPS","contentClass","getValuesFromFormState","formState","reduce","acc","cur","DialogTabs","ElementStyleDialog","_config$title","config","getModalConfig","initialFormStateRef","inputs","setFormState","selectedTab","setSelectedTab","Style","isSubmitDisabled","setIsSubmitDisabled","isDrawingElement","getIsDrawing","isEditInProgress","handleValuesChange","shouldSubmit","shouldDismiss","hasOnSubmit","onSubmit","hasOnDismiss","onDismiss","set","hide","handleValuesChangeDebounceRef","debounce","newFormState","maxWait","cancel","preventDefault","checkValidity","handleCloseDialog","Dialog","isDraggable","modal","backdrop","onMouseDown","onFullyClosed","onHide","DialogHeader","onCloseClick","DialogBody","ButtonGroup","hasDivider","Button","onClick","input","InputComponent","getInputForType","inputType","stateInput","DialogFooter","ElementStyleDialogContext","ElementStyleDialogWrapper","setElement","setOnSubmit","setOnDismiss","dialog","useDialogState","Provider","openDialog","show","getContainerType","_mainElement$instance","_mainElement$instance2","indicatorType","None","getTickersAndContainerTypesInLayoutModel","containerTypes","containerType","getInitialStoreDrawings","_window$FinvizSetting","_window$FinvizSetting2","_window$FinvizChartsS","_initialDrawings$map","initialDrawings","initialDrawingsStore","FinvizChartsSettings","drawings","getAutosaveElementFromDBRecord","handleCallMethodOnAllDrawings","elementMethod","isDrawing","getNoteElementId","getElementNoteText","noteElement","_JSON$parse","elementAttrs","text","getTickerNoteText","changeType","lastChange","lastChangeTimestamp","lastChangeCounter","lastChangeNodeUUID","DRAWINGS_SAVE_INTERVAL_MS","RETRY_LIMIT","useDrawingAutoSaveApi","postRetryCountRef","deleteRetryCountRef","notificationContext","useNotification","fetchDrawings","fetchApi","queryParameters","throwOnStatusCodes","drawing","saveDrawings","bodyJsonString","getDBRecordFromAutosaveElement","keepalive","s","n","i","l","hi","charCodeAt","lo","getByteLengthOfString","_window$Sentry","Sentry","method","contentType","ContentType","ApplicationJson","body","latestChangeHlc","sort","a","b","_window$Sentry2","InternalServerError","Promise","r","setTimeout","ForbiddenError","GoneError","newTicker","response","message","Notification","actions","timeoutInMs","GenericStatusCodeError","invalidItems","deleteAllDrawings","lastLocalChange","newHlc","_window$Sentry3","useDrawingAutoSaveControls","isAutoSaveActive","useModelState","watchProperties","isInit","getIsPreserveDrawingsAndAutosaveAvailable","useIsAutoSaveActive","drawingsInternalStore","saveTimeoutRef","clearTimeout","saveLatestChanges","withDelayInMs","saveQueueExtraFilterCallback","saveQueue","setAutoSaveState","Unsaved","save","Saving","Saved","syncChartLayoutDrawings","isRemove","paneContainerType","paneInternalStoreElements","autoSaveElement","paneElement","isCreator","paneDrawing","parsedElementAttrs","toAutosaveConfig","hasOngoingInteraction","handleAutoSaveNoteChange","note","newNoteElement","handleIdeaNoteChange","_chartLayout$idea","activeChart","checkDrawingUpdate","isRefetchAll","updatedDrawings","newLastUpdateTimestamp","updatedElementIds","newInternalStore","currentInternalStore","lastUpdateTimestamp","drawingIndex","currentDrawing","currentNote","autoSavedNote","mergeUpdatedDrawingsToInternalStore","allElements","normalizeZIndexes","quotePage","_chartLayout$activeCh4","activeTicker","updateInternalStoreWithElement","updateResult","destroyed","instanceJson","newDrawing","updateDrawingIndex","drawingElement","shouldSyncAndSave","updatedRecord","hasChangedZIndex","hasChangedType","hasChangedAttrs","hasChange","updateInternalStoreWithChangedElement","deleteAllAutoSavedElements","onElementChange","elementPane","elementContainerType","elementPaneTicker","DrawingSpineOptionsEvent","Remove","useDrawingAutoSave","drawingsInternalStoreUnwatched","prevIsAutoSaveActive","ref","usePrevious","runInitialSaveAndRefetchUpdate","onChartOrIndicatorChange","newTickers","newContainerTypes","ChartModel","checkDrawingUpdateInterval","setInterval","clearInterval","getIdeaUrl","period","searchObject","t","p","isQuotePage","isStockOnQute","path","queryString","ta","IdeaItem","onIdeaDeleted","isDeleting","setIsDeleting","isConfirmDelete","setIsConfirmDelete","currentIdea","decodeQueryString","onDeleteIdeaClick","_window$FinvizChartsS2","_window$globalChartCo","search","row","fetch","headers","href","url","ideaChart","globalChartConfig","reload","classNames","company","date","Icon","TimeframeLabelShort","appearance","stopPropagation","IdeasTabs","hasError","setHasError","hasFetched","setHasFetched","categorizedIdeas","setCategorizedIdeas","params","useSearchParams","queryTickers","get","_window$gtag","_window","gtag","event_category","ideas","dateParts","getInstrument","replace","processed","tickerIdeas","unshift","categorizeIdeas","fetchIdeas","handleIdeaDeleted","prev","modifiedCategories","categoryIndex","c","updatedCategory","updatedAll","Tabs","TabList","category","Tab","Badge","TabPanel","IdeasDialog","hasPadding","IdeasDropdown","rounding","dropdownButtonClassName","tooltipState","useTooltipState","placement","isAnyQuoteLoading","setIsAnyQuoteLoading","dropdown","useDropdownState","hideTooltip","dropdownItemProps","TooltipTrigger","checkIfAnyQuoteIsLoading","fetchingQuotes","isFetching","fetchedAt","visible","Dropdown","leftContent","DropdownItem","closeOnClick","layoutModel","_layoutModel$idea","activeChartQuote","toJSON","LayoutType","barWidth","barMargin","layoutModelObjectPanes","tickersString","getChartTickers","array","quotesJsonString","quoteTickersTimeframes","getFormDataFromObject","ideaUrl","open","saveIdea","Tooltip","Spinner","classnames","getIsMobileScreenSize","encodeQueryString","utm_source","utm_medium","utm_campaign","publishModalAsyncModule","Publish","isDialogOpen","publishModalModule","isLoading","useAsyncModule","shouldLoadModule","errorSeverity","onError","PublishDialog","Delayed","delayComponent","TourButton","page","tour","useTour","pageTours","steps","getRequestFullscreen","documentElement","chartPage","overlayPadding","isRedesignEnabled","Boolean","getTour","userTour","setCurrentTour","getStepsForUser","buttonTheme","hasNewTours","activeTour","startTour","once","ChartTypesSelect","_chartTypes$find","_chartTypes$find2","chartTypes","getCurrentType","useLocation","ty","taInt","defaultType","QuoteShortToLongType","FinvizQuoteTypeCurrent","QuoteNodeChartTypes","candlestick","candlesticksimple","generateRouterPath","FREE_TYPES_QUOTE_VALUES","QuoteLongToShortType","DEFAULT_TYPES","FREE_TYPES_QUOTE","reloadDocument","useChartTypes","currentType","selectedType","setSelectedType","icon","nativeSelect","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","ChangeLabel","changePoints","isTiny","DailyChangeDisplay","withSuspense","_chartLayoutModel$get","_chartModel$quote","chartIndex","useChartLayoutGlobalModelAsync","listenOnEvents","tickerChange","getTickerChange","math","getInstrumentDecimalPlaces","lastClose","tickerAfterChange","points","string","prevProps","nextProps","utmCampaign","futuresPage","forexPage","cryptoPage","testId","DrawButton","buttonProps","newValue","getIsDrawingEnabled","setCookieRequest","DRAWING_COOKIE_NAME","catch","expires","setMonth","getMonth","utils","setCookie","finally","getLayoutType","tickersCount","FullscreenButton","urlTickers","_tickers$index","Search","onTickerSelected","dropdownState","saveToPortfolioDialogState","isSaveToPortfolioVisible","createAlertDialogState","isCreateAlertVisible","saveToPortfolioModule","isLoadingSaveToPortfolio","saveToPortfolioAsyncModule","createAlertModule","isLoadingCreateAlert","createAlertAsyncModule","SaveToPortfolio","CreateAlert","detailLink","formattedTicker","Futures","Forex","Crypto","WebsiteSearchComponent","inputClass","isSearchIcon","isSearchItemLink","isShowAllVisible","_window$gtag2","_window2","_window$gtag3","_window3","SETTINGS_WIDTH","BUTTON_POPOVER_GUTTER","SETTINGS_POPOVER_ID","ScrollableChartSettingsPopover","elementWidth","bodyWidth","useElementMeasure","chartSettingsModule","chartSettingsAsyncModule","preventClosingUnsavedChangesModule","preventClosingUnsavedChangesAsyncModule","checkForUnsavedChangesAndCloseRef","PreventClosingUnsavedChanges","isFullyClosed","getExtendedDialogState","chartElement","getElementById","popoverContentElement","settingsButton","unstable_referenceRef","popoverStyles","newPopoverStyles","buttonRect","getBoundingClientRect","topOffset","maxHeight","innerHeight","position","scrollY","chartHeight","clientHeight","popoverContentHeight","offsetHeight","emptySpaceDiff","maxOffset","rightOffset","wrapper","marginRight","hasAsyncModules","Popover","popoverWrapperStyle","focusOnHide","hideOnClickOutside","onOverlayClick","checkForUnsavedChangesAndClose","onClose","ChartSettingsButton","settingsPopoverState","usePopoverState","PopoverTrigger","focusRing","getQuoteRequestKey","useChartControls","_chartModel$chart_lay","_chartLayoutModel$ide","unwatchedChartModel","isInteractive","navigate","useNavigate","chartModelRef","modelRef","useModelRef","setIsLoading","abortControllerKeyRef","isIdeaChart","updateChartModelWithNewQuote","_chartLayoutModel$act","_chartPane$getAllChar","isSameTicker","getLeftOffset","chartQuote","NewerData","getAllChartEvents","isChartEvent","fetchQuote","patterns","currentQuote","abortController","createRequestAbortController","shouldAbortRunningRequest","cachePredicate","fetchNewDataOnCachedQuote","wasFetchAborted","isQuoteUsedInOtherCharts","removeFromAbortCache","decodedQueryString","rangesArray","ranges","shouldRecalculateOnCharts","hasSameBarWidth","IndicatorSettings","hasSameBarMargin","hasRedesignEnabled","ChartControls","_chartModel$quote$nam","favoriteTimeframes","toggleFavoriteTimeframe","useFavoriteTimeframes","anchorDate","generateChartLayoutRouterPath","timeframeGroupsWithHref","dateRangeGroupsWithHref","handleCustomDateRangeValidation","useChartModelCustomDateRangeValues","onDialogSubmit","customDateRangeDialogState","handleDateRangeSelect","getDateRangeTimeframe","useCustomDateRangeDialog","pathGenerator","handleTickerSelect","upperCaseTicker","handleCustomRangeSubmit","dateRangeTimeframe","timeframeBarProps","timeFrameGroups","dateRangeGroups","customRange","selectedTimeframe","onTimeframeSelect","selectedDateRange","loadingTimeframe","onDateRangeSelect","onCustomDateRangeClick","isFavoritesEnabled","onFavoriteTimeframeToggle","canChangeTicker","TimeframeBar","CustomDateRange","dialogState","hasTimeframe","ChartEditorEnum","Heading","tools","compactViewMaxBreakpointPx","grow","publish","CHART_LAYOUT_CHILD_CHANGE_EVENT","ContextMenu","contextMenu","selector","forceUpdate","componentDidMount","update","componentWillUnmount","render","_document$querySelect2","_document$querySelect","shown","querySelector","classList","remove","onContextMenu","ContextMenuComponent","add","ready","ReactDOM","event","clientY","pageYOffset","clientX","ChartEventPopoverWithState","unwatchedChartLayout","popoverState","chartEventsModule","isChartEventOfThisChart","setData","clickAwayRef","isListening","refCallback","isMobile","handler","contains","addEventListener","removeEventListener","useClickAway","_chartModel$getChartP","unstable_popoverRef","popoverShow","popoverHide","newData","ZIndexContext","tabIndex","hasBackdrop","focusOnShow","hasViewportHeightLimit","ChartEventPopoverContent","LoadLatestDataButton","chartModelUnwatched","getIsMounted","isMountedRef","useIsMounted","hasNewDataAvailable","setHasNewDataAvailable","isPossibleToFetchSequentialData","then","hasNewData","promises","ZOOM_CONTROLS_ACTIVE_CLASS","ZOOM_CONTROLS_IS_IN_AREA_CLASS","buttonCommonProps","getDefaultLeftOffset","ZoomControls","zoomControlsRef","isVisible","onZoomIn","onZoomOut","onZoomReset","isGoToRecentVisible","setIsGoToRecentVisible","defaultZoomFactor","isZoomResetVisible","setIsZoomResetVisible","handleGoToMostRecent","handleChartModelChangeDebounced","hidden","_window$localStorage","_this","hasSeenCrossNotification","localStorage","getItem","isTouchCrossActive","renderAll","oldElementInstance","isDrawingModeContinuousActive","setSelection","onPaneDestroy","setSelectedElement","clonedElementInstance","setCanvasSize","recountScale","getArea","MouseModel","_event$targetTouches","activeChartInteraction","TouchEvent","targetTouches","lastClientX","dif","addToLeftOffset","scaleRange","lastClientY","_this$props$model$get","_this$props$model$get2","_this$props$model$get3","difY","ScaleType","Logarithmic","invert","currentViewRange","getMinMax","touchEventsDisabled","onScalerMouseDown","onScalerMouseMove","onScalerMouseUp","setActiveChartInteraction","MouseEvent","button","scalerLastY","currentDomainMax","currentDomainMin","domain","onScalerTouchMove","onScalerTouchEnd","_model$getChartOrIndi","_model$getChartOrIndi2","originalMinMax","currentDiff","abs","originalDiff","getBarWidthWithMargin","getMinMaxLeftOffset","newLeftOffset","barIndex","fetchOlderData","getElement","openElementStyleDialog","pointerType","onCanvasPress","elementInArea","thumbsAreInArea","elementModel","hasProperties","isElementDrawing","makeClone","setVisibilityTo","SetVisibilityTo","currentAndAbove","currentAndBelow","currentOnly","bringToFront","sendToBack","bringForward","sendBackward","handleRemoveIndicatorPane","paneIndex","element_type","updateType","canvasCtx","_this$props$model$sel","_this$props$model$sel2","getIsCreator","hoveredElement","_element$instance$get","_element$instance","_element$instance$get2","_element$instance2","getIsCreatorDialogOpen","cross","crossRafId","requestAnimationFrame","renderCross","process","rafId","_renderAll","canvasRef","getIsUpdatedDesign","renderPane","isMouseInPane","getShouldRenderCrossInPane","crossCanvasCtx","clearRect","isCrossDisabled","PaneModel","elementInstance","renderCrossText","NaN","restore","additionalData","Settings","getSettings","areaRectangle","canvas","areaRectangleCursorX","areaRectangleCursorY","chartLeftX","chartRightX","right","cursorX","cursorY","isCursorInChartWidthBoundaries","ratio","getScaleRatio","canvasElement","setSizeOnCanvasElement","crossCanvasRef","isDisableTouchCrossAvailable","initialScrollable","lastActiveTool","DrawingTool","Mouse","smallIndex","isChartsPage","setState","setItem","inline","activeTool","_this$zoomControlsRef","isMouseDownIgnored","zoomControls","paneHeight","mouseDown","touchEvent","onCanvasInteractionStart","_MouseModel$pane","setMousePosition","getMousePositionInBoundaries","_element$getIsChartEv","isTouch","getIsChartEvent","onPaneMouseMove","getIsHammerAllowScrollActive","onCanvasInteractionMove","onCanvasInteractionEnd","onMouseMoveOnScrolling","Touch","isPrimaryClick","_model$selection","_element$getIsChartEv2","_element$instance$get3","_element$instance3","_element$instance$get4","_element$instance4","_model$getChartOrIndi3","_model$getChartOrIndi4","_model$getChartOrIndi5","setElementCursor","cursor","lastX","lastY","_model$selection$getI","_model$selection2","CanvasElement","activeThumb","moveBy","isElementHovered","isSelected","crossCanvas","canvasAreaRectangle","chartLeft","chartRight","chartTop","chartBottom","getValueInRange","_MouseModel$pane2","isSameMouseModel","setIsSelected","isSelectionCanvas","onModelUpdate","onElementCreate","onElementDestroy","onElementReplace","onElementSelect","onElementClone","immediateRecountScaleOnChartIndicatorChange","ManualChange","onChartUpdate","isIndicatorPane","getIsIndicatorPane","_getInitialStoreDrawi","_this$canvasWrapperRe","initialStoreDrawings","_element$instance5","cachePointPositionTimestamp","_element$instance6","getContextWithCache","paneHammer","Hammer","paneRef","touchAction","threshold","on","onPress","canvasWrapperHammer","canvasWrapperRef","onTouchMove","passive","scalerRef","scalerHammer","onScalerReset","zoomerRef","zoomerHammer","onZoomerReset","onDoubleClick","_this$canvasWrapperRe2","unmountCanvas","onPaneClick","_this$paneHammer","_this$scalerHammer","_this$zoomerHammer","_this$canvasWrapperHa","_this$scalerHammer2","_this$zoomerHammer2","_this$paneHammer2","_this$canvasWrapperHa2","isChartPane","getIsChartPane","onMouseMove","onMouseLeave","onPaneMouseLeave","onTouchStart","onResizerMouseDown","onMouseEnter","onScalerMouseEnter","onScalerTouchStart","onZoomerMouseDown","onZoomerMouseMove","onZoomerTouchStart","onAddToZoomFactor","diff","shouldCalculateRightAlign","onTouchEnd","onBlur","getChartAlt","isCharts","isRedesignedFuturesForexCrypto","isRedesignedPage","withNotificationContext","Component","withElementStyleDialogState","ChartSpinnerOverlay","shouldDisplay","setIsVisible","timeout","DEFAULT_WRAPPER_COMPONENT","preventDefaultFunc","panesWrapperElement","isWheelZoomEnabled","zoomerRightAlign","calcZoomerRightAlign","mouseWheelTimeout","activePane","_this$props$layoutMod","onModelChange","calculateMinimalPaneHeight","paneId","chartModelParam","panesHeight","sum","_pane$height","newPaneHeight","isNaN","newChartPaneHeight","newIsScrolled","lastWidth","lastHeight","handleQuoteChange","_pane$selection","resizerPaneIndex","onResizerMouseMove","onResizerMouseUp","resizePanesAccordingly","touches","onZoomerMouseUp","p1","p2","distance","getRawDistance","onPinchMove","onPinchEnd","fx","currentLeftOffset","isIntraday","getBarIndex","offsetDiff","shouldAlignDaysToLeftApplied","offsetBars","offset","_e$clientX","onZoomerTouchMove","onZoomerTouchEnd","deltaY","sign","isMouseWheel","difX","normalizeWheelDeltaY","addToZoomFactor","diffCoefficient","currentZoomFactor","minBarWidthInPx","maxBarWidthInPx","minZoomFactor","getZoomFactorForBarsToDisplay","chartVisibleWidth","numOfVisibleBars","maxZoomFactor","isNegativeDirection","newZoomFactor","newZoomFactorInRange","getZoomFactor","getIsSmallIndexChart","updateZoomAndLeftOffsetByDateRange","newQuote","shouldForceLeftOffsetUpdate","isMouseDown","onLayoutModelChange","onPaneCreate","onOlderDataLoaded","onDataLoaded","componentDidUpdate","_prevState$panesWrapp","_this$state$panesWrap","_this$state$panesWrap2","setStateWithPanesTimeout","renderChartToolbar","showSettings","resetMouseModel","handleSetPanesWrapperRef","onPinchStart","onWheel","onMouseWheel","minHeight","total","optiMinHeight","floor","minimalPaneHeight","basePane","WrapperComp","gridArea","isModelDestroyedRef","initChartRef","panesConfig","_pane$elements","_element$overlays","overlays","overlay","panesWithPerfIndicator","allSettled","paneWithPerfIndicator","prefetchPerfIndicatorAllQuotes","shouldResize","chartsDimensions","getChartsDimensions","handleModelBeforeDestroy","isChartPage","isFuturesForexCryptoPage","isModelReady","loadingStyle","hasOutline","withWatchedPanesOnChartModel","ModuleLoadFailed","DefaultErrorBoundary","portfolioWatchlistAsyncModule","SidebarModule","sidebarModules","portfolio","description","content","asyncModule","withInitialLoading","isComponentReady","setIsComponentReady","sidebarModule","isError","isSuspenseMode","withModuleAsyncLoad","mobile","SidebarContent","_width$min","_width$max","_width$default$mobile","_width$default","_width$default$deskto","_width$default2","direction","onResize","useSidebarContext","minWidth","DEFAULT_WIDTHS","maxWidth","defaultMobile","defaultDesktop","desktop","SidebarDirection","vertical","Resizable","enable","handleClasses","defaultSize","isIPad","horizontal","MOBILE_TOOLBAR_DIV_ID","SidebarTabs","activeModule","selectModule","unstable_timeout","isActive","isBlurAfterClick","SIDEBAR_QUERY_PARAM","Sidebar","onShouldResize","tabsClassName","urlSearchParams","sidebarModuleKey","setActiveModule","handleSelectModule","newUrlSearchParams","URLSearchParams","delete","handleCloseSidebar","getIsMobilePortrait","contextValue","isCloseVisible","SidebarContext","ErrorBoundary","FallbackComponent","fallback","drawingCreatorsAsyncModule","drawingActions","DrawingActions","AddNote","DeleteDrawings","DeleteAutoSavedDrawings","getToolbarDrawingActions","isAddNoteAvailable","isIdea","defaultItem","isDisabled","disabledTooltip","drawingSettings","DrawingSetting","PreserveDrawings","iconActive","titleActive","DrawingModeContinuous","HideDrawings","LockDrawings","preserveDrawingsAutosaveOverride","iconAction","titleAction","getToolbarDrawingSettings","isPreserveDrawingsAndAutosaveAvailable","isAutoSaveInProgress","isInAction","drawingTools","Measure","ScaledLine","Arrow","VerticalLine","HorizontalLine","Rectangle","RotatedRectangle","Triangle","Ellipse","Curve","Pitchfork","Polygon","Xabcd","ScaledText","Brush","ElliottWaves","FibonacciRetracements","Position","Callout","toolbarDrawingTools","toolGroup","toolGroupTitle","DISABLED_ITEM_TOOLTIP_LABEL","Toolbar","_chartLayoutModel$ide2","isSidebar","isHorizontal","isMobileOverlay","onActiveToolChange","onDrawingActionClick","onDrawingSettingClick","onDrawingEnd","isAlternativeTheme","areToolsDisabled","drawingCreatorsModule","isDrawingCreatorsModuleLoading","setIsDrawing","availableDrawingSettings","availableDrawingActions","isDrawingModeContinuous","hasData","hasHiddenDrawings","tool","drawingToolsTouchCreatorsByType","drawingToolsCreatorsByType","ToolClass","ToolbarComponent","_item$toolGroup","isToolLoading","ToolbarItem","groupItems","groupTitle","useNativeSelect","ToolbarDivider","ChartAutoSaveNote","onNoteChange","rows","ChartAutoSaveNotes","setTickers","unwatchedInternalStore","handleChartChange","tickerNoteMap","_tickerNoteMap$ticker","AutoSaveNotesDialog","isAnimating","hideOnEsc","ConfirmationDialog","onAction","onCancel","isAutosaveDialogContent","dialogContent","getDialogContent","ConfirmationDialogComponent","DialogDismiss","ToolButton","ToolbarMobile","isToolbarVisible","setIsToolbarVisible","setUrlSearchParams","toolbarMobileElement","setToolbarMobileElement","handleActiveToolChange","drawingTool","wrapperRef","handleClickOutside","_wrapperRef$current","openSelect","actionId","has","AutoSaveStateIndicator","setVisibilityTimeout","newIsVisible","checkIfNeededPreventLeaving","returnValue","hasRedesign","ChartLayoutAutoSaveNote","chartLayoutModelUnwatched","ideaNoteRef","getPublishChartHtmlElements","publishChartElements","getElementsByClassName","getChartImgUrl","_imgElement$src","imgElement","PublishOldButtonClickListener","dialogConfig","setDialogConfig","isCanvas","chartImgUrl","publishChartHtmlElements","clickHandler","dataset","indexInt","IdeaDrawingsConfirmationOptions","IdeaLeaveDialog","actionCallback","Cancel","Override","Merge","Nothing","getChartElementTypeFromQueryType","queryType","_getChartElementTypeF","QuotePageQueryChartTypes","ChartElementType","LineChart","hc","HollowCandleStick","ha","HeikinAshi","o","OhlcChart","PerfChart","cs","CandleStick","getChartElementTypeFromResponseType","TA","useChartRouteChange","useTrackPageView","trackInitial","isIdeasDialogOpen","dateFns","updateChartConfig","_ty","decodedSearch","urlType","handleTypeChange","_decodedSearch$t$spli","_decodedSearch$p$spli","_decodedSearch$p","_decodedSearch$r$spli","_decodedSearch$r","urlTicker","urlTimeframe","urlDateRange","newChartConfig","getRawTickerForInstrument","_chartLayoutModel$ide3","_chartLayoutModel$ide4","_window$FinvizSetting3","defaultPeriod","defaultDateRange","handleIdeaLeave","getDefaultZoomFactor","innerWidth","MOBILE_VIEW_BREAKPOINT_WIDTH","MOBILE_BARS_TO_VIEW","OnInitListener","onRegisterChartLayoutModel","parentElement","setIsInit","checkIfInitIsComplete","isReady","elementIndex","_config$charts$chartI","opacity","withCompleteLayoutModelInit","_props$config$editabl","_props$config$canChan","_props$config$scrolla","_props$config$cross","_props$config$editors","_props$config$ideas","_props$config$specifi","_getInitialStoreDrawi2","_newConfig$idea","newConfig","light","dark","isQuotePageWithDrawingsOff","getCookie","noteDrawing","ideaObject","indicatorElement","getContainerTypeFromPaneConfig","newElements","ChartLayoutModel","toolsState","isLockDrawingsActive","withQuotePolling","pollingIntervalToCharts","setPollingIntervalToCharts","checkForChartsWithPolling","newPollingIntervalToCharts","chartRefreshInterval","_newPollingIntervalTo","intervalIdsRef","checkForChartsWithPollingDebounced","chartsCheckerIntervalId","EXTRA_MARKET_BUFFER_MINUTES","timeoutDurations","allCharts","timeoutDurationsMin","timeoutId","chartIds","quotesToUpdate","quoteToUpdate","dispatchEvent","Event","QUOTE_FETCH_EVENT","ChartLayoutComponentBase","AbortController","preserveDrawings","handlePreserveDrawingsSettings","setPreserveDrawings","val","preserveDrawingAbortController","abort","tools_state","orientationChangeTimeout","setToolbarPosition","handleResize","throttledResize","modelAttrs","throttle","_this$state","_this$state2","getFullscreenStatus","getVisualViewportScale","visualViewport","noteDialogState","toggle","confirmationDialogState","drawingToRemove","settingId","newObj","toggleHideDrawings","handleLockDrawings","event_label","_this$model$activeCha","updateLayout","chartConfig","modelProperties","isToolbarHorizontal","handleInitialPreserveDrawingsState","DELETE","keyCode","ThumbSettings","touchSize","onChartDestroy","onWindowResize","handleOrientationChange","checkTouchEventsDisabled","newIsToolbarHorizontal","renderToolbar","args","isOverlayToolbar","handleDrawingAction","handleDrawingsSetting","_this$props$idea2","useGrid","LAYOUTS","isMobilePortrait","_this$props$idea","isSidebarEnabled","getIsSidebarEnabled","handleConfirmationDialogDeleteBtn","ChartGrid","border","columns","_chartLayout$gridArea","ChartGridCell","gridAreas","hasChartTools","renderTools","ideaTitleContainer","ideaTitle","clear","removeCharts","addCharts","_layout$gridAreas","rowStart","columnStart","rowEnd","columnEnd","numOfRowsCovered","numOfColumnsCovered","percentageOfRowsCovered","percentageOfColumnsCovered","newWidth","newHeight","settingsHeight","wantedCount","pop","ChartLayoutComponent","flowRight","checkQuoteCacheDebounce","cleanupQuoteCache","allQuotes","allChartQuotes","usedQuote","updateChartsTitle","defaultDocumentTitleRef","afterClose","prevClose","percentageChange","overridePlaces","useChartPageTitle","handleChartsUpdate","getChartLayoutWithChartRouteChange","isWithNotifications","Wrapper","NotificationWrapper","ChartLayoutWithGlobalState","setChartLayoutModel","getChartLayoutModelConfig","lastGlobalRerender","IPAD_FULLSCREEN_CLASS","isFullscreen","setIsFullscreen","requestFullscreen","exitFullscreen","getExitFullscreen","checkFullscreen","SORTED_LAYOUT_KEYS","arr","option","sortBy","sortDirection","SORT_DIRECTION","ASC","directionMultiplier","sortObjects","ChartLayoutDropdown","parsedQuery","getChartsToPath","useChartsPathLocation","orientation","DropdownSeparator","ChartSyncableParts","isChartPartInSync","ThemeToggleButton","isDarkMode","updateSettings","BREAKPOINTS","Infinity","marketBadgeText","timeFormat","ChartLayoutHeaderComponent","onSettingsOpen","hasPublish","Time","breakpointMode","breakpoints","ChartLayoutHeader","StockDetailTimeframeBar","_chartModel$timeframe","_chartModel$dateRange","isDateRangeAvailable","isLoadingOverride","isScrollIntoViewEnabled","containerElement","pushIndicators","indicator","_options$COTs","hasPaneWithCOTCode","PANE_HEIGHT_DEFAULT","parameters","getChartTypeByTaConfigStyle","heikinashi","hollowcandlestick","line","ohlc","mergeChartAndTAConfig","taConfig","_chartScaleMap","linear","Linear","percentage","Percentage","logarithmic","indicators","Above","_overlay$parameters","_overlay$color","Below","getPanes","_overlay$parameters2","_overlay$color2","SettingsTab","AdsProvider","getAdsProvider","adsProvider","Freestar","InvestingChannel","trackPageView","query","freestarPageView","_window$freestar","freestar","queue","trackPageview","portfolioWatchlistTableAsyncModule","assets","logo","logo_light","trackAutomatically","initialRender","handleTrackView","tracking","resize","_thumbs","Thumb","x1","y1","x2","y2","getDefaults","ElementSettings","translateXY","getXYOffsetFromLine","lineWidth","translate","beginPath","angle","PI","moveTo","lineTo","stroke","lineAngle","atan2","h","cos","angle1","topx","topy","sin","angle2","botx","boty","getShouldRenderThumbs","renderThumbs","isDrawingElementLockedOrInvisible","distanceToSegment","CanvasElementType","arrow","modalConfig","previousFill","shouldRenderFill","_this$model","positionPointsTimestamps","getTimestampFomPositionX","places","domainDiff","numberOfLeadingZeros","log10","roundToFixed","untranslatedContext","createElement","setFillCache","fill","defaultTransparentFill","isPolyLineClosed","cachedFill","getShouldRenderFill","_this$attrs","brushPath","Path2D","fy","xc","yc","quadraticCurveTo","point","closePath","getThumbs","firstX","firstY","moveByThumb","onMouseUp","roundY","_this$untranslatedCon","isPointInPath","getPositionXFromTimestamp","getAutosaveOmittedProperties","getEdgeXYValues","edgeXYValues","_edgeXYValues$minX","_edgeXYValues$minY","_edgeXYValues$maxX","_edgeXYValues$maxY","minX","minY","maxX","maxY","brushV1","TailDirection","getTailHalfWidth","halfWidth","dist","Text","getModalConfigBase","textWithoutBackground","font","fillStyle","lineHeight","textAlign","textBaseline","padding","background","defaultFill","setupContext","setupTextMetricsCache","_this$lastAttrs","_this$lastAttrs2","ctx","lastAttrs","lines","getLines","metrics","measureText","measuredHeight","currentIndex","actualBoundingBoxAscent","actualBoundingBoxDescent","PADDING","S","renderText","previousDescent","fillText","getCalloutProperties","_this$lines","textWidth","requiredTailHalfWidth","radius","rectangleSides","topLeft","topRight","rightTop","rightBottom","bottomRight","bottomLeft","leftBottom","leftTop","getRectangleSidesCoordinates","tail","tailRoot","tailTip","getTailCoordinates","tailDirection","twoSegmentLinesIntersection","topLeftCorner","topRightCorner","bottomLeftCorner","bottomRightCorner","topSide","rightSide","bottomSide","leftSide","noTail","getTailToSideIntersection","renderBackground","lineJoin","arcTo","tailLineToTopLineIntersection","tailHalfWidth","tailLineToRightLineIntersection","tailLineToBottomLineIntersection","tailLineToLeftLineIntersection","renderCallout","renderBorder","tailP1","perpendicularPointToLine","pointOffsetX","pointOffsetY","tailP2","polygon","pointInPolygon","calloutV1","x3","y3","drawQuadraticCurve","curve","Bezier","quadraticFromPoints","cp1x","cp2x","cp1y","cp2y","project","_Bezier$quadraticFrom","getCoordinates","centerLeftX","centerLeftY","centerRightX","centerRightY","boundingPointKeys","bottomCenterX","bottomCenterY","bezierCurveTo","bottomRightX","bottomRightY","topRightX","topRightY","topCenterX","topCenterY","topLeftX","topLeftY","bottomLeftX","bottomLeftY","rotationAngle","atan","radiusX","radiusY","width_two_thirds","dx1","dy1","dx2","dy2","ellipse","getRectCoordinates","coords","mx1","mx2","my1","my2","nk","dx","sqrt","dy","x4","y4","rotatedRectangle","SymbolElement","sx","getRotatedCoordinates","scaleX","sy","textHeight","scaleY","symbol","xScale","yScale","xOffset","yOffset","rotate","cx","cy","halfHeight","brush_v1","callout_v1","elliottWaves","ellipseV1","ellipse_v1","fibonacciRetracements","fibonacci","horizontalLine","measure","pitchforkV1","pitchfork_v1","rectangle","rotatedRectangleV1","rotatedRectangle_v1","scaledLine","scaledText","symbolElement","triangle","verticalLine","xabcd","obj","getNumOfBarsBuffer","xPointKeys","positionX","_this$model2","_this$model$elements","_this$model3","__","getIsPaneSelection","_this$model$elements$","attrsSubset","customizer","objValue","srcValue","mergewith","defineProperty","globalAlpha","thumb","startEditing","pointPoitionsFromTimestamp","replaceMyself","captureMessage","oldElement","newElement","isCreatorDialogOpen","release","_this$attrs$visibilit","micro","macro","MicroMacroTimeframe","timeframesToSet","attrsToSet","assign","_this$getBoundingPoin","xPoints","yPoints","positionY","omitX","isMaxXInvalid","isMinXInvalid","omitY","topBound","bottomBound","positionWavesTimestamps","waves","wave","getOffsetFromLineWidth","TextBaseline","middle","TextAlign","EllipseV1","rotationAxisPoint","pointToRotate","oldLinePoint","newLinePoint","sharedPointLinesAngle","sharedPoint","rotatedPoinCoordinates","rotatedPointCoordinates","getEllipsePoints","P2","P4","coordinates","P3","P1","CP4","CP1","CP2","CP3","ellipsePath","inverted","cursorTargetX","cursorTargetY","perpendicularPoint","distanceToLine","lineCenterX","lineCenterY","invertX","invertY","perpendicularPointEllipseOffsetX","perpendicularPointEllipseOffsetY","P1WithOffsetX","P1WithOffsetY","P3WithOffsetX","P3WithOffsetY","controlPointOffsetX","controlPointOffsetY","newLeftPoint","leftRotatedCursorPoint","getRotatedPointCoordinates","newRightPoint","rightRotatedCursorPoint","parseCoefficients","coefficients","parsed","trim","getMaxCoefficientUnscaledY","heightScaled","splice","maxCoefficientY","updateDecimalPlaces","decimalPlaces","renderLabels","Line","strokeStyle","dashLength","setLineDash","volume","roundedX1","roundedX2","minIndexLimit","maxIndexLimit","volMinIndex","volMaxIndex","volumeSum","volumeIndex","numberToStringWithUnitsSuffix","x1Dif","x2Dif","startingX1","startingX2","fillRect","priceDif","heightStr","getRoundedString","number","numOfDecimalPlaces","baseX","baseY","getHeight","getVolumeSumString","addToCoordinates","difs","newX1","newX2","paneArea","getEdgeIntersectionPoint","sides","rayOrigin","rayDirection","intersection","intersectionDistance","rayToLineIntersection","getRayToLineSegmentIntersection","getPitchforkCoordinates","rayDirectionControlPoint1","rayDirectionControlPoint2","trend1","trend2","chartVisibleAreaLeftX","chartVisibleAreaRightX","chartVisibleAreaBottomY","chartVisibleAreaTopLeftPoint","chartVisibleAreaTopRightPoint","chartVisibleAreaBottomLeftPoint","chartVisibleAreaBottomRightPoint","getChartVisibleAreaBoundaries","medianRay","trend1Ray1","trend2Ray1","trend1Ray2","trend2Ray2","medianRayDirectionPoint","getMiddlePointOnLineSegment","rayOriginToRayDirectionVector","rayDirectionControlPoint1ToPoint2Vector","normalizedRayDirectionControlPoint1ToPoint2Vector","normalizeVector","medianRayDirectionPointToRayDirectionControlPoint1Distance","trend1Ray","getTrendRayCoordinates","medianToControlPointDistance","normalizedControlToControlPointVector","trendRay1","trendRay2","trend2Ray","medianToTrendLineDistance","trendRayPoint1Origin","addPoints","multiplyVectorByScalar","trendPoint2RayOriginPoint2","subtractPoints","trendRayPoint1DirectionPoint","trendPoint2RayDirectionPoint","median","_trendLines$filter$","trendLines","line1","line2","trendLine","trendLineIndex","solidTrendColor","getHEXWithSpecificAplha","nextTrendLine","outerTrendLines","isPolygon","_this$attrs$points$la","_this$attrs$points$la2","scaledPoints","xPoint","yPoint","targetY","stopY","centerY","stopBaseline","targetBaseline","targetColor","stopColor","targetDif","targetPerc","targetStr","stopDif","stopPerc","stopStr","middle1","roundDif","coordType","coordIndex","strokeRect","RotatedRectangleV1","newMiddleLeftPoint","middleLeftRotatedCursorPoint","newMiddleRightPoint","middleRightRotatedCursorPoint","XXXS","XXS","rect","textBoxX","textBoxY","textBoxWidth","textBoxHeight","alphabetic","getMergedPropsWithDefaults","propKey","f","_obj$font","_this$context$measure","_this$context","MIN_SAFE_INTEGER","testArea","convertArea","rawHight","_border$width","borderWidth","borderColor","thumbWidth","getThumbWidth","XABCD","xx","xy","ax","ay","bx","by","start","retLabel","len","ret","xab","bcd","result1","rendered","refresh","cWidth","cHeight","sWidth","screen","sHeight","OHLCType","ChartMinWidthBreakpoints","getChartBreakpoints","chartWidthInPx","isXs","xs","isS","isM","isL","getDateString","dateString","month","year","getFullYear","day","getDate","i1","i2","i3","i5","i10","i15","i30","h2","h4","MONTHS","getClosestDifferentMinMaxValueIndices","currentMinIndex","currentMaxIndex","high","low","hasPreviousIndex","hasNextIndex","minIndex","maxIndex","gray300","tailwindColors","BaseChart","isLargeChart","overlayDefinition","addOverlay","renderYAxis","setupCache","renderOverlaysLabels","handleIndicatorsChange","mouseModelChangeHandler","mouseModel","baseCache","updateShouldRenderVolume","renderChart","renderChartNotAvailable","getIsRedesignedChart","renderTicker","clip","renderVolume","renderOverlays","renderPrevClose","renderFadeExtendedHours","renderGrid","renderXAxis","tickerText","margin","FONT_SIZE","OFFSET","baseline","renderTimeframe","_ChartSettings$left$t","volumeFY","range","Group","getTimeframeLabel","textSecondary","isOurSiteRequest","L","tickerWidth","offScreen","XS","M","blue","renderChange","lastOhlc","getOHLC","directRender","changePercentage","lastDate","renderOHLC","isSmallIndexChart","isNewestOHLC","afterHour","isFinite","roundOhlc","lastVolume","toLocaleTimeString","hour","minute","getRoundedLastData","lastOpen","lastHigh","lastLow","renderOverlaysLabelsChartsPage","renderOverlaysLabelsQuotePage","overlayLabel","isRenderedOverlaysLabel","labelSpacing","getLabelColor","getYAxisLeftMargin","getYAxisLastCloseLabel","firstVisibleClose","getPercentageFromValue","base","lineTicks","textTicks","lastCloseLabel","getTranslate","do","tickCount","minMax","placesAxis","stepPrice","minPerc","maxPerc","d3","nice","ticks","tick","getValueFromPercentage","pixelGap","negativeScale","previousNegativeTick","positiveScale","previousTick","positiveScaleY","getYLineText","yTickText","axis","yTickLine","getYLine","resetYTicksStyles","percentageZeroLineText","undo","renderYAxisLabel","yCoordinate","getSecondaryLabelBackgroundColor","stringifyHSVAColor","getHSVAFromColor","currentBackground","getYAxisSecondaryLabelYCoordinate","_padding$top","_padding$bottom","mainLabelValue","secondaryLabelValue","LINE_HEIGHT","mainLabelValuePosition","secondaryLabelValuePosition","offsetedY","currentText","getDrawDays","MarketSentiment","textRenderer","startBarIndex","getVisibleBarToRenderIndex","endBarIndex","chartWidth","render15MinXAxis","renderIntradayXAxis","renderIntradayXAxisFutures","renderDailyXAxis","renderWeeklyXAxis","renderMonthlyXAxis","isXPointVisible","renderXAxisLabels","_ref9","labels","allowedOverflow","sortedLabels","renderedLabelRanges","reverse","newLabel","hasPriority","_ref10","halfOfTextWidth","overflowLeft","overflowRight","labelX","getIsOverlapping","interval","IntradayTimeframeInterval","marketStartHour","marketStartMinutes","marketEndHour","ceil","aftermarketLengthMinutes","xLine","getXLine","dayToOffset","getDayToOffset","dayIndex","dateFromDateString","drawMinutesPerDay","roundedX","premarketLengthMinutes","_ref11","lastDay","lastHours","_ref12","indexOffset","getBarsInDay","_ref13","lastMonth","_ref14","gridSecondary","isYearLabel","substring","_ref15","lastYear","isJanuary","shouldRenderVolume","Vol","getVolumeTicks","fontHeight","renderVolumeAxis","relativeVolume","grid","rangeMax","volumeAxisFontSize","volumeAxis","format","tickFormat","domainFrom","domainTo","setupAxisTimeFrame","halfBarWidth","getHalfBarWidth","barWidthWithoutMargin","getBarWithoutMarginWidth","drawInVisibleArea","drawBarCallback","volumeTrendDown","volumeTrendUp","isRendered","contentWidth","contentHeight","getRoundDecimalPlaces","price","getPlacesLastClose","onRenderCrossText","getCrossIndexForPane","conditionalCursor","getDataByCrossIndex","crossIndex","shouldReturnRoundedString","getDataByBarIndex","getCrossIndexChange","_this$data$close$cros","_this$data$close","crossDataIndex","getDataIndexByBarIndex","crossClose","previousClose","getTickerChangeFromCloseValues","anchorClose","dateByBarIndex","virtualTradedDates","getVirtualTimeframeTradedDates","dateStart","dateEnd","_ref16","change","isOffscreen","isGroupInstrument","finvizWatermarkOffset","changeText","percentString","getChangeColor","changeWidth","afterChangeText","afterChangeTextWidth","oneLineAHChangeWidth","afterChange","renderOHLCChartsPage","renderOHLCQuotePage","_ref17","chartBreakpoints","OhlcText","canvasFill","dateElements","trendColor","oElements","hElements","lElements","cElements","volElements","changeElements","getFlatLineArrayWithSpaces","lineElements","startX","lineElement","LabelsText","numberOfNewOhlcLines","_ref18","dateOnly","timeOnly","lineTopY","OHLCFontSize","centerXOffset","leftXOffset","OHLC","ohlcString","singleLine","OHLC_TEXT","getOHLCType","ohlcSettings","getOHLCSettings","CHART_MARGIN","XXL","alignTop","renderOHLCToCanvas","_ref19","ohlcSet","isSingleLineWithChange","n0","n1","x0","premarketFade","aftermarketFade","shouldShowPrevClose","isIntradayWithPreMarket","TIMEFRAMES_WITH_PRE_MARKET","isIndexChart","Cache","getIsMobileChartPage","setupAxis","_utils$max","volumeHeight","firstBarToRenderIndex","lastBarToRenderIndex","volumes","getAreNoBarsVisible","addMarginBottom","marginBottom","setOverlays","removeOverlay","MAX_VALUE","MIN_VALUE","closestMinMaxIndices","placesLastClose","priceAbs","getCandleLikeChartsRenderingColors","overwrittenColors","getColorOverwrites","overwrittenColorKeys","hasOverwrittenCandleColor","colorKey","getShouldUseDarkerWickColors","totalBarWidth","darkerWickColors","thinBarColorsOverride","getRenderChartBarProps","chartSettingsColors","hasFillAndBorder","trendDown","trendUp","borderDown","borderUp","wickDown","wickUp","wickColor","barFillColor","barFillWidth","barBorderWidth","getBarWidthWithMarginByParts","shouldRenderFillAndBorder","translateForWick","WICK_WIDTH","candleBodyHigh","candleBodyLow","candleWickHigh","candleWickLow","candleBodyHeight","candleBodyLeftX","halfBorderWidth","getIsSSr","isBodyHeightGreaterOrEqualBorders","isWickLineCandleLessThanOnePixel","hasBorder","fillHeight","hasFill","isHollow","generalTrendColor","ohlcTrendUp","ohlcTrendDown","zeroChange","haData","getHeikinAshiData","getLastValues","originalLatestClose","heikinLatestCloseLabel","originalLatestCloseLabel","_haData$close$barInde","_haData$close","redLine","greenLine","MarketSentimentSettings","_data","lastIndex","_dataLastIndex","renderLineBullBear","oversold","overbought","isRedesign","marketDown","marketUp","_compute","computeVisibleMinMax","yLine","fillUp","fillDown","percent","MultiLineChart","ColorsSettings","getQuotes","end","asc","_this$data$getDataByB","maxTickerLength","isLastDate","tickersDimensions","closeValue","arrays","_this$data","OHLCChart","barWithoutMarginWidth","lineThickness","handleLengthFromWick","lineOffset","barX","overlayLabelWidth","perf","shouldRenderDate","tickerData","MARGIN","percentageText","lastCrossIndex","_d3$max","fromDate","toDate","filteredQuotes","closes","daysCount","end1","asc1","end2","asc2","monthsInData","availableTickSpots","monthsToAvail","renderMonth","candleStick","heikinAshi","hollowCandleStick","lineChart","marketSentiment","multiLineCharts","ohlcChart","XXXL","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","OverlayType","ChartEventDbType","DESC","DateRangeType","TIMEFRAME_SECONDS","CRYPTOS","BTCUSD","LTCUSD","ETHUSD","XRPUSD","BCHUSD","BTCEUR","LTCEUR","ETHEUR","XRPEUR","BCHEUR","LTCBTC","ETHBTC","XRPBTC","BCHBTC","ScaleLabel","INDICATOR_LABEL_HEIGHT","FREE_DATE_RANGES","curr","PREMARKET_AFTERMARKET_HOURS","_chartLayoutModel$spe","setIsFetching","dateFromUnixTimestamp","generatePathForTimeframeDateRange","timeframeUtm","getTimeframeGroupsWithHref","generatePath","timeFrame","getDateRangeGroupsWithHref","dateRangeState","getVisibleBarsNumber","getChartStartEndDates","unwatchedChartLayoutModel","hasSyncedTimeframe","ChartSyncablePart","Timeframe","hasSyncedTicker","Ticker","_decodedSearch$t","urlTimeframes","urlDateRanges","chartsArrayPlaceholder","_urlTickers$index","currentTicker","timeframes","_urlTimeframes$index","currentTimeframe","_urlDateRanges$index","currentDaterange","sidebar","getTimeframeGroups","timeFrameGroup","QuoteUrlChartTypes","useChartLayoutGlobalModelAsyncModule","CustomDateRangePrefixEnum","DATE_RANGE_PREFIX_DELMITER","getParsedDateRange","startInSec","getTime","endInSec","lastQuoteDateIndex","lastVisibleBarIndex","d1","d5","firstVisibleBarIndex","quoteDate","isQuoteDateInRange","numOfBarsOffset","getChartZoomAndLeftOffset","numOfBarsToRender","numberOfBarsToDraw","daysInQuote","getDaysInQuote","dateRangePrefix","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","Prev","years","parseCustomDateRangeUrlParam","convertLocalToNyTime","setHours","startDateIndex","m1","m3","m6","ytd","y5","numOfBarsInView","getIntradayChartConfig","timeframeMinutes","barWidthWithMargin","hasPremarket","hasAftermarket","fullChartWidth","marketMinutesLength","getFullChartWidth","offsetInPx","shouldCropChart","chartWidthWithOffset","offsetChartAfter","shouldAlignDaysToLeft","drawDaysInOneChart","_lastQuoteDate$getHou","lastQuoteDate","barsToOffset","offsetChartInPx","_quote$open","isStockIntraday","isQuoteOrOffscreen","isChartsInradayDateRange","getShouldOffsetChartDomain","scaleType","handleDomainOffset","currentScale","scaleCreator","protectedHeightPx","minPx","extendedMin","rounded","fromEntries","_numOfDaysToRender","_quote$getBarsInDay","parsedRange","startQuoteDate","endQuoteDate","numOfDaysToRender","_reversedDaysInQuote$","_reversedDaysInQuote$2","reversedDaysInQuote","startQuoteDayIndex","endQuoteDayIndex","renderDateStart","renderDateEnd","getParsedDateRangeMetaData","shouldRenderCross","DEFAULT_CONTEXT","getInstrumentLabel","getResponseChartType","chartType","chartResponseType","tr","BigNumber","BIG_NUMBER_VALUES","Thousand","Million","Billion","Trillion","BIG_NUMBER_ZEROES","BIG_NUMBER_SUFFIX","dotProduct","crossProduct","pow","lineEquation","k","j","oddNodes","l2","formatBigNumber","minNumber","absNum","getString","suffix","zeroes","splitString","addZeroes","padEnd","numberByZeroesCount","isInteger","yAxisCoeficient","xAxisCoeficient","radAngle","p3","p4","denominator","ua","ub","checkLineIntersection","line1_p1","line1_p2","line2_p1","line2_p2","onLine1","onLine2","numerator1","numerator2","rayEnd","segmentStart","segmentEnd","lineIntersection","v","scalar","isSamePoint","ExponentialMovingAverage","multiplier","EMACalculation","MainCalculation","getDefaultCalculatedValues","ema","calculate","onValueCalculated","_calculatedValues","calculatedValues","Ema","getAllCalculatedValues","lastNItems","getCalculatedValues","getDbColumnName","_this$options","key1","key2","localeCompare","MAX_POSITIVE_DEFAULT_VALUE","MAX_NEGATIVE_DEFAULT_VALUE","periodInt","getParsedIntegersFromPeriodString","Rvol","Atr","Adx","Aro","Mfi","Rmi","Rsi","Stofu","Ult","Macd","Rwi","Trix","Wr","Aroosc","Roc","Cci","Fi","INDICATOR_DEFAULT_DOMAIN","compute","renderIndicator","getIsChartPageSpecificFunctionality","renderLabel","isComputeNecessary","shouldUpdate","tickTextStep","formatAxis","valueY","lastValue","_IndicatorSettings$ri","_IndicatorSettings$ri2","_IndicatorSettings$ri3","_IndicatorSettings$ri4","_IndicatorSettings$ri5","_IndicatorSettings$ri6","_IndicatorSettings$ri7","_IndicatorSettings$ri8","indicatorCurrentText","indicatorCurrentBackground","renderLabelChartsPage","renderLabelQuotePage","indicatorLabel","labelWidth","roundedRect","isPerfIndicator","renderCrossTextChartsPage","renderCrossTextQuotePage","renderOversoldOverbought","zero","drawLines","drawInVisibleAreaProps","fromIndexOffset","getCompensatedFirstBarToRenderIndex","clipHeight","renderZeroLine","tickStep","parsePeriodInt","setModel","areNoBarsVisible","getDomainDefaults","inputsErrorMessages","getIsValid","getIsNumberInputValid","integerOnly","isPositiveInteger","ADX","_this$adx$last","adx","amdm","apdm","mdi","pdi","atr","deltaHigh","deltaLow","pdm","mdm","di","_this$period","AroonCalculation","aroonUp","aroonDown","oscillator","highPeriod","highestInPeriod","periodSinceHigh","lastIndexOf","lowPeriod","lowestInPeriod","periodSinceLow","COLORS","Aroon","aroonCalculation","textLabels","labelSetting","AroonOscillator","_this$aroonCalculatio","_this$aroonCalculatio2","_this$aroonCalculatio3","ATR","_this$atr$last","AverageTrueRange","CommodityChannelIndex","_this$cci$last","smaCount","tp","cci","smaSum","devCount","typicalPrice","sma","devSum","dev","COT","cotQuoteCode","cot","commercialHedgers","largeTraders","smallTraders","units","renderAdditionalLabels","secondarylabelX","fontSettings","secondarylabel","FICalculation","fi","ForceIndex","_this$fiCalculation$c2","_this$fiCalculation","_this$fiCalculation$c","fiCalculation","_this$fiCalculation$c3","_this$fiCalculation2","MACDCalculation","macd","signal","histogram","fastPeriod","slowPeriod","signalPeriod","emaFast","emaSlow","emaSignal","MACD","_this$macdCalculation","macdCalculation","signalLine","_this$fastPeriod","_this$slowPeriod","_this$signalPeriod","MFI","_this$mfi$last","negativeMoneyFlow","mf","mfi","prevTypicalPrice","positiveMoneyFlow","moneyFlow","oldMF","OBV","_this$obv$last","obv","currentObv","Obv","PricePerformance","getTickers","chartUuid","hasCachedData","getTickersAndTimeframe","firstFetchCalled","getAll","_this$model$scaleRang","_this$model$scaleRang2","_this$model$scaleRang3","_this$model$scaleRang4","firstBarTime","lastBarTime","dateToIndex","getDateToIndex","perfArrays","_this$quotes","_this$quotes2","_this$quotes3","crossIndexTickerTimeStamp","tickerDateToIndex","tickerPerformance","indicatorLabelWidth","performanceIndicatorLabel","_this$quotes4","_tickerQuote$close$le","isVertical","labelBottom","canFitItemsVertically","tickerQuote","maxCrossIndex","_this$quotes5","_this$quotes6","tickerTextWidth","crossText","getSanitizedTicker","RMI","momentum","_this$rmi$last","rmi","u","ad","au","sumu","sumd","rs","_this$momentum","ROC","_this$roc$last","roc","RsiCalculation","rsi","RSI","_this$rsiCalculation$","rsiCalculation","_this$rsiCalculation$2","_this$rsiCalculation","DEFAULT_PARAMETERS","RelativeVolume","baseLine","periodStr","parsePeriod","_this$rvol$last","rvol","baseLineY","_this$baseLine","RWI","rwiHi","rwiLo","trSum","atrWeight","maxHi","maxLo","Stochastics","kPeriod","dPeriod","_this$k$last","dCount","dSum","k1","kSum","kCount","highestHigh","lowestLow","_this$kPeriod","_this$dPeriod","StochasticsFast","Stofa","StochasticsSlow","Stosl","TrixCalculation","trix","ema1","ema2","ema3","_this$trixCalculation2","_this$trixCalculation3","_this$trixCalculation","trixCalculation","_this$trixCalculation4","UltimateOscillator","period1","period2","period3","_this$ult$last","bpSum2","bpSum3","count2","count3","trSum2","trSum3","ult","bp","avg2","avg3","bpSum1","trSum1","count1","avg1","_this$period2","_this$period3","Volume","_this$data$volume$las","WilliamsR","_this$r$last","none","aro","aroosc","rwi","stofa","stofu","stosl","vol","wr","getWatchedPropValue","watchedProp","spineObject","getIsSpineObject","hasToObject","getJSONReplacerFunc","getWatchedProps","getAreWatchedPropsEqual","currentValue","previousValue","DEFAULT_SPINE_EVENTS","DefaultSpineEvents","stringifiedOptions","useForceUpdate","watchedPropertiesRef","handleModelChange","_watchedPropertiesRef","spineEvents","Crosshair","normalizeHexAlpha","hexString","customColors","customColorKeys","defaultColors","chartLightTheme","chartDarkTheme","toLowerCase","crossTextBackground","negativeChange","overlayTransparentBackground","positiveChange","indicatorLightTheme","indicatorDarkTheme","elementLightTheme","elementDarkTheme","generalColors","_elementAttrs$element","_this$generateUuid","generateUuid","_elementAttrs$zIndex","getElementZIndexRange","oldInstance","pane_id","clonedObj","cloned","moveToZIndex","currentZIndex","directionCoef","newZIndex","elementsBelowZero","elementsAboveZero","getBelowAboveZeroElements","changeElementZIndexes","elementsArray","addElement","oldZIndex","isBelowZero","_this$instance","_this$instance2","isOverlay","_this$instance3","_this$instance4","_this$instance5","_this$instance6","refreshElementId","_this$generateUuid2","MARKET_START","END_OF_DAY","roundTimeForSyncedPane","sourceChart","targetChart","dateToReturn","sourceChartHasPremarket","targetChartHasPremarket","setDate","lastDayOfMonth","lastDayOfWeek","weekStartsOn","endOfDay","getIsDateBeforeMarketStart","_this$pane","_this$pane2","getIsCrossSyncOn","getIsMouseInChartOfPane","paneOfMouse","mouseInChart","currentPaneChart","mousePositionTimestamp","currentPanePositionX","_this$position$y","_this$position","_this$pane3","_this$pane4","getIndexInChart","mouse","CHART_EVENT_BADGE_TYPE_ORDER","chartEventElementModel","move","chartPanes","targetPane","currentChartPaneRecords","records","chart_id","ohterChartPaneRecords","targetRecordIndex","arrayWithoutTargetRecord","chartRecordIndex","panesAbove","panesBelow","getNumericId","isSorted","_this$getAllElements$","_this$mainElement","_this$mainElement2","resetHeight","allPaneElements","rebuildElementZIndexes","hoveredChartEvent","openedChartEvent","hoveredTypeChartEventElements","openedTypeChartEventElements","nonActiveChartEventElements","chartEventsOnSameXPoint","chartEvent_B","isOpened","isHoveredType","isOpenType","quoteCache","getCachedQuote","cachedAt","setCachedQuote","_quoteCache$cid","emptyQuote","numberOfRefreshChecks","is404","patternsMinRange","patternsMaxRange","dataId","tickerRaw","shouldUseCache","doesQuoteAndFetchParamsMatch","isSameOrNoChartUuid","isNotEmptyQuote","isCacheAllowed","hasPatterns","doesQuoteAndOptionsMatch","getResolvedFetchingPromise","maxBars","tickersAndTimeframes","accumulator","err","fetchRequest","QuoteFetchTypeUrlOption","New","fetchingPromise","getUrl","getIsAbortError","NotFoundError","shouldUseEmptyQuote","_data$ticker","_data$patterns","_data$chartEvents","_this$numberOfRefresh","Newer","_this$numberOfRefresh2","noNewData","newQuoteData","lastTime","afterTime","AIndex","BIndex","mergeIndex","ADate","BDate","prevAIndex","prevDate","newDate","isSameWeek","isSameMonth","warn","thisDateLength","dataDateLength","atts","_this$patterns","drawDays","getBarIndexes","barToDataIndex","_this$barIndex","_chartEvents$map","getChartEventsWithId","deleteCachedQuote","cachedHeikinAshiData","HAClose","heikAshiData","cachedDayToOffset","dateStringFromDate","yyyy","mm","dd","padStart","dataIndex","_quoteData$dataIndex","cachedDateToIndex","getTimestampFromPositionX","host","env","BE_API_URL","rev","clearData","largeChartFontSize","INTERACTIVE_CHART_SETTINGS","tickerTimeframeChangeHeight","chartSettings","colorsOverride","settingColors","_config$charts","isLight","getNormalizedZIndex","BbCalculation","stdDev","upperBand","lowerBand","deviations","stdDevSum","Bb","getFreeColor","periods","getRGBAValueFromValidColorString","BB_COLORS","TOP","BOTTOM","MIDDLE","BollingerBands","scaledTop","scaledBottom","firstBarToRender","lastBarToRender","bbCalculation","_this$attrs$period","_this$attrs$deviation","_this$attrs$topColor","_this$attrs$bottomCol","topColor","bottomColor","DonchianChannels","medianBand","_this$attrs$channelSt","_this$attrs$channelFi","_this$attrs$medianBan","strokeColor","channelStrokeColor","fillColor","channelFillColor","medianBandColor","Dch","EMA","_this$attrs$color","EMA2","Ema2","HighLow","highColor","prevHigh","lowColor","prevLow","prevBar","_this$attrs$highColor","_this$attrs$lowColor","Hilo","isPositiveFloat","Hline","Stroke","Fill","Conversion","Base","SpanB","conversion","spanB","IchimokuCloud","_this$data$barIndex$x","outsideBar","renderFull","spanAFillColor","spanAStrokeColor","spanBFillColor","spanBStrokeColor","baseLineColor","conversionLineColor","laggingSpanColor","conversionLine","senkouSpanA","senkouSpanB","conversionStartIndex","baseStartIndex","spanBIndex","highestHi","lowestLo","lastSpanAX","lastSpanBX","cloudStartingX","toIndexOffset","fxOverride","_this$attrs$conversio","_this$attrs$base","_this$attrs$spanB","_this$attrs$spanAStro","_this$attrs$spanAFill","_this$attrs$spanBStro","_this$attrs$spanBFill","_this$attrs$conversio2","_this$attrs$baseLineC","_this$attrs$laggingSp","Ic","IchimokuCloudFull","Icf","KeltnerChannel","emaPeriod","atrPeriod","middleLine","_this$attrs$emaPeriod","_this$attrs$multiplie","_this$attrs$atrPeriod","_this$attrs$strokeCol","_this$attrs$fillColor","Kch","Patterns","originalScale","barsInDay","aboveBelow","textHS","above","below","supportColor","resistColor","kind","_this$attrs$supportCo","_this$attrs$resistCol","Calculation","PivotPeriod","PivotPoints","calculationType","getPeriodType","week","getIsEnoughData","startIndex","endIndex","periodType","dayGap","startDay","beforeDay","_lastDate","_lastDate2","_lastDate3","calculatedX","fromX","toX","currentDate","previousTradingDay","previousNYMidnightTimestamp","currentMidnight","currentNYMidnightTimestamp","isNonStockFullDay","isStockFullDay","firstDayCurrentWeek","firstDayCurrentWeekTimestamp","firstDayPreviousWeek","firstDayPreviousWeekTimestamp","firstDayCurrentMonth","firstDayCurrentMonthTimestamp","firstDayPreviousMonth","firstDayPreviousMonthTimestamp","firstDayCurrentYear","firstDayCurrentYearTimestamp","firstDayPreviousYear","firstDayPreviousYearTimestamp","pivot","sup1","sup2","sup3","res1","res2","res3","previousHigh","previousLow","pivotPoint","currentX","toBars","nextDate","_this$data$drawMinute","_this$data$drawMinute2","_this$attrs$calculati","Pp","SAR","maxStep","isLong","sar","ep","newHigh","newLow","af","sarToDraw","risingColor","fallingColor","_this$attrs$step","_this$attrs$maxStep","_this$attrs$risingCol","_this$attrs$fallingCo","customizable","Sar","SMACalculation","Sma","SMA","SMA2","Sma2","Supertrend","finalUpperBand","finalLowerBand","supertrend","uptrendColor","avg","downtrendColor","_this$attrs$uptrendCo","_this$attrs$downtrend","Str","VP_COLORS","applyOpacityToColor","VolumeProfile","upColor","downColor","_attrs$upColor","_attrs$downColor","minClose","maxClose","segment","segments","up","down","segmentIndex","isInSegment","volumeTrend","volumeFX","segmentHeightRaw","segmentHeight","upSegmentWidth","downSegmentWidth","_this$attrs$opacity","_this$attrs$upColor","_this$attrs$downColor","Vp","VWapCalculation","vwap","cumulativePV","cumulativeVolume","second","datesAreOnSameDay","Vwap","VWAP","bb","dch","hilo","hline","ic","icf","kch","pp","sma2","vp","arg","_len2","_key2","_len3","_key3","devicePixelRatio","getQuoteDateTimestampOffsetInSeconds","referenceDate","dayNumber","monthIndex","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","addOffset","quoteDateTimeOffsetInMs","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","bufferMinutes","dayOfWeek","currentDayMinutes","premarketMinutes","aftermarketMinutes","isWeekend","isClosed","setUTCSeconds","testTouchPoints","isMobileOs","navigator","userAgent","createEvent","match","msMaxTouchPoints","maxTouchPoints","matchesIPad","matchesIPhone","matchesIPod","re","RegExp","cookie","toUTCString","_document$fullscreenE","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","_element$requestFulls","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","_document$exitFullscr","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","fn","readyState","chartElementId","_box$width","_box$height","box","matchingPages","requestsAbortControllersCache","_requestsAbortControl","abortRequest","controller","websiteShared","shouldUseCPUOnly","matchesAndroid","matchesWebOS","matchesiPad","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","isMobileDevice","isFirefoxDesktop","getContext","willReadFrequently","_cache","_restore","CanvasRenderingContext2D","getChartEventBadgeColors","outerStroke","innerStroke","innerFill","textFill","getFormattedEventDate","exdate","hasEarningsDateSuffix","parsedDate","formattedDate","formatDateToStringUS","getFormattedValue","bigNumberUnit","maxDecimalPlaces","numberString","bigNumber","wholeNumber","decimalNumber","formattedDecimalNumber","getChartEventBageColors","twColors","DAY_IN_SECONDS","TWO_MIN_IN_MS","virtualDatesCache","areTimestampsFromSameDay","ts1","ts2","ts1Utc","ts2Utc","getVirtualDatesCacheId","idRevision","setCachedVirtualDates","fromSeconds","toSeconds","virtualDates","virtualDatesCacheId","lastUsed","checkVirtualCacheSize","MAX_BAR_BORDER_WIDTH","MIN_BAR_MARGIN_WIDTH","MAX_BAR_MARGIN_WIDTH","settingsCenter","barMarginWidth","shouldRound","roundDecimalPlaces","halfBarWidthRaw","DEFAULT_ZOOM_GUESS_INCREMENT","zoomFactorForBarsToDisplayCache","zoomFactorForBarsToDisplayCacheKeys","getZoomFactorFromCache","_zoomFactorForBarsToD","setZoomFactorToCache","poppedKey","defaultBarWidthWithMargin","zoomIncrement","finalZoomFactor","iteration","barWidthDiff","getTimeframeSeconds","lowerIndex","dates","upperIndex","isWithinRangeOfQuoteDate","commonVirtualCacheProps","cachedDates","cache","virtualDateSeconds","getCachedVirtualDates","timeframeSeconds","firstDate","numOfDatesBefore","numOfDatesAfter","virtualTradedDays","dateStartSeconds","dateEndSeconds","datesSeconds","isStartBeforeDates","isEndAfterDates","dateTime","getVirtualTradedDays","marketStartSeconds","barTimeframeSeconds","quoteDatesTimestampOffset","dayStartSeconds","barSeconds","virtualTimeframeTradedDates","isLowerBounded","isOneBeforeLowerBoundStarts","lastDateIndex","isLookingBack","averageBarDate","numOfSecondsOutOfBounds","_perfIndicatorElement","_perfIndicatorElement2","perfIndicatorElement","getPerfIndicatorTickerAndTimeframes","resolve","getPriceForPane","isXAxisInView","domainRange","priceFy","YAxisLeftMargin","getCrossText","_getRoundDecimalPlace","firstBarClose","_ref20","changePercent","changePercentString","_ref21","isForexFuturesCryptoPage","_ref22","isForexFuturesCrypto","isOffscreenChartWithNarrowBars","isQuoteChartWithNarrowBars","_ref23","hexStringToRGBA","hexColor","removeHashSymbol","g","rgbaToHexString","alpha","alphaToHex","rgbaToHSVA","hsvaToRGBA","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","red","green","strColor","allowAlpha","getIsRgb","rgbKeys","output","canSelectAlpha","hsvaToHEXString","dataBarIndex","isBarVisible","object","formData","append","FormData","statusCode","throwOnPredicate","credentials","responseContentType","Html","responseData","ApplicationJsonUTF","FormUrlEncoded","parseResponseForContentType","status","getStatusCodeError","forceUpdateKey","increment","precision","periodString","part","exception","captureContext","parsedNumber","MAX_SAFE_INTEGER","visited","WeakSet","toLocaleDateString","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","getRandomValues","Uint8Array","useChartLayoutGlobalModelModule","useChartLayoutGlobalModel"],"sourceRoot":""}