{"version":3,"file":"255.02dde02b.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/main/components/portfolio/async-modules.ts","webpack://@finviz/website/./js/main/hooks/use-window-size.tsx","webpack://@finviz/website/./js/main/modules/create-alert/async-modules.ts","webpack://@finviz/website/./js/main/modules/save-to-portfolio/async-modules.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/avwap/avwap_v1.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/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/helpers/getGetChartBarsBuffer.ts","webpack://@finviz/website/../charts/app/controllers/autosave/constants.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-drawing-autosave-api.tsx","webpack://@finviz/website/../charts/app/utils/string-byte-length.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-drawing-auto-save-controls.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-is-auto-save-active.ts","webpack://@finviz/website/../charts/app/controllers/autosave/with-auto-save.tsx","webpack://@finviz/website/../charts/app/utils/use-prev-state.ts","webpack://@finviz/website/../charts/app/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/utils/use-is-mounted.ts","webpack://@finviz/website/../charts/app/controllers/pane/MainChartDataLoader.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/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/with-chart-init.tsx","webpack://@finviz/website/../charts/app/controllers/chart/chart.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/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/atr.ts","webpack://@finviz/website/../charts/app/indicator-calculation/ema.ts","webpack://@finviz/website/../charts/app/indicator-calculation/main.ts","webpack://@finviz/website/../charts/app/indicator-calculation/sma.ts","webpack://@finviz/website/../charts/app/indicator-calculation/vwap.ts","webpack://@finviz/website/../charts/app/indicators/configs/atr.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/indicator-calculation/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/atr.ts","webpack://@finviz/website/../charts/app/indicators/configs/cci.ts","webpack://@finviz/website/../charts/app/indicator-calculation/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/indicator-calculation/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/indicator-calculation/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/indicator-calculation/rmi.ts","webpack://@finviz/website/../charts/app/indicators/rmi.ts","webpack://@finviz/website/../charts/app/indicators/configs/roc.ts","webpack://@finviz/website/../charts/app/indicator-calculation/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/indicator-calculation/rvol.ts","webpack://@finviz/website/../charts/app/indicators/rvol.ts","webpack://@finviz/website/../charts/app/indicators/configs/rwi.ts","webpack://@finviz/website/../charts/app/indicator-calculation/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/indicator-calculation/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/indicator-calculation/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/indicator-calculation/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/helpers/getQuoteOptionsForDateRange.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/quote/constants.ts","webpack://@finviz/website/../charts/app/models/quoteCache.ts","webpack://@finviz/website/../charts/app/models/quote/quote.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/sma.ts","webpack://@finviz/website/../charts/app/overlays/configs/vwap.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/indicator-calculation/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/indicator-calculation/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/indicator-calculation/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/indicator-calculation/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/indicator-calculation/pp.ts","webpack://@finviz/website/../charts/app/overlays/pp.ts","webpack://@finviz/website/../charts/app/overlays/configs/sar.ts","webpack://@finviz/website/../charts/app/indicator-calculation/sar.ts","webpack://@finviz/website/../charts/app/overlays/sar.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/vwap.ts","webpack://@finviz/website/../charts/app/overlays/overlays.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/getChartLayoutSizeConfig.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: () => {\r\n this.instance.model\r\n .chart()\r\n .chart_layout()\r\n .getAllPanes()\r\n .forEach((pane) => {\r\n const chartEventModel = pane.getAllChartEvents(false)[0]\r\n chartEventModel?.instance.trigger('change', this)\r\n })\r\n },\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 portfolioWatchlistTableAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist-table\" */ './PortfolioWatchlistTable'),\r\n cacheKey: 'portfolio-watchlist-table',\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\ninterface Props {\r\n throttleWaitInMs?: number\r\n isWatching?: boolean\r\n}\r\n\r\nexport function useWindowSize({ throttleWaitInMs = 300, isWatching = true }: Props = {}) {\r\n const [size, setSize] = React.useState({\r\n clientWidth: document.documentElement.clientWidth,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isWatching) return\r\n\r\n const handleResize = throttle(() => {\r\n setSize({\r\n clientWidth: document.documentElement.clientWidth,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n }, throttleWaitInMs)\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n handleResize.cancel()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [throttleWaitInMs, isWatching])\r\n\r\n return size\r\n}\r\n","export const createAlertAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"create-alert\" */ './DialogContent'),\r\n cacheKey: 'create-alert',\r\n}\r\n","export const saveToPortfolioAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"save-to-portfolio\" */ './DialogContent'),\r\n cacheKey: 'save-to-portfolio',\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

(Component: React.ComponentType

, fallback: React.ReactNode = null) {\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 description: 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 description() {\r\n return (this.constructor as typeof ElementBaseConfig).description\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, TextBaseline } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport { VWapCalculation } from '../../indicator-calculation/vwap'\r\nimport Chart from '../../models/chart'\r\nimport { elementDarkTheme } from '../../models/constants'\r\nimport PaneModel from '../../models/pane'\r\nimport { convertColorToHEX, getIsColorTooLightOrTransparent, hexStringToRGBA } from '../../utils/colors'\r\nimport Element from '../element'\r\nimport Text from '../text'\r\nimport Thumb from '../thumb'\r\n\r\nconst DEFAULT_DECIMAL_PLACES = 2\r\n\r\nexport interface IAVWAPAttrs {\r\n x: number\r\n y: number\r\n lineWidth: number\r\n border: DrawingBorder\r\n}\r\n\r\nclass AVWAP extends Element {\r\n static type = CanvasElementType.avwapV1\r\n\r\n name = 'Anchored VWAP'\r\n decimalPlaces = DEFAULT_DECIMAL_PLACES\r\n avwapPath: [number, number][] = []\r\n scaledAvwapPath: [number, number][] = []\r\n declare vwapCalculation: VWapCalculation\r\n declare prevX: number\r\n declare quoteFetchedAt: number\r\n declare labelColor: {\r\n fillStyle: string\r\n background: string\r\n }\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.updateDecimalPlaces()\r\n this.computeAvwapPath()\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n\r\n const labelBackgroundColor = convertColorToHEX(this.attrs.border.color, false)\r\n const isTooLight = getIsColorTooLightOrTransparent(hexStringToRGBA(labelBackgroundColor))\r\n this.labelColor = {\r\n fillStyle: isTooLight ? '#000' : '#fff',\r\n background: labelBackgroundColor,\r\n }\r\n\r\n return this\r\n }\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 computeAvwapPath() {\r\n const quote = this.model.chart().quote()\r\n if (!quote || (this.prevX === this.attrs.x && this.quoteFetchedAt === quote.fetchedAt)) return\r\n\r\n this.avwapPath = []\r\n this.quoteFetchedAt = quote.fetchedAt\r\n this.prevX = this.attrs.x\r\n const barIndex = Math.max(Math.round(this.model.scale.x.invert(this.fx(this.attrs.x))), 0) // depending on timeframe and attrs.x, barIndex may be negative but we have lower boundary of 0\r\n const dataIndex = quote.barToDataIndex[Math.min(barIndex, quote.barToDataIndex.length - 1)]\r\n\r\n this.vwapCalculation = new VWapCalculation({\r\n quote,\r\n options: { period: 5 }, // VWAP period is unused parameter, TS requires it due MainCalculation\r\n })\r\n this.vwapCalculation.calculateFrom(dataIndex, false)\r\n\r\n for (let i = barIndex; i < quote.barToDataIndex.length; i++) {\r\n this.avwapPath.push([i, this.vwapCalculation.calculatedValues.vwap[quote.getDataIndexByBarIndex(i)]])\r\n }\r\n\r\n if (this.avwapPath[0]) this.attrs.y = this.avwapPath[0][1]\r\n\r\n this.scaleAvwapPath(true)\r\n }\r\n\r\n scaleAvwapPath(forceRecalculate = false) {\r\n if (\r\n !forceRecalculate &&\r\n this.scaledAvwapPath?.[0]?.[1] === this.fy(this.avwapPath?.[0]?.[1]) &&\r\n this.scaledAvwapPath?.[0]?.[0] === this.fx(this.avwapPath?.[0]?.[0])\r\n )\r\n return\r\n\r\n this.scaledAvwapPath = this.avwapPath.map(([x, y]) => [this.fx(x), this.fy(y)])\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: elementDarkTheme.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n this.computeAvwapPath()\r\n this.scaleAvwapPath() // Called again after computeAvwapPath to handle axis scale changes that may have occurred\r\n\r\n context.beginPath()\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n this.scaledAvwapPath.forEach(([x, y]) => context.lineTo(x, y))\r\n context.stroke()\r\n\r\n if (this.getShouldRenderThumbs() || this.avwapPath.length === 0) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n renderLabels(context: CanvasRenderingContext2D) {\r\n const lastAvwapPointIndex = this.scaledAvwapPath.length - 1\r\n if (lastAvwapPointIndex > 0) {\r\n this.updateDecimalPlaces()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const settings = 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.scaledAvwapPath[lastAvwapPointIndex][1],\r\n font: { size: 8, weight: '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: this.labelColor.fillStyle,\r\n background: this.labelColor.background,\r\n textBaseline: TextBaseline.middle,\r\n text: this.avwapPath[lastAvwapPointIndex][1].toFixed(this.decimalPlaces).toString(),\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n return [\r\n new Thumb(\r\n 'avwap',\r\n () => this.attrs.x,\r\n () => this.attrs.y,\r\n this.moveByThumb,\r\n this.model\r\n ),\r\n ]\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n\r\n for (let i = 0; i < this.scaledAvwapPath.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: this.scaledAvwapPath[i][0],\r\n y1: this.scaledAvwapPath[i][1],\r\n x2: this.scaledAvwapPath[i + 1][0],\r\n y2: this.scaledAvwapPath[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 moveByThumb = ({ difX }: RequireByKey) => this.moveBy(difX)\r\n\r\n moveBy(x: number) {\r\n this.attrs.x += x\r\n }\r\n\r\n getEdgeXYValues() {\r\n return {\r\n minX: this.avwapPath?.[0]?.[0],\r\n maxX: this.avwapPath?.[this.avwapPath.length - 1]?.[0],\r\n minY: this.avwapPath?.[0]?.[1],\r\n maxY: this.avwapPath?.[this.avwapPath.length - 1]?.[1],\r\n }\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n this.computeAvwapPath()\r\n if (this.avwapPath.length > 0) {\r\n return super.getIsInChartView(chart)\r\n }\r\n return true\r\n }\r\n}\r\n\r\nAVWAP.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default AVWAP\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 avwap_v1 from './avwap/avwap_v1'\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.arrow]: arrow,\r\n [CanvasElementType.avwapV1]: avwap_v1,\r\n [CanvasElementType.brushV1]: brush_v1,\r\n [CanvasElementType.calloutV1]: callout_v1,\r\n [CanvasElementType.curve]: curve,\r\n [CanvasElementType.element]: element,\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\nexport type NumOfBarsChartPaneElementArgs = { timeframe: TIMEFRAME } & RequireByKey<\r\n ChartConfigChartPaneElement,\r\n 'overlays'\r\n>\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(_?: NumOfBarsChartPaneElementArgs | RequireByKey) {\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, weight: '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, weight: '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, weight: '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, weight: '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?: 'normal' | 'italic'\r\n weight?: 'normal' | 'bold' | '900'\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 TextAttrs,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Cache from '../canvas/cache'\r\nimport Element, { NumOfBarsChartPaneElementArgs } 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 { IChartSettings, 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, timeframe }: NumOfBarsChartPaneElementArgs) {\r\n return Math.max(\r\n 0,\r\n ...overlays.map((overlay) => overlaysByType[overlay.type].getNumOfBarsBuffer({ ...overlay, timeframe }))\r\n )\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 initTickerText(chartSettings: IChartSettings) {\r\n const { Colors } = chartSettings.general\r\n const text = this.data.name || this.data.ticker\r\n const isSmallIndexChart = getIsSmallIndexChart(this.specificChartFunctionality)\r\n const font: TextAttrs['font'] = isSmallIndexChart\r\n ? { size: FONT_SIZE.L, weight: 'bold' }\r\n : Text.getMergedPropsWithDefaults('font', chartSettings.top.ticker.font)\r\n this.tickerText = new Text(\r\n {\r\n text,\r\n x: chartSettings.top.ticker.margin.left,\r\n y: chartSettings.top.ticker.margin.top,\r\n fillStyle: Colors.text,\r\n font,\r\n ...(!isSmallIndexChart ? { textBaseline: chartSettings.top.baseline } : {}),\r\n },\r\n this.paneModel\r\n )\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings, isOurSiteRequest } = this.getChartLayoutSettings()\r\n context.save()\r\n context.translate(ChartSettings.left.width, 0)\r\n\r\n this.initTickerText(ChartSettings)\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, weight: '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, weight: '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 const volumes = areNoBarsVisible\r\n ? [this.data.volume[firstBarToRenderIndex.dataIndex], this.data.volume[lastBarToRenderIndex.dataIndex]]\r\n : this.data.volume.slice(firstBarToRenderIndex.dataIndex, lastBarToRenderIndex.dataIndex + 1)\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.dataIndex]\r\n max = this.data.high[lastBarToRenderIndex.dataIndex]\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.dataIndex]\r\n } else {\r\n for (let i = firstBarToRenderIndex.dataIndex; i <= lastBarToRenderIndex.dataIndex; 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.dataIndex]\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 { RendererChartBarProps } from '../../types/shared'\r\nimport { NumOfBarsChartPaneElementArgs } from '../canvas/element'\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(obj: NumOfBarsChartPaneElementArgs) {\r\n return Math.max(1, super.getNumOfBarsBuffer(obj))\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 { RendererChartBarProps } from '../../types/shared'\r\nimport { NumOfBarsChartPaneElementArgs } from '../canvas/element'\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(obj: NumOfBarsChartPaneElementArgs) {\r\n return Math.max(1, super.getNumOfBarsBuffer(obj))\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, weight: '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, weight: '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, weight: '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","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 { useWindowSize } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport { ChartConfigChartPane } from '../../../types/shared'\r\nimport { ChartsOrQuotePageQueryParams, IndicatorType, 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 { prefetchPerfIndicatorAllQuotes } from '../../utils/chart'\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 quoteModel = useModelState(chartModel?.quote() ?? null, {\r\n watchProperties: ['fetchingState'],\r\n })\r\n const chartLayoutModel = useModelState(chartModel?.chart_layout() ?? null, {\r\n watchProperties: ['idea', 'settings'],\r\n })\r\n const isQuoteOrQuoteFinancials =\r\n !!chartLayoutModel &&\r\n [SpecificChartFunctionality.quotePage, SpecificChartFunctionality.quoteFinancials].includes(\r\n chartLayoutModel.specificChartFunctionality\r\n )\r\n const { innerWidth } = useWindowSize({ isWatching: isQuoteOrQuoteFinancials })\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 chartLayoutModel.updateSizeSettingsForTimeframe(quote.timeframe)\r\n chart.updateAttributes({ leftOffset: getLeftOffset({ quote, chartModel: chart }), quote })\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.getIsFetching() &&\r\n chartModel.chart_layout().isIdeaId(quote.ideaID)\r\n ),\r\n })\r\n\r\n const options = {\r\n ...chartModel.getQuoteBarsBufferAndCount(),\r\n premarket,\r\n aftermarket,\r\n patterns,\r\n fetchNewDataOnCachedQuote: true,\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 events: hasChartEvents,\r\n financialAttachments: chartModel.getQuoteFinancialAttachments(),\r\n cachePredicate: (quote) => quote.ideaID === undefined,\r\n },\r\n abortController,\r\n })\r\n\r\n const panesWithPerfIndicator = chartModel\r\n .getAllPanes()\r\n .filter((pane) => pane.getAllElements().some((element) => element.instance.type === IndicatorType.Perf))\r\n\r\n if (panesWithPerfIndicator) {\r\n await Promise.allSettled(\r\n panesWithPerfIndicator.map((paneWithPerfIndicator) =>\r\n prefetchPerfIndicatorAllQuotes({\r\n paneWithPerfIndicator: paneWithPerfIndicator.toConfig() as ChartConfigChartPane,\r\n timeframe,\r\n options,\r\n })\r\n )\r\n )\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 recalculateBarSizesAndLeftOffset = () => {\r\n const chart = chartModelRef.current\r\n\r\n if (chartLayoutModel && chart && !isIdeaChart) {\r\n const quote = chart?.quote()\r\n const shouldRecalculateLeftOffset = chartLayoutModel.updateSizeSettingsForTimeframe(quote.timeframe)\r\n if (shouldRecalculateLeftOffset || isQuoteOrQuoteFinancials) {\r\n const leftOffset = getLeftOffset({ quote, chartModel: chart })\r\n chart.updateAttributes({ leftOffset })\r\n }\r\n }\r\n }\r\n\r\n const quote = chartModel?.quote()\r\n let prevPremarket = quote?.premarket\r\n let prevAftermarket = quote?.aftermarket\r\n const handleQuoteChange = (updatedQuote: Quote) => {\r\n if (updatedQuote.premarket !== prevPremarket || updatedQuote.aftermarket !== prevAftermarket) {\r\n recalculateBarSizesAndLeftOffset()\r\n prevPremarket = updatedQuote.premarket\r\n prevAftermarket = updatedQuote.aftermarket\r\n }\r\n }\r\n\r\n recalculateBarSizesAndLeftOffset()\r\n\r\n quote?.bind(QuoteFetchType.Refetch, handleQuoteChange)\r\n\r\n return () => {\r\n quote?.unbind(QuoteFetchType.Refetch, handleQuoteChange)\r\n }\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 }, [quoteModel?.id, chartLayoutModel?.settings, innerWidth, isIdeaChart])\r\n\r\n return {\r\n isLoading: isLoading || !!(chartModel?.dateRange && quoteModel?.getIsFetching(QuoteFetchType.Older)),\r\n }\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 { CustomSpineEvents, 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 (props.element.model.getIsIndicatorPane?.()) {\r\n props.element.model.chart().trigger(CustomSpineEvents.IndicatorsChange)\r\n }\r\n\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 { ChartConfigChartPane } from '../../types/shared'\r\nimport { TIMEFRAME } from '../constants/common'\r\nimport { getCanvasElementByType } from './get-canvas-element-by-type'\r\n\r\nexport const getChartBarsBuffer = ({ panes, timeframe }: { panes: ChartConfigChartPane[]; timeframe: TIMEFRAME }) => {\r\n const maxNumOfBarsBuffer =\r\n panes\r\n .flatMap(({ elements }) => elements)\r\n .reduce((acc: number, element) => {\r\n const barsBuffer = getCanvasElementByType(element.type).getNumOfBarsBuffer({\r\n ...element,\r\n overlays: element.overlays!,\r\n // There has to be || because some e.g. ideas may have empty string periods\r\n period: element.period || '0',\r\n timeframe,\r\n })\r\n // If element period is edited to '', value will be parsed as NaN, and Math.max(NaN, {anyNumber}) will return NaN\r\n return Number.isNaN(barsBuffer) ? acc : Math.max(barsBuffer, acc)\r\n }, 0) + 1 // we add 1 to barsBuffer so we can ensure lines continuity on offscreen charts\r\n\r\n return maxNumOfBarsBuffer\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 TickerSearch,\r\n createAlertAsyncModule,\r\n getCurrency,\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}&c=${getCurrency(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","// 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 { Spinner } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { ChartConfigChartPane, CustomSpineEvents } from '../../../types/shared'\r\nimport { IndicatorType } from '../../constants/common'\r\nimport { getChartBarsBuffer } from '../../helpers/getGetChartBarsBuffer'\r\nimport PricePerformance from '../../indicators/perf'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Chart from '../../models/chart'\r\nimport { CHART_BARS_BUFFER_IN_PX } from '../../models/constants'\r\nimport MouseModel from '../../models/mouse'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport { getBarWidthWithMargin } from '../../utils/chart'\r\nimport { useIsMounted } from '../../utils/use-is-mounted'\r\nimport { getLeftOffset, getMinMaxLeftOffset } from '../renderUtils'\r\n\r\ninterface LoadLatestDataButtonProps {\r\n chartModel: Chart\r\n}\r\n\r\nconst BIND_EVENTS = `change ${CustomSpineEvents.OverlaysChange} ${CustomSpineEvents.IndicatorsChange}`\r\n\r\nexport function MainChartDataLoader({ chartModel: chartModelUnwatched }: LoadLatestDataButtonProps) {\r\n const getIsMounted = useIsMounted()\r\n const chartModel = useModelState(chartModelUnwatched, { watchProperties: ['quote'] })\r\n const quoteModel = useModelState(chartModel.quote(), { watchProperties: ['fetchingState', 'hasReachedEnd'] })\r\n const wrapperRef = React.useRef(null)\r\n\r\n React.useEffect(() => {\r\n if (chartModelUnwatched.getAllQuotes().every((quote) => quote.hasReachedEnd)) {\r\n return\r\n }\r\n\r\n const handleChartChange = (chartModel: Chart = chartModelUnwatched) => {\r\n if (!getIsMounted()) {\r\n return\r\n }\r\n\r\n const barsBuffer = getChartBarsBuffer({\r\n panes: chartModel.getAllPanes().map((pane) => pane.toConfig() as ChartConfigChartPane),\r\n timeframe: chartModel.timeframe,\r\n })\r\n\r\n if (barsBuffer !== chartModel.barsBuffer) {\r\n chartModel.updateAttribute('barsBuffer', barsBuffer)\r\n return\r\n }\r\n\r\n const chartLayout = chartModel.chart_layout()\r\n const barWidth = getBarWidthWithMargin({\r\n chartLayout,\r\n zoomFactor: chartModel.zoomFactor,\r\n })\r\n\r\n const mainQuote = chartModel.quote()\r\n wrapperRef.current?.style.setProperty(\r\n '--leftOffset',\r\n `${Math.min(mainQuote.barIndex[0] * barWidth + chartModel.leftOffset, CHART_BARS_BUFFER_IN_PX)}px`\r\n )\r\n\r\n const quoteBarsBufferAndCount = chartModel.getQuoteBarsBufferAndCount()\r\n const isLoadAll =\r\n quoteBarsBufferAndCount.dateFrom === undefined && quoteBarsBufferAndCount.barsCount === undefined\r\n const bufferInPx = (quoteBarsBufferAndCount.leftBuffer ?? 0) * barWidth\r\n\r\n const perfIndicatorInstances = chartModel\r\n .getAllElements()\r\n .filter(({ instance }) => instance.type === IndicatorType.Perf)\r\n .map((element) => element.instance as unknown as PricePerformance)\r\n const perfIndicatorTickers = perfIndicatorInstances.flatMap((instance) =>\r\n Object.values(instance.quotes).map(({ ticker }) => ticker)\r\n )\r\n\r\n chartModel.getAllQuotes().forEach((quote) => {\r\n const isTickerInChart =\r\n chartModel.ticker === quote.getRawTicker() || perfIndicatorTickers.includes(quote.ticker)\r\n const isChartTimeframe = chartModel.timeframe === quote.timeframe\r\n if (quote.hasReachedEnd || quote.hasError || !isTickerInChart || !isChartTimeframe) {\r\n return\r\n }\r\n\r\n const isMainQuote = quote.eql(mainQuote)\r\n const firstBarIndex = isMainQuote ? mainQuote.barIndex[0] : mainQuote.getPositionXFromTimestamp(quote.date[0])\r\n const scrolledInBuffer = bufferInPx + chartModel.leftOffset + firstBarIndex * barWidth\r\n if (\r\n (isLoadAll || scrolledInBuffer >= 0) &&\r\n !quote.getIsFetching([QuoteFetchType.Refetch, QuoteFetchType.DataChangeRefetch, QuoteFetchType.Older])\r\n ) {\r\n if (isMainQuote) {\r\n window.gtag?.('event', 'load-previous-data', { event_label: chartLayout.specificChartFunctionality })\r\n }\r\n const oldMaxBarIndex = quote.barIndex[quote.open.length - 1]\r\n\r\n quote\r\n .fetchOlderData(\r\n isLoadAll ? undefined : { barsCount: Math.max(Math.ceil(scrolledInBuffer / barWidth), 100) }\r\n )\r\n ?.then(() => {\r\n if (!getIsMounted()) {\r\n return\r\n }\r\n const chartModelsUsingTheQuote = chartModel\r\n .chart_layout()\r\n .getAllCharts()\r\n // Chart quote can be null if chart has just mounted and quote object is not available yet (loading), or chart is unmounting\r\n .filter((chart) => chart.quote()?.eql(quote))\r\n\r\n chartModelsUsingTheQuote.forEach((chartModel) => {\r\n const newQuote = chartModel.quote()\r\n const newBarWidth = getBarWidthWithMargin({\r\n chartLayout: chartModel.chart_layout(),\r\n zoomFactor: chartModel.zoomFactor,\r\n })\r\n const oldMaxLeftOffset = oldMaxBarIndex * newBarWidth\r\n const lastBarIndex = newQuote.barIndex[newQuote.open.length - 1]\r\n const newMaxLeftOffset = lastBarIndex * newBarWidth\r\n\r\n chartModel.updateAttributes({\r\n leftOffset: chartModel.isScrolled\r\n ? getMinMaxLeftOffset({\r\n newLeftOffset: chartModel.leftOffset - (newMaxLeftOffset - oldMaxLeftOffset),\r\n chartModel,\r\n barIndex: lastBarIndex,\r\n })\r\n : getLeftOffset({\r\n quote,\r\n chartModel,\r\n }),\r\n })\r\n\r\n chartModel.getAllPanes().forEach((pane) => {\r\n if (MouseModel.position && MouseModel.pane()?.eql(pane)) {\r\n MouseModel.updateAttributes({\r\n position: {\r\n ...MouseModel.position,\r\n x: MouseModel.position.x + (lastBarIndex - oldMaxBarIndex),\r\n },\r\n })\r\n }\r\n\r\n pane.getAllElements().forEach((element) => {\r\n if (element.isDrawing()) {\r\n element.instance?.updateScales()\r\n }\r\n })\r\n })\r\n })\r\n\r\n perfIndicatorInstances.forEach((instance) => {\r\n void instance.compute(true)\r\n })\r\n\r\n setTimeout(() => {\r\n handleChartChange(chartModelUnwatched)\r\n })\r\n })\r\n }\r\n })\r\n }\r\n\r\n handleChartChange(chartModelUnwatched)\r\n\r\n chartModelUnwatched.bind(BIND_EVENTS, handleChartChange)\r\n\r\n return () => {\r\n chartModelUnwatched.unbind(BIND_EVENTS, handleChartChange)\r\n }\r\n }, [chartModelUnwatched, quoteModel.hasReachedEnd, getIsMounted])\r\n\r\n if (quoteModel.hasReachedEnd || quoteModel.close.length === 0) {\r\n return null\r\n }\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n \r\n )\r\n}\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: ['fetchingState'] })\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 const isFetching = quoteModel?.getIsFetching([\r\n QuoteFetchType.Refetch,\r\n QuoteFetchType.DataChangeRefetch,\r\n QuoteFetchType.NewerData,\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={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","import { Button, ButtonGroup, ButtonSizeType, Icon } 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 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: unwatchedChartModel,\r\n isVisible,\r\n onZoomIn,\r\n onZoomOut,\r\n onZoomReset,\r\n}: ZoomControlsProps) {\r\n const chartModel = useModelState(unwatchedChartModel, { watchProperties: ['isScrolled', 'zoomFactor'] })\r\n const chartLayoutModel = useModelState(unwatchedChartModel.chart_layout(), { watchProperties: ['idea'] })\r\n const isZoomResetVisible = chartModel.zoomFactor !== chartLayoutModel.defaultZoomFactor\r\n const handleGoToMostRecent = React.useCallback(() => {\r\n chartModel.updateAttributes({ leftOffset: getDefaultLeftOffset(chartModel), dateRange: null })\r\n }, [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 {chartModel.isScrolled && (\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 { 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 { getSettings, recountScale, renderPane } from '../renderUtils'\r\nimport { DrawingTool } from '../toolbar/interfaces'\r\nimport { getChartAlt } from '../utils'\r\nimport { MainChartDataLoader } from './MainChartDataLoader'\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 addToLeftOffset: (n: number) => void\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 \r\n {getChartAlt(model, 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.props.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 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 merge from 'lodash.merge'\r\nimport React from 'react'\r\n\r\nimport { ObjectHash } from '../../../types/shared'\r\nimport { IndicatorType, 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, updateZoomAndLeftOffsetByDateRange } from '../renderUtils'\r\nimport { ChartSpinnerOverlay } from './chart-spinner-overlay'\r\nimport { CHART_CLASS_NAMES, ChartProps, DEFAULT_WRAPPER_COMPONENT } from './constants'\r\n\r\nfunction getMaxValue(currentValue: number | undefined, newValue: number | undefined) {\r\n return currentValue && newValue ? Math.max(currentValue, newValue) : (currentValue ?? newValue ?? undefined)\r\n}\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\r\n /*\r\n * This has to be in sync with the logic\r\n * in getChartQuotes in offScreenCanvasRender.ts\r\n * & initChartRef in with-chart-init.tsx\r\n * & getQuoteBarsBufferAndCount in chart.ts\r\n */\r\n const needsToLoadAllData = panesConfig.some(({ elements }) =>\r\n elements.some(({ type }) => type === IndicatorType.Obv)\r\n )\r\n const maxQuoteBarsBufferAndCount = props.layoutModel.getAllCharts().reduce(\r\n (acc, chart) => {\r\n if (chartModel.ticker !== chart.ticker || chartModel.timeframe !== chart.timeframe) return acc\r\n\r\n const quoteBarsBufferAndCount = chart.getQuoteBarsBufferAndCount()\r\n\r\n return {\r\n ...acc,\r\n dateFrom: getMaxValue(acc.dateFrom, quoteBarsBufferAndCount.dateFrom),\r\n barsCount: getMaxValue(acc.barsCount, quoteBarsBufferAndCount.barsCount),\r\n leftBuffer: getMaxValue(acc.leftBuffer, quoteBarsBufferAndCount.leftBuffer),\r\n isAllData:\r\n acc.isAllData ||\r\n (quoteBarsBufferAndCount.dateFrom === undefined && quoteBarsBufferAndCount.barsCount === undefined),\r\n }\r\n },\r\n { dateFrom: undefined, barsCount: undefined, leftBuffer: undefined, isAllData: needsToLoadAllData } as Record<\r\n 'dateFrom' | 'barsCount' | 'leftBuffer',\r\n number | undefined\r\n > & { isAllData: boolean }\r\n )\r\n\r\n const options = {\r\n ...(maxQuoteBarsBufferAndCount.isAllData ? {} : maxQuoteBarsBufferAndCount),\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\r\n const panesWithPerfIndicator = panesConfig.filter(({ elements }) =>\r\n elements.some(({ type }) => type === IndicatorType.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.dateRange) {\r\n updateZoomAndLeftOffsetByDateRange({ chartModel, quote })\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 classnames from 'classnames'\r\nimport debounce from 'lodash.debounce'\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, { QuoteFetchType } from '../../models/quote'\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 quoteLength?: number\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(QuoteFetchType.Older, this.onOlderDataLoaded)\r\n Quote.unbind(\r\n `${QuoteFetchType.Refetch} ${QuoteFetchType.DataChangeRefetch} ${QuoteFetchType.NewerData}`,\r\n this.onDataLoaded\r\n )\r\n })\r\n\r\n Quote.bind(QuoteFetchType.Older, this.onOlderDataLoaded)\r\n Quote.bind(\r\n `${QuoteFetchType.Refetch} ${QuoteFetchType.DataChangeRefetch} ${QuoteFetchType.NewerData}`,\r\n this.onDataLoaded\r\n )\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 addToLeftOffset = (n: number) => {\r\n const quote = this.props.chartModel.quote()\r\n const barWidth = getBarWidthWithMargin({\r\n chartLayout: this.props.layoutModel,\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 this.props.chartModel.updateAttributes({\r\n leftOffset,\r\n dateRange: null,\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 = chartModelParam ?? this.props.chartModel\r\n const { 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 // chart is never considered scrolled if date range is applied (scroll to lates data button is not visible)\r\n const newIsScrolled = !chartModel.dateRange && 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 + barWidth) {\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 if (this.zoomerRightAlign) {\r\n this.zoomerRightAlign.quoteLength = quote.close.length\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 trackZoomEvent(label: string, action: string, zoomFactor: number) {\r\n window.gtag?.('event', 'zoom', {\r\n event_category: 'zoom',\r\n event_label: label,\r\n action,\r\n zoom_factor: zoomFactor,\r\n })\r\n }\r\n\r\n trackZoomClick = debounce(this.trackZoomEvent.bind(this, 'click'), 2000)\r\n trackZoomDrag = debounce(this.trackZoomEvent.bind(this, 'drag'), 2000)\r\n trackZoomWheel = debounce(this.trackZoomEvent.bind(this, 'wheel'), 2000)\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, isMouseWheel, fromMouseMove: true })\r\n }\r\n\r\n addToZoomFactor = ({\r\n diff,\r\n shouldCalculateRightAlign = false,\r\n fromMouseMove = false,\r\n isMouseWheel = false,\r\n }: {\r\n diff: number\r\n shouldCalculateRightAlign?: boolean\r\n fromMouseMove?: boolean\r\n isMouseWheel?: boolean\r\n }) => {\r\n const { chartModel, layoutModel } = this.props\r\n const quote = chartModel.quote()\r\n if (\r\n shouldCalculateRightAlign ||\r\n (this.zoomerRightAlign && this.zoomerRightAlign.quoteLength !== quote.close.length)\r\n ) {\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\r\n // NOTE: track zoom event based from callee\r\n const eventType = diff > 0 ? 'zoom-in' : 'zoom-out'\r\n if (fromMouseMove) {\r\n if (isMouseWheel) this.trackZoomWheel(eventType, zoomFactor)\r\n else this.trackZoomDrag(eventType, zoomFactor)\r\n } else {\r\n this.trackZoomClick(eventType, zoomFactor)\r\n }\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,\r\n 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,\r\n barWidth,\r\n barIndex: getBarIndex(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 this.trackZoomClick('zoom-reset', zoomFactor)\r\n }\r\n\r\n onOlderDataLoaded = (newQuote: Quote) => {\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 chartModel.setChartEvents(quote.chartEvents, true)\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 const isChartQuote = quote.eql(chartModel.quote()) && chartModel.timeframe === quote.timeframe\r\n if (!isChartQuote) {\r\n return\r\n }\r\n const { barsCount, dateFrom } = chartModel.getDateRangeBars()\r\n const shouldFetchData = (barsCount && quote.date.length < barsCount) || (dateFrom && quote.date[0] > dateFrom)\r\n if (\r\n shouldFetchData &&\r\n !quote.hasError &&\r\n !quote.hasReachedEnd &&\r\n !quote.getIsFetching([QuoteFetchType.Refetch, QuoteFetchType.DataChangeRefetch, QuoteFetchType.Older])\r\n ) {\r\n void quote\r\n .fetchData({ fetchType: QuoteFetchType.Older, options: chartModel.getQuoteBarsBufferAndCount() })\r\n .then(() => {\r\n updateZoomAndLeftOffsetByDateRange({ chartModel, quote })\r\n this.handleQuoteChange(quote)\r\n })\r\n return\r\n }\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 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 [DrawingTool.Avwap]: {\r\n id: DrawingTool.Avwap,\r\n title: 'Anchored VWAP',\r\n icon: 'toolAVWAP',\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 defaultItem: drawingTools[DrawingTool.Avwap],\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 } 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 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 { getChartBarsBuffer } from '../../helpers/getGetChartBarsBuffer'\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.barsBuffer = getChartBarsBuffer(chartConfig)\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 is necessary because we need to have chart width to calculate correct bars count on initial quote load\r\n this.onWindowResize()\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.getIsFetching() &&\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 return QuotePollingIntervalInMs.Reduced\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.getIsFetching([\r\n QuoteFetchType.Refetch,\r\n QuoteFetchType.DataChangeRefetch,\r\n QuoteFetchType.NewerData,\r\n ]) && 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.getIsFetching() && 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() || 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\nimport { getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\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 anchorDate?: Date\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 ?? 0\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 const numOfBarsOffset = lastQuoteDateIndex - lastVisibleBarIndex\r\n return { numOfVisibleBars, numOfBarsOffset: Number.isNaN(numOfBarsOffset) ? 0 : numOfBarsOffset }\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, anchorDate = new Date() }: ChartStartEndDatesProps) => {\r\n const daysInQuote = quote?.getDaysInQuote() ?? []\r\n const lastDate =\r\n quote && quote?.date.length > 0 ? dateFromUnixTimestamp(quote.date[quote.date.length - 1]) : anchorDate\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 ? dateFns.startOfDay(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 // subDays 4 is correct because we're taking the whole day (dateFns.startOfDay)\r\n start = startDateIndex === -1 ? dateFns.startOfDay(dateFns.subDays(lastDate, 4)) : 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\r\n // Keep Math.round in sync with calculation of leftOffset in getLeftOffset\r\n return Math.round(Utils.min(width - 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 // Keep Math.round in sync with return value in getMinMaxLeftOffset\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 const numOfDaysInQuoteData = Object.keys(quote.getDayToOffset()).length\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 && numOfDaysInQuoteData >= drawDaysInOneChart) {\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 = (numOfDaysInQuoteData - drawDaysInOneChart) * quote.getBarsInDay()\r\n const offsetChartInPx = (lastQuoteDate?.getHours() ?? 0) >= offsetChartAfter ? offsetInPx : 0\r\n // Math.max(1, ~~num) is to mimic implementation 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 paneModel = elementModel.pane()\r\n const chart = paneModel.chart()\r\n const quote = chart.quote()\r\n\r\n const { ChartSettings } = chart.getChartLayoutSettings()\r\n\r\n const visibleBarToRenderIndexProps = {\r\n leftOffset: chart.leftOffset,\r\n paneModel,\r\n quote,\r\n }\r\n const firstBarIndex = getVisibleBarToRenderIndex(visibleBarToRenderIndexProps)\r\n const lastBarIndex = getVisibleBarToRenderIndex({\r\n ...visibleBarToRenderIndexProps,\r\n chartWidth: chart.width - ChartSettings.left.width - ChartSettings.right.width,\r\n })\r\n\r\n if ([TIMEFRAME.w, TIMEFRAME.m].includes(quote.timeframe)) {\r\n return false\r\n }\r\n\r\n return quote.chartEvents.some(\r\n ({ dateTimestamp }) =>\r\n quote.date[firstBarIndex.dataIndex] <= dateTimestamp && quote.date[lastBarIndex.dataIndex] >= dateTimestamp\r\n )\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 Avwap = 'avwap',\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 PaneModel from '../models/pane'\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(paneModel: PaneModel, quoteModel: QuoteModel) {\r\n const element = paneModel.getChartOrIndicatorElement()\r\n let altText = `${quoteModel.name || quoteModel.ticker} - `\r\n if (element?.isIndicator()) {\r\n altText += `${element.instance.seoLabel} Indicator`\r\n } else {\r\n altText += `${getInstrumentLabel(quoteModel.instrument)} Price Chart`\r\n }\r\n return altText\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 { 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 { ATRConfig, Options } from '../indicators/configs/atr'\r\nimport utils from '../utils'\r\nimport { MainCalculation } from './main'\r\n\r\nexport function getTrueRange(high: number, low: number, prevClose?: number) {\r\n return prevClose !== undefined\r\n ? utils.max([high - low, Math.abs(high - prevClose), Math.abs(low - prevClose)])\r\n : high - low\r\n}\r\n\r\nexport class 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 = getTrueRange(high, 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\ntype DefaultCalculatedValuesType = {\r\n atr: number[]\r\n}\r\n\r\nexport class ATRCalculation extends MainCalculation {\r\n static config = ATRConfig\r\n\r\n calculate() {\r\n const { period } = this.options\r\n const { close, high, low } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length < period) return\r\n\r\n const atr = new AverageTrueRange(period)\r\n for (let i = 0; i < close.length; i++) {\r\n atr.add(high[i], low[i], close[i - 1])\r\n\r\n if (i < period - 1) continue\r\n\r\n this._calculatedValues.atr[i] = atr.value\r\n }\r\n }\r\n}\r\n","import { EMAConfig, Options } from '../overlays/configs/ema'\r\nimport { MainCalculation } 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() {\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 }\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport IndicatorBaseConfig from '../indicators/configs/indicatorBaseConfig'\r\nimport type 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 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 declare protected _calculatedValues: TCalculatedValues\r\n\r\n constructor({ quote, options }: MainProps) {\r\n this.quote = 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() {\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 const result = (this.calculatedValues[key] as number[]).slice(-lastNItems)\r\n return (result.length > 0 ? result : [...Array(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) => this.options![key])\r\n return [colName, ...optionsStrings].join('_')\r\n }\r\n}\r\n","import { Options, SMAConfig } from '../overlays/configs/sma'\r\nimport { MainCalculation } from './main'\r\n\r\nexport class SimpleMovingAverage {\r\n period: number\r\n sum: number\r\n count: number\r\n value: number\r\n trailingValues: 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 this.trailingValues = []\r\n }\r\n\r\n add(value: number) {\r\n if (this.count < this.period) {\r\n this.sum += value\r\n this.count++\r\n this.trailingValues.push(value)\r\n if (this.count === this.period) this.value = this.sum / this.period\r\n } else {\r\n const firstTrailingValue = this.trailingValues.shift() ?? 0\r\n this.sum = this.sum - firstTrailingValue + value\r\n this.value = this.sum / this.period\r\n this.trailingValues.push(value)\r\n }\r\n }\r\n}\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() {\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 const sma = new SimpleMovingAverage(period)\r\n for (let i = 0; i < close.length; i++) {\r\n sma.add(close[i])\r\n if (i >= period - 1) {\r\n this._calculatedValues.sma[i] = sma.value\r\n }\r\n }\r\n }\r\n}\r\n","import { Options, VWAPConfig } from '../overlays/configs/vwap'\r\nimport { dateFromUnixTimestamp } from '../utils'\r\nimport { MainCalculation } 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() {\r\n this.calculateFrom(0)\r\n }\r\n\r\n calculateFrom(index: number, resetOnNewDay = true) {\r\n const { date, close, low, high, volume } = this.quote\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 = index; i < date.length; i++) {\r\n if (resetOnNewDay && i > index) {\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 }\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 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 static calculatedValuesOrder = ['atr'] as const\r\n static calculatedValuesLabels = { atr: 'ATR' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import type { 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 seoLabel: string | null = null\r\n static description = ''\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 seoLabel = 'Short Interest, 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 seoLabel = 'Short Interest, 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 static calculatedValuesOrder = ['adx', 'pdi', 'mdi'] as const\r\n static calculatedValuesLabels = { adx: 'ADX', pdi: '+DI', mdi: '-DI' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { ADXConfig, Attrs } from '../indicators/configs/adx'\r\nimport { getTrueRange } from './atr'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n /**\r\n * Average Directional Index\r\n */\r\n adx: number[]\r\n /**\r\n * Plus Directional Indicator\r\n */\r\n pdi: number[]\r\n /**\r\n * Minus Directional Indicator\r\n */\r\n mdi: number[]\r\n}\r\n\r\nfunction getDX(pdi: number, mdi: number) {\r\n return (Math.abs(pdi - mdi) / Math.abs(pdi + mdi)) * 100\r\n}\r\n\r\nexport class ADXCalculation extends MainCalculation {\r\n static config = ADXConfig\r\n\r\n calculate() {\r\n const { period } = this.options\r\n const { high, low, close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n /**\r\n * Smoothed Average True Range\r\n */\r\n const sATR: number[] = []\r\n let firstAtrAccumulator = 0\r\n /**\r\n * Smoothed Plus Directional Movement\r\n */\r\n const sPDM: number[] = []\r\n let firstPdmAccumulator = 0\r\n /**\r\n * Smoothed Minus Directional Movement\r\n */\r\n const sMDM: number[] = []\r\n let firstMdmAccumulator = 0\r\n /**\r\n * Directional Index\r\n */\r\n const dx: number[] = []\r\n\r\n /**\r\n * First ADX: Sum of n periods of TR\r\n */\r\n let firstAdxAccumulator = 0\r\n\r\n // Not enough data for calculation\r\n if (close.length < period + 1) return\r\n\r\n for (let i = 1; i < close.length; i++) {\r\n const tr = getTrueRange(high[i], low[i], close[i - 1])\r\n\r\n const upMove = high[i] - high[i - 1]\r\n const downMove = low[i - 1] - low[i]\r\n\r\n const plusDM = upMove > downMove && upMove > 0 ? upMove : 0\r\n const minusDM = downMove > upMove && downMove > 0 ? downMove : 0\r\n\r\n if (i <= period) {\r\n firstAtrAccumulator += tr\r\n firstPdmAccumulator += plusDM\r\n firstMdmAccumulator += minusDM\r\n if (i === period) {\r\n // First value of smoothed ATR/PDM/MDM is just SUM of n periods\r\n sATR[i] = firstAtrAccumulator\r\n sPDM[i] = firstPdmAccumulator\r\n sMDM[i] = firstMdmAccumulator\r\n this._calculatedValues.pdi[period] = (sPDM[i] / sATR[i]) * 100\r\n this._calculatedValues.mdi[period] = (sMDM[i] / sATR[i]) * 100\r\n dx[i] = getDX(this._calculatedValues.pdi[i], this._calculatedValues.mdi[i])\r\n firstAdxAccumulator = dx[i]\r\n }\r\n continue\r\n }\r\n\r\n sATR[i] = sATR[i - 1] - sATR[i - 1] / period + tr\r\n sPDM[i] = sPDM[i - 1] - sPDM[i - 1] / period + plusDM\r\n sMDM[i] = sMDM[i - 1] - sMDM[i - 1] / period + minusDM\r\n\r\n this._calculatedValues.pdi[i] = (sPDM[i] / sATR[i]) * 100\r\n this._calculatedValues.mdi[i] = (sMDM[i] / sATR[i]) * 100\r\n\r\n dx[i] =\r\n (Math.abs(this._calculatedValues.pdi[i] - this._calculatedValues.mdi[i]) /\r\n Math.abs(this._calculatedValues.pdi[i] + this._calculatedValues.mdi[i])) *\r\n 100\r\n\r\n // Because ADX is double smoothed adx valus start at \"double period index\",\r\n // whole calculation is starting at index 1 because we always compare current with previous\r\n // eg. for period 5:\r\n // first smoothing is from index 1 to 5 becuase 1 to 5 is 5 indexes\r\n // then second smooting is from index 5 to 9 becuase again it is 5 indexes\r\n // thus (period * 2 - 1) === (5 * 2 - 1) => 9\r\n if (i <= period * 2 - 1) {\r\n firstAdxAccumulator += dx[i]\r\n if (i === period * 2 - 1) {\r\n // First ADX is n period average of DX\r\n this._calculatedValues.adx[period * 2 - 1] = firstAdxAccumulator / period\r\n }\r\n continue\r\n }\r\n\r\n this._calculatedValues.adx[i] = (this._calculatedValues.adx[i - 1] * (period - 1) + dx[i]) / period\r\n }\r\n }\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n CustomSpineEvents,\r\n IModalConfig,\r\n IModalConfigInput,\r\n ObjectHash,\r\n PaneArea,\r\n RequireByKey,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text, { 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 seoLabel() {\r\n return (this.constructor as typeof Indicator).config.seoLabel ?? this.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 weight: '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.dataIndex; i <= lastBarToRenderIndex.dataIndex; 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 { ADXCalculation } from '../indicator-calculation/adx'\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 declare adxCalculation: ADXCalculation\r\n\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.adxCalculation = new ADXCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.adxCalculation.calculate()\r\n this.lastValue = this.adxCalculation.calculatedValues.adx.last() ?? null\r\n }\r\n const { min, max } =\r\n this.adxCalculation.calculatedValues.pdi.length > 0 ||\r\n this.adxCalculation.calculatedValues.mdi.length > 0 ||\r\n this.adxCalculation.calculatedValues.adx.length > 0\r\n ? this.computeVisibleMinMax(\r\n this.adxCalculation.calculatedValues.pdi,\r\n this.adxCalculation.calculatedValues.mdi,\r\n this.adxCalculation.calculatedValues.adx\r\n )\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.adxCalculation.calculatedValues.pdi[dataIndex]) },\r\n { color: lineColors.mdi, text: this.getValueLabel(this.adxCalculation.calculatedValues.mdi[dataIndex]) },\r\n { color: lineColors.adx, text: this.getValueLabel(this.adxCalculation.calculatedValues.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.adxCalculation.calculatedValues.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.adxCalculation.calculatedValues.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.adxCalculation.calculatedValues.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 description =\r\n 'Aroon is a technical indicator that measures trend strength and direction. It consists of two lines: Aroon Up and Aroon Down. When Aroon Up crosses above Aroon Down, it signals a potential uptrend, while the opposite indicates a potential downtrend. Divergence between Aroon and price can also suggest trend reversals.'\r\n\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 } 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() {\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 }\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 { ATRCalculation } from '../indicator-calculation/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 declare atrCalculation: ATRCalculation\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.atrCalculation === null) {\r\n this.atrCalculation = new ATRCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.atrCalculation.calculate()\r\n this.lastValue = this.atrCalculation.calculatedValues.atr.last() ?? null\r\n }\r\n const { min, max } =\r\n this.atrCalculation.calculatedValues.atr.length > 0\r\n ? this.computeVisibleMinMax(this.atrCalculation.calculatedValues.atr)\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 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.atrCalculation.calculatedValues.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.atrCalculation.calculatedValues.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 static calculatedValuesOrder = ['cci'] as const\r\n static calculatedValuesLabels = {\r\n cci: 'CCI',\r\n }\r\n\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, CCIConfig } from '../indicators/configs/cci'\r\nimport { MainCalculation } from './main'\r\nimport { SimpleMovingAverage } from './sma'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n cci: number[]\r\n}\r\nconst constant = 0.015\r\n\r\nexport class CCICalculation extends MainCalculation {\r\n static config = CCIConfig\r\n\r\n calculate() {\r\n const { period } = this.options\r\n const { high, low, close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length < period) return\r\n\r\n const typicalPrice = []\r\n const tpSma = new SimpleMovingAverage(period)\r\n\r\n for (let i = 0; i < close.length; i++) {\r\n typicalPrice[i] = (close[i] + low[i] + high[i]) / 3\r\n\r\n tpSma.add(typicalPrice[i])\r\n\r\n if (i < period - 1) {\r\n continue\r\n }\r\n\r\n let devSum = 0\r\n for (let j = i - period + 1; j <= i; j++) {\r\n devSum += Math.abs(typicalPrice[j] - tpSma.value)\r\n }\r\n\r\n const dev = devSum / period\r\n this._calculatedValues.cci[i] = 0\r\n if (dev > 0) {\r\n this._calculatedValues.cci[i] = (typicalPrice[i] - tpSma.value) / (constant * dev)\r\n }\r\n }\r\n }\r\n}\r\n","import { CCICalculation } from '../indicator-calculation/cci'\r\nimport { Attrs, CCIConfig } from './configs/cci'\r\nimport Indicator from './indicator'\r\n\r\nclass CommodityChannelIndex extends Indicator {\r\n static config = CCIConfig\r\n\r\n declare cciCalculation: CCICalculation\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.cciCalculation = new CCICalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.cciCalculation.calculate()\r\n this.lastValue = this.cciCalculation.calculatedValues.cci.last() ?? null\r\n }\r\n\r\n const { min, max } =\r\n this.cciCalculation.calculatedValues.cci.length > 0\r\n ? this.computeVisibleMinMax(this.cciCalculation.calculatedValues.cci)\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 return this.getOversoldOverboughtValueLabelsAtIndex(index, this.cciCalculation.calculatedValues.cci)\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.cciCalculation.calculatedValues.cci, this.period - 1, -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 = 'COT'\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, weight: '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 weight: '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, weight: '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 description =\r\n 'The Force Index combines price movement and volume to evaluate the strength of a trend. Positive Force Index values indicate buying pressure, while negative values suggest selling pressure, helping to gauge the intensity of market moves.'\r\n\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 } 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() {\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 }\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 description =\r\n 'The MACD (Moving Average Convergence Divergence) indicator identifies potential buy/sell signals by comparing two EMAs (eg. 12.period and 26.period). It consists of the MACD line, Signal line (9.period EMA of MACD), and Histogram. A MACD line crossing above the Signal line suggests a buy, while crossing below suggests a sell.'\r\n\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 } 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() {\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 }\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 static calculatedValuesOrder = ['mfi'] as const\r\n static calculatedValuesLabels = { mfi: 'MFI' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, MFIConfig } from '../indicators/configs/mfi'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n mfi: number[]\r\n}\r\n\r\nexport class MFICalculation extends MainCalculation {\r\n static config = MFIConfig\r\n\r\n calculate() {\r\n const { period } = this.options\r\n const { high, low, close, volume } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length <= period) return\r\n\r\n const typicalPrice: number[] = []\r\n const moneyFlow: number[] = []\r\n // + && - rolling sum means sum of money flows in interval (i-period, i)\r\n let positiveMoneyFlowRollingSum = 0\r\n let negativeMoneyFlowRollingSum = 0\r\n for (let i = 0; i < close.length; i++) {\r\n typicalPrice[i] = (close[i] + low[i] + high[i]) / 3\r\n\r\n if (i === 0) continue\r\n\r\n const currentMoneyFlow = typicalPrice[i] * volume[i]\r\n\r\n // while i < period increment money flow period sums\r\n if (typicalPrice[i] > typicalPrice[i - 1]) {\r\n positiveMoneyFlowRollingSum += currentMoneyFlow\r\n moneyFlow[i] = currentMoneyFlow\r\n } else if (typicalPrice[i] < typicalPrice[i - 1]) {\r\n negativeMoneyFlowRollingSum += currentMoneyFlow\r\n moneyFlow[i] = -currentMoneyFlow\r\n }\r\n\r\n if (i < period) continue\r\n\r\n // from the point when we have n = period data calculated\r\n // we keep sum as period rolling sum\r\n const oldMoneyFlow = moneyFlow[i - period]\r\n if (oldMoneyFlow > 0) {\r\n positiveMoneyFlowRollingSum -= oldMoneyFlow\r\n } else if (oldMoneyFlow < 0) {\r\n negativeMoneyFlowRollingSum += oldMoneyFlow\r\n }\r\n\r\n // and are able to calculate first mfi value\r\n this._calculatedValues.mfi[i] = 100 - 100 / (1 + positiveMoneyFlowRollingSum / negativeMoneyFlowRollingSum)\r\n }\r\n }\r\n}\r\n","import { MFICalculation } from '../indicator-calculation/mfi'\r\nimport { 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 declare mfiCalculation: MFICalculation\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 this.mfiCalculation = new MFICalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.mfiCalculation.calculate()\r\n\r\n this.lastValue = this.mfiCalculation.calculatedValues.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.mfiCalculation.calculatedValues.mfi)\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.mfiCalculation.calculatedValues.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 static calculatedValuesOrder = ['obv'] as const\r\n static calculatedValuesLabels = { obv: 'OBV' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { OBVConfig } from '../indicators/configs/obv'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n obv: number[]\r\n}\r\n\r\nexport class OBVCalculation extends MainCalculation {\r\n static config = OBVConfig\r\n\r\n calculate() {\r\n const { close, volume } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = 1; i < close.length; i++) {\r\n let currentObv = this._calculatedValues.obv[i - 1] ?? 0\r\n if (close[i] > close[i - 1]) {\r\n currentObv += volume[i]\r\n } else if (close[i] < close[i - 1]) {\r\n currentObv -= volume[i]\r\n }\r\n\r\n this._calculatedValues.obv[i] = currentObv\r\n }\r\n }\r\n}\r\n","import math from '../helpers/math'\r\nimport { OBVCalculation } from '../indicator-calculation/obv'\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 declare obvCalculation: OBVCalculation\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.obvCalculation = new OBVCalculation({\r\n quote: this.data,\r\n options: undefined,\r\n })\r\n\r\n this.obvCalculation.calculate()\r\n\r\n this.lastValue = this.obvCalculation.calculatedValues.obv.last() ?? null\r\n }\r\n const { min, max } =\r\n this.obvCalculation.calculatedValues.obv.length > 0\r\n ? this.computeVisibleMinMax(this.obvCalculation.calculatedValues.obv)\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 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.obvCalculation.calculatedValues.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.obvCalculation.calculatedValues.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(forceRerender = false) {\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 this._compute(Object.keys(data), data)\r\n if (forceRerender) {\r\n this.trigger('change')\r\n }\r\n return\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 weight: '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\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 static calculatedValuesOrder = ['rmi'] as const\r\n static calculatedValuesLabels = { rmi: 'RMI' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, RMIConfig } from '../indicators/configs/rmi'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n rmi: number[]\r\n}\r\n\r\nexport class RMICalculation extends MainCalculation {\r\n static config = RMIConfig\r\n\r\n calculate() {\r\n const { period, momentum } = this.options\r\n const { close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length < momentum + period) return\r\n\r\n let sumUp = 0\r\n let sumDown = 0\r\n let averageDown: number, averageUp: number\r\n\r\n for (let i = momentum; i < close.length; i++) {\r\n let upChange = 0\r\n let downChange = 0\r\n if (close[i] > close[i - momentum]) {\r\n upChange = close[i] - close[i - momentum]\r\n }\r\n if (close[i] < close[i - momentum]) {\r\n downChange = close[i - momentum] - close[i]\r\n }\r\n\r\n if (i - momentum < period) {\r\n sumUp += upChange\r\n sumDown += downChange\r\n averageUp = sumUp / (i - momentum + 1)\r\n averageDown = sumDown / (i - momentum + 1)\r\n } else {\r\n averageUp = (averageUp! * (period - 1) + upChange) / period\r\n averageDown = (averageDown! * (period - 1) + downChange) / period\r\n }\r\n\r\n if (i < period + momentum - 1) continue\r\n this._calculatedValues.rmi[i] =\r\n averageDown === 0 ? 100 : averageUp === 0 ? 0 : 100 - 100 / (1 + averageUp / averageDown)\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { RMICalculation } from '../indicator-calculation/rmi'\r\nimport { 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 declare rmiCalculation: RMICalculation\r\n declare momentum: number\r\n declare period: number\r\n\r\n static getNumOfBarsBuffer(attrs: RequireByKey) {\r\n // Because of this smoothing, RSI values may differ based on the total calculation period. 250 periods will allow for more smoothing than 30 periods, which will slightly affect RSI values.\r\n return super.getNumOfBarsBuffer(attrs) + 250\r\n }\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.rmiCalculation = new RMICalculation({\r\n quote: this.data,\r\n options: { period: this.period, momentum: this.momentum },\r\n })\r\n\r\n this.rmiCalculation.calculate()\r\n\r\n this.lastValue = this.rmiCalculation.calculatedValues.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.rmiCalculation.calculatedValues.rmi)\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(\r\n context,\r\n this.rmiCalculation.calculatedValues.rmi,\r\n this.momentum + this.period - 1,\r\n 30,\r\n 50,\r\n 70\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 ?? 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 static calculatedValuesOrder = ['roc'] as const\r\n static calculatedValuesLabels = { roc: 'ROC' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, ROCConfig } from '../indicators/configs/roc'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n roc: number[]\r\n}\r\n\r\nexport class ROCCalculation extends MainCalculation {\r\n static config = ROCConfig\r\n\r\n calculate() {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = period; i < close.length; i++) {\r\n this._calculatedValues.roc[i] = ((close[i] - close[i - period]) / close[i - period]) * 100\r\n }\r\n }\r\n}\r\n","import Line from '../canvas/line'\r\nimport { ROCCalculation } from '../indicator-calculation/roc'\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 declare rocCalculation: ROCCalculation\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.rocCalculation = new ROCCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.rocCalculation.calculate()\r\n\r\n this.lastValue = this.rocCalculation.calculatedValues.roc.last() ?? null\r\n }\r\n const { min, max } =\r\n this.rocCalculation.calculatedValues.roc.length > 0\r\n ? this.computeVisibleMinMax(this.rocCalculation.calculatedValues.roc)\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 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.rocCalculation.calculatedValues.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 fromIndexOffset: this.period,\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.rocCalculation.calculatedValues.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 description =\r\n 'The RSI indicator measures the speed and change of price movements on a scale of 0 to 100. Values above 70 indicate overbought conditions, while values below 30 suggest oversold conditions, potentially signaling a trend reversal.'\r\n\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 } from './main'\r\nimport { RMICalculation } from './rmi'\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() {\r\n const { period } = this.options\r\n\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n const rmiCalculation = new RMICalculation({\r\n quote: this.quote,\r\n options: { period: period, momentum: 1 },\r\n })\r\n\r\n rmiCalculation.calculate()\r\n this._calculatedValues.rsi = rmiCalculation.calculatedValues.rmi\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { 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 static getNumOfBarsBuffer(attrs: RequireByKey) {\r\n // Because of this smoothing, RSI values may differ based on the total calculation period. 250 periods will allow for more smoothing than 30 periods, which will slightly affect RSI values.\r\n return super.getNumOfBarsBuffer(attrs) + 250\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.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\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 static calculatedValuesOrder = ['rvol'] as const\r\n static calculatedValuesLabels = { rvol: 'RVOL' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, RVOLConfig } from '../indicators/configs/rvol'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n rvol: number[]\r\n}\r\n\r\nexport class RVOLCalculation extends MainCalculation {\r\n static config = RVOLConfig\r\n\r\n calculate() {\r\n const { period } = this.options\r\n const { volume } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (volume.length < period) return\r\n\r\n let sum = 0\r\n for (let i = 0; i < volume.length; i++) {\r\n sum += volume[i] - (volume[i - period] ?? 0)\r\n if (i < period - 1) continue\r\n this._calculatedValues.rvol[i] = sum > 0 ? volume[i] / (sum / period) : 0\r\n }\r\n }\r\n}\r\n","import Line from '../canvas/line'\r\nimport { RVOLCalculation } from '../indicator-calculation/rvol'\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 declare rvolCalculation: RVOLCalculation\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.rvolCalculation = new RVOLCalculation({\r\n quote: this.data,\r\n options: { period: this.period, baseLine: this.baseLine },\r\n })\r\n\r\n this.rvolCalculation.calculate()\r\n\r\n this.lastValue = this.rvolCalculation.calculatedValues.rvol.last() ?? null\r\n }\r\n\r\n const { min, max } =\r\n this.rvolCalculation.calculatedValues.rvol.length > 0\r\n ? this.computeVisibleMinMax([...this.rvolCalculation.calculatedValues.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.rvolCalculation.calculatedValues.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.rvolCalculation.calculatedValues.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.rvolCalculation.calculatedValues.rvol[i]))\r\n\r\n context.set(\r\n 'fillStyle',\r\n this.rvolCalculation.calculatedValues.rvol[i] < this.baseLine ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n )\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 static calculatedValuesOrder = ['rwiHigh', 'rwiLow'] as const\r\n static calculatedValuesLabels = { rwiHigh: 'RWI High', rwiLow: 'RWI Low' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, RWIConfig } from '../indicators/configs/rwi'\r\nimport { getTrueRange } from './atr'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n rwiHigh: number[]\r\n rwiLow: number[]\r\n}\r\n\r\nexport class RWICalculation extends MainCalculation {\r\n static config = RWIConfig\r\n\r\n calculate() {\r\n const { period } = this.options\r\n const { high, low, close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length <= period + 2) return\r\n\r\n const tr: number[] = []\r\n\r\n for (let i = 0; i < close.length; i++) {\r\n tr[i] = getTrueRange(high[i], low[i], close[i - 1])\r\n }\r\n\r\n for (let i = period + 2; i < close.length; i++) {\r\n const h = high[i]\r\n const l = low[i]\r\n let trSum = tr[i - 1] + tr[i - 2]\r\n let count = 2\r\n let atrWeight = (trSum / count) * Math.sqrt(count)\r\n let maxHi = atrWeight > 0 ? (h - low[i - 1]) / atrWeight : -1\r\n let maxLo = atrWeight > 0 ? (high[i - 1] - l) / atrWeight : -1\r\n for (let j = i - 1; j > i - period + 1; j--) {\r\n trSum += 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 - low[j - 1]) / atrWeight\r\n if (hi > maxHi) {\r\n maxHi = hi\r\n }\r\n\r\n const lo = (high[j - 1] - l) / atrWeight\r\n if (lo > maxLo) {\r\n maxLo = lo\r\n }\r\n }\r\n this._calculatedValues.rwiHigh[i] = maxHi\r\n this._calculatedValues.rwiLow[i] = maxLo\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 { RWICalculation } from '../indicator-calculation/rwi'\r\nimport Pane from '../models/pane'\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 declare rwiCalculation: RWICalculation\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.rwiCalculation = new RWICalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.rwiCalculation.calculate()\r\n }\r\n const { min, max } =\r\n this.rwiCalculation.calculatedValues.rwiHigh.length > 0 || this.rwiCalculation.calculatedValues.rwiLow.length > 0\r\n ? this.computeVisibleMinMax(\r\n this.rwiCalculation.calculatedValues.rwiHigh,\r\n this.rwiCalculation.calculatedValues.rwiLow\r\n )\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 rwiLow: '#c80000',\r\n rwiHigh: '#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 {\r\n color: lineColors.rwiLow,\r\n text: this.getValueLabel(this.rwiCalculation.calculatedValues.rwiLow[dataIndex]),\r\n },\r\n {\r\n color: lineColors.rwiHigh,\r\n text: this.getValueLabel(this.rwiCalculation.calculatedValues.rwiHigh[dataIndex]),\r\n },\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.rwiCalculation.calculatedValues.rwiLow[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.rwiCalculation.calculatedValues.rwiHigh[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.rwiCalculation.calculatedValues.rwiLow.length > 0) {\r\n textLabels.push({\r\n text: this.rwiCalculation.calculatedValues.rwiLow.last()!.toFixed(2),\r\n y: Math.round(this.fy(this.rwiCalculation.calculatedValues.rwiLow.last()!)),\r\n background: '#c80000',\r\n })\r\n }\r\n if (this.rwiCalculation.calculatedValues.rwiHigh.length > 0) {\r\n textLabels.push({\r\n text: this.rwiCalculation.calculatedValues.rwiHigh.last()!.toFixed(2),\r\n y: Math.round(this.fy(this.rwiCalculation.calculatedValues.rwiHigh.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: 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 static calculatedValuesOrder = ['k', 'd'] as const\r\n static calculatedValuesLabels = { k: '%K', d: '%D' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\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 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 static calculatedValuesOrder = ['k', 'd'] as const\r\n static calculatedValuesLabels = { k: '%K', d: '%D' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, StofuConfig } from '../indicators/configs/stofu'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n k: number[]\r\n d: number[]\r\n}\r\n\r\nexport function getFirstKAndDIndex({ period, dPeriod, kPeriod }: { period: number; dPeriod: number; kPeriod: number }) {\r\n const firstKIndex = period - 2 + kPeriod\r\n return { firstKIndex, firstDIndex: firstKIndex + dPeriod - 1 }\r\n}\r\n\r\nexport class StofuCalculation extends MainCalculation {\r\n static config = StofuConfig\r\n\r\n calculate() {\r\n const { period, dPeriod, kPeriod } = this.options\r\n const { high, low, close } = this.quote\r\n\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n const { firstKIndex, firstDIndex } = getFirstKAndDIndex({ period: period, kPeriod, dPeriod })\r\n\r\n if (firstDIndex < firstKIndex || [period, dPeriod, kPeriod].some((i) => i > close.length - 1)) return\r\n\r\n let dCount, dSum, k\r\n const k1Arr = []\r\n const dArr = []\r\n const kArr = []\r\n\r\n let kSum = (dSum = 0)\r\n let kCount = (dCount = 0)\r\n for (let i = 0; i < close.length; i++) {\r\n let highestHigh = high[i]\r\n let lowestLow = low[i]\r\n\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (high[j] > highestHigh) {\r\n highestHigh = high[j]\r\n }\r\n if (low[j] < lowestLow) {\r\n lowestLow = low[j]\r\n }\r\n }\r\n\r\n k = ((close[i] - lowestLow) / (highestHigh - lowestLow)) * 100\r\n if (highestHigh === lowestLow) {\r\n k = 100\r\n }\r\n k1Arr[i] = k\r\n if (kPeriod > 1) {\r\n kSum += k\r\n kCount++\r\n if (kCount > kPeriod) {\r\n kSum -= k1Arr[i - 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 > dPeriod) {\r\n dSum -= kArr[i - dPeriod]\r\n dCount--\r\n }\r\n\r\n kArr[i] = k\r\n dArr[i] = dSum / dCount\r\n\r\n if (i >= firstKIndex) {\r\n this._calculatedValues.k[i] = kArr[i]\r\n if (i >= firstDIndex) {\r\n this._calculatedValues.d[i] = dArr[i]\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import Line from '../canvas/line'\r\nimport { StofuCalculation, getFirstKAndDIndex } from '../indicator-calculation/stofu'\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 declare kPeriod: number\r\n declare period: number\r\n declare dPeriod: number\r\n declare stofuCalculation: StofuCalculation\r\n declare firstKIndex: number\r\n declare firstDIndex: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, dPeriod = 0, kPeriod = 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 this.stofuCalculation = new StofuCalculation({\r\n quote: this.data,\r\n options: { period: this.period, dPeriod: this.dPeriod, kPeriod: this.kPeriod },\r\n })\r\n\r\n this.stofuCalculation.calculate()\r\n\r\n const { firstKIndex, firstDIndex } = getFirstKAndDIndex({\r\n period: this.period,\r\n kPeriod: this.kPeriod,\r\n dPeriod: this.dPeriod,\r\n })\r\n this.firstKIndex = firstKIndex\r\n this.firstDIndex = firstDIndex\r\n\r\n this.lastValue = this.stofuCalculation.calculatedValues.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.stofuCalculation.calculatedValues.k[dataIndex]) },\r\n { color: lineColors.d, text: this.getValueLabel(this.stofuCalculation.calculatedValues.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 }\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n fromIndexOffset: this.firstKIndex,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.stofuCalculation.calculatedValues.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 fromIndexOffset: this.firstDIndex,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.stofuCalculation.calculatedValues.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: 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 description =\r\n 'The TRIX indicator is a momentum oscillator that shows the percent rate of change of a triple.smoothed EMA. Positive TRIX values indicate upward momentum, while negative values suggest downward momentum, helping to identify trend reversals.'\r\n\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 } 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() {\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 }\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 static calculatedValuesOrder = ['ult'] as const\r\n static calculatedValuesLabels = { ult: 'Ultimate Oscillator' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Options, UltConfig } from '../indicators/configs/ult'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n ult: number[]\r\n}\r\n\r\nexport class UltCalculation extends MainCalculation {\r\n static config = UltConfig\r\n\r\n calculate() {\r\n const { period1, period2, period3 } = this.options\r\n const { high, low, close } = this.quote\r\n const maxPeriod = Math.max(period1, period2, period3)\r\n\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length - 1 < maxPeriod) return\r\n\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\r\n for (let i = 1; i < close.length; i++) {\r\n bp[i] = close[i] - Math.min(low[i], close[i - 1])\r\n tr[i] = Math.max(high[i], close[i - 1]) - Math.min(low[i], close[i - 1])\r\n\r\n bpSum1 += bp[i]\r\n trSum1 += tr[i]\r\n count1++\r\n if (count1 > period1) {\r\n bpSum1 -= bp[i - period1]\r\n trSum1 -= tr[i - period1]\r\n }\r\n\r\n bpSum2 += bp[i]\r\n trSum2 += tr[i]\r\n count2++\r\n if (count2 > period2) {\r\n bpSum2 -= bp[i - period2]\r\n trSum2 -= tr[i - period2]\r\n }\r\n\r\n bpSum3 += bp[i]\r\n trSum3 += tr[i]\r\n count3++\r\n if (count3 > period3) {\r\n bpSum3 -= bp[i - period3]\r\n trSum3 -= tr[i - 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 if (i >= maxPeriod) this._calculatedValues.ult[i] = (100 * (4 * avg1 + 2 * avg2 + avg3)) / 7\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { UltCalculation } from '../indicator-calculation/ult'\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 declare ultCalculation: UltCalculation\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.ultCalculation = new UltCalculation({\r\n quote: this.data,\r\n options: { period1: this.period1, period2: this.period2, period3: this.period3 },\r\n })\r\n this.ultCalculation.calculate()\r\n\r\n this.lastValue = this.ultCalculation.calculatedValues.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.ultCalculation.calculatedValues.ult)\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(\r\n context,\r\n this.ultCalculation.calculatedValues.ult,\r\n Math.max(this.period1, this.period2, this.period3),\r\n 30,\r\n 50,\r\n 70\r\n )\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 static calculatedValuesOrder = ['r'] as const\r\n static calculatedValuesLabels = { r: '%R' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, WRConfig } from '../indicators/configs/wr'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n r: number[]\r\n}\r\n\r\nexport class WRCalculation extends MainCalculation {\r\n static config = WRConfig\r\n\r\n calculate() {\r\n const { period } = this.options\r\n const { high, low, close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = period - 1; i < close.length; i++) {\r\n let highestHigh = high[i]\r\n let lowestLow = low[i]\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (high[j] > highestHigh) {\r\n highestHigh = high[j]\r\n }\r\n if (low[j] < lowestLow) {\r\n lowestLow = low[j]\r\n }\r\n }\r\n\r\n if (i < period - 1) continue\r\n\r\n this._calculatedValues.r[i] = 0\r\n if (highestHigh - lowestLow > 0) {\r\n this._calculatedValues.r[i] = ((highestHigh - close[i]) / (highestHigh - lowestLow)) * -100\r\n }\r\n }\r\n }\r\n}\r\n","import { WRCalculation } from '../indicator-calculation/wr'\r\nimport { 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 declare wrCalculation: WRCalculation\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.wrCalculation = new WRCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n this.wrCalculation.calculate()\r\n\r\n this.lastValue = this.wrCalculation.calculatedValues.r.last() ?? null\r\n }\r\n const { min, max } =\r\n this.wrCalculation.calculatedValues.r.length > 0\r\n ? this.computeVisibleMinMax(this.wrCalculation.calculatedValues.r)\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 return this.getOversoldOverboughtValueLabelsAtIndex(index, this.wrCalculation.calculatedValues.r)\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.wrCalculation.calculatedValues.r, this.period - 1, -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 handleModelChange()\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 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 { getQuoteOptionsForDateRange } from '../helpers/getQuoteOptionsForDateRange'\r\nimport PricePerformance from '../indicators/perf'\r\nimport Utils from '../utils'\r\nimport { getBarWidthWithMargin } from '../utils/chart'\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 { CHART_BARS_BUFFER_IN_PX } from './constants'\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 'barsBuffer',\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 barsBuffer: 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 const isPremium = window.FinvizSettings.hasUserPremium\r\n const refreshIntervals = QuotePollingIntervalInMs[isPremium ? 'Elite' : 'Free']\r\n\r\n if (typeof this.refreshData === 'number') {\r\n defaultRefreshInterval = this.refreshData\r\n } else if (this.refreshData === true) {\r\n defaultRefreshInterval = refreshIntervals.Default\r\n }\r\n\r\n let customRefreshInterval = refreshIntervals.Default\r\n switch (this.instrument) {\r\n case Instrument.Stock:\r\n customRefreshInterval = Utils.isStockFastRefreshAvailable()\r\n ? refreshIntervals.Stock\r\n : QuotePollingIntervalInMs.Reduced\r\n break\r\n case Instrument.Crypto:\r\n customRefreshInterval = refreshIntervals.Crypto\r\n break\r\n case Instrument.Forex:\r\n customRefreshInterval = refreshIntervals.Forex\r\n break\r\n case Instrument.Futures:\r\n customRefreshInterval = refreshIntervals.Futures\r\n break\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?.isIndicator() && mainElement.instance.type === IndicatorType.Cot) {\r\n return cotKeys.includes(mainElement.instance.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 (element.isChart()) {\r\n return element.instance.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((indicatorElement) => indicatorElement.instance.config.quoteFinancialAttachments)\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 getDateRangeBars() {\r\n const isPremium = window.FinvizSettings.hasUserPremium\r\n\r\n return getQuoteOptionsForDateRange({\r\n dateRange: this.dateRange,\r\n instrument: this.instrument,\r\n isPremium,\r\n hasPremarket: this.premarket,\r\n hasAftermarket: this.aftermarket,\r\n })\r\n }\r\n\r\n getQuoteBarsBufferAndCount() {\r\n /*\r\n * This has to be in sync with the logic\r\n * in getChartQuotes in offScreenCanvasRender.ts\r\n * & initChartRef in with-chart-init.tsx\r\n * & getQuoteBarsBufferAndCount in chart.ts\r\n */\r\n const needsToLoadAllData = this.getAllElements().some(({ instance }) => instance.type === IndicatorType.Obv)\r\n\r\n if (needsToLoadAllData) {\r\n return { barsCount: undefined, dateFrom: undefined, leftBuffer: undefined }\r\n }\r\n\r\n const barWidth = getBarWidthWithMargin({\r\n chartLayout: this.chart_layout(),\r\n zoomFactor: this.zoomFactor,\r\n })\r\n\r\n const scrollBuffer = Math.ceil(CHART_BARS_BUFFER_IN_PX / barWidth)\r\n const leftBuffer = Math.ceil(this.barsBuffer ?? 0) + scrollBuffer\r\n\r\n if (this.dateRange) {\r\n const dateRangeOptions = this.getDateRangeBars()\r\n return {\r\n ...this.getDateRangeBars(),\r\n // E.g. daterange Max should request all bars\r\n leftBuffer: Object.keys(dateRangeOptions).length > 0 ? leftBuffer : undefined,\r\n }\r\n }\r\n\r\n const barsCount = Math.ceil(this.width / barWidth)\r\n return { barsCount, leftBuffer }\r\n }\r\n}\r\n\r\nexport default Chart\r\n","import { Instrument } from '../../types/shared'\r\nimport {\r\n DateRangeType,\r\n MARKET_END,\r\n MARKET_START,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n TIMEFRAME,\r\n TIMEFRAME_SECONDS,\r\n} from '../constants/common'\r\nimport { getChartStartEndDates } from '../controllers/renderUtils'\r\nimport { getIsSSr } from '../utils/helpers'\r\n\r\ninterface Props {\r\n dateRange: string\r\n instrument: Instrument\r\n isPremium: boolean\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n}\r\n\r\nexport function getQuoteOptionsForDateRange({ dateRange, instrument, hasPremarket, hasAftermarket, isPremium }: Props) {\r\n const is1DayRange = dateRange === DateRangeType.d1\r\n const is5DayRange = dateRange === DateRangeType.d5\r\n if (is1DayRange || is5DayRange) {\r\n const timeframeMinutes = TIMEFRAME_SECONDS[is5DayRange ? TIMEFRAME.i5 : TIMEFRAME.i1] / 60\r\n const preMarketMarketMinutes = hasPremarket && isPremium ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const afterMarketMinutes = hasAftermarket && isPremium ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const startMs = new Date().setHours(MARKET_START.hours, MARKET_START.minutes, 0, 0)\r\n const endMs = new Date().setHours(MARKET_END.hours, MARKET_END.minutes, 0, 0)\r\n const marketMinutes =\r\n instrument === Instrument.Stock ? (endMs - startMs) / 60_000 + preMarketMarketMinutes + afterMarketMinutes : 1440\r\n const barsInADay = marketMinutes / timeframeMinutes\r\n let barsCount = 0\r\n\r\n if (is1DayRange) {\r\n barsCount = barsInADay\r\n } else if (is5DayRange) {\r\n barsCount = barsInADay * 5\r\n }\r\n\r\n return {\r\n barsCount,\r\n }\r\n }\r\n const { start, end } = getChartStartEndDates({ dateRange })\r\n\r\n return {\r\n dateFrom: start ? Math.floor(start.getTime() / 1000) : undefined,\r\n dateTo: end && getIsSSr() ? Math.ceil(end.getTime() / 1000) : undefined,\r\n }\r\n}\r\n","/*\r\n * it converts it to numbered index and it causes problems later on\r\n * the reason it's not just numbered enum is that it when used in const below\r\n * */\r\nexport enum ChartSyncablePart {\r\n Crosshair = 'crosshair',\r\n Ticker = 'ticker',\r\n Timeframe = 'timeframe',\r\n}\r\n\r\nexport const ChartPartToAttrsSyncMap = {\r\n [ChartSyncablePart.Ticker]: ['ticker'],\r\n [ChartSyncablePart.Timeframe]: ['timeframe', 'dateRange'],\r\n}\r\n\r\nexport const ChartSyncableParts = [\r\n { value: ChartSyncablePart.Ticker, label: 'Ticker' },\r\n { value: ChartSyncablePart.Timeframe, label: 'Timeframe' },\r\n { value: ChartSyncablePart.Crosshair, label: 'Crosshair' },\r\n]\r\n","import 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, TIMEFRAME } from '../constants/common'\r\nimport { DrawingSetting } from '../controllers/toolbar/interfaces'\r\nimport { getChartLayoutSizeConfig } from '../utils/getChartLayoutSizeConfig'\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.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 updateSizeSettingsForTimeframe(timeframe: TIMEFRAME) {\r\n if (this.idea?.id) return false\r\n\r\n const isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(this.specificChartFunctionality)\r\n\r\n const { width, barWidth, barMargin } = getChartLayoutSizeConfig(this.toConfig(), timeframe)\r\n const hasDifferentBarWidth = [\r\n this.settings.ChartSettings.center.barWidth,\r\n this.settings.IndicatorSettings.center.barWidth,\r\n ].some((value) => value !== barWidth)\r\n const hasDifferentBarMargin = [\r\n this.settings.ChartSettings.center.barMargin,\r\n this.settings.IndicatorSettings.center.barMargin,\r\n ].some((value) => value !== barMargin)\r\n const hasDifferentWidth = isQuoteOrQuoteFinancials && this.width !== width\r\n const shouldUpdateWithNewSettings = hasDifferentBarWidth || hasDifferentBarMargin || hasDifferentWidth\r\n if (shouldUpdateWithNewSettings) {\r\n const newSettings = JSON.parse(JSON.stringify(this.settings))\r\n newSettings.ChartSettings.center.barWidth = barWidth\r\n newSettings.IndicatorSettings.center.barWidth = barWidth\r\n newSettings.ChartSettings.center.barMargin = barMargin\r\n newSettings.IndicatorSettings.center.barMargin = barMargin\r\n\r\n this.updateAttributes({ settings: newSettings, width })\r\n\r\n return true\r\n }\r\n\r\n return true\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\r\nexport const CHART_BARS_BUFFER_IN_PX = 100\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 BaseChart from '../charts/base_chart'\r\nimport { CanvasElementType, ChartElementType, IndicatorType } from '../constants/common'\r\nimport IndicatorElement from '../indicators/indicator'\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 | IndicatorElement) {\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(): this is { instance: InstanceType } & BaseChart {\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(): this is { instance: InstanceType } & IndicatorElement {\r\n return this.isIndicator() && financialIndicators.includes(this.instance!.type as IndicatorType)\r\n }\r\n\r\n isIndicator(): this is { instance: InstanceType } & IndicatorElement {\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 { QuoteFinancialAttachment } from '../../constants/common'\r\n\r\nexport enum QuoteFetchType {\r\n Refetch = 'refetch',\r\n DataChangeRefetch = 'dataChangeRefetch',\r\n Older = 'older',\r\n NewerData = 'newerData',\r\n}\r\n\r\nexport interface QuoteUrlOptions {\r\n dataId?: string\r\n isLocked?: boolean\r\n dateFrom?: number\r\n dateTo?: number\r\n barsCount?: number\r\n leftBuffer?: number\r\n}\r\n\r\nexport interface QuoteFetchOptions extends QuoteUrlOptions {\r\n aftermarket?: boolean\r\n premarket?: boolean\r\n patterns?: boolean\r\n events?: boolean\r\n financialAttachments?: QuoteFinancialAttachment[]\r\n}\r\n\r\nexport const FUTURES_FORCE_REFETCH_TIMEOUT = 60_000\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 { IntradayTimeframeInterval, QuoteFinancialAttachment, TIMEFRAME } 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 { deleteCachedQuote, getCachedQuote, setCachedQuote } from '../quoteCache'\r\nimport { getRawTickerForInstrument } from '../utils'\r\nimport { FUTURES_FORCE_REFETCH_TIMEOUT, QuoteFetchOptions, QuoteFetchType, QuoteUrlOptions } from './constants'\r\nimport { FinancialAttachmentsData, ShortInterestData } from './financialAttachmentsData'\r\n\r\ntype TodoPattern = TodoObjectHashAnyType\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 dataId?: string\r\n}\r\n\r\ntype ChartEventDataRaw = IEarnings | IDividends | ISplit\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 updateOhlcVersion?: number\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 COTProps = ['commercialHedgers', 'largeTraders', 'smallTraders'] as const\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 lastRefetch: -1,\r\n fetchingState: [],\r\n is404: false,\r\n hasError: 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 hasReachedEnd: false,\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 // Only intraday quotes have afterhours\r\n (!quote.isIntraday || (!quote.premarket === !options?.premarket && !quote.aftermarket === !options?.aftermarket)) &&\r\n (!options?.patterns || !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)\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.getIsFetching() || !!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 ...item,\r\n elementId: `${ticker.toLowerCase()}-${item.eventType}-${item.dateTimestamp}`,\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 'fetchingState',\r\n 'wasFetchAborted',\r\n 'chartUuid',\r\n 'ideaID',\r\n 'updateOhlcVersion',\r\n 'lastRefetch',\r\n 'is404',\r\n 'hasError',\r\n 'hasReachedEnd',\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.getIsFetching()) {\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 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({\r\n fetchType: QuoteFetchType.Refetch,\r\n abortController,\r\n options: {\r\n dateFrom: options?.dateFrom,\r\n dateTo: options?.dateTo,\r\n barsCount: options?.barsCount,\r\n leftBuffer: options?.leftBuffer,\r\n },\r\n })\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 hasReachedEnd: 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 fetchingState: QuoteFetchType[]\r\n declare fetchingPromise?: Promise\r\n declare wasFetchAborted: boolean\r\n declare ideaID?: number\r\n declare updateOhlcVersion?: number\r\n declare lastRefetch: number\r\n declare is404?: boolean\r\n declare hasError?: 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 fetchType,\r\n abortController,\r\n options = {},\r\n }: {\r\n fetchType: QuoteFetchType\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 hasError = false\r\n let wasFetchAborted = false\r\n\r\n const fetchingPromise = fetchApi({\r\n location: this.getUrl({ dataId: fetchType === QuoteFetchType.NewerData ? this.dataId : undefined, ...options }),\r\n throwOnStatusCodes: [404],\r\n abortController,\r\n })\r\n\r\n this.updateAttributes({\r\n fetchingState: [...this.fetchingState, fetchType],\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 {\r\n hasError = true\r\n if (!is404 && process.env.IS_E2E_TESTING) {\r\n throw new Error('Quote fetch error', { cause: err })\r\n }\r\n }\r\n // Ignore network/notfound errors\r\n }\r\n\r\n const shouldUseEmptyQuote = !data && !wasFetchAborted && fetchType === QuoteFetchType.Refetch\r\n\r\n this.updateAttributes({\r\n ...(shouldUseEmptyQuote ? getEmptyQuote() : {}),\r\n is404,\r\n hasError,\r\n wasFetchAborted,\r\n fetchingState: this.fetchingState.filter((type) => type !== fetchType),\r\n })\r\n\r\n return data\r\n }\r\n\r\n getIsFetching(fetchType?: QuoteFetchType | QuoteFetchType[]) {\r\n if (fetchType === undefined) return this.fetchingState.length > 0\r\n\r\n const fetchTypeArray = Array.isArray(fetchType) ? fetchType : [fetchType]\r\n return this.fetchingState.some((type) => fetchTypeArray.includes(type))\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({\r\n fetchType: QuoteFetchType.NewerData,\r\n abortController,\r\n options: {\r\n dateFrom: this.date[this.date.length - 2],\r\n barsCount: 1,\r\n dataId: undefined,\r\n },\r\n })\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 options = {},\r\n }: {\r\n fetchType: QuoteFetchType\r\n abortController?: null | AbortController\r\n options?: QuoteUrlOptions\r\n }): Promise {\r\n const isFuturesForcedRefetch =\r\n fetchType === QuoteFetchType.NewerData &&\r\n this.instrument === Instrument.Futures &&\r\n this.lastRefetch < Date.now() - FUTURES_FORCE_REFETCH_TIMEOUT\r\n const isRefetch = [QuoteFetchType.Refetch, QuoteFetchType.DataChangeRefetch].includes(fetchType)\r\n\r\n if (isFuturesForcedRefetch) {\r\n return this.dataChangeRefetch(abortController)\r\n } else if (isRefetch) {\r\n options.dateFrom = options.dateFrom ?? this.date[0]\r\n } else if (fetchType === QuoteFetchType.NewerData) {\r\n if (this.date.length >= 2) {\r\n options.dateFrom = this.date[this.date.length - 2]\r\n }\r\n } else if (fetchType === QuoteFetchType.Older) {\r\n options.dateTo = this.date[0]\r\n }\r\n\r\n const data = await this.fetchRequest({ fetchType, abortController, options })\r\n\r\n if (!data || data.noNewData === true) {\r\n return\r\n }\r\n if (!isRefetch && this.instrument === Instrument.Stock && this.updateOhlcVersion !== data.updateOhlcVersion) {\r\n return this.dataChangeRefetch(abortController)\r\n }\r\n if (fetchType === QuoteFetchType.Older && !data?.date.some((date) => date < this.date[0])) {\r\n this.updateAttributes({ hasReachedEnd: true })\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: isRefetch ? data.COTs : this.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: fetchType === QuoteFetchType.NewerData || isRefetch ? data.dataId : this.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 updateOhlcVersion: this.updateOhlcVersion,\r\n lastRefetch: isRefetch ? Date.now() : this.lastRefetch,\r\n chartEvents: isRefetch ? (data.chartEvents ?? []) : this.chartEvents,\r\n fetchedAt: Date.now(),\r\n financialAttachmentsData: isRefetch ? data.financialAttachmentsData : this.financialAttachmentsData,\r\n }\r\n\r\n if (!isRefetch) {\r\n /*\r\n * Merges chart events\r\n * Adds new chart events and overwrites chart events with new ones if they are from the same day\r\n */\r\n if ((data.chartEvents?.length ?? 0) > 0) {\r\n newQuoteData.chartEvents = [\r\n ...this.chartEvents.filter(\r\n ({ dateTimestamp }) =>\r\n !data.chartEvents?.some((chartEvent) =>\r\n isSameDay(dateFromUnixTimestamp(chartEvent.dateTimestamp), dateFromUnixTimestamp(dateTimestamp))\r\n )\r\n ),\r\n ...(data.chartEvents ?? []),\r\n ].sort((item1, item2) => item1.dateTimestamp - item2.dateTimestamp)\r\n }\r\n /*\r\n * Merges financial attachments\r\n * Adds new financial attachments and overwrites financial attachments with new ones if they have the same timestamp\r\n */\r\n Object.keys(data.financialAttachmentsData ?? {}).forEach((keyString) => {\r\n const key = keyString as keyof FinancialAttachmentsData\r\n const financialAttachment = data.financialAttachmentsData![key]\r\n\r\n if (!financialAttachment?.length) return\r\n\r\n newQuoteData.financialAttachmentsData ??= {}\r\n newQuoteData.financialAttachmentsData[key] = [\r\n ...(this.financialAttachmentsData?.[key]?.filter(\r\n ({ timestamp }) => !financialAttachment.some((item) => timestamp === item.timestamp)\r\n ) ?? []),\r\n ...financialAttachment,\r\n ].sort((item1, item2) => item1.timestamp - item2.timestamp)\r\n })\r\n /*\r\n * Merges COTs\r\n */\r\n const COTKeys = this.instrument === Instrument.Futures ? Object.keys(data.COTs) : []\r\n if (COTKeys.length > 0) {\r\n const isOlder = fetchType === QuoteFetchType.Older\r\n for (let i = isOlder ? data.date.length - 1 : 0; isOlder ? i >= 0 : i < data.date.length; isOlder ? i-- : i++) {\r\n const date = data.date[i]\r\n if (this.date.includes(date)) {\r\n continue\r\n }\r\n COTKeys.forEach((key) => {\r\n COTProps.forEach((prop) => {\r\n if (isOlder) {\r\n newQuoteData.COTs[key][prop].unshift(data.COTs[key][prop][i])\r\n } else {\r\n newQuoteData.COTs[key][prop].push(data.COTs[key][prop][i])\r\n }\r\n })\r\n })\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 newQuoteData.updateOhlcVersion = data.updateOhlcVersion\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(options?: QuoteFetchOptions) {\r\n return this.fetchData({ fetchType: QuoteFetchType.Older, options })\r\n }\r\n\r\n dataChangeRefetch(abortController?: null | AbortController) {\r\n return this.fetchData({\r\n fetchType: QuoteFetchType.DataChangeRefetch,\r\n abortController,\r\n options: {\r\n dateFrom: this.date[0],\r\n },\r\n })\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\r\n this.fetchingState ??= []\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 || !this.drawMinutesPerDay || !this.interval) {\r\n return 0\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 events: this.events == null ? this.instrument === Instrument.Stock : this.events,\r\n ...options,\r\n financialAttachments: this.financialAttachments?.join(','),\r\n }\r\n\r\n const isBrowserElite = !getIsSSr() && document.location.host === 'elite.finviz.com'\r\n let domain = isBrowserElite ? '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","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 weight: '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 weight: '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 weight: '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 weight: '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 weight: '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 description =\r\n 'The EMA is a moving average that gives more weight to recent prices, making it more responsive to price changes. A rising EMA suggests an uptrend, while a falling EMA indicates a downtrend, helping to identify the direction of the trend.'\r\n\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 type { 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 = { 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 description =\r\n 'The Simple Moving Average (SMA) is a basic technical indicator that calculates the average price of an asset over a specific number of periods. It smooths out price data to identify trends by averaging the closing prices. A rising SMA indicates an uptrend, while a falling SMA suggests a downtrend.'\r\n\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 { 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 description =\r\n 'The VWAP measures the average price of a security, weighted by volume throughout the trading day. It helps determine the true average price, with prices above the VWAP indicating buying pressure and prices below the VWAP indicating selling pressure.'\r\n\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 { 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 description =\r\n 'Bollinger Bands are a volatility indicator that consists of three lines: a middle line (20 period simple moving average), an upper band (2 standard deviations above the SMA), and a lower band (2 standard deviations below the SMA). They help identify overbought or oversold conditions; prices near the upper band may indicate overbought, while prices near the lower band may suggest oversold conditions.'\r\n\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 } 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() {\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 }\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, TIMEFRAME } 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 fetchedAt = -1\r\n shouldUpdate = true\r\n\r\n static getNumOfBarsBuffer(obj: RequireByKey & { timeframe: TIMEFRAME }) {\r\n const [periodInt] = getParsedIntegersFromPeriodString(obj.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 set(obj: Partial) {\r\n super.set(obj)\r\n this.shouldUpdate = true\r\n\r\n return this\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 isComputeNecessary() {\r\n // if quote was updated (this.fetchedAt !== this.data.fetchedAt)\r\n // or overlay setting was changed (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 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 { drawInVisibleArea } from '../utils/draw_in_visible_area'\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 declare bbCalculation: BbCalculation\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 firstBarToRenderIndex: number | undefined\r\n let lastBarToRenderIndex = 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 if (this.isComputeNecessary()) {\r\n this.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 this.bbCalculation.calculate()\r\n }\r\n\r\n drawInVisibleArea({\r\n fromIndexOffset: period - 1,\r\n leftOffset,\r\n width,\r\n quote: this.data,\r\n paneModel: this.model,\r\n drawBarCallback: (i, x) => {\r\n const smaValue = this.bbCalculation.calculatedValues.sma[i]\r\n if (Number.isFinite(smaValue)) {\r\n firstBarToRenderIndex ??= i\r\n context.lineTo(x, Math.round(this.fy(smaValue)))\r\n lastBarToRenderIndex = i\r\n }\r\n },\r\n })\r\n\r\n if (firstBarToRenderIndex === 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(\r\n this.fx(firstBarToRenderIndex),\r\n Math.round(this.fy(this.bbCalculation.calculatedValues.upperBand[firstBarToRenderIndex]))\r\n )\r\n context.set('strokeStyle', BB_COLORS[theme].TOP)\r\n for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(this.bbCalculation.calculatedValues.upperBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRenderIndex), scaledTop)\r\n context.lineTo(this.fx(firstBarToRenderIndex), scaledTop)\r\n context.fill()\r\n\r\n // bottom line\r\n context.beginPath()\r\n context.moveTo(\r\n this.fx(firstBarToRenderIndex),\r\n Math.round(this.fy(this.bbCalculation.calculatedValues.lowerBand[firstBarToRenderIndex]))\r\n )\r\n context.set('strokeStyle', BB_COLORS[theme].BOTTOM)\r\n for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(this.bbCalculation.calculatedValues.lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRenderIndex), scaledBottom)\r\n context.lineTo(this.fx(firstBarToRenderIndex), 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 static calculatedValuesOrder = ['upperBand', 'lowerBand', 'medianBand'] as const\r\n static calculatedValuesLabels = {\r\n upperBand: 'Upper Band',\r\n lowerBand: 'Lower Band',\r\n medianBand: 'Median',\r\n }\r\n\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { DchConfig, Options } from '../overlays/configs/dch'\r\nimport utils from '../utils'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n upperBand: number[]\r\n lowerBand: number[]\r\n medianBand: number[]\r\n}\r\n\r\nexport class DchCalculation extends MainCalculation {\r\n static config = DchConfig\r\n\r\n calculate() {\r\n const { period } = this.options\r\n const { high, low, close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length < period) return\r\n const startingIndex = period - 1\r\n for (let i = startingIndex; i < close.length; i++) {\r\n this._calculatedValues.upperBand[i] = utils.max(high.slice(Math.max(0, i - startingIndex), i + 1))\r\n this._calculatedValues.lowerBand[i] = utils.min(low.slice(Math.max(0, i - startingIndex), i + 1))\r\n this._calculatedValues.medianBand[i] =\r\n (this._calculatedValues.upperBand[i] + this._calculatedValues.lowerBand[i]) / 2\r\n }\r\n }\r\n}\r\n","import { DchCalculation } from '../indicator-calculation/dch'\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 declare dchCalculation: DchCalculation\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 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 if (this.isComputeNecessary()) {\r\n this.dchCalculation = new DchCalculation({\r\n quote: this.data,\r\n options: { period: this.attrs.period },\r\n })\r\n\r\n this.dchCalculation.calculate()\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 fromIndexOffset: this.attrs.period - 1,\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 context.lineTo(x, Math.round(this.fy(this.dchCalculation?.calculatedValues.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(this.dchCalculation?.calculatedValues.lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), 0)\r\n context.lineTo(this.fx(firstBarToRender), 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(this.dchCalculation?.calculatedValues.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 { drawInVisibleArea } from '../utils/draw_in_visible_area'\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 declare emaCalculation: EMACalculation\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\r\n if (this.isComputeNecessary()) {\r\n this.emaCalculation = new EMACalculation({\r\n quote: this.data,\r\n options: { period: this.attrs.period },\r\n })\r\n\r\n this.emaCalculation.calculate()\r\n }\r\n\r\n drawInVisibleArea({\r\n fromIndexOffset: this.attrs.period - 1,\r\n leftOffset,\r\n width,\r\n quote: this.data,\r\n paneModel: this.model,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.emaCalculation.calculatedValues.ema[i])))\r\n },\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.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 static calculatedValuesOrder = ['highestHigh', 'lowestLow'] as const\r\n static calculatedValuesLabels = {\r\n highestHigh: 'Highest high',\r\n lowestLow: 'Lowest low',\r\n }\r\n\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { HILOConfig, Options } from '../overlays/configs/hilo'\r\nimport utils from '../utils'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n highestHigh: number[]\r\n lowestLow: number[]\r\n}\r\n\r\nexport class HILOCalculation extends MainCalculation {\r\n static config = HILOConfig\r\n\r\n calculate() {\r\n const { period } = this.options\r\n const { high, low, close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length < period) return\r\n const startingIndex = period - 1\r\n for (let i = startingIndex; i < close.length; i++) {\r\n this._calculatedValues.highestHigh[i] = utils.max(high.slice(Math.max(0, i - startingIndex), i + 1))\r\n this._calculatedValues.lowestLow[i] = utils.min(low.slice(Math.max(0, i - startingIndex), i + 1))\r\n }\r\n }\r\n}\r\n","import { HILOCalculation } from '../indicator-calculation/hilo'\r\nimport PaneModel from '../models/pane'\r\nimport { getBarWidthWithMargin } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\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 declare hiloCalculation: HILOCalculation\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: undefined | number\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\r\n if (this.isComputeNecessary()) {\r\n this.hiloCalculation = new HILOCalculation({\r\n quote: this.data,\r\n options: { period },\r\n })\r\n\r\n this.hiloCalculation.calculate()\r\n }\r\n\r\n let prevHigh = -1\r\n drawInVisibleArea({\r\n leftOffset,\r\n width,\r\n quote: this.data,\r\n paneModel: this.model,\r\n drawBarCallback: (i, x) => {\r\n firstBarToRender ??= i\r\n const highestHigh =\r\n this.hiloCalculation.calculatedValues.highestHigh[i] ||\r\n (prevHigh !== -1 ? prevHigh : undefined) ||\r\n this.hiloCalculation.calculatedValues.highestHigh[\r\n this.hiloCalculation.calculatedValues.highestHigh.findIndex((item) => item !== undefined)\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 const y = Math.round(this.fy(highestHigh))\r\n context.lineTo(Math.round(x - halfWidth), y)\r\n context.lineTo(Math.round(x + halfWidth), y)\r\n\r\n prevHigh = highestHigh\r\n lastBarToRender = i\r\n },\r\n })\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(Math.round(this.fx(lastBarToRender)) + halfWidth, 0)\r\n context.lineTo(Math.round(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 const lowestLow =\r\n this.hiloCalculation.calculatedValues.lowestLow[i] ||\r\n (prevLow !== -1 ? prevLow : undefined) ||\r\n this.hiloCalculation.calculatedValues.lowestLow[\r\n this.hiloCalculation.calculatedValues.lowestLow.findIndex((item) => item !== undefined)\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 const y = Math.round(this.fy(lowestLow))\r\n context.lineTo(Math.round(x - halfWidth), y)\r\n context.lineTo(Math.round(x + halfWidth), y)\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(Math.round(this.fx(lastBarToRender)) + halfWidth, context.canvas.height)\r\n context.lineTo(Math.round(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 static calculatedValuesOrder = ['baseLine', 'conversionLine', 'senkouSpanA', 'senkouSpanB'] as const\r\n static calculatedValuesLabels = {\r\n baseLine: 'Base Line',\r\n conversionLine: 'Conversion Line',\r\n senkouSpanA: 'Leading Span A',\r\n senkouSpanB: 'Leading Span B',\r\n }\r\n\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { ICConfig, Options } from '../overlays/configs/ic'\r\nimport utils from '../utils'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n conversionLine: number[]\r\n baseLine: number[]\r\n senkouSpanA: number[]\r\n senkouSpanB: number[]\r\n}\r\n\r\ntype CalculationSupportValues = {\r\n conversionStartIndex: number\r\n baseStartIndex: number\r\n spanBIndex: number\r\n start: number\r\n end: number\r\n}\r\n\r\nexport class ICCalculation extends MainCalculation {\r\n static config = ICConfig\r\n declare options: Options\r\n protected _calculationSupportValues = {} as CalculationSupportValues\r\n\r\n get calculationSupportValues() {\r\n return this._calculationSupportValues\r\n }\r\n\r\n calculate() {\r\n const { conversion, base, spanB } = this.options\r\n const { close, high, low } = this.quote\r\n\r\n this._calculationSupportValues.conversionStartIndex = conversion - 1\r\n this._calculationSupportValues.baseStartIndex = base - 1\r\n this._calculationSupportValues.spanBIndex = spanB - 1\r\n this._calculationSupportValues.start = Math.min(\r\n this._calculationSupportValues.baseStartIndex,\r\n this._calculationSupportValues.conversionStartIndex\r\n )\r\n this._calculationSupportValues.end = close.length + this._calculationSupportValues.baseStartIndex\r\n\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = this._calculationSupportValues.start; i < this._calculationSupportValues.end; i++) {\r\n if (i >= this._calculationSupportValues.conversionStartIndex && i < close.length) {\r\n const highestHi = utils.max(high.slice(i - this._calculationSupportValues.conversionStartIndex, i + 1))\r\n const lowestLo = utils.min(low.slice(i - this._calculationSupportValues.conversionStartIndex, i + 1))\r\n this._calculatedValues.conversionLine[i] = (highestHi + lowestLo) / 2\r\n }\r\n\r\n if (i >= this._calculationSupportValues.baseStartIndex && i < close.length) {\r\n const highestHi = utils.max(high.slice(i - this._calculationSupportValues.baseStartIndex, i + 1))\r\n const lowestLo = utils.min(low.slice(i - this._calculationSupportValues.baseStartIndex, i + 1))\r\n this._calculatedValues.baseLine[i] = (highestHi + lowestLo) / 2\r\n\r\n this._calculatedValues.senkouSpanA[i + this._calculationSupportValues.baseStartIndex] =\r\n (this._calculatedValues.baseLine[i] + this._calculatedValues.conversionLine[i]) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n\r\n if (i >= this._calculationSupportValues.spanBIndex) {\r\n const highestHi = utils.max(high.slice(i - this._calculationSupportValues.spanBIndex, i + 1))\r\n const lowestLo = utils.min(low.slice(i - this._calculationSupportValues.spanBIndex, i + 1))\r\n this._calculatedValues.senkouSpanB[i + this._calculationSupportValues.baseStartIndex] =\r\n (highestHi + lowestLo) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { ICCalculation } from '../indicator-calculation/ic'\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 declare icCalculation: ICCalculation\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\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 if (this.data.close.length === 0) return\r\n\r\n // Calculation\r\n if (this.isComputeNecessary()) {\r\n this.icCalculation = new ICCalculation({\r\n quote: this.data,\r\n options: {\r\n conversion,\r\n base,\r\n spanB,\r\n },\r\n })\r\n this.icCalculation.calculate()\r\n }\r\n\r\n let lastSpanAX = 0\r\n let lastSpanBX = 0\r\n const cloudStartingX = this.fx(\r\n this.icCalculation.calculationSupportValues.spanBIndex +\r\n this.icCalculation.calculationSupportValues.baseStartIndex\r\n )\r\n\r\n const drawInVisibleAreaProps = {\r\n toIndexOffset: this.icCalculation.calculationSupportValues.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\r\n let firstBarToRenderIndex: number | undefined\r\n let lastBarToRenderIndex = 0\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n firstBarToRenderIndex ??= i\r\n context.lineTo(x, Math.round(this.fy(this.icCalculation.calculatedValues.senkouSpanA[i])))\r\n lastSpanAX = x\r\n lastBarToRenderIndex = i\r\n },\r\n })\r\n context.stroke()\r\n\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\r\n // 1.3 Fill\r\n if (firstBarToRenderIndex === undefined) return\r\n context.beginPath()\r\n for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\r\n if (i >= this.icCalculation.calculatedValues.senkouSpanA.length) continue\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(this.icCalculation.calculatedValues.senkouSpanB[i])))\r\n lastSpanBX = x\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 for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\r\n if (i >= this.icCalculation.calculatedValues.senkouSpanA.length) continue\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(this.icCalculation.calculatedValues.senkouSpanB[i])))\r\n }\r\n context.stroke()\r\n\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\r\n // 2.3 Fill\r\n context.beginPath()\r\n for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(this.icCalculation.calculatedValues.senkouSpanA[i])))\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 for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(this.icCalculation.calculatedValues.conversionLine[i])))\r\n }\r\n context.stroke()\r\n\r\n // base line\r\n context.set('strokeStyle', baseLineColor)\r\n context.beginPath()\r\n for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(this.icCalculation.calculatedValues.baseLine[i])))\r\n }\r\n context.stroke()\r\n\r\n // lagging span\r\n context.set('strokeStyle', laggingSpanColor)\r\n context.beginPath()\r\n for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\r\n context.lineTo(this.fx(i - (base - 1)), Math.round(this.fy(this.data.close[i])))\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 static calculatedValuesOrder = ['upperBand', 'middleLine', 'lowerBand'] as const\r\n static calculatedValuesLabels = {\r\n upperBand: 'Upper Band',\r\n middleLine: 'Middle Line',\r\n lowerBand: 'Lower Band',\r\n }\r\n\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[1]\r\n}\r\n","import { KCHConfig, Options } from '../overlays/configs/kch'\r\nimport { AverageTrueRange } from './atr'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n upperBand: number[]\r\n middleLine: number[]\r\n lowerBand: number[]\r\n}\r\n\r\nexport class KCHCalculation extends MainCalculation {\r\n static config = KCHConfig\r\n declare options: Options\r\n\r\n calculate() {\r\n const { emaPeriod, multiplier, atrPeriod } = this.options\r\n const { close, high, low } = this.quote\r\n const start = Math.max(emaPeriod, atrPeriod)\r\n\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n const ema = new ExponentialMovingAverage(emaPeriod)\r\n const atr = new AverageTrueRange(atrPeriod)\r\n\r\n for (let i = 0; i < close.length; i++) {\r\n ema.add(close[i])\r\n atr.add(high[i], low[i], close[i - 1])\r\n if (i < start - 1) {\r\n continue\r\n }\r\n this._calculatedValues.middleLine[i] = ema.value\r\n this._calculatedValues.upperBand[i] = ema.value + multiplier * atr.value\r\n this._calculatedValues.lowerBand[i] = ema.value - multiplier * atr.value\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { KCHCalculation } from '../indicator-calculation/kch'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\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 declare kchCalculation: KCHCalculation\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\r\n let firstBarToRenderIndex: number | undefined\r\n let lastBarToRenderIndex = 0\r\n\r\n if (this.isComputeNecessary()) {\r\n this.kchCalculation = new KCHCalculation({\r\n quote: this.data,\r\n options: {\r\n emaPeriod,\r\n multiplier,\r\n atrPeriod,\r\n },\r\n })\r\n this.kchCalculation.calculate()\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', strokeColor)\r\n context.set('fillStyle', fillColor)\r\n\r\n //top line + clip\r\n context.beginPath()\r\n\r\n drawInVisibleArea({\r\n fromIndexOffset: Math.max(emaPeriod, atrPeriod) - 1,\r\n leftOffset,\r\n width,\r\n quote: this.data,\r\n paneModel: this.model,\r\n drawBarCallback: (i, x) => {\r\n const upperBandValue = this.kchCalculation?.calculatedValues.upperBand[i]\r\n if (Number.isFinite(upperBandValue)) {\r\n firstBarToRenderIndex ??= i\r\n context.lineTo(x, Math.round(this.fy(upperBandValue)))\r\n lastBarToRenderIndex = i\r\n }\r\n },\r\n })\r\n\r\n if (firstBarToRenderIndex === undefined) {\r\n context.restore()\r\n return\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRenderIndex), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRenderIndex), context.canvas.height)\r\n context.clip()\r\n\r\n // bottom line + fill\r\n context.beginPath()\r\n for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(this.kchCalculation?.calculatedValues.lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRenderIndex), 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 = firstBarToRenderIndex; i <= lastBarToRenderIndex; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(this.kchCalculation?.calculatedValues.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 200 // not entirely true, we would only need this as barsCount not as leftBuffer but we don't have logic in place for that\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, weight: '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, weight: '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 PPCalculationTypeEnum {\r\n standard,\r\n fibonacci,\r\n}\r\n\r\nexport const PPCalculationTypeLabels = {\r\n [PPCalculationTypeEnum.standard]: 'Standard',\r\n [PPCalculationTypeEnum.fibonacci]: 'Fibonacci',\r\n}\r\n\r\nexport type Options = {\r\n calculationType: PPCalculationTypeEnum\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 static calculatedValuesOrder = ['pivot', 'res1', 'res2', 'res3', 'sup1', 'sup2', 'sup3'] as const\r\n\r\n static calculatedValuesLabels = {\r\n pivot: 'Pivot',\r\n res1: 'Resistance 1',\r\n res2: 'Resistance 2',\r\n res3: 'Resistance 3',\r\n sup1: 'Support 1',\r\n sup2: 'Support 2',\r\n sup3: 'Support 3',\r\n }\r\n\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { TIMEFRAME } from '../constants/common'\r\nimport { Options, PPCalculationTypeEnum, PPConfig } from '../overlays/configs/pp'\r\nimport Utils from '../utils'\r\nimport { MainCalculation } from './main'\r\n\r\nexport enum PivotPeriod {\r\n day,\r\n week,\r\n month,\r\n year,\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\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\ntype CalculatedPivotPoint = {\r\n pivot: number\r\n sup1: number\r\n sup2: number\r\n sup3: number\r\n res1: number\r\n res2: number\r\n res3: number\r\n}\r\n\r\ntype CalculatedValuesForRender = {\r\n pivotPointsByPeriodKey: {\r\n [key: string]: CalculatedPivotPoint\r\n }\r\n}\r\n\r\nconst FIB_LVL_1 = 0.382\r\nconst FIB_LVL_2 = 0.618\r\n\r\nexport class PPCalculation extends MainCalculation {\r\n static config = PPConfig\r\n declare options: Options\r\n\r\n protected _calculatedValuesForRender = { pivotPointsByPeriodKey: {} } as CalculatedValuesForRender\r\n\r\n get calculatedValuesForRender() {\r\n return this._calculatedValuesForRender\r\n }\r\n\r\n calculate() {\r\n const { calculationType } = this.options\r\n const { close, date, timeframe, low, high } = this.quote\r\n\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n if (close.length === 0) return\r\n\r\n const periodType = getPeriodType(timeframe)\r\n const periodKeyFormat = getPeriodKeyFormat(periodType)\r\n\r\n let currentPeriodDate = Utils.dateFromUnixTimestamp(date[0])\r\n let previousPeriodDate = currentPeriodDate\r\n let previousHigh = Number.MIN_VALUE\r\n let previousLow = Number.MAX_VALUE\r\n let previousClose = 0\r\n let calculatedPivotPoint: CalculatedPivotPoint | undefined\r\n\r\n for (let i = 0; i < close.length; i++) {\r\n currentPeriodDate = Utils.dateFromUnixTimestamp(date[i])\r\n const isCurrentPeriodDateSameAsPrevioud = getIsSameDateInPeriod(previousPeriodDate, currentPeriodDate, periodType)\r\n\r\n // if date is in current period date, set previous HLC and skip rest of the loop\r\n if (isCurrentPeriodDateSameAsPrevioud) {\r\n previousHigh = Math.max(previousHigh, high[i])\r\n previousLow = Math.min(previousLow, low[i])\r\n previousClose = close[i]\r\n // if there are calculated pp, assign them to current index, it's because at this point in loop\r\n // calculatedPivotPoints available are calculated from previous period for current period\r\n if (calculatedPivotPoint !== undefined) this._setCalculatedValues(i, calculatedPivotPoint)\r\n continue\r\n }\r\n\r\n // Prev period HLC are ready for use\r\n // Calculate pivot points\r\n\r\n calculatedPivotPoint = getPivotPoints(previousHigh, previousLow, previousClose, calculationType)\r\n // assign pp to current period indexes\r\n this._setCalculatedValues(i, calculatedPivotPoint)\r\n\r\n // because of way we render pp, having to lookup for pp by index isn't suitable\r\n // it is much better to look for pp for specific period by periodKey,\r\n // thus we have and aditional format of pp just for rendering purposes\r\n this._setSupportValues(dateFns.format(currentPeriodDate, periodKeyFormat), calculatedPivotPoint)\r\n\r\n // All calculations/usage of previous period values are done\r\n // current values are first values from new period,\r\n // assign previous HLC so first day of new period is included\r\n previousHigh = high[i]\r\n previousLow = low[i]\r\n previousClose = close[i]\r\n\r\n previousPeriodDate = currentPeriodDate\r\n }\r\n }\r\n\r\n private _setCalculatedValues(index: number, calculatedPivotPoint: CalculatedPivotPoint) {\r\n this._calculatedValues.pivot[index] = calculatedPivotPoint.pivot\r\n this._calculatedValues.res1[index] = calculatedPivotPoint.res1\r\n this._calculatedValues.res2[index] = calculatedPivotPoint.res2\r\n this._calculatedValues.res3[index] = calculatedPivotPoint.res3\r\n this._calculatedValues.sup1[index] = calculatedPivotPoint.sup1\r\n this._calculatedValues.sup2[index] = calculatedPivotPoint.sup2\r\n this._calculatedValues.sup3[index] = calculatedPivotPoint.sup3\r\n }\r\n\r\n private _setSupportValues(periodKey: string, calculatedPivotPoint: CalculatedPivotPoint) {\r\n this._calculatedValuesForRender.pivotPointsByPeriodKey[periodKey] = { ...calculatedPivotPoint }\r\n }\r\n}\r\n\r\nexport function getPeriodType(timeframe: TIMEFRAME) {\r\n switch (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\nexport function getBarsCountInPivotPointsPeriodByTimeframe(timeframe: TIMEFRAME) {\r\n switch (timeframe) {\r\n case TIMEFRAME.m:\r\n return 12 // 1 bar per month, 12 months in year\r\n case TIMEFRAME.w:\r\n return 53 // 1 bar per week, 52 weeks in year + 1 for leap year\r\n case TIMEFRAME.d:\r\n return 23 // 1 bar per day, 23 days in month (max)\r\n case TIMEFRAME.h4:\r\n return 46 // 2 bars per day * 23 days in month (max)\r\n case TIMEFRAME.h2:\r\n return 20 // 4 bars per day * 5 days in week\r\n case TIMEFRAME.h:\r\n return 35 // 7 bars per day * 5 days in week\r\n case TIMEFRAME.i30:\r\n return 65 // 13 bars per day * 5 days in week\r\n case TIMEFRAME.i15:\r\n return 26 // 26 bars per day\r\n case TIMEFRAME.i10:\r\n return 39 // 39 bars per day\r\n case TIMEFRAME.i5:\r\n return 138 // 138 bars per day (with pre-market and after-market)\r\n case TIMEFRAME.i3:\r\n return 230 // 230 bars per day (with pre-market and after-market)\r\n case TIMEFRAME.i2:\r\n return 345 // 345 bars per day (with pre-market and after-market)\r\n case TIMEFRAME.i1:\r\n default:\r\n return 690 // 690 bars per day (with pre-market and after-market)\r\n }\r\n}\r\n\r\nexport function getIsSameDateInPeriod(previousPeriodDate: Date, currentPeriodDate: Date, periodType: PivotPeriod) {\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n return dateFns.isSameDay(previousPeriodDate, currentPeriodDate)\r\n case PivotPeriod.week:\r\n return dateFns.isSameWeek(previousPeriodDate, currentPeriodDate, { weekStartsOn: 1 })\r\n case PivotPeriod.month:\r\n return dateFns.isSameMonth(previousPeriodDate, currentPeriodDate)\r\n case PivotPeriod.year:\r\n return dateFns.isSameYear(previousPeriodDate, currentPeriodDate)\r\n }\r\n}\r\n\r\nfunction getPivotPoints(\r\n previousHigh: number,\r\n previousLow: number,\r\n previousClose: number,\r\n calculationType: PPCalculationTypeEnum\r\n) {\r\n const pivot = (previousHigh + previousLow + previousClose) / 3\r\n if (calculationType === PPCalculationTypeEnum.standard) {\r\n return {\r\n pivot,\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 }\r\n }\r\n\r\n return {\r\n pivot,\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\r\nexport function getPeriodKeyFormat(periodType: PivotPeriod) {\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n return 'yyyy-MM-dd'\r\n case PivotPeriod.week:\r\n return 'yyyy-MM-w'\r\n case PivotPeriod.month:\r\n return 'yyyy-MM'\r\n case PivotPeriod.year:\r\n return 'yyyy'\r\n }\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 {\r\n PPCalculation,\r\n PivotPeriod,\r\n getBarsCountInPivotPointsPeriodByTimeframe,\r\n getIsSameDateInPeriod,\r\n getPeriodKeyFormat,\r\n getPeriodType,\r\n} from '../indicator-calculation/pp'\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, PPCalculationTypeEnum, PPCalculationTypeLabels, PPConfig } from './configs/pp'\r\nimport Overlay from './overlay'\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n CalculationType: PPCalculationTypeEnum.standard,\r\n Color: '#FFA75F',\r\n}\r\nconst MINUTES_PER_DAY = 1440\r\n\r\nfunction getCalculationType(period: string) {\r\n // standard & fibonacci were legacy values, kept in parsing for backward compatability purposes\r\n switch (period) {\r\n case 'fibonacci':\r\n case '1':\r\n return PPCalculationTypeEnum.fibonacci\r\n case 'standard':\r\n case '0':\r\n default:\r\n return PPCalculationTypeEnum.standard\r\n }\r\n}\r\n\r\nclass PivotPoints extends Overlay {\r\n static config = PPConfig\r\n\r\n declare ppCalculation: PPCalculation\r\n\r\n static getNumOfBarsBuffer(obj: { timeframe: TIMEFRAME }) {\r\n // *2 first bar in visible area might not be start of pivot period,\r\n // and in worst case only one bar from previous period is visible\r\n // thus we need two previous periods data to pivot points on that first bar to be correct\r\n return getBarsCountInPivotPointsPeriodByTimeframe(obj.timeframe) * 2\r\n }\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 = getCalculationType(period)\r\n this.trigger('change')\r\n }\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 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\r\n if (this.isComputeNecessary()) {\r\n this.ppCalculation = new PPCalculation({\r\n quote: this.data,\r\n options: {\r\n calculationType: this.attrs.calculationType,\r\n },\r\n })\r\n this.ppCalculation.calculate()\r\n }\r\n\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 const isStock = this.data.instrument === Instrument.Stock\r\n const periodType = getPeriodType(this.data.timeframe)\r\n const periodKeyFormat = getPeriodKeyFormat(periodType)\r\n let currentDate = new Date()\r\n let lastDate = new Date()\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.dataIndex; index <= lastBarToRender.dataIndex; index++) {\r\n currentDate = Utils.dateFromUnixTimestamp(this.data.date[index])\r\n\r\n // check if new calculation/render is necessary\r\n if (getIsSameDateInPeriod(lastDate, currentDate, periodType)) continue\r\n lastDate = currentDate\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.dataIndex; 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.dataIndex; 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.dataIndex; 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.dataIndex; 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.dataIndex; 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.dataIndex; 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 // get pivotPoint for current date from calculation\r\n const currentPeriodKey = dateFns.format(currentDate, periodKeyFormat)\r\n const pivotPoint = this.ppCalculation.calculatedValuesForRender.pivotPointsByPeriodKey[currentPeriodKey]\r\n if (!pivotPoint) continue\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: PPCalculationTypeEnum.standard,\r\n label: PPCalculationTypeLabels[PPCalculationTypeEnum.standard],\r\n },\r\n {\r\n value: PPCalculationTypeEnum.fibonacci,\r\n label: PPCalculationTypeLabels[PPCalculationTypeEnum.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 return Object.values(PPCalculationTypeEnum).includes(this.attrs[key])\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} (${PPCalculationTypeLabels[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 static calculatedValuesOrder = ['sar'] as const\r\n static calculatedValuesLabels = { sar: 'SAR' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Options, SARConfig } from '../overlays/configs/sar'\r\nimport { MainCalculation } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sar: number[]\r\n}\r\n\r\ntype CalculationSupportValues = {\r\n isLong: boolean[]\r\n}\r\n\r\nexport class SARCalculation extends MainCalculation {\r\n static config = SARConfig\r\n declare options: Options\r\n protected _calculationSupportValues: CalculationSupportValues = { isLong: [] }\r\n\r\n get calculationSupportValues() {\r\n return this._calculationSupportValues\r\n }\r\n\r\n calculate() {\r\n const { step, maxStep } = this.options\r\n const { high, low, close } = this.quote\r\n\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n const deltaHigh = high[1] - high[0]\r\n const deltaLow = low[0] - low[1]\r\n const plusDirectionalMovement = deltaHigh > 0 && deltaHigh > deltaLow ? deltaHigh : 0\r\n const minusDirectionalMovement = deltaLow > 0 && deltaLow > deltaHigh ? deltaLow : 0\r\n // Trend direction long = up, short = down\r\n let isLong = plusDirectionalMovement >= minusDirectionalMovement\r\n\r\n let sar = isLong ? low[0] : high[0]\r\n let extremePrice = isLong ? high[1] : low[1]\r\n let accelerationFactor = step\r\n\r\n for (let i = 1; i < close.length; i++) {\r\n const prevHigh = high[i - 1]\r\n const prevLow = low[i - 1]\r\n const newHigh = high[i]\r\n const newLow = low[i]\r\n\r\n if (isLong) {\r\n // Switch to short if the low penetrates the SAR value.\r\n if (newLow <= sar) {\r\n // Switch and Overide the SAR with the extremePrice\r\n isLong = false\r\n sar = extremePrice\r\n\r\n // Make sure the overide SAR is within yesterday's and today's range.\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 // Output the overide SAR\r\n this._calculatedValues.sar[i] = sar\r\n\r\n // Adjust accelerationFactor and extremePrice\r\n accelerationFactor = step\r\n extremePrice = newLow\r\n\r\n // Calculate the new SAR\r\n sar = sar + accelerationFactor * (extremePrice - sar)\r\n\r\n // Make sure the new SAR is within yesterday's and today's range\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 // No switch\r\n\r\n // Output the SAR (was calculated in the previous iteration)\r\n this._calculatedValues.sar[i] = sar\r\n\r\n // Adjust accelerationFactor and extremePrice\r\n if (newHigh > extremePrice) {\r\n extremePrice = newHigh\r\n accelerationFactor += step\r\n if (accelerationFactor > maxStep) {\r\n accelerationFactor = maxStep\r\n }\r\n }\r\n\r\n // Calculate the new SAR\r\n sar = sar + accelerationFactor * (extremePrice - sar)\r\n\r\n // Make sure the new SAR is within yesterday's and today's range\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 // Switch to long if the high penetrates the SAR value\r\n if (newHigh >= sar) {\r\n // Switch and Overide the SAR with the extremePrice\r\n isLong = true\r\n sar = extremePrice\r\n\r\n // Make sure the overide SAR is within yesterday's and today's range\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 // Output the overide SAR\r\n this._calculatedValues.sar[i] = sar\r\n\r\n // Adjust accelerationFactor and extremePrice\r\n accelerationFactor = step\r\n extremePrice = newHigh\r\n\r\n // Calculate the new SAR\r\n sar = sar + accelerationFactor * (extremePrice - sar)\r\n\r\n // Make sure the overide SAR is within yesterday's and today's range\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 // No switch\r\n\r\n // Output the SAR (was calculated in the previous iteration)\r\n this._calculatedValues.sar[i] = sar\r\n\r\n // Adjust accelerationFactor and extremePrice\r\n if (newLow < extremePrice) {\r\n extremePrice = newLow\r\n accelerationFactor += step\r\n if (accelerationFactor > maxStep) {\r\n accelerationFactor = maxStep\r\n }\r\n }\r\n\r\n // Calculate the new SAR\r\n sar = sar + accelerationFactor * (extremePrice - sar)\r\n\r\n // Make sure the overide SAR is within yesterday's and today's range\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 this._calculationSupportValues.isLong[i] = isLong\r\n }\r\n }\r\n}\r\n","import { SARCalculation } from '../indicator-calculation/sar'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, SARConfig } from './configs/sar'\r\nimport Overlay from './overlay'\r\n\r\nconst RECTANGLE_WIDTH = 3\r\nconst RECTANGLE_HALF_WIDTH = 3 / 2\r\n\r\nclass SAR extends Overlay {\r\n static config = SARConfig\r\n declare sarCalculation: SARCalculation\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 { leftOffset, width } = this.model.chart()\r\n const { step, maxStep } = this.attrs\r\n\r\n if (this.isComputeNecessary()) {\r\n this.sarCalculation = new SARCalculation({\r\n quote: this.data,\r\n options: { step, maxStep },\r\n })\r\n\r\n this.sarCalculation.calculate()\r\n }\r\n\r\n drawInVisibleArea({\r\n leftOffset,\r\n width,\r\n quote: this.data,\r\n paneModel: this.model,\r\n fromIndexOffset: 1,\r\n drawBarCallback: (i, x) => {\r\n const rectX = Math.round(x - RECTANGLE_HALF_WIDTH)\r\n const rectY = Math.round(this.fy(this.sarCalculation.calculatedValues.sar[i]) - RECTANGLE_HALF_WIDTH)\r\n context.set(\r\n 'fillStyle',\r\n this.sarCalculation.calculationSupportValues.isLong[i] ? this.attrs.risingColor : this.attrs.fallingColor\r\n )\r\n context.fillRect(rectX, rectY, RECTANGLE_WIDTH, RECTANGLE_WIDTH)\r\n },\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 { SMACalculation } from '../indicator-calculation/sma'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\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 declare smaCalculation: SMACalculation\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 if (this.isComputeNecessary()) {\r\n this.smaCalculation = new SMACalculation({\r\n quote: this.data,\r\n options: { period },\r\n })\r\n\r\n this.smaCalculation.calculate()\r\n }\r\n\r\n drawInVisibleArea({\r\n fromIndexOffset: period - 1,\r\n leftOffset,\r\n width,\r\n quote: this.data,\r\n paneModel: this.model,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.smaCalculation.calculatedValues.sma[i])))\r\n },\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 '../indicator-calculation/atr'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\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 = 0] = getParsedIntegersFromPeriodString(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(\r\n this.data.close.slice(firstBarToRender.dataIndex, lastBarToRender.dataIndex + 1)\r\n )\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.dataIndex; i <= lastBarToRender.dataIndex; 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 { VWapCalculation } from '../indicator-calculation/vwap'\r\nimport PaneModel from '../models/pane'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\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 declare vwapCalculation: VWapCalculation\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 if (this.isComputeNecessary()) {\r\n this.vwapCalculation = new VWapCalculation({\r\n quote: this.data,\r\n options: { period: this.attrs.period },\r\n })\r\n\r\n this.vwapCalculation.calculate()\r\n }\r\n\r\n drawInVisibleArea({\r\n leftOffset,\r\n width,\r\n quote: this.data,\r\n paneModel: this.model,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.vwapCalculation.calculatedValues.vwap[i])))\r\n },\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 { 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: T\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 }).dataIndex - 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 }).dataIndex + 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()\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, weight: '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\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 is 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 // barIndex & dataIndex match for non-intraday timeframes,\r\n // however intraday timeframes have pre-derminated count of bars per certain timeframe eg. trading day\r\n // so count of data doesn't have to match with count of bars that are displayed,\r\n // if bar doesn't have data, we call that a bar gap\r\n\r\n // barIndex is index of bar at the edge of visible chart area, either first or last\r\n const barIndex = Math.round(paneModel.scale.x.invert(-leftOffset + (chartWidth !== undefined ? chartWidth : 0)))\r\n // dataIndex is index of actual real data\r\n // not all the time there is data 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 const dataIndex = quote.barToDataIndex[Math.min(Math.max(barIndex, 0), quote.barToDataIndex.length - 1)]\r\n const halfBarWidth = getHalfBarWidth(chartModel, false)\r\n\r\n // if barIndex doesn't match barIndex value at the dataIndex we know that that bar index doesn't have data\r\n const haveBarIndexData = barIndex === quote.barIndex[dataIndex]\r\n const isDataIndexVisible = Math.round(paneModel.scale.x(quote.barIndex[dataIndex]) + halfBarWidth) + leftOffset > 0\r\n\r\n const barToRenderObject = {\r\n barIndex,\r\n dataIndex,\r\n isDataIndexVisible,\r\n haveBarIndexData,\r\n }\r\n\r\n // If chartWidth isn't provided we are getting firstVisibleBarToRender\r\n if (chartWidth === undefined) {\r\n // If bar isn't visible we do dataIndex + 1 because we want to get next real bar as we know current isn't visible,\r\n // this doesn't mean that next is as we might be on view where there are none bars visible,\r\n // if that is the case, then firstVisibleBarToRender.index > lastVisibleBarToRender.index || none bars are visible\r\n barToRenderObject.dataIndex = isDataIndexVisible\r\n ? dataIndex\r\n : Math.max(Math.min(dataIndex + 1, quote.barIndex.length - 1), 0)\r\n return barToRenderObject\r\n }\r\n\r\n // If chartWidth is provided we are getting lastVisibleBarToRender\r\n return barToRenderObject\r\n\r\n /**\r\n * Setup:\r\n * firstBarToRender (fb), lastBarToRender (lb), both variables contain index and dataIndex in format (index, dataIndex)\r\n * on intraday charts where we can have bar gaps so each bar have index value and dataIndex value,\r\n * as it is best for edge cases we would use that for our cases\r\n * we would refer to that like eg. (0,0) - (index, dataIndex), if index value doesn't match dataIndex\r\n * it means that there is bar gap, in that case dataIndex would have value of most recent existing bar with data\r\n * eg. (0,0),(1,1),(2,1),(3,2)...\r\n * for ilustrating what is visible chart area we would use square brackets []\r\n * eg. (0,0),(1,1),(2,2) [ (3,3),(4,4),(5,5),(6,6),(7,7) ] (8,8),(9,9),(10,10)\r\n * visible bars in example are bars 3 to 7\r\n *\r\n * Cases:\r\n * 1: first and last bars are in place - (0,0),(1,1),(2,2) [ (3,3),(4,4),(5,5),(6,6),(7,7) ] (8,8),(9,9),(10,10)\r\n * 2: first bar visible last bar not - (0,0),(1,1),(2,2) [ (3,3),(4,3),(5,3),(6,3),(7,3) ] (8,4),(9,5),(10,6)\r\n * 3: first bar not visible last bar visible - (0,0),(1,1),(2,2) [ (3,2),(4,2),(5,2),(6,2),(7,3) ] (8,4),(9,5),(10,6)\r\n * 4: first and last bar not visible (no bars visible) - (0,0),(1,1),(2,2) [ (3,2),(4,2),(5,2),(6,2),(7,2) ] (8,3),(9,4),(10,5)\r\n * 5: first and last bar not visible (bars in the middle) - (0,0),(1,1),(2,2) [ (3,2),(4,3),(5,4),(6,5),(7,5) ] (8,6),(9,7),(10,8)\r\n * 6: first bar not visible but no previous bar existing, last bar visible - [ (0,-),(1,-),(2,-),(3,0),(4,1) ] (5,2),(6,3),(7,4), (8,5),(9,6),(10,7) // in reality it would be [ (0,0),(1,0),(2,0),(3,0),(4,1) ] (5,2),(6,3),(7,4), (8,5),(9,6),(10,7)\r\n * 7: first bar visible last bar not visible but no later bars exists - (0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6) [ (7,7),(8,8),(9,-),(10,-) ] // in reality it would be (0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6) [ (7,7),(8,8),(9,8),(10,8) ]\r\n *\r\n * Current behaviour:\r\n *\r\n * Case: 1 - fb(3,3), lb(7,7)\r\n * Case: 2 - fb(3,3), lb(7,3)\r\n * Case: 3 - fb(3,3), lb(7,3)\r\n * Case: 4 - fb(3,3), lb(7,2)\r\n * Case: 5 - fb(3,3), lb(7,5)\r\n * Case: 6 - fb(0,0), lb(4,1)\r\n * Case: 7 - fb(7,7), lb(10,8)\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 }).dataIndex - 1, fromIndexOffset)\r\n}\r\n\r\ntype IBarToRender = ReturnType\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.isDataIndexVisible && !lastBarToRenderIndex.isDataIndexVisible\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 { RootChartConfigObject } from '../../types/shared'\r\nimport { SpecificChartFunctionality, TIMEFRAME } from '../constants/common'\r\nimport { getIntradayChartConfig } from '../controllers/renderUtils'\r\nimport { isForexFuturesCryptoPage } from './chart'\r\n\r\nexport function getChartLayoutSizeConfig(\r\n layoutConfig: Pick<\r\n RootChartConfigObject,\r\n 'idea' | 'barWidth' | 'barMargin' | 'charts' | 'specificChartFunctionality' | 'width'\r\n >,\r\n p = TIMEFRAME.d\r\n) {\r\n const { clientWidth } = document.body\r\n const { premarket, aftermarket, dateRange } = layoutConfig.charts[0]\r\n const maxChartWidth = clientWidth - 40 // 40px left right chart padding = (19px * 2 for margin left/right) + (1px * 2 for border)\r\n let width = 990\r\n let barWidth = 3\r\n let barMargin = 1\r\n let timeframeMinutes = 0\r\n const isForexFuturesCrypto = isForexFuturesCryptoPage(layoutConfig.specificChartFunctionality!)\r\n const isChartPage = layoutConfig.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n\r\n if (isChartPage) {\r\n return {\r\n width: layoutConfig.width,\r\n barWidth,\r\n barMargin,\r\n }\r\n }\r\n\r\n switch (p) {\r\n case TIMEFRAME.i1:\r\n timeframeMinutes = 1\r\n barWidth = 1\r\n if (premarket || aftermarket || clientWidth < 1650) {\r\n barMargin = 0\r\n }\r\n break\r\n case TIMEFRAME.i2:\r\n timeframeMinutes = 2\r\n break\r\n case TIMEFRAME.i3:\r\n timeframeMinutes = 3\r\n if (premarket && aftermarket && clientWidth <= 1505) {\r\n barWidth = 2\r\n }\r\n break\r\n case TIMEFRAME.i5:\r\n timeframeMinutes = 5\r\n barWidth = 5\r\n barMargin = clientWidth >= 1100 ? 2 : 1\r\n break\r\n case TIMEFRAME.i10:\r\n width = 1058 // 39bars per day * 5days * 5px per bar + 35px left offset + 48px right offset\r\n barMargin = 0\r\n break\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n width = 1019\r\n break\r\n case TIMEFRAME.h:\r\n width = 1008\r\n break\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n width = 1020\r\n break\r\n case TIMEFRAME.d:\r\n width = 1282\r\n break\r\n case TIMEFRAME.w:\r\n case TIMEFRAME.m:\r\n width = 994\r\n break\r\n }\r\n\r\n switch (p) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n const commonProps = {\r\n timeframeMinutes,\r\n barWidthWithMargin: barWidth + 2 + barMargin,\r\n hasAftermarket: aftermarket,\r\n hasPremarket: premarket,\r\n }\r\n width = getIntradayChartConfig({\r\n ...commonProps,\r\n maxWidth: maxChartWidth,\r\n canCropChart: !dateRange,\r\n }).chartWidthWithOffset\r\n break\r\n }\r\n\r\n // If FFC chart use DAILY type width\r\n if (isForexFuturesCrypto) width = 1282\r\n\r\n // If chart is wider than available space in vieport override width\r\n if (maxChartWidth <= width) {\r\n width = Math.max(994, maxChartWidth)\r\n if (p === TIMEFRAME.d) {\r\n barWidth = 2\r\n barMargin = 0\r\n width = 991\r\n }\r\n }\r\n\r\n // If idea chart or FFC chart use bar configs from layout\r\n if (layoutConfig.idea || isForexFuturesCrypto) {\r\n barWidth = layoutConfig.barWidth!\r\n barMargin = layoutConfig.barMargin!\r\n }\r\n\r\n return {\r\n width,\r\n barWidth,\r\n barMargin,\r\n }\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\nimport type Quote from '../app/models/quote'\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?: 'normal' | 'italic'\r\n weight?: 'normal' | 'bold' | '900'\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 quoteData?: Quote[]\r\n // Idea properties\r\n idea?: IIdea\r\n ideaQuotes?: Quote[]\r\n barWidth: number\r\n barMargin: number\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 barsBuffer?: number\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 OverlaysChange = 'overlaysChange',\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","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","instance","chart","chart_layout","getAllPanes","pane","chartEventModel","getAllChartEvents","trigger","getChartEventData","_this$instance$model$","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","portfolioWatchlistTableAsyncModule","useWindowSize","throttleWaitInMs","isWatching","setSize","clientWidth","innerWidth","innerHeight","handleResize","throttle","cancel","createAlertAsyncModule","saveToPortfolioAsyncModule","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","description","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","AVWAP","updateDecimalPlaces","computeAvwapPath","obj","labelBackgroundColor","convertColorToHEX","isTooLight","getIsColorTooLightOrTransparent","hexStringToRGBA","labelColor","fillStyle","background","decimalPlaces","getInstrumentDecimalPlaces","lastClose","prevX","quoteFetchedAt","fetchedAt","avwapPath","barIndex","max","round","invert","fx","dataIndex","barToDataIndex","min","vwapCalculation","VWapCalculation","calculateFrom","i","calculatedValues","vwap","getDataIndexByBarIndex","scaleAvwapPath","_this$scaledAvwapPath","_this$avwapPath","_this$scaledAvwapPath2","_this$avwapPath2","scaledAvwapPath","fy","elementDarkTheme","renderLabels","lastAvwapPointIndex","ChartSettings","right","top","Text","font","weight","lineHeight","padding","bottom","left","textBaseline","TextBaseline","middle","text","render","getThumbs","moveByThumb","getEdgeXYValues","_this$avwapPath3","_this$avwapPath4","_this$avwapPath5","_this$avwapPath6","minX","maxX","minY","maxY","getIsInChartView","avwapV1","Brush","previousFill","shouldRenderFill","_this$model","positionPointsTimestamps","points","getTimestampFomPositionX","places","Number","parseFloat","overridePlaces","domainDiff","numberOfLeadingZeros","floor","log10","roundToFixed","untranslatedContext","getContextWithCache","createElement","setFillCache","fill","defaultTransparentFill","isPolyLineClosed","cachedFill","getShouldRenderFill","_this$attrs","brushPath","Path2D","xc","yc","quadraticCurveTo","point","closePath","firstX","firstY","lastX","lastY","getIsCreator","onMouseUp","currentDomainMax","currentDomainMin","domain","roundY","_this$untranslatedCon","isPointInPath","updateScales","getPositionXFromTimestamp","getAutosaveOmittedProperties","edgeXYValues","_edgeXYValues$minX","_edgeXYValues$minY","_edgeXYValues$maxX","_edgeXYValues$maxY","brushV1","default","TailDirection","getTailHalfWidth","halfWidth","p1","p2","dist","distance","Callout","getModalConfigBase","required","textWithoutBackground","family","textAlign","defaultFill","setupContext","setupTextMetricsCache","_this$lastAttrs","_this$lastAttrs2","ctx","lastAttrs","JSON","stringify","merge","lines","getLines","metrics","measureText","measuredHeight","currentIndex","actualBoundingBoxAscent","actualBoundingBoxDescent","PADDING","S","renderText","previousDescent","fillText","getCalloutProperties","_this$lines","textWidth","requiredTailHalfWidth","radius","rectangleSides","topLeft","topRight","rightTop","rightBottom","bottomRight","bottomLeft","leftBottom","leftTop","getRectangleSidesCoordinates","tail","tailRoot","tailTip","getTailCoordinates","tailDirection","twoSegmentLinesIntersection","topLeftCorner","topRightCorner","bottomLeftCorner","bottomRightCorner","topSide","rightSide","bottomSide","leftSide","noTail","getTailToSideIntersection","renderBackground","lineJoin","arcTo","tailLineToTopLineIntersection","tailHalfWidth","tailLineToRightLineIntersection","tailLineToBottomLineIntersection","tailLineToLeftLineIntersection","renderCallout","renderBorder","tailP1","perpendicularPointToLine","pointOffsetX","pointOffsetY","tailP2","polygon","pointInPolygon","leftOffset","calloutV1","Curve","x3","y3","drawQuadraticCurve","curve","Bezier","quadraticFromPoints","cp1x","cp2x","cp1y","cp2y","project","d","thumbsAreInArea","_Bezier$quadraticFrom","Ellipse","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","avwap_v1","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","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$","selection","attrsSubset","customizer","objValue","srcValue","getIsDrawing","mergewith","cachePointPositionTimestamp","get","defineProperty","globalAlpha","thumb","isMouseDown","activeThumb","startEditing","mouseDown","pointPoitionsFromTimestamp","isLockDrawingsActive","getIsVisible","getModalConfig","config","input","toAutosaveConfig","omit","replaceMyself","_window$Sentry","replace","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","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","step","getBarIndex","close","IndicatorSettings","isIndicator","allowDecimal","Line","strokeStyle","dashLength","setLineDash","Measure","volume","roundedX1","roundedX2","minIndexLimit","maxIndexLimit","volMinIndex","volMaxIndex","volumeSum","volumeIndex","numberToStringWithUnitsSuffix","x1Dif","x2Dif","startingX1","startingX2","fillRect","priceDif","heightStr","getRoundedString","number","numOfDecimalPlaces","baseX","baseY","getHeight","getVolumeSumString","addToCoordinates","difs","newX1","newX2","paneArea","getEdgeIntersectionPoint","sides","rayOrigin","rayDirection","intersection","intersectionDistance","rayToLineIntersection","getRayToLineSegmentIntersection","getPitchforkCoordinates","rayDirectionControlPoint1","rayDirectionControlPoint2","trend1","trend2","chartVisibleAreaLeftX","chartVisibleAreaRightX","chartVisibleAreaBottomY","chartVisibleAreaTopLeftPoint","chartVisibleAreaTopRightPoint","chartVisibleAreaBottomLeftPoint","chartVisibleAreaBottomRightPoint","getChartVisibleAreaBoundaries","medianRay","trend1Ray1","trend2Ray1","trend1Ray2","trend2Ray2","medianRayDirectionPoint","getMiddlePointOnLineSegment","rayOriginToRayDirectionVector","rayDirectionControlPoint1ToPoint2Vector","normalizedRayDirectionControlPoint1ToPoint2Vector","normalizeVector","medianRayDirectionPointToRayDirectionControlPoint1Distance","trend1Ray","getTrendRayCoordinates","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","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","initTickerText","chartSettings","isSmallIndexChart","L","isOurSiteRequest","tickerWidth","SpecificChartFunctionality","offScreen","XS","M","blue","renderChange","lastOhlc","getOHLC","directRender","changePercentage","lastDate","renderOHLC","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","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","_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","_first","lastMonth","monthsInData","availableTickSpots","monthsToAvail","renderMonth","chartsByType","candleStick","heikinAshi","hollowCandleStick","lineChart","marketSentiment","multiLineCharts","ohlcChart","perfChart","getContainerTypeFromPaneConfig","indicatorElement","getContainerType","_mainElement$instance","_mainElement$instance2","mainElement","indicatorType","None","isChart","updateInternalStoreWithChangedElement","changeType","currentInternalStore","lastUpdateTimestamp","getQuoteRawTicker","containerType","destroyed","instanceJson","newDrawing","zIndex","lastChange","elementAttrs","newInternalStore","updateDrawingIndex","drawingElement","shouldSyncAndSave","updatedRecord","hasChangedZIndex","hasChangedType","hasChangedAttrs","hasChange","getTickersAndContainerTypesInLayoutModel","containerTypes","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","FinvizSettings","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","pathname","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","CHART_ELEMENT_ID","clientHeight","Popover","minHeight","CHART_SETTINGS_DIALOG_TEST_ID","ZIndexContext","Provider","classNames","PopoverRounding","regular","PopoverTheme","Delayed","Spinner","ConfirmationDialog","actions","as","DialogDismiss","ChartSettingsButton","settingsPopoverState","useState","buttonProps","PopoverTrigger","focusRing","getQuoteRequestKey","_chartModel$quote","_chartModel$chart_lay","_chartLayoutModel$ide","unwatchedChartModel","quoteModel","chartModelRef","modelRef","useModelRef","abortControllerKeyRef","isIdeaChart","updateChartModelWithNewQuote","_chartLayoutModel$act","_chartPane$getAllChar","isSameTicker","getRawTicker","getChartOrIndicatorElement","updateSizeSettingsForTimeframe","getLeftOffset","getAllQuotes","chartQuote","fetchData","fetchType","QuoteFetchType","NewerData","chartPane","getChartPane","activeChartEvent","toggleIsOpen","isChartEvent","isPreserveDrawingsActive","destroyCascade","setChartEvents","updateChartEventsZIndexes","fetchQuote","hasChartEvents","premarket","aftermarket","patterns","getHasPatterns","currentQuote","abortController","createRequestAbortController","shouldAbortRunningRequest","getIsFetching","getQuoteBarsBufferAndCount","fetchNewDataOnCachedQuote","events","financialAttachments","getQuoteFinancialAttachments","cachePredicate","panesWithPerfIndicator","Perf","allSettled","paneWithPerfIndicator","prefetchPerfIndicatorAllQuotes","wasFetchAborted","isQuoteUsedInOtherCharts","destroy","removeFromAbortCache","decodedQueryString","rangesArray","ranges","every","recalculateBarSizesAndLeftOffset","prevPremarket","prevAftermarket","handleQuoteChange","updatedQuote","Refetch","Older","_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","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","minutes","hours","days","weeks","INPUTS_AVAILABLE","getInitialState","visibilities","macroTimeframe","valueMacroTimeframe","getIsVisibilityOutsideAvailableTimeframes","macrotimeframe","macroRange","MicroTimeframeRange","_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","_props$element$model$","_props$element$model","shouldSubmit","shouldDismiss","hasOnSubmit","onSubmit","hasOnDismiss","onDismiss","getIsIndicatorPane","handleValuesChangeDebounceRef","debounce","newFormState","maxWait","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","getChartBarsBuffer","barsBuffer","getCanvasElementByType","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","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","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","getCurrency","TickerSearch","inputClass","hasSearchIcon","isSearchItemLink","isShowAllVisible","event_category","_window$gtag2","_window2","_window$gtag3","_window3","hasUserPremium","hasRedesignEnabled","ChartControls","_chartModel$quote$nam","isQuotePage","isQuoteFinancials","handleTickerSelect","upperCaseTicker","handleCustomRangeSubmit","timeframeBarProps","canChangeTicker","hasTimeframe","editors","ChartEditorEnum","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","isMountedRef","BIND_EVENTS","OverlaysChange","MainChartDataLoader","wrapperRef","hasReachedEnd","handleChartChange","_wrapperRef$current","_quoteBarsBufferAndCo","getBarWidthWithMargin","mainQuote","setProperty","CHART_BARS_BUFFER_IN_PX","quoteBarsBufferAndCount","isLoadAll","dateFrom","barsCount","bufferInPx","leftBuffer","perfIndicatorInstances","perfIndicatorTickers","isTickerInChart","isChartTimeframe","hasError","isMainQuote","firstBarIndex","scrolledInBuffer","DataChangeRefetch","_quote$fetchOlderData","oldMaxBarIndex","fetchOlderData","ceil","chartModelsUsingTheQuote","_chart$quote","newQuote","newBarWidth","oldMaxLeftOffset","lastBarIndex","newMaxLeftOffset","isScrolled","getMinMaxLeftOffset","newLeftOffset","_MouseModel$pane","MouseModel","_element$instance","compute","transform","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","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","isZoomResetVisible","defaultZoomFactor","handleGoToMostRecent","hidden","_window$localStorage","_this","hasSeenCrossNotification","localStorage","getItem","isTouchCrossActive","scrollable","renderAll","oldElementInstance","isDrawingModeContinuousActive","setSelection","onPaneDestroy","setSelectedElement","clonedElementInstance","setCanvasSize","recountScale","getArea","_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","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$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","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","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","getMaxValue","currentValue","preventDefaultFunc","panesWrapperElement","layoutModel","isWheelZoomEnabled","zoomerRightAlign","calcZoomerRightAlign","mouseWheelTimeout","activePane","_this$props$layoutMod","onModelChange","calculateMinimalPaneHeight","paneId","chartModelParam","panesHeight","_pane$height","newPaneHeight","newChartPaneHeight","newIsScrolled","lastWidth","lastHeight","_pane$selection","resizerPaneIndex","onResizerMouseMove","onResizerMouseUp","resizePanesAccordingly","touches","onZoomerMouseUp","getRawDistance","onPinchMove","onPinchEnd","currentLeftOffset","isIntraday","offsetDiff","shouldAlignDaysToLeftApplied","offsetBars","quoteLength","_e$clientX","onZoomerTouchMove","onZoomerTouchEnd","deltaY","trackZoomEvent","isMouseWheel","normalizeWheelDeltaY","addToZoomFactor","fromMouseMove","diffCoefficient","currentZoomFactor","minBarWidthInPx","maxBarWidthInPx","minZoomFactor","getZoomFactorForBarsToDisplay","chartVisibleWidth","maxZoomFactor","isNegativeDirection","newZoomFactor","newZoomFactorInRange","getZoomFactor","trackZoomWheel","trackZoomDrag","trackZoomClick","stretch","getDateRangeBars","updateZoomAndLeftOffsetByDateRange","shouldForceLeftOffsetUpdate","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","zoom_factor","WrapperComp","gridArea","isModelDestroyedRef","initChartRef","panesConfig","needsToLoadAllData","Obv","maxQuoteBarsBufferAndCount","isAllData","_pane$elements","_element$overlays","getQuoteFinancialAttachmentsFromChartConfig","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","Avwap","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","ChartAutoSaveNote","onNoteChange","rows","ChartAutoSaveNotes","setTickers","unwatchedInternalStore","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","QuotePageQueryChartTypes","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","throttledResize","modelAttrs","_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","onWindowResize","onChartDestroy","handleOrientationChange","checkTouchEventsDisabled","_this$model$activeCha3","_document$querySelect","quoteTimeframe","isQuoteForexFuturesCryptoPage","newIsToolbarHorizontal","renderToolbar","args","isOverlayToolbar","handleDrawingAction","handleDrawingsSetting","_this$props$idea2","newCharts","useGrid","isMobilePortrait","_this$props$idea","isSidebarEnabled","getIsSidebarEnabled","handleConfirmationDialogDeleteBtn","ChartGrid","columns","_chartLayout$gridArea","ChartGridCell","gridAreas","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","MOBILE_VIEW_BREAKPOINT_WIDTH","MOBILE_BARS_TO_VIEW","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","concat","isQuotePageWithDrawingsOff","getCookie","noteDrawing","ideaObject","newElements","ChartLayoutModel","getMaxDecayInterval","QuotePollingIntervalInMs","Reduced","pollingIntervalToCharts","setPollingIntervalToCharts","checkForChartsWithPolling","newPollingIntervalToCharts","chartRefreshInterval","_newPollingIntervalTo","intervalSubscriptions","checkForChartsWithPollingDebounced","chartsCheckerIntervalId","setInterval","EXTRA_MARKET_BUFFER_MINUTES","clearInterval","timeoutDurations","allCharts","timeoutDurationsMin","timeoutSubscription","decay","maxDecayInterval","chartIds","quotesToUpdate","quoteToUpdate","dispatchEvent","Event","QUOTE_FETCH_EVENT","unsubscribe","getIdeaUrl","searchObject","isStockOnQute","queryString","IdeaItem","onIdeaDeleted","isDeleting","setIsDeleting","isConfirmDelete","setIsConfirmDelete","currentIdea","onDeleteIdeaClick","wasDeleted","fetch","status","newUrl","URL","searchParams","company","TimeframeLabelShort","IdeasTabs","setHasError","hasFetched","setHasFetched","categorizedIdeas","setCategorizedIdeas","queryTickers","dateParts","processed","tickerIdeas","categorizeIdeas","fetchIdeas","handleIdeaDeleted","prev","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","LayoutType","barMargin","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","DateRangeType","d1","d5","_quote$drawMinutesPer","firstVisibleBarIndex","quoteDate","isQuoteDateInRange","numOfBarsOffset","getChartZoomAndLeftOffset","numOfBarsToRender","numberOfBarsToDraw","_quote$getDaysInQuote","daysInQuote","getDaysInQuote","dateRangePrefix","dateRangeValue","Range","dateFromString","dateToString","dateTo","Prev","years","parseCustomDateRangeUrlParam","convertLocalToNyTime","setHours","startDateIndex","m1","m3","m6","ytd","y5","numOfBarsInView","getIntradayChartConfig","timeframeMinutes","barWidthWithMargin","hasPremarket","hasAftermarket","maxWidth","canCropChart","fullChartWidth","marketMinutesLength","PREMARKET_AFTERMARKET_HOURS","getFullChartWidth","offsetInPx","shouldCropChart","chartWidthWithOffset","offsetChartAfter","shouldAlignDaysToLeft","drawDaysInOneChart","getBarsInDay","drawDaysWidth","numOfDaysInQuoteData","getDayToOffset","_lastQuoteDate$getHou","lastQuoteDate","barsToOffset","offsetChartInPx","_quote$open","isStockIntraday","isIntradayDateRange","isOffScreen","isOffScreenWithNoDateRange","isOffScreenIntradayDateRange","isOffScreenWithFixedBars","isQuotePageWithNoDateRange","isQuotePageIntradayDateRange","isQuotePageWithFixedBars","getShouldOffsetChartDomain","visibleBarToRenderIndexProps","dateTimestamp","_ref11","scaleType","_perfChartInstance$ge","getChartElement","perfChartInstance","numOfBars","handleDomainOffset","currentScale","scaleCreator","protectedHeightPx","minPx","extendedMin","_ref12","rounded","fromEntries","_ref13","_ref14","_ref15","_ref16","_numOfDaysToRender","parsedRange","startQuoteDate","endQuoteDate","numOfDaysToRender","_reversedDaysInQuote$","_reversedDaysInQuote$2","reversedDaysInQuote","reverse","startQuoteDayIndex","endQuoteDayIndex","renderDateStart","renderDateEnd","getParsedDateRangeMetaData","_ref17","shouldRenderCross","DEFAULT_WIDTHS","DEFAULT_CONTEXT","activeModule","isCloseVisible","onResize","selectModule","SidebarContext","useSidebarContext","ModuleLoadFailed","DefaultErrorBoundary","portfolioWatchlistAsyncModule","SidebarModule","sidebarModules","portfolio","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","altText","seoLabel","getInstrumentLabel","getResponseChartType","chartType","chartResponseType","ChartEvent","ChartEventType","Dividends","Split","EarningsNeutral","getChartEventModel","getXYPosition","_chartEventModel$yInd","_this$model$chart$quo","buffer","hover","isOpenOverride","isCurrentEventActive","scaledArea","ChartEventLabels","Earnings","_this$getChartEventMo","eventItem","epsActual","epsEstimate","EarningsFuture","EarningsNegative","EarningsPositive","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","getTrueRange","AverageTrueRange","tr","ATRCalculation","MainCalculation","calculate","_calculatedValues","atr","ATRConfig","ExponentialMovingAverage","multiplier","EMACalculation","ema","EMAConfig","_this$_calculatedValu","defaultCalculatedValues","getAllCalculatedValues","lastNItems","getCalculatedValues","getDbColumnName","SimpleMovingAverage","trailingValues","_this$trailingValues$","firstTrailingValue","shift","SMACalculation","sma","SMAConfig","resetOnNewDay","cumulativePV","cumulativeVolume","prevDate","second","datesAreOnSameDay","VWAPConfig","IndicatorBaseConfig","_ATRConfig","Atr","curr","ShrtflConfig","QuoteFinancialAttachment","shortInterest","Shrtfl","ShrtraConfig","Shrtra","ADXConfig","_ADXConfig","Adx","adx","pdi","mdi","ADXCalculation","sATR","firstAtrAccumulator","sPDM","firstPdmAccumulator","sMDM","firstMdmAccumulator","firstAdxAccumulator","upMove","downMove","plusDM","minusDM","MAX_POSITIVE_DEFAULT_VALUE","MAX_NEGATIVE_DEFAULT_VALUE","periodInt","getParsedIntegersFromPeriodString","Rvol","Aro","Mfi","Rmi","Rsi","Stofu","Ult","Macd","Rwi","Trix","Wr","Aroosc","Roc","Cci","Fi","INDICATOR_DEFAULT_DOMAIN","_config$seoLabel","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","INDICATOR_LABEL_HEIGHT","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$adxCalculation$","adxCalculation","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","ATR","_this$atrCalculation$","atrCalculation","CCIConfig","_CCIConfig","cci","CCICalculation","typicalPrice","tpSma","devSum","dev","CommodityChannelIndex","_this$cciCalculation$","cciCalculation","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","MFICalculation","moneyFlow","positiveMoneyFlowRollingSum","negativeMoneyFlowRollingSum","currentMoneyFlow","oldMoneyFlow","MFI","_this$mfiCalculation$","mfiCalculation","NoneConfig","OBVConfig","_OBVConfig","obv","OBVCalculation","currentObv","OBV","_this$obvCalculation$","obvCalculation","PerfConfig","_PerfConfig","PricePerformance","forceRerender","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","RMICalculation","averageDown","averageUp","sumUp","sumDown","upChange","downChange","RMI","_this$rmiCalculation$","rmiCalculation","_this$momentum","ROCConfig","_ROCConfig","roc","ROCCalculation","ROC","_this$rocCalculation$","rocCalculation","RSIConfig","_RSIConfig","rsi","RsiCalculation","RSI","_this$rsiCalculation$","rsiCalculation","_this$rsiCalculation$2","_this$rsiCalculation","_this$rsiCalculation$3","_this$rsiCalculation2","RVOLConfig","_RVOLConfig","baseLine","rvol","RVOLCalculation","_volume","DEFAULT_PARAMETERS","RelativeVolume","periodStr","parsePeriod","_this$rvolCalculation","rvolCalculation","baseLineY","_this$baseLine","RWIConfig","_RWIConfig","rwiHigh","rwiLow","RWICalculation","trSum","atrWeight","maxHi","maxLo","RWI","rwiCalculation","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","getFirstKAndDIndex","kPeriod","firstKIndex","firstDIndex","_StofuConfig","StofuCalculation","dCount","dSum","k1Arr","dArr","kArr","kSum","kCount","highestHigh","lowestLow","Stochastics","_this$stofuCalculatio","stofuCalculation","_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","ult","UltCalculation","maxPeriod","bpSum2","bpSum3","count2","count3","trSum2","trSum3","bp","avg2","avg3","bpSum1","trSum1","count1","avg1","UltimateOscillator","_this$ultCalculation$","ultCalculation","_this$period2","_this$period3","VolConfig","Volume","_this$data$volume$las","WRConfig","_WRConfig","WRCalculation","WilliamsR","_this$wrCalculation$c","wrCalculation","none","aro","aroosc","rwi","stofa","stofu","stosl","vol","wr","shrtfl","shrtra","financialIndicators","getWatchedPropValue","watchedProp","spineObject","getIsSpineObject","hasToObject","getJSONReplacerFunc","getWatchedProps","getAreWatchedPropsEqual","previousValue","DEFAULT_SPINE_EVENTS","DefaultSpineEvents","stringifiedOptions","useForceUpdate","watchedPropertiesRef","handleModelChange","_watchedPropertiesRef","isArray","spineEvents","hasMany","getChartType","_this$getChartElement","defaultRefreshInterval","refreshIntervals","Default","customRefreshInterval","isStockFastRefreshAvailable","omitKeys","_this$quote","getIsScrollable","_this$quote$COTs","perfQuotes","quotePerfTickers","quotePerf","_this$getChartElement2","_paneProperties$eleme","_paneModel$mainElemen","chartOrIndicator","attrsInSync","ChartPartToAttrsSyncMap","modelAttr","chartParts","isInSync","chartPart","isFinancialIndicator","quoteFinancialAttachments","quoteFinancialAttachment","_this$quote$getRawTic","_this$quote2","shouldClear","allChartEvents","is1DayRange","is5DayRange","TIMEFRAME_SECONDS","preMarketMarketMinutes","afterMarketMinutes","startMs","MARKET_START","endMs","MARKET_END","barsInADay","getQuoteOptionsForDateRange","_this$barsBuffer","scrollBuffer","dateRangeOptions","Crosshair","drawingsInternalStoreModel","_this$syncChartParts$","_this$syncChartParts","chartPartsToSync","newSyncedChartParts","_this$syncChartParts2","_this$charts$first","_this$idea$id","_this$idea","_this$idea2","getChartLayoutSizeConfig","hasDifferentBarWidth","hasDifferentBarMargin","hasDifferentWidth","newSettings","normalizeHexAlpha","hexString","customColors","customColorKeys","defaultColors","chartLightTheme","chartDarkTheme","aftermarketFade","crossTextBackground","gridSecondary","negativeChange","overlayTransparentBackground","positiveChange","premarketFade","indicatorLightTheme","indicatorDarkTheme","elementLightTheme","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","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","FUTURES_FORCE_REFETCH_TIMEOUT","quoteCache","getCachedQuote","cachedAt","setCachedQuote","_quoteCache$cid","COTProps","computableKeys","_Quote$select$","tickerRaw","doesQuoteAndFetchParamsMatch","isSameOrNoChartUuid","is404","isNotEmptyQuote","isCacheAllowed","_options$financialAtt","_options$financialAtt2","financialAttachment","_quote$financialAttac","doesQuoteAndOptionsMatch","_options$financialAtt3","shouldUseCache","getResolvedFetchingPromise","lastRefetch","fetchingState","premarketLengthMinutes","aftermarketLengthMinutes","patternsMinRange","patternsMaxRange","dataId","tickersAndTimeframes","accumulator","fetchRequest","fetchingPromise","getUrl","NotFoundError","getIsAbortError","shouldUseEmptyQuote","fetchTypeArray","_data$ticker","_data$patterns","_data$chartEvents","isFuturesForcedRefetch","isRefetch","dataChangeRefetch","_options$dateFrom","noNewData","updateOhlcVersion","newQuoteData","lastTime","afterTime","numberOfRefreshChecks","_data$chartEvents$len","_data$chartEvents2","_data$financialAttach","_data$chartEvents4","_data$chartEvents3","isSameDay","item1","item2","keyString","_newQuoteData$financi","_this$financialAttach","_this$financialAttach2","COTKeys","isOlder","prop","AIndex","BIndex","mergeIndex","ADate","BDate","prevAIndex","newDate","isSameWeek","isSameMonth","warn","thisDateLength","dataDateLength","atts","_atts$fetchedAt","_this$fetchingState","_this$patterns","IntradayTimeframeInterval","drawDays","getBarIndexes","_this$barIndex","alignAllFinancialAttachmentsDataWithQuoteDates","_chartEvents$map","getChartEventsWithId","_this$financialAttach3","alignFinancialAttachmentsDataWithQuoteDates","_this$financialAttach4","lastDateIndex","firstDate","matchingQuoteTimestamp","parsedDate","convertedDateToNyTimestamp","dateDate","clearCachedData","deleteCachedQuote","cachedHeikinAshiData","HAClose","heikAshiData","cachedDayToOffset","dayToOffset","lastDay","dateStringFromDate","yyyy","mm","dd","padStart","_quoteData$dataIndex","cachedDateToIndex","getTimestampFromPositionX","_this$financialAttach5","host","env","BE_API_URL","rev","clearData","largeChartFontSize","XXXL","INTERACTIVE_CHART_SETTINGS","SETTINGS_HEIGHT","tickerTimeframeChangeHeight","TICKER_TIMEFRAME_CHANGE_HEIGHT","XL","colorsOverride","settingColors","_config$charts","isLight","getNormalizedZIndex","BaseConfig","_EMAConfig","OverlayType","Ema","OverlayBaseConfig","_SMAConfig","Sma","_VWAPConfig","Vwap","BBConfig","_BBConfig","Bb","deviations","topColor","bottomColor","upperBand","lowerBand","BbCalculation","stdDev","initialPeriodIndex","stdDevSum","getFreeColor","periods","getRGBAValueFromValidColorString","OverlayConfig","BB_COLORS","TOP","BOTTOM","MIDDLE","BollingerBands","scaledTop","scaledBottom","bbCalculation","smaValue","_firstBarToRenderInde","_this$attrs$period","_this$attrs$deviation","_this$attrs$topColor","_this$attrs$bottomCol","DchConfig","_DchConfig","Dch","channelStrokeColor","channelFillColor","medianBandColor","medianBand","DchCalculation","startingIndex","DonchianChannels","firstBarToRender","lastBarToRender","dchCalculation","_this$dchCalculation","_this$dchCalculation2","_this$dchCalculation3","_this$attrs$channelSt","_this$attrs$channelFi","_this$attrs$medianBan","EMA","emaCalculation","_this$attrs$color","EMA2Config","Ema2","EMA2","HILOConfig","_HILOConfig","Hilo","highColor","lowColor","HILOCalculation","HighLow","hiloCalculation","prevHigh","_firstBarToRender","prevLow","prevBar","_this$attrs$highColor","_this$attrs$lowColor","HLineConfig","Hline","isPositiveFloat","ICConfig","_ICConfig","Ic","conversion","spanB","spanAStrokeColor","spanAFillColor","spanBStrokeColor","spanBFillColor","conversionLineColor","baseLineColor","laggingSpanColor","conversionLine","senkouSpanA","senkouSpanB","ICCalculation","calculationSupportValues","_calculationSupportValues","conversionStartIndex","baseStartIndex","spanBIndex","highestHi","lowestLo","Stroke","Fill","Conversion","Base","SpanB","IchimokuCloud","_this$data$barIndex$x","outsideBar","renderFull","icCalculation","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","middleLine","KCHCalculation","KeltnerChannel","kchCalculation","_this$kchCalculation","upperBandValue","_this$kchCalculation2","_this$kchCalculation3","_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","PPCalculationTypeEnum","PPCalculationTypeLabels","standard","PPConfig","_PPConfig","Pp","calculationType","pivot","res1","res2","res3","sup1","sup2","sup3","PivotPeriod","PPCalculation","pivotPointsByPeriodKey","calculatedValuesForRender","_calculatedValuesForRender","periodType","getPeriodType","periodKeyFormat","getPeriodKeyFormat","calculatedPivotPoint","currentPeriodDate","previousPeriodDate","previousHigh","previousLow","getIsSameDateInPeriod","_setCalculatedValues","getPivotPoints","_setSupportValues","periodKey","week","CalculationType","Color","PivotPoints","getBarsCountInPivotPointsPeriodByTimeframe","getCalculationType","ppCalculation","calculatedX","fromX","toX","currentDate","currentX","toBars","nextDate","_this$data$drawMinute","_this$data$drawMinute2","currentPeriodKey","pivotPoint","_this$attrs$calculati","SARConfig","_SARConfig","Sar","maxStep","risingColor","fallingColor","sar","SARCalculation","isLong","deltaHigh","deltaLow","extremePrice","accelerationFactor","newHigh","newLow","SAR","sarCalculation","rectX","rectY","_this$attrs$step","_this$attrs$maxStep","_this$attrs$risingCol","_this$attrs$fallingCo","customizable","SMA","smaCalculation","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","VWAP","bb","dch","hilo","hline","ic","icf","kch","pp","sma2","vp","requestsAbortControllersCache","_requestsAbortControl","abortRequest","controller","websiteShared","shouldUseCPUOnly","matchesAndroid","navigator","userAgent","match","matchesWebOS","matchesIPhone","matchesiPad","matchesIPod","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","maxTouchPoints","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","dateFromDateString","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","getTimezoneOffset","dateTime","getQuoteDateTimestampOffsetInSeconds","getVirtualTradedDays","marketStartSeconds","barTimeframeSeconds","quoteDatesTimestampOffset","dayStartSeconds","barSeconds","virtualTimeframeTradedDates","isLowerBounded","isOneBeforeLowerBoundStarts","isLookingBack","averageBarDate","numOfSecondsOutOfBounds","CRYPTOS","_perfIndicatorElement","_perfIndicatorElement2","perfIndicatorElement","getPerfIndicatorTickerAndTimeframes","resolve","getPriceForPane","isXAxisInView","domainRange","priceFy","YAxisLeftMargin","getCrossText","_getRoundDecimalPlace","firstBarClose","_ref18","_ref19","_ref20","changePercent","changePercentString","_ref21","isForexFuturesCryptoPage","_ref22","isForexFuturesCrypto","isOffscreenChartWithNarrowBars","_ref23","_ref24","_indicatorsByType$con","_indicatorsByType","hexColor","removeHashSymbol","g","rgbaToHexString","alpha","alphaToHex","rgbaToHSVA","hsvaToRGBA","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","red","green","strColor","allowAlpha","getIsRgb","rgbKeys","output","canSelectAlpha","hsvaToHEXString","getLumaFromRGBA","haveBarIndexData","isDataIndexVisible","barToRenderObject","object","formData","append","FormData","statusCode","throwOnPredicate","url","credentials","headers","responseContentType","Html","responseData","ApplicationJsonUTF","FormUrlEncoded","parseResponseForContentType","getStatusCodeError","forceUpdateKey","increment","layoutConfig","maxChartWidth","commonProps","two","local","remote","useChartLayoutGlobalModelModule","useChartLayoutGlobalModel"],"sourceRoot":""}