{"version":3,"file":"4388.005bcbcd.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 { DrawingSetting } from '../controllers/toolbar/interfaces'\r\nimport Indicator from '../indicators/indicator'\r\nimport { getIsSSr } from '../utils/helpers'\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 'willDestroy',\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 willDestroy?: boolean\r\n declare drawingsInternalStore: () => DrawingsInternalStore\r\n\r\n constructor(...args: any[]) {\r\n super(...args)\r\n\r\n if (!getIsSSr()) {\r\n this.bind('update', (model: ChartLayout) => {\r\n if (!window.FinvizSettings.toolsState) {\r\n window.FinvizSettings.toolsState = {}\r\n }\r\n window.FinvizSettings.toolsState[DrawingSetting.PreserveDrawings] = model.isPreserveDrawingsActive\r\n })\r\n }\r\n }\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 destroy(options?: TodoObjectHashAnyType) {\r\n this.updateAttribute('willDestroy', true)\r\n return super.destroy(options)\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.updateAttribute('willDestroy', true)\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 const unregisterListeners = () => {\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.bind('change', (model: ChartLayout) => {\r\n if (model.willDestroy) {\r\n unregisterListeners()\r\n }\r\n })\r\n\r\n return unregisterListeners\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 let wasDeleted\r\n try {\r\n const response = await fetch(`/api/idea_delete.ashx?id=${idea.id}`, {\r\n method: 'DELETE',\r\n })\r\n\r\n wasDeleted = response.status === 200\r\n } catch {}\r\n\r\n if (!wasDeleted) {\r\n return\r\n }\r\n\r\n if (currentIdea === idea.id.toString()) {\r\n const newUrl = new URL(window.location.href)\r\n newUrl.searchParams.delete('i')\r\n window.location.href = newUrl.href\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.id !== idea.id),\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.id !== idea.id),\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 isChartPage = layoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\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) : 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', showTimeout: 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 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 state={tooltipState}\r\n aria-label={value.description}\r\n isHideOnClick\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 left 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 = 2000,\r\n Free = 180000,\r\n Elite = 2000,\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.barIndex[quote.barIndex.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 = quote.barIndex[index]\r\n }\r\n lastVisibleBarIndex = quote.barIndex[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 canCropChart,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n maxWidth: number\r\n canCropChart: boolean\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 canCropChart && 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 canCropChart: !chartModel.dateRange,\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 const isOffScreen = specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isQuotePage = specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n\r\n const isQuotePageWithNoDateRange = isQuotePage && !dateRange\r\n const isQuotePageIntradayDateRange =\r\n isQuotePage && !!dateRange && [DateRangeType.d1, DateRangeType.d5].includes(dateRange)\r\n const isQuotePageWithFixedBars = isQuotePage && numberOfBarsToDraw\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 (\r\n isStockIntraday &&\r\n (isOffScreen ||\r\n isQuotePageWithNoDateRange ||\r\n isQuotePageIntradayDateRange ||\r\n isQuotePageWithFixedBars ||\r\n isChartsInradayDateRange ||\r\n isChartPageWithFixedBars)\r\n )\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 { getBarWidthWithMarginByParts } from '../utils/chart'\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 } = 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 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 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 - halfBarWidth, y, barWidthWithoutMargin, 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 + 1))\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, dateString } })\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 !firstBarToRenderIndex.isBarVisible && !lastBarToRenderIndex.isBarVisible\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","getIsSSr","toolsState","DrawingSetting","PreserveDrawings","isPreserveDrawingsActive","getPaneWithSelection","selection","charts","layout","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","unregisterListeners","clearInterval","willDestroy","getIdeaUrl","period","searchObject","t","p","isQuotePage","isStockOnQute","path","queryString","ta","IdeaItem","onIdeaDeleted","isDeleting","setIsDeleting","isConfirmDelete","setIsConfirmDelete","currentIdea","decodeQueryString","onDeleteIdeaClick","wasDeleted","fetch","status","newUrl","URL","href","searchParams","delete","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","toLowerCase","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","search","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","reload","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","isChartPage","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","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","showTimeout","isActive","focusable","isHideOnClick","SIDEBAR_QUERY_PARAM","Sidebar","onShouldResize","tabsClassName","urlSearchParams","sidebarModuleKey","setActiveModule","handleSelectModule","newUrlSearchParams","URLSearchParams","handleCloseSidebar","getIsMobilePortrait","contextValue","isCloseVisible","SidebarContext","ErrorBoundary","FallbackComponent","fallback","drawingCreatorsAsyncModule","drawingActions","DrawingActions","AddNote","DeleteDrawings","DeleteAutoSavedDrawings","getToolbarDrawingActions","isAddNoteAvailable","isIdea","defaultItem","isDisabled","disabledTooltip","drawingSettings","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","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","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","canCropChart","fullChartWidth","marketMinutesLength","getFullChartWidth","offsetInPx","shouldCropChart","chartWidthWithOffset","offsetChartAfter","shouldAlignDaysToLeft","drawDaysInOneChart","_lastQuoteDate$getHou","lastQuoteDate","barsToOffset","offsetChartInPx","_quote$open","isStockIntraday","isOffScreen","isQuotePageWithNoDateRange","isQuotePageIntradayDateRange","isQuotePageWithFixedBars","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","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","url","credentials","headers","responseContentType","Html","responseData","ApplicationJsonUTF","FormUrlEncoded","parseResponseForContentType","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":""}