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

(\r\n Component: React.ComponentType

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

(\r\n Component: React.ComponentType

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

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

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

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

(\r\n Component: React.ComponentType

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

(\r\n Component: React.ComponentType

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

\r\n
\r\n {SORTED_LAYOUT_KEYS.map((layout) => (\r\n {\r\n navigate(getChartsToPath({ layout }))\r\n }}\r\n >\r\n \r\n \r\n ))}\r\n
\r\n \r\n
\r\n
\r\n Sync:\r\n
\r\n {ChartSyncableParts.map(({ value, label }) => {\r\n const isChartPartInSync = chartLayoutModel.getIsChartPartInSync(value)\r\n return (\r\n {\r\n chartLayoutModel.setSyncChartParts(value, !isChartPartInSync)\r\n if (!isChartPartInSync) window.gtag?.('event', 'sync', { event_label: value })\r\n }}\r\n >\r\n {label}\r\n \r\n )\r\n })}\r\n
\r\n
\r\n \r\n )\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { SORT_DIRECTION } from '../constants/common'\r\n\r\nexport function sortObjects(\r\n arr: ObjectHash[],\r\n options: Array<{ sortBy: string; sortDirection?: keyof typeof SORT_DIRECTION }> = []\r\n) {\r\n return arr.sort((a, b) =>\r\n options.reduce((acc, option) => {\r\n const { sortBy, sortDirection = SORT_DIRECTION.ASC } = option\r\n const directionMultiplier = sortDirection === SORT_DIRECTION.ASC ? 1 : -1\r\n return acc === 0 ? (a[sortBy] - b[sortBy]) * directionMultiplier : acc\r\n }, 0)\r\n )\r\n}\r\n","import { Button, setCookieRequest } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { updateSettings } from '../../models/settings'\r\n\r\nexport function ThemeToggleButton({ model }: { model: ChartLayout }) {\r\n const chartLayoutModel = useModelState(model, { watchProperties: ['theme'] })\r\n const isDarkMode = model.theme === 'dark'\r\n\r\n const onClick = () => {\r\n const theme = isDarkMode ? 'light' : 'dark'\r\n chartLayoutModel.updateAttributes({ theme, settings: updateSettings(chartLayoutModel, theme) })\r\n chartLayoutModel.trigger('theme', chartLayoutModel)\r\n setCookieRequest('chartsTheme', theme).catch(() => {})\r\n\r\n if (isDarkMode) {\r\n document.documentElement.classList.remove('dark')\r\n } else {\r\n document.documentElement.classList.add('dark')\r\n }\r\n }\r\n\r\n if (!chartLayoutModel) {\r\n return null\r\n }\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Button, Time, TimeBreakpoint } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { FullscreenButton } from './fullscreen_button'\r\nimport { IdeasDropdown } from './ideas_dropdown'\r\nimport { ChartLayoutDropdown } from './layout_dropdown'\r\nimport { Publish } from './publish'\r\nimport { ThemeToggleButton } from './theme_toggle_button'\r\nimport { TourButton } from './tour_button'\r\n\r\nconst BREAKPOINTS: TimeBreakpoint[] = [\r\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\r\n { minWidth: 550, marketBadgeText: false, timeFormat: 'short' },\r\n { minWidth: 700, marketBadgeText: false, timeFormat: 'long' },\r\n { minWidth: 768, marketBadgeText: true, timeFormat: 'long' },\r\n]\r\n\r\ninterface ChartLayoutHeaderProps {\r\n model: ChartLayout\r\n onSettingsOpen: () => void\r\n hasPublish: boolean\r\n}\r\n\r\nexport function ChartLayoutHeaderComponent({ model, onSettingsOpen = () => {}, hasPublish }: ChartLayoutHeaderProps) {\r\n const chartLayout = useModelState(model, { watchProperties: ['idea'] })!\r\n\r\n return (\r\n <>\r\n
\r\n \r\n Ideas\r\n \r\n
\r\n
\r\n \r\n Chart tour\r\n \r\n \r\n \r\n {hasPublish && (\r\n \r\n Share\r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nexport const ChartLayoutHeader = React.memo(\r\n ChartLayoutHeaderComponent,\r\n (prevProps, nextProps) =>\r\n prevProps.model === nextProps.model &&\r\n prevProps.onSettingsOpen === nextProps.onSettingsOpen &&\r\n prevProps.hasPublish === nextProps.hasPublish\r\n)\r\n","import {\r\n ButtonSizeType,\r\n CustomDateRange,\r\n TimeframeBar,\r\n useCustomDateRangeDialog,\r\n useFavoriteTimeframes,\r\n withSuspense,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { isRedesignEnabled } from '../../utils'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\nimport { useChartControls } from './use-chart-controls'\r\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\r\n\r\nfunction StockDetailTimeframeBarRaw({\r\n size = 'regular',\r\n className = '!m-0 space-x-2',\r\n isDateRangeAvailable,\r\n isPremium,\r\n isLoadingOverride,\r\n isScrollIntoViewEnabled = false,\r\n onTimeframeSelect = () => {},\r\n onDateRangeSelect = () => {},\r\n}: {\r\n size?: ButtonSizeType\r\n className?: string\r\n isDateRangeAvailable: boolean\r\n isPremium: boolean\r\n isLoadingOverride?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n onTimeframeSelect?: (timeframe: any) => void\r\n onDateRangeSelect?: (timeframe: any) => void\r\n}) {\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const chartModelUnwatched = React.useMemo(() => chartLayoutModel?.getAllCharts()[0] ?? null, [chartLayoutModel])\r\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes(isPremium)\r\n const chartModel = useModelState(chartModelUnwatched, {\r\n watchProperties: ['timeframe', 'dateRange'],\r\n })\r\n const { instrument = Instrument.Stock } = chartModel?.quote() || {}\r\n const { isLoading } = useChartControls({\r\n chartModel,\r\n isInteractive: isDateRangeAvailable,\r\n })\r\n\r\n const {\r\n anchorDate,\r\n generateChartLayoutRouterPath,\r\n timeframeGroupsWithHref,\r\n dateRangeGroupsWithHref,\r\n isFetching,\r\n handleCustomDateRangeValidation,\r\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\r\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\r\n useCustomDateRangeDialog({\r\n instrument,\r\n anchorDate,\r\n pathGenerator: generateChartLayoutRouterPath,\r\n })\r\n\r\n const dateRangeGroups = dateRangeGroupsWithHref({ isPremium, customRange: chartModel?.dateRange, instrument })\r\n const timeFrameGroups = timeframeGroupsWithHref(isPremium)\r\n\r\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\r\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\r\n if (!dateRangeTimeframe) return\r\n\r\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\r\n if (isValid) onDialogSubmit(dateRangeTimeframe)\r\n }\r\n\r\n return (\r\n <>\r\n {\r\n handleDateRangeSelect(value)\r\n onDateRangeSelect?.(value)\r\n }}\r\n onCustomDateRangeClick={() => {\r\n if (isPremium) customDateRangeDialogState.show()\r\n }}\r\n onTimeframeSelect={onTimeframeSelect}\r\n onFavoriteTimeframeToggle={({ value }: { value: string }) => {\r\n toggleFavoriteTimeframe(value as TIMEFRAME)\r\n }}\r\n isDateRangeAvailable={isDateRangeAvailable}\r\n containerElement={document.body}\r\n className={className}\r\n isFavoritesEnabled={isPremium}\r\n isScrollIntoViewEnabled={isScrollIntoViewEnabled}\r\n />\r\n\r\n {chartModel && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const StockDetailTimeframeBar = withSuspense(StockDetailTimeframeBarRaw)\r\n","import { ChartConfigChartPane, Position, RootChartConfigObject } from '../../types/shared'\r\nimport { ChartElementType, IndicatorType, OverlayType, PANE_HEIGHT_DEFAULT, ScaleType } from '../constants/common'\r\n\r\nfunction hasPaneWithCOTCode(panes: ChartConfigChartPane[], code: string) {\r\n return panes.some(({ elements }) =>\r\n elements.some((element) => element.type === IndicatorType.Cot && element.code === code)\r\n )\r\n}\r\nfunction pushIndicators(\r\n panes: ChartConfigChartPane[],\r\n indicator: { name: string; parameters: string },\r\n options?: { COTs?: string[] }\r\n) {\r\n if (indicator.name === 'cot') {\r\n const cotKeys = options?.COTs ?? []\r\n if (cotKeys.length === 0) {\r\n cotKeys.push('')\r\n }\r\n cotKeys.forEach(function (code: string) {\r\n if (!hasPaneWithCOTCode(panes, code)) {\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.indicator,\r\n elements: [\r\n {\r\n type: IndicatorType.Cot,\r\n code,\r\n },\r\n ],\r\n })\r\n }\r\n })\r\n } else {\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.indicator,\r\n elements: [\r\n {\r\n type: ('indicators/' + indicator.name) as IndicatorType,\r\n period: indicator.parameters,\r\n },\r\n ],\r\n })\r\n }\r\n}\r\n\r\nfunction getChartTypeByTaConfigStyle(style: string) {\r\n const chartTypeMap = {\r\n candlestick: ChartElementType.CandleStick,\r\n heikinashi: ChartElementType.HeikinAshi,\r\n hollowcandlestick: ChartElementType.HollowCandleStick,\r\n line: ChartElementType.LineChart,\r\n ohlc: ChartElementType.OhlcChart,\r\n }\r\n return chartTypeMap[style as keyof typeof chartTypeMap]\r\n}\r\n\r\nfunction getChartScaleByTaConfigScale(scale: string | undefined) {\r\n const chartScaleMap = {\r\n linear: ScaleType.Linear,\r\n percentage: ScaleType.Percentage,\r\n logarithmic: ScaleType.Logarithmic,\r\n }\r\n return chartScaleMap[scale as keyof typeof chartScaleMap] ?? ScaleType.Linear\r\n}\r\n\r\n/*\r\n * Merges chartConfig (in \"chart\" format) with taConfig (in format that TA is preserved in DB)\r\n */\r\nexport const mergeChartAndTAConfig = function convertTA(\r\n chartConfig: RootChartConfigObject,\r\n taConfig: TaConfigObject,\r\n options?: { COTs: string[] }\r\n) {\r\n const panes = chartConfig.charts[0].panes\r\n const chart = chartConfig.charts[0]\r\n\r\n chart.scale = getChartScaleByTaConfigScale(taConfig.scale)\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Above)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n const overlays = taConfig.overlays.map(function (overlay) {\r\n return {\r\n type: ('overlays/' + overlay.name) as OverlayType,\r\n period: overlay.parameters ?? '',\r\n color: overlay.color ?? '',\r\n }\r\n })\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.chart,\r\n elements: [\r\n {\r\n type: getChartTypeByTaConfigStyle(taConfig.style),\r\n overlays: overlays,\r\n },\r\n ],\r\n })\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Below)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n chartConfig.height = chart.height = PANE_HEIGHT_DEFAULT.chart + (panes.length - 1) * PANE_HEIGHT_DEFAULT.indicator\r\n}\r\n\r\nexport const getPanes = function getPanes(taConfig: TaConfigObject) {\r\n const options = {}\r\n const panes: ChartConfigChartPane[] = []\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Above)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n const overlays = taConfig.overlays.map(function (overlay) {\r\n return {\r\n type: ('overlays/' + overlay.name) as OverlayType,\r\n period: overlay.parameters ?? '',\r\n color: overlay.color ?? '',\r\n }\r\n })\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.chart,\r\n elements: [\r\n {\r\n type: getChartTypeByTaConfigStyle(taConfig.style),\r\n overlays: overlays,\r\n },\r\n ],\r\n })\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Below)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n return panes\r\n}\r\n","export * from 'finviz-charts/app/lib-export'\r\n\r\nexport enum SettingsTab {\r\n Chart = 'chart',\r\n Colors = 'colors',\r\n}\r\n\r\nexport enum SidebarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n","export const createAlertAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"create-alert\" */ './module-entry'),\r\n cacheKey: 'create-alert',\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","export const portfolioWatchlistTableAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist-table\" */ './PortfolioWatchlistTable'),\r\n cacheKey: 'portfolio-watchlist-table',\r\n}\r\n","import logo from './app/shared/assets/logo.png'\r\nimport logo_light from './app/shared/assets/logo_light.png'\r\n\r\nexport * from './main/components'\r\n\r\nexport { getSanitizedTicker } from './app/shared/ticker-sanitizer'\r\nexport * from './app/queryString'\r\nexport * from './main/modules/portfolio/types'\r\n\r\nexport { getFormattedDateString } from './app/header/utils'\r\nexport { decodeQueryString, encodeQueryString } from './app/queryString'\r\nexport { createAlertAsyncModule } from './app/quote/create-alert/async-modules'\r\nexport { saveToPortfolioAsyncModule } from './app/quote/save-to-portfolio/async-modules'\r\nexport { formatDateToStringUS } from './app/shared/utils'\r\nexport { portfolioWatchlistTableAsyncModule } from './main/components/portfolio/async-modules'\r\nexport { useTrackPageView } from './main/hooks/use-track-pageview'\r\nexport {\r\n useAsyncModule,\r\n withSuspense,\r\n type ControlledModuleConfig,\r\n type SuspenseModuleConfig,\r\n} from './main/services/async-modules-utils'\r\nexport { importWithRetry } from './main/services/import-with-retry'\r\nexport * as localStorage from './main/services/local-storage'\r\nexport { waitForPreviousPromise } from './main/services/wait-for-previous-promise'\r\nexport { setCookieRequest } from './main/services/api'\r\n\r\nexport const assets = { logo, logo_light }\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport * as tracking from '../../app/shared/tracking'\r\n\r\nexport function useTrackPageView(props?: { trackInitial?: boolean; trackAutomatically?: boolean }) {\r\n const { trackInitial = false, trackAutomatically = true } = props ?? {}\r\n const initialRender = React.useRef(trackInitial)\r\n const location = useLocation()\r\n\r\n const handleTrackView = React.useCallback(() => {\r\n tracking.trackPageView({ pathname: location.pathname, query: location.search })\r\n }, [location.pathname, location.search])\r\n\r\n React.useEffect(() => {\r\n if (!trackAutomatically) return\r\n if (initialRender.current) handleTrackView()\r\n initialRender.current = true\r\n }, [trackAutomatically, handleTrackView, trackInitial])\r\n\r\n return handleTrackView\r\n}\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IArrowAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n border: DrawingBorder\r\n}\r\n\r\nclass Arrow extends Element {\r\n static type = CanvasElementType.arrow\r\n\r\n declare scaled: Pick\r\n name = 'Arrow'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'l',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'r',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 3,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineCap', 'round')\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const angle = Math.PI / 8\r\n const d = 20\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n\r\n const lineAngle = Math.atan2(roundedXY.y2 - roundedXY.y1, roundedXY.x2 - roundedXY.x1)\r\n const h = Math.abs(d / Math.cos(angle))\r\n\r\n const angle1 = lineAngle + angle\r\n const topx = roundedXY.x1 + Math.cos(angle1) * h\r\n const topy = roundedXY.y1 + Math.sin(angle1) * h\r\n const angle2 = lineAngle - angle\r\n const botx = roundedXY.x1 + Math.cos(angle2) * h\r\n const boty = roundedXY.y1 + Math.sin(angle2) * h\r\n\r\n context.beginPath()\r\n context.moveTo(topx, topy)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(botx, boty)\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'l') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nArrow.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default Arrow\r\n","import { DrawingBorder, PaneArea, RequireByKey, ResizeByThumbFuncProps } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport Element, { EdgeValues } from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport type BrushPoints = Array<[x: number, y: number]>\r\n\r\nexport interface IBrushAttrs {\r\n points: BrushPoints\r\n fill: string\r\n border: DrawingBorder\r\n isPolyLineClosed: boolean\r\n positionPointsTimestamps: BrushPoints\r\n}\r\n\r\nclass Brush extends Element {\r\n static type = CanvasElementType.brushV1\r\n\r\n untranslatedContext: CanvasRenderingContext2D | null = null\r\n\r\n name = 'Brush'\r\n\r\n brushPath: Path2D | null = null\r\n\r\n cachedFill = {\r\n previousFill: '',\r\n shouldRenderFill: false,\r\n }\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\r\n this.setFillCache()\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultTransparentFill,\r\n border: {\r\n width: 3,\r\n color: ElementSettings.Colors.border,\r\n },\r\n isPolyLineClosed: false,\r\n } as Partial\r\n }\r\n\r\n setFillCache() {\r\n this.cachedFill.previousFill = this.attrs.fill\r\n if (this.attrs.fill.length === 9) {\r\n this.cachedFill.shouldRenderFill = this.attrs.fill.slice(7) !== '00'\r\n } else {\r\n this.cachedFill.shouldRenderFill = true\r\n }\r\n }\r\n\r\n getShouldRenderFill() {\r\n if (this.attrs.fill !== this.cachedFill.previousFill) {\r\n this.setFillCache()\r\n }\r\n return this.cachedFill.shouldRenderFill\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (this.attrs.border != null) {\r\n context.set('strokeStyle', this.attrs.border.color)\r\n }\r\n context.set('lineCap', 'round')\r\n context.set('lineJoin', 'round')\r\n\r\n const brushPath = new Path2D()\r\n const { points } = this.attrs\r\n context.beginPath()\r\n brushPath.moveTo(this.fx(points[0][0]), this.fy(points[0][1]))\r\n let i\r\n if (points.length > 3) {\r\n for (i = 0; i < points.length - 2; i++) {\r\n const xc = (this.fx(points[i][0]) + this.fx(points[i + 1][0])) / 2\r\n const yc = (this.fy(points[i][1]) + this.fy(points[i + 1][1])) / 2\r\n brushPath.quadraticCurveTo(this.fx(points[i][0]), this.fy(points[i][1]), xc, yc)\r\n }\r\n brushPath.quadraticCurveTo(\r\n this.fx(points[i][0]),\r\n this.fy(points[i][1]),\r\n this.fx(points[i + 1][0]),\r\n this.fy(points[i + 1][1])\r\n )\r\n } else {\r\n for (const point of points) {\r\n brushPath.lineTo(this.fx(point[0]), this.fy(point[1]))\r\n }\r\n }\r\n\r\n if (this.attrs.isPolyLineClosed) {\r\n brushPath.closePath()\r\n }\r\n this.brushPath = brushPath\r\n if (this.attrs.fill && this.getShouldRenderFill()) {\r\n context.set('fillStyle', this.attrs.fill)\r\n context.fill(brushPath)\r\n }\r\n if (this.attrs?.border?.width) {\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.stroke(brushPath)\r\n }\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n const [firstX, firstY] = this.attrs.points[0]\r\n const [lastX, lastY] = this.attrs.points[this.attrs.points.length - 1]\r\n\r\n return [\r\n new Thumb(\r\n 'first',\r\n () => firstX,\r\n () => firstY,\r\n this.moveByThumb,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'last',\r\n () => lastX,\r\n () => lastY,\r\n this.moveByThumb,\r\n this.model\r\n ),\r\n ]\r\n }\r\n\r\n moveByThumb = ({ difX, difY }: RequireByKey) => {\r\n this.moveBy(difX, difY)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n if (this.getIsCreator()) return\r\n for (const point of this.attrs.points) {\r\n point[0] += x\r\n point[1] += y\r\n }\r\n }\r\n\r\n onMouseUp() {\r\n const [currentDomainMax, currentDomainMin] = this.model.scale.y.domain()\r\n for (const point of this.attrs.points) {\r\n point[0] = this.roundToFixed(point[0], 2)\r\n point[1] = this.roundY(point[1], currentDomainMax - currentDomainMin)\r\n }\r\n super.onMouseUp()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const { points } = this.attrs\r\n if (\r\n (this.getShouldRenderFill() || this.attrs.isPolyLineClosed) &&\r\n this.brushPath &&\r\n this.untranslatedContext?.isPointInPath(this.brushPath, area.scaled.x, area.scaled.y)\r\n ) {\r\n return true\r\n } else if (points.length > 1) {\r\n for (let i = 0; i < points.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: this.fx(points[i][0]),\r\n y1: this.fy(points[i][1]),\r\n x2: this.fx(points[i + 1][0]),\r\n y2: this.fy(points[i + 1][1]),\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart()?.quote()\r\n if (quote) {\r\n const positionPointsTimestamps = this.attrs.points.map(([x, y]) => [quote.getTimestampFomPositionX(x), y])\r\n this.set({ positionPointsTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionPointsTimestamps } = this.attrs\r\n if (!quote || !positionPointsTimestamps) {\r\n // positionPointsTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const points = positionPointsTimestamps.map(([x, y]) => [quote.getPositionXFromTimestamp(x), y])\r\n this.set({ points } as Partial)\r\n }\r\n\r\n roundToFixed = (value: number, places: number) => Number.parseFloat(math.round({ value, overridePlaces: places }))\r\n\r\n roundY = (y: number, domainDiff: number) => {\r\n if (domainDiff < 1) {\r\n const numberOfLeadingZeros = Math.abs(Math.floor(Math.log10(Math.abs(domainDiff)) + 1))\r\n if (numberOfLeadingZeros > 0) {\r\n return this.roundToFixed(y, numberOfLeadingZeros + 4)\r\n } else {\r\n return this.roundToFixed(y, numberOfLeadingZeros + 3)\r\n }\r\n } else if (domainDiff < 10) {\r\n return this.roundToFixed(y, 3)\r\n }\r\n return this.roundToFixed(y, 2)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['points']\r\n }\r\n\r\n getEdgeXYValues() {\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n this.attrs.points.forEach(([x, y]) => {\r\n edgeXYValues.minX = Math.min(x, edgeXYValues.minX ?? x)\r\n edgeXYValues.minY = Math.min(y, edgeXYValues.minY ?? y)\r\n edgeXYValues.maxX = Math.max(x, edgeXYValues.maxX ?? x)\r\n edgeXYValues.maxY = Math.max(y, edgeXYValues.maxY ?? y)\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nBrush.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, max: 20, default: {} },\r\n { type: 'checkbox', name: 'isPolyLineClosed', label: 'Close line' },\r\n ],\r\n}\r\n\r\nexport default Brush\r\n","import math from '../../helpers/math'\r\n\r\ninterface ICoordinates {\r\n x: number\r\n y: number\r\n}\r\nexport interface IRectangleSidesCoordinates {\r\n topLeft: ICoordinates\r\n topRight: ICoordinates\r\n rightTop: ICoordinates\r\n rightBottom: ICoordinates\r\n bottomRight: ICoordinates\r\n bottomLeft: ICoordinates\r\n leftBottom: ICoordinates\r\n leftTop: ICoordinates\r\n}\r\n\r\nexport interface ITailCoordinates {\r\n tailRoot: ICoordinates\r\n tailTip: ICoordinates\r\n}\r\n\r\nexport enum TailDirection {\r\n noTail,\r\n topLeftCorner,\r\n topRightCorner,\r\n bottomLeftCorner,\r\n bottomRightCorner,\r\n topSide,\r\n rightSide,\r\n bottomSide,\r\n leftSide,\r\n}\r\n\r\nexport const getRectangleSidesCoordinates = ({\r\n padding,\r\n radius,\r\n x2,\r\n y2,\r\n textWidth,\r\n measuredHeight,\r\n}: {\r\n padding: number\r\n radius: number\r\n x2: number\r\n y2: number\r\n textWidth: number\r\n measuredHeight: number\r\n}): IRectangleSidesCoordinates => ({\r\n topLeft: {\r\n x: x2 - padding + radius,\r\n y: y2 - padding,\r\n },\r\n topRight: {\r\n x: x2 + textWidth + padding - radius,\r\n y: y2 - padding,\r\n },\r\n rightTop: {\r\n x: x2 + textWidth + padding,\r\n y: y2 - padding + radius,\r\n },\r\n rightBottom: {\r\n x: x2 + textWidth + padding,\r\n y: y2 + padding + measuredHeight - radius,\r\n },\r\n bottomRight: {\r\n x: x2 + textWidth + padding - radius,\r\n y: y2 + padding + measuredHeight,\r\n },\r\n bottomLeft: {\r\n x: x2 - padding + radius,\r\n y: y2 + padding + measuredHeight,\r\n },\r\n leftBottom: {\r\n x: x2 - padding,\r\n y: y2 + padding + measuredHeight - radius,\r\n },\r\n leftTop: {\r\n x: x2 - padding,\r\n y: y2 - padding + radius,\r\n },\r\n})\r\n\r\nexport const getTailCoordinates = ({\r\n rectangleSides,\r\n x1,\r\n y1,\r\n}: {\r\n rectangleSides: IRectangleSidesCoordinates\r\n x1: number\r\n y1: number\r\n}): ITailCoordinates => ({\r\n tailRoot: {\r\n x: rectangleSides.topLeft.x + (rectangleSides.topRight.x - rectangleSides.topLeft.x) / 2,\r\n y: rectangleSides.leftTop.y + (rectangleSides.leftBottom.y - rectangleSides.leftTop.y) / 2,\r\n },\r\n tailTip: {\r\n x: x1,\r\n y: y1,\r\n },\r\n})\r\n\r\nconst getTailHalfWidth = (halfWidth: number, p1: ICoordinates, p2: ICoordinates): number => {\r\n const dist = math.distance(p1, p2)\r\n if (dist < halfWidth * 2) {\r\n return dist / 2\r\n } else {\r\n return halfWidth\r\n }\r\n}\r\n\r\nexport const getTailToSideIntersection = ({\r\n tail,\r\n rectangleSides,\r\n}: {\r\n tail: ITailCoordinates\r\n rectangleSides: IRectangleSidesCoordinates\r\n}): TailDirection => {\r\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\r\n const { tailTip, tailRoot } = tail\r\n if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, leftTop)) {\r\n return TailDirection.topLeftCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topRight, rightTop)) {\r\n return TailDirection.topRightCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, leftBottom)) {\r\n return TailDirection.bottomLeftCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomRight, rightBottom)) {\r\n return TailDirection.bottomRightCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)) {\r\n return TailDirection.topSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)) {\r\n return TailDirection.rightSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, bottomRight)) {\r\n return TailDirection.bottomSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)) {\r\n return TailDirection.leftSide\r\n } else {\r\n return TailDirection.noTail\r\n }\r\n}\r\n\r\ninterface IRenderCallout {\r\n context: any\r\n radius: number\r\n requiredTailHalfWidth: number\r\n tail: ITailCoordinates\r\n rectangleSides: IRectangleSidesCoordinates\r\n tailDirection: TailDirection\r\n}\r\n\r\nexport const renderCallout = ({\r\n context,\r\n radius,\r\n requiredTailHalfWidth,\r\n tail,\r\n rectangleSides,\r\n tailDirection,\r\n}: IRenderCallout): void => {\r\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\r\n const { tailTip, tailRoot } = tail\r\n\r\n // draw rounded rectangle from top left corner clockwise\r\n // !!! ORDER OF RENDER MATTERS !!!\r\n\r\n // renderTopLeftCorner\r\n if (tailDirection === TailDirection.topLeftCorner) {\r\n context.moveTo(leftTop.x, leftTop.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topLeft.x, topLeft.y)\r\n } else {\r\n context.moveTo(leftTop.x, leftTop.y)\r\n context.arcTo(leftTop.x, topLeft.y, topLeft.x, topLeft.y, radius)\r\n }\r\n\r\n // renderTopLine\r\n if (tailDirection === TailDirection.topSide) {\r\n const tailLineToTopLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)\r\n if (!tailLineToTopLineIntersection) {\r\n context.lineTo(topRight.x, topRight.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, topLeft, topRight)\r\n if (tailLineToTopLineIntersection.x - tailHalfWidth < topLeft.x) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topLeft.x + tailHalfWidth * 2, tailLineToTopLineIntersection.y)\r\n } else if (tailLineToTopLineIntersection.x + tailHalfWidth > topRight.x) {\r\n context.lineTo(topRight.x - tailHalfWidth * 2, tailLineToTopLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topRight.x, tailLineToTopLineIntersection.y)\r\n } else {\r\n context.lineTo(tailLineToTopLineIntersection.x - tailHalfWidth, tailLineToTopLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToTopLineIntersection.x + tailHalfWidth, tailLineToTopLineIntersection.y)\r\n context.lineTo(topRight.x, topRight.y)\r\n }\r\n } else {\r\n context.lineTo(topRight.x, topRight.y)\r\n }\r\n\r\n // renderTopRightCorner\r\n if (tailDirection === TailDirection.topRightCorner) {\r\n context.lineTo(topRight.x, topRight.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightTop.x, rightTop.y)\r\n } else {\r\n context.arcTo(rightTop.x, topRight.y, rightTop.x, rightTop.y, radius)\r\n }\r\n\r\n // renderRightLine\r\n if (tailDirection === TailDirection.rightSide) {\r\n const tailLineToRightLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)\r\n if (!tailLineToRightLineIntersection) {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, rightTop, rightBottom)\r\n if (tailLineToRightLineIntersection.y - tailHalfWidth < rightTop.y) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightTop.x, rightTop.y + tailHalfWidth * 2)\r\n } else if (tailLineToRightLineIntersection.y + tailHalfWidth > rightBottom.y) {\r\n context.lineTo(rightBottom.x, rightBottom.y - tailHalfWidth * 2)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n } else {\r\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y - tailHalfWidth)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y + tailHalfWidth)\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n }\r\n } else {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n }\r\n\r\n // renderBottomRightCorner\r\n if (tailDirection === TailDirection.bottomRightCorner) {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomRight.x, bottomRight.y)\r\n } else {\r\n context.arcTo(rightBottom.x, bottomRight.y, bottomRight.x, bottomRight.y, radius)\r\n }\r\n\r\n // renderBottomLine\r\n if (tailDirection === TailDirection.bottomSide) {\r\n const tailLineToBottomLineIntersection = math.twoSegmentLinesIntersection(\r\n tailTip,\r\n tailRoot,\r\n bottomLeft,\r\n bottomRight\r\n )\r\n if (!tailLineToBottomLineIntersection) {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, bottomLeft, bottomRight)\r\n if (tailLineToBottomLineIntersection.x + tailHalfWidth > bottomRight.x) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomRight.x - tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\r\n } else if (tailLineToBottomLineIntersection.x - tailHalfWidth < bottomLeft.x) {\r\n context.lineTo(bottomLeft.x + tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomLeft.x, tailLineToBottomLineIntersection.y)\r\n } else {\r\n context.lineTo(tailLineToBottomLineIntersection.x + tailHalfWidth, tailLineToBottomLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToBottomLineIntersection.x - tailHalfWidth, tailLineToBottomLineIntersection.y)\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n }\r\n } else {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n }\r\n\r\n // renderBottomLeftCorner\r\n if (tailDirection === TailDirection.bottomLeftCorner) {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftBottom.x, leftBottom.y)\r\n } else {\r\n context.arcTo(leftBottom.x, bottomLeft.y, leftBottom.x, leftBottom.y, radius)\r\n }\r\n\r\n // renderLeftLine\r\n if (tailDirection === TailDirection.leftSide) {\r\n const tailLineToLeftLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)\r\n if (!tailLineToLeftLineIntersection) {\r\n context.lineTo(leftTop.x, leftTop.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, leftTop, leftBottom)\r\n if (tailLineToLeftLineIntersection.y + tailHalfWidth > leftBottom.y) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftBottom.x, leftBottom.y - tailHalfWidth * 2)\r\n } else if (tailLineToLeftLineIntersection.y - tailHalfWidth < leftTop.y) {\r\n context.lineTo(leftTop.x, leftTop.y + tailHalfWidth * 2)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftTop.x, leftTop.y)\r\n } else {\r\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y + tailHalfWidth)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y - tailHalfWidth)\r\n context.lineTo(leftTop.x, leftTop.y)\r\n }\r\n } else {\r\n context.lineTo(leftTop.x, leftTop.y)\r\n }\r\n}\r\n","import merge from 'lodash.merge'\r\n\r\nimport { PaneArea, RequireByKey, ResizeByThumbWithTypeAndDifs, TextAttrs } from '../../../types/shared'\r\nimport { PADDING } from '../../constants/common'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport Chart from '../../models/chart'\r\nimport PaneModel from '../../models/pane'\r\nimport Text from '../text'\r\nimport Thumb from '../thumb'\r\nimport {\r\n getRectangleSidesCoordinates,\r\n getTailCoordinates,\r\n getTailToSideIntersection,\r\n renderCallout,\r\n} from './callout_utils'\r\n\r\nexport interface ICalloutAttrs {\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n}\r\n\r\ninterface FontFamilyHeightCoefficient {\r\n Arial: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n Verdana: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n}\r\n\r\ntype CalloutTextAttrs = ICalloutAttrs & RequireByKey\r\n\r\nclass Callout extends Text {\r\n static type = CanvasElementType.calloutV1\r\n\r\n name = 'Callout'\r\n\r\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\r\n declare isActualBoundingBoxAvailable: boolean\r\n declare lastAttrs: Attrs\r\n declare scaled: Pick\r\n declare measuredHeight: number\r\n declare font: string\r\n declare context?: CanvasRenderingContext2D\r\n declare lines: {\r\n text: string\r\n metrics: TextMetrics\r\n }[]\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'tail',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n getModalConfigBase() {\r\n return {\r\n inputs: [\r\n { type: 'multiline_string', name: 'text', required: true },\r\n { type: 'font', name: 'font' },\r\n {\r\n type: 'background',\r\n name: 'fillStyle',\r\n label: 'Color',\r\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n {\r\n type: 'background',\r\n name: 'background',\r\n label: 'Background',\r\n default: 'rgba(0,0,0,0)',\r\n },\r\n {\r\n type: 'border',\r\n name: 'border',\r\n min: 0,\r\n },\r\n ],\r\n }\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n text: '',\r\n font: {\r\n size: 15,\r\n family: 'Arial',\r\n style: 'normal',\r\n weight: 'normal',\r\n },\r\n fillStyle: ElementSettings.Colors.textWithoutBackground,\r\n lineHeight: 15,\r\n // left | right | center | start | end\r\n textAlign: 'left',\r\n // top | middle | alphabetic | bottom\r\n textBaseline: 'alphabetic',\r\n padding: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n background: ElementSettings.defaultFill,\r\n border: { color: ElementSettings.Colors.line, width: 1 },\r\n } as Partial\r\n }\r\n\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle)\r\n context.set('textAlign', this.attrs.textAlign)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n this.setupTextMetricsCache()\r\n }\r\n\r\n setupTextMetricsCache() {\r\n const ctx = this.context\r\n\r\n if (\r\n (this.attrs.text !== this.lastAttrs?.text ||\r\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)) &&\r\n ctx\r\n ) {\r\n this.lastAttrs = merge({}, this.attrs)\r\n this.lines = this.getLines().map((line) => ({\r\n text: line,\r\n metrics: ctx.measureText(line),\r\n }))\r\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\r\n const lineHeight =\r\n current.metrics.actualBoundingBoxAscent +\r\n current.metrics.actualBoundingBoxDescent +\r\n (currentIndex !== this.lines.length - 1 ? PADDING.S : 0)\r\n return acc + lineHeight\r\n }, 0)\r\n }\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n this.render(context)\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n renderText() {\r\n if (!this.context) return\r\n let y = this.scaled.y2 + this.attrs.padding.top\r\n let previousDescent = 0\r\n for (let i = 0; i < this.lines.length; i++) {\r\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.S\r\n this.context.fillText(this.lines[i].text, this.scaled.x2 + this.attrs.padding.left, y)\r\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\r\n }\r\n }\r\n\r\n getCalloutProperties() {\r\n const textWidth = this.attrs.text === '' ? this.attrs.font.size * 2 : this.width\r\n const requiredTailHalfWidth = this.attrs.font.size * 0.5\r\n const padding = this.attrs.border.width / 2 + this.attrs.font.size * 0.5\r\n const radius = textWidth < requiredTailHalfWidth ? textWidth / 2 : requiredTailHalfWidth\r\n\r\n const measuredHeight = this.measuredHeight < requiredTailHalfWidth ? radius * 2 : this.measuredHeight\r\n const y2 = this.scaled.y2 - (this.lines?.[0]?.metrics.actualBoundingBoxAscent || measuredHeight)\r\n\r\n // Points diagram\r\n //.......X-----------------X.......\r\n //.................................\r\n //...X.........................X...\r\n //...|.........................|...\r\n //...|.........................|...\r\n //...X.........................X...\r\n //.................................\r\n //.......X-----------------X.......\r\n\r\n const rectangleSides = getRectangleSidesCoordinates({\r\n padding,\r\n radius,\r\n x2: this.scaled.x2,\r\n y2,\r\n textWidth,\r\n measuredHeight,\r\n })\r\n const tail = getTailCoordinates({ rectangleSides, x1: this.scaled.x1, y1: this.scaled.y1 })\r\n const tailDirection = getTailToSideIntersection({ tail, rectangleSides })\r\n\r\n return {\r\n radius,\r\n requiredTailHalfWidth,\r\n rectangleSides,\r\n tail,\r\n tailDirection,\r\n }\r\n }\r\n\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n\r\n const { radius, requiredTailHalfWidth, tail, tailDirection, rectangleSides } = this.getCalloutProperties()\r\n\r\n this.context.beginPath()\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.lineJoin = 'round'\r\n renderCallout({\r\n context: this.context,\r\n radius,\r\n requiredTailHalfWidth,\r\n tail,\r\n rectangleSides,\r\n tailDirection,\r\n })\r\n this.context.closePath()\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle)\r\n this.renderBorder()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n // is in rectangle\r\n const { tail, rectangleSides, requiredTailHalfWidth } = this.getCalloutProperties()\r\n if (\r\n this.lines &&\r\n rectangleSides &&\r\n rectangleSides.leftTop.x < area.scaled.x &&\r\n rectangleSides.topLeft.y < area.scaled.y &&\r\n rectangleSides.rightBottom.x > area.scaled.x &&\r\n rectangleSides.bottomRight.y > area.scaled.y\r\n ) {\r\n return true\r\n }\r\n // is in tail\r\n if (tail) {\r\n const tailP1 = math.perpendicularPointToLine({\r\n distance: requiredTailHalfWidth,\r\n line: { x1: tail.tailTip.x, y1: tail.tailTip.y, x2: tail.tailRoot.x, y2: tail.tailRoot.y },\r\n })\r\n const pointOffsetX = tailP1.x - tail.tailRoot.x\r\n const pointOffsetY = tailP1.y - tail.tailRoot.y\r\n const tailP2 = { x: tail.tailRoot.x + -1 * pointOffsetX, y: tail.tailRoot.y + -1 * pointOffsetY }\r\n const polygon = [tail.tailTip, tailP1, tailP2]\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tail') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n }\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator() || !this.lines) {\r\n return true\r\n }\r\n\r\n const { tail, rectangleSides } = this.getCalloutProperties()\r\n\r\n return [...Object.values(rectangleSides), tail.tailRoot, tail.tailTip].some(\r\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\r\n )\r\n }\r\n}\r\n\r\nexport default Callout\r\n","import { Bezier } from 'bezier-js'\r\n\r\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ICurveAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n cp1x: number\r\n cp2x: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n cp1y: number\r\n cp2y: number\r\n border: DrawingBorder\r\n}\r\n\r\nclass Curve extends Element {\r\n static type = CanvasElementType.curve\r\n\r\n name = 'Curve'\r\n declare scaled: Pick\r\n declare curve: Bezier\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.render = this.render.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x3 || this.attrs.x2,\r\n () => this.attrs.y3 || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n drawQuadraticCurve(context: CanvasRenderingContext2D, curve: Bezier) {\r\n const { points } = curve\r\n context.beginPath()\r\n context.moveTo(points[0].x, points[0].y)\r\n context.quadraticCurveTo(points[1].x, points[1].y, points[2].x, points[2].y)\r\n context.stroke()\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if (!x3 || !y3) {\r\n context.beginPath()\r\n context.moveTo(x1, y1)\r\n context.lineTo(x2, y2)\r\n context.lineTo(x3, y3)\r\n context.stroke()\r\n } else {\r\n this.curve = Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5)\r\n this.drawQuadraticCurve(context, this.curve)\r\n }\r\n\r\n context.translate(-0.5, -0.5)\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.x3 += x\r\n this.attrs.cp1x += x\r\n this.attrs.cp2x += x\r\n\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n this.attrs.y3 += y\r\n this.attrs.cp1y += y\r\n this.attrs.cp2y += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'a':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'b':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'c':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (this.curve && this.curve.project(area.scaled).d! <= 10) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n if (!x3 || !y3) {\r\n return true\r\n }\r\n const isInView =\r\n Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5).points.some(\r\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\r\n ) ?? true\r\n\r\n return isInView\r\n }\r\n}\r\n\r\nCurve.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default Curve\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IEllipseAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n cp1x: number\r\n cp2x: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n cp1y: number\r\n cp2y: number\r\n width: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\ninterface ICoordinates {\r\n topCenterX: number\r\n topCenterY: number\r\n topRightX: number\r\n topRightY: number\r\n topLeftX: number\r\n topLeftY: number\r\n centerLeftX: number\r\n centerLeftY: number\r\n centerRightX: number\r\n centerRightY: number\r\n bottomCenterX: number\r\n bottomCenterY: number\r\n bottomLeftX: number\r\n bottomLeftY: number\r\n bottomRightX: number\r\n bottomRightY: number\r\n}\r\n\r\n// OLD Ellipse \"v0\" kept for backward-compatibiluty for old saved ideas\r\n// current Ellipse tool located in ellipse folder\r\nclass Ellipse extends Element {\r\n static type = CanvasElementType.ellipse\r\n\r\n name = 'Ellipse'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'x1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'x2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'lw',\r\n () => this.model.scale.x.invert(this.getCoordinates().centerLeftX),\r\n () => this.model.scale.y.invert(this.getCoordinates().centerLeftY),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rw',\r\n () => this.model.scale.x.invert(this.getCoordinates().centerRightX),\r\n () => this.model.scale.y.invert(this.getCoordinates().centerRightY),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n const boundingPointKeys = this.getBoundingPointKeys()\r\n this.scale({ x: [...boundingPointKeys.x, 'width'], y: boundingPointKeys.y })\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const c = this.getCoordinates()\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.beginPath()\r\n context.moveTo(c.bottomCenterX, c.bottomCenterY)\r\n context.bezierCurveTo(c.bottomRightX, c.bottomRightY, c.topRightX, c.topRightY, c.topCenterX, c.topCenterY)\r\n context.bezierCurveTo(c.topLeftX, c.topLeftY, c.bottomLeftX, c.bottomLeftY, c.bottomCenterX, c.bottomCenterY)\r\n context.closePath()\r\n context.fill()\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'x1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'x2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'lw':\r\n this.attrs.width += difX\r\n break\r\n case 'rw':\r\n this.attrs.width -= difX\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n getCoordinates(): ICoordinates {\r\n // TODO cache?\r\n // http://stackoverflow.com/questions/14169234/the-relation-of-the-bezier-curve-and-ellipse\r\n const rotationAngle =\r\n Math.PI + Math.atan(-1 / ((this.scaled.y2 - this.scaled.y1) / (this.scaled.x2 - this.scaled.x1)))\r\n\r\n const sign = this.scaled.y1 > this.scaled.y2 ? 1 : -1\r\n const radiusX = this.scaled.width / 2\r\n let radiusY = (sign * Math.abs(this.scaled.y1 - this.scaled.y2)) / Math.cos(rotationAngle) / 2\r\n if (this.scaled.y1 === this.scaled.y2) {\r\n radiusY = Math.abs(this.scaled.x1 - this.scaled.x2) / 2\r\n }\r\n\r\n const width_two_thirds = (radiusX * 4) / 3\r\n\r\n const dx1 = Math.sin(rotationAngle) * radiusY\r\n const dy1 = Math.cos(rotationAngle) * radiusY\r\n const dx2 = Math.cos(rotationAngle) * width_two_thirds\r\n const dy2 = Math.sin(rotationAngle) * width_two_thirds\r\n\r\n const x = this.scaled.x1 + dx1\r\n const y = this.scaled.y1 - dy1\r\n\r\n const topCenterX = x - dx1\r\n const topCenterY = y + dy1\r\n const topRightX = topCenterX + dx2\r\n const topRightY = topCenterY + dy2\r\n const topLeftX = topCenterX - dx2\r\n const topLeftY = topCenterY - dy2\r\n\r\n const bottomCenterX = x + dx1\r\n const bottomCenterY = y - dy1\r\n const bottomRightX = bottomCenterX + dx2\r\n const bottomRightY = bottomCenterY + dy2\r\n const bottomLeftX = bottomCenterX - dx2\r\n const bottomLeftY = bottomCenterY - dy2\r\n\r\n const centerRightX = x + dx2\r\n const centerRightY = y + dy2\r\n const centerLeftX = x - dx2\r\n const centerLeftY = y - dy2\r\n\r\n return {\r\n topCenterX,\r\n topCenterY,\r\n topRightX,\r\n topRightY,\r\n topLeftX,\r\n topLeftY,\r\n centerLeftX,\r\n centerLeftY,\r\n centerRightX,\r\n centerRightY,\r\n bottomCenterX,\r\n bottomCenterY,\r\n bottomLeftX,\r\n bottomLeftY,\r\n bottomRightX,\r\n bottomRightY,\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const c = this.getCoordinates()\r\n const left = Math.min(this.scaled.x1, this.scaled.x2, c.centerRightX)\r\n const right = Math.max(this.scaled.x1, this.scaled.x2, c.centerLeftX)\r\n const top = Math.min(this.scaled.y1, this.scaled.y2, c.centerRightY)\r\n const bottom = Math.max(this.scaled.y1, this.scaled.y2, c.centerLeftY)\r\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nEllipse.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Ellipse\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\ntype RotatedRectangleCoordiantes = [[number, number], [number, number], [number, number], [number, number]]\r\n\r\nexport interface IRotatedRectangleAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n height: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\n// OLD RotatedRectangle \"v0\" kept for backward-compatibiluty for old saved ideas\r\n// current RotatedRectangle tool located in rotated_rectangle folder\r\nclass RotatedRectangle extends Element {\r\n static type = CanvasElementType.rotatedRectangle\r\n\r\n name = 'Rotated rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n const x = this.model.scale.x.invert\r\n const y = this.model.scale.y.invert\r\n this._thumbs = [\r\n new Thumb(\r\n 'ml',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'mr',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tl',\r\n () => x(this.getRectCoordinates()[0][0]),\r\n () => y(this.getRectCoordinates()[0][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tr',\r\n () => x(this.getRectCoordinates()[1][0]),\r\n () => y(this.getRectCoordinates()[1][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bl',\r\n () => x(this.getRectCoordinates()[2][0]),\r\n () => y(this.getRectCoordinates()[2][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'br',\r\n () => x(this.getRectCoordinates()[3][0]),\r\n () => y(this.getRectCoordinates()[3][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n const boundingPointKeys = this.getBoundingPointKeys()\r\n this.scale({ x: [...boundingPointKeys.x, 'height'], y: boundingPointKeys.y })\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.beginPath()\r\n const coords = this.getRectCoordinates()\r\n for (const point of coords) {\r\n context.lineTo(point[0], point[1])\r\n }\r\n context.lineTo(coords[0][0], coords[0][1])\r\n context.fill()\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRectCoordinates(): RotatedRectangleCoordiantes {\r\n const mx1 = this.scaled.x1\r\n const mx2 = this.scaled.x2\r\n const my1 = this.scaled.y1\r\n const my2 = this.scaled.y2\r\n const { height } = this.scaled\r\n\r\n const k = (my2 - my1) / (mx2 - mx1)\r\n const nk = -1 / k\r\n\r\n const sign = my1 > my2 ? 1 : -1\r\n const dx = (sign * Math.sqrt((height * height) / (1 + nk * nk))) / 2\r\n const dy = nk * dx\r\n\r\n let x1 = mx1 - dx\r\n let y1 = my1 - dy\r\n let x2 = mx2 - dx\r\n let y2 = my2 - dy\r\n\r\n let x3 = mx2 + dx\r\n let y3 = my2 + dy\r\n let x4 = mx1 + dx\r\n let y4 = my1 + dy\r\n\r\n if (my1 === my2) {\r\n x1 = mx1\r\n y1 = my1 - height / 2\r\n x2 = mx2\r\n y2 = my2 - height / 2\r\n\r\n x3 = mx2\r\n y3 = my2 + height / 2\r\n x4 = mx1\r\n y4 = my1 + height / 2\r\n }\r\n\r\n return [\r\n [x1, y1],\r\n [x2, y2],\r\n [x3, y3],\r\n [x4, y4],\r\n ]\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'ml':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'mr':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'tl':\r\n case 'tr':\r\n this.attrs.height += difY\r\n break\r\n case 'bl':\r\n case 'br':\r\n this.attrs.height -= difY\r\n break\r\n default:\r\n return\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const coords = this.getRectCoordinates()\r\n const polygon = coords.map((c) => ({ x: c[0], y: c[1] }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nRotatedRectangle.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default RotatedRectangle\r\n","// TODO FontAwesome font or similar needs to be loaded before using Symbol\r\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ISymbolAttrs {\r\n x1: number\r\n scaleX: number\r\n y1: number\r\n scaleY: number\r\n angle: number\r\n fill: string\r\n symbol: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass SymbolElement extends Element {\r\n static type = CanvasElementType.symbol\r\n\r\n name = 'Symbol'\r\n\r\n declare textWidth: number\r\n declare textHeight: number\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n const sx = (sign: number) =>\r\n this.getRotatedCoordinates(this.scaled.x1 + sign * (this.textWidth / 2) * this.attrs.scaleX, this.scaled.y1)\r\n const sy = (sign: number) =>\r\n this.getRotatedCoordinates(this.scaled.x1, this.scaled.y1 + sign * (this.textHeight / 2) * this.attrs.scaleY)\r\n this._thumbs = [\r\n new Thumb(\r\n 'xr',\r\n () => this.model.scale.x.invert(sx(+1).x),\r\n () => this.model.scale.y.invert(sx(+1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'xl',\r\n () => this.model.scale.x.invert(sx(-1).x),\r\n () => this.model.scale.y.invert(sx(-1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'yt',\r\n () => this.model.scale.x.invert(sy(+1).x),\r\n () => this.model.scale.y.invert(sy(+1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'yb',\r\n () => this.model.scale.x.invert(sy(-1).x),\r\n () => this.model.scale.y.invert(sy(-1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.attrs.angle = this.attrs.angle || 0\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1'], y: ['y1'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('font', '36px FontAwesome')\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('textAlign', 'left')\r\n context.set('textBaseline', 'top')\r\n\r\n this.textWidth = context.measureText(this.attrs.symbol).width\r\n this.textHeight = 36\r\n const xScale = this.attrs.scaleX\r\n const yScale = this.attrs.scaleY\r\n\r\n const xOffset = this.textWidth / -2\r\n const yOffset = this.textHeight / -2\r\n\r\n context.save()\r\n context.translate(this.scaled.x1, this.scaled.y1)\r\n context.rotate(this.attrs.angle)\r\n context.scale(xScale, yScale)\r\n context.fillText(this.attrs.symbol, xOffset, yOffset)\r\n context.restore()\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRotatedCoordinates(x: number, y: number) {\r\n const cx = this.scaled.x1\r\n const cy = this.scaled.y1\r\n const dx = x - cx\r\n const dy = y - cy\r\n const rx = dx * Math.cos(this.attrs.angle) - dy * Math.sin(this.attrs.angle)\r\n const ry = dy * Math.cos(this.attrs.angle) + dx * Math.sin(this.attrs.angle)\r\n return { x: cx + rx, y: cy + ry }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n return (this.attrs.y1 += y)\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'xl':\r\n this.attrs.scaleX -= difX\r\n break\r\n case 'xr':\r\n this.attrs.scaleX += difX\r\n break\r\n case 'yt':\r\n this.attrs.scaleY -= difY\r\n break\r\n case 'yb':\r\n this.attrs.scaleY += difY\r\n break\r\n case 'c':\r\n this.attrs.angle += difX / 5\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const halfWidth = (this.textWidth / 2) * this.attrs.scaleX\r\n const halfHeight = (this.textHeight / 2) * this.attrs.scaleY\r\n const left = Math.min(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\r\n const right = Math.max(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\r\n const top = Math.min(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\r\n const bottom = Math.max(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\r\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nSymbolElement.prototype.defaults = { fill: 'rgba(0,0,0,1)' }\r\n\r\nSymbolElement.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill', label: 'Fill' }],\r\n}\r\n\r\nexport default SymbolElement\r\n","import { CanvasElementType } from '../constants/common'\r\nimport arrow from './arrow'\r\nimport brush_v1 from './brush/brush_v1'\r\nimport callout_v1 from './callout/callout_v1'\r\nimport curve from './curve'\r\nimport element from './element'\r\nimport elliottWaves from './elliott_waves/elliott_waves'\r\nimport ellipse from './ellipse'\r\nimport ellipse_v1 from './ellipse/ellipse_v1'\r\nimport fibonacci from './fibonacci_retracements'\r\nimport horizontalLine from './horizontal_line'\r\nimport line from './line'\r\nimport measure from './measure'\r\nimport pitchfork_v1 from './pitchfork/pitchfork_v1'\r\nimport polygon from './polygon'\r\nimport position from './position'\r\nimport rectangle from './rectangle'\r\nimport rotatedRectangle from './rotated_rectangle'\r\nimport rotatedRectangle_v1 from './rotated_rectangle/rotated_rectangle_v1'\r\nimport scaledLine from './scaled_line'\r\nimport scaledText from './scaled_text'\r\nimport symbolElement from './symbol'\r\nimport text from './text'\r\nimport triangle from './triangle'\r\nimport verticalLine from './vertical_line'\r\nimport xabcd from './xabcd'\r\n\r\nexport const drawingToolsByType = Object.freeze({\r\n [CanvasElementType.element]: element,\r\n [CanvasElementType.arrow]: arrow,\r\n [CanvasElementType.brushV1]: brush_v1,\r\n [CanvasElementType.calloutV1]: callout_v1,\r\n [CanvasElementType.curve]: curve,\r\n [CanvasElementType.elliottWaves]: elliottWaves,\r\n [CanvasElementType.ellipse]: ellipse,\r\n [CanvasElementType.ellipseV1]: ellipse_v1,\r\n [CanvasElementType.fibonacciRetracements]: fibonacci,\r\n [CanvasElementType.horizontalLine]: horizontalLine,\r\n [CanvasElementType.line]: line,\r\n [CanvasElementType.measure]: measure,\r\n [CanvasElementType.pitchforkV1]: pitchfork_v1,\r\n [CanvasElementType.polygon]: polygon,\r\n [CanvasElementType.position]: position,\r\n [CanvasElementType.rectangle]: rectangle,\r\n [CanvasElementType.rotatedRectangle]: rotatedRectangle,\r\n [CanvasElementType.rotatedRectangleV1]: rotatedRectangle_v1,\r\n [CanvasElementType.scaledLine]: scaledLine,\r\n [CanvasElementType.scaledText]: scaledText,\r\n [CanvasElementType.symbol]: symbolElement,\r\n [CanvasElementType.text]: text,\r\n [CanvasElementType.triangle]: triangle,\r\n [CanvasElementType.verticalLine]: verticalLine,\r\n [CanvasElementType.xabcd]: xabcd,\r\n})\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\nimport mergewith from 'lodash.mergewith'\r\nimport omit from 'lodash.omit'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n ObjectHash,\r\n PaneArea,\r\n RequireByKey,\r\n TodoObjectHashAnyType,\r\n} from '../../types/shared'\r\nimport Thumb from '../canvas/thumb'\r\nimport {\r\n CanvasElementType,\r\n ChartElementType,\r\n ChartEventType,\r\n IVisibility,\r\n IndicatorType,\r\n MacroTimeframe,\r\n MicroMacroTimeframe,\r\n OverlayType,\r\n SetVisibilityTo,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport { isInRange } from '../utils/helpers'\r\n\r\nexport type TodoModalConfig = TodoObjectHashAnyType\r\ntype TodoPositionTimestamps = TodoObjectHashAnyType\r\n\r\nexport interface DefaultAttrs extends ObjectHash {\r\n positionTimestamps?: TodoPositionTimestamps\r\n visibility?: IVisibility\r\n}\r\n\r\nexport type EdgeValues = { minX?: number; maxX?: number; minY?: number; maxY?: number }\r\n\r\nclass Element extends Spine.Module {\r\n static type: CanvasElementType | OverlayType | ChartElementType | IndicatorType | ChartEventType =\r\n CanvasElementType.element\r\n\r\n static fromObject(obj: T['attrs'], model: T['model']) {\r\n return new this(obj, model) as T\r\n }\r\n\r\n static getNumOfBarsBuffer(\r\n _?: RequireByKey | RequireByKey\r\n ) {\r\n return 0\r\n }\r\n\r\n isCreator = false\r\n isCreatorDialogOpen = false\r\n attrs: Attrs = {} as Attrs\r\n\r\n model: any\r\n _thumbs: Thumb[]\r\n\r\n getDefaults?(): Partial\r\n renderCross?(ctx: RenderingContext2DType): void\r\n renderCrossText?(\r\n ctx: RenderingContext2DType,\r\n crossIndex: number,\r\n getDataByCrossIndex?: (key: keyof Quote, shouldReturnRoundedString?: boolean) => string | undefined\r\n ): void\r\n\r\n renderContent?(ctx: RenderingContext2DType): void\r\n renderGrid?(ctx: RenderingContext2DType): void\r\n renderLabels?(ctx: RenderingContext2DType): void\r\n declare defaults?: Partial\r\n getModalConfigBase?(): TodoModalConfig\r\n declare modalConfig?: TodoModalConfig\r\n getMinMax?(): { min: number; max: number }\r\n setupAxis?(fx: ScaleAxis): void | { min: number; max: number }\r\n\r\n activeThumb: Thumb | null = null\r\n isMouseDown = false\r\n isSelected = false\r\n isHovered = false\r\n isEditInProgress = false\r\n edgeXYValues: EdgeValues | null = null\r\n declare scaled?: ObjectHash | Partial\r\n\r\n declare toolsCallback: () => void\r\n\r\n constructor(values: Partial, model: Model) {\r\n super(values, model)\r\n this.model = model\r\n if (this.getDefaults) {\r\n this.set(this.getDefaults() || {})\r\n } else {\r\n this.set(this.defaults || {})\r\n }\r\n this.set(values)\r\n this._thumbs = []\r\n\r\n this.onMouseDown = this.onMouseDown.bind(this)\r\n this.onMouseMove = this.onMouseMove.bind(this)\r\n this.onMouseUp = this.onMouseUp.bind(this)\r\n this.bind('mousedown', this.onMouseDown)\r\n this.bind('mousemove', this.onMouseMove)\r\n this.bind('mouseup', this.onMouseUp)\r\n this.bind('change', () => {\r\n // elements is optional because this.model is not Pane in all usecases, e.g. base_chart extends this element and sets Chart as model\r\n const element = this.getIsChartEvent()\r\n ? this.model.chartEvents?.()?.findByAttribute('instance', this)\r\n : this.model.elements?.()?.findByAttribute('instance', this)\r\n\r\n element?.trigger('change', element)\r\n })\r\n }\r\n\r\n get type() {\r\n return (this.constructor as typeof Element).type\r\n }\r\n\r\n getThumbs() {\r\n return this._thumbs\r\n }\r\n\r\n moveBy(_: number, __: number) {}\r\n\r\n setIsSelected(isSelected: boolean) {\r\n this.isSelected = isSelected\r\n this.trigger('change')\r\n }\r\n\r\n setIsHovered(isHovered: boolean) {\r\n this.isHovered = isHovered\r\n this.trigger('change')\r\n }\r\n\r\n getShouldRenderThumbs() {\r\n return this.isSelected || this.isHovered\r\n }\r\n\r\n getIsPaneSelection(): boolean {\r\n const paneModel = this.model.elements().findByAttribute('instance', this)?.pane() as PaneModel | undefined\r\n return paneModel?.selection === this\r\n }\r\n\r\n set(obj: Partial) {\r\n const attrsSubset = Object.keys(obj).reduce(\r\n (acc, key) => ({ ...acc, [key]: this.attrs[key] }),\r\n {} as Partial\r\n )\r\n if (JSON.stringify(obj) !== JSON.stringify(attrsSubset)) {\r\n const customizer = (objValue: Partial, srcValue: Partial, key: keyof Attrs) => {\r\n if (this.getIsDrawing() && key === 'visibility') {\r\n return srcValue ?? {}\r\n }\r\n }\r\n mergewith(this.attrs, obj, customizer)\r\n if (this.getIsPaneSelection() && !this.getIsCreator()) {\r\n this.cachePointPositionTimestamp()\r\n }\r\n this.trigger('change', this)\r\n }\r\n this.edgeXYValues = null\r\n return this\r\n }\r\n\r\n get(key: T) {\r\n return this.attrs[key]\r\n }\r\n\r\n getBoundingPointKeys = (): { x: string[]; y: string[] } | void => {}\r\n\r\n fx = (x: number) => this.model.scale.x(x)\r\n\r\n fy = (y: number) => this.model.scale.y(y)\r\n\r\n scale({ x, y }: { x: string[]; y: string[] }) {\r\n this.scaled = {}\r\n x.forEach((el) => {\r\n Object.defineProperty(this.scaled, el, {\r\n get: () => this.fx(this.attrs[el]),\r\n })\r\n })\r\n\r\n y.forEach((el) => {\r\n Object.defineProperty(this.scaled, el, {\r\n get: () => this.fy(this.attrs[el]),\r\n })\r\n })\r\n }\r\n\r\n render(_: RenderingContext2DType) {}\r\n\r\n renderThumbs(context: CanvasRenderingContext2D) {\r\n const isHoveredThumbStyle = this.isHovered && !this.isSelected\r\n if (isHoveredThumbStyle) {\r\n context.globalAlpha = 0.5\r\n }\r\n this.getThumbs().map((thumb) => thumb.render(context))\r\n context.globalAlpha = 1\r\n }\r\n\r\n onMouseDown(area: PaneArea) {\r\n this.isMouseDown = true\r\n this.isEditInProgress = true\r\n for (const thumb of this.getThumbs()) {\r\n if (thumb.isInArea(area)) {\r\n this.activeThumb = thumb\r\n this.activeThumb.startEditing(area)\r\n return\r\n }\r\n }\r\n }\r\n\r\n onMouseMove(area: PaneArea) {\r\n if (!area.mouseDown) {\r\n return\r\n }\r\n if (this.activeThumb != null) {\r\n this.activeThumb.moveTo(area)\r\n this.trigger('change')\r\n }\r\n }\r\n\r\n onMouseUp(_?: PaneArea) {\r\n this.isMouseDown = false\r\n this.isEditInProgress = false\r\n this.activeThumb = null\r\n if (!this.getIsCreator() && !this.getIsChartEvent()) {\r\n this.cachePointPositionTimestamp()\r\n }\r\n this.trigger('change', this)\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart().quote()\r\n if (quote) {\r\n const { x: xPointKeys } = this.getBoundingPointKeys()!\r\n const positionTimestamps = xPointKeys.reduce((acc, key) => {\r\n const positionX = this.attrs[key]\r\n const timeStamp = positionX && quote.getTimestampFomPositionX(positionX)\r\n return {\r\n ...acc,\r\n [key]: timeStamp,\r\n }\r\n }, {}) as TodoPositionTimestamps\r\n this.set({ positionTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionTimestamps } = this.attrs\r\n if (!quote || !positionTimestamps) {\r\n // positionTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const pointPoitionsFromTimestamp = Object.entries(positionTimestamps).reduce(\r\n (acc, [key, timestamp]) => ({\r\n ...acc,\r\n [key]: timestamp && quote.getPositionXFromTimestamp(timestamp),\r\n }),\r\n {}\r\n )\r\n this.set(pointPoitionsFromTimestamp)\r\n }\r\n\r\n thumbsAreInArea(area: PaneArea) {\r\n for (const thumb of this.getThumbs()) {\r\n if (thumb.isInArea(area)) {\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n isDrawingElementLockedOrInvisible() {\r\n return this.model.chart().chart_layout().isLockDrawingsActive || !this.getIsVisible()\r\n }\r\n\r\n getModalConfig() {\r\n let config\r\n if (this.getModalConfigBase) {\r\n config = merge({}, this.getModalConfigBase())\r\n } else {\r\n config = merge({}, this.modalConfig)\r\n }\r\n if (this.getIsDrawing()) {\r\n config.inputs.push({ type: 'visibility', name: 'visibility', label: 'Visibility' })\r\n }\r\n if (config.title == null) {\r\n config.title = this.name\r\n }\r\n for (const input of config.inputs) {\r\n if (input.default != null) {\r\n input.value = input.default\r\n }\r\n if (this.attrs[input.name] != null) {\r\n input.value = this.attrs[input.name]\r\n }\r\n }\r\n return config\r\n }\r\n\r\n toObject() {\r\n return merge({}, this.attrs, { type: this.type })\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return this.toObject()\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return this.attrs.positionTimestamps ? Object.keys(this.attrs.positionTimestamps) : []\r\n }\r\n\r\n toAutosaveConfig() {\r\n // We don't want to save attrs which are stored in \"position timestamps\" because they are relative to timeframe for example\r\n // so in order to keep drawings in sync across different timeframes we can't rely on its position but we have to rely on \"position timestamps\" and then call updateScales to calculate correct positions for given timeframe\r\n return omit(this.toConfig(), this.getAutosaveOmittedProperties()) as Partial\r\n }\r\n\r\n replaceMyself(element: Element) {\r\n setTimeout(() => {\r\n element.cachePointPositionTimestamp()\r\n const el = this.model.elements().findByAttribute('instance', this)\r\n if (!el) {\r\n // Temporary code below\r\n // additional info gaining for https://finvizcom.sentry.io/issues/3990343438/events/e87ce8b4108341cf81f15ec78707c65e/?project=33153&query=is%3Aunresolved+Cannot+read+properties+of+undefined&referrer=previous-event&statsPeriod=14d&stream_index=0\r\n window.Sentry?.captureMessage('element.ts replaceMyself', {\r\n extra: {\r\n oldElement: {\r\n type: this?.type,\r\n isCreator: this?.isCreator,\r\n isMouseDown: this?.isMouseDown,\r\n isSelected: this?.isSelected,\r\n isHovered: this?.isHovered,\r\n isEditInProgress: this?.isEditInProgress,\r\n },\r\n newElement: {\r\n type: element?.type,\r\n isCreator: element?.isCreator,\r\n isMouseDown: element?.isMouseDown,\r\n isSelected: element?.isSelected,\r\n isHovered: element?.isHovered,\r\n isEditInProgress: element?.isEditInProgress,\r\n },\r\n },\r\n })\r\n } else {\r\n el.replace(element)\r\n }\r\n })\r\n }\r\n\r\n toString() {\r\n return this.name\r\n }\r\n\r\n getIsCreator() {\r\n return this.isCreator\r\n }\r\n\r\n getIsCreatorDialogOpen() {\r\n return this.isCreatorDialogOpen\r\n }\r\n\r\n release() {\r\n this.cachePointPositionTimestamp()\r\n this.unbind()\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart().chart_layout())\r\n }\r\n\r\n getIsDrawing() {\r\n return !!this.type.startsWith('canvas/')\r\n }\r\n\r\n getIsChartEvent() {\r\n return !!this?.type.startsWith('chartEvent/')\r\n }\r\n\r\n getIsVisible() {\r\n const { micro, macro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\r\n const visibility = this.attrs.visibility?.[macro]\r\n\r\n // this.attrs.visibility.minutes === undefined: drawing visible on any minutes timeframe\r\n if (visibility === undefined) return true\r\n // this.attrs.visibility.minutes === {}: drawing invisible on any minutes timeframe\r\n if (Object.keys(visibility).length === 0) return false\r\n // this.attrs.visibility.minutes === {from: 5, to: 15}: drawing visible on minutes TF between 5 & 15 interval\r\n return isInRange({ value: micro, min: visibility.from, max: visibility.to })\r\n }\r\n\r\n setVisibilityTo(setTo: SetVisibilityTo) {\r\n const { macro, micro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\r\n const currentIndex = Object.keys(MacroTimeframe).indexOf(macro)\r\n\r\n let timeframesToSet: string[] = []\r\n let attrsToSet: { from?: number; to?: number } = {}\r\n\r\n switch (setTo) {\r\n case SetVisibilityTo.currentAndAbove: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index < currentIndex)\r\n attrsToSet = { from: micro }\r\n break\r\n }\r\n case SetVisibilityTo.currentAndBelow: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index > currentIndex)\r\n attrsToSet = { to: micro }\r\n break\r\n }\r\n case SetVisibilityTo.currentOnly: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index !== currentIndex)\r\n attrsToSet = { from: micro, to: micro }\r\n break\r\n }\r\n case SetVisibilityTo.all:\r\n default: {\r\n this.set({ visibility: {} } as Partial)\r\n return\r\n }\r\n }\r\n\r\n this.set({\r\n visibility: Object.assign({}, ...timeframesToSet.map((item) => ({ [item]: {} })), { [macro]: attrsToSet }),\r\n } as Partial)\r\n }\r\n\r\n getEdgeXYValues() {\r\n const { x: xPoints, y: yPoints } = this.getBoundingPointKeys() ?? {}\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n xPoints?.forEach((key) => {\r\n const positionX = this.attrs[key]\r\n if (positionX !== undefined) {\r\n edgeXYValues.minX = Math.min(positionX, edgeXYValues.minX ?? positionX)\r\n edgeXYValues.maxX = Math.max(positionX, edgeXYValues.maxX ?? positionX)\r\n }\r\n })\r\n yPoints?.forEach((key) => {\r\n const positionY = this.attrs[key]\r\n if (positionY !== undefined) {\r\n edgeXYValues.minY = Math.min(positionY, edgeXYValues.minY ?? positionY)\r\n edgeXYValues.maxY = Math.max(positionY, edgeXYValues.maxY ?? positionY)\r\n }\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n\r\n getIsInChartView(chart: Chart, options?: { omitX?: boolean; omitY?: boolean }) {\r\n const { minX, maxX, minY, maxY } = this.getEdgeXYValues()\r\n\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n if (!options?.omitX) {\r\n const isMaxXInvalid = maxX === undefined || isNaN(maxX)\r\n const isMinXInvalid = minX === undefined || isNaN(minX)\r\n if (\r\n !isMaxXInvalid &&\r\n !isMinXInvalid &&\r\n !(this.fx(maxX) >= -chart.leftOffset && this.fx(minX) <= -chart.leftOffset + chart.width)\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if (!options?.omitY) {\r\n if (minY === undefined || maxY === undefined) {\r\n return true\r\n }\r\n\r\n const topBound = this.model.scale.y.invert(0)\r\n const bottomBound = this.model.scale.y.invert(this.model.height)\r\n return topBound >= minY && bottomBound <= maxY\r\n }\r\n\r\n // If all checks fall through, render element\r\n return true\r\n }\r\n}\r\n\r\nexport default Element\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../../constants/common'\r\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport Element from '../element'\r\nimport Text from '../text'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IElliottWavesAttrs {\r\n waves: Array<{ x: number; y: number }>\r\n positionWavesTimestamps?: Array<{ x: number; y: number }>\r\n border: DrawingBorder\r\n}\r\n\r\nclass ElliottWaves extends Element {\r\n static type = CanvasElementType.elliottWaves\r\n\r\n name = 'Elliott Wave'\r\n waves = ['', 'I', 'II', 'III', 'IV', 'V']\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 2,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n context.moveTo(Math.round(this.fx(this.attrs.waves[0].x)), Math.round(this.fy(this.attrs.waves[0].y)))\r\n for (const p of this.attrs.waves.slice(1)) {\r\n context.lineTo(Math.round(this.fx(p.x)), Math.round(this.fy(p.y)))\r\n }\r\n context.stroke()\r\n context.translate(offset * -1, offset * -1)\r\n\r\n const text = new Text(\r\n {\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.center,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n this.model\r\n )\r\n for (let i = 0; i < this.attrs.waves.length; i++) {\r\n let y\r\n const p = this.attrs.waves[i]\r\n if (i > 0 && this.attrs.waves[i - 1].y > p.y) {\r\n y = this.fy(p.y) + 8\r\n } else {\r\n y = this.fy(p.y) - 8\r\n }\r\n text.set({ text: this.waves[i], x: this.fx(p.x), y })\r\n text.render(context)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n return this.attrs.waves.map(\r\n (wave, index) =>\r\n new Thumb(\r\n `${index}`,\r\n () => wave.x,\r\n () => wave.y,\r\n this.resize,\r\n this.model\r\n )\r\n )\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart().quote()\r\n if (quote) {\r\n const positionWavesTimestamps = this.attrs.waves.map((wave) => ({\r\n ...wave,\r\n x: quote.getTimestampFomPositionX(wave.x),\r\n }))\r\n\r\n this.set({ positionWavesTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionWavesTimestamps } = this.attrs\r\n if (!quote || !positionWavesTimestamps) {\r\n // positionWavesTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const waves = positionWavesTimestamps.map((wave) => ({\r\n ...wave,\r\n x: quote.getPositionXFromTimestamp(wave.x),\r\n }))\r\n this.set({ waves } as Partial)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const point of this.attrs.waves) {\r\n point.x += x\r\n point.y += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n this.attrs.waves[+type].x += difX\r\n this.attrs.waves[+type].y += difY\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const waves = this.attrs.waves\r\n for (let i = 0; i < waves.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: this.fx(waves[i].x),\r\n y1: this.fy(waves[i].y),\r\n x2: this.fx(waves[i + 1].x),\r\n y2: this.fy(waves[i + 1].y),\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['waves']\r\n }\r\n}\r\n\r\nElliottWaves.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default ElliottWaves\r\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IEllipseAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n cursorTargetX: number\r\n cursorTargetY: number\r\n\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\ninterface Coordinates {\r\n P1: Point\r\n P2: Point\r\n P3: Point\r\n P4: Point\r\n CP1: Point\r\n CP2: Point\r\n CP3: Point\r\n CP4: Point\r\n}\r\n\r\nclass EllipseV1 extends Element {\r\n static type = CanvasElementType.ellipseV1\r\n\r\n name = 'Ellipse'\r\n\r\n untranslatedContext: CanvasRenderingContext2D | null = null\r\n declare ellipsePath: Path2D\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\r\n this._thumbs = [\r\n new Thumb(\r\n 'left',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'right',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'top',\r\n () => this.getEllipsePoints(true).P2.x || this.attrs.x1,\r\n () => this.getEllipsePoints(true).P2.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottom',\r\n () => this.getEllipsePoints(true).P4.x || this.attrs.x2,\r\n () => this.getEllipsePoints(true).P4.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const coordinates = this.getEllipsePoints() as Coordinates\r\n const ellipse = new Path2D()\r\n context.set('fillStyle', this.attrs.fill)\r\n context.beginPath()\r\n if (coordinates.P2.x === coordinates.P3.x || coordinates.P2.y === coordinates.P3.y) {\r\n ellipse.lineTo(coordinates.P1.x, coordinates.P1.y)\r\n ellipse.lineTo(coordinates.P2.x, coordinates.P2.y)\r\n } else {\r\n ellipse.moveTo(coordinates.P4.x, coordinates.P4.y)\r\n ellipse.bezierCurveTo(\r\n coordinates.CP4.x,\r\n coordinates.CP4.y,\r\n coordinates.CP1.x,\r\n coordinates.CP1.y,\r\n coordinates.P2.x,\r\n coordinates.P2.y\r\n )\r\n ellipse.bezierCurveTo(\r\n coordinates.CP2.x,\r\n coordinates.CP2.y,\r\n coordinates.CP3.x,\r\n coordinates.CP3.y,\r\n coordinates.P4.x,\r\n coordinates.P4.y\r\n )\r\n ellipse.closePath()\r\n this.ellipsePath = ellipse\r\n context.fill(ellipse)\r\n }\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n context.stroke(ellipse)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getEllipsePoints(inverted = false) {\r\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\r\n\r\n const P1 = { x: x2, y: y2 }\r\n const P3 = { x: x1, y: y1 }\r\n\r\n let perpendicularPoint\r\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\r\n const cursor = { x: cursorTargetX, y: cursorTargetY }\r\n const line = { x1, y1, x2, y2 }\r\n const distance = math.distanceToLine(cursor, line)\r\n perpendicularPoint = math.perpendicularPointToLine({\r\n distance,\r\n line,\r\n })\r\n } else {\r\n return {\r\n P1: P3,\r\n P2: P1,\r\n P3: P1,\r\n P4: P3,\r\n }\r\n }\r\n\r\n const lineCenterX = (P1.x + P3.x) / 2\r\n const lineCenterY = (P1.y + P3.y) / 2\r\n const pointOffsetX = perpendicularPoint.x - P1.x\r\n const pointOffsetY = perpendicularPoint.y - P1.y\r\n\r\n const P2 = { x: lineCenterX + pointOffsetX, y: lineCenterY + pointOffsetY }\r\n const P4 = { x: lineCenterX + -1 * pointOffsetX, y: lineCenterY + -1 * pointOffsetY }\r\n const invertX = this.model.scale.x.invert\r\n const invertY = this.model.scale.y.invert\r\n if (inverted) {\r\n return {\r\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\r\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\r\n }\r\n }\r\n\r\n const perpendicularPointEllipseOffsetX = (perpendicularPoint.x - P2.x) / 0.75 - (perpendicularPoint.x - P2.x)\r\n const perpendicularPointEllipseOffsetY = (perpendicularPoint.y - P2.y) / 0.75 - (perpendicularPoint.y - P2.y)\r\n\r\n const P1WithOffsetX = P1.x + perpendicularPointEllipseOffsetX\r\n const P1WithOffsetY = P1.y + perpendicularPointEllipseOffsetY\r\n\r\n const P3WithOffsetX = P3.x - perpendicularPointEllipseOffsetX\r\n const P3WithOffsetY = P3.y - perpendicularPointEllipseOffsetY\r\n\r\n const CP1 = {\r\n x: perpendicularPoint.x + perpendicularPointEllipseOffsetX,\r\n y: perpendicularPoint.y + perpendicularPointEllipseOffsetY,\r\n }\r\n const controlPointOffsetX = CP1.x - P1WithOffsetX\r\n const controlPointOffsetY = CP1.y - P1WithOffsetY\r\n\r\n const CP2 = { x: P3WithOffsetX + controlPointOffsetX, y: P3WithOffsetY + controlPointOffsetY }\r\n const CP3 = { x: P3WithOffsetX + -1 * controlPointOffsetX, y: P3WithOffsetY + -1 * controlPointOffsetY }\r\n const CP4 = { x: P1WithOffsetX + -1 * controlPointOffsetX, y: P1WithOffsetY + -1 * controlPointOffsetY }\r\n\r\n return {\r\n P1,\r\n P2,\r\n P3,\r\n P4,\r\n CP1,\r\n CP2,\r\n CP3,\r\n CP4,\r\n }\r\n }\r\n\r\n getRotatedPointCoordinates = ({\r\n rotationAxisPoint,\r\n pointToRotate,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n rotationAxisPoint: { x: number; y: number }\r\n pointToRotate: { x: number; y: number }\r\n oldLinePoint: { x: number; y: number }\r\n newLinePoint: { x: number; y: number }\r\n }) => {\r\n const angle = math.sharedPointLinesAngle({\r\n sharedPoint: rotationAxisPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n })\r\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n })\r\n return {\r\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\r\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.cursorTargetX += x\r\n this.attrs.cursorTargetY += y\r\n }\r\n\r\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'left':\r\n const newLeftPoint = {\r\n x: this.attrs.x1 + difX,\r\n y: this.attrs.y1 + difY,\r\n }\r\n const leftRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n newLinePoint: { x: this.model.scale.x(newLeftPoint.x), y: this.model.scale.y(newLeftPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x1: newLeftPoint.x,\r\n y1: newLeftPoint.y,\r\n cursorTargetX: leftRotatedCursorPoint.x,\r\n cursorTargetY: leftRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'right':\r\n const newRightPoint = {\r\n x: this.attrs.x2 + difX,\r\n y: this.attrs.y2 + difY,\r\n }\r\n const rightRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n newLinePoint: { x: this.model.scale.x(newRightPoint.x), y: this.model.scale.y(newRightPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x2: newRightPoint.x,\r\n y2: newRightPoint.y,\r\n cursorTargetX: rightRotatedCursorPoint.x,\r\n cursorTargetY: rightRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'top':\r\n case 'bottom':\r\n this.attrs = {\r\n ...this.attrs,\r\n cursorTargetX: area.x,\r\n cursorTargetY: area.y,\r\n }\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (this.ellipsePath && this.untranslatedContext?.isPointInPath(this.ellipsePath, area.scaled.x, area.scaled.y)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nEllipseV1.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default EllipseV1\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ntype Coefficients = string\r\n\r\nexport interface IFibonacciRetracementsAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n coefficients: Coefficients\r\n border: DrawingBorder\r\n}\r\n\r\nclass FibonacciRetracements<\r\n Attrs extends IFibonacciRetracementsAttrs = IFibonacciRetracementsAttrs,\r\n> extends Element {\r\n static type = CanvasElementType.fibonacciRetracements\r\n\r\n name = 'Fibonacci Retracements'\r\n declare coefficients: { default: string; parsed: number[]; max: number }\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'oneCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'oneCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'zeroCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'zeroCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.parseCoefficients(this.attrs.coefficients)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n coefficients: [0, 0.236, 0.382, 0.5, 0.618, 1].toString(),\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n parseCoefficients(coefficients: Coefficients) {\r\n if (!this.coefficients || coefficients !== this.coefficients.default) {\r\n const parsed = coefficients.split(',').map((x) => parseFloat(x.trim()))\r\n this.coefficients = { default: coefficients, parsed, max: Math.max(...parsed) }\r\n }\r\n }\r\n\r\n getMaxCoefficientUnscaledY() {\r\n return this.model.scale.y.invert(this.scaled.y2 - this.coefficients.max * (this.scaled.y2 - this.scaled.y1))\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY, y2: roundedXY.y1 })\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n this.parseCoefficients(this.attrs.coefficients)\r\n\r\n const height = this.attrs.y2 - this.attrs.y1\r\n const heightScaled = roundedXY.y2 - roundedXY.y1\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n for (const p of this.coefficients.parsed) {\r\n context.moveTo(roundedXY.x1, Math.round(y2 - p * heightScaled))\r\n context.lineTo(roundedXY.x2, Math.round(y2 - p * heightScaled))\r\n }\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n const text = new Text(\r\n {\r\n x: roundedXY.x1,\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: TextBaseline.bottom,\r\n fillStyle: this.attrs.border.color,\r\n textAlign: TextAlign.left,\r\n },\r\n this.model\r\n )\r\n if (roundedXY.x1 > roundedXY.x2) {\r\n text.set({ textAlign: TextAlign.right })\r\n }\r\n\r\n for (const p of this.coefficients.parsed) {\r\n const y = this.attrs.y2 - p * height\r\n text.set({\r\n text: (p * 100).toFixed(1) + '%: ' + y.toFixed(2),\r\n y: Math.round(this.fy(y) - this.attrs.border.width / 2),\r\n } as Partial)\r\n text.render(context)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n if (this.coefficients.max > 1 && this._thumbs.length < 6) {\r\n this._thumbs = [\r\n ...this._thumbs,\r\n new Thumb(\r\n 'maxCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.getMaxCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'maxCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.getMaxCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n if (this.coefficients.max <= 1 && this._thumbs.length > 4) {\r\n this._thumbs.splice(4)\r\n }\r\n\r\n return this._thumbs\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'oneCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'oneCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'zeroCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'zeroCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'maxCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY / this.coefficients.max\r\n break\r\n case 'maxCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y1 += difY / this.coefficients.max\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const maxCoefficientY = this.coefficients.max > 1 && this.getMaxCoefficientUnscaledY()\r\n const left = Math.min(this.attrs.x1, this.attrs.x2)\r\n const right = Math.max(this.attrs.x1, this.attrs.x2)\r\n const top = maxCoefficientY\r\n ? Math.min(this.attrs.y1, this.attrs.y2, maxCoefficientY)\r\n : Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = maxCoefficientY\r\n ? Math.max(this.attrs.y1, this.attrs.y2, maxCoefficientY)\r\n : Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nFibonacciRetracements.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'border' },\r\n { type: 'string', name: 'coefficients', label: 'Coefficients' },\r\n ],\r\n}\r\n\r\nexport default FibonacciRetracements\r\n","import { Maybe, RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\r\nimport Text from './text'\r\n\r\nconst DEFAULT_DECIMAL_PLACES = 2\r\n\r\nclass HorizontalLine extends ScaledLine {\r\n static type = CanvasElementType.horizontalLine\r\n\r\n name = 'Horizontal line'\r\n decimalPlaces = DEFAULT_DECIMAL_PLACES\r\n declare scaled: Pick\r\n declare model: PaneModel\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.updateDecimalPlaces()\r\n\r\n if (this.attrs.y1) {\r\n this.attrs.y1 = Number(math.round({ value: this.attrs.y1, overridePlaces: this.decimalPlaces }))\r\n }\r\n if (this.modalConfig) {\r\n const step = `0.${'0'.repeat(this.decimalPlaces - 1)}1`\r\n this.modalConfig.inputs[1] = {\r\n ...this.modalConfig.inputs[1],\r\n step,\r\n min: Number(step),\r\n }\r\n }\r\n this.renderContent = this.renderContent.bind(this)\r\n this._thumbs = []\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n updateDecimalPlaces() {\r\n const quote = this.model.chart().quote()\r\n this.decimalPlaces = quote\r\n ? math.getInstrumentDecimalPlaces({\r\n instrument: quote.instrument,\r\n value: quote.lastClose,\r\n })\r\n : DEFAULT_DECIMAL_PLACES\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n this.attrs.y2 = this.attrs.y1\r\n // mixing scaled and unscaled values, do not copy paste as solution\r\n this.attrs.x1 = ChartSettings.left.width * -1\r\n this.attrs.x2 =\r\n this.model\r\n .chart()\r\n .quote()\r\n .getBarIndex(this.model.chart().quote().close.length - 1) + this.model.chart().width\r\n super.renderContent(context)\r\n }\r\n\r\n renderLabels(context: CanvasRenderingContext2D) {\r\n if (this.attrs.y1) {\r\n this.updateDecimalPlaces()\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const isIndicatorPane = this.model\r\n .elements()\r\n .all()\r\n .some((element) => element.isIndicator())\r\n const settings = isIndicatorPane ? IndicatorSettings : ChartSettings\r\n context.translate(this.model.chart().width - settings.right.width, settings.top.height)\r\n new Text(\r\n {\r\n x: 6,\r\n y: this.scaled.y1,\r\n font: { size: 8, style: 'bold' },\r\n lineHeight: 8,\r\n padding: {\r\n top: 2,\r\n right: 2,\r\n bottom: 2,\r\n left: 2,\r\n },\r\n fillStyle: '#fff',\r\n background: '#000',\r\n textBaseline: TextBaseline.middle,\r\n text: this.attrs.y1.toFixed(this.decimalPlaces).toString(),\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n }\r\n\r\n moveBy(x: Maybe, y: number) {\r\n this.attrs.y1 += y\r\n }\r\n\r\n resize({ difY }: RequireByKey) {\r\n this.moveBy(0, difY)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n return super.getIsInChartView(chart, { omitX: true })\r\n }\r\n}\r\n\r\nHorizontalLine.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'border' },\r\n { type: 'number', name: 'y1', label: 'Price', allowDecimal: true },\r\n ],\r\n}\r\n\r\nexport default HorizontalLine\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\ninterface ILineAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n dashLength: number\r\n lineWidth: number\r\n strokeStyle: string\r\n}\r\n\r\nclass Line extends Element {\r\n static type = CanvasElementType.line\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.render = this.render.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'l',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'r',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n lineWidth: 1,\r\n strokeStyle: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { x1, y1, x2, y2, lineWidth } = this.attrs\r\n const roundedXY = getRoundedObject({ x1, y1, x2, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineWidth', this.attrs.lineWidth)\r\n context.set('strokeStyle', this.attrs.strokeStyle)\r\n\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([this.attrs.dashLength])\r\n }\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([])\r\n }\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'l') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area, this.attrs) <= 10) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nexport default Line\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport { numberToStringWithUnitsSuffix } from '../utils'\r\nimport { getRoundedString } from '../utils/helpers'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ninterface Coordinates {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport interface IMeasureAttrs extends Coordinates {\r\n fill: string\r\n}\r\n\r\nclass Measure extends Element {\r\n static type = CanvasElementType.measure\r\n\r\n name = 'Measure'\r\n declare scaled: Pick\r\n\r\n x1Dif: number\r\n x2Dif: number\r\n startingX1: number\r\n startingX2: number\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'tl',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'br',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.x1Dif = this.x2Dif = 0\r\n\r\n this.startingX1 = this.attrs.x1\r\n this.startingX2 = this.attrs.x2\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n getVolumeSumString = () => {\r\n const { volume, barIndex }: { volume: number[]; barIndex: number[] } = this.model.chart().quote()\r\n const roundedX1 = Math.round(this.attrs.x1)\r\n const roundedX2 = Math.round(this.attrs.x2)\r\n // min/max values are offset by 1 so there's no value on such index\r\n // and at the same time it won't iterate over unlimited number of nonexisting indexes\r\n const minIndexLimit = barIndex[0] - 1\r\n const maxIndexLimit = barIndex[barIndex.length - 1] + 1\r\n const volMinIndex = Math.min(Math.max(Math.min(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\r\n const volMaxIndex = Math.min(Math.max(Math.max(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\r\n\r\n let volumeSum = 0\r\n for (let i = volMinIndex; i <= volMaxIndex; i++) {\r\n const volumeIndex = barIndex.indexOf(i)\r\n if (volumeIndex >= 0) {\r\n volumeSum += volume[volumeIndex]\r\n }\r\n }\r\n\r\n return `Vol ${numberToStringWithUnitsSuffix(volumeSum)}`\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n\r\n const width = roundedXY.x2 - roundedXY.x1\r\n const height = roundedXY.y2 - roundedXY.y1\r\n context.fillRect(x1, roundedXY.y1, width, height)\r\n\r\n const priceDif = this.attrs.y2 - this.attrs.y1\r\n const percentage = (100 / this.attrs.y1) * priceDif\r\n const heightStr = `${priceDif.toFixed(2)} (${percentage.toFixed(2)}%)`\r\n\r\n const text = new Text(\r\n {\r\n text: `${getRoundedString({ number: Math.abs(this.attrs.x2 - this.attrs.x1), numOfDecimalPlaces: 2 })} bars`,\r\n fillStyle: '#333',\r\n font: { size: 10, family: 'Arial', weight: 'bold' },\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n const baseX = x1 + width / 2\r\n const baseY = roundedXY.y1 + height / 2\r\n let textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY - text.getHeight(),\r\n } as Partial)\r\n text.render(context)\r\n\r\n text.set({ text: heightStr })\r\n textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY,\r\n } as Partial)\r\n text.render(context)\r\n\r\n text.set({ text: this.getVolumeSumString() })\r\n textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY + text.getHeight(),\r\n } as Partial)\r\n text.render(context)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n addToCoordinates(difs: Partial) {\r\n this.attrs.y1 += difs.y1 || 0\r\n this.attrs.y2 += difs.y2 || 0\r\n\r\n this.x1Dif += difs.x1 || 0\r\n this.x2Dif += difs.x2 || 0\r\n\r\n // The reason for adding +1 is to \"ceil\" the number when moving to the left (decreasing bar index)\r\n const newX1 = ~~(this.startingX1 + this.x1Dif) + (this.x1Dif < 0 ? 1 : 0)\r\n if (~~this.attrs.x1 - newX1 !== 0) {\r\n this.attrs.x1 = newX1\r\n }\r\n const newX2 = ~~(this.startingX2 + this.x2Dif) + (this.x2Dif < 0 ? 1 : 0)\r\n if (~~this.attrs.x2 - newX2 !== 0) {\r\n this.attrs.x2 = newX2\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n return this.addToCoordinates({\r\n x1: x,\r\n y1: y,\r\n x2: x,\r\n y2: y,\r\n })\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tl') {\r\n this.addToCoordinates({ x1: difX, y1: difY })\r\n } else {\r\n this.addToCoordinates({ x2: difX, y2: difY })\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const x1 = Math.round(this.attrs.x1)\r\n const x2 = Math.round(this.attrs.x2)\r\n\r\n const left = Math.min(x1, x2)\r\n const right = Math.max(x1, x2)\r\n const top = Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n onMouseDown(paneArea: PaneArea) {\r\n super.onMouseDown(paneArea)\r\n this.startingX1 = this.attrs.x1\r\n this.startingX2 = this.attrs.x2\r\n }\r\n\r\n onMouseUp(paneArea?: PaneArea) {\r\n super.onMouseUp(paneArea)\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n}\r\n\r\nMeasure.prototype.defaults = { fill: 'rgba(180,220,255,0.8)' }\r\n\r\nMeasure.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill' }],\r\n}\r\n\r\nexport default Measure\r\n","import { Point } from '../../../types/shared'\r\nimport { getRoundedObject } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { isInRange } from '../../utils/helpers'\r\nimport { ITrendAttrs } from './pitchfork_v1'\r\n\r\ninterface IGetEdgeIntersectionPointArguments {\r\n sides: { x: number; y: number }[][]\r\n rayOrigin: Point\r\n rayDirection: Point\r\n}\r\n\r\nexport const getEdgeIntersectionPoint = ({ sides, rayOrigin, rayDirection }: IGetEdgeIntersectionPointArguments) => {\r\n if (rayOrigin.x === rayDirection.x && rayOrigin.y === rayDirection.y) return rayDirection\r\n\r\n let intersection = rayDirection\r\n let intersectionDistance = 0\r\n for (let index = 0; index < sides.length; index++) {\r\n const rayToLineIntersection = math.getRayToLineSegmentIntersection(\r\n rayOrigin,\r\n rayDirection,\r\n sides[index][0],\r\n sides[index][1]\r\n )\r\n if (rayToLineIntersection) {\r\n const distance = math.distance(rayToLineIntersection, rayOrigin)\r\n if (distance > intersectionDistance && isInRange({ value: distance })) {\r\n intersectionDistance = distance\r\n intersection = { x: rayToLineIntersection.x, y: rayToLineIntersection.y }\r\n }\r\n }\r\n }\r\n\r\n return intersection\r\n}\r\n\r\nexport const getChartVisibleAreaBoundaries = (paneModel: PaneModel) => {\r\n const { left, right, top, bottom } = paneModel.getChartLayoutSettings().ChartSettings\r\n const { leftOffset, width } = paneModel.chart()\r\n\r\n const chartVisibleAreaLeftX = Math.abs(leftOffset)\r\n const chartVisibleAreaRightX = chartVisibleAreaLeftX + width - left.width - right.width\r\n const chartVisibleAreaTopY = 0\r\n const chartVisibleAreaBottomY = paneModel.height - top.height - bottom.height\r\n\r\n const chartVisibleAreaTopLeftPoint = {\r\n x: chartVisibleAreaLeftX,\r\n y: chartVisibleAreaTopY,\r\n }\r\n const chartVisibleAreaTopRightPoint = {\r\n x: chartVisibleAreaRightX,\r\n y: chartVisibleAreaTopY,\r\n }\r\n const chartVisibleAreaBottomLeftPoint = {\r\n x: chartVisibleAreaLeftX,\r\n y: chartVisibleAreaBottomY,\r\n }\r\n const chartVisibleAreaBottomRightPoint = {\r\n x: chartVisibleAreaRightX,\r\n y: chartVisibleAreaBottomY,\r\n }\r\n const topSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaTopRightPoint]\r\n const rightSide = [chartVisibleAreaTopRightPoint, chartVisibleAreaBottomRightPoint]\r\n const bottomSide = [chartVisibleAreaBottomLeftPoint, chartVisibleAreaBottomRightPoint]\r\n const leftSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaBottomLeftPoint]\r\n\r\n const sides = [topSide, rightSide, bottomSide, leftSide]\r\n\r\n return sides\r\n}\r\n\r\ninterface IGetPitchforkCoordinates {\r\n paneModel: PaneModel\r\n rayOrigin: Point\r\n rayDirectionControlPoint1: Point\r\n rayDirectionControlPoint2?: Point\r\n trend1: ITrendAttrs\r\n trend2: ITrendAttrs\r\n}\r\n\r\ninterface ILineSegment {\r\n P1: Point\r\n P2: Point\r\n}\r\n\r\ninterface ICoordinates {\r\n medianRay: ILineSegment\r\n trend1Ray1: ILineSegment | undefined\r\n trend1Ray2: ILineSegment | undefined\r\n trend2Ray1: ILineSegment | undefined\r\n trend2Ray2: ILineSegment | undefined\r\n}\r\n\r\nexport const getPitchforkCoordinates = ({\r\n paneModel,\r\n rayOrigin,\r\n rayDirectionControlPoint1,\r\n rayDirectionControlPoint2,\r\n trend1,\r\n trend2,\r\n}: IGetPitchforkCoordinates) => {\r\n const sides = getChartVisibleAreaBoundaries(paneModel)\r\n\r\n const coordinates: ICoordinates = {\r\n medianRay: { P1: rayOrigin, P2: rayDirectionControlPoint1 },\r\n trend1Ray1: undefined,\r\n trend2Ray1: undefined,\r\n trend1Ray2: undefined,\r\n trend2Ray2: undefined,\r\n }\r\n\r\n // If rayDirectionControlPoint2 doesn't exist return only medianRay with rayDirectionControlPoint1 as rayDirection\r\n if (!rayDirectionControlPoint2) {\r\n coordinates.medianRay = {\r\n P1: getRoundedObject(rayOrigin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin,\r\n rayDirection: rayDirectionControlPoint1,\r\n })\r\n ),\r\n }\r\n return coordinates\r\n }\r\n\r\n const medianRayDirectionPoint = math.getMiddlePointOnLineSegment(rayDirectionControlPoint1, rayDirectionControlPoint2)\r\n const rayOriginToRayDirectionVector = {\r\n x: medianRayDirectionPoint.x - rayOrigin.x,\r\n y: medianRayDirectionPoint.y - rayOrigin.y,\r\n }\r\n\r\n const rayDirectionControlPoint1ToPoint2Vector = {\r\n x: rayDirectionControlPoint1.x - rayDirectionControlPoint2.x,\r\n y: rayDirectionControlPoint1.y - rayDirectionControlPoint2.y,\r\n }\r\n\r\n const normalizedRayDirectionControlPoint1ToPoint2Vector = math.normalizeVector(\r\n rayDirectionControlPoint1ToPoint2Vector\r\n )\r\n\r\n const medianRayDirectionPointToRayDirectionControlPoint1Distance = math.distance(\r\n medianRayDirectionPoint,\r\n rayDirectionControlPoint1\r\n )\r\n\r\n coordinates.medianRay = {\r\n P1: getRoundedObject(rayOrigin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin,\r\n rayDirection: medianRayDirectionPoint,\r\n })\r\n ),\r\n }\r\n if (trend1.active) {\r\n const trend1Ray = getTrendRayCoordinates({\r\n trend: trend1.trend,\r\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\r\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n })\r\n\r\n coordinates.trend1Ray1 = trend1Ray.trendRay1\r\n coordinates.trend1Ray2 = trend1Ray.trendRay2\r\n }\r\n if (trend2.active) {\r\n const trend2Ray = getTrendRayCoordinates({\r\n trend: trend2.trend,\r\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\r\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n })\r\n\r\n coordinates.trend2Ray1 = trend2Ray.trendRay1\r\n coordinates.trend2Ray2 = trend2Ray.trendRay2\r\n }\r\n\r\n return coordinates\r\n}\r\n\r\ninterface IGetTrendRayCoordinates {\r\n trend: number\r\n medianToControlPointDistance: number\r\n normalizedControlToControlPointVector: Point\r\n rayOriginToRayDirectionVector: Point\r\n medianRayDirectionPoint: Point\r\n sides: Point[][]\r\n}\r\n\r\nconst getTrendRayCoordinates = ({\r\n trend,\r\n medianToControlPointDistance,\r\n normalizedControlToControlPointVector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n}: IGetTrendRayCoordinates) => {\r\n const medianToTrendLineDistance = medianToControlPointDistance * trend\r\n\r\n const trendRayPoint1Origin = math.addPoints(\r\n medianRayDirectionPoint,\r\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\r\n )\r\n const trendPoint2RayOriginPoint2 = math.subtractPoints(\r\n medianRayDirectionPoint,\r\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\r\n )\r\n\r\n const trendRayPoint1DirectionPoint = {\r\n x: trendRayPoint1Origin.x + rayOriginToRayDirectionVector.x,\r\n y: trendRayPoint1Origin.y + rayOriginToRayDirectionVector.y,\r\n }\r\n const trendPoint2RayDirectionPoint = {\r\n x: trendPoint2RayOriginPoint2.x + rayOriginToRayDirectionVector.x,\r\n y: trendPoint2RayOriginPoint2.y + rayOriginToRayDirectionVector.y,\r\n }\r\n\r\n return {\r\n trendRay1: {\r\n P1: getRoundedObject(trendRayPoint1Origin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin: trendRayPoint1Origin,\r\n rayDirection: trendRayPoint1DirectionPoint,\r\n })\r\n ),\r\n },\r\n trendRay2: {\r\n P1: getRoundedObject(trendPoint2RayOriginPoint2),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin: trendPoint2RayOriginPoint2,\r\n rayDirection: trendPoint2RayDirectionPoint,\r\n })\r\n ),\r\n },\r\n }\r\n}\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport Chart from '../../models/chart'\r\nimport PaneModel from '../../models/pane'\r\nimport { getHEXWithSpecificAplha } from '../../utils/colors'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\nimport { getPitchforkCoordinates } from './pitchfork_utils'\r\n\r\nexport interface ITrendAttrs {\r\n active: boolean\r\n trend: number\r\n color: string\r\n}\r\n\r\nexport interface IPitchforkAttrs {\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n x3: number\r\n y3: number\r\n median: { color: string; width: number }\r\n trend1: ITrendAttrs\r\n trend2: ITrendAttrs\r\n}\r\n\r\nclass Pitchfork extends Element {\r\n static type = CanvasElementType.pitchforkV1\r\n\r\n declare scaled: Pick\r\n name = 'Pitchfork'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'medianRayOrigin',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rayDirectionControlPoint1',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rayDirectionControlPoint2',\r\n () => this.attrs.x3,\r\n () => this.attrs.y3,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n median: { color: '#e72f2f', width: 1 },\r\n trend1: {\r\n color: '#004ad31c',\r\n active: true,\r\n trend: 1,\r\n },\r\n trend2: {\r\n color: '#00ca4e1f',\r\n active: true,\r\n trend: 0.5,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.median.width)\r\n context.translate(offset, offset)\r\n\r\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\r\n paneModel: this.model,\r\n rayOrigin: { x: x1, y: y1 },\r\n rayDirectionControlPoint1: { x: x2, y: y2 },\r\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\r\n trend1: this.attrs.trend1,\r\n trend2: this.attrs.trend2,\r\n })\r\n\r\n context.set('lineWidth', this.attrs.median.width)\r\n\r\n const trendLines = [\r\n { trend: this.attrs.trend1, line1: trend1Ray1, line2: trend1Ray2 },\r\n { trend: this.attrs.trend2, line1: trend2Ray1, line2: trend2Ray2 },\r\n ].sort((a, b) => {\r\n if (Math.abs(a.trend.trend) > Math.abs(b.trend.trend)) {\r\n return -1\r\n }\r\n if (Math.abs(a.trend.trend) < Math.abs(b.trend.trend)) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n\r\n // Draw trend lines and fill\r\n trendLines.forEach((trendLine, trendLineIndex) => {\r\n if (trendLine.line1 && trendLine.line2) {\r\n const { line1, line2 } = trendLine\r\n const solidTrendColor = getHEXWithSpecificAplha(trendLine.trend.color)\r\n const nextTrendLine = trendLines[trendLineIndex + 1]\r\n\r\n context.beginPath()\r\n context.moveTo(line1.P1.x, line1.P1.y)\r\n context.lineTo(line1.P2.x, line1.P2.y)\r\n if (trendLineIndex !== trendLines.length - 1 && nextTrendLine.line1 && nextTrendLine.line2) {\r\n context.lineTo(nextTrendLine.line1.P2.x, nextTrendLine.line1.P2.y)\r\n context.lineTo(nextTrendLine.line1.P1.x, nextTrendLine.line1.P1.y)\r\n context.moveTo(nextTrendLine.line2.P1.x, nextTrendLine.line2.P1.y)\r\n context.lineTo(nextTrendLine.line2.P2.x, nextTrendLine.line2.P2.y)\r\n }\r\n context.lineTo(line2.P2.x, line2.P2.y)\r\n context.lineTo(line2.P1.x, line2.P1.y)\r\n context.closePath()\r\n context.set('fillStyle', trendLine.trend.color)\r\n context.fill()\r\n\r\n context.beginPath()\r\n context.moveTo(line1.P1.x, line1.P1.y)\r\n context.lineTo(line1.P2.x, line1.P2.y)\r\n context.moveTo(line2.P1.x, line2.P1.y)\r\n context.lineTo(line2.P2.x, line2.P2.y)\r\n context.set('strokeStyle', solidTrendColor)\r\n context.stroke()\r\n }\r\n })\r\n\r\n // Draw median ray line\r\n context.beginPath()\r\n context.moveTo(medianRay.P1.x, medianRay.P1.y)\r\n context.lineTo(medianRay.P2.x, medianRay.P2.y)\r\n\r\n // Draw line between outer trend lines origin points or if smaller than 1 between direction control points\r\n const outerTrendLines =\r\n trendLines.filter(\r\n (item) => item.line1 && item.line2 && item.trend.active && Math.abs(item.trend.trend) >= 1\r\n )[0] ?? {}\r\n\r\n if (outerTrendLines.line1 && outerTrendLines.line2) {\r\n context.moveTo(outerTrendLines.line1.P1.x, outerTrendLines.line1.P1.y)\r\n context.lineTo(outerTrendLines.line2.P1.x, outerTrendLines.line2.P1.y)\r\n } else if (!Number.isNaN(x3) && !Number.isNaN(y3)) {\r\n context.moveTo(x2, y2)\r\n context.lineTo(x3, y3)\r\n }\r\n\r\n context.set('strokeStyle', this.attrs.median.color)\r\n context.stroke()\r\n\r\n context.translate(offset * -1, offset * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.x3 += x\r\n this.attrs.y3 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'medianRayOrigin':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'rayDirectionControlPoint1':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'rayDirectionControlPoint2':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\r\n paneModel: this.model,\r\n rayOrigin: { x: x1, y: y1 },\r\n rayDirectionControlPoint1: { x: x2, y: y2 },\r\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\r\n trend1: this.attrs.trend1,\r\n trend2: this.attrs.trend2,\r\n })\r\n const outerTrendLines =\r\n Math.abs(this.attrs.trend1.trend) > Math.abs(this.attrs.trend2.trend)\r\n ? { line1: trend1Ray1, line2: trend1Ray2 }\r\n : { line1: trend2Ray1, line2: trend2Ray2 }\r\n\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: medianRay.P1.x,\r\n y1: medianRay.P1.y,\r\n x2: medianRay.P2.x,\r\n y2: medianRay.P2.y,\r\n }) <= 10\r\n ) {\r\n // cursor is near median ray\r\n return true\r\n } else if (\r\n !Number.isNaN(x3) &&\r\n !Number.isNaN(y3) &&\r\n math.distanceToSegment(area.scaled, {\r\n x1: x2,\r\n y1: y2,\r\n x2: x3,\r\n y2: y3,\r\n }) <= 10\r\n ) {\r\n // cursor is near line connecting direction control points\r\n return true\r\n } else if (\r\n outerTrendLines.line1 &&\r\n outerTrendLines.line2 &&\r\n math.pointInPolygon(area.scaled, [\r\n outerTrendLines.line1.P1,\r\n outerTrendLines.line1.P2,\r\n outerTrendLines.line2.P2,\r\n outerTrendLines.line2.P1,\r\n ])\r\n ) {\r\n // cursor is on polygon created by outer trend lines\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView(_: Chart) {\r\n return true\r\n }\r\n}\r\n\r\nPitchfork.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'median' },\r\n { type: 'trend', name: 'trend1' },\r\n { type: 'trend', name: 'trend2' },\r\n ],\r\n}\r\n\r\nexport default Pitchfork\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element, { EdgeValues } from './element'\r\nimport Thumb from './thumb'\r\n\r\ntype Points = Array<{ x: number; y: number }>\r\n\r\nexport interface IPolygonAttrs {\r\n points: Points\r\n fill: string\r\n border: DrawingBorder\r\n positionPointsTimestamps?: Points\r\n}\r\n\r\nclass Polygon extends Element {\r\n static type = CanvasElementType.polygon\r\n\r\n name = 'Polygon'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this.attrs.fill = this.attrs.fill || 'rgba(50, 60, 70, 0.8)'\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.translate(offset, offset)\r\n\r\n const { points } = this.attrs\r\n context.beginPath()\r\n context.moveTo(this.fx(points[0].x), this.fy(points[0].y))\r\n for (const p of points.slice(1)) {\r\n context.lineTo(this.fx(p.x), this.fy(p.y))\r\n }\r\n\r\n if (this.isPolygon()) {\r\n context.closePath()\r\n context.fill()\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n return this.attrs.points.map(\r\n (point, index) =>\r\n new Thumb(\r\n `${index}`,\r\n () => point.x,\r\n () => point.y,\r\n this.resize,\r\n this.model\r\n )\r\n )\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart()?.quote()\r\n if (quote) {\r\n const positionPointsTimestamps = this.attrs.points.map((point) => ({\r\n ...point,\r\n x: quote.getTimestampFomPositionX(point.x),\r\n }))\r\n\r\n this.set({ positionPointsTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionPointsTimestamps } = this.attrs\r\n if (!quote || !positionPointsTimestamps) {\r\n // positionWavesTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const points = positionPointsTimestamps.map((point) => ({\r\n ...point,\r\n x: quote.getPositionXFromTimestamp(point.x),\r\n }))\r\n this.set({ points } as Partial)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const point of this.attrs.points) {\r\n point.x += x\r\n point.y += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n const last = this.attrs.points.length - 1\r\n if (this.isPolygon() && (+type === 0 || +type === last)) {\r\n this.attrs.points[0].x += difX\r\n this.attrs.points[0].y += difY\r\n this.attrs.points[last].x += difX\r\n this.attrs.points[last].y += difY\r\n } else {\r\n this.attrs.points[+type].x += difX\r\n this.attrs.points[+type].y += difY\r\n }\r\n }\r\n\r\n isPolygon() {\r\n return (\r\n this.attrs.points[0].x === this.attrs.points.last()?.x && this.attrs.points[0].y === this.attrs.points.last()?.y\r\n )\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const scaledPoints = this.attrs.points.map((p) => ({\r\n x: this.fx(p.x),\r\n y: this.fy(p.y),\r\n }))\r\n if (this.isPolygon()) {\r\n if (math.pointInPolygon(area.scaled, scaledPoints)) {\r\n return true\r\n }\r\n } else {\r\n for (let i = 0; i < scaledPoints.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: scaledPoints[i].x,\r\n y1: scaledPoints[i].y,\r\n x2: scaledPoints[i + 1].x,\r\n y2: scaledPoints[i + 1].y,\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n }\r\n\r\n return super.isInArea(area)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['points']\r\n }\r\n\r\n getEdgeXYValues() {\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n this.attrs.points.forEach(({ x, y }) => {\r\n const xPoint = x\r\n const yPoint = y\r\n edgeXYValues.minX = Math.min(xPoint, edgeXYValues.minX ?? xPoint)\r\n edgeXYValues.minY = Math.min(yPoint, edgeXYValues.minY ?? yPoint)\r\n edgeXYValues.maxX = Math.max(xPoint, edgeXYValues.maxX ?? xPoint)\r\n edgeXYValues.maxY = Math.max(yPoint, edgeXYValues.maxY ?? yPoint)\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nPolygon.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Polygon\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ninterface Coordinates {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport interface IPositionAttrs extends Coordinates {\r\n targetColor: string\r\n stopColor: string\r\n targetY: number\r\n centerY: number\r\n stopY: number\r\n}\r\n\r\nclass Position extends Element {\r\n static type = CanvasElementType.position\r\n\r\n name = 'Position'\r\n\r\n declare scaled: Pick\r\n\r\n x1Dif: number\r\n x2Dif: number\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 't1',\r\n () => this.attrs.x1,\r\n () => this.attrs.targetY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 't2',\r\n () => this.attrs.x2,\r\n () => this.attrs.targetY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 's1',\r\n () => this.attrs.x1,\r\n () => this.attrs.stopY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 's2',\r\n () => this.attrs.x2,\r\n () => this.attrs.stopY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c1',\r\n () => this.attrs.x1,\r\n () => this.attrs.centerY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c2',\r\n () => this.attrs.x2,\r\n () => this.attrs.centerY,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['targetY', 'centerY', 'stopY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, targetY, centerY, stopY } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, targetY, centerY, stopY })\r\n let sign, stopBaseline, targetBaseline\r\n const width = roundedXY.x2 - roundedXY.x1\r\n\r\n context.set('fillStyle', this.attrs.targetColor)\r\n context.fillRect(roundedXY.x1, roundedXY.targetY, width, roundedXY.centerY - roundedXY.targetY)\r\n\r\n context.set('fillStyle', this.attrs.stopColor)\r\n context.fillRect(roundedXY.x1, roundedXY.centerY, width, roundedXY.stopY - roundedXY.centerY)\r\n\r\n const targetDif = Math.abs(this.attrs.targetY - this.attrs.centerY)\r\n const targetPerc = (100 / this.attrs.centerY) * targetDif\r\n const targetStr = `Target: ${targetDif.toFixed(2)} (${targetPerc.toFixed(2)}%)`\r\n\r\n const stopDif = Math.abs(this.attrs.stopY - this.attrs.centerY)\r\n const stopPerc = (100 / this.attrs.centerY) * stopDif\r\n const stopStr = `Stop: ${stopDif.toFixed(2)} (${stopPerc.toFixed(2)}%)`\r\n\r\n if (this.attrs.targetY > this.attrs.centerY) {\r\n sign = 1\r\n targetBaseline = TextBaseline.bottom\r\n stopBaseline = TextBaseline.top\r\n } else {\r\n sign = -1\r\n targetBaseline = TextBaseline.top\r\n stopBaseline = TextBaseline.bottom\r\n }\r\n\r\n const text = new Text(\r\n {\r\n text: targetStr,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n font: { size: 10, family: 'Arial', weight: 'bold' },\r\n y: roundedXY.targetY - sign * 4,\r\n textBaseline: targetBaseline,\r\n },\r\n this.model\r\n )\r\n let textWidth = text.measure(context)\r\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\r\n text.render(context)\r\n\r\n text.set({\r\n text: stopStr,\r\n y: roundedXY.stopY + sign * 4,\r\n textBaseline: stopBaseline,\r\n })\r\n textWidth = text.measure(context)\r\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\r\n text.render(context)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n addToCoordinates(difs: Partial) {\r\n let middle, middle1, result\r\n if (difs.targetY) {\r\n result = this.attrs.targetY + difs.targetY\r\n if (\r\n (this.attrs.targetY > this.attrs.centerY && result < this.attrs.centerY) ||\r\n (this.attrs.targetY < this.attrs.centerY && result > this.attrs.centerY)\r\n ) {\r\n this.attrs.stopY = this.attrs.centerY - (this.attrs.stopY - this.attrs.centerY) // swap target&stop\r\n }\r\n this.attrs.targetY = result\r\n }\r\n\r\n if (difs.stopY) {\r\n result = this.attrs.stopY + difs.stopY\r\n if (\r\n (this.attrs.stopY > this.attrs.centerY && result < this.attrs.centerY) ||\r\n (this.attrs.stopY < this.attrs.centerY && result > this.attrs.centerY)\r\n ) {\r\n this.attrs.targetY = this.attrs.centerY - (this.attrs.targetY - this.attrs.centerY) // swap target&stop\r\n }\r\n this.attrs.stopY = result\r\n }\r\n\r\n if (\r\n difs.centerY &&\r\n ((this.attrs.stopY < (middle = this.attrs.centerY + difs.centerY) && middle < this.attrs.targetY) ||\r\n (this.attrs.stopY > (middle1 = this.attrs.centerY + difs.centerY) && middle1 > this.attrs.targetY))\r\n ) {\r\n this.attrs.centerY += difs.centerY\r\n }\r\n\r\n this.x1Dif += difs.x1 || 0\r\n this.x2Dif += difs.x2 || 0\r\n const roundDif = ~~this.x1Dif || ~~this.x2Dif\r\n if (roundDif !== 0) {\r\n if (difs.x1 != null) {\r\n this.attrs.x1 += roundDif\r\n }\r\n if (difs.x2 != null) {\r\n this.attrs.x2 += roundDif\r\n }\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n return this.addToCoordinates({\r\n x1: x,\r\n x2: x,\r\n targetY: y,\r\n centerY: y,\r\n stopY: y,\r\n })\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n const [coordType, coordIndex] = (type as string).split('')\r\n const yPoints: Record = { t: 'targetY', c: 'centerY', s: 'stopY' }\r\n const obj: Partial = {\r\n [`x${coordIndex}`]: difX,\r\n [yPoints[coordType]]: difY,\r\n }\r\n return this.addToCoordinates(obj)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const x1 = Math.round(this.attrs.x1)\r\n const x2 = Math.round(this.attrs.x2)\r\n const left = Math.min(x1, x2)\r\n const right = Math.max(x1, x2)\r\n const top = Math.min(this.attrs.targetY, this.attrs.stopY)\r\n const bottom = Math.max(this.attrs.targetY, this.attrs.stopY)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nPosition.prototype.defaults = {\r\n targetColor: 'rgba(0,200,0,0.3)',\r\n stopColor: 'rgba(200,0,0,0.3)',\r\n}\r\n\r\nPosition.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'targetColor' },\r\n { type: 'background', name: 'stopColor' },\r\n ],\r\n}\r\n\r\nexport default Position\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IRectangleAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass Rectangle extends Element {\r\n static type = CanvasElementType.rectangle\r\n\r\n name = 'Rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'br',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tl',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const width = roundedXY.x2 - roundedXY.x1\r\n const height = roundedXY.y2 - roundedXY.y1\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.fillRect(roundedXY.x1, roundedXY.y1, width, height)\r\n\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.strokeRect(roundedXY.x1 + offset, roundedXY.y1 + offset, width, height)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n\r\n // @todo - Live sync of elements while they are being moved around\r\n // In order to have live sync across charts we need to trigger change so listeners can update other charts with new values\r\n // this.set(this.attrs)\r\n // this.trigger('change', this)\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tl') {\r\n this.attrs.x1 += difX\r\n return (this.attrs.y1 += difY)\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const left = Math.min(this.attrs.x1, this.attrs.x2)\r\n const right = Math.max(this.attrs.x1, this.attrs.x2)\r\n const top = Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nRectangle.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Rectangle\r\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IRotatedRectangleV1Attrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n cursorTargetX: number\r\n cursorTargetY: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass RotatedRectangleV1 extends Element {\r\n static type = CanvasElementType.rotatedRectangleV1\r\n\r\n name = 'New Rotated Rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'middleLeft',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'middleRight',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'topRight',\r\n () => this.getRectCoordinates(true).P1.x || this.attrs.x2,\r\n () => this.getRectCoordinates(true).P1.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'topLeft',\r\n () => this.getRectCoordinates(true).P2.x || this.attrs.x2,\r\n () => this.getRectCoordinates(true).P2.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottomLeft',\r\n () => this.getRectCoordinates(true).P3.x || this.attrs.x1,\r\n () => this.getRectCoordinates(true).P3.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottomRight',\r\n () => this.getRectCoordinates(true).P4.x || this.attrs.x1,\r\n () => this.getRectCoordinates(true).P4.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { P1, P2, P3, P4 } = this.getRectCoordinates()\r\n const roundedXY = {\r\n P1: getRoundedObject(P1),\r\n P2: getRoundedObject(P2),\r\n P3: getRoundedObject(P3),\r\n P4: getRoundedObject(P4),\r\n }\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n if (roundedXY.P1.x === roundedXY.P4.x && roundedXY.P1.y === roundedXY.P4.y) {\r\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\r\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\r\n } else {\r\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\r\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\r\n context.lineTo(roundedXY.P3.x, roundedXY.P3.y)\r\n context.lineTo(roundedXY.P4.x, roundedXY.P4.y)\r\n context.closePath()\r\n context.fill()\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n context.stroke()\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRectCoordinates(inverted = false) {\r\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\r\n let perpendicularPoint\r\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\r\n const cursor = { x: cursorTargetX, y: cursorTargetY }\r\n const line = { x1, y1, x2, y2 }\r\n const distance = math.distanceToLine(cursor, line)\r\n perpendicularPoint = math.perpendicularPointToLine({\r\n distance,\r\n line,\r\n })\r\n } else {\r\n return {\r\n P1: { x: x2, y: y2 },\r\n P2: { x: x1, y: y1 },\r\n P3: { x: x1, y: y1 },\r\n P4: { x: x2, y: y2 },\r\n }\r\n }\r\n\r\n const pointOffsetX = perpendicularPoint.x - x2\r\n const pointOffsetY = perpendicularPoint.y - y2\r\n\r\n const P1 = { x: x2 + pointOffsetX, y: y2 + pointOffsetY }\r\n const P2 = { x: x1 + pointOffsetX, y: y1 + pointOffsetY }\r\n const P3 = { x: x1 + -1 * pointOffsetX, y: y1 + -1 * pointOffsetY }\r\n const P4 = { x: x2 + -1 * pointOffsetX, y: y2 + -1 * pointOffsetY }\r\n\r\n const invertX = this.model.scale.x.invert\r\n const invertY = this.model.scale.y.invert\r\n if (inverted) {\r\n return {\r\n P1: { x: invertX(P1.x), y: invertY(P1.y) },\r\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\r\n P3: { x: invertX(P3.x), y: invertY(P3.y) },\r\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\r\n }\r\n }\r\n return { P1, P2, P3, P4 }\r\n }\r\n\r\n getRotatedPointCoordinates = ({\r\n rotationAxisPoint,\r\n pointToRotate,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n rotationAxisPoint: Point\r\n pointToRotate: Point\r\n oldLinePoint: Point\r\n newLinePoint: Point\r\n }) => {\r\n const angle = math.sharedPointLinesAngle({\r\n sharedPoint: rotationAxisPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n })\r\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n })\r\n return {\r\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\r\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.cursorTargetX += x\r\n this.attrs.cursorTargetY += y\r\n }\r\n\r\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'middleLeft':\r\n const newMiddleLeftPoint = {\r\n x: this.attrs.x1 + difX,\r\n y: this.attrs.y1 + difY,\r\n }\r\n const middleLeftRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n newLinePoint: { x: this.model.scale.x(newMiddleLeftPoint.x), y: this.model.scale.y(newMiddleLeftPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x1: newMiddleLeftPoint.x,\r\n y1: newMiddleLeftPoint.y,\r\n cursorTargetX: middleLeftRotatedCursorPoint.x,\r\n cursorTargetY: middleLeftRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'middleRight':\r\n const newMiddleRightPoint = {\r\n x: this.attrs.x2 + difX,\r\n y: this.attrs.y2 + difY,\r\n }\r\n const middleRightRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n newLinePoint: { x: this.model.scale.x(newMiddleRightPoint.x), y: this.model.scale.y(newMiddleRightPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x2: newMiddleRightPoint.x,\r\n y2: newMiddleRightPoint.y,\r\n cursorTargetX: middleRightRotatedCursorPoint.x,\r\n cursorTargetY: middleRightRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'topRight':\r\n case 'topLeft':\r\n case 'bottomLeft':\r\n case 'bottomRight':\r\n this.attrs = {\r\n ...this.attrs,\r\n cursorTargetX: area.x,\r\n cursorTargetY: area.y,\r\n }\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const coordinates = this.getRectCoordinates()\r\n const polygon = Object.keys(coordinates).map((point) => ({\r\n x: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].x,\r\n y: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].y,\r\n }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nRotatedRectangleV1.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default RotatedRectangleV1\r\n","import { DrawingBorder, PaneArea } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Line from './line'\r\n\r\nexport interface IScaledLineAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n dashLength: number\r\n lineWidth: number\r\n strokeStyle: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass ScaledLine extends Line {\r\n static type = CanvasElementType.scaledLine\r\n\r\n name = 'Line'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([this.attrs.dashLength])\r\n }\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n}\r\n\r\nScaledLine.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default ScaledLine\r\n","import merge from 'lodash.merge'\r\n\r\nimport { PaneArea } from '../../types/shared'\r\nimport { PADDING } from '../constants/common'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport Text, { ITextAttrs } from './text'\r\n\r\ninterface FontFamilyHeightCoefficient {\r\n Arial: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n Verdana: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n}\r\n\r\nclass ScaledText extends Text {\r\n static type = CanvasElementType.scaledText\r\n\r\n name = 'Text'\r\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\r\n declare lastAttrs: Attrs\r\n declare scaled: Partial\r\n declare measuredHeight: number\r\n\r\n declare font: string\r\n declare context?: CanvasRenderingContext2D\r\n declare lines: {\r\n text: string\r\n metrics: TextMetrics\r\n }[]\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.scale({ x: ['x'], y: ['y'] })\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n this.render(context)\r\n }\r\n\r\n setupTextMetricsCache() {\r\n const ctx = this.context\r\n\r\n if (\r\n (this.attrs.text !== this.lastAttrs?.text ||\r\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)) &&\r\n ctx\r\n ) {\r\n this.lastAttrs = merge({}, this.attrs)\r\n this.lines = this.getLines().map((line) => ({\r\n text: line,\r\n metrics: ctx.measureText(line),\r\n }))\r\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\r\n const lineHeight =\r\n current.metrics.actualBoundingBoxAscent +\r\n current.metrics.actualBoundingBoxDescent +\r\n (currentIndex !== this.lines.length - 1 ? PADDING.XXXS : 0)\r\n return acc + lineHeight\r\n }, 0)\r\n }\r\n }\r\n\r\n // private\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle!)\r\n context.set('textAlign', this.attrs.textAlign!)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n this.setupTextMetricsCache()\r\n }\r\n\r\n // private\r\n renderText() {\r\n if (!this.context) return\r\n let y = this.scaled.y! + this.attrs.padding.top\r\n let previousDescent = 0\r\n for (let i = 0; i < this.lines.length; i++) {\r\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.XXXS\r\n this.context.fillText(this.lines[i].text, this.scaled.x! + this.attrs.padding.left, y)\r\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\r\n }\r\n }\r\n\r\n // private\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\r\n\r\n this.context.beginPath()\r\n this.context.rect(\r\n this.scaled.x! - padding,\r\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding,\r\n this.width + padding * 2,\r\n this.measuredHeight + padding * 2\r\n )\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle!)\r\n this.renderBorder()\r\n this.context.closePath()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n // TODO\r\n // if @attrs.textBaseline == 'middle'\r\n // rect.y = @attrs.y - rect.height/2\r\n if (\r\n this.lines &&\r\n this.scaled.x! < area.scaled.x &&\r\n area.scaled.x < this.scaled.x! + this.width &&\r\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent < area.scaled.y &&\r\n area.scaled.y < this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent + this.measuredHeight\r\n ) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n if (!this.lines) {\r\n return true\r\n }\r\n\r\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\r\n const textBoxX = this.scaled.x! - padding\r\n const textBoxY = this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding\r\n const textBoxWidth = this.width + padding * 2\r\n const textBoxHeight = this.measuredHeight + padding * 2\r\n\r\n if (\r\n textBoxX <= -chart.leftOffset + chart.width &&\r\n textBoxX + textBoxWidth >= -chart.leftOffset &&\r\n textBoxY <= this.model.height &&\r\n textBoxY + textBoxHeight >= 0\r\n ) {\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x! += x\r\n this.attrs.y! += y\r\n }\r\n}\r\n\r\nexport default ScaledText\r\n","import { PaneArea, RequireByKey, TextAttrs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport Element, { TodoModalConfig } from './element'\r\n\r\nexport interface Area {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport type ITextAttrs = RequireByKey & Partial\r\n\r\nconst DEFAULTS: Partial = {\r\n text: '',\r\n font: {\r\n size: 20,\r\n family: 'Arial',\r\n style: 'normal',\r\n weight: 'normal',\r\n },\r\n lineHeight: 20,\r\n // left | right | center | start | end\r\n textAlign: TextAlign.left,\r\n // top | hanging | middle | alphabetic | ideographic | bottom\r\n textBaseline: TextBaseline.alphabetic,\r\n padding: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n}\r\n\r\nclass Text extends Element {\r\n static type = CanvasElementType.text\r\n\r\n static getMergedPropsWithDefaults>(\r\n propKey: T,\r\n props: Partial = {}\r\n ) {\r\n return {\r\n ...DEFAULTS[propKey],\r\n ...Object.entries(props).reduce((acc, [key, value]) => (value ? { ...acc, [key]: value } : acc), {}),\r\n }\r\n }\r\n\r\n name = 'Anchored text'\r\n declare context?: CanvasRenderingContext2D\r\n declare width: number\r\n declare height: number\r\n declare font: string\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n // TODO: revisit this getter, when you call `this.width` you don't expect/want context change\r\n if (this.context) {\r\n this.setupContext(this.context)\r\n }\r\n return this.measure() + this.attrs.padding.left + this.attrs.padding.right\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const count = this.getLines().length\r\n return this.attrs.lineHeight * count + this.attrs.padding.top + this.attrs.padding.bottom\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'font', {\r\n get() {\r\n const f = this.attrs.font\r\n return `${f.style} ${f.weight} ${f.size}pt ${f.family}`\r\n },\r\n })\r\n }\r\n\r\n getModalConfigBase() {\r\n return {\r\n inputs: [\r\n { type: 'multiline_string', name: 'text', required: true },\r\n { type: 'font', name: 'font' },\r\n {\r\n type: 'background',\r\n name: 'fillStyle',\r\n label: 'Color',\r\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n {\r\n type: 'background',\r\n name: 'background',\r\n label: 'Background',\r\n default: 'rgba(0,0,0,0)',\r\n },\r\n {\r\n type: 'border',\r\n name: 'border',\r\n min: 0,\r\n default: { color: 'rgba(0,0,0)', width: 0 },\r\n },\r\n ],\r\n } as unknown as TodoModalConfig\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n ...DEFAULTS,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (obj.font?.size && !obj.lineHeight) {\r\n this.attrs.lineHeight = Math.max(obj.font.size, this.attrs.lineHeight)\r\n }\r\n return this\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n this.setupContext(context)\r\n if (this.attrs.angle && this.context) {\r\n // TODO background & multiline text\r\n this.context.save()\r\n this.context.translate(this.attrs.x!, this.attrs.y!)\r\n this.context.rotate((this.attrs.angle * Math.PI) / 180)\r\n this.context.fillText(this.attrs.text, 0, 0)\r\n this.context.restore()\r\n } else {\r\n this.renderBackground()\r\n this.renderText()\r\n }\r\n }\r\n\r\n measure(context?: CanvasRenderingContext2D) {\r\n if (context) {\r\n this.setupContext(context)\r\n }\r\n const lines = this.getLines()\r\n let max = 0\r\n for (const line of lines) {\r\n max = Math.max(this.context?.measureText(line).width ?? Number.MIN_SAFE_INTEGER, max)\r\n }\r\n return ~~max\r\n }\r\n\r\n isInArea(testArea: PaneArea) {\r\n const area = this.convertArea(testArea)\r\n // TODO iny align\r\n if (\r\n this.attrs.x! < area.x &&\r\n area.x < this.attrs.x! + this.width &&\r\n this.attrs.y! - this.attrs.font.size < area.y &&\r\n area.y < this.attrs.y! - this.attrs.font.size + this.height\r\n ) {\r\n return true\r\n }\r\n return super.isInArea(testArea)\r\n }\r\n\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle)\r\n context.set('textAlign', this.attrs.textAlign)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n }\r\n\r\n getLines() {\r\n return this.attrs.text.toString().split('\\n')\r\n }\r\n\r\n renderText() {\r\n if (!this.context) return\r\n let { y } = this.attrs // + @attrs.padding.top\r\n for (const line of this.getLines()) {\r\n this.context.fillText(line, this.attrs.x! + this.attrs.padding.left, y!)\r\n y! += this.attrs.lineHeight\r\n }\r\n }\r\n\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n\r\n const { width } = this\r\n const { height } = this\r\n const rawHight = height - this.attrs.padding.top - this.attrs.padding.bottom\r\n const { x } = this.attrs\r\n let y = this.attrs.y! - height\r\n\r\n if (this.attrs.textBaseline === 'middle') {\r\n y = this.attrs.y! - rawHight / 2 - this.attrs.padding.top - 1\r\n } else if (this.attrs.textBaseline === 'alphabetic') {\r\n y = this.attrs.y! - this.attrs.lineHeight\r\n }\r\n\r\n this.context.beginPath()\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.rect(x!, y, width, height)\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle)\r\n this.renderBorder()\r\n this.context.closePath()\r\n }\r\n\r\n renderBorder() {\r\n const { lineWidth = 0, strokeStyle, border } = this.attrs\r\n const borderWidth = border?.width ?? 0\r\n\r\n if ((lineWidth || this.attrs.strokeStyle || borderWidth > 0) && this.context) {\r\n this.context.set('strokeStyle', strokeStyle ?? border?.color ?? '')\r\n this.context.set('lineWidth', Math.max(lineWidth, borderWidth))\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n private convertArea(area: PaneArea) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n return {\r\n x: this.model.scale.x(area.x) + this.model.chart().leftOffset + ChartSettings.left.width,\r\n y: this.model.scale.y(area.y) + ChartSettings.top.height,\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x! += this.model.scale.x(x) + 1\r\n this.attrs.y! += this.model.scale.y(y) - this.model.scale.y(0)\r\n }\r\n\r\n getHeight() {\r\n return this.height\r\n }\r\n}\r\n\r\nText.initClass()\r\n\r\nexport default Text\r\n","import { PaneArea, ResizeByThumbFuncProps, ThumbType } from '../../types/shared'\r\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\n\r\ntype Area = PaneArea\r\ntype ResizeFunc = (props: ResizeByThumbFuncProps) => void\r\ntype ScaleFunc = () => number\r\n\r\nclass Thumb {\r\n type: ThumbType\r\n lastX = 0\r\n lastY = 0\r\n fx: ScaleFunc\r\n fy: ScaleFunc\r\n resize: ResizeFunc\r\n model: PaneModel\r\n\r\n constructor(type: ThumbType, fx: ScaleFunc, fy: ScaleFunc, resize: ResizeFunc, model: PaneModel) {\r\n this.type = type\r\n this.fx = fx\r\n this.fy = fy\r\n this.resize = resize\r\n this.model = model\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n context.set('fillStyle', ThumbSettings.color)\r\n context.set('strokeStyle', ThumbSettings.borderColor)\r\n context.set('lineWidth', ThumbSettings.borderWidth)\r\n const x = ~~this.x()\r\n const y = ~~this.y()\r\n const thumbWidth = this.getThumbWidth()\r\n const offset = getOffsetFromLineWidth(ThumbSettings.borderWidth)\r\n context.beginPath()\r\n context.rect(x + offset, y + offset, thumbWidth, thumbWidth)\r\n context.fill()\r\n context.stroke()\r\n }\r\n\r\n startEditing(area: Area) {\r\n this.lastX = area.x\r\n return (this.lastY = area.y)\r\n }\r\n\r\n moveTo(area: Area) {\r\n const difX = area.x - this.lastX\r\n const difY = area.y - this.lastY\r\n this.resize({ type: this.type, difX, difY, area })\r\n this.lastX = area.x\r\n this.lastY = area.y\r\n }\r\n\r\n isInArea(area: Area) {\r\n const width = this.model.scale.x.invert(this.getThumbWidth())\r\n const height = this.model.scale.y.invert(0) - this.model.scale.y.invert(this.getThumbWidth())\r\n // +- width/2 because we have coordinates of a center\r\n if (\r\n this.fx() + width / 2 >= area.x &&\r\n this.fx() - width / 2 <= area.x &&\r\n this.fy() + height / 2 > area.y &&\r\n this.fy() - height / 2 < area.y\r\n ) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n getThumbWidth() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return ThumbSettings.size + ThumbSettings.borderWidth * 2\r\n }\r\n\r\n x() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return this.model.scale.x(this.fx()) - ThumbSettings.size / 2\r\n }\r\n\r\n y() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return this.model.scale.y(this.fy()) - ThumbSettings.size / 2\r\n }\r\n}\r\n\r\nexport default Thumb\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ITriangleAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n fill: string\r\n border: string\r\n}\r\n\r\nclass Triangle extends Element {\r\n static type = CanvasElementType.triangle\r\n\r\n declare scaled: Pick\r\n name = 'Triangle'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x3,\r\n () => this.attrs.y3,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return { fill: ElementSettings.defaultFill, border: ElementSettings.Colors.border } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, x3, y1, y2, y3 })\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n const offset = this.getShouldRenderThumbs() ? getOffsetFromLineWidth(1) : 0\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.lineTo(roundedXY.x3, roundedXY.y3)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.fill()\r\n context.translate(offset * -1, offset * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n context.set('strokeStyle', this.attrs.border)\r\n context.stroke()\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.x3 += x\r\n this.attrs.y3 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'a':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'b':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'c':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const polygon = [1, 2, 3].map((i) => ({\r\n x: this.scaled[`x${i}` as 'x1' | 'x2' | 'x3'],\r\n y: this.scaled[`y${i}` as 'y1' | 'y2' | 'y3'],\r\n }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nTriangle.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill' }],\r\n}\r\n\r\nexport default Triangle\r\n","import { RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\r\n\r\nclass VerticalLine extends ScaledLine {\r\n static type = CanvasElementType.verticalLine\r\n\r\n name = 'Vertical line'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.renderContent = this.renderContent.bind(this)\r\n\r\n this.attrs.x2 = this.attrs.x1\r\n this._thumbs = [this._thumbs[0]]\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const domain = this.model.scale.y.domain()\r\n this.attrs.y1 = domain[0]\r\n this.attrs.y2 = domain[1]\r\n this._thumbs[0].fy = () => (this.attrs.y1 + this.attrs.y2) / 2\r\n super.renderContent(context)\r\n }\r\n\r\n moveBy(x: number) {\r\n return (this.attrs.x1 = this.attrs.x2 += x)\r\n }\r\n\r\n resize({ difX }: RequireByKey) {\r\n return this.moveBy(difX)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n return super.getIsInChartView(chart, { omitY: true })\r\n }\r\n}\r\n\r\nexport default VerticalLine\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IXABCDPositionAttrs {\r\n xx: number\r\n xy: number\r\n ax: number\r\n ay: number\r\n bx: number\r\n by: number\r\n cx: number\r\n cy: number\r\n dx: number\r\n dy: number\r\n}\r\n\r\ntype xPoints = 'xx' | 'ax' | 'bx' | 'cx' | 'dx'\r\ntype yPoints = 'xy' | 'ay' | 'by' | 'cy' | 'dy'\r\n\r\nexport interface IXABCDAttrs extends IXABCDPositionAttrs {\r\n fill: string\r\n border: DrawingBorder\r\n lineWidth: number\r\n}\r\n\r\nclass XABCD extends Element {\r\n static type = CanvasElementType.xabcd\r\n\r\n name = 'XABCD pattern'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'x',\r\n () => this.attrs.xx,\r\n () => this.attrs.xy,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.ax,\r\n () => this.attrs.ay,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.bx,\r\n () => this.attrs.by,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.cx,\r\n () => this.attrs.cy,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'd',\r\n () => this.attrs.dx,\r\n () => this.attrs.dy,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n if (this.attrs.lineWidth == null) {\r\n this.attrs.lineWidth = 1\r\n }\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({\r\n x: ['xx', 'ax', 'bx', 'cx', 'dx'],\r\n y: ['xy', 'ay', 'by', 'cy', 'dy'],\r\n })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { xx, xy, ax, ay, bx, by, cx, cy, dx, dy } = this.scaled\r\n const roundedXY = getRoundedObject({ xx, xy, ax, ay, bx, by, cx, cy, dx, dy })\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.translate(offset, offset)\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.xx, roundedXY.xy)\r\n context.lineTo(roundedXY.ax, roundedXY.ay)\r\n context.lineTo(roundedXY.bx, roundedXY.by)\r\n context.lineTo(roundedXY.xx, roundedXY.xy)\r\n context.fill()\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.bx, roundedXY.by)\r\n context.lineTo(roundedXY.cx, roundedXY.cy)\r\n context.lineTo(roundedXY.dx, roundedXY.dy)\r\n context.lineTo(roundedXY.bx, roundedXY.by)\r\n context.fill()\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.ax, roundedXY.ay)\r\n context.lineTo(roundedXY.cx, roundedXY.cy)\r\n context.moveTo(roundedXY.xx, roundedXY.xy)\r\n context.lineTo(roundedXY.dx, roundedXY.dy)\r\n context.stroke()\r\n\r\n const text = new Text(\r\n {\r\n font: { size: 8, style: 'bold' },\r\n lineHeight: 8,\r\n padding: {\r\n top: 2,\r\n right: 2,\r\n bottom: 2,\r\n left: 2,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.start,\r\n fillStyle: '#ffffff',\r\n background: this.attrs.fill || '#000000',\r\n },\r\n this.model\r\n )\r\n\r\n for (const t of Array.from('xabcd')) {\r\n text\r\n .set({\r\n text: t.toUpperCase(),\r\n x: roundedXY[(t + 'x') as xPoints] - 6,\r\n y: roundedXY[(t + 'y') as yPoints] + 12,\r\n } as Partial)\r\n .render(context)\r\n }\r\n\r\n const retLabel = (y1: string, y2: string, y3: string) => {\r\n const len = Math.abs(this.attrs[(y1 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints])\r\n const ret = Math.abs(this.attrs[(y3 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints]) / len\r\n const x = (roundedXY[(y1 + 'x') as xPoints] + roundedXY[(y3 + 'x') as xPoints]) / 2\r\n const y = (roundedXY[(y1 + 'y') as yPoints] + roundedXY[(y3 + 'y') as yPoints]) / 2\r\n return text\r\n .set({\r\n text: ret.toFixed(3),\r\n x,\r\n y,\r\n })\r\n .render(context)\r\n }\r\n\r\n retLabel('x', 'a', 'b')\r\n retLabel('a', 'b', 'c')\r\n retLabel('b', 'c', 'd')\r\n retLabel('x', 'a', 'd')\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const t of Array.from('xabcd')) {\r\n this.attrs[(t + 'x') as xPoints] += x\r\n this.attrs[(t + 'y') as yPoints] += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n this.attrs[(type + 'x') as xPoints] += difX\r\n return (this.attrs[(type + 'y') as yPoints] += difY)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n let t\r\n const xab = (() => {\r\n const result = []\r\n for (t of Array.from('xab')) {\r\n result.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\r\n }\r\n return result\r\n })()\r\n const bcd = (() => {\r\n const result1 = []\r\n for (t of Array.from('bcd')) {\r\n result1.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\r\n }\r\n return result1\r\n })()\r\n if (math.pointInPolygon(area.scaled, xab) || math.pointInPolygon(area.scaled, bcd)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nXABCD.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1 },\r\n ],\r\n}\r\n\r\nexport default XABCD\r\n","import Utils from '../utils'\r\nimport { getContextWithCache } from '../utils/canvas'\r\nimport { captureException, getIsSSr } from '../utils/helpers'\r\n\r\nclass Cache {\r\n constructor() {\r\n this.canvas = getIsSSr() ? null : document.createElement('canvas')\r\n }\r\n\r\n set(callback, width, height) {\r\n this.callback = callback\r\n this.width = width\r\n this.height = height\r\n this.rendered = false\r\n }\r\n\r\n render(context, x, y) {\r\n if (x == null) {\r\n x = 0\r\n }\r\n if (y == null) {\r\n y = 0\r\n }\r\n if (!this.rendered) {\r\n this.refresh()\r\n }\r\n if (this.width < 1 || this.height < 1) {\r\n return\r\n }\r\n\r\n try {\r\n if (this.ratio >= 1 && this.canvas) {\r\n context.drawImage(\r\n this.canvas,\r\n 0,\r\n 0,\r\n ~~(this.width * this.ratio),\r\n ~~(this.height * this.ratio),\r\n x,\r\n y,\r\n this.width,\r\n this.height\r\n )\r\n } else {\r\n context.save()\r\n context.translate(x, y)\r\n this.callback(context)\r\n context.restore()\r\n }\r\n } catch (e) {\r\n captureException(\r\n e,\r\n this.canvas\r\n ? {\r\n extra: {\r\n width: this.width,\r\n height: this.height,\r\n ratio: this.ratio,\r\n cWidth: this.canvas.width,\r\n cHeight: this.canvas.height,\r\n sWidth: window.screen.width,\r\n sHeight: window.screen.height,\r\n },\r\n }\r\n : {}\r\n )\r\n }\r\n }\r\n\r\n refresh() {\r\n if (getIsSSr()) {\r\n return\r\n }\r\n this.canvas.width = this.width\r\n this.canvas.height = this.height\r\n this.context = getContextWithCache(this.canvas)\r\n this.ratio = Utils.getScaleRatio()\r\n Utils.setSizeOnCanvasElement({ canvasElement: this.canvas, width: this.width, height: this.height })\r\n this.context.scale(this.ratio, this.ratio)\r\n\r\n this.callback(this.context)\r\n this.rendered = true\r\n }\r\n}\r\n\r\nexport default Cache\r\n","import { ObjectHash, Theme } from '../../../types/shared'\r\nimport { TextAlign, TextBaseline } from '../../constants/common'\r\nimport { IChartThemeColors, IElementThemeColors, IIndicatorThemeColors } from '../constants'\r\n\r\nexport enum OHLCType {\r\n singleLine = 'singleLine',\r\n dateOnly = 'dateOnly',\r\n timeOnly = 'timeOnly',\r\n}\r\n\r\nexport interface IMargin {\r\n top?: number\r\n right?: number\r\n bottom?: number\r\n left?: number\r\n}\r\n\r\ninterface IPadding {\r\n top?: number\r\n right?: number\r\n bottom?: number\r\n left?: number\r\n}\r\n\r\ninterface IGenericText {\r\n margin: IMargin\r\n font: IFont\r\n}\r\n\r\ninterface IFont {\r\n size?: number\r\n style?: string\r\n weight?: string\r\n family?: string\r\n lineHeight?: number\r\n padding?: IPadding\r\n baseline?: TextBaseline\r\n textAlign?: TextAlign\r\n}\r\n\r\ninterface ISettingsGeneralBase {\r\n Colors: IChartThemeColors\r\n}\r\n\r\nexport interface ISettingsCenterBase {\r\n barWidth: number\r\n barMargin: number\r\n border: number\r\n volumeHeight?: number\r\n}\r\n\r\ninterface ISettingsTopBase {\r\n height: number\r\n}\r\n\r\ninterface ISettingsBottomBase {\r\n height: number\r\n}\r\n\r\ninterface ISettingsLeftBase {\r\n width: number\r\n}\r\n\r\ninterface ISettingsRightBase {\r\n width: number\r\n}\r\n\r\nexport interface ISettings {\r\n ChartSettings: IChartSettings\r\n IndicatorSettings: IIndicatorSettings\r\n MarketSentimentSettings: IMarketSentimentChartSettings\r\n ColorsSettings: Array\r\n ThumbSettings: IThumbSettings\r\n ElementSettings: IElementSettings\r\n isOurSiteRequest?: boolean\r\n}\r\n\r\nexport interface IChartSettings {\r\n general: IChartGeneral\r\n center: ISettingsCenterBase\r\n top: IChartTop\r\n bottom: IChartBottom\r\n left: IChartLeft\r\n right: IChartRight\r\n}\r\n\r\ninterface IChartGeneral {\r\n settingsHeight: number\r\n tickerTimeframeChangeHeight: number\r\n Colors: IChartThemeColors & ObjectHash\r\n}\r\n\r\ninterface IChartTop extends ISettingsTopBase {\r\n baseline: TextBaseline\r\n ticker: IGenericText\r\n ohlc: IOHLC\r\n change: IGenericText\r\n}\r\n\r\ninterface IOHLC extends IGenericText {\r\n type?: OHLCType\r\n}\r\n\r\ninterface IChartBottom extends ISettingsBottomBase {\r\n baseline: TextBaseline\r\n axis: IGenericText\r\n}\r\n\r\ninterface IChartLeft extends ISettingsLeftBase {\r\n overlayLabel: IOverlayLabel\r\n timeframe: IGenericText\r\n volumeAxis: IGenericText\r\n}\r\n\r\ninterface IOverlayLabel extends IGenericText {\r\n labelSpacing: number\r\n}\r\n\r\ninterface IChartRight extends ISettingsRightBase {\r\n axis: IGenericText\r\n}\r\n\r\nexport interface IIndicatorSettings {\r\n general: IIndicatorGeneral\r\n center: ISettingsCenterBase\r\n top: ISettingsTopBase\r\n bottom: ISettingsBottomBase\r\n left: IIndicatorLeft\r\n right: IIndicatorRight\r\n}\r\n\r\ninterface IIndicatorRight extends ISettingsRightBase {\r\n axis: IGenericText\r\n}\r\n\r\ninterface IIndicatorLeft extends ISettingsLeftBase {\r\n indicatorLabel: IIndicatorLabel\r\n}\r\n\r\ninterface IIndicatorLabel extends IGenericText {\r\n labelSpacing: number\r\n}\r\n\r\ninterface IIndicatorGeneral {\r\n Colors: IIndicatorThemeColors\r\n height: number\r\n}\r\n\r\ninterface IMarketSentimentChartSettings {\r\n general: ISettingsGeneralBase\r\n center: ISettingsCenterBase\r\n top: ISettingsTopBase\r\n bottom: ISettingsBottomBase\r\n left: ISettingsLeftBase\r\n right: ISettingsRightBase\r\n}\r\n\r\ninterface IThumbSettings {\r\n size: number\r\n touchSize: number\r\n color: string\r\n borderWidth: number\r\n borderColor: string\r\n}\r\n\r\ninterface IElementSettings {\r\n Colors: IElementThemeColors\r\n defaultFill: string\r\n defaultTransparentFill: string\r\n}\r\n","export enum ChartMinWidthBreakpoints {\r\n xs = 0,\r\n s = 480,\r\n m = 768,\r\n l = 1024,\r\n}\r\n\r\nexport function getChartBreakpoints(chartWidthInPx: number) {\r\n return {\r\n isXs: chartWidthInPx >= ChartMinWidthBreakpoints.xs,\r\n isS: chartWidthInPx >= ChartMinWidthBreakpoints.s,\r\n isM: chartWidthInPx >= ChartMinWidthBreakpoints.m,\r\n isL: chartWidthInPx >= ChartMinWidthBreakpoints.l,\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\nimport merge from 'lodash.merge'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n CustomSpineEvents,\r\n Instrument,\r\n Maybe,\r\n RequireByKey,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Cache from '../canvas/cache'\r\nimport Element from '../canvas/element'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport {\r\n CHART_MARGIN,\r\n ChartElementType,\r\n FONT_SIZE,\r\n IndicatorType,\r\n IntradayTimeframeInterval,\r\n LINE_HEIGHT,\r\n MONTHS,\r\n OFFSET,\r\n PADDING,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TIMEFRAMES_WITH_PRE_MARKET,\r\n TextAlign,\r\n TextBaseline,\r\n getTimeframeLabel,\r\n} from '../constants/common'\r\nimport {\r\n getIsSmallIndexChart,\r\n getPercentageFromValue,\r\n getTranslate,\r\n getValueFromPercentage,\r\n} from '../controllers/renderUtils'\r\nimport Chart from '../models/chart'\r\nimport { getColorOverwrites } from '../models/chart_settings'\r\nimport { ISettings, OHLCType } from '../models/chart_settings/interfaces'\r\nimport { darkerWickColors, thinBarColorsOverride } from '../models/constants'\r\nimport mouseModel from '../models/mouse'\r\nimport PaneModel, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Overlay from '../overlays/overlay'\r\nimport { overlaysByType } from '../overlays/overlays'\r\nimport utils, { dateFromDateString, isRedesignedPage, numberToStringWithUnitsSuffix } from '../utils'\r\nimport {\r\n ITickerChange,\r\n getBarWidthWithMargin,\r\n getBarWithoutMarginWidth,\r\n getChangeColor,\r\n getHalfBarWidth,\r\n getShouldUseDarkerWickColors,\r\n getTickerChange,\r\n getTickerChangeFromCloseValues,\r\n getVirtualTimeframeTradedDates,\r\n renderCross,\r\n round,\r\n unmountCanvas,\r\n} from '../utils/chart'\r\nimport { convertColorToHEX, getHEXWithSpecificAplha, getHSVAFromColor, stringifyHSVAColor } from '../utils/colors'\r\nimport { setElementCursor } from '../utils/cursor'\r\nimport { drawInVisibleArea, getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { getChartBreakpoints } from './utils'\r\n\r\nexport interface BaseChartAttrs {\r\n overlays: Required['overlays']\r\n}\r\n\r\ntype OhlcLineElements = Array<{ text: string; color: string } | 'space'>\r\n\r\ninterface LastOHLCAttrs {\r\n text: string\r\n x: number\r\n y: number\r\n width: number\r\n textBaseline: TextBaseline\r\n textAlign: TextAlign\r\n}\r\n\r\ninterface IRenderOHLCParameters {\r\n context: CanvasRenderingContext2D\r\n date: Maybe\r\n open?: Maybe\r\n high?: Maybe\r\n low?: Maybe\r\n close?: Maybe\r\n volume?: Maybe\r\n afterHour?: string\r\n isSmallIndexChart?: boolean\r\n isNewestOHLC?: boolean\r\n directRender?: boolean\r\n time?: string\r\n changePercentage?: Maybe\r\n}\r\n\r\ninterface XAxisLabel {\r\n x: number\r\n text: string\r\n textWidth: number\r\n hasPriority?: boolean\r\n allowedOverflow?: number\r\n}\r\n\r\ninterface IRenderXAxisProps {\r\n textRenderer: Text\r\n startBarIndex: number\r\n endBarIndex: number\r\n}\r\n\r\nconst getDateString = ({ date, timeframe }: { date: Date; timeframe: TIMEFRAME }) => {\r\n let dateString = ''\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n case TIMEFRAME.i10:\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n const t =\r\n (((date.getHours() + 11) % 12) + 1).toString().padLeft('00') +\r\n ':' +\r\n date.getMinutes().toString().padLeft('00') +\r\n (date.getHours() < 12 ? 'AM' : 'PM')\r\n dateString = `${MONTHS[month]} ${day} ${t}`\r\n break\r\n case TIMEFRAME.d:\r\n case TIMEFRAME.w:\r\n dateString = `${MONTHS[month]} ${day}`\r\n break\r\n case TIMEFRAME.m:\r\n dateString = `${MONTHS[month]} ${year}`\r\n break\r\n default:\r\n break\r\n }\r\n\r\n return dateString\r\n}\r\n\r\nconst getIsOverlapping = ({\r\n x,\r\n textWidth,\r\n renderedLabelRanges,\r\n}: {\r\n x: number\r\n textWidth: number\r\n renderedLabelRanges: Array<{ from: number; to: number }>\r\n}) =>\r\n renderedLabelRanges.some(({ from, to }) => {\r\n const minX = x - textWidth / 2\r\n const maxX = x + textWidth / 2\r\n return (from < maxX && maxX < to) || (from < minX && minX < to)\r\n })\r\n\r\nfunction getClosestDifferentMinMaxValueIndices(\r\n currentMinIndex: number,\r\n currentMaxIndex: number,\r\n high: number[],\r\n low: number[]\r\n): { minIndex: number; maxIndex: number } {\r\n const hasPreviousIndex = currentMinIndex > 0\r\n const hasNextIndex = currentMaxIndex < high.length - 1\r\n let minIndex = currentMinIndex\r\n let maxIndex = currentMaxIndex\r\n if (hasPreviousIndex) {\r\n minIndex -= 1\r\n }\r\n if (hasNextIndex) {\r\n maxIndex += 1\r\n }\r\n\r\n if (low[minIndex] === high[maxIndex] && (hasPreviousIndex || hasNextIndex)) {\r\n return getClosestDifferentMinMaxValueIndices(minIndex, maxIndex, high, low)\r\n }\r\n\r\n return low[minIndex] < high[maxIndex] ? { minIndex, maxIndex } : { minIndex: maxIndex, maxIndex: minIndex }\r\n}\r\n\r\nconst SMALL_INDEX_CHART_LABEL_BUFFER = 15\r\n\r\nconst gray300 = tailwindColors.gray[300]\r\n\r\nclass BaseChart extends Element {\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\r\n return this.model.width - ChartSettings.left.width - ChartSettings.right.width\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\r\n return this.paneModel.height - ChartSettings.top.height - ChartSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n static getNumOfBarsBuffer({ overlays }: RequireByKey) {\r\n return Math.max(0, ...overlays.map((overlay) => overlaysByType[overlay.type].getNumOfBarsBuffer(overlay)))\r\n }\r\n\r\n static label = 'Chart'\r\n static iconName = ''\r\n\r\n paneModel: PaneModel\r\n model: Chart\r\n data: Quote\r\n specificChartFunctionality: SpecificChartFunctionality\r\n tickerWidth = 0\r\n changeWidth = 0\r\n lastOhlc: Array> = []\r\n overlays: Overlay[] = []\r\n isLargeChart?: boolean\r\n shouldRenderVolume = true\r\n afterChange: {\r\n x: number\r\n y: number\r\n width: number\r\n } | null = null\r\n\r\n declare setupAxisTimeFrame: string\r\n declare volumeFY: d3.ScaleLinear\r\n declare tickerText: Text\r\n declare baseCache: Cache\r\n declare leftOffset: number\r\n declare context: CanvasRenderingContext2D\r\n declare width: number\r\n declare height: number\r\n declare isMobile: boolean\r\n\r\n constructor(values: Partial, paneModel: PaneModel) {\r\n super(values, paneModel)\r\n\r\n this.paneModel = paneModel\r\n this.model = this.paneModel.chart()\r\n this.data = this.model.quote()\r\n const chartLayoutModel = this.model.chart_layout()\r\n this.specificChartFunctionality = chartLayoutModel.specificChartFunctionality\r\n this.isLargeChart = chartLayoutModel.isLargeChart\r\n this.isMobile = utils.isMobile(true)\r\n\r\n this.overlays = []\r\n if (values.overlays) {\r\n for (const overlayDefinition of values.overlays) {\r\n // overlayDefinition.color coming from DB is always string however overlays\r\n // internaly didn't use format as in db (type, color, period) but rather\r\n // more overlay specific parameters eg. (BB: topColor, bottomColor, etc.)\r\n // thus overlayDefinition.color might be undefined\r\n // approach could be reworked in https://github.com/finvizhq/charts/issues/770\r\n // but for now (!overlayDefinition.color) check solve issue as well\r\n const overlay = overlaysByType[overlayDefinition.type].fromObject(\r\n {\r\n ...overlayDefinition,\r\n color:\r\n !overlayDefinition.color || overlayDefinition.color.includes('|')\r\n ? ''\r\n : convertColorToHEX(overlayDefinition.color),\r\n },\r\n this.paneModel\r\n )\r\n this.addOverlay(overlay)\r\n }\r\n delete values.overlays\r\n }\r\n\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderCrossText = this.renderCrossText.bind(this)\r\n this.setupCache = this.setupCache.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n\r\n // this.paneModel.bind('update', this.setupAxis.bind(this))\r\n this.paneModel.bind('update', this.setupCache)\r\n this.paneModel.bind('change', this.trigger.bind(this, 'change'))\r\n this.model = this.paneModel.chart()\r\n // this.model.bind('change', this.setupAxis.bind(this))\r\n this.model.bind('change', this.setupCache)\r\n this.model.bind('change', this.trigger.bind(this, 'change'))\r\n this.model.bind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\r\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\r\n this.model.bind('destroy', () => {\r\n this.model.unbind('change', this.setupCache)\r\n this.model.unbind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\r\n mouseModel.unbind('change', mouseModelChangeHandler)\r\n unmountCanvas(this.baseCache.canvas)\r\n })\r\n mouseModel.bind('change', mouseModelChangeHandler)\r\n\r\n this.model.chart_layout().bind('theme', this.setupCache)\r\n this.model.chart_layout().bind('update', this.updateShouldRenderVolume.bind(this))\r\n\r\n this.setupCache()\r\n }\r\n\r\n renderChart() {\r\n throw Error('Implement renderChart')\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n this.data = this.model.quote()\r\n this.leftOffset = this.model.leftOffset\r\n this.context = context\r\n\r\n if (this.data.close.length === 0) {\r\n this.renderChartNotAvailable()\r\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\r\n return\r\n }\r\n\r\n this.context.save()\r\n this.clip()\r\n this.renderVolume()\r\n this.renderChart()\r\n this.renderOverlays()\r\n this.renderPrevClose()\r\n this.renderFadeExtendedHours()\r\n this.context.restore()\r\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\r\n }\r\n\r\n renderGrid(context: CanvasRenderingContext2D) {\r\n this.data = this.model.quote()\r\n this.leftOffset = this.model.leftOffset\r\n this.context = context\r\n // text, xAxis, volumeAxis\r\n this.renderXAxis()\r\n this.baseCache.render(context)\r\n }\r\n\r\n renderTicker(context: CanvasRenderingContext2D) {\r\n if (this.tickerText) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n context.translate(ChartSettings.left.width, 0)\r\n this.tickerText.render(context)\r\n\r\n if (getIsSmallIndexChart(this.specificChartFunctionality) && this.data.ticker === 'RUSSELL 2000') {\r\n const { Colors } = ChartSettings.general\r\n new Text(\r\n {\r\n text: 'ETF',\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top! + FONT_SIZE.XXS + OFFSET.XXS,\r\n font: { size: FONT_SIZE.XXS },\r\n fillStyle: Colors.text,\r\n textBaseline: ChartSettings.top.baseline,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n context.translate(-ChartSettings.left.width, 0)\r\n }\r\n }\r\n\r\n renderTimeframe(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const quote = this.model.quote()\r\n const y = (this.height - this.volumeFY.range()[1] - 4) / 2\r\n\r\n return new Text(\r\n {\r\n text: quote.instrument === Instrument.Group ? 'YEAR PERFORMANCE %' : getTimeframeLabel(quote.timeframe),\r\n x: ChartSettings.left.timeframe.margin.left,\r\n y: ChartSettings.top.height + y + (ChartSettings.left.timeframe.margin.top ?? 0),\r\n angle: -90,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.timeframe.font),\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings, isOurSiteRequest } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n context.save()\r\n context.translate(ChartSettings.left.width, 0)\r\n\r\n if (!getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.tickerText = new Text(\r\n {\r\n text: this.data.name || this.data.ticker,\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.ticker.font),\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: Colors.text,\r\n },\r\n this.paneModel\r\n )\r\n } else {\r\n this.tickerText = new Text(\r\n {\r\n text: this.data.name || this.data.ticker,\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top,\r\n font: { size: FONT_SIZE.L, style: 'bold' },\r\n fillStyle: Colors.text,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n this.tickerWidth = this.tickerText.measure(context)\r\n\r\n // render watermark on backend chart\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n let yOffset = 0\r\n if (!isOurSiteRequest) {\r\n yOffset = this.isLargeChart ? -2 : -3\r\n }\r\n new Text(\r\n {\r\n text: '© finviz.com',\r\n x: this.width + ChartSettings.right.width - 2,\r\n y: 1 + yOffset,\r\n font: { size: isOurSiteRequest ? FONT_SIZE.XS : FONT_SIZE.M },\r\n textAlign: TextAlign.right,\r\n textBaseline: TextBaseline.top,\r\n fillStyle: isOurSiteRequest ? 'rgb(136, 193, 233)' : tailwindColors.finviz.blue,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderChange({ context })\r\n if (!this.lastOhlc[0]) {\r\n this.getOHLC({ context, directRender: false })\r\n }\r\n this.getOHLC({ context })\r\n }\r\n\r\n context.restore()\r\n if (!this.getIsRedesignedChart() && !getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderTimeframe(context)\r\n }\r\n }\r\n\r\n getOHLC({\r\n context,\r\n directRender = true,\r\n data,\r\n date,\r\n dateString = null,\r\n changePercentage = null,\r\n }: {\r\n context: CanvasRenderingContext2D\r\n directRender?: boolean\r\n data?: {\r\n open?: string\r\n high?: string\r\n low?: string\r\n close?: string\r\n volume?: string\r\n }\r\n date?: Date\r\n dateString?: string | null\r\n changePercentage?: ITickerChange | null\r\n }) {\r\n if (!this.data.lastDate) return\r\n\r\n // modulo \"parsing\" is 100% faster than with str.slice()\r\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${this.data.lastDate % 100}` // YYYYMMDD / 20211118 => Nov 18\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderOHLC({\r\n context,\r\n date: lastDate,\r\n isSmallIndexChart: true,\r\n isNewestOHLC: true,\r\n directRender,\r\n })\r\n } else if (data && date) {\r\n this.renderOHLC({\r\n context,\r\n date: getDateString({ date, timeframe: this.data.timeframe }),\r\n open: data.open,\r\n high: data.high,\r\n low: data.low,\r\n close: data.close,\r\n volume: numberToStringWithUnitsSuffix(Number(data.volume)),\r\n directRender,\r\n changePercentage,\r\n })\r\n } else if (dateString !== null) {\r\n this.renderOHLC({\r\n context,\r\n date: dateString,\r\n open: null,\r\n high: null,\r\n low: null,\r\n close: null,\r\n volume: null,\r\n directRender,\r\n })\r\n } else {\r\n this.renderOHLC({\r\n context,\r\n date: lastDate,\r\n afterHour:\r\n Number.isFinite(this.data.afterClose) && this.data.afterClose !== this.data.lastClose\r\n ? this.roundOhlc(this.data.afterClose)\r\n : undefined,\r\n volume: numberToStringWithUnitsSuffix(this.data.lastVolume),\r\n isNewestOHLC: true,\r\n time: utils.dateFromUnixTimestamp(this.data.date.last()!).toLocaleTimeString('en-US', {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n }),\r\n directRender,\r\n ...this.getRoundedLastData(),\r\n })\r\n }\r\n }\r\n\r\n getRoundedLastData() {\r\n return {\r\n open: this.roundOhlc(this.data.lastOpen),\r\n high: this.roundOhlc(this.data.lastHigh),\r\n low: this.roundOhlc(this.data.lastLow),\r\n close: this.roundOhlc(this.data.lastClose),\r\n }\r\n }\r\n\r\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabelsQuotePage(context)\r\n } else if (this.data.close.length !== 0) {\r\n this.renderOverlaysLabelsChartsPage(context)\r\n }\r\n }\r\n\r\n renderOverlaysLabelsQuotePage(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const text = new Text(\r\n {\r\n x: ChartSettings.left.overlayLabel.margin.left,\r\n y: ChartSettings.top.height + ChartSettings.left.overlayLabel.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.overlayLabel.font),\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n for (const overlay of this.overlays) {\r\n if (!overlay.isRenderedOverlaysLabel()) {\r\n continue\r\n }\r\n text\r\n .set({\r\n text: overlay.toString(),\r\n y: text.get('y')! + ChartSettings.left.overlayLabel.labelSpacing,\r\n fillStyle: overlay.getLabelColor(),\r\n })\r\n .render(context)\r\n }\r\n }\r\n\r\n getYAxisLeftMargin() {\r\n if (this.data.instrument === Instrument.Crypto && this.data.lastClose <= 0.001) {\r\n return 3\r\n }\r\n return 8\r\n }\r\n\r\n getYAxisLastCloseLabel({ lastClose, firstVisibleClose }: { lastClose: number; firstVisibleClose?: number | null }) {\r\n if (typeof firstVisibleClose === 'number' && this.model.scale === ScaleType.Percentage) {\r\n return `${this.round(getPercentageFromValue({ number: lastClose, base: firstVisibleClose }), 2)}%`\r\n }\r\n return this.round(lastClose)\r\n }\r\n\r\n renderYAxis(\r\n context: CanvasRenderingContext2D,\r\n { lastClose }: RequireByKey, 'lastClose'> = this.data,\r\n renderLabels = true\r\n ) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let y, lineTicks, textTicks, lastCloseLabel\r\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\r\n translate.do()\r\n const tickCount = Math.floor(this.paneModel.height / 35)\r\n const minMax = this.getMinMax()\r\n const { firstVisibleClose } = minMax\r\n const height = this.height\r\n let stepPrice = 0\r\n let placesAxis\r\n\r\n switch (this.model.scale) {\r\n case ScaleType.Percentage: {\r\n if (!firstVisibleClose) return\r\n\r\n const scaleRange = this.paneModel.scaleRange\r\n const { min, max } = scaleRange || minMax\r\n\r\n this.model.updateAttribute('firstBarClose', firstVisibleClose)\r\n\r\n const minPerc = getPercentageFromValue({ number: min, base: firstVisibleClose })\r\n const maxPerc = getPercentageFromValue({ number: max, base: firstVisibleClose })\r\n\r\n const percScale = d3.scaleLinear().range([0, this.height]).domain([maxPerc, minPerc]).nice(10)\r\n textTicks = percScale.ticks(Math.min(tickCount, 9))\r\n lineTicks = textTicks.map((tick) => getValueFromPercentage({ number: tick, base: firstVisibleClose }))\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\r\n break\r\n }\r\n case ScaleType.Logarithmic: {\r\n if (!firstVisibleClose) return\r\n\r\n const scaleRange = this.paneModel.scaleRange\r\n const { min, max } = scaleRange || minMax\r\n lineTicks = [Math.floor(min)]\r\n const pixelGap = 30\r\n\r\n const negativeScale = []\r\n if (min < 0) {\r\n let previousNegativeTick = Math.min(0, max)\r\n while (this.paneModel.scale.y(previousNegativeTick) + pixelGap < this.paneModel.scale.y(min)) {\r\n const tick = this.paneModel.scale.y.invert(this.paneModel.scale.y(previousNegativeTick) + pixelGap)\r\n if (previousNegativeTick === tick) {\r\n break\r\n }\r\n const range = d3.nice(-previousNegativeTick, -tick, 2)\r\n previousNegativeTick = -range[range.length - 1]\r\n negativeScale.unshift(previousNegativeTick)\r\n }\r\n }\r\n\r\n const positiveScale = []\r\n if (max > 0) {\r\n positiveScale.push(Math.max(this.paneModel.scale.y.invert(this.paneModel.scale.y(min) + pixelGap), 0))\r\n }\r\n while (this.paneModel.scale.y(positiveScale[positiveScale.length - 1]) - pixelGap > 0) {\r\n const previousTick = positiveScale[positiveScale.length - 1]\r\n const positiveScaleY = this.paneModel.scale.y(positiveScale[positiveScale.length - 1])\r\n const tick = this.paneModel.scale.y.invert(positiveScaleY - pixelGap)\r\n if (previousTick === tick) {\r\n break\r\n }\r\n\r\n const range = d3.nice(previousTick, tick, 2)\r\n positiveScale.push(range[range.length - 1])\r\n }\r\n lineTicks = [...negativeScale, ...positiveScale]\r\n textTicks = lineTicks\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\r\n break\r\n }\r\n default:\r\n // default to linear scale type\r\n lineTicks = this.paneModel.scale.y.ticks(Math.min(tickCount, 9))\r\n textTicks = lineTicks\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\r\n }\r\n\r\n if (textTicks.length >= 2) {\r\n stepPrice = Math.abs(textTicks[1] - textTicks[0])\r\n }\r\n if (\r\n stepPrice > 10 ||\r\n (getIsSmallIndexChart(this.specificChartFunctionality) && Math.round(textTicks[0]).toString().length > 3) // if small index chart max tick is less than 999 (3 digits) allow for decimals in axis labels\r\n ) {\r\n placesAxis = 0\r\n }\r\n\r\n const getYLineText = (val: number, places?: number) => {\r\n switch (this.model.scale) {\r\n case ScaleType.Percentage:\r\n return `${val}%`\r\n default:\r\n return this.round(val, places)\r\n }\r\n }\r\n\r\n const yTickText = new Text(\r\n {\r\n x: this.width + this.getYAxisLeftMargin() + ChartSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n )\r\n\r\n let yTickLine = this.getYLine()\r\n const resetYTicksStyles = () => {\r\n yTickText.set({\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n })\r\n yTickLine = this.getYLine()\r\n }\r\n for (let i = 0; i < lineTicks.length; i++) {\r\n y = Math.round(this.fy(lineTicks[i]))\r\n if (y < 0 || y > height) continue\r\n if (y === height) y -= 1 // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate, to compensate for this we subtract 1px\r\n yTickLine.set({ y1: y, y2: y })\r\n yTickText.set({\r\n text: getYLineText(textTicks[i], placesAxis),\r\n y,\r\n })\r\n if (this.model.scale === ScaleType.Percentage && textTicks[i] === 0) {\r\n yTickLine.set({ strokeStyle: Colors.text })\r\n yTickText.set({\r\n font: { weight: 'bold', size: yTickText.attrs.font.size },\r\n fillStyle: Colors.percentageZeroLineText,\r\n })\r\n yTickLine.render(context)\r\n yTickText.render(context)\r\n resetYTicksStyles()\r\n } else {\r\n yTickLine.render(context)\r\n yTickText.render(context)\r\n }\r\n }\r\n translate.undo()\r\n\r\n if (renderLabels) {\r\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: lastCloseLabel })\r\n // if (typeof this.data.afterClose === 'number') {\r\n // this.renderYAxisLabel({\r\n // context,\r\n // yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\r\n // mainLabelValue: lastClose,\r\n // secondaryLabelValue: this.data.afterClose,\r\n // }),\r\n // label: this.getYAxisLastCloseLabel({ lastClose: this.data.afterClose, firstVisibleClose }),\r\n // background: this.getSecondaryLabelBackgroundColor(),\r\n // })\r\n // }\r\n }\r\n }\r\n\r\n getSecondaryLabelBackgroundColor() {\r\n return stringifyHSVAColor(\r\n {\r\n ...getHSVAFromColor(this.getChartLayoutSettings().ChartSettings.general.Colors.currentBackground),\r\n s: 0.3,\r\n },\r\n 'hex'\r\n )\r\n }\r\n\r\n getYAxisSecondaryLabelYCoordinate({\r\n mainLabelValue,\r\n secondaryLabelValue,\r\n }: {\r\n mainLabelValue: number\r\n secondaryLabelValue: number\r\n }) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { lineHeight } = ChartSettings.right.axis.font\r\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\r\n\r\n const direction = Math.sign(mainLabelValue - secondaryLabelValue) || 1\r\n const offset = (lineHeight ?? LINE_HEIGHT.S) + (padding.top ?? PADDING.XXS) + (padding.bottom ?? PADDING.XXS)\r\n const mainLabelValuePosition = Math.round(this.fy(mainLabelValue))\r\n const secondaryLabelValuePosition = Math.round(this.fy(secondaryLabelValue))\r\n const offsetedY = mainLabelValuePosition + offset * direction\r\n\r\n return Math.abs(secondaryLabelValuePosition - mainLabelValuePosition) > offset\r\n ? secondaryLabelValuePosition\r\n : offsetedY\r\n }\r\n\r\n renderYAxisLabel({\r\n context,\r\n yCoordinate,\r\n label,\r\n background,\r\n }: {\r\n context: CanvasRenderingContext2D\r\n yCoordinate: number\r\n label: string\r\n background?: string\r\n }) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\r\n const { Colors } = ChartSettings.general\r\n const { size, lineHeight } = ChartSettings.right.axis.font\r\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\r\n\r\n translate.do()\r\n new Text(\r\n {\r\n text: label,\r\n x: this.width + this.getYAxisLeftMargin() - padding.left + ChartSettings.right.axis.margin.left!,\r\n y: yCoordinate,\r\n font: Text.getMergedPropsWithDefaults('font', { size, style: 'bold' }),\r\n lineHeight,\r\n padding,\r\n textBaseline: TextBaseline.middle,\r\n fillStyle:\r\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen ? 'black' : Colors.currentText,\r\n background: background || Colors.currentBackground,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n translate.undo()\r\n }\r\n\r\n renderXAxis() {\r\n const { leftOffset, width } = this\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n this.context.save()\r\n if (\r\n this.data.getDrawDays() !== 1 &&\r\n !getIsSmallIndexChart(this.specificChartFunctionality) &&\r\n this.data.instrument !== Instrument.MarketSentiment\r\n ) {\r\n this.clip(true)\r\n }\r\n this.context.translate(ChartSettings.left.width, ChartSettings.top.height)\r\n const textRenderer = new Text(\r\n {\r\n y: this.height + ChartSettings.bottom.axis.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.bottom.axis.font.size }),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.top,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n\r\n // Ticks are placed at the start of each timeframe period (hour/day/month/year).\r\n // The \"-1\" in the code ensures we start searching from one bar outside the visible area,\r\n // avoiding a tick on the first visible index unless it marks the start of a new timeframe period.\r\n // For example, if the start of December is on December 3rd and the first visible bar is on December 14th,\r\n // we won't display a tick.\r\n const startBarIndex = Math.max(\r\n getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset,\r\n }).index - 1,\r\n 0\r\n )\r\n\r\n const endBarIndex = Math.min(\r\n getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset,\r\n chartWidth: width,\r\n }).index + 1,\r\n this.data.close.length - 1\r\n )\r\n\r\n switch (this.data.timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n if (this.data.instrument === Instrument.Stock) {\r\n if (\r\n this.type === ChartElementType.LineChart &&\r\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen &&\r\n this.data.timeframe === 'i5'\r\n ) {\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n } else {\r\n this.renderIntradayXAxis(textRenderer)\r\n }\r\n } else {\r\n this.renderIntradayXAxisFutures({ textRenderer, startBarIndex, endBarIndex })\r\n }\r\n break\r\n case TIMEFRAME.i10:\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderIntradayXAxis(textRenderer)\r\n } else {\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n }\r\n break\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.d:\r\n this.renderDailyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.w:\r\n this.renderWeeklyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.m:\r\n this.renderMonthlyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n default:\r\n break\r\n }\r\n this.context.restore()\r\n }\r\n\r\n isXPointVisible(x: number, buffer = 0) {\r\n return x >= 0 - buffer && x <= this.width + buffer\r\n }\r\n\r\n renderXAxisLabels({\r\n labels,\r\n textRenderer,\r\n allowedOverflow = 0,\r\n }: {\r\n labels: Omit[]\r\n textRenderer: Text\r\n allowedOverflow?: number\r\n }) {\r\n const sortedLabels: XAxisLabel[] = []\r\n const renderedLabelRanges: Array<{ from: number; to: number }> = []\r\n labels.reverse().forEach((label) => {\r\n textRenderer.set({ text: label.text })\r\n const textWidth = Math.floor(textRenderer.measure(this.context))\r\n const newLabel = { ...label, textWidth }\r\n if (label.hasPriority) {\r\n sortedLabels.unshift(newLabel)\r\n } else {\r\n sortedLabels.push(newLabel)\r\n }\r\n })\r\n\r\n sortedLabels.forEach(({ x, text, textWidth }) => {\r\n if (!this.isXPointVisible(x, allowedOverflow)) {\r\n return\r\n }\r\n const halfOfTextWidth = textWidth / 2\r\n const overflowLeft = x - halfOfTextWidth + allowedOverflow\r\n const overflowRight = this.width - (x + halfOfTextWidth) + allowedOverflow\r\n let labelX = x\r\n if (overflowLeft < 0) {\r\n labelX = Math.round(x - overflowLeft)\r\n } else if (overflowRight < 0) {\r\n labelX = Math.round(x + overflowRight)\r\n }\r\n if (getIsOverlapping({ x: labelX, textWidth, renderedLabelRanges })) {\r\n return\r\n }\r\n renderedLabelRanges.push({\r\n from: labelX - halfOfTextWidth - OFFSET.M,\r\n to: labelX + halfOfTextWidth + OFFSET.M,\r\n })\r\n textRenderer.set({ text, x: labelX })\r\n textRenderer.render(this.context)\r\n })\r\n }\r\n\r\n renderIntradayXAxis(textRenderer: Text) {\r\n const interval = IntradayTimeframeInterval[this.data.timeframe as keyof typeof IntradayTimeframeInterval]\r\n const marketStartHour = ~~(this.data.marketStartMinutes / 60)\r\n let marketEndHour = 15 + Math.ceil(this.data.aftermarketLengthMinutes / 60)\r\n const labels = []\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n marketEndHour = 16\r\n }\r\n\r\n const xLine = this.getXLine()\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: this.model.zoomFactor,\r\n chartLayout: this.model.chart_layout(),\r\n })\r\n\r\n const dayToOffset = this.data.getDayToOffset()\r\n const isSmallIndexChart = getIsSmallIndexChart(this.specificChartFunctionality)\r\n const allowedOverflow = isSmallIndexChart ? SMALL_INDEX_CHART_LABEL_BUFFER : 0\r\n for (const day in dayToOffset) {\r\n const dayIndex = dayToOffset[day]\r\n const date = dateFromDateString(day)\r\n\r\n for (let i = marketStartHour; i <= marketEndHour; i++) {\r\n let x =\r\n ((i * 60 - this.data.marketStartMinutes) / interval) * barWidth +\r\n dayIndex * (this.data.drawMinutesPerDay / interval) * barWidth +\r\n this.leftOffset\r\n if (!this.isXPointVisible(x, allowedOverflow)) {\r\n continue\r\n }\r\n let roundedX = Math.round(x)\r\n\r\n if (i === marketStartHour) {\r\n if (isSmallIndexChart) {\r\n roundedX = Math.round(x - 3 + (30 / interval) * barWidth)\r\n // ~9:30AM\r\n xLine\r\n .set({\r\n x1: roundedX,\r\n x2: roundedX,\r\n })\r\n .render(this.context)\r\n continue\r\n }\r\n if (this.data.premarketLengthMinutes === 0) {\r\n // If there is no premarket, day starts at 9:30 AM\r\n x += (30 / interval) * barWidth\r\n }\r\n roundedX = Math.round(x)\r\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\r\n labels.push({\r\n hasPriority: true,\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n x: roundedX,\r\n })\r\n } else {\r\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\r\n labels.push({\r\n text: ((i + 11) % 12) + 1 + (i < 12 ? 'AM' : 'PM'),\r\n x: roundedX,\r\n })\r\n }\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer, allowedOverflow })\r\n }\r\n\r\n renderIntradayXAxisFutures({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastDay = ''\r\n let lastHours = NaN\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n const hours = date.getHours()\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n\r\n if (day !== lastDay) {\r\n lastDay = day\r\n lastHours = hours\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n x,\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n })\r\n } else if (hours % 2 === 0 && hours !== lastHours) {\r\n lastHours = hours\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({ x, text: ((hours + 11) % 12) + 1 + (hours < 12 ? 'AM' : 'PM') })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n render15MinXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastDay = ''\r\n let x = 0\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n if (day !== lastDay) {\r\n lastDay = day\r\n if (this.data.instrument === Instrument.Stock) {\r\n const barAtMinute = date.getMinutes() + date.getHours() * 60\r\n const indexOffset = (barAtMinute - this.data.marketStartMinutes) / this.data.interval\r\n x = Math.round(this.paneModel.scale.x(this.data.barIndex[i] - indexOffset) + this.leftOffset)\r\n } else {\r\n x = Math.round(this.fx(i) + this.leftOffset)\r\n }\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n x,\r\n })\r\n }\r\n }\r\n\r\n // Offscreen only - if lastDate !== lastBarDate add tick\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${(this.data.lastDate % 100)\r\n .toString()\r\n .padLeft('00')}` // YYYYMMDD / 20211118 => Nov 18\r\n\r\n if (labels.length > 0 && labels[labels.length - 1].text !== lastDate) {\r\n const barsInDay = this.data.getBarsInDay()!\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: this.model.zoomFactor,\r\n chartLayout: this.model.chart_layout(),\r\n })\r\n const dayWidth = barsInDay * barWidth\r\n x += dayWidth\r\n labels.push({\r\n text: lastDate,\r\n x,\r\n })\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n }\r\n }\r\n\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderDailyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n hasPriority: date.getMonth() === 0,\r\n text: date.getMonth() === 0 ? date.getFullYear().toString() : MONTHS[date.getMonth()],\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderWeeklyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n if (date.getMonth() % 3 === 0) {\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n } else {\r\n new Line(\r\n {\r\n x1: x,\r\n x2: x,\r\n y1: 0,\r\n y2: this.height,\r\n strokeStyle: Colors.gridSecondary,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n }\r\n const isYearLabel = date.getMonth() === 0\r\n labels.push({\r\n text: isYearLabel ? date.getFullYear().toString().substring(2) : MONTHS[date.getMonth()][0],\r\n hasPriority: isYearLabel,\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderMonthlyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastYear = null\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const year = date.getFullYear()\r\n const isJanuary = date.getMonth() === 0\r\n if (year !== lastYear && (labels.length !== 0 || isJanuary)) {\r\n lastYear = year\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n text: date.getFullYear().toString(),\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n handleIndicatorsChange() {\r\n this.updateShouldRenderVolume()\r\n this.setupCache()\r\n this.trigger('change')\r\n }\r\n\r\n updateShouldRenderVolume() {\r\n this.shouldRenderVolume = !this.model.chart_layout().getIsIndicatorPresent(IndicatorType.Vol)\r\n }\r\n\r\n getVolumeTicks(count: number, maxHeight: number, fontHeight: number): number[] {\r\n const maxCount = 5\r\n const minCount = 1\r\n if (count > maxCount) {\r\n count = maxCount\r\n }\r\n const ticks = this.volumeFY.ticks(count).filter((tick) => tick !== 0)\r\n if (count <= minCount) {\r\n return [ticks[ticks.length - 1]]\r\n }\r\n // ticks are rendered on middle line so we have +- 1/2 of font size above and below range[min,max]\r\n // so we already have +-1 fontsize space, but in some cases that wouldn't be enough so we need to scale\r\n // dynamically, we add 3px of space per tick gap\r\n if (ticks.length * fontHeight + (ticks.length - 1) * 3 > maxHeight) {\r\n return this.getVolumeTicks(count - 1, maxHeight, fontHeight)\r\n }\r\n return ticks\r\n }\r\n\r\n renderVolumeAxis(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n context.save()\r\n const relativeVolume = Math.max(0, Math.min(2, this.data.relativeVolume))\r\n\r\n const x = 20\r\n const fy = (y: number) => ChartSettings.top.height + this.height - this.height * (0.5 * y)\r\n const height = this.height * (0.5 * relativeVolume)\r\n\r\n const label = new Text(\r\n {\r\n x: 15,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n for (let i = 0.5; i <= 2; i += 0.5) {\r\n const y = Math.round(fy(i))\r\n label\r\n .set({\r\n text: i.toFixed(1),\r\n y: y,\r\n })\r\n .render(context)\r\n\r\n context.set('strokeStyle', 'rgb(130, 130, 130)')\r\n context.beginPath()\r\n context.setLineDash([2, 3])\r\n context.translate(0, 0.5)\r\n context.moveTo(x, y)\r\n context.lineTo(x + 7, y)\r\n context.translate(0, -0.5)\r\n context.stroke()\r\n }\r\n\r\n context.set('fillStyle', 'rgba(0, 135, 255, 0.58)')\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', Colors.grid)\r\n context.setLineDash([])\r\n\r\n context.fillRect(x, Math.round(ChartSettings.top.height + this.height - height), 7, Math.round(height))\r\n context.translate(0.5, 0.5)\r\n context.strokeRect(x, ChartSettings.top.height, 7, this.height)\r\n context.translate(-0.5, -0.5)\r\n\r\n new Text(\r\n {\r\n text: 'RELATIVE\\nVOLUME',\r\n x: 33,\r\n y: ChartSettings.top.height + this.height + 6,\r\n font: { size: FONT_SIZE.XXS },\r\n lineHeight: LINE_HEIGHT.XS,\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.top,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n context.restore()\r\n return\r\n }\r\n const rangeMax = this.volumeFY.range()[1]\r\n const volumeAxisFontSize = ChartSettings.left.volumeAxis.font.size!\r\n const tickCount = Math.floor(rangeMax / volumeAxisFontSize)\r\n const ticks = this.getVolumeTicks(tickCount, rangeMax, volumeAxisFontSize)\r\n const format = this.volumeFY.tickFormat(4, 's')\r\n const text = new Text(\r\n {\r\n x: ChartSettings.left.volumeAxis.margin.left,\r\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.left.volumeAxis.font.size }),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n ticks.forEach((tick) =>\r\n text\r\n .set({\r\n text: format(tick).replace(/G/, 'B'), // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\r\n y: ChartSettings.top.height + this.height - this.volumeFY(tick),\r\n })\r\n .render(context)\r\n )\r\n }\r\n\r\n renderVolume() {\r\n if (!this.shouldRenderVolume) return\r\n\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n // Return if the domain bounds are equal, this would put any value in the middle\r\n const [domainFrom, domainTo] = this.volumeFY.domain()\r\n if (this.setupAxisTimeFrame !== this.data.timeframe || domainFrom === domainTo) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height + this.height - 59,\r\n })\r\n translate.do()\r\n const halfBarWidth = getHalfBarWidth(this.model)\r\n const barWidthWithoutMargin = getBarWithoutMarginWidth(this.model)\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i, x) => {\r\n // Skip render if the value is <= 0\r\n if (this.data.volume[i] <= 0) {\r\n return\r\n }\r\n\r\n this.context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n const y = Math.round(this.volumeFY(this.data.volume[i]))\r\n this.context.fillRect(x - halfBarWidth, 60, barWidthWithoutMargin, -y)\r\n },\r\n })\r\n translate.undo()\r\n }\r\n\r\n renderOverlays() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n for (const overlay of this.overlays) {\r\n overlay.renderContent(this.context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderCross(context: CanvasRenderingContext2D) {\r\n const isRendered = renderCross({\r\n context,\r\n mouseModel,\r\n paneModel: this.paneModel,\r\n contentWidth: this.width,\r\n contentHeight: this.height,\r\n quote: this.data,\r\n getRoundDecimalPlaces: (price) => this.getPlacesLastClose(price),\r\n onRenderCrossText: !this.getIsRedesignedChart() ? this.renderCrossText : undefined,\r\n })\r\n if (this.getIsRedesignedChart()) {\r\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.paneModel))\r\n }\r\n\r\n if (isRendered !== undefined) {\r\n setElementCursor({\r\n elementId: this.model.chart_layout().getHTMLElementId(),\r\n cursor: isRendered ? 'crosshair' : 'default',\r\n conditionalCursor: 'grabbing',\r\n })\r\n }\r\n }\r\n\r\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\r\n const n = this.data.getDataByBarIndex(key, crossIndex)\r\n if (n !== null) {\r\n return shouldReturnRoundedString ? this.roundOhlc(n) : `${n}`\r\n }\r\n }\r\n\r\n getCrossIndexChange(crossIndex: number) {\r\n const crossDataIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n const crossClose = this.data.close[crossDataIndex] ?? null\r\n const previousClose = this.data.close[crossDataIndex - 1] ?? null\r\n if (crossClose !== null && previousClose !== null) {\r\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\r\n }\r\n\r\n return null\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n context.save()\r\n context.translate(ChartSettings.left.width, 0)\r\n\r\n if (this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabels(context)\r\n if (Number.isNaN(crossIndex)) {\r\n this.getOHLC({ context })\r\n context.restore()\r\n return\r\n }\r\n }\r\n\r\n const dateByBarIndex = this.data.getDataByBarIndex('date', crossIndex)\r\n const date = dateByBarIndex ? utils.dateFromUnixTimestamp(dateByBarIndex) : null\r\n\r\n if (date === null) {\r\n const virtualTradedDates =\r\n this.data.date.length > 0\r\n ? getVirtualTimeframeTradedDates({\r\n dateStart: this.data.date[0],\r\n dateEnd: this.data.date[this.data.date.length - 1],\r\n quote: this.data,\r\n })\r\n : []\r\n this.getOHLC({\r\n context,\r\n dateString: virtualTradedDates[crossIndex]\r\n ? getDateString({\r\n date: utils.dateFromUnixTimestamp(virtualTradedDates[crossIndex]),\r\n timeframe: this.data.timeframe,\r\n })\r\n : null,\r\n })\r\n context.restore()\r\n return\r\n }\r\n\r\n this.getOHLC({\r\n context,\r\n date,\r\n data: {\r\n open: this.getDataByCrossIndex(crossIndex, 'open'),\r\n high: this.getDataByCrossIndex(crossIndex, 'high'),\r\n low: this.getDataByCrossIndex(crossIndex, 'low'),\r\n close: this.getDataByCrossIndex(crossIndex, 'close'),\r\n volume: this.getDataByCrossIndex(crossIndex, 'volume', false),\r\n },\r\n changePercentage: this.getCrossIndexChange(crossIndex),\r\n })\r\n\r\n context.restore()\r\n }\r\n\r\n renderChange({ context }: { context: CanvasRenderingContext2D }) {\r\n const CHANGE_SPACER = 10\r\n const { ChartSettings, isOurSiteRequest } = this.getChartLayoutSettings()\r\n const { ticker, change, ohlc } = ChartSettings.top\r\n const { tickerChange, tickerAfterChange } = getTickerChange({ data: this.data })\r\n\r\n if (!tickerChange) {\r\n return\r\n }\r\n\r\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isGroupInstrument = this.data.instrument === Instrument.Group\r\n const finvizWatermarkOffset = !isOffscreen || isOurSiteRequest || this.isLargeChart ? 0 : 15\r\n const changeText = new Text(\r\n {\r\n text: isOffscreen && isGroupInstrument ? tickerChange.percentString : tickerChange.string,\r\n x: !getIsSmallIndexChart(this.specificChartFunctionality)\r\n ? this.width - ChartSettings.top.change.margin.right! - finvizWatermarkOffset\r\n : this.width,\r\n y: ChartSettings.top.change.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\r\n textAlign: TextAlign.right,\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: getChangeColor({ change: tickerChange.points, ChartSettings }),\r\n },\r\n this.paneModel\r\n )\r\n this.changeWidth = changeText.measure(context)\r\n changeText.render(context)\r\n\r\n if (isOffscreen && (!this.isLargeChart || isGroupInstrument)) {\r\n return\r\n }\r\n if (tickerAfterChange) {\r\n const afterChangeText = new Text(\r\n {\r\n text: tickerAfterChange?.string,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\r\n textAlign: TextAlign.right,\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: getChangeColor({ change: tickerAfterChange.points, ChartSettings }),\r\n },\r\n this.paneModel\r\n )\r\n const afterChangeTextWidth = afterChangeText.measure(context)\r\n const oneLineAHChangeWidth = this.changeWidth + CHANGE_SPACER + afterChangeTextWidth\r\n\r\n if (\r\n ChartSettings.left.width + this.tickerWidth + ticker.margin.left! + OFFSET.S <\r\n ChartSettings.left.width + this.width - oneLineAHChangeWidth - change.margin.right!\r\n ) {\r\n afterChangeText\r\n .set({\r\n x: this.width - ChartSettings.top.change.margin.right! - this.changeWidth - CHANGE_SPACER,\r\n y: ChartSettings.top.change.margin.top,\r\n })\r\n .render(context)\r\n this.afterChange = null\r\n this.changeWidth = oneLineAHChangeWidth\r\n } else if (\r\n this.lastOhlc[0] &&\r\n ChartSettings.left.width +\r\n this.tickerWidth +\r\n ticker.margin.left! +\r\n this.lastOhlc[0].width! +\r\n ohlc.margin.left! +\r\n ohlc.margin.right! <\r\n ChartSettings.left.width + this.width - afterChangeTextWidth - change.margin.right!\r\n ) {\r\n afterChangeText\r\n .set({\r\n x: this.width - ChartSettings.top.change.margin.right!,\r\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\r\n })\r\n .render(context)\r\n this.changeWidth = Math.max(this.changeWidth, afterChangeTextWidth)\r\n this.afterChange = {\r\n x: this.width - ChartSettings.top.change.margin.right!,\r\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\r\n width: afterChangeTextWidth,\r\n }\r\n }\r\n }\r\n }\r\n\r\n renderOHLC(parameters: IRenderOHLCParameters) {\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOHLCQuotePage(parameters)\r\n } else {\r\n this.renderOHLCChartsPage(parameters)\r\n }\r\n }\r\n\r\n renderOHLCChartsPage({ context, date, open, high, low, close, volume, changePercentage }: IRenderOHLCParameters) {\r\n const chartBreakpoints = getChartBreakpoints(this.width)\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n const OhlcText = new Text(\r\n {\r\n font: { size: FONT_SIZE.S },\r\n lineHeight: 18,\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\r\n },\r\n this.paneModel\r\n )\r\n\r\n const dateElements = date ? [{ text: date, color: gray300 }] : []\r\n const trendColor = (open ?? 0) > (close ?? 0) ? tailwindColors.red[400] : tailwindColors.green[400]\r\n const oElements = open\r\n ? [\r\n { text: 'O', color: gray300 },\r\n { text: open, color: trendColor },\r\n ]\r\n : []\r\n const hElements = high\r\n ? [\r\n { text: 'H', color: gray300 },\r\n { text: high, color: trendColor },\r\n ]\r\n : []\r\n const lElements = low\r\n ? [\r\n { text: 'L', color: gray300 },\r\n { text: low, color: trendColor },\r\n ]\r\n : []\r\n const cElements = close\r\n ? [\r\n { text: 'C', color: gray300 },\r\n { text: close, color: trendColor },\r\n ]\r\n : []\r\n const volElements = volume\r\n ? [\r\n { text: 'Vol', color: gray300 },\r\n { text: volume, color: trendColor },\r\n ]\r\n : []\r\n const changeElements = changePercentage != null ? [{ text: changePercentage.string, color: trendColor }] : []\r\n\r\n const lines: OhlcLineElements[] = []\r\n\r\n const getFlatLineArrayWithSpaces = (lineElements: OhlcLineElements[]) =>\r\n lineElements.flatMap((elements, index) =>\r\n index > 0 ? ([...(elements.length > 0 ? ['space'] : []), ...elements] as OhlcLineElements) : elements\r\n )\r\n if (chartBreakpoints.isM) {\r\n lines.push(\r\n getFlatLineArrayWithSpaces([\r\n dateElements,\r\n oElements,\r\n hElements,\r\n lElements,\r\n cElements,\r\n volElements,\r\n changeElements,\r\n ])\r\n )\r\n } else if (chartBreakpoints.isS) {\r\n lines.push(getFlatLineArrayWithSpaces([dateElements, changeElements]))\r\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements, volElements]))\r\n } else {\r\n lines.push(getFlatLineArrayWithSpaces([dateElements, volElements, changeElements]))\r\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements]))\r\n }\r\n\r\n const startX = OFFSET.M - ChartSettings.left.width\r\n let x = startX\r\n let y = OFFSET.M + OhlcText.attrs.lineHeight / 2\r\n\r\n lines.forEach((line) => {\r\n x = startX\r\n line.forEach((lineElement, index, lineElements) => {\r\n const padding = { left: 1, right: 1, top: 0, bottom: 0 }\r\n const { text = '', color = undefined } = lineElement === 'space' ? {} : lineElement\r\n if (index === 0) {\r\n padding.left = 5\r\n } else if (index === lineElements.length - 1) {\r\n padding.right = 5\r\n } else if (lineElement === 'space') {\r\n padding.left = 7\r\n padding.right = 7\r\n if (!chartBreakpoints.isS) {\r\n padding.left = 5\r\n padding.right = 5\r\n }\r\n }\r\n OhlcText.set({ text, fillStyle: color, x, y, padding })\r\n OhlcText.render(context)\r\n x += OhlcText.width\r\n })\r\n y += OhlcText.attrs.lineHeight\r\n })\r\n }\r\n\r\n renderOverlaysLabelsChartsPage(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const chartBreakpoints = getChartBreakpoints(this.width)\r\n const LabelsText = new Text(\r\n {\r\n font: { size: FONT_SIZE.S },\r\n lineHeight: 18,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(ChartSettings.general.Colors.canvasFill, 0.8),\r\n // this function gets (indirectly) called from renderCrossText which is already \"translateX\" by ChartSettings.left.width\r\n x: OFFSET.M - ChartSettings.left.width,\r\n padding: { left: PADDING.S, right: PADDING.S, top: 0, bottom: 0 },\r\n },\r\n this.paneModel\r\n )\r\n\r\n let numberOfNewOhlcLines = 2\r\n if (chartBreakpoints.isM) {\r\n numberOfNewOhlcLines = 1\r\n } else if (chartBreakpoints.isS) {\r\n numberOfNewOhlcLines = 2\r\n }\r\n\r\n // We assume lineheight is the same as OHLC text\r\n const { lineHeight } = LabelsText.attrs\r\n let y = lineHeight * numberOfNewOhlcLines + lineHeight / 2 + OFFSET.M\r\n\r\n for (const overlay of this.overlays) {\r\n if (!overlay.isRenderedOverlaysLabel()) {\r\n continue\r\n }\r\n LabelsText.set({\r\n text: overlay.toString(),\r\n y,\r\n fillStyle: overlay.getLabelColor(),\r\n }).render(context)\r\n y += lineHeight\r\n }\r\n }\r\n\r\n renderOHLCQuotePage({\r\n context,\r\n date,\r\n open,\r\n high,\r\n low,\r\n close,\r\n volume,\r\n afterHour,\r\n isSmallIndexChart = false,\r\n isNewestOHLC = false,\r\n time,\r\n directRender = false,\r\n changePercentage,\r\n }: IRenderOHLCParameters) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { ohlc } = ChartSettings.top\r\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isGroupInstrument = this.data.instrument === Instrument.Group\r\n if (isOffscreen && isGroupInstrument) {\r\n ohlc.type = OHLCType.dateOnly\r\n } else if (isOffscreen && this.data.instrument !== Instrument.Stock && time) {\r\n ohlc.type = OHLCType.timeOnly\r\n }\r\n\r\n const lineTopY = ohlc.type ? ohlc.margin.top : ohlc.margin.top! - ChartSettings.top.ticker.font.size!\r\n const OHLCFontSize = ohlc.font.size!\r\n const centerXOffset =\r\n this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n (this.width -\r\n (this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n this.changeWidth +\r\n (isSmallIndexChart ? 0 : ChartSettings.top.change.margin.right!))) / // smallIndexChart don't have change.margin.right\r\n 2\r\n const leftXOffset = this.tickerWidth + ChartSettings.top.ticker.margin.left! + ohlc.margin.left!\r\n const hasOhlc = ![open, high, low, close, volume].some((ohlcString) => !ohlcString)\r\n const OHLC = hasOhlc\r\n ? {\r\n date: [date ?? ''],\r\n singleLine: [\r\n `${date} O:${open} H:${high} L:${low} C:${close}${\r\n afterHour ? ` AH:${afterHour}` : ''\r\n } Vol:${volume} `,\r\n /*\r\n * this is needed because of the way we render ohlc text down below in renderOHLCToCanvas\r\n * undefined is used instead of null because TS had some issues with `null` even if it is filtered out\r\n * */\r\n changePercentage ? changePercentage.string : undefined,\r\n ].filter((value) => value !== undefined),\r\n }\r\n : {\r\n date: [date ?? ''],\r\n singleLine: [`${date ?? ''}`],\r\n }\r\n\r\n const OHLC_TEXT = new Text(\r\n {\r\n font: { size: OHLCFontSize },\r\n },\r\n this.paneModel\r\n )\r\n\r\n const getOHLCType = () => {\r\n if (!isSmallIndexChart) {\r\n return OHLCType.singleLine\r\n }\r\n return OHLCType.dateOnly\r\n }\r\n\r\n const getOHLCSettings = () => {\r\n switch (ohlc.type || getOHLCType()) {\r\n case OHLCType.singleLine:\r\n return {\r\n text: OHLC.singleLine,\r\n x: [leftXOffset, leftXOffset],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.left,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n case OHLCType.dateOnly:\r\n if (isOffscreen && isGroupInstrument) {\r\n const text = `${OHLC.date} Volume: ${volume}`\r\n const textWidth = OHLC_TEXT.set({ text }).measure(context)\r\n return {\r\n text: [text],\r\n x: [\r\n this.width - ChartSettings.top.change.margin.right! - this.changeWidth - textWidth - CHART_MARGIN.XXL,\r\n ],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.center,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n } else if (isSmallIndexChart) {\r\n return {\r\n text: OHLC.date,\r\n x: [centerXOffset],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.center,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n } else {\r\n const isEnoughSpace =\r\n this.width -\r\n (this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n ohlc.margin.left! +\r\n ohlc.margin.right! +\r\n this.changeWidth +\r\n ChartSettings.top.change.margin.right!) >\r\n OHLC_TEXT.set({ text: OHLC.date[0] }).measure(context)\r\n const alignTop = !isEnoughSpace || ohlc.font.baseline === TextBaseline.top\r\n return {\r\n text: OHLC.date,\r\n x: [leftXOffset],\r\n y: alignTop ? [lineTopY] : [ohlc.margin.top],\r\n textAlign: TextAlign.left,\r\n textBaseline: alignTop ? [TextBaseline.top] : [TextBaseline.alphabetic],\r\n }\r\n }\r\n case OHLCType.timeOnly:\r\n return {\r\n text: [time],\r\n x: [centerXOffset - OHLC_TEXT.set({ text: time }).measure(context) / 2],\r\n y: [lineTopY],\r\n textAlign: TextAlign.center,\r\n textBaseline: [ohlc.font.baseline],\r\n }\r\n default:\r\n return\r\n }\r\n }\r\n\r\n if (!isNewestOHLC) {\r\n context.fillStyle = Colors.canvasFill\r\n this.lastOhlc.forEach((line) => {\r\n const x = (line.textAlign === TextAlign.left ? line.x : line.x! - line.width! / 2)!\r\n const y = (line.textBaseline === TextBaseline.top ? line.y : line.y! - OHLCFontSize)!\r\n context.fillRect(\r\n x - PADDING.XXS,\r\n y - PADDING.XXS,\r\n PADDING.XXS + line.width! + PADDING.XXS,\r\n PADDING.XXS + OHLCFontSize + PADDING.XXS\r\n )\r\n })\r\n\r\n if (this.afterChange) {\r\n context.fillRect(\r\n this.afterChange.x - this.afterChange.width - PADDING.XXS,\r\n this.afterChange.y - ChartSettings.top.change.font.size! - PADDING.XXS,\r\n PADDING.XXS + this.afterChange.width + PADDING.XXS,\r\n PADDING.XXS + ChartSettings.top.change.font.size! + PADDING.XS\r\n )\r\n }\r\n } else {\r\n this.lastOhlc = []\r\n }\r\n\r\n const ohlcSettings = getOHLCSettings()\r\n\r\n const renderOHLCToCanvas = ({\r\n ohlcSet,\r\n render = true,\r\n }: {\r\n ohlcSet?: {\r\n text: (string | undefined)[]\r\n x: number[]\r\n y: (number | undefined)[]\r\n textAlign: TextAlign\r\n textBaseline: (TextBaseline | undefined)[]\r\n }\r\n render?: boolean\r\n }) => {\r\n const isSingleLineWithChange = (ohlc.type || getOHLCType()) === OHLCType.singleLine && changePercentage\r\n ohlcSet?.text.forEach((line: string | undefined, index: number) => {\r\n let i = index\r\n let leftOffset = 0\r\n let fillStyle = Colors.text\r\n let text = line\r\n if (index > 0 && isSingleLineWithChange) {\r\n i -= 1\r\n leftOffset = OHLC_TEXT.measure(context)\r\n text = line\r\n\r\n fillStyle = getChangeColor({ change: changePercentage.points, ChartSettings })\r\n }\r\n const options = {\r\n text,\r\n x: ohlcSet.x[i] + leftOffset,\r\n y: ohlcSet.y[i],\r\n textBaseline: ohlc.font.baseline ? ohlc.font.baseline : ohlcSet.textBaseline[i],\r\n textAlign: ohlc.font.textAlign ? ohlc.font.textAlign : ohlcSet.textAlign,\r\n fillStyle,\r\n }\r\n OHLC_TEXT.set(options)\r\n if (isNewestOHLC) {\r\n this.lastOhlc[i] = { width: OHLC_TEXT.measure(context), ...options }\r\n }\r\n if (render) {\r\n OHLC_TEXT.render(context)\r\n }\r\n })\r\n }\r\n renderOHLCToCanvas({ ohlcSet: ohlcSettings, render: directRender })\r\n\r\n return {\r\n ohlcSettings,\r\n renderOHLCToCanvas,\r\n }\r\n }\r\n\r\n // only for stocks on i1/i3/i5 and one day view\r\n renderFadeExtendedHours() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const period = this.model.quote().timeframe\r\n if (this.data.instrument !== Instrument.Stock) {\r\n return\r\n }\r\n if (![TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5].includes(period)) {\r\n return\r\n }\r\n\r\n const interval = parseInt(period.substring(1), 10)\r\n const dayToOffset = this.data.getDayToOffset()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const halfBarWidth = getHalfBarWidth(this.model)\r\n for (const day in dayToOffset) {\r\n // todo aftermarket\r\n const dayIndex = dayToOffset[day]\r\n let n0 = (this.data.drawMinutesPerDay / interval) * dayIndex\r\n let n1 = this.data.premarketLengthMinutes / interval + n0 // bars in 90mins from 8am to 9:30am\r\n let x0 = this.paneModel.scale.x(n0) - halfBarWidth\r\n let width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\r\n this.context.set('fillStyle', Colors.premarketFade)\r\n this.context.fillRect(x0, 0, width, this.height + 1)\r\n\r\n if (this.data.aftermarketLengthMinutes > 0) {\r\n n0 =\r\n (this.data.drawMinutesPerDay / interval) * dayIndex +\r\n (this.data.drawMinutesPerDay - this.data.aftermarketLengthMinutes) / interval\r\n n1 = this.data.aftermarketLengthMinutes / interval + n0 // bars in 90mins from 4pm to 5:30pm\r\n x0 = this.paneModel.scale.x(n0) - halfBarWidth\r\n width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\r\n\r\n this.context.set('fillStyle', Colors.aftermarketFade)\r\n this.context.fillRect(x0, 0, width, this.height + 1)\r\n }\r\n }\r\n translate.undo()\r\n }\r\n\r\n shouldShowPrevClose() {\r\n const quote = this.model.quote()\r\n const isStock = quote.instrument === Instrument.Stock\r\n const isIntradayWithPreMarket = TIMEFRAMES_WITH_PRE_MARKET.includes(quote.timeframe)\r\n const isIndexChart = this.specificChartFunctionality === SpecificChartFunctionality.smallIndex\r\n\r\n return isStock && (isIntradayWithPreMarket || isIndexChart)\r\n }\r\n\r\n renderPrevClose() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (!this.shouldShowPrevClose()) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n let y = Math.round(this.fy(this.model.quote().prevClose))\r\n if (y === this.height) y -= 1 // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate, to compensate for this we subtract 1px\r\n\r\n new Line(\r\n {\r\n x1: 0,\r\n x2: this.width,\r\n y1: y,\r\n y2: y,\r\n strokeStyle: Colors.prevClose,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n translate.undo()\r\n }\r\n\r\n renderChartNotAvailable() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const x = ~~((ChartSettings.left.width + ChartSettings.right.width + this.width) / 2)\r\n const y = ~~((ChartSettings.top.height + ChartSettings.bottom.height + this.height) / 2)\r\n new Text(\r\n {\r\n text: 'Chart not available',\r\n x,\r\n y,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n }\r\n\r\n // private\r\n setupCache() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n /*\r\n * Don't create new Cache instances, because Safari takes too long to free up memory\r\n * leading to canvas.getContext returning null. https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\r\n *\r\n * To further improve performance, cache.set shouldn't be called when unnecessary,\r\n * because setupCache is called for many model updates. The same applies for indicators/indicator.js.\r\n */\r\n this.baseCache = this.baseCache || new Cache()\r\n\r\n this.baseCache.set(\r\n (context: CanvasRenderingContext2D) => {\r\n if (this.data.close.length === 0) {\r\n this.renderText(context)\r\n return\r\n }\r\n this.renderYAxis(context)\r\n this.renderText(context)\r\n if (!this.getIsMobileChartPage() && this.shouldRenderVolume) {\r\n this.renderVolumeAxis(context)\r\n }\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabels(context)\r\n }\r\n },\r\n this.width + ChartSettings.left.width + ChartSettings.right.width,\r\n this.height + ChartSettings.top.height + ChartSettings.bottom.height\r\n )\r\n }\r\n\r\n // called by controllers/pane on recountScale\r\n setupAxis(fx: ScaleAxis) {\r\n this.data = this.model.quote()\r\n const { volumeHeight } = this.getChartLayoutSettings().ChartSettings.center\r\n\r\n if (typeof fx !== 'function') {\r\n return\r\n }\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n })\r\n\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n chartWidth: this.width,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n const volumes = []\r\n if (areNoBarsVisible) {\r\n volumes.push(\r\n this.data.volume[firstBarToRenderIndex.index],\r\n Math.min(lastBarToRenderIndex.index, this.data.barIndex.length - 1)\r\n )\r\n } else {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n volumes.push(this.data.volume[i])\r\n }\r\n }\r\n\r\n const max = utils.max(volumes) ?? 0\r\n const rangeMax = volumeHeight || 60\r\n this.volumeFY = d3.scaleLinear().range([0, rangeMax]).domain([0, max]).nice(4)\r\n this.setupAxisTimeFrame = this.data.timeframe\r\n }\r\n\r\n // private\r\n clip(addMarginBottom?: boolean) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n if (addMarginBottom == null) {\r\n addMarginBottom = false\r\n }\r\n this.context.beginPath()\r\n let marginBottom = 0\r\n if (addMarginBottom) {\r\n marginBottom = ChartSettings.bottom.height\r\n }\r\n this.context.rect(ChartSettings.left.width, ChartSettings.top.height, this.width, this.height + marginBottom)\r\n this.context.clip()\r\n }\r\n\r\n addOverlay(overlay: Overlay) {\r\n overlay.chart = this\r\n this.overlays.push(overlay)\r\n return this.trigger('change')\r\n }\r\n\r\n setOverlays(overlays: Overlay[]) {\r\n this.overlays = overlays\r\n return this.trigger('change')\r\n }\r\n\r\n removeOverlay(overlay: Overlay) {\r\n for (let index = 0; index < this.overlays.length; index++) {\r\n const el = this.overlays[index]\r\n if (el === overlay) {\r\n this.attrs.overlays.splice(index, 1)\r\n this.overlays.splice(index, 1)\r\n this.trigger('change')\r\n break\r\n }\r\n }\r\n }\r\n\r\n getMinMax(): { min: number; max: number; firstVisibleClose?: number | null } {\r\n this.data = this.model.quote()\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n let minIndex = -1\r\n let maxIndex = -1\r\n let firstVisibleClose = null\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n })\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n chartWidth: this.width,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n // If no bars are visible min/max are first available bar before visible and first after\r\n if (areNoBarsVisible) {\r\n min = this.data.low[firstBarToRenderIndex.index]\r\n max = this.data.high[Math.min(lastBarToRenderIndex.index, this.data.barIndex.length - 1)]\r\n firstVisibleClose = this.data.close[firstBarToRenderIndex.index]\r\n } else {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n if (minIndex === -1 || this.data.low[minIndex] > this.data.low[i]) {\r\n minIndex = i\r\n }\r\n if (maxIndex === -1 || this.data.high[maxIndex] < this.data.high[i]) {\r\n maxIndex = i\r\n }\r\n }\r\n\r\n // If only a single bar is visible get min/max index range from closes values outside of visible area\r\n if (this.data.low[minIndex] === this.data.high[maxIndex]) {\r\n const closestMinMaxIndices = getClosestDifferentMinMaxValueIndices(\r\n minIndex,\r\n maxIndex,\r\n this.data.high,\r\n this.data.low\r\n )\r\n minIndex = closestMinMaxIndices.minIndex\r\n maxIndex = closestMinMaxIndices.maxIndex\r\n }\r\n\r\n min = this.data.low[minIndex]\r\n max = this.data.high[maxIndex]\r\n\r\n firstVisibleClose = this.data.close[firstBarToRenderIndex.index]\r\n }\r\n\r\n // Update min/max so prevClose is in range and can be rendered if it should\r\n if (this.shouldShowPrevClose() && this.data.prevClose !== null) {\r\n min = Math.min(min, this.data.prevClose)\r\n max = Math.max(max, this.data.prevClose)\r\n }\r\n\r\n // Update min/max so lastClose is in range and can be rendered if it should\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen && !this.model.dateRange) {\r\n min = Math.min(min, this.data.lastClose)\r\n max = Math.max(max, this.data.lastClose)\r\n }\r\n\r\n return { min, max, firstVisibleClose }\r\n }\r\n\r\n moveBy() {}\r\n\r\n isInArea() {\r\n return false\r\n }\r\n\r\n fx = (x: number) => this.paneModel.scale.x(this.data.barIndex[x])\r\n\r\n fy = (y: number) => this.paneModel.scale.y(y)\r\n\r\n round(n: number, overridePlaces?: number) {\r\n return round({ data: this.data, num: n, overridePlaces: overridePlaces ?? this.getPlacesLastClose() })\r\n }\r\n\r\n roundOhlc(n: number) {\r\n const placesLastClose = this.getPlacesLastClose()\r\n return round({\r\n data: this.data,\r\n num: n,\r\n overridePlaces: placesLastClose ? Math.max(placesLastClose, 2) : undefined,\r\n })\r\n }\r\n\r\n toObject() {\r\n const overlays = this.overlays.map((overlay) => overlay.toObject())\r\n return merge({}, this.attrs, { type: this.type, overlays })\r\n }\r\n\r\n toConfig() {\r\n const overlays = this.overlays.map((overlay) => overlay.toConfig())\r\n return merge({}, this.attrs, { type: this.type, overlays })\r\n }\r\n\r\n getPlacesLastClose(price?: number) {\r\n const { lastClose, instrument } = this.data\r\n const priceAbs = price && Math.abs(price)\r\n if (lastClose >= 100000) {\r\n return 0\r\n } else if (lastClose >= 10000) {\r\n return 1\r\n } else if (instrument === Instrument.Stock && (priceAbs ?? lastClose) < 1) {\r\n return 4\r\n } else if (lastClose === undefined) {\r\n // if lastClose is not defined we'll always display 2 decimpal places, e.g. backtests, screener stats\r\n return 2\r\n }\r\n\r\n return undefined\r\n }\r\n\r\n hasOverlay(type: string) {\r\n return this.overlays.some((x) => x.type === 'overlays/' + type)\r\n }\r\n\r\n getXLine(): Line {\r\n return new Line(\r\n {\r\n y1: 0,\r\n y2: this.height,\r\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n\r\n getYLine(): Line {\r\n return new Line(\r\n {\r\n x1: 0,\r\n x2: this.width,\r\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart_layout())\r\n }\r\n\r\n getIsMobileChartPage() {\r\n return (\r\n this.isMobile && this.model.chart_layout().specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n )\r\n }\r\n\r\n getCandleLikeChartsRenderingColors() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { theme, specificChartFunctionality } = this.model.chart_layout()\r\n let colors = Colors\r\n const overwrittenColors = getColorOverwrites({\r\n colors,\r\n theme,\r\n })\r\n const overwrittenColorKeys = Object.keys(overwrittenColors)\r\n const hasOverwrittenCandleColor = ['borderUp', 'wickUp', 'borderDown', 'wickDown', 'trendUp', 'trendDown'].some(\r\n (colorKey) => overwrittenColorKeys.includes(colorKey)\r\n )\r\n\r\n const shouldUseDarkerColors =\r\n theme === Theme.light &&\r\n getShouldUseDarkerWickColors({\r\n specificChartFunctionality: specificChartFunctionality,\r\n totalBarWidth: ChartSettings.center.barWidth + ChartSettings.center.border * 2,\r\n })\r\n\r\n if (shouldUseDarkerColors && !hasOverwrittenCandleColor) {\r\n colors = { ...colors, ...darkerWickColors }\r\n }\r\n const isNodeChartWithThinBars =\r\n specificChartFunctionality === SpecificChartFunctionality.offScreen && ChartSettings.center.border === 0\r\n if (isNodeChartWithThinBars && !hasOverwrittenCandleColor) {\r\n colors = { ...colors, ...thinBarColorsOverride, ...overwrittenColors }\r\n }\r\n\r\n return colors\r\n }\r\n\r\n getIsRedesignedChart() {\r\n return this.specificChartFunctionality === SpecificChartFunctionality.chartPage || isRedesignedPage(this)\r\n }\r\n}\r\n\r\nBaseChart.initClass()\r\n\r\nexport default BaseChart\r\n","import { RendererChartBarProps } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport utils from '../utils'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport Chart from './base_chart'\r\n\r\nconst WICK_WIDTH = 1\r\n\r\nclass CandleStick extends Chart {\r\n static type = ChartElementType.CandleStick\r\n static label = 'Candle'\r\n static iconName = 'candleBarBasic'\r\n\r\n getRenderChartBarProps({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) {\r\n const { trendDown, trendUp, borderDown, borderUp, wickDown, wickUp } = chartSettingsColors\r\n const open = this.data.open[index]\r\n const close = this.data.close[index]\r\n const trendColor = close < open ? trendDown : trendUp\r\n const wickColor = close < open ? wickDown : wickUp\r\n return {\r\n open,\r\n close,\r\n high: this.data.high[index],\r\n low: this.data.low[index],\r\n barFillColor: trendColor,\r\n borderColor: close < open ? borderDown : borderUp,\r\n wickColor: hasFillAndBorder ? wickColor : trendColor,\r\n }\r\n }\r\n\r\n renderChart() {\r\n if (this.setupAxisTimeFrame !== this.data.timeframe) {\r\n return\r\n }\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n chartLayout: this.model.chart_layout(),\r\n zoomFactor: this.model.zoomFactor,\r\n })\r\n const shouldRenderFillAndBorder =\r\n barFillWidth + barBorderWidth * 2 >= 2 &&\r\n !(this.type === ChartElementType.HollowCandleStick && barBorderWidth === 0)\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n const translateForWick = getTranslate({\r\n context: this.context,\r\n xOffset: WICK_WIDTH / 2,\r\n yOffset: 0,\r\n })\r\n\r\n translate.do()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, center: number) => {\r\n const { open, close, high, low, wickColor, borderColor, barFillColor } = this.getRenderChartBarProps({\r\n index: i,\r\n chartSettingsColors: Colors,\r\n hasFillAndBorder: shouldRenderFillAndBorder,\r\n })\r\n\r\n const candleBodyHigh = Math.round(this.fy(utils.max(open, close)))\r\n const candleBodyLow = Math.round(this.fy(utils.min(open, close)))\r\n const candleWickHigh = Math.round(this.fy(high))\r\n const candleWickLow = Math.round(this.fy(low))\r\n\r\n const candleBodyHeight = candleBodyLow - candleBodyHigh\r\n const candleBodyLeftX = center - Math.floor(barBorderWidth + barFillWidth / 2)\r\n const halfBorderWidth = barBorderWidth / 2\r\n\r\n // TODO: revisit for better approach, this solve issue with candlesticks\r\n // with even width are shifted 1px to the left and thus first candle is vertically sliced\r\n if (getIsSSr() && candleBodyLeftX + this.leftOffset < 0) {\r\n return\r\n }\r\n\r\n const isBodyHeightGreaterOrEqualBorders = candleBodyHeight >= barBorderWidth * 2\r\n const isWickLineCandleLessThanOnePixel = !shouldRenderFillAndBorder && candleWickLow - candleWickHigh < 1\r\n\r\n translateForWick.do()\r\n this.context.set('strokeStyle', wickColor)\r\n this.context.beginPath()\r\n this.context.moveTo(center, candleWickHigh)\r\n if (shouldRenderFillAndBorder) {\r\n this.context.lineTo(center, candleBodyHigh)\r\n this.context.moveTo(\r\n center,\r\n candleBodyHigh + (isBodyHeightGreaterOrEqualBorders ? candleBodyHeight : WICK_WIDTH)\r\n )\r\n }\r\n this.context.lineTo(center, isWickLineCandleLessThanOnePixel ? candleWickHigh + 1 : candleWickLow)\r\n this.context.stroke()\r\n translateForWick.undo()\r\n\r\n if (shouldRenderFillAndBorder) {\r\n const hasBorder = barBorderWidth > 0\r\n if (hasBorder) {\r\n this.context.set('strokeStyle', borderColor)\r\n if (isBodyHeightGreaterOrEqualBorders) {\r\n this.context.set('lineWidth', barBorderWidth)\r\n this.context.strokeRect(\r\n candleBodyLeftX + halfBorderWidth,\r\n candleBodyHigh + halfBorderWidth,\r\n barFillWidth + 2 * halfBorderWidth,\r\n candleBodyHeight - 2 * halfBorderWidth\r\n )\r\n this.context.set('lineWidth', WICK_WIDTH)\r\n } else {\r\n this.context.beginPath()\r\n this.context.moveTo(candleBodyLeftX, candleBodyHigh + WICK_WIDTH / 2)\r\n this.context.lineTo(candleBodyLeftX + barFillWidth + 2 * barBorderWidth, candleBodyHigh + WICK_WIDTH / 2)\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n const fillHeight = candleBodyHeight - 2 * barBorderWidth\r\n const hasFill = fillHeight > 0\r\n if (hasFill || !hasBorder) {\r\n this.context.set('fillStyle', hasFill ? barFillColor : borderColor)\r\n this.context.fillRect(\r\n candleBodyLeftX + barBorderWidth,\r\n candleBodyHigh + barBorderWidth,\r\n barFillWidth,\r\n hasFill ? fillHeight : WICK_WIDTH\r\n )\r\n }\r\n }\r\n },\r\n })\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default CandleStick\r\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport CandleStick from './candle_stick'\r\n\r\nclass HollowCandleStick extends CandleStick {\r\n static type = ChartElementType.HollowCandleStick\r\n static label = 'Hollow Candle'\r\n static iconName = 'candleBarHollow'\r\n\r\n static getNumOfBarsBuffer(element: RequireByKey) {\r\n return Math.max(1, super.getNumOfBarsBuffer(element))\r\n }\r\n\r\n getRenderChartBarProps({ index, chartSettingsColors }: RendererChartBarProps) {\r\n const open = this.data.open[index]\r\n const close = this.data.close[index]\r\n const isHollow = close > open\r\n const generalTrendColor =\r\n close > this.data.close[index - 1] ? chartSettingsColors.ohlcTrendUp : chartSettingsColors.ohlcTrendDown\r\n const trendColor = index === 0 ? chartSettingsColors.zeroChange : generalTrendColor\r\n return {\r\n open,\r\n close,\r\n high: this.data.high[index],\r\n low: this.data.low[index],\r\n // hollow candles have transparend bodies that's why rgba is here\r\n barFillColor: isHollow ? 'rgba(0, 0, 0, 0)' : trendColor,\r\n borderColor: trendColor,\r\n wickColor: trendColor,\r\n }\r\n }\r\n\r\n toString() {\r\n return `Hollow Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default HollowCandleStick\r\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\r\nimport { ChartElementType, ScaleType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\nimport { getTickerChangeFromCloseValues } from '../utils/chart'\r\nimport CandleStick from './candle_stick'\r\n\r\ntype OhlcKeys = 'high' | 'low' | 'open' | 'close'\r\n\r\nclass HeikinAshi extends CandleStick {\r\n static type = ChartElementType.HeikinAshi\r\n static label = 'Heikin Ashi'\r\n static iconName = 'candleBarHeikinAshi'\r\n\r\n static getNumOfBarsBuffer(element: RequireByKey) {\r\n return Math.max(1, super.getNumOfBarsBuffer(element))\r\n }\r\n\r\n getRenderChartBarProps = ({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) => {\r\n const haData = this.data.getHeikinAshiData()\r\n\r\n const open = haData.open[index]\r\n const close = haData.close[index]\r\n const trendColor = close < open ? chartSettingsColors.trendDown : chartSettingsColors.trendUp\r\n const wickColor = close < open ? chartSettingsColors.wickDown : chartSettingsColors.wickUp\r\n return {\r\n open,\r\n close,\r\n high: Math.max(this.data.high[index], open, close),\r\n low: Math.min(open, close, this.data.low[index]),\r\n barFillColor: trendColor,\r\n borderColor: close < open ? chartSettingsColors.borderDown : chartSettingsColors.borderUp,\r\n wickColor: hasFillAndBorder ? wickColor : trendColor,\r\n }\r\n }\r\n\r\n getLastValues = () => {\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const {\r\n open: lastOpen,\r\n close: lastClose,\r\n high: lastHigh,\r\n low: lastLow,\r\n } = this.getRenderChartBarProps({\r\n index: this.data.date.length - 1,\r\n chartSettingsColors: Colors,\r\n })\r\n\r\n return { lastOpen, lastClose, lastHigh, lastLow }\r\n }\r\n\r\n getRoundedLastData() {\r\n const lastOhlc = this.getLastValues()\r\n return {\r\n open: this.roundOhlc(lastOhlc.lastOpen),\r\n high: this.roundOhlc(lastOhlc.lastHigh),\r\n low: this.roundOhlc(lastOhlc.lastLow),\r\n close: this.roundOhlc(lastOhlc.lastClose),\r\n }\r\n }\r\n\r\n renderYAxis = (context: CanvasRenderingContext2D) => {\r\n const { lastClose } = this.getLastValues()\r\n super.renderYAxis(context, { lastClose }, false)\r\n\r\n const { firstVisibleClose } = this.getMinMax()\r\n if (this.model.scale === ScaleType.Percentage && !firstVisibleClose) return\r\n\r\n const originalLatestClose = this.data.close[this.data.close.length - 1]\r\n const heikinLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\r\n const originalLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose: originalLatestClose, firstVisibleClose })\r\n\r\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: heikinLatestCloseLabel })\r\n\r\n if (heikinLatestCloseLabel === originalLatestCloseLabel) return\r\n\r\n this.renderYAxisLabel({\r\n context,\r\n yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\r\n mainLabelValue: lastClose,\r\n secondaryLabelValue: originalLatestClose,\r\n }),\r\n label: originalLatestCloseLabel,\r\n background: this.getSecondaryLabelBackgroundColor(),\r\n })\r\n }\r\n\r\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n if (barIndex > -1) {\r\n let value = null\r\n if (['high', 'low', 'open', 'close'].includes(key)) {\r\n const data = this.getRenderChartBarProps({ index: barIndex, chartSettingsColors: Colors })\r\n value = data[key as OhlcKeys]\r\n }\r\n value = value === null ? this.data.getDataByBarIndex(key, crossIndex) : value\r\n if (value !== null) {\r\n return shouldReturnRoundedString ? this.roundOhlc(value) : `${value}`\r\n }\r\n }\r\n }\r\n\r\n getCrossIndexChange(crossIndex: number) {\r\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n const haData = this.data.getHeikinAshiData()\r\n const crossClose = haData.close[barIndex] ?? null\r\n const previousClose = haData.close[barIndex - 1] ?? null\r\n if (crossClose !== null && previousClose !== null) {\r\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\r\n }\r\n\r\n return null\r\n }\r\n\r\n toString() {\r\n return `HA Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default HeikinAshi\r\n","import { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Chart from './base_chart'\r\n\r\nclass LineChart extends Chart {\r\n static type = ChartElementType.LineChart\r\n static label = 'Line'\r\n static iconName = 'lineChartType'\r\n\r\n renderChart() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let first: number | undefined, last: number | undefined\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n this.context.beginPath()\r\n this.context.set('lineWidth', 1)\r\n this.context.set('strokeStyle', Colors.line)\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const y = Math.round(this.fy(this.data.close[i]))\r\n this.context.lineTo(x, y)\r\n last = x\r\n if (first === undefined) {\r\n first = x\r\n }\r\n },\r\n })\r\n if (first !== undefined && last !== undefined) {\r\n this.context.stroke()\r\n this.context.set('fillStyle', Colors.background)\r\n this.context.lineTo(last!, this.height)\r\n this.context.lineTo(first!, this.height)\r\n this.context.fill()\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `Line chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default LineChart\r\n","import Text from '../canvas/text'\r\nimport { ChartElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport { isRedesignEnabled } from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\nconst interval = 3\r\nconst domainMin = -1\r\nconst domainMax = 1\r\nconst red = 'rgba(200, 0, 0, 0.392)'\r\nconst redLine = 'rgb(120, 0, 0)'\r\nconst green = 'rgba(0, 180, 0, 0.392)'\r\nconst greenLine = 'rgb(0, 100, 0)'\r\n\r\nclass MarketSentiment extends Chart {\r\n static type = ChartElementType.MarketSentiment\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n return this.model.width - MarketSentimentSettings.left.width - MarketSentimentSettings.right.width\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n return this.paneModel.height - MarketSentimentSettings.top.height - MarketSentimentSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n declare _data: number[]\r\n declare _dataLastIndex: number | null\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.setupCache = this.setupCache.bind(this)\r\n }\r\n\r\n setupCache() {\r\n super.setupCache()\r\n if (!this.data) {\r\n return\r\n }\r\n const arr: number[] = []\r\n this.data.close.forEach((sum, i) => {\r\n arr[i] = sum / this.data.volume[i]\r\n })\r\n this._data = arr\r\n\r\n let lastIndex = null\r\n for (let i = this.data.volume.length - 1; i >= 0; i--) {\r\n if (this.data.volume[i] !== 0) {\r\n lastIndex = i\r\n break\r\n }\r\n }\r\n this._dataLastIndex =\r\n lastIndex === null\r\n ? null\r\n : Math.min(lastIndex, Math.round((this.data.drawMinutesPerDay - this.data.marketStartMinutes) / interval))\r\n }\r\n\r\n renderChart() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + MarketSentimentSettings.left.width + 0.5,\r\n yOffset: MarketSentimentSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n this.renderLineBullBear(this.context, this._data, 0, 0, 0)\r\n translate.undo()\r\n }\r\n\r\n renderLineBullBear(\r\n context: CanvasRenderingContext2D,\r\n array: number[],\r\n from: number,\r\n oversold: number,\r\n overbought: number\r\n ) {\r\n if (this._dataLastIndex === null) {\r\n return\r\n }\r\n const isRedesign = isRedesignEnabled()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n const domain = [domainMax, domainMin]\r\n\r\n context.save()\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(domain[1]),\r\n this.fx(this._dataLastIndex),\r\n Math.round(this.fy(oversold) - this.fy(domain[1])) - 0.5\r\n )\r\n context.clip()\r\n context.set('fillStyle', red)\r\n context.set('strokeStyle', isRedesign ? Colors.marketDown : redLine)\r\n context.beginPath()\r\n context.moveTo(this.fx(0), Math.round(this.fy(domain[0])))\r\n for (let i = from; i < this.data.close.length; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\r\n }\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[0])))\r\n context.fill()\r\n context.stroke()\r\n context.restore()\r\n\r\n context.save()\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(domain[0]),\r\n this.fx(this._dataLastIndex),\r\n Math.round(this.fy(overbought)) - 0.5\r\n )\r\n context.clip()\r\n context.set('fillStyle', green)\r\n context.set('strokeStyle', isRedesign ? Colors.marketUp : greenLine)\r\n context.beginPath()\r\n context.moveTo(this.fx(0), Math.round(this.fy(domain[1])))\r\n for (let i = from; i < this.data.close.length; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\r\n }\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[1])))\r\n context.fill()\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n renderXAxis() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n const { Colors } = MarketSentimentSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + MarketSentimentSettings.left.width,\r\n yOffset: MarketSentimentSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const xLine = this.getXLine()\r\n const text = new Text(\r\n {\r\n y: this.height + 12,\r\n font: { size: 7 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.bottom,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n let x\r\n\r\n x = this.fx(0)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10) + 2 /* remove overflow */\r\n text.set({ text: '10AM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 20)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 40)\r\n text.set({ text: '12PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 60)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 80)\r\n text.set({ text: '2PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 100)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 120 - 1)\r\n text.set({ text: '4PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText() {}\r\n\r\n renderCrossText() {}\r\n\r\n renderOverlaysLabels() {}\r\n\r\n _compute() {\r\n return { min: domainMin, max: domainMax }\r\n }\r\n\r\n computeVisibleMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { MarketSentimentSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const isRedesign = isRedesignEnabled()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: MarketSentimentSettings.left.width,\r\n yOffset: MarketSentimentSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const yLine = this.getYLine()\r\n for (const tick of [domainMin, 0, domainMax]) {\r\n const y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n }\r\n\r\n const text = new Text(\r\n {\r\n x: this.width + 27,\r\n font: { size: 8 },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n\r\n const fillUp = isRedesign ? Colors.marketUp : greenLine\r\n const fillDown = isRedesign ? Colors.marketDown : redLine\r\n const last = this._data[this._dataLastIndex!]\r\n const percent = this._dataLastIndex !== null ? Math.floor(last * 50 + 50) : 50\r\n text.set({ y: this.fy(0) - 5, fillStyle: fillUp, text: `${percent}%` }).render(context)\r\n text.set({ y: this.fy(0) + 7, fillStyle: fillDown, text: `${100 - percent}%` }).render(context)\r\n\r\n translate.undo()\r\n }\r\n\r\n clip() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n this.context.beginPath()\r\n this.context.rect(MarketSentimentSettings.left.width, MarketSentimentSettings.top.height, this.width, this.height)\r\n this.context.clip()\r\n }\r\n\r\n getMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n toString() {\r\n return `Market sentiment chart`\r\n }\r\n}\r\nMarketSentiment.initClass()\r\n\r\nexport default MarketSentiment\r\n","import { ObjectHash } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { ChartElementType, FONT_SIZE, LINE_HEIGHT, PADDING, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\ninterface MultiLineChartAttrs extends BaseChartAttrs {\r\n tickers: string[]\r\n label?: string\r\n min?: number\r\n max?: number\r\n}\r\n\r\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nclass MultiLineChart extends Chart {\r\n static type = ChartElementType.MultiLineChart\r\n tickersDimensions: number[] = []\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n }\r\n\r\n renderChart() {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n\r\n this.context.set('lineWidth', 1)\r\n\r\n const quotes: ObjectHash = {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n\r\n for (let index = this.attrs.tickers.length - 1; index >= 0; index--) {\r\n const ticker = this.attrs.tickers[index]\r\n const quote = quotes[ticker]\r\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n this.context.beginPath()\r\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const x = this.fx(i)\r\n if (x + this.leftOffset < -10 || x + this.leftOffset > this.model.width + 10) {\r\n // margin?\r\n continue\r\n }\r\n const y = Math.round(this.fy(quote.close[i]))\r\n this.context.lineTo(x, y)\r\n }\r\n this.context.stroke()\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const text = this.attrs.label || ''\r\n const y = (this.height - 4) / 2\r\n new Text(\r\n {\r\n text,\r\n x: 28,\r\n y: ChartSettings.top.height + y,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n return this.renderCrossText(context, this.data.close.length - 1)\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const maxTickerLength = utils.max(this.attrs.tickers.map((t) => t.length))\r\n\r\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n const isLastDate = crossIndex === this.data.close.length - 1\r\n\r\n new Text(\r\n {\r\n text: `${months[month]} ${day} ${year} `,\r\n x: ChartSettings.left.width + (maxTickerLength > 15 ? 200 : 132),\r\n y: 30,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n background: Colors.canvasFill,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n\r\n const quotes: ObjectHash = {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const y = PADDING.S + (PADDING.S + LINE_HEIGHT.M) * index\r\n if (this.tickersDimensions[index]) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n ChartSettings.left.width - PADDING.XXXS,\r\n y - PADDING.XXXS,\r\n PADDING.XXXS + this.tickersDimensions[index] + PADDING.XXXS,\r\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\r\n )\r\n }\r\n const ticker = this.attrs.tickers[index]\r\n const closeValue = quotes[ticker].close[crossIndex]\r\n const text = new Text(\r\n {\r\n text: `${ticker} ${typeof closeValue === 'number' ? closeValue.toFixed(2) : NaN} `,\r\n x: ChartSettings.left.width,\r\n y,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n lineHeight: LINE_HEIGHT.M,\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n if (isLastDate) {\r\n this.tickersDimensions[index] = text.measure(context)\r\n }\r\n text.render(context)\r\n }\r\n }\r\n\r\n computeVisibleMinMax(...arrays: Array) {\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n\r\n const { leftOffset } = this.model\r\n for (const arr of arrays) {\r\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\r\n // margin?\r\n continue\r\n }\r\n\r\n if (min > arr[i]) {\r\n min = arr[i]\r\n }\r\n if (max < arr[i]) {\r\n max = arr[i]\r\n }\r\n }\r\n }\r\n\r\n return { min, max }\r\n }\r\n\r\n getMinMax() {\r\n const quotes = this.getQuotes()\r\n let { min, max } = this.computeVisibleMinMax(...quotes.map((q) => q.close))\r\n if (typeof this.attrs.min !== 'undefined') {\r\n min = this.attrs.min\r\n }\r\n if (typeof this.attrs.max !== 'undefined') {\r\n max = this.attrs.max\r\n }\r\n return { min, max }\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n getQuotes() {\r\n return Quote.select(\r\n (q: Quote) =>\r\n this.attrs.tickers.includes(q.ticker) &&\r\n q.timeframe === this.data?.timeframe &&\r\n this.model.chart_layout().isIdeaId(q.ideaID)\r\n )\r\n }\r\n\r\n toString() {\r\n return `Line chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default MultiLineChart\r\n","import { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { getBarWithoutMarginWidth } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Chart from './base_chart'\r\n\r\nclass OHLCChart extends Chart {\r\n static type = ChartElementType.OhlcChart\r\n static label = 'OHLC'\r\n static iconName = 'ohlcChartType'\r\n\r\n renderChart() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const barWithoutMarginWidth = getBarWithoutMarginWidth(this.model)\r\n\r\n let lineWidth = 1\r\n if (barWithoutMarginWidth >= 40) {\r\n lineWidth = 4\r\n } else if (barWithoutMarginWidth >= 30) {\r\n lineWidth = 3\r\n } else if (barWithoutMarginWidth >= 15) {\r\n lineWidth = 2\r\n }\r\n const lineThickness = lineWidth / 2\r\n const handleLengthFromWick = Math.round(barWithoutMarginWidth / 2 - lineThickness)\r\n const lineOffset = lineWidth % 2 === 0 ? 0 : 0.5\r\n this.context.set('lineWidth', lineWidth)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const barX = ~~(x - 1) + lineOffset // move 1px to 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.date.length - 1\r\n let lastVisibleBarIndex = lastQuoteDateIndex\r\n let numOfVisibleBars = 0\r\n if (\r\n [DateRangeType.d1, DateRangeType.d5].includes(dateRange as DateRangeType) &&\r\n quote.instrument === Instrument.Stock\r\n ) {\r\n numOfVisibleBars = quote.drawMinutesPerDay\r\n } else {\r\n let firstVisibleBarIndex = -1\r\n lastVisibleBarIndex = -1\r\n quote.date.forEach((quoteDate, index) => {\r\n if (isQuoteDateInRange(quoteDate)) {\r\n if (firstVisibleBarIndex === -1) {\r\n firstVisibleBarIndex = index\r\n }\r\n lastVisibleBarIndex = index\r\n }\r\n })\r\n numOfVisibleBars = lastVisibleBarIndex - firstVisibleBarIndex + 1\r\n\r\n if (firstVisibleBarIndex === -1 && lastVisibleBarIndex === -1) {\r\n return { numOfVisibleBars: 0, numOfBarsOffset: 0 }\r\n }\r\n }\r\n\r\n return { numOfVisibleBars, numOfBarsOffset: lastQuoteDateIndex - lastVisibleBarIndex }\r\n}\r\n\r\nexport const getChartZoomAndLeftOffset = ({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n chartModel,\r\n numOfBarsToRender,\r\n}: ChartZoomAndLeftOffsetProps) => {\r\n const { numOfVisibleBars, numOfBarsOffset } = getVisibleBarsNumber({\r\n start,\r\n end,\r\n quote,\r\n dateRange: chartModel.dateRange,\r\n })\r\n if (numOfVisibleBars === 0) {\r\n return { zoomFactor: chartModel.zoomFactor, leftOffset: chartModel.leftOffset }\r\n }\r\n\r\n const chartLayout = chartModel.chart_layout()\r\n const zoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth,\r\n numOfVisibleBars: numOfBarsToRender ?? numOfVisibleBars,\r\n })\r\n const barWidth = getBarWidthWithMargin({ chartLayout, zoomFactor })\r\n const leftOffset =\r\n getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: {},\r\n barWidth,\r\n numberOfBarsToDraw: numOfBarsToRender,\r\n }) +\r\n numOfBarsOffset * barWidth\r\n return { zoomFactor, leftOffset }\r\n}\r\n\r\nexport const getChartStartEndDates = ({ dateRange, quote }: ChartStartEndDatesProps) => {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const lastDate = dateFromUnixTimestamp(quote.date[quote.date.length - 1])\r\n\r\n if (dateRange.includes(DATE_RANGE_PREFIX_DELMITER)) {\r\n const range = parseCustomDateRangeUrlParam({ dateRange, anchorDate: lastDate })\r\n const end = convertLocalToNyTime(\r\n range.end && range.end.getTime() <= lastDate.getTime() ? range.end : lastDate,\r\n false\r\n )\r\n return {\r\n start: range.start && convertLocalToNyTime(range.start, false),\r\n end,\r\n }\r\n }\r\n\r\n let start\r\n // No condition is needed here, but this would be dateRangePrefix === DateRangePrefixEnum.Enum\r\n switch (dateRange) {\r\n case DateRangeType.d1:\r\n lastDate.setHours(23, 59, 59, 999)\r\n start = daysInQuote.length === 0 ? lastDate : daysInQuote[daysInQuote.length - 1]\r\n break\r\n case DateRangeType.d5:\r\n lastDate.setHours(23, 59, 59, 999)\r\n const startDateIndex = daysInQuote.length === 0 ? -1 : Math.max(daysInQuote.length - 5, 0)\r\n start = startDateIndex === -1 ? lastDate : daysInQuote[startDateIndex]\r\n break\r\n case DateRangeType.m1:\r\n start = dateFns.subMonths(lastDate, 1)\r\n break\r\n case DateRangeType.m3:\r\n start = dateFns.subMonths(lastDate, 3)\r\n break\r\n case DateRangeType.m6:\r\n start = dateFns.subMonths(lastDate, 6)\r\n break\r\n case DateRangeType.ytd:\r\n start = dateFns.startOfYear(lastDate)\r\n break\r\n case DateRangeType.y1:\r\n start = dateFns.subYears(lastDate, 1)\r\n break\r\n case DateRangeType.y2:\r\n start = dateFns.subYears(lastDate, 2)\r\n break\r\n case DateRangeType.y5:\r\n start = dateFns.subYears(lastDate, 5)\r\n break\r\n case DateRangeType.max:\r\n default:\r\n start = null\r\n break\r\n }\r\n\r\n return { start: start && convertLocalToNyTime(start, false), end: convertLocalToNyTime(lastDate, false) }\r\n}\r\n\r\ninterface GetLeftOffsetProps {\r\n quote: Quote\r\n chartModel: Chart\r\n config?: { stretch?: boolean }\r\n barWidth?: number\r\n barIndex?: number\r\n numberOfBarsToDraw?: number\r\n shouldAlignDaysToLeftApplied?: boolean\r\n}\r\n\r\nexport const getMinMaxLeftOffset = ({\r\n newLeftOffset,\r\n chartModel,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex,\r\n}: {\r\n newLeftOffset: number\r\n chartModel: Chart\r\n barWidth?: number\r\n barIndex: number\r\n}) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const numOfBarsInView = Math.floor(width / barWidth)\r\n const fx = (index: number) => index * barWidth\r\n return ~~Utils.min(barWidth / 2, Utils.max(newLeftOffset, width - fx(barIndex + numOfBarsInView)))\r\n}\r\n\r\nexport function getFullChartWidth({\r\n hasAftermarket,\r\n hasPremarket,\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n}) {\r\n const premarketHoursLength = hasPremarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const aftermarketHoursLength = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const marketMinutesLength = (6.5 + premarketHoursLength + aftermarketHoursLength) * 60\r\n // CHART_MARGIN.L as left offset + CHART_MARGIN.XXL as right offset\r\n return CHART_MARGIN.L + CHART_MARGIN.XXL + (marketMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n}\r\n\r\nexport function getIntradayChartConfig({\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n hasPremarket,\r\n hasAftermarket,\r\n maxWidth,\r\n 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 // We don't want this to affect /charts page, only if intraday daterange is applied\r\n const isQuoteOrOffscreen = [SpecificChartFunctionality.quotePage, SpecificChartFunctionality.offScreen].includes(\r\n specificChartFunctionality\r\n )\r\n const isChartPage = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isChartsInradayDateRange =\r\n isChartPage && !!dateRange && [DateRangeType.d1, DateRangeType.d5].includes(dateRange)\r\n const isChartPageWithFixedBars = isChartPage && numberOfBarsToDraw\r\n return isStockIntraday && (isQuoteOrOffscreen || isChartsInradayDateRange || isChartPageWithFixedBars)\r\n}\r\n\r\ninterface ClipProps {\r\n canvasCtx: RenderingContext2DType\r\n width: number\r\n height: number\r\n Settings: ISettings['ChartSettings'] | ISettings['IndicatorSettings']\r\n}\r\n// pane canvasCtx clip\r\nexport const clip = ({ canvasCtx, width, height, Settings }: ClipProps) => {\r\n const contentWidth = width - Settings.left.width - Settings.right.width\r\n const contentHeight = height - Settings.top.height - Settings.bottom.height\r\n canvasCtx.beginPath()\r\n canvasCtx.rect(Settings.left.width, Settings.top.height, contentWidth, contentHeight)\r\n canvasCtx.clip()\r\n}\r\n\r\nexport const getSettings = (paneModel: Pane): IIndicatorSettings | IChartSettings => {\r\n const { ChartSettings, IndicatorSettings } = paneModel.chart().getChartLayoutSettings()\r\n for (const element of paneModel.elements().all()) {\r\n if (element.isIndicator()) {\r\n return IndicatorSettings\r\n }\r\n }\r\n return ChartSettings\r\n}\r\n\r\ninterface RecountScaleProps {\r\n chartModel: Chart\r\n paneModel: Pane\r\n}\r\n\r\ntype ScaledFn = Partial & (d3.ScaleLinear | d3.ScaleSymLog)\r\n\r\nconst getShouldOffsetChartDomain = (elementModel: Element | ChartEventElement) => {\r\n const quote = elementModel.pane().chart().quote()\r\n\r\n return quote.chartEvents.length > 0 && ![TIMEFRAME.w, TIMEFRAME.m].includes(quote.timeframe)\r\n}\r\n\r\nexport const recountScale = ({ chartModel, paneModel }: RecountScaleProps) => {\r\n const { ChartSettings, IndicatorSettings, MarketSentimentSettings } = chartModel.getChartLayoutSettings()\r\n const chartLayout = chartModel.chart_layout()\r\n const barWidthWithMargin = getBarWidthWithMargin({ chartLayout, zoomFactor: chartModel.zoomFactor })\r\n for (const elementModel of [...paneModel.getAllElements(), ...paneModel.getAllChartEvents(false)]) {\r\n const el = elementModel.instance\r\n const isChart = elementModel.isChart()\r\n if (isChart || elementModel.isIndicator()) {\r\n let fx: ScaledFn, Settings: ISettings['MarketSentimentSettings' | 'ChartSettings' | 'IndicatorSettings'], width\r\n const scaleType = isChart ? chartModel.scale : ScaleType.Linear\r\n if (isChart) {\r\n Settings = chartModel.instrument === Instrument.MarketSentiment ? MarketSentimentSettings : ChartSettings\r\n } else {\r\n Settings = IndicatorSettings as ISettings['IndicatorSettings']\r\n }\r\n const contentHeight = paneModel.height - Settings.top.height - Settings.bottom.height\r\n\r\n if (chartModel.stretch) {\r\n width = chartModel.width - Settings.left.width - Settings.right.width\r\n fx = d3\r\n .scaleLinear()\r\n .range([0, width])\r\n .domain([0, Math.max(0, chartModel.quote().close.length - 1)]) as ScaledFn\r\n } else {\r\n fx = ((index: number) => index * barWidthWithMargin) as ScaledFn\r\n fx.invert = (x: number) => x / barWidthWithMargin\r\n fx.width = function (w) {\r\n return this.invert(w) - this.invert(0)\r\n }\r\n }\r\n paneModel.updateAttribute('scale', { x: fx }) // some elements need fx to count getMinMax\r\n\r\n const { min, max } = paneModel.scaleRange || el.getMinMax!()\r\n let fy\r\n\r\n const handleDomainOffset = (currentScale: ScaledFn, scaleCreator: any) => {\r\n if (isChart && getShouldOffsetChartDomain(elementModel)) {\r\n const protectedHeightPx = contentHeight - CHART_EVENT_BADGE_SIZE\r\n const minPx = currentScale(min)\r\n const domain = currentScale.domain()\r\n if (minPx > protectedHeightPx) {\r\n const tempScale = scaleCreator().range([0, protectedHeightPx]).domain([max, min])\r\n const extendedMin = tempScale.invert(contentHeight)\r\n currentScale.domain([domain[0], extendedMin])\r\n }\r\n }\r\n }\r\n\r\n switch (scaleType) {\r\n case ScaleType.Logarithmic:\r\n fy = d3.scaleSymlog().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n handleDomainOffset(fy, d3.scaleSymlog)\r\n break\r\n default:\r\n fy = d3.scaleLinear().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n if (!paneModel.scaleRange) {\r\n fy = fy.nice(10)\r\n handleDomainOffset(fy, d3.scaleLinear)\r\n }\r\n break\r\n }\r\n fy.height = function (h: number) {\r\n return this.invert(h) - this.invert(0)\r\n }\r\n paneModel.updateAttribute('scale', {\r\n x: fx,\r\n y: fy,\r\n })\r\n\r\n if (isChart) {\r\n el.setupAxis!(fx as ScaleAxis)\r\n }\r\n break\r\n }\r\n }\r\n}\r\n\r\n// general, only when blurry ends won't be visible or didn't matter\r\nexport const getOffsetFromLineWidth = (lineWidth: number) => (lineWidth % 2 === 0 ? 0 : 0.5)\r\n\r\ninterface IXYOffsetFromLine {\r\n lineWidth: number\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n}\r\n\r\n// return x,y offsets for pixel perfect line rendering\r\nexport const getXYOffsetFromLine = ({ lineWidth, x1, y1, x2, y2 }: IXYOffsetFromLine) => {\r\n // don't add offset is lineWidth is even\r\n if (lineWidth % 2 === 0) {\r\n return { x: 0, y: 0 }\r\n }\r\n if (y1 === y2) {\r\n return { x: 0, y: 0.5 } // horizontal line\r\n } else if (x1 === x2) {\r\n return { x: 0.5, y: 0 } // vertical line\r\n } else {\r\n return { x: 0.5, y: 0.5 } // diagonal line\r\n }\r\n}\r\n\r\nexport const getRoundedObject = (obj: T): T => {\r\n const rounded = Object.entries(obj)\r\n for (let i = 0; i < rounded.length; i++) {\r\n rounded[i][1] = Math.round(rounded[i][1])\r\n }\r\n return Object.fromEntries(rounded) as T\r\n}\r\n\r\ninterface ITranslate {\r\n context: CanvasRenderingContext2D\r\n xOffset: number\r\n yOffset: number\r\n}\r\n\r\ninterface ITranslateObj {\r\n do: () => void\r\n undo: () => void\r\n}\r\n\r\nexport const getTranslate = ({ context, xOffset, yOffset }: ITranslate): ITranslateObj => ({\r\n do: () => context.translate(xOffset, yOffset),\r\n undo: () => context.translate(xOffset * -1, yOffset * -1),\r\n})\r\n\r\ninterface IPercentageScaleValue {\r\n number: number\r\n base: number\r\n}\r\n\r\nexport const getPercentageFromValue = ({ number, base }: IPercentageScaleValue) => ((number - base) / base) * 100\r\n\r\nexport const getValueFromPercentage = ({ number, base }: IPercentageScaleValue) => (number / 100) * base + base\r\n\r\ninterface UpdateZoomAndLeftOffsetByDateRangeProps {\r\n chartModel: Chart\r\n quote: Quote\r\n}\r\n\r\nexport function updateZoomAndLeftOffsetByDateRange({ chartModel, quote }: UpdateZoomAndLeftOffsetByDateRangeProps) {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const chartVisibleWidth = chartModel.width - (ChartSettings.left.width + ChartSettings.right.width)\r\n\r\n const { start, end, numOfBarsToRender } = getParsedDateRangeMetaData({\r\n dateRange: chartModel.dateRange,\r\n quote,\r\n })\r\n\r\n const { zoomFactor, leftOffset } = getChartZoomAndLeftOffset({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n numOfBarsToRender,\r\n chartModel: chartModel,\r\n })\r\n\r\n if (chartModel.zoomFactor !== zoomFactor || chartModel.leftOffset !== leftOffset) {\r\n chartModel.updateAttributes({ zoomFactor, leftOffset })\r\n }\r\n}\r\n\r\nexport function renderPane({\r\n chartLayoutModel,\r\n chartModel,\r\n paneModel,\r\n canvasCtx,\r\n shouldRenderCross = false,\r\n}: {\r\n chartLayoutModel: ChartLayout\r\n chartModel: Chart\r\n paneModel: Pane\r\n canvasCtx: CanvasRenderingContext2D\r\n shouldRenderCross?: boolean\r\n}) {\r\n if (paneModel.chart().instrument === Instrument.MarketSentiment) {\r\n canvasCtx.clearRect(0, 0, chartModel.width, paneModel.height)\r\n } else {\r\n canvasCtx.set('fillStyle', chartModel.getChartLayoutSettings().ChartSettings.general.Colors.canvasFill)\r\n canvasCtx.fillRect(0, 0, chartModel.width, paneModel.height)\r\n }\r\n const elements = paneModel.getAllElements()\r\n for (const { instance: elementInstance } of elements) {\r\n if (typeof elementInstance.renderGrid === 'function') {\r\n canvasCtx.save()\r\n elementInstance.renderGrid(canvasCtx)\r\n canvasCtx.restore()\r\n }\r\n }\r\n\r\n const chartEvents = paneModel.getAllChartEvents()\r\n const Settings = getSettings(paneModel)\r\n for (const { instance: elementInstance } of [...elements, ...chartEvents]) {\r\n const isDrawing = elementInstance.getIsDrawing()\r\n const isChartEvent = elementInstance.getIsChartEvent()\r\n\r\n if (isDrawing && (chartLayoutModel.isHideDrawingsActive || !elementInstance.getIsVisible())) {\r\n continue\r\n } else if ((isDrawing || isChartEvent) && !elementInstance.getIsInChartView(chartModel)) {\r\n continue\r\n }\r\n\r\n canvasCtx.save()\r\n if (elementInstance.renderContent != null) {\r\n canvasCtx.save()\r\n clip({\r\n canvasCtx,\r\n width: chartModel.width,\r\n height: paneModel.height,\r\n Settings,\r\n })\r\n canvasCtx.translate(paneModel.chart().leftOffset + Settings.left.width, Settings.top.height)\r\n elementInstance.renderContent(canvasCtx)\r\n canvasCtx.restore()\r\n if (typeof elementInstance.renderLabels === 'function') {\r\n elementInstance.renderLabels(canvasCtx)\r\n }\r\n } else {\r\n elementInstance.render(canvasCtx)\r\n }\r\n if (\r\n shouldRenderCross &&\r\n (chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage ||\r\n isRedesignedPage(chartLayoutModel)) &&\r\n elementInstance.renderCross != null\r\n ) {\r\n elementInstance.renderCross(canvasCtx)\r\n }\r\n canvasCtx.restore()\r\n }\r\n}\r\n","export const DEFAULT_WIDTHS = {\r\n min: 200,\r\n max: 400,\r\n}\r\n\r\nexport enum SidebarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n","import React from 'react'\r\n\r\nimport { DEFAULT_WIDTHS, SidebarDirection } from '../constants'\r\nimport { SidebarModule, SidebarModuleType } from '../modules/modules'\r\n\r\nexport type SidebarContextType = {\r\n isOpen: boolean\r\n isCloseVisible: boolean\r\n direction: SidebarDirection\r\n width?: {\r\n min?: number | string\r\n max?: number | string\r\n default?: { desktop?: number; mobile?: number }\r\n }\r\n activeModule: SidebarModuleType | null\r\n close: () => void\r\n onResize: () => void\r\n selectModule: (module?: SidebarModule) => void\r\n}\r\n\r\nconst DEFAULT_CONTEXT: SidebarContextType = {\r\n activeModule: null,\r\n isOpen: false,\r\n isCloseVisible: false,\r\n direction: SidebarDirection.horizontal,\r\n width: DEFAULT_WIDTHS,\r\n close: () => {},\r\n onResize: () => {},\r\n selectModule: () => {},\r\n}\r\n\r\nexport const SidebarContext = React.createContext(DEFAULT_CONTEXT)\r\nexport const useSidebarContext = () => React.useContext(SidebarContext)\r\n","import { IconNameType } from '@finviz/website'\r\n\r\nimport ChartLayout from '../../models/chart_layout'\r\n\r\nexport enum DrawingTool {\r\n Arrow = 'arrow',\r\n Brush = 'brush',\r\n Callout = 'callout',\r\n Curve = 'curve',\r\n ElliottWaves = 'elliott-wave',\r\n Ellipse = 'ellipse',\r\n FibonacciRetracements = 'fibonacci-retracements',\r\n HorizontalLine = 'horizontal-line',\r\n Measure = 'measure',\r\n Mouse = 'mouse',\r\n Pitchfork = 'pitchfork',\r\n Polygon = 'polygon',\r\n Position = 'position',\r\n Rectangle = 'rectangle',\r\n RotatedRectangle = 'rotated-rectangle',\r\n ScaledLine = 'scaled-line',\r\n ScaledText = 'scaled-text',\r\n Triangle = 'triangle',\r\n VerticalLine = 'vertical-line',\r\n Xabcd = 'xabcd',\r\n}\r\n\r\nexport enum DrawingActions {\r\n AddNote = 'add-note',\r\n DeleteDrawings = 'delete-drawings',\r\n DeleteAutoSavedDrawings = 'delete-autosaved-drawings',\r\n}\r\n\r\nexport enum DrawingSetting {\r\n PreserveDrawings = 'preserve-drawings',\r\n DrawingModeContinuous = 'drawing-mode-continuous',\r\n HideDrawings = 'hide-drawings',\r\n LockDrawings = 'lock-drawings',\r\n}\r\n\r\nexport interface IToolBarProps {\r\n chartLayoutModel: ChartLayout\r\n isSidebar?: boolean\r\n isHorizontal?: boolean\r\n isMobileOverlay?: boolean\r\n /**\r\n * Current selected tool id\r\n */\r\n activeTool: DrawingTool\r\n /**\r\n * On tool item select callback\r\n */\r\n onActiveToolChange: (activeTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => void\r\n /**\r\n * On drawing actions item select callback\r\n */\r\n onDrawingActionClick?: (actionId: DrawingActions) => void\r\n /**\r\n * On drawing settings item select callback\r\n */\r\n onDrawingSettingClick?: (settingId: DrawingSetting) => void\r\n /**\r\n * On drawing end callback\r\n */\r\n onDrawingEnd?: () => void\r\n /**\r\n * Current state of drawing settings\r\n */\r\n drawingSettings: Record\r\n isAlternativeTheme?: boolean\r\n /**\r\n * Are tools disabled\r\n */\r\n areToolsDisabled?: boolean\r\n}\r\n\r\nexport interface IToolbarItemProperties {\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport interface IToolbarDrawingTool extends IToolbarItemProperties {\r\n id: DrawingTool\r\n}\r\n\r\nexport interface IToolbarDrawingAction extends IToolbarItemProperties {\r\n id: DrawingActions\r\n}\r\n\r\nexport interface IToolbarDrawingSetting extends IToolbarItemProperties {\r\n id: DrawingSetting\r\n}\r\n\r\nexport interface IToolbarDrawingToolItem {\r\n defaultItem: IToolbarDrawingTool\r\n toolGroup?: Array\r\n toolGroupTitle?: string\r\n}\r\n\r\nexport interface IToolbarDrawingActionItem {\r\n defaultItem: IToolbarDrawingAction\r\n isDisabled?: boolean\r\n disabledTooltip?: string\r\n}\r\n\r\nexport interface IToolbarDrawingsSettingItem {\r\n defaultItem: IToolbarDrawingSetting\r\n isDisabled?: boolean\r\n isInAction?: boolean\r\n disabledTooltip?: string\r\n}\r\n","import { Instrument } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport QuoteModel from '../models/quote'\r\n\r\nexport function getInstrumentLabel(instrument: Instrument) {\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n return 'Stock'\r\n case Instrument.Futures:\r\n return 'Futures'\r\n case Instrument.Forex:\r\n return 'Forex'\r\n case Instrument.Crypto:\r\n return 'Crypto'\r\n case Instrument.MarketSentiment:\r\n return 'Market Sentiment'\r\n }\r\n}\r\n\r\nexport function getChartAlt(quoteModel: QuoteModel) {\r\n return `${quoteModel.name || quoteModel.ticker} - ${getInstrumentLabel(quoteModel.instrument)} Price Chart`\r\n}\r\n\r\nexport const getResponseChartType = (chartType: ChartElementType) => {\r\n switch (chartType) {\r\n case ChartElementType.HeikinAshi:\r\n return 'heikinashi'\r\n case ChartElementType.HollowCandleStick:\r\n return 'hollowcandlestick'\r\n case ChartElementType.LineChart:\r\n return 'line'\r\n case ChartElementType.OhlcChart:\r\n return 'ohlc'\r\n case ChartElementType.CandleStick:\r\n default:\r\n return 'candlestick'\r\n }\r\n}\r\n\r\nexport const getChartElementTypeFromResponseType = (chartResponseType: string | null) =>\r\n chartResponseType === null\r\n ? null\r\n : Object.values(ChartElementType).find(\r\n (chartType: ChartElementType) => chartResponseType === getResponseChartType(chartType)\r\n )\r\n","import utils from '../utils'\r\n\r\nclass AverageTrueRange {\r\n period: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(high: number, low: number, prevClose: number) {\r\n const tr = utils.max([high - low, Math.abs(high - prevClose), Math.abs(low - prevClose)])\r\n\r\n if (this.count < this.period) {\r\n this.sum += tr\r\n this.value = this.sum / (this.count + 1)\r\n if (this.count === this.period - 1) {\r\n this.sum /= this.period\r\n }\r\n } else {\r\n this.value = (this.value * (this.period - 1) + tr) / this.period\r\n }\r\n this.count++\r\n }\r\n}\r\n\r\nexport default AverageTrueRange\r\n","import { Instrument, Point } from '../../types/shared'\r\n\r\ninterface LinePoints {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport enum BigNumber {\r\n Thousand,\r\n Million,\r\n Billion,\r\n Trillion,\r\n}\r\n\r\nexport const BIG_NUMBER_VALUES = {\r\n [BigNumber.Thousand]: 1e3,\r\n [BigNumber.Million]: 1e6,\r\n [BigNumber.Billion]: 1e9,\r\n [BigNumber.Trillion]: 1e12,\r\n}\r\n\r\nconst BIG_NUMBER_ZEROES = {\r\n [BigNumber.Thousand]: 3,\r\n [BigNumber.Million]: 6,\r\n [BigNumber.Billion]: 9,\r\n [BigNumber.Trillion]: 12,\r\n}\r\n\r\nconst BIG_NUMBER_SUFFIX = {\r\n [BigNumber.Thousand]: 'K',\r\n [BigNumber.Million]: 'M',\r\n [BigNumber.Billion]: 'B',\r\n [BigNumber.Trillion]: 'T',\r\n}\r\n\r\nconst math = {\r\n dotProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.x + p1.y * p2.y\r\n },\r\n\r\n crossProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.y - p1.y * p2.x\r\n },\r\n\r\n distance(p1: Point, p2: Point) {\r\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2))\r\n },\r\n\r\n lineEquation(line: LinePoints) {\r\n // ax + by + c = 0\r\n if (line.x1 === line.x2) {\r\n return {\r\n a: 1,\r\n b: 0,\r\n c: -line.x1,\r\n }\r\n }\r\n const k = (line.y2 - line.y1) / (line.x2 - line.x1)\r\n return {\r\n a: -k,\r\n b: 1,\r\n c: k * line.x1 - line.y1,\r\n k,\r\n }\r\n },\r\n\r\n pointInPolygon(point: Point, polygon: Point[]) {\r\n // http://alienryderflex.com/polygon/\r\n let j = polygon.length - 1\r\n let oddNodes = false\r\n for (let i = 0; i < polygon.length; i++) {\r\n const p = polygon[i]\r\n if (\r\n ((p.y < point.y && polygon[j].y >= point.y) || (polygon[j].y < point.y && p.y >= point.y)) &&\r\n (p.x <= point.x || polygon[j].x <= point.x)\r\n ) {\r\n if (p.x + ((point.y - p.y) / (polygon[j].y - p.y)) * (polygon[j].x - p.x) < point.x) {\r\n oddNodes = !oddNodes\r\n }\r\n }\r\n j = i\r\n }\r\n return oddNodes\r\n },\r\n\r\n distanceToLine(point: Point, line: LinePoints) {\r\n const { a, b, c } = this.lineEquation(line)\r\n const dist = Math.abs(a * point.x + b * point.y + c) / Math.sqrt(a * a + b * b)\r\n return dist\r\n },\r\n\r\n distanceToSegment(point: Point, line: LinePoints) {\r\n const l2 = Math.pow(line.x1 - line.x2, 2) + Math.pow(line.y1 - line.y2, 2)\r\n if (l2 === 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n const t = ((point.x - line.x1) * (line.x2 - line.x1) + (point.y - line.y1) * (line.y2 - line.y1)) / l2\r\n if (t < 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n if (t > 1) {\r\n return Math.sqrt(Math.pow(point.x - line.x2, 2) + Math.pow(point.y - line.y2, 2))\r\n }\r\n const x = line.x1 + t * (line.x2 - line.x1)\r\n const y = line.y1 + t * (line.y2 - line.y1)\r\n return Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2))\r\n },\r\n\r\n getInstrumentDecimalPlaces({ value, instrument }: { value: number; instrument?: Instrument }) {\r\n if (instrument === Instrument.Crypto && value <= 0.001) {\r\n return 8\r\n }\r\n\r\n if ((instrument !== Instrument.Stock && value <= 6) || (instrument === Instrument.Stock && value < 1)) {\r\n return 4\r\n }\r\n\r\n return 2\r\n },\r\n\r\n formatBigNumber(number: number, toFixed?: number, minNumber?: BigNumber) {\r\n const absNum = Math.abs(number)\r\n const getString = ({ num, suffix, zeroes }: { num: number; suffix: string; zeroes: number }) => {\r\n const str = num.toString()\r\n if (str.includes('e')) {\r\n const splitString = str.split('e')\r\n const addZeroes = Number(splitString[1]) - zeroes\r\n return Math.round(Number(splitString[0])).toString().padEnd(Math.max(0, addZeroes), '0') + suffix\r\n }\r\n const sign = Math.sign(num)\r\n const numberByZeroesCount = Math.pow(10, zeroes)\r\n const result = (absNum / numberByZeroesCount) * sign\r\n return (Number.isInteger(result) ? result : result.toFixed(toFixed !== undefined ? toFixed : 1)) + suffix\r\n }\r\n\r\n if (absNum >= BIG_NUMBER_VALUES[BigNumber.Trillion] || minNumber === BigNumber.Trillion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Trillion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Trillion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Billion] || minNumber === BigNumber.Billion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Billion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Billion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Million] || minNumber === BigNumber.Million) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Million],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Million],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Thousand] || minNumber === BigNumber.Thousand) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Thousand],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Thousand],\r\n })\r\n } else {\r\n return toFixed !== undefined ? number.toFixed(toFixed) : number.toString()\r\n }\r\n },\r\n\r\n round({\r\n value,\r\n lastClose = 0,\r\n instrument,\r\n overridePlaces,\r\n }: {\r\n value: number\r\n lastClose?: number\r\n instrument?: Instrument\r\n overridePlaces?: number\r\n }) {\r\n if (Math.abs(value) >= BIG_NUMBER_VALUES[BigNumber.Million]) {\r\n return this.formatBigNumber(value, overridePlaces)\r\n }\r\n\r\n const places =\r\n typeof overridePlaces === 'number'\r\n ? overridePlaces\r\n : this.getInstrumentDecimalPlaces({ value: lastClose, instrument })\r\n\r\n if (value < 0.000001) {\r\n // There was an issue with getting NaN when rounding small numbers with latter method\r\n return value.toFixed(places)\r\n }\r\n return Number(`${Math.round(Number(`${value}e+${places}`))}e-${places}`).toFixed(places)\r\n },\r\n\r\n perpendicularPointToLine({ line, distance }: { line: LinePoints; distance: number }) {\r\n if (distance === 0) {\r\n return { x: line.x2, y: line.y2 }\r\n }\r\n\r\n let yAxisCoeficient\r\n let xAxisCoeficient\r\n\r\n if (line.x1 <= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 <= line.x2 && line.y1 <= line.y2) {\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 >= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = 1\r\n } else {\r\n // conditions falling to else: (line.x1 >= line.x2 && line.y1 <= line.y2)\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = 1\r\n }\r\n\r\n const radAngle = Math.atan2(Math.abs(line.x2 - line.x1), Math.abs(line.y2 - line.y1))\r\n const x = line.x2 + xAxisCoeficient * (distance * Math.cos(radAngle))\r\n const y = line.y2 + yAxisCoeficient * (distance * Math.sin(radAngle))\r\n return { x, y }\r\n },\r\n\r\n rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n }: {\r\n rotationAxisPoint: Point\r\n angle: number\r\n pointToRotate: Point\r\n }) {\r\n // return newCoordinates for pointToRotate after rotation defined by\r\n // angle around rotationAxisPoint\r\n const sin = Math.sin(angle)\r\n const cos = Math.cos(angle)\r\n const rotatedX =\r\n cos * (pointToRotate.x - rotationAxisPoint.x) +\r\n sin * (pointToRotate.y - rotationAxisPoint.y) +\r\n rotationAxisPoint.x\r\n const rotatedY =\r\n cos * (pointToRotate.y - rotationAxisPoint.y) -\r\n sin * (pointToRotate.x - rotationAxisPoint.x) +\r\n rotationAxisPoint.y\r\n return { x: rotatedX, y: rotatedY }\r\n },\r\n sharedPointLinesAngle({\r\n sharedPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n sharedPoint: Point\r\n oldLinePoint: Point\r\n newLinePoint: Point\r\n }) {\r\n // return angle between line from sharedPoint to oldLinePoint and\r\n // line from sharedPoint to newLinePoint\r\n const numerator =\r\n oldLinePoint.y * (sharedPoint.x - newLinePoint.x) +\r\n sharedPoint.y * (newLinePoint.x - oldLinePoint.x) +\r\n newLinePoint.y * (oldLinePoint.x - sharedPoint.x)\r\n const denominator =\r\n (oldLinePoint.x - sharedPoint.x) * (sharedPoint.x - newLinePoint.x) +\r\n (oldLinePoint.y - sharedPoint.y) * (sharedPoint.y - newLinePoint.y)\r\n const ratio = numerator / denominator\r\n\r\n return Math.atan(ratio)\r\n },\r\n\r\n twoSegmentLinesIntersection(p1: Point, p2: Point, p3: Point, p4: Point) {\r\n // line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/\r\n // Determine the intersection point of two line segments\r\n // Return FALSE if the lines don't intersect\r\n\r\n // Check if none of the lines are of length 0\r\n if ((p1.x === p2.x && p1.y === p2.y) || (p3.x === p4.x && p3.y === p4.y)) {\r\n return false\r\n }\r\n\r\n const denominator = (p4.y - p3.y) * (p2.x - p1.x) - (p4.x - p3.x) * (p2.y - p1.y)\r\n\r\n // Lines are parallel\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n const ua = ((p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x)) / denominator\r\n const ub = ((p2.x - p1.x) * (p1.y - p3.y) - (p2.y - p1.y) * (p1.x - p3.x)) / denominator\r\n\r\n // is the intersection along the segments\r\n if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\r\n return false\r\n }\r\n\r\n // Return a object with the x and y coordinates of the intersection\r\n const x = p1.x + ua * (p2.x - p1.x)\r\n const y = p1.y + ua * (p2.y - p1.y)\r\n\r\n return { x, y }\r\n },\r\n\r\n // https://stackoverflow.com/a/60368757\r\n checkLineIntersection(line1_p1: Point, line1_p2: Point, line2_p1: Point, line2_p2: Point) {\r\n // if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite) and booleans for whether line segment 1 or line segment 2 contain the point\r\n let a, b\r\n const result: { x: number; y: number; onLine1: boolean; onLine2: boolean } = {\r\n x: 0,\r\n y: 0,\r\n onLine1: false,\r\n onLine2: false,\r\n }\r\n const denominator =\r\n (line2_p2.y - line2_p1.y) * (line1_p2.x - line1_p1.x) - (line2_p2.x - line2_p1.x) * (line1_p2.y - line1_p1.y)\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n a = line1_p1.y - line2_p1.y\r\n b = line1_p1.x - line2_p1.x\r\n const numerator1 = (line2_p2.x - line2_p1.x) * a - (line2_p2.y - line2_p1.y) * b\r\n const numerator2 = (line1_p2.x - line1_p1.x) * a - (line1_p2.y - line1_p1.y) * b\r\n a = numerator1 / denominator\r\n b = numerator2 / denominator\r\n\r\n // if we cast these lines infinitely in both directions, they intersect here:\r\n result.x = line1_p1.x + a * (line1_p2.x - line1_p1.x)\r\n result.y = line1_p1.y + a * (line1_p2.y - line1_p1.y)\r\n\r\n // if line1 is a segment and line2 is infinite, they intersect if:\r\n if (a > 0 && a < 1) {\r\n result.onLine1 = true\r\n }\r\n // if line2 is a segment and line1 is infinite, they intersect if:\r\n if (b > 0 && b < 1) {\r\n result.onLine2 = true\r\n }\r\n // if line1 and line2 are segments, they intersect if both of the above are true\r\n return result\r\n },\r\n\r\n // ray is considered line1, segment is considered line2\r\n getRayToLineSegmentIntersection(rayOrigin: Point, rayEnd: Point, segmentStart: Point, segmentEnd: Point) {\r\n const lineIntersection = this.checkLineIntersection(rayOrigin, rayEnd, segmentStart, segmentEnd)\r\n\r\n if (\r\n !lineIntersection ||\r\n lineIntersection.onLine1 ||\r\n this.dotProduct(\r\n this.subtractPoints(rayOrigin, lineIntersection as Point),\r\n this.subtractPoints(rayOrigin, rayEnd)\r\n ) <= 0\r\n )\r\n return false\r\n return { ...lineIntersection, x: Math.round(lineIntersection.x), y: Math.round(lineIntersection.y) } // sometimes edge value can have crazy precision instead of `0` something like `5.684341886080802e-14` which is basically 0.00000000000005684341886080802 we should round it\r\n },\r\n\r\n getMiddlePointOnLineSegment(P1: Point, P2: Point) {\r\n const x = (P1.x - P2.x) / 2 + P2.x\r\n const y = (P1.y - P2.y) / 2 + P2.y\r\n return { x, y }\r\n },\r\n\r\n normalizeVector(v: Point) {\r\n const length = Math.sqrt(v.x * v.x + v.y * v.y)\r\n return { x: v.x / length, y: v.y / length }\r\n },\r\n\r\n multiplyVectorByScalar(v: Point, scalar: number) {\r\n return { x: v.x * scalar, y: v.y * scalar }\r\n },\r\n\r\n addPoints(P1: Point, P2: Point) {\r\n return { x: P1.x + P2.x, y: P1.y + P2.y }\r\n },\r\n\r\n subtractPoints(P1: Point, P2: Point): Point {\r\n return { x: P1.x - P2.x, y: P1.y - P2.y }\r\n },\r\n\r\n isSamePoint(P1: Point, P2: Point, margin = { x: 0, y: 0 }) {\r\n return P1.x - margin.x <= P2.x && P2.x <= P1.x + margin.x && P1.y - margin.y <= P2.y && P2.y <= P1.y + margin.y\r\n },\r\n}\r\n\r\nexport default math\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\nexport class ExponentialMovingAverage {\r\n period: number\r\n multiplier: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.multiplier = 2 / (this.period + 1)\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(d: number) {\r\n if (this.count < this.period) {\r\n this.sum += d\r\n this.count++\r\n this.value = this.sum / this.count\r\n } else {\r\n this.value = d * this.multiplier + this.value * (1 - this.multiplier)\r\n }\r\n }\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n ema: number[]\r\n}\r\n\r\nexport class EMACalculation extends MainCalculation {\r\n static type = OverlayType.Ema\r\n\r\n getDefaultCalculatedValues() {\r\n return { ema: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n const ema = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let index = 0; index <= lastIndex; index++) {\r\n ema.add(close[index])\r\n this.calculatedValues.ema[index] = ema.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { IndicatorType, OverlayType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\n\r\ntype OptionValuesType = ObjectHash\r\ntype CalculatedValuesType = ObjectHash\r\ninterface MainProps {\r\n quote?: Quote\r\n options: T\r\n}\r\n\r\nexport type OnValueCalculatedReturnValue = boolean | undefined\r\nexport type OnValueCalculated = ((value: T, dataIndex: number) => OnValueCalculatedReturnValue) | undefined\r\n\r\nexport class MainCalculation<\r\n TOptionValues extends OptionValuesType | undefined = undefined,\r\n TCalculatedValues extends CalculatedValuesType = CalculatedValuesType,\r\n> {\r\n static type: IndicatorType | OverlayType = IndicatorType.Indicator\r\n\r\n quote: NonNullable['quote']>\r\n options: MainProps['options']\r\n\r\n protected _calculatedValues: TCalculatedValues\r\n\r\n constructor({ quote, options }: MainProps) {\r\n this.quote = quote ?? new Quote()\r\n this.options = options\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n }\r\n\r\n get calculatedValues() {\r\n return this._calculatedValues\r\n }\r\n\r\n getDefaultCalculatedValues(): TCalculatedValues {\r\n throw Error('Implement getDefaultCalculatedValues')\r\n }\r\n\r\n calculate(_: OnValueCalculated) {\r\n throw Error('Implement calculate')\r\n }\r\n\r\n getAllCalculatedValues(lastNItems: number) {\r\n const calculatedValues = {} as TCalculatedValues\r\n Object.keys(this.calculatedValues).forEach((key) => {\r\n calculatedValues[key as keyof TCalculatedValues] = this.getCalculatedValues(key, lastNItems)\r\n })\r\n return calculatedValues\r\n }\r\n\r\n getCalculatedValues(key: keyof TCalculatedValues, lastNItems: number) {\r\n return (this.calculatedValues[key] as number[]).slice(-lastNItems) as TCalculatedValues[keyof TCalculatedValues]\r\n }\r\n\r\n /**\r\n * This function is used to construct sql script for db table creation\r\n * and also to build precalculated data object used on node server.\r\n *\r\n * Precalculated data object uses database column names as property keys to simplify data mapping on BE\r\n */\r\n getDbColumnName() {\r\n const { type } = this.constructor as typeof MainCalculation\r\n const typeLabel = type.split('/')[1]\r\n const optionKeys = Object.keys(this.options ?? {}).sort((key1, key2) => key1.localeCompare(key2))\r\n\r\n const optionsStrings = optionKeys.map((key) => `${key.slice(0, 1)}${this.options![key]}`)\r\n return [typeLabel, ...optionsStrings].join('_')\r\n }\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n CustomSpineEvents,\r\n IModalConfig,\r\n IModalConfigInput,\r\n ObjectHash,\r\n PaneArea,\r\n RequireByKey,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport {\r\n FONT_SIZE,\r\n INDICATOR_LABEL_HEIGHT,\r\n IndicatorType,\r\n OFFSET,\r\n PADDING,\r\n SpecificChartFunctionality,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport mouseModel from '../models/mouse'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport { isRedesignEnabled } from '../utils'\r\nimport { roundedRect } from '../utils/canvas-render'\r\nimport { renderCross } from '../utils/chart'\r\nimport {\r\n drawInVisibleArea,\r\n getAreNoBarsVisible,\r\n getCompensatedFirstBarToRenderIndex,\r\n getVisibleBarToRenderIndex,\r\n} from '../utils/draw_in_visible_area'\r\nimport { getIsSSr, getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\r\n\r\nconst MAX_POSITIVE_DEFAULT_VALUE = Number.MAX_VALUE\r\nconst MAX_NEGATIVE_DEFAULT_VALUE = -Number.MAX_VALUE\r\n\r\nconst INDICATOR_DEFAULT_DOMAIN = (indicator: IndicatorType) => {\r\n switch (indicator) {\r\n case IndicatorType.Rvol:\r\n return { min: 0, max: 2 }\r\n case IndicatorType.Atr:\r\n return { min: 0, max: 10 }\r\n case IndicatorType.Adx:\r\n case IndicatorType.Aro:\r\n case IndicatorType.Mfi:\r\n case IndicatorType.Perf:\r\n case IndicatorType.Rmi:\r\n case IndicatorType.Rsi:\r\n case IndicatorType.Stofu:\r\n case IndicatorType.Ult:\r\n return { min: 0, max: 100 }\r\n case IndicatorType.Macd:\r\n case IndicatorType.Rwi:\r\n case IndicatorType.Trix:\r\n return { min: -1, max: 1 }\r\n case IndicatorType.Wr:\r\n return { min: -100, max: 0 }\r\n case IndicatorType.Aroosc:\r\n case IndicatorType.Roc:\r\n return { min: -100, max: 100 }\r\n case IndicatorType.Cci:\r\n case IndicatorType.Fi:\r\n return { min: -200, max: 200 }\r\n default:\r\n return { min: 0, max: 100 }\r\n }\r\n}\r\n\r\nexport interface IIndicatorIsValid {\r\n getIsValid(key: string): boolean | void\r\n}\r\n\r\nclass Indicator extends Spine.Module implements IIndicatorIsValid {\r\n static type = IndicatorType.Indicator\r\n static label = 'Indicator'\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n return this.model.height\r\n },\r\n })\r\n Object.defineProperty(this.prototype, 'contentHeight', {\r\n get() {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n return this.height - IndicatorSettings.top.height - IndicatorSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n static fromObject(values: ObjectHash, model: Pane) {\r\n const indicator = new this(values, model)\r\n indicator.set(values)\r\n return indicator\r\n }\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt\r\n }\r\n\r\n declare data: Quote\r\n declare min: number\r\n declare max: number\r\n declare contentHeight: number\r\n declare height: number\r\n\r\n attrs: Attrs\r\n model: Pane\r\n labelWidth = 0\r\n fetchedAt = -1\r\n leftOffset = 0\r\n width = 0\r\n contentWidth = 0\r\n lastValue: number | null = null\r\n shouldUpdate = true\r\n tickers: string | null = null\r\n period?: string | number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.attrs = attrs\r\n this.model = model\r\n this.data = this.model.chart().quote()\r\n\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.renderCrossText = this.renderCrossText.bind(this)\r\n\r\n this.model.chart().bind('update', this.trigger.bind(this, 'change'))\r\n this.model.bind('update change', this.trigger.bind(this, 'change'))\r\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\r\n this.model.bind('destroy', () => {\r\n mouseModel.unbind('change', mouseModelChangeHandler)\r\n })\r\n mouseModel.bind('change', mouseModelChangeHandler)\r\n\r\n this.model.chart().chart_layout().bind('theme', this.setupCache.bind(this))\r\n }\r\n\r\n get type() {\r\n return (this.constructor as typeof Indicator).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Indicator).label\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n this.data = this.model.chart().quote()\r\n this.leftOffset = this.model.chart().leftOffset\r\n this.width = this.model.chart().width\r\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\r\n\r\n this.compute()\r\n\r\n this.setupCache()\r\n\r\n this.renderYAxis(context)\r\n\r\n context.save()\r\n this.clip(context)\r\n this.renderXAxis(context)\r\n const translate = getTranslate({\r\n context,\r\n xOffset: this.leftOffset + IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n this.renderIndicator(context)\r\n translate.undo()\r\n context.restore()\r\n\r\n if (!this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabel(context)\r\n }\r\n }\r\n\r\n isComputeNecessary() {\r\n // if quote was updated (this.fetchedAt !== this.data.fetchedAt)\r\n // or indicator setting was changed via modal (this.shouldUpdate)\r\n // allow compute and update variables to prevent another unless\r\n // those variables change again\r\n if (this.fetchedAt !== this.data.fetchedAt || this.shouldUpdate) {\r\n this.fetchedAt = this.data.fetchedAt\r\n this.shouldUpdate = false\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let y\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const ticks = this.model.scale.y.ticks(10)\r\n const tickTextStep = Math.abs(ticks[2] - ticks[0])\r\n const yLine = new Line(\r\n {\r\n x1: 0,\r\n x2: this.contentWidth,\r\n strokeStyle: Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.model\r\n )\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n for (let index = 0; index < ticks.length; index++) {\r\n const tick = ticks[index]\r\n y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n if (index % 2 === 0) {\r\n text.set({ text: this.formatAxis(tick, tickTextStep), y }).render(context)\r\n }\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.contentHeight\r\n const valueY = this.lastValue === null ? 0 : Math.round(this.fy(this.lastValue))\r\n if (this.lastValue != null && valueY >= minY && valueY <= maxY) {\r\n new Text(\r\n {\r\n text: math.formatBigNumber(this.lastValue, 2),\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n y: valueY,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n background: Colors.indicatorCurrentBackground,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderXAxis(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const xLine = new Line(\r\n {\r\n x1: 0,\r\n x2: 0,\r\n y1: 0,\r\n y2: this.contentHeight,\r\n strokeStyle: Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.model\r\n )\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n for (let tick = 0, end = this.data.date.length; tick < end; tick += 10) {\r\n const x = Math.round(this.fx(tick) + this.leftOffset)\r\n if (x < -15 || x > this.width + 15) {\r\n // margin?\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderLabel(context: CanvasRenderingContext2D) {\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabelChartsPage(context)\r\n } else {\r\n this.renderLabelQuotePage(context)\r\n }\r\n }\r\n\r\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const label = new Text(\r\n {\r\n text: this.toString(),\r\n x: IndicatorSettings.left.indicatorLabel.margin.left,\r\n y: IndicatorSettings.left.indicatorLabel.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n )\r\n this.labelWidth = label.measure(context)\r\n return label.render(context)\r\n }\r\n\r\n renderLabelChartsPage(context: CanvasRenderingContext2D): { x: number; y: number; labelWidth: number } | void {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const { theme, specificChartFunctionality } = this.model.chart().chart_layout()\r\n const isDarkMode = theme === Theme.dark\r\n const x =\r\n specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n ? OFFSET.S\r\n : IndicatorSettings.left.indicatorLabel.margin.left!\r\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\r\n const label = new Text(\r\n {\r\n text: this.toString(),\r\n x: x * 2,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n this.labelWidth = label.measure(context) + IndicatorSettings.left.indicatorLabel.margin.left! * 2\r\n label.set({ y: y + (INDICATOR_LABEL_HEIGHT - label.attrs.lineHeight / 2) })\r\n roundedRect({\r\n ctx: context,\r\n x,\r\n y,\r\n height: INDICATOR_LABEL_HEIGHT,\r\n width: this.labelWidth,\r\n radius: 6,\r\n color: `${tailwindColors.gray[isDarkMode ? 700 : 50]}cc`,\r\n })\r\n label.render(context)\r\n\r\n return { x, y, labelWidth: this.labelWidth }\r\n }\r\n\r\n renderCross(context: CanvasRenderingContext2D) {\r\n renderCross({\r\n context,\r\n mouseModel,\r\n paneModel: this.model,\r\n quote: this.data,\r\n contentWidth: this.contentWidth,\r\n contentHeight: this.contentHeight,\r\n isIndicator: true,\r\n isPerfIndicator: this.type === IndicatorType.Perf,\r\n onRenderCrossText: !this.getIsChartPageSpecificFunctionality() ? this.renderCrossText : undefined,\r\n })\r\n\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.model))\r\n }\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n this.data = this.model.chart().quote()\r\n const index = Number.isNaN(crossIndex) ? this.data.close.length - 1 : crossIndex\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabelChartsPage(context)\r\n\r\n this.renderCrossTextChartsPage(context, index)\r\n } else {\r\n this.renderCrossTextQuotePage(context, index)\r\n }\r\n }\r\n\r\n renderCrossTextChartsPage(_: CanvasRenderingContext2D, __: number) {}\r\n\r\n renderCrossTextQuotePage(_: CanvasRenderingContext2D, __: number) {}\r\n\r\n renderOversoldOverbought(\r\n context: CanvasRenderingContext2D,\r\n array: number[],\r\n from: number,\r\n oversold: number,\r\n zero: number,\r\n overbought: number,\r\n drawLines?: boolean\r\n ) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n if (this.data.close.length === 0) return\r\n const drawInVisibleAreaProps = {\r\n fromIndexOffset: from,\r\n leftOffset: this.leftOffset,\r\n paneModel: this.model,\r\n quote: this.data,\r\n width: this.width,\r\n }\r\n\r\n const firstBarToRenderIndex = getCompensatedFirstBarToRenderIndex(drawInVisibleAreaProps)\r\n\r\n if (drawLines == null) {\r\n drawLines = true\r\n }\r\n\r\n context.save()\r\n\r\n let clipHeight = Math.round(this.fy(oversold) - this.fy(this.model.scale.y.domain()[1]))\r\n if (clipHeight <= 0 || getIsSSr()) {\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(this.model.scale.y.domain()[1]) + 1, // compensation to addition of 1 in clip function\r\n this.contentWidth,\r\n clipHeight < 0 ? clipHeight - 1 : -1 // clipHeight - 1 is a compensation to addition of 1 in clip function ; fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\r\n )\r\n }\r\n context.clip()\r\n context.set('fillStyle', '#87ceef')\r\n\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRenderIndex), Math.round(this.fy(this.model.scale.y.domain()[0])))\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[0])))\r\n context.fill()\r\n context.restore()\r\n if (drawLines) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(oversold)),\r\n y2: Math.round(this.fy(oversold)),\r\n strokeStyle: '#69c1ea',\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n if (drawLines) {\r\n this.renderZeroLine(context, zero)\r\n }\r\n\r\n context.save()\r\n clipHeight = Math.round(this.fy(overbought))\r\n if (clipHeight >= 0 || getIsSSr()) {\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(this.model.scale.y.domain()[0]),\r\n this.contentWidth,\r\n clipHeight > 0 ? clipHeight : 1 // // fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\r\n )\r\n }\r\n\r\n context.clip()\r\n context.set('fillStyle', '#dc9fe5')\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRenderIndex), Math.round(this.fy(this.model.scale.y.domain()[1])))\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[1]) + 1))\r\n context.fill()\r\n context.restore()\r\n if (drawLines) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(overbought)),\r\n y2: Math.round(this.fy(overbought)),\r\n strokeStyle: '#d386df',\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\r\n context.set('fillStyle', '#dc9fe5')\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(Math.round(x), Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderZeroLine(context: CanvasRenderingContext2D, zero: number) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(zero)),\r\n y2: Math.round(this.fy(zero)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n setupCache() {}\r\n\r\n clip(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n context.beginPath()\r\n context.rect(IndicatorSettings.left.width, IndicatorSettings.top.height, this.contentWidth, this.contentHeight + 1) // +1 shows one more pixel which is needed to be able to see a line at very bottom of an indicaor\r\n return context.clip()\r\n }\r\n\r\n formatAxis(value: number, tickStep?: number) {\r\n if (tickStep !== undefined && 10 > tickStep) {\r\n return value.toFixed(2)\r\n }\r\n return value.toString()\r\n }\r\n\r\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\r\n\r\n fy = (y: number) => this.model.scale.y(y)\r\n\r\n set(values: Partial) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n this.shouldUpdate = true\r\n for (const key in values) {\r\n if (key !== 'type') {\r\n // @ts-expect-error - values keys don't have to always match variables on the instance\r\n this[key] = values[key]\r\n }\r\n }\r\n this.width = this.model.chart().width\r\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\r\n\r\n const newAttrs = this.getModalConfig()\r\n .inputs.map(({ value }) => value.toString())\r\n .join(',')\r\n if (newAttrs) this.attrs = { ...this.attrs, period: newAttrs }\r\n\r\n this.model.trigger(CustomSpineEvents.ManualChange)\r\n }\r\n\r\n parsePeriodInt(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n this.period = Number.parseInt(values.period, 10)\r\n this.model.trigger(CustomSpineEvents.ManualChange)\r\n }\r\n }\r\n\r\n setModel(model: Pane) {\r\n return (this.model = model)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const x = IndicatorSettings.left.indicatorLabel.margin.left!\r\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\r\n let width = OFFSET.M * 2 + this.labelWidth\r\n let height = OFFSET.S * 2 + FONT_SIZE.M\r\n\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n width = this.labelWidth\r\n height = INDICATOR_LABEL_HEIGHT\r\n }\r\n\r\n if (x < area.cursorX && area.cursorX < width + x && y < area.cursorY && area.cursorY < height + y) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n getIsInChartView(_: Chart) {\r\n return true\r\n }\r\n\r\n moveBy() {}\r\n\r\n thumbsAreInArea() {\r\n return false\r\n }\r\n\r\n computeVisibleMinMax(...arrays: number[][]) {\r\n let min = MAX_POSITIVE_DEFAULT_VALUE\r\n let max = MAX_NEGATIVE_DEFAULT_VALUE\r\n\r\n const { leftOffset } = this.model.chart()\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth: this.contentWidth,\r\n })\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n for (const arr of arrays) {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n if (!isNaN(arr[i])) {\r\n min = Math.min(min, arr[i])\r\n max = Math.max(max, arr[i])\r\n }\r\n }\r\n }\r\n\r\n return !areNoBarsVisible && min !== max && min !== MAX_POSITIVE_DEFAULT_VALUE && max !== MAX_NEGATIVE_DEFAULT_VALUE\r\n ? { min, max }\r\n : this.getDomainDefaults(this.type)\r\n }\r\n\r\n getModalConfig(): IModalConfig {\r\n return {\r\n title: '',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getDomainDefaults = (indicatorType: IndicatorType) => INDICATOR_DEFAULT_DOMAIN(indicatorType)\r\n\r\n getMinMax() {\r\n this.data = this.model.chart().quote()\r\n this.compute()\r\n return { min: this.min, max: this.max }\r\n }\r\n\r\n toObject() {\r\n return merge({}, this.attrs, { type: this.type, tickers: this.tickers })\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return {\r\n type: this.type,\r\n period: this.getModalConfig()\r\n .inputs.map((input: IModalConfigInput) => input.value.toString())\r\n .join(','),\r\n }\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart().chart_layout())\r\n }\r\n\r\n renderIndicator(_: CanvasRenderingContext2D) {\r\n throw Error('Implement renderIndicator method')\r\n }\r\n\r\n getIsValid(_: string): boolean | undefined {\r\n throw Error('Implement')\r\n }\r\n\r\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\r\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\r\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\r\n }\r\n\r\n getIsChartPageSpecificFunctionality() {\r\n const { specificChartFunctionality } = this.model.chart().chart_layout()\r\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isRedesignedFuturesForexCrypto =\r\n isRedesignEnabled() &&\r\n [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n SpecificChartFunctionality.quotePage,\r\n ].includes(specificChartFunctionality)\r\n\r\n return isCharts || isRedesignedFuturesForexCrypto\r\n }\r\n\r\n getIsDrawing() {\r\n return false\r\n }\r\n\r\n getIsChartEvent() {\r\n return false\r\n }\r\n\r\n compute() {\r\n throw Error('Implement compute method')\r\n }\r\n}\r\n\r\nIndicator.initClass()\r\n\r\nexport default Indicator\r\n","export function roundedRect({\r\n ctx,\r\n x,\r\n y,\r\n width,\r\n height,\r\n radius,\r\n color,\r\n}: {\r\n ctx: CanvasRenderingContext2D\r\n x: number\r\n y: number\r\n width: number\r\n height: number\r\n radius: number\r\n color: string\r\n}) {\r\n ctx.translate(0.5, 0.5)\r\n ctx.set('strokeStyle', color)\r\n ctx.set('fillStyle', color)\r\n ctx.beginPath()\r\n ctx.moveTo(x, y + radius)\r\n ctx.lineTo(x, y + height - radius)\r\n ctx.arcTo(x, y + height, x + radius, y + height, radius)\r\n ctx.lineTo(x + width - radius, y + height)\r\n ctx.arcTo(x + width, y + height, x + width, y + height - radius, radius)\r\n ctx.lineTo(x + width, y + radius)\r\n ctx.arcTo(x + width, y, x + width - radius, y, radius)\r\n ctx.lineTo(x + radius, y)\r\n ctx.arcTo(x, y, x, y + radius, radius)\r\n ctx.stroke()\r\n ctx.fill()\r\n ctx.translate(-0.5, -0.5)\r\n}\r\n","import { IndicatorType } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ADX extends Indicator {\r\n static type = IndicatorType.Adx\r\n static label = 'ADX'\r\n\r\n declare period: number\r\n pdi: number[] = []\r\n mdi: number[] = []\r\n adx: number[] = []\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n let adx, amdm, apdm, mdi, pdi\r\n this.pdi = []\r\n this.mdi = []\r\n this.adx = []\r\n let atr = (apdm = amdm = adx = 0)\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n const deltaHigh = this.data.high[i] - this.data.high[i - 1]\r\n const deltaLow = this.data.low[i - 1] - this.data.low[i]\r\n\r\n let pdm = 0\r\n if (deltaHigh > 0 && deltaHigh > deltaLow) {\r\n pdm = deltaHigh\r\n }\r\n\r\n let mdm = 0\r\n if (deltaLow > 0 && deltaLow > deltaHigh) {\r\n mdm = deltaLow\r\n }\r\n\r\n const tr = utils.max([\r\n this.data.high[i] - this.data.low[i],\r\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\r\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\r\n ])\r\n\r\n atr = (atr * (this.period - 1) + tr) / this.period\r\n apdm = (apdm * (this.period - 1) + pdm) / this.period\r\n amdm = (amdm * (this.period - 1) + mdm) / this.period\r\n\r\n pdi = atr > 0 ? (apdm * 100) / atr : 0\r\n mdi = atr > 0 ? (amdm * 100) / atr : 0\r\n const di = Math.abs(pdi - mdi)\r\n const dx = pdi + mdi > 0 ? (di * 100) / (pdi + mdi) : 0\r\n adx = (adx * (this.period - 1) + dx) / this.period\r\n\r\n this.pdi[i] = pdi\r\n this.mdi[i] = mdi\r\n this.adx[i] = adx\r\n }\r\n this.lastValue = this.adx.last() ?? null\r\n }\r\n const { min, max } =\r\n this.pdi.length > 0 || this.mdi.length > 0 || this.adx.length > 0\r\n ? this.computeVisibleMinMax(this.pdi, this.mdi, this.adx)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', '#2eb12e')\r\n context.beginPath()\r\n\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.pdi[i])))\r\n },\r\n })\r\n\r\n context.stroke()\r\n\r\n context.set('strokeStyle', '#d43737')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.mdi[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.beginPath()\r\n\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.adx[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ADX ${this.period}`\r\n }\r\n}\r\n\r\nexport default ADX\r\n","import { IndicatorType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n aroonUp: number[]\r\n aroonDown: number[]\r\n oscillator: number[]\r\n}\r\n\r\nexport class AroonCalculation extends MainCalculation {\r\n static type = IndicatorType.Aro\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n aroonUp: [],\r\n aroonDown: [],\r\n oscillator: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { low, high } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = period; i < high.length; i++) {\r\n const highPeriod = high.slice(i - period, i + 1)\r\n const highestInPeriod = Math.max(...highPeriod)\r\n const periodSinceHigh = period - highPeriod.lastIndexOf(highestInPeriod)\r\n this._calculatedValues.aroonUp[i] = 100 * ((period - periodSinceHigh) / period)\r\n\r\n const lowPeriod = low.slice(i - period, i + 1)\r\n const lowestInPeriod = Math.min(...lowPeriod)\r\n const periodSinceLow = period - lowPeriod.lastIndexOf(lowestInPeriod)\r\n this._calculatedValues.aroonDown[i] = 100 * ((period - periodSinceLow) / period)\r\n\r\n this._calculatedValues.oscillator[i] = this._calculatedValues.aroonUp[i] - this._calculatedValues.aroonDown[i]\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import Text from '../canvas/text'\r\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { AroonCalculation } from '../indicator-calculation/aroon'\r\nimport Pane from '../models/pane'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nconst COLORS = {\r\n aroonUp: '#00a000',\r\n aroonDown: '#c80000',\r\n}\r\n\r\nclass Aroon extends Indicator {\r\n static type = IndicatorType.Aro\r\n static label = 'Aroon'\r\n\r\n aroonCalculation: AroonCalculation | null = null\r\n declare period: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n }\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.aroonCalculation !== null) return\r\n\r\n this.aroonCalculation = new AroonCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.aroonCalculation.calculate()\r\n\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0 || !this.aroonCalculation) return\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', COLORS.aroonUp)\r\n context.beginPath()\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(aroonUp[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', COLORS.aroonDown)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(aroonDown[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n super.renderYAxis(context)\r\n if (!this.aroonCalculation) return\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n },\r\n this.model\r\n )\r\n const textLabels = []\r\n if (aroonDown.length > 0) {\r\n textLabels.push({\r\n text: aroonDown.last()!.toFixed(2),\r\n y: Math.round(this.fy(aroonDown.last()!)),\r\n background: COLORS.aroonDown,\r\n })\r\n }\r\n if (aroonUp.length > 0) {\r\n textLabels.push({\r\n text: aroonUp.last()!.toFixed(2),\r\n y: Math.round(this.fy(aroonUp.last()!)),\r\n background: COLORS.aroonUp,\r\n })\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 25,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Aroon ${this.period}`\r\n }\r\n}\r\n\r\nexport default Aroon\r\n","import { IndicatorType } from '../constants/common'\r\nimport { AroonCalculation } from '../indicator-calculation/aroon'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass AroonOscillator extends Indicator {\r\n static type = IndicatorType.Aroosc\r\n static label = 'Aroon Oscillator'\r\n\r\n aroonCalculation: AroonCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.aroonCalculation !== null) return\r\n\r\n this.aroonCalculation = new AroonCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.aroonCalculation.calculate()\r\n\r\n this.lastValue = this.aroonCalculation.calculatedValues.oscillator.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(\r\n context,\r\n this.aroonCalculation?.calculatedValues.oscillator ?? [],\r\n this.period,\r\n 0,\r\n 0,\r\n 0,\r\n false\r\n )\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 25,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Aroon Oscillator ${this.period}`\r\n }\r\n}\r\n\r\nexport default AroonOscillator\r\n","import { IndicatorType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ATR extends Indicator {\r\n static type = IndicatorType.Atr\r\n static label = 'Average True Range'\r\n\r\n atr: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.atr = []\r\n const atr = new AverageTrueRange(this.period)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\r\n this.atr[i] = atr.value\r\n }\r\n\r\n this.lastValue = this.atr.last() ?? null\r\n }\r\n const { min, max } = this.atr.length > 0 ? this.computeVisibleMinMax(this.atr) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.atr[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ATR ${this.period}`\r\n }\r\n}\r\n\r\nexport default ATR\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nconst constant = 0.015\r\nclass CommodityChannelIndex extends Indicator {\r\n static type = IndicatorType.Cci\r\n static label = 'Commodity Channel Index'\r\n\r\n cci: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n let smaCount\r\n const tp = []\r\n this.cci = []\r\n let smaSum = (smaCount = 0)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let devCount\r\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\r\n tp[i] = typicalPrice\r\n\r\n smaSum += typicalPrice\r\n smaCount++\r\n if (smaCount > this.period) {\r\n smaSum -= tp[i - this.period]\r\n smaCount--\r\n }\r\n const sma = smaSum / smaCount\r\n\r\n if (i < this.period - 1) {\r\n continue\r\n }\r\n\r\n let devSum = (devCount = 0)\r\n for (let j = i - this.period + 1; j <= i; j++) {\r\n devSum += Math.abs(tp[j] - sma)\r\n devCount++\r\n }\r\n\r\n const dev = devSum / devCount\r\n this.cci[i] = 0\r\n if (dev > 0) {\r\n this.cci[i] = (typicalPrice - sma) / (constant * dev)\r\n }\r\n }\r\n\r\n this.lastValue = this.cci.last() ?? null\r\n }\r\n\r\n const { min, max } = this.cci.length > 0 ? this.computeVisibleMinMax(this.cci) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.cci, this.period, -100, 0, 100)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 20,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `CCI ${this.period}`\r\n }\r\n}\r\n\r\nexport default CommodityChannelIndex\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash, Theme } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport { INDICATOR_LABEL_HEIGHT, IndicatorType, TextAlign, TextBaseline } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\nexport interface ICOT {\r\n code: string\r\n name: string\r\n units: string\r\n commercialHedgers: number[]\r\n largeTraders: number[]\r\n smallTraders: number[]\r\n}\r\n\r\ninterface Attrs {\r\n period: string\r\n code: string\r\n}\r\n\r\ntype ColorsKeys = keyof Pick\r\n\r\nclass COT extends Indicator {\r\n static type = IndicatorType.Cot\r\n static label = 'COT'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n declare colors: ObjectHash\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() || !this.data.COTs) return\r\n const cotQuoteCode = Object.keys(this.data.COTs)[0]\r\n if (!this.attrs.code && cotQuoteCode) {\r\n this.attrs.code = cotQuoteCode\r\n }\r\n const cot = this.data.COTs[this.attrs.code]\r\n const [min, max] = utils.minMax(cot.commercialHedgers, cot.largeTraders, cot.smallTraders)\r\n this.max = Math.max(Math.abs(max), Math.abs(min))\r\n this.min = -this.max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (!this.data.COTs) return\r\n context.translate(0.5, 0.5)\r\n for (const key in this.colors) {\r\n context.set('strokeStyle', this.colors[key as ColorsKeys])\r\n context.beginPath()\r\n const data = this.data.COTs[this.attrs.code][key as ColorsKeys]\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(data[i])))\r\n },\r\n })\r\n context.stroke()\r\n }\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderLabel(context: CanvasRenderingContext2D) {\r\n if (!this.data.COTs) return\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const name = new Text(\r\n {\r\n text: this.toString(),\r\n x: 8,\r\n y: 16,\r\n font: { size: 10, style: 'bold' },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n )\r\n name.render(context)\r\n\r\n new Text(\r\n {\r\n text: this.data.COTs[this.attrs.code].units as string,\r\n x: 38 + name.measure(),\r\n y: 16,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n this.renderAdditionalLabels(context)\r\n }\r\n\r\n renderLabelChartsPage(context: CanvasRenderingContext2D) {\r\n const { x, y, labelWidth } = super.renderLabelChartsPage(context) as { x: number; y: number; labelWidth: number }\r\n\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const isDarkMode = this.model.chart().chart_layout().theme === Theme.dark\r\n const secondarylabelX = labelWidth + x * 2\r\n const fontSettings = IndicatorSettings.left.indicatorLabel.font\r\n const scaleCoefficient = 0.7\r\n\r\n const secondarylabel = new Text(\r\n {\r\n text: this.data.COTs[this.attrs.code].units as string,\r\n x: secondarylabelX + x,\r\n font: Text.getMergedPropsWithDefaults('font', {\r\n ...fontSettings,\r\n size: fontSettings.size ? fontSettings.size * scaleCoefficient : undefined,\r\n style: 'normal',\r\n }),\r\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n secondarylabel.set({\r\n y: y + (INDICATOR_LABEL_HEIGHT * scaleCoefficient - (secondarylabel.attrs.lineHeight * scaleCoefficient) / 2),\r\n })\r\n secondarylabel.render(context)\r\n\r\n this.renderAdditionalLabels(context)\r\n }\r\n\r\n renderAdditionalLabels(context: CanvasRenderingContext2D) {\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n new Text(\r\n {\r\n text: 'COT',\r\n x: 23,\r\n y: IndicatorSettings.top.height + (IndicatorSettings.bottom.height + this.contentHeight) / 2,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n const text = new Text(\r\n {\r\n text: 'Commercial Hedgers',\r\n x: IndicatorSettings.left.width,\r\n y: IndicatorSettings.top.height + this.contentHeight + IndicatorSettings.bottom.height - 1, // allign to very bottom of indicator with 1 pixel bottom padding\r\n font: { size: 8, style: 'bold' },\r\n fillStyle: this.colors.commercialHedgers,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n )\r\n text.render(context)\r\n\r\n let x = text.get('x')! + 8 + text.measure()\r\n text.set({ text: 'Large Traders', x, fillStyle: this.colors.largeTraders })\r\n text.render(context)\r\n\r\n x += 8 + text.measure()\r\n text.set({ text: 'Small Traders', x, fillStyle: this.colors.smallTraders })\r\n text.render(context)\r\n }\r\n\r\n formatAxis(value: number) {\r\n // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\r\n const scaleY = this.model.scale.y as unknown as d3.ScaleLinear\r\n return scaleY.tickFormat(4, 's')(value).replace(/G/, 'B')\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: 'COT',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toString() {\r\n return this.data?.COTs ? (this.data.COTs[this.attrs.code].name as string) : undefined\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return {\r\n type: this.type,\r\n code: this.attrs.code,\r\n }\r\n }\r\n}\r\n\r\nCOT.prototype.colors = {\r\n commercialHedgers: '#10cc10',\r\n largeTraders: '#cc1010',\r\n smallTraders: '#1010cc',\r\n}\r\n\r\nexport default COT\r\n","import { IndicatorType } from '../constants/common'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n fi: number[]\r\n}\r\n\r\nexport class FICalculation extends MainCalculation {\r\n static type = IndicatorType.Fi\r\n\r\n getDefaultCalculatedValues() {\r\n return { fi: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close, volume } = this.quote\r\n const ema = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let index = 1; index < close.length; index++) {\r\n const value = ((close[index] - close[index - 1]) * volume[index]) / 1000000\r\n ema.add(value)\r\n this.calculatedValues.fi[index] = ema.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { IndicatorType } from '../constants/common'\r\nimport { FICalculation } from '../indicator-calculation/fi'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ForceIndex extends Indicator {\r\n static type = IndicatorType.Fi\r\n static label = 'Force Index'\r\n\r\n fiCalculation: FICalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.fiCalculation = new FICalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.period,\r\n },\r\n })\r\n this.fiCalculation.calculate()\r\n this.lastValue = this.fiCalculation.calculatedValues.fi.last() ?? null\r\n }\r\n const fi = this.fiCalculation?.calculatedValues.fi ?? []\r\n const { min, max } = fi.length > 0 ? this.computeVisibleMinMax(fi) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.fiCalculation?.calculatedValues.fi ?? [], 1, 0, 0, 0, false)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 13,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `FORCE ${this.period}`\r\n }\r\n}\r\n\r\nexport default ForceIndex\r\n","import { IndicatorType } from '../constants/common'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n fastPeriod: number\r\n slowPeriod: number\r\n signalPeriod: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n macd: number[]\r\n signal: number[]\r\n histogram: number[]\r\n}\r\n\r\nexport class MACDCalculation extends MainCalculation {\r\n static type = IndicatorType.Macd\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n macd: [],\r\n signal: [],\r\n histogram: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { close } = this.quote\r\n const { fastPeriod, slowPeriod, signalPeriod } = this.options\r\n const emaFast = new ExponentialMovingAverage(fastPeriod)\r\n const emaSlow = new ExponentialMovingAverage(slowPeriod)\r\n const emaSignal = new ExponentialMovingAverage(signalPeriod)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = 0; i < close.length; i++) {\r\n const d = close[i]\r\n\r\n emaFast.add(d)\r\n emaSlow.add(d)\r\n const macd = emaFast.value - emaSlow.value\r\n emaSignal.add(macd)\r\n\r\n this.calculatedValues.macd[i] = macd\r\n this.calculatedValues.signal[i] = emaSignal.value\r\n this.calculatedValues.histogram[i] = macd - emaSignal.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { MACDCalculation } from '../indicator-calculation/macd'\r\nimport { 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","unstable_timeout","isActive","isBlurAfterClick","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","isQuoteOrOffscreen","isChartsInradayDateRange","getShouldOffsetChartDomain","scaleType","handleDomainOffset","currentScale","scaleCreator","protectedHeightPx","minPx","extendedMin","rounded","fromEntries","_numOfDaysToRender","_quote$getBarsInDay","parsedRange","startQuoteDate","endQuoteDate","numOfDaysToRender","_reversedDaysInQuote$","_reversedDaysInQuote$2","reversedDaysInQuote","startQuoteDayIndex","endQuoteDayIndex","renderDateStart","renderDateEnd","getParsedDateRangeMetaData","shouldRenderCross","DEFAULT_CONTEXT","getInstrumentLabel","getResponseChartType","chartType","chartResponseType","tr","BigNumber","BIG_NUMBER_VALUES","Thousand","Million","Billion","Trillion","BIG_NUMBER_ZEROES","BIG_NUMBER_SUFFIX","dotProduct","crossProduct","pow","lineEquation","k","j","oddNodes","l2","formatBigNumber","minNumber","absNum","getString","suffix","zeroes","splitString","addZeroes","padEnd","numberByZeroesCount","isInteger","yAxisCoeficient","xAxisCoeficient","radAngle","p3","p4","denominator","ua","ub","checkLineIntersection","line1_p1","line1_p2","line2_p1","line2_p2","onLine1","onLine2","numerator1","numerator2","rayEnd","segmentStart","segmentEnd","lineIntersection","v","scalar","isSamePoint","ExponentialMovingAverage","multiplier","EMACalculation","MainCalculation","getDefaultCalculatedValues","ema","calculate","onValueCalculated","_calculatedValues","calculatedValues","Ema","getAllCalculatedValues","lastNItems","getCalculatedValues","getDbColumnName","_this$options","key1","key2","localeCompare","MAX_POSITIVE_DEFAULT_VALUE","MAX_NEGATIVE_DEFAULT_VALUE","periodInt","getParsedIntegersFromPeriodString","Rvol","Atr","Adx","Aro","Mfi","Rmi","Rsi","Stofu","Ult","Macd","Rwi","Trix","Wr","Aroosc","Roc","Cci","Fi","INDICATOR_DEFAULT_DOMAIN","compute","renderIndicator","getIsChartPageSpecificFunctionality","renderLabel","isComputeNecessary","shouldUpdate","tickTextStep","formatAxis","valueY","lastValue","_IndicatorSettings$ri","_IndicatorSettings$ri2","_IndicatorSettings$ri3","_IndicatorSettings$ri4","_IndicatorSettings$ri5","_IndicatorSettings$ri6","_IndicatorSettings$ri7","_IndicatorSettings$ri8","indicatorCurrentText","indicatorCurrentBackground","renderLabelChartsPage","renderLabelQuotePage","indicatorLabel","labelWidth","roundedRect","isPerfIndicator","renderCrossTextChartsPage","renderCrossTextQuotePage","renderOversoldOverbought","zero","drawLines","drawInVisibleAreaProps","fromIndexOffset","getCompensatedFirstBarToRenderIndex","clipHeight","renderZeroLine","tickStep","parsePeriodInt","setModel","areNoBarsVisible","getDomainDefaults","inputsErrorMessages","getIsValid","getIsNumberInputValid","integerOnly","isPositiveInteger","ADX","_this$adx$last","adx","amdm","apdm","mdi","pdi","atr","deltaHigh","deltaLow","pdm","mdm","di","_this$period","AroonCalculation","aroonUp","aroonDown","oscillator","highPeriod","highestInPeriod","periodSinceHigh","lastIndexOf","lowPeriod","lowestInPeriod","periodSinceLow","COLORS","Aroon","aroonCalculation","textLabels","labelSetting","AroonOscillator","_this$aroonCalculatio","_this$aroonCalculatio2","_this$aroonCalculatio3","ATR","_this$atr$last","AverageTrueRange","CommodityChannelIndex","_this$cci$last","smaCount","tp","cci","smaSum","devCount","typicalPrice","sma","devSum","dev","COT","cotQuoteCode","cot","commercialHedgers","largeTraders","smallTraders","units","renderAdditionalLabels","secondarylabelX","fontSettings","secondarylabel","FICalculation","fi","ForceIndex","_this$fiCalculation$c2","_this$fiCalculation","_this$fiCalculation$c","fiCalculation","_this$fiCalculation$c3","_this$fiCalculation2","MACDCalculation","macd","signal","histogram","fastPeriod","slowPeriod","signalPeriod","emaFast","emaSlow","emaSignal","MACD","_this$macdCalculation","macdCalculation","signalLine","_this$fastPeriod","_this$slowPeriod","_this$signalPeriod","MFI","_this$mfi$last","negativeMoneyFlow","mf","mfi","prevTypicalPrice","positiveMoneyFlow","moneyFlow","oldMF","OBV","_this$obv$last","obv","currentObv","Obv","PricePerformance","getTickers","chartUuid","hasCachedData","getTickersAndTimeframe","firstFetchCalled","getAll","_this$model$scaleRang","_this$model$scaleRang2","_this$model$scaleRang3","_this$model$scaleRang4","firstBarTime","lastBarTime","dateToIndex","getDateToIndex","perfArrays","_this$quotes","_this$quotes2","_this$quotes3","crossIndexTickerTimeStamp","tickerDateToIndex","tickerPerformance","indicatorLabelWidth","performanceIndicatorLabel","_this$quotes4","_tickerQuote$close$le","isVertical","labelBottom","canFitItemsVertically","tickerQuote","maxCrossIndex","_this$quotes5","_this$quotes6","tickerTextWidth","crossText","getSanitizedTicker","RMI","momentum","_this$rmi$last","rmi","u","ad","au","sumu","sumd","rs","_this$momentum","ROC","_this$roc$last","roc","RsiCalculation","rsi","RSI","_this$rsiCalculation$","rsiCalculation","_this$rsiCalculation$2","_this$rsiCalculation","DEFAULT_PARAMETERS","RelativeVolume","baseLine","periodStr","parsePeriod","_this$rvol$last","rvol","baseLineY","_this$baseLine","RWI","rwiHi","rwiLo","trSum","atrWeight","maxHi","maxLo","Stochastics","kPeriod","dPeriod","_this$k$last","dCount","dSum","k1","kSum","kCount","highestHigh","lowestLow","_this$kPeriod","_this$dPeriod","StochasticsFast","Stofa","StochasticsSlow","Stosl","TrixCalculation","trix","ema1","ema2","ema3","_this$trixCalculation2","_this$trixCalculation3","_this$trixCalculation","trixCalculation","_this$trixCalculation4","UltimateOscillator","period1","period2","period3","_this$ult$last","bpSum2","bpSum3","count2","count3","trSum2","trSum3","ult","bp","avg2","avg3","bpSum1","trSum1","count1","avg1","_this$period2","_this$period3","Volume","_this$data$volume$las","WilliamsR","_this$r$last","none","aro","aroosc","rwi","stofa","stofu","stosl","vol","wr","getWatchedPropValue","watchedProp","spineObject","getIsSpineObject","hasToObject","getJSONReplacerFunc","getWatchedProps","getAreWatchedPropsEqual","currentValue","previousValue","DEFAULT_SPINE_EVENTS","DefaultSpineEvents","stringifiedOptions","useForceUpdate","watchedPropertiesRef","handleModelChange","_watchedPropertiesRef","spineEvents","Crosshair","normalizeHexAlpha","hexString","customColors","customColorKeys","defaultColors","chartLightTheme","chartDarkTheme","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":""}