{"version":3,"file":"255.98c3d14f.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/models/chart-event-element.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/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/modules/create-alert/async-modules.ts","webpack://@finviz/website/./js/app/quote/modules/save-to-portfolio/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/./js/main/services/async-modules-utils.tsx","webpack://@finviz/website/./js/main/services/import-with-retry.ts","webpack://@finviz/website/../charts/app/canvas/ElementBaseConfig.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/autosave/utils.ts","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/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/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-events/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/chart-settings/async-modules.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/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/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/chart-controls.tsx","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/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/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/chart_layout_component.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-cache-management.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/chart_layout/constants.ts","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-complete-layout-model-init.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-polling.tsx","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/controllers/header/publish.tsx","webpack://@finviz/website/../charts/app/controllers/header/tour_button.tsx","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/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-tabs.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar-content.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar.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/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/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/configs/indicatorBaseConfig.ts","webpack://@finviz/website/../charts/app/indicators/configs/shrtfl.ts","webpack://@finviz/website/../charts/app/indicators/configs/shrtra.ts","webpack://@finviz/website/../charts/app/indicators/configs/adx.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/indicators/configs/aro.ts","webpack://@finviz/website/../charts/app/indicator-calculation/aroon.ts","webpack://@finviz/website/../charts/app/indicators/aro.ts","webpack://@finviz/website/../charts/app/indicators/configs/aroosc.ts","webpack://@finviz/website/../charts/app/indicators/aroosc.ts","webpack://@finviz/website/../charts/app/indicators/configs/atr.ts","webpack://@finviz/website/../charts/app/indicators/atr.ts","webpack://@finviz/website/../charts/app/indicators/configs/cci.ts","webpack://@finviz/website/../charts/app/indicators/cci.ts","webpack://@finviz/website/../charts/app/indicators/configs/cot.ts","webpack://@finviz/website/../charts/app/indicators/cot.ts","webpack://@finviz/website/../charts/app/indicators/configs/fi.ts","webpack://@finviz/website/../charts/app/indicator-calculation/fi.ts","webpack://@finviz/website/../charts/app/indicators/fi.ts","webpack://@finviz/website/../charts/app/indicators/configs/macd.ts","webpack://@finviz/website/../charts/app/indicator-calculation/macd.ts","webpack://@finviz/website/../charts/app/indicators/macd.ts","webpack://@finviz/website/../charts/app/indicators/configs/mfi.ts","webpack://@finviz/website/../charts/app/indicators/mfi.ts","webpack://@finviz/website/../charts/app/indicators/configs/none.ts","webpack://@finviz/website/../charts/app/indicators/none.ts","webpack://@finviz/website/../charts/app/indicators/configs/obv.ts","webpack://@finviz/website/../charts/app/indicators/obv.ts","webpack://@finviz/website/../charts/app/indicators/configs/perf.ts","webpack://@finviz/website/../charts/app/indicators/perf.ts","webpack://@finviz/website/../charts/app/indicators/configs/rmi.ts","webpack://@finviz/website/../charts/app/indicators/rmi.ts","webpack://@finviz/website/../charts/app/indicators/configs/roc.ts","webpack://@finviz/website/../charts/app/indicators/roc.ts","webpack://@finviz/website/../charts/app/indicators/configs/rsi.ts","webpack://@finviz/website/../charts/app/indicator-calculation/rsi.ts","webpack://@finviz/website/../charts/app/indicators/rsi.ts","webpack://@finviz/website/../charts/app/indicators/configs/rvol.ts","webpack://@finviz/website/../charts/app/indicators/rvol.ts","webpack://@finviz/website/../charts/app/indicators/configs/rwi.ts","webpack://@finviz/website/../charts/app/indicators/rwi.ts","webpack://@finviz/website/../charts/app/indicators/financialIndicator.ts","webpack://@finviz/website/../charts/app/indicators/shrtfl.ts","webpack://@finviz/website/../charts/app/indicators/shrtra.ts","webpack://@finviz/website/../charts/app/indicators/configs/stofa.ts","webpack://@finviz/website/../charts/app/indicators/configs/stofu.ts","webpack://@finviz/website/../charts/app/indicators/stofu.ts","webpack://@finviz/website/../charts/app/indicators/stofa.ts","webpack://@finviz/website/../charts/app/indicators/configs/stosl.ts","webpack://@finviz/website/../charts/app/indicators/stosl.ts","webpack://@finviz/website/../charts/app/indicators/configs/trix.ts","webpack://@finviz/website/../charts/app/indicator-calculation/trix.ts","webpack://@finviz/website/../charts/app/indicators/trix.ts","webpack://@finviz/website/../charts/app/indicators/configs/ult.ts","webpack://@finviz/website/../charts/app/indicators/ult.ts","webpack://@finviz/website/../charts/app/indicators/configs/vol.ts","webpack://@finviz/website/../charts/app/indicators/vol.ts","webpack://@finviz/website/../charts/app/indicators/configs/wr.ts","webpack://@finviz/website/../charts/app/indicators/wr.ts","webpack://@finviz/website/../charts/app/indicators/indicators.ts","webpack://@finviz/website/../charts/app/modals/publish/async-modules.ts","webpack://@finviz/website/../charts/app/model-hooks/use-model-state.ts","webpack://@finviz/website/../charts/app/models/chart.ts","webpack://@finviz/website/../charts/app/models/chart/contstants.ts","webpack://@finviz/website/../charts/app/models/chart_layout.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/drawings-internal-store.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/overlays/configs/ema.ts","webpack://@finviz/website/../charts/app/overlays/configs/overlayBaseConfig.ts","webpack://@finviz/website/../charts/app/overlays/configs/bb.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/configs/dch.ts","webpack://@finviz/website/../charts/app/overlays/dch.ts","webpack://@finviz/website/../charts/app/overlays/ema.ts","webpack://@finviz/website/../charts/app/overlays/configs/ema2.ts","webpack://@finviz/website/../charts/app/overlays/ema2.ts","webpack://@finviz/website/../charts/app/overlays/configs/hilo.ts","webpack://@finviz/website/../charts/app/overlays/hilo.ts","webpack://@finviz/website/../charts/app/overlays/configs/hline.ts","webpack://@finviz/website/../charts/app/overlays/hline.ts","webpack://@finviz/website/../charts/app/overlays/configs/ic.ts","webpack://@finviz/website/../charts/app/overlays/ic.ts","webpack://@finviz/website/../charts/app/overlays/configs/icf.ts","webpack://@finviz/website/../charts/app/overlays/icf.ts","webpack://@finviz/website/../charts/app/overlays/configs/kch.ts","webpack://@finviz/website/../charts/app/overlays/kch.ts","webpack://@finviz/website/../charts/app/overlays/configs/none.ts","webpack://@finviz/website/../charts/app/overlays/none.ts","webpack://@finviz/website/../charts/app/overlays/configs/patterns.ts","webpack://@finviz/website/../charts/app/overlays/patterns.ts","webpack://@finviz/website/../charts/app/overlays/configs/pp.ts","webpack://@finviz/website/../charts/app/overlays/pp.ts","webpack://@finviz/website/../charts/app/overlays/configs/sar.ts","webpack://@finviz/website/../charts/app/overlays/sar.ts","webpack://@finviz/website/../charts/app/overlays/configs/sma.ts","webpack://@finviz/website/../charts/app/indicator-calculation/sma.ts","webpack://@finviz/website/../charts/app/overlays/sma.ts","webpack://@finviz/website/../charts/app/overlays/configs/sma2.ts","webpack://@finviz/website/../charts/app/overlays/sma2.ts","webpack://@finviz/website/../charts/app/overlays/configs/str.ts","webpack://@finviz/website/../charts/app/overlays/str.ts","webpack://@finviz/website/../charts/app/overlays/configs/vp.ts","webpack://@finviz/website/../charts/app/overlays/vp.ts","webpack://@finviz/website/../charts/app/overlays/configs/vwap.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-grid-render-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/hlc.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 {\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 {\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 { 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 { ChartEventBadgeState, IChartEventBadgeProps } from '../utils/chart-events-utils'\r\nimport { captureException } from '../utils/helpers'\r\nimport { CHART_EVENT_BADGE_SIZE } from './constants'\r\nimport ElementModel from './element'\r\nimport Pane from './pane'\r\n\r\nlet badgeImages: ObjectHash<{ image: HTMLImageElement; isLoaded?: boolean }, string> | null = null\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 if (badgeImages === null) {\r\n badgeImages = {}\r\n } else {\r\n // Early return if cache was already initialized\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.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 img.src = `data:image/svg+xml,${encodeURIComponent(svgHTML)}`\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 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 { 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 { Button, Dropdown, DropdownItem, Icon, IconNameType, MenuGroup, Paragraph } 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\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}\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 { useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\r\n\r\nconst hasRedesign = isRedesignEnabled()\r\n\r\nfunction StockDetailTimeframeBarRaw({\r\n chartIndex,\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 chartIndex?: number\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 const selectedTimeframe = chartModel?.timeframe ?? ''\r\n\r\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\r\n const dateRangeTimeframe = values.dateRange\r\n ? getDateRangeTimeframe(values.dateRange)\r\n : { value: '', timeframe: chartModel!.timeframe }\r\n\r\n if (dateRangeTimeframe === null) {\r\n return\r\n } else if (dateRangeTimeframe.value) {\r\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\r\n if (!isValid) {\r\n return\r\n }\r\n }\r\n\r\n onDialogSubmit(dateRangeTimeframe, onDateRangeSelect)\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 const saveToPortfolioAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"save-to-portfolio\" */ './module-entry'),\r\n cacheKey: 'save-to-portfolio',\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/modules/create-alert/async-modules'\r\nexport { saveToPortfolioAsyncModule } from './app/quote/modules/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\nexport { intervalCallbackOnWindowVisible } from './app/shared/documentVisibility'\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 * as React from 'react'\r\n\r\nimport { Notification, useNotification } from '../components/notification'\r\nimport { Paragraph } from '../components/typography'\r\nimport { useIsMounted } from '../hooks/use-is-mounted'\r\nimport { importWithRetry } from './import-with-retry'\r\n\r\nconst cache: any = {}\r\nconst errorsCache: any = {}\r\n\r\nenum ErrorSeverity {\r\n medium,\r\n high,\r\n}\r\n\r\nfunction defaultCaptureException(exception: Error, captureContext?: { extra: Record }) {\r\n if (process.env.NODE_ENV === 'development') {\r\n console.error(exception)\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport interface ControlledModuleConfig {\r\n /**\r\n * Suspense mode shouldn’t be used together with controlled loading as it could lead to bugs.\r\n * If you know what you’re doing, add an ignore comment explaining the decision\r\n */\r\n isSuspenseMode?: never\r\n shouldLoadModule?: boolean\r\n}\r\nexport interface SuspenseModuleConfig {\r\n /**\r\n * Controlled loading shouldn’t be used together with suspense mode as it could lead to bugs.\r\n * If you know what you’re doing, add an ignore comment explaining the decision\r\n */\r\n shouldLoadModule?: never\r\n isSuspenseMode?: SuspenseMode\r\n}\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 function useAsyncModule({\r\n importFn,\r\n onError,\r\n errorSeverity,\r\n cacheKey,\r\n captureException = defaultCaptureException,\r\n shouldLoadModule = false,\r\n isSuspenseMode = false as SuspenseMode,\r\n}: {\r\n importFn: () => Promise\r\n onError?: () => void\r\n cacheKey: string\r\n errorSeverity?: keyof typeof ErrorSeverity\r\n captureException?: typeof defaultCaptureException\r\n} & (ControlledModuleConfig | SuspenseModuleConfig)) {\r\n const notificationContext = useNotification()\r\n const [isLoading, setIsLoading] = React.useState(null)\r\n const [isError, setIsError] = React.useState(false)\r\n const getIsMounted = useIsMounted()\r\n\r\n const handleError = () => {\r\n onError?.()\r\n setIsError(true)\r\n\r\n if (errorSeverity === undefined) {\r\n return\r\n }\r\n\r\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.high) {\r\n window.handleScriptNotLoaded()\r\n window.renderScriptNotLoaded()\r\n }\r\n\r\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.medium) {\r\n notificationContext.show(\r\n \r\n \r\n One or more of the required application components couldn’t be loaded.
Please try to repeat the\r\n action or{' '}\r\n window.location.reload()}>\r\n refresh the page\r\n {' '}\r\n if the problem persists.\r\n
\r\n
\r\n )\r\n }\r\n }\r\n\r\n const loadModule = async () => {\r\n if (cache[cacheKey]) {\r\n return cache[cacheKey]\r\n }\r\n\r\n setIsLoading(true)\r\n\r\n try {\r\n cache[cacheKey] = await importWithRetry(importFn)\r\n } catch (error) {\r\n captureException(error as Error)\r\n handleError()\r\n } finally {\r\n if (getIsMounted()) {\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return cache[cacheKey]\r\n }\r\n\r\n React.useEffect(() => {\r\n if (shouldLoadModule) {\r\n loadModule()\r\n }\r\n // We want to run it only on shouldLoadModule change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldLoadModule])\r\n\r\n const cachedModule = cache[cacheKey]\r\n if (isSuspenseMode) {\r\n if (errorsCache[cacheKey]) throw errorsCache[cacheKey]\r\n if (!cachedModule) {\r\n throw importFn()\r\n .then((mod) => (cache[cacheKey] = mod))\r\n .catch((err) => {\r\n handleError()\r\n errorsCache[cacheKey] = err\r\n })\r\n }\r\n }\r\n\r\n return [cachedModule ?? null, { isLoading: !!cachedModule ? false : isLoading, loadModule, isError }] as [\r\n SuspenseMode extends true ? T : T | null,\r\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\r\n ]\r\n}\r\n\r\n/**\r\n * HOC which wraps component in React.Suspense\r\n *\r\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#withsuspense)\r\n */\r\nexport function withSuspense

>(\r\n Component: React.ComponentType

,\r\n fallback: React.ReactNode = null\r\n) {\r\n return function WrappedComponent(props: P) {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n","const NUM_OF_RETRIES = 3\r\n\r\nexport function importWithRetry(importFn: () => Promise, retries = 0) {\r\n const result = importFn().catch(async (err) => {\r\n if (retries > NUM_OF_RETRIES) {\r\n throw err\r\n }\r\n\r\n await new Promise((r) => setTimeout(r, 1000 * retries))\r\n\r\n return importWithRetry(importFn, retries + 1)\r\n }) as Promise\r\n\r\n return result\r\n}\r\n","export default class ElementBaseConfig {\r\n static type: string\r\n static abbreviation: string\r\n static label: string\r\n static shortLabel: string\r\n static optionsOrder: readonly string[]\r\n static optionsLabels: { [key: string]: string }\r\n static inputsOrder: readonly string[]\r\n static inputsLabels: { [key: string]: string }\r\n static calculatedValuesOrder: readonly string[]\r\n static calculatedValuesLabels: { [key: string]: string }\r\n static defaultCalculatedValueOption?: string\r\n\r\n static getShortLabelWithAttrs: (attrs: ObjectHash) => string\r\n static getDefaultCalculatedValues: () => { [key: string]: number[] }\r\n\r\n get type() {\r\n return (this.constructor as typeof ElementBaseConfig).type\r\n }\r\n\r\n get abbreviation() {\r\n return (this.constructor as typeof ElementBaseConfig).abbreviation\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof ElementBaseConfig).label\r\n }\r\n\r\n get shortLabel() {\r\n return (this.constructor as typeof ElementBaseConfig).shortLabel\r\n }\r\n\r\n get optionsOrder() {\r\n return (this.constructor as typeof ElementBaseConfig).optionsOrder\r\n }\r\n\r\n get optionsLabels() {\r\n return (this.constructor as typeof ElementBaseConfig).optionsLabels\r\n }\r\n\r\n get inputsOrder() {\r\n return (this.constructor as typeof ElementBaseConfig).inputsOrder\r\n }\r\n\r\n get inputsLabels() {\r\n return (this.constructor as typeof ElementBaseConfig).inputsLabels\r\n }\r\n\r\n get calculatedValuesOrder() {\r\n return (this.constructor as typeof ElementBaseConfig).calculatedValuesOrder\r\n }\r\n\r\n get calculatedValuesLabels() {\r\n return (this.constructor as typeof ElementBaseConfig).calculatedValuesLabels\r\n }\r\n\r\n get defaultCalculatedValueOption() {\r\n return (this.constructor as typeof ElementBaseConfig).defaultCalculatedValueOption\r\n }\r\n\r\n get getShortLabelWithAttrs() {\r\n return (this.constructor as typeof ElementBaseConfig).getShortLabelWithAttrs\r\n }\r\n\r\n get getDefaultCalculatedValues() {\r\n return (this.constructor as typeof ElementBaseConfig).getDefaultCalculatedValues\r\n }\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 {\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\nimport ElementBaseConfig from './ElementBaseConfig'\r\nimport Thumb from './thumb'\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 declare static config: ElementBaseConfig\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 setIsEditInProgress(isEditInProgress: boolean, shouldTriggerChange = true) {\r\n this.isEditInProgress = isEditInProgress\r\n if (shouldTriggerChange) {\r\n this.trigger('change', this)\r\n }\r\n }\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.setIsEditInProgress(true, false)\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.setIsEditInProgress(false, 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; min: 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), min: Math.min(...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 getMinCoefficientUnscaledY() {\r\n return this.model.scale.y.invert(this.scaled.y2 - this.coefficients.min * (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\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n for (const p of this.coefficients.parsed) {\r\n const y = Math.round(this.fy(this.attrs.y2 - p * height))\r\n context.moveTo(roundedXY.x1, y)\r\n context.lineTo(roundedXY.x2, y)\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.some(({ type }) => type.includes('maxCoefficient'))) {\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.some(({ type }) => type.includes('maxCoefficient'))) {\r\n this._thumbs = this._thumbs.filter(({ type }) => !type.includes('maxCoefficient'))\r\n }\r\n\r\n if (this.coefficients.min < 0 && !this._thumbs.some(({ type }) => type.includes('minCoefficient'))) {\r\n this._thumbs = [\r\n ...this._thumbs,\r\n new Thumb(\r\n 'minCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.getMinCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'minCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.getMinCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n if (this.coefficients.min >= 0 && this._thumbs.some(({ type }) => type.includes('minCoefficient'))) {\r\n this._thumbs = this._thumbs.filter(({ type }) => !type.includes('minCoefficient'))\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 case 'minCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y2 += difY / (Math.abs(this.coefficients.min) + 1)\r\n break\r\n case 'minCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY / (Math.abs(this.coefficients.min) + 1)\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 minCoefficientY = this.coefficients.min < 0 && this.getMinCoefficientUnscaledY()\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 allYValues = [this.attrs.y1, this.attrs.y2, maxCoefficientY, minCoefficientY].filter((item) => item !== false)\r\n const top = Math.min(...allYValues)\r\n const bottom = Math.max(...allYValues)\r\n\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 getEdgeXYValues() {\r\n this.edgeXYValues = super.getEdgeXYValues()\r\n\r\n // Because minY, maxY can go outside of control points boundaries [0,1] we need to compensate\r\n // for that in getEdgeXYValues(), otherwise getIsInChartView() hide drawings sooner than it should\r\n const min = this.getMinCoefficientUnscaledY()\r\n const max = this.getMaxCoefficientUnscaledY()\r\n\r\n if (!isNaN(min) && !isNaN(max)) {\r\n this.edgeXYValues.minY = Math.min(min, max)\r\n this.edgeXYValues.maxY = Math.max(min, max)\r\n }\r\n\r\n return this.edgeXYValues\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 const getFontHeight = () => {\r\n // @todo - This is needed to be able to verticaly center background behind the text, the better would be to always use TextBaseline.middle and in case of options having different TextBaseline we should move text manually on y axis\r\n const { fontBoundingBoxAscent = 0, fontBoundingBoxDescent = 0 } = this.context?.measureText(this.attrs.text) ?? {}\r\n return fontBoundingBoxAscent + fontBoundingBoxDescent\r\n }\r\n\r\n if (this.attrs.textBaseline === TextBaseline.bottom) {\r\n y = this.attrs.y! - (height - (height - getFontHeight()) / 2)\r\n } else if (this.attrs.textBaseline === TextBaseline.top) {\r\n y = this.attrs.y! - this.attrs.padding.top - 1 - (height - getFontHeight()) / 2\r\n } else if (this.attrs.textBaseline === TextBaseline.middle) {\r\n y = this.attrs.y! - rawHight / 2 - this.attrs.padding.top - 1\r\n } else if (this.attrs.textBaseline === 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 FONT_SIZE,\r\n IndicatorType,\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, { isRedesignedPage, numberToStringWithUnitsSuffix } from '../utils'\r\nimport {\r\n ITickerChange,\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 { renderFadeExtendedHours, renderXAxis } from '../utils/chart-grid-render-utils'\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\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\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 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 if (!this.model.width) return 0\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 if (!this.paneModel.height) return 0\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 renderFadeExtendedHours({ context: this.context, paneModel: this.paneModel, quote: this.data })\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 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 { 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 renderXAxis({ context: this.context, quote: this.data, paneModel: this.paneModel, textRenderer, type: this.type })\r\n\r\n this.context.restore()\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 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 // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate,\r\n // to compensate for this we clip canvas 1px taller than chart height\r\n this.context.rect(ChartSettings.left.width, ChartSettings.top.height, this.width, this.height + marginBottom + 1)\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 if (min > max) {\r\n const prevMin = min\r\n min = max\r\n max = prevMin\r\n }\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 // Apply scale min & max buffer if min/max is the same\r\n if (min === max) {\r\n min *= 0.99\r\n max *= 1.01\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.barToDataIndex.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 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\r\n if (!this.tickersDimensions[index] && isLastDate) {\r\n this.tickersDimensions[index] = text.measure(context)\r\n }\r\n\r\n if (this.tickersDimensions[index]) {\r\n context.set('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\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 { 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\nconst NO_VALUE = ' - '\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 dates: 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 this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.overlayLabelWidth = {}\r\n }\r\n\r\n fx = (i: number) => this.paneModel.scale.x(i)\r\n\r\n getCompleteChartNumOfBars() {\r\n return this.dates.length\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 // We don't need to calculate first/last visible bars because the data is already cropped\r\n for (let i = 0; i < this.perf[ticker].length; i++) {\r\n const value = this.perf[ticker][i]\r\n if (value !== null && Number.isFinite(value)) {\r\n this.context.lineTo(this.fx(i), Math.round(this.fy(value)))\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 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.dates[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 value = tickerData[crossIndex] ?? null\r\n const percentageText = value !== null ? `${value.toFixed(2)}%` : NO_VALUE\r\n shouldRenderDate = shouldRenderDate || value !== null\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].findLastIndex((value) => value !== null)\r\n const value = tickerData[lastCrossIndex] ?? null\r\n const percentageText = value !== null ? `${value.toFixed(2)}%` : NO_VALUE\r\n\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 let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\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 this.dates = []\r\n for (const quote of quotes) {\r\n for (let i = 0; i < quote.date.length; i++) {\r\n const timestampe = quote.date[i]\r\n const date = utils.dateFromUnixTimestamp(timestampe)\r\n if (fromDate <= date && date <= toDate && this.dates.indexOf(timestampe) === -1) {\r\n this.dates.push(timestampe)\r\n }\r\n }\r\n }\r\n\r\n this.dates.sort((a, b) => a - b)\r\n\r\n for (const quote of quotes) {\r\n const ticker = quote.ticker\r\n this.perf[ticker] = []\r\n\r\n const dateToIndex = quote.getDateToIndex()\r\n let first = null\r\n let lastValue = null\r\n let dataIndex = -1\r\n for (let i = 0; i < this.dates.length; i++) {\r\n const timestamp = this.dates[i]\r\n dataIndex = dateToIndex[timestamp]\r\n\r\n if (typeof dataIndex === 'number') {\r\n first = first === null ? quote.close[dataIndex] : first\r\n const value = (quote.close[dataIndex] * 100) / (first ?? 0) - 100\r\n lastValue = Number.isFinite(value) ? value : null\r\n }\r\n\r\n this.perf[ticker][i] = lastValue\r\n\r\n if (lastValue !== null && min > lastValue) {\r\n min = lastValue\r\n }\r\n if (lastValue !== null && max < lastValue) {\r\n max = lastValue\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.dates[0] * 1000)\r\n let lastMonth = date.getMonth() + '-' + date.getFullYear()\r\n\r\n let monthsInData = 0\r\n this.dates.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.dates[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.dates.length; i++) {\r\n date = new Date(this.dates[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 Shrtfl = 'indicators/shrtfl',\r\n Shrtra = 'indicators/shrtra',\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 enum QuoteFinancialAttachment {\r\n shortInterest = 'shortInterest',\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 quoteFinancials = 'quoteFinancials',\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 = Default,\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\r\nexport const CHART_ELEMENT_ID = 'chart'\r\n\r\nexport const CHART_SETTINGS_DIALOG_TEST_ID = 'chart-settings-dialog'\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 { ButtonComponentProps, Icon, Select, SelectListProps } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { useChartTypes } from './use-chart-types'\r\n\r\ninterface Props extends Pick {\r\n isPremium: boolean\r\n specificFunctionality: SpecificChartFunctionality\r\n rounding: SelectListProps['rounding']\r\n}\r\n\r\nexport function ChartTypesSelect({ isPremium, specificFunctionality, ...props }: Props) {\r\n const { chartTypes, currentType, setSelectedChartTypeOverwrite } = useChartTypes({ isPremium, specificFunctionality })\r\n\r\n return (\r\n \r\n }\r\n nativeSelect=\"mobile\"\r\n onChange={(item) => setSelectedChartTypeOverwrite(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 { 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({\r\n isPremium,\r\n specificFunctionality,\r\n}: {\r\n isPremium: boolean\r\n specificFunctionality: SpecificChartFunctionality\r\n}) {\r\n const [selectedChartTypeOverwrite, setSelectedChartTypeOverwrite] = React.useState()\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 isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(specificFunctionality)\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 || !isQuoteOrQuoteFinancials ? 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, isQuoteOrQuoteFinancials])\r\n\r\n const currentType = React.useMemo(\r\n () =>\r\n chartTypes.find((type) => {\r\n if (selectedChartTypeOverwrite) return type.value === selectedChartTypeOverwrite\r\n\r\n const defaultType =\r\n ((ty as QuoteUrlChartTypes | undefined) && QuoteShortToLongType[ty as QuoteUrlChartTypes]) ??\r\n (FinvizQuoteTypeCurrent as QuoteNodeChartTypes)\r\n\r\n return !isPremium && defaultType === QuoteNodeChartTypes.candlestick && taInt === 0\r\n ? type.value === QuoteNodeChartTypes.candlesticksimple\r\n : type.value === defaultType\r\n }),\r\n [chartTypes, selectedChartTypeOverwrite, ty, isPremium, taInt]\r\n )\r\n\r\n return { currentType, chartTypes, setSelectedChartTypeOverwrite }\r\n}\r\n","import {\r\n Button,\r\n ButtonComponentProps,\r\n ConfirmationDialog,\r\n Delayed,\r\n DialogDismiss,\r\n Popover,\r\n PopoverPlacement,\r\n PopoverRounding,\r\n PopoverStateReturn,\r\n PopoverTheme,\r\n PopoverTrigger,\r\n Spinner,\r\n ZIndexContext,\r\n usePopoverState,\r\n} from '@finviz/website'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { CHART_ELEMENT_ID, CHART_SETTINGS_DIALOG_TEST_ID, SpecificChartFunctionality } from '../../constants/common'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\nimport { chartSettingsAsyncModule } from '../chart-settings/async-modules'\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\ninterface ScrollableChartSettingsPopoverProps {\r\n isOpen: boolean\r\n state: PopoverStateReturn\r\n}\r\n\r\nexport function PopoverInner({ hidePopover }: { hidePopover: () => void }) {\r\n const [chartSettingsModule] = useAsyncModule({\r\n ...chartSettingsAsyncModule,\r\n isSuspenseMode: true,\r\n errorSeverity: 'medium',\r\n onError: () => hidePopover(),\r\n })\r\n\r\n const { ChartSettings } = chartSettingsModule ?? {}\r\n\r\n return \r\n}\r\n\r\nexport const ScrollableChartSettingsPopover = React.memo(function ScrollableChartSettingsPopover({\r\n state,\r\n isOpen,\r\n}: ScrollableChartSettingsPopoverProps) {\r\n const { forceGlobalRerender, getIsConfigChanged, chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const confirmationDialogState = usePopoverState()\r\n const hidePopover = state.hide\r\n\r\n const checkChangesAndOpenDiscard = React.useCallback(\r\n (ev: Event | React.MouseEvent) => {\r\n if (getIsConfigChanged()) {\r\n ev.preventDefault()\r\n confirmationDialogState.show()\r\n return\r\n }\r\n hidePopover()\r\n },\r\n [confirmationDialogState, getIsConfigChanged, hidePopover]\r\n )\r\n\r\n const discardChangesAndHide = React.useCallback(() => {\r\n forceGlobalRerender()\r\n // We need to defer the hide so that the rerender finishes first\r\n setTimeout(hidePopover)\r\n }, [forceGlobalRerender, hidePopover])\r\n\r\n const buttonPosition = React.useMemo(() => {\r\n const popoverContentElement = state.getState().disclosureElement\r\n const { top = 0, height = 32 } = popoverContentElement?.getBoundingClientRect() ?? {}\r\n return top + height + window.scrollY\r\n // Only recount on open\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isOpen])\r\n\r\n const chartHeight = React.useMemo(() => {\r\n const chartElement = document.getElementById(CHART_ELEMENT_ID)\r\n return chartElement?.clientHeight ?? 0\r\n // Only recount on open\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isOpen])\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 }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n Discard changes\r\n \r\n \r\n }\r\n >\r\n Are you sure you want to discard changes?\r\n \r\n \r\n )\r\n})\r\n\r\ninterface ChartSettingsButtonProps extends ButtonComponentProps {\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' })\r\n const isOpen = settingsPopoverState.useState('open')\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: isOpen,\r\n } as ButtonComponentProps\r\n }, [model.specificChartFunctionality, isPremium, settingsPopoverState, isOpen])\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\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 setIsLoading(true)\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 financialAttachments: chartModel.getQuoteFinancialAttachments(),\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 } else if (quote.timeframe === chartModel.timeframe && quote.getRawTicker() === chartModel.ticker) {\r\n removeFromAbortCache(abortControllerKeyRef.current)\r\n updateChartModelWithNewQuote(quote)\r\n setIsLoading(false)\r\n }\r\n }\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 const isQuoteOrQuoteFinancials =\r\n chartLayoutModel &&\r\n [SpecificChartFunctionality.quotePage, SpecificChartFunctionality.quoteFinancials].includes(\r\n chartLayoutModel.specificChartFunctionality\r\n )\r\n\r\n if (chart && quote && (isQuoteOrQuoteFinancials || shouldRecalculateOnCharts) && !isIdeaChart) {\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 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 chartEventsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"chart-events\" */ './module-entry'),\r\n cacheKey: 'chart-events',\r\n}\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 { 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: React.ChangeEvent) => {\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: string) => {\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: 'italic' | 'normal'\r\n weight: 'bold' | 'normal'\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 function setValue(\r\n key: string,\r\n valueSetter: React.Dispatch>,\r\n value: ValueType\r\n ) {\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 function (key: string, valueSetter: React.Dispatch>, value: ValueType) {\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 Pane from '../models/pane'\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 const handleFullyOpen = React.useCallback(() => {\r\n if (props.element instanceof CanvasElement && props.element.model instanceof Pane) {\r\n props.element.setIsSelected(true)\r\n props.element.model.updateAttribute('selection', props.element)\r\n props.element.setIsEditInProgress(true)\r\n }\r\n }, [props.element])\r\n\r\n const handleFullyClosed = React.useCallback(() => {\r\n if (props.element instanceof CanvasElement) {\r\n props.element.setIsEditInProgress(false)\r\n }\r\n props.onHide()\r\n }, [props])\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\r\n // Ariakit hideOnEscape expects a bool as return value\r\n return 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 onFullyOpen={handleFullyOpen}\r\n onFullyClosed={handleFullyClosed}\r\n hideOnEsc={handleCloseDialog}\r\n >\r\n {config.title}\r\n {formState.length > 0 ? (\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 This indicator doesn't offer any configuration options.\r\n \r\n \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 { 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 { intervalCallbackOnWindowVisible } from '@finviz/website'\r\nimport 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 checkDrawingUpdateSubscription = intervalCallbackOnWindowVisible(\r\n { interval: DRAWINGS_UPDATE_INTERVAL_MS },\r\n checkDrawingUpdate\r\n )\r\n\r\n const unregisterListeners = () => {\r\n checkDrawingUpdateSubscription()\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 { 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} 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 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 ButtonRoundingType,\r\n ButtonSizeType,\r\n CustomDateRange,\r\n Heading,\r\n TimeframeBar,\r\n ZIndexContext,\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 { 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 const isQuoteFinancials = chartLayout.specificChartFunctionality === SpecificChartFunctionality.quoteFinancials\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 = values.dateRange\r\n ? getDateRangeTimeframe(values.dateRange)\r\n : { value: '', timeframe: chartModel.timeframe }\r\n\r\n if (dateRangeTimeframe === null) {\r\n return\r\n } else if (dateRangeTimeframe.value) {\r\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\r\n if (!isValid) {\r\n return\r\n }\r\n }\r\n\r\n 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
\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\r\n const hasTimeframe = chartLayout.editors.includes(ChartEditorEnum.timeframe)\r\n\r\n return (\r\n \r\n
\r\n {!isQuotePage && !isQuoteFinancials && (\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 {!isQuoteFinancials && (\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 {!isQuoteFinancials && (\r\n \r\n {!isQuotePage && 'Fullscreen'}\r\n \r\n )}\r\n {chartLayout.editors.includes(ChartEditorEnum.settings) && (\r\n \r\n {!isQuotePage && 'Settings'}\r\n \r\n )}\r\n {!isQuotePage && !isQuoteFinancials && (\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 { ContextMenuItem } from '@finviz/website'\r\n\r\nexport type CallbacksType = {\r\n onFullyOpen: () => void\r\n onFullyClosed: () => void\r\n onBeforeItemClick: () => void\r\n}\r\n\r\nclass ContextMenu extends Spine.Model {\r\n static initClass() {\r\n this.configure('ContextMenu', 'shown', 'config', 'anchorRect', 'callbacks')\r\n }\r\n\r\n declare shown: boolean\r\n declare config: ContextMenuItem[]\r\n declare anchorRect: { x: number; y: number }\r\n declare callbacks: CallbacksType | undefined\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, useDropdownState } from '@finviz/website'\r\nimport React from 'react'\r\nimport * as ReactDOM from 'react-dom/client'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport { useModelState } from '../model-hooks/use-model-state'\r\nimport model, { CallbacksType } from '../models/context_menu'\r\nimport { ready } from '../utils'\r\n\r\nfunction ContextMenu() {\r\n const watchedModel = useModelState(model, {\r\n watchProperties: ['shown', 'anchorRect', 'config', 'callbacks'],\r\n })\r\n const state = useDropdownState({ open: watchedModel.shown })\r\n\r\n return (\r\n ev.type !== 'contextmenu'}\r\n state={state}\r\n items={watchedModel.config?.map((item) => ({\r\n ...item,\r\n onClick: () => {\r\n watchedModel.callbacks?.onBeforeItemClick()\r\n if ('onClick' in item) {\r\n item.onClick?.()\r\n }\r\n },\r\n }))}\r\n getAnchorRect={() => watchedModel.anchorRect}\r\n onClose={() => model.updateAttribute('shown', false)}\r\n onFullyOpen={watchedModel.callbacks?.onFullyOpen}\r\n onFullyClosed={watchedModel.callbacks?.onFullyClosed}\r\n data-testid=\"charts-context-menu-body\"\r\n backdrop={\r\n {\r\n ev.preventDefault()\r\n ev.stopPropagation()\r\n }}\r\n />\r\n }\r\n />\r\n )\r\n}\r\n\r\nready(() => {\r\n const rootEl = document.querySelector('.context-menu')\r\n if (rootEl) {\r\n const root = ReactDOM.createRoot(rootEl!)\r\n root.render()\r\n }\r\n})\r\n\r\nconst contextMenuControl = {\r\n show: (event: MouseEvent | React.MouseEvent, config: ObjectHash, callbacks: CallbacksType) => {\r\n model.updateAttributes({\r\n shown: true,\r\n config: config,\r\n callbacks,\r\n anchorRect: {\r\n x: event.clientX,\r\n y: event.clientY,\r\n },\r\n })\r\n },\r\n}\r\n\r\nexport default contextMenuControl\r\n","import { Delayed, DialogBody, Popover, PopoverAnchor, Spinner, usePopoverState } from '@finviz/website'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartModel from '../../models/chart'\r\nimport Utils from '../../utils'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { useClickAway } from '../../utils/use-click-away'\r\nimport { chartEventsAsyncModule } from '../chart-events/async-modules'\r\n\r\nconst isMobile = Utils.isMobile()\r\n\r\ninterface ChartEventPopoverWithStateProps {\r\n chartModel: ChartModel\r\n}\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 lastEventId = React.useRef(activeChartEvent?.id)\r\n const popoverState = usePopoverState({ placement: 'top' })\r\n const isPopoverMounted = popoverState.useState('mounted')\r\n const [style, setStyle] = React.useState({ top: 0, left: 0 })\r\n const [chartEventsModule] = useAsyncModule({\r\n ...chartEventsAsyncModule,\r\n shouldLoadModule: isPopoverMounted,\r\n errorSeverity: 'medium',\r\n onError: () => popoverState.hide(),\r\n })\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 // Due to the fact that chart events logic depends heavily on hover state which isn't really present on touch devices\r\n // we need to mimic that state for touch devices, this enables chart event closed on click outside and counterpart in\r\n // chart-events.ts allow chart event to be open\r\n if (activeChartEvent && isMobile) {\r\n activeChartEvent.instance.setIsHovered(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.useState('popoverElement')\r\n const popoverShow = popoverState.show\r\n const popoverHide = popoverState.hide\r\n\r\n React.useEffect(() => {\r\n lastEventId.current = activeChartEvent?.id\r\n if (!activeChartEvent?.instance.isOpen || !isChartEventOfThisChart) {\r\n if (!isPopoverMounted) {\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 setStyle({ top, left })\r\n }\r\n if (!isPopoverMounted) {\r\n popoverShow()\r\n }\r\n }, [\r\n activeChartEvent,\r\n data?.elementId,\r\n isChartEventOfThisChart,\r\n isPopoverMounted,\r\n popoverHide,\r\n popoverShow,\r\n popoverState,\r\n style.left,\r\n style.top,\r\n ])\r\n\r\n return (\r\n <>\r\n \r\n {data && (\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","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(\r\n () => chartModel.leftOffset !== getDefaultLeftOffset(chartModel)\r\n )\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 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 const onContextMenuFullyOpen = () => {\r\n this.setSelectedElement(el)\r\n if (el instanceof CanvasElement) {\r\n el.setIsEditInProgress(true)\r\n }\r\n }\r\n\r\n const onContextMenuClose = () => {\r\n if (el instanceof CanvasElement) {\r\n el.setIsEditInProgress(false)\r\n }\r\n }\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 { onFullyOpen: onContextMenuFullyOpen, onBeforeItemClick: onContextMenuClose, onFullyClosed: onContextMenuClose }\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?.() && this.props.activeTool === DrawingTool.Mouse) {\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?.() && activeTool === DrawingTool.Mouse) {\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.ForwardRefRenderFunction\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 const showTimeframe = showSettings || layoutModel.editors.includes(ChartEditorEnum.timeframe)\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 {showTimeframe && }\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 { getQuoteFinancialAttachmentsFromChartConfig, 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(null)\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 const options = {\r\n premarket,\r\n aftermarket,\r\n events: hasChartEvents,\r\n patterns: panesConfig.some((pane) =>\r\n pane.elements?.some((element) =>\r\n 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 ...options,\r\n financialAttachments: getQuoteFinancialAttachmentsFromChartConfig(config),\r\n },\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 // This prevents the being re-called on hotreload\r\n if (isModelDestroyedRef.current !== null) {\r\n return\r\n }\r\n\r\n isModelDestroyedRef.current = false\r\n\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 isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(props.layoutModel.specificChartFunctionality)\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 && isQuoteOrQuoteFinancials\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","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 ignoreRowId =\r\n isHorizontal || chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\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, index) => {\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, index) => (\r\n \r\n ))}\r\n {availableDrawingActions.map((item, index) => (\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, ZIndexContext } 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 \r\n Notes\r\n {!isFullyClosed && }\r\n \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, ButtonProps, Dropdown, Icon, useDropdownState } from '@finviz/website'\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 { drawingTools } from '../drawingTools'\r\nimport { DrawingActions, DrawingTool, IToolBarProps } from '../interfaces'\r\nimport Toolbar from '../toolbar'\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 toolbarState = useDropdownState()\r\n const hideToolbar = toolbarState.hideAll\r\n const [urlSearchParams, setUrlSearchParams] = useSearchParams()\r\n\r\n // get toolbar mobile element on first render\r\n const [toolbarMobileElement, setToolbarMobileElement] = React.useState(null)\r\n React.useEffect(() => {\r\n setToolbarMobileElement(document.getElementById(MOBILE_TOOLBAR_DIV_ID))\r\n }, [])\r\n\r\n const drawButtonProps = React.useMemo(() => {\r\n if (urlSearchParams.has(SIDEBAR_QUERY_PARAM) || activeTool === DrawingTool.Mouse) {\r\n return {\r\n children: 'Draw',\r\n leftContent: 'draw',\r\n size: 'medium',\r\n onClick: () => {\r\n setUrlSearchParams((params) => {\r\n params.delete(SIDEBAR_QUERY_PARAM)\r\n return params\r\n })\r\n },\r\n }\r\n }\r\n\r\n return {\r\n appearance: 'square',\r\n active: true,\r\n size: 'medium',\r\n theme: 'chipTransparent',\r\n leftContent: ,\r\n }\r\n }, [activeTool, setUrlSearchParams, urlSearchParams])\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 hideToolbar()\r\n },\r\n [hideToolbar, onActiveToolChange]\r\n )\r\n\r\n const handleDrawingActionClick = React.useCallback(\r\n (actionId: DrawingActions) => {\r\n onDrawingActionClick?.(actionId)\r\n hideToolbar()\r\n },\r\n [hideToolbar, onDrawingActionClick]\r\n )\r\n\r\n if (!toolbarMobileElement) return null\r\n\r\n return ReactDOM.createPortal(\r\n }\r\n // Move the dropdown to cover the button\r\n gutter={-32}\r\n modal={activeTool === DrawingTool.Mouse}\r\n backdrop={false}\r\n unmountOnHide={false}\r\n placement=\"top-end\"\r\n className=\"-translate-x-1\"\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 isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(chartLayoutModel?.specificChartFunctionality as SpecificChartFunctionality)\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 !(isQuoteOrQuoteFinancials || isChartPage || isFuturesForexCryptoPage)\r\n ) {\r\n if (!decodedSearch.p && isQuoteOrQuoteFinancials) {\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 isQuoteOrQuoteFinancials,\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 isQuoteFinancials =\r\n props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.quoteFinancials\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 (\r\n isChartPage ||\r\n (isQuotePage && ty !== QuotePageQueryChartTypes.p) ||\r\n isQuoteFinancials ||\r\n isFuturesForexCryptoPage\r\n ) {\r\n return \r\n }\r\n\r\n return \r\n }\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, TIMEFRAME } 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 {\r\n getIsPreserveDrawingsAndAutosaveAvailable,\r\n getIsSidebarEnabled,\r\n isQuoteForexFuturesCryptoPage,\r\n} 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 // These two are used on quote to check whether or not we should recompute toolbar position\r\n prevModelWidth?: number\r\n prevTimeframeActiveChart?: TIMEFRAME\r\n\r\n constructor(props: ChartLayoutComponentProps) {\r\n super(props)\r\n\r\n this.model = props.chartLayoutModel\r\n this.prevModelWidth = this.model.width\r\n this.prevTimeframeActiveChart = this.model.activeChart?.timeframe\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 && !element.instance.isEditInProgress) {\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 /**\r\n * `setToolbarPosition` calls `flushSync` so we want to use it as sparingly as we can\r\n * It is only needed when chart resizes (or quote timeframe changes)\r\n */\r\n const quoteTimeframe = this.model.activeChart.quote()?.timeframe\r\n if (\r\n (quoteTimeframe && this.prevTimeframeActiveChart !== quoteTimeframe) ||\r\n this.prevModelWidth !== this.model.width\r\n ) {\r\n this.setToolbarPosition()\r\n }\r\n this.prevTimeframeActiveChart = quoteTimeframe\r\n this.prevModelWidth = this.model.width\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 // Toolbar doesn’t change position on other pages\r\n if (!isQuoteForexFuturesCryptoPage(this.model.specificChartFunctionality)) return\r\n\r\n requestAnimationFrame(() =>\r\n /**\r\n * Fixes a problem where React (probably) pushes updates for to\r\n * the next render, which results in multiple re-renders of which\r\n * causes a flicker when changes between vertical and horizontal placement\r\n */\r\n ReactDOM.flushSync(() => {\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 }\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 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 { 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?: React.RefObject | HTMLElement\r\n isWithNotifications?: boolean\r\n}\r\n\r\nexport function ChartLayout({ config, shouldResize, isWithNotifications = true, parentElement }: 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","export const CHART_LAYOUT_CHILD_CHANGE_EVENT = 'chartLayoutChildChange'\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?: React.RefObject | 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 || parentElement) && 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\r\n const containerElement = parentElement?.hasOwnProperty('current')\r\n ? (parentElement as React.RefObject).current\r\n : parentElement\r\n\r\n if (containerElement) {\r\n containerElement.style.opacity = 'unset'\r\n containerElement.style.minHeight = 'unset'\r\n containerElement.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 if (newConfig.specificChartFunctionality === SpecificChartFunctionality.quoteFinancials) {\r\n newConfig.editors = [ChartEditorEnum.timeframe, ChartEditorEnum.publish]\r\n } else if (isRedesignedPage(newConfig, [SpecificChartFunctionality.quotePage])) {\r\n // We need to add these because ideas might not have them and chart controls wouldn’t render properly\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 { intervalCallbackOnWindowVisible } from '@finviz/website'\r\nimport 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, QuotePollingIntervalInMs } 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 * Get the max refresh interval when the tab is in the background. The interval\r\n * is slowly decayed from regular refresh interval\r\n */\r\nfunction getMaxDecayInterval() {\r\n if (window.FinvizSettings.hasUserPremium) {\r\n return QuotePollingIntervalInMs.EliteStocksReduced\r\n }\r\n\r\n return QuotePollingIntervalInMs.Free\r\n}\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 intervalSubscriptions = React.useRef void>>([])\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 timeoutSubscription = intervalCallbackOnWindowVisible(\r\n { interval: duration, decay: true, maxDecayInterval: getMaxDecayInterval },\r\n () => {\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 }\r\n )\r\n intervalSubscriptions.current.push(timeoutSubscription)\r\n })\r\n\r\n return () => {\r\n if (intervalSubscriptions.current.length > 0) {\r\n intervalSubscriptions.current.forEach((unsubscribe) => {\r\n unsubscribe()\r\n })\r\n intervalSubscriptions.current = []\r\n }\r\n }\r\n }, [props.chartLayoutModel, pollingIntervalToCharts])\r\n\r\n return \r\n}\r\n","import 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 if (!activeChart.isScrolled) delete layout.charts[0].leftOffset\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) => q.toConfig(['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 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 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) hideTooltip()\r\n }, [isAnyQuoteLoading, 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 >\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","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 * 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 type PerfChart from '../charts/perf_chart'\r\nimport {\r\n CHART_MARGIN,\r\n DateRangeType,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport ChartEventElement from '../models/chart-event-element'\r\nimport ChartLayout from '../models/chart_layout'\r\nimport { IChartSettings, IIndicatorSettings, ISettings } from '../models/chart_settings/interfaces'\r\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\r\nimport Element from '../models/element'\r\nimport Pane, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport Utils from '../utils'\r\nimport utils, { convertLocalToNyTime, dateFromUnixTimestamp, isRedesignedPage } from '../utils'\r\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../utils/chart'\r\nimport {\r\n DATE_RANGE_PREFIX_DELMITER,\r\n getParsedDateRangeMetaData,\r\n parseCustomDateRangeUrlParam,\r\n} from '../utils/chart-date-range-utils'\r\n\r\ninterface VisibleBarNumberProps {\r\n start: Date | null\r\n end: Date\r\n quote: Quote\r\n dateRange: string\r\n}\r\n\r\ninterface ChartZoomAndLeftOffsetProps extends Omit {\r\n chartVisibleWidth: number\r\n numOfBarsToRender?: number\r\n chartModel: Chart\r\n}\r\n\r\ninterface ChartStartEndDatesProps {\r\n dateRange: string\r\n quote: Quote\r\n}\r\n\r\nexport const getVisibleBarsNumber = ({ start, end, quote, dateRange }: VisibleBarNumberProps) => {\r\n const startInSec = start ? start.getTime() / 1000 : 0\r\n const endInSec = end.getTime() / 1000\r\n const isQuoteDateInRange = (quoteDate: number) => quoteDate >= startInSec && quoteDate <= endInSec\r\n const lastQuoteDateIndex = quote.barIndex[quote.barIndex.length - 1]\r\n let lastVisibleBarIndex = lastQuoteDateIndex\r\n let numOfVisibleBars = 0\r\n if (\r\n [DateRangeType.d1, DateRangeType.d5].includes(dateRange as DateRangeType) &&\r\n quote.instrument === Instrument.Stock\r\n ) {\r\n numOfVisibleBars = quote.drawMinutesPerDay\r\n } else {\r\n let firstVisibleBarIndex = -1\r\n lastVisibleBarIndex = -1\r\n quote.date.forEach((quoteDate, index) => {\r\n if (isQuoteDateInRange(quoteDate)) {\r\n if (firstVisibleBarIndex === -1) {\r\n firstVisibleBarIndex = quote.barIndex[index]\r\n }\r\n lastVisibleBarIndex = quote.barIndex[index]\r\n }\r\n })\r\n numOfVisibleBars = lastVisibleBarIndex - firstVisibleBarIndex + 1\r\n\r\n if (firstVisibleBarIndex === -1 && lastVisibleBarIndex === -1) {\r\n return { numOfVisibleBars: 0, numOfBarsOffset: 0 }\r\n }\r\n }\r\n\r\n return { numOfVisibleBars, numOfBarsOffset: lastQuoteDateIndex - lastVisibleBarIndex }\r\n}\r\n\r\nexport const getChartZoomAndLeftOffset = ({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n chartModel,\r\n numOfBarsToRender,\r\n}: ChartZoomAndLeftOffsetProps) => {\r\n const { numOfVisibleBars, numOfBarsOffset } = getVisibleBarsNumber({\r\n start,\r\n end,\r\n quote,\r\n dateRange: chartModel.dateRange,\r\n })\r\n if (numOfVisibleBars === 0) {\r\n return { zoomFactor: chartModel.zoomFactor, leftOffset: chartModel.leftOffset }\r\n }\r\n\r\n const chartLayout = chartModel.chart_layout()\r\n const zoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth,\r\n numOfVisibleBars: numOfBarsToRender ?? numOfVisibleBars,\r\n })\r\n const barWidth = getBarWidthWithMargin({ chartLayout, zoomFactor })\r\n const leftOffset =\r\n getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: {},\r\n barWidth,\r\n numberOfBarsToDraw: numOfBarsToRender,\r\n }) +\r\n numOfBarsOffset * barWidth\r\n return { zoomFactor, leftOffset }\r\n}\r\n\r\nexport const getChartStartEndDates = ({ dateRange, quote }: ChartStartEndDatesProps) => {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const lastDate = dateFromUnixTimestamp(quote.date[quote.date.length - 1])\r\n\r\n if (dateRange.includes(DATE_RANGE_PREFIX_DELMITER)) {\r\n const range = parseCustomDateRangeUrlParam({ dateRange, anchorDate: lastDate })\r\n const end = convertLocalToNyTime(\r\n range.end && range.end.getTime() <= lastDate.getTime() ? range.end : lastDate,\r\n false\r\n )\r\n return {\r\n start: range.start && convertLocalToNyTime(range.start, false),\r\n end,\r\n }\r\n }\r\n\r\n let start\r\n // No condition is needed here, but this would be dateRangePrefix === DateRangePrefixEnum.Enum\r\n switch (dateRange) {\r\n case DateRangeType.d1:\r\n lastDate.setHours(23, 59, 59, 999)\r\n start = daysInQuote.length === 0 ? lastDate : daysInQuote[daysInQuote.length - 1]\r\n break\r\n case DateRangeType.d5:\r\n lastDate.setHours(23, 59, 59, 999)\r\n const startDateIndex = daysInQuote.length === 0 ? -1 : Math.max(daysInQuote.length - 5, 0)\r\n start = startDateIndex === -1 ? lastDate : daysInQuote[startDateIndex]\r\n break\r\n case DateRangeType.m1:\r\n start = dateFns.subMonths(lastDate, 1)\r\n break\r\n case DateRangeType.m3:\r\n start = dateFns.subMonths(lastDate, 3)\r\n break\r\n case DateRangeType.m6:\r\n start = dateFns.subMonths(lastDate, 6)\r\n break\r\n case DateRangeType.ytd:\r\n start = dateFns.startOfYear(lastDate)\r\n break\r\n case DateRangeType.y1:\r\n start = dateFns.subYears(lastDate, 1)\r\n break\r\n case DateRangeType.y2:\r\n start = dateFns.subYears(lastDate, 2)\r\n break\r\n case DateRangeType.y5:\r\n start = dateFns.subYears(lastDate, 5)\r\n break\r\n case DateRangeType.max:\r\n default:\r\n start = null\r\n break\r\n }\r\n\r\n return { start: start && convertLocalToNyTime(start, false), end: convertLocalToNyTime(lastDate, false) }\r\n}\r\n\r\ninterface GetLeftOffsetProps {\r\n quote: Quote\r\n chartModel: Chart\r\n config?: { stretch?: boolean }\r\n barWidth?: number\r\n barIndex?: number\r\n numberOfBarsToDraw?: number\r\n shouldAlignDaysToLeftApplied?: boolean\r\n}\r\n\r\nexport const getMinMaxLeftOffset = ({\r\n newLeftOffset,\r\n chartModel,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex,\r\n}: {\r\n newLeftOffset: number\r\n chartModel: Chart\r\n barWidth?: number\r\n barIndex: number\r\n}) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const numOfBarsInView = Math.floor(width / barWidth)\r\n const fx = (index: number) => index * barWidth\r\n return ~~Utils.min(barWidth / 2, Utils.max(newLeftOffset, width - fx(barIndex + numOfBarsInView)))\r\n}\r\n\r\nexport function getFullChartWidth({\r\n hasAftermarket,\r\n hasPremarket,\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n}) {\r\n const premarketHoursLength = hasPremarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const aftermarketHoursLength = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const marketMinutesLength = (6.5 + premarketHoursLength + aftermarketHoursLength) * 60\r\n // CHART_MARGIN.L as left offset + CHART_MARGIN.XXL as right offset\r\n return CHART_MARGIN.L + CHART_MARGIN.XXL + (marketMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n}\r\n\r\nexport function getIntradayChartConfig({\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n hasPremarket,\r\n hasAftermarket,\r\n maxWidth,\r\n canCropChart,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n maxWidth: number\r\n canCropChart: boolean\r\n}) {\r\n const fullChartWidth = getFullChartWidth({ hasPremarket, hasAftermarket, barWidthWithMargin, timeframeMinutes })\r\n const offsetChartAfter = 16 // Int from 0-23 , if last quote date is >= this constant `offsetInPx` is applied (chart is moved to the left)\r\n const cropChartMinutesLength = PREMARKET_AFTERMARKET_HOURS * 60\r\n const offsetInPx = (cropChartMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n const chartWidthWithOffset = fullChartWidth - offsetInPx\r\n const shouldCropChart =\r\n canCropChart && hasAftermarket && hasPremarket && maxWidth >= chartWidthWithOffset && maxWidth < fullChartWidth\r\n\r\n return {\r\n fullChartWidth,\r\n offsetInPx: shouldCropChart ? offsetInPx : 0,\r\n chartWidthWithOffset: shouldCropChart ? fullChartWidth - offsetInPx : fullChartWidth,\r\n offsetChartAfter,\r\n }\r\n}\r\n\r\nexport const getLeftOffset = ({\r\n quote,\r\n chartModel,\r\n config,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex = getBarIndex(quote),\r\n numberOfBarsToDraw,\r\n shouldAlignDaysToLeftApplied = true,\r\n}: GetLeftOffsetProps) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const specificChartFunctionality = chartModel.chart_layout().specificChartFunctionality\r\n if (config?.stretch) {\r\n return 0\r\n }\r\n if (getIsSmallIndexChart(specificChartFunctionality)) {\r\n return barWidth\r\n }\r\n const fx = (index: number) => index * barWidth\r\n let leftOffset = width - fx(barIndex) - Math.round(barWidth / 2)\r\n leftOffset = Math.round(Utils.min(barWidth / 2, Utils.max(leftOffset, width - fx(barIndex + 45))))\r\n if (\r\n shouldAlignDaysToLeftApplied &&\r\n shouldAlignDaysToLeft({\r\n quote,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n dateRange: chartModel.dateRange,\r\n })\r\n ) {\r\n let drawDaysInOneChart = 1\r\n if (numberOfBarsToDraw) {\r\n drawDaysInOneChart = Math.ceil(numberOfBarsToDraw / quote.getBarsInDay()!)\r\n } else if (quote.interval === 10 || chartModel.dateRange === DateRangeType.d5) {\r\n drawDaysInOneChart = 5\r\n } else if (quote.interval === 15) {\r\n drawDaysInOneChart = 6\r\n } else if (quote.interval === 30) {\r\n drawDaysInOneChart = 12\r\n } else if (quote.interval === 60) {\r\n drawDaysInOneChart = 22\r\n } else if (quote.interval === 120) {\r\n drawDaysInOneChart = 39\r\n } else if (quote.interval === 240) {\r\n drawDaysInOneChart = 78\r\n } else if (quote.interval > 240) {\r\n drawDaysInOneChart = (quote.interval / 30) * 10\r\n }\r\n const { offsetInPx, offsetChartAfter } = getIntradayChartConfig({\r\n hasPremarket: quote.premarket,\r\n hasAftermarket: quote.aftermarket,\r\n barWidthWithMargin: barWidth,\r\n timeframeMinutes: quote.interval,\r\n maxWidth: chartModel.width,\r\n canCropChart: !chartModel.dateRange,\r\n })\r\n const drawDaysWidth = drawDaysInOneChart * quote.getBarsInDay()! * barWidth - offsetInPx\r\n\r\n // +1 is a buffer as it often happens drawDaysWidth is wider than width by tiny amount (< 1/10000 of px)\r\n if (drawDaysWidth <= width + 1) {\r\n const lastQuoteDate = quote.date.last() ? utils.dateFromUnixTimestamp(quote.date.last()!) : null\r\n // Align start of day to left if we have enough space to show all bars in day\r\n const barsToOffset = (Object.keys(quote.getDayToOffset()).length - drawDaysInOneChart) * quote.getBarsInDay()!\r\n const offsetChartInPx = (lastQuoteDate?.getHours() ?? 0) >= offsetChartAfter ? offsetInPx : 0\r\n // Math.max(1, ~~num) is to mimic imlementation from getHalfBarWidth(),\r\n // we never render bar with width < 1 but at the same time when we have and odd\r\n // width like 5, wa want to floor because of pixel perfect rendering\r\n leftOffset = Math.round(-fx(barsToOffset) + Math.max(1, ~~(barWidth / 2))) - offsetChartInPx\r\n }\r\n }\r\n // getMinMaxLeftOffset move left offset to keep at least one bar in view what isn't desired for offscreen charts\r\n if (specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n return leftOffset\r\n }\r\n return getMinMaxLeftOffset({\r\n newLeftOffset: leftOffset,\r\n chartModel,\r\n barWidth,\r\n barIndex,\r\n })\r\n}\r\n\r\nexport const getBarIndex = (quote: Quote) => quote?.getBarIndex(quote.open?.length ? quote.open.length - 1 : 0) || 0\r\n\r\nexport const getIsSmallIndexChart = (specificChartFunctionality: SpecificChartFunctionality) =>\r\n specificChartFunctionality === SpecificChartFunctionality.smallIndex\r\n\r\ninterface ShouldAlignDaysToLeftProps {\r\n quote: Quote\r\n numberOfBarsToDraw?: number\r\n specificChartFunctionality: SpecificChartFunctionality\r\n dateRange: DateRangeType | null\r\n}\r\n\r\n/**\r\n * Evaluate if days should be aligned to the left\r\n * @param {object} object.quote - Quote model\r\n * @param {string} object.specificChartFunctionality - SpecificChartFunctionality enum\r\n * @returns {boolean} boolean\r\n * */\r\nexport const shouldAlignDaysToLeft = ({\r\n quote,\r\n dateRange,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n}: ShouldAlignDaysToLeftProps) => {\r\n const isStockIntraday = quote.isIntraday && quote.instrument === Instrument.Stock\r\n const isIntradayDateRange = !!dateRange && [DateRangeType.d1, DateRangeType.d5].includes(dateRange)\r\n const isOffScreen = specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isOffScreenWithNoDateRange = isOffScreen && !dateRange\r\n const isOffScreenIntradayDateRange = isOffScreen && isIntradayDateRange\r\n const isOffScreenWithFixedBars = isOffScreen && numberOfBarsToDraw\r\n\r\n const isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(specificChartFunctionality)\r\n const isQuotePageWithNoDateRange = isQuoteOrQuoteFinancials && !dateRange\r\n const isQuotePageIntradayDateRange = isQuoteOrQuoteFinancials && isIntradayDateRange\r\n const isQuotePageWithFixedBars = isQuoteOrQuoteFinancials && numberOfBarsToDraw\r\n\r\n const isChartPage = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isChartsInradayDateRange = isChartPage && isIntradayDateRange\r\n const isChartPageWithFixedBars = isChartPage && numberOfBarsToDraw\r\n return (\r\n isStockIntraday &&\r\n (isOffScreenWithNoDateRange ||\r\n isOffScreenIntradayDateRange ||\r\n isOffScreenWithFixedBars ||\r\n isQuotePageWithNoDateRange ||\r\n isQuotePageIntradayDateRange ||\r\n isQuotePageWithFixedBars ||\r\n isChartsInradayDateRange ||\r\n isChartPageWithFixedBars)\r\n )\r\n}\r\n\r\ninterface ClipProps {\r\n canvasCtx: RenderingContext2DType\r\n width: number\r\n height: number\r\n Settings: ISettings['ChartSettings'] | ISettings['IndicatorSettings']\r\n}\r\n// pane canvasCtx clip\r\nexport const clip = ({ canvasCtx, width, height, Settings }: ClipProps) => {\r\n const contentWidth = width - Settings.left.width - Settings.right.width\r\n const contentHeight = height - Settings.top.height - Settings.bottom.height\r\n canvasCtx.beginPath()\r\n canvasCtx.rect(Settings.left.width, Settings.top.height, contentWidth, contentHeight)\r\n canvasCtx.clip()\r\n}\r\n\r\nexport const getSettings = (paneModel: Pane): IIndicatorSettings | IChartSettings => {\r\n const { ChartSettings, IndicatorSettings } = paneModel.chart().getChartLayoutSettings()\r\n for (const element of paneModel.elements().all()) {\r\n if (element.isIndicator()) {\r\n return IndicatorSettings\r\n }\r\n }\r\n return ChartSettings\r\n}\r\n\r\ninterface RecountScaleProps {\r\n chartModel: Chart\r\n paneModel: Pane\r\n}\r\n\r\ntype ScaledFn = Partial & (d3.ScaleLinear | d3.ScaleSymLog)\r\n\r\nconst getShouldOffsetChartDomain = (elementModel: Element | ChartEventElement) => {\r\n const quote = elementModel.pane().chart().quote()\r\n\r\n return quote.chartEvents.length > 0 && ![TIMEFRAME.w, TIMEFRAME.m].includes(quote.timeframe)\r\n}\r\n\r\nexport const recountScale = ({ chartModel, paneModel }: RecountScaleProps) => {\r\n const { ChartSettings, IndicatorSettings, MarketSentimentSettings } = chartModel.getChartLayoutSettings()\r\n const chartLayout = chartModel.chart_layout()\r\n const barWidthWithMargin = getBarWidthWithMargin({ chartLayout, zoomFactor: chartModel.zoomFactor })\r\n for (const elementModel of [...paneModel.getAllElements(), ...paneModel.getAllChartEvents(false)]) {\r\n const el = elementModel.instance\r\n const isChart = elementModel.isChart()\r\n if (isChart || elementModel.isIndicator()) {\r\n let fx: ScaledFn, Settings: ISettings['MarketSentimentSettings' | 'ChartSettings' | 'IndicatorSettings'], width\r\n const scaleType = isChart ? chartModel.scale : ScaleType.Linear\r\n if (isChart) {\r\n Settings = chartModel.instrument === Instrument.MarketSentiment ? MarketSentimentSettings : ChartSettings\r\n } else {\r\n Settings = IndicatorSettings as ISettings['IndicatorSettings']\r\n }\r\n const contentHeight = paneModel.height - Settings.top.height - Settings.bottom.height\r\n\r\n if (chartModel.stretch) {\r\n width = chartModel.width - Settings.left.width - Settings.right.width\r\n const chartElement = chartModel.getChartElement()\r\n // PerfChart can be only imported as type because of circular dependency, that's why it's not possible to do instanceof check\r\n const isPerfChart = !!chartElement?.instance && 'getCompleteChartNumOfBars' in chartElement?.instance\r\n const perfChartInstance = isPerfChart ? (chartElement.instance as PerfChart) : null\r\n const numOfBars = perfChartInstance?.getCompleteChartNumOfBars() ?? chartModel.quote().close.length\r\n fx = d3\r\n .scaleLinear()\r\n .range([0, width])\r\n .domain([0, Math.max(0, numOfBars - 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 { 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 { Button, Icon, Paragraph, Tooltip, TooltipTrigger, useTooltipState } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { SidebarDirection } from './constants'\r\nimport { useSidebarContext } from './hooks/sidebar-context'\r\nimport { sidebarModules } from './modules/modules'\r\n\r\nexport const MOBILE_TOOLBAR_DIV_ID = 'toolbar-mobile'\r\n\r\ntype SidebarTabsProps = {\r\n className?: string\r\n}\r\n\r\nexport default function SidebarTabs({ className }: SidebarTabsProps) {\r\n const { isOpen, direction, activeModule, selectModule } = useSidebarContext()\r\n const tooltipState = useTooltipState({ placement: 'left', showTimeout: 300 })\r\n\r\n return (\r\n \r\n {/* reserved space for drawing button on mobile devices */}\r\n {direction === SidebarDirection.horizontal && (\r\n \r\n )}\r\n\r\n {Object.entries(sidebarModules).map(([key, value]) => {\r\n const isActive = activeModule?.key === key\r\n return (\r\n \r\n {\r\n selectModule(isActive ? undefined : value.key)\r\n }}\r\n className={classnames({ 'ml-2': direction === SidebarDirection.horizontal })}\r\n data-testid={`sidebar-${key}-btn`}\r\n >\r\n \r\n \r\n }\r\n state={tooltipState}\r\n aria-label={value.description}\r\n isHideOnClick\r\n />\r\n\r\n \r\n {value.description}\r\n \r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import { 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 { 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","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 { 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 Utils from '../utils'\r\nimport { ChartEventBadgeState } from '../utils/chart-events-utils'\r\n\r\nconst isMobile = Utils.isMobile()\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 // Due to the fact that chart events logic depends heavily on hover state which isn't really present on touch devices\r\n // we need to mimic that state for touch devices, this enables chart event to be open, and counterpart in\r\n // chart-event-popover-with-state.tsx allow chart event to be closed on click outside\r\n if (isMobile) {\r\n this.isHovered = isOpen\r\n }\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 { 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 { EMAConfig, Options } from '../overlays/configs/ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\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 config = EMAConfig\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 if (close.length < period) return\r\n\r\n const ema = new ExponentialMovingAverage(period)\r\n for (let index = 0; index < close.length; index++) {\r\n ema.add(close[index])\r\n\r\n if (index < period - 1) continue\r\n\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 IndicatorBaseConfig from '../indicators/configs/indicatorBaseConfig'\r\nimport Quote from '../models/quote'\r\nimport OverlayBaseConfig from '../overlays/configs/overlayBaseConfig'\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 declare static config: OverlayBaseConfig | IndicatorBaseConfig\r\n\r\n quote: NonNullable['quote']>\r\n options: MainProps['options']\r\n\r\n protected declare _calculatedValues: TCalculatedValues\r\n\r\n constructor({ quote, options }: MainProps) {\r\n this.quote = quote ?? new Quote()\r\n this.options = options\r\n }\r\n\r\n get calculatedValues() {\r\n return this._calculatedValues ?? this.getDefaultCalculatedValues()\r\n }\r\n\r\n get config() {\r\n return (this.constructor as typeof MainCalculation).config\r\n }\r\n\r\n getDefaultCalculatedValues(): TCalculatedValues {\r\n const defaultCalculatedValues = this.config.getDefaultCalculatedValues() as TCalculatedValues\r\n if (Object.keys(defaultCalculatedValues).length === 0) {\r\n throw Error('Add calculatedValues to indicator config')\r\n }\r\n return defaultCalculatedValues\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 colName = this.config.abbreviation\r\n const optionKeys = this.config.optionsOrder\r\n\r\n const optionsStrings = optionKeys.map((key) => `${key.slice(0, 1)}${this.options![key]}`)\r\n return [colName, ...optionsStrings].join('_')\r\n }\r\n}\r\n","import { ObjectHash } from '../../../types/shared'\r\nimport ElementBaseConfig from '../../canvas/ElementBaseConfig'\r\nimport { IndicatorType, QuoteFinancialAttachment } from '../../constants/common'\r\n\r\nexport default class IndicatorBaseConfig extends ElementBaseConfig {\r\n static type = IndicatorType.Indicator\r\n static abbreviation = 'ind'\r\n static label = 'Indicator'\r\n static shortLabel = 'Indicator'\r\n static optionsOrder = [] as readonly string[]\r\n static optionsLabels = {}\r\n static inputsOrder = [] as readonly string[]\r\n static inputsLabels = {}\r\n static calculatedValuesOrder = [] as readonly string[]\r\n static calculatedValuesLabels = {}\r\n static defaultCalculatedValueOption = undefined as undefined | string\r\n static quoteFinancialAttachments: QuoteFinancialAttachment[] = []\r\n\r\n static getShortLabelWithAttrs(attrs: ObjectHash) {\r\n return [this.shortLabel, this.optionsOrder.map((item) => attrs[item]).join(',')].filter((item) => !!item).join(' ')\r\n }\r\n\r\n get getShortLabelWithAttrs() {\r\n return (this.constructor as typeof IndicatorBaseConfig).getShortLabelWithAttrs\r\n }\r\n\r\n static getDefaultCalculatedValues() {\r\n return this.calculatedValuesOrder.reduce((prev, curr) => ({ ...prev, [curr]: [] }), {})\r\n }\r\n\r\n get getDefaultCalculatedValues() {\r\n return (this.constructor as typeof IndicatorBaseConfig).getDefaultCalculatedValues\r\n }\r\n}\r\n","import { IndicatorType, QuoteFinancialAttachment } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport class ShrtflConfig extends IndicatorBaseConfig {\r\n static quoteFinancialAttachments: QuoteFinancialAttachment[] = [QuoteFinancialAttachment.shortInterest]\r\n static type = IndicatorType.Shrtfl\r\n static label = 'Short Float%'\r\n static shortLabel = 'Short Float%'\r\n static abbreviation = 'shrtfl'\r\n}\r\n","import { IndicatorType, QuoteFinancialAttachment } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport class ShrtraConfig extends IndicatorBaseConfig {\r\n static quoteFinancialAttachments: QuoteFinancialAttachment[] = [QuoteFinancialAttachment.shortInterest]\r\n static type = IndicatorType.Shrtra\r\n static label = 'Short Ratio'\r\n static shortLabel = 'Short Ratio'\r\n static abbreviation = 'shrtra'\r\n}\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class ADXConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Adx\r\n static abbreviation = 'adx'\r\n static label = 'ADX'\r\n static shortLabel = 'ADX'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\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, { ITextAttrs } 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 { ISettings } from '../models/chart_settings/interfaces'\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 { renderFadeExtendedHours, renderXAxis } from '../utils/chart-grid-render-utils'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\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\nimport IndicatorBaseConfig from './configs/indicatorBaseConfig'\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 case IndicatorType.Shrtfl:\r\n case IndicatorType.Shrtra:\r\n return { min: 0, max: 1 }\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 config = IndicatorBaseConfig\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() as ISettings\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 // Used to calculate yAxis min/max values if min === max, and we don't want to use domain defaults\r\n applyMinMaxPadding = false\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).config.type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Indicator).config.label\r\n }\r\n\r\n get config() {\r\n return (this.constructor as typeof Indicator).config\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\r\n renderFadeExtendedHours({ context, paneModel: this.model, quote: this.data })\r\n\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, options?: { lastValueSuffix?: string }) {\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)}${options?.lastValueSuffix ?? ''}`,\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 } = this.getChartLayoutSettings()\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\r\n translate.do()\r\n\r\n renderXAxis({ context, quote: this.data, paneModel: this.model, type: this.type })\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 isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(specificChartFunctionality)\r\n const isDarkMode = theme === Theme.dark\r\n const x = isQuoteOrQuoteFinancials ? OFFSET.S : 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 || this.type === IndicatorType.Shrtfl,\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) ? -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 getValueLabelsAtIndex(_: number): Array<{ color: string; text: string | null }> {\r\n return []\r\n }\r\n\r\n renderCrossTextValueLabels(\r\n context: CanvasRenderingContext2D,\r\n crossIndex: number,\r\n { textBaseline, y }: Pick\r\n ) {\r\n if (!context || isNaN(crossIndex) || crossIndex === -1) {\r\n return\r\n }\r\n\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const crossValueText = 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,\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\r\n let x = this.labelWidth + IndicatorSettings.left.indicatorLabel.margin.left! * 2\r\n\r\n const renderLabel = ({ color, text }: { color: string; text: string | null }) => {\r\n crossValueText.set({\r\n x,\r\n y,\r\n fillStyle: color,\r\n text: text ?? ' - ',\r\n })\r\n\r\n x += crossValueText.measure(context) + crossValueText.attrs.padding.left + crossValueText.attrs.padding.right\r\n\r\n crossValueText.render(context)\r\n }\r\n\r\n let lastRenderedIndex = -1\r\n this.getValueLabelsAtIndex(crossIndex).forEach(({ color, text }, index) => {\r\n if (text !== null) {\r\n if (lastRenderedIndex > -1) {\r\n renderLabel({ color: Colors.zeroChange, text: '·' })\r\n }\r\n renderLabel({ color, text })\r\n\r\n lastRenderedIndex = index\r\n }\r\n })\r\n }\r\n\r\n renderCrossTextChartsPage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { indicatorLabel } = this.getChartLayoutSettings().IndicatorSettings.left\r\n // @todo - Default text lineheight is 20 , and is not overwritten by indicatorLabel.font (which is probably a bug) , in this case it's easier to hardcode this value than access is on Text instance\r\n const lineHeight = 20\r\n this.renderCrossTextValueLabels(context, crossIndex, {\r\n textBaseline: TextBaseline.middle,\r\n y: indicatorLabel.margin.top! + (2 * INDICATOR_LABEL_HEIGHT - lineHeight) / 2,\r\n })\r\n }\r\n\r\n renderCrossTextQuotePage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n this.renderCrossTextValueLabels(context, crossIndex, {\r\n textBaseline: TextBaseline.top,\r\n y: this.getChartLayoutSettings().IndicatorSettings.left.indicatorLabel.margin.top,\r\n })\r\n }\r\n\r\n getValueLabel(value: number | undefined | null, unit = '') {\r\n if (value === undefined || value === null || !Number.isFinite(value)) return null\r\n\r\n return `${math.formatBigNumber(value, 2)}${unit}`\r\n }\r\n\r\n getOversoldOverboughtValueLabelsAtIndex(index: number, array: number[]) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [{ color: IndicatorSettings.general.Colors.line, text: this.getValueLabel(array[dataIndex]) }]\r\n }\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 const firstIndex = array.findIndex((value) => value !== undefined)\r\n const firstFx = this.fx(Math.max(firstBarToRenderIndex, firstIndex))\r\n context.moveTo(firstFx, Math.round(this.fy(this.model.scale.y.domain()[0])))\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n if (array[i] !== undefined) 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(firstFx, Math.round(this.fy(this.model.scale.y.domain()[1])))\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n if (array[i] !== undefined) 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 if (array[i] !== undefined) 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 if (!areNoBarsVisible && min !== MAX_POSITIVE_DEFAULT_VALUE && max !== MAX_NEGATIVE_DEFAULT_VALUE) {\r\n if (min === max && this.applyMinMaxPadding) {\r\n min = min - min * Math.sign(min)\r\n max = max + max * Math.sign(max)\r\n }\r\n if (min !== max) {\r\n return { min, max }\r\n }\r\n }\r\n return this.getDomainDefaults(this.type)\r\n }\r\n\r\n getModalConfig(): IModalConfig {\r\n return {\r\n title: this.label,\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 toString() {\r\n return this.config.getShortLabelWithAttrs(this)\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 utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { ADXConfig, Attrs } from './configs/adx'\r\nimport Indicator from './indicator'\r\n\r\nclass ADX extends Indicator {\r\n static config = ADXConfig\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 getLineColors() {\r\n return {\r\n pdi: '#2eb12e',\r\n mdi: '#d43737',\r\n adx: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line,\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const lineColors = this.getLineColors()\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n { color: lineColors.pdi, text: this.getValueLabel(this.pdi[dataIndex]) },\r\n { color: lineColors.mdi, text: this.getValueLabel(this.mdi[dataIndex]) },\r\n { color: lineColors.adx, text: this.getValueLabel(this.adx[dataIndex]) },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n const lineColors = this.getLineColors()\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', lineColors.pdi)\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', lineColors.mdi)\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', lineColors.adx)\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 options = {\r\n 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\r\n return {\r\n title: ADXConfig.label,\r\n inputs: ADXConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nexport default ADX\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class AroConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Aro\r\n static abbreviation = 'aro'\r\n static label = 'Aroon'\r\n static shortLabel = 'Aroon'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n static calculatedValuesOrder = ['aroonUp', 'aroonDown', 'oscillator'] as const\r\n static calculatedValuesLabels = {\r\n aroonUp: 'Aroon Up',\r\n aroonDown: 'Aroon Down',\r\n oscillator: 'Oscillator',\r\n }\r\n\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { AroConfig, Attrs } from '../indicators/configs/aro'\r\nimport { MainCalculation, OnValueCalculated } from './main'\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 config = AroConfig\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 { 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 { AroConfig, Attrs } from './configs/aro'\r\nimport Indicator from './indicator'\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 config = AroConfig\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 getLineColors() {\r\n return {\r\n aroonUp: COLORS.aroonUp,\r\n aroonDown: COLORS.aroonDown,\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n if (this.data.close.length === 0 || !this.aroonCalculation) return []\r\n\r\n const lineColors = this.getLineColors()\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n { color: lineColors.aroonDown, text: this.getValueLabel(aroonDown[dataIndex]) },\r\n { color: lineColors.aroonUp, text: this.getValueLabel(aroonUp[dataIndex]) },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0 || !this.aroonCalculation) return\r\n\r\n const lineColors = this.getLineColors()\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', lineColors.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', lineColors.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 options = {\r\n 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\r\n return {\r\n title: AroConfig.label,\r\n inputs: AroConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nexport default Aroon\r\n","import { IndicatorType } from '../../constants/common'\r\nimport { AroConfig } from './aro'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class ArooscConfig extends AroConfig {\r\n static type = IndicatorType.Aroosc\r\n static abbreviation = 'aroosc'\r\n static label = 'Aroon Oscillator'\r\n static shortLabel = 'Aroon Oscillator'\r\n}\r\n","import { AroonCalculation } from '../indicator-calculation/aroon'\r\nimport { ArooscConfig, Attrs } from './configs/aroosc'\r\nimport Indicator from './indicator'\r\n\r\nclass AroonOscillator extends Indicator {\r\n static config = ArooscConfig\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 getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.aroonCalculation?.calculatedValues.oscillator ?? [])\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 options = {\r\n 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\r\n return {\r\n title: ArooscConfig.label,\r\n inputs: ArooscConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nexport default AroonOscillator\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class ATRConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Atr\r\n static abbreviation = 'atr'\r\n static label = 'Average True Range'\r\n static shortLabel = 'ATR'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import AverageTrueRange from '../helpers/atr'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { ATRConfig, Attrs } from './configs/atr'\r\nimport Indicator from './indicator'\r\n\r\nclass ATR extends Indicator {\r\n static config = ATRConfig\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 getValueLabelsAtIndex(index: number) {\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n {\r\n color: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line!,\r\n text: this.getValueLabel(this.atr[dataIndex]),\r\n },\r\n ]\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 options = {\r\n 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\r\n return {\r\n title: ATRConfig.label,\r\n inputs: ATRConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nexport default ATR\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class CCIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Cci\r\n static abbreviation = 'cci'\r\n static label = 'Commodity Channel Index'\r\n static shortLabel = 'CCI'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { Attrs, CCIConfig } from './configs/cci'\r\nimport Indicator from './indicator'\r\n\r\nconst constant = 0.015\r\nclass CommodityChannelIndex extends Indicator {\r\n static config = CCIConfig\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 getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.cci)\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 options = {\r\n 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\r\n return {\r\n title: CCIConfig.label,\r\n inputs: CCIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nexport default CommodityChannelIndex\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Attrs = {\r\n period: string\r\n code: string\r\n}\r\n\r\nexport class COTConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Cot\r\n static abbreviation = 'cot'\r\n static label = 'COT'\r\n static shortLabel = 'CCI'\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport { Theme } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport { INDICATOR_LABEL_HEIGHT, TextAlign, TextBaseline } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, COTConfig } from './configs/cot'\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\ntype ColorsKeys = keyof Pick\r\n\r\nclass COT extends Indicator {\r\n static config = COTConfig\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\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 getLineColors() {\r\n const isDarkMode = this.model.chart().chart_layout().theme === Theme.dark\r\n return {\r\n commercialHedgers: tailwindColors.green[400],\r\n largeTraders: tailwindColors.red[400],\r\n smallTraders: tailwindColors.blue[isDarkMode ? 300 : 500],\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n if (!this.data.COTs) return []\r\n const colors = this.getLineColors()\r\n\r\n return Object.keys(colors).map((key) => {\r\n const data = this.data.COTs[this.attrs.code][key as ColorsKeys]\r\n return {\r\n color: colors[key as ColorsKeys],\r\n text: this.getValueLabel(data[index]),\r\n }\r\n })\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 const colors = this.getLineColors()\r\n for (const key in colors) {\r\n context.set('strokeStyle', 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 const secondarylabelX = 38 + name.measure()\r\n const secondarylabel = new Text(\r\n {\r\n text: this.data.COTs[this.attrs.code].units as string,\r\n x: secondarylabelX,\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 )\r\n\r\n this.labelWidth = secondarylabelX + 8 + secondarylabel.measure(context)\r\n secondarylabel.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 this.labelWidth = secondarylabelX + x + secondarylabel.measure(context)\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 const colors = this.getLineColors()\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: 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: colors.largeTraders })\r\n text.render(context)\r\n\r\n x += 8 + text.measure()\r\n text.set({ text: 'Small Traders', x, fillStyle: 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: COTConfig.label,\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) : ''\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\nexport default COT\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class FIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Fi\r\n static abbreviation = 'fi'\r\n static label = 'Force Index'\r\n static shortLabel = 'FORCE'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n static calculatedValuesOrder = ['fi'] as const\r\n static calculatedValuesLabels = { fi: 'Force Index' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, FIConfig } from '../indicators/configs/fi'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n fi: number[]\r\n}\r\n\r\nexport class FICalculation extends MainCalculation {\r\n static config = FIConfig\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close, volume } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length < period) return\r\n\r\n const ema = new ExponentialMovingAverage(period)\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\r\n if (index < period) continue\r\n\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 { FICalculation } from '../indicator-calculation/fi'\r\nimport { Attrs, FIConfig } from './configs/fi'\r\nimport Indicator from './indicator'\r\n\r\nclass ForceIndex extends Indicator {\r\n static config = FIConfig\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 getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.fiCalculation?.calculatedValues.fi ?? [])\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 options = {\r\n 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\r\n return {\r\n title: FIConfig.label,\r\n inputs: FIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nexport default ForceIndex\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n fastPeriod: number\r\n slowPeriod: number\r\n signalPeriod: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period: string\r\n}\r\n\r\nexport class MACDConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Macd\r\n static abbreviation = 'macd'\r\n static label = 'MACD'\r\n static shortLabel = 'MACD'\r\n static optionsOrder = ['fastPeriod', 'slowPeriod', 'signalPeriod'] as const\r\n static optionsLabels = { fastPeriod: 'Period', slowPeriod: 'Slow', signalPeriod: 'Signal' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n static calculatedValuesOrder = ['macd', 'signal', 'histogram'] as const\r\n static calculatedValuesLabels = { macd: 'MACD Line', signal: 'Signal', histogram: 'Histogram' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { MACDConfig, Options } from '../indicators/configs/macd'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\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 config = MACDConfig\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { close } = this.quote\r\n const { fastPeriod, slowPeriod, signalPeriod } = this.options\r\n\r\n if (close.length <= slowPeriod) return\r\n\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n const emaFast = new ExponentialMovingAverage(fastPeriod)\r\n const emaSlow = new ExponentialMovingAverage(slowPeriod)\r\n const emaSignal = new ExponentialMovingAverage(signalPeriod)\r\n let macdCount = 0\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\r\n if (i < slowPeriod - 1) continue\r\n\r\n const macd = emaFast.value - emaSlow.value\r\n emaSignal.add(macd)\r\n this.calculatedValues.macd[i] = macd\r\n macdCount += 1\r\n\r\n if (macdCount < signalPeriod) continue\r\n\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 { 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 { Attrs, MACDConfig } from './configs/macd'\r\nimport Indicator from './indicator'\r\n\r\nclass MACD extends Indicator {\r\n static config = MACDConfig\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 getLineColors() {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n return {\r\n histogram: '#79c3e8',\r\n macd: IndicatorSettings.general.Colors.line,\r\n signal: IndicatorSettings.general.Colors.signalLine,\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n if (this.macdCalculation === null || this.data.close.length === 0) return []\r\n\r\n const lineColors = this.getLineColors()\r\n const { macd, histogram, signal } = this.macdCalculation.calculatedValues\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n { color: lineColors.histogram, text: this.getValueLabel(histogram[dataIndex]) },\r\n { color: lineColors.macd, text: this.getValueLabel(macd[dataIndex]) },\r\n { color: lineColors.signal, text: this.getValueLabel(signal[dataIndex]) },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.macdCalculation === null || this.data.close.length === 0) return\r\n const lineColors = this.getLineColors()\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', lineColors.histogram)\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', lineColors.macd)\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', lineColors.signal)\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 options = {\r\n 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 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 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\r\n return {\r\n title: MACDConfig.label,\r\n inputs: MACDConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n fastPeriod: `${options.fastPeriod.label} must be a whole number between ${options.fastPeriod.min} and ${options.fastPeriod.max}`,\r\n slowPeriod: `${options.slowPeriod.label} must be a whole number between ${options.slowPeriod.min} and ${options.slowPeriod.max}`,\r\n signalPeriod: `${options.signalPeriod.label} must be a whole number between ${options.signalPeriod.min} and ${options.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\r\nexport default MACD\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class MFIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Mfi\r\n static abbreviation = 'mfi'\r\n static label = 'Money Flow Index'\r\n static shortLabel = 'MFI'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { Attrs, MFIConfig } from './configs/mfi'\r\nimport Indicator from './indicator'\r\n\r\nclass MFI extends Indicator {\r\n static config = MFIConfig\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 getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.mfi)\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 options = {\r\n 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\r\n return {\r\n title: MFIConfig.label,\r\n inputs: MFIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nexport default MFI\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport class NoneConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.None\r\n static abbreviation = 'none'\r\n static label = 'None'\r\n static shortLabel = 'None'\r\n}\r\n","import { NoneConfig } from './configs/none'\r\nimport Indicator from './indicator'\r\n\r\nclass None extends Indicator {\r\n static config = NoneConfig\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 IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport class OBVConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Obv\r\n static abbreviation = 'obv'\r\n static label = 'On-Balance Volume'\r\n static shortLabel = 'OBV'\r\n}\r\n","import math from '../helpers/math'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { OBVConfig } from './configs/obv'\r\nimport Indicator from './indicator'\r\n\r\nclass OBV extends Indicator {\r\n static config = OBVConfig\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 getValueLabelsAtIndex(index: number) {\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n {\r\n color: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line!,\r\n text: this.getValueLabel(this.obv[dataIndex]),\r\n },\r\n ]\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: OBVConfig.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n}\r\n\r\nexport default OBV\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: string\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n tickers?: string\r\n}\r\n\r\nexport class PerfConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Perf\r\n static abbreviation = 'perf'\r\n static label = 'Price Performance %'\r\n static shortLabel = 'PERF %'\r\n static optionsOrder = ['tickers'] as const\r\n static optionsLabels = { tickers: 'Tickers' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\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 MOBILE_VIEW_BREAKPOINT_WIDTH,\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 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 { getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { Attrs, PerfConfig } from './configs/perf'\r\nimport Indicator from './indicator'\r\n\r\nconst DEFAULT_TICKERS = 'SPY,QQQ'\r\nconst NO_VALUE = ' - '\r\n\r\ntype PerfData = { lastValueIndex: number; values: Array }\r\nfunction getDefaultPerfData(): PerfData {\r\n return {\r\n lastValueIndex: 0,\r\n values: [],\r\n }\r\n}\r\n\r\nclass PricePerformance extends Indicator {\r\n static config = PerfConfig\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 perf: ObjectHash = {}\r\n quotes: ObjectHash = {} // this is used in getAllQuotes() in charts/app/models/chart.ts\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 data: ObjectHash = {}\r\n let hasCachedData = true\r\n this.getTickersAndTimeframe().forEach((quoteSettings) => {\r\n const quote = Quote.getFromCacheSync(quoteSettings)\r\n hasCachedData = hasCachedData && !!quote\r\n if (quote) {\r\n data[quoteSettings.ticker] = quote\r\n }\r\n })\r\n\r\n if (hasCachedData) {\r\n return this._compute(Object.keys(data), data)\r\n }\r\n\r\n const fetchedData = await Quote.getAll(this.getTickersAndTimeframe())\r\n if (fetchedData) {\r\n this._compute(Object.keys(fetchedData), fetchedData)\r\n this.trigger('change')\r\n }\r\n }\r\n\r\n _compute(tickers: string[], data: ObjectHash) {\r\n const { leftOffset } = this.model.chart()\r\n data[this.data.ticker] = this.data\r\n this.quotes = data\r\n this.perf = {}\r\n\r\n const firstVisibleBar = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n leftOffset,\r\n paneModel: this.model,\r\n })\r\n const lastVisibleBar = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n leftOffset,\r\n paneModel: this.model,\r\n chartWidth: this.contentWidth,\r\n })\r\n\r\n let min: number | null = null\r\n let max: number | null = null\r\n\r\n for (const ticker of [this.data.ticker, ...tickers]) {\r\n this.perf[ticker] = getDefaultPerfData()\r\n const d = data[ticker]\r\n const lastTickerTimestamp = d.date[d.date.length - 1]\r\n if (!d) {\r\n continue\r\n }\r\n const dateToIndex = d.getDateToIndex()\r\n let first = null\r\n let lastValue = null\r\n let dataIndex = -1\r\n for (let i = firstVisibleBar.barIndex; i <= lastVisibleBar.barIndex; i++) {\r\n const timestamp = this.data.getTimestampFomPositionX(i)\r\n dataIndex = dateToIndex[timestamp]\r\n\r\n if (typeof dataIndex === 'number') {\r\n first = first === null ? d.close[dataIndex] : first\r\n lastValue = (d.close[dataIndex] * 100) / (first ?? 0) - 100\r\n }\r\n\r\n this.perf[ticker].values[i] = null\r\n if (lastTickerTimestamp >= timestamp && lastValue !== null && !isNaN(lastValue)) {\r\n this.perf[ticker].values[i] = lastValue\r\n this.perf[ticker].lastValueIndex = i\r\n if (min === null || (lastValue !== null && min > lastValue)) min = lastValue\r\n if (max === null || (lastValue !== null && max < lastValue)) max = lastValue\r\n }\r\n }\r\n\r\n if (firstVisibleBar.barIndex > 0) {\r\n this.perf[ticker].values[firstVisibleBar.barIndex - 1] = this.perf[ticker].values[firstVisibleBar.barIndex]\r\n }\r\n if (lastVisibleBar.barIndex < this.data.barToDataIndex.length) {\r\n this.perf[ticker].values[lastVisibleBar.barIndex + 1] = this.perf[ticker].values[lastVisibleBar.barIndex]\r\n }\r\n }\r\n\r\n // > 2 because we need at least 2 bars to be able to calculate price perf and also we copy first visible bar value\r\n // to its index - 1 to ensure line is drawn from the very left edge of the chart\r\n // so first 2 values are the same and we need one more\r\n const canUseCustomMinMax = Object.values(this.perf).some(\r\n ({ values }) => values.filter((val) => typeof val === 'number').length > 2\r\n )\r\n const domainDefaults = this.getDomainDefaults(this.type)\r\n this.min = canUseCustomMinMax && min !== null ? min : domainDefaults.min\r\n this.max = canUseCustomMinMax && max !== null ? max : domainDefaults.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 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\r\n const allTickers = [...this.getTickers(), this.data.ticker]\r\n\r\n allTickers.forEach((ticker) => {\r\n context.set('strokeStyle', this.getTickerColor(ticker))\r\n context.beginPath()\r\n this.perf[ticker].values.forEach((value, index) => {\r\n const y = value !== null ? Math.round(this.fy(value)) : null\r\n if (y !== null && !isNaN(y)) {\r\n context.lineTo(this.model.scale.x(index), y)\r\n }\r\n })\r\n context.stroke()\r\n })\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderCrossTextQuotePage(context: CanvasRenderingContext2D, crossIndex: number, hasBackground = true) {\r\n if (!context || isNaN(crossIndex) || !this.ready) {\r\n return\r\n }\r\n const { 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 tickerValue = this.perf[key]?.values[crossIndex] ?? null\r\n const { margin, font, labelSpacing } = IndicatorSettings.left.indicatorLabel\r\n const textPosX = margin.left ?? 0\r\n const textPosY = (font.lineHeight! + labelSpacing) * (index + 1) + margin.top!\r\n\r\n const text = new Text(\r\n {\r\n text: `${key} ${tickerValue !== null ? `${tickerValue.toFixed(2)}%` : NO_VALUE}`,\r\n x: textPosX,\r\n y: textPosY,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle: this.getTickerColor(key),\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n )\r\n\r\n // Rendering background on server charts covers labels because of small spacing between them\r\n if (this.model.chart().chart_layout().specificChartFunctionality !== SpecificChartFunctionality.offScreen) {\r\n const measuredWidth = text.measure(context)\r\n const labelWidth = hasBackground ? Math.max(this.indicatorLabelWidth[key] ?? 0, measuredWidth) : measuredWidth\r\n this.indicatorLabelWidth[key] = labelWidth\r\n\r\n context.set('fillStyle', hasBackground ? Colors.canvasFill : getHEXWithSpecificAplha(Colors.canvasFill, 0.8))\r\n context.fillRect(\r\n textPosX! - PADDING.XXXS,\r\n textPosY - PADDING.XXXS,\r\n labelWidth + PADDING.XXXS * 2,\r\n font.size! + PADDING.XXXS * 2\r\n )\r\n }\r\n\r\n text.render(context)\r\n })\r\n }\r\n\r\n renderCrossTextChartsPage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n if (!context || isNaN(crossIndex)) {\r\n return\r\n }\r\n\r\n const { 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 tickers.forEach((key) => {\r\n const tickerValue = this.perf[key]?.values[crossIndex > -1 ? crossIndex : this.perf[key].lastValueIndex] ?? null\r\n tickerText.set({\r\n x,\r\n y,\r\n fillStyle: this.getTickerColor(key),\r\n text: `${key} ${tickerValue !== null ? `${tickerValue.toFixed(2)}%` : NO_VALUE}`,\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 getTickerColor(ticker: string) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n if (ticker === this.data.ticker) {\r\n return Colors.performanceIndicatorLabel\r\n }\r\n\r\n return ColorsSettings[this.getTickers().indexOf(ticker) % ColorsSettings.length]\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 super.renderYAxis(context)\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (!this.ready) {\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 allTickers = [...this.getTickers(), this.data.ticker]\r\n\r\n const minY = 0\r\n const maxY = this.contentHeight\r\n allTickers.forEach((ticker) => {\r\n const lastValue = this.perf[ticker]?.values[this.perf[ticker]?.lastValueIndex] ?? null\r\n if (lastValue !== null) {\r\n const labelSetting = {\r\n text: `${lastValue.toFixed(2)}%`,\r\n y: Math.round(this.fy(lastValue)),\r\n background: this.getTickerColor(ticker),\r\n }\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\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 this.renderCrossTextQuotePage(context, this.perf[this.data.ticker].lastValueIndex, false)\r\n }\r\n\r\n getTickers() {\r\n return this.tickers\r\n .split(',')\r\n .filter((ticker, i, arr) => ticker && ticker !== this.data.ticker && arr.indexOf(ticker) === i)\r\n }\r\n\r\n getTickersAndTimeframe() {\r\n const chartModel = this.model.chart()\r\n const chartLayoutModel = chartModel.chart_layout()\r\n const { timeframe, premarket, aftermarket, hasPatterns } = chartModel.quote()\r\n return this.getTickers().map((ticker) => ({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe,\r\n chartUuid: chartLayoutModel.uuid,\r\n canBeEmptyQuote: chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.offScreen,\r\n options: {\r\n premarket,\r\n aftermarket,\r\n patterns: hasPatterns,\r\n },\r\n }))\r\n }\r\n\r\n set(values: Partial) {\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 const options = {\r\n tickers: {\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\r\n return {\r\n title: PerfConfig.label,\r\n inputs: PerfConfig.inputsOrder.map((item) => options[item]),\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() ? PerfConfig.shortLabel : super.toString()\r\n }\r\n}\r\n\r\nexport default PricePerformance\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number | string\r\n momentum: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class RMIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Rmi\r\n static abbreviation = 'rmi'\r\n static label = 'Relative Momentum Index'\r\n static shortLabel = 'RMI'\r\n static optionsOrder = ['period', 'momentum'] as const\r\n static optionsLabels = { period: 'Period', momentum: 'Momentum' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, RMIConfig } from './configs/rmi'\r\nimport Indicator from './indicator'\r\n\r\nclass RMI extends Indicator {\r\n static config = RMIConfig\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 getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.rmi)\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 options = {\r\n 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 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\r\n return {\r\n title: RMIConfig.label,\r\n inputs: RMIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n momentum: `${options.momentum.label} must be a whole number between ${options.momentum.min} and ${options.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\r\nexport default RMI\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class ROCConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Roc\r\n static abbreviation = 'roc'\r\n static label = 'Rate of Change %'\r\n static shortLabel = 'ROC'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import Line from '../canvas/line'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, ROCConfig } from './configs/roc'\r\nimport Indicator from './indicator'\r\n\r\nclass ROC extends Indicator {\r\n static config = ROCConfig\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 getValueLabelsAtIndex(index: number) {\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n {\r\n color: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line!,\r\n text: this.getValueLabel(this.roc[dataIndex]),\r\n },\r\n ]\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 options = {\r\n 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\r\n return {\r\n title: ROCConfig.label,\r\n inputs: ROCConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nexport default ROC\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class RSIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Rsi\r\n static abbreviation = 'rsi'\r\n static label = 'Relative Strength Index'\r\n static shortLabel = 'RSI'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n static calculatedValuesOrder = ['rsi'] as const\r\n static calculatedValuesLabels = { rsi: 'RSI' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, RSIConfig } from '../indicators/configs/rsi'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n rsi: number[]\r\n}\r\n\r\nexport class RsiCalculation extends MainCalculation {\r\n static config = RSIConfig\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 if (close.length <= period) return\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 continue\r\n }\r\n\r\n au = (au! * (period - 1) + u) / period\r\n ad = (ad! * (period - 1) + d) / period\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 { RsiCalculation } from '../indicator-calculation/rsi'\r\nimport { Attrs, RSIConfig } from './configs/rsi'\r\nimport Indicator from './indicator'\r\n\r\nclass RSI extends Indicator {\r\n static config = RSIConfig\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 getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.rsiCalculation?.calculatedValues.rsi ?? [])\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 options = {\r\n 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\r\n return {\r\n title: RSIConfig.label,\r\n inputs: RSIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nexport default RSI\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number | string\r\n baseLine: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class RVOLConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Rvol\r\n static abbreviation = 'rvol'\r\n static label = 'Relative Volume'\r\n static shortLabel = 'RVOL'\r\n static optionsOrder = ['period', 'baseLine'] as const\r\n static optionsLabels = { period: 'Period', baseLine: 'BaseLine' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import Line from '../canvas/line'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, RVOLConfig } from './configs/rvol'\r\nimport Indicator from './indicator'\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 config = RVOLConfig\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] = sum > 0 ? this.data.volume[i] / (sum / this.period) : 0\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 getValueLabelsAtIndex(index: number) {\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n const dataIndex = this.data.barToDataIndex[index]\r\n const value = this.rvol[dataIndex]\r\n return [\r\n { color: value < this.baseLine ? Colors.volumeTrendDown : Colors.volumeTrendUp, text: this.getValueLabel(value) },\r\n ]\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 options = {\r\n 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 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\r\n return {\r\n title: RVOLConfig.label,\r\n inputs: RVOLConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n baseLine: `${options.baseLine.label} must be a number between ${options.baseLine.min} and ${options.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 `${super.toString()}, SMA`\r\n }\r\n}\r\n\r\nexport default RelativeVolume\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class RWIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Rwi\r\n static abbreviation = 'rwi'\r\n static label = 'Random Walk Index'\r\n static shortLabel = 'RWI'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import Text from '../canvas/text'\r\nimport { 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 { Attrs, RWIConfig } from './configs/rwi'\r\nimport Indicator from './indicator'\r\n\r\nclass RWI extends Indicator {\r\n static config = RWIConfig\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 getLineColors() {\r\n return {\r\n rwiLo: '#c80000',\r\n rwiHi: '#00a000',\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n if (this.data.close.length === 0) return []\r\n\r\n const lineColors = this.getLineColors()\r\n const dataIndex = this.data?.barToDataIndex[index]\r\n return [\r\n { color: lineColors.rwiLo, text: this.getValueLabel(this.rwiLo[dataIndex]) },\r\n { color: lineColors.rwiHi, text: this.getValueLabel(this.rwiHi[dataIndex]) },\r\n ]\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 options = {\r\n 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\r\n return {\r\n title: RWIConfig.label,\r\n inputs: RWIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nexport default RWI\r\n","import { format } from 'date-fns'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport { TIMEFRAME } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { dateFromUnixTimestamp } from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ntype ValuesType = Array<{\r\n isBeforeData: boolean\r\n timestamp: number\r\n value: number | null\r\n sourceIndex: number\r\n}>\r\n\r\nclass FinancialIndicator extends Indicator {\r\n values: ValuesType[] = []\r\n applyMinMaxPadding = true\r\n\r\n getComputedValuesAtDateIndex(_: number): ValuesType {\r\n throw Error('Implement getComputedValuesAtDateIndex method')\r\n }\r\n\r\n compute() {\r\n if (!isNaN(this.contentWidth) && this.isComputeNecessary()) {\r\n this.values = []\r\n\r\n if (this.data.financialAttachmentsData) {\r\n for (let i = 0; i < this.data.date.length; i++) {\r\n const computedValues = this.getComputedValuesAtDateIndex(i)\r\n this.values[i] = computedValues.length > 0 ? computedValues : (this.values[i - 1] ?? [])\r\n }\r\n }\r\n }\r\n\r\n this.lastValue = this.getLastValue()\r\n const { min, max } = this.computeVisibleMinMax()\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getLastValue() {\r\n return this.getValueAtDataIndex(this.values.length - 1)\r\n }\r\n\r\n computeVisibleMinMax() {\r\n return super.computeVisibleMinMax(this.values.map((values) => values[values.length - 1]?.value ?? Number.NaN))\r\n }\r\n\r\n getValueAtDataIndex(dataIndex: number) {\r\n const vals = this.values[dataIndex]\r\n const val = vals?.[(vals?.length ?? 0) - 1] ?? null\r\n return val?.value\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const shouldShowDate = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3].includes(this.data.timeframe)\r\n const dataIndex = this.data.barToDataIndex[index]\r\n const values = this.values[dataIndex]\r\n if (!values) {\r\n return []\r\n }\r\n\r\n return values.map(({ timestamp, value, isBeforeData }) => {\r\n const valueLabel = this.getValueLabel(value)\r\n\r\n return {\r\n color: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line!,\r\n text:\r\n valueLabel !== null\r\n ? `${valueLabel} ${\r\n values.length >= 2 || isBeforeData || shouldShowDate\r\n ? `(${format(dateFromUnixTimestamp(timestamp), 'MMM dd')})`\r\n : ''\r\n }`\r\n : null,\r\n }\r\n })\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const translate = getTranslate({ context, xOffset: 0.5, yOffset: 0.5 })\r\n translate.do()\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\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 val = this.getValueAtDataIndex(i)\r\n context.lineTo(x, Math.round(this.fy(val!)))\r\n },\r\n })\r\n context.stroke()\r\n translate.undo()\r\n }\r\n\r\n formatAxis(value: number) {\r\n return this.getValueLabel(value) ?? value.toString()\r\n }\r\n}\r\n\r\nexport default FinancialIndicator\r\n","import { QuoteFinancialAttachment } from '../constants/common'\r\nimport { ShrtflConfig } from './configs/shrtfl'\r\nimport FinancialIndicator from './financialIndicator'\r\n\r\nclass Shrtfl extends FinancialIndicator {\r\n static config = ShrtflConfig\r\n\r\n getComputedValuesAtDateIndex(dateIndex: number) {\r\n const { timestampToFinancialsIndexesMap, alignedFinancialAttachmentsData } = this.data\r\n const timestampKey = this.data.date[dateIndex]?.toString() ?? ''\r\n const sourceIndexes = timestampToFinancialsIndexesMap[QuoteFinancialAttachment.shortInterest]?.[timestampKey] ?? []\r\n const alignedData = alignedFinancialAttachmentsData[QuoteFinancialAttachment.shortInterest] ?? []\r\n let isBeforeData = false\r\n\r\n if (sourceIndexes.length === 0 && dateIndex === 0) {\r\n const lastBeforeDateFinancialsDataIndex = alignedData.findLastIndex(\r\n ({ timestamp }) => timestamp < this.data.date[dateIndex]\r\n )\r\n if (lastBeforeDateFinancialsDataIndex >= 0) {\r\n sourceIndexes.push(lastBeforeDateFinancialsDataIndex)\r\n isBeforeData = true\r\n }\r\n }\r\n\r\n return sourceIndexes.map((si) => {\r\n const { timestamp, shortInterest, sharesFloat } = alignedData[si]\r\n let value: number | null = null\r\n if (shortInterest !== null && sharesFloat !== null) {\r\n value = (shortInterest / sharesFloat) * 100\r\n }\r\n\r\n return {\r\n isBeforeData,\r\n timestamp,\r\n value,\r\n sourceIndex: si,\r\n }\r\n })\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D, options: { lastValueSuffix?: string } = {}) {\r\n return super.renderYAxis(context, { ...options, lastValueSuffix: '%' })\r\n }\r\n\r\n getValueLabel(value: number | null | undefined) {\r\n return super.getValueLabel(value, '%')\r\n }\r\n\r\n getIsValid(): boolean {\r\n return true\r\n }\r\n}\r\n\r\nexport default Shrtfl\r\n","import { QuoteFinancialAttachment } from '../constants/common'\r\nimport { ShrtraConfig } from './configs/shrtra'\r\nimport FinancialIndicator from './financialIndicator'\r\n\r\nclass Shrtra extends FinancialIndicator {\r\n static config = ShrtraConfig\r\n\r\n getComputedValuesAtDateIndex(dateIndex: number) {\r\n const { timestampToFinancialsIndexesMap, alignedFinancialAttachmentsData } = this.data\r\n const timestampKey = this.data.date[dateIndex]?.toString() ?? ''\r\n const sourceIndexes = timestampToFinancialsIndexesMap[QuoteFinancialAttachment.shortInterest]?.[timestampKey] ?? []\r\n const alignedData = alignedFinancialAttachmentsData[QuoteFinancialAttachment.shortInterest] ?? []\r\n let isBeforeData = false\r\n\r\n if (sourceIndexes.length === 0 && dateIndex === 0) {\r\n const lastBeforeDateFinancialsDataIndex = alignedData.findLastIndex(\r\n ({ timestamp }) => timestamp < this.data.date[dateIndex]\r\n )\r\n if (lastBeforeDateFinancialsDataIndex >= 0) {\r\n sourceIndexes.push(lastBeforeDateFinancialsDataIndex)\r\n isBeforeData = true\r\n }\r\n }\r\n\r\n return sourceIndexes.map((si) => {\r\n const { timestamp, shortInterest, averageVolume } = alignedData[si]\r\n let value: number | null = null\r\n if (shortInterest !== null && averageVolume !== null) {\r\n value = (shortInterest / averageVolume) * 1_000_000\r\n }\r\n\r\n return {\r\n isBeforeData,\r\n timestamp,\r\n value,\r\n sourceIndex: si,\r\n }\r\n })\r\n }\r\n\r\n getIsValid(): boolean {\r\n return true\r\n }\r\n}\r\n\r\nexport default Shrtra\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: string | number\r\n dPeriod: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n kPeriod: number\r\n}\r\n\r\nexport class StofaConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Stofa\r\n static abbreviation = 'stofa'\r\n static label = 'Stochastics FAST'\r\n static shortLabel = 'Stochastics FAST'\r\n static optionsOrder = ['period', 'dPeriod']\r\n\r\n static optionsLabels = { period: 'Period', dPeriod: 'D Period' }\r\n\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: string | number\r\n dPeriod: number\r\n kPeriod: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class StofuConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Stofu\r\n static abbreviation = 'stofu'\r\n static label = 'Stochastics FULL'\r\n static shortLabel = 'Stochastics FULL'\r\n static optionsOrder = ['period', 'dPeriod', 'kPeriod']\r\n\r\n static optionsLabels = { period: 'Period', kPeriod: 'K Period', dPeriod: 'D Period' } as { [key: string]: string }\r\n\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import Line from '../canvas/line'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, StofuConfig } from './configs/stofu'\r\nimport Indicator from './indicator'\r\n\r\nclass Stochastics extends Indicator {\r\n static config = StofuConfig\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 getLineColors() {\r\n return {\r\n k: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line,\r\n d: '#c80000',\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const lineColors = this.getLineColors()\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n { color: lineColors.k, text: this.getValueLabel(this.k[dataIndex]) },\r\n { color: lineColors.d, text: this.getValueLabel(this.d[dataIndex]) },\r\n ]\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 const lineColors = this.getLineColors()\r\n context.set('strokeStyle', lineColors.k)\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', lineColors.d)\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 options = {\r\n 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 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 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\r\n return {\r\n title: StofuConfig.label,\r\n inputs: StofuConfig.inputsOrder.map((item) => options[item as keyof Attrs]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n dPeriod: `${options.dPeriod.label} must be a whole number between ${options.dPeriod.min} and ${options.dPeriod.max}`,\r\n kPeriod: `${options.kPeriod.label} must be a whole number between ${options.kPeriod.min} and ${options.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\r\nexport default Stochastics\r\n","import Pane from '../models/pane'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, Options, StofaConfig } from './configs/stofa'\r\nimport Stochastics from './stofu'\r\n\r\nclass StochasticsFast extends Stochastics {\r\n static config = StofaConfig\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 options = {\r\n 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 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\r\n return {\r\n title: StofaConfig.label,\r\n inputs: StofaConfig.inputsOrder.map((item) => options[item as keyof Options]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n dPeriod: `${options.dPeriod.label} must be a whole number between ${options.dPeriod.min} and ${options.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\r\nexport default StochasticsFast\r\n","import { IndicatorType } from '../../constants/common'\r\nimport { StofaConfig } from './stofa'\r\n\r\nexport type Options = {\r\n period: string | number\r\n dPeriod: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n kPeriod: number\r\n}\r\n\r\nexport class StoslConfig extends StofaConfig {\r\n static type = IndicatorType.Stosl\r\n static abbreviation = 'stosl'\r\n static label = 'Stochastics SLOW'\r\n static shortLabel = 'Stochastics SLOW'\r\n}\r\n","import { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, Options, StoslConfig } from './configs/stosl'\r\nimport Stochastics from './stofu'\r\n\r\nclass StochasticsSlow extends Stochastics {\r\n static config = StoslConfig\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 options = {\r\n 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 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\r\n return {\r\n title: StoslConfig.label,\r\n inputs: StoslConfig.inputsOrder.map((item) => options[item as keyof Options]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n dPeriod: `${options.dPeriod.label} must be a whole number between ${options.dPeriod.min} and ${options.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\r\nexport default StochasticsSlow\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class TRIXConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Trix\r\n static abbreviation = 'trix'\r\n static label = 'TRIX'\r\n static shortLabel = 'TRIX'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n static calculatedValuesOrder = ['trix'] as const\r\n static calculatedValuesLabels = { trix: 'TRIX' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, TRIXConfig } from '../indicators/configs/trix'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n trix: number[]\r\n}\r\n\r\nexport class TrixCalculation extends MainCalculation {\r\n static config = TRIXConfig\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { close } = this.quote\r\n const { period } = this.options\r\n const trippleEmaPeriod = period * 3 - 2\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length <= trippleEmaPeriod) return\r\n\r\n const ema1 = new ExponentialMovingAverage(period)\r\n const ema2 = new ExponentialMovingAverage(period)\r\n const ema3 = new ExponentialMovingAverage(period)\r\n\r\n let prev = 0\r\n let ema1Count = 0\r\n let ema2Count = 0\r\n let ema3Count = 0\r\n for (let index = 0; index < close.length; index++) {\r\n ema1.add(close[index])\r\n ema1Count += 1\r\n\r\n if (ema1Count < period) continue\r\n ema2.add(ema1.value)\r\n ema2Count += 1\r\n\r\n if (ema2Count < period) continue\r\n ema3.add(ema2.value)\r\n ema3Count += 1\r\n\r\n if (ema3Count < period) continue\r\n\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 { TrixCalculation } from '../indicator-calculation/trix'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, TRIXConfig } from './configs/trix'\r\nimport Indicator from './indicator'\r\n\r\nclass Trix extends Indicator {\r\n static config = TRIXConfig\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 getValueLabelsAtIndex(index: number) {\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n {\r\n color: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line!,\r\n text: this.getValueLabel(this.trixCalculation?.calculatedValues.trix[dataIndex]),\r\n },\r\n ]\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n 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\r\n return {\r\n title: TRIXConfig.label,\r\n inputs: TRIXConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nexport default Trix\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period1: number\r\n period2: number\r\n period3: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period: string\r\n}\r\n\r\nexport class UltConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Ult\r\n static abbreviation = 'ult'\r\n static label = 'Ultimate Oscillator'\r\n static shortLabel = 'ULT'\r\n static optionsOrder = ['period1', 'period2', 'period3'] as const\r\n static optionsLabels = {\r\n period1: 'Period 1',\r\n period2: 'Period 2',\r\n period3: 'Period 3',\r\n }\r\n\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, UltConfig } from './configs/ult'\r\nimport Indicator from './indicator'\r\n\r\nclass UltimateOscillator extends Indicator {\r\n static config = UltConfig\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 getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.ult)\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 options = {\r\n 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 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 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\r\n return {\r\n title: UltConfig.label,\r\n inputs: UltConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period1: `${options.period1.label} must be a whole number between ${options.period1.min} and ${options.period1.max}`,\r\n period2: `${options.period2.label} must be a whole number between ${options.period2.min} and ${options.period2.max}`,\r\n period3: `${options.period3.label} must be a whole number between ${options.period3.min} and ${options.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\r\nexport default UltimateOscillator\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport class VolConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Vol\r\n static abbreviation = 'vol'\r\n static label = 'Volume'\r\n static shortLabel = 'Volume'\r\n}\r\n","import math from '../helpers/math'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { VolConfig } from './configs/vol'\r\nimport Indicator from './indicator'\r\n\r\nclass Volume extends Indicator {\r\n static config = VolConfig\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 getValueLabelsAtIndex(index: number) {\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n {\r\n color: this.data.close[dataIndex] < this.data.open[dataIndex] ? Colors.volumeTrendDown : Colors.volumeTrendUp,\r\n text: this.getValueLabel(this.data.volume[dataIndex]),\r\n },\r\n ]\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: VolConfig.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n}\r\n\r\nexport default Volume\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class WRConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Wr\r\n static abbreviation = 'wr'\r\n static label = 'Williams %R'\r\n static shortLabel = 'W%R'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { Attrs, WRConfig } from './configs/wr'\r\nimport Indicator from './indicator'\r\n\r\nclass WilliamsR extends Indicator {\r\n static config = WRConfig\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 getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.r)\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 options = {\r\n 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\r\n return {\r\n title: WRConfig.label,\r\n inputs: WRConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\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 shrtfl from './shrtfl'\r\nimport shrtra from './shrtra'\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 [IndicatorType.Shrtfl]: shrtfl,\r\n [IndicatorType.Shrtra]: shrtra,\r\n})\r\n\r\nexport const financialIndicators = Object.freeze([IndicatorType.Shrtfl, IndicatorType.Shrtra])\r\nexport const indicatorsWithoutPeriod = Object.freeze([IndicatorType.Obv, IndicatorType.Vol, ...financialIndicators])\r\n","export const publishModalAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"modals-publish\" */ './module-entry'),\r\n cacheKey: 'modals-publish',\r\n}\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","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 IndicatorBaseConfig from '../indicators/configs/indicatorBaseConfig'\r\nimport COT from '../indicators/cot'\r\nimport PricePerformance from '../indicators/perf'\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\nimport { getChartLayoutSettings } from './settings'\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 getQuoteFinancialAttachments() {\r\n return this.getAllElements()\r\n .filter((el) => el.isFinancialIndicator())\r\n .flatMap(\r\n (indicatorElement) =>\r\n ((indicatorElement.instance as unknown as any).config as typeof IndicatorBaseConfig).quoteFinancialAttachments\r\n )\r\n .filter((quoteFinancialAttachment, index, arr) => arr.indexOf(quoteFinancialAttachment) === index)\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","/*\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 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","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: tailwindColors.gray[600],\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: tailwindColors.gray[300],\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\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\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, ChartElementType, IndicatorType } from '../constants/common'\r\nimport { financialIndicators } from '../indicators/indicators'\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 getIsChartType(chartType: ChartElementType) {\r\n return this.instance?.type === chartType\r\n }\r\n\r\n isFinancialIndicator() {\r\n return this.isIndicator() && financialIndicators.includes(this.instance!.type as IndicatorType)\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 { getIsSSr } from '../utils/helpers'\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport Element from './element'\r\nimport { getChartLayoutSettings } from './settings'\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 let mainElement = this.mainElement()\r\n\r\n // @todo Fix - In SSR we don't have mainElement because it's not assigned to pane when it's created\r\n if (getIsSSr()) {\r\n mainElement = this.getChartOrIndicatorElement()\r\n }\r\n\r\n return !!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 { isSameDay, isSameMonth, isSameWeek } from 'date-fns'\r\nimport omit from 'lodash.omit'\r\nimport queryString from 'query-string'\r\n\r\nimport { Instrument, ObjectHash, RootChartConfigObject, TodoObjectHashAnyType } from '../../types/shared'\r\nimport {\r\n ChartEventDbType,\r\n ChartEventType,\r\n IntradayTimeframeInterval,\r\n QuoteFinancialAttachment,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport type { ICOT } from '../indicators/cot'\r\nimport { convertLocalToNyTime, 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 { FinancialAttachmentsData, ShortInterestData } from './quote/financialAttachmentsData'\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 financialAttachments?: string[]\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 Omit {\r\n ticker: string\r\n instrument: string\r\n timeframe: string\r\n financialAttachments?: 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 financialAttachmentsData?: FinancialAttachmentsData\r\n}\r\n\r\ninterface COTData {\r\n [code: string]: ICOT\r\n}\r\n\r\nconst getEmptyQuote = () => ({\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 financialAttachments: [],\r\n financialAttachmentsData: null,\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 // Either has no financialAttachments or require all of them to match\r\n ((options?.financialAttachments?.length ?? 0) === 0 ||\r\n options!.financialAttachments!.every((financialAttachment) =>\r\n quote.financialAttachments?.includes(financialAttachment as QuoteFinancialAttachment)\r\n ))\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 || !!quote.is404\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 canBeEmptyQuote?: 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 computableKeys = [\r\n 'isIntraday',\r\n 'interval',\r\n 'drawDays',\r\n 'barIndex',\r\n 'barToDataIndex',\r\n 'alignedFinancialAttachmentsData',\r\n 'timestampToFinancialsIndexesMap',\r\n ]\r\n\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 'financialAttachments',\r\n 'financialAttachmentsData',\r\n 'hasPatterns',\r\n 'patterns',\r\n 'patternsMinRange',\r\n 'patternsMaxRange',\r\n 'relativeVolume',\r\n 'fetchedAt',\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 ...Quote.computableKeys\r\n )\r\n }\r\n\r\n static getFromCacheSync({\r\n ticker: tickerRaw,\r\n instrument,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n canBeEmptyQuote,\r\n }: Omit): Quote | null {\r\n const ticker = tickerRaw.replace('@', '')\r\n return (\r\n Quote.select(\r\n (q) =>\r\n doesQuoteAndFetchParamsMatch({ quote: q, ticker, instrument, timeframe }) &&\r\n isSameOrNoChartUuid({ quote: q, uuid: chartUuid }) &&\r\n (canBeEmptyQuote || 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 )[0] ?? null\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 canBeEmptyQuote = false,\r\n chartUuid,\r\n }: QuoteGetParams): Promise {\r\n const ticker = tickerRaw.replace('@', '')\r\n const quote = shouldUseCache\r\n ? this.getFromCacheSync({ ticker: tickerRaw, instrument, timeframe, options, chartUuid, canBeEmptyQuote })\r\n : null\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 ...getEmptyQuote(),\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 financialAttachments: options?.financialAttachments ?? [],\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(\r\n tickersAndTimeframes: Array>\r\n ) {\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 const quotes = await Promise.all(tickersAndTimeframes.map((props) => this.get(props)))\r\n const data = quotes.reduce(\r\n (accumulator, quote) => ({\r\n ...accumulator,\r\n [quote.ticker]: quote,\r\n }),\r\n {}\r\n )\r\n return data\r\n } catch {\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 declare financialAttachments?: QuoteFinancialAttachment[]\r\n declare financialAttachmentsData?: FinancialAttachmentsData\r\n declare alignedFinancialAttachmentsData: {\r\n [QuoteFinancialAttachment.shortInterest]?: Array\r\n }\r\n\r\n declare timestampToFinancialsIndexesMap: {\r\n [QuoteFinancialAttachment.shortInterest]?: ObjectHash\r\n }\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 is404 = err instanceof NotFoundError\r\n if (getIsAbortError(err as Error)) {\r\n wasFetchAborted = true\r\n } else if (!is404 && process.env.IS_E2E_TESTING) {\r\n throw new Error('Quote fetch error', { cause: err })\r\n }\r\n // Ignore network/notfound errors\r\n }\r\n\r\n const shouldUseEmptyQuote = !data && !wasFetchAborted && options.type === QuoteFetchTypeUrlOption.New\r\n\r\n this.updateAttributes({\r\n ...(shouldUseEmptyQuote ? getEmptyQuote() : {}),\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 financialAttachmentsData: data.financialAttachmentsData,\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 // This has to be here to prevent recalculations if atts.fetchedAt is not provided\r\n const fetchedAt = atts.fetchedAt ?? this.fetchedAt ?? 0\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 this.alignAllFinancialAttachmentsDataWithQuoteDates()\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 alignAllFinancialAttachmentsDataWithQuoteDates() {\r\n this.alignedFinancialAttachmentsData = {}\r\n this.timestampToFinancialsIndexesMap = {}\r\n this.financialAttachments?.forEach((quoteFinancialAttachment) => {\r\n this.alignFinancialAttachmentsDataWithQuoteDates(quoteFinancialAttachment)\r\n })\r\n }\r\n\r\n alignFinancialAttachmentsDataWithQuoteDates(quoteFinancialAttachment: QuoteFinancialAttachment) {\r\n const timestampToFinancialsIndexesMap: ObjectHash = {}\r\n const financialAttachmentsData = this.financialAttachmentsData?.[quoteFinancialAttachment]\r\n\r\n if (financialAttachmentsData) {\r\n let lastDateIndex = 0\r\n const firstDate = this.date[0]\r\n this.alignedFinancialAttachmentsData[quoteFinancialAttachment] = financialAttachmentsData.map((data, index) => {\r\n let matchingQuoteTimestamp: number | null = null\r\n\r\n const parsedDate = dateFromUnixTimestamp(data.timestamp)\r\n const convertedDateToNyTimestamp = convertLocalToNyTime(parsedDate, false).getTime() / 1000\r\n\r\n if (firstDate < convertedDateToNyTimestamp) {\r\n for (let dateIndex = lastDateIndex; dateIndex < this.date.length; dateIndex += 1) {\r\n const timestamp = this.date[dateIndex]\r\n const dateDate = dateFromUnixTimestamp(timestamp)\r\n if (this.isIntraday || this.timeframe === TIMEFRAME.d) {\r\n if (isSameDay(parsedDate, dateDate)) {\r\n lastDateIndex = dateIndex\r\n matchingQuoteTimestamp = timestamp\r\n break\r\n }\r\n } else if (this.timeframe === TIMEFRAME.w) {\r\n if (isSameWeek(parsedDate, dateDate, { weekStartsOn: 1 })) {\r\n lastDateIndex = dateIndex\r\n matchingQuoteTimestamp = timestamp\r\n break\r\n }\r\n } else if (this.timeframe === TIMEFRAME.m) {\r\n if (isSameMonth(parsedDate, dateDate)) {\r\n lastDateIndex = dateIndex\r\n matchingQuoteTimestamp = timestamp\r\n break\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (matchingQuoteTimestamp !== null) {\r\n const key = matchingQuoteTimestamp.toString()\r\n timestampToFinancialsIndexesMap[key] ??= []\r\n timestampToFinancialsIndexesMap[key].push(index)\r\n }\r\n\r\n return { ...data, matchingQuoteTimestamp }\r\n })\r\n\r\n this.timestampToFinancialsIndexesMap = {\r\n [quoteFinancialAttachment]: timestampToFinancialsIndexesMap,\r\n }\r\n }\r\n }\r\n\r\n clearCachedData() {\r\n deleteCachedQuote({ cid: this.cid })\r\n }\r\n\r\n destroy(options?: ObjectHash) {\r\n super.destroy(options)\r\n this.clearCachedData()\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 financialAttachments: this.financialAttachments?.join(','),\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(getEmptyQuote())\r\n }\r\n\r\n toConfig = RootChartConfigObject>(omitKeys = [] as string[]): T {\r\n return JSON.parse(JSON.stringify(omit(this.toJSON(), [...Quote.computableKeys, ...omitKeys])))\r\n }\r\n}\r\n\r\nQuote.initClass()\r\n\r\nexport default Quote\r\n","import { QuoteFinancialAttachment } from '../../constants/common'\r\n\r\nexport 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 financialAttachments?: QuoteFinancialAttachment[]\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 BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n color: string\r\n}\r\n\r\nexport class EMAConfig extends BaseConfig {\r\n static type = OverlayType.Ema\r\n static abbreviation = 'ema'\r\n static label = 'Exponential Moving Average'\r\n static shortLabel = 'EMA'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = ['period', 'color'] as Array\r\n static inputsLabels = { period: 'Period', color: 'Color' }\r\n static calculatedValuesOrder = ['ema'] as const\r\n static calculatedValuesLabels = { ema: 'EMA' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { ObjectHash } from '../../../types/shared'\r\nimport ElementBaseConfig from '../../canvas/ElementBaseConfig'\r\nimport { OverlayType } from '../../constants/common'\r\n\r\nexport default class OverlayBaseConfig extends ElementBaseConfig {\r\n static type = OverlayType.Overlay\r\n static abbreviation = 'ovl'\r\n static label = 'Overlay'\r\n static shortLabel = 'Overlay'\r\n static optionsOrder = [] as readonly string[]\r\n static optionsLabels = {}\r\n static inputsOrder = [] as readonly string[]\r\n static inputsLabels = {}\r\n static calculatedValuesOrder = [] as readonly string[]\r\n static calculatedValuesLabels = {}\r\n static defaultCalculatedValueOption = undefined as undefined | string\r\n\r\n get defaultCalculatedValueOption() {\r\n return (this.constructor as typeof OverlayBaseConfig).defaultCalculatedValueOption\r\n }\r\n\r\n static getShortLabelWithAttrs(attrs: ObjectHash) {\r\n return `${this.shortLabel} ${this.optionsOrder.map((item) => attrs[item]).join(',')}`\r\n }\r\n\r\n get getShortLabelWithAttrs() {\r\n return (this.constructor as typeof OverlayBaseConfig).getShortLabelWithAttrs\r\n }\r\n\r\n static getDefaultCalculatedValues() {\r\n return this.calculatedValuesOrder.reduce((prev, curr) => ({ ...prev, [curr]: [] }), {})\r\n }\r\n\r\n get getDefaultCalculatedValues() {\r\n return (this.constructor as typeof OverlayBaseConfig).getDefaultCalculatedValues\r\n }\r\n}\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n deviations: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n topColor?: string\r\n bottomColor?: string\r\n}\r\n\r\nexport class BBConfig extends BaseConfig {\r\n static type = OverlayType.Bb\r\n static abbreviation = 'bb'\r\n static label = 'Bollinger Bands'\r\n static shortLabel = 'BB'\r\n static optionsOrder = ['period', 'deviations'] as const\r\n static optionsLabels = { period: 'Period', deviations: 'Deviations' }\r\n static inputsOrder = ['period', 'deviations', 'topColor', 'bottomColor'] as Array\r\n static inputsLabels = {\r\n period: 'Period',\r\n deviations: 'Deviations',\r\n topColor: 'Top Color',\r\n bottomColor: 'Bottom Color',\r\n }\r\n\r\n static calculatedValuesOrder = ['upperBand', 'sma', 'lowerBand'] as const\r\n static calculatedValuesLabels = {\r\n sma: 'SMA',\r\n upperBand: 'Upper Band',\r\n lowerBand: 'Lower Band',\r\n }\r\n\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[1]\r\n}\r\n","import { BBConfig, Options } from '../overlays/configs/bb'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n upperBand: number[]\r\n lowerBand: number[]\r\n}\r\n\r\nexport class BbCalculation extends MainCalculation {\r\n static config = BBConfig\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 if (close.length < period) return\r\n\r\n let sum = 0\r\n const stdDev = []\r\n\r\n for (let i = 0; i < period; i++) {\r\n sum += close[i]\r\n }\r\n const initialPeriodIndex = period - 1\r\n for (let i = initialPeriodIndex; i < close.length; i++) {\r\n if (i > initialPeriodIndex) 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 stdDev[i] = Math.sqrt(stdDevSum / period)\r\n\r\n this.calculatedValues.upperBand[i] = this.calculatedValues.sma[i] + stdDev[i] * deviations\r\n this.calculatedValues.lowerBand[i] = this.calculatedValues.sma[i] - 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\nimport OverlayConfig from './configs/overlayBaseConfig'\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 config = OverlayConfig\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).config.type as OverlayType\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Overlay).config.label\r\n }\r\n\r\n get config() {\r\n return (this.constructor as typeof Overlay).config\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 toString() {\r\n return this.config.getShortLabelWithAttrs(this.attrs)\r\n }\r\n}\r\n\r\nexport default Overlay\r\n","import { ChartConfigChartPaneElement, RequireByKey, Theme } from '../../types/shared'\r\nimport { BbCalculation } from '../indicator-calculation/bb'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, BBConfig } from './configs/bb'\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\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 config = BBConfig\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 options = {\r\n period: {\r\n type: 'number',\r\n label: BBConfig.inputsLabels.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 deviations: {\r\n type: 'number',\r\n label: BBConfig.inputsLabels.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 topColor: {\r\n type: 'color',\r\n label: BBConfig.inputsLabels.topColor,\r\n name: 'topColor',\r\n value: this.attrs.topColor ?? this.getFreeColor(),\r\n },\r\n bottomColor: {\r\n type: 'color',\r\n label: BBConfig.inputsLabels.bottomColor,\r\n name: 'bottomColor',\r\n value: this.attrs.bottomColor ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: BBConfig.label,\r\n inputs: BBConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n deviations: `${options.deviations.label} must be a number between ${options.deviations.min} and ${options.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\r\nBollingerBands.prototype.defaults = { topColor: '#69c1ea', bottomColor: '#d386df' }\r\n\r\nexport default BollingerBands\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n channelStrokeColor: string\r\n channelFillColor: string\r\n medianBandColor: string\r\n}\r\n\r\nexport class DchConfig extends BaseConfig {\r\n static type = OverlayType.Dch\r\n static abbreviation = 'dch'\r\n static label = 'Donchian Channels'\r\n static shortLabel = 'Donchian'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = ['period', 'channelStrokeColor', 'channelFillColor', 'medianBandColor'] as Array\r\n static inputsLabels = {\r\n period: 'Period',\r\n channelStrokeColor: 'Channels Stroke Color',\r\n channelFillColor: 'Channels Fill Color',\r\n medianBandColor: 'Median Band Color',\r\n }\r\n}\r\n","import utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, DchConfig } from './configs/dch'\r\nimport Overlay from './overlay'\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 config = DchConfig\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 options = {\r\n 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 channelStrokeColor: {\r\n type: 'color',\r\n label: 'Channels Stroke Color',\r\n name: 'channelStrokeColor',\r\n value: this.attrs.channelStrokeColor ?? this.getFreeColor(),\r\n },\r\n channelFillColor: {\r\n type: 'color',\r\n label: 'Channels Fill Color',\r\n name: 'channelFillColor',\r\n value: this.attrs.channelFillColor ?? this.getFreeColor(),\r\n },\r\n 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\r\n return {\r\n title: DchConfig.label,\r\n inputs: DchConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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 'channelStrokeColor':\r\n case 'channelFillColor':\r\n case 'medianBandColor':\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\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 { EMACalculation } from '../indicator-calculation/ema'\r\nimport { Attrs, EMAConfig } from './configs/ema'\r\nimport Overlay from './overlay'\r\n\r\nclass EMA extends Overlay {\r\n static config = EMAConfig\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 options = {\r\n 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 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\r\n return {\r\n title: this.config.label,\r\n inputs: this.config.inputsOrder.map((item) => options[item as keyof Attrs]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nEMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default EMA\r\n","import { OverlayType } from '../../constants/common'\r\nimport { EMAConfig } from './ema'\r\n\r\nexport class EMA2Config extends EMAConfig {\r\n static type = OverlayType.Ema2\r\n}\r\n","import { EMA2Config } from './configs/ema2'\r\nimport EMA from './ema'\r\n\r\nclass EMA2 extends EMA {\r\n static config = EMA2Config\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 BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n lowColor: string\r\n highColor: string\r\n}\r\n\r\nexport class HILOConfig extends BaseConfig {\r\n static type = OverlayType.Hilo\r\n static abbreviation = 'hilo'\r\n static label = 'High/Low'\r\n static shortLabel = 'HILO'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = ['period', 'highColor', 'lowColor'] as Array\r\n static inputsLabels = {\r\n period: 'Period',\r\n highColor: 'High Color',\r\n lowColor: 'Low Color',\r\n }\r\n}\r\n","import PaneModel from '../models/pane'\r\nimport { getBarWidthWithMargin } from '../utils/chart'\r\nimport { Attrs, HILOConfig } from './configs/hilo'\r\nimport Overlay from './overlay'\r\n\r\nclass HighLow extends Overlay {\r\n static config = HILOConfig\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 options = {\r\n 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 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 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\r\n return {\r\n title: HILOConfig.label,\r\n inputs: HILOConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\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 BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n price: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period: number\r\n color: string\r\n}\r\n\r\nexport class HLineConfig extends BaseConfig {\r\n static type = OverlayType.Hline\r\n static abbreviation = 'hline'\r\n static label = 'Horizontal Line'\r\n static shortLabel = 'HL'\r\n static optionsOrder = ['price'] as const\r\n static optionsLabels = { price: 'Price' }\r\n static inputsOrder = ['price', 'color'] as Array>\r\n static inputsLabels = {\r\n price: 'Price',\r\n color: 'Color',\r\n }\r\n}\r\n","import { isPositiveFloat } from '../utils/helpers'\r\nimport { Attrs, HLineConfig } from './configs/hline'\r\nimport Overlay from './overlay'\r\n\r\nclass HorizontalLine extends Overlay {\r\n static config = HLineConfig\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 options = {\r\n 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 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\r\n return {\r\n title: HLineConfig.label,\r\n inputs: HLineConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n price: `${options.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\r\nHorizontalLine.prototype.defaults = { color: '#0587cd' }\r\n\r\nexport default HorizontalLine\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n conversion: number\r\n base: number\r\n spanB: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period?: string\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\nexport class ICConfig extends BaseConfig {\r\n static type = OverlayType.Ic\r\n static abbreviation = 'ic'\r\n static label = 'Ichimoku Cloud'\r\n static shortLabel = 'Ichimoku'\r\n static optionsOrder = ['conversion', 'base', 'spanB'] as const\r\n\r\n static optionsLabels = {\r\n conversion: 'Conversion Line',\r\n base: 'Base Line Length',\r\n spanB: 'Leading Span B Length',\r\n }\r\n\r\n static inputsOrder = [\r\n ...this.optionsOrder,\r\n 'spanAStrokeColor',\r\n 'spanAFillColor',\r\n 'spanBStrokeColor',\r\n 'spanBFillColor',\r\n 'conversionLineColor',\r\n 'baseLineColor',\r\n 'laggingSpanColor',\r\n ] as Array>\r\n\r\n static inputsLabels = {\r\n ...this.optionsLabels,\r\n spanAStrokeColor: 'Span A Stroke Color',\r\n spanAFillColor: 'Span A Fill Color',\r\n spanBStrokeColor: 'Span B Stroke Color',\r\n spanBFillColor: 'Span B Fill Color',\r\n conversionLineColor: 'Conversion Line Color',\r\n baseLineColor: 'Base Line Color',\r\n laggingSpanColor: 'Lagging Span Color',\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, ICConfig } from './configs/ic'\r\nimport Overlay from './overlay'\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 config = ICConfig\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 options = {\r\n 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 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 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 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 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 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 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 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 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 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\r\n return {\r\n title: this.config.label,\r\n inputs: this.config.inputsOrder.map((item) => options[item as keyof Omit]),\r\n inputsErrorMessages: {\r\n conversion: `${options.conversion.label} must be a whole number between ${options.conversion.min} and ${options.conversion.max}`,\r\n base: `${options.base.label} must be a whole number between ${options.base.min} and ${options.base.max}`,\r\n spanB: `${options.spanB.label} must be a whole number between ${options.spanB.min} and ${options.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\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 { ICConfig } from './ic'\r\n\r\nexport class ICFConfig extends ICConfig {\r\n static type = OverlayType.Icf\r\n static abbreviation = 'icf'\r\n static label = 'Ichimoku Cloud (Full)'\r\n static shortLabel = 'Ichimoku Full'\r\n}\r\n","import { ICFConfig } from './configs/icf'\r\nimport IchimokuCloud from './ic'\r\n\r\nclass IchimokuCloudFull extends IchimokuCloud {\r\n static config = ICFConfig\r\n static renderFull = true\r\n}\r\n\r\nexport default IchimokuCloudFull\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n emaPeriod: number\r\n multiplier: number\r\n atrPeriod: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period?: string\r\n strokeColor: string\r\n fillColor: string\r\n}\r\n\r\nexport class KCHConfig extends BaseConfig {\r\n static type = OverlayType.Kch\r\n static abbreviation = 'kch'\r\n static label = 'Keltner Channel'\r\n static shortLabel = 'Keltner Channel'\r\n static optionsOrder = ['emaPeriod', 'multiplier', 'atrPeriod'] as const\r\n\r\n static optionsLabels = {\r\n emaPeriod: 'EMA Period',\r\n multiplier: 'Multiplier',\r\n atrPeriod: 'ATR Period',\r\n }\r\n\r\n static inputsOrder = [...this.optionsOrder, 'strokeColor', 'fillColor'] as Array>\r\n\r\n static inputsLabels = {\r\n ...this.optionsLabels,\r\n strokeColor: 'Stroke Color',\r\n fillColor: 'Fill Color',\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { ExponentialMovingAverage } from '../indicator-calculation/ema'\r\nimport { Attrs, KCHConfig } from './configs/kch'\r\nimport Overlay from './overlay'\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 config = KCHConfig\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 options = {\r\n 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 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 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 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 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\r\n return {\r\n title: KCHConfig.label,\r\n inputs: KCHConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n emaPeriod: `${options.emaPeriod.label} must be a whole number between ${options.emaPeriod.min} and ${options.emaPeriod.max}`,\r\n multiplier: `${options.multiplier.label} must be a number between ${options.multiplier.min} and ${options.multiplier.max}`,\r\n atrPeriod: `${options.atrPeriod.label} must be a whole number between ${options.atrPeriod.min} and ${options.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\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 BaseConfig from './overlayBaseConfig'\r\n\r\nexport class NoneConfig extends BaseConfig {\r\n static type = OverlayType.None\r\n static abbreviation = 'none'\r\n static label = 'None'\r\n static shortLabel = 'None'\r\n}\r\n","import { NoneConfig } from './configs/none'\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 config = NoneConfig\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 { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\ninterface Attrs {\r\n supportColor: string\r\n resistColor: string\r\n}\r\n\r\nexport class PatternsConfig extends BaseConfig {\r\n static type = OverlayType.Patterns\r\n static abbreviation = 'patterns'\r\n static label = 'Patterns (daily charts)'\r\n static shortLabel = ''\r\n static inputsOrder = ['supportColor', 'resistColor'] as Array\r\n static inputsLabels = { supportColor: 'Support Color', resistColor: 'Resist Color' }\r\n}\r\n","import Text from '../canvas/text'\r\nimport { TextAlign, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport { PatternsConfig } from './configs/patterns'\r\nimport Overlay from './overlay'\r\n\r\ntype aboveBelowType = 'above' | 'below'\r\n\r\nclass Patterns extends Overlay {\r\n static config = PatternsConfig\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 options = {\r\n 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 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\r\n return {\r\n title: PatternsConfig.label,\r\n inputs: PatternsConfig.inputsOrder.map((item) => options[item]),\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\r\nPatterns.prototype.defaults = { supportColor: '#69c1ea', resistColor: '#d386df' }\r\n\r\nexport default Patterns\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport enum Calculation {\r\n standard = 'Standard',\r\n fibonacci = 'Fibonacci',\r\n}\r\nexport type CalculationType = keyof typeof Calculation\r\n\r\nexport type Options = {\r\n calculationType: CalculationType\r\n}\r\nexport interface Attrs extends Options {\r\n period?: string\r\n color: string\r\n}\r\n\r\nexport class PPConfig extends BaseConfig {\r\n static type = OverlayType.Pp\r\n static abbreviation = 'pp'\r\n static label = 'Pivot Points'\r\n static shortLabel = 'Pivot Points'\r\n static optionsOrder = ['calculationType'] as const\r\n static optionsLabels = { calculationType: 'Calculation Type' }\r\n static inputsOrder = ['calculationType', 'color'] as Array>\r\n static inputsLabels = { calculationType: 'Calculation Type', color: 'Color' }\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { Instrument } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { 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 { Attrs, Calculation, CalculationType, PPConfig } from './configs/pp'\r\nimport Overlay from './overlay'\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\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 config = PPConfig\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 options = {\r\n 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 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\r\n return {\r\n title: PPConfig.label,\r\n inputs: PPConfig.inputsOrder.map((item) => options[item]),\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 `${PPConfig.shortLabel} (${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 BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n step: number\r\n maxStep: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period: string\r\n risingColor: string\r\n fallingColor: string\r\n}\r\n\r\nexport class SARConfig extends BaseConfig {\r\n static type = OverlayType.Sar\r\n static abbreviation = 'sar'\r\n static label = 'Parabolic SAR'\r\n static shortLabel = 'SAR'\r\n static optionsOrder = ['step', 'maxStep'] as const\r\n static optionsLabels = {\r\n step: 'Step',\r\n maxStep: 'Maximum Step',\r\n }\r\n\r\n static inputsOrder = [...this.optionsOrder, 'risingColor', 'fallingColor'] as Array>\r\n static inputsLabels = { ...this.optionsLabels, risingColor: 'Rising Color', fallingColor: 'Falling Color' }\r\n}\r\n","import { Attrs, SARConfig } from './configs/sar'\r\nimport Overlay from './overlay'\r\n\r\nclass SAR extends Overlay {\r\n static config = SARConfig\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 options = {\r\n 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 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 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 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\r\n return {\r\n title: SARConfig.label,\r\n inputs: SARConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n step: `${options.step.label} must be a number between ${options.step.min} and ${options.step.max}`,\r\n maxStep: `${options.maxStep.label} must be a number between ${options.maxStep.min} and ${options.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\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 BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = { period: number }\r\n\r\nexport interface Attrs extends Options {\r\n color: string\r\n}\r\n\r\nexport class SMAConfig extends BaseConfig {\r\n static type = OverlayType.Sma\r\n static abbreviation = 'sma'\r\n static label = 'Simple Moving Average'\r\n static shortLabel = 'SMA'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = ['period', 'color'] as Array\r\n static inputsLabels = { period: 'Period', color: 'Color' }\r\n static calculatedValuesOrder = ['sma'] as const\r\n static calculatedValuesLabels = { sma: 'SMA' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Options, SMAConfig } from '../overlays/configs/sma'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n}\r\n\r\nexport class SMACalculation extends MainCalculation {\r\n static config = SMAConfig\r\n declare options: Options\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length < period) return\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\r\n for (let i = period - 1; i < close.length; i++) {\r\n if (i >= period) sum = sum - close[i - period] + close[i]\r\n this.calculatedValues.sma[i] = sum / 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 { SMACalculation } from '../indicator-calculation/sma'\r\nimport { Attrs, SMAConfig } from './configs/sma'\r\nimport Overlay from './overlay'\r\n\r\nclass SMA extends Overlay {\r\n static config = SMAConfig\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 options = {\r\n 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 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\r\n return {\r\n title: this.config.label,\r\n inputs: this.config.inputsOrder.map((item) => options[item as keyof Attrs]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.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\r\nSMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default SMA\r\n","import { OverlayType } from '../../constants/common'\r\nimport { SMAConfig } from './sma'\r\n\r\nexport class SMA2Config extends SMAConfig {\r\n static type = OverlayType.Sma2\r\n}\r\n","import { SMA2Config } from './configs/sma2'\r\nimport SMA from './sma'\r\n\r\nclass SMA2 extends SMA {\r\n static config = SMA2Config\r\n}\r\n\r\nSMA2.prototype.defaults = { color: '#ff6400' }\r\n\r\nexport default SMA2\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n multiplier: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n uptrendColor: string\r\n downtrendColor: string\r\n}\r\n\r\nexport class StrConfig extends BaseConfig {\r\n static type = OverlayType.Str\r\n static abbreviation = 'str'\r\n static label = 'Supertrend'\r\n static shortLabel = 'Supertrend'\r\n static optionsOrder = ['period', 'multiplier'] as const\r\n static optionsLabels = { period: 'Period', multiplier: 'Period' }\r\n static inputsOrder = [...this.optionsOrder, 'uptrendColor', 'downtrendColor'] as Array\r\n static inputsLabels = {\r\n ...this.optionsLabels,\r\n uptrendColor: 'Uptrend Color',\r\n downtrendColor: 'Downtrend Color',\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { Attrs, StrConfig } from './configs/str'\r\nimport Overlay from './overlay'\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 config = StrConfig\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 options = {\r\n 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 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 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 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\r\n return {\r\n title: StrConfig.label,\r\n inputs: StrConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n multiplier: `${options.multiplier.label} must be a number between ${options.multiplier.min} and ${options.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\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 { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number | string\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n opacity: number\r\n upColor?: string\r\n downColor?: string\r\n}\r\n\r\nexport class VPConfig extends BaseConfig {\r\n static type = OverlayType.Vp\r\n static abbreviation = 'vp'\r\n static label = 'Volume Profile'\r\n static shortLabel = 'VP'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = ['period', 'opacity', 'upColor', 'downColor'] as Array\r\n\r\n static inputsLabels = {\r\n period: 'Zones',\r\n opacity: 'Opacity',\r\n upColor: 'Up Color',\r\n downColor: 'Down Color',\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\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 { Attrs, VPConfig } from './configs/vp'\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\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 config = VPConfig\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 options = {\r\n 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 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 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 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\r\n return {\r\n title: VPConfig.label,\r\n inputs: VPConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n opacity: `${options.opacity.label} must be a number between ${options.opacity.min} and ${options.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\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 BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = { period: number }\r\n\r\nexport interface Attrs extends Options {\r\n color: string\r\n}\r\n\r\nexport class VWAPConfig extends BaseConfig {\r\n static type = OverlayType.Vwap\r\n static abbreviation = 'vwap'\r\n static label = 'VWAP (intraday charts)'\r\n static shortLabel = 'VWAP'\r\n static inputsOrder = ['color'] as Array>\r\n static inputsLabels = { color: 'Color' }\r\n static calculatedValuesOrder = ['vwap'] as const\r\n static calculatedValuesLabels = { vwap: 'VWAP' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Options, VWAPConfig } from '../overlays/configs/vwap'\r\nimport { dateFromUnixTimestamp } from '../utils'\r\nimport { MainCalculation, OnValueCalculated } from './main'\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 config = VWAPConfig\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 { VWapCalculation } from '../indicator-calculation/vwap'\r\nimport PaneModel from '../models/pane'\r\nimport { Attrs, VWAPConfig } from './configs/vwap'\r\nimport Overlay from './overlay'\r\n\r\nclass VWAP extends Overlay {\r\n static config = VWAPConfig\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 options = {\r\n 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\r\n return {\r\n title: VWAPConfig.label,\r\n inputs: VWAPConfig.inputsOrder.map((item) => options[item]),\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 VWAPConfig.shortLabel\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 {}\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 {}\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 const isQuotePage = obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isQuoteFinancials = obj.specificChartFunctionality === SpecificChartFunctionality.quoteFinancials\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 isQuotePage ||\r\n isQuoteFinancials\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, getEarningsDateSuffix } from './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 formattedDate = formatDateToStringUS(parsedDate, options)\r\n\r\n if (hasEarningsDateSuffix) {\r\n return `${formattedDate} ${getEarningsDateSuffix(parsedDate)}`\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 { Instrument } from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport {\r\n CanvasElementType,\r\n ChartElementType,\r\n ChartEventType,\r\n IndicatorType,\r\n IntradayTimeframeInterval,\r\n MONTHS,\r\n OFFSET,\r\n OverlayType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport { getIsSmallIndexChart, getTranslate } from '../controllers/renderUtils'\r\nimport { ISettings } from '../models/chart_settings/interfaces'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils, { dateFromDateString } from '../utils'\r\nimport { getBarWidthWithMargin, getHalfBarWidth } from './chart'\r\nimport { getVisibleBarToRenderIndex } from './draw_in_visible_area'\r\n\r\ninterface RenderXAxisProps {\r\n context: CanvasRenderingContext2D\r\n textRenderer?: Text\r\n paneModel: Pane\r\n quote: Quote\r\n type: CanvasElementType | OverlayType | ChartElementType | IndicatorType | ChartEventType\r\n}\r\n\r\ninterface RenderTimeframeXAxisProps extends Omit {\r\n startBarIndex: number\r\n endBarIndex: number\r\n fx: (x: number) => number\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\nfunction getXLine({ paneModel, height }: { paneModel: Pane; height: number }): Line {\r\n const chartLayoutSettings = paneModel.getChartLayoutSettings()\r\n return new Line(\r\n {\r\n y1: 0,\r\n y2: height,\r\n strokeStyle: chartLayoutSettings.ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n paneModel\r\n )\r\n}\r\n\r\nfunction isXPointVisible({ buffer = 0, x, width }: { x: number; buffer?: number; width: number }) {\r\n return x >= 0 - buffer && x <= width + buffer\r\n}\r\n\r\nfunction 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 return 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\n\r\nfunction renderXAxisLabels({\r\n context,\r\n width,\r\n labels,\r\n textRenderer,\r\n allowedOverflow = 0,\r\n}: {\r\n context: CanvasRenderingContext2D\r\n width: number\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(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 (!isXPointVisible({ x, width, buffer: allowedOverflow })) {\r\n return\r\n }\r\n const halfOfTextWidth = textWidth / 2\r\n const overflowLeft = x - halfOfTextWidth + allowedOverflow\r\n const overflowRight = 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(context)\r\n })\r\n}\r\n\r\nfunction getSize(paneModel: Pane) {\r\n const isIndicator = paneModel.getIsIndicatorPane()\r\n const { IndicatorSettings, ChartSettings, MarketSentimentSettings } = paneModel.getChartLayoutSettings()\r\n let settings: ISettings['IndicatorSettings' | 'ChartSettings' | 'MarketSentimentSettings'] = ChartSettings\r\n\r\n if (isIndicator) {\r\n settings = IndicatorSettings\r\n } else if (paneModel.mainElement()?.getIsChartType(ChartElementType.MarketSentiment)) {\r\n settings = MarketSentimentSettings\r\n }\r\n\r\n const paddingX = settings.left.width + settings.right.width\r\n const paddingY = settings.top.height + settings.bottom.height\r\n\r\n const chartWidth = paneModel.chart().width\r\n const paneHeight = paneModel.height\r\n return { width: chartWidth ? chartWidth - paddingX : 0, height: paneHeight ? paneHeight - paddingY : 0 }\r\n}\r\n\r\nfunction renderDailyXAxis({\r\n context,\r\n quote,\r\n paneModel,\r\n textRenderer,\r\n startBarIndex,\r\n endBarIndex,\r\n fx,\r\n}: RenderTimeframeXAxisProps) {\r\n const { width, height } = getSize(paneModel)\r\n\r\n const chartModel = paneModel.chart()\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = getXLine({ paneModel, height })\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(quote.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(fx(i) + chartModel.leftOffset)\r\n if (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(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 if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer })\r\n }\r\n}\r\n\r\nfunction render15MinXAxis({\r\n context,\r\n quote,\r\n paneModel,\r\n textRenderer,\r\n startBarIndex,\r\n endBarIndex,\r\n fx,\r\n}: RenderTimeframeXAxisProps) {\r\n const { width, height } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n const chartLayout = chartModel.chart_layout()\r\n let lastDay = ''\r\n let x = 0\r\n\r\n const labels = []\r\n const xLine = getXLine({ paneModel, height })\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(quote.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n if (day !== lastDay) {\r\n lastDay = day\r\n if (quote.instrument === Instrument.Stock) {\r\n const barAtMinute = date.getMinutes() + date.getHours() * 60\r\n const indexOffset = (barAtMinute - quote.marketStartMinutes) / quote.interval\r\n x = Math.round(paneModel.scale.x(quote.barIndex[i] - indexOffset) + chartModel.leftOffset)\r\n } else {\r\n x = Math.round(fx(i) + chartModel.leftOffset)\r\n }\r\n if (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(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 (chartLayout.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n const lastDate = `${MONTHS[(~~(quote.lastDate / 100) % 100) - 1]} ${(quote.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 = quote.getBarsInDay()!\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: chartModel.zoomFactor,\r\n chartLayout,\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(context)\r\n }\r\n }\r\n\r\n if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer })\r\n }\r\n}\r\n\r\nconst SMALL_INDEX_CHART_LABEL_BUFFER = 15\r\n\r\nfunction renderIntradayXAxis({ context, quote, paneModel, textRenderer }: Omit) {\r\n const { width, height } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n const chartLayout = chartModel.chart_layout()\r\n const interval = IntradayTimeframeInterval[quote.timeframe as keyof typeof IntradayTimeframeInterval]\r\n const marketStartHour = ~~(quote.marketStartMinutes / 60)\r\n let marketEndHour = 15 + Math.ceil(quote.aftermarketLengthMinutes / 60)\r\n const labels = []\r\n const isSmallIndexChart = getIsSmallIndexChart(chartLayout.specificChartFunctionality)\r\n if (isSmallIndexChart) {\r\n marketEndHour = 16\r\n }\r\n\r\n const xLine = getXLine({ paneModel, height })\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: chartModel.zoomFactor,\r\n chartLayout,\r\n })\r\n\r\n const dayToOffset = quote.getDayToOffset()\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 - quote.marketStartMinutes) / interval) * barWidth +\r\n dayIndex * (quote.drawMinutesPerDay / interval) * barWidth +\r\n chartModel.leftOffset\r\n if (!isXPointVisible({ x, width, buffer: 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(context)\r\n continue\r\n }\r\n if (quote.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(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(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\r\n if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer, allowedOverflow })\r\n }\r\n}\r\n\r\nfunction renderIntradayXAxisFutures({\r\n context,\r\n quote,\r\n paneModel,\r\n textRenderer,\r\n startBarIndex,\r\n endBarIndex,\r\n fx,\r\n}: RenderTimeframeXAxisProps) {\r\n const { width, height } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n let lastDay = ''\r\n let lastHours = NaN\r\n\r\n const labels = []\r\n const xLine = getXLine({ paneModel, height })\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(quote.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n const hours = date.getHours()\r\n const x = Math.round(fx(i) + chartModel.leftOffset)\r\n\r\n if (day !== lastDay) {\r\n lastDay = day\r\n lastHours = hours\r\n if (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(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 (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n labels.push({ x, text: ((hours + 11) % 12) + 1 + (hours < 12 ? 'AM' : 'PM') })\r\n }\r\n }\r\n\r\n if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer })\r\n }\r\n}\r\n\r\nfunction renderWeeklyXAxis({\r\n context,\r\n quote,\r\n paneModel,\r\n textRenderer,\r\n startBarIndex,\r\n endBarIndex,\r\n fx,\r\n}: RenderTimeframeXAxisProps) {\r\n const { width, height } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = getXLine({ paneModel, height })\r\n const { Colors } = paneModel.getChartLayoutSettings().ChartSettings.general\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(quote.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(fx(i) + chartModel.leftOffset)\r\n if (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n if (date.getMonth() % 3 === 0) {\r\n xLine.set({ x1: x, x2: x }).render(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: height,\r\n strokeStyle: Colors.gridSecondary,\r\n dashLength: 3,\r\n },\r\n paneModel\r\n ).render(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\r\n if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer })\r\n }\r\n}\r\n\r\nfunction renderMonthlyXAxis({\r\n context,\r\n quote,\r\n paneModel,\r\n textRenderer,\r\n startBarIndex,\r\n endBarIndex,\r\n fx,\r\n}: RenderTimeframeXAxisProps) {\r\n const { width, height } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n let lastYear = null\r\n\r\n const labels = []\r\n const xLine = getXLine({ paneModel, height })\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(quote.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(fx(i) + chartModel.leftOffset)\r\n if (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n labels.push({\r\n text: date.getFullYear().toString(),\r\n x,\r\n })\r\n }\r\n }\r\n\r\n if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer })\r\n }\r\n}\r\n\r\nexport function renderXAxis({ context, quote, paneModel, textRenderer, type: elementType }: RenderXAxisProps) {\r\n const fx = (x: number) => paneModel.scale.x(quote.barIndex[x])\r\n const { width } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n const chartLayout = chartModel.chart_layout()\r\n const leftOffset = chartModel.leftOffset\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,\r\n 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,\r\n paneModel,\r\n leftOffset,\r\n chartWidth: width,\r\n }).index + 1,\r\n quote.close.length - 1\r\n )\r\n\r\n const renderTimeframeXAxisProps = { context, quote, paneModel, textRenderer, startBarIndex, endBarIndex, fx }\r\n\r\n switch (quote.timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n if (quote.instrument === Instrument.Stock) {\r\n if (\r\n elementType === ChartElementType.LineChart &&\r\n chartLayout.specificChartFunctionality === SpecificChartFunctionality.offScreen &&\r\n quote.timeframe === 'i5'\r\n ) {\r\n render15MinXAxis(renderTimeframeXAxisProps)\r\n } else {\r\n renderIntradayXAxis({ context, quote, paneModel, textRenderer })\r\n }\r\n } else {\r\n renderIntradayXAxisFutures(renderTimeframeXAxisProps)\r\n }\r\n break\r\n case TIMEFRAME.i10:\r\n if (getIsSmallIndexChart(chartLayout.specificChartFunctionality)) {\r\n renderIntradayXAxis({ context, quote, paneModel, textRenderer })\r\n } else {\r\n render15MinXAxis(renderTimeframeXAxisProps)\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 render15MinXAxis(renderTimeframeXAxisProps)\r\n break\r\n case TIMEFRAME.d:\r\n renderDailyXAxis(renderTimeframeXAxisProps)\r\n break\r\n case TIMEFRAME.w:\r\n renderWeeklyXAxis(renderTimeframeXAxisProps)\r\n break\r\n case TIMEFRAME.m:\r\n renderMonthlyXAxis(renderTimeframeXAxisProps)\r\n break\r\n default:\r\n break\r\n }\r\n}\r\n\r\ninterface RenderFadeExtendedHoursProps {\r\n context: CanvasRenderingContext2D\r\n paneModel: Pane\r\n quote: Quote\r\n}\r\n// only for stocks on i1/i3/i5 and one day view\r\nexport function renderFadeExtendedHours({ context, paneModel, quote }: RenderFadeExtendedHoursProps) {\r\n const isIndicator = paneModel.getIsIndicatorPane()\r\n const { height } = getSize(paneModel)\r\n const { ChartSettings, IndicatorSettings } = paneModel.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const chartModel = paneModel.chart()\r\n const period = quote.timeframe\r\n if (quote.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 = quote.getDayToOffset()\r\n const translate = getTranslate({\r\n context,\r\n xOffset: chartModel.leftOffset + (isIndicator ? IndicatorSettings : ChartSettings).left.width,\r\n yOffset: (isIndicator ? IndicatorSettings : ChartSettings).top.height,\r\n })\r\n translate.do()\r\n const halfBarWidth = getHalfBarWidth(chartModel)\r\n for (const day in dayToOffset) {\r\n // todo aftermarket\r\n const dayIndex = dayToOffset[day]\r\n let n0 = (quote.drawMinutesPerDay / interval) * dayIndex\r\n let n1 = quote.premarketLengthMinutes / interval + n0 // bars in 90mins from 8am to 9:30am\r\n let x0 = paneModel.scale.x(n0) - halfBarWidth\r\n let width = paneModel.scale.x(n1) - paneModel.scale.x(n0)\r\n context.set('fillStyle', Colors.premarketFade)\r\n context.fillRect(x0, 0, width, height + 1)\r\n\r\n if (quote.aftermarketLengthMinutes > 0) {\r\n n0 =\r\n (quote.drawMinutesPerDay / interval) * dayIndex +\r\n (quote.drawMinutesPerDay - quote.aftermarketLengthMinutes) / interval\r\n n1 = quote.aftermarketLengthMinutes / interval + n0 // bars in 90mins from 4pm to 5:30pm\r\n x0 = paneModel.scale.x(n0) - halfBarWidth\r\n width = paneModel.scale.x(n1) - paneModel.scale.x(n0)\r\n\r\n context.set('fillStyle', Colors.aftermarketFade)\r\n context.fillRect(x0, 0, width, height + 1)\r\n }\r\n }\r\n translate.undo()\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { ChartConfigChart } from '../../server/chartConfig'\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 IndicatorType,\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 { indicatorsByType } from '../indicators/indicators'\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 isQuoteForexFuturesCryptoPage(specificChartFunctionality: SpecificChartFunctionality) {\r\n return (\r\n isForexFuturesCryptoPage(specificChartFunctionality) ||\r\n specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n )\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 isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(specificChartFunctionality)\r\n const isQuoteChartWithNarrowBars = isQuoteOrQuoteFinancials && 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\nexport function getQuoteFinancialAttachmentsFromChartConfig({ panes }: Pick) {\r\n return panes\r\n .flatMap((pane) =>\r\n pane.elements?.flatMap(\r\n (element) => indicatorsByType[element.type as IndicatorType]?.config.quoteFinancialAttachments ?? []\r\n )\r\n )\r\n .filter((quoteFinancialAttachment, index, arr) => arr.indexOf(quoteFinancialAttachment) === index)\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 barIndex,\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\r\n// duplicate from Website/js/app/header/utils.ts , will be refactored in next PR\r\nexport function getEarningsDateSuffix(date: Date) {\r\n const hours = date.getHours()\r\n\r\n if (hours <= 9) {\r\n return 'BMO'\r\n } else if (hours >= 16) {\r\n return 'AMC'\r\n }\r\n\r\n return ''\r\n}\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 { 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","log","styles","trace","groupEnd","initialize","window","protoModelLoad","load","started","Date","now","cid","attributes","returnedValue","apply","e","badgeImages","getSvgImageCacheKey","concat","badgeType","theme","state","ChartEventElement","ElementModel","_defineProperty","initClass","paneModel","configure","belongsTo","getChartEventBadgeImage","_badgeImages","cacheKey","badgeImage","isLoaded","image","width","height","async","_ref","onBadgeInitLoad","importWithRetry","chartBadgeSvgByType","chartEventsAsyncModule","importFn","handleImageResolve","values","some","_ref2","undefined","ChartEventBadgeState","forEach","badgeState","ChartEventBadgeType","Theme","svgHTML","CHART_EVENT_BADGE_SIZE","img","Image","onload","onerror","captureException","Error","extra","src","encodeURIComponent","fetchAndCacheChartEventBadges","trigger","getChartEventData","_this$instance$model$","instance","chart","quote","chartEvents","find","stockEvent","elementId","toObject","super","yIndex","toConfig","Indicator","chartModel","Overlay","Chart","Pane","Quote","ChartLayout","DrawingsInternalStore","Element","document","location","hostname","isIPad","Utils","IPAD_FULLSCREEN_CLASS","FullscreenButton","isFullscreen","setIsFullscreen","React","getFullscreenStatus","requestFullscreen","getRequestFullscreen","documentElement","exitFullscreen","getExitFullscreen","onClick","call","checkFullscreen","body","classList","add","remove","addEventListener","removeEventListener","_jsx","Button","leftContent","contentClass","current","children","SORTED_LAYOUT_KEYS","arr","sort","a","b","reduce","acc","option","sortBy","sortDirection","SORT_DIRECTION","ASC","directionMultiplier","sortObjects","entries","LAYOUTS","map","key","value","ChartLayoutDropdown","_ref3","useLocation","navigate","useNavigate","parsedQuery","decodeQueryString","search","chartLayoutModel","useModelState","watchProperties","getChartsToPath","useChartsPathLocation","Dropdown","placement","orientation","l","_jsxs","className","layout","DropdownItem","appearance","Icon","MenuGroup","Paragraph","size","ChartSyncableParts","_ref4","label","isChartPartInSync","getIsChartPartInSync","active","_window$gtag","_window","setSyncChartParts","gtag","event_label","ThemeToggleButton","isDarkMode","updateAttributes","settings","updateSettings","setCookieRequest","catch","BREAKPOINTS","minWidth","Infinity","marketBadgeText","timeFormat","ChartLayoutHeaderComponent","_chartLayout$idea","onSettingsOpen","hasPublish","chartLayout","_Fragment","IdeasDropdown","TourButton","page","specificChartFunctionality","Publish","disabled","idea","Time","breakpointMode","breakpoints","ChartLayoutHeader","prevProps","nextProps","hasRedesign","isRedesignEnabled","StockDetailTimeframeBar","withSuspense","_chartModel$timeframe","_chartModel$dateRange","chartIndex","isDateRangeAvailable","isPremium","isLoadingOverride","isScrollIntoViewEnabled","onTimeframeSelect","onDateRangeSelect","useChartLayoutGlobalModelAsync","chartModelUnwatched","_chartLayoutModel$get","getAllCharts","favoriteTimeframes","toggleFavoriteTimeframe","useFavoriteTimeframes","instrument","Instrument","Stock","isLoading","useChartControls","isInteractive","anchorDate","generateChartLayoutRouterPath","timeframeGroupsWithHref","dateRangeGroupsWithHref","isFetching","handleCustomDateRangeValidation","useChartModelCustomDateRangeValues","onDialogSubmit","customDateRangeDialogState","handleDateRangeSelect","getDateRangeTimeframe","useCustomDateRangeDialog","pathGenerator","dateRangeGroups","customRange","dateRange","timeFrameGroups","selectedTimeframe","timeframe","TimeframeBar","rounding","selectedDateRange","loadingTimeframe","onCustomDateRangeClick","show","onFavoriteTimeframeToggle","containerElement","isFavoritesEnabled","CustomDateRange","dialogState","dateRangeTimeframe","pushIndicators","panes","indicator","_options$COTs","cotKeys","COTs","code","elements","type","IndicatorType","Cot","hasPaneWithCOTCode","PANE_HEIGHT_DEFAULT","period","parameters","getChartTypeByTaConfigStyle","style","candlestick","ChartElementType","CandleStick","heikinashi","HeikinAshi","hollowcandlestick","HollowCandleStick","line","LineChart","ohlc","OhlcChart","mergeChartAndTAConfig","chartConfig","taConfig","charts","scale","_chartScaleMap","linear","ScaleType","Linear","percentage","Percentage","logarithmic","Logarithmic","indicators","filter","position","Position","Above","overlays","overlay","_overlay$parameters","_overlay$color","color","Below","getPanes","_overlay$parameters2","_overlay$color2","SettingsTab","SidebarDirection","createAlertAsyncModule","saveToPortfolioAsyncModule","AdsProvider","getAdsProvider","FinvizSettings","hasUserPremium","None","adsProvider","Freestar","InvestingChannel","trackPageView","_window$gtag2","_window2","pathname","query","freestarPageView","_window$freestar","replace","freestar","queue","trackPageview","portfolioWatchlistTableAsyncModule","assets","logo","logo_light","useTrackPageView","trackInitial","trackAutomatically","initialRender","handleTrackView","tracking","cache","errorsCache","ErrorSeverity","defaultCaptureException","exception","captureContext","Sentry","useAsyncModule","onError","errorSeverity","shouldLoadModule","isSuspenseMode","notificationContext","useNotification","setIsLoading","isError","setIsError","getIsMounted","useIsMounted","handleError","high","handleScriptNotLoaded","renderScriptNotLoaded","medium","Notification","timeoutInMs","reload","loadModule","cachedModule","then","mod","err","Component","fallback","NUM_OF_RETRIES","retries","Promise","r","setTimeout","ElementBaseConfig","abbreviation","shortLabel","optionsOrder","optionsLabels","inputsOrder","inputsLabels","calculatedValuesOrder","calculatedValuesLabels","defaultCalculatedValueOption","getShortLabelWithAttrs","getDefaultCalculatedValues","Arrow","x","y","renderContent","resize","_thumbs","Thumb","x1","y1","x2","y2","getBoundingPointKeys","getDefaults","border","getChartLayoutSettings","ElementSettings","Colors","context","scaled","roundedXY","getRoundedObject","translateXY","getXYOffsetFromLine","lineWidth","translate","beginPath","set","angle","Math","PI","moveTo","lineTo","stroke","lineAngle","atan2","h","abs","cos","angle1","topx","topy","sin","angle2","botx","boty","getShouldRenderThumbs","renderThumbs","moveBy","difX","difY","isInArea","area","isDrawingElementLockedOrInvisible","math","distanceToSegment","CanvasElementType","arrow","modalConfig","inputs","Brush","previousFill","shouldRenderFill","_this$model","positionPointsTimestamps","points","getTimestampFomPositionX","places","Number","parseFloat","round","overridePlaces","domainDiff","numberOfLeadingZeros","floor","log10","roundToFixed","untranslatedContext","getContextWithCache","createElement","setFillCache","fill","defaultTransparentFill","isPolyLineClosed","cachedFill","getShouldRenderFill","_this$attrs","brushPath","Path2D","i","fx","fy","xc","yc","quadraticCurveTo","point","closePath","getThumbs","firstX","firstY","lastX","lastY","moveByThumb","getIsCreator","onMouseUp","currentDomainMax","currentDomainMin","domain","roundY","_this$untranslatedCon","isPointInPath","updateScales","getPositionXFromTimestamp","getAutosaveOmittedProperties","getEdgeXYValues","edgeXYValues","_edgeXYValues$minX","_edgeXYValues$minY","_edgeXYValues$maxX","_edgeXYValues$maxY","minX","min","minY","maxX","max","maxY","brushV1","default","TailDirection","getTailHalfWidth","halfWidth","p1","p2","dist","distance","Callout","Text","getModalConfigBase","required","textWithoutBackground","text","font","family","weight","fillStyle","lineHeight","textAlign","textBaseline","padding","top","right","bottom","left","background","defaultFill","setupContext","setupTextMetricsCache","_this$lastAttrs","_this$lastAttrs2","ctx","lastAttrs","JSON","stringify","merge","lines","getLines","metrics","measureText","measuredHeight","currentIndex","actualBoundingBoxAscent","actualBoundingBoxDescent","PADDING","S","render","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","getIsInChartView","leftOffset","calloutV1","Curve","x3","y3","drawQuadraticCurve","curve","Bezier","quadraticFromPoints","cp1x","cp2x","cp1y","cp2y","project","d","thumbsAreInArea","_Bezier$quadraticFrom","Ellipse","invert","getCoordinates","centerLeftX","centerLeftY","centerRightX","centerRightY","boundingPointKeys","c","bottomCenterX","bottomCenterY","bezierCurveTo","bottomRightX","bottomRightY","topRightX","topRightY","topCenterX","topCenterY","topLeftX","topLeftY","bottomLeftX","bottomLeftY","rotationAngle","atan","sign","radiusX","radiusY","width_two_thirds","dx1","dy1","dx2","dy2","ellipse","RotatedRectangle","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","save","rotate","restore","cx","cy","halfHeight","drawingToolsByType","freeze","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","fromObject","obj","getNumOfBarsBuffer","_","xPointKeys","positionTimestamps","positionX","onMouseDown","onMouseMove","_this$model$chartEven","_this$model2","_this$model$elements","_this$model3","getIsChartEvent","findByAttribute","__","setIsEditInProgress","isEditInProgress","shouldTriggerChange","setIsSelected","isSelected","setIsHovered","isHovered","getIsPaneSelection","_this$model$elements$","pane","selection","attrsSubset","customizer","objValue","srcValue","getIsDrawing","mergewith","cachePointPositionTimestamp","get","defineProperty","globalAlpha","thumb","isMouseDown","activeThumb","startEditing","mouseDown","pointPoitionsFromTimestamp","chart_layout","isLockDrawingsActive","getIsVisible","getModalConfig","config","input","toAutosaveConfig","omit","replaceMyself","_window$Sentry","captureMessage","oldElement","isCreator","newElement","getIsCreatorDialogOpen","isCreatorDialogOpen","release","_this$attrs$visibilit","micro","macro","MicroMacroTimeframe","visibility","isInRange","from","to","setVisibilityTo","setTo","MacroTimeframe","timeframesToSet","attrsToSet","SetVisibilityTo","currentAndAbove","currentAndBelow","currentOnly","assign","_this$getBoundingPoin","xPoints","yPoints","positionY","omitX","isMaxXInvalid","isNaN","isMinXInvalid","omitY","topBound","bottomBound","ElliottWaves","positionWavesTimestamps","waves","wave","offset","getOffsetFromLineWidth","p","TextBaseline","middle","TextAlign","center","EllipseV1","rotationAxisPoint","pointToRotate","oldLinePoint","newLinePoint","sharedPointLinesAngle","sharedPoint","rotatedPoinCoordinates","rotatedPointCoordinates","getEllipsePoints","P2","P4","coordinates","P3","P1","CP4","CP1","CP2","CP3","ellipsePath","inverted","cursorTargetX","cursorTargetY","perpendicularPoint","cursor","distanceToLine","lineCenterX","lineCenterY","invertX","invertY","perpendicularPointEllipseOffsetX","perpendicularPointEllipseOffsetY","P1WithOffsetX","P1WithOffsetY","P3WithOffsetX","P3WithOffsetY","controlPointOffsetX","controlPointOffsetY","newLeftPoint","leftRotatedCursorPoint","getRotatedPointCoordinates","newRightPoint","rightRotatedCursorPoint","FibonacciRetracements","parseCoefficients","coefficients","parsed","split","trim","getMaxCoefficientUnscaledY","getMinCoefficientUnscaledY","includes","_ref5","_ref6","_ref7","maxCoefficientY","minCoefficientY","allYValues","HorizontalLine","ScaledLine","updateDecimalPlaces","decimalPlaces","step","getInstrumentDecimalPlaces","lastClose","ChartSettings","getBarIndex","close","renderLabels","IndicatorSettings","isIndicator","allowDecimal","Line","strokeStyle","dashLength","setLineDash","Measure","volume","barIndex","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","trend","medianToControlPointDistance","normalizedControlToControlPointVector","trendRay1","trendRay2","trend2Ray","medianToTrendLineDistance","trendRayPoint1Origin","addPoints","multiplyVectorByScalar","trendPoint2RayOriginPoint2","subtractPoints","trendRayPoint1DirectionPoint","trendPoint2RayDirectionPoint","Pitchfork","median","_trendLines$filter$","trendLines","line1","line2","trendLine","trendLineIndex","solidTrendColor","getHEXWithSpecificAplha","nextTrendLine","outerTrendLines","Polygon","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","result","roundDif","coordType","coordIndex","t","s","Rectangle","strokeRect","RotatedRectangleV1","newMiddleLeftPoint","middleLeftRotatedCursorPoint","newMiddleRightPoint","middleRightRotatedCursorPoint","ScaledText","XXXS","XXS","rect","textBoxX","textBoxY","textBoxWidth","textBoxHeight","DEFAULTS","alphabetic","getMergedPropsWithDefaults","propKey","count","f","_obj$font","_this$context$measure","_this$context","MIN_SAFE_INTEGER","testArea","convertArea","rawHight","getFontHeight","_this$context$measure2","_this$context2","fontBoundingBoxAscent","fontBoundingBoxDescent","_border$width","borderWidth","ThumbSettings","borderColor","thumbWidth","getThumbWidth","Triangle","VerticalLine","XABCD","xx","xy","ax","ay","bx","by","start","toUpperCase","retLabel","len","ret","xab","bcd","result1","canvas","rendered","refresh","ratio","drawImage","cWidth","cHeight","sWidth","screen","sHeight","getScaleRatio","setSizeOnCanvasElement","canvasElement","OHLCType","ChartMinWidthBreakpoints","getChartBreakpoints","chartWidthInPx","isXs","xs","isS","isM","m","isL","getDateString","date","dateString","month","getMonth","year","getFullYear","day","getDate","TIMEFRAME","i1","i2","i3","i5","i10","i15","i30","h2","h4","MONTHS","w","getClosestDifferentMinMaxValueIndices","currentMinIndex","currentMaxIndex","low","hasPreviousIndex","hasNextIndex","minIndex","maxIndex","gray300","tailwindColors","BaseChart","overlaysByType","isLargeChart","isMobile","utils","overlayDefinition","convertColorToHEX","addOverlay","renderYAxis","renderCrossText","setupCache","renderOverlaysLabels","CustomSpineEvents","IndicatorsChange","handleIndicatorsChange","mouseModelChangeHandler","mouseModel","unmountCanvas","baseCache","updateShouldRenderVolume","renderChart","renderChartNotAvailable","getIsRedesignedChart","renderTicker","clip","renderVolume","renderOverlays","renderPrevClose","renderFadeExtendedHours","renderGrid","renderXAxis","tickerText","getIsSmallIndexChart","ticker","general","margin","FONT_SIZE","OFFSET","baseline","renderTimeframe","_ChartSettings$left$t","volumeFY","range","Group","getTimeframeLabel","textSecondary","isOurSiteRequest","L","tickerWidth","SpecificChartFunctionality","offScreen","XS","M","blue","renderChange","lastOhlc","getOHLC","directRender","changePercentage","lastDate","renderOHLC","isSmallIndexChart","isNewestOHLC","open","afterHour","isFinite","afterClose","roundOhlc","lastVolume","toLocaleTimeString","hour","minute","getRoundedLastData","lastOpen","lastHigh","lastLow","renderOverlaysLabelsChartsPage","renderOverlaysLabelsQuotePage","overlayLabel","isRenderedOverlaysLabel","labelSpacing","getLabelColor","getYAxisLeftMargin","Crypto","getYAxisLastCloseLabel","firstVisibleClose","getPercentageFromValue","base","lineTicks","textTicks","lastCloseLabel","getTranslate","do","tickCount","minMax","getMinMax","placesAxis","stepPrice","scaleRange","updateAttribute","minPerc","maxPerc","d3","nice","ticks","tick","getValueFromPercentage","pixelGap","negativeScale","previousNegativeTick","unshift","positiveScale","previousTick","positiveScaleY","getYLineText","val","yTickText","axis","yTickLine","getYLine","resetYTicksStyles","percentageZeroLineText","undo","renderYAxisLabel","yCoordinate","getSecondaryLabelBackgroundColor","stringifyHSVAColor","getHSVAFromColor","currentBackground","getYAxisSecondaryLabelYCoordinate","_padding$top","_padding$bottom","mainLabelValue","secondaryLabelValue","direction","LINE_HEIGHT","mainLabelValuePosition","secondaryLabelValuePosition","offsetedY","currentText","getDrawDays","MarketSentiment","textRenderer","shouldRenderVolume","getIsIndicatorPresent","Vol","getVolumeTicks","maxHeight","fontHeight","renderVolumeAxis","relativeVolume","grid","rangeMax","volumeAxisFontSize","volumeAxis","format","tickFormat","domainFrom","domainTo","setupAxisTimeFrame","halfBarWidth","getHalfBarWidth","barWidthWithoutMargin","getBarWithoutMarginWidth","drawInVisibleArea","drawBarCallback","volumeTrendDown","volumeTrendUp","renderCross","isRendered","contentWidth","contentHeight","getRoundDecimalPlaces","price","getPlacesLastClose","onRenderCrossText","getCrossIndexForPane","setElementCursor","getHTMLElementId","conditionalCursor","getDataByCrossIndex","crossIndex","shouldReturnRoundedString","n","getDataByBarIndex","getCrossIndexChange","_this$data$close$cros","_this$data$close","crossDataIndex","getDataIndexByBarIndex","crossClose","previousClose","getTickerChangeFromCloseValues","anchorClose","prevClose","dateByBarIndex","virtualTradedDates","getVirtualTimeframeTradedDates","dateStart","dateEnd","change","tickerChange","tickerAfterChange","getTickerChange","isOffscreen","isGroupInstrument","finvizWatermarkOffset","changeText","percentString","string","getChangeColor","changeWidth","afterChangeText","afterChangeTextWidth","oneLineAHChangeWidth","afterChange","renderOHLCChartsPage","renderOHLCQuotePage","_ref8","chartBreakpoints","OhlcText","canvasFill","dateElements","trendColor","oElements","hElements","lElements","cElements","volElements","changeElements","getFlatLineArrayWithSpaces","lineElements","flatMap","startX","lineElement","LabelsText","numberOfNewOhlcLines","_ref9","dateOnly","timeOnly","lineTopY","OHLCFontSize","centerXOffset","leftXOffset","OHLC","ohlcString","singleLine","OHLC_TEXT","getOHLCType","ohlcSettings","getOHLCSettings","CHART_MARGIN","XXL","alignTop","renderOHLCToCanvas","_ref10","ohlcSet","isSingleLineWithChange","shouldShowPrevClose","isStock","isIntradayWithPreMarket","TIMEFRAMES_WITH_PRE_MARKET","isIndexChart","smallIndex","Cache","getIsMobileChartPage","setupAxis","_utils$max","volumeHeight","firstBarToRenderIndex","getVisibleBarToRenderIndex","lastBarToRenderIndex","chartWidth","volumes","getAreNoBarsVisible","addMarginBottom","marginBottom","setOverlays","removeOverlay","splice","MAX_VALUE","MIN_VALUE","prevMin","closestMinMaxIndices","placesLastClose","priceAbs","hasOverlay","getXLine","chartPage","getCandleLikeChartsRenderingColors","overwrittenColors","getColorOverwrites","overwrittenColorKeys","hasOverwrittenCandleColor","colorKey","light","getShouldUseDarkerWickColors","totalBarWidth","barWidth","darkerWickColors","thinBarColorsOverride","isRedesignedPage","getRenderChartBarProps","chartSettingsColors","hasFillAndBorder","trendDown","trendUp","borderDown","borderUp","wickDown","wickUp","wickColor","barFillColor","barFillWidth","barBorderWidth","getBarWidthWithMarginByParts","zoomFactor","shouldRenderFillAndBorder","translateForWick","WICK_WIDTH","candleBodyHigh","candleBodyLow","candleWickHigh","candleWickLow","candleBodyHeight","candleBodyLeftX","halfBorderWidth","getIsSSr","isBodyHeightGreaterOrEqualBorders","isWickLineCandleLessThanOnePixel","hasBorder","fillHeight","hasFill","isHollow","generalTrendColor","ohlcTrendUp","ohlcTrendDown","zeroChange","haData","getHeikinAshiData","getLastValues","originalLatestClose","heikinLatestCloseLabel","originalLatestCloseLabel","_haData$close$barInde","_haData$close","first","redLine","greenLine","MarketSentimentSettings","sum","_data","lastIndex","_dataLastIndex","drawMinutesPerDay","marketStartMinutes","renderLineBullBear","array","oversold","overbought","isRedesign","marketDown","marketUp","xLine","_compute","computeVisibleMinMax","yLine","fillUp","fillDown","percent","months","MultiLineChart","ColorsSettings","quotes","getQuotes","tickers","end","asc","barToDataIndex","_this$data$getDataByB","maxTickerLength","isLastDate","closeValue","NaN","tickersDimensions","arrays","q","select","_this$data","isIdeaId","ideaID","OHLCChart","barWithoutMarginWidth","lineThickness","handleLengthFromWick","lineOffset","barX","PerfChart","overlayLabelWidth","getCompleteChartNumOfBars","dates","perf","_this$dates$crossInde","shouldRenderDate","tickerData","_tickerData$crossInde","MARGIN","percentageText","_tickerData$lastCross","lastCrossIndex","findLastIndex","fromDate","toDate","timestampe","dateToIndex","getDateToIndex","lastValue","dataIndex","_first","lastMonth","monthsInData","availableTickSpots","monthsToAvail","renderMonth","chartsByType","candleStick","heikinAshi","hollowCandleStick","lineChart","marketSentiment","multiLineCharts","ohlcChart","perfChart","XXXL","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","ChartEditorEnum","LayoutType","OverlayType","ChartEventDbType","ChartEventType","ChartEventLabels","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","columns","rows","gridAreas","DESC","IntradayTimeframeInterval","TimeframeLabelShort","DateRangeType","QuoteFinancialAttachment","TIMEFRAME_SECONDS","CRYPTOS","BTCUSD","LTCUSD","ETHUSD","XRPUSD","BCHUSD","BTCEUR","LTCEUR","ETHEUR","XRPEUR","BCHEUR","LTCBTC","ETHBTC","XRPBTC","BCHBTC","QuotePollingIntervalInMs","EXTRA_MARKET_BUFFER_MINUTES","ScaleLabel","INDICATOR_LABEL_HEIGHT","MOBILE_BARS_TO_VIEW","MOBILE_VIEW_BREAKPOINT_WIDTH","FREE_DATE_RANGES","QuotePageQueryChartTypes","minutes","hours","days","weeks","MicroTimeframeRange","prev","curr","QUOTE_FETCH_EVENT","PREMARKET_AFTERMARKET_HOURS","CHART_ELEMENT_ID","CHART_SETTINGS_DIALOG_TEST_ID","getContainerTypeFromPaneConfig","indicatorElement","getContainerType","_mainElement$instance","_mainElement$instance2","mainElement","indicatorType","isChart","updateInternalStoreWithChangedElement","changeType","currentInternalStore","lastUpdateTimestamp","getQuoteRawTicker","containerType","destroyed","instanceJson","newDrawing","zIndex","lastChange","elementAttrs","newInternalStore","updateDrawingIndex","drawingElement","shouldSyncAndSave","updatedRecord","hasChangedZIndex","hasChangedType","hasChangedAttrs","hasChange","getTickersAndContainerTypesInLayoutModel","containerTypes","getAllPanes","mergeUpdatedDrawingsToInternalStore","updatedDrawings","isRefetchAll","newLastUpdateTimestamp","updatedElementIds","drawing","receiveHlc","drawingIndex","currentDrawing","currentNote","getElementNoteText","autoSavedNote","incrementHlc","parse","compareHlc","getInitialStoreDrawings","_window$FinvizSetting","_window$FinvizSetting2","_window$FinvizChartsS","_initialDrawings$map","initialDrawings","initialDrawingsStore","FinvizChartsSettings","drawings","getAutosaveElementFromDBRecord","handleCallMethodOnAllDrawings","elementMethod","getAllElements","isDrawing","getNoteElementId","noteElement","_JSON$parse","getTickerNoteText","ts","lastChangeTimestamp","lastChangeCounter","uuid","lastChangeNodeUUID","getDBRecordFromAutosaveElement","ChartTypesSelect","specificFunctionality","chartTypes","currentType","setSelectedChartTypeOverwrite","selectedChartTypeOverwrite","ta","ty","taInt","parseInt","isQuoteOrQuoteFinancials","quotePage","quoteFinancials","generateRouterPath","FREE_TYPES_QUOTE_VALUES","encodeQueryString","QuoteNodeChartTypes","candlesticksimple","QuoteLongToShortType","utm_source","utm_medium","utm_campaign","DEFAULT_TYPES","FREE_TYPES_QUOTE","href","reloadDocument","defaultType","QuoteShortToLongType","FinvizQuoteTypeCurrent","useChartTypes","Select","items","icon","nativeSelect","onChange","utmCampaign","futuresPage","forexPage","cryptoPage","PopoverInner","hidePopover","chartSettingsModule","chartSettingsAsyncModule","onClose","ScrollableChartSettingsPopover","isOpen","forceGlobalRerender","getIsConfigChanged","confirmationDialogState","usePopoverState","hide","checkChangesAndOpenDiscard","preventDefault","discardChangesAndHide","buttonPosition","_popoverContentElemen","popoverContentElement","getState","disclosureElement","getBoundingClientRect","scrollY","chartHeight","_chartElement$clientH","chartElement","getElementById","clientHeight","Popover","minHeight","ZIndexContext","Provider","classNames","PopoverRounding","regular","PopoverTheme","Delayed","Spinner","ConfirmationDialog","actions","as","DialogDismiss","ChartSettingsButton","settingsPopoverState","useState","buttonProps","PopoverTrigger","focusRing","getQuoteRequestKey","_chartModel$chart_lay","_chartLayoutModel$ide","_chartModel$quote","unwatchedChartModel","chartModelRef","modelRef","useModelRef","abortControllerKeyRef","isIdeaChart","updateChartModelWithNewQuote","_chartLayoutModel$act","_chartPane$getAllChar","isSameTicker","getRawTicker","getChartOrIndicatorElement","getLeftOffset","isScrolled","getAllQuotes","chartQuote","fetchData","fetchType","QuoteFetchType","NewerData","chartPane","getChartPane","activeChartEvent","toggleIsOpen","getAllChartEvents","isChartEvent","isPreserveDrawingsActive","destroyCascade","setChartEvents","updateChartEventsZIndexes","fetchQuote","hasChartEvents","premarket","aftermarket","patterns","getHasPatterns","currentQuote","abortController","createRequestAbortController","shouldAbortRunningRequest","events","financialAttachments","getQuoteFinancialAttachments","cachePredicate","fetchNewDataOnCachedQuote","wasFetchAborted","isQuoteUsedInOtherCharts","fetchedAt","destroy","removeFromAbortCache","decodedQueryString","rangesArray","ranges","every","shouldRecalculateOnCharts","barMargin","hasSameBarWidth","hasSameBarMargin","_chartLayoutModel$spe","setIsFetching","dateFromUnixTimestamp","generatePathForTimeframeDateRange","timeframeUtm","getTimeframeGroupsWithHref","generatePath","timeFrame","getDateRangeGroupsWithHref","dateRangeState","numOfVisibleBars","getVisibleBarsNumber","getChartStartEndDates","unwatchedChartLayoutModel","hasSyncedTimeframe","ChartSyncablePart","Timeframe","syncChartParts","hasSyncedTicker","Ticker","_decodedSearch$t$spli","_decodedSearch$t","_decodedSearch$p$spli","_decodedSearch$p","_decodedSearch$r","decodedSearch","urlTickers","urlTimeframes","urlDateRanges","chartsArrayPlaceholder","_urlTickers$index","currentTicker","timeframes","_urlTimeframes$index","currentTimeframe","_urlDateRanges$index","currentDaterange","Boolean","sidebar","getIsMobilePortrait","getTimeframeGroups","timeFrameGroup","QuoteUrlChartTypes","cs","o","ha","hc","useChartLayoutGlobalModelAsyncModule","preventClosingUnsavedChangesAsyncModule","BackgroundInput","InputColorPicker","inputDataTestId","toLocaleLowerCase","ColorRangeRowInput","colorValue","colorTestId","rangeValue","rangeTestId","rangeLabel","rangeProps","handleRangeChange","useCallback","currentTarget","handleColorChange","RangeSlider","rightContent","BorderInput","CheckBox","Checkbox","checked","FONT_VALUES","FontInput","setFamily","setSize","setStyle","setWeight","setValue","valueSetter","Label","selected","Input","LineInput","MultilineStringInput","Textarea","placeholder","target","autoFocus","NumberInput","pattern","StringInput","Trend","valueAsNumber","VisibilityInput","isCheckboxOnly","isOff","setIsOff","setFrom","macroKey","macroLabel","charAt","INPUTS_AVAILABLE","getInitialState","visibilities","macroTimeframe","valueMacroTimeframe","getIsVisibilityOutsideAvailableTimeframes","macrotimeframe","macroRange","_macroRange$from","_macroRange$to","Visibility","initialVisibilityRef","handleChange","handleDisableSubmit","TAB_BUTTON_COMMON_PROPS","getValuesFromFormState","formState","cur","DialogTabs","ElementStyleDialog","_config$title","initialFormStateRef","setFormState","selectedTab","setSelectedTab","Style","isSubmitDisabled","setIsSubmitDisabled","isDrawingElement","handleFullyOpen","CanvasElement","handleFullyClosed","onHide","handleValuesChange","shouldSubmit","shouldDismiss","hasOnSubmit","onSubmit","hasOnDismiss","onDismiss","handleValuesChangeDebounceRef","debounce","newFormState","maxWait","cancel","checkValidity","handleCloseDialog","Dialog","isDraggable","modal","backdrop","onFullyOpen","onFullyClosed","hideOnEsc","DialogHeader","onCloseClick","DialogBody","ButtonGroup","hasDivider","InputComponent","getInputForType","inputType","stateInput","DialogFooter","ElementStyleDialogContext","ElementStyleDialogWrapper","setElement","setOnSubmit","setOnDismiss","dialog","useDialogState","openDialog","DRAWINGS_SAVE_INTERVAL_MS","RETRY_LIMIT","useDrawingAutoSaveApi","postRetryCountRef","deleteRetryCountRef","fetchDrawings","fetchApi","queryParameters","throwOnStatusCodes","saveDrawings","bodyJsonString","keepalive","hi","charCodeAt","lo","getByteLengthOfString","method","contentType","ContentType","ApplicationJson","latestChangeHlc","_window$Sentry2","InternalServerError","ForbiddenError","GoneError","newTicker","response","message","GenericStatusCodeError","invalidItems","deleteAllDrawings","lastLocalChange","newHlc","_window$Sentry3","useDrawingAutoSaveControls","isAutoSaveActive","isInit","getIsPreserveDrawingsAndAutosaveAvailable","useIsAutoSaveActive","drawingsInternalStore","saveTimeoutRef","clearTimeout","saveLatestChanges","withDelayInMs","saveQueueExtraFilterCallback","saveQueue","latestLocalUpdateTimestamp","instanceUUID","setAutoSaveState","AutoSaveState","Unsaved","Saving","Saved","syncChartLayoutDrawings","isRemove","paneContainerType","paneInternalStoreElements","autoSaveElement","paneElement","paneDrawing","parsedElementAttrs","hasOngoingInteraction","getCanvasElementByType","create","handleAutoSaveNoteChange","note","newNoteElement","handleIdeaNoteChange","_chartLayout$activeCh","_chartLayout$activeCh2","activeChart","checkDrawingUpdate","latestRemoteUpdateTimestamp","initHlc","allElements","normalizeZIndexes","_chartLayout$activeCh3","_chartLayout$activeCh4","activeTicker","updateInternalStoreWithElement","updateResult","deleteAllAutoSavedElements","onElementChange","elementPane","elementContainerType","elementPaneTicker","eventType","DrawingSpineOptionsEvent","Remove","useDrawingAutoSave","drawingsInternalStoreUnwatched","prevIsAutoSaveActive","ref","usePrevious","runInitialSaveAndRefetchUpdate","Off","onChartOrIndicatorChange","newTickers","newContainerTypes","ChartModel","checkDrawingUpdateSubscription","intervalCallbackOnWindowVisible","interval","unregisterListeners","willDestroy","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","ChangeLabel","changePoints","isTiny","classnames","DailyChangeDisplay","listenOnEvents","quoteModel","testId","DrawButton","newValue","getIsDrawingEnabled","DRAWING_COOKIE_NAME","expires","setMonth","setCookie","finally","getLayoutType","tickersCount","_tickers$index","Search","onTickerSelected","saveToPortfolioDialogState","isSaveToPortfolioVisible","createAlertDialogState","isCreateAlertVisible","saveToPortfolioModule","isLoadingSaveToPortfolio","createAlertModule","isLoadingCreateAlert","SaveToPortfolio","CreateAlert","detailLink","formattedTicker","Futures","Forex","WebsiteSearchComponent","inputClass","isSearchIcon","isSearchItemLink","isShowAllVisible","event_category","_window$gtag3","_window3","hasRedesignEnabled","ChartControls","_chartModel$quote$nam","isQuotePage","isQuoteFinancials","handleTickerSelect","upperCaseTicker","handleCustomRangeSubmit","timeframeBarProps","canChangeTicker","hasTimeframe","editors","Heading","tools","editable","ideas","compactViewMaxBreakpointPx","grow","publish","ContextMenu","contextMenu","_watchedModel$config","_watchedModel$callbac2","_watchedModel$callbac3","watchedModel","useDropdownState","shown","ContextMenuComponent","overlap","hideOnInteractOutside","_watchedModel$callbac","_item$onClick","callbacks","onBeforeItemClick","getAnchorRect","anchorRect","onContextMenu","stopPropagation","ready","rootEl","querySelector","ReactDOM","event","clientX","clientY","ChartEventPopoverWithState","_activeChartEvent$id","unwatchedChartLayout","lastEventId","popoverState","isPopoverMounted","chartEventsModule","isChartEventOfThisChart","setData","clickAwayRef","isListening","refCallback","handler","contains","useClickAway","_chartModel$getChartP","chartEvent","popoverShow","popoverHide","newData","getChartEvenBadgeType","PopoverAnchor","store","tabIndex","focusable","autoFocusOnShow","ChartEventPopoverContent","delayComponent","LoadLatestDataButton","isMountedRef","hasNewDataAvailable","setHasNewDataAvailable","getRefreshInterval","isPossibleToFetchSequentialData","hasNewData","promises","refreshData","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","scrollable","renderAll","oldElementInstance","isDrawingModeContinuousActive","setSelection","onPaneDestroy","setSelectedElement","clonedElementInstance","setCanvasSize","recountScale","getArea","MouseModel","_event$targetTouches","activeChartInteraction","TouchEvent","targetTouches","lastClientX","dif","addToLeftOffset","lastClientY","_this$props$model$get","_this$props$model$get2","_this$props$model$get3","currentViewRange","touchEventsDisabled","onScalerMouseDown","onScalerMouseMove","onScalerMouseUp","setActiveChartInteraction","MouseEvent","button","scalerLastY","onScalerTouchMove","onScalerTouchEnd","_model$getChartOrIndi","_model$getChartOrIndi2","originalMinMax","currentDiff","originalDiff","getBarWidthWithMargin","getMinMaxLeftOffset","newLeftOffset","fetchOlderData","getElement","openElementStyleDialog","pointerType","onCanvasPress","elementInArea","elementModel","hasProperties","isElementDrawing","onContextMenuClose","makeClone","bringToFront","sendToBack","bringForward","sendBackward","handleRemoveIndicatorPane","paneIndex","element_type","onContextMenuFullyOpen","updateType","canvasCtx","_this$props$model$sel","_this$props$model$sel2","hoveredElement","_element$instance$get","_element$instance","_element$instance$get2","_element$instance2","cross","crossRafId","requestAnimationFrame","process","rafId","_renderAll","canvasRef","getIsUpdatedDesign","renderPane","isMouseInPane","getShouldRenderCrossInPane","crossCanvasCtx","clearRect","isCrossDisabled","PaneModel","getIsDisabled","elementInstance","additionalData","Settings","getSettings","areaRectangle","areaRectangleCursorX","areaRectangleCursorY","chartLeftX","chartRightX","cursorX","cursorY","isCursorInChartWidthBoundaries","crossCanvasRef","isDisableTouchCrossAvailable","initialScrollable","lastActiveTool","DrawingTool","Mouse","isChartsPage","setState","setItem","inline","activeTool","_this$zoomControlsRef","isMouseDownIgnored","zoomControls","paneHeight","touchEvent","onCanvasInteractionStart","_MouseModel$pane","setMousePosition","getMousePositionInBoundaries","_element$getIsChartEv","isTouch","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","_model$selection$getI","_model$selection2","isElementHovered","crossCanvas","canvasAreaRectangle","chartLeft","chartRight","chartTop","chartBottom","getValueInRange","_MouseModel$pane2","isSameMouseModel","isSelectionCanvas","onModelUpdate","onElementCreate","onElementDestroy","onElementReplace","onElementSelect","onElementClone","immediateRecountScaleOnChartIndicatorChange","ManualChange","onChartUpdate","isIndicatorPane","getIsIndicatorPane","componentDidMount","_getInitialStoreDrawi","_this$canvasWrapperRe","initialStoreDrawings","_element$instance5","_element$instance6","paneHammer","Hammer","paneRef","touchAction","threshold","on","onPress","canvasWrapperHammer","canvasWrapperRef","onTouchMove","passive","scalerRef","scalerHammer","onScalerReset","zoomerRef","zoomerHammer","onZoomerReset","onDoubleClick","forceUpdate","CHART_LAYOUT_CHILD_CHANGE_EVENT","componentWillUnmount","_this$canvasWrapperRe2","onPaneClick","_this$paneHammer","_this$scalerHammer","_this$zoomerHammer","_this$canvasWrapperHa","_this$scalerHammer2","_this$zoomerHammer2","_this$paneHammer2","_this$canvasWrapperHa2","isChartPane","getIsChartPane","onMouseLeave","onPaneMouseLeave","onTouchStart","onResizerMouseDown","onMouseEnter","onScalerMouseEnter","onScalerTouchStart","onZoomerMouseDown","onZoomerMouseMove","onZoomerTouchStart","onAddToZoomFactor","diff","shouldCalculateRightAlign","onTouchEnd","onBlur","getChartAlt","isCharts","isRedesignedFuturesForexCrypto","withNotificationContext","withElementStyleDialogState","ChartSpinnerOverlay","shouldDisplay","setIsVisible","timeout","DEFAULT_WRAPPER_COMPONENT","preventDefaultFunc","panesWrapperElement","layoutModel","isWheelZoomEnabled","zoomerRightAlign","calcZoomerRightAlign","mouseWheelTimeout","activePane","_this$props$layoutMod","onModelChange","calculateMinimalPaneHeight","paneId","chartModelParam","panesHeight","_pane$height","newPaneHeight","newChartPaneHeight","newIsScrolled","lastWidth","lastHeight","handleQuoteChange","_pane$selection","resizerPaneIndex","onResizerMouseMove","onResizerMouseUp","resizePanesAccordingly","touches","onZoomerMouseUp","getRawDistance","onPinchMove","onPinchEnd","currentLeftOffset","isIntraday","offsetDiff","shouldAlignDaysToLeftApplied","offsetBars","_e$clientX","onZoomerTouchMove","onZoomerTouchEnd","deltaY","isMouseWheel","normalizeWheelDeltaY","addToZoomFactor","diffCoefficient","currentZoomFactor","minBarWidthInPx","maxBarWidthInPx","minZoomFactor","getZoomFactorForBarsToDisplay","chartVisibleWidth","maxZoomFactor","isNegativeDirection","newZoomFactor","newZoomFactorInRange","getZoomFactor","stretch","updateZoomAndLeftOffsetByDateRange","newQuote","shouldForceLeftOffsetUpdate","Refetch","onLayoutModelChange","onPaneCreate","onOlderDataLoaded","onDataLoaded","componentDidUpdate","_prevState$panesWrapp","_this$state$panesWrap","_this$state$panesWrap2","setStateWithPanesTimeout","renderChartToolbar","isChartPage","getAllValidPanes","showSettings","showTimeframe","resetMouseModel","handleSetPanesWrapperRef","onPinchStart","onWheel","onMouseWheel","total","optiMinHeight","minimalPaneHeight","basePane","WrapperComp","gridArea","isModelDestroyedRef","initChartRef","panesConfig","_pane$elements","_element$overlays","getQuoteFinancialAttachmentsFromChartConfig","panesWithPerfIndicator","allSettled","paneWithPerfIndicator","prefetchPerfIndicatorAllQuotes","paneProperties","createPaneCascade","shouldResize","chartsDimensions","getChartsDimensions","handleModelBeforeDestroy","isFuturesForexCryptoPage","isModelReady","loadingStyle","hasOutline","withWatchedPanesOnChartModel","drawingCreatorsAsyncModule","drawingActions","DrawingActions","AddNote","DeleteDrawings","DeleteAutoSavedDrawings","getToolbarDrawingActions","isAddNoteAvailable","isIdea","defaultItem","isDisabled","disabledTooltip","drawingSettings","DrawingSetting","PreserveDrawings","iconActive","titleActive","DrawingModeContinuous","HideDrawings","LockDrawings","preserveDrawingsAutosaveOverride","iconAction","titleAction","getToolbarDrawingSettings","isPreserveDrawingsAndAutosaveAvailable","isAutoSaveInProgress","isInAction","drawingTools","Xabcd","toolbarDrawingTools","toolGroup","toolGroupTitle","DISABLED_ITEM_TOOLTIP_LABEL","Toolbar","_chartLayoutModel$ide2","isSidebar","isHorizontal","isMobileOverlay","onActiveToolChange","onDrawingActionClick","onDrawingSettingClick","onDrawingEnd","isAlternativeTheme","areToolsDisabled","ignoreRowId","drawingCreatorsModule","isDrawingCreatorsModuleLoading","autoSaveState","setIsDrawing","availableDrawingSettings","availableDrawingActions","isDrawingModeContinuous","hasData","hasHiddenDrawings","tool","drawingToolsTouchCreatorsByType","drawingToolsCreatorsByType","ToolClass","one","ToolbarComponent","_item$toolGroup","isActive","isToolLoading","ToolbarItem","groupItems","groupTitle","useNativeSelect","rowId","ToolbarDivider","ceil","ChartAutoSaveNote","onNoteChange","ChartAutoSaveNotes","setTickers","unwatchedInternalStore","handleChartChange","tickerNoteMap","_tickerNoteMap$ticker","AutoSaveNotesDialog","isAnimating","isFullyClosed","onAction","onCancel","isAutosaveDialogContent","dialogContent","getDialogContent","ConfirmationDialogComponent","ToolbarMobile","toolbarState","hideToolbar","hideAll","urlSearchParams","setUrlSearchParams","useSearchParams","toolbarMobileElement","setToolbarMobileElement","MOBILE_TOOLBAR_DIV_ID","drawButtonProps","has","SIDEBAR_QUERY_PARAM","params","delete","handleActiveToolChange","drawingTool","handleDrawingActionClick","actionId","gutter","unmountOnHide","AutoSaveStateIndicator","setVisibilityTimeout","newIsVisible","checkIfNeededPreventLeaving","returnValue","ChartLayoutAutoSaveNote","chartLayoutModelUnwatched","ideaNoteRef","getPublishChartHtmlElements","publishChartElements","getElementsByClassName","getChartImgUrl","_imgElement$src","imgElement","PublishOldButtonClickListener","dialogConfig","setDialogConfig","isCanvas","chartImgUrl","publishModalModule","publishModalAsyncModule","PublishDialog","publishChartHtmlElements","clickHandler","dataset","indexInt","IdeaDrawingsConfirmationOptions","IdeaLeaveDialog","actionCallback","Cancel","Override","Merge","Nothing","getChartElementTypeFromQueryType","queryType","_getChartElementTypeF","getChartElementTypeFromResponseType","TA","useChartRouteChange","isIdeasDialogOpen","dateFns","updateChartConfig","_ty","urlType","handleTypeChange","_decodedSearch$r$spli","urlTicker","urlTimeframe","urlDateRange","getInstrument","newChartConfig","getRawTickerForInstrument","updateAttributesAndSync","_chartLayoutModel$ide3","_chartLayoutModel$ide4","exitIdea","_window$FinvizSetting3","defaultPeriod","defaultDateRange","handleIdeaLeave","getUuid","ChartLayoutComponentBase","_this$model$activeCha2","AbortController","preserveDrawings","toolsState","handlePreserveDrawingsSettings","setPreserveDrawings","preserveDrawingAbortController","abort","URLSearchParams","tools_state","orientationChangeTimeout","setToolbarPosition","handleResize","throttledResize","modelAttrs","throttle","_this$state","_this$state2","test","getVisualViewportScale","visualViewport","noteDialogState","toggle","drawingToRemove","settingId","newObj","toggleHideDrawings","handleLockDrawings","_this$model$activeCha","updateLayout","prevModelWidth","prevTimeframeActiveChart","modelProperties","isHideDrawingsActive","isToolbarHorizontal","handleInitialPreserveDrawingsState","DELETE","getPaneWithSelection","keyCode","touchSize","onChartDestroy","onWindowResize","handleOrientationChange","checkTouchEventsDisabled","_this$model$activeCha3","_document$querySelect","quoteTimeframe","isQuoteForexFuturesCryptoPage","newIsToolbarHorizontal","innerWidth","renderToolbar","args","isOverlayToolbar","handleDrawingAction","handleDrawingsSetting","_this$props$idea2","newCharts","useGrid","isMobilePortrait","_this$props$idea","isSidebarEnabled","getIsSidebarEnabled","handleConfirmationDialogDeleteBtn","ChartGrid","_chartLayout$gridArea","ChartGridCell","Sidebar","onShouldResize","horizontal","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","withCompleteLayoutModelInit","updateChartsTitle","defaultDocumentTitleRef","percentageChange","useChartPageTitle","handleChartsUpdate","getChartLayoutWithChartRouteChange","withQuotePolling","isWithNotifications","parentElement","Wrapper","NotificationWrapper","ChartLayoutWithGlobalState","setChartLayoutModel","getChartLayoutModelConfig","lastGlobalRerender","onRegisterChartLayoutModel","getDefaultZoomFactor","OnInitListener","setIsInit","checkIfInitIsComplete","elementIndex","_config$charts$chartI","hasOwnProperty","opacity","_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","dark","isQuotePageWithDrawingsOff","getCookie","noteDrawing","ideaObject","newElements","ChartLayoutModel","getMaxDecayInterval","EliteStocksReduced","Free","pollingIntervalToCharts","setPollingIntervalToCharts","checkForChartsWithPolling","newPollingIntervalToCharts","chartRefreshInterval","_newPollingIntervalTo","intervalSubscriptions","checkForChartsWithPollingDebounced","chartsCheckerIntervalId","setInterval","clearInterval","timeoutDurations","allCharts","timeoutDurationsMin","timeoutSubscription","decay","maxDecayInterval","chartIds","quotesToUpdate","quoteToUpdate","dispatchEvent","Event","unsubscribe","getIdeaUrl","searchObject","isStockOnQute","path","queryString","IdeaItem","onIdeaDeleted","isDeleting","setIsDeleting","isConfirmDelete","setIsConfirmDelete","currentIdea","onDeleteIdeaClick","wasDeleted","fetch","status","newUrl","URL","searchParams","company","IdeasTabs","hasError","setHasError","hasFetched","setHasFetched","categorizedIdeas","setCategorizedIdeas","queryTickers","dateParts","processed","tickerIdeas","categorizeIdeas","fetchIdeas","handleIdeaDeleted","modifiedCategories","categoryIndex","updatedCategory","updatedAll","Tabs","TabList","category","Tab","Badge","TabPanel","toLowerCase","IdeasDialog","hasPadding","dropdownButtonClassName","tooltipState","useTooltipState","isAnyQuoteLoading","setIsAnyQuoteLoading","hideTooltip","dropdownItemProps","TooltipTrigger","checkIfAnyQuoteIsLoading","fetchingQuotes","hideOnClick","_layoutModel$idea","activeChartQuote","toJSON","chartId","layoutModelObjectPanes","tickersString","getChartTickers","quotesJsonString","quoteTickersTimeframes","getFormDataFromObject","ideaUrl","saveIdea","Tooltip","getIsMobileScreenSize","isDialogOpen","tour","useTour","pageTours","steps","overlayPadding","getTour","userTour","setCurrentTour","getStepsForUser","buttonTheme","hasNewTours","activeTour","startTour","once","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","maxWidth","canCropChart","fullChartWidth","marketMinutesLength","getFullChartWidth","offsetInPx","shouldCropChart","chartWidthWithOffset","offsetChartAfter","shouldAlignDaysToLeft","drawDaysInOneChart","getBarsInDay","_lastQuoteDate$getHou","lastQuoteDate","barsToOffset","getDayToOffset","offsetChartInPx","_quote$open","isStockIntraday","isIntradayDateRange","isOffScreen","isOffScreenWithNoDateRange","isOffScreenIntradayDateRange","isOffScreenWithFixedBars","isQuotePageWithNoDateRange","isQuotePageIntradayDateRange","isQuotePageWithFixedBars","getShouldOffsetChartDomain","scaleType","_perfChartInstance$ge","getChartElement","perfChartInstance","numOfBars","handleDomainOffset","currentScale","scaleCreator","protectedHeightPx","minPx","extendedMin","_ref11","rounded","fromEntries","_ref12","_ref13","_ref14","_ref15","_numOfDaysToRender","_quote$getBarsInDay","parsedRange","startQuoteDate","endQuoteDate","numOfDaysToRender","_reversedDaysInQuote$","_reversedDaysInQuote$2","reversedDaysInQuote","reverse","startQuoteDayIndex","endQuoteDayIndex","renderDateStart","renderDateEnd","getParsedDateRangeMetaData","_ref16","shouldRenderCross","DEFAULT_WIDTHS","DEFAULT_CONTEXT","activeModule","isCloseVisible","onResize","selectModule","SidebarContext","useSidebarContext","ModuleLoadFailed","DefaultErrorBoundary","portfolioWatchlistAsyncModule","SidebarModule","sidebarModules","portfolio","description","content","asyncModule","withInitialLoading","isComponentReady","setIsComponentReady","sidebarModule","withModuleAsyncLoad","mobile","SidebarTabs","showTimeout","vertical","isHideOnClick","SidebarContent","_width$min","_width$max","_width$default$mobile","_width$default","_width$default$deskto","_width$default2","defaultMobile","defaultDesktop","desktop","Resizable","enable","handleClasses","defaultSize","tabsClassName","sidebarModuleKey","setActiveModule","handleSelectModule","newUrlSearchParams","handleCloseSidebar","contextValue","ErrorBoundary","FallbackComponent","getInstrumentLabel","getResponseChartType","chartType","chartResponseType","tr","ChartEvent","getChartEventModel","chartEventModel","getXYPosition","_chartEventModel$yInd","_this$model$chart$quo","buffer","hover","isOpenOverride","isCurrentEventActive","scaledArea","Earnings","_this$getChartEventMo","eventItem","epsActual","epsEstimate","dateTimestamp","chartEventsByType","dividends","earnings","canvasElements","indicatorsByType","elementType","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","calculate","onValueCalculated","_calculatedValues","ema","calculatedValues","EMAConfig","_this$_calculatedValu","defaultCalculatedValues","getAllCalculatedValues","lastNItems","getCalculatedValues","getDbColumnName","IndicatorBaseConfig","ShrtflConfig","shortInterest","Shrtfl","ShrtraConfig","Shrtra","ADXConfig","_ADXConfig","Adx","MAX_POSITIVE_DEFAULT_VALUE","MAX_NEGATIVE_DEFAULT_VALUE","periodInt","getParsedIntegersFromPeriodString","Rvol","Atr","Aro","Mfi","Perf","Rmi","Rsi","Stofu","Ult","Macd","Rwi","Trix","Wr","Aroosc","Roc","Cci","Fi","INDICATOR_DEFAULT_DOMAIN","compute","renderIndicator","getIsChartPageSpecificFunctionality","renderLabel","isComputeNecessary","shouldUpdate","tickTextStep","formatAxis","valueY","_options$lastValueSuf","_IndicatorSettings$ri","_IndicatorSettings$ri2","_IndicatorSettings$ri3","_IndicatorSettings$ri4","_IndicatorSettings$ri5","_IndicatorSettings$ri6","_IndicatorSettings$ri7","_IndicatorSettings$ri8","lastValueSuffix","indicatorCurrentText","indicatorCurrentBackground","renderLabelChartsPage","renderLabelQuotePage","indicatorLabel","labelWidth","roundedRect","isPerfIndicator","renderCrossTextChartsPage","renderCrossTextQuotePage","getValueLabelsAtIndex","renderCrossTextValueLabels","crossValueText","lastRenderedIndex","getValueLabel","unit","getOversoldOverboughtValueLabelsAtIndex","renderOversoldOverbought","zero","drawLines","drawInVisibleAreaProps","fromIndexOffset","getCompensatedFirstBarToRenderIndex","clipHeight","firstIndex","firstFx","renderZeroLine","tickStep","newAttrs","parsePeriodInt","setModel","areNoBarsVisible","applyMinMaxPadding","getDomainDefaults","inputsErrorMessages","getIsValid","getIsNumberInputValid","integerOnly","isPositiveInteger","ADX","_this$adx$last","adx","amdm","apdm","mdi","pdi","atr","deltaHigh","deltaLow","pdm","mdm","di","getLineColors","lineColors","_this$period","AroConfig","_AroConfig","aroonUp","aroonDown","oscillator","AroonCalculation","highPeriod","highestInPeriod","periodSinceHigh","lastIndexOf","lowPeriod","lowestInPeriod","periodSinceLow","COLORS","Aroon","aroonCalculation","textLabels","labelSetting","ArooscConfig","AroonOscillator","_this$aroonCalculatio","_this$aroonCalculatio2","_this$aroonCalculatio3","_this$aroonCalculatio4","_this$aroonCalculatio5","ATRConfig","_ATRConfig","ATR","_this$atr$last","AverageTrueRange","CCIConfig","_CCIConfig","CommodityChannelIndex","_this$cci$last","smaCount","tp","cci","smaSum","devCount","typicalPrice","sma","devSum","dev","COTConfig","COT","cotQuoteCode","cot","commercialHedgers","largeTraders","smallTraders","secondarylabelX","secondarylabel","units","renderAdditionalLabels","fontSettings","FIConfig","_FIConfig","fi","FICalculation","ForceIndex","_this$fiCalculation$c2","_this$fiCalculation","_this$fiCalculation$c","fiCalculation","_this$fiCalculation$c3","_this$fiCalculation2","_this$fiCalculation$c4","_this$fiCalculation3","MACDConfig","_MACDConfig","fastPeriod","slowPeriod","signalPeriod","macd","signal","histogram","MACDCalculation","emaFast","emaSlow","emaSignal","macdCount","MACD","_this$macdCalculation","macdCalculation","signalLine","_this$fastPeriod","_this$slowPeriod","_this$signalPeriod","MFIConfig","_MFIConfig","MFI","_this$mfi$last","negativeMoneyFlow","mf","mfi","prevTypicalPrice","positiveMoneyFlow","moneyFlow","oldMF","NoneConfig","OBVConfig","Obv","OBV","_this$obv$last","obv","currentObv","PerfConfig","_PerfConfig","PricePerformance","hasCachedData","getTickersAndTimeframe","quoteSettings","getFromCacheSync","fetchedData","getAll","_this$model$scaleRang","_this$model$scaleRang2","_this$model$scaleRang3","_this$model$scaleRang4","firstVisibleBar","lastVisibleBar","lastValueIndex","lastTickerTimestamp","canUseCustomMinMax","domainDefaults","getTickers","getTickerColor","hasBackground","_this$perf$key$values","_this$perf$key","_margin$left","tickerValue","textPosX","textPosY","_this$indicatorLabelW","measuredWidth","indicatorLabelWidth","isVertical","labelBottom","canFitItemsVertically","_this$perf$key$values2","_this$perf$key2","tickerTextWidth","performanceIndicatorLabel","crossText","allTickers","_this$perf$ticker$val","_this$perf$ticker","_this$perf$ticker2","hasPatterns","chartUuid","canBeEmptyQuote","getSanitizedTicker","RMIConfig","_RMIConfig","momentum","RMI","_this$rmi$last","rmi","u","ad","au","sumu","sumd","rs","_this$momentum","ROCConfig","_ROCConfig","ROC","_this$roc$last","roc","RSIConfig","_RSIConfig","rsi","RsiCalculation","RSI","_this$rsiCalculation$","rsiCalculation","_this$rsiCalculation$2","_this$rsiCalculation","_this$rsiCalculation$3","_this$rsiCalculation2","RVOLConfig","_RVOLConfig","baseLine","DEFAULT_PARAMETERS","RelativeVolume","periodStr","parsePeriod","_this$rvol$last","rvol","baseLineY","_this$baseLine","RWIConfig","_RWIConfig","RWI","rwiHi","rwiLo","trSum","atrWeight","maxHi","maxLo","getComputedValuesAtDateIndex","financialAttachmentsData","_this$values","computedValues","getLastValue","getValueAtDataIndex","_values$value","_values","_vals","_vals$length","vals","shouldShowDate","isBeforeData","valueLabel","_this$getValueLabel","FinancialIndicator","dateIndex","_this$data$date$dateI","_this$data$date$dateI2","_timestampToFinancial","_timestampToFinancial2","_alignedFinancialAtta","timestampToFinancialsIndexesMap","alignedFinancialAttachmentsData","timestampKey","sourceIndexes","alignedData","lastBeforeDateFinancialsDataIndex","si","sharesFloat","sourceIndex","averageVolume","StofaConfig","_StofaConfig","Stofa","dPeriod","StofuConfig","_StofuConfig","kPeriod","Stochastics","_this$k$last","dCount","dSum","k1","kSum","kCount","highestHigh","lowestLow","_this$kPeriod","_this$dPeriod","StochasticsFast","StoslConfig","Stosl","StochasticsSlow","TRIXConfig","_TRIXConfig","trix","TrixCalculation","trippleEmaPeriod","ema1","ema2","ema3","ema1Count","ema2Count","ema3Count","_this$trixCalculation2","_this$trixCalculation3","_this$trixCalculation","trixCalculation","_this$trixCalculation4","_this$trixCalculation5","UltConfig","_UltConfig","period1","period2","period3","UltimateOscillator","_this$ult$last","bpSum2","bpSum3","count2","count3","trSum2","trSum3","ult","bp","avg2","avg3","bpSum1","trSum1","count1","avg1","_this$period2","_this$period3","VolConfig","Volume","_this$data$volume$las","WRConfig","_WRConfig","WilliamsR","_this$r$last","none","aro","aroosc","rwi","stofa","stofu","stosl","vol","wr","shrtfl","shrtra","financialIndicators","getWatchedPropValue","watchedProp","spineObject","getIsSpineObject","hasToObject","getJSONReplacerFunc","getWatchedProps","getAreWatchedPropsEqual","currentValue","previousValue","DEFAULT_SPINE_EVENTS","DefaultSpineEvents","stringifiedOptions","useForceUpdate","watchedPropertiesRef","handleModelChange","_watchedPropertiesRef","isArray","spineEvents","hasMany","getChartType","_this$getChartElement","defaultRefreshInterval","Default","customRefreshInterval","Elite","isStockFastRefreshAvailable","omitKeys","_this$quote","getIsScrollable","_this$quote$COTs","perfQuotes","quotePerfTickers","quotePerf","_this$getChartElement2","_paneProperties$eleme","_paneModel$mainElemen","chartOrIndicator","attrsInSync","ChartPartToAttrsSyncMap","modelAttr","chartParts","isInSync","chartPart","_hasOverlay","isFinancialIndicator","quoteFinancialAttachments","quoteFinancialAttachment","_this$quote$getRawTic","_this$quote2","shouldClear","allChartEvents","Crosshair","drawingsInternalStoreModel","_this$syncChartParts$","_this$syncChartParts","chartPartsToSync","newSyncedChartParts","_this$syncChartParts2","_this$charts$first","_this$idea$id","_this$idea","normalizeHexAlpha","hexString","customColors","customColorKeys","defaultColors","chartLightTheme","chartDarkTheme","aftermarketFade","crossTextBackground","gridSecondary","negativeChange","overlayTransparentBackground","positiveChange","premarketFade","indicatorLightTheme","indicatorDarkTheme","elementLightTheme","elementDarkTheme","generalColors","_attrs$elements","_attrs$instanceUUID","_attrs$latestLocalUpd","_attrs$latestRemoteUp","_attrs$autoSaveState","newAutoSaveState","_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","getIsChartType","_this$instance2","_this$instance3","isOverlay","_this$instance4","_this$instance5","_this$instance6","_this$instance7","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$","_mainElement","_this$mainElement","resetHeight","allPaneElements","rebuildElementZIndexes","hoveredChartEvent","openedChartEvent","hoveredTypeChartEventElements","openedTypeChartEventElements","nonActiveChartEventElements","chartEventsOnSameXPoint","chartEvent_B","isOpened","isHoveredType","isOpenType","quoteCache","getCachedQuote","cachedAt","setCachedQuote","_quoteCache$cid","computableKeys","_Quote$select$","tickerRaw","doesQuoteAndFetchParamsMatch","isSameOrNoChartUuid","is404","isNotEmptyQuote","isCacheAllowed","_options$financialAtt","_options$financialAtt2","financialAttachment","_quote$financialAttac","doesQuoteAndOptionsMatch","_options$financialAtt3","shouldUseCache","getResolvedFetchingPromise","numberOfRefreshChecks","premarketLengthMinutes","aftermarketLengthMinutes","patternsMinRange","patternsMaxRange","dataId","maxBars","tickersAndTimeframes","accumulator","fetchRequest","QuoteFetchTypeUrlOption","New","fetchingPromise","getUrl","NotFoundError","getIsAbortError","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","_atts$fetchedAt","_this$patterns","drawDays","getBarIndexes","_this$barIndex","alignAllFinancialAttachmentsDataWithQuoteDates","_chartEvents$map","getChartEventsWithId","_this$financialAttach","alignFinancialAttachmentsDataWithQuoteDates","_this$financialAttach2","lastDateIndex","firstDate","matchingQuoteTimestamp","parsedDate","convertedDateToNyTimestamp","dateDate","isSameDay","clearCachedData","deleteCachedQuote","cachedHeikinAshiData","HAClose","heikAshiData","cachedDayToOffset","dayToOffset","lastDay","dateStringFromDate","yyyy","mm","dd","padStart","_quoteData$dataIndex","cachedDateToIndex","getTimestampFromPositionX","_this$financialAttach3","host","env","BE_API_URL","rev","clearData","largeChartFontSize","INTERACTIVE_CHART_SETTINGS","tickerTimeframeChangeHeight","chartSettings","colorsOverride","settingColors","_config$charts","isLight","getNormalizedZIndex","BaseConfig","_EMAConfig","Ema","OverlayBaseConfig","BBConfig","_BBConfig","Bb","deviations","topColor","bottomColor","upperBand","lowerBand","BbCalculation","stdDev","initialPeriodIndex","stdDevSum","getFreeColor","periods","getRGBAValueFromValidColorString","OverlayConfig","BB_COLORS","TOP","BOTTOM","MIDDLE","BollingerBands","scaledTop","scaledBottom","firstBarToRender","lastBarToRender","bbCalculation","_this$attrs$period","_this$attrs$deviation","_this$attrs$topColor","_this$attrs$bottomCol","DchConfig","Dch","channelStrokeColor","channelFillColor","medianBandColor","DonchianChannels","medianBand","_this$attrs$channelSt","_this$attrs$channelFi","_this$attrs$medianBan","EMA","_this$attrs$color","EMA2Config","Ema2","EMA2","HILOConfig","Hilo","highColor","lowColor","HighLow","prevHigh","prevLow","prevBar","_this$attrs$highColor","_this$attrs$lowColor","HLineConfig","Hline","isPositiveFloat","ICConfig","_ICConfig","Ic","conversion","spanB","spanAStrokeColor","spanAFillColor","spanBStrokeColor","spanBFillColor","conversionLineColor","baseLineColor","laggingSpanColor","Stroke","Fill","Conversion","Base","SpanB","IchimokuCloud","_this$data$barIndex$x","outsideBar","renderFull","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","ICFConfig","Icf","IchimokuCloudFull","KCHConfig","_KCHConfig","Kch","emaPeriod","atrPeriod","strokeColor","fillColor","KeltnerChannel","middleLine","_this$attrs$emaPeriod","_this$attrs$multiplie","_this$attrs$atrPeriod","_this$attrs$strokeCol","_this$attrs$fillColor","PatternsConfig","Patterns","supportColor","resistColor","originalScale","barsInDay","aboveBelow","textHS","above","below","kind","_this$attrs$supportCo","_this$attrs$resistCol","Calculation","PPConfig","Pp","calculationType","PivotPeriod","PivotPoints","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","SARConfig","_SARConfig","Sar","maxStep","risingColor","fallingColor","SAR","isLong","sar","ep","newHigh","newLow","af","sarToDraw","_this$attrs$step","_this$attrs$maxStep","_this$attrs$risingCol","_this$attrs$fallingCo","customizable","SMAConfig","_SMAConfig","Sma","SMACalculation","SMA","SMA2Config","Sma2","SMA2","StrConfig","_StrConfig","Str","uptrendColor","downtrendColor","Supertrend","finalUpperBand","finalLowerBand","supertrend","avg","_this$attrs$uptrendCo","_this$attrs$downtrend","VPConfig","Vp","upColor","downColor","VP_COLORS","applyOpacityToColor","VolumeProfile","_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","VWAPConfig","_VWAPConfig","Vwap","vwap","VWapCalculation","cumulativePV","cumulativeVolume","second","datesAreOnSameDay","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","dateFromDateString","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","formattedDate","formatDateToStringUS","getEarningsDateSuffix","getFormattedValue","bigNumberUnit","maxDecimalPlaces","numberString","bigNumber","substring","wholeNumber","decimalNumber","formattedDecimalNumber","getChartEventBageColors","twColors","chartLayoutSettings","isXPointVisible","renderXAxisLabels","labels","allowedOverflow","sortedLabels","renderedLabelRanges","newLabel","hasPriority","halfOfTextWidth","overflowLeft","overflowRight","labelX","getIsOverlapping","getSize","paddingX","paddingY","render15MinXAxis","startBarIndex","endBarIndex","indexOffset","SMALL_INDEX_CHART_LABEL_BUFFER","renderIntradayXAxis","marketStartHour","marketEndHour","dayIndex","roundedX","renderTimeframeXAxisProps","lastHours","renderIntradayXAxisFutures","renderDailyXAxis","isYearLabel","renderWeeklyXAxis","lastYear","isJanuary","renderMonthlyXAxis","n0","n1","x0","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","upperIndex","isWithinRangeOfQuoteDate","commonVirtualCacheProps","cachedDates","virtualDateSeconds","getCachedVirtualDates","timeframeSeconds","numOfDatesBefore","numOfDatesAfter","virtualTradedDays","dateStartSeconds","dateEndSeconds","datesSeconds","isStartBeforeDates","isEndAfterDates","dateTime","getVirtualTradedDays","marketStartSeconds","barTimeframeSeconds","quoteDatesTimestampOffset","dayStartSeconds","barSeconds","virtualTimeframeTradedDates","isLowerBounded","isOneBeforeLowerBoundStarts","isLookingBack","averageBarDate","numOfSecondsOutOfBounds","_perfIndicatorElement","_perfIndicatorElement2","perfIndicatorElement","getPerfIndicatorTickerAndTimeframes","resolve","_ref17","getPriceForPane","isXAxisInView","domainRange","priceFy","YAxisLeftMargin","getCrossText","_getRoundDecimalPlace","firstBarClose","_ref18","_ref19","_ref20","changePercent","changePercentString","_ref21","isForexFuturesCryptoPage","_ref22","isForexFuturesCrypto","isOffscreenChartWithNarrowBars","_ref23","_ref24","_indicatorsByType$con","_indicatorsByType","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","parsedNumber","MAX_SAFE_INTEGER","visited","WeakSet","toLocaleDateString","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","getRandomValues","Uint8Array","two","local","remote","useChartLayoutGlobalModelModule","useChartLayoutGlobalModel"],"sourceRoot":""}